sp_armthumb.c 5.3 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499107500107501107502107503107504107505107506107507107508107509107510107511107512107513107514107515107516107517107518107519107520107521107522107523107524107525107526107527107528107529107530107531107532107533107534107535107536107537107538107539107540107541107542107543107544107545107546107547107548107549107550107551107552107553107554107555107556107557107558107559107560107561107562107563107564107565107566107567107568107569107570107571107572107573107574107575107576107577107578107579107580107581107582107583107584107585107586107587107588107589107590107591107592107593107594107595107596107597107598107599107600107601107602107603107604107605107606107607107608107609107610107611107612107613107614107615107616107617107618107619107620107621107622107623107624107625107626107627107628107629107630107631107632107633107634107635107636107637107638107639107640107641107642107643107644107645107646107647107648107649107650107651107652107653107654107655107656107657107658107659107660107661107662107663107664107665107666107667107668107669107670107671107672107673107674107675107676107677107678107679107680107681107682107683107684107685107686107687107688107689107690107691107692107693107694107695107696107697107698107699107700107701107702107703107704107705107706107707107708107709107710107711107712107713107714107715107716107717107718107719107720107721107722107723107724107725107726107727107728107729107730107731107732107733107734107735107736107737107738107739107740107741107742107743107744107745107746107747107748107749107750107751107752107753107754107755107756107757107758107759107760107761107762107763107764107765107766107767107768107769107770107771107772107773107774107775107776107777107778107779107780107781107782107783107784107785107786107787107788107789107790107791107792107793107794107795107796107797107798107799107800107801107802107803107804107805107806107807107808107809107810107811107812107813107814107815107816107817107818107819107820107821107822107823107824107825107826107827107828107829107830107831107832107833107834107835107836107837107838107839107840107841107842107843107844107845107846107847107848107849107850107851107852107853107854107855107856107857107858107859107860107861107862107863107864107865107866107867107868107869107870107871107872107873107874107875107876107877107878107879107880107881107882107883107884107885107886107887107888107889107890107891107892107893107894107895107896107897107898107899107900107901107902107903107904107905107906107907107908107909107910107911107912107913107914107915107916107917107918107919107920107921107922107923107924107925107926107927107928107929107930107931107932107933107934107935107936107937107938107939107940107941107942107943107944107945107946107947107948107949107950107951107952107953107954107955107956107957107958107959107960107961107962107963107964107965107966107967107968107969107970107971107972107973107974107975107976107977107978107979107980107981107982107983107984107985107986107987107988107989107990107991107992107993107994107995107996107997107998107999108000108001108002108003108004108005108006108007108008108009108010108011108012108013108014108015108016108017108018108019108020108021108022108023108024108025108026108027108028108029108030108031108032108033108034108035108036108037108038108039108040108041108042108043108044108045108046108047108048108049108050108051108052108053108054108055108056108057108058108059108060108061108062108063108064108065108066108067108068108069108070108071108072108073108074108075108076108077108078108079108080108081108082108083108084108085108086108087108088108089108090108091108092108093108094108095108096108097108098108099108100108101108102108103108104108105108106108107108108108109108110108111108112108113108114108115108116108117108118108119108120108121108122108123108124108125108126108127108128108129108130108131108132108133108134108135108136108137108138108139108140108141108142108143108144108145108146108147108148108149108150108151108152108153108154108155108156108157108158108159108160108161108162108163108164108165108166108167108168108169108170108171108172108173108174108175108176108177108178108179108180108181108182108183108184108185108186108187108188108189108190108191108192108193108194108195108196108197108198108199108200108201108202108203108204108205108206108207108208108209108210108211108212108213108214108215108216108217108218108219108220108221108222108223108224108225108226108227108228108229108230108231108232108233108234108235108236108237108238108239108240108241108242108243108244108245108246108247108248108249108250108251108252108253108254108255108256108257108258108259108260108261108262108263108264108265108266108267108268108269108270108271108272108273108274108275108276108277108278108279108280108281108282108283108284108285108286108287108288108289108290108291108292108293108294108295108296108297108298108299108300108301108302108303108304108305108306108307108308108309108310108311108312108313108314108315108316108317108318108319108320108321108322108323108324108325108326108327108328108329108330108331108332108333108334108335108336108337108338108339108340108341108342108343108344108345108346108347108348108349108350108351108352108353108354108355108356108357108358108359108360108361108362108363108364108365108366108367108368108369108370108371108372108373108374108375108376108377108378108379108380108381108382108383108384108385108386108387108388108389108390108391108392108393108394108395108396108397108398108399108400108401108402108403108404108405108406108407108408108409108410108411108412108413108414108415108416108417108418108419108420108421108422108423108424108425108426108427108428108429108430108431108432108433108434108435108436108437108438108439108440108441108442108443108444108445108446108447108448108449108450108451108452108453108454108455108456108457108458108459108460108461108462108463108464108465108466108467108468108469108470108471108472108473108474108475108476108477108478108479108480108481108482108483108484108485108486108487108488108489108490108491108492108493108494108495108496108497108498108499108500108501108502108503108504108505108506108507108508108509108510108511108512108513108514108515108516108517108518108519108520108521108522108523108524108525108526108527108528108529108530108531108532108533108534108535108536108537108538108539108540108541108542108543108544108545108546108547108548108549108550108551108552108553108554108555108556108557108558108559108560108561108562108563108564108565108566108567108568108569108570108571108572108573108574108575108576108577108578108579108580108581108582108583108584108585108586108587108588108589108590108591108592108593108594108595108596108597108598108599108600108601108602108603108604108605108606108607108608108609108610108611108612108613108614108615108616108617108618108619108620108621108622108623108624108625108626108627108628108629108630108631108632108633108634108635108636108637108638108639108640108641108642108643108644108645108646108647108648108649108650108651108652108653108654108655108656108657108658108659108660108661108662108663108664108665108666108667108668108669108670108671108672108673108674108675108676108677108678108679108680108681108682108683108684108685108686108687108688108689108690108691108692108693108694108695108696108697108698108699108700108701108702108703108704108705108706108707108708108709108710108711108712108713108714108715108716108717108718108719108720108721108722108723108724108725108726108727108728108729108730108731108732108733108734108735108736108737108738108739108740108741108742108743108744108745108746108747108748108749108750108751108752108753108754108755108756108757108758108759108760108761108762108763108764108765108766108767108768108769108770108771108772108773108774108775108776108777108778108779108780108781108782108783108784108785108786108787108788108789108790108791108792108793108794108795108796108797108798108799108800108801108802108803108804108805108806108807108808108809108810108811108812108813108814108815108816108817108818108819108820108821108822108823108824108825108826108827108828108829108830108831108832108833108834108835108836108837108838108839108840108841108842108843108844108845108846108847108848108849108850108851108852108853108854108855108856108857108858108859108860108861108862108863108864108865108866108867108868108869108870108871108872108873108874108875108876108877108878108879108880108881108882108883108884108885108886108887108888108889108890108891108892108893108894108895108896108897108898108899108900108901108902108903108904108905108906108907108908108909108910108911108912108913108914108915108916108917108918108919108920108921108922108923108924108925108926108927108928108929108930108931108932108933108934108935108936108937108938108939108940108941108942108943108944108945108946108947108948108949108950108951108952108953108954108955108956108957108958108959108960108961108962108963108964108965108966108967108968108969108970108971108972108973108974108975108976108977108978108979108980108981108982108983108984108985108986108987108988108989108990108991108992108993108994108995108996108997108998108999109000109001109002109003109004109005109006109007109008109009109010109011109012109013109014109015109016109017109018109019109020109021109022109023109024109025109026109027109028109029109030109031109032109033109034109035109036109037109038109039109040109041109042109043109044109045109046109047109048109049109050109051109052109053109054109055109056109057109058109059109060109061109062109063109064109065109066109067109068109069109070109071109072109073109074109075109076109077109078109079109080109081109082109083109084109085109086109087109088109089109090109091109092109093109094109095109096109097109098109099109100109101109102109103109104109105109106109107109108109109109110109111109112109113109114109115109116109117109118109119109120109121109122109123109124109125109126109127109128109129109130109131109132109133109134109135109136109137109138109139109140109141109142109143109144109145109146109147109148109149109150109151109152109153109154109155109156109157109158109159109160109161109162109163109164109165109166109167109168109169109170109171109172109173109174109175109176109177109178109179109180109181109182109183109184109185109186109187109188109189109190109191109192109193109194109195109196109197109198109199109200109201109202109203109204109205109206109207109208109209109210109211109212109213109214109215109216109217109218109219109220109221109222109223109224109225109226109227109228109229109230109231109232109233109234109235109236109237109238109239109240109241109242109243109244109245109246109247109248109249109250109251109252109253109254109255109256109257109258109259109260109261109262109263109264109265109266109267109268109269109270109271109272109273109274109275109276109277109278109279109280109281109282109283109284109285109286109287109288109289109290109291109292109293109294109295109296109297109298109299109300109301109302109303109304109305109306109307109308109309109310109311109312109313109314109315109316109317109318109319109320109321109322109323109324109325109326109327109328109329109330109331109332109333109334109335109336109337109338109339109340109341109342109343109344109345109346109347109348109349109350109351109352109353109354109355109356109357109358109359109360109361109362109363109364109365109366109367109368109369109370109371109372109373109374109375109376109377109378109379109380109381109382109383109384109385109386109387109388109389109390109391109392109393109394109395109396109397109398109399109400109401109402109403109404109405109406109407109408109409109410109411109412109413109414109415109416109417109418109419109420109421109422109423109424109425109426109427109428109429109430109431109432109433109434109435109436109437109438109439109440109441109442109443109444109445109446109447109448109449109450109451109452109453109454109455109456109457109458109459109460109461109462109463109464109465109466109467109468109469109470109471109472109473109474109475109476109477109478109479109480109481109482109483109484109485109486109487109488109489109490109491109492109493109494109495109496109497109498109499109500109501109502109503109504109505109506109507109508109509109510109511109512109513109514109515109516109517109518109519109520109521109522109523109524109525109526109527109528109529109530109531109532109533109534109535109536109537109538109539109540109541109542109543109544109545109546109547109548109549109550109551109552109553109554109555109556109557109558109559109560109561109562109563109564109565109566109567109568109569109570109571109572109573109574109575109576109577109578109579109580109581109582109583109584109585109586109587109588109589109590109591109592109593109594109595109596109597109598109599109600109601109602109603109604109605109606109607109608109609109610109611109612109613109614109615109616109617109618109619109620109621109622109623109624109625109626109627109628109629109630109631109632109633109634109635109636109637109638109639109640109641109642109643109644109645109646109647109648109649109650109651109652109653109654109655109656109657109658109659109660109661109662109663109664109665109666109667109668109669109670109671109672109673109674109675109676109677109678109679109680109681109682109683109684109685109686109687109688109689109690109691109692109693109694109695109696109697109698109699109700109701109702109703109704109705109706109707109708109709109710109711109712109713109714109715109716109717109718109719109720109721109722109723109724109725109726109727109728109729109730109731109732109733109734109735109736109737109738109739109740109741109742109743109744109745109746109747109748109749109750109751109752109753109754109755109756109757109758109759109760109761109762109763109764109765109766109767109768109769109770109771109772109773109774109775109776109777109778109779109780109781109782109783109784109785109786109787109788109789109790109791109792109793109794109795109796109797109798109799109800109801109802109803109804109805109806109807109808109809109810109811109812109813109814109815109816109817109818109819109820109821109822109823109824109825109826109827109828109829109830109831109832109833109834109835109836109837109838109839109840109841109842109843109844109845109846109847109848109849109850109851109852109853109854109855109856109857109858109859109860109861109862109863109864109865109866109867109868109869109870109871109872109873109874109875109876109877109878109879109880109881109882109883109884109885109886109887109888109889109890109891109892109893109894109895109896109897109898109899109900109901109902109903109904109905109906109907109908109909109910109911109912109913109914109915109916109917109918109919109920109921109922109923109924109925109926109927109928109929109930109931109932109933109934109935109936109937109938109939109940109941109942109943109944109945109946109947109948109949109950109951109952109953109954109955109956109957109958109959109960109961109962109963109964109965109966109967109968109969109970109971109972109973109974109975109976109977109978109979109980109981109982109983109984109985109986109987109988109989109990109991109992109993109994109995109996109997109998109999110000110001110002110003110004110005110006110007110008110009110010110011110012110013110014110015110016110017110018110019110020110021110022110023110024110025110026110027110028110029110030110031110032110033110034110035110036110037110038110039110040110041110042110043110044110045110046110047110048110049110050110051110052110053110054110055110056110057110058110059110060110061110062110063110064110065110066110067110068110069110070110071110072110073110074110075110076110077110078110079110080110081110082110083110084110085110086110087110088110089110090110091110092110093110094110095110096110097110098110099110100110101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110161110162110163110164110165110166110167110168110169110170110171110172110173110174110175110176110177110178110179110180110181110182110183110184110185110186110187110188110189110190110191110192110193110194110195110196110197110198110199110200110201110202110203110204110205110206110207110208110209110210110211110212110213110214110215110216110217110218110219110220110221110222110223110224110225110226110227110228110229110230110231110232110233110234110235110236110237110238110239110240110241110242110243110244110245110246110247110248110249110250110251110252110253110254110255110256110257110258110259110260110261110262110263110264110265110266110267110268110269110270110271110272110273110274110275110276110277110278110279110280110281110282110283110284110285110286110287110288110289110290110291110292110293110294110295110296110297110298110299110300110301110302110303110304110305110306110307110308110309110310110311110312110313110314110315110316110317110318110319110320110321110322110323110324110325110326110327110328110329110330110331110332110333110334110335110336110337110338110339110340110341110342110343110344110345110346110347110348110349110350110351110352110353110354110355110356110357110358110359110360110361110362110363110364110365110366110367110368110369110370110371110372110373110374110375110376110377110378110379110380110381110382110383110384110385110386110387110388110389110390110391110392110393110394110395110396110397110398110399110400110401110402110403110404110405110406110407110408110409110410110411110412110413110414110415110416110417110418110419110420110421110422110423110424110425110426110427110428110429110430110431110432110433110434110435110436110437110438110439110440110441110442110443110444110445110446110447110448110449110450110451110452110453110454110455110456110457110458110459110460110461110462110463110464110465110466110467110468110469110470110471110472110473110474110475110476110477110478110479110480110481110482110483110484110485110486110487110488110489110490110491110492110493110494110495110496110497110498110499110500110501110502110503110504110505110506110507110508110509110510110511110512110513110514110515110516110517110518110519110520110521110522110523110524110525110526110527110528110529110530110531110532110533110534110535110536110537110538110539110540110541110542110543110544110545110546110547110548110549110550110551110552110553110554110555110556110557110558110559110560110561110562110563110564110565110566110567110568110569110570110571110572110573110574110575110576110577110578110579110580110581110582110583110584110585110586110587110588110589110590110591110592110593110594110595110596110597110598110599110600110601110602110603110604110605110606110607110608110609110610110611110612110613110614110615110616110617110618110619110620110621110622110623110624110625110626110627110628110629110630110631110632110633110634110635110636110637110638110639110640110641110642110643110644110645110646110647110648110649110650110651110652110653110654110655110656110657110658110659110660110661110662110663110664110665110666110667110668110669110670110671110672110673110674110675110676110677110678110679110680110681110682110683110684110685110686110687110688110689110690110691110692110693110694110695110696110697110698110699110700110701110702110703110704110705110706110707110708110709110710110711110712110713110714110715110716110717110718110719110720110721110722110723110724110725110726110727110728110729110730110731110732110733110734110735110736110737110738110739110740110741110742110743110744110745110746110747110748110749110750110751110752110753110754110755110756110757110758110759110760110761110762110763110764110765110766110767110768110769110770110771110772110773110774110775110776110777110778110779110780110781110782110783110784110785110786110787110788110789110790110791110792110793110794110795110796110797110798110799110800110801110802110803110804110805110806110807110808110809110810110811110812110813110814110815110816110817110818110819110820110821110822110823110824110825110826110827110828110829110830110831110832110833110834110835110836110837110838110839110840110841110842110843110844110845110846110847110848110849110850110851110852110853110854110855110856110857110858110859110860110861110862110863110864110865110866110867110868110869110870110871110872110873110874110875110876110877110878110879110880110881110882110883110884110885110886110887110888110889110890110891110892110893110894110895110896110897110898110899110900110901110902110903110904110905110906110907110908110909110910110911110912110913110914110915110916110917110918110919110920110921110922110923110924110925110926110927110928110929110930110931110932110933110934110935110936110937110938110939110940110941110942110943110944110945110946110947110948110949110950110951110952110953110954110955110956110957110958110959110960110961110962110963110964110965110966110967110968110969110970110971110972110973110974110975110976110977110978110979110980110981110982110983110984110985110986110987110988110989110990110991110992110993110994110995110996110997110998110999111000111001111002111003111004111005111006111007111008111009111010111011111012111013111014111015111016111017111018111019111020111021111022111023111024111025111026111027111028111029111030111031111032111033111034111035111036111037111038111039111040111041111042111043111044111045111046111047111048111049111050111051111052111053111054111055111056111057111058111059111060111061111062111063111064111065111066111067111068111069111070111071111072111073111074111075111076111077111078111079111080111081111082111083111084111085111086111087111088111089111090111091111092111093111094111095111096111097111098111099111100111101111102111103111104111105111106111107111108111109111110111111111112111113111114111115111116111117111118111119111120111121111122111123111124111125111126111127111128111129111130111131111132111133111134111135111136111137111138111139111140111141111142111143111144111145111146111147111148111149111150111151111152111153111154111155111156111157111158111159111160111161111162111163111164111165111166111167111168111169111170111171111172111173111174111175111176111177111178111179111180111181111182111183111184111185111186111187111188111189111190111191111192111193111194111195111196111197111198111199111200111201111202111203111204111205111206111207111208111209111210111211111212111213111214111215111216111217111218111219111220111221111222111223111224111225111226111227111228111229111230111231111232111233111234111235111236111237111238111239111240111241111242111243111244111245111246111247111248111249111250111251111252111253111254111255111256111257111258111259111260111261111262111263111264111265111266111267111268111269111270111271111272111273111274111275111276111277111278111279111280111281111282111283111284111285111286111287111288111289111290111291111292111293111294111295111296111297111298111299111300111301111302111303111304111305111306111307111308111309111310111311111312111313111314111315111316111317111318111319111320111321111322111323111324111325111326111327111328111329111330111331111332111333111334111335111336111337111338111339111340111341111342111343111344111345111346111347111348111349111350111351111352111353111354111355111356111357111358111359111360111361111362111363111364111365111366111367111368111369111370111371111372111373111374111375111376111377111378111379111380111381111382111383111384111385111386111387111388111389111390111391111392111393111394111395111396111397111398111399111400111401111402111403111404111405111406111407111408111409111410111411111412111413111414111415111416111417111418111419111420111421111422111423111424111425111426111427111428111429111430111431111432111433111434111435111436111437111438111439111440111441111442111443111444111445111446111447111448111449111450111451111452111453111454111455111456111457111458111459111460111461111462111463111464111465111466111467111468111469111470111471111472111473111474111475111476111477111478111479111480111481111482111483111484111485111486111487111488111489111490111491111492111493111494111495111496111497111498111499111500111501111502111503111504111505111506111507111508111509111510111511111512111513111514111515111516111517111518111519111520111521111522111523111524111525111526111527111528111529111530111531111532111533111534111535111536111537111538111539111540111541111542111543111544111545111546111547111548111549111550111551111552111553111554111555111556111557111558111559111560111561111562111563111564111565111566111567111568111569111570111571111572111573111574111575111576111577111578111579111580111581111582111583111584111585111586111587111588111589111590111591111592111593111594111595111596111597111598111599111600111601111602111603111604111605111606111607111608111609111610111611111612111613111614111615111616111617111618111619111620111621111622111623111624111625111626111627111628111629111630111631111632111633111634111635111636111637111638111639111640111641111642111643111644111645111646111647111648111649111650111651111652111653111654111655111656111657111658111659111660111661111662111663111664111665111666111667111668111669111670111671111672111673111674111675111676111677111678111679111680111681111682111683111684111685111686111687111688111689111690111691111692111693111694111695111696111697111698111699111700111701111702111703111704111705111706111707111708111709111710111711111712111713111714111715111716111717111718111719111720111721111722111723111724111725111726111727111728111729111730111731111732111733111734111735111736111737111738111739111740111741111742111743111744111745111746111747111748111749111750111751111752111753111754111755111756111757111758111759111760111761111762111763111764111765111766111767111768111769111770111771111772111773111774111775111776111777111778111779111780111781111782111783111784111785111786111787111788111789111790111791111792111793111794111795111796111797111798111799111800111801111802111803111804111805111806111807111808111809111810111811111812111813111814111815111816111817111818111819111820111821111822111823111824111825111826111827111828111829111830111831111832111833111834111835111836111837111838111839111840111841111842111843111844111845111846111847111848111849111850111851111852111853111854111855111856111857111858111859111860111861111862111863111864111865111866111867111868111869111870111871111872111873111874111875111876111877111878111879111880111881111882111883111884111885111886111887111888111889111890111891111892111893111894111895111896111897111898111899111900111901111902111903111904111905111906111907111908111909111910111911111912111913111914111915111916111917111918111919111920111921111922111923111924111925111926111927111928111929111930111931111932111933111934111935111936111937111938111939111940111941111942111943111944111945111946111947111948111949111950111951111952111953111954111955111956111957111958111959111960111961111962111963111964111965111966111967111968111969111970111971111972111973111974111975111976111977111978111979111980111981111982111983111984111985111986111987111988111989111990111991111992111993111994111995111996111997111998111999112000112001112002112003112004112005112006112007112008112009112010112011112012112013112014112015112016112017112018112019112020112021112022112023112024112025112026112027112028112029112030112031112032112033112034112035112036112037112038112039112040112041112042112043112044112045112046112047112048112049112050112051112052112053112054112055112056112057112058112059112060112061112062112063112064112065112066112067112068112069112070112071112072112073112074112075112076112077112078112079112080112081112082112083112084112085112086112087112088112089112090112091112092112093112094112095112096112097112098112099112100112101112102112103112104112105112106112107112108112109112110112111112112112113112114112115112116112117112118112119112120112121112122112123112124112125112126112127112128112129112130112131112132112133112134112135112136112137112138112139112140112141112142112143112144112145112146112147112148112149112150112151112152112153112154112155112156112157112158112159112160112161112162112163112164112165112166112167112168112169112170112171112172112173112174112175112176112177112178112179112180112181112182112183112184112185112186112187112188112189112190112191112192112193112194112195112196112197112198112199112200112201112202112203112204112205112206112207112208112209112210112211112212112213112214112215112216112217112218112219112220112221112222112223112224112225112226112227112228112229112230112231112232112233112234112235112236112237112238112239112240112241112242112243112244112245112246112247112248112249112250112251112252112253112254112255112256112257112258112259112260112261112262112263112264112265112266112267112268112269112270112271112272112273112274112275112276112277112278112279112280112281112282112283112284112285112286112287112288112289112290112291112292112293112294112295112296112297112298112299112300112301112302112303112304112305112306112307112308112309112310112311112312112313112314112315112316112317112318112319112320112321112322112323112324112325112326112327112328112329112330112331112332112333112334112335112336112337112338112339112340112341112342112343112344112345112346112347112348112349112350112351112352112353112354112355112356112357112358112359112360112361112362112363112364112365112366112367112368112369112370112371112372112373112374112375112376112377112378112379112380112381112382112383112384112385112386112387112388112389112390112391112392112393112394112395112396112397112398112399112400112401112402112403112404112405112406112407112408112409112410112411112412112413112414112415112416112417112418112419112420112421112422112423112424112425112426112427112428112429112430112431112432112433112434112435112436112437112438112439112440112441112442112443112444112445112446112447112448112449112450112451112452112453112454112455112456112457112458112459112460112461112462112463112464112465112466112467112468112469112470112471112472112473112474112475112476112477112478112479112480112481112482112483112484112485112486112487112488112489112490112491112492112493112494112495112496112497112498112499112500112501112502112503112504112505112506112507112508112509112510112511112512112513112514112515112516112517112518112519112520112521112522112523112524112525112526112527112528112529112530112531112532112533112534112535112536112537112538112539112540112541112542112543112544112545112546112547112548112549112550112551112552112553112554112555112556112557112558112559112560112561112562112563112564112565112566112567112568112569112570112571112572112573112574112575112576112577112578112579112580112581112582112583112584112585112586112587112588112589112590112591112592112593112594112595112596112597112598112599112600112601112602112603112604112605112606112607112608112609112610112611112612112613112614112615112616112617112618112619112620112621112622112623112624112625112626112627112628112629112630112631112632112633112634112635112636112637112638112639112640112641112642112643112644112645112646112647112648112649112650112651112652112653112654112655112656112657112658112659112660112661112662112663112664112665112666112667112668112669112670112671112672112673112674112675112676112677112678112679112680112681112682112683112684112685112686112687112688112689112690112691112692112693112694112695112696112697112698112699112700112701112702112703112704112705112706112707112708112709112710112711112712112713112714112715112716112717112718112719112720112721112722112723112724112725112726112727112728112729112730112731112732112733112734112735112736112737112738112739112740112741112742112743112744112745112746112747112748112749112750112751112752112753112754112755112756112757112758112759112760112761112762112763112764112765112766112767112768112769112770112771112772112773112774112775112776112777112778112779112780112781112782112783112784112785112786112787112788112789112790112791112792112793112794112795112796112797112798112799112800112801112802112803112804112805112806112807112808112809112810112811112812112813112814112815112816112817112818112819112820112821112822112823112824112825112826112827112828112829112830112831112832112833112834112835112836112837112838112839112840112841112842112843112844112845112846112847112848112849112850112851112852112853112854112855112856112857112858112859112860112861112862112863112864112865112866112867112868112869112870112871112872112873112874112875112876112877112878112879112880112881112882112883112884112885112886112887112888112889112890112891112892112893112894112895112896112897112898112899112900112901112902112903112904112905112906112907112908112909112910112911112912112913112914112915112916112917112918112919112920112921112922112923112924112925112926112927112928112929112930112931112932112933112934112935112936112937112938112939112940112941112942112943112944112945112946112947112948112949112950112951112952112953112954112955112956112957112958112959112960112961112962112963112964112965112966112967112968112969112970112971112972112973112974112975112976112977112978112979112980112981112982112983112984112985112986112987112988112989112990112991112992112993112994112995112996112997112998112999113000113001113002113003113004113005113006113007113008113009113010113011113012113013113014113015113016113017113018113019113020113021113022113023113024113025113026113027113028113029113030113031113032113033113034113035113036113037113038113039113040113041113042113043113044113045113046113047113048113049113050113051113052113053113054113055113056113057113058113059113060113061113062113063113064113065113066113067113068113069113070113071113072113073113074113075113076113077113078113079113080113081113082113083113084113085113086113087113088113089113090113091113092113093113094113095113096113097113098113099113100113101113102113103113104113105113106113107113108113109113110113111113112113113113114113115113116113117113118113119113120113121113122113123113124113125113126113127113128113129113130113131113132113133113134113135113136113137113138113139113140113141113142113143113144113145113146113147113148113149113150113151113152113153113154113155113156113157113158113159113160113161113162113163113164113165113166113167113168113169113170113171113172113173113174113175113176113177113178113179113180113181113182113183113184113185113186113187113188113189113190113191113192113193113194113195113196113197113198113199113200113201113202113203113204113205113206113207113208113209113210113211113212113213113214113215113216113217113218113219113220113221113222113223113224113225113226113227113228113229113230113231113232113233113234113235113236113237113238113239113240113241113242113243113244113245113246113247113248113249113250113251113252113253113254113255113256113257113258113259113260113261113262113263113264113265113266113267113268113269113270113271113272113273113274113275113276113277113278113279113280113281113282113283113284113285113286113287113288113289113290113291113292113293113294113295113296113297113298113299113300113301113302113303113304113305113306113307113308113309113310113311113312113313113314113315113316113317113318113319113320113321113322113323113324113325113326113327113328113329113330113331113332113333113334113335113336113337113338113339113340113341113342113343113344113345113346113347113348113349113350113351113352113353113354113355113356113357113358113359113360113361113362113363113364113365113366113367113368113369113370113371113372113373113374113375113376113377113378113379113380113381113382113383113384113385113386113387113388113389113390113391113392113393113394113395113396113397113398113399113400113401113402113403113404113405113406113407113408113409113410113411113412113413113414113415113416113417113418113419113420113421113422113423113424113425113426113427113428113429113430113431113432113433113434113435113436113437113438113439113440113441113442113443113444113445113446113447113448113449113450113451113452113453113454113455113456113457113458113459113460113461113462113463113464113465113466113467113468113469113470113471113472113473113474113475113476113477113478113479113480113481113482113483113484113485113486113487113488113489113490113491113492113493113494113495113496113497113498113499113500113501113502113503113504113505113506113507113508113509113510113511113512113513113514113515113516113517113518113519113520113521113522113523113524113525113526113527113528113529113530113531113532113533113534113535113536113537113538113539113540113541113542113543113544113545113546113547113548113549113550113551113552113553113554113555113556113557113558113559113560113561113562113563113564113565113566113567113568113569113570113571113572113573113574113575113576113577113578113579113580113581113582113583113584113585113586113587113588113589113590113591113592113593113594113595113596113597113598113599113600113601113602113603113604113605113606113607113608113609113610113611113612113613113614113615113616113617113618113619113620113621113622113623113624113625113626113627113628113629113630113631113632113633113634113635113636113637113638113639113640113641113642113643113644113645113646113647113648113649113650113651113652113653113654113655113656113657113658113659113660113661113662113663113664113665113666113667113668113669113670113671113672113673113674113675113676113677113678113679113680113681113682113683113684113685113686113687113688113689113690113691113692113693113694113695113696113697113698113699113700113701113702113703113704113705113706113707113708113709113710113711113712113713113714113715113716113717113718113719113720113721113722113723113724113725113726113727113728113729113730113731113732113733113734113735113736113737113738113739113740113741113742113743113744113745113746113747113748113749113750113751113752113753113754113755113756113757113758113759113760113761113762113763113764113765113766113767113768113769113770113771113772113773113774113775113776113777113778113779113780113781113782113783113784113785113786113787113788113789113790113791113792113793113794113795113796113797113798113799113800113801113802113803113804113805113806113807113808113809113810113811113812113813113814113815113816113817113818113819113820113821113822113823113824113825113826113827113828113829113830113831113832113833113834113835113836113837113838113839113840113841113842113843113844113845113846113847113848113849113850113851113852113853113854113855113856113857113858113859113860113861113862113863113864113865113866113867113868113869113870113871113872113873113874113875113876113877113878113879113880113881113882113883113884113885113886113887113888113889113890113891113892113893113894113895113896113897113898113899113900113901113902113903113904113905113906113907113908113909113910113911113912113913113914113915113916113917113918113919113920113921113922113923113924113925113926113927113928113929113930113931113932113933113934113935113936113937113938113939113940113941113942113943113944113945113946113947113948113949113950113951113952113953113954113955113956113957113958113959113960113961113962113963113964113965113966113967113968113969113970113971113972113973113974113975113976113977113978113979113980113981113982113983113984113985113986113987113988113989113990113991113992113993113994113995113996113997113998113999114000114001114002114003114004114005114006114007114008114009114010114011114012114013114014114015114016114017114018114019114020114021114022114023114024114025114026114027114028114029114030114031114032114033114034114035114036114037114038114039114040114041114042114043114044114045114046114047114048114049114050114051114052114053114054114055114056114057114058114059114060114061114062114063114064114065114066114067114068114069114070114071114072114073114074114075114076114077114078114079114080114081114082114083114084114085114086114087114088114089114090114091114092114093114094114095114096114097114098114099114100114101114102114103114104114105114106114107114108114109114110114111114112114113114114114115114116114117114118114119114120114121114122114123114124114125114126114127114128114129114130114131114132114133114134114135114136114137114138114139114140114141114142114143114144114145114146114147114148114149114150114151114152114153114154114155114156114157114158114159114160114161114162114163114164114165114166114167114168114169114170114171114172114173114174114175114176114177114178114179114180114181114182114183114184114185114186114187114188114189114190114191114192114193114194114195114196114197114198114199114200114201114202114203114204114205114206114207114208114209114210114211114212114213114214114215114216114217114218114219114220114221114222114223114224114225114226114227114228114229114230114231114232114233114234114235114236114237114238114239114240114241114242114243114244114245114246114247114248114249114250114251114252114253114254114255114256114257114258114259114260114261114262114263114264114265114266114267114268114269114270114271114272114273114274114275114276114277114278114279114280114281114282114283114284114285114286114287114288114289114290114291114292114293114294114295114296114297114298114299114300114301114302114303114304114305114306114307114308114309114310114311114312114313114314114315114316114317114318114319114320114321114322114323114324114325114326114327114328114329114330114331114332114333114334114335114336114337114338114339114340114341114342114343114344114345114346114347114348114349114350114351114352114353114354114355114356114357114358114359114360114361114362114363114364114365114366114367114368114369114370114371114372114373114374114375114376114377114378114379114380114381114382114383114384114385114386114387114388114389114390114391114392114393114394114395114396114397114398114399114400114401114402114403114404114405114406114407114408114409114410114411114412114413114414114415114416114417114418114419114420114421114422114423114424114425114426114427114428114429114430114431114432114433114434114435114436114437114438114439114440114441114442114443114444114445114446114447114448114449114450114451114452114453114454114455114456114457114458114459114460114461114462114463114464114465114466114467114468114469114470114471114472114473114474114475114476114477114478114479114480114481114482114483114484114485114486114487114488114489114490114491114492114493114494114495114496114497114498114499114500114501114502114503114504114505114506114507114508114509114510114511114512114513114514114515114516114517114518114519114520114521114522114523114524114525114526114527114528114529114530114531114532114533114534114535114536114537114538114539114540114541114542114543114544114545114546114547114548114549114550114551114552114553114554114555114556114557114558114559114560114561114562114563114564114565114566114567114568114569114570114571114572114573114574114575114576114577114578114579114580114581114582114583114584114585114586114587114588114589114590114591114592114593114594114595114596114597114598114599114600114601114602114603114604114605114606114607114608114609114610114611114612114613114614114615114616114617114618114619114620114621114622114623114624114625114626114627114628114629114630114631114632114633114634114635114636114637114638114639114640114641114642114643114644114645114646114647114648114649114650114651114652114653114654114655114656114657114658114659114660114661114662114663114664114665114666114667114668114669114670114671114672114673114674114675114676114677114678114679114680114681114682114683114684114685114686114687114688114689114690114691114692114693114694114695114696114697114698114699114700114701114702114703114704114705114706114707114708114709114710114711114712114713114714114715114716114717114718114719114720114721114722114723114724114725114726114727114728114729114730114731114732114733114734114735114736114737114738114739114740114741114742114743114744114745114746114747114748114749114750114751114752114753114754114755114756114757114758114759114760114761114762114763114764114765114766114767114768114769114770114771114772114773114774114775114776114777114778114779114780114781114782114783114784114785114786114787114788114789114790114791114792114793114794114795114796114797114798114799114800114801114802114803114804114805114806114807114808114809114810114811114812114813114814114815114816114817114818114819114820114821114822114823114824114825114826114827114828114829114830114831114832114833114834114835114836114837114838114839114840114841114842114843114844114845114846114847114848114849114850114851114852114853114854114855114856114857114858114859114860114861114862114863114864114865114866114867114868114869114870114871114872114873114874114875114876114877114878114879114880114881114882114883114884114885114886114887114888114889114890114891114892114893114894114895114896114897114898114899114900114901114902114903114904114905114906114907114908114909114910114911114912114913114914114915114916114917114918114919114920114921114922114923114924114925114926114927114928114929114930114931114932114933114934114935114936114937114938114939114940114941114942114943114944114945114946114947114948114949114950114951114952114953114954114955114956114957114958114959114960114961114962114963114964114965114966114967114968114969114970114971114972114973114974114975114976114977114978114979114980114981114982114983114984114985114986114987114988114989114990114991114992114993114994114995114996114997114998114999115000115001115002115003115004115005115006115007115008115009115010115011115012115013115014115015115016115017115018115019115020115021115022115023115024115025115026115027115028115029115030115031115032115033115034115035115036115037115038115039115040115041115042115043115044115045115046115047115048115049115050115051115052115053115054115055115056115057115058115059115060115061115062115063115064115065115066115067115068115069115070115071115072115073115074115075115076115077115078115079115080115081115082115083115084115085115086115087115088115089115090115091115092115093115094115095115096115097115098115099115100115101115102115103115104115105115106115107115108115109115110115111115112115113115114115115115116115117115118115119115120115121115122115123115124115125115126115127115128115129115130115131115132115133115134115135115136115137115138115139115140115141115142115143115144115145115146115147115148115149115150115151115152115153115154115155115156115157115158115159115160115161115162115163115164115165115166115167115168115169115170115171115172115173115174115175115176115177115178115179115180115181115182115183115184115185115186115187115188115189115190115191115192115193115194115195115196115197115198115199115200115201115202115203115204115205115206115207115208115209115210115211115212115213115214115215115216115217115218115219115220115221115222115223115224115225115226115227115228115229115230115231115232115233115234115235115236115237115238115239115240115241115242115243115244115245115246115247115248115249115250115251115252115253115254115255115256115257115258115259115260115261115262115263115264115265115266115267115268115269115270115271115272115273115274115275115276115277115278115279115280115281115282115283115284115285115286115287115288115289115290115291115292115293115294115295115296115297115298115299115300115301115302115303115304115305115306115307115308115309115310115311115312115313115314115315115316115317115318115319115320115321115322115323115324115325115326115327115328115329115330115331115332115333115334115335115336115337115338115339115340115341115342115343115344115345115346115347115348115349115350115351115352115353115354115355115356115357115358115359115360115361115362115363115364115365115366115367115368115369115370115371115372115373115374115375115376115377115378115379115380115381115382115383115384115385115386115387115388115389115390115391115392115393115394115395115396115397115398115399115400115401115402115403115404115405115406115407115408115409115410115411115412115413115414115415115416115417115418115419115420115421115422115423115424115425115426115427115428115429115430115431115432115433115434115435115436115437115438115439115440115441115442115443115444115445115446115447115448115449115450115451115452115453115454115455115456115457115458115459115460115461115462115463115464115465115466115467115468115469115470115471115472115473115474115475115476115477115478115479115480115481115482115483115484115485115486115487115488115489115490115491115492115493115494115495115496115497115498115499115500115501115502115503115504115505115506115507115508115509115510115511115512115513115514115515115516115517115518115519115520115521115522115523115524115525115526115527115528115529115530115531115532115533115534115535115536115537115538115539115540115541115542115543115544115545115546115547115548115549115550115551115552115553115554115555115556115557115558115559115560115561115562115563115564115565115566115567115568115569115570115571115572115573115574115575115576115577115578115579115580115581115582115583115584115585115586115587115588115589115590115591115592115593115594115595115596115597115598115599115600115601115602115603115604115605115606115607115608115609115610115611115612115613115614115615115616115617115618115619115620115621115622115623115624115625115626115627115628115629115630115631115632115633115634115635115636115637115638115639115640115641115642115643115644115645115646115647115648115649115650115651115652115653115654115655115656115657115658115659115660115661115662115663115664115665115666115667115668115669115670115671115672115673115674115675115676115677115678115679115680115681115682115683115684115685115686115687115688115689115690115691115692115693115694115695115696115697115698115699115700115701115702115703115704115705115706115707115708115709115710115711115712115713115714115715115716115717115718115719115720115721115722115723115724115725115726115727115728115729115730115731115732115733115734115735115736115737115738115739115740115741115742115743115744115745115746115747115748115749115750115751115752115753115754115755115756115757115758115759115760115761115762115763115764115765115766115767115768115769115770115771115772115773115774115775115776115777115778115779115780115781115782115783115784115785115786115787115788115789115790115791115792115793115794115795115796115797115798115799115800115801115802115803115804115805115806115807115808115809115810115811115812115813115814115815115816115817115818115819115820115821115822115823115824115825115826115827115828115829115830115831115832115833115834115835115836115837115838115839115840115841115842115843115844115845115846115847115848115849115850115851115852115853115854115855115856115857115858115859115860115861115862115863115864115865115866115867115868115869115870115871115872115873115874115875115876115877115878115879115880115881115882115883115884115885115886115887115888115889115890115891115892115893115894115895115896115897115898115899115900115901115902115903115904115905115906115907115908115909115910115911115912115913115914115915115916115917115918115919115920115921115922115923115924115925115926115927115928115929115930115931115932115933115934115935115936115937115938115939115940115941115942115943115944115945115946115947115948115949115950115951115952115953115954115955115956115957115958115959115960115961115962115963115964115965115966115967115968115969115970115971115972115973115974115975115976115977115978115979115980115981115982115983115984115985115986115987115988115989115990115991115992115993115994115995115996115997115998115999116000116001116002116003116004116005116006116007116008116009116010116011116012116013116014116015116016116017116018116019116020116021116022116023116024116025116026116027116028116029116030116031116032116033116034116035116036116037116038116039116040116041116042116043116044116045116046116047116048116049116050116051116052116053116054116055116056116057116058116059116060116061116062116063116064116065116066116067116068116069116070116071116072116073116074116075116076116077116078116079116080116081116082116083116084116085116086116087116088116089116090116091116092116093116094116095116096116097116098116099116100116101116102116103116104116105116106116107116108116109116110116111116112116113116114116115116116116117116118116119116120116121116122116123116124116125116126116127116128116129116130116131116132116133116134116135116136116137116138116139116140116141116142116143116144116145116146116147116148116149116150116151116152116153116154116155116156116157116158116159116160116161116162116163116164116165116166116167116168116169116170116171116172116173116174116175116176116177116178116179116180116181116182116183116184116185116186116187116188116189116190116191116192116193116194116195116196116197116198116199116200116201116202116203116204116205116206116207116208116209116210116211116212116213116214116215116216116217116218116219116220116221116222116223116224116225116226116227116228116229116230116231116232116233116234116235116236116237116238116239116240116241116242116243116244116245116246116247116248116249116250116251116252116253116254116255116256116257116258116259116260116261116262116263116264116265116266116267116268116269116270116271116272116273116274116275116276116277116278116279116280116281116282116283116284116285116286116287116288116289116290116291116292116293116294116295116296116297116298116299116300116301116302116303116304116305116306116307116308116309116310116311116312116313116314116315116316116317116318116319116320116321116322116323116324116325116326116327116328116329116330116331116332116333116334116335116336116337116338116339116340116341116342116343116344116345116346116347116348116349116350116351116352116353116354116355116356116357116358116359116360116361116362116363116364116365116366116367116368116369116370116371116372116373116374116375116376116377116378116379116380116381116382116383116384116385116386116387116388116389116390116391116392116393116394116395116396116397116398116399116400116401116402116403116404116405116406116407116408116409116410116411116412116413116414116415116416116417116418116419116420116421116422116423116424116425116426116427116428116429116430116431116432116433116434116435116436116437116438116439116440116441116442116443116444116445116446116447116448116449116450116451116452116453116454116455116456116457116458116459116460116461116462116463116464116465116466116467116468116469116470116471116472116473116474116475116476116477116478116479116480116481116482116483116484116485116486116487116488116489116490116491116492116493116494116495116496116497116498116499116500116501116502116503116504116505116506116507116508116509116510116511116512116513116514116515116516116517116518116519116520116521116522116523116524116525116526116527116528116529116530116531116532116533116534116535116536116537116538116539116540116541116542116543116544116545116546116547116548116549116550116551116552116553116554116555116556116557116558116559116560116561116562116563116564116565116566116567116568116569116570116571116572116573116574116575116576116577116578116579116580116581116582116583116584116585116586116587116588116589116590116591116592116593116594116595116596116597116598116599116600116601116602116603116604116605116606116607116608116609116610116611116612116613116614116615116616116617116618116619116620116621116622116623116624116625116626116627116628116629116630116631116632116633116634116635116636116637116638116639116640116641116642116643116644116645116646116647116648116649116650116651116652116653116654116655116656116657116658116659116660116661116662116663116664116665116666116667116668116669116670116671116672116673116674116675116676116677116678116679116680116681116682116683116684116685116686116687116688116689116690116691116692116693116694116695116696116697116698116699116700116701116702116703116704116705116706116707116708116709116710116711116712116713116714116715116716116717116718116719116720116721116722116723116724116725116726116727116728116729116730116731116732116733116734116735116736116737116738116739116740116741116742116743116744116745116746116747116748116749116750116751116752116753116754116755116756116757116758116759116760116761116762116763116764116765116766116767116768116769116770116771116772116773116774116775116776116777116778116779116780116781116782116783116784116785116786116787116788116789116790116791116792116793116794116795116796116797116798116799116800116801116802116803116804116805116806116807116808116809116810116811116812116813116814116815116816116817116818116819116820116821116822116823116824116825116826116827116828116829116830116831116832116833116834116835116836116837116838116839116840116841116842116843116844116845116846116847116848116849116850116851116852116853116854116855116856116857116858116859116860116861116862116863116864116865116866116867116868116869116870116871116872116873116874116875116876116877116878116879116880116881116882116883116884116885116886116887116888116889116890116891116892116893116894116895116896116897116898116899116900116901116902116903116904116905116906116907116908116909116910116911116912116913116914116915116916116917116918116919116920116921116922116923116924116925116926116927116928116929116930116931116932116933116934116935116936116937116938116939116940116941116942116943116944116945116946116947116948116949116950116951116952116953116954116955116956116957116958116959116960116961116962116963116964116965116966116967116968116969116970116971116972116973116974116975116976116977116978116979116980116981116982116983116984116985116986116987116988116989116990116991116992116993116994116995116996116997116998116999117000117001117002117003117004117005117006117007117008117009117010117011117012117013117014117015117016117017117018117019117020117021117022117023117024117025117026117027117028117029117030117031117032117033117034117035117036117037117038117039117040117041117042117043117044117045117046117047117048117049117050117051117052117053117054117055117056117057117058117059117060117061117062117063117064117065117066117067117068117069117070117071117072117073117074117075117076117077117078117079117080117081117082117083117084117085117086117087117088117089117090117091117092117093117094117095117096117097117098117099117100117101117102117103117104117105117106117107117108117109117110117111117112117113117114117115117116117117117118117119117120117121117122117123117124117125117126117127117128117129117130117131117132117133117134117135117136117137117138117139117140117141117142117143117144117145117146117147117148117149117150117151117152117153117154117155117156117157117158117159117160117161117162117163117164117165117166117167117168117169117170117171117172117173117174117175117176117177117178117179117180117181117182117183117184117185117186117187117188117189117190117191117192117193117194117195117196117197117198117199117200117201117202117203117204117205117206117207117208117209117210117211117212117213117214117215117216117217117218117219117220117221117222117223117224117225117226117227117228117229117230117231117232117233117234117235117236117237117238117239117240117241117242117243117244117245117246117247117248117249117250117251117252117253117254117255117256117257117258117259117260117261117262117263117264117265117266117267117268117269117270117271117272117273117274117275117276117277117278117279117280117281117282117283117284117285117286117287117288117289117290117291117292117293117294117295117296117297117298117299117300117301117302117303117304117305117306117307117308117309117310117311117312117313117314117315117316117317117318117319117320117321117322117323117324117325117326117327117328117329117330117331117332117333117334117335117336117337117338117339117340117341117342117343117344117345117346117347117348117349117350117351117352117353117354117355117356117357117358117359117360117361117362117363117364117365117366117367117368117369117370117371117372117373117374117375117376117377117378117379117380117381117382117383117384117385117386117387117388117389117390117391117392117393117394117395117396117397117398117399117400117401117402117403117404117405117406117407117408117409117410117411117412117413117414117415117416117417117418117419117420117421117422117423117424117425117426117427117428117429117430117431117432117433117434117435117436117437117438117439117440117441117442117443117444117445117446117447117448117449117450117451117452117453117454117455117456117457117458117459117460117461117462117463117464117465117466117467117468117469117470117471117472117473117474117475117476117477117478117479117480117481117482117483117484117485117486117487117488117489117490117491117492117493117494117495117496117497117498117499117500117501117502117503117504117505117506117507117508117509117510117511117512117513117514117515117516117517117518117519117520117521117522117523117524117525117526117527117528117529117530117531117532117533117534117535117536117537117538117539117540117541117542117543117544117545117546117547117548117549117550117551117552117553117554117555117556117557117558117559117560117561117562117563117564117565117566117567117568117569117570117571117572117573117574117575117576117577117578117579117580117581117582117583117584117585117586117587117588117589117590117591117592117593117594117595117596117597117598117599117600117601117602117603117604117605117606117607117608117609117610117611117612117613117614117615117616117617117618117619117620117621117622117623117624117625117626117627117628117629117630117631117632117633117634117635117636117637117638117639117640117641117642117643117644117645117646117647117648117649117650117651117652117653117654117655117656117657117658117659117660117661117662117663117664117665117666117667117668117669117670117671117672117673117674117675117676117677117678117679117680117681117682117683117684117685117686117687117688117689117690117691117692117693117694117695117696117697117698117699117700117701117702117703117704117705117706117707117708117709117710117711117712117713117714117715117716117717117718117719117720117721117722117723117724117725117726117727117728117729117730117731117732117733117734117735117736117737117738117739117740117741117742117743117744117745117746117747117748117749117750117751117752117753117754117755117756117757117758117759117760117761117762117763117764117765117766117767117768117769117770117771117772117773117774117775117776117777117778117779117780117781117782117783117784117785117786117787117788117789117790117791117792117793117794117795117796117797117798117799117800117801117802117803117804117805117806117807117808117809117810117811117812117813117814117815117816117817117818117819117820117821117822117823117824117825117826117827117828117829117830117831117832117833117834117835117836117837117838117839117840117841117842117843117844117845117846117847117848117849117850117851117852117853117854117855117856117857117858117859117860117861117862117863117864117865117866117867117868117869117870117871117872117873117874117875117876117877117878117879117880117881117882117883117884117885117886117887117888117889117890117891117892117893117894117895117896117897117898117899117900117901117902117903117904117905117906117907117908117909117910117911117912117913117914117915117916117917117918117919117920117921117922117923117924117925117926117927117928117929117930117931117932117933117934117935117936117937117938117939117940117941117942117943117944117945117946117947117948117949117950117951117952117953117954117955117956117957117958117959117960117961117962117963117964117965117966117967117968117969117970117971117972117973117974117975117976117977117978117979117980117981117982117983117984117985117986117987117988117989117990117991117992117993117994117995117996117997117998117999118000118001118002118003118004118005118006118007118008118009118010118011118012118013118014118015118016118017118018118019118020118021118022118023118024118025118026118027118028118029118030118031118032118033118034118035118036118037118038118039118040118041118042118043118044118045118046118047118048118049118050118051118052118053118054118055118056118057118058118059118060118061118062118063118064118065118066118067118068118069118070118071118072118073118074118075118076118077118078118079118080118081118082118083118084118085118086118087118088118089118090118091118092118093118094118095118096118097118098118099118100118101118102118103118104118105118106118107118108118109118110118111118112118113118114118115118116118117118118118119118120118121118122118123118124118125118126118127118128118129118130118131118132118133118134118135118136118137118138118139118140118141118142118143118144118145118146118147118148118149118150118151118152118153118154118155118156118157118158118159118160118161118162118163118164118165118166118167118168118169118170118171118172118173118174118175118176118177118178118179118180118181118182118183118184118185118186118187118188118189118190118191118192118193118194118195118196118197118198118199118200118201118202118203118204118205118206118207118208118209118210118211118212118213118214118215118216118217118218118219118220118221118222118223118224118225118226118227118228118229118230118231118232118233118234118235118236118237118238118239118240118241118242118243118244118245118246118247118248118249118250118251118252118253118254118255118256118257118258118259118260118261118262118263118264118265118266118267118268118269118270118271118272118273118274118275118276118277118278118279118280118281118282118283118284118285118286118287118288118289118290118291118292118293118294118295118296118297118298118299118300118301118302118303118304118305118306118307118308118309118310118311118312118313118314118315118316118317118318118319118320118321118322118323118324118325118326118327118328118329118330118331118332118333118334118335118336118337118338118339118340118341118342118343118344118345118346118347118348118349118350118351118352118353118354118355118356118357118358118359118360118361118362118363118364118365118366118367118368118369118370118371118372118373118374118375118376118377118378118379118380118381118382118383118384118385118386118387118388118389118390118391118392118393118394118395118396118397118398118399118400118401118402118403118404118405118406118407118408118409118410118411118412118413118414118415118416118417118418118419118420118421118422118423118424118425118426118427118428118429118430118431118432118433118434118435118436118437118438118439118440118441118442118443118444118445118446118447118448118449118450118451118452118453118454118455118456118457118458118459118460118461118462118463118464118465118466118467118468118469118470118471118472118473118474118475118476118477118478118479118480118481118482118483118484118485118486118487118488118489118490118491118492118493118494118495118496118497118498118499118500118501118502118503118504118505118506118507118508118509118510118511118512118513118514118515118516118517118518118519118520118521118522118523118524118525118526118527118528118529118530118531118532118533118534118535118536118537118538118539118540118541118542118543118544118545118546118547118548118549118550118551118552118553118554118555118556118557118558118559118560118561118562118563118564118565118566118567118568118569118570118571118572118573118574118575118576118577118578118579118580118581118582118583118584118585118586118587118588118589118590118591118592118593118594118595118596118597118598118599118600118601118602118603118604118605118606118607118608118609118610118611118612118613118614118615118616118617118618118619118620118621118622118623118624118625118626118627118628118629118630118631118632118633118634118635118636118637118638118639118640118641118642118643118644118645118646118647118648118649118650118651118652118653118654118655118656118657118658118659118660118661118662118663118664118665118666118667118668118669118670118671118672118673118674118675118676118677118678118679118680118681118682118683118684118685118686118687118688118689118690118691118692118693118694118695118696118697118698118699118700118701118702118703118704118705118706118707118708118709118710118711118712118713118714118715118716118717118718118719118720118721118722118723118724118725118726118727118728118729118730118731118732118733118734118735118736118737118738118739118740118741118742118743118744118745118746118747118748118749118750118751118752118753118754118755118756118757118758118759118760118761118762118763118764118765118766118767118768118769118770118771118772118773118774118775118776118777118778118779118780118781118782118783118784118785118786118787118788118789118790118791118792118793118794118795118796118797118798118799118800118801118802118803118804118805118806118807118808118809118810118811118812118813118814118815118816118817118818118819118820118821118822118823118824118825118826118827118828118829118830118831118832118833118834118835118836118837118838118839118840118841118842118843118844118845118846118847118848118849118850118851118852118853118854118855118856118857118858118859118860118861118862118863118864118865118866118867118868118869118870118871118872118873118874118875118876118877118878118879118880118881118882118883118884118885118886118887118888118889118890118891118892118893118894118895118896118897118898118899118900118901118902118903118904118905118906118907118908118909118910118911118912118913118914118915118916118917118918118919118920118921118922118923118924118925118926118927118928118929118930118931118932118933118934118935118936118937118938118939118940118941118942118943118944118945118946118947118948118949118950118951118952118953118954118955118956118957118958118959118960118961118962118963118964118965118966118967118968118969118970118971118972118973118974118975118976118977118978118979118980118981118982118983118984118985118986118987118988118989118990118991118992118993118994118995118996118997118998118999119000119001119002119003119004119005119006119007119008119009119010119011119012119013119014119015119016119017119018119019119020119021119022119023119024119025119026119027119028119029119030119031119032119033119034119035119036119037119038119039119040119041119042119043119044119045119046119047119048119049119050119051119052119053119054119055119056119057119058119059119060119061119062119063119064119065119066119067119068119069119070119071119072119073119074119075119076119077119078119079119080119081119082119083119084119085119086119087119088119089119090119091119092119093119094119095119096119097119098119099119100119101119102119103119104119105119106119107119108119109119110119111119112119113119114119115119116119117119118119119119120119121119122119123119124119125119126119127119128119129119130119131119132119133119134119135119136119137119138119139119140119141119142119143119144119145119146119147119148119149119150119151119152119153119154119155119156119157119158119159119160119161119162119163119164119165119166119167119168119169119170119171119172119173119174119175119176119177119178119179119180119181119182119183119184119185119186119187119188119189119190119191119192119193119194119195119196119197119198119199119200119201119202119203119204119205119206119207119208119209119210119211119212119213119214119215119216119217119218119219119220119221119222119223119224119225119226119227119228119229119230119231119232119233119234119235119236119237119238119239119240119241119242119243119244119245119246119247119248119249119250119251119252119253119254119255119256119257119258119259119260119261119262119263119264119265119266119267119268119269119270119271119272119273119274119275119276119277119278119279119280119281119282119283119284119285119286119287119288119289119290119291119292119293119294119295119296119297119298119299119300119301119302119303119304119305119306119307119308119309119310119311119312119313119314119315119316119317119318119319119320119321119322119323119324119325119326119327119328119329119330119331119332119333119334119335119336119337119338119339119340119341119342119343119344119345119346119347119348119349119350119351119352119353119354119355119356119357119358119359119360119361119362119363119364119365119366119367119368119369119370119371119372119373119374119375119376119377119378119379119380119381119382119383119384119385119386119387119388119389119390119391119392119393119394119395119396119397119398119399119400119401119402119403119404119405119406119407119408119409119410119411119412119413119414119415119416119417119418119419119420119421119422119423119424119425119426119427119428119429119430119431119432119433119434119435119436119437119438119439119440119441119442119443119444119445119446119447119448119449119450119451119452119453119454119455119456119457119458119459119460119461119462119463119464119465119466119467119468119469119470119471119472119473119474119475119476119477119478119479119480119481119482119483119484119485119486119487119488119489119490119491119492119493119494119495119496119497119498119499119500119501119502119503119504119505119506119507119508119509119510119511119512119513119514119515119516119517119518119519119520119521119522119523119524119525119526119527119528119529119530119531119532119533119534119535119536119537119538119539119540119541119542119543119544119545119546119547119548119549119550119551119552119553119554119555119556119557119558119559119560119561119562119563119564119565119566119567119568119569119570119571119572119573119574119575119576119577119578119579119580119581119582119583119584119585119586119587119588119589119590119591119592119593119594119595119596119597119598119599119600119601119602119603119604119605119606119607119608119609119610119611119612119613119614119615119616119617119618119619119620119621119622119623119624119625119626119627119628119629119630119631119632119633119634119635119636119637119638119639119640119641119642119643119644119645119646119647119648119649119650119651119652119653119654119655119656119657119658119659119660119661119662119663119664119665119666119667119668119669119670119671119672119673119674119675119676119677119678119679119680119681119682119683119684119685119686119687119688119689119690119691119692119693119694119695119696119697119698119699119700119701119702119703119704119705119706119707119708119709119710119711119712119713119714119715119716119717119718119719119720119721119722119723119724119725119726119727119728119729119730119731119732119733119734119735119736119737119738119739119740119741119742119743119744119745119746119747119748119749119750119751119752119753119754119755119756119757119758119759119760119761119762119763119764119765119766119767119768119769119770119771119772119773119774119775119776119777119778119779119780119781119782119783119784119785119786119787119788119789119790119791119792119793119794119795119796119797119798119799119800119801119802119803119804119805119806119807119808119809119810119811119812119813119814119815119816119817119818119819119820119821119822119823119824119825119826119827119828119829119830119831119832119833119834119835119836119837119838119839119840119841119842119843119844119845119846119847119848119849119850119851119852119853119854119855119856119857119858119859119860119861119862119863119864119865119866119867119868119869119870119871119872119873119874119875119876119877119878119879119880119881119882119883119884119885119886119887119888119889119890119891119892119893119894119895119896119897119898119899119900119901119902119903119904119905119906119907119908119909119910119911119912119913119914119915119916119917119918119919119920119921119922119923119924119925119926119927119928119929119930119931119932119933119934119935119936119937119938119939119940119941119942119943119944119945119946119947119948119949119950119951119952119953119954119955119956119957119958119959119960119961119962119963119964119965119966119967119968119969119970119971119972119973119974119975119976119977119978119979119980119981119982119983119984119985119986119987119988119989119990119991119992119993119994119995119996119997119998119999120000120001120002120003120004120005120006120007120008120009120010120011120012120013120014120015120016120017120018120019120020120021120022120023120024120025120026120027120028120029120030120031120032120033120034120035120036120037120038120039120040120041120042120043120044120045120046120047120048120049120050120051120052120053120054120055120056120057120058120059120060120061120062120063120064120065120066120067120068120069120070120071120072120073120074120075120076120077120078120079120080120081120082120083120084120085120086120087120088120089120090120091120092120093120094120095120096120097120098120099120100120101120102120103120104120105120106120107120108120109120110120111120112120113120114120115120116120117120118120119120120120121120122120123120124120125120126120127120128120129120130120131120132120133120134120135120136120137120138120139120140120141120142120143120144120145120146120147120148120149120150120151120152120153120154120155120156120157120158120159120160120161120162120163120164120165120166120167120168120169120170120171120172120173120174120175120176120177120178120179120180120181120182120183120184120185120186120187120188120189120190120191120192120193120194120195120196120197120198120199120200120201120202120203120204120205120206120207120208120209120210120211120212120213120214120215120216120217120218120219120220120221120222120223120224120225120226120227120228120229120230120231120232120233120234120235120236120237120238120239120240120241120242120243120244120245120246120247120248120249120250120251120252120253120254120255120256120257120258120259120260120261120262120263120264120265120266120267120268120269120270120271120272120273120274120275120276120277120278120279120280120281120282120283120284120285120286120287120288120289120290120291120292120293120294120295120296120297120298120299120300120301120302120303120304120305120306120307120308120309120310120311120312120313120314120315120316120317120318120319120320120321120322120323120324120325120326120327120328120329120330120331120332120333120334120335120336120337120338120339120340120341120342120343120344120345120346120347120348120349120350120351120352120353120354120355120356120357120358120359120360120361120362120363120364120365120366120367120368120369120370120371120372120373120374120375120376120377120378120379120380120381120382120383120384120385120386120387120388120389120390120391120392120393120394120395120396120397120398120399120400120401120402120403120404120405120406120407120408120409120410120411120412120413120414120415120416120417120418120419120420120421120422120423120424120425120426120427120428120429120430120431120432120433120434120435120436120437120438120439120440120441120442120443120444120445120446120447120448120449120450120451120452120453120454120455120456120457120458120459120460120461120462120463120464120465120466120467120468120469120470120471120472120473120474120475120476120477120478120479120480120481120482120483120484120485120486120487120488120489120490120491120492120493120494120495120496120497120498120499120500120501120502120503120504120505120506120507120508120509120510120511120512120513120514120515120516120517120518120519120520120521120522120523120524120525120526120527120528120529120530120531120532120533120534120535120536120537120538120539120540120541120542120543120544120545120546120547120548120549120550120551120552120553120554120555120556120557120558120559120560120561120562120563120564120565120566120567120568120569120570120571120572120573120574120575120576120577120578120579120580120581120582120583120584120585120586120587120588120589120590120591120592120593120594120595120596120597120598120599120600120601120602120603120604120605120606120607120608120609120610120611120612120613120614120615120616120617120618120619120620120621120622120623120624120625120626120627120628120629120630120631120632120633120634120635120636120637120638120639120640120641120642120643120644120645120646120647120648120649120650120651120652120653120654120655120656120657120658120659120660120661120662120663120664120665120666120667120668120669120670120671120672120673120674120675120676120677120678120679120680120681120682120683120684120685120686120687120688120689120690120691120692120693120694120695120696120697120698120699120700120701120702120703120704120705120706120707120708120709120710120711120712120713120714120715120716120717120718120719120720120721120722120723120724120725120726120727120728120729120730120731120732120733120734120735120736120737120738120739120740120741120742120743120744120745120746120747120748120749120750120751120752120753120754120755120756120757120758120759120760120761120762120763120764120765120766120767120768120769120770120771120772120773120774120775120776120777120778120779120780120781120782120783120784120785120786120787120788120789120790120791120792120793120794120795120796120797120798120799120800120801120802120803120804120805120806120807120808120809120810120811120812120813120814120815120816120817120818120819120820120821120822120823120824120825120826120827120828120829120830120831120832120833120834120835120836120837120838120839120840120841120842120843120844120845120846120847120848120849120850120851120852120853120854120855120856120857120858120859120860120861120862120863120864120865120866120867120868120869120870120871120872120873120874120875120876120877120878120879120880120881120882120883120884120885120886120887120888120889120890120891120892120893120894120895120896120897120898120899120900120901120902120903120904120905120906120907120908120909120910120911120912120913120914120915120916120917120918120919120920120921120922120923120924120925120926120927120928120929120930120931120932120933120934120935120936120937120938120939120940120941120942120943120944120945120946120947120948120949120950120951120952120953120954120955120956120957120958120959120960120961120962120963120964120965120966120967120968120969120970120971120972120973120974120975120976120977120978120979120980120981120982120983120984120985120986120987120988120989120990120991120992120993120994120995120996120997120998120999121000121001121002121003121004121005121006121007121008121009121010121011121012121013121014121015121016121017121018121019121020121021121022121023121024121025121026121027121028121029121030121031121032121033121034121035121036121037121038121039121040121041121042121043121044121045121046121047121048121049121050121051121052121053121054121055121056121057121058121059121060121061121062121063121064121065121066121067121068121069121070121071121072121073121074121075121076121077121078121079121080121081121082121083121084121085121086121087121088121089121090121091121092121093121094121095121096121097121098121099121100121101121102121103121104121105121106121107121108121109121110121111121112121113121114121115121116121117121118121119121120121121121122121123121124121125121126121127121128121129121130121131121132121133121134121135121136121137121138121139121140121141121142121143121144121145121146121147121148121149121150121151121152121153121154121155121156121157121158121159121160121161121162121163121164121165121166121167121168121169121170121171121172121173121174121175121176121177121178121179121180121181121182121183121184121185121186121187121188121189121190121191121192121193121194121195121196121197121198121199121200121201121202121203121204121205121206121207121208121209121210121211121212121213121214121215121216121217121218121219121220121221121222121223121224121225121226121227121228121229121230121231121232121233121234121235121236121237121238121239121240121241121242121243121244121245121246121247121248121249121250121251121252121253121254121255121256121257121258121259121260121261121262121263121264121265121266121267121268121269121270121271121272121273121274121275121276121277121278121279121280121281121282121283121284121285121286121287121288121289121290121291121292121293121294121295121296121297121298121299121300121301121302121303121304121305121306121307121308121309121310121311121312121313121314121315121316121317121318121319121320121321121322121323121324121325121326121327121328121329121330121331121332121333121334121335121336121337121338121339121340121341121342121343121344121345121346121347121348121349121350121351121352121353121354121355121356121357121358121359121360121361121362121363121364121365121366121367121368121369121370121371121372121373121374121375121376121377121378121379121380121381121382121383121384121385121386121387121388121389121390121391121392121393121394121395121396121397121398121399121400121401121402121403121404121405121406121407121408121409121410121411121412121413121414121415121416121417121418121419121420121421121422121423121424121425121426121427121428121429121430121431121432121433121434121435121436121437121438121439121440121441121442121443121444121445121446121447121448121449121450121451121452121453121454121455121456121457121458121459121460121461121462121463121464121465121466121467121468121469121470121471121472121473121474121475121476121477121478121479121480121481121482121483121484121485121486121487121488121489121490121491121492121493121494121495121496121497121498121499121500121501121502121503121504121505121506121507121508121509121510121511121512121513121514121515121516121517121518121519121520121521121522121523121524121525121526121527121528121529121530121531121532121533121534121535121536121537121538121539121540121541121542121543121544121545121546121547121548121549121550121551121552121553121554121555121556121557121558121559121560121561121562121563121564121565121566121567121568121569121570121571121572121573121574121575121576121577121578121579121580121581121582121583121584121585121586121587121588121589121590121591121592121593121594121595121596121597121598121599121600121601121602121603121604121605121606121607121608121609121610121611121612121613121614121615121616121617121618121619121620121621121622121623121624121625121626121627121628121629121630121631121632121633121634121635121636121637121638121639121640121641121642121643121644121645121646121647121648121649121650121651121652121653121654121655121656121657121658121659121660121661121662121663121664121665121666121667121668121669121670121671121672121673121674121675121676121677121678121679121680121681121682121683121684121685121686121687121688121689121690121691121692121693121694121695121696121697121698121699121700121701121702121703121704121705121706121707121708121709121710121711121712121713121714121715121716121717121718121719121720121721121722121723121724121725121726121727121728121729121730121731121732121733121734121735121736121737121738121739121740121741121742121743121744121745121746121747121748121749121750121751121752121753121754121755121756121757121758121759121760121761121762121763121764121765121766121767121768121769121770121771121772121773121774121775121776121777121778121779121780121781121782121783121784121785121786121787121788121789121790121791121792121793121794121795121796121797121798121799121800121801121802121803121804121805121806121807121808121809121810121811121812121813121814121815121816121817121818121819121820121821121822121823121824121825121826121827121828121829121830121831121832121833121834121835121836121837121838121839121840121841121842121843121844121845121846121847121848121849121850121851121852121853121854121855121856121857121858121859121860121861121862121863121864121865121866121867121868121869121870121871121872121873121874121875121876121877121878121879121880121881121882121883121884121885121886121887121888121889121890121891121892121893121894121895121896121897121898121899121900121901121902121903121904121905121906121907121908121909121910121911121912121913121914121915121916121917121918121919121920121921121922121923121924121925121926121927121928121929121930121931121932121933121934121935121936121937121938121939121940121941121942121943121944121945121946121947121948121949121950121951121952121953121954121955121956121957121958121959121960121961121962121963121964121965121966121967121968121969121970121971121972121973121974121975121976121977121978121979121980121981121982121983121984121985121986121987121988121989121990121991121992121993121994121995121996121997121998121999122000122001122002122003122004122005122006122007122008122009122010122011122012122013122014122015122016122017122018122019122020122021122022122023122024122025122026122027122028122029122030122031122032122033122034122035122036122037122038122039122040122041122042122043122044122045122046122047122048122049122050122051122052122053122054122055122056122057122058122059122060122061122062122063122064122065122066122067122068122069122070122071122072122073122074122075122076122077122078122079122080122081122082122083122084122085122086122087122088122089122090122091122092122093122094122095122096122097122098122099122100122101122102122103122104122105122106122107122108122109122110122111122112122113122114122115122116122117122118122119122120122121122122122123122124122125122126122127122128122129122130122131122132122133122134122135122136122137122138122139122140122141122142122143122144122145122146122147122148122149122150122151122152122153122154122155122156122157122158122159122160122161122162122163122164122165122166122167122168122169122170122171122172122173122174122175122176122177122178122179122180122181122182122183122184122185122186122187122188122189122190122191122192122193122194122195122196122197122198122199122200122201122202122203122204122205122206122207122208122209122210122211122212122213122214122215122216122217122218122219122220122221122222122223122224122225122226122227122228122229122230122231122232122233122234122235122236122237122238122239122240122241122242122243122244122245122246122247122248122249122250122251122252122253122254122255122256122257122258122259122260122261122262122263122264122265122266122267122268122269122270122271122272122273122274122275122276122277122278122279122280122281122282122283122284122285122286122287122288122289122290122291122292122293122294122295122296122297122298122299122300122301122302122303122304122305122306122307122308122309122310122311122312122313122314122315122316122317122318122319122320122321122322122323122324122325122326122327122328122329122330122331122332122333122334122335122336122337122338122339122340122341122342122343122344122345122346122347122348122349122350122351122352122353122354122355122356122357122358122359122360122361122362122363122364122365122366122367122368122369122370122371122372122373122374122375122376122377122378122379122380122381122382122383122384122385122386122387122388122389122390122391122392122393122394122395122396122397122398122399122400122401122402122403122404122405122406122407122408122409122410122411122412122413122414122415122416122417122418122419122420122421122422122423122424122425122426122427122428122429122430122431122432122433122434122435122436122437122438122439122440122441122442122443122444122445122446122447122448122449122450122451122452122453122454122455122456122457122458122459122460122461122462122463122464122465122466122467122468122469122470122471122472122473122474122475122476122477122478122479122480122481122482122483122484122485122486122487122488122489122490122491122492122493122494122495122496122497122498122499122500122501122502122503122504122505122506122507122508122509122510122511122512122513122514122515122516122517122518122519122520122521122522122523122524122525122526122527122528122529122530122531122532122533122534122535122536122537122538122539122540122541122542122543122544122545122546122547122548122549122550122551122552122553122554122555122556122557122558122559122560122561122562122563122564122565122566122567122568122569122570122571122572122573122574122575122576122577122578122579122580122581122582122583122584122585122586122587122588122589122590122591122592122593122594122595122596122597122598122599122600122601122602122603122604122605122606122607122608122609122610122611122612122613122614122615122616122617122618122619122620122621122622122623122624122625122626122627122628122629122630122631122632122633122634122635122636122637122638122639122640122641122642122643122644122645122646122647122648122649122650122651122652122653122654122655122656122657122658122659122660122661122662122663122664122665122666122667122668122669122670122671122672122673122674122675122676122677122678122679122680122681122682122683122684122685122686122687122688122689122690122691122692122693122694122695122696122697122698122699122700122701122702122703122704122705122706122707122708122709122710122711122712122713122714122715122716122717122718122719122720122721122722122723122724122725122726122727122728122729122730122731122732122733122734122735122736122737122738122739122740122741122742122743122744122745122746122747122748122749122750122751122752122753122754122755122756122757122758122759122760122761122762122763122764122765122766122767122768122769122770122771122772122773122774122775122776122777122778122779122780122781122782122783122784122785122786122787122788122789122790122791122792122793122794122795122796122797122798122799122800122801122802122803122804122805122806122807122808122809122810122811122812122813122814122815122816122817122818122819122820122821122822122823122824122825122826122827122828122829122830122831122832122833122834122835122836122837122838122839122840122841122842122843122844122845122846122847122848122849122850122851122852122853122854122855122856122857122858122859122860122861122862122863122864122865122866122867122868122869122870122871122872122873122874122875122876122877122878122879122880122881122882122883122884122885122886122887122888122889122890122891122892122893122894122895122896122897122898122899122900122901122902122903122904122905122906122907122908122909122910122911122912122913122914122915122916122917122918122919122920122921122922122923122924122925122926122927122928122929122930122931122932122933122934122935122936122937122938122939122940122941122942122943122944122945122946122947122948122949122950122951122952122953122954122955122956122957122958122959122960122961122962122963122964122965122966122967122968122969122970122971122972122973122974122975122976122977122978122979122980122981122982122983122984122985122986122987122988122989122990122991122992122993122994122995122996122997122998122999123000123001123002123003123004123005123006123007123008123009123010123011123012123013123014123015123016123017123018123019123020123021123022123023123024123025123026123027123028123029123030123031123032123033123034123035123036123037123038123039123040123041123042123043123044123045123046123047123048123049123050123051123052123053123054123055123056123057123058123059123060123061123062123063123064123065123066123067123068123069123070123071123072123073123074123075123076123077123078123079123080123081123082123083123084123085123086123087123088123089123090123091123092123093123094123095123096123097123098123099123100123101123102123103123104123105123106123107123108123109123110123111123112123113123114123115123116123117123118123119123120123121123122123123123124123125123126123127123128123129123130123131123132123133123134123135123136123137123138123139123140123141123142123143123144123145123146123147123148123149123150123151123152123153123154123155123156123157123158123159123160123161123162123163123164123165123166123167123168123169123170123171123172123173123174123175123176123177123178123179123180123181123182123183123184123185123186123187123188123189123190123191123192123193123194123195123196123197123198123199123200123201123202123203123204123205123206123207123208123209123210123211123212123213123214123215123216123217123218123219123220123221123222123223123224123225123226123227123228123229123230123231123232123233123234123235123236123237123238123239123240123241123242123243123244123245123246123247123248123249123250123251123252123253123254123255123256123257123258123259123260123261123262123263123264123265123266123267123268123269123270123271123272123273123274123275123276123277123278123279123280123281123282123283123284123285123286123287123288123289123290123291123292123293123294123295123296123297123298123299123300123301123302123303123304123305123306123307123308123309123310123311123312123313123314123315123316123317123318123319123320123321123322123323123324123325123326123327123328123329123330123331123332123333123334123335123336123337123338123339123340123341123342123343123344123345123346123347123348123349123350123351123352123353123354123355123356123357123358123359123360123361123362123363123364123365123366123367123368123369123370123371123372123373123374123375123376123377123378123379123380123381123382123383123384123385123386123387123388123389123390123391123392123393123394123395123396123397123398123399123400123401123402123403123404123405123406123407123408123409123410123411123412123413123414123415123416123417123418123419123420123421123422123423123424123425123426123427123428123429123430123431123432123433123434123435123436123437123438123439123440123441123442123443123444123445123446123447123448123449123450123451123452123453123454123455123456123457123458123459123460123461123462123463123464123465123466123467123468123469123470123471123472123473123474123475123476123477123478123479123480123481123482123483123484123485123486123487123488123489123490123491123492123493123494123495123496123497123498123499123500123501123502123503123504123505123506123507123508123509123510123511123512123513123514123515123516123517123518123519123520123521123522123523123524123525123526123527123528123529123530123531123532123533123534123535123536123537123538123539123540123541123542123543123544123545123546123547123548123549123550123551123552123553123554123555123556123557123558123559123560123561123562123563123564123565123566123567123568123569123570123571123572123573123574123575123576123577123578123579123580123581123582123583123584123585123586123587123588123589123590123591123592123593123594123595123596123597123598123599123600123601123602123603123604123605123606123607123608123609123610123611123612123613123614123615123616123617123618123619123620123621123622123623123624123625123626123627123628123629123630123631123632123633123634123635123636123637123638123639123640123641123642123643123644123645123646123647123648123649123650123651123652123653123654123655123656123657123658123659123660123661123662123663123664123665123666123667123668123669123670123671123672123673123674123675123676123677123678123679123680123681123682123683123684123685123686123687123688123689123690123691123692123693123694123695123696123697123698123699123700123701123702123703123704123705123706123707123708123709123710123711123712123713123714123715123716123717123718123719123720123721123722123723123724123725123726123727123728123729123730123731123732123733123734123735123736123737123738123739123740123741123742123743123744123745123746123747123748123749123750123751123752123753123754123755123756123757123758123759123760123761123762123763123764123765123766123767123768123769123770123771123772123773123774123775123776123777123778123779123780123781123782123783123784123785123786123787123788123789123790123791123792123793123794123795123796123797123798123799123800123801123802123803123804123805123806123807123808123809123810123811123812123813123814123815123816123817123818123819123820123821123822123823123824123825123826123827123828123829123830123831123832123833123834123835123836123837123838123839123840123841123842123843123844123845123846123847123848123849123850123851123852123853123854123855123856123857123858123859123860123861123862123863123864123865123866123867123868123869123870123871123872123873123874123875123876123877123878123879123880123881123882123883123884123885123886123887123888123889123890123891123892123893123894123895123896123897123898123899123900123901123902123903123904123905123906123907123908123909123910123911123912123913123914123915123916123917123918123919123920123921123922123923123924123925123926123927123928123929123930123931123932123933123934123935123936123937123938123939123940123941123942123943123944123945123946123947123948123949123950123951123952123953123954123955123956123957123958123959123960123961123962123963123964123965123966123967123968123969123970123971123972123973123974123975123976123977123978123979123980123981123982123983123984123985123986123987123988123989123990123991123992123993123994123995123996123997123998123999124000124001124002124003124004124005124006124007124008124009124010124011124012124013124014124015124016124017124018124019124020124021124022124023124024124025124026124027124028124029124030124031124032124033124034124035124036124037124038124039124040124041124042124043124044124045124046124047124048124049124050124051124052124053124054124055124056124057124058124059124060124061124062124063124064124065124066124067124068124069124070124071124072124073124074124075124076124077124078124079124080124081124082124083124084124085124086124087124088124089124090124091124092124093124094124095124096124097124098124099124100124101124102124103124104124105124106124107124108124109124110124111124112124113124114124115124116124117124118124119124120124121124122124123124124124125124126124127124128124129124130124131124132124133124134124135124136124137124138124139124140124141124142124143124144124145124146124147124148124149124150124151124152124153124154124155124156124157124158124159124160124161124162124163124164124165124166124167124168124169124170124171124172124173124174124175124176124177124178124179124180124181124182124183124184124185124186124187124188124189124190124191124192124193124194124195124196124197124198124199124200124201124202124203124204124205124206124207124208124209124210124211124212124213124214124215124216124217124218124219124220124221124222124223124224124225124226124227124228124229124230124231124232124233124234124235124236124237124238124239124240124241124242124243124244124245124246124247124248124249124250124251124252124253124254124255124256124257124258124259124260124261124262124263124264124265124266124267124268124269124270124271124272124273124274124275124276124277124278124279124280124281124282124283124284124285124286124287124288124289124290124291124292124293124294124295124296124297124298124299124300124301124302124303124304124305124306124307124308124309124310124311124312124313124314124315124316124317124318124319124320124321124322124323124324124325124326124327124328124329124330124331124332124333124334124335124336124337124338124339124340124341124342124343124344124345124346124347124348124349124350124351124352124353124354124355124356124357124358124359124360124361124362124363124364124365124366124367124368124369124370124371124372124373124374124375124376124377124378124379124380124381124382124383124384124385124386124387124388124389124390124391124392124393124394124395124396124397124398124399124400124401124402124403124404124405124406124407124408124409124410124411124412124413124414124415124416124417124418124419124420124421124422124423124424124425124426124427124428124429124430124431124432124433124434124435124436124437124438124439124440124441124442124443124444124445124446124447124448124449124450124451124452124453124454124455124456124457124458124459124460124461124462124463124464124465124466124467124468124469124470124471124472124473124474124475124476124477124478124479124480124481124482124483124484124485124486124487124488124489124490124491124492124493124494124495124496124497124498124499124500124501124502124503124504124505124506124507124508124509124510124511124512124513124514124515124516124517124518124519124520124521124522124523124524124525124526124527124528124529124530124531124532124533124534124535124536124537124538124539124540124541124542124543124544124545124546124547124548124549124550124551124552124553124554124555124556124557124558124559124560124561124562124563124564124565124566124567124568124569124570124571124572124573124574124575124576124577124578124579124580124581124582124583124584124585124586124587124588124589124590124591124592124593124594124595124596124597124598124599124600124601124602124603124604124605124606124607124608124609124610124611124612124613124614124615124616124617124618124619124620124621124622124623124624124625124626124627124628124629124630124631124632124633124634124635124636124637124638124639124640124641124642124643124644124645124646124647124648124649124650124651124652124653124654124655124656124657124658124659124660124661124662124663124664124665124666124667124668124669124670124671124672124673124674124675124676124677124678124679124680124681124682124683124684124685124686124687124688124689124690124691124692124693124694124695124696124697124698124699124700124701124702124703124704124705124706124707124708124709124710124711124712124713124714124715124716124717124718124719124720124721124722124723124724124725124726124727124728124729124730124731124732124733124734124735124736124737124738124739124740124741124742124743124744124745124746124747124748124749124750124751124752124753124754124755124756124757124758124759124760124761124762124763124764124765124766124767124768124769124770124771124772124773124774124775124776124777124778124779124780124781124782124783124784124785124786124787124788124789124790124791124792124793124794124795124796124797124798124799124800124801124802124803124804124805124806124807124808124809124810124811124812124813124814124815124816124817124818124819124820124821124822124823124824124825124826124827124828124829124830124831124832124833124834124835124836124837124838124839124840124841124842124843124844124845124846124847124848124849124850124851124852124853124854124855124856124857124858124859124860124861124862124863124864124865124866124867124868124869124870124871124872124873124874124875124876124877124878124879124880124881124882124883124884124885124886124887124888124889124890124891124892124893124894124895124896124897124898124899124900124901124902124903124904124905124906124907124908124909124910124911124912124913124914124915124916124917124918124919124920124921124922124923124924124925124926124927124928124929124930124931124932124933124934124935124936124937124938124939124940124941124942124943124944124945124946124947124948124949124950124951124952124953124954124955124956124957124958124959124960124961124962124963124964124965124966124967124968124969124970124971124972124973124974124975124976124977124978124979124980124981124982124983124984124985124986124987124988124989124990124991124992124993124994124995124996124997124998124999125000125001125002125003125004125005125006125007125008125009125010125011125012125013125014125015125016125017125018125019125020125021125022125023125024125025125026125027125028125029125030125031125032125033125034125035125036125037125038125039125040125041125042125043125044125045125046125047125048125049125050125051125052125053125054125055125056125057125058125059125060125061125062125063125064125065125066125067125068125069125070125071125072125073125074125075125076125077125078125079125080125081125082125083125084125085125086125087125088125089125090125091125092125093125094125095125096125097125098125099125100125101125102125103125104125105125106125107125108125109125110125111125112125113125114125115125116125117125118125119125120125121125122125123125124125125125126125127125128125129125130125131125132125133125134125135125136125137125138125139125140125141125142125143125144125145125146125147125148125149125150125151125152125153125154125155125156125157125158125159125160125161125162125163125164125165125166125167125168125169125170125171125172125173125174125175125176125177125178125179125180125181125182125183125184125185125186125187125188125189125190125191125192125193125194125195125196125197125198125199125200125201125202125203125204125205125206125207125208125209125210125211125212125213125214125215125216125217125218125219125220125221125222125223125224125225125226125227125228125229125230125231125232125233125234125235125236125237125238125239125240125241125242125243125244125245125246125247125248125249125250125251125252125253125254125255125256125257125258125259125260125261125262125263125264125265125266125267125268125269125270125271125272125273125274125275125276125277125278125279125280125281125282125283125284125285125286125287125288125289125290125291125292125293125294125295125296125297125298125299125300125301125302125303125304125305125306125307125308125309125310125311125312125313125314125315125316125317125318125319125320125321125322125323125324125325125326125327125328125329125330125331125332125333125334125335125336125337125338125339125340125341125342125343125344125345125346125347125348125349125350125351125352125353125354125355125356125357125358125359125360125361125362125363125364125365125366125367125368125369125370125371125372125373125374125375125376125377125378125379125380125381125382125383125384125385125386125387125388125389125390125391125392125393125394125395125396125397125398125399125400125401125402125403125404125405125406125407125408125409125410125411125412125413125414125415125416125417125418125419125420125421125422125423125424125425125426125427125428125429125430125431125432125433125434125435125436125437125438125439125440125441125442125443125444125445125446125447125448125449125450125451125452125453125454125455125456125457125458125459125460125461125462125463125464125465125466125467125468125469125470125471125472125473125474125475125476125477125478125479125480125481125482125483125484125485125486125487125488125489125490125491125492125493125494125495125496125497125498125499125500125501125502125503125504125505125506125507125508125509125510125511125512125513125514125515125516125517125518125519125520125521125522125523125524125525125526125527125528125529125530125531125532125533125534125535125536125537125538125539125540125541125542125543125544125545125546125547125548125549125550125551125552125553125554125555125556125557125558125559125560125561125562125563125564125565125566125567125568125569125570125571125572125573125574125575125576125577125578125579125580125581125582125583125584125585125586125587125588125589125590125591125592125593125594125595125596125597125598125599125600125601125602125603125604125605125606125607125608125609125610125611125612125613125614125615125616125617125618125619125620125621125622125623125624125625125626125627125628125629125630125631125632125633125634125635125636125637125638125639125640125641125642125643125644125645125646125647125648125649125650125651125652125653125654125655125656125657125658125659125660125661125662125663125664125665125666125667125668125669125670125671125672125673125674125675125676125677125678125679125680125681125682125683125684125685125686125687125688125689125690125691125692125693125694125695125696125697125698125699125700125701125702125703125704125705125706125707125708125709125710125711125712125713125714125715125716125717125718125719125720125721125722125723125724125725125726125727125728125729125730125731125732125733125734125735125736125737125738125739125740125741125742125743125744125745125746125747125748125749125750125751125752125753125754125755125756125757125758125759125760125761125762125763125764125765125766125767125768125769125770125771125772125773125774125775125776125777125778125779125780125781125782125783125784125785125786125787125788125789125790125791125792125793125794125795125796125797125798125799125800125801125802125803125804125805125806125807125808125809125810125811125812125813125814125815125816125817125818125819125820125821125822125823125824125825125826125827125828125829125830125831125832125833125834125835125836125837125838125839125840125841125842125843125844125845125846125847125848125849125850125851125852125853125854125855125856125857125858125859125860125861125862125863125864125865125866125867125868125869125870125871125872125873125874125875125876125877125878125879125880125881125882125883125884125885125886125887125888125889125890125891125892125893125894125895125896125897125898125899125900125901125902125903125904125905125906125907125908125909125910125911125912125913125914125915125916125917125918125919125920125921125922125923125924125925125926125927125928125929125930125931125932125933125934125935125936125937125938125939125940125941125942125943125944125945125946125947125948125949125950125951125952125953125954125955125956125957125958125959125960125961125962125963125964125965125966125967125968125969125970125971125972125973125974125975125976125977125978125979125980125981125982125983125984125985125986125987125988125989125990125991125992125993125994125995125996125997125998125999126000126001126002126003126004126005126006126007126008126009126010126011126012126013126014126015126016126017126018126019126020126021126022126023126024126025126026126027126028126029126030126031126032126033126034126035126036126037126038126039126040126041126042126043126044126045126046126047126048126049126050126051126052126053126054126055126056126057126058126059126060126061126062126063126064126065126066126067126068126069126070126071126072126073126074126075126076126077126078126079126080126081126082126083126084126085126086126087126088126089126090126091126092126093126094126095126096126097126098126099126100126101126102126103126104126105126106126107126108126109126110126111126112126113126114126115126116126117126118126119126120126121126122126123126124126125126126126127126128126129126130126131126132126133126134126135126136126137126138126139126140126141126142126143126144126145126146126147126148126149126150126151126152126153126154126155126156126157126158126159126160126161126162126163126164126165126166126167126168126169126170126171126172126173126174126175126176126177126178126179126180126181126182126183126184126185126186126187126188126189126190126191126192126193126194126195126196126197126198126199126200126201126202126203126204126205126206126207126208126209126210126211126212126213126214126215126216126217126218126219126220126221126222126223126224126225126226126227126228126229126230126231126232126233126234126235126236126237126238126239126240126241126242126243126244126245126246126247126248126249126250126251126252126253126254126255126256126257126258126259126260126261126262126263126264126265126266126267126268126269126270126271126272126273126274126275126276126277126278126279126280126281126282126283126284126285126286126287126288126289126290126291126292126293126294126295126296126297126298126299126300126301126302126303126304126305126306126307126308126309126310126311126312126313126314126315126316126317126318126319126320126321126322126323126324126325126326126327126328126329126330126331126332126333126334126335126336126337126338126339126340126341126342126343126344126345126346126347126348126349126350126351126352126353126354126355126356126357126358126359126360126361126362126363126364126365126366126367126368126369126370126371126372126373126374126375126376126377126378126379126380126381126382126383126384126385126386126387126388126389126390126391126392126393126394126395126396126397126398126399126400126401126402126403126404126405126406126407126408126409126410126411126412126413126414126415126416126417126418126419126420126421126422126423126424126425126426126427126428126429126430126431126432126433126434126435126436126437126438126439126440126441126442126443126444126445126446126447126448126449126450126451126452126453126454126455126456126457126458126459126460126461126462126463126464126465126466126467126468126469126470126471126472126473126474126475126476126477126478126479126480126481126482126483126484126485126486126487126488126489126490126491126492126493126494126495126496126497126498126499126500126501126502126503126504126505126506126507126508126509126510126511126512126513126514126515126516126517126518126519126520126521126522126523126524126525126526126527126528126529126530126531126532126533126534126535126536126537126538126539126540126541126542126543126544126545126546126547126548126549126550126551126552126553126554126555126556126557126558126559126560126561126562126563126564126565126566126567126568126569126570126571126572126573126574126575126576126577126578126579126580126581126582126583126584126585126586126587126588126589126590126591126592126593126594126595126596126597126598126599126600126601126602126603126604126605126606126607126608126609126610126611126612126613126614126615126616126617126618126619126620126621126622126623126624126625126626126627126628126629126630126631126632126633126634126635126636126637126638126639126640126641126642126643126644126645126646126647126648126649126650126651126652126653126654126655126656126657126658126659126660126661126662126663126664126665126666126667126668126669126670126671126672126673126674126675126676126677126678126679126680126681126682126683126684126685126686126687126688126689126690126691126692126693126694126695126696126697126698126699126700126701126702126703126704126705126706126707126708126709126710126711126712126713126714126715126716126717126718126719126720126721126722126723126724126725126726126727126728126729126730126731126732126733126734126735126736126737126738126739126740126741126742126743126744126745126746126747126748126749126750126751126752126753126754126755126756126757126758126759126760126761126762126763126764126765126766126767126768126769126770126771126772126773126774126775126776126777126778126779126780126781126782126783126784126785126786126787126788126789126790126791126792126793126794126795126796126797126798126799126800126801126802126803126804126805126806126807126808126809126810126811126812126813126814126815126816126817126818126819126820126821126822126823126824126825126826126827126828126829126830126831126832126833126834126835126836126837126838126839126840126841126842126843126844126845126846126847126848126849126850126851126852126853126854126855126856126857126858126859126860126861126862126863126864126865126866126867126868126869126870126871126872126873126874126875126876126877126878126879126880126881126882126883126884126885126886126887126888126889126890126891126892126893126894126895126896126897126898126899126900126901126902126903126904126905126906126907126908126909126910126911126912126913126914126915126916126917126918126919126920126921126922126923126924126925126926126927126928126929126930126931126932126933126934126935126936126937126938126939126940126941126942126943126944126945126946126947126948126949126950126951126952126953126954126955126956126957126958126959126960126961126962126963126964126965126966126967126968126969126970126971126972126973126974126975126976126977126978126979126980126981126982126983126984126985126986126987126988126989126990126991126992126993126994126995126996126997126998126999127000127001127002127003127004127005127006127007127008127009127010127011127012127013127014127015127016127017127018127019127020127021127022127023127024127025127026127027127028127029127030127031127032127033127034127035127036127037127038127039127040127041127042127043127044127045127046127047127048127049127050127051127052127053127054127055127056127057127058127059127060127061127062127063127064127065127066127067127068127069127070127071127072127073127074127075127076127077127078127079127080127081127082127083127084127085127086127087127088127089127090127091127092127093127094127095127096127097127098127099127100127101127102127103127104127105127106127107127108127109127110127111127112127113127114127115127116127117127118127119127120127121127122127123127124127125127126127127127128127129127130127131127132127133127134127135127136127137127138127139127140127141127142127143127144127145127146127147127148127149127150127151127152127153127154127155127156127157127158127159127160127161127162127163127164127165127166127167127168127169127170127171127172127173127174127175127176127177127178127179127180127181127182127183127184127185127186127187127188127189127190127191127192127193127194127195127196127197127198127199127200127201127202127203127204127205127206127207127208127209127210127211127212127213127214127215127216127217127218127219127220127221127222127223127224127225127226127227127228127229127230127231127232127233127234127235127236127237127238127239127240127241127242127243127244127245127246127247127248127249127250127251127252127253127254127255127256127257127258127259127260127261127262127263127264127265127266127267127268127269127270127271127272127273127274127275127276127277127278127279127280127281127282127283127284127285127286127287127288127289127290127291127292127293127294127295127296127297127298127299127300127301127302127303127304127305127306127307127308127309127310127311127312127313127314127315127316127317127318127319127320127321127322127323127324127325127326127327127328127329127330127331127332127333127334127335127336127337127338127339127340127341127342127343127344127345127346127347127348127349127350127351127352127353127354127355127356127357127358127359127360127361127362127363127364127365127366127367127368127369127370127371127372127373127374127375127376127377127378127379127380127381127382127383127384127385127386127387127388127389127390127391127392127393127394127395127396127397127398127399127400127401127402127403127404127405127406127407127408127409127410127411127412127413127414127415127416127417127418127419127420127421127422127423127424127425127426127427127428127429127430127431127432127433127434127435127436127437127438127439127440127441127442127443127444127445127446127447127448127449127450127451127452127453127454127455127456127457127458127459127460127461127462127463127464127465127466127467127468127469127470127471127472127473127474127475127476127477127478127479127480127481127482127483127484127485127486127487127488127489127490127491127492127493127494127495127496127497127498127499127500127501127502127503127504127505127506127507127508127509127510127511127512127513127514127515127516127517127518127519127520127521127522127523127524127525127526127527127528127529127530127531127532127533127534127535127536127537127538127539127540127541127542127543127544127545127546127547127548127549127550127551127552127553127554127555127556127557127558127559127560127561127562127563127564127565127566127567127568127569127570127571127572127573127574127575127576127577127578127579127580127581127582127583127584127585127586127587127588127589127590127591127592127593127594127595127596127597127598127599127600127601127602127603127604127605127606127607127608127609127610127611127612127613127614127615127616127617127618127619127620127621127622127623127624127625127626127627127628127629127630127631127632127633127634127635127636127637127638127639127640127641127642127643127644127645127646127647127648127649127650127651127652127653127654127655127656127657127658127659127660127661127662127663127664127665127666127667127668127669127670127671127672127673127674127675127676127677127678127679127680127681127682127683127684127685127686127687127688127689127690127691127692127693127694127695127696127697127698127699127700127701127702127703127704127705127706127707127708127709127710127711127712127713127714127715127716127717127718127719127720127721127722127723127724127725127726127727127728127729127730127731127732127733127734127735127736127737127738127739127740127741127742127743127744127745127746127747127748127749127750127751127752127753127754127755127756127757127758127759127760127761127762127763127764127765127766127767127768127769127770127771127772127773127774127775127776127777127778127779127780127781127782127783127784127785127786127787127788127789127790127791127792127793127794127795127796127797127798127799127800127801127802127803127804127805127806127807127808127809127810127811127812127813127814127815127816127817127818127819127820127821127822127823127824127825127826127827127828127829127830127831127832127833127834127835127836127837127838127839127840127841127842127843127844127845127846127847127848127849127850127851127852127853127854127855127856127857127858127859127860127861127862127863127864127865127866127867127868127869127870127871127872127873127874127875127876127877127878127879127880127881127882127883127884127885127886127887127888127889127890127891127892127893127894127895127896127897127898127899127900127901127902127903127904127905127906127907127908127909127910127911127912127913127914127915127916127917127918127919127920127921127922127923127924127925127926127927127928127929127930127931127932127933127934127935127936127937127938127939127940127941127942127943127944127945127946127947127948127949127950127951127952127953127954127955127956127957127958127959127960127961127962127963127964127965127966127967127968127969127970127971127972127973127974127975127976127977127978127979127980127981127982127983127984127985127986127987127988127989127990127991127992127993127994127995127996127997127998127999128000128001128002128003128004128005128006128007128008128009128010128011128012128013128014128015128016128017128018128019128020128021128022128023128024128025128026128027128028128029128030128031128032128033128034128035128036128037128038128039128040128041128042128043128044128045128046128047128048128049128050128051128052128053128054128055128056128057128058128059128060128061128062128063128064128065128066128067128068128069128070128071128072128073128074128075128076128077128078128079128080128081128082128083128084128085128086128087128088128089128090128091128092128093128094128095128096128097128098128099128100128101128102128103128104128105128106128107128108128109128110128111128112128113128114128115128116128117128118128119128120128121128122128123128124128125128126128127128128128129128130128131128132128133128134128135128136128137128138128139128140128141128142128143128144128145128146128147128148128149128150128151128152128153128154128155128156128157128158128159128160128161128162128163128164128165128166128167128168128169128170128171128172128173128174128175128176128177128178128179128180128181128182128183128184128185128186128187128188128189128190128191128192128193128194128195128196128197128198128199128200128201128202128203128204128205128206128207128208128209128210128211128212128213128214128215128216128217128218128219128220128221128222128223128224128225128226128227128228128229128230128231128232128233128234128235128236128237128238128239128240128241128242128243128244128245128246128247128248128249128250128251128252128253128254128255128256128257128258128259128260128261128262128263128264128265128266128267128268128269128270128271128272128273128274128275128276128277128278128279128280128281128282128283128284128285128286128287128288128289128290128291128292128293128294128295128296128297128298128299128300128301128302128303128304128305128306128307128308128309128310128311128312128313128314128315128316128317128318128319128320128321128322128323128324128325128326128327128328128329128330128331128332128333128334128335128336128337128338128339128340128341128342128343128344128345128346128347128348128349128350128351128352128353128354128355128356128357128358128359128360128361128362128363128364128365128366128367128368128369128370128371128372128373128374128375128376128377128378128379128380128381128382128383128384128385128386128387128388128389128390128391128392128393128394128395128396128397128398128399128400128401128402128403128404128405128406128407128408128409128410128411128412128413128414128415128416128417128418128419128420128421128422128423128424128425128426128427128428128429128430128431128432128433128434128435128436128437128438128439128440128441128442128443128444128445128446128447128448128449128450128451128452128453128454128455128456128457128458128459128460128461128462128463128464128465128466128467128468128469128470128471128472128473128474128475128476128477128478128479128480128481128482128483128484128485128486128487128488128489128490128491128492128493128494128495128496128497128498128499128500128501128502128503128504128505128506128507128508128509128510128511128512128513128514128515128516128517128518128519128520128521128522128523128524128525128526128527128528128529128530128531128532128533128534128535128536128537128538128539128540128541128542128543128544128545128546128547128548128549128550128551128552128553128554128555128556128557128558128559128560128561128562128563128564128565128566128567128568128569128570128571128572128573128574128575128576128577128578128579128580128581128582128583128584128585128586128587128588128589128590128591128592128593128594128595128596128597128598128599128600128601128602128603128604128605128606128607128608128609128610128611128612128613128614128615128616128617128618128619128620128621128622128623128624128625128626128627128628128629128630128631128632128633128634128635128636128637128638128639128640128641128642128643128644128645128646128647128648128649128650128651128652128653128654128655128656128657128658128659128660128661128662128663128664128665128666128667128668128669128670128671128672128673128674128675128676128677128678128679128680128681128682128683128684128685128686128687128688128689128690128691128692128693128694128695128696128697128698128699128700128701128702128703128704128705128706128707128708128709128710128711128712128713128714128715128716128717128718128719128720128721128722128723128724128725128726128727128728128729128730128731128732128733128734128735128736128737128738128739128740128741128742128743128744128745128746128747128748128749128750128751128752128753128754128755128756128757128758128759128760128761128762128763128764128765128766128767128768128769128770128771128772128773128774128775128776128777128778128779128780128781128782128783128784128785128786128787128788128789128790128791128792128793128794128795128796128797128798128799128800128801128802128803128804128805128806128807128808128809128810128811128812128813128814128815128816128817128818128819128820128821128822128823128824128825128826128827128828128829128830128831128832128833128834128835128836128837128838128839128840128841128842128843128844128845128846128847128848128849128850128851128852128853128854128855128856128857128858128859128860128861128862128863128864128865128866128867128868128869128870128871128872128873128874128875128876128877128878128879128880128881128882128883128884128885128886128887128888128889128890128891128892128893128894128895128896128897128898128899128900128901128902128903128904128905128906128907128908128909128910128911128912128913128914128915128916128917128918128919128920128921128922128923128924128925128926128927128928128929128930128931128932128933128934128935128936128937128938128939128940128941128942128943128944128945128946128947128948128949128950128951128952128953128954128955128956128957128958128959128960128961128962128963128964128965128966128967128968128969128970128971128972128973128974128975128976128977128978128979128980128981128982128983128984128985128986128987128988128989128990128991128992128993128994128995128996128997128998128999129000129001129002129003129004129005129006129007129008129009129010129011129012129013129014129015129016129017129018129019129020129021129022129023129024129025129026129027129028129029129030129031129032129033129034129035129036129037129038129039129040129041129042129043129044129045129046129047129048129049129050129051129052129053129054129055129056129057129058129059129060129061129062129063129064129065129066129067129068129069129070129071129072129073129074129075129076129077129078129079129080129081129082129083129084129085129086129087129088129089129090129091129092129093129094129095129096129097129098129099129100129101129102129103129104129105129106129107129108129109129110129111129112129113129114129115129116129117129118129119129120129121129122129123129124129125129126129127129128129129129130129131129132129133129134129135129136129137129138129139129140129141129142129143129144129145129146129147129148129149129150129151129152129153129154129155129156129157129158129159129160129161129162129163129164129165129166129167129168129169129170129171129172129173129174129175129176129177129178129179129180129181129182129183129184129185129186129187129188129189129190129191129192129193129194129195129196129197129198129199129200129201129202129203129204129205129206129207129208129209129210129211129212129213129214129215129216129217129218129219129220129221129222129223129224129225129226129227129228129229129230129231129232129233129234129235129236129237129238129239129240129241129242129243129244129245129246129247129248129249129250129251129252129253129254129255129256129257129258129259129260129261129262129263129264129265129266129267129268129269129270129271129272129273129274129275129276129277129278129279129280129281129282129283129284129285129286129287129288129289129290129291129292129293129294129295129296129297129298129299129300129301129302129303129304129305129306129307129308129309129310129311129312129313129314129315129316129317129318129319129320129321129322129323129324129325129326129327129328129329129330129331129332129333129334129335129336129337129338129339129340129341129342129343129344129345129346129347129348129349129350129351129352129353129354129355129356129357129358129359129360129361129362129363129364129365129366129367129368129369129370129371129372129373129374129375129376129377129378129379129380129381129382129383129384129385129386129387129388129389129390129391129392129393129394129395129396129397129398129399129400129401129402129403129404129405129406129407129408129409129410129411129412129413129414129415129416129417129418129419129420129421129422129423129424129425129426129427129428129429129430129431129432129433129434129435129436129437129438129439129440129441129442129443129444129445129446129447129448129449129450129451129452129453129454129455129456129457129458129459129460129461129462129463129464129465129466129467129468129469129470129471129472129473129474129475129476129477129478129479129480129481129482129483129484129485129486129487129488129489129490129491129492129493129494129495129496129497129498129499129500129501129502129503129504129505129506129507129508129509129510129511129512129513129514129515129516129517129518129519129520129521129522129523129524129525129526129527129528129529129530129531129532129533129534129535129536129537129538129539129540129541129542129543129544129545129546129547129548129549129550129551129552129553129554129555129556129557129558129559129560129561129562129563129564129565129566129567129568129569129570129571129572129573129574129575129576129577129578129579129580129581129582129583129584129585129586129587129588129589129590129591129592129593129594129595129596129597129598129599129600129601129602129603129604129605129606129607129608129609129610129611129612129613129614129615129616129617129618129619129620129621129622129623129624129625129626129627129628129629129630129631129632129633129634129635129636129637129638129639129640129641129642129643129644129645129646129647129648129649129650129651129652129653129654129655129656129657129658129659129660129661129662129663129664129665129666129667129668129669129670129671129672129673129674129675129676129677129678129679129680129681129682129683129684129685129686129687129688129689129690129691129692129693129694129695129696129697129698129699129700129701129702129703129704129705129706129707129708129709129710129711129712129713129714129715129716129717129718129719129720129721129722129723129724129725129726129727129728129729129730129731129732129733129734129735129736129737129738129739129740129741129742129743129744129745129746129747129748129749129750129751129752129753129754129755129756129757129758129759129760129761129762129763129764129765129766129767129768129769129770129771129772129773129774129775129776129777129778129779129780129781129782129783129784129785129786129787129788129789129790129791129792129793129794129795129796129797129798129799129800129801129802129803129804129805129806129807129808129809129810129811129812129813129814129815129816129817129818129819129820129821129822129823129824129825129826129827129828129829129830129831129832129833129834129835129836129837129838129839129840129841129842129843129844129845129846129847129848129849129850129851129852129853129854129855129856129857129858129859129860129861129862129863129864129865129866129867129868129869129870129871129872129873129874129875129876129877129878129879129880129881129882129883129884129885129886129887129888129889129890129891129892129893129894129895129896129897129898129899129900129901129902129903129904129905129906129907129908129909129910129911129912129913129914129915129916129917129918129919129920129921129922129923129924129925129926129927129928129929129930129931129932129933129934129935129936129937129938129939129940129941129942129943129944129945129946129947129948129949129950129951129952129953129954129955129956129957129958129959129960129961129962129963129964129965129966129967129968129969129970129971129972129973129974129975129976129977129978129979129980129981129982129983129984129985129986129987129988129989129990129991129992129993129994129995129996129997129998129999130000130001130002130003130004130005130006130007130008130009130010130011130012130013130014130015130016130017130018130019130020130021130022130023130024130025130026130027130028130029130030130031130032130033130034130035130036130037130038130039130040130041130042130043130044130045130046130047130048130049130050130051130052130053130054130055130056130057130058130059130060130061130062130063130064130065130066130067130068130069130070130071130072130073130074130075130076130077130078130079130080130081130082130083130084130085130086130087130088130089130090130091130092130093130094130095130096130097130098130099130100130101130102130103130104130105130106130107130108130109130110130111130112130113130114130115130116130117130118130119130120130121130122130123130124130125130126130127130128130129130130130131130132130133130134130135130136130137130138130139130140130141130142130143130144130145130146130147130148130149130150130151130152130153130154130155130156130157130158130159130160130161130162130163130164130165130166130167130168130169130170130171130172130173130174130175130176130177130178130179130180130181130182130183130184130185130186130187130188130189130190130191130192130193130194130195130196130197130198130199130200130201130202130203130204130205130206130207130208130209130210130211130212130213130214130215130216130217130218130219130220130221130222130223130224130225130226130227130228130229130230130231130232130233130234130235130236130237130238130239130240130241130242130243130244130245130246130247130248130249130250130251130252130253130254130255130256130257130258130259130260130261130262130263130264130265130266130267130268130269130270130271130272130273130274130275130276130277130278130279130280130281130282130283130284130285130286130287130288130289130290130291130292130293130294130295130296130297130298130299130300130301130302130303130304130305130306130307130308130309130310130311130312130313130314130315130316130317130318130319130320130321130322130323130324130325130326130327130328130329130330130331130332130333130334130335130336130337130338130339130340130341130342130343130344130345130346130347130348130349130350130351130352130353130354130355130356130357130358130359130360130361130362130363130364130365130366130367130368130369130370130371130372130373130374130375130376130377130378130379130380130381130382130383130384130385130386130387130388130389130390130391130392130393130394130395130396130397130398130399130400130401130402130403130404130405130406130407130408130409130410130411130412130413130414130415130416130417130418130419130420130421130422130423130424130425130426130427130428130429130430130431130432130433130434130435130436130437130438130439130440130441130442130443130444130445130446130447130448130449130450130451130452130453130454130455130456130457130458130459130460130461130462130463130464130465130466130467130468130469130470130471130472130473130474130475130476130477130478130479130480130481130482130483130484130485130486130487130488130489130490130491130492130493130494130495130496130497130498130499130500130501130502130503130504130505130506130507130508130509130510130511130512130513130514130515130516130517130518130519130520130521130522130523130524130525130526130527130528130529130530130531130532130533130534130535130536130537130538130539130540130541130542130543130544130545130546130547130548130549130550130551130552130553130554130555130556130557130558130559130560130561130562130563130564130565130566130567130568130569130570130571130572130573130574130575130576130577130578130579130580130581130582130583130584130585130586130587130588130589130590130591130592130593130594130595130596130597130598130599130600130601130602130603130604130605130606130607130608130609130610130611130612130613130614130615130616130617130618130619130620130621130622130623130624130625130626130627130628130629130630130631130632130633130634130635130636130637130638130639130640130641130642130643130644130645130646130647130648130649130650130651130652130653130654130655130656130657130658130659130660130661130662130663130664130665130666130667130668130669130670130671130672130673130674130675130676130677130678130679130680130681130682130683130684130685130686130687130688130689130690130691130692130693130694130695130696130697130698130699130700130701130702130703130704130705130706130707130708130709130710130711130712130713130714130715130716130717130718130719130720130721130722130723130724130725130726130727130728130729130730130731130732130733130734130735130736130737130738130739130740130741130742130743130744130745130746130747130748130749130750130751130752130753130754130755130756130757130758130759130760130761130762130763130764130765130766130767130768130769130770130771130772130773130774130775130776130777130778130779130780130781130782130783130784130785130786130787130788130789130790130791130792130793130794130795130796130797130798130799130800130801130802130803130804130805130806130807130808130809130810130811130812130813130814130815130816130817130818130819130820130821130822130823130824130825130826130827130828130829130830130831130832130833130834130835130836130837130838130839130840130841130842130843130844130845130846130847130848130849130850130851130852130853130854130855130856130857130858130859130860130861130862130863130864130865130866130867130868130869130870130871130872130873130874130875130876130877130878130879130880130881130882130883130884130885130886130887130888130889130890130891130892130893130894130895130896130897130898130899130900130901130902130903130904130905130906130907130908130909130910130911130912130913130914130915130916130917130918130919130920130921130922130923130924130925130926130927130928130929130930130931130932130933130934130935130936130937130938130939130940130941130942130943130944130945130946130947130948130949130950130951130952130953130954130955130956130957130958130959130960130961130962130963130964130965130966130967130968130969130970130971130972130973130974130975130976130977130978130979130980130981130982130983130984130985130986130987130988130989130990130991130992130993130994130995130996130997130998130999131000131001131002131003131004131005131006131007131008131009131010131011131012131013131014131015131016131017131018131019131020131021131022131023131024131025131026131027131028131029131030131031131032131033131034131035131036131037131038131039131040131041131042131043131044131045131046131047131048131049131050131051131052131053131054131055131056131057131058131059131060131061131062131063131064131065131066131067131068131069131070131071131072131073131074131075131076131077131078131079131080131081131082131083131084131085131086131087131088131089131090131091131092131093131094131095131096131097131098131099131100131101131102131103131104131105131106131107131108131109131110131111131112131113131114131115131116131117131118131119131120131121131122131123131124131125131126131127131128131129131130131131131132131133131134131135131136131137131138131139131140131141131142131143131144131145131146131147131148131149131150131151131152131153131154131155131156131157131158131159131160131161131162131163131164131165131166131167131168131169131170131171131172131173131174131175131176131177131178131179131180131181131182131183131184131185131186131187131188131189131190131191131192131193131194131195131196131197131198131199131200131201131202131203131204131205131206131207131208131209131210131211131212131213131214131215131216131217131218131219131220131221131222131223131224131225131226131227131228131229131230131231131232131233131234131235131236131237131238131239131240131241131242131243131244131245131246131247131248131249131250131251131252131253131254131255131256131257131258131259131260131261131262131263131264131265131266131267131268131269131270131271131272131273131274131275131276131277131278131279131280131281131282131283131284131285131286131287131288131289131290131291131292131293131294131295131296131297131298131299131300131301131302131303131304131305131306131307131308131309131310131311131312131313131314131315131316131317131318131319131320131321131322131323131324131325131326131327131328131329131330131331131332131333131334131335131336131337131338131339131340131341131342131343131344131345131346131347131348131349131350131351131352131353131354131355131356131357131358131359131360131361131362131363131364131365131366131367131368131369131370131371131372131373131374131375131376131377131378131379131380131381131382131383131384131385131386131387131388131389131390131391131392131393131394131395131396131397131398131399131400131401131402131403131404131405131406131407131408131409131410131411131412131413131414131415131416131417131418131419131420131421131422131423131424131425131426131427131428131429131430131431131432131433131434131435131436131437131438131439131440131441131442131443131444131445131446131447131448131449131450131451131452131453131454131455131456131457131458131459131460131461131462131463131464131465131466131467131468131469131470131471131472131473131474131475131476131477131478131479131480131481131482131483131484131485131486131487131488131489131490131491131492131493131494131495131496131497131498131499131500131501131502131503131504131505131506131507131508131509131510131511131512131513131514131515131516131517131518131519131520131521131522131523131524131525131526131527131528131529131530131531131532131533131534131535131536131537131538131539131540131541131542131543131544131545131546131547131548131549131550131551131552131553131554131555131556131557131558131559131560131561131562131563131564131565131566131567131568131569131570131571131572131573131574131575131576131577131578131579131580131581131582131583131584131585131586131587131588131589131590131591131592131593131594131595131596131597131598131599131600131601131602131603131604131605131606131607131608131609131610131611131612131613131614131615131616131617131618131619131620131621131622131623131624131625131626131627131628131629131630131631131632131633131634131635131636131637131638131639131640131641131642131643131644131645131646131647131648131649131650131651131652131653131654131655131656131657131658131659131660131661131662131663131664131665131666131667131668131669131670131671131672131673131674131675131676131677131678131679131680131681131682131683131684131685131686131687131688131689131690131691131692131693131694131695131696131697131698131699131700131701131702131703131704131705131706131707131708131709131710131711131712131713131714131715131716131717131718131719131720131721131722131723131724131725131726131727131728131729131730131731131732131733131734131735131736131737131738131739131740131741131742131743131744131745131746131747131748131749131750131751131752131753131754131755131756131757131758131759131760131761131762131763131764131765131766131767131768131769131770131771131772131773131774131775131776131777131778131779131780131781131782131783131784131785131786131787131788131789131790131791131792131793131794131795131796131797131798131799131800131801131802131803131804131805131806131807131808131809131810131811131812131813131814131815131816131817131818131819131820131821131822131823131824131825131826131827131828131829131830131831131832131833131834131835131836131837131838131839131840131841131842131843131844131845131846131847131848131849131850131851131852131853131854131855131856131857131858131859131860131861131862131863131864131865131866131867131868131869131870131871131872131873131874131875131876131877131878131879131880131881131882131883131884131885131886131887131888131889131890131891131892131893131894131895131896131897131898131899131900131901131902131903131904131905131906131907131908131909131910131911131912131913131914131915131916131917131918131919131920131921131922131923131924131925131926131927131928131929131930131931131932131933131934131935131936131937131938131939131940131941131942131943131944131945131946131947131948131949131950131951131952131953131954131955131956131957131958131959131960131961131962131963131964131965131966131967131968131969131970131971131972131973131974131975131976131977131978131979131980131981131982131983131984131985131986131987131988131989131990131991131992131993131994131995131996131997131998131999132000132001132002132003132004132005132006132007132008132009132010132011132012132013132014132015132016132017132018132019132020132021132022132023132024132025132026132027132028132029132030132031132032132033132034132035132036132037132038132039132040132041132042132043132044132045132046132047132048132049132050132051132052132053132054132055132056132057132058132059132060132061132062132063132064132065132066132067132068132069132070132071132072132073132074132075132076132077132078132079132080132081132082132083132084132085132086132087132088132089132090132091132092132093132094132095132096132097132098132099132100132101132102132103132104132105132106132107132108132109132110132111132112132113132114132115132116132117132118132119132120132121132122132123132124132125132126132127132128132129132130132131132132132133132134132135132136132137132138132139132140132141132142132143132144132145132146132147132148132149132150132151132152132153132154132155132156132157132158132159132160132161132162132163132164132165132166132167132168132169132170132171132172132173132174132175132176132177132178132179132180132181132182132183132184132185132186132187132188132189132190132191132192132193132194132195132196132197132198132199132200132201132202132203132204132205132206132207132208132209132210132211132212132213132214132215132216132217132218132219132220132221132222132223132224132225132226132227132228132229132230132231132232132233132234132235132236132237132238132239132240132241132242132243132244132245132246132247132248132249132250132251132252132253132254132255132256132257132258132259132260132261132262132263132264132265132266132267132268132269132270132271132272132273132274132275132276132277132278132279132280132281132282132283132284132285132286132287132288132289132290132291132292132293132294132295132296132297132298132299132300132301132302132303132304132305132306132307132308132309132310132311132312132313132314132315132316132317132318132319132320132321132322132323132324132325132326132327132328132329132330132331132332132333132334132335132336132337132338132339132340132341132342132343132344132345132346132347132348132349132350132351132352132353132354132355132356132357132358132359132360132361132362132363132364132365132366132367132368132369132370132371132372132373132374132375132376132377132378132379132380132381132382132383132384132385132386132387132388132389132390132391132392132393132394132395132396132397132398132399132400132401132402132403132404132405132406132407132408132409132410132411132412132413132414132415132416132417132418132419132420132421132422132423132424132425132426132427132428132429132430132431132432132433132434132435132436132437132438132439132440132441132442132443132444132445132446132447132448132449132450132451132452132453132454132455132456132457132458132459132460132461132462132463132464132465132466132467132468132469132470132471132472132473132474132475132476132477132478132479132480132481132482132483132484132485132486132487132488132489132490132491132492132493132494132495132496132497132498132499132500132501132502132503132504132505132506132507132508132509132510132511132512132513132514132515132516132517132518132519132520132521132522132523132524132525132526132527132528132529132530132531132532132533132534132535132536132537132538132539132540132541132542132543132544132545132546132547132548132549132550132551132552132553132554132555132556132557132558132559132560132561132562132563132564132565132566132567132568132569132570132571132572132573132574132575132576132577132578132579132580132581132582132583132584132585132586132587132588132589132590132591132592132593132594132595132596132597132598132599132600132601132602132603132604132605132606132607132608132609132610132611132612132613132614132615132616132617132618132619132620132621132622132623132624132625132626132627132628132629132630132631132632132633132634132635132636132637132638132639132640132641132642132643132644132645132646132647132648132649132650132651132652132653132654132655132656132657132658132659132660132661132662132663132664132665132666132667132668132669132670132671132672132673132674132675132676132677132678132679132680132681132682132683132684132685132686132687132688132689132690132691132692132693132694132695132696132697132698132699132700132701132702132703132704132705132706132707132708132709132710132711132712132713132714132715132716132717132718132719132720132721132722132723132724132725132726132727132728132729132730132731132732132733132734132735132736132737132738132739132740132741132742132743132744132745132746132747132748132749132750132751132752132753132754132755132756132757132758132759132760132761132762132763132764132765132766132767132768132769132770132771132772132773132774132775132776132777132778132779132780132781132782132783132784132785132786132787132788132789132790132791132792132793132794132795132796132797132798132799132800132801132802132803132804132805132806132807132808132809132810132811132812132813132814132815132816132817132818132819132820132821132822132823132824132825132826132827132828132829132830132831132832132833132834132835132836132837132838132839132840132841132842132843132844132845132846132847132848132849132850132851132852132853132854132855132856132857132858132859132860132861132862132863132864132865132866132867132868132869132870132871132872132873132874132875132876132877132878132879132880132881132882132883132884132885132886132887132888132889132890132891132892132893132894132895132896132897132898132899132900132901132902132903132904132905132906132907132908132909132910132911132912132913132914132915132916132917132918132919132920132921132922132923132924132925132926132927132928132929132930132931132932132933132934132935132936132937132938132939132940132941132942132943132944132945132946132947132948132949132950132951132952132953132954132955132956132957132958132959132960132961132962132963132964132965132966132967132968132969132970132971132972132973132974132975132976132977132978132979132980132981132982132983132984132985132986132987132988132989132990132991132992132993132994132995132996132997132998132999133000133001133002133003133004133005133006133007133008133009133010133011133012133013133014133015133016133017133018133019133020133021133022133023133024133025133026133027133028133029133030133031133032133033133034133035133036133037133038133039133040133041133042133043133044133045133046133047133048133049133050133051133052133053133054133055133056133057133058133059133060133061133062133063133064133065133066133067133068133069133070133071133072133073133074133075133076133077133078133079133080133081133082133083133084133085133086133087133088133089133090133091133092133093133094133095133096133097133098133099133100133101133102133103133104133105133106133107133108133109133110133111133112133113133114133115133116133117133118133119133120133121133122133123133124133125133126133127133128133129133130133131133132133133133134133135133136133137133138133139133140133141133142133143133144133145133146133147133148133149133150133151133152133153133154133155133156133157133158133159133160133161133162133163133164133165133166133167133168133169133170133171133172133173133174133175133176133177133178133179133180133181133182133183133184133185133186133187133188133189133190133191133192133193133194133195133196133197133198133199133200133201133202133203133204133205133206133207133208133209133210133211133212133213133214133215133216133217133218133219133220133221133222133223133224133225133226133227133228133229133230133231133232133233133234133235133236133237133238133239133240133241133242133243133244133245133246133247133248133249133250133251133252133253133254133255133256133257133258133259133260133261133262133263133264133265133266133267133268133269133270133271133272133273133274133275133276133277133278133279133280133281133282133283133284133285133286133287133288133289133290133291133292133293133294133295133296133297133298133299133300133301133302133303133304133305133306133307133308133309133310133311133312133313133314133315133316133317133318133319133320133321133322133323133324133325133326133327133328133329133330133331133332133333133334133335133336133337133338133339133340133341133342133343133344133345133346133347133348133349133350133351133352133353133354133355133356133357133358133359133360133361133362133363133364133365133366133367133368133369133370133371133372133373133374133375133376133377133378133379133380133381133382133383133384133385133386133387133388133389133390133391133392133393133394133395133396133397133398133399133400133401133402133403133404133405133406133407133408133409133410133411133412133413133414133415133416133417133418133419133420133421133422133423133424133425133426133427133428133429133430133431133432133433133434133435133436133437133438133439133440133441133442133443133444133445133446133447133448133449133450133451133452133453133454133455133456133457133458133459133460133461133462133463133464133465133466133467133468133469133470133471133472133473133474133475133476133477133478133479133480133481133482133483133484133485133486133487133488133489133490133491133492133493133494133495133496133497133498133499133500133501133502133503133504133505133506133507133508133509133510133511133512133513133514133515133516133517133518133519133520133521133522133523133524133525133526133527133528133529133530133531133532133533133534133535133536133537133538133539133540133541133542133543133544133545133546133547133548133549133550133551133552133553133554133555133556133557133558133559133560133561133562133563133564133565133566133567133568133569133570133571133572133573133574133575133576133577133578133579133580133581133582133583133584133585133586133587133588133589133590133591133592133593133594133595133596133597133598133599133600133601133602133603133604133605133606133607133608133609133610133611133612133613133614133615133616133617133618133619133620133621133622133623133624133625133626133627133628133629133630133631133632133633133634133635133636133637133638133639133640133641133642133643133644133645133646133647133648133649133650133651133652133653133654133655133656133657133658133659133660133661133662133663133664133665133666133667133668133669133670133671133672133673133674133675133676133677133678133679133680133681133682133683133684133685133686133687133688133689133690133691133692133693133694133695133696133697133698133699133700133701133702133703133704133705133706133707133708133709133710133711133712133713133714133715133716133717133718133719133720133721133722133723133724133725133726133727133728133729133730133731133732133733133734133735133736133737133738133739133740133741133742133743133744133745133746133747133748133749133750133751133752133753133754133755133756133757133758133759133760133761133762133763133764133765133766133767133768133769133770133771133772133773133774133775133776133777133778133779133780133781133782133783133784133785133786133787133788133789133790133791133792133793133794133795133796133797133798133799133800133801133802133803133804133805133806133807133808133809133810133811133812133813133814133815133816133817133818133819133820133821133822133823133824133825133826133827133828133829133830133831133832133833133834133835133836133837133838133839133840133841133842133843133844133845133846133847133848133849133850133851133852133853133854133855133856133857133858133859133860133861133862133863133864133865133866133867133868133869133870133871133872133873133874133875133876133877133878133879133880133881133882133883133884133885133886133887133888133889133890133891133892133893133894133895133896133897133898133899133900133901133902133903133904133905133906133907133908133909133910133911133912133913133914133915133916133917133918133919133920133921133922133923133924133925133926133927133928133929133930133931133932133933133934133935133936133937133938133939133940133941133942133943133944133945133946133947133948133949133950133951133952133953133954133955133956133957133958133959133960133961133962133963133964133965133966133967133968133969133970133971133972133973133974133975133976133977133978133979133980133981133982133983133984133985133986133987133988133989133990133991133992133993133994133995133996133997133998133999134000134001134002134003134004134005134006134007134008134009134010134011134012134013134014134015134016134017134018134019134020134021134022134023134024134025134026134027134028134029134030134031134032134033134034134035134036134037134038134039134040134041134042134043134044134045134046134047134048134049134050134051134052134053134054134055134056134057134058134059134060134061134062134063134064134065134066134067134068134069134070134071134072134073134074134075134076134077134078134079134080134081134082134083134084134085134086134087134088134089134090134091134092134093134094134095134096134097134098134099134100134101134102134103134104134105134106134107134108134109134110134111134112134113134114134115134116134117134118134119134120134121134122134123134124134125134126134127134128134129134130134131134132134133134134134135134136134137134138134139134140134141134142134143134144134145134146134147134148134149134150134151134152134153134154134155134156134157134158134159134160134161134162134163134164134165134166134167134168134169134170134171134172134173134174134175134176134177134178134179134180134181134182134183134184134185134186134187134188134189134190134191134192134193134194134195134196134197134198134199134200134201134202134203134204134205134206134207134208134209134210134211134212134213134214134215134216134217134218134219134220134221134222134223134224134225134226134227134228134229134230134231134232134233134234134235134236134237134238134239134240134241134242134243134244134245134246134247134248134249134250134251134252134253134254134255134256134257134258134259134260134261134262134263134264134265134266134267134268134269134270134271134272134273134274134275134276134277134278134279134280134281134282134283134284134285134286134287134288134289134290134291134292134293134294134295134296134297134298134299134300134301134302134303134304134305134306134307134308134309134310134311134312134313134314134315134316134317134318134319134320134321134322134323134324134325134326134327134328134329134330134331134332134333134334134335134336134337134338134339134340134341134342134343134344134345134346134347134348134349134350134351134352134353134354134355134356134357134358134359134360134361134362134363134364134365134366134367134368134369134370134371134372134373134374134375134376134377134378134379134380134381134382134383134384134385134386134387134388134389134390134391134392134393134394134395134396134397134398134399134400134401134402134403134404134405134406134407134408134409134410134411134412134413134414134415134416134417134418134419134420134421134422134423134424134425134426134427134428134429134430134431134432134433134434134435134436134437134438134439134440134441134442134443134444134445134446134447134448134449134450134451134452134453134454134455134456134457134458134459134460134461134462134463134464134465134466134467134468134469134470134471134472134473134474134475134476134477134478134479134480134481134482134483134484134485134486134487134488134489134490134491134492134493134494134495134496134497134498134499134500134501134502134503134504134505134506134507134508134509134510134511134512134513134514134515134516134517134518134519134520134521134522134523134524134525134526134527134528134529134530134531134532134533134534134535134536134537134538134539134540134541134542134543134544134545134546134547134548134549134550134551134552134553134554134555134556134557134558134559134560134561134562134563134564134565134566134567134568134569134570134571134572134573134574134575134576134577134578134579134580134581134582134583134584134585134586134587134588134589134590134591134592134593134594134595134596134597134598134599134600134601134602134603134604134605134606134607134608134609134610134611134612134613134614134615134616134617134618134619134620134621134622134623134624134625134626134627134628134629134630134631134632134633134634134635134636134637134638134639134640134641134642134643134644134645134646134647134648134649134650134651134652134653134654134655134656134657134658134659134660134661134662134663134664134665134666134667134668134669134670134671134672134673134674134675134676134677134678134679134680134681134682134683134684134685134686134687134688134689134690134691134692134693134694134695134696134697134698134699134700134701134702134703134704134705134706134707134708134709134710134711134712134713134714134715134716134717134718134719134720134721134722134723134724134725134726134727134728134729134730134731134732134733134734134735134736134737134738134739134740134741134742134743134744134745134746134747134748134749134750134751134752134753134754134755134756134757134758134759134760134761134762134763134764134765134766134767134768134769134770134771134772134773134774134775134776134777134778134779134780134781134782134783134784134785134786134787134788134789134790134791134792134793134794134795134796134797134798134799134800134801134802134803134804134805134806134807134808134809134810134811134812134813134814134815134816134817134818134819134820134821134822134823134824134825134826134827134828134829134830134831134832134833134834134835134836134837134838134839134840134841134842134843134844134845134846134847134848134849134850134851134852134853134854134855134856134857134858134859134860134861134862134863134864134865134866134867134868134869134870134871134872134873134874134875134876134877134878134879134880134881134882134883134884134885134886134887134888134889134890134891134892134893134894134895134896134897134898134899134900134901134902134903134904134905134906134907134908134909134910134911134912134913134914134915134916134917134918134919134920134921134922134923134924134925134926134927134928134929134930134931134932134933134934134935134936134937134938134939134940134941134942134943134944134945134946134947134948134949134950134951134952134953134954134955134956134957134958134959134960134961134962134963134964134965134966134967134968134969134970134971134972134973134974134975134976134977134978134979134980134981134982134983134984134985134986134987134988134989134990134991134992134993134994134995134996134997134998134999135000135001135002135003135004135005135006135007135008135009135010135011135012135013135014135015135016135017135018135019135020135021135022135023135024135025135026135027135028135029135030135031135032135033135034135035135036135037135038135039135040135041135042135043135044135045135046135047135048135049135050135051135052135053135054135055135056135057135058135059135060135061135062135063135064135065135066135067135068135069135070135071135072135073135074135075135076135077135078135079135080135081135082135083135084135085135086135087135088135089135090135091135092135093135094135095135096135097135098135099135100135101135102135103135104135105135106135107135108135109135110135111135112135113135114135115135116135117135118135119135120135121135122135123135124135125135126135127135128135129135130135131135132135133135134135135135136135137135138135139135140135141135142135143135144135145135146135147135148135149135150135151135152135153135154135155135156135157135158135159135160135161135162135163135164135165135166135167135168135169135170135171135172135173135174135175135176135177135178135179135180135181135182135183135184135185135186135187135188135189135190135191135192135193135194135195135196135197135198135199135200135201135202135203135204135205135206135207135208135209135210135211135212135213135214135215135216135217135218135219135220135221135222135223135224135225135226135227135228135229135230135231135232135233135234135235135236135237135238135239135240135241135242135243135244135245135246135247135248135249135250135251135252135253135254135255135256135257135258135259135260135261135262135263135264135265135266135267135268135269135270135271135272135273135274135275135276135277135278135279135280135281135282135283135284135285135286135287135288135289135290135291135292135293135294135295135296135297135298135299135300135301135302135303135304135305135306135307135308135309135310135311135312135313135314135315135316135317135318135319135320135321135322135323135324135325135326135327135328135329135330135331135332135333135334135335135336135337135338135339135340135341135342135343135344135345135346135347135348135349135350135351135352135353135354135355135356135357135358135359135360135361135362135363135364135365135366135367135368135369135370135371135372135373135374135375135376135377135378135379135380135381135382135383135384135385135386135387135388135389135390135391135392135393135394135395135396135397135398135399135400135401135402135403135404135405135406135407135408135409135410135411135412135413135414135415135416135417135418135419135420135421135422135423135424135425135426135427135428135429135430135431135432135433135434135435135436135437135438135439135440135441135442135443135444135445135446135447135448135449135450135451135452135453135454135455135456135457135458135459135460135461135462135463135464135465135466135467135468135469135470135471135472135473135474135475135476135477135478135479135480135481135482135483135484135485135486135487135488135489135490135491135492135493135494135495135496135497135498135499135500135501135502135503135504135505135506135507135508135509135510135511135512135513135514135515135516135517135518135519135520135521135522135523135524135525135526135527135528135529135530135531135532135533135534135535135536135537135538135539135540135541135542135543135544135545135546135547135548135549135550135551135552135553135554135555135556135557135558135559135560135561135562135563135564135565135566135567135568135569135570135571135572135573135574135575135576135577135578135579135580135581135582135583135584135585135586135587135588135589135590135591135592135593135594135595135596135597135598135599135600135601135602135603135604135605135606135607135608135609135610135611135612135613135614135615135616135617135618135619135620135621135622135623135624135625135626135627135628135629135630135631135632135633135634135635135636135637135638135639135640135641135642135643135644135645135646135647135648135649135650135651135652135653135654135655135656135657135658135659135660135661135662135663135664135665135666135667135668135669135670135671135672135673135674135675135676135677135678135679135680135681135682135683135684135685135686135687135688135689135690135691135692135693135694135695135696135697135698135699135700135701135702135703135704135705135706135707135708135709135710135711135712135713135714135715135716135717135718135719135720135721135722135723135724135725135726135727135728135729135730135731135732135733135734135735135736135737135738135739135740135741135742135743135744135745135746135747135748135749135750135751135752135753135754135755135756135757135758135759135760135761135762135763135764135765135766135767135768135769135770135771135772135773135774135775135776135777135778135779135780135781135782135783135784135785135786135787135788135789135790135791135792135793135794135795135796135797135798135799135800135801135802135803135804135805135806135807135808135809135810135811135812135813135814135815135816135817135818135819135820135821135822135823135824135825135826135827135828135829135830135831135832135833135834135835135836135837135838135839135840135841135842135843135844135845135846135847135848135849135850135851135852135853135854135855135856135857135858135859135860135861135862135863135864135865135866135867135868135869135870135871135872135873135874135875135876135877135878135879135880135881135882135883135884135885135886135887135888135889135890135891135892135893135894135895135896135897135898135899135900135901135902135903135904135905135906135907135908135909135910135911135912135913135914135915135916135917135918135919135920135921135922135923135924135925135926135927135928135929135930135931135932135933135934135935135936135937135938135939135940135941135942135943135944135945135946135947135948135949135950135951135952135953135954135955135956135957135958135959135960135961135962135963135964135965135966135967135968135969135970135971135972135973135974135975135976135977135978135979135980135981135982135983135984135985135986135987135988135989135990135991135992135993135994135995135996135997135998135999136000136001136002136003136004136005136006136007136008136009136010136011136012136013136014136015136016136017136018136019136020136021136022136023136024136025136026136027136028136029136030136031136032136033136034136035136036136037136038136039136040136041136042136043136044136045136046136047136048136049136050136051136052136053136054136055136056136057136058136059136060136061136062136063136064136065136066136067136068136069136070136071136072136073136074136075136076136077136078136079136080136081136082136083136084136085136086136087136088136089136090136091136092136093136094136095136096136097136098136099136100136101136102136103136104136105136106136107136108136109136110136111136112136113136114136115136116136117136118136119136120136121136122136123136124136125136126136127136128136129136130136131136132136133136134136135136136136137136138136139136140136141136142136143136144136145136146136147136148136149136150136151136152136153136154136155136156136157136158136159136160136161136162136163136164136165136166136167136168136169136170136171136172136173136174136175136176136177136178136179136180136181136182136183136184136185136186136187136188136189136190136191136192136193136194136195136196136197136198136199136200136201136202136203136204136205136206136207136208136209136210136211136212136213136214136215136216136217136218136219136220136221136222136223136224136225136226136227136228136229136230136231136232136233136234136235136236136237136238136239136240136241136242136243136244136245136246136247136248136249136250136251136252136253136254136255136256136257136258136259136260136261136262136263136264136265136266136267136268136269136270136271136272136273136274136275136276136277136278136279136280136281136282136283136284136285136286136287136288136289136290136291136292136293136294136295136296136297136298136299136300136301136302136303136304136305136306136307136308136309136310136311136312136313136314136315136316136317136318136319136320136321136322136323136324136325136326136327136328136329136330136331136332136333136334136335136336136337136338136339136340136341136342136343136344136345136346136347136348136349136350136351136352136353136354136355136356136357136358136359136360136361136362136363136364136365136366136367136368136369136370136371136372136373136374136375136376136377136378136379136380136381136382136383136384136385136386136387136388136389136390136391136392136393136394136395136396136397136398136399136400136401136402136403136404136405136406136407136408136409136410136411136412136413136414136415136416136417136418136419136420136421136422136423136424136425136426136427136428136429136430136431136432136433136434136435136436136437136438136439136440136441136442136443136444136445136446136447136448136449136450136451136452136453136454136455136456136457136458136459136460136461136462136463136464136465136466136467136468136469136470136471136472136473136474136475136476136477136478136479136480136481136482136483136484136485136486136487136488136489136490136491136492136493136494136495136496136497136498136499136500136501136502136503136504136505136506136507136508136509136510136511136512136513136514136515136516136517136518136519136520136521136522136523136524136525136526136527136528136529136530136531136532136533136534136535136536136537136538136539136540136541136542136543136544136545136546136547136548136549136550136551136552136553136554136555136556136557136558136559136560136561136562136563136564136565136566136567136568136569136570136571136572136573136574136575136576136577136578136579136580136581136582136583136584136585136586136587136588136589136590136591136592136593136594136595136596136597136598136599136600136601136602136603136604136605136606136607136608136609136610136611136612136613136614136615136616136617136618136619136620136621136622136623136624136625136626136627136628136629136630136631136632136633136634136635136636136637136638136639136640136641136642136643136644136645136646136647136648136649136650136651136652136653136654136655136656136657136658136659136660136661136662136663136664136665136666136667136668136669136670136671136672136673136674136675136676136677136678136679136680136681136682136683136684136685136686136687136688136689136690136691136692136693136694136695136696136697136698136699136700136701136702136703136704136705136706136707136708136709136710136711136712136713136714136715136716136717136718136719136720136721136722136723136724136725136726136727136728136729136730136731136732136733136734136735136736136737136738136739136740136741136742136743136744136745136746136747136748136749136750136751136752136753136754136755136756136757136758136759136760136761136762136763136764136765136766136767136768136769136770136771136772136773136774136775136776136777136778136779136780136781136782136783136784136785136786136787136788136789136790136791136792136793136794136795136796136797136798136799136800136801136802136803136804136805136806136807136808136809136810136811136812136813136814136815136816136817136818136819136820136821136822136823136824136825136826136827136828136829136830136831136832136833136834136835136836136837136838136839136840136841136842136843136844136845136846136847136848136849136850136851136852136853136854136855136856136857136858136859136860136861136862136863136864136865136866136867136868136869136870136871136872136873136874136875136876136877136878136879136880136881136882136883136884136885136886136887136888136889136890136891136892136893136894136895136896136897136898136899136900136901136902136903136904136905136906136907136908136909136910136911136912136913136914136915136916136917136918136919136920136921136922136923136924136925136926136927136928136929136930136931136932136933136934136935136936136937136938136939136940136941136942136943136944136945136946136947136948136949136950136951136952136953136954136955136956136957136958136959136960136961136962136963136964136965136966136967136968136969136970136971136972136973136974136975136976136977136978136979136980136981136982136983136984136985136986136987136988136989136990136991136992136993136994136995136996136997136998136999137000137001137002137003137004137005137006137007137008137009137010137011137012137013137014137015137016137017137018137019137020137021137022137023137024137025137026137027137028137029137030137031137032137033137034137035137036137037137038137039137040137041137042137043137044137045137046137047137048137049137050137051137052137053137054137055137056137057137058137059137060137061137062137063137064137065137066137067137068137069137070137071137072137073137074137075137076137077137078137079137080137081137082137083137084137085137086137087137088137089137090137091137092137093137094137095137096137097137098137099137100137101137102137103137104137105137106137107137108137109137110137111137112137113137114137115137116137117137118137119137120137121137122137123137124137125137126137127137128137129137130137131137132137133137134137135137136137137137138137139137140137141137142137143137144137145137146137147137148137149137150137151137152137153137154137155137156137157137158137159137160137161137162137163137164137165137166137167137168137169137170137171137172137173137174137175137176137177137178137179137180137181137182137183137184137185137186137187137188137189137190137191137192137193137194137195137196137197137198137199137200137201137202137203137204137205137206137207137208137209137210137211137212137213137214137215137216137217137218137219137220137221137222137223137224137225137226137227137228137229137230137231137232137233137234137235137236137237137238137239137240137241137242137243137244137245137246137247137248137249137250137251137252137253137254137255137256137257137258137259137260137261137262137263137264137265137266137267137268137269137270137271137272137273137274137275137276137277137278137279137280137281137282137283137284137285137286137287137288137289137290137291137292137293137294137295137296137297137298137299137300137301137302137303137304137305137306137307137308137309137310137311137312137313137314137315137316137317137318137319137320137321137322137323137324137325137326137327137328137329137330137331137332137333137334137335137336137337137338137339137340137341137342137343137344137345137346137347137348137349137350137351137352137353137354137355137356137357137358137359137360137361137362137363137364137365137366137367137368137369137370137371137372137373137374137375137376137377137378137379137380137381137382137383137384137385137386137387137388137389137390137391137392137393137394137395137396137397137398137399137400137401137402137403137404137405137406137407137408137409137410137411137412137413137414137415137416137417137418137419137420137421137422137423137424137425137426137427137428137429137430137431137432137433137434137435137436137437137438137439137440137441137442137443137444137445137446137447137448137449137450137451137452137453137454137455137456137457137458137459137460137461137462137463137464137465137466137467137468137469137470137471137472137473137474137475137476137477137478137479137480137481137482137483137484137485137486137487137488137489137490137491137492137493137494137495137496137497137498137499137500137501137502137503137504137505137506137507137508137509137510137511137512137513137514137515137516137517137518137519137520137521137522137523137524137525137526137527137528137529137530137531137532137533137534137535137536137537137538137539137540137541137542137543137544137545137546137547137548137549137550137551137552137553137554137555137556137557137558137559137560137561137562137563137564137565137566137567137568137569137570137571137572137573137574137575137576137577137578137579137580137581137582137583137584137585137586137587137588137589137590137591137592137593137594137595137596137597137598137599137600137601137602137603137604137605137606137607137608137609137610137611137612137613137614137615137616137617137618137619137620137621137622137623137624137625137626137627137628137629137630137631137632137633137634137635137636137637137638137639137640137641137642137643137644137645137646137647137648137649137650137651137652137653137654137655137656137657137658137659137660137661137662137663137664137665137666137667137668137669137670137671137672137673137674137675137676137677137678137679137680137681137682137683137684137685137686137687137688137689137690137691137692137693137694137695137696137697137698137699137700137701137702137703137704137705137706137707137708137709137710137711137712137713137714137715137716137717137718137719137720137721137722137723137724137725137726137727137728137729137730137731137732137733137734137735137736137737137738137739137740137741137742137743137744137745137746137747137748137749137750137751137752137753137754137755137756137757137758137759137760137761137762137763137764137765137766137767137768137769137770137771137772137773137774137775137776137777137778137779137780137781137782137783137784137785137786137787137788137789137790137791137792137793137794137795137796137797137798137799137800137801137802137803137804137805137806137807137808137809137810137811137812137813137814137815137816137817137818137819137820137821137822137823137824137825137826137827137828137829137830137831137832137833137834137835137836137837137838137839137840137841137842137843137844137845137846137847137848137849137850137851137852137853137854137855137856137857137858137859137860137861137862137863137864137865137866137867137868137869137870137871137872137873137874137875137876137877137878137879137880137881137882137883137884137885137886137887137888137889137890137891137892137893137894137895137896137897137898137899137900137901137902137903137904137905137906137907137908137909137910137911137912137913137914137915137916137917137918137919137920137921137922137923137924137925137926137927137928137929137930137931137932137933137934137935137936137937137938137939137940137941137942137943137944137945137946137947137948137949137950137951137952137953137954137955137956137957137958137959137960137961137962137963137964137965137966137967137968137969137970137971137972137973137974137975137976137977137978137979137980137981137982137983137984137985137986137987137988137989137990137991137992137993137994137995137996137997137998137999138000138001138002138003138004138005138006138007138008138009138010138011138012138013138014138015138016138017138018138019138020138021138022138023138024138025138026138027138028138029138030138031138032138033138034138035138036138037138038138039138040138041138042138043138044138045138046138047138048138049138050138051138052138053138054138055138056138057138058138059138060138061138062138063138064138065138066138067138068138069138070138071138072138073138074138075138076138077138078138079138080138081138082138083138084138085138086138087138088138089138090138091138092138093138094138095138096138097138098138099138100138101138102138103138104138105138106138107138108138109138110138111138112138113138114138115138116138117138118138119138120138121138122138123138124138125138126138127138128138129138130138131138132138133138134138135138136138137138138138139138140138141138142138143138144138145138146138147138148138149138150138151138152138153138154138155138156138157138158138159138160138161138162138163138164138165138166138167138168138169138170138171138172138173138174138175138176138177138178138179138180138181138182138183138184138185138186138187138188138189138190138191138192138193138194138195138196138197138198138199138200138201138202138203138204138205138206138207138208138209138210138211138212138213138214138215138216138217138218138219138220138221138222138223138224138225138226138227138228138229138230138231138232138233138234138235138236138237138238138239138240138241138242138243138244138245138246138247138248138249138250138251138252138253138254138255138256138257138258138259138260138261138262138263138264138265138266138267138268138269138270138271138272138273138274138275138276138277138278138279138280138281138282138283138284138285138286138287138288138289138290138291138292138293138294138295138296138297138298138299138300138301138302138303138304138305138306138307138308138309138310138311138312138313138314138315138316138317138318138319138320138321138322138323138324138325138326138327138328138329138330138331138332138333138334138335138336138337138338138339138340138341138342138343138344138345138346138347138348138349138350138351138352138353138354138355138356138357138358138359138360138361138362138363138364138365138366138367138368138369138370138371138372138373138374138375138376138377138378138379138380138381138382138383138384138385138386138387138388138389138390138391138392138393138394138395138396138397138398138399138400138401138402138403138404138405138406138407138408138409138410138411138412138413138414138415138416138417138418138419138420138421138422138423138424138425138426138427138428138429138430138431138432138433138434138435138436138437138438138439138440138441138442138443138444138445138446138447138448138449138450138451138452138453138454138455138456138457138458138459138460138461138462138463138464138465138466138467138468138469138470138471138472138473138474138475138476138477138478138479138480138481138482138483138484138485138486138487138488138489138490138491138492138493138494138495138496138497138498138499138500138501138502138503138504138505138506138507138508138509138510138511138512138513138514138515138516138517138518138519138520138521138522138523138524138525138526138527138528138529138530138531138532138533138534138535138536138537138538138539138540138541138542138543138544138545138546138547138548138549138550138551138552138553138554138555138556138557138558138559138560138561138562138563138564138565138566138567138568138569138570138571138572138573138574138575138576138577138578138579138580138581138582138583138584138585138586138587138588138589138590138591138592138593138594138595138596138597138598138599138600138601138602138603138604138605138606138607138608138609138610138611138612138613138614138615138616138617138618138619138620138621138622138623138624138625138626138627138628138629138630138631138632138633138634138635138636138637138638138639138640138641138642138643138644138645138646138647138648138649138650138651138652138653138654138655138656138657138658138659138660138661138662138663138664138665138666138667138668138669138670138671138672138673138674138675138676138677138678138679138680138681138682138683138684138685138686138687138688138689138690138691138692138693138694138695138696138697138698138699138700138701138702138703138704138705138706138707138708138709138710138711138712138713138714138715138716138717138718138719138720138721138722138723138724138725138726138727138728138729138730138731138732138733138734138735138736138737138738138739138740138741138742138743138744138745138746138747138748138749138750138751138752138753138754138755138756138757138758138759138760138761138762138763138764138765138766138767138768138769138770138771138772138773138774138775138776138777138778138779138780138781138782138783138784138785138786138787138788138789138790138791138792138793138794138795138796138797138798138799138800138801138802138803138804138805138806138807138808138809138810138811138812138813138814138815138816138817138818138819138820138821138822138823138824138825138826138827138828138829138830138831138832138833138834138835138836138837138838138839138840138841138842138843138844138845138846138847138848138849138850138851138852138853138854138855138856138857138858138859138860138861138862138863138864138865138866138867138868138869138870138871138872138873138874138875138876138877138878138879138880138881138882138883138884138885138886138887138888138889138890138891138892138893138894138895138896138897138898138899138900138901138902138903138904138905138906138907138908138909138910138911138912138913138914138915138916138917138918138919138920138921138922138923138924138925138926138927138928138929138930138931138932138933138934138935138936138937138938138939138940138941138942138943138944138945138946138947138948138949138950138951138952138953138954138955138956138957138958138959138960138961138962138963138964138965138966138967138968138969138970138971138972138973138974138975138976138977138978138979138980138981138982138983138984138985138986138987138988138989138990138991138992138993138994138995138996138997138998138999139000139001139002139003139004139005139006139007139008139009139010139011139012139013139014139015139016139017139018139019139020139021139022139023139024139025139026139027139028139029139030139031139032139033139034139035139036139037139038139039139040139041139042139043139044139045139046139047139048139049139050139051139052139053139054139055139056139057139058139059139060139061139062139063139064139065139066139067139068139069139070139071139072139073139074139075139076139077139078139079139080139081139082139083139084139085139086139087139088139089139090139091139092139093139094139095139096139097139098139099139100139101139102139103139104139105139106139107139108139109139110139111139112139113139114139115139116139117139118139119139120139121139122139123139124139125139126139127139128139129139130139131139132139133139134139135139136139137139138139139139140139141139142139143139144139145139146139147139148139149139150139151139152139153139154139155139156139157139158139159139160139161139162139163139164139165139166139167139168139169139170139171139172139173139174139175139176139177139178139179139180139181139182139183139184139185139186139187139188139189139190139191139192139193139194139195139196139197139198139199139200139201139202139203139204139205139206139207139208139209139210139211139212139213139214139215139216139217139218139219139220139221139222139223139224139225139226139227139228139229139230139231139232139233139234139235139236139237139238139239139240139241139242139243139244139245139246139247139248139249139250139251139252139253139254139255139256139257139258139259139260139261139262139263139264139265139266139267139268139269139270139271139272139273139274139275139276139277139278139279139280139281139282139283139284139285139286139287139288139289139290139291139292139293139294139295139296139297139298139299139300139301139302139303139304139305139306139307139308139309139310139311139312139313139314139315139316139317139318139319139320139321139322139323139324139325139326139327139328139329139330139331139332139333139334139335139336139337139338139339139340139341139342139343139344139345139346139347139348139349139350139351139352139353139354139355139356139357139358139359139360139361139362139363139364139365139366139367139368139369139370139371139372139373139374139375139376139377139378139379139380139381139382139383139384139385139386139387139388139389139390139391139392139393139394139395139396139397139398139399139400139401139402139403139404139405139406139407139408139409139410139411139412139413139414139415139416139417139418139419139420139421139422139423139424139425139426139427139428139429139430139431139432139433139434139435139436139437139438139439139440139441139442139443139444139445139446139447139448139449139450139451139452139453139454139455139456139457139458139459139460139461139462139463139464139465139466139467139468139469139470139471139472139473139474139475139476139477139478139479139480139481139482139483139484139485139486139487139488139489139490139491139492139493139494139495139496139497139498139499139500139501139502139503139504139505139506139507139508139509139510139511139512139513139514139515139516139517139518139519139520139521139522139523139524139525139526139527139528139529139530139531139532139533139534139535139536139537139538139539139540139541139542139543139544139545139546139547139548139549139550139551139552139553139554139555139556139557139558139559139560139561139562139563139564139565139566139567139568139569139570139571139572139573139574139575139576139577139578139579139580139581139582139583139584139585139586139587139588139589139590139591139592139593139594139595139596139597139598139599139600139601139602139603139604139605139606139607139608139609139610139611139612139613139614139615139616139617139618139619139620139621139622139623139624139625139626139627139628139629139630139631139632139633139634139635139636139637139638139639139640139641139642139643139644139645139646139647139648139649139650139651139652139653139654139655139656139657139658139659139660139661139662139663139664139665139666139667139668139669139670139671139672139673139674139675139676139677139678139679139680139681139682139683139684139685139686139687139688139689139690139691139692139693139694139695139696139697139698139699139700139701139702139703139704139705139706139707139708139709139710139711139712139713139714139715139716139717139718139719139720139721139722139723139724139725139726139727139728139729139730139731139732139733139734139735139736139737139738139739139740139741139742139743139744139745139746139747139748139749139750139751139752139753139754139755139756139757139758139759139760139761139762139763139764139765139766139767139768139769139770139771139772139773139774139775139776139777139778139779139780139781139782139783139784139785139786139787139788139789139790139791139792139793139794139795139796139797139798139799139800139801139802139803139804139805139806139807139808139809139810139811139812139813139814139815139816139817139818139819139820139821139822139823139824139825139826139827139828139829139830139831139832139833139834139835139836139837139838139839139840139841139842139843139844139845139846139847139848139849139850139851139852139853139854139855139856139857139858139859139860139861139862139863139864139865139866139867139868139869139870139871139872139873139874139875139876139877139878139879139880139881139882139883139884139885139886139887139888139889139890139891139892139893139894139895139896139897139898139899139900139901139902139903139904139905139906139907139908139909139910139911139912139913139914139915139916139917139918139919139920139921139922139923139924139925139926139927139928139929139930139931139932139933139934139935139936139937139938139939139940139941139942139943139944139945139946139947139948139949139950139951139952139953139954139955139956139957139958139959139960139961139962139963139964139965139966139967139968139969139970139971139972139973139974139975139976139977139978139979139980139981139982139983139984139985139986139987139988139989139990139991139992139993139994139995139996139997139998139999140000140001140002140003140004140005140006140007140008140009140010140011140012140013140014140015140016140017140018140019140020140021140022140023140024140025140026140027140028140029140030140031140032140033140034140035140036140037140038140039140040140041140042140043140044140045140046140047140048140049140050140051140052140053140054140055140056140057140058140059140060140061140062140063140064140065140066140067140068140069140070140071140072140073140074140075140076140077140078140079140080140081140082140083140084140085140086140087140088140089140090140091140092140093140094140095140096140097140098140099140100140101140102140103140104140105140106140107140108140109140110140111140112140113140114140115140116140117140118140119140120140121140122140123140124140125140126140127140128140129140130140131140132140133140134140135140136140137140138140139140140140141140142140143140144140145140146140147140148140149140150140151140152140153140154140155140156140157140158140159140160140161140162140163140164140165140166140167140168140169140170140171140172140173140174140175140176140177140178140179140180140181140182140183140184140185140186140187140188140189140190140191140192140193140194140195140196140197140198140199140200140201140202140203140204140205140206140207140208140209140210140211140212140213140214140215140216140217140218140219140220140221140222140223140224140225140226140227140228140229140230140231140232140233140234140235140236140237140238140239140240140241140242140243140244140245140246140247140248140249140250140251140252140253140254140255140256140257140258140259140260140261140262140263140264140265140266140267140268140269140270140271140272140273140274140275140276140277140278140279140280140281140282140283140284140285140286140287140288140289140290140291140292140293140294140295140296140297140298140299140300140301140302140303140304140305140306140307140308140309140310140311140312140313140314140315140316140317140318140319140320140321140322140323140324140325140326140327140328140329140330140331140332140333140334140335140336140337140338140339140340140341140342140343140344140345140346140347140348140349140350140351140352140353140354140355140356140357140358140359140360140361140362140363140364140365140366140367140368140369140370140371140372140373140374140375140376140377140378140379140380140381140382140383140384140385140386140387140388140389140390140391140392140393140394140395140396140397140398140399140400140401140402140403140404140405140406140407140408140409140410140411140412140413140414140415140416140417140418140419140420140421140422140423140424140425140426140427140428140429140430140431140432140433140434140435140436140437140438140439140440140441140442140443140444140445140446140447140448140449140450140451140452140453140454140455140456140457140458140459140460140461140462140463140464140465140466140467140468140469140470140471140472140473140474140475140476140477140478140479140480140481140482140483140484140485140486140487140488140489140490140491140492140493140494140495140496140497140498140499140500140501140502140503140504140505140506140507140508140509140510140511140512140513140514140515140516140517140518140519140520140521140522140523140524140525140526140527140528140529140530140531140532140533140534140535140536140537140538140539140540140541140542140543140544140545140546140547140548140549140550140551140552140553140554140555140556140557140558140559140560140561140562140563140564140565140566140567140568140569140570140571140572140573140574140575140576140577140578140579140580140581140582140583140584140585140586140587140588140589140590140591140592140593140594140595140596140597140598140599140600140601140602140603140604140605140606140607140608140609140610140611140612140613140614140615140616140617140618140619140620140621140622140623140624140625140626140627140628140629140630140631140632140633140634140635140636140637140638140639140640140641140642140643140644140645140646140647140648140649140650140651140652140653140654140655140656140657140658140659140660140661140662140663140664140665140666140667140668140669140670140671140672140673140674140675140676140677140678140679140680140681140682140683140684140685140686140687140688140689140690140691140692140693140694140695140696140697140698140699140700140701140702140703140704140705140706140707140708140709140710140711140712140713140714140715140716140717140718140719140720140721140722140723140724140725140726140727140728140729140730140731140732140733140734140735140736140737140738140739140740140741140742140743140744140745140746140747140748140749140750140751140752140753140754140755140756140757140758140759140760140761140762140763140764140765140766140767140768140769140770140771140772140773140774140775140776140777140778140779140780140781140782140783140784140785140786140787140788140789140790140791140792140793140794140795140796140797140798140799140800140801140802140803140804140805140806140807140808140809140810140811140812140813140814140815140816140817140818140819140820140821140822140823140824140825140826140827140828140829140830140831140832140833140834140835140836140837140838140839140840140841140842140843140844140845140846140847140848140849140850140851140852140853140854140855140856140857140858140859140860140861140862140863140864140865140866140867140868140869140870140871140872140873140874140875140876140877140878140879140880140881140882140883140884140885140886140887140888140889140890140891140892140893140894140895140896140897140898140899140900140901140902140903140904140905140906140907140908140909140910140911140912140913140914140915140916140917140918140919140920140921140922140923140924140925140926140927140928140929140930140931140932140933140934140935140936140937140938140939140940140941140942140943140944140945140946140947140948140949140950140951140952140953140954140955140956140957140958140959140960140961140962140963140964140965140966140967140968140969140970140971140972140973140974140975140976140977140978140979140980140981140982140983140984140985140986140987140988140989140990140991140992140993140994140995140996140997140998140999141000141001141002141003141004141005141006141007141008141009141010141011141012141013141014141015141016141017141018141019141020141021141022141023141024141025141026141027141028141029141030141031141032141033141034141035141036141037141038141039141040141041141042141043141044141045141046141047141048141049141050141051141052141053141054141055141056141057141058141059141060141061141062141063141064141065141066141067141068141069141070141071141072141073141074141075141076141077141078141079141080141081141082141083141084141085141086141087141088141089141090141091141092141093141094141095141096141097141098141099141100141101141102141103141104141105141106141107141108141109141110141111141112141113141114141115141116141117141118141119141120141121141122141123141124141125141126141127141128141129141130141131141132141133141134141135141136141137141138141139141140141141141142141143141144141145141146141147141148141149141150141151141152141153141154141155141156141157141158141159141160141161141162141163141164141165141166141167141168141169141170141171141172141173141174141175141176141177141178141179141180141181141182141183141184141185141186141187141188141189141190141191141192141193141194141195141196141197141198141199141200141201141202141203141204141205141206141207141208141209141210141211141212141213141214141215141216141217141218141219141220141221141222141223141224141225141226141227141228141229141230141231141232141233141234141235141236141237141238141239141240141241141242141243141244141245141246141247141248141249141250141251141252141253141254141255141256141257141258141259141260141261141262141263141264141265141266141267141268141269141270141271141272141273141274141275141276141277141278141279141280141281141282141283141284141285141286141287141288141289141290141291141292141293141294141295141296141297141298141299141300141301141302141303141304141305141306141307141308141309141310141311141312141313141314141315141316141317141318141319141320141321141322141323141324141325141326141327141328141329141330141331141332141333141334141335141336141337141338141339141340141341141342141343141344141345141346141347141348141349141350141351141352141353141354141355141356141357141358141359141360141361141362141363141364141365141366141367141368141369141370141371141372141373141374141375141376141377141378141379141380141381141382141383141384141385141386141387141388141389141390141391141392141393141394141395141396141397141398141399141400141401141402141403141404141405141406141407141408141409141410141411141412141413141414141415141416141417141418141419141420141421141422141423141424141425141426141427141428141429141430141431141432141433141434141435141436141437141438141439141440141441141442141443141444141445141446141447141448141449141450141451141452141453141454141455141456141457141458141459141460141461141462141463141464141465141466141467141468141469141470141471141472141473141474141475141476141477141478141479141480141481141482141483141484141485141486141487141488141489141490141491141492141493141494141495141496141497141498141499141500141501141502141503141504141505141506141507141508141509141510141511141512141513141514141515141516141517141518141519141520141521141522141523141524141525141526141527141528141529141530141531141532141533141534141535141536141537141538141539141540141541141542141543141544141545141546141547141548141549141550141551141552141553141554141555141556141557141558141559141560141561141562141563141564141565141566141567141568141569141570141571141572141573141574141575141576141577141578141579141580141581141582141583141584141585141586141587141588141589141590141591141592141593141594141595141596141597141598141599141600141601141602141603141604141605141606141607141608141609141610141611141612141613141614141615141616141617141618141619141620141621141622141623141624141625141626141627141628141629141630141631141632141633141634141635141636141637141638141639141640141641141642141643141644141645141646141647141648141649141650141651141652141653141654141655141656141657141658141659141660141661141662141663141664141665141666141667141668141669141670141671141672141673141674141675141676141677141678141679141680141681141682141683141684141685141686141687141688141689141690141691141692141693141694141695141696141697141698141699141700141701141702141703141704141705141706141707141708141709141710141711141712141713141714141715141716141717141718141719141720141721141722141723141724141725141726141727141728141729141730141731141732141733141734141735141736141737141738141739141740141741141742141743141744141745141746141747141748141749141750141751141752141753141754141755141756141757141758141759141760141761141762141763141764141765141766141767141768141769141770141771141772141773141774141775141776141777141778141779141780141781141782141783141784141785141786141787141788141789141790141791141792141793141794141795141796141797141798141799141800141801141802141803141804141805141806141807141808141809141810141811141812141813141814141815141816141817141818141819141820141821141822141823141824141825141826141827141828141829141830141831141832141833141834141835141836141837141838141839141840141841141842141843141844141845141846141847141848141849141850141851141852141853141854141855141856141857141858141859141860141861141862141863141864141865141866141867141868141869141870141871141872141873141874141875141876141877141878141879141880141881141882141883141884141885141886141887141888141889141890141891141892141893141894141895141896141897141898141899141900141901141902141903141904141905141906141907141908141909141910141911141912141913141914141915141916141917141918141919141920141921141922141923141924141925141926141927141928141929141930141931141932141933141934141935141936141937141938141939141940141941141942141943141944141945141946141947141948141949141950141951141952141953141954141955141956141957141958141959141960141961141962141963141964141965141966141967141968141969141970141971141972141973141974141975141976141977141978141979141980141981141982141983141984141985141986141987141988141989141990141991141992141993141994141995141996141997141998141999142000142001142002142003142004142005142006142007142008142009142010142011142012142013142014142015142016142017142018142019142020142021142022142023142024142025142026142027142028142029142030142031142032142033142034142035142036142037142038142039142040142041142042142043142044142045142046142047142048142049142050142051142052142053142054142055142056142057142058142059142060142061142062142063142064142065142066142067142068142069142070142071142072142073142074142075142076142077142078142079142080142081142082142083142084142085142086142087142088142089142090142091142092142093142094142095142096142097142098142099142100142101142102142103142104142105142106142107142108142109142110142111142112142113142114142115142116142117142118142119142120142121142122142123142124142125142126142127142128142129142130142131142132142133142134142135142136142137142138142139142140142141142142142143142144142145142146142147142148142149142150142151142152142153142154142155142156142157142158142159142160142161142162142163142164142165142166142167142168142169142170142171142172142173142174142175142176142177142178142179142180142181142182142183142184142185142186142187142188142189142190142191142192142193142194142195142196142197142198142199142200142201142202142203142204142205142206142207142208142209142210142211142212142213142214142215142216142217142218142219142220142221142222142223142224142225142226142227142228142229142230142231142232142233142234142235142236142237142238142239142240142241142242142243142244142245142246142247142248142249142250142251142252142253142254142255142256142257142258142259142260142261142262142263142264142265142266142267142268142269142270142271142272142273142274142275142276142277142278142279142280142281142282142283142284142285142286142287142288142289142290142291142292142293142294142295142296142297142298142299142300142301142302142303142304142305142306142307142308142309142310142311142312142313142314142315142316142317142318142319142320142321142322142323142324142325142326142327142328142329142330142331142332142333142334142335142336142337142338142339142340142341142342142343142344142345142346142347142348142349142350142351142352142353142354142355142356142357142358142359142360142361142362142363142364142365142366142367142368142369142370142371142372142373142374142375142376142377142378142379142380142381142382142383142384142385142386142387142388142389142390142391142392142393142394142395142396142397142398142399142400142401142402142403142404142405142406142407142408142409142410142411142412142413142414142415142416142417142418142419142420142421142422142423142424142425142426142427142428142429142430142431142432142433142434142435142436142437142438142439142440142441142442142443142444142445142446142447142448142449142450142451142452142453142454142455142456142457142458142459142460142461142462142463142464142465142466142467142468142469142470142471142472142473142474142475142476142477142478142479142480142481142482142483142484142485142486142487142488142489142490142491142492142493142494142495142496142497142498142499142500142501142502142503142504142505142506142507142508142509142510142511142512142513142514142515142516142517142518142519142520142521142522142523142524142525142526142527142528142529142530142531142532142533142534142535142536142537142538142539142540142541142542142543142544142545142546142547142548142549142550142551142552142553142554142555142556142557142558142559142560142561142562142563142564142565142566142567142568142569142570142571142572142573142574142575142576142577142578142579142580142581142582142583142584142585142586142587142588142589142590142591142592142593142594142595142596142597142598142599142600142601142602142603142604142605142606142607142608142609142610142611142612142613142614142615142616142617142618142619142620142621142622142623142624142625142626142627142628142629142630142631142632142633142634142635142636142637142638142639142640142641142642142643142644142645142646142647142648142649142650142651142652142653142654142655142656142657142658142659142660142661142662142663142664142665142666142667142668142669142670142671142672142673142674142675142676142677142678142679142680142681142682142683142684142685142686142687142688142689142690142691142692142693142694142695142696142697142698142699142700142701142702142703142704142705142706142707142708142709142710142711142712142713142714142715142716142717142718142719142720142721142722142723142724142725142726142727142728142729142730142731142732142733142734142735142736142737142738142739142740142741142742142743142744142745142746142747142748142749142750142751142752142753142754142755142756142757142758142759142760142761142762142763142764142765142766142767142768142769142770142771142772142773142774142775142776142777142778142779142780142781142782142783142784142785142786142787142788142789142790142791142792142793142794142795142796142797142798142799142800142801142802142803142804142805142806142807142808142809142810142811142812142813142814142815142816142817142818142819142820142821142822142823142824142825142826142827142828142829142830142831142832142833142834142835142836142837142838142839142840142841142842142843142844142845142846142847142848142849142850142851142852142853142854142855142856142857142858142859142860142861142862142863142864142865142866142867142868142869142870142871142872142873142874142875142876142877142878142879142880142881142882142883142884142885142886142887142888142889142890142891142892142893142894142895142896142897142898142899142900142901142902142903142904142905142906142907142908142909142910142911142912142913142914142915142916142917142918142919142920142921142922142923142924142925142926142927142928142929142930142931142932142933142934142935142936142937142938142939142940142941142942142943142944142945142946142947142948142949142950142951142952142953142954142955142956142957142958142959142960142961142962142963142964142965142966142967142968142969142970142971142972142973142974142975142976142977142978142979142980142981142982142983142984142985142986142987142988142989142990142991142992142993142994142995142996142997142998142999143000143001143002143003143004143005143006143007143008143009143010143011143012143013143014143015143016143017143018143019143020143021143022143023143024143025143026143027143028143029143030143031143032143033143034143035143036143037143038143039143040143041143042143043143044143045143046143047143048143049143050143051143052143053143054143055143056143057143058143059143060143061143062143063143064143065143066143067143068143069143070143071143072143073143074143075143076143077143078143079143080143081143082143083143084143085143086143087143088143089143090143091143092143093143094143095143096143097143098143099143100143101143102143103143104143105143106143107143108143109143110143111143112143113143114143115143116143117143118143119143120143121143122143123143124143125143126143127143128143129143130143131143132143133143134143135143136143137143138143139143140143141143142143143143144143145143146143147143148143149143150143151143152143153143154143155143156143157143158143159143160143161143162143163143164143165143166143167143168143169143170143171143172143173143174143175143176143177143178143179143180143181143182143183143184143185143186143187143188143189143190143191143192143193143194143195143196143197143198143199143200143201143202143203143204143205143206143207143208143209143210143211143212143213143214143215143216143217143218143219143220143221143222143223143224143225143226143227143228143229143230143231143232143233143234143235143236143237143238143239143240143241143242143243143244143245143246143247143248143249143250143251143252143253143254143255143256143257143258143259143260143261143262143263143264143265143266143267143268143269143270143271143272143273143274143275143276143277143278143279143280143281143282143283143284143285143286143287143288143289143290143291143292143293143294143295143296143297143298143299143300143301143302143303143304143305143306143307143308143309143310143311143312143313143314143315143316143317143318143319143320143321143322143323143324143325143326143327143328143329143330143331143332143333143334143335143336143337143338143339143340143341143342143343143344143345143346143347143348143349143350143351143352143353143354143355143356143357143358143359143360143361143362143363143364143365143366143367143368143369143370143371143372143373143374143375143376143377143378143379143380143381143382143383143384143385143386143387143388143389143390143391143392143393143394143395143396143397143398143399143400143401143402143403143404143405143406143407143408143409143410143411143412143413143414143415143416143417143418143419143420143421143422143423143424143425143426143427143428143429143430143431143432143433143434143435143436143437143438143439143440143441143442143443143444143445143446143447143448143449143450143451143452143453143454143455143456143457143458143459143460143461143462143463143464143465143466143467143468143469143470143471143472143473143474143475143476143477143478143479143480143481143482143483143484143485143486143487143488143489143490143491143492143493143494143495143496143497143498143499143500143501143502143503143504143505143506143507143508143509143510143511143512143513143514143515143516143517143518143519143520143521143522143523143524143525143526143527143528143529143530143531143532143533143534143535143536143537143538143539143540143541143542143543143544143545143546143547143548143549143550143551143552143553143554143555143556143557143558143559143560143561143562143563143564143565143566143567143568143569143570143571143572143573143574143575143576143577143578143579143580143581143582143583143584143585143586143587143588143589143590143591143592143593143594143595143596143597143598143599143600143601143602143603143604143605143606143607143608143609143610143611143612143613143614143615143616143617143618143619143620143621143622143623143624143625143626143627143628143629143630143631143632143633143634143635143636143637143638143639143640143641143642143643143644143645143646143647143648143649143650143651143652143653143654143655143656143657143658143659143660143661143662143663143664143665143666143667143668143669143670143671143672143673143674143675143676143677143678143679143680143681143682143683143684143685143686143687143688143689143690143691143692143693143694143695143696143697143698143699143700143701143702143703143704143705143706143707143708143709143710143711143712143713143714143715143716143717143718143719143720143721143722143723143724143725143726143727143728143729143730143731143732143733143734143735143736143737143738143739143740143741143742143743143744143745143746143747143748143749143750143751143752143753143754143755143756143757143758143759143760143761143762143763143764143765143766143767143768143769143770143771143772143773143774143775143776143777143778143779143780143781143782143783143784143785143786143787143788143789143790143791143792143793143794143795143796143797143798143799143800143801143802143803143804143805143806143807143808143809143810143811143812143813143814143815143816143817143818143819143820143821143822143823143824143825143826143827143828143829143830143831143832143833143834143835143836143837143838143839143840143841143842143843143844143845143846143847143848143849143850143851143852143853143854143855143856143857143858143859143860143861143862143863143864143865143866143867143868143869143870143871143872143873143874143875143876143877143878143879143880143881143882143883143884143885143886143887143888143889143890143891143892143893143894143895143896143897143898143899143900143901143902143903143904143905143906143907143908143909143910143911143912143913143914143915143916143917143918143919143920143921143922143923143924143925143926143927143928143929143930143931143932143933143934143935143936143937143938143939143940143941143942143943143944143945143946143947143948143949143950143951143952143953143954143955143956143957143958143959143960143961143962143963143964143965143966143967143968143969143970143971143972143973143974143975143976143977143978143979143980143981143982143983143984143985143986143987143988143989143990143991143992143993143994143995143996143997143998143999144000144001144002144003144004144005144006144007144008144009144010144011144012144013144014144015144016144017144018144019144020144021144022144023144024144025144026144027144028144029144030144031144032144033144034144035144036144037144038144039144040144041144042144043144044144045144046144047144048144049144050144051144052144053144054144055144056144057144058144059144060144061144062144063144064144065144066144067144068144069144070144071144072144073144074144075144076144077144078144079144080144081144082144083144084144085144086144087144088144089144090144091144092144093144094144095144096144097144098144099144100144101144102144103144104144105144106144107144108144109144110144111144112144113144114144115144116144117144118144119144120144121144122144123144124144125144126144127144128144129144130144131144132144133144134144135144136144137144138144139144140144141144142144143144144144145144146144147144148144149144150144151144152144153144154144155144156144157144158144159144160144161144162144163144164144165144166144167144168144169144170144171144172144173144174144175144176144177144178144179144180144181144182144183144184144185144186144187144188144189144190144191144192144193144194144195144196144197144198144199144200144201144202144203144204144205144206144207144208144209144210144211144212144213144214144215144216144217144218144219144220144221144222144223144224144225144226144227144228144229144230144231144232144233144234144235144236144237144238144239144240144241144242144243144244144245144246144247144248144249144250144251144252144253144254144255144256144257144258144259144260144261144262144263144264144265144266144267144268144269144270144271144272144273144274144275144276144277144278144279144280144281144282144283144284144285144286144287144288144289144290144291144292144293144294144295144296144297144298144299144300144301144302144303144304144305144306144307144308144309144310144311144312144313144314144315144316144317144318144319144320144321144322144323144324144325144326144327144328144329144330144331144332144333144334144335144336144337144338144339144340144341144342144343144344144345144346144347144348144349144350144351144352144353144354144355144356144357144358144359144360144361144362144363144364144365144366144367144368144369144370144371144372144373144374144375144376144377144378144379144380144381144382144383144384144385144386144387144388144389144390144391144392144393144394144395144396144397144398144399144400144401144402144403144404144405144406144407144408144409144410144411144412144413144414144415144416144417144418144419144420144421144422144423144424144425144426144427144428144429144430144431144432144433144434144435144436144437144438144439144440144441144442144443144444144445144446144447144448144449144450144451144452144453144454144455144456144457144458144459144460144461144462144463144464144465144466144467144468144469144470144471144472144473144474144475144476144477144478144479144480144481144482144483144484144485144486144487144488144489144490144491144492144493144494144495144496144497144498144499144500144501144502144503144504144505144506144507144508144509144510144511144512144513144514144515144516144517144518144519144520144521144522144523144524144525144526144527144528144529144530144531144532144533144534144535144536144537144538144539144540144541144542144543144544144545144546144547144548144549144550144551144552144553144554144555144556144557144558144559144560144561144562144563144564144565144566144567144568144569144570144571144572144573144574144575144576144577144578144579144580144581144582144583144584144585144586144587144588144589144590144591144592144593144594144595144596144597144598144599144600144601144602144603144604144605144606144607144608144609144610144611144612144613144614144615144616144617144618144619144620144621144622144623144624144625144626144627144628144629144630144631144632144633144634144635144636144637144638144639144640144641144642144643144644144645144646144647144648144649144650144651144652144653144654144655144656144657144658144659144660144661144662144663144664144665144666144667144668144669144670144671144672144673144674144675144676144677144678144679144680144681144682144683144684144685144686144687144688144689144690144691144692144693144694144695144696144697144698144699144700144701144702144703144704144705144706144707144708144709144710144711144712144713144714144715144716144717144718144719144720144721144722144723144724144725144726144727144728144729144730144731144732144733144734144735144736144737144738144739144740144741144742144743144744144745144746144747144748144749144750144751144752144753144754144755144756144757144758144759144760144761144762144763144764144765144766144767144768144769144770144771144772144773144774144775144776144777144778144779144780144781144782144783144784144785144786144787144788144789144790144791144792144793144794144795144796144797144798144799144800144801144802144803144804144805144806144807144808144809144810144811144812144813144814144815144816144817144818144819144820144821144822144823144824144825144826144827144828144829144830144831144832144833144834144835144836144837144838144839144840144841144842144843144844144845144846144847144848144849144850144851144852144853144854144855144856144857144858144859144860144861144862144863144864144865144866144867144868144869144870144871144872144873144874144875144876144877144878144879144880144881144882144883144884144885144886144887144888144889144890144891144892144893144894144895144896144897144898144899144900144901144902144903144904144905144906144907144908144909144910144911144912144913144914144915144916144917144918144919144920144921144922144923144924144925144926144927144928144929144930144931144932144933144934144935144936144937144938144939144940144941144942144943144944144945144946144947144948144949144950144951144952144953144954144955144956144957144958144959144960144961144962144963144964144965144966144967144968144969144970144971144972144973144974144975144976144977144978144979144980144981144982144983144984144985144986144987144988144989144990144991144992144993144994144995144996144997144998144999145000145001145002145003145004145005145006145007145008145009145010145011145012145013145014145015145016145017145018145019145020145021145022145023145024145025145026145027145028145029145030145031145032145033145034145035145036145037145038145039145040145041145042145043145044145045145046145047145048145049145050145051145052145053145054145055145056145057145058145059145060145061145062145063145064145065145066145067145068145069145070145071145072145073145074145075145076145077145078145079145080145081145082145083145084145085145086145087145088145089145090145091145092145093145094145095145096145097145098145099145100145101145102145103145104145105145106145107145108145109145110145111145112145113145114145115145116145117145118145119145120145121145122145123145124145125145126145127145128145129145130145131145132145133145134145135145136145137145138145139145140145141145142145143145144145145145146145147145148145149145150145151145152145153145154145155145156145157145158145159145160145161145162145163145164145165145166145167145168145169145170145171145172145173145174145175145176145177145178145179145180145181145182145183145184145185145186145187145188145189145190145191145192145193145194145195145196145197145198145199145200145201145202145203145204145205145206145207145208145209145210145211145212145213145214145215145216145217145218145219145220145221145222145223145224145225145226145227145228145229145230145231145232145233145234145235145236145237145238145239145240145241145242145243145244145245145246145247145248145249145250145251145252145253145254145255145256145257145258145259145260145261145262145263145264145265145266145267145268145269145270145271145272145273145274145275145276145277145278145279145280145281145282145283145284145285145286145287145288145289145290145291145292145293145294145295145296145297145298145299145300145301145302145303145304145305145306145307145308145309145310145311145312145313145314145315145316145317145318145319145320145321145322145323145324145325145326145327145328145329145330145331145332145333145334145335145336145337145338145339145340145341145342145343145344145345145346145347145348145349145350145351145352145353145354145355145356145357145358145359145360145361145362145363145364145365145366145367145368145369145370145371145372145373145374145375145376145377145378145379145380145381145382145383145384145385145386145387145388145389145390145391145392145393145394145395145396145397145398145399145400145401145402145403145404145405145406145407145408145409145410145411145412145413145414145415145416145417145418145419145420145421145422145423145424145425145426145427145428145429145430145431145432145433145434145435145436145437145438145439145440145441145442145443145444145445145446145447145448145449145450145451145452145453145454145455145456145457145458145459145460145461145462145463145464145465145466145467145468145469145470145471145472145473145474145475145476145477145478145479145480145481145482145483145484145485145486145487145488145489145490145491145492145493145494145495145496145497145498145499145500145501145502145503145504145505145506145507145508145509145510145511145512145513145514145515145516145517145518145519145520145521145522145523145524145525145526145527145528145529145530145531145532145533145534145535145536145537145538145539145540145541145542145543145544145545145546145547145548145549145550145551145552145553145554145555145556145557145558145559145560145561145562145563145564145565145566145567145568145569145570145571145572145573145574145575145576145577145578145579145580145581145582145583145584145585145586145587145588145589145590145591145592145593145594145595145596145597145598145599145600145601145602145603145604145605145606145607145608145609145610145611145612145613145614145615145616145617145618145619145620145621145622145623145624145625145626145627145628145629145630145631145632145633145634145635145636145637145638145639145640145641145642145643145644145645145646145647145648145649145650145651145652145653145654145655145656145657145658145659145660145661145662145663145664145665145666145667145668145669145670145671145672145673145674145675145676145677145678145679145680145681145682145683145684145685145686145687145688145689145690145691145692145693145694145695145696145697145698145699145700145701145702145703145704145705145706145707145708145709145710145711145712145713145714145715145716145717145718145719145720145721145722145723145724145725145726145727145728145729145730145731145732145733145734145735145736145737145738145739145740145741145742145743145744145745145746145747145748145749145750145751145752145753145754145755145756145757145758145759145760145761145762145763145764145765145766145767145768145769145770145771145772145773145774145775145776145777145778145779145780145781145782145783145784145785145786145787145788145789145790145791145792145793145794145795145796145797145798145799145800145801145802145803145804145805145806145807145808145809145810145811145812145813145814145815145816145817145818145819145820145821145822145823145824145825145826145827145828145829145830145831145832145833145834145835145836145837145838145839145840145841145842145843145844145845145846145847145848145849145850145851145852145853145854145855145856145857145858145859145860145861145862145863145864145865145866145867145868145869145870145871145872145873145874145875145876145877145878145879145880145881145882145883145884145885145886145887145888145889145890145891145892145893145894145895145896145897145898145899145900145901145902145903145904145905145906145907145908145909145910145911145912145913145914145915145916145917145918145919145920145921145922145923145924145925145926145927145928145929145930145931145932145933145934145935145936145937145938145939145940145941145942145943145944145945145946145947145948145949145950145951145952145953145954145955145956145957145958145959145960145961145962145963145964145965145966145967145968145969145970145971145972145973145974145975145976145977145978145979145980145981145982145983145984145985145986145987145988145989145990145991145992145993145994145995145996145997145998145999146000146001146002146003146004146005146006146007146008146009146010146011146012146013146014146015146016146017146018146019146020146021146022146023146024146025146026146027146028146029146030146031146032146033146034146035146036146037146038146039146040146041146042146043146044146045146046146047146048146049146050146051146052146053146054146055146056146057146058146059146060146061146062146063146064146065146066146067146068146069146070146071146072146073146074146075146076146077146078146079146080146081146082146083146084146085146086146087146088146089146090146091146092146093146094146095146096146097146098146099146100146101146102146103146104146105146106146107146108146109146110146111146112146113146114146115146116146117146118146119146120146121146122146123146124146125146126146127146128146129146130146131146132146133146134146135146136146137146138146139146140146141146142146143146144146145146146146147146148146149146150146151146152146153146154146155146156146157146158146159146160146161146162146163146164146165146166146167146168146169146170146171146172146173146174146175146176146177146178146179146180146181146182146183146184146185146186146187146188146189146190146191146192146193146194146195146196146197146198146199146200146201146202146203146204146205146206146207146208146209146210146211146212146213146214146215146216146217146218146219146220146221146222146223146224146225146226146227146228146229146230146231146232146233146234146235146236146237146238146239146240146241146242146243146244146245146246146247146248146249146250146251146252146253146254146255146256146257146258146259146260146261146262146263146264146265146266146267146268146269146270146271146272146273146274146275146276146277146278146279146280146281146282146283146284146285146286146287146288146289146290146291146292146293146294146295146296146297146298146299146300146301146302146303146304146305146306146307146308146309146310146311146312146313146314146315146316146317146318146319146320146321146322146323146324146325146326146327146328146329146330146331146332146333146334146335146336146337146338146339146340146341146342146343146344146345146346146347146348146349146350146351146352146353146354146355146356146357146358146359146360146361146362146363146364146365146366146367146368146369146370146371146372146373146374146375146376146377146378146379146380146381146382146383146384146385146386146387146388146389146390146391146392146393146394146395146396146397146398146399146400146401146402146403146404146405146406146407146408146409146410146411146412146413146414146415146416146417146418146419146420146421146422146423146424146425146426146427146428146429146430146431146432146433146434146435146436146437146438146439146440146441146442146443146444146445146446146447146448146449146450146451146452146453146454146455146456146457146458146459146460146461146462146463146464146465146466146467146468146469146470146471146472146473146474146475146476146477146478146479146480146481146482146483146484146485146486146487146488146489146490146491146492146493146494146495146496146497146498146499146500146501146502146503146504146505146506146507146508146509146510146511146512146513146514146515146516146517146518146519146520146521146522146523146524146525146526146527146528146529146530146531146532146533146534146535146536146537146538146539146540146541146542146543146544146545146546146547146548146549146550146551146552146553146554146555146556146557146558146559146560146561146562146563146564146565146566146567146568146569146570146571146572146573146574146575146576146577146578146579146580146581146582146583146584146585146586146587146588146589146590146591146592146593146594146595146596146597146598146599146600146601146602146603146604146605146606146607146608146609146610146611146612146613146614146615146616146617146618146619146620146621146622146623146624146625146626146627146628146629146630146631146632146633146634146635146636146637146638146639146640146641146642146643146644146645146646146647146648146649146650146651146652146653146654146655146656146657146658146659146660146661146662146663146664146665146666146667146668146669146670146671146672146673146674146675146676146677146678146679146680146681146682146683146684146685146686146687146688146689146690146691146692146693146694146695146696146697146698146699146700146701146702146703146704146705146706146707146708146709146710146711146712146713146714146715146716146717146718146719146720146721146722146723146724146725146726146727146728146729146730146731146732146733146734146735146736146737146738146739146740146741146742146743146744146745146746146747146748146749146750146751146752146753146754146755146756146757146758146759146760146761146762146763146764146765146766146767146768146769146770146771146772146773146774146775146776146777146778146779146780146781146782146783146784146785146786146787146788146789146790146791146792146793146794146795146796146797146798146799146800146801146802146803146804146805146806146807146808146809146810146811146812146813146814146815146816146817146818146819146820146821146822146823146824146825146826146827146828146829146830146831146832146833146834146835146836146837146838146839146840146841146842146843146844146845146846146847146848146849146850146851146852146853146854146855146856146857146858146859146860146861146862146863146864146865146866146867146868146869146870146871146872146873146874146875146876146877146878146879146880146881146882146883146884146885146886146887146888146889146890146891146892146893146894146895146896146897146898146899146900146901146902146903146904146905146906146907146908146909146910146911146912146913146914146915146916146917146918146919146920146921146922146923146924146925146926146927146928146929146930146931146932146933146934146935146936146937146938146939146940146941146942146943146944146945146946146947146948146949146950146951146952146953146954146955146956146957146958146959146960146961146962146963146964146965146966146967146968146969146970146971146972146973146974146975146976146977146978146979146980146981146982146983146984146985146986146987146988146989146990146991146992146993146994146995146996146997146998146999147000147001147002147003147004147005147006147007147008147009147010147011147012147013147014147015147016147017147018147019147020147021147022147023147024147025147026147027147028147029147030147031147032147033147034147035147036147037147038147039147040147041147042147043147044147045147046147047147048147049147050147051147052147053147054147055147056147057147058147059147060147061147062147063147064147065147066147067147068147069147070147071147072147073147074147075147076147077147078147079147080147081147082147083147084147085147086147087147088147089147090147091147092147093147094147095147096147097147098147099147100147101147102147103147104147105147106147107147108147109147110147111147112147113147114147115147116147117147118147119147120147121147122147123147124147125147126147127147128147129147130147131147132147133147134147135147136147137147138147139147140147141147142147143147144147145147146147147147148147149147150147151147152147153147154147155147156147157147158147159147160147161147162147163147164147165147166147167147168147169147170147171147172147173147174147175147176147177147178147179147180147181147182147183147184147185147186147187147188147189147190147191147192147193147194147195147196147197147198147199147200147201147202147203147204147205147206147207147208147209147210147211147212147213147214147215147216147217147218147219147220147221147222147223147224147225147226147227147228147229147230147231147232147233147234147235147236147237147238147239147240147241147242147243147244147245147246147247147248147249147250147251147252147253147254147255147256147257147258147259147260147261147262147263147264147265147266147267147268147269147270147271147272147273147274147275147276147277147278147279147280147281147282147283147284147285147286147287147288147289147290147291147292147293147294147295147296147297147298147299147300147301147302147303147304147305147306147307147308147309147310147311147312147313147314147315147316147317147318147319147320147321147322147323147324147325147326147327147328147329147330147331147332147333147334147335147336147337147338147339147340147341147342147343147344147345147346147347147348147349147350147351147352147353147354147355147356147357147358147359147360147361147362147363147364147365147366147367147368147369147370147371147372147373147374147375147376147377147378147379147380147381147382147383147384147385147386147387147388147389147390147391147392147393147394147395147396147397147398147399147400147401147402147403147404147405147406147407147408147409147410147411147412147413147414147415147416147417147418147419147420147421147422147423147424147425147426147427147428147429147430147431147432147433147434147435147436147437147438147439147440147441147442147443147444147445147446147447147448147449147450147451147452147453147454147455147456147457147458147459147460147461147462147463147464147465147466147467147468147469147470147471147472147473147474147475147476147477147478147479147480147481147482147483147484147485147486147487147488147489147490147491147492147493147494147495147496147497147498147499147500147501147502147503147504147505147506147507147508147509147510147511147512147513147514147515147516147517147518147519147520147521147522147523147524147525147526147527147528147529147530147531147532147533147534147535147536147537147538147539147540147541147542147543147544147545147546147547147548147549147550147551147552147553147554147555147556147557147558147559147560147561147562147563147564147565147566147567147568147569147570147571147572147573147574147575147576147577147578147579147580147581147582147583147584147585147586147587147588147589147590147591147592147593147594147595147596147597147598147599147600147601147602147603147604147605147606147607147608147609147610147611147612147613147614147615147616147617147618147619147620147621147622147623147624147625147626147627147628147629147630147631147632147633147634147635147636147637147638147639147640147641147642147643147644147645147646147647147648147649147650147651147652147653147654147655147656147657147658147659147660147661147662147663147664147665147666147667147668147669147670147671147672147673147674147675147676147677147678147679147680147681147682147683147684147685147686147687147688147689147690147691147692147693147694147695147696147697147698147699147700147701147702147703147704147705147706147707147708147709147710147711147712147713147714147715147716147717147718147719147720147721147722147723147724147725147726147727147728147729147730147731147732147733147734147735147736147737147738147739147740147741147742147743147744147745147746147747147748147749147750147751147752147753147754147755147756147757147758147759147760147761147762147763147764147765147766147767147768147769147770147771147772147773147774147775147776147777147778147779147780147781147782147783147784147785147786147787147788147789147790147791147792147793147794147795147796147797147798147799147800147801147802147803147804147805147806147807147808147809147810147811147812147813147814147815147816147817147818147819147820147821147822147823147824147825147826147827147828147829147830147831147832147833147834147835147836147837147838147839147840147841147842147843147844147845147846147847147848147849147850147851147852147853147854147855147856147857147858147859147860147861147862147863147864147865147866147867147868147869147870147871147872147873147874147875147876147877147878147879147880147881147882147883147884147885147886147887147888147889147890147891147892147893147894147895147896147897147898147899147900147901147902147903147904147905147906147907147908147909147910147911147912147913147914147915147916147917147918147919147920147921147922147923147924147925147926147927147928147929147930147931147932147933147934147935147936147937147938147939147940147941147942147943147944147945147946147947147948147949147950147951147952147953147954147955147956147957147958147959147960147961147962147963147964147965147966147967147968147969147970147971147972147973147974147975147976147977147978147979147980147981147982147983147984147985147986147987147988147989147990147991147992147993147994147995147996147997147998147999148000148001148002148003148004148005148006148007148008148009148010148011148012148013148014148015148016148017148018148019148020148021148022148023148024148025148026148027148028148029148030148031148032148033148034148035148036148037148038148039148040148041148042148043148044148045148046148047148048148049148050148051148052148053148054148055148056148057148058148059148060148061148062148063148064148065148066148067148068148069148070148071148072148073148074148075148076148077148078148079148080148081148082148083148084148085148086148087148088148089148090148091148092148093148094148095148096148097148098148099148100148101148102148103148104148105148106148107148108148109148110148111148112148113148114148115148116148117148118148119148120148121148122148123148124148125148126148127148128148129148130148131148132148133148134148135148136148137148138148139148140148141148142148143148144148145148146148147148148148149148150148151148152148153148154148155148156148157148158148159148160148161148162148163148164148165148166148167148168148169148170148171148172148173148174148175148176148177148178148179148180148181148182148183148184148185148186148187148188148189148190148191148192148193148194148195148196148197148198148199148200148201148202148203148204148205148206148207148208148209148210148211148212148213148214148215148216148217148218148219148220148221148222148223148224148225148226148227148228148229148230148231148232148233148234148235148236148237148238148239148240148241148242148243148244148245148246148247148248148249148250148251148252148253148254148255148256148257148258148259148260148261148262148263148264148265148266148267148268148269148270148271148272148273148274148275148276148277148278148279148280148281148282148283148284148285148286148287148288148289148290148291148292148293148294148295148296148297148298148299148300148301148302148303148304148305148306148307148308148309148310148311148312148313148314148315148316148317148318148319148320148321148322148323148324148325148326148327148328148329148330148331148332148333148334148335148336148337148338148339148340148341148342148343148344148345148346148347148348148349148350148351148352148353148354148355148356148357148358148359148360148361148362148363148364148365148366148367148368148369148370148371148372148373148374148375148376148377148378148379148380148381148382148383148384148385148386148387148388148389148390148391148392148393148394148395148396148397148398148399148400148401148402148403148404148405148406148407148408148409148410148411148412148413148414148415148416148417148418148419148420148421148422148423148424148425148426148427148428148429148430148431148432148433148434148435148436148437148438148439148440148441148442148443148444148445148446148447148448148449148450148451148452148453148454148455148456148457148458148459148460148461148462148463148464148465148466148467148468148469148470148471148472148473148474148475148476148477148478148479148480148481148482148483148484148485148486148487148488148489148490148491148492148493148494148495148496148497148498148499148500148501148502148503148504148505148506148507148508148509148510148511148512148513148514148515148516148517148518148519148520148521148522148523148524148525148526148527148528148529148530148531148532148533148534148535148536148537148538148539148540148541148542148543148544148545148546148547148548148549148550148551148552148553148554148555148556148557148558148559148560148561148562148563148564148565148566148567148568148569148570148571148572148573148574148575148576148577148578148579148580148581148582148583148584148585148586148587148588148589148590148591148592148593148594148595148596148597148598148599148600148601148602148603148604148605148606148607148608148609148610148611148612148613148614148615148616148617148618148619148620148621148622148623148624148625148626148627148628148629148630148631148632148633148634148635148636148637148638148639148640148641148642148643148644148645148646148647148648148649148650148651148652148653148654148655148656148657148658148659148660148661148662148663148664148665148666148667148668148669148670148671148672148673148674148675148676148677148678148679148680148681148682148683148684148685148686148687148688148689148690148691148692148693148694148695148696148697148698148699148700148701148702148703148704148705148706148707148708148709148710148711148712148713148714148715148716148717148718148719148720148721148722148723148724148725148726148727148728148729148730148731148732148733148734148735148736148737148738148739148740148741148742148743148744148745148746148747148748148749148750148751148752148753148754148755148756148757148758148759148760148761148762148763148764148765148766148767148768148769148770148771148772148773148774148775148776148777148778148779148780148781148782148783148784148785148786148787148788148789148790148791148792148793148794148795148796148797148798148799148800148801148802148803148804148805148806148807148808148809148810148811148812148813148814148815148816148817148818148819148820148821148822148823148824148825148826148827148828148829148830148831148832148833148834148835148836148837148838148839148840148841148842148843148844148845148846148847148848148849148850148851148852148853148854148855148856148857148858148859148860148861148862148863148864148865148866148867148868148869148870148871148872148873148874148875148876148877148878148879148880148881148882148883148884148885148886148887148888148889148890148891148892148893148894148895148896148897148898148899148900148901148902148903148904148905148906148907148908148909148910148911148912148913148914148915148916148917148918148919148920148921148922148923148924148925148926148927148928148929148930148931148932148933148934148935148936148937148938148939148940148941148942148943148944148945148946148947148948148949148950148951148952148953148954148955148956148957148958148959148960148961148962148963148964148965148966148967148968148969148970148971148972148973148974148975148976148977148978148979148980148981148982148983148984148985148986148987148988148989148990148991148992148993148994148995148996148997148998148999149000149001149002149003149004149005149006149007149008149009149010149011149012149013149014149015149016149017149018149019149020149021149022149023149024149025149026149027149028149029149030149031149032149033149034149035149036149037149038149039149040149041149042149043149044149045149046149047149048149049149050149051149052149053149054149055149056149057149058149059149060149061149062149063149064149065149066149067149068149069149070149071149072149073149074149075149076149077149078149079149080149081149082149083149084149085149086149087149088149089149090149091149092149093149094149095149096149097149098149099149100149101149102149103149104149105149106149107149108149109149110149111149112149113149114149115149116149117149118149119149120149121149122149123149124149125149126149127149128149129149130149131149132149133149134149135149136149137149138149139149140149141149142149143149144149145149146149147149148149149149150149151149152149153149154149155149156149157149158149159149160149161149162149163149164149165149166149167149168149169149170149171149172149173149174149175149176149177149178149179149180149181149182149183149184149185149186149187149188149189149190149191149192149193149194149195149196149197149198149199149200149201149202149203149204149205149206149207149208149209149210149211149212149213149214149215149216149217149218149219149220149221149222149223149224149225149226149227149228149229149230149231149232149233149234149235149236149237149238149239149240149241149242149243149244149245149246149247149248149249149250149251149252149253149254149255149256149257149258149259149260149261149262149263149264149265149266149267149268149269149270149271149272149273149274149275149276149277149278149279149280149281149282149283149284149285149286149287149288149289149290149291149292149293149294149295149296149297149298149299149300149301149302149303149304149305149306149307149308149309149310149311149312149313149314149315149316149317149318149319149320149321149322149323149324149325149326149327149328149329149330149331149332149333149334149335149336149337149338149339149340149341149342149343149344149345149346149347149348149349149350149351149352149353149354149355149356149357149358149359149360149361149362149363149364149365149366149367149368149369149370149371149372149373149374149375149376149377149378149379149380149381149382149383149384149385149386149387149388149389149390149391149392149393149394149395149396149397149398149399149400149401149402149403149404149405149406149407149408149409149410149411149412149413149414149415149416149417149418149419149420149421149422149423149424149425149426149427149428149429149430149431149432149433149434149435149436149437149438149439149440149441149442149443149444149445149446149447149448149449149450149451149452149453149454149455149456149457149458149459149460149461149462149463149464149465149466149467149468149469149470149471149472149473149474149475149476149477149478149479149480149481149482149483149484149485149486149487149488149489149490149491149492149493149494149495149496149497149498149499149500149501149502149503149504149505149506149507149508149509149510149511149512149513149514149515149516149517149518149519149520149521149522149523149524149525149526149527149528149529149530149531149532149533149534149535149536149537149538149539149540149541149542149543149544149545149546149547149548149549149550149551149552149553149554149555149556149557149558149559149560149561149562149563149564149565149566149567149568149569149570149571149572149573149574149575149576149577149578149579149580149581149582149583149584149585149586149587149588149589149590149591149592149593149594149595149596149597149598149599149600149601149602149603149604149605149606149607149608149609149610149611149612149613149614149615149616149617149618149619149620149621149622149623149624149625149626149627149628149629149630149631149632149633149634149635149636149637149638149639149640149641149642149643149644149645149646149647149648149649149650149651149652149653149654149655149656149657149658149659149660149661149662149663149664149665149666149667149668149669149670149671149672149673149674149675149676149677149678149679149680149681149682149683149684149685149686149687149688149689149690149691149692149693149694149695149696149697149698149699149700149701149702149703149704149705149706149707149708149709149710149711149712149713149714149715149716149717149718149719149720149721149722149723149724149725149726149727149728149729149730149731149732149733149734149735149736149737149738149739149740149741149742149743149744149745149746149747149748149749149750149751149752149753149754149755149756149757149758149759149760149761149762149763149764149765149766149767149768149769149770149771149772149773149774149775149776149777149778149779149780149781149782149783149784149785149786149787149788149789149790149791149792149793149794149795149796149797149798149799149800149801149802149803149804149805149806149807149808149809149810149811149812149813149814149815149816149817149818149819149820149821149822149823149824149825149826149827149828149829149830149831149832149833149834149835149836149837149838149839149840149841149842149843149844149845149846149847149848149849149850149851149852149853149854149855149856149857149858149859149860149861149862149863149864149865149866149867149868149869149870149871149872149873149874149875149876149877149878149879149880149881149882149883149884149885149886149887149888149889149890149891149892149893149894149895149896149897149898149899149900149901149902149903149904149905149906149907149908149909149910149911149912149913149914149915149916149917149918149919149920149921149922149923149924149925149926149927149928149929149930149931149932149933149934149935149936149937149938149939149940149941149942149943149944149945149946149947149948149949149950149951149952149953149954149955149956149957149958149959149960149961149962149963149964149965149966149967149968149969149970149971149972149973149974149975149976149977149978149979149980149981149982149983149984149985149986149987149988149989149990149991149992149993149994149995149996149997149998149999150000150001150002150003150004150005150006150007150008150009150010150011150012150013150014150015150016150017150018150019150020150021150022150023150024150025150026150027150028150029150030150031150032150033150034150035150036150037150038150039150040150041150042150043150044150045150046150047150048150049150050150051150052150053150054150055150056150057150058150059150060150061150062150063150064150065150066150067150068150069150070150071150072150073150074150075150076150077150078150079150080150081150082150083150084150085150086150087150088150089150090150091150092150093150094150095150096150097150098150099150100150101150102150103150104150105150106150107150108150109150110150111150112150113150114150115150116150117150118150119150120150121150122150123150124150125150126150127150128150129150130150131150132150133150134150135150136150137150138150139150140150141150142150143150144150145150146150147150148150149150150150151150152150153150154150155150156150157150158150159150160150161150162150163150164150165150166150167150168150169150170150171150172150173150174150175150176150177150178150179150180150181150182150183150184150185150186150187150188150189150190150191150192150193150194150195150196150197150198150199150200150201150202150203150204150205150206150207150208150209150210150211150212150213150214150215150216150217150218150219150220150221150222150223150224150225150226150227150228150229150230150231150232150233150234150235150236150237150238150239150240150241150242150243150244150245150246150247150248150249150250150251150252150253150254150255150256150257150258150259150260150261150262150263150264150265150266150267150268150269150270150271150272150273150274150275150276150277150278150279150280150281150282150283150284150285150286150287150288150289150290150291150292150293150294150295150296150297150298150299150300150301150302150303150304150305150306150307150308150309150310150311150312150313150314150315150316150317150318150319150320150321150322150323150324150325150326150327150328150329150330150331150332150333150334150335150336150337150338150339150340150341150342150343150344150345150346150347150348150349150350150351150352150353150354150355150356150357150358150359150360150361150362150363150364150365150366150367150368150369150370150371150372150373150374150375150376150377150378150379150380150381150382150383150384150385150386150387150388150389150390150391150392150393150394150395150396150397150398150399150400150401150402150403150404150405150406150407150408150409150410150411150412150413150414150415150416150417150418150419150420150421150422150423150424150425150426150427150428150429150430150431150432150433150434150435150436150437150438150439150440150441150442150443150444150445150446150447150448150449150450150451150452150453150454150455150456150457150458150459150460150461150462150463150464150465150466150467150468150469150470150471150472150473150474150475150476150477150478150479150480150481150482150483150484150485150486150487150488150489150490150491150492150493150494150495150496150497150498150499150500150501150502150503150504150505150506150507150508150509150510150511150512150513150514150515150516150517150518150519150520150521150522150523150524150525150526150527150528150529150530150531150532150533150534150535150536150537150538150539150540150541150542150543150544150545150546150547150548150549150550150551150552150553150554150555150556150557150558150559150560150561150562150563150564150565150566150567150568150569150570150571150572150573150574150575150576150577150578150579150580150581150582150583150584150585150586150587150588150589150590150591150592150593150594150595150596150597150598150599150600150601150602150603150604150605150606150607150608150609150610150611150612150613150614150615150616150617150618150619150620150621150622150623150624150625150626150627150628150629150630150631150632150633150634150635150636150637150638150639150640150641150642150643150644150645150646150647150648150649150650150651150652150653150654150655150656150657150658150659150660150661150662150663150664150665150666150667150668150669150670150671150672150673150674150675150676150677150678150679150680150681150682150683150684150685150686150687150688150689150690150691150692150693150694150695150696150697150698150699150700150701150702150703150704150705150706150707150708150709150710150711150712150713150714150715150716150717150718150719150720150721150722150723150724150725150726150727150728150729150730150731150732150733150734150735150736150737150738150739150740150741150742150743150744150745150746150747150748150749150750150751150752150753150754150755150756150757150758150759150760150761150762150763150764150765150766150767150768150769150770150771150772150773150774150775150776150777150778150779150780150781150782150783150784150785150786150787150788150789150790150791150792150793150794150795150796150797150798150799150800150801150802150803150804150805150806150807150808150809150810150811150812150813150814150815150816150817150818150819150820150821150822150823150824150825150826150827150828150829150830150831150832150833150834150835150836150837150838150839150840150841150842150843150844150845150846150847150848150849150850150851150852150853150854150855150856150857150858150859150860150861150862150863150864150865150866150867150868150869150870150871150872150873150874150875150876150877150878150879150880150881150882150883150884150885150886150887150888150889150890150891150892150893150894150895150896150897150898150899150900150901150902150903150904150905150906150907150908150909150910150911150912150913150914150915150916150917150918150919150920150921150922150923150924150925150926150927150928150929150930150931150932150933150934150935150936150937150938150939150940150941150942150943150944150945150946150947150948150949150950150951150952150953150954150955150956150957150958150959150960150961150962150963150964150965150966150967150968150969150970150971150972150973150974150975150976150977150978150979150980150981150982150983150984150985150986150987150988150989150990150991150992150993150994150995150996150997150998150999151000151001151002151003151004151005151006151007151008151009151010151011151012151013151014151015151016151017151018151019151020151021151022151023151024151025151026151027151028151029151030151031151032151033151034151035151036151037151038151039151040151041151042151043151044151045151046151047151048151049151050151051151052151053151054151055151056151057151058151059151060151061151062151063151064151065151066151067151068151069151070151071151072151073151074151075151076151077151078151079151080151081151082151083151084151085151086151087151088151089151090151091151092151093151094151095151096151097151098151099151100151101151102151103151104151105151106151107151108151109151110151111151112151113151114151115151116151117151118151119151120151121151122151123151124151125151126151127151128151129151130151131151132151133151134151135151136151137151138151139151140151141151142151143151144151145151146151147151148151149151150151151151152151153151154151155151156151157151158151159151160151161151162151163151164151165151166151167151168151169151170151171151172151173151174151175151176151177151178151179151180151181151182151183151184151185151186151187151188151189151190151191151192151193151194151195151196151197151198151199151200151201151202151203151204151205151206151207151208151209151210151211151212151213151214151215151216151217151218151219151220151221151222151223151224151225151226151227151228151229151230151231151232151233151234151235151236151237151238151239151240151241151242151243151244151245151246151247151248151249151250151251151252151253151254151255151256151257151258151259151260151261151262151263151264151265151266151267151268151269151270151271151272151273151274151275151276151277151278151279151280151281151282151283151284151285151286151287151288151289151290151291151292151293151294151295151296151297151298151299151300151301151302151303151304151305151306151307151308151309151310151311151312151313151314151315151316151317151318151319151320151321151322151323151324151325151326151327151328151329151330151331151332151333151334151335151336151337151338151339151340151341151342151343151344151345151346151347151348151349151350151351151352151353151354151355151356151357151358151359151360151361151362151363151364151365151366151367151368151369151370151371151372151373151374151375151376151377151378151379151380151381151382151383151384151385151386151387151388151389151390151391151392151393151394151395151396151397151398151399151400151401151402151403151404151405151406151407151408151409151410151411151412151413151414151415151416151417151418151419151420151421151422151423151424151425151426151427151428151429151430151431151432151433151434151435151436151437151438151439151440151441151442151443151444151445151446151447151448151449151450151451151452151453151454151455151456151457151458151459151460151461151462151463151464151465151466151467151468151469151470151471151472151473151474151475151476151477151478151479151480151481151482151483151484151485151486151487151488151489151490151491151492151493151494151495151496151497151498151499151500151501151502151503151504151505151506151507151508151509151510151511151512151513151514151515151516151517151518151519151520151521151522151523151524151525151526151527151528151529151530151531151532151533151534151535151536151537151538151539151540151541151542151543151544151545151546151547151548151549151550151551151552151553151554151555151556151557151558151559151560151561151562151563151564151565151566151567151568151569151570151571151572151573151574151575151576151577151578151579151580151581151582151583151584151585151586151587151588151589151590151591151592151593151594151595151596151597151598151599151600151601151602151603151604151605151606151607151608151609151610151611151612151613151614151615151616151617151618151619151620151621151622151623151624151625151626151627151628151629151630151631151632151633151634151635151636151637151638151639151640151641151642151643151644151645151646151647151648151649151650151651151652151653151654151655151656151657151658151659151660151661151662151663151664151665151666151667151668151669151670151671151672151673151674151675151676151677151678151679151680151681151682151683151684151685151686151687151688151689151690151691151692151693151694151695151696151697151698151699151700151701151702151703151704151705151706151707151708151709151710151711151712151713151714151715151716151717151718151719151720151721151722151723151724151725151726151727151728151729151730151731151732151733151734151735151736151737151738151739151740151741151742151743151744151745151746151747151748151749151750151751151752151753151754151755151756151757151758151759151760151761151762151763151764151765151766151767151768151769151770151771151772151773151774151775151776151777151778151779151780151781151782151783151784151785151786151787151788151789151790151791151792151793151794151795151796151797151798151799151800151801151802151803151804151805151806151807151808151809151810151811151812151813151814151815151816151817151818151819151820151821151822151823151824151825151826151827151828151829151830151831151832151833151834151835151836151837151838151839151840151841151842151843151844151845151846151847151848151849151850151851151852151853151854151855151856151857151858151859151860151861151862151863151864151865151866151867151868151869151870151871151872151873151874151875151876151877151878151879151880151881151882151883151884151885151886151887151888151889151890151891151892151893151894151895151896151897151898151899151900151901151902151903151904151905151906151907151908151909151910151911151912151913151914151915151916151917151918151919151920151921151922151923151924151925151926151927151928151929151930151931151932151933151934151935151936151937151938151939151940151941151942151943151944151945151946151947151948151949151950151951151952151953151954151955151956151957151958151959151960151961151962151963151964151965151966151967151968151969151970151971151972151973151974151975151976151977151978151979151980151981151982151983151984151985151986151987151988151989151990151991151992151993151994151995151996151997151998151999152000152001152002152003152004152005152006152007152008152009152010152011152012152013152014152015152016152017152018152019152020152021152022152023152024152025152026152027152028152029152030152031152032152033152034152035152036152037152038152039152040152041152042152043152044152045152046152047152048152049152050152051152052152053152054152055152056152057152058152059152060152061152062152063152064152065152066152067152068152069152070152071152072152073152074152075152076152077152078152079152080152081152082152083152084152085152086152087152088152089152090152091152092152093152094152095152096152097152098152099152100152101152102152103152104152105152106152107152108152109152110152111152112152113152114152115152116152117152118152119152120152121152122152123152124152125152126152127152128152129152130152131152132152133152134152135152136152137152138152139152140152141152142152143152144152145152146152147152148152149152150152151152152152153152154152155152156152157152158152159152160152161152162152163152164152165152166152167152168152169152170152171152172152173152174152175152176152177152178152179152180152181152182152183152184152185152186152187152188152189152190152191152192152193152194152195152196152197152198152199152200152201152202152203152204152205152206152207152208152209152210152211152212152213152214152215152216152217152218152219152220152221152222152223152224152225152226152227152228152229152230152231152232152233152234152235152236152237152238152239152240152241152242152243152244152245152246152247152248152249152250152251152252152253152254152255152256152257152258152259152260152261152262152263152264152265152266152267152268152269152270152271152272152273152274152275152276152277152278152279152280152281152282152283152284152285152286152287152288152289152290152291152292152293152294152295152296152297152298152299152300152301152302152303152304152305152306152307152308152309152310152311152312152313152314152315152316152317152318152319152320152321152322152323152324152325152326152327152328152329152330152331152332152333152334152335152336152337152338152339152340152341152342152343152344152345152346152347152348152349152350152351152352152353152354152355152356152357152358152359152360152361152362152363152364152365152366152367152368152369152370152371152372152373152374152375152376152377152378152379152380152381152382152383152384152385152386152387152388152389152390152391152392152393152394152395152396152397152398152399152400152401152402152403152404152405152406152407152408152409152410152411152412152413152414152415152416152417152418152419152420152421152422152423152424152425152426152427152428152429152430152431152432152433152434152435152436152437152438152439152440152441152442152443152444152445152446152447152448152449152450152451152452152453152454152455152456152457152458152459152460152461152462152463152464152465152466152467152468152469152470152471152472152473152474152475152476152477152478152479152480152481152482152483152484152485152486152487152488152489152490152491152492152493152494152495152496152497152498152499152500152501152502152503152504152505152506152507152508152509152510152511152512152513152514152515152516152517152518152519152520152521152522152523152524152525152526152527152528152529152530152531152532152533152534152535152536152537152538152539152540152541152542152543152544152545152546152547152548152549152550152551152552152553152554152555152556152557152558152559152560152561152562152563152564152565152566152567152568152569152570152571152572152573152574152575152576152577152578152579152580152581152582152583152584152585152586152587152588152589152590152591152592152593152594152595152596152597152598152599152600152601152602152603152604152605152606152607152608152609152610152611152612152613152614152615152616152617152618152619152620152621152622152623152624152625152626152627152628152629152630152631152632152633152634152635152636152637152638152639152640152641152642152643152644152645152646152647152648152649152650152651152652152653152654152655152656152657152658152659152660152661152662152663152664152665152666152667152668152669152670152671152672152673152674152675152676152677152678152679152680152681152682152683152684152685152686152687152688152689152690152691152692152693152694152695152696152697152698152699152700152701152702152703152704152705152706152707152708152709152710152711152712152713152714152715152716152717152718152719152720152721152722152723152724152725152726152727152728152729152730152731152732152733152734152735152736152737152738152739152740152741152742152743152744152745152746152747152748152749152750152751152752152753152754152755152756152757152758152759152760152761152762152763152764152765152766152767152768152769152770152771152772152773152774152775152776152777152778152779152780152781152782152783152784152785152786152787152788152789152790152791152792152793152794152795152796152797152798152799152800152801152802152803152804152805152806152807152808152809152810152811152812152813152814152815152816152817152818152819152820152821152822152823152824152825152826152827152828152829152830152831152832152833152834152835152836152837152838152839152840152841152842152843152844152845152846152847152848152849152850152851152852152853152854152855152856152857152858152859152860152861152862152863152864152865152866152867152868152869152870152871152872152873152874152875152876152877152878152879152880152881152882152883152884152885152886152887152888152889152890152891152892152893152894152895152896152897152898152899152900152901152902152903152904152905152906152907152908152909152910152911152912152913152914152915152916152917152918152919152920152921152922152923152924152925152926152927152928152929152930152931152932152933152934152935152936152937152938152939152940152941152942152943152944152945152946152947152948152949152950152951152952152953152954152955152956152957152958152959152960152961152962152963152964152965152966152967152968152969152970152971152972152973152974152975152976152977152978152979152980152981152982152983152984152985152986152987152988152989152990152991152992152993152994152995152996152997152998152999153000153001153002153003153004153005153006153007153008153009153010153011153012153013153014153015153016153017153018153019153020153021153022153023153024153025153026153027153028153029153030153031153032153033153034153035153036153037153038153039153040153041153042153043153044153045153046153047153048153049153050153051153052153053153054153055153056153057153058153059153060153061153062153063153064153065153066153067153068153069153070153071153072153073153074153075153076153077153078153079153080153081153082153083153084153085153086153087153088153089153090153091153092153093153094153095153096153097153098153099153100153101153102153103153104153105153106153107153108153109153110153111153112153113153114153115153116153117153118153119153120153121153122153123153124153125153126153127153128153129153130153131153132153133153134153135153136153137153138153139153140153141153142153143153144153145153146153147153148153149153150153151153152153153153154153155153156153157153158153159153160153161153162153163153164153165153166153167153168153169153170153171153172153173153174153175153176153177153178153179153180153181153182153183153184153185153186153187153188153189153190153191153192153193153194153195153196153197153198153199153200153201153202153203153204153205153206153207153208153209153210153211153212153213153214153215153216153217153218153219153220153221153222153223153224153225153226153227153228153229153230153231153232153233153234153235153236153237153238153239153240153241153242153243153244153245153246153247153248153249153250153251153252153253153254153255153256153257153258153259153260153261153262153263153264153265153266153267153268153269153270153271153272153273153274153275153276153277153278153279153280153281153282153283153284153285153286153287153288153289153290153291153292153293153294153295153296153297153298153299153300153301153302153303153304153305153306153307153308153309153310153311153312153313153314153315153316153317153318153319153320153321153322153323153324153325153326153327153328153329153330153331153332153333153334153335153336153337153338153339153340153341153342153343153344153345153346153347153348153349153350153351153352153353153354153355153356153357153358153359153360153361153362153363153364153365153366153367153368153369153370153371153372153373153374153375153376153377153378153379153380153381153382153383153384153385153386153387153388153389153390153391153392153393153394153395153396153397153398153399153400153401153402153403153404153405153406153407153408153409153410153411153412153413153414153415153416153417153418153419153420153421153422153423153424153425153426153427153428153429153430153431153432153433153434153435153436153437153438153439153440153441153442153443153444153445153446153447153448153449153450153451153452153453153454153455153456153457153458153459153460153461153462153463153464153465153466153467153468153469153470153471153472153473153474153475153476153477153478153479153480153481153482153483153484153485153486153487153488153489153490153491153492153493153494153495153496153497153498153499153500153501153502153503153504153505153506153507153508153509153510153511153512153513153514153515153516153517153518153519153520153521153522153523153524153525153526153527153528153529153530153531153532153533153534153535153536153537153538153539153540153541153542153543153544153545153546153547153548153549153550153551153552153553153554153555153556153557153558153559153560153561153562153563153564153565153566153567153568153569153570153571153572153573153574153575153576153577153578153579153580153581153582153583153584153585153586153587153588153589153590153591153592153593153594153595153596153597153598153599153600153601153602153603153604153605153606153607153608153609153610153611153612153613153614153615153616153617153618153619153620153621153622153623153624153625153626153627153628153629153630153631153632153633153634153635153636153637153638153639153640153641153642153643153644153645153646153647153648153649153650153651153652153653153654153655153656153657153658153659153660153661153662153663153664153665153666153667153668153669153670153671153672153673153674153675153676153677153678153679153680153681153682153683153684153685153686153687153688153689153690153691153692153693153694153695153696153697153698153699153700153701153702153703153704153705153706153707153708153709153710153711153712153713153714153715153716153717153718153719153720153721153722153723153724153725153726153727153728153729153730153731153732153733153734153735153736153737153738153739153740153741153742153743153744153745153746153747153748153749153750153751153752153753153754153755153756153757153758153759153760153761153762153763153764153765153766153767153768153769153770153771153772153773153774153775153776153777153778153779153780153781153782153783153784153785153786153787153788153789153790153791153792153793153794153795153796153797153798153799153800153801153802153803153804153805153806153807153808153809153810153811153812153813153814153815153816153817153818153819153820153821153822153823153824153825153826153827153828153829153830153831153832153833153834153835153836153837153838153839153840153841153842153843153844153845153846153847153848153849153850153851153852153853153854153855153856153857153858153859153860153861153862153863153864153865153866153867153868153869153870153871153872153873153874153875153876153877153878153879153880153881153882153883153884153885153886153887153888153889153890153891153892153893153894153895153896153897153898153899153900153901153902153903153904153905153906153907153908153909153910153911153912153913153914153915153916153917153918153919153920153921153922153923153924153925153926153927153928153929153930153931153932153933153934153935153936153937153938153939153940153941153942153943153944153945153946153947153948153949153950153951153952153953153954153955153956153957153958153959153960153961153962153963153964153965153966153967153968153969153970153971153972153973153974153975153976153977153978153979153980153981153982153983153984153985153986153987153988153989153990153991153992153993153994153995153996153997153998153999154000154001154002154003154004154005154006154007154008154009154010154011154012154013154014154015154016154017154018154019154020154021154022154023154024154025154026154027154028154029154030154031154032154033154034154035154036154037154038154039154040154041154042154043154044154045154046154047154048154049154050154051154052154053154054154055154056154057154058154059154060154061154062154063154064154065154066154067154068154069154070154071154072154073154074154075154076154077154078154079154080154081154082154083154084154085154086154087154088154089154090154091154092154093154094154095154096154097154098154099154100154101154102154103154104154105154106154107154108154109154110154111154112154113154114154115154116154117154118154119154120154121154122154123154124154125154126154127154128154129154130154131154132154133154134154135154136154137154138154139154140154141154142154143154144154145154146154147154148154149154150154151154152154153154154154155154156154157154158154159154160154161154162154163154164154165154166154167154168154169154170154171154172154173154174154175154176154177154178154179154180154181154182154183154184154185154186154187154188154189154190154191154192154193154194154195154196154197154198154199154200154201154202154203154204154205154206154207154208154209154210154211154212154213154214154215154216154217154218154219154220154221154222154223154224154225154226154227154228154229154230154231154232154233154234154235154236154237154238154239154240154241154242154243154244154245154246154247154248154249154250154251154252154253154254154255154256154257154258154259154260154261154262154263154264154265154266154267154268154269154270154271154272154273154274154275154276154277154278154279154280154281154282154283154284154285154286154287154288154289154290154291154292154293154294154295154296154297154298154299154300154301154302154303154304154305154306154307154308154309154310154311154312154313154314154315154316154317154318154319154320154321154322154323154324154325154326154327154328154329154330154331154332154333154334154335154336154337154338154339154340154341154342154343154344154345154346154347154348154349154350154351154352154353154354154355154356154357154358154359154360154361154362154363154364154365154366154367154368154369154370154371154372154373154374154375154376154377154378154379154380154381154382154383154384154385154386154387154388154389154390154391154392154393154394154395154396154397154398154399154400154401154402154403154404154405154406154407154408154409154410154411154412154413154414154415154416154417154418154419154420154421154422154423154424154425154426154427154428154429154430154431154432154433154434154435154436154437154438154439154440154441154442154443154444154445154446154447154448154449154450154451154452154453154454154455154456154457154458154459154460154461154462154463154464154465154466154467154468154469154470154471154472154473154474154475154476154477154478154479154480154481154482154483154484154485154486154487154488154489154490154491154492154493154494154495154496154497154498154499154500154501154502154503154504154505154506154507154508154509154510154511154512154513154514154515154516154517154518154519154520154521154522154523154524154525154526154527154528154529154530154531154532154533154534154535154536154537154538154539154540154541154542154543154544154545154546154547154548154549154550154551154552154553154554154555154556154557154558154559154560154561154562154563154564154565154566154567154568154569154570154571154572154573154574154575154576154577154578154579154580154581154582154583154584154585154586154587154588154589154590154591154592154593154594154595154596154597154598154599154600154601154602154603154604154605154606154607154608154609154610154611154612154613154614154615154616154617154618154619154620154621154622154623154624154625154626154627154628154629154630154631154632154633154634154635154636154637154638154639154640154641154642154643154644154645154646154647154648154649154650154651154652154653154654154655154656154657154658154659154660154661154662154663154664154665154666154667154668154669154670154671154672154673154674154675154676154677154678154679154680154681154682154683154684154685154686154687154688154689154690154691154692154693154694154695154696154697154698154699154700154701154702154703154704154705154706154707154708154709154710154711154712154713154714154715154716154717154718154719154720154721154722154723154724154725154726154727154728154729154730154731154732154733154734154735154736154737154738154739154740154741154742154743154744154745154746154747154748154749154750154751154752154753154754154755154756154757154758154759154760154761154762154763154764154765154766154767154768154769154770154771154772154773154774154775154776154777154778154779154780154781154782154783154784154785154786154787154788154789154790154791154792154793154794154795154796154797154798154799154800154801154802154803154804154805154806154807154808154809154810154811154812154813154814154815154816154817154818154819154820154821154822154823154824154825154826154827154828154829154830154831154832154833154834154835154836154837154838154839154840154841154842154843154844154845154846154847154848154849154850154851154852154853154854154855154856154857154858154859154860154861154862154863154864154865154866154867154868154869154870154871154872154873154874154875154876154877154878154879154880154881154882154883154884154885154886154887154888154889154890154891154892154893154894154895154896154897154898154899154900154901154902154903154904154905154906154907154908154909154910154911154912154913154914154915154916154917154918154919154920154921154922154923154924154925154926154927154928154929154930154931154932154933154934154935154936154937154938154939154940154941154942154943154944154945154946154947154948154949154950154951154952154953154954154955154956154957154958154959154960154961154962154963154964154965154966154967154968154969154970154971154972154973154974154975154976154977154978154979154980154981154982154983154984154985154986154987154988154989154990154991154992154993154994154995154996154997154998154999155000155001155002155003155004155005155006155007155008155009155010155011155012155013155014155015155016155017155018155019155020155021155022155023155024155025155026155027155028155029155030155031155032155033155034155035155036155037155038155039155040155041155042155043155044155045155046155047155048155049155050155051155052155053155054155055155056155057155058155059155060155061155062155063155064155065155066155067155068155069155070155071155072155073155074155075155076155077155078155079155080155081155082155083155084155085155086155087155088155089155090155091155092155093155094155095155096155097155098155099155100155101155102155103155104155105155106155107155108155109155110155111155112155113155114155115155116155117155118155119155120155121155122155123155124155125155126155127155128155129155130155131155132155133155134155135155136155137155138155139155140155141155142155143155144155145155146155147155148155149155150155151155152155153155154155155155156155157155158155159155160155161155162155163155164155165155166155167155168155169155170155171155172155173155174155175155176155177155178155179155180155181155182155183155184155185155186155187155188155189155190155191155192155193155194155195155196155197155198155199155200155201155202155203155204155205155206155207155208155209155210155211155212155213155214155215155216155217155218155219155220155221155222155223155224155225155226155227155228155229155230155231155232155233155234155235155236155237155238155239155240155241155242155243155244155245155246155247155248155249155250155251155252155253155254155255155256155257155258155259155260155261155262155263155264155265155266155267155268155269155270155271155272155273155274155275155276155277155278155279155280155281155282155283155284155285155286155287155288155289155290155291155292155293155294155295155296155297155298155299155300155301155302155303155304155305155306155307155308155309155310155311155312155313155314155315155316155317155318155319155320155321155322155323155324155325155326155327155328155329155330155331155332155333155334155335155336155337155338155339155340155341155342155343155344155345155346155347155348155349155350155351155352155353155354155355155356155357155358155359155360155361155362155363155364155365155366155367155368155369155370155371155372155373155374155375155376155377155378155379155380155381155382155383155384155385155386155387155388155389155390155391155392155393155394155395155396155397155398155399155400155401155402155403155404155405155406155407155408155409155410155411155412155413155414155415155416155417155418155419155420155421155422155423155424155425155426155427155428155429155430155431155432155433155434155435155436155437155438155439155440155441155442155443155444155445155446155447155448155449155450155451155452155453155454155455155456155457155458155459155460155461155462155463155464155465155466155467155468155469155470155471155472155473155474155475155476155477155478155479155480155481155482155483155484155485155486155487155488155489155490155491155492155493155494155495155496155497155498155499155500155501155502155503155504155505155506155507155508155509155510155511155512155513155514155515155516155517155518155519155520155521155522155523155524155525155526155527155528155529155530155531155532155533155534155535155536155537155538155539155540155541155542155543155544155545155546155547155548155549155550155551155552155553155554155555155556155557155558155559155560155561155562155563155564155565155566155567155568155569155570155571155572155573155574155575155576155577155578155579155580155581155582155583155584155585155586155587155588155589155590155591155592155593155594155595155596155597155598155599155600155601155602155603155604155605155606155607155608155609155610155611155612155613155614155615155616155617155618155619155620155621155622155623155624155625155626155627155628155629155630155631155632155633155634155635155636155637155638155639155640155641155642155643155644155645155646155647155648155649155650155651155652155653155654155655155656155657155658155659155660155661155662155663155664155665155666155667155668155669155670155671155672155673155674155675155676155677155678155679155680155681155682155683155684155685155686155687155688155689155690155691155692155693155694155695155696155697155698155699155700155701155702155703155704155705155706155707155708155709155710155711155712155713155714155715155716155717155718155719155720155721155722155723155724155725155726155727155728155729155730155731155732155733155734155735155736155737155738155739155740155741155742155743155744155745155746155747155748155749155750155751155752155753155754155755155756155757155758155759155760155761155762155763155764155765155766155767155768155769155770155771155772155773155774155775155776155777155778155779155780155781155782155783155784155785155786155787155788155789155790155791155792155793155794155795155796155797155798155799155800155801155802155803155804155805155806155807155808155809155810155811155812155813155814155815155816155817155818155819155820155821155822155823155824155825155826155827155828155829155830155831155832155833155834155835155836155837155838155839155840155841155842155843155844155845155846155847155848155849155850155851155852155853155854155855155856155857155858155859155860155861155862155863155864155865155866155867155868155869155870155871155872155873155874155875155876155877155878155879155880155881155882155883155884155885155886155887155888155889155890155891155892155893155894155895155896155897155898155899155900155901155902155903155904155905155906155907155908155909155910155911155912155913155914155915155916155917155918155919155920155921155922155923155924155925155926155927155928155929155930155931155932155933155934155935155936155937155938155939155940155941155942155943155944155945155946155947155948155949155950155951155952155953155954155955155956155957155958155959155960155961155962155963155964155965155966155967155968155969155970155971155972155973155974155975155976155977155978155979155980155981155982155983155984155985155986155987155988155989155990155991155992155993155994155995155996155997155998155999156000156001156002156003156004156005156006156007156008156009156010156011156012156013156014156015156016156017156018156019156020156021156022156023156024156025156026156027156028156029156030156031156032156033156034156035156036156037156038156039156040156041156042156043156044156045156046156047156048156049156050156051156052156053156054156055156056156057156058156059156060156061156062156063156064156065156066156067156068156069156070156071156072156073156074156075156076156077156078156079156080156081156082156083156084156085156086156087156088156089156090156091156092156093156094156095156096156097156098156099156100156101156102156103156104156105156106156107156108156109156110156111156112156113156114156115156116156117156118156119156120156121156122156123156124156125156126156127156128156129156130156131156132156133156134156135156136156137156138156139156140156141156142156143156144156145156146156147156148156149156150156151156152156153156154156155156156156157156158156159156160156161156162156163156164156165156166156167156168156169156170156171156172156173156174156175156176156177156178156179156180156181156182156183156184156185156186156187156188156189156190156191156192156193156194156195156196156197156198156199156200156201156202156203156204156205156206156207156208156209156210156211156212156213156214156215156216156217156218156219156220156221156222156223156224156225156226156227156228156229156230156231156232156233156234156235156236156237156238156239156240156241156242156243156244156245156246156247156248156249156250156251156252156253156254156255156256156257156258156259156260156261156262156263156264156265156266156267156268156269156270156271156272156273156274156275156276156277156278156279156280156281156282156283156284156285156286156287156288156289156290156291156292156293156294156295156296156297156298156299156300156301156302156303156304156305156306156307156308156309156310156311156312156313156314156315156316156317156318156319156320156321156322156323156324156325156326156327156328156329156330156331156332156333156334156335156336156337156338156339156340156341156342156343156344156345156346156347156348156349156350156351156352156353156354156355156356156357156358156359156360156361156362156363156364156365156366156367156368156369156370156371156372156373156374156375156376156377156378156379156380156381156382156383156384156385156386156387156388156389156390156391156392156393156394156395156396156397156398156399156400156401156402156403156404156405156406156407156408156409156410156411156412156413156414156415156416156417156418156419156420156421156422156423156424156425156426156427156428156429156430156431156432156433156434156435156436156437156438156439156440156441156442156443156444156445156446156447156448156449156450156451156452156453156454156455156456156457156458156459156460156461156462156463156464156465156466156467156468156469156470156471156472156473156474156475156476156477156478156479156480156481156482156483156484156485156486156487156488156489156490156491156492156493156494156495156496156497156498156499156500156501156502156503156504156505156506156507156508156509156510156511156512156513156514156515156516156517156518156519156520156521156522156523156524156525156526156527156528156529156530156531156532156533156534156535156536156537156538156539156540156541156542156543156544156545156546156547156548156549156550156551156552156553156554156555156556156557156558156559156560156561156562156563156564156565156566156567156568156569156570156571156572156573156574156575156576156577156578156579156580156581156582156583156584156585156586156587156588156589156590156591156592156593156594156595156596156597156598156599156600156601156602156603156604156605156606156607156608156609156610156611156612156613156614156615156616156617156618156619156620156621156622156623156624156625156626156627156628156629156630156631156632156633156634156635156636156637156638156639156640156641156642156643156644156645156646156647156648156649156650156651156652156653156654156655156656156657156658156659156660156661156662156663156664156665156666156667156668156669156670156671156672156673156674156675156676156677156678156679156680156681156682156683156684156685156686156687156688156689156690156691156692156693156694156695156696156697156698156699156700156701156702156703156704156705156706156707156708156709156710156711156712156713156714156715156716156717156718156719156720156721156722156723156724156725156726156727156728156729156730156731156732156733156734156735156736156737156738156739156740156741156742156743156744156745156746156747156748156749156750156751156752156753156754156755156756156757156758156759156760156761156762156763156764156765156766156767156768156769156770156771156772156773156774156775156776156777156778156779156780156781156782156783156784156785156786156787156788156789156790156791156792156793156794156795156796156797156798156799156800156801156802156803156804156805156806156807156808156809156810156811156812156813156814156815156816156817156818156819156820156821156822156823156824156825156826156827156828156829156830156831156832156833156834156835156836156837156838156839156840156841156842156843156844156845156846156847156848156849156850156851156852156853156854156855156856156857156858156859156860156861156862156863156864156865156866156867156868156869156870156871156872156873156874156875156876156877156878156879156880156881156882156883156884156885156886156887156888156889156890156891156892156893156894156895156896156897156898156899156900156901156902156903156904156905156906156907156908156909156910156911156912156913156914156915156916156917156918156919156920156921156922156923156924156925156926156927156928156929156930156931156932156933156934156935156936156937156938156939156940156941156942156943156944156945156946156947156948156949156950156951156952156953156954156955156956156957156958156959156960156961156962156963156964156965156966156967156968156969156970156971156972156973156974156975156976156977156978156979156980156981156982156983156984156985156986156987156988156989156990156991156992156993156994156995156996156997156998156999157000157001157002157003157004157005157006157007157008157009157010157011157012157013157014157015157016157017157018157019157020157021157022157023157024157025157026157027157028157029157030157031157032157033157034157035157036157037157038157039157040157041157042157043157044157045157046157047157048157049157050157051157052157053157054157055157056157057157058157059157060157061157062157063157064157065157066157067157068157069157070157071157072157073157074157075157076157077157078157079157080157081157082157083157084157085157086157087157088157089157090157091157092157093157094157095157096157097157098157099157100157101157102157103157104157105157106157107157108157109157110157111157112157113157114157115157116157117157118157119157120157121157122157123157124157125157126157127157128157129157130157131157132157133157134157135157136157137157138157139157140157141157142157143157144157145157146157147157148157149157150157151157152157153157154157155157156157157157158157159157160157161157162157163157164157165157166157167157168157169157170157171157172157173157174157175157176157177157178157179157180157181157182157183157184157185157186157187157188157189157190157191157192157193157194157195157196157197157198157199157200157201157202157203157204157205157206157207157208157209157210157211157212157213157214157215157216157217157218157219157220157221157222157223157224157225157226157227157228157229157230157231157232157233157234157235157236157237157238157239157240157241157242157243157244157245157246157247157248157249157250157251157252157253157254157255157256157257157258157259157260157261157262157263157264157265157266157267157268157269157270157271157272157273157274157275157276157277157278157279157280157281157282157283157284157285157286157287157288157289157290157291157292157293157294157295157296157297157298157299157300157301157302157303157304157305157306157307157308157309157310157311157312157313157314157315157316157317157318157319157320157321157322157323157324157325157326157327157328157329157330157331157332157333157334157335157336157337157338157339157340157341157342157343157344157345157346157347157348157349157350157351157352157353157354157355157356157357157358157359157360157361157362157363157364157365157366157367157368157369157370157371157372157373157374157375157376157377157378157379157380157381157382157383157384157385157386157387157388157389157390157391157392157393157394157395157396157397157398157399157400157401157402157403157404157405157406157407157408157409157410157411157412157413157414157415157416157417157418157419157420157421157422157423157424157425157426157427157428157429157430157431157432157433157434157435157436157437157438157439157440157441157442157443157444157445157446157447157448157449157450157451157452157453157454157455157456157457157458157459157460157461157462157463157464157465157466157467157468157469157470157471157472157473157474157475157476157477157478157479157480157481157482157483157484157485157486157487157488157489157490157491157492157493157494157495157496157497157498157499157500157501157502157503157504157505157506157507157508157509157510157511157512157513157514157515157516157517157518157519157520157521157522157523157524157525157526157527157528157529157530157531157532157533157534157535157536157537157538157539157540157541157542157543157544157545157546157547157548157549157550157551157552157553157554157555157556157557157558157559157560157561157562157563157564157565157566157567157568157569157570157571157572157573157574157575157576157577157578157579157580157581157582157583157584157585157586157587157588157589157590157591157592157593157594157595157596157597157598157599157600157601157602157603157604157605157606157607157608157609157610157611157612157613157614157615157616157617157618157619157620157621157622157623157624157625157626157627157628157629157630157631157632157633157634157635157636157637157638157639157640157641157642157643157644157645157646157647157648157649157650157651157652157653157654157655157656157657157658157659157660157661157662157663157664157665157666157667157668157669157670157671157672157673157674157675157676157677157678157679157680157681157682157683157684157685157686157687157688157689157690157691157692157693157694157695157696157697157698157699157700157701157702157703157704157705157706157707157708157709157710157711157712157713157714157715157716157717157718157719157720157721157722157723157724157725157726157727157728157729157730157731157732157733157734157735157736157737157738157739157740157741157742157743157744157745157746157747157748157749157750157751157752157753157754157755157756157757157758157759157760157761157762157763157764157765157766157767157768157769157770157771157772157773157774157775157776157777157778157779157780157781157782157783157784157785157786157787157788157789157790157791157792157793157794157795157796157797157798157799157800157801157802157803157804157805157806157807157808157809157810157811157812157813157814157815157816157817157818157819157820157821157822157823157824157825157826157827157828157829157830157831157832157833157834157835157836157837157838157839157840157841157842157843157844157845157846157847157848157849157850157851157852157853157854157855157856157857157858157859157860157861157862157863157864157865157866157867157868157869157870157871157872157873157874157875157876157877157878157879157880157881157882157883157884157885157886157887157888157889157890157891157892157893157894157895157896157897157898157899157900157901157902157903157904157905157906157907157908157909157910157911157912157913157914157915157916157917157918157919157920157921157922157923157924157925157926157927157928157929157930157931157932157933157934157935157936157937157938157939157940157941157942157943157944157945157946157947157948157949157950157951157952157953157954157955157956157957157958157959157960157961157962157963157964157965157966157967157968157969157970157971157972157973157974157975157976157977157978157979157980157981157982157983157984157985157986157987157988157989157990157991157992157993157994157995157996157997157998157999158000158001158002158003158004158005158006158007158008158009158010158011158012158013158014158015158016158017158018158019158020158021158022158023158024158025158026158027158028158029158030158031158032158033158034158035158036158037158038158039158040158041158042158043158044158045158046158047158048158049158050158051158052158053158054158055158056158057158058158059158060158061158062158063158064158065158066158067158068158069158070158071158072158073158074158075158076158077158078158079158080158081158082158083158084158085158086158087158088158089158090158091158092158093158094158095158096158097158098158099158100158101158102158103158104158105158106158107158108158109158110158111158112158113158114158115158116158117158118158119158120158121158122158123158124158125158126158127158128158129158130158131158132158133158134158135158136158137158138158139158140158141158142158143158144158145158146158147158148158149158150158151158152158153158154158155158156158157158158158159158160158161158162158163158164158165158166158167158168158169158170158171158172158173158174158175158176158177158178158179158180158181158182158183158184158185158186158187158188158189158190158191158192158193158194158195158196158197158198158199158200158201158202158203158204158205158206158207158208158209158210158211158212158213158214158215158216158217158218158219158220158221158222158223158224158225158226158227158228158229158230158231158232158233158234158235158236158237158238158239158240158241158242158243158244158245158246158247158248158249158250158251158252158253158254158255158256158257158258158259158260158261158262158263158264158265158266158267158268158269158270158271158272158273158274158275158276158277158278158279158280158281158282158283158284158285158286158287158288158289158290158291158292158293158294158295158296158297158298158299158300158301158302158303158304158305158306158307158308158309158310158311158312158313158314158315158316158317158318158319158320158321158322158323158324158325158326158327158328158329158330158331158332158333158334158335158336158337158338158339158340158341158342158343158344158345158346158347158348158349158350158351158352158353158354158355158356158357158358158359158360158361158362158363158364158365158366158367158368158369158370158371158372158373158374158375158376158377158378158379158380158381158382158383158384158385158386158387158388158389158390158391158392158393158394158395158396158397158398158399158400158401158402158403158404158405158406158407158408158409158410158411158412158413158414158415158416158417158418158419158420158421158422158423158424158425158426158427158428158429158430158431158432158433158434158435158436158437158438158439158440158441158442158443158444158445158446158447158448158449158450158451158452158453158454158455158456158457158458158459158460158461158462158463158464158465158466158467158468158469158470158471158472158473158474158475158476158477158478158479158480158481158482158483158484158485158486158487158488158489158490158491158492158493158494158495158496158497158498158499158500158501158502158503158504158505158506158507158508158509158510158511158512158513158514158515158516158517158518158519158520158521158522158523158524158525158526158527158528158529158530158531158532158533158534158535158536158537158538158539158540158541158542158543158544158545158546158547158548158549158550158551158552158553158554158555158556158557158558158559158560158561158562158563158564158565158566158567158568158569158570158571158572158573158574158575158576158577158578158579158580158581158582158583158584158585158586158587158588158589158590158591158592158593158594158595158596158597158598158599158600158601158602158603158604158605158606158607158608158609158610158611158612158613158614158615158616158617158618158619158620158621158622158623158624158625158626158627158628158629158630158631158632158633158634158635158636158637158638158639158640158641158642158643158644158645158646158647158648158649158650158651158652158653158654158655158656158657158658158659158660158661158662158663158664158665158666158667158668158669158670158671158672158673158674158675158676158677158678158679158680158681158682158683158684158685158686158687158688158689158690158691158692158693158694158695158696158697158698158699158700158701158702158703158704158705158706158707158708158709158710158711158712158713158714158715158716158717158718158719158720158721158722158723158724158725158726158727158728158729158730158731158732158733158734158735158736158737158738158739158740158741158742158743158744158745158746158747158748158749158750158751158752158753158754158755158756158757158758158759158760158761158762158763158764158765158766158767158768158769158770158771158772158773158774158775158776158777158778158779158780158781158782158783158784158785158786158787158788158789158790158791158792158793158794158795158796158797158798158799158800158801158802158803158804158805158806158807158808158809158810158811158812158813158814158815158816158817158818158819158820158821158822158823158824158825158826158827158828158829158830158831158832158833158834158835158836158837158838158839158840158841158842158843158844158845158846158847158848158849158850158851158852158853158854158855158856158857158858158859158860158861158862158863158864158865158866158867158868158869158870158871158872158873158874158875158876158877158878158879158880158881158882158883158884158885158886158887158888158889158890158891158892158893158894158895158896158897158898158899158900158901158902158903158904158905158906158907158908158909158910158911158912158913158914158915158916158917158918158919158920158921158922158923158924158925158926158927158928158929158930158931158932158933158934158935158936158937158938158939158940158941158942158943158944158945158946158947158948158949158950158951158952158953158954158955158956158957158958158959158960158961158962158963158964158965158966158967158968158969158970158971158972158973158974158975158976158977158978158979158980158981158982158983158984158985158986158987158988158989158990158991158992158993158994158995158996158997158998158999159000159001159002159003159004159005159006159007159008159009159010159011159012159013159014159015159016159017159018159019159020159021159022159023159024159025159026159027159028159029159030159031159032159033159034159035159036159037159038159039159040159041159042159043159044159045159046159047159048159049159050159051159052159053159054159055159056159057159058159059159060159061159062159063159064159065159066159067159068159069159070159071159072159073159074159075159076159077159078159079159080159081159082159083159084159085159086159087159088159089159090159091159092159093159094159095159096159097159098159099159100159101159102159103159104159105159106159107159108159109159110159111159112159113159114159115159116159117159118159119159120159121159122159123159124159125159126159127159128159129159130159131159132159133159134159135159136159137159138159139159140159141159142159143159144159145159146159147159148159149159150159151159152159153159154159155159156159157159158159159159160159161159162159163159164159165159166159167159168159169159170159171159172159173159174159175159176159177159178159179159180159181159182159183159184159185159186159187159188159189159190159191159192159193159194159195159196159197159198159199159200159201159202159203159204159205159206159207159208159209159210159211159212159213159214159215159216159217159218159219159220159221159222159223159224159225159226159227159228159229159230159231159232159233159234159235159236159237159238159239159240159241159242159243159244159245159246159247159248159249159250159251159252159253159254159255159256159257159258159259159260159261159262159263159264159265159266159267159268159269159270159271159272159273159274159275159276159277159278159279159280159281159282159283159284159285159286159287159288159289159290159291159292159293159294159295159296159297159298159299159300159301159302159303159304159305159306159307159308159309159310159311159312159313159314159315159316159317159318159319159320159321159322159323159324159325159326159327159328159329159330159331159332159333159334159335159336159337159338159339159340159341159342159343159344159345159346159347159348159349159350159351159352159353159354159355159356159357159358159359159360159361159362159363159364159365159366159367159368159369159370159371159372159373159374159375159376159377159378159379159380159381159382159383159384159385159386159387159388159389159390159391159392159393159394159395159396159397159398159399159400159401159402159403159404159405159406159407159408159409159410159411159412159413159414159415159416159417159418159419159420159421159422159423159424159425159426159427159428159429159430159431159432159433159434159435159436159437159438159439159440159441159442159443159444159445159446159447159448159449159450159451159452159453159454159455159456159457159458159459159460159461159462159463159464159465159466159467159468159469159470159471159472159473159474159475159476159477159478159479159480159481159482159483159484159485159486159487159488159489159490159491159492159493159494159495159496159497159498159499159500159501159502159503159504159505159506159507159508159509159510159511159512159513159514159515159516159517159518159519159520159521159522159523159524159525159526159527159528159529159530159531159532159533159534159535159536159537159538159539159540159541159542159543159544159545159546159547159548159549159550159551159552159553159554159555159556159557159558159559159560159561159562159563159564159565159566159567159568159569159570159571159572159573159574159575159576159577159578159579159580159581159582159583159584159585159586159587159588159589159590159591159592159593159594159595159596159597159598159599159600159601159602159603159604159605159606159607159608159609159610159611159612159613159614159615159616159617159618159619159620159621159622159623159624159625159626159627159628159629159630159631159632159633159634159635159636159637159638159639159640159641159642159643159644159645159646159647159648159649159650159651159652159653159654159655159656159657159658159659159660159661159662159663159664159665159666159667159668159669159670159671159672159673159674159675159676159677159678159679159680159681159682159683159684159685159686159687159688159689159690159691159692159693159694159695159696159697159698159699159700159701159702159703159704159705159706159707159708159709159710159711159712159713159714159715159716159717159718159719159720159721159722159723159724159725159726159727159728159729159730159731159732159733159734159735159736159737159738159739159740159741159742159743159744159745159746159747159748159749159750159751159752159753159754159755159756159757159758159759159760159761159762159763159764159765159766159767159768159769159770159771159772159773159774159775159776159777159778159779159780159781159782159783159784159785159786159787159788159789159790159791159792159793159794159795159796159797159798159799159800159801159802159803159804159805159806159807159808159809159810159811159812159813159814159815159816159817159818159819159820159821159822159823159824159825159826159827159828159829159830159831159832159833159834159835159836159837159838159839159840159841159842159843159844159845159846159847159848159849159850159851159852159853159854159855159856159857159858159859159860159861159862159863159864159865159866159867159868159869159870159871159872159873159874159875159876159877159878159879159880159881159882159883159884159885159886159887159888159889159890159891159892159893159894159895159896159897159898159899159900159901159902159903159904159905159906159907159908159909159910159911159912159913159914159915159916159917159918159919159920159921159922159923159924159925159926159927159928159929159930159931159932159933159934159935159936159937159938159939159940159941159942159943159944159945159946159947159948159949159950159951159952159953159954159955159956159957159958159959159960159961159962159963159964159965159966159967159968159969159970159971159972159973159974159975159976159977159978159979159980159981159982159983159984159985159986159987159988159989159990159991159992159993159994159995159996159997159998159999160000160001160002160003160004160005160006160007160008160009160010160011160012160013160014160015160016160017160018160019160020160021160022160023160024160025160026160027160028160029160030160031160032160033160034160035160036160037160038160039160040160041160042160043160044160045160046160047160048160049160050160051160052160053160054160055160056160057160058160059160060160061160062160063160064160065160066160067160068160069160070160071160072160073160074160075160076160077160078160079160080160081160082160083160084160085160086160087160088160089160090160091160092160093160094160095160096160097160098160099160100160101160102160103160104160105160106160107160108160109160110160111160112160113160114160115160116160117160118160119160120160121160122160123160124160125160126160127160128160129160130160131160132160133160134160135160136160137160138160139160140160141160142160143160144160145160146160147160148160149160150160151160152160153160154160155160156160157160158160159160160160161160162160163160164160165160166160167160168160169160170160171160172160173160174160175160176160177160178160179160180160181160182160183160184160185160186160187160188160189160190160191160192160193160194160195160196160197160198160199160200160201160202160203160204160205160206160207160208160209160210160211160212160213160214160215160216160217160218160219160220160221160222160223160224160225160226160227160228160229160230160231160232160233160234160235160236160237160238160239160240160241160242160243160244160245160246160247160248160249160250160251160252160253160254160255160256160257160258160259160260160261160262160263160264160265160266160267160268160269160270160271160272160273160274160275160276160277160278160279160280160281160282160283160284160285160286160287160288160289160290160291160292160293160294160295160296160297160298160299160300160301160302160303160304160305160306160307160308160309160310160311160312160313160314160315160316160317160318160319160320160321160322160323160324160325160326160327160328160329160330160331160332160333160334160335160336160337160338160339160340160341160342160343160344160345160346160347160348160349160350160351160352160353160354160355160356160357160358160359160360160361160362160363160364160365160366160367160368160369160370160371160372160373160374160375160376160377160378160379160380160381160382160383160384160385160386160387160388160389160390160391160392160393160394160395160396160397160398160399160400160401160402160403160404160405160406160407160408160409160410160411160412160413160414160415160416160417160418160419160420160421160422160423160424160425160426160427160428160429160430160431160432160433160434160435160436160437160438160439160440160441160442160443160444160445160446160447160448160449160450160451160452160453160454160455160456160457160458160459160460160461160462160463160464160465160466160467160468160469160470160471160472160473160474160475160476160477160478160479160480160481160482160483160484160485160486160487160488160489160490160491160492160493160494160495160496160497160498160499160500160501160502160503160504160505160506160507160508160509160510160511160512160513160514160515160516160517160518160519160520160521160522160523160524160525160526160527160528160529160530160531160532160533160534160535160536160537160538160539160540160541160542160543160544160545160546160547160548160549160550160551160552160553160554160555160556160557160558160559160560160561160562160563160564160565160566160567160568160569160570160571160572160573160574160575160576160577160578160579160580160581160582160583160584160585160586160587160588160589160590160591160592160593160594160595160596160597160598160599160600160601160602160603160604160605160606160607160608160609160610160611160612160613160614160615160616160617160618160619160620160621160622160623160624160625160626160627160628160629160630160631160632160633160634160635160636160637160638160639160640160641160642160643160644160645160646160647160648160649160650160651160652160653160654160655160656160657160658160659160660160661160662160663160664160665160666160667160668160669160670160671160672160673160674160675160676160677160678160679160680160681160682160683160684160685160686160687160688160689160690160691160692160693160694160695160696160697160698160699160700160701160702160703160704160705160706160707160708160709160710160711160712160713160714160715160716160717160718160719160720160721160722160723160724160725160726160727160728160729160730160731160732160733160734160735160736160737160738160739160740160741160742160743160744160745160746160747160748160749160750160751160752160753160754160755160756160757160758160759160760160761160762160763160764160765160766160767160768160769160770160771160772160773160774160775160776160777160778160779160780160781160782160783160784160785160786160787160788160789160790160791160792160793160794160795160796160797160798160799160800160801160802160803160804160805160806160807160808160809160810160811160812160813160814160815160816160817160818160819160820160821160822160823160824160825160826160827160828160829160830160831160832160833160834160835160836160837160838160839160840160841160842160843160844160845160846160847160848160849160850160851160852160853160854160855160856160857160858160859160860160861160862160863160864160865160866160867160868160869160870160871160872160873160874160875160876160877160878160879160880160881160882160883160884160885160886160887160888160889160890160891160892160893160894160895160896160897160898160899160900160901160902160903160904160905160906160907160908160909160910160911160912160913160914160915160916160917160918160919160920160921160922160923160924160925160926160927160928160929160930160931160932160933160934160935160936160937160938160939160940160941160942160943160944160945160946160947160948160949160950160951160952160953160954160955160956160957160958160959160960160961160962160963160964160965160966160967160968160969160970160971160972160973160974160975160976160977160978160979160980160981160982160983160984160985160986160987160988160989160990160991160992160993160994160995160996160997160998160999161000161001161002161003161004161005161006161007161008161009161010161011161012161013161014161015161016161017161018161019161020161021161022161023161024161025161026161027161028161029161030161031161032161033161034161035161036161037161038161039161040161041161042161043161044161045161046161047161048161049161050161051161052161053161054161055161056161057161058161059161060161061161062161063161064161065161066161067161068161069161070161071161072161073161074161075161076161077161078161079161080161081161082161083161084161085161086161087161088161089161090161091161092161093161094161095161096161097161098161099161100161101161102161103161104161105161106161107161108161109161110161111161112161113161114161115161116161117161118161119161120161121161122161123161124161125161126161127161128161129161130161131161132161133161134161135161136161137161138161139161140161141161142161143161144161145161146161147161148161149161150161151161152161153161154161155161156161157161158161159161160161161161162161163161164161165161166161167161168161169161170161171161172161173161174161175161176161177161178161179161180161181161182161183161184161185161186161187161188161189161190161191161192161193161194161195161196161197161198161199161200161201161202161203161204161205161206161207161208161209161210161211161212161213161214161215161216161217161218161219161220161221161222161223161224161225161226161227161228161229161230161231161232161233161234161235161236161237161238161239161240161241161242161243161244161245161246161247161248161249161250161251161252161253161254161255161256161257161258161259161260161261161262161263161264161265161266161267161268161269161270161271161272161273161274161275161276161277161278161279161280161281161282161283161284161285161286161287161288161289161290161291161292161293161294161295161296161297161298161299161300161301161302161303161304161305161306161307161308161309161310161311161312161313161314161315161316161317161318161319161320161321161322161323161324161325161326161327161328161329161330161331161332161333161334161335161336161337161338161339161340161341161342161343161344161345161346161347161348161349161350161351161352161353161354161355161356161357161358161359161360161361161362161363161364161365161366161367161368161369161370161371161372161373161374161375161376161377161378161379161380161381161382161383161384161385161386161387161388161389161390161391161392161393161394161395161396161397161398161399161400161401161402161403161404161405161406161407161408161409161410161411161412161413161414161415161416161417161418161419161420161421161422161423161424161425161426161427161428161429161430161431161432161433161434161435161436161437161438161439161440161441161442161443161444161445161446161447161448161449161450161451161452161453161454161455161456161457161458161459161460161461161462161463161464161465161466161467161468161469161470161471161472161473161474161475161476161477161478161479161480161481161482161483161484161485161486161487161488161489161490161491161492161493161494161495161496161497161498161499161500161501161502161503161504161505161506161507161508161509161510161511161512161513161514161515161516161517161518161519161520161521161522161523161524161525161526161527161528161529161530161531161532161533161534161535161536161537161538161539161540161541161542161543161544161545161546161547161548161549161550161551161552161553161554161555161556161557161558161559161560161561161562161563161564161565161566161567161568161569161570161571161572161573161574161575161576161577161578161579161580161581161582161583161584161585161586161587161588161589161590161591161592161593161594161595161596161597161598161599161600161601161602161603161604161605161606161607161608161609161610161611161612161613161614161615161616161617161618161619161620161621161622161623161624161625161626161627161628161629161630161631161632161633161634161635161636161637161638161639161640161641161642161643161644161645161646161647161648161649161650161651161652161653161654161655161656161657161658161659161660161661161662161663161664161665161666161667161668161669161670161671161672161673161674161675161676161677161678161679161680161681161682161683161684161685161686161687161688161689161690161691161692161693161694161695161696161697161698161699161700161701161702161703161704161705161706161707161708161709161710161711161712161713161714161715161716161717161718161719161720161721161722161723161724161725161726161727161728161729161730161731161732161733161734161735161736161737161738161739161740161741161742161743161744161745161746161747161748161749161750161751161752161753161754161755161756161757161758161759161760161761161762161763161764161765161766161767161768161769161770161771161772161773161774161775161776161777161778161779161780161781161782161783161784161785161786161787161788161789161790161791161792161793161794161795161796161797161798161799161800161801161802161803161804161805161806161807161808161809161810161811161812161813161814161815161816161817161818161819161820161821161822161823161824161825161826161827161828161829161830161831161832161833161834161835161836161837161838161839161840161841161842161843161844161845161846161847161848161849161850161851161852161853161854161855161856161857161858161859161860161861161862161863161864161865161866161867161868161869161870161871161872161873161874161875161876161877161878161879161880161881161882161883161884161885161886161887161888161889161890161891161892161893161894161895161896161897161898161899161900161901161902161903161904161905161906161907161908161909161910161911161912161913161914161915161916161917161918161919161920161921161922161923161924161925161926161927161928161929161930161931161932161933161934161935161936161937161938161939161940161941161942161943161944161945161946161947161948161949161950161951161952161953161954161955161956161957161958161959161960161961161962161963161964161965161966161967161968161969161970161971161972161973161974161975161976161977161978161979161980161981161982161983161984161985161986161987161988161989161990161991161992161993161994161995161996161997161998161999162000162001162002162003162004162005162006162007162008162009162010162011162012162013162014162015162016162017162018162019162020162021162022162023162024162025162026162027162028162029162030162031162032162033162034162035162036162037162038162039162040162041162042162043162044162045162046162047162048162049162050162051162052162053162054162055162056162057162058162059162060162061162062162063162064162065162066162067162068162069162070162071162072162073162074162075162076162077162078162079162080162081162082162083162084162085162086162087162088162089162090162091162092162093162094162095162096162097162098162099162100162101162102162103162104162105162106162107162108162109162110162111162112162113162114162115162116162117162118162119162120162121162122162123162124162125162126162127162128162129162130162131162132162133162134162135162136162137162138162139162140162141162142162143162144162145162146162147162148162149162150162151162152162153162154162155162156162157162158162159162160162161162162162163162164162165162166162167162168162169162170162171162172162173162174162175162176162177162178162179162180162181162182162183162184162185162186162187162188162189162190162191162192162193162194162195162196162197162198162199162200162201162202162203162204162205162206162207162208162209162210162211162212162213162214162215162216162217162218162219162220162221162222162223162224162225162226162227162228162229162230162231162232162233162234162235162236162237162238162239162240162241162242162243162244162245162246162247162248162249162250162251162252162253162254162255162256162257162258162259162260162261162262162263162264162265162266162267162268162269162270162271162272162273162274162275162276162277162278162279162280162281162282162283162284162285162286162287162288162289162290162291162292162293162294162295162296162297162298162299162300162301162302162303162304162305162306162307162308162309162310162311162312162313162314162315162316162317162318162319162320162321162322162323162324162325162326162327162328162329162330162331162332162333162334162335162336162337162338162339162340162341162342162343162344162345162346162347162348162349162350162351162352162353162354162355162356162357162358162359162360162361162362162363162364162365162366162367162368162369162370162371162372162373162374162375162376162377162378162379162380162381162382162383162384162385162386162387162388162389162390162391162392162393162394162395162396162397162398162399162400162401162402162403162404162405162406162407162408162409162410162411162412162413162414162415162416162417162418162419162420162421162422162423162424162425162426162427162428162429162430162431162432162433162434162435162436162437162438162439162440162441162442162443162444162445162446162447162448162449162450162451162452162453162454162455162456162457162458162459162460162461162462162463162464162465162466162467162468162469162470162471162472162473162474162475162476162477162478162479162480162481162482162483162484162485162486162487162488162489162490162491162492162493162494162495162496162497162498162499162500162501162502162503162504162505162506162507162508162509162510162511162512162513162514162515162516162517162518162519162520162521162522162523162524162525162526162527162528162529162530162531162532162533162534162535162536162537162538162539162540162541162542162543162544162545162546162547162548162549162550162551162552162553162554162555162556162557162558162559162560162561162562162563162564162565162566162567162568162569162570162571162572162573162574162575162576162577162578162579162580162581162582162583162584162585162586162587162588162589162590162591162592162593162594162595162596162597162598162599162600162601162602162603162604162605162606162607162608162609162610162611162612162613162614162615162616162617162618162619162620162621162622162623162624162625162626162627162628162629162630162631162632162633162634162635162636162637162638162639162640162641162642162643162644162645162646162647162648162649162650162651162652162653162654162655162656162657162658162659162660162661162662162663162664162665162666162667162668162669162670162671162672162673162674162675162676162677162678162679162680162681162682162683162684162685162686162687162688162689162690162691162692162693162694162695162696162697162698162699162700162701162702162703162704162705162706162707162708162709162710162711162712162713162714162715162716162717162718162719162720162721162722162723162724162725162726162727162728162729162730162731162732162733162734162735162736162737162738162739162740162741162742162743162744162745162746162747162748162749162750162751162752162753162754162755162756162757162758162759162760162761162762162763162764162765162766162767162768162769162770162771162772162773162774162775162776162777162778162779162780162781162782162783162784162785162786162787162788162789162790162791162792162793162794162795162796162797162798162799162800162801162802162803162804162805162806162807162808162809162810162811162812162813162814162815162816162817162818162819162820162821162822162823162824162825162826162827162828162829162830162831162832162833162834162835162836162837162838162839162840162841162842162843162844162845162846162847162848162849162850162851162852162853162854162855162856162857162858162859162860162861162862162863162864162865162866162867162868162869162870162871162872162873162874162875162876162877162878162879162880162881162882162883162884162885162886162887162888162889162890162891162892162893162894162895162896162897162898162899162900162901162902162903162904162905162906162907162908162909162910162911162912162913162914162915162916162917162918162919162920162921162922162923162924162925162926162927162928162929162930162931162932162933162934162935162936162937162938162939162940162941162942162943162944162945162946162947162948162949162950162951162952162953162954162955162956162957162958162959162960162961162962162963162964162965162966162967162968162969162970162971162972162973162974162975162976162977162978162979162980162981162982162983162984162985162986162987162988162989162990162991162992162993162994162995162996162997162998162999163000163001163002163003163004163005163006163007163008163009163010163011163012163013163014163015163016163017163018163019163020163021163022163023163024163025163026163027163028163029163030163031163032163033163034163035163036163037163038163039163040163041163042163043163044163045163046163047163048163049163050163051163052163053163054163055163056163057163058163059163060163061163062163063163064163065163066163067163068163069163070163071163072163073163074163075163076163077163078163079163080163081163082163083163084163085163086163087163088163089163090163091163092163093163094163095163096163097163098163099163100163101163102163103163104163105163106163107163108163109163110163111163112163113163114163115163116163117163118163119163120163121163122163123163124163125163126163127163128163129163130163131163132163133163134163135163136163137163138163139163140163141163142163143163144163145163146163147163148163149163150163151163152163153163154163155163156163157163158163159163160163161163162163163163164163165163166163167163168163169163170163171163172163173163174163175163176163177163178163179163180163181163182163183163184163185163186163187163188163189163190163191163192163193163194163195163196163197163198163199163200163201163202163203163204163205163206163207163208163209163210163211163212163213163214163215163216163217163218163219163220163221163222163223163224163225163226163227163228163229163230163231163232163233163234163235163236163237163238163239163240163241163242163243163244163245163246163247163248163249163250163251163252163253163254163255163256163257163258163259163260163261163262163263163264163265163266163267163268163269163270163271163272163273163274163275163276163277163278163279163280163281163282163283163284163285163286163287163288163289163290163291163292163293163294163295163296163297163298163299163300163301163302163303163304163305163306163307163308163309163310163311163312163313163314163315163316163317163318163319163320163321163322163323163324163325163326163327163328163329163330163331163332163333163334163335163336163337163338163339163340163341163342163343163344163345163346163347163348163349163350163351163352163353163354163355163356163357163358163359163360163361163362163363163364163365163366163367163368163369163370163371163372163373163374163375163376163377163378163379163380163381163382163383163384163385163386163387163388163389163390163391163392163393163394163395163396163397163398163399163400163401163402163403163404163405163406163407163408163409163410163411163412163413163414163415163416163417163418163419163420163421163422163423163424163425163426163427163428163429163430163431163432163433163434163435163436163437163438163439163440163441163442163443163444163445163446163447163448163449163450163451163452163453163454163455163456163457163458163459163460163461163462163463163464163465163466163467163468163469163470163471163472163473163474163475163476163477163478163479163480163481163482163483163484163485163486163487163488163489163490163491163492163493163494163495163496163497163498163499163500163501163502163503163504163505163506163507163508163509163510163511163512163513163514163515163516163517163518163519163520163521163522163523163524163525163526163527163528163529163530163531163532163533163534163535163536163537163538163539163540163541163542163543163544163545163546163547163548163549163550163551163552163553163554163555163556163557163558163559163560163561163562163563163564163565163566163567163568163569163570163571163572163573163574163575163576163577163578163579163580163581163582163583163584163585163586163587163588163589163590163591163592163593163594163595163596163597163598163599163600163601163602163603163604163605163606163607163608163609163610163611163612163613163614163615163616163617163618163619163620163621163622163623163624163625163626163627163628163629163630163631163632163633163634163635163636163637163638163639163640163641163642163643163644163645163646163647163648163649163650163651163652163653163654163655163656163657163658163659163660163661163662163663163664163665163666163667163668163669163670163671163672163673163674163675163676163677163678163679163680163681163682163683163684163685163686163687163688163689163690163691163692163693163694163695163696163697163698163699163700163701163702163703163704163705163706163707163708163709163710163711163712163713163714163715163716163717163718163719163720163721163722163723163724163725163726163727163728163729163730163731163732163733163734163735163736163737163738163739163740163741163742163743163744163745163746163747163748163749163750163751163752163753163754163755163756163757163758163759163760163761163762163763163764163765163766163767163768163769163770163771163772163773163774163775163776163777163778163779163780163781163782163783163784163785163786163787163788163789163790163791163792163793163794163795163796163797163798163799163800163801163802163803163804163805163806163807163808163809163810163811163812163813163814163815163816163817163818163819163820163821163822163823163824163825163826163827163828163829163830163831163832163833163834163835163836163837163838163839163840163841163842163843163844163845163846163847163848163849163850163851163852163853163854163855163856163857163858163859163860163861163862163863163864163865163866163867163868163869163870163871163872163873163874163875163876163877163878163879163880163881163882163883163884163885163886163887163888163889163890163891163892163893163894163895163896163897163898163899163900163901163902163903163904163905163906163907163908163909163910163911163912163913163914163915163916163917163918163919163920163921163922163923163924163925163926163927163928163929163930163931163932163933163934163935163936163937163938163939163940163941163942163943163944163945163946163947163948163949163950163951163952163953163954163955163956163957163958163959163960163961163962163963163964163965163966163967163968163969163970163971163972163973163974163975163976163977163978163979163980163981163982163983163984163985163986163987163988163989163990163991163992163993163994163995163996163997163998163999164000164001164002164003164004164005164006164007164008164009164010164011164012164013164014164015164016164017164018164019164020164021164022164023164024164025164026164027164028164029164030164031164032164033164034164035164036164037164038164039164040164041164042164043164044164045164046164047164048164049164050164051164052164053164054164055164056164057164058164059164060164061164062164063164064164065164066164067164068164069164070164071164072164073164074164075164076164077164078164079164080164081164082164083164084164085164086164087164088164089164090164091164092164093164094164095164096164097164098164099164100164101164102164103164104164105164106164107164108164109164110164111164112164113164114164115164116164117164118164119164120164121164122164123164124164125164126164127164128164129164130164131164132164133164134164135164136164137164138164139164140164141164142164143164144164145164146164147164148164149164150164151164152164153164154164155164156164157164158164159164160164161164162164163164164164165164166164167164168164169164170164171164172164173164174164175164176164177164178164179164180164181164182164183164184164185164186164187164188164189164190164191164192164193164194164195164196164197164198164199164200164201164202164203164204164205164206164207164208164209164210164211164212164213164214164215164216164217164218164219164220164221164222164223164224164225164226164227164228164229164230164231164232164233164234164235164236164237164238164239164240164241164242164243164244164245164246164247164248164249164250164251164252164253164254164255164256164257164258164259164260164261164262164263164264164265164266164267164268164269164270164271164272164273164274164275164276164277164278164279164280164281164282164283164284164285164286164287164288164289164290164291164292164293164294164295164296164297164298164299164300164301164302164303164304164305164306164307164308164309164310164311164312164313164314164315164316164317164318164319164320164321164322164323164324164325164326164327164328164329164330164331164332164333164334164335164336164337164338164339164340164341164342164343164344164345164346164347164348164349164350164351164352164353164354164355164356164357164358164359164360164361164362164363164364164365164366164367164368164369164370164371164372164373164374164375164376164377164378164379164380164381164382164383164384164385164386164387164388164389164390164391164392164393164394164395164396164397164398164399164400164401164402164403164404164405164406164407164408164409164410164411164412164413164414164415164416164417164418164419164420164421164422164423164424164425164426164427164428164429164430164431164432164433164434164435164436164437164438164439164440164441164442164443164444164445164446164447164448164449164450164451164452164453164454164455164456164457164458164459164460164461164462164463164464164465164466164467164468164469164470164471164472164473164474164475164476164477164478164479164480164481164482164483164484164485164486164487164488164489164490164491164492164493164494164495164496164497164498164499164500164501164502164503164504164505164506164507164508164509164510164511164512164513164514164515164516164517164518164519164520164521164522164523164524164525164526164527164528164529164530164531164532164533164534164535164536164537164538164539164540164541164542164543164544164545164546164547164548164549164550164551164552164553164554164555164556164557164558164559164560164561164562164563164564164565164566164567164568164569164570164571164572164573164574164575164576164577164578164579164580164581164582164583164584164585164586164587164588164589164590164591164592164593164594164595164596164597164598164599164600164601164602164603164604164605164606164607164608164609164610164611164612164613164614164615164616164617164618164619164620164621164622164623164624164625164626164627164628164629164630164631164632164633164634164635164636164637164638164639164640164641164642164643164644164645164646164647164648164649164650164651164652164653164654164655164656164657164658164659164660164661164662164663164664164665164666164667164668164669164670164671164672164673164674164675164676164677164678164679164680164681164682164683164684164685164686164687164688164689164690164691164692164693164694164695164696164697164698164699164700164701164702164703164704164705164706164707164708164709164710164711164712164713164714164715164716164717164718164719164720164721164722164723164724164725164726164727164728164729164730164731164732164733164734164735164736164737164738164739164740164741164742164743164744164745164746164747164748164749164750164751164752164753164754164755164756164757164758164759164760164761164762164763164764164765164766164767164768164769164770164771164772164773164774164775164776164777164778164779164780164781164782164783164784164785164786164787164788164789164790164791164792164793164794164795164796164797164798164799164800164801164802164803164804164805164806164807164808164809164810164811164812164813164814164815164816164817164818164819164820164821164822164823164824164825164826164827164828164829164830164831164832164833164834164835164836164837164838164839164840164841164842164843164844164845164846164847164848164849164850164851164852164853164854164855164856164857164858164859164860164861164862164863164864164865164866164867164868164869164870164871164872164873164874164875164876164877164878164879164880164881164882164883164884164885164886164887164888164889164890164891164892164893164894164895164896164897164898164899164900164901164902164903164904164905164906164907164908164909164910164911164912164913164914164915164916164917164918164919164920164921164922164923164924164925164926164927164928164929164930164931164932164933164934164935164936164937164938164939164940164941164942164943164944164945164946164947164948164949164950164951164952164953164954164955164956164957164958164959164960164961164962164963164964164965164966164967164968164969164970164971164972164973164974164975164976164977164978164979164980164981164982164983164984164985164986164987164988164989164990164991164992164993164994164995164996164997164998164999165000165001165002165003165004165005165006165007165008165009165010165011165012165013165014165015165016165017165018165019165020165021165022165023165024165025165026165027165028165029165030165031165032165033165034165035165036165037165038165039165040165041165042165043165044165045165046165047165048165049165050165051165052165053165054165055165056165057165058165059165060165061165062165063165064165065165066165067165068165069165070165071165072165073165074165075165076165077165078165079165080165081165082165083165084165085165086165087165088165089165090165091165092165093165094165095165096165097165098165099165100165101165102165103165104165105165106165107165108165109165110165111165112165113165114165115165116165117165118165119165120165121165122165123165124165125165126165127165128165129165130165131165132165133165134165135165136165137165138165139165140165141165142165143165144165145165146165147165148165149165150165151165152165153165154165155165156165157165158165159165160165161165162165163165164165165165166165167165168165169165170165171165172165173165174165175165176165177165178165179165180165181165182165183165184165185165186165187165188165189165190165191165192165193165194165195165196165197165198165199165200165201165202165203165204165205165206165207165208165209165210165211165212165213165214165215165216165217165218165219165220165221165222165223165224165225165226165227165228165229165230165231165232165233165234165235165236165237165238165239165240165241165242165243165244165245165246165247165248165249165250165251165252165253165254165255165256165257165258165259165260165261165262165263165264165265165266165267165268165269165270165271165272165273165274165275165276165277165278165279165280165281165282165283165284165285165286165287165288165289165290165291165292165293165294165295165296165297165298165299165300165301165302165303165304165305165306165307165308165309165310165311165312165313165314165315165316165317165318165319165320165321165322165323165324165325165326165327165328165329165330165331165332165333165334165335165336165337165338165339165340165341165342165343165344165345165346165347165348165349165350165351165352165353165354165355165356165357165358165359165360165361165362165363165364165365165366165367165368165369165370165371165372165373165374165375165376165377165378165379165380165381165382165383165384165385165386165387165388165389165390165391165392165393165394165395165396165397165398165399165400165401165402165403165404165405165406165407165408165409165410165411165412165413165414165415165416165417165418165419165420165421165422165423165424165425165426165427165428165429165430165431165432165433165434165435165436165437165438165439165440165441165442165443165444165445165446165447165448165449165450165451165452165453165454165455165456165457165458165459165460165461165462165463165464165465165466165467165468165469165470165471165472165473165474165475165476165477165478165479165480165481165482165483165484165485165486165487165488165489165490165491165492165493165494165495165496165497165498165499165500165501165502165503165504165505165506165507165508165509165510165511165512165513165514165515165516165517165518165519165520165521165522165523165524165525165526165527165528165529165530165531165532165533165534165535165536165537165538165539165540165541165542165543165544165545165546165547165548165549165550165551165552165553165554165555165556165557165558165559165560165561165562165563165564165565165566165567165568165569165570165571165572165573165574165575165576165577165578165579165580165581165582165583165584165585165586165587165588165589165590165591165592165593165594165595165596165597165598165599165600165601165602165603165604165605165606165607165608165609165610165611165612165613165614165615165616165617165618165619165620165621165622165623165624165625165626165627165628165629165630165631165632165633165634165635165636165637165638165639165640165641165642165643165644165645165646165647165648165649165650165651165652165653165654165655165656165657165658165659165660165661165662165663165664165665165666165667165668165669165670165671165672165673165674165675165676165677165678165679165680165681165682165683165684165685165686165687165688165689165690165691165692165693165694165695165696165697165698165699165700165701165702165703165704165705165706165707165708165709165710165711165712165713165714165715165716165717165718165719165720165721165722165723165724165725165726165727165728165729165730165731165732165733165734165735165736165737165738165739165740165741165742165743165744165745165746165747165748165749165750165751165752165753165754165755165756165757165758165759165760165761165762165763165764165765165766165767165768165769165770165771165772165773165774165775165776165777165778165779165780165781165782165783165784165785165786165787165788165789165790165791165792165793165794165795165796165797165798165799165800165801165802165803165804165805165806165807165808165809165810165811165812165813165814165815165816165817165818165819165820165821165822165823165824165825165826165827165828165829165830165831165832165833165834165835165836165837165838165839165840165841165842165843165844165845165846165847165848165849165850165851165852165853165854165855165856165857165858165859165860165861165862165863165864165865165866165867165868165869165870165871165872165873165874165875165876165877165878165879165880165881165882165883165884165885165886165887165888165889165890165891165892165893165894165895165896165897165898165899165900165901165902165903165904165905165906165907165908165909165910165911165912165913165914165915165916165917165918165919165920165921165922165923165924165925165926165927165928165929165930165931165932165933165934165935165936165937165938165939165940165941165942165943165944165945165946165947165948165949165950165951165952165953165954165955165956165957165958165959165960165961165962165963165964165965165966165967165968165969165970165971165972165973165974165975165976165977165978165979165980165981165982165983165984165985165986165987165988165989165990165991165992165993165994165995165996165997165998165999166000166001166002166003166004166005166006166007166008166009166010166011166012166013166014166015166016166017166018166019166020166021166022166023166024166025166026166027166028166029166030166031166032166033166034166035166036166037166038166039166040166041166042166043166044166045166046166047166048166049166050166051166052166053166054166055166056166057166058166059166060166061166062166063166064166065166066166067166068166069166070166071166072166073166074166075166076166077166078166079166080166081166082166083166084166085166086166087166088166089166090166091166092166093166094166095166096166097166098166099166100166101166102166103166104166105166106166107166108166109166110166111166112166113166114166115166116166117166118166119166120166121166122166123166124166125166126166127166128166129166130166131166132166133166134166135166136166137166138166139166140166141166142166143166144166145166146166147166148166149166150166151166152166153166154166155166156166157166158166159166160166161166162166163166164166165166166166167166168166169166170166171166172166173166174166175166176166177166178166179166180166181166182166183166184166185166186166187166188166189166190166191166192166193166194166195166196166197166198166199166200166201166202166203166204166205166206166207166208166209166210166211166212166213166214166215166216166217166218166219166220166221166222166223166224166225166226166227166228166229166230166231166232166233166234166235166236166237166238166239166240166241166242166243166244166245166246166247166248166249166250166251166252166253166254166255166256166257166258166259166260166261166262166263166264166265166266166267166268166269166270166271166272166273166274166275166276166277166278166279166280166281166282166283166284166285166286166287166288166289166290166291166292166293166294166295166296166297166298166299166300166301166302166303166304166305166306166307166308166309166310166311166312166313166314166315166316166317166318166319166320166321166322166323166324166325166326166327166328166329166330166331166332166333166334166335166336166337166338166339166340166341166342166343166344166345166346166347166348166349166350166351166352166353166354166355166356166357166358166359166360166361166362166363166364166365166366166367166368166369166370166371166372166373166374166375166376166377166378166379166380166381166382166383166384166385166386166387166388166389166390166391166392166393166394166395166396166397166398166399166400166401166402166403166404166405166406166407166408166409166410166411166412166413166414166415166416166417166418166419166420166421166422166423166424166425166426166427166428166429166430166431166432166433166434166435166436166437166438166439166440166441166442166443166444166445166446166447166448166449166450166451166452166453166454166455166456166457166458166459166460166461166462166463166464166465166466166467166468166469166470166471166472166473166474166475166476166477166478166479166480166481166482166483166484166485166486166487166488166489166490166491166492166493166494166495166496166497166498166499166500166501166502166503166504166505166506166507166508166509166510166511166512166513166514166515166516166517166518166519166520166521166522166523166524166525166526166527166528166529166530166531166532166533166534166535166536166537166538166539166540166541166542166543166544166545166546166547166548166549166550166551166552166553166554166555166556166557166558166559166560166561166562166563166564166565166566166567166568166569166570166571166572166573166574166575166576166577166578166579166580166581166582166583166584166585166586166587166588166589166590166591166592166593166594166595166596166597166598166599166600166601166602166603166604166605166606166607166608166609166610166611166612166613166614166615166616166617166618166619166620166621166622166623166624166625166626166627166628166629166630166631166632166633166634166635166636166637166638166639166640166641166642166643166644166645166646166647166648166649166650166651166652166653166654166655166656166657166658166659166660166661166662166663166664166665166666166667166668166669166670166671166672166673166674166675166676166677166678166679166680166681166682166683166684166685166686166687166688166689166690166691166692166693166694166695166696166697166698166699166700166701166702166703166704166705166706166707166708166709166710166711166712166713166714166715166716166717166718166719166720166721166722166723166724166725166726166727166728166729166730166731166732166733166734166735166736166737166738166739166740166741166742166743166744166745166746166747166748166749166750166751166752166753166754166755166756166757166758166759166760166761166762166763166764166765166766166767166768166769166770166771166772166773166774166775166776166777166778166779166780166781166782166783166784166785166786166787166788166789166790166791166792166793166794166795166796166797166798166799166800166801166802166803166804166805166806166807166808166809166810166811166812166813166814166815166816166817166818166819166820166821166822166823166824166825166826166827166828166829166830166831166832166833166834166835166836166837166838166839166840166841166842166843166844166845166846166847166848166849166850166851166852166853166854166855166856166857166858166859166860166861166862166863166864166865166866166867166868166869166870166871166872166873166874166875166876166877166878166879166880166881166882166883166884166885166886166887166888166889166890166891166892166893166894166895166896166897166898166899166900166901166902166903166904166905166906166907166908166909166910166911166912166913166914166915166916166917166918166919166920166921166922166923166924166925166926166927166928166929166930166931166932166933166934166935166936166937166938166939166940166941166942166943166944166945166946166947166948166949166950166951166952166953166954166955166956166957166958166959166960166961166962166963166964166965166966166967166968166969166970166971166972166973166974166975166976166977166978166979166980166981166982166983166984166985166986166987166988166989166990166991166992166993166994166995166996166997166998166999167000167001167002167003167004167005167006167007167008167009167010167011167012167013167014167015167016167017167018167019167020167021167022167023167024167025167026167027167028167029167030167031167032167033167034167035167036167037167038167039167040167041167042167043167044167045167046167047167048167049167050167051167052167053167054167055167056167057167058167059167060167061167062167063167064167065167066167067167068167069167070167071167072167073167074167075167076167077167078167079167080167081167082167083167084167085167086167087167088167089167090167091167092167093167094167095167096167097167098167099167100167101167102167103167104167105167106167107167108167109167110167111167112167113167114167115167116167117167118167119167120167121167122167123167124167125167126167127167128167129167130167131167132167133167134167135167136167137167138167139167140167141167142167143167144167145167146167147167148167149167150167151167152167153167154167155167156167157167158167159167160167161167162167163167164167165167166167167167168167169167170167171167172167173167174167175167176167177167178167179167180167181167182167183167184167185167186167187167188167189167190167191167192167193167194167195167196167197167198167199167200167201167202167203167204167205167206167207167208167209167210167211167212167213167214167215167216167217167218167219167220167221167222167223167224167225167226167227167228167229167230167231167232167233167234167235167236167237167238167239167240167241167242167243167244167245167246167247167248167249167250167251167252167253167254167255167256167257167258167259167260167261167262167263167264167265167266167267167268167269167270167271167272167273167274167275167276167277167278167279167280167281167282167283167284167285167286167287167288167289167290167291167292167293167294167295167296167297167298167299167300167301167302167303167304167305167306167307167308167309167310167311167312167313167314167315167316167317167318167319167320167321167322167323167324167325167326167327167328167329167330167331167332167333167334167335167336167337167338167339167340167341167342167343167344167345167346167347167348167349167350167351167352167353167354167355167356167357167358167359167360167361167362167363167364167365167366167367167368167369167370167371167372167373167374167375167376167377167378167379167380167381167382167383167384167385167386167387167388167389167390167391167392167393167394167395167396167397167398167399167400167401167402167403167404167405167406167407167408167409167410167411167412167413167414167415167416167417167418167419167420167421167422167423167424167425167426167427167428167429167430167431167432167433167434167435167436167437167438167439167440167441167442167443167444167445167446167447167448167449167450167451167452167453167454167455167456167457167458167459167460167461167462167463167464167465167466167467167468167469167470167471167472167473167474167475167476167477167478167479167480167481167482167483167484167485167486167487167488167489167490167491167492167493167494167495167496167497167498167499167500167501167502167503167504167505167506167507167508167509167510167511167512167513167514167515167516167517167518167519167520167521167522167523167524167525167526167527167528167529167530167531167532167533167534167535167536167537167538167539167540167541167542167543167544167545167546167547167548167549167550167551167552167553167554167555167556167557167558167559167560167561167562167563167564167565167566167567167568167569167570167571167572167573167574167575167576167577167578167579167580167581167582167583167584167585167586167587167588167589167590167591167592167593167594167595167596167597167598167599167600167601167602167603167604167605167606167607167608167609167610167611167612167613167614167615167616167617167618167619167620167621167622167623167624167625167626167627167628167629167630167631167632167633167634167635167636167637167638167639167640167641167642167643167644167645167646167647167648167649167650167651167652167653167654167655167656167657167658167659167660167661167662167663167664167665167666167667167668167669167670167671167672167673167674167675167676167677167678167679167680167681167682167683167684167685167686167687167688167689167690167691167692167693167694167695167696167697167698167699167700167701167702167703167704167705167706167707167708167709167710167711167712167713167714167715167716167717167718167719167720167721167722167723167724167725167726167727167728167729167730167731167732167733167734167735167736167737167738167739167740167741167742167743167744167745167746167747167748167749167750167751167752167753167754167755167756167757167758167759167760167761167762167763167764167765167766167767167768167769167770167771167772167773167774167775167776167777167778167779167780167781167782167783167784167785167786167787167788167789167790167791167792167793167794167795167796167797167798167799167800167801167802167803167804167805167806167807167808167809167810167811167812167813167814167815167816167817167818167819167820167821167822167823167824167825167826167827167828167829167830167831167832167833167834167835167836167837167838167839167840167841167842167843167844167845167846167847167848167849167850167851167852167853167854167855167856167857167858167859167860167861167862167863167864167865167866167867167868167869167870167871167872167873167874167875167876167877167878167879167880167881167882167883167884167885167886167887167888167889167890167891167892167893167894167895167896167897167898167899167900167901167902167903167904167905167906167907167908167909167910167911167912167913167914167915167916167917167918167919167920167921167922167923167924167925167926167927167928167929167930167931167932167933167934167935167936167937167938167939167940167941167942167943167944167945167946167947167948167949167950167951167952167953167954167955167956167957167958167959167960167961167962167963167964167965167966167967167968167969167970167971167972167973167974167975167976167977167978167979167980167981167982167983167984167985167986167987167988167989167990167991167992167993167994167995167996167997167998167999168000168001168002168003168004168005168006168007168008168009168010168011168012168013168014168015168016168017168018168019168020168021168022168023168024168025168026168027168028168029168030168031168032168033168034168035168036168037168038168039168040168041168042168043168044168045168046168047168048168049168050168051168052168053168054168055168056168057168058168059168060168061168062168063168064168065168066168067168068168069168070168071168072168073168074168075168076168077168078168079168080168081168082168083168084168085168086168087168088168089168090168091168092168093168094168095168096168097168098168099168100168101168102168103168104168105168106168107168108168109168110168111168112168113168114168115168116168117168118168119168120168121168122168123168124168125168126168127168128168129168130168131168132168133168134168135168136168137168138168139168140168141168142168143168144168145168146168147168148168149168150168151168152168153168154168155168156168157168158168159168160168161168162168163168164168165168166168167168168168169168170168171168172168173168174168175168176168177168178168179168180168181168182168183168184168185168186168187168188168189168190168191168192168193168194168195168196168197168198168199168200168201168202168203168204168205168206168207168208168209168210168211168212168213168214168215168216168217168218168219168220168221168222168223168224168225168226168227168228168229168230168231168232168233168234168235168236168237168238168239168240168241168242168243168244168245168246168247168248168249168250168251168252168253168254168255168256168257168258168259168260168261168262168263168264168265168266168267168268168269168270168271168272168273168274168275168276168277168278168279168280168281168282168283168284168285168286168287168288168289168290168291168292168293168294168295168296168297168298168299168300168301168302168303168304168305168306168307168308168309168310168311168312168313168314168315168316168317168318168319168320168321168322168323168324168325168326168327168328168329168330168331168332168333168334168335168336168337168338168339168340168341168342168343168344168345168346168347168348168349168350168351168352168353168354168355168356168357168358168359168360168361168362168363168364168365168366168367168368168369168370168371168372168373168374168375168376168377168378168379168380168381168382168383168384168385168386168387168388168389168390168391168392168393168394168395168396168397168398168399168400168401168402168403168404168405168406168407168408168409168410168411168412168413168414168415168416168417168418168419168420168421168422168423168424168425168426168427168428168429168430168431168432168433168434168435168436168437168438168439168440168441168442168443168444168445168446168447168448168449168450168451168452168453168454168455168456168457168458168459168460168461168462168463168464168465168466168467168468168469168470168471168472168473168474168475168476168477168478168479168480168481168482168483168484168485168486168487168488168489168490168491168492168493168494168495168496168497168498168499168500168501168502168503168504168505168506168507168508168509168510168511168512168513168514168515168516168517168518168519168520168521168522168523168524168525168526168527168528168529168530168531168532168533168534168535168536168537168538168539168540168541168542168543168544168545168546168547168548168549168550168551168552168553168554168555168556168557168558168559168560168561168562168563168564168565168566168567168568168569168570168571168572168573168574168575168576168577168578168579168580168581168582168583168584168585168586168587168588168589168590168591168592168593168594168595168596168597168598168599168600168601168602168603168604168605168606168607168608168609168610168611168612168613168614168615168616168617168618168619168620168621168622168623168624168625168626168627168628168629168630168631168632168633168634168635168636168637168638168639168640168641168642168643168644168645168646168647168648168649168650168651168652168653168654168655168656168657168658168659168660168661168662168663168664168665168666168667168668168669168670168671168672168673168674168675168676168677168678168679168680168681168682168683168684168685168686168687168688168689168690168691168692168693168694168695168696168697168698168699168700168701168702168703168704168705168706168707168708168709168710168711168712168713168714168715168716168717168718168719168720168721168722168723168724168725168726168727168728168729168730168731168732168733168734168735168736168737168738168739168740168741168742168743168744168745168746168747168748168749168750168751168752168753168754168755168756168757168758168759168760168761168762168763168764168765168766168767168768168769168770168771168772168773168774168775168776168777168778168779168780168781168782168783168784168785168786168787168788168789168790168791168792168793168794168795168796168797168798168799168800168801168802168803168804168805168806168807168808168809168810168811168812168813168814168815168816168817168818168819168820168821168822168823168824168825168826168827168828168829168830168831168832168833168834168835168836168837168838168839168840168841168842168843168844168845168846168847168848168849168850168851168852168853168854168855168856168857168858168859168860168861168862168863168864168865168866168867168868168869168870168871168872168873168874168875168876168877168878168879168880168881168882168883168884168885168886168887168888168889168890168891168892168893168894168895168896168897168898168899168900168901168902168903168904168905168906168907168908168909168910168911168912168913168914168915168916168917168918168919168920168921168922168923168924168925168926168927168928168929168930168931168932168933168934168935168936168937168938168939168940168941168942168943168944168945168946168947168948168949168950168951168952168953168954168955168956168957168958168959168960168961168962168963168964168965168966168967168968168969168970168971168972168973168974168975168976168977168978168979168980168981168982168983168984168985168986168987168988168989168990168991168992168993168994168995168996168997168998168999169000169001169002169003169004169005169006169007169008169009169010169011169012169013169014169015169016169017169018169019169020169021169022169023169024169025169026169027169028169029169030169031169032169033169034169035169036169037169038169039169040169041169042169043169044169045169046169047169048169049169050169051169052169053169054169055169056169057169058169059169060169061169062169063169064169065169066169067169068169069169070169071169072169073169074169075169076169077169078169079169080169081169082169083169084169085169086169087169088169089169090169091169092169093169094169095169096169097169098169099169100169101169102169103169104169105169106169107169108169109169110169111169112169113169114169115169116169117169118169119169120169121169122169123169124169125169126169127169128169129169130169131169132169133169134169135169136169137169138169139169140169141169142169143169144169145169146169147169148169149169150169151169152169153169154169155169156169157169158169159169160169161169162169163169164169165169166169167169168169169169170169171169172169173169174169175169176169177169178169179169180169181169182169183169184169185169186169187169188169189169190169191169192169193169194169195169196169197169198169199169200169201169202169203169204169205169206169207169208169209169210169211169212169213169214169215169216169217169218169219169220169221169222169223169224169225169226169227169228169229169230169231169232169233169234169235169236169237169238169239169240169241169242169243169244169245169246169247169248169249169250169251169252169253169254169255169256169257169258169259169260169261169262169263169264169265169266169267169268169269169270169271169272169273169274169275169276169277169278169279169280169281169282169283169284169285169286169287169288169289169290169291169292169293169294169295169296169297169298169299169300169301169302169303169304169305169306169307169308169309169310169311169312169313169314169315169316169317169318169319169320169321169322169323169324169325169326169327169328169329169330169331169332169333169334169335169336169337169338169339169340169341169342169343169344169345169346169347169348169349169350169351169352169353169354169355169356169357169358169359169360169361169362169363169364169365169366169367169368169369169370169371169372169373169374169375169376169377169378169379169380169381169382169383169384169385169386169387169388169389169390169391169392169393169394169395169396169397169398169399169400169401169402169403169404169405169406169407169408169409169410169411169412169413169414169415169416169417169418169419169420169421169422169423169424169425169426169427169428169429169430169431169432169433169434169435169436169437169438169439169440169441169442169443169444169445169446169447169448169449169450169451169452169453169454169455169456169457169458169459169460169461169462169463169464169465169466169467169468169469169470169471169472169473169474169475169476169477169478169479169480169481169482169483169484169485169486169487169488169489169490169491169492169493169494169495169496169497169498169499169500169501169502169503169504169505169506169507169508169509169510169511169512169513169514169515169516169517169518169519169520169521169522169523169524169525169526169527169528169529169530169531169532169533169534169535169536169537169538169539169540169541169542169543169544169545169546169547169548169549169550169551169552169553169554169555169556169557169558169559169560169561169562169563169564169565169566169567169568169569169570169571169572169573169574169575169576169577169578169579169580169581169582169583169584169585169586169587169588169589169590169591169592169593169594169595169596169597169598169599169600169601169602169603169604169605169606169607169608169609169610169611169612169613169614169615169616169617169618169619169620169621169622169623169624169625169626169627169628169629169630169631169632169633169634169635169636169637169638169639169640169641169642169643169644169645169646169647169648169649169650169651169652169653169654169655169656169657169658169659169660169661169662169663169664169665169666169667169668169669169670169671169672169673169674169675169676169677169678169679169680169681169682169683169684169685169686169687169688169689169690169691169692169693169694169695169696169697169698169699169700169701169702169703169704169705169706169707169708169709169710169711169712169713169714169715169716169717169718169719169720169721169722169723169724169725169726169727169728169729169730169731169732169733169734169735169736169737169738169739169740169741169742169743169744169745169746169747169748169749169750169751169752169753169754169755169756169757169758169759169760169761169762169763169764169765169766169767169768169769169770169771169772169773169774169775169776169777169778169779169780169781169782169783169784169785169786169787169788169789169790169791169792169793169794169795169796169797169798169799169800169801169802169803169804169805169806169807169808169809169810169811169812169813169814169815169816169817169818169819169820169821169822169823169824169825169826169827169828169829169830169831169832169833169834169835169836169837169838169839169840169841169842169843169844169845169846169847169848169849169850169851169852169853169854169855169856169857169858169859169860169861169862169863169864169865169866169867169868169869169870169871169872169873169874169875169876169877169878169879169880169881169882169883169884169885169886169887169888169889169890169891169892169893169894169895169896169897169898169899169900169901169902169903169904169905169906169907169908169909169910169911169912169913169914169915169916169917169918169919169920169921169922169923169924169925169926169927169928169929169930169931169932169933169934169935169936169937169938169939169940169941169942169943169944169945169946169947169948169949169950169951169952169953169954169955169956169957169958169959169960169961169962169963169964169965169966169967169968169969169970169971169972169973169974169975169976169977169978169979169980169981169982169983169984169985169986169987169988169989169990169991169992169993169994169995169996169997169998169999170000170001170002170003170004170005170006170007170008170009170010170011170012170013170014170015170016170017170018170019170020170021170022170023170024170025170026170027170028170029170030170031170032170033170034170035170036170037170038170039170040170041170042170043170044170045170046170047170048170049170050170051170052170053170054170055170056170057170058170059170060170061170062170063170064170065170066170067170068170069170070170071170072170073170074170075170076170077170078170079170080170081170082170083170084170085170086170087170088170089170090170091170092170093170094170095170096170097170098170099170100170101170102170103170104170105170106170107170108170109170110170111170112170113170114170115170116170117170118170119170120170121170122170123170124170125170126170127170128170129170130170131170132170133170134170135170136170137170138170139170140170141170142170143170144170145170146170147170148170149170150170151170152170153170154170155170156170157170158170159170160170161170162170163170164170165170166170167170168170169170170170171170172170173170174170175170176170177170178170179170180170181170182170183170184170185170186170187170188170189170190170191170192170193170194170195170196170197170198170199170200170201170202170203170204170205170206170207170208170209170210170211170212170213170214170215170216170217170218170219170220170221170222170223170224170225170226170227170228170229170230170231170232170233170234170235170236170237170238170239170240170241170242170243170244170245170246170247170248170249170250170251170252170253170254170255170256170257170258170259170260170261170262170263170264170265170266170267170268170269170270170271170272170273170274170275170276170277170278170279170280170281170282170283170284170285170286170287170288170289170290170291170292170293170294170295170296170297170298170299170300170301170302170303170304170305170306170307170308170309170310170311170312170313170314170315170316170317170318170319170320170321170322170323170324170325170326170327170328170329170330170331170332170333170334170335170336170337170338170339170340170341170342170343170344170345170346170347170348170349170350170351170352170353170354170355170356170357170358170359170360170361170362170363170364170365170366170367170368170369170370170371170372170373170374170375170376170377170378170379170380170381170382170383170384170385170386170387170388170389170390170391170392170393170394170395170396170397170398170399170400170401170402170403170404170405170406170407170408170409170410170411170412170413170414170415170416170417170418170419170420170421170422170423170424170425170426170427170428170429170430170431170432170433170434170435170436170437170438170439170440170441170442170443170444170445170446170447170448170449170450170451170452170453170454170455170456170457170458170459170460170461170462170463170464170465170466170467170468170469170470170471170472170473170474170475170476170477170478170479170480170481170482170483170484170485170486170487170488170489170490170491170492170493170494170495170496170497170498170499170500170501170502170503170504170505170506170507170508170509170510170511170512170513170514170515170516170517170518170519170520170521170522170523170524170525170526170527170528170529170530170531170532170533170534170535170536170537170538170539170540170541170542170543170544170545170546170547170548170549170550170551170552170553170554170555170556170557170558170559170560170561170562170563170564170565170566170567170568170569170570170571170572170573170574170575170576170577170578170579170580170581170582170583170584170585170586170587170588170589170590170591170592170593170594170595170596170597170598170599170600170601170602170603170604170605170606170607170608170609170610170611170612170613170614170615170616170617170618170619170620170621170622170623170624170625170626170627170628170629170630170631170632170633170634170635170636170637170638170639170640170641170642170643170644170645170646170647170648170649170650170651170652170653170654170655170656170657170658170659170660170661170662170663170664170665170666170667170668170669170670170671170672170673170674170675170676170677170678170679170680170681170682170683170684170685170686170687170688170689170690170691170692170693170694170695170696170697170698170699170700170701170702170703170704170705170706170707170708170709170710170711170712170713170714170715170716170717170718170719170720170721170722170723170724170725170726170727170728170729170730170731170732170733170734170735170736170737170738170739170740170741170742170743170744170745170746170747170748170749170750170751170752170753170754170755170756170757170758170759170760170761170762170763170764170765170766170767170768170769170770170771170772170773170774170775170776170777170778170779170780170781170782170783170784170785170786170787170788170789170790170791170792170793170794170795170796170797170798170799170800170801170802170803170804170805170806170807170808170809170810170811170812170813170814170815170816170817170818170819170820170821170822170823170824170825170826170827170828170829170830170831170832170833170834170835170836170837170838170839170840170841170842170843170844170845170846170847170848170849170850170851170852170853170854170855170856170857170858170859170860170861170862170863170864170865170866170867170868170869170870170871170872170873170874170875170876170877170878170879170880170881170882170883170884170885170886170887170888170889170890170891170892170893170894170895170896170897170898170899170900170901170902170903170904170905170906170907170908170909170910170911170912170913170914170915170916170917170918170919170920170921170922170923170924170925170926170927170928170929170930170931170932170933170934170935170936170937170938170939170940170941170942170943170944170945170946170947170948170949170950170951170952170953170954170955170956170957170958170959170960170961170962170963170964170965170966170967170968170969170970170971170972170973170974170975170976170977170978170979170980170981170982170983170984170985170986170987170988170989170990170991170992170993170994170995170996170997170998170999171000171001171002171003171004171005171006171007171008171009171010171011171012171013171014171015171016171017171018171019171020171021171022171023171024171025171026171027171028171029171030171031171032171033171034171035171036171037171038171039171040171041171042171043171044171045171046171047171048171049171050171051171052171053171054171055171056171057171058171059171060171061171062171063171064171065171066171067171068171069171070171071171072171073171074171075171076171077171078171079171080171081171082171083171084171085171086171087171088171089171090171091171092171093171094171095171096171097171098171099171100171101171102171103171104171105171106171107171108171109171110171111171112171113171114171115171116171117171118171119171120171121171122171123171124171125171126171127171128171129171130171131171132171133171134171135171136171137171138171139171140171141171142171143171144171145171146171147171148171149171150171151171152171153171154171155171156171157171158171159171160171161171162171163171164171165171166171167171168171169171170171171171172171173171174171175171176171177171178171179171180171181171182171183171184171185171186171187171188171189171190171191171192171193171194171195171196171197171198171199171200171201171202171203171204171205171206171207171208171209171210171211171212171213171214171215171216171217171218171219171220171221171222171223171224171225171226171227171228171229171230171231171232171233171234171235171236171237171238171239171240171241171242171243171244171245171246171247171248171249171250171251171252171253171254171255171256171257171258171259171260171261171262171263171264171265171266171267171268171269171270171271171272171273171274171275171276171277171278171279171280171281171282171283171284171285171286171287171288171289171290171291171292171293171294171295171296171297171298171299171300171301171302171303171304171305171306171307171308171309171310171311171312171313171314171315171316171317171318171319171320171321171322171323171324171325171326171327171328171329171330171331171332171333171334171335171336171337171338171339171340171341171342171343171344171345171346171347171348171349171350171351171352171353171354171355171356171357171358171359171360171361171362171363171364171365171366171367171368171369171370171371171372171373171374171375171376171377171378171379171380171381171382171383171384171385171386171387171388171389171390171391171392171393171394171395171396171397171398171399171400171401171402171403171404171405171406171407171408171409171410171411171412171413171414171415171416171417171418171419171420171421171422171423171424171425171426171427171428171429171430171431171432171433171434171435171436171437171438171439171440171441171442171443171444171445171446171447171448171449171450171451171452171453171454171455171456171457171458171459171460171461171462171463171464171465171466171467171468171469171470171471171472171473171474171475171476171477171478171479171480171481171482171483171484171485171486171487171488171489171490171491171492171493171494171495171496171497171498171499171500171501171502171503171504171505171506171507171508171509171510171511171512171513171514171515171516171517171518171519171520171521171522171523171524171525171526171527171528171529171530171531171532171533171534171535171536171537171538171539171540171541171542171543171544171545171546171547171548171549171550171551171552171553171554171555171556171557171558171559171560171561171562171563171564171565171566171567171568171569171570171571171572171573171574171575171576171577171578171579171580171581171582171583171584171585171586171587171588171589171590171591171592171593171594171595171596171597171598171599171600171601171602171603171604171605171606171607171608171609171610171611171612171613171614171615171616171617171618171619171620171621171622171623171624171625171626171627171628171629171630171631171632171633171634171635171636171637171638171639171640171641171642171643171644171645171646171647171648171649171650171651171652171653171654171655171656171657171658171659171660171661171662171663171664171665171666171667171668171669171670171671171672171673171674171675171676171677171678171679171680171681171682171683171684171685171686171687171688171689171690171691171692171693171694171695171696171697171698171699171700171701171702171703171704171705171706171707171708171709171710171711171712171713171714171715171716171717171718171719171720171721171722171723171724171725171726171727171728171729171730171731171732171733171734171735171736171737171738171739171740171741171742171743171744171745171746171747171748171749171750171751171752171753171754171755171756171757171758171759171760171761171762171763171764171765171766171767171768171769171770171771171772171773171774171775171776171777171778171779171780171781171782171783171784171785171786171787171788171789171790171791171792171793171794171795171796171797171798171799171800171801171802171803171804171805171806171807171808171809171810171811171812171813171814171815171816171817171818171819171820171821171822171823171824171825171826171827171828171829171830171831171832171833171834171835171836171837171838171839171840171841171842171843171844171845171846171847171848171849171850171851171852171853171854171855171856171857171858171859171860171861171862171863171864171865171866171867171868171869171870171871171872171873171874171875171876171877171878171879171880171881171882171883171884171885171886171887171888171889171890171891171892171893171894171895171896171897171898171899171900171901171902171903171904171905171906171907171908171909171910171911171912171913171914171915171916171917171918171919171920171921171922171923171924171925171926171927171928171929171930171931171932171933171934171935171936171937171938171939171940171941171942171943171944171945171946171947171948171949171950171951171952171953171954171955171956171957171958171959171960171961171962171963171964171965171966171967171968171969171970171971171972171973171974171975171976171977171978171979171980171981171982171983171984171985171986171987171988171989171990171991171992171993171994171995171996171997171998171999172000172001172002172003172004172005172006172007172008172009172010172011172012172013172014172015172016172017172018172019172020172021172022172023172024172025172026172027172028172029172030172031172032172033172034172035172036172037172038172039172040172041172042172043172044172045172046172047172048172049172050172051172052172053172054172055172056172057172058172059172060172061172062172063172064172065172066172067172068172069172070172071172072172073172074172075172076172077172078172079172080172081172082172083172084172085172086172087172088172089172090172091172092172093172094172095172096172097172098172099172100172101172102172103172104172105172106172107172108172109172110172111172112172113172114172115172116172117172118172119172120172121172122172123172124172125172126172127172128172129172130172131172132172133172134172135172136172137172138172139172140172141172142172143172144172145172146172147172148172149172150172151172152172153172154172155172156172157172158172159172160172161172162172163172164172165172166172167172168172169172170172171172172172173172174172175172176172177172178172179172180172181172182172183172184172185172186172187172188172189172190172191172192172193172194172195172196172197172198172199172200172201172202172203172204172205172206172207172208172209172210172211172212172213172214172215172216172217172218172219172220172221172222172223172224172225172226172227172228172229172230172231172232172233172234172235172236172237172238172239172240172241172242172243172244172245172246172247172248172249172250172251172252172253172254172255172256172257172258172259172260172261172262172263172264172265172266172267172268172269172270172271172272172273172274172275172276172277172278172279172280172281172282172283172284172285172286172287172288172289172290172291172292172293172294172295172296172297172298172299172300172301172302172303172304172305172306172307172308172309172310172311172312172313172314172315172316172317172318172319172320172321172322172323172324172325172326172327172328172329172330172331172332172333172334172335172336172337172338172339172340172341172342172343172344172345172346172347172348172349172350172351172352172353172354172355172356172357172358172359172360172361172362172363172364172365172366172367172368172369172370172371172372172373172374172375172376172377172378172379172380172381172382172383172384172385172386172387172388172389172390172391172392172393172394172395172396172397172398172399172400172401172402172403172404172405172406172407172408172409172410172411172412172413172414172415172416172417172418172419172420172421172422172423172424172425172426172427172428172429172430172431172432172433172434172435172436172437172438172439172440172441172442172443172444172445172446172447172448172449172450172451172452172453172454172455172456172457172458172459172460172461172462172463172464172465172466172467172468172469172470172471172472172473172474172475172476172477172478172479172480172481172482172483172484172485172486172487172488172489172490172491172492172493172494172495172496172497172498172499172500172501172502172503172504172505172506172507172508172509172510172511172512172513172514172515172516172517172518172519172520172521172522172523172524172525172526172527172528172529172530172531172532172533172534172535172536172537172538172539172540172541172542172543172544172545172546172547172548172549172550172551172552172553172554172555172556172557172558172559172560172561172562172563172564172565172566172567172568172569172570172571172572172573172574172575172576172577172578172579172580172581172582172583172584172585172586172587172588172589172590172591172592172593172594172595172596172597172598172599172600172601172602172603172604172605172606172607172608172609172610172611172612172613172614172615172616172617172618172619172620172621172622172623172624172625172626172627172628172629172630172631172632172633172634172635172636172637172638172639172640172641172642172643172644172645172646172647172648172649172650172651172652172653172654172655172656172657172658172659172660172661172662172663172664172665172666172667172668172669172670172671172672172673172674172675172676172677172678172679172680172681172682172683172684172685172686172687172688172689172690172691172692172693172694172695172696172697172698172699172700172701172702172703172704172705172706172707172708172709172710172711172712172713172714172715172716172717172718172719172720172721172722172723172724172725172726172727172728172729172730172731172732172733172734172735172736172737172738172739172740172741172742172743172744172745172746172747172748172749172750172751172752172753172754172755172756172757172758172759172760172761172762172763172764172765172766172767172768172769172770172771172772172773172774172775172776172777172778172779172780172781172782172783172784172785172786172787172788172789172790172791172792172793172794172795172796172797172798172799172800172801172802172803172804172805172806172807172808172809172810172811172812172813172814172815172816172817172818172819172820172821172822172823172824172825172826172827172828172829172830172831172832172833172834172835172836172837172838172839172840172841172842172843172844172845172846172847172848172849172850172851172852172853172854172855172856172857172858172859172860172861172862172863172864172865172866172867172868172869172870172871172872172873172874172875172876172877172878172879172880172881172882172883172884172885172886172887172888172889172890172891172892172893172894172895172896172897172898172899172900172901172902172903172904172905172906172907172908172909172910172911172912172913172914172915172916172917172918172919172920172921172922172923172924172925172926172927172928172929172930172931172932172933172934172935172936172937172938172939172940172941172942172943172944172945172946172947172948172949172950172951172952172953172954172955172956172957172958172959172960172961172962172963172964172965172966172967172968172969172970172971172972172973172974172975172976172977172978172979172980172981172982172983172984172985172986172987172988172989172990172991172992172993172994172995172996172997172998172999173000173001173002173003173004173005173006173007173008173009173010173011173012173013173014173015173016173017173018173019173020173021173022173023173024173025173026173027173028173029173030173031173032173033173034173035173036173037173038173039173040173041173042173043173044173045173046173047173048173049173050173051173052173053173054173055173056173057173058173059173060173061173062173063173064173065173066173067173068173069173070173071173072173073173074173075173076173077173078173079173080173081173082173083173084173085173086173087173088173089173090173091173092173093173094173095173096173097173098173099173100173101173102173103173104173105173106173107173108173109173110173111173112173113173114173115173116173117173118173119173120173121173122173123173124173125173126173127173128173129173130173131173132173133173134173135173136173137173138173139173140173141173142173143173144173145173146173147173148173149173150173151173152173153173154173155173156173157173158173159173160173161173162173163173164173165173166173167173168173169173170173171173172173173173174173175173176173177173178173179173180173181173182173183173184173185173186173187173188173189173190173191173192173193173194173195173196173197173198173199173200173201173202173203173204173205173206173207173208173209173210173211173212173213173214173215173216173217173218173219173220173221173222173223173224173225173226173227173228173229173230173231173232173233173234173235173236173237173238173239173240173241173242173243173244173245173246173247173248173249173250173251173252173253173254173255173256173257173258173259173260173261173262173263173264173265173266173267173268173269173270173271173272173273173274173275173276173277173278173279173280173281173282173283173284173285173286173287173288173289173290173291173292173293173294173295173296173297173298173299173300173301173302173303173304173305173306173307173308173309173310173311173312173313173314173315173316173317173318173319173320173321173322173323173324173325173326173327173328173329173330173331173332173333173334173335173336173337173338173339173340173341173342173343173344173345173346173347173348173349173350173351173352173353173354173355173356173357173358173359173360173361173362173363173364173365173366173367173368173369173370173371173372173373173374173375173376173377173378173379173380173381173382173383173384173385173386173387173388173389173390173391173392173393173394173395173396173397173398173399173400173401173402173403173404173405173406173407173408173409173410173411173412173413173414173415173416173417173418173419173420173421173422173423173424173425173426173427173428173429173430173431173432173433173434173435173436173437173438173439173440173441173442173443173444173445173446173447173448173449173450173451173452173453173454173455173456173457173458173459173460173461173462173463173464173465173466173467173468173469173470173471173472173473173474173475173476173477173478173479173480173481173482173483173484173485173486173487173488173489173490173491173492173493173494173495173496173497173498173499173500173501173502173503173504173505173506173507173508173509173510173511173512173513173514173515173516173517173518173519173520173521173522173523173524173525173526173527173528173529173530173531173532173533173534173535173536173537173538173539173540173541173542173543173544173545173546173547173548173549173550173551173552173553173554173555173556173557173558173559173560173561173562173563173564173565173566173567173568173569173570173571173572173573173574173575173576173577173578173579173580173581173582173583173584173585173586173587173588173589173590173591173592173593173594173595173596173597173598173599173600173601173602173603173604173605173606173607173608173609173610173611173612173613173614173615173616173617173618173619173620173621173622173623173624173625173626173627173628173629173630173631173632173633173634173635173636173637173638173639173640173641173642173643173644173645173646173647173648173649173650173651173652173653173654173655173656173657173658173659173660173661173662173663173664173665173666173667173668173669173670173671173672173673173674173675173676173677173678173679173680173681173682173683173684173685173686173687173688173689173690173691173692173693173694173695173696173697173698173699173700173701173702173703173704173705173706173707173708173709173710173711173712173713173714173715173716173717173718173719173720173721173722173723173724173725173726173727173728173729173730173731173732173733173734173735173736173737173738173739173740173741173742173743173744173745173746173747173748173749173750173751173752173753173754173755173756173757173758173759173760173761173762173763173764173765173766173767173768173769173770173771173772173773173774173775173776173777173778173779173780173781173782173783173784173785173786173787173788173789173790173791173792173793173794173795173796173797173798173799173800173801173802173803173804173805173806173807173808173809173810173811173812173813173814173815173816173817173818173819173820173821173822173823173824173825173826173827173828173829173830173831173832173833173834173835173836173837173838173839173840173841173842173843173844173845173846173847173848173849173850173851173852173853173854173855173856173857173858173859173860173861173862173863173864173865173866173867173868173869173870173871173872173873173874173875173876173877173878173879173880173881173882173883173884173885173886173887173888173889173890173891173892173893173894173895173896173897173898173899173900173901173902173903173904173905173906173907173908173909173910173911173912173913173914173915173916173917173918173919173920173921173922173923173924173925173926173927173928173929173930173931173932173933173934173935173936173937173938173939173940173941173942173943173944173945173946173947173948173949173950173951173952173953173954173955173956173957173958173959173960173961173962173963173964173965173966173967173968173969173970173971173972173973173974173975173976173977173978173979173980173981173982173983173984173985173986173987173988173989173990173991173992173993173994173995173996173997173998173999174000174001174002174003174004174005174006174007174008174009174010174011174012174013174014174015174016174017174018174019174020174021174022174023174024174025174026174027174028174029174030174031174032174033174034174035174036174037174038174039174040174041174042174043174044174045174046174047174048174049174050174051174052174053174054174055174056174057174058174059174060174061174062174063174064174065174066174067174068174069174070174071174072174073174074174075174076174077174078174079174080174081174082174083174084174085174086174087174088174089174090174091174092174093174094174095174096174097174098174099174100174101174102174103174104174105174106174107174108174109174110174111174112174113174114174115174116174117174118174119174120174121174122174123174124174125174126174127174128174129174130174131174132174133174134174135174136174137174138174139174140174141174142174143174144174145174146174147174148174149174150174151174152174153174154174155174156174157174158174159174160174161174162174163174164174165174166174167174168174169174170174171174172174173174174174175174176174177174178174179174180174181174182174183174184174185174186174187174188174189174190174191174192174193174194174195174196174197174198174199174200174201174202174203174204174205174206174207174208174209174210174211174212174213174214174215174216174217174218174219174220174221174222174223174224174225174226174227174228174229174230174231174232174233174234174235174236174237174238174239174240174241174242174243174244174245174246174247174248174249174250174251174252174253174254174255174256174257174258174259174260174261174262174263174264174265174266174267174268174269174270174271174272174273174274174275174276174277174278174279174280174281174282174283174284174285174286174287174288174289174290174291174292174293174294174295174296174297174298174299174300174301174302174303174304174305174306174307174308174309174310174311174312174313174314174315174316174317174318174319174320174321174322174323174324174325174326174327174328174329174330174331174332174333174334174335174336174337174338174339174340174341174342174343174344174345174346174347174348174349174350174351174352174353174354174355174356174357174358174359174360174361174362174363174364174365174366174367174368174369174370174371174372174373174374174375174376174377174378174379174380174381174382174383174384174385174386174387174388174389174390174391174392174393174394174395174396174397174398174399174400174401174402174403174404174405174406174407174408174409174410174411174412174413174414174415174416174417174418174419174420174421174422174423174424174425174426174427174428174429174430174431174432174433174434174435174436174437174438174439174440174441174442174443174444174445174446174447174448174449174450174451174452174453174454174455174456174457174458174459174460174461174462174463174464174465174466174467174468174469174470174471174472174473174474174475174476174477174478174479174480174481174482174483174484174485174486174487174488174489174490174491174492174493174494174495174496174497174498174499174500174501174502174503174504174505174506174507174508174509174510174511174512174513174514174515174516174517174518174519174520174521174522174523174524174525174526174527174528174529174530174531174532174533174534174535174536174537174538174539174540174541174542174543174544174545174546174547174548174549174550174551174552174553174554174555174556174557174558174559174560174561174562174563174564174565174566174567174568174569174570174571174572174573174574174575174576174577174578174579174580174581174582174583174584174585174586174587174588174589174590174591174592174593174594174595174596174597174598174599174600174601174602174603174604174605174606174607174608174609174610174611174612174613174614174615174616174617174618174619174620174621174622174623174624174625174626174627174628174629174630174631174632174633174634174635174636174637174638174639174640174641174642174643174644174645174646174647174648174649174650174651174652174653174654174655174656174657174658174659174660174661174662174663174664174665174666174667174668174669174670174671174672174673174674174675174676174677174678174679174680174681174682174683174684174685174686174687174688174689174690174691174692174693174694174695174696174697174698174699174700174701174702174703174704174705174706174707174708174709174710174711174712174713174714174715174716174717174718174719174720174721174722174723174724174725174726174727174728174729174730174731174732174733174734174735174736174737174738174739174740174741174742174743174744174745174746174747174748174749174750174751174752174753174754174755174756174757174758174759174760174761174762174763174764174765174766174767174768174769174770174771174772174773174774174775174776174777174778174779174780174781174782174783174784174785174786174787174788174789174790174791174792174793174794174795174796174797174798174799174800174801174802174803174804174805174806174807174808174809174810174811174812174813174814174815174816174817174818174819174820174821174822174823174824174825174826174827174828174829174830174831174832174833174834174835174836174837174838174839174840174841174842174843174844174845174846174847174848174849174850174851174852174853174854174855174856174857174858174859174860174861174862174863174864174865174866174867174868174869174870174871174872174873174874174875174876174877174878174879174880174881174882174883174884174885174886174887174888174889174890174891174892174893174894174895174896174897174898174899174900174901174902174903174904174905174906174907174908174909174910174911174912174913174914174915174916174917174918174919174920174921174922174923174924174925174926174927174928174929174930174931174932174933174934174935174936174937174938174939174940174941174942174943174944174945174946174947174948174949174950174951174952174953174954174955174956174957174958174959174960174961174962174963174964174965174966174967174968174969174970174971174972174973174974174975174976174977174978174979174980174981174982174983174984174985174986174987174988174989174990174991174992174993174994174995174996174997174998174999175000175001175002175003175004175005175006175007175008175009175010175011175012175013175014175015175016175017175018175019175020175021175022175023175024175025175026175027175028175029175030175031175032175033175034175035175036175037175038175039175040175041175042175043175044175045175046175047175048175049175050175051175052175053175054175055175056175057175058175059175060175061175062175063175064175065175066175067175068175069175070175071175072175073175074175075175076175077175078175079175080175081175082175083175084175085175086175087175088175089175090175091175092175093175094175095175096175097175098175099175100175101175102175103175104175105175106175107175108175109175110175111175112175113175114175115175116175117175118175119175120175121175122175123175124175125175126175127175128175129175130175131175132175133175134175135175136175137175138175139175140175141175142175143175144175145175146175147175148175149175150175151175152175153175154175155175156175157175158175159175160175161175162175163175164175165175166175167175168175169175170175171175172175173175174175175175176175177175178175179175180175181175182175183175184175185175186175187175188175189175190175191175192175193175194175195175196175197175198175199175200175201175202175203175204175205175206175207175208175209175210175211175212175213175214175215175216175217175218175219175220175221175222175223175224175225175226175227175228175229175230175231175232175233175234175235175236175237175238175239175240175241175242175243175244175245175246175247175248175249175250175251175252175253175254175255175256175257175258175259175260175261175262175263175264175265175266175267175268175269175270175271175272175273175274175275175276175277175278175279175280175281175282175283175284175285175286175287175288175289175290175291175292175293175294175295175296175297175298175299175300175301175302175303175304175305175306175307175308175309175310175311175312175313175314175315175316175317175318175319175320175321175322175323175324175325175326175327175328175329175330175331175332175333175334175335175336175337175338175339175340175341175342175343175344175345175346175347175348175349175350175351175352175353175354175355175356175357175358175359175360175361175362175363175364175365175366175367175368175369175370175371175372175373175374175375175376175377175378175379175380175381175382175383175384175385175386175387175388175389175390175391175392175393175394175395175396175397175398175399175400175401175402175403175404175405175406175407175408175409175410175411175412175413175414175415175416175417175418175419175420175421175422175423175424175425175426175427175428175429175430175431175432175433175434175435175436175437175438175439175440175441175442175443175444175445175446175447175448175449175450175451175452175453175454175455175456175457175458175459175460175461175462175463175464175465175466175467175468175469175470175471175472175473175474175475175476175477175478175479175480175481175482175483175484175485175486175487175488175489175490175491175492175493175494175495175496175497175498175499175500175501175502175503175504175505175506175507175508175509175510175511175512175513175514175515175516175517175518175519175520175521175522175523175524175525175526175527175528175529175530175531175532175533175534175535175536175537175538175539175540175541175542175543175544175545175546175547175548175549175550175551175552175553175554175555175556175557175558175559175560175561175562175563175564175565175566175567175568175569175570175571175572175573175574175575175576175577175578175579175580175581175582175583175584175585175586175587175588175589175590175591175592175593175594175595175596175597175598175599175600175601175602175603175604175605175606175607175608175609175610175611175612175613175614175615175616175617175618175619175620175621175622175623175624175625175626175627175628175629175630175631175632175633175634175635175636175637175638175639175640175641175642175643175644175645175646175647175648175649175650175651175652175653175654175655175656175657175658175659175660175661175662175663175664175665175666175667175668175669175670175671175672175673175674175675175676175677175678175679175680175681175682175683175684175685175686175687175688175689175690175691175692175693175694175695175696175697175698175699175700175701175702175703175704175705175706175707175708175709175710175711175712175713175714175715175716175717175718175719175720175721175722175723175724175725175726175727175728175729175730175731175732175733175734175735175736175737175738175739175740175741175742175743175744175745175746175747175748175749175750175751175752175753175754175755175756175757175758175759175760175761175762175763175764175765175766175767175768175769175770175771175772175773175774175775175776175777175778175779175780175781175782175783175784175785175786175787175788175789175790175791175792175793175794175795175796175797175798175799175800175801175802175803175804175805175806175807175808175809175810175811175812175813175814175815175816175817175818175819175820175821175822175823175824175825175826175827175828175829175830175831175832175833175834175835175836175837175838175839175840175841175842175843175844175845175846175847175848175849175850175851175852175853175854175855175856175857175858175859175860175861175862175863175864175865175866175867175868175869175870175871175872175873175874175875175876175877175878175879175880175881175882175883175884175885175886175887175888175889175890175891175892175893175894175895175896175897175898175899175900175901175902175903175904175905175906175907175908175909175910175911175912175913175914175915175916175917175918175919175920175921175922175923175924175925175926175927175928175929175930175931175932175933175934175935175936175937175938175939175940175941175942175943175944175945175946175947175948175949175950175951175952175953175954175955175956175957175958175959175960175961175962175963175964175965175966175967175968175969175970175971175972175973175974175975175976175977175978175979175980175981175982175983175984175985175986175987175988175989175990175991175992175993175994175995175996175997175998175999176000176001176002176003176004176005176006176007176008176009176010176011176012176013176014176015176016176017176018176019176020176021176022176023176024176025176026176027176028176029176030176031176032176033176034176035176036176037176038176039176040176041176042176043176044176045176046176047176048176049176050176051176052176053176054176055176056176057176058176059176060176061176062176063176064176065176066176067176068176069176070176071176072176073176074176075176076176077176078176079176080176081176082176083176084176085176086176087176088176089176090176091176092176093176094176095176096176097176098176099176100176101176102176103176104176105176106176107176108176109176110176111176112176113176114176115176116176117176118176119176120176121176122176123176124176125176126176127176128176129176130176131176132176133176134176135176136176137176138176139176140176141176142176143176144176145176146176147176148176149176150176151176152176153176154176155176156176157176158176159176160176161176162176163176164176165176166176167176168176169176170176171176172176173176174176175176176176177176178176179176180176181176182176183176184176185176186176187176188176189176190176191176192176193176194176195176196176197176198176199176200176201176202176203176204176205176206176207176208176209176210176211176212176213176214176215176216176217176218176219176220176221176222176223176224176225176226176227176228176229176230176231176232176233176234176235176236176237176238176239176240176241176242176243176244176245176246176247176248176249176250176251176252176253176254176255176256176257176258176259176260176261176262176263176264176265176266176267176268176269176270176271176272176273176274176275176276176277176278176279176280176281176282176283176284176285176286176287176288176289176290176291176292176293176294176295176296176297176298176299176300176301176302176303176304176305176306176307176308176309176310176311176312176313176314176315176316176317176318176319176320176321176322176323176324176325176326176327176328176329176330176331176332176333176334176335176336176337176338176339176340176341176342176343176344176345176346176347176348176349176350176351176352176353176354176355176356176357176358176359176360176361176362176363176364176365176366176367176368176369176370176371176372176373176374176375176376176377176378176379176380176381176382176383176384176385176386176387176388176389176390176391176392176393176394176395176396176397176398176399176400176401176402176403176404176405176406176407176408176409176410176411176412176413176414176415176416176417176418176419176420176421176422176423176424176425176426176427176428176429176430176431176432176433176434176435176436176437176438176439176440176441176442176443176444176445176446176447176448176449176450176451176452176453176454176455176456176457176458176459176460176461176462176463176464176465176466176467176468176469176470176471176472176473176474176475176476176477176478176479176480176481176482176483176484176485176486176487176488176489176490176491176492176493176494176495176496176497176498176499176500176501176502176503176504176505176506176507176508176509176510176511176512176513176514176515176516176517176518176519176520176521176522176523176524176525176526176527176528176529176530176531176532176533176534176535176536176537176538176539176540176541176542176543176544176545176546176547176548176549176550176551176552176553176554176555176556176557176558176559176560176561176562176563176564176565176566176567176568176569176570176571176572176573176574176575176576176577176578176579176580176581176582176583176584176585176586176587176588176589176590176591176592176593176594176595176596176597176598176599176600176601176602176603176604176605176606176607176608176609176610176611176612176613176614176615176616176617176618176619176620176621176622176623176624176625176626176627176628176629176630176631176632176633176634176635176636176637176638176639176640176641176642176643176644176645176646176647176648176649176650176651176652176653176654176655176656176657176658176659176660176661176662176663176664176665176666176667176668176669176670176671176672176673176674176675176676176677176678176679176680176681176682176683176684176685176686176687176688176689176690176691176692176693176694176695176696176697176698176699176700176701176702176703176704176705176706176707176708176709176710176711176712176713176714176715176716176717176718176719176720176721176722176723176724176725176726176727176728176729176730176731176732176733176734176735176736176737176738176739176740176741176742176743176744176745176746176747176748176749176750176751176752176753176754176755176756176757176758176759176760176761176762176763176764176765176766176767176768176769176770176771176772176773176774176775176776176777176778176779176780176781176782176783176784176785176786176787176788176789176790176791176792176793176794176795176796176797176798176799176800176801176802176803176804176805176806176807176808176809176810176811176812176813176814176815176816176817176818176819176820176821176822176823176824176825176826176827176828176829176830176831176832176833176834176835176836176837176838176839176840176841176842176843176844176845176846176847176848176849176850176851176852176853176854176855176856176857176858176859176860176861176862176863176864176865176866176867176868176869176870176871176872176873176874176875176876176877176878176879176880176881176882176883176884176885176886176887176888176889176890176891176892176893176894176895176896176897176898176899176900176901176902176903176904176905176906176907176908176909176910176911176912176913176914176915176916176917176918176919176920176921176922176923176924176925176926176927176928176929176930176931176932176933176934176935176936176937176938176939176940176941176942176943176944176945176946176947176948176949176950176951176952176953176954176955176956176957176958176959176960176961176962176963176964176965176966176967176968176969176970176971176972176973176974176975176976176977176978176979176980176981176982176983176984176985176986176987176988176989176990176991176992176993176994176995176996176997176998176999177000177001177002177003177004177005177006177007177008177009177010177011177012177013177014177015177016177017177018177019177020177021177022177023177024177025177026177027177028177029177030177031177032177033177034177035177036177037177038177039177040177041177042177043177044177045177046177047177048177049177050177051177052177053177054177055177056177057177058177059177060177061177062177063177064177065177066177067177068177069177070177071177072177073177074177075177076177077177078177079177080177081177082177083177084177085177086177087177088177089177090177091177092177093177094177095177096177097177098177099177100177101177102177103177104177105177106177107177108177109177110177111177112177113177114177115177116177117177118177119177120177121177122177123177124177125177126177127177128177129177130177131177132177133177134177135177136177137177138177139177140177141177142177143177144177145177146177147177148177149177150177151177152177153177154177155177156177157177158177159177160177161177162177163177164177165177166177167177168177169177170177171177172177173177174177175177176177177177178177179177180177181177182177183177184177185177186177187177188177189177190177191177192177193177194177195177196177197177198177199177200177201177202177203177204177205177206177207177208177209177210177211177212177213177214177215177216177217177218177219177220177221177222177223177224177225177226177227177228177229177230177231177232177233177234177235177236177237177238177239177240177241177242177243177244177245177246177247177248177249177250177251177252177253177254177255177256177257177258177259177260177261177262177263177264177265177266177267177268177269177270177271177272177273177274177275177276177277177278177279177280177281177282177283177284177285177286177287177288177289177290177291177292177293177294177295177296177297177298177299177300177301177302177303177304177305177306177307177308177309177310177311177312177313177314177315177316177317177318177319177320177321177322177323177324177325177326177327177328177329177330177331177332177333177334177335177336177337177338177339177340177341177342177343177344177345177346177347177348177349177350177351177352177353177354177355177356177357177358177359177360177361177362177363177364177365177366177367177368177369177370177371177372177373177374177375177376177377177378177379177380177381177382177383177384177385177386177387177388177389177390177391177392177393177394177395177396177397177398177399177400177401177402177403177404177405177406177407177408177409177410177411177412177413177414177415177416177417177418177419177420177421177422177423177424177425177426177427177428177429177430177431177432177433177434177435177436177437177438177439177440177441177442177443177444177445177446177447177448177449177450177451177452177453177454177455177456177457177458177459177460177461177462177463177464177465177466177467177468177469177470177471177472177473177474177475177476177477177478177479177480177481177482177483177484177485177486177487177488177489177490177491177492177493177494177495177496177497177498177499177500177501177502177503177504177505177506177507177508177509177510177511177512177513177514177515177516177517177518177519177520177521177522177523177524177525177526177527177528177529177530177531177532177533177534177535177536177537177538177539177540177541177542177543177544177545177546177547177548177549177550177551177552177553177554177555177556177557177558177559177560177561177562177563177564177565177566177567177568177569177570177571177572177573177574177575177576177577177578177579177580177581177582177583177584177585177586177587177588177589177590177591177592177593177594177595177596177597177598177599177600177601177602177603177604177605177606177607177608177609177610177611177612177613177614177615177616177617177618177619177620177621177622177623177624177625177626177627177628177629177630177631177632177633177634177635177636177637177638177639177640177641177642177643177644177645177646177647177648177649177650177651177652177653177654177655177656177657177658177659177660177661177662177663177664177665177666177667177668177669177670177671177672177673177674177675177676177677177678177679177680177681177682177683177684177685177686177687177688177689177690177691177692177693177694177695177696177697177698177699177700177701177702177703177704177705177706177707177708177709177710177711177712177713177714177715177716177717177718177719177720177721177722177723177724177725177726177727177728177729177730177731177732177733177734177735177736177737177738177739177740177741177742177743177744177745177746177747177748177749177750177751177752177753177754177755177756177757177758177759177760177761177762177763177764177765177766177767177768177769177770177771177772177773177774177775177776177777177778177779177780177781177782177783177784177785177786177787177788177789177790177791177792177793177794177795177796177797177798177799177800177801177802177803177804177805177806177807177808177809177810177811177812177813177814177815177816177817177818177819177820177821177822177823177824177825177826177827177828177829177830177831177832177833177834177835177836177837177838177839177840177841177842177843177844177845177846177847177848177849177850177851177852177853177854177855177856177857177858177859177860177861177862177863177864177865177866177867177868177869177870177871177872177873177874177875177876177877177878177879177880177881177882177883177884177885177886177887177888177889177890177891177892177893177894177895177896177897177898177899177900177901177902177903177904177905177906177907177908177909177910177911177912177913177914177915177916177917177918177919177920177921177922177923177924177925177926177927177928177929177930177931177932177933177934177935177936177937177938177939177940177941177942177943177944177945177946177947177948177949177950177951177952177953177954177955177956177957177958177959177960177961177962177963177964177965177966177967177968177969177970177971177972177973177974177975177976177977177978177979177980177981177982177983177984177985177986177987177988177989177990177991177992177993177994177995177996177997177998177999178000178001178002178003178004178005178006178007178008178009178010178011178012178013178014178015178016178017178018178019178020178021178022178023178024178025178026178027178028178029178030178031178032178033178034178035178036178037178038178039178040178041178042178043178044178045178046178047178048178049178050178051178052178053178054178055178056178057178058178059178060178061178062178063178064178065178066178067178068178069178070178071178072178073178074178075178076178077178078178079178080178081178082178083178084178085178086178087178088178089178090178091178092178093178094178095178096178097178098178099178100178101178102178103178104178105178106178107178108178109178110178111178112178113178114178115178116178117178118178119178120178121178122178123178124178125178126178127178128178129178130178131178132178133178134178135178136178137178138178139178140178141178142178143178144178145178146178147178148178149178150178151178152178153178154178155178156178157178158178159178160178161178162178163178164178165178166178167178168178169178170178171178172178173178174178175178176178177178178178179178180178181178182178183178184178185178186178187178188178189178190178191178192178193178194178195178196178197178198178199178200178201178202178203178204178205178206178207178208178209178210178211178212178213178214178215178216178217178218178219178220178221178222178223178224178225178226178227178228178229178230178231178232178233178234178235178236178237178238178239178240178241178242178243178244178245178246178247178248178249178250178251178252178253178254178255178256178257178258178259178260178261178262178263178264178265178266178267178268178269178270178271178272178273178274178275178276178277178278178279178280178281178282178283178284178285178286178287178288178289178290178291178292178293178294178295178296178297178298178299178300178301178302178303178304178305178306178307178308178309178310178311178312178313178314178315178316178317178318178319178320178321178322178323178324178325178326178327178328178329178330178331178332178333178334178335178336178337178338178339178340178341178342178343178344178345178346178347178348178349178350178351178352178353178354178355178356178357178358178359178360178361178362178363178364178365178366178367178368178369178370178371178372178373178374178375178376178377178378178379178380178381178382178383178384178385178386178387178388178389178390178391178392178393178394178395178396178397178398178399178400178401178402178403178404178405178406178407178408178409178410178411178412178413178414178415178416178417178418178419178420178421178422178423178424178425178426178427178428178429178430178431178432178433178434178435178436178437178438178439178440178441178442178443178444178445178446178447178448178449178450178451178452178453178454178455178456178457178458178459178460178461178462178463178464178465178466178467178468178469178470178471178472178473178474178475178476178477178478178479178480178481178482178483178484178485178486178487178488178489178490178491178492178493178494178495178496178497178498178499178500178501178502178503178504178505178506178507178508178509178510178511178512178513178514178515178516178517178518178519178520178521178522178523178524178525178526178527178528178529178530178531178532178533178534178535178536178537178538178539178540178541178542178543178544178545178546178547178548178549178550178551178552178553178554178555178556178557178558178559178560178561178562178563178564178565178566178567178568178569178570178571178572178573178574178575178576178577178578178579178580178581178582178583178584178585178586178587178588178589178590178591178592178593178594178595178596178597178598178599178600178601178602178603178604178605178606178607178608178609178610178611178612178613178614178615178616178617178618178619178620178621178622178623178624178625178626178627178628178629178630178631178632178633178634178635178636178637178638178639178640178641178642178643178644178645178646178647178648178649178650178651178652178653178654178655178656178657178658178659178660178661178662178663178664178665178666178667178668178669178670178671178672178673178674178675178676178677178678178679178680178681178682178683178684178685178686178687178688178689178690178691178692178693178694178695178696178697178698178699178700178701178702178703178704178705178706178707178708178709178710178711178712178713178714178715178716178717178718178719178720178721178722178723178724178725178726178727178728178729178730178731178732178733178734178735178736178737178738178739178740178741178742178743178744178745178746178747178748178749178750178751178752178753178754178755178756178757178758178759178760178761178762178763178764178765178766178767178768178769178770178771178772178773178774178775178776178777178778178779178780178781178782178783178784178785178786178787178788178789178790178791178792178793178794178795178796178797178798178799178800178801178802178803178804178805178806178807178808178809178810178811178812178813178814178815178816178817178818178819178820178821178822178823178824178825178826178827178828178829178830178831178832178833178834178835178836178837178838178839178840178841178842178843178844178845178846178847178848178849178850178851178852178853178854178855178856178857178858178859178860178861178862178863178864178865178866178867178868178869178870178871178872178873178874178875178876178877178878178879178880178881178882178883178884178885178886178887178888178889178890178891178892178893178894178895178896178897178898178899178900178901178902178903178904178905178906178907178908178909178910178911178912178913178914178915178916178917178918178919178920178921178922178923178924178925178926178927178928178929178930178931178932178933178934178935178936178937178938178939178940178941178942178943178944178945178946178947178948178949178950178951178952178953178954178955178956178957178958178959178960178961178962178963178964178965178966178967178968178969178970178971178972178973178974178975178976178977178978178979178980178981178982178983178984178985178986178987178988178989178990178991178992178993178994178995178996178997178998178999179000179001179002179003179004179005179006179007179008179009179010179011179012179013179014179015179016179017179018179019179020179021179022179023179024179025179026179027179028179029179030179031179032179033179034179035179036179037179038179039179040179041179042179043179044179045179046179047179048179049179050179051179052179053179054179055179056179057179058179059179060179061179062179063179064179065179066179067179068179069179070179071179072179073179074179075179076179077179078179079179080179081179082179083179084179085179086179087179088179089179090179091179092179093179094179095179096179097179098179099179100179101179102179103179104179105179106179107179108179109179110179111179112179113179114179115179116179117179118179119179120179121179122179123179124179125179126179127179128179129179130179131179132179133179134179135179136179137179138179139179140179141179142179143179144179145179146179147179148179149179150179151179152179153179154179155179156179157179158179159179160179161179162179163179164179165179166179167179168179169179170179171179172179173179174179175179176179177179178179179179180179181179182179183179184179185179186179187179188179189179190179191179192179193179194179195179196179197179198179199179200179201179202179203179204179205179206179207179208179209179210179211179212179213179214179215179216179217179218179219179220179221179222179223179224179225179226179227179228179229179230179231179232179233179234179235179236179237179238179239179240179241179242179243179244179245179246179247179248179249179250179251179252179253179254179255179256179257179258179259179260179261179262179263179264179265179266179267179268179269179270179271179272179273179274179275179276179277179278179279179280179281179282179283179284179285179286179287179288179289179290179291179292179293179294179295179296179297179298179299179300179301179302179303179304179305179306179307179308179309179310179311179312179313179314179315179316179317179318179319179320179321179322179323179324179325179326179327179328179329179330179331179332179333179334179335179336179337179338179339179340179341179342179343179344179345179346179347179348179349179350179351179352179353179354179355179356179357179358179359179360179361179362179363179364179365179366179367179368179369179370179371179372179373179374179375179376179377179378179379179380179381179382179383179384179385179386179387179388179389179390179391179392179393179394179395179396179397179398179399179400179401179402179403179404179405179406179407179408179409179410179411179412179413179414179415179416179417179418179419179420179421179422179423179424179425179426179427179428179429179430179431179432179433179434179435179436179437179438179439179440179441179442179443179444179445179446179447179448179449179450179451179452179453179454179455179456179457179458179459179460179461179462179463179464179465179466179467179468179469179470179471179472179473179474179475179476179477179478179479179480179481179482179483179484179485179486179487179488179489179490179491179492179493179494179495179496179497179498179499179500179501179502179503179504179505179506179507179508179509179510179511179512179513179514179515179516179517179518179519179520179521179522179523179524179525179526179527179528179529179530179531179532179533179534179535179536179537179538179539179540179541179542179543179544179545179546179547179548179549179550179551179552179553179554179555179556179557179558179559179560179561179562179563179564179565179566179567179568179569179570179571179572179573179574179575179576179577179578179579179580179581179582179583179584179585179586179587179588179589179590179591179592179593179594179595179596179597179598179599179600179601179602179603179604179605179606179607179608179609179610179611179612179613179614179615179616179617179618179619179620179621179622179623179624179625179626179627179628179629179630179631179632179633179634179635179636179637179638179639179640179641179642179643179644179645179646179647179648179649179650179651179652179653179654179655179656179657179658179659179660179661179662179663179664179665179666179667179668179669179670179671179672179673179674179675179676179677179678179679179680179681179682179683179684179685179686179687179688179689179690179691179692179693179694179695179696179697179698179699179700179701179702179703179704179705179706179707179708179709179710179711179712179713179714179715179716179717179718179719179720179721179722179723179724179725179726179727179728179729179730179731179732179733179734179735179736179737179738179739179740179741179742179743179744179745179746179747179748179749179750179751179752179753179754179755179756179757179758179759179760179761179762179763179764179765179766179767179768179769179770179771179772179773179774179775179776179777179778179779179780179781179782179783179784179785179786179787179788179789179790179791179792179793179794179795179796179797179798179799179800179801179802179803179804179805179806179807179808179809179810179811179812179813179814179815179816179817179818179819179820179821179822179823179824179825179826179827179828179829179830179831179832179833179834179835179836179837179838179839179840179841179842179843179844179845179846179847179848179849179850179851179852179853179854179855179856179857179858179859179860179861179862179863179864179865179866179867179868179869179870179871179872179873179874179875179876179877179878179879179880179881179882179883179884179885179886179887179888179889179890179891179892179893179894179895179896179897179898179899179900179901179902179903179904179905179906179907179908179909179910179911179912179913179914179915179916179917179918179919179920179921179922179923179924179925179926179927179928179929179930179931179932179933179934179935179936179937179938179939179940179941179942179943179944179945179946179947179948179949179950179951179952179953179954179955179956179957179958179959179960179961179962179963179964179965179966179967179968179969179970179971179972179973179974179975179976179977179978179979179980179981179982179983179984179985179986179987179988179989179990179991179992179993179994179995179996179997179998179999180000180001180002180003180004180005180006180007180008180009180010180011180012180013180014180015180016180017180018180019180020180021180022180023180024180025180026180027180028180029180030180031180032180033180034180035180036180037180038180039180040180041180042180043180044180045180046180047180048180049180050180051180052180053180054180055180056180057180058180059180060180061180062180063180064180065180066180067180068180069180070180071180072180073180074180075180076180077180078180079180080180081180082180083180084180085180086180087180088180089180090180091180092180093180094180095180096180097180098180099180100180101180102180103180104180105180106180107180108180109180110180111180112180113180114180115180116180117180118180119180120180121180122180123180124180125180126180127180128180129180130180131180132180133180134180135180136180137180138180139180140180141180142180143180144180145180146180147180148180149180150180151180152180153180154180155180156180157180158180159180160180161180162180163180164180165180166180167180168180169180170180171180172180173180174180175180176180177180178180179180180180181180182180183180184180185180186180187180188180189180190180191180192180193180194180195180196180197180198180199180200180201180202180203180204180205180206180207180208180209180210180211180212180213180214180215180216180217180218180219180220180221180222180223180224180225180226180227180228180229180230180231180232180233180234180235180236180237180238180239180240180241180242180243180244180245180246180247180248180249180250180251180252180253180254180255180256180257180258180259180260180261180262180263180264180265180266180267180268180269180270180271180272180273180274180275180276180277180278180279180280180281180282180283180284180285180286180287180288180289180290180291180292180293180294180295180296180297180298180299180300180301180302180303180304180305180306180307180308180309180310180311180312180313180314180315180316180317180318180319180320180321180322180323180324180325180326180327180328180329180330180331180332180333180334180335180336180337180338180339180340180341180342180343180344180345180346180347180348180349180350180351180352180353180354180355180356180357180358180359180360180361180362180363180364180365180366180367180368180369180370180371180372180373180374180375180376180377180378180379180380180381180382180383180384180385180386180387180388180389180390180391180392180393180394180395180396180397180398180399180400180401180402180403180404180405180406180407180408180409180410180411180412180413180414180415180416180417180418180419180420180421180422180423180424180425180426180427180428180429180430180431180432180433180434180435180436180437180438180439180440180441180442180443180444180445180446180447180448180449180450180451180452180453180454180455180456180457180458180459180460180461180462180463180464180465180466180467180468180469180470180471180472180473180474180475180476180477180478180479180480180481180482180483180484180485180486180487180488180489180490180491180492180493180494180495180496180497180498180499180500180501180502180503180504180505180506180507180508180509180510180511180512180513180514180515180516180517180518180519180520180521180522180523180524180525180526180527180528180529180530180531180532180533180534180535180536180537180538180539180540180541180542180543180544180545180546180547180548180549180550180551180552180553180554180555180556180557180558180559180560180561180562180563180564180565180566180567180568180569180570180571180572180573180574180575180576180577180578180579180580180581180582180583180584180585180586180587180588180589180590180591180592180593180594180595180596180597180598180599180600180601180602180603180604180605180606180607180608180609180610180611180612180613180614180615180616180617180618180619180620180621180622180623180624180625180626180627180628180629180630180631180632180633180634180635180636180637180638180639180640180641180642180643180644180645180646180647180648180649180650180651180652180653180654180655180656180657180658180659180660180661180662180663180664180665180666180667180668180669180670180671180672180673180674180675180676180677180678180679180680180681180682180683180684180685180686180687180688180689180690180691180692180693180694180695180696180697180698180699180700180701180702180703180704180705180706180707180708180709180710180711180712180713180714180715180716180717180718180719180720180721180722180723180724180725180726180727180728180729180730180731180732180733180734180735180736180737180738180739180740180741180742180743180744180745180746180747180748180749180750180751180752180753180754180755180756180757180758180759180760180761180762180763180764180765180766180767180768180769180770180771180772180773180774180775180776180777180778180779180780180781180782180783180784180785180786180787180788180789180790180791180792180793180794180795180796180797180798180799180800180801180802180803180804180805180806180807180808180809180810180811180812180813180814180815180816180817180818180819180820180821180822180823180824180825180826180827180828180829180830180831180832180833180834180835180836180837180838180839180840180841180842180843180844180845180846180847180848180849180850180851180852180853180854180855180856180857180858180859180860180861180862180863180864180865180866180867180868180869180870180871180872180873180874180875180876180877180878180879180880180881180882180883180884180885180886180887180888180889180890180891180892180893180894180895180896180897180898180899180900180901180902180903180904180905180906180907180908180909180910180911180912180913180914180915180916180917180918180919180920180921180922180923180924180925180926180927180928180929180930180931180932180933180934180935180936180937180938180939180940180941180942180943180944180945180946180947180948180949180950180951180952180953180954180955180956180957180958180959180960180961180962180963180964180965180966180967180968180969180970180971180972180973180974180975180976180977180978180979180980180981180982180983180984180985180986180987180988180989180990180991180992180993180994180995180996180997180998180999181000181001181002181003181004181005181006181007181008181009181010181011181012181013181014181015181016181017181018181019181020181021181022181023181024181025181026181027181028181029181030181031181032181033181034181035181036181037181038181039181040181041181042181043181044181045181046181047181048181049181050181051181052181053181054181055181056181057181058181059181060181061181062181063181064181065181066181067181068181069181070181071181072181073181074181075181076181077181078181079181080181081181082181083181084181085181086181087181088181089181090181091181092181093181094181095181096181097181098181099181100181101181102181103181104181105181106181107181108181109181110181111181112181113181114181115181116181117181118181119181120181121181122181123181124181125181126181127181128181129181130181131181132181133181134181135181136181137181138181139181140181141181142181143181144181145181146181147181148181149181150181151181152181153181154181155181156181157181158181159181160181161181162181163181164181165181166181167181168181169181170181171181172181173181174181175181176181177181178181179181180181181181182181183181184181185181186181187181188181189181190181191181192181193181194181195181196181197181198181199181200181201181202181203181204181205181206181207181208181209181210181211181212181213181214181215181216181217181218181219181220181221181222181223181224181225181226181227181228181229181230181231181232181233181234181235181236181237181238181239181240181241181242181243181244181245181246181247181248181249181250181251181252181253181254181255181256181257181258181259181260181261181262181263181264181265181266181267181268181269181270181271181272181273181274181275181276181277181278181279181280181281181282181283181284181285181286181287181288181289181290181291181292181293181294181295181296181297181298181299181300181301181302181303181304181305181306181307181308181309181310181311181312181313181314181315181316181317181318181319181320181321181322181323181324181325181326181327181328181329181330181331181332181333181334181335181336181337181338181339181340181341181342181343181344181345181346181347181348181349181350181351181352181353181354181355181356181357181358181359181360181361181362181363181364181365181366181367181368181369181370181371181372181373181374181375181376181377181378181379181380181381181382181383181384181385181386181387181388181389181390181391181392181393181394181395181396181397181398181399181400181401181402181403181404181405181406181407181408181409181410181411181412181413181414181415181416181417181418181419181420181421181422181423181424181425181426181427181428181429181430181431181432181433181434181435181436181437181438181439181440181441181442181443181444181445181446181447181448181449181450181451181452181453181454181455181456181457181458181459181460181461181462181463181464181465181466181467181468181469181470181471181472181473181474181475181476181477181478181479181480181481181482181483181484181485181486181487181488181489181490181491181492181493181494181495181496181497181498181499181500181501181502181503181504181505181506181507181508181509181510181511181512181513181514181515181516181517181518181519181520181521181522181523181524181525181526181527181528181529181530181531181532181533181534181535181536181537181538181539181540181541181542181543181544181545181546181547181548181549181550181551181552181553181554181555181556181557181558181559181560181561181562181563181564181565181566181567181568181569181570181571181572181573181574181575181576181577181578181579181580181581181582181583181584181585181586181587181588181589181590181591181592181593181594181595181596181597181598181599181600181601181602181603181604181605181606181607181608181609181610181611181612181613181614181615181616181617181618181619181620181621181622181623181624181625181626181627181628181629181630181631181632181633181634181635181636181637181638181639181640181641181642181643181644181645181646181647181648181649181650181651181652181653181654181655181656181657181658181659181660181661181662181663181664181665181666181667181668181669181670181671181672181673181674181675181676181677181678181679181680181681181682181683181684181685181686181687181688181689181690181691181692181693181694181695181696181697181698181699181700181701181702181703181704181705181706181707181708181709181710181711181712181713181714181715181716181717181718181719181720181721181722181723181724181725181726181727181728181729181730181731181732181733181734181735181736181737181738181739181740181741181742181743181744181745181746181747181748181749181750181751181752181753181754181755181756181757181758181759181760181761181762181763181764181765181766181767181768181769181770181771181772181773181774181775181776181777181778181779181780181781181782181783181784181785181786181787181788181789181790181791181792181793181794181795181796181797181798181799181800181801181802181803181804181805181806181807181808181809181810181811181812181813181814181815181816181817181818181819181820181821181822181823181824181825181826181827181828181829181830181831181832181833181834181835181836181837181838181839181840181841181842181843181844181845181846181847181848181849181850181851181852181853181854181855181856181857181858181859181860181861181862181863181864181865181866181867181868181869181870181871181872181873181874181875181876181877181878181879181880181881181882181883181884181885181886181887181888181889181890181891181892181893181894181895181896181897181898181899181900181901181902181903181904181905181906181907181908181909181910181911181912181913181914181915181916181917181918181919181920181921181922181923181924181925181926181927181928181929181930181931181932181933181934181935181936181937181938181939181940181941181942181943181944181945181946181947181948181949181950181951181952181953181954181955181956181957181958181959181960181961181962181963181964181965181966181967181968181969181970181971181972181973181974181975181976181977181978181979181980181981181982181983181984181985181986181987181988181989181990181991181992181993181994181995181996181997181998181999182000182001182002182003182004182005182006182007182008182009182010182011182012182013182014182015182016182017182018182019182020182021182022182023182024182025182026182027182028182029182030182031182032182033182034182035182036182037182038182039182040182041182042182043182044182045182046182047182048182049182050182051182052182053182054182055182056182057182058182059182060182061182062182063182064182065182066182067182068182069182070182071182072182073182074182075182076182077182078182079182080182081182082182083182084182085182086182087182088182089182090182091182092182093182094182095182096182097182098182099182100182101182102182103182104182105182106182107182108182109182110182111182112182113182114182115182116182117182118182119182120182121182122182123182124182125182126182127182128182129182130182131182132182133182134182135182136182137182138182139182140182141182142182143182144182145182146182147182148182149182150182151182152182153182154182155182156182157182158182159182160182161182162182163182164182165182166182167182168182169182170182171182172182173182174182175182176182177182178182179182180182181182182182183182184182185182186182187182188182189182190182191182192182193182194182195182196182197182198182199182200182201182202182203182204182205182206182207182208182209182210182211182212182213182214182215182216182217182218182219182220182221182222182223182224182225182226182227182228182229182230182231182232182233182234182235182236182237182238182239182240182241182242182243182244182245182246182247182248182249182250182251182252182253182254182255182256182257182258182259182260182261182262182263182264182265182266182267182268182269182270182271182272182273182274182275182276182277182278182279182280182281182282182283182284182285182286182287182288182289182290182291182292182293182294182295182296182297182298182299182300182301182302182303182304182305182306182307182308182309182310182311182312182313182314182315182316182317182318182319182320182321182322182323182324182325182326182327182328182329182330182331182332182333182334182335182336182337182338182339182340182341182342182343182344182345182346182347182348182349182350182351182352182353182354182355182356182357182358182359182360182361182362182363182364182365182366182367182368182369182370182371182372182373182374182375182376182377182378182379182380182381182382182383182384182385182386182387182388182389182390182391182392182393182394182395182396182397182398182399182400182401182402182403182404182405182406182407182408182409182410182411182412182413182414182415182416182417182418182419182420182421182422182423182424182425182426182427182428182429182430182431182432182433182434182435182436182437182438182439182440182441182442182443182444182445182446182447182448182449182450182451182452182453182454182455182456182457182458182459182460182461182462182463182464182465182466182467182468182469182470182471182472182473182474182475182476182477182478182479182480182481182482182483182484182485182486182487182488182489182490182491182492182493182494182495182496182497182498182499182500182501182502182503182504182505182506182507182508182509182510182511182512182513182514182515182516182517182518182519182520182521182522182523182524182525182526182527182528182529182530182531182532182533182534182535182536182537182538182539182540182541182542182543182544182545182546182547182548182549182550182551182552182553182554182555182556182557182558182559182560182561182562182563182564182565182566182567182568182569182570182571182572182573182574182575182576182577182578182579182580182581182582182583182584182585182586182587182588182589182590182591182592182593182594182595182596182597182598182599182600182601182602182603182604182605182606182607182608182609182610182611182612182613182614182615182616182617182618182619182620182621182622182623182624182625182626182627182628182629182630182631182632182633182634182635182636182637182638182639182640182641182642182643182644182645182646182647182648182649182650182651182652182653182654182655182656182657182658182659182660182661182662182663182664182665182666182667182668182669182670182671182672182673182674182675182676182677182678182679182680182681182682182683182684182685182686182687182688182689182690182691182692182693182694182695182696182697182698182699182700182701182702182703182704182705182706182707182708182709182710182711182712182713182714182715182716182717182718182719182720182721182722182723182724182725182726182727182728182729182730182731182732182733182734182735182736182737182738182739182740182741182742182743182744182745182746182747182748182749182750182751182752182753182754182755182756182757182758182759182760182761182762182763182764182765182766182767182768182769182770182771182772182773182774182775182776182777182778182779182780182781182782182783182784182785182786182787182788182789182790182791182792182793182794182795182796182797182798182799182800182801182802182803182804182805182806182807182808182809182810182811182812182813182814182815182816182817182818182819182820182821182822182823182824182825182826182827182828182829182830182831182832182833182834182835182836182837182838182839182840182841182842182843182844182845182846182847182848182849182850182851182852182853182854182855182856182857182858182859182860182861182862182863182864182865182866182867182868182869182870182871182872182873182874182875182876182877182878182879182880182881182882182883182884182885182886182887182888182889182890182891182892182893182894182895182896182897182898182899182900182901182902182903182904182905182906182907182908182909182910182911182912182913182914182915182916182917182918182919182920182921182922182923182924182925182926182927182928182929182930182931182932182933182934182935182936182937182938182939182940182941182942182943182944182945182946182947182948182949182950182951182952182953182954182955182956182957182958182959182960182961182962182963182964182965182966182967182968182969182970182971182972182973182974182975182976182977182978182979182980182981182982182983182984182985182986182987182988182989182990182991182992182993182994182995182996182997182998182999183000183001183002183003183004183005183006183007183008183009183010183011183012183013183014183015183016183017183018183019183020183021183022183023183024183025183026183027183028183029183030183031183032183033183034183035183036183037183038183039183040183041183042183043183044183045183046183047183048183049183050183051183052183053183054183055183056183057183058183059183060183061183062183063183064183065183066183067183068183069183070183071183072183073183074183075183076183077183078183079183080183081183082183083183084183085183086183087183088183089183090183091183092183093183094183095183096183097183098183099183100183101183102183103183104183105183106183107183108183109183110183111183112183113183114183115183116183117183118183119183120183121183122183123183124183125183126183127183128183129183130183131183132183133183134183135183136183137183138183139183140183141183142183143183144183145183146183147183148183149183150183151183152183153183154183155183156183157183158183159183160183161183162183163183164183165183166183167183168183169183170183171183172183173183174183175183176183177183178183179183180183181183182183183183184183185183186183187183188183189183190183191183192183193183194183195183196183197183198183199183200183201183202183203183204183205183206183207183208183209183210183211183212183213183214183215183216183217183218183219183220183221183222183223183224183225183226183227183228183229183230183231183232183233183234183235183236183237183238183239183240183241183242183243183244183245183246183247183248183249183250183251183252183253183254183255183256183257183258183259183260183261183262183263183264183265183266183267183268183269183270183271183272183273183274183275183276183277183278183279183280183281183282183283183284183285183286183287183288183289183290183291183292183293183294183295183296183297183298183299183300183301183302183303183304183305183306183307183308183309183310183311183312183313183314183315183316183317183318183319183320183321183322183323183324183325183326183327183328183329183330183331183332183333183334183335183336183337183338183339183340183341183342183343183344183345183346183347183348183349183350183351183352183353183354183355183356183357183358183359183360183361183362183363183364183365183366183367183368183369183370183371183372183373183374183375183376183377183378183379183380183381183382183383183384183385183386183387183388183389183390183391183392183393183394183395183396183397183398183399183400183401183402183403183404183405183406183407183408183409183410183411183412183413183414183415183416183417183418183419183420183421183422183423183424183425183426183427183428183429183430183431183432183433183434183435183436183437183438183439183440183441183442183443183444183445183446183447183448183449183450183451183452183453183454183455183456183457183458183459183460183461183462183463183464183465183466183467183468183469183470183471183472183473183474183475183476183477183478183479183480183481183482183483183484183485183486183487183488183489183490183491183492183493183494183495183496183497183498183499183500183501183502183503183504183505183506183507183508183509183510183511183512183513183514183515183516183517183518183519183520183521183522183523183524183525183526183527183528183529183530183531183532183533183534183535183536183537183538183539183540183541183542183543183544183545183546183547183548183549183550183551183552183553183554183555183556183557183558183559183560183561183562183563183564183565183566183567183568183569183570183571183572183573183574183575183576183577183578183579183580183581183582183583183584183585183586183587183588183589183590183591183592183593183594183595183596183597183598183599183600183601183602183603183604183605183606183607183608183609183610183611183612183613183614183615183616183617183618183619183620183621183622183623183624183625183626183627183628183629183630183631183632183633183634183635183636183637183638183639183640183641183642183643183644183645183646183647183648183649183650183651183652183653183654183655183656183657183658183659183660183661183662183663183664183665183666183667183668183669183670183671183672183673183674183675183676183677183678183679183680183681183682183683183684183685183686183687183688183689183690183691183692183693183694183695183696183697183698183699183700183701183702183703183704183705183706183707183708183709183710183711183712183713183714183715183716183717183718183719183720183721183722183723183724183725183726183727183728183729183730183731183732183733183734183735183736183737183738183739183740183741183742183743183744183745183746183747183748183749183750183751183752183753183754183755183756183757183758183759183760183761183762183763183764183765183766183767183768183769183770183771183772183773183774183775183776183777183778183779183780183781183782183783183784183785183786183787183788183789183790183791183792183793183794183795183796183797183798183799183800183801183802183803183804183805183806183807183808183809183810183811183812183813183814183815183816183817183818183819183820183821183822183823183824183825183826183827183828183829183830183831183832183833183834183835183836183837183838183839183840183841183842183843183844183845183846183847183848183849183850183851183852183853183854183855183856183857183858183859183860183861183862183863183864183865183866183867183868183869183870183871183872183873183874183875183876183877183878183879183880183881183882183883183884183885183886183887183888183889183890183891183892183893183894183895183896183897183898183899183900183901183902183903183904183905183906183907183908183909183910183911183912183913183914183915183916183917183918183919183920183921183922183923183924183925183926183927183928183929183930183931183932183933183934183935183936183937183938183939183940183941183942183943183944183945183946183947183948183949183950183951183952183953183954183955183956183957183958183959183960183961183962183963183964183965183966183967183968183969183970183971183972183973183974183975183976183977183978183979183980183981183982183983183984183985183986183987183988183989183990183991183992183993183994183995183996183997183998183999184000184001184002184003184004184005184006184007184008184009184010184011184012184013184014184015184016184017184018184019184020184021184022184023184024184025184026184027184028184029184030184031184032184033184034184035184036184037184038184039184040184041184042184043184044184045184046184047184048184049184050184051184052184053184054184055184056184057184058184059184060184061184062184063184064184065184066184067184068184069184070184071184072184073184074184075184076184077184078184079184080184081184082184083184084184085184086184087184088184089184090184091184092184093184094184095184096184097184098184099184100184101184102184103184104184105184106184107184108184109184110184111184112184113184114184115184116184117184118184119184120184121184122184123184124184125184126184127184128184129184130184131184132184133184134184135184136184137184138184139184140184141184142184143184144184145184146184147184148184149184150184151184152184153184154184155184156184157184158184159184160184161184162184163184164184165184166184167184168184169184170184171184172184173184174184175184176184177184178184179184180184181184182184183184184184185184186184187184188184189184190184191184192184193184194184195184196184197184198184199184200184201184202184203184204184205184206184207184208184209184210184211184212184213184214184215184216184217184218184219184220184221184222184223184224184225184226184227184228184229184230184231184232184233184234184235184236184237184238184239184240184241184242184243184244184245184246184247184248184249184250184251184252184253184254184255184256184257184258184259184260184261184262184263184264184265184266184267184268184269184270184271184272184273184274184275184276184277184278184279184280184281184282184283184284184285184286184287184288184289184290184291184292184293184294184295184296184297184298184299184300184301184302184303184304184305184306184307184308184309184310184311184312184313184314184315184316184317184318184319184320184321184322184323184324184325184326184327184328184329184330184331184332184333184334184335184336184337184338184339184340184341184342184343184344184345184346184347184348184349184350184351184352184353184354184355184356184357184358184359184360184361184362184363184364184365184366184367184368184369184370184371184372184373184374184375184376184377184378184379184380184381184382184383184384184385184386184387184388184389184390184391184392184393184394184395184396184397184398184399184400184401184402184403184404184405184406184407184408184409184410184411184412184413184414184415184416184417184418184419184420184421184422184423184424184425184426184427184428184429184430184431184432184433184434184435184436184437184438184439184440184441184442184443184444184445184446184447184448184449184450184451184452184453184454184455184456184457184458184459184460184461184462184463184464184465184466184467184468184469184470184471184472184473184474184475184476184477184478184479184480184481184482184483184484184485184486184487184488184489184490184491184492184493184494184495184496184497184498184499184500184501184502184503184504184505184506184507184508184509184510184511184512184513184514184515184516184517184518184519184520184521184522184523184524184525184526184527184528184529184530184531184532184533184534184535184536184537184538184539184540184541184542184543184544184545184546184547184548184549184550184551184552184553184554184555184556184557184558184559184560184561184562184563184564184565184566184567184568184569184570184571184572184573184574184575184576184577184578184579184580184581184582184583184584184585184586184587184588184589184590184591184592184593184594184595184596184597184598184599184600184601184602184603184604184605184606184607184608184609184610184611184612184613184614184615184616184617184618184619184620184621184622184623184624184625184626184627184628184629184630184631184632184633184634184635184636184637184638184639184640184641184642184643184644184645184646184647184648184649184650184651184652184653184654184655184656184657184658184659184660184661184662184663184664184665184666184667184668184669184670184671184672184673184674184675184676184677184678184679184680184681184682184683184684184685184686184687184688184689184690184691184692184693184694184695184696184697184698184699184700184701184702184703184704184705184706184707184708184709184710184711184712184713184714184715184716184717184718184719184720184721184722184723184724184725184726184727184728184729184730184731184732184733184734184735184736184737184738184739184740184741184742184743184744184745184746184747184748184749184750184751184752184753184754184755184756184757184758184759184760184761184762184763184764184765184766184767184768184769184770184771184772184773184774184775184776184777184778184779184780184781184782184783184784184785184786184787184788184789184790184791184792184793184794184795184796184797184798184799184800184801184802184803184804184805184806184807184808184809184810184811184812184813184814184815184816184817184818184819184820184821184822184823184824184825184826184827184828184829184830184831184832184833184834184835184836184837184838184839184840184841184842184843184844184845184846184847184848184849184850184851184852184853184854184855184856184857184858184859184860184861184862184863184864184865184866184867184868184869184870184871184872184873184874184875184876184877184878184879184880184881184882184883184884184885184886184887184888184889184890184891184892184893184894184895184896184897184898184899184900184901184902184903184904184905184906184907184908184909184910184911184912184913184914184915184916184917184918184919184920184921184922184923184924184925184926184927184928184929184930184931184932184933184934184935184936184937184938184939184940184941184942184943184944184945184946184947184948184949184950184951184952184953184954184955184956184957184958184959184960184961184962184963184964184965184966184967184968184969184970184971184972184973184974184975184976184977184978184979184980184981184982184983184984184985184986184987184988184989184990184991184992184993184994184995184996184997184998184999185000185001185002185003185004185005185006185007185008185009185010185011185012185013185014185015185016185017185018185019185020185021185022185023185024185025185026185027185028185029185030185031185032185033185034185035185036185037185038185039185040185041185042185043185044185045185046185047185048185049185050185051185052185053185054185055185056185057185058185059185060185061185062185063185064185065185066185067185068185069185070185071185072185073185074185075185076185077185078185079185080185081185082185083185084185085185086185087185088185089185090185091185092185093185094185095185096185097185098185099185100185101185102185103185104185105185106185107185108185109185110185111185112185113185114185115185116185117185118185119185120185121185122185123185124185125185126185127185128185129185130185131185132185133185134185135185136185137185138185139185140185141185142185143185144185145185146185147185148185149185150185151185152185153185154185155185156185157185158185159185160185161185162185163185164185165185166185167185168185169185170185171185172185173185174185175185176185177185178185179185180185181185182185183185184185185185186185187185188185189185190185191185192185193185194185195185196185197185198185199185200185201185202185203185204185205185206185207185208185209185210185211185212185213185214185215185216185217185218185219185220185221185222185223185224185225185226185227185228185229185230185231185232185233185234185235185236185237185238185239185240185241185242185243185244185245185246185247185248185249185250185251185252185253185254185255185256185257185258185259185260185261185262185263185264185265185266185267185268185269185270185271185272185273185274185275185276185277185278185279185280185281185282185283185284185285185286185287185288185289185290185291185292185293185294185295185296185297185298185299185300185301185302185303185304185305185306185307185308185309185310185311185312185313185314185315185316185317185318185319185320185321185322185323185324185325185326185327185328185329185330185331185332185333185334185335185336185337185338185339185340185341185342185343185344185345185346185347185348185349185350185351185352185353185354185355185356185357185358185359185360185361185362185363185364185365185366185367185368185369185370185371185372185373185374185375185376185377185378185379185380185381185382185383185384185385185386185387185388185389185390185391185392185393185394185395185396185397185398185399185400185401185402185403185404185405185406185407185408185409185410185411185412185413185414185415185416185417185418185419185420185421185422185423185424185425185426185427185428185429185430185431185432185433185434185435185436185437185438185439185440185441185442185443185444185445185446185447185448185449185450185451185452185453185454185455185456185457185458185459185460185461185462185463185464185465185466185467185468185469185470185471185472185473185474185475185476185477185478185479185480185481185482185483185484185485185486185487185488185489185490185491185492185493185494185495185496185497185498185499185500185501185502185503185504185505185506185507185508185509185510185511185512185513185514185515185516185517185518185519185520185521185522185523185524185525185526185527185528185529185530185531185532185533185534185535185536185537185538185539185540185541185542185543185544185545185546185547185548185549185550185551185552185553185554185555185556185557185558185559185560185561185562185563185564185565185566185567185568185569185570185571185572185573185574185575185576185577185578185579185580185581185582185583185584185585185586185587185588185589185590185591185592185593185594185595185596185597185598185599185600185601185602185603185604185605185606185607185608185609185610185611185612185613185614185615185616185617185618185619185620185621185622185623185624185625185626185627185628185629185630185631185632185633185634185635185636185637185638185639185640185641185642185643185644185645185646185647185648185649185650185651185652185653185654185655185656185657185658185659185660185661185662185663185664185665185666185667185668185669185670185671185672185673185674185675185676185677185678185679185680185681185682185683185684185685185686185687185688185689185690185691185692185693185694185695185696185697185698185699185700185701185702185703185704185705185706185707185708185709185710185711185712185713185714185715185716185717185718185719185720185721185722185723185724185725185726185727185728185729185730185731185732185733185734185735185736185737185738185739185740185741185742185743185744185745185746185747185748185749185750185751185752185753185754185755185756185757185758185759185760185761185762185763185764185765185766185767185768185769185770185771185772185773185774185775185776185777185778185779185780185781185782185783185784185785185786185787185788185789185790185791185792185793185794185795185796185797185798185799185800185801185802185803185804185805185806185807185808185809185810185811185812185813185814185815185816185817185818185819185820185821185822185823185824185825185826185827185828185829185830185831185832185833185834185835185836185837185838185839185840185841185842185843185844185845185846185847185848185849185850185851185852185853185854185855185856185857185858185859185860185861185862185863185864185865185866185867185868185869185870185871185872185873185874185875185876185877185878185879185880185881185882185883185884185885185886185887185888185889185890185891185892185893185894185895185896185897185898185899185900185901185902185903185904185905185906185907185908185909185910185911185912185913185914185915185916185917185918185919185920185921185922185923185924185925185926185927185928185929185930185931185932185933185934185935185936185937185938185939185940185941185942185943185944185945185946185947185948185949185950185951185952185953185954185955185956185957185958185959185960185961185962185963185964185965185966185967185968185969185970185971185972185973185974185975185976185977185978185979185980185981185982185983185984185985185986185987185988185989185990185991185992185993185994185995185996185997185998185999186000186001186002186003186004186005186006186007186008186009186010186011186012186013186014186015186016186017186018186019186020186021186022186023186024186025186026186027186028186029186030186031186032186033186034186035186036186037186038186039186040186041186042186043186044186045186046186047186048186049186050186051186052186053186054186055186056186057186058186059186060186061186062186063186064186065186066186067186068186069186070186071186072186073186074186075186076186077186078186079186080186081186082186083186084186085186086186087186088186089186090186091186092186093186094186095186096186097186098186099186100186101186102186103186104186105186106186107186108186109186110186111186112186113186114186115186116186117186118186119186120186121186122186123186124186125186126186127186128186129186130186131186132186133186134186135186136186137186138186139186140186141186142186143186144186145186146186147186148186149186150186151186152186153186154186155186156186157186158186159186160186161186162186163186164186165186166186167186168186169186170186171186172186173186174186175186176186177186178186179186180186181186182186183186184186185186186186187186188186189186190186191186192186193186194186195186196186197186198186199186200186201186202186203186204186205186206186207186208186209186210186211186212186213186214186215186216186217186218186219186220186221186222186223186224186225186226186227186228186229186230186231186232186233186234186235186236186237186238186239186240186241186242186243186244186245186246186247186248186249186250186251186252186253186254186255186256186257186258186259186260186261186262186263186264186265186266186267186268186269186270186271186272186273186274186275186276186277186278186279186280186281186282186283186284186285186286186287186288186289186290186291186292186293186294186295186296186297186298186299186300186301186302186303186304186305186306186307186308186309186310186311186312186313186314186315186316186317186318186319186320186321186322186323186324186325186326186327186328186329186330186331186332186333186334186335186336186337186338186339186340186341186342186343186344186345186346186347186348186349186350186351186352186353186354186355186356186357186358186359186360186361186362186363186364186365186366186367186368186369186370186371186372186373186374186375186376186377186378186379186380186381186382186383186384186385186386186387186388186389186390186391186392186393186394186395186396186397186398186399186400186401186402186403186404186405186406186407186408186409186410186411186412186413186414186415186416186417186418186419186420186421186422186423186424186425186426186427186428186429186430186431186432186433186434186435186436186437186438186439186440186441186442186443186444186445186446186447186448186449186450186451186452186453186454186455186456186457186458186459186460186461186462186463186464186465186466186467186468186469186470186471186472186473186474186475186476186477186478186479186480186481186482186483186484186485186486186487186488186489186490186491186492186493186494186495186496186497186498186499186500186501186502186503186504186505186506186507186508186509186510186511186512186513186514186515186516186517186518186519186520186521186522186523186524186525186526186527186528186529186530186531186532186533186534186535186536186537186538186539186540186541186542186543186544186545186546186547186548186549186550186551186552186553186554186555186556186557186558186559186560186561186562186563186564186565186566186567186568186569186570186571186572186573186574186575186576186577186578186579186580186581186582186583186584186585186586186587186588186589186590186591186592186593186594186595186596186597186598186599186600186601186602186603186604186605186606186607186608186609186610186611186612186613186614186615186616186617186618186619186620186621186622186623186624186625186626186627186628186629186630186631186632186633186634186635186636186637186638186639186640186641186642186643186644186645186646186647186648186649186650186651186652186653186654186655186656186657186658186659186660186661186662186663186664186665186666186667186668186669186670186671186672186673186674186675186676186677186678186679186680186681186682186683186684186685186686186687186688186689186690186691186692186693186694186695186696186697186698186699186700186701186702186703186704186705186706186707186708186709186710186711186712186713186714186715186716186717186718186719186720186721186722186723186724186725186726186727186728186729186730186731186732186733186734186735186736186737186738186739186740186741186742186743186744186745186746186747186748186749186750186751186752186753186754186755186756186757186758186759186760186761186762186763186764186765186766186767186768186769186770186771186772186773186774186775186776186777186778186779186780186781186782186783186784186785186786186787186788186789186790186791186792186793186794186795186796186797186798186799186800186801186802186803186804186805186806186807186808186809186810186811186812186813186814186815186816186817186818186819186820186821186822186823186824186825186826186827186828186829186830186831186832186833186834186835186836186837186838186839186840186841186842186843186844186845186846186847186848186849186850186851186852186853186854186855186856186857186858186859186860186861186862186863186864186865186866186867186868186869186870186871186872186873186874186875186876186877186878186879186880186881186882186883186884186885186886186887186888186889186890186891186892186893186894186895186896186897186898186899186900186901186902186903186904186905186906186907186908186909186910186911186912186913186914186915186916186917186918186919186920186921186922186923186924186925186926186927186928186929186930186931186932186933186934186935186936186937186938186939186940186941186942186943186944186945186946186947186948186949186950186951186952186953186954186955186956186957186958186959186960186961186962186963186964186965186966186967186968186969186970186971186972186973186974186975186976186977186978186979186980186981186982186983186984186985186986186987186988186989186990186991186992186993186994186995186996186997186998186999187000187001187002187003187004187005187006187007187008187009187010187011187012187013187014187015187016187017187018187019187020187021187022187023187024187025187026187027187028187029187030187031187032187033187034187035187036187037187038187039187040187041187042187043187044187045187046187047187048187049187050187051187052187053187054187055187056187057187058187059187060187061187062187063187064187065187066187067187068187069187070187071187072187073187074187075187076187077187078187079187080187081187082187083187084187085187086187087187088187089187090187091187092187093187094187095187096187097187098187099187100187101187102187103187104187105187106187107187108187109187110187111187112187113187114187115187116187117187118187119187120187121187122187123187124187125187126187127187128187129187130187131187132187133187134187135187136187137187138187139187140187141187142187143187144187145187146187147187148187149187150187151187152187153187154187155187156187157187158187159187160187161187162187163187164187165187166187167187168187169187170187171187172187173187174187175187176187177187178187179187180187181187182187183187184187185187186187187187188187189187190187191187192187193187194187195187196187197187198187199187200187201187202187203187204187205187206187207187208187209187210187211187212187213187214187215187216187217187218187219187220187221187222187223187224187225187226187227187228187229187230187231187232187233187234187235187236187237187238187239187240187241187242187243187244187245187246187247187248187249187250187251187252187253187254187255187256187257187258187259187260187261187262187263187264187265187266187267187268187269187270187271187272187273187274187275187276187277187278187279187280187281187282187283187284187285187286187287187288187289187290187291187292187293187294187295187296187297187298187299187300187301187302187303187304187305187306187307187308187309187310187311187312187313187314187315187316187317187318187319187320187321187322187323187324187325187326187327187328187329187330187331187332187333187334187335187336187337187338187339187340187341187342187343187344187345187346187347187348187349187350187351187352187353187354187355187356187357187358187359187360187361187362187363187364187365187366187367187368187369187370187371187372187373187374187375187376187377187378187379187380187381187382187383187384187385187386187387187388187389187390187391187392187393187394187395187396187397187398187399187400187401187402187403187404187405187406187407187408187409187410187411187412187413187414187415187416187417187418187419187420187421187422187423187424187425187426187427187428187429187430187431187432187433187434187435187436187437187438187439187440187441187442187443187444187445187446187447187448187449187450187451187452187453187454187455187456187457187458187459187460187461187462187463187464187465187466187467187468187469187470187471187472187473187474187475187476187477187478187479187480187481187482187483187484187485187486187487187488187489187490187491187492187493187494187495187496187497187498187499187500187501187502187503187504187505187506187507187508187509187510187511187512187513187514187515187516187517187518187519187520187521187522187523187524187525187526187527187528187529187530187531187532187533187534187535187536187537187538187539187540187541187542187543187544187545187546187547187548187549187550187551187552187553187554187555187556187557187558187559187560187561187562187563187564187565187566187567187568187569187570187571187572187573187574187575187576187577187578187579187580187581187582187583187584187585187586187587187588187589187590187591187592187593187594187595187596187597187598187599187600187601187602187603187604187605187606187607187608187609187610187611187612187613187614187615187616187617187618187619187620187621187622187623187624187625187626187627187628187629187630187631187632187633187634187635187636187637187638187639187640187641187642187643187644187645187646187647187648187649187650187651187652187653187654187655187656187657187658187659187660187661187662187663187664187665187666187667187668187669187670187671187672187673187674187675187676187677187678187679187680187681187682187683187684187685187686187687187688187689187690187691187692187693187694187695187696187697187698187699187700187701187702187703187704187705187706187707187708187709187710187711187712187713187714187715187716187717187718187719187720187721187722187723187724187725187726187727187728187729187730187731187732187733187734187735187736187737187738187739187740187741187742187743187744187745187746187747187748187749187750187751187752187753187754187755187756187757187758187759187760187761187762187763187764187765187766187767187768187769187770187771187772187773187774187775187776187777187778187779187780187781187782187783187784187785187786187787187788187789187790187791187792187793187794187795187796187797187798187799187800187801187802187803187804187805187806187807187808187809187810187811187812187813187814187815187816187817187818187819187820187821187822187823187824187825187826187827187828187829187830187831187832187833187834187835187836187837187838187839187840187841187842187843187844187845187846187847187848187849187850187851187852187853187854187855187856187857187858187859187860187861187862187863187864187865187866187867187868187869187870187871187872187873187874187875187876187877187878187879187880187881187882187883187884187885187886187887187888187889187890187891187892187893187894187895187896187897187898187899187900187901187902187903187904187905187906187907187908187909187910187911187912187913187914187915187916187917187918187919187920187921187922187923187924187925187926187927187928187929187930187931187932187933187934187935187936187937187938187939187940187941187942187943187944187945187946187947187948187949187950187951187952187953187954187955187956187957187958187959187960187961187962187963187964187965187966187967187968187969187970187971187972187973187974187975187976187977187978187979187980187981187982187983187984187985187986187987187988187989187990187991187992187993187994187995187996187997187998187999188000188001188002188003188004188005188006188007188008188009188010188011188012188013188014188015188016188017188018188019188020188021188022188023188024188025188026188027188028188029188030188031188032188033188034188035188036188037188038188039188040188041188042188043188044188045188046188047188048188049188050188051188052188053188054188055188056188057188058188059188060188061188062188063188064188065188066188067188068188069188070188071188072188073188074188075188076188077188078188079188080188081188082188083188084188085188086188087188088188089188090188091188092188093188094188095188096188097188098188099188100188101188102188103188104188105188106188107188108188109188110188111188112188113188114188115188116188117188118188119188120188121188122188123188124188125188126188127188128188129188130188131188132188133188134188135188136188137188138188139188140188141188142188143188144188145188146188147188148188149188150188151188152188153188154188155188156188157188158188159188160188161188162188163188164188165188166188167188168188169188170188171188172188173188174188175188176188177188178188179188180188181188182188183188184188185188186188187188188188189188190188191188192188193188194188195188196188197188198188199188200188201188202188203188204188205188206188207188208188209188210188211188212188213188214188215188216188217188218188219188220188221188222188223188224188225188226188227188228188229188230188231188232188233188234188235188236188237188238188239188240188241188242188243188244188245188246188247188248188249188250188251188252188253188254188255188256188257188258188259188260188261188262188263188264188265188266188267188268188269188270188271188272188273188274188275188276188277188278188279188280188281188282188283188284188285188286188287188288188289188290188291188292188293188294188295188296188297188298188299188300188301188302188303188304188305188306188307188308188309188310188311188312188313188314188315188316188317188318188319188320188321188322188323188324188325188326188327188328188329188330188331188332188333188334188335188336188337188338188339188340188341188342188343188344188345188346188347188348188349188350188351188352188353188354188355188356188357188358188359188360188361188362188363188364188365188366188367188368188369188370188371188372188373188374188375188376188377188378188379188380188381188382188383188384188385188386188387188388188389188390188391188392188393188394188395188396188397188398188399188400188401188402188403188404188405188406188407188408188409188410188411188412188413188414188415188416188417188418188419188420188421188422188423188424188425188426188427188428188429188430188431188432188433188434188435188436188437188438188439188440188441188442188443188444188445188446188447188448188449188450188451188452188453188454188455188456188457188458188459188460188461188462188463188464188465188466188467188468188469188470188471188472188473188474188475188476188477188478188479188480188481188482188483188484188485188486188487188488188489188490188491188492188493188494188495188496188497188498188499188500188501188502188503188504188505188506188507188508188509188510188511188512188513188514188515188516188517188518188519188520188521188522188523188524188525188526188527188528188529188530188531188532188533188534188535188536188537188538188539188540188541188542188543188544188545188546188547188548188549188550188551188552188553188554188555188556188557188558188559188560188561188562188563188564188565188566188567188568188569188570188571188572188573188574188575188576188577188578188579188580188581188582188583188584188585188586188587188588188589188590188591188592188593188594188595188596188597188598188599188600188601188602188603188604188605188606188607188608188609188610188611188612188613188614188615188616188617188618188619188620188621188622188623188624188625188626188627188628188629188630188631188632188633188634188635188636188637188638188639188640188641188642188643188644188645188646188647188648188649188650188651188652188653188654188655188656188657188658188659188660188661188662188663188664188665188666188667188668188669188670188671188672188673188674188675188676188677188678188679188680188681188682188683188684188685188686188687188688188689188690188691188692188693188694188695188696188697188698188699188700188701188702188703188704188705188706188707188708188709188710188711188712188713188714188715188716188717188718188719188720188721188722188723188724188725188726188727188728188729188730188731188732188733188734188735188736188737188738188739188740188741188742188743188744188745188746188747188748188749188750188751188752188753188754188755188756188757188758188759188760188761188762188763188764188765188766188767188768188769188770188771188772188773188774188775188776188777188778188779188780188781188782188783188784188785188786188787188788188789188790188791188792188793188794188795188796188797188798188799188800188801188802188803188804188805188806188807188808188809188810188811188812188813188814188815188816188817188818188819188820188821188822188823188824188825188826188827188828188829188830188831188832188833188834188835188836188837188838188839188840188841188842188843188844188845188846188847188848188849188850188851188852188853188854188855188856188857188858188859188860188861188862188863188864188865188866188867188868188869188870188871188872188873188874188875188876188877188878188879188880188881188882188883188884188885188886188887188888188889188890188891188892188893188894188895188896188897188898188899188900188901188902188903188904188905188906188907188908188909188910188911188912188913188914188915188916188917188918188919188920188921188922188923188924188925188926188927188928188929188930188931188932188933188934188935188936188937188938188939188940188941188942188943188944188945188946188947188948188949188950188951188952188953188954188955188956188957188958188959188960188961188962188963188964188965188966188967188968188969188970188971188972188973188974188975188976188977188978188979188980188981188982188983188984188985188986188987188988188989188990188991188992188993188994188995188996188997188998188999189000189001189002189003189004189005189006189007189008189009189010189011189012189013189014189015189016189017189018189019189020189021189022189023189024189025189026189027189028189029189030189031189032189033189034189035189036189037189038189039189040189041189042189043189044189045189046189047189048189049189050189051189052189053189054189055189056189057189058189059189060189061189062189063189064189065189066189067189068189069189070189071189072189073189074189075189076189077189078189079189080189081189082189083189084189085189086189087189088189089189090189091189092189093189094189095189096189097189098189099189100189101189102189103189104189105189106189107189108189109189110189111189112189113189114189115189116189117189118189119189120189121189122189123189124189125189126189127189128189129189130189131189132189133189134189135189136189137189138189139189140189141189142189143189144189145189146189147189148189149189150189151189152189153189154189155189156189157189158189159189160189161189162189163189164189165189166189167189168189169189170189171189172189173189174189175189176189177189178189179189180189181189182189183189184189185189186189187189188189189189190189191189192189193189194189195189196189197189198189199189200189201189202189203189204189205189206189207189208189209189210189211189212189213189214189215189216189217189218189219189220189221189222189223189224189225189226189227189228189229189230189231189232189233189234189235189236189237189238189239189240189241189242189243189244189245189246189247189248189249189250189251189252189253189254189255189256189257189258189259189260189261189262189263189264189265189266189267189268189269189270189271189272189273189274189275189276189277189278189279189280189281189282189283189284189285189286189287189288189289189290189291189292189293189294189295189296189297189298189299189300189301189302189303189304189305189306189307189308189309189310189311189312189313189314189315189316189317189318189319189320189321189322189323189324189325189326189327189328189329189330189331189332189333189334189335189336189337189338189339189340189341189342189343189344189345189346189347189348189349189350189351189352189353189354189355189356189357189358189359189360189361189362189363189364189365189366189367189368189369189370189371189372189373189374189375189376189377189378189379189380189381189382189383189384189385189386189387189388189389189390189391189392189393189394189395189396189397189398189399189400189401189402189403189404189405189406189407189408189409189410189411189412189413189414189415189416189417189418189419189420189421189422189423189424189425189426189427189428189429189430189431189432189433189434189435189436189437189438189439189440189441189442189443189444189445189446189447189448189449189450189451189452189453189454189455189456189457189458189459189460189461189462189463189464189465189466189467189468189469189470189471189472189473189474189475189476189477189478189479189480189481189482189483189484189485189486189487189488189489189490189491189492189493189494189495189496189497189498189499189500189501189502189503189504189505189506189507189508189509189510189511189512189513189514189515189516189517189518189519189520189521189522189523189524189525189526189527189528189529189530189531189532189533189534189535189536189537189538189539189540189541189542189543189544189545189546189547189548189549189550189551189552189553189554189555189556189557189558189559189560189561189562189563189564189565189566189567189568189569189570189571189572189573189574189575189576189577189578189579189580189581189582189583189584189585189586189587189588189589189590189591189592189593189594189595189596189597189598189599189600189601189602189603189604189605189606189607189608189609189610189611189612189613189614189615189616189617189618189619189620189621189622189623189624189625189626189627189628189629189630189631189632189633189634189635189636189637189638189639189640189641189642189643189644189645189646189647189648189649189650189651189652189653189654189655189656189657189658189659189660189661189662189663189664189665189666189667189668189669189670189671189672189673189674189675189676189677189678189679189680189681189682189683189684189685189686189687189688189689189690189691189692189693189694189695189696189697189698189699189700189701189702189703189704189705189706189707189708189709189710189711189712189713189714189715189716189717189718189719189720189721189722189723189724189725189726189727189728189729189730189731189732189733189734189735189736189737189738189739189740189741189742189743189744189745189746189747189748189749189750189751189752189753189754189755189756189757189758189759189760189761189762189763189764189765189766189767189768189769189770189771189772189773189774189775189776189777189778189779189780189781189782189783189784189785189786189787189788189789189790189791189792189793189794189795189796189797189798189799189800189801189802189803189804189805189806189807189808189809189810189811189812189813189814189815189816189817189818189819189820189821189822189823189824189825189826189827189828189829189830189831189832189833189834189835189836189837189838189839189840189841189842189843189844189845189846189847189848189849189850189851189852189853189854189855189856189857189858189859189860189861189862189863189864189865189866189867189868189869189870189871189872189873189874189875189876189877189878189879189880189881189882189883189884189885189886189887189888189889189890189891189892189893189894189895189896189897189898189899189900189901189902189903189904189905189906189907189908189909189910189911189912189913189914189915189916189917189918189919189920189921189922189923189924189925189926189927189928189929189930189931189932189933189934189935189936189937189938189939189940189941189942189943189944189945189946189947189948189949189950189951189952189953189954189955189956189957189958189959189960189961189962189963189964189965189966189967189968189969189970189971189972189973189974189975189976189977189978189979189980189981189982189983189984189985189986189987189988189989189990189991189992189993189994189995189996189997189998189999190000190001190002190003190004190005190006190007190008190009190010190011190012190013190014190015190016190017190018190019190020190021190022190023190024190025190026190027190028190029190030190031190032190033190034190035190036190037190038190039190040190041190042190043190044190045190046190047190048190049190050190051190052190053190054190055190056190057190058190059190060190061190062190063190064190065190066190067190068190069190070190071190072190073190074190075190076190077190078190079190080190081190082190083190084190085190086190087190088190089190090190091190092190093190094190095190096190097190098190099190100190101190102190103190104190105190106190107190108190109190110190111190112190113190114190115190116190117190118190119190120190121190122190123190124190125190126190127190128190129190130190131190132190133190134190135190136190137190138190139190140190141190142190143190144190145190146190147190148190149190150190151190152190153190154190155190156190157190158190159190160190161190162190163190164190165190166190167190168190169190170190171190172190173190174190175190176190177190178190179190180190181190182190183190184190185190186190187190188190189190190190191190192190193190194190195190196190197190198190199190200190201190202190203190204190205190206190207190208190209190210190211190212190213190214190215190216190217190218190219190220190221190222190223190224190225190226190227190228190229190230190231190232190233190234190235190236190237190238190239190240190241190242190243190244190245190246190247190248190249190250190251190252190253190254190255190256190257190258190259190260190261190262190263190264190265190266190267190268190269190270190271190272190273190274190275190276190277190278190279190280190281190282190283190284190285190286190287190288190289190290190291190292190293190294190295190296190297190298190299190300190301190302190303190304190305190306190307190308190309190310190311190312190313190314190315190316190317190318190319190320190321190322190323190324190325190326190327190328190329190330190331190332190333190334190335190336190337190338190339190340190341190342190343190344190345190346190347190348190349190350190351190352190353190354190355190356190357190358190359190360190361190362190363190364190365190366190367190368190369190370190371190372190373190374190375190376190377190378190379190380190381190382190383190384190385190386190387190388190389190390190391190392190393190394190395190396190397190398190399190400190401190402190403190404190405190406190407190408190409190410190411190412190413190414190415190416190417190418190419190420190421190422190423190424190425190426190427190428190429190430190431190432190433190434190435190436190437190438190439190440190441190442190443190444190445190446190447190448190449190450190451190452190453190454190455190456190457190458190459190460190461190462190463190464190465190466190467190468190469190470190471190472190473190474190475190476190477190478190479190480190481190482190483190484190485190486190487190488190489190490190491190492190493190494190495190496190497190498190499190500190501190502190503190504190505190506190507190508190509190510190511190512190513190514190515190516190517190518190519190520190521190522190523190524190525190526190527190528190529190530190531190532190533190534190535190536190537190538190539190540190541190542190543190544190545190546190547190548190549190550190551190552190553190554190555190556190557190558190559190560190561190562190563190564190565190566190567190568190569190570190571190572190573190574190575190576190577190578190579190580190581190582190583190584190585190586190587190588190589190590190591190592190593190594190595190596190597190598190599190600190601190602190603190604190605190606190607190608190609190610190611190612190613190614190615190616190617190618190619190620190621190622190623190624190625190626190627190628190629190630190631190632190633190634190635190636190637190638190639190640190641190642190643190644190645190646190647190648190649190650190651190652190653190654190655190656190657190658190659190660190661190662190663190664190665190666190667190668190669190670190671190672190673190674190675190676190677190678190679190680190681190682190683190684190685190686190687190688190689190690190691190692190693190694190695190696190697190698190699190700190701190702190703190704190705190706190707190708190709190710190711190712190713190714190715190716190717190718190719190720190721190722190723190724190725190726190727190728190729190730190731190732190733190734190735190736190737190738190739190740190741190742190743190744190745190746190747190748190749190750190751190752190753190754190755190756190757190758190759190760190761190762190763190764190765190766190767190768190769190770190771190772190773190774190775190776190777190778190779190780190781190782190783190784190785190786190787190788190789190790190791190792190793190794190795190796190797190798190799190800190801190802190803190804190805190806190807190808190809190810190811190812190813190814190815190816190817190818190819190820190821190822190823190824190825190826190827190828190829190830190831190832190833190834190835190836190837190838190839190840190841190842190843190844190845190846190847190848190849190850190851190852190853190854190855190856190857190858190859190860190861190862190863190864190865190866190867190868190869190870190871190872190873190874190875190876190877190878190879190880190881190882190883190884190885190886190887190888190889190890190891190892190893190894190895190896190897190898190899190900190901190902190903190904190905190906190907190908190909190910190911190912190913190914190915190916190917190918190919190920190921190922190923190924190925190926190927190928190929190930190931190932190933190934190935190936190937190938190939190940190941190942190943190944190945190946190947190948190949190950190951190952190953190954190955190956190957190958190959190960190961190962190963190964190965190966190967190968190969190970190971190972190973190974190975190976190977190978190979190980190981190982190983190984190985190986190987190988190989190990190991190992190993190994190995190996190997190998190999191000191001191002191003191004191005191006191007191008191009191010191011191012191013191014191015191016191017191018191019191020191021191022191023191024191025191026191027191028191029191030191031191032191033191034191035191036191037191038191039191040191041191042191043191044191045191046191047191048191049191050191051191052191053191054191055191056191057191058191059191060191061191062191063191064191065191066191067191068191069191070191071191072191073191074191075191076191077191078191079191080191081191082191083191084191085191086191087191088191089191090191091191092191093191094191095191096191097191098191099191100191101191102191103191104191105191106191107191108191109191110191111191112191113191114191115191116191117191118191119191120191121191122191123191124191125191126191127191128191129191130191131191132191133191134191135191136191137191138191139191140191141191142191143191144191145191146191147191148191149191150191151191152191153191154191155191156191157191158191159191160191161191162191163191164191165191166191167191168191169191170191171191172191173191174191175191176191177191178191179191180191181191182191183191184191185191186191187191188191189191190191191191192191193191194191195191196191197191198191199191200191201191202191203191204191205191206191207191208191209191210191211191212191213191214191215191216191217191218191219191220191221191222191223191224191225191226191227191228191229191230191231191232191233191234191235191236191237191238191239191240191241191242191243191244191245191246191247191248191249191250191251191252191253191254191255191256191257191258191259191260191261191262191263191264191265191266191267191268191269191270191271191272191273191274191275191276191277191278191279191280191281191282191283191284191285191286191287191288191289191290191291191292191293191294191295191296191297191298191299191300191301191302191303191304191305191306191307191308191309191310191311191312191313191314191315191316191317191318191319191320191321191322191323191324191325191326191327191328191329191330191331191332191333191334191335191336191337191338191339191340191341191342191343191344191345191346191347191348191349191350191351191352191353191354191355191356191357191358191359191360191361191362191363191364191365191366191367191368191369191370191371191372191373191374191375191376191377191378191379191380191381191382191383191384191385191386191387191388191389191390191391191392191393191394191395191396191397191398191399191400191401191402191403191404191405191406191407191408191409191410191411191412191413191414191415191416191417191418191419191420191421191422191423191424191425191426191427191428191429191430191431191432191433191434191435191436191437191438191439191440191441191442191443191444191445191446191447191448191449191450191451191452191453191454191455191456191457191458191459191460191461191462191463191464191465191466191467191468191469191470191471191472191473191474191475191476191477191478191479191480191481191482191483191484191485191486191487191488191489191490191491191492191493191494191495191496191497191498191499191500191501191502191503191504191505191506191507191508191509191510191511191512191513191514191515191516191517191518191519191520191521191522191523191524191525191526191527191528191529191530191531191532191533191534191535191536191537191538191539191540191541191542191543191544191545191546191547191548191549191550191551191552191553191554191555191556191557191558191559191560191561191562191563191564191565191566191567191568191569191570191571191572191573191574191575191576191577191578191579191580191581191582191583191584191585191586191587191588191589191590191591191592191593191594191595191596191597191598191599191600191601191602191603191604191605191606191607191608191609191610191611191612191613191614191615191616191617191618191619191620191621191622191623191624191625191626191627191628191629191630191631191632191633191634191635191636191637191638191639191640191641191642191643191644191645191646191647191648191649191650191651191652191653191654191655191656191657191658191659191660191661191662191663191664191665191666191667191668191669191670191671191672191673191674191675191676191677191678191679191680191681191682191683191684191685191686191687191688191689191690191691191692191693191694191695191696191697191698191699191700191701191702191703191704191705191706191707191708191709191710191711191712191713191714191715191716191717191718191719191720191721191722191723191724191725191726191727191728191729191730191731191732191733191734191735191736191737191738191739191740191741191742191743191744191745191746191747191748191749191750191751191752191753191754191755191756191757191758191759191760191761191762191763191764191765191766191767191768191769191770191771191772191773191774191775191776191777191778191779191780191781191782191783191784191785191786191787191788191789191790191791191792191793191794191795191796191797191798191799191800191801191802191803191804191805191806191807191808191809191810191811191812191813191814191815191816191817191818191819191820191821191822191823191824191825191826191827191828191829191830191831191832191833191834191835191836191837191838191839191840191841191842191843191844191845191846191847191848191849191850191851191852191853191854191855191856191857191858191859191860191861191862191863191864191865191866191867191868191869191870191871191872191873191874191875191876191877191878191879191880191881191882191883191884191885191886191887191888191889191890191891191892191893191894191895191896191897191898191899191900191901191902191903191904191905191906191907191908191909191910191911191912191913191914191915191916191917191918191919191920191921191922191923191924191925191926191927191928191929191930191931191932191933191934191935191936191937191938191939191940191941191942191943191944191945191946191947191948191949191950191951191952191953191954191955191956191957191958191959191960191961191962191963191964191965191966191967191968191969191970191971191972191973191974191975191976191977191978191979191980191981191982191983191984191985191986191987191988191989191990191991191992191993191994191995191996191997191998191999192000192001192002192003192004192005192006192007192008192009192010192011192012192013192014192015192016192017192018192019192020192021192022192023192024192025192026192027192028192029192030192031192032192033192034192035192036192037192038192039192040192041192042192043192044192045192046192047192048192049192050192051192052192053192054192055192056192057192058192059192060192061192062192063192064192065192066192067192068192069192070192071192072192073192074192075192076192077192078192079192080192081192082192083192084192085192086192087192088192089192090192091192092192093192094192095192096192097192098192099192100192101192102192103192104192105192106192107192108192109192110192111192112192113192114192115192116192117192118192119192120192121192122192123192124192125192126192127192128192129192130192131192132192133192134192135192136192137192138192139192140192141192142192143192144192145192146192147192148192149192150192151192152192153192154192155192156192157192158192159192160192161192162192163192164192165192166192167192168192169192170192171192172192173192174192175192176192177192178192179192180192181192182192183192184192185192186192187192188192189192190192191192192192193192194192195192196192197192198192199192200192201192202192203192204192205192206192207192208192209192210192211192212192213192214192215192216192217192218192219192220192221192222192223192224192225192226192227192228192229192230192231192232192233192234192235192236192237192238192239192240192241192242192243192244192245192246192247192248192249192250192251192252192253192254192255192256192257192258192259192260192261192262192263192264192265192266192267192268192269192270192271192272192273192274192275192276192277192278192279192280192281192282192283192284192285192286192287192288192289192290192291192292192293192294192295192296192297192298192299192300192301192302192303192304192305192306192307192308192309192310192311192312192313192314192315192316192317192318192319192320192321192322192323192324192325192326192327192328192329192330192331192332192333192334192335192336192337192338192339192340192341192342192343192344192345192346192347192348192349192350192351192352192353192354192355192356192357192358192359192360192361192362192363192364192365192366192367192368192369192370192371192372192373192374192375192376192377192378192379192380192381192382192383192384192385192386192387192388192389192390192391192392192393192394192395192396192397192398192399192400192401192402192403192404192405192406192407192408192409192410192411192412192413192414192415192416192417192418192419192420192421192422192423192424192425192426192427192428192429192430192431192432192433192434192435192436192437192438192439192440192441192442192443192444192445192446192447192448192449192450192451192452192453192454192455192456192457192458192459192460192461192462192463192464192465192466192467192468192469192470192471192472192473192474192475192476192477192478192479192480192481192482192483192484192485192486192487192488192489192490192491192492192493192494192495192496192497192498192499192500192501192502192503192504192505192506192507192508192509192510192511192512192513192514192515192516192517192518192519192520192521192522192523192524192525192526192527192528192529192530192531192532192533192534192535192536192537192538192539192540192541192542192543192544192545192546192547192548192549192550192551192552192553192554192555192556192557192558192559192560192561192562192563192564192565192566192567192568192569192570192571192572192573192574192575192576192577192578192579192580192581192582192583192584192585192586192587192588192589192590192591192592192593192594192595192596192597192598192599192600192601192602192603192604192605192606192607192608192609192610192611192612192613192614192615192616192617192618192619192620192621192622192623192624192625192626192627192628192629192630192631192632192633192634192635192636192637192638192639192640192641192642192643192644192645192646192647192648192649192650192651192652192653192654192655192656192657192658192659192660192661192662192663192664192665192666192667192668192669192670192671192672192673192674192675192676192677192678192679192680192681192682192683192684192685192686192687192688192689192690192691192692192693192694192695192696192697192698192699192700192701192702192703192704192705192706192707192708192709192710192711192712192713192714192715192716192717192718192719192720192721192722192723192724192725192726192727192728192729192730192731192732192733192734192735192736192737192738192739192740192741192742192743192744192745192746192747192748192749192750192751192752192753192754192755192756192757192758192759192760192761192762192763192764192765192766192767192768192769192770192771192772192773192774192775192776192777192778192779192780192781192782192783192784192785192786192787192788192789192790192791192792192793192794192795192796192797192798192799192800192801192802192803192804192805192806192807192808192809192810192811192812192813192814192815192816192817192818192819192820192821192822192823192824192825192826192827192828192829192830192831192832192833192834192835192836192837192838192839192840192841192842192843192844192845192846192847192848192849192850192851192852192853192854192855192856192857192858192859192860192861192862192863192864192865192866192867192868192869192870192871192872192873192874192875192876192877192878192879192880192881192882192883192884192885192886192887192888192889192890192891192892192893192894192895192896192897192898192899192900192901192902192903192904192905192906192907192908192909192910192911192912192913192914192915192916192917192918192919192920192921192922192923192924192925192926192927192928192929192930192931192932192933192934192935192936192937192938192939192940192941192942192943192944192945192946192947192948192949192950192951192952192953192954192955192956192957192958192959192960192961192962192963192964192965192966192967192968192969192970192971192972192973192974192975192976192977192978192979192980192981192982192983192984192985192986192987192988192989192990192991192992192993192994192995192996192997192998192999193000193001193002193003193004193005193006193007193008193009193010193011193012193013193014193015193016193017193018193019193020193021193022193023193024193025193026193027193028193029193030193031193032193033193034193035193036193037193038193039193040193041193042193043193044193045193046193047193048193049193050193051193052193053193054193055193056193057193058193059193060193061193062193063193064193065193066193067193068193069193070193071193072193073193074193075193076193077193078193079193080193081193082193083193084193085193086193087193088193089193090193091193092193093193094193095193096193097193098193099193100193101193102193103193104193105193106193107193108193109193110193111193112193113193114193115193116193117193118193119193120193121193122193123193124193125193126193127193128193129193130193131193132193133193134193135193136193137193138193139193140193141193142193143193144193145193146193147193148193149193150193151193152193153193154193155193156193157193158193159193160193161193162193163193164193165193166193167193168193169193170193171193172193173193174193175193176193177193178193179193180193181193182193183193184193185193186193187193188193189193190193191193192193193193194193195193196193197193198193199193200193201193202193203193204193205193206193207193208193209193210193211193212193213193214193215193216193217193218193219193220193221193222193223193224193225193226193227193228193229193230193231193232193233193234193235193236193237193238193239193240193241193242193243193244193245193246193247193248193249193250193251193252193253193254193255193256193257193258193259193260193261193262193263193264193265193266193267193268193269193270193271193272193273193274193275193276193277193278193279193280193281193282193283193284193285193286193287193288193289193290193291193292193293193294193295193296193297193298193299193300193301193302193303193304193305193306193307193308193309193310193311193312193313193314193315193316193317193318193319193320193321193322193323193324193325193326193327193328193329193330193331193332193333193334193335193336193337193338193339193340193341193342193343193344193345193346193347193348193349193350193351193352193353193354193355193356193357193358193359193360193361193362193363193364193365193366193367193368193369193370193371193372193373193374193375193376193377193378193379193380193381193382193383193384193385193386193387193388193389193390193391193392193393193394193395193396193397193398193399193400193401193402193403193404193405193406193407193408193409193410193411193412193413193414193415193416193417193418193419193420193421193422193423193424193425193426193427193428193429193430193431193432193433193434193435193436193437193438193439193440193441193442193443193444193445193446193447193448193449193450193451193452193453193454193455193456193457193458193459193460193461193462193463193464193465193466193467193468193469193470193471193472193473193474193475193476193477193478193479193480193481193482193483193484193485193486193487193488193489193490193491193492193493193494193495193496193497193498193499193500193501193502193503193504193505193506193507193508193509193510193511193512193513193514193515193516193517193518193519193520193521193522193523193524193525193526193527193528193529193530193531193532193533193534193535193536193537193538193539193540193541193542193543193544193545193546193547193548193549193550193551193552193553193554193555193556193557193558193559193560193561193562193563193564193565193566193567193568193569193570193571193572193573193574193575193576193577193578193579193580193581193582193583193584193585193586193587193588193589193590193591193592193593193594193595193596193597193598193599193600193601193602193603193604193605193606193607193608193609193610193611193612193613193614193615193616193617193618193619193620193621193622193623193624193625193626193627193628193629193630193631193632193633193634193635193636193637193638193639193640193641193642193643193644193645193646193647193648193649193650193651193652193653193654193655193656193657193658193659193660193661193662193663193664193665193666193667193668193669193670193671193672193673193674193675193676193677193678193679193680193681193682193683193684193685193686193687193688193689193690193691193692193693193694193695193696193697193698193699193700193701193702193703193704193705193706193707193708193709193710193711193712193713193714193715193716193717193718193719193720193721193722193723193724193725193726193727193728193729193730193731193732193733193734193735193736193737193738193739193740193741193742193743193744193745193746193747193748193749193750193751193752193753193754193755193756193757193758193759193760193761193762193763193764193765193766193767193768193769193770193771193772193773193774193775193776193777193778193779193780193781193782193783193784193785193786193787193788193789193790193791193792193793193794193795193796193797193798193799193800193801193802193803193804193805193806193807193808193809193810193811193812193813193814193815193816193817193818193819193820193821193822193823193824193825193826193827193828193829193830193831193832193833193834193835193836193837193838193839193840193841193842193843193844193845193846193847193848193849193850193851193852193853193854193855193856193857193858193859193860193861193862193863193864193865193866193867193868193869193870193871193872193873193874193875193876193877193878193879193880193881193882193883193884193885193886193887193888193889193890193891193892193893193894193895193896193897193898193899193900193901193902193903193904193905193906193907193908193909193910193911193912193913193914193915193916193917193918193919193920193921193922193923193924193925193926193927193928193929193930193931193932193933193934193935193936193937193938193939193940193941193942193943193944193945193946193947193948193949193950193951193952193953193954193955193956193957193958193959193960193961193962193963193964193965193966193967193968193969193970193971193972193973193974193975193976193977193978193979193980193981193982193983193984193985193986193987193988193989193990193991193992193993193994193995193996193997193998193999194000194001194002194003194004194005194006194007194008194009194010194011194012194013194014194015194016194017194018194019194020194021194022194023194024194025194026194027194028194029194030194031194032194033194034194035194036194037194038194039194040194041194042194043194044194045194046194047194048194049194050194051194052194053194054194055194056194057194058194059194060194061194062194063194064194065194066194067194068194069194070194071194072194073194074194075194076194077194078194079194080194081194082194083194084194085194086194087194088194089194090194091194092194093194094194095194096194097194098194099194100194101194102194103194104194105194106194107194108194109194110194111194112194113194114194115194116194117194118194119194120194121194122194123194124194125194126194127194128194129194130194131194132194133194134194135194136194137194138194139194140194141194142194143194144194145194146194147194148194149194150194151194152194153194154194155194156194157194158194159194160194161194162194163194164194165194166194167194168194169194170194171194172194173194174194175194176194177194178194179194180194181194182194183194184194185194186194187194188194189194190194191194192194193194194194195194196194197194198194199194200194201194202194203194204194205194206194207194208194209194210194211194212194213194214194215194216194217194218194219194220194221194222194223194224194225194226194227194228194229194230194231194232194233194234194235194236194237194238194239194240194241194242194243194244194245194246194247194248194249194250194251194252194253194254194255194256194257194258194259194260194261194262194263194264194265194266194267194268194269194270194271194272194273194274194275194276194277194278194279194280194281194282194283194284194285194286194287194288194289194290194291194292194293194294194295194296194297194298194299194300194301194302194303194304194305194306194307194308194309194310194311194312194313194314194315194316194317194318194319194320194321194322194323194324194325194326194327194328194329194330194331194332194333194334194335194336194337194338194339194340194341194342194343194344194345194346194347194348194349194350194351194352194353194354194355194356194357194358194359194360194361194362194363194364194365194366194367194368194369194370194371194372194373194374194375194376194377194378194379194380194381194382194383194384194385194386194387194388194389194390194391194392194393194394194395194396194397194398194399194400194401194402194403194404194405194406194407194408194409194410194411194412194413194414194415194416194417194418194419194420194421194422194423194424194425194426194427194428194429194430194431194432194433194434194435194436194437194438194439194440194441194442194443194444194445194446194447194448194449194450194451194452194453194454194455194456194457194458194459194460194461194462194463194464194465194466194467194468194469194470194471194472194473194474194475194476194477194478194479194480194481194482194483194484194485194486194487194488194489194490194491194492194493194494194495194496194497194498194499194500194501194502194503194504194505194506194507194508194509194510194511194512194513194514194515194516194517194518194519194520194521194522194523194524194525194526194527194528194529194530194531194532194533194534194535194536194537194538194539194540194541194542194543194544194545194546194547194548194549194550194551194552194553194554194555194556194557194558194559194560194561194562194563194564194565194566194567194568194569194570194571194572194573194574194575194576194577194578194579194580194581194582194583194584194585194586194587194588194589194590194591194592194593194594194595194596194597194598194599194600194601194602194603194604194605194606194607194608194609194610194611194612194613194614194615194616194617194618194619194620194621194622194623194624194625194626194627194628194629194630194631194632194633194634194635194636194637194638194639194640194641194642194643194644194645194646194647194648194649194650194651194652194653194654194655194656194657194658194659194660194661194662194663194664194665194666194667194668194669194670194671194672194673194674194675194676194677194678194679194680194681194682194683194684194685194686194687194688194689194690194691194692194693194694194695194696194697194698194699194700194701194702194703194704194705194706194707194708194709194710194711194712194713194714194715194716194717194718194719194720194721194722194723194724194725194726194727194728194729194730194731194732194733194734194735194736194737194738194739194740194741194742194743194744194745194746194747194748194749194750194751194752194753194754194755194756194757194758194759194760194761194762194763194764194765194766194767194768194769194770194771194772194773194774194775194776194777194778194779194780194781194782194783194784194785194786194787194788194789194790194791194792194793194794194795194796194797194798194799194800194801194802194803194804194805194806194807194808194809194810194811194812194813194814194815194816194817194818194819194820194821194822194823194824194825194826194827194828194829194830194831194832194833194834194835194836194837194838194839194840194841194842194843194844194845194846194847194848194849194850194851194852194853194854194855194856194857194858194859194860194861194862194863194864194865194866194867194868194869194870194871194872194873194874194875194876194877194878194879194880194881194882194883194884194885194886194887194888194889194890194891194892194893194894194895194896194897194898194899194900194901194902194903194904194905194906194907194908194909194910194911194912194913194914194915194916194917194918194919194920194921194922194923194924194925194926194927194928194929194930194931194932194933194934194935194936194937194938194939194940194941194942194943194944194945194946194947194948194949194950194951194952194953194954194955194956194957194958194959194960194961194962194963194964194965194966194967194968194969194970194971194972194973194974194975194976194977194978194979194980194981194982194983194984194985194986194987194988194989194990194991194992194993194994194995194996194997194998194999195000195001195002195003195004195005195006195007195008195009195010195011195012195013195014195015195016195017195018195019195020195021195022195023195024195025195026195027195028195029195030195031195032195033195034195035195036195037195038195039195040195041195042195043195044195045195046195047195048195049195050195051195052195053195054195055195056195057195058195059195060195061195062195063195064195065195066195067195068195069195070195071195072195073195074195075195076195077195078195079195080195081195082195083195084195085195086195087195088195089195090195091195092195093195094195095195096195097195098195099195100195101195102195103195104195105195106195107195108195109195110195111195112195113195114195115195116195117195118195119195120195121195122195123195124195125195126195127195128195129195130195131195132195133195134195135195136195137195138195139195140195141195142195143195144195145195146195147195148195149195150195151195152195153195154195155195156195157195158195159195160195161195162195163195164195165195166195167195168195169195170195171195172195173195174195175195176195177195178195179195180195181195182195183195184195185195186195187195188195189195190195191195192195193195194195195195196195197195198195199195200195201195202195203195204195205195206195207195208195209195210195211195212195213195214195215195216195217195218195219195220195221195222195223195224195225195226195227195228195229195230195231195232195233195234195235195236195237195238195239195240195241195242195243195244195245195246195247195248195249195250195251195252195253195254195255195256195257195258195259195260195261195262195263195264195265195266195267195268195269195270195271195272195273195274195275195276195277195278195279195280195281195282195283195284195285195286195287195288195289195290195291195292195293195294195295195296195297195298195299195300195301195302195303195304195305195306195307195308195309195310195311195312195313195314195315195316195317195318195319195320195321195322195323195324195325195326195327195328195329195330195331195332195333195334195335195336195337195338195339195340195341195342195343195344195345195346195347195348195349195350195351195352195353195354195355195356195357195358195359195360195361195362195363195364195365195366195367195368195369195370195371195372195373195374195375195376195377195378195379195380195381195382195383195384195385195386195387195388195389195390195391195392195393195394195395195396195397195398195399195400195401195402195403195404195405195406195407195408195409195410195411195412195413195414195415195416195417195418195419195420195421195422195423195424195425195426195427195428195429195430195431195432195433195434195435195436195437195438195439195440195441195442195443195444195445195446195447195448195449195450195451195452195453195454195455195456195457195458195459195460195461195462195463195464195465195466195467195468195469195470195471195472195473195474195475195476195477195478195479195480195481195482195483195484195485195486195487195488195489195490195491195492195493195494195495195496195497195498195499195500195501195502195503195504195505195506195507195508195509195510195511195512195513195514195515195516195517195518195519195520195521195522195523195524195525195526195527195528195529195530195531195532195533195534195535195536195537195538195539195540195541195542195543195544195545195546195547195548195549195550195551195552195553195554195555195556195557195558195559195560195561195562195563195564195565195566195567195568195569195570195571195572195573195574195575195576195577195578195579195580195581195582195583195584195585195586195587195588195589195590195591195592195593195594195595195596195597195598195599195600195601195602195603195604195605195606195607195608195609195610195611195612195613195614195615195616195617195618195619195620195621195622195623195624195625195626195627195628195629195630195631195632195633195634195635195636195637195638195639195640195641195642195643195644195645195646195647195648195649195650195651195652195653195654195655195656195657195658195659195660195661195662195663195664195665195666195667195668195669195670195671195672195673195674195675195676195677195678195679195680195681195682195683195684195685195686195687195688195689195690195691195692195693195694195695195696195697195698195699195700195701195702195703195704195705195706195707195708195709195710195711195712195713195714195715195716195717195718195719195720195721195722195723195724195725195726195727195728195729195730195731195732195733195734195735195736195737195738195739195740195741195742195743195744195745195746195747195748195749195750195751195752195753195754195755195756195757195758195759195760195761195762195763195764195765195766195767195768195769195770195771195772195773195774195775195776195777195778195779195780195781195782195783195784195785195786195787195788195789195790195791195792195793195794195795195796195797195798195799195800195801195802195803195804195805195806195807195808195809195810195811195812195813195814195815195816195817195818195819195820195821195822195823195824195825195826195827195828195829195830195831195832195833195834195835195836195837195838195839195840195841195842195843195844195845195846195847195848195849195850195851195852195853195854195855195856195857195858195859195860195861195862195863195864195865195866195867195868195869195870195871195872195873195874195875195876195877195878195879195880195881195882195883195884195885195886195887195888195889195890195891195892195893195894195895195896195897195898195899195900195901195902195903195904195905195906195907195908195909195910195911195912195913195914195915195916195917195918195919195920195921195922195923195924195925195926195927195928195929195930195931195932195933195934195935195936195937195938195939195940195941195942195943195944195945195946195947195948195949195950195951195952195953195954195955195956195957195958195959195960195961195962195963195964195965195966195967195968195969195970195971195972195973195974195975195976195977195978195979195980195981195982195983195984195985195986195987195988195989195990195991195992195993195994195995195996195997195998195999196000196001196002196003196004196005196006196007196008196009196010196011196012196013196014196015196016196017196018196019196020196021196022196023196024196025196026196027196028196029196030196031196032196033196034196035196036196037196038196039196040196041196042196043196044196045196046196047196048196049196050196051196052196053196054196055196056196057196058196059196060196061196062196063196064196065196066196067196068196069196070196071196072196073196074196075196076196077196078196079196080196081196082196083196084196085196086196087196088196089196090196091196092196093196094196095196096196097196098196099196100196101196102196103196104196105196106196107196108196109196110196111196112196113196114196115196116196117196118196119196120196121196122196123196124196125196126196127196128196129196130196131196132196133196134196135196136196137196138196139196140196141196142196143196144196145196146196147196148196149196150196151196152196153196154196155196156196157196158196159196160196161196162196163196164196165196166196167196168196169196170196171196172196173196174196175196176196177196178196179196180196181196182196183196184196185196186196187196188196189196190196191196192196193196194196195196196196197196198196199196200196201196202196203196204196205196206196207196208196209196210196211196212196213196214196215196216196217196218196219196220196221196222196223196224196225196226196227196228196229196230196231196232196233196234196235196236196237196238196239196240196241196242196243196244196245196246196247196248196249196250196251196252196253196254196255196256196257196258196259196260196261196262196263196264196265196266196267196268196269196270196271196272196273196274196275196276196277196278196279196280196281196282196283196284196285196286196287196288196289196290196291196292196293196294196295196296196297196298196299196300196301196302196303196304196305196306196307196308196309196310196311196312196313196314196315196316196317196318196319196320196321196322196323196324196325196326196327196328196329196330196331196332196333196334196335196336196337196338196339196340196341196342196343196344196345196346196347196348196349196350196351196352196353196354196355196356196357196358196359196360196361196362196363196364196365196366196367196368196369196370196371196372196373196374196375196376196377196378196379196380196381196382196383196384196385196386196387196388196389196390196391196392196393196394196395196396196397196398196399196400196401196402196403196404196405196406196407196408196409196410196411196412196413196414196415196416196417196418196419196420196421196422196423196424196425196426196427196428196429196430196431196432196433196434196435196436196437196438196439196440196441196442196443196444196445196446196447196448196449196450196451196452196453196454196455196456196457196458196459196460196461196462196463196464196465196466196467196468196469196470196471196472196473196474196475196476196477196478196479196480196481196482196483196484196485196486196487196488196489196490196491196492196493196494196495196496196497196498196499196500196501196502196503196504196505196506196507196508196509196510196511196512196513196514196515196516196517196518196519196520196521196522196523196524196525196526196527196528196529196530196531196532196533196534196535196536196537196538196539196540196541196542196543196544196545196546196547196548196549196550196551196552196553196554196555196556196557196558196559196560196561196562196563196564196565196566196567196568196569196570196571196572196573196574196575196576196577196578196579196580196581196582196583196584196585196586196587196588196589196590196591196592196593196594196595196596196597196598196599196600196601196602196603196604196605196606196607196608196609196610196611196612196613196614196615196616196617196618196619196620196621196622196623196624196625196626196627196628196629196630196631196632196633196634196635196636196637196638196639196640196641196642196643196644196645196646196647196648196649196650196651196652196653196654196655196656196657196658196659196660196661196662196663196664196665196666196667196668196669196670196671196672196673196674196675196676196677196678196679196680196681196682196683196684196685196686196687196688196689196690196691196692196693196694196695196696196697196698196699196700196701196702196703196704196705196706196707196708196709196710196711196712196713196714196715196716196717196718196719196720196721196722196723196724196725196726196727196728196729196730196731196732196733196734196735196736196737196738196739196740196741196742196743196744196745196746196747196748196749196750196751196752196753196754196755196756196757196758196759196760196761196762196763196764196765196766196767196768196769196770196771196772196773196774196775196776196777196778196779196780196781196782196783196784196785196786196787196788196789196790196791196792196793196794196795196796196797196798196799196800196801196802196803196804196805196806196807196808196809196810196811196812196813196814196815196816196817196818196819196820196821196822196823196824196825196826196827196828196829196830196831196832196833196834196835196836196837196838196839196840196841196842196843196844196845196846196847196848196849196850196851196852196853196854196855196856196857196858196859196860196861196862196863196864196865196866196867196868196869196870196871196872196873196874196875196876196877196878196879196880196881196882196883196884196885196886196887196888196889196890196891196892196893196894196895196896196897196898196899196900196901196902196903196904196905196906196907196908196909196910196911196912196913196914196915196916196917196918196919196920196921196922196923196924196925196926196927196928196929196930196931196932196933196934196935196936196937196938196939196940196941196942196943196944196945196946196947196948196949196950196951196952196953196954196955196956196957196958196959196960196961196962196963196964196965196966196967196968196969196970196971196972196973196974196975196976196977196978196979196980196981196982196983196984196985196986196987196988196989196990196991196992196993196994196995196996196997196998196999197000197001197002197003197004197005197006197007197008197009197010197011197012197013197014197015197016197017197018197019197020197021197022197023197024197025197026197027197028197029197030197031197032197033197034197035197036197037197038197039197040197041197042197043197044197045197046197047197048197049197050197051197052197053197054197055197056197057197058197059197060197061197062197063197064197065197066197067197068197069197070197071197072197073197074197075197076197077197078197079197080197081197082197083197084197085197086197087197088197089197090197091197092197093197094197095197096197097197098197099197100197101197102197103197104197105197106197107197108197109197110197111197112197113197114197115197116197117197118197119197120197121197122197123197124197125197126197127197128197129197130197131197132197133197134197135197136197137197138197139197140197141197142197143197144197145197146197147197148197149197150197151197152197153197154197155197156197157197158197159197160197161197162197163197164197165197166197167197168197169197170197171197172197173197174197175197176197177197178197179197180197181197182197183197184197185197186197187197188197189197190197191197192197193197194197195197196197197197198197199197200197201197202197203197204197205197206197207197208197209197210197211197212197213197214197215197216197217197218197219197220197221197222197223197224197225197226197227197228197229197230197231197232197233197234197235197236197237197238197239197240197241197242197243197244197245197246197247197248197249197250197251197252197253197254197255197256197257197258197259197260197261197262197263197264197265197266197267197268197269197270197271197272197273197274197275197276197277197278197279197280197281197282197283197284197285197286197287197288197289197290197291197292197293197294197295197296197297197298197299197300197301197302197303197304197305197306197307197308197309197310197311197312197313197314197315197316197317197318197319197320197321197322197323197324197325197326197327197328197329197330197331197332197333197334197335197336197337197338197339197340197341197342197343197344197345197346197347197348197349197350197351197352197353197354197355197356197357197358197359197360197361197362197363197364197365197366197367197368197369197370197371197372197373197374197375197376197377197378197379197380197381197382197383197384197385197386197387197388197389197390197391197392197393197394197395197396197397197398197399197400197401197402197403197404197405197406197407197408197409197410197411197412197413197414197415197416197417197418197419197420197421197422197423197424197425197426197427197428197429197430197431197432197433197434197435197436197437197438197439197440197441197442197443197444197445197446197447197448197449197450197451197452197453197454197455197456197457197458197459197460197461197462197463197464197465197466197467197468197469197470197471197472197473197474197475197476197477197478197479197480197481197482197483197484197485197486197487197488197489197490197491197492197493197494197495197496197497197498197499197500197501197502197503197504197505197506197507197508197509197510197511197512197513197514197515197516197517197518197519197520197521197522197523197524197525197526197527197528197529197530197531197532197533197534197535197536197537197538197539197540197541197542197543197544197545197546197547197548197549197550197551197552197553197554197555197556197557197558197559197560197561197562197563197564197565197566197567197568197569197570197571197572197573197574197575197576197577197578197579197580197581197582197583197584197585197586197587197588197589197590197591197592197593197594197595197596197597197598197599197600197601197602197603197604197605197606197607197608197609197610197611197612197613197614197615197616197617197618197619197620197621197622197623197624197625197626197627197628197629197630197631197632197633197634197635197636197637197638197639197640197641197642197643197644197645197646197647197648197649197650197651197652197653197654197655197656197657197658197659197660197661197662197663197664197665197666197667197668197669197670197671197672197673197674197675197676197677197678197679197680197681197682197683197684197685197686197687197688197689197690197691197692197693197694197695197696197697197698197699197700197701197702197703197704197705197706197707197708197709197710197711197712197713197714197715197716197717197718197719197720197721197722197723197724197725197726197727197728197729197730197731197732197733197734197735197736197737197738197739197740197741197742197743197744197745197746197747197748197749197750197751197752197753197754197755197756197757197758197759197760197761197762197763197764197765197766197767197768197769197770197771197772197773197774197775197776197777197778197779197780197781197782197783197784197785197786197787197788197789197790197791197792197793197794197795197796197797197798197799197800197801197802197803197804197805197806197807197808197809197810197811197812197813197814197815197816197817197818197819197820197821197822197823197824197825197826197827197828197829197830197831197832197833197834197835197836197837197838197839197840197841197842197843197844197845197846197847197848197849197850197851197852197853197854197855197856197857197858197859197860197861197862197863197864197865197866197867197868197869197870197871197872197873197874197875197876197877197878197879197880197881197882197883197884197885197886197887197888197889197890197891197892197893197894197895197896197897197898197899197900197901197902197903197904197905197906197907197908197909197910197911197912197913197914197915197916197917197918197919197920197921197922197923197924197925197926197927197928197929197930197931197932197933197934197935197936197937197938197939197940197941197942197943197944197945197946197947197948197949197950197951197952197953197954197955197956197957197958197959197960197961197962197963197964197965197966197967197968197969197970197971197972197973197974197975197976197977197978197979197980197981197982197983197984197985197986197987197988197989197990197991197992197993197994197995197996197997197998197999198000198001198002198003198004198005198006198007198008198009198010198011198012198013198014198015198016198017198018198019198020198021198022198023198024198025198026198027198028198029198030198031198032198033198034198035198036198037198038198039198040198041198042198043198044198045198046198047198048198049198050198051198052198053198054198055198056198057198058198059198060198061198062198063198064198065198066198067198068198069198070198071198072198073198074198075198076198077198078198079198080198081198082198083198084198085198086198087198088198089198090198091198092198093198094198095198096198097198098198099198100198101198102198103198104198105198106198107198108198109198110198111198112198113198114198115198116198117198118198119198120198121198122198123198124198125198126198127198128198129198130198131198132198133198134198135198136198137198138198139198140198141198142198143198144198145198146198147198148198149198150198151198152198153198154198155198156198157198158198159198160198161198162198163198164198165198166198167198168198169198170198171198172198173198174198175198176198177198178198179198180198181198182198183198184198185198186198187198188198189198190198191198192198193198194198195198196198197198198198199198200198201198202198203198204198205198206198207198208198209198210198211198212198213198214198215198216198217198218198219198220198221198222198223198224198225198226198227198228198229198230198231198232198233198234198235198236198237198238198239198240198241198242198243198244198245198246198247198248198249198250198251198252198253198254198255198256198257198258198259198260198261198262198263198264198265198266198267198268198269198270198271198272198273198274198275198276198277198278198279198280198281198282198283198284198285198286198287198288198289198290198291198292198293198294198295198296198297198298198299198300198301198302198303198304198305198306198307198308198309198310198311198312198313198314198315198316198317198318198319198320198321198322198323198324198325198326198327198328198329198330198331198332198333198334198335198336198337198338198339198340198341198342198343198344198345198346198347198348198349198350198351198352198353198354198355198356198357198358198359198360198361198362198363198364198365198366198367198368198369198370198371198372198373198374198375198376198377198378198379198380198381198382198383198384198385198386198387198388198389198390198391198392198393198394198395198396198397198398198399198400198401198402198403198404198405198406198407198408198409198410198411198412198413198414198415198416198417198418198419198420198421198422198423198424198425198426198427198428198429198430198431198432198433198434198435198436198437198438198439198440198441198442198443198444198445198446198447198448198449198450198451198452198453198454198455198456198457198458198459198460198461198462198463198464198465198466198467198468198469198470198471198472198473198474198475198476198477198478198479198480198481198482198483198484198485198486198487198488198489198490198491198492198493198494198495198496198497198498198499198500198501198502198503198504198505198506198507198508198509198510198511198512198513198514198515198516198517198518198519198520198521198522198523198524198525198526198527198528198529198530198531198532198533198534198535198536198537198538198539198540198541198542198543198544198545198546198547198548198549198550198551198552198553198554198555198556198557198558198559198560198561198562198563198564198565198566198567198568198569198570198571198572198573198574198575198576198577198578198579198580198581198582198583198584198585198586198587198588198589198590198591198592198593198594198595198596198597198598198599198600198601198602198603198604198605198606198607198608198609198610198611198612198613198614198615198616198617198618198619198620198621198622198623198624198625198626198627198628198629198630198631198632198633198634198635198636198637198638198639198640198641198642198643198644198645198646198647198648198649198650198651198652198653198654198655198656198657198658198659198660198661198662198663198664198665198666198667198668198669198670198671198672198673198674198675198676198677198678198679198680198681198682198683198684198685198686198687198688198689198690198691198692198693198694198695198696198697198698198699198700198701198702198703198704198705198706198707198708198709198710198711198712198713198714198715198716198717198718198719198720198721198722198723198724198725198726198727198728198729198730198731198732198733198734198735198736198737198738198739198740198741198742198743198744198745198746198747198748198749198750198751198752198753198754198755198756198757198758198759198760198761198762198763198764198765198766198767198768198769198770198771198772198773198774198775198776198777198778198779198780198781198782198783198784198785198786198787198788198789198790198791198792198793198794198795198796198797198798198799198800198801198802198803198804198805198806198807198808198809198810198811198812198813198814198815198816198817198818198819198820198821198822198823198824198825198826198827198828198829198830198831198832198833198834198835198836198837198838198839198840198841198842198843198844198845198846198847198848198849198850198851198852198853198854198855198856198857198858198859198860198861198862198863198864198865198866198867198868198869198870198871198872198873198874198875198876198877198878198879198880198881198882198883198884198885198886198887198888198889198890198891198892198893198894198895198896198897198898198899198900198901198902198903198904198905198906198907198908198909198910198911198912198913198914198915198916198917198918198919198920198921198922198923198924198925198926198927198928198929198930198931198932198933198934198935198936198937198938198939198940198941198942198943198944198945198946198947198948198949198950198951198952198953198954198955198956198957198958198959198960198961198962198963198964198965198966198967198968198969198970198971198972198973198974198975198976198977198978198979198980198981198982198983198984198985198986198987198988198989198990198991198992198993198994198995198996198997198998198999199000199001199002199003199004199005199006199007199008199009199010199011199012199013199014199015199016199017199018199019199020199021199022199023199024199025199026199027199028199029199030199031199032199033199034199035199036199037199038199039199040199041199042199043199044199045199046199047199048199049199050199051199052199053199054199055199056199057199058199059199060199061199062199063199064199065199066199067199068199069199070199071199072199073199074199075199076199077199078199079199080199081199082199083199084199085199086199087199088199089199090199091199092199093199094199095199096199097199098199099199100199101199102199103199104199105199106199107199108199109199110199111199112199113199114199115199116199117199118199119199120199121199122199123199124199125199126199127199128199129199130199131199132199133199134199135199136199137199138199139199140199141199142199143199144199145199146199147199148199149199150199151199152199153199154199155199156199157199158199159199160199161199162199163199164199165199166199167199168199169199170199171199172199173199174199175199176199177199178199179199180199181199182199183199184199185199186199187199188199189199190199191199192199193199194199195199196199197199198199199199200199201199202199203199204199205199206199207199208199209199210199211199212199213199214199215199216199217199218199219199220199221199222199223199224199225199226199227199228199229199230199231199232199233199234199235199236199237199238199239199240199241199242199243199244199245199246199247199248199249199250199251199252199253199254199255199256199257199258199259199260199261199262199263199264199265199266199267199268199269199270199271199272199273199274199275199276199277199278199279199280199281199282199283199284199285199286199287199288199289199290199291199292199293199294199295199296199297199298199299199300199301199302199303199304199305199306199307199308199309199310199311199312199313199314199315199316199317199318199319199320199321199322199323199324199325199326199327199328199329199330199331199332199333199334199335199336199337199338199339199340199341199342199343199344199345199346199347199348199349199350199351199352199353199354199355199356199357199358199359199360199361199362199363199364199365199366199367199368199369199370199371199372199373199374199375199376199377199378199379199380199381199382199383199384199385199386199387199388199389199390199391199392199393199394199395199396199397199398199399199400199401199402199403199404199405199406199407199408199409199410199411199412199413199414199415199416199417199418199419199420199421199422199423199424199425199426199427199428199429199430199431199432199433199434199435199436199437199438199439199440199441199442199443199444199445199446199447199448199449199450199451199452199453199454199455199456199457199458199459199460199461199462199463199464199465199466199467199468199469199470199471199472199473199474199475199476199477199478199479199480199481199482199483199484199485199486199487199488199489199490199491199492199493199494199495199496199497199498199499199500199501199502199503199504199505199506199507199508199509199510199511199512199513199514199515199516199517199518199519199520199521199522199523199524199525199526199527199528199529199530199531199532199533199534199535199536199537199538199539199540199541199542199543199544199545199546199547199548199549199550199551199552199553199554199555199556199557199558199559199560199561199562199563199564199565199566199567199568199569199570199571199572199573199574199575199576199577199578199579199580199581199582199583199584199585199586199587199588199589199590199591199592199593199594199595199596199597199598199599199600199601199602199603199604199605199606199607199608199609199610199611199612199613199614199615199616199617199618199619199620199621199622199623199624199625199626199627199628199629199630199631199632199633199634199635199636199637199638199639199640199641199642199643199644199645199646199647199648199649199650199651199652199653199654199655199656199657199658199659199660199661199662199663199664199665199666199667199668199669199670199671199672199673199674199675199676199677199678199679199680199681199682199683199684199685199686199687199688199689199690199691199692199693199694199695199696199697199698199699199700199701199702199703199704199705199706199707199708199709199710199711199712199713199714199715199716199717199718199719199720199721199722199723199724199725199726199727199728199729199730199731199732199733199734199735199736199737199738199739199740199741199742199743199744199745199746199747199748199749199750199751199752199753199754199755199756199757199758199759199760199761199762199763199764199765199766199767199768199769199770199771199772199773199774199775199776199777199778199779199780199781199782199783199784199785199786199787199788199789199790199791199792199793199794199795199796199797199798199799199800199801199802199803199804199805199806199807199808199809199810199811199812199813199814199815199816199817199818199819199820199821199822199823199824199825199826199827199828199829199830199831199832199833199834199835199836199837199838199839199840199841199842199843199844199845199846199847199848199849199850199851199852199853199854199855199856199857199858199859199860199861199862199863199864199865199866199867199868199869199870199871199872199873199874199875199876199877199878199879199880199881199882199883199884199885199886199887199888199889199890199891199892199893199894199895199896199897199898199899199900199901199902199903199904199905199906199907199908199909199910199911199912199913199914199915199916199917199918199919199920199921199922199923199924199925199926199927199928199929199930199931199932199933199934199935199936199937199938199939199940199941199942199943199944199945199946199947199948199949199950199951199952199953199954199955199956199957199958199959199960199961199962199963199964199965199966199967199968199969199970199971199972199973199974199975199976199977199978199979199980199981199982199983199984199985199986199987199988199989199990199991199992199993199994199995199996199997199998199999200000200001200002200003200004200005200006200007200008200009200010200011200012200013200014200015200016200017200018200019200020200021200022200023200024200025200026200027200028200029200030200031200032200033200034200035200036200037200038200039200040200041200042200043200044200045200046200047200048200049200050200051200052200053200054200055200056200057200058200059200060200061200062200063200064200065200066200067200068200069200070200071200072200073200074200075200076200077200078200079200080200081200082200083200084200085200086200087200088200089200090200091200092200093200094200095200096200097200098200099200100200101200102200103200104200105200106200107200108200109200110200111200112200113200114200115200116200117200118200119200120200121200122200123200124200125200126200127200128200129200130200131200132200133200134200135200136200137200138200139200140200141200142200143200144200145200146200147200148200149200150200151200152200153200154200155200156200157200158200159200160200161200162200163200164200165200166200167200168200169200170200171200172200173200174200175200176200177200178200179200180200181200182200183200184200185200186200187200188200189200190200191200192200193200194200195200196200197200198200199200200200201200202200203200204200205200206200207200208200209200210200211200212200213200214200215200216200217200218200219200220200221200222200223200224200225200226200227200228200229200230200231200232200233200234200235200236200237200238200239200240200241200242200243200244200245200246200247200248200249200250200251200252200253200254200255200256200257200258200259200260200261200262200263200264200265200266200267200268200269200270200271200272200273200274200275200276200277200278200279200280200281200282200283200284200285200286200287200288200289200290200291200292200293200294200295200296200297200298200299200300200301200302200303200304200305200306200307200308200309200310200311200312200313200314200315200316200317200318200319200320200321200322200323200324200325200326200327200328200329200330200331200332200333200334200335200336200337200338200339200340200341200342200343200344200345200346200347200348200349200350200351200352200353200354200355200356200357200358200359200360200361200362200363200364200365200366200367200368200369200370200371200372200373200374200375200376200377200378200379200380200381200382200383200384200385200386200387200388200389200390200391200392200393200394200395200396200397200398200399200400200401200402200403200404200405200406200407200408200409200410200411200412200413200414200415200416200417200418200419200420200421200422200423200424200425200426200427200428200429200430200431200432200433200434200435200436200437200438200439200440200441200442200443200444200445200446200447200448200449200450200451200452200453200454200455200456200457200458200459200460200461200462200463200464200465200466200467200468200469200470200471200472200473200474200475200476200477200478200479200480200481200482200483200484200485200486200487200488200489200490200491200492200493200494200495200496200497200498200499200500200501200502200503200504200505200506200507200508200509200510200511200512200513200514200515200516200517200518200519200520200521200522200523200524200525200526200527200528200529200530200531200532200533200534200535200536200537200538200539200540200541200542200543200544200545200546200547200548200549200550200551200552200553200554200555200556200557200558200559200560200561200562200563200564200565200566200567200568200569200570200571200572200573200574200575200576200577200578200579200580200581200582200583200584200585200586200587200588200589200590200591200592200593200594200595200596200597200598200599200600200601200602200603200604200605200606200607200608200609200610200611200612200613200614200615200616200617200618200619200620200621200622200623200624200625200626200627200628200629200630200631200632200633200634200635200636200637200638200639200640200641200642200643200644200645200646200647200648200649200650200651200652200653200654200655200656200657200658200659200660200661200662200663200664200665200666200667200668200669200670200671200672200673200674200675200676200677200678200679200680200681200682200683200684200685200686200687200688200689200690200691200692200693200694200695200696200697200698200699200700200701200702200703200704200705200706200707200708200709200710200711200712200713200714200715200716200717200718200719200720200721200722200723200724200725200726200727200728200729200730200731200732200733200734200735200736200737200738200739200740200741200742200743200744200745200746200747200748200749200750200751200752200753200754200755200756200757200758200759200760200761200762200763200764200765200766200767200768200769200770200771200772200773200774200775200776200777200778200779200780200781200782200783200784200785200786200787200788200789200790200791200792200793200794200795200796200797200798200799200800200801200802200803200804200805200806200807200808200809200810200811200812200813200814200815200816200817200818200819200820200821200822200823200824200825200826200827200828200829200830200831200832200833200834200835200836200837200838200839200840200841200842200843200844200845200846200847200848200849200850200851200852200853200854200855200856200857200858200859200860200861200862200863200864200865200866200867200868200869200870200871200872200873200874200875200876200877200878200879200880200881200882200883200884200885200886200887200888200889200890200891200892200893200894200895200896200897200898200899200900200901200902200903200904200905200906200907200908200909200910200911200912200913200914200915200916200917200918200919200920200921200922200923200924200925200926200927200928200929200930200931200932200933200934200935200936200937200938200939200940200941200942200943200944200945200946200947200948200949200950200951200952200953200954200955200956200957200958200959200960200961200962200963200964200965200966200967200968200969200970200971200972200973200974200975200976200977200978200979200980200981200982200983200984200985200986200987200988200989200990200991200992200993200994200995200996200997200998200999201000201001201002201003201004201005201006201007201008201009201010201011201012201013201014201015201016201017201018201019201020201021201022201023201024201025201026201027201028201029201030201031201032201033201034201035201036201037201038201039201040201041201042201043201044201045201046201047201048201049201050201051201052201053201054201055201056201057201058201059201060201061201062201063201064201065201066201067201068201069201070201071201072201073201074201075201076201077201078201079201080201081201082201083201084201085201086201087201088201089201090201091201092201093201094201095201096201097201098201099201100201101201102201103201104201105201106201107201108201109201110201111201112201113201114201115201116201117201118201119201120201121201122201123201124201125201126201127201128201129201130201131201132201133201134201135201136201137201138201139201140201141201142201143201144201145201146201147201148201149201150201151201152201153201154201155201156201157201158201159201160201161201162201163201164201165201166201167201168201169201170201171201172201173201174201175201176201177201178201179201180201181201182201183201184201185201186201187201188201189201190201191201192201193201194201195201196201197201198201199201200201201201202201203201204201205201206201207201208201209201210201211201212201213201214201215201216201217201218201219201220201221201222201223201224201225201226201227201228201229201230201231201232201233201234201235201236201237201238201239201240201241201242201243201244201245201246201247201248201249201250201251201252201253201254201255201256201257201258201259201260201261201262201263201264201265201266201267201268201269201270201271201272201273201274201275201276201277201278201279201280201281201282201283201284201285201286201287201288201289201290201291201292201293201294201295201296201297201298201299201300201301201302201303201304201305201306201307201308201309201310201311201312201313201314201315201316201317201318201319201320201321201322201323201324201325201326201327201328201329201330201331201332201333201334201335201336201337201338201339201340201341201342201343201344201345201346201347201348201349201350201351201352201353201354201355201356201357201358201359201360201361201362201363201364201365201366201367201368201369201370201371201372201373201374201375201376201377201378201379201380201381201382201383201384201385201386201387201388201389201390201391201392201393201394201395201396201397201398201399201400201401201402201403201404201405201406201407201408201409201410201411201412201413201414201415201416201417201418201419201420201421201422201423201424201425201426201427201428201429201430201431201432201433201434201435201436201437201438201439201440201441201442201443201444201445201446201447201448201449201450201451201452201453201454201455201456201457201458201459201460201461201462201463201464201465201466201467201468201469201470201471201472201473201474201475201476201477201478201479201480201481201482201483201484201485201486201487201488201489201490201491201492201493201494201495201496201497201498201499201500201501201502201503201504201505201506201507201508201509201510201511201512201513201514201515201516201517201518201519201520201521201522201523201524201525201526201527201528201529201530201531201532201533201534201535201536201537201538201539201540201541201542201543201544201545201546201547201548201549201550201551201552201553201554201555201556201557201558201559201560201561201562201563201564201565201566201567201568201569201570201571201572201573201574201575201576201577201578201579201580201581201582201583201584201585201586201587201588201589201590201591201592201593201594201595201596201597201598201599201600201601201602201603201604201605201606201607201608201609201610201611201612201613201614201615201616201617201618201619201620201621201622201623201624201625201626201627201628201629201630201631201632201633201634201635201636201637201638201639201640201641201642201643201644201645201646201647201648201649201650201651201652201653201654201655201656201657201658201659201660201661201662201663201664201665201666201667201668201669201670201671201672201673201674201675201676201677201678201679201680201681201682201683201684201685201686201687201688201689201690201691201692201693201694201695201696201697201698201699201700201701201702201703201704201705201706201707201708201709201710201711201712201713201714201715201716201717201718201719201720201721201722201723201724201725201726201727201728201729201730201731201732201733201734201735201736201737201738201739201740201741201742201743201744201745201746201747201748201749201750201751201752201753201754201755201756201757201758201759201760201761201762201763201764201765201766201767201768201769201770201771201772201773201774201775201776201777201778201779201780201781201782201783201784201785201786201787201788201789201790201791201792201793201794201795201796201797201798201799201800201801201802201803201804201805201806201807201808201809201810201811201812201813201814201815201816201817201818201819201820201821201822201823201824201825201826201827201828201829201830201831201832201833201834201835201836201837201838201839201840201841201842201843201844201845201846201847201848201849201850201851201852201853201854201855201856201857201858201859201860201861201862201863201864201865201866201867201868201869201870201871201872201873201874201875201876201877201878201879201880201881201882201883201884201885201886201887201888201889201890201891201892201893201894201895201896201897201898201899201900201901201902201903201904201905201906201907201908201909201910201911201912201913201914201915201916201917201918201919201920201921201922201923201924201925201926201927201928201929201930201931201932201933201934201935201936201937201938201939201940201941201942201943201944201945201946201947201948201949201950201951201952201953201954201955201956201957201958201959201960201961201962201963201964201965201966201967201968201969201970201971201972201973201974201975201976201977201978201979201980201981201982201983201984201985201986201987201988201989201990201991201992201993201994201995201996201997201998201999202000202001202002202003202004202005202006202007202008202009202010202011202012202013202014202015202016202017202018202019202020202021202022202023202024202025202026202027202028202029202030202031202032202033202034202035202036202037202038202039202040202041202042202043202044202045202046202047202048202049202050202051202052202053202054202055202056202057202058202059202060202061202062202063202064202065202066202067202068202069202070202071202072202073202074202075202076202077202078202079202080202081202082202083202084202085202086202087202088202089202090202091202092202093202094202095202096202097202098202099202100202101202102202103202104202105202106202107202108202109202110202111202112202113202114202115202116202117202118202119202120202121202122202123202124202125202126202127202128202129202130202131202132202133202134202135202136202137202138202139202140202141202142202143202144202145202146202147202148202149202150202151202152202153202154202155202156202157202158202159202160202161202162202163202164202165202166202167202168202169202170202171202172202173202174202175202176202177202178202179202180202181202182202183202184202185202186202187202188202189202190202191202192202193202194202195202196202197202198202199202200202201202202202203202204202205202206202207202208202209202210202211202212202213202214202215202216202217202218202219202220202221202222202223202224202225202226202227202228202229202230202231202232202233202234202235202236202237202238202239202240202241202242202243202244202245202246202247202248202249202250202251202252202253202254202255202256202257202258202259202260202261202262202263202264202265202266202267202268202269202270202271202272202273202274202275202276202277202278202279202280202281202282202283202284202285202286202287202288202289202290202291202292202293202294202295202296202297202298202299202300202301202302202303202304202305202306202307202308202309202310202311202312202313202314202315202316202317202318202319202320202321202322202323202324202325202326202327202328202329202330202331202332202333202334202335202336202337202338202339202340202341202342202343202344202345202346202347202348202349202350202351202352202353202354202355202356202357202358202359202360202361202362202363202364202365202366202367202368202369202370202371202372202373202374202375202376202377202378202379202380202381202382202383202384202385202386202387202388202389202390202391202392202393202394202395202396202397202398202399202400202401202402202403202404202405202406202407202408202409202410202411202412202413202414202415202416202417202418202419202420202421202422202423202424202425202426202427202428202429202430202431202432202433202434202435202436202437202438202439202440202441202442202443202444202445202446202447202448202449202450202451202452202453202454202455202456202457202458202459202460202461202462202463202464202465202466202467202468202469202470202471202472202473202474202475202476202477202478202479202480202481202482202483202484202485202486202487202488202489202490202491202492202493202494202495202496202497202498202499202500202501202502202503202504202505202506202507202508202509202510202511202512202513202514202515202516202517202518202519202520202521202522202523202524202525202526202527202528202529202530202531202532202533202534202535202536202537202538202539202540202541202542202543202544202545202546202547202548202549202550202551202552202553202554202555202556202557202558202559202560202561202562202563202564202565202566202567202568202569202570202571202572202573202574202575202576202577202578202579202580202581202582202583202584202585202586202587202588202589202590202591202592202593202594202595202596202597202598202599202600202601202602202603202604202605202606202607202608202609202610202611202612202613202614202615202616202617202618202619202620202621202622202623202624202625202626202627202628202629202630202631202632202633202634202635202636202637202638202639202640202641202642202643202644202645202646202647202648202649202650202651202652202653202654202655202656202657202658202659202660202661202662202663202664202665202666202667202668202669202670202671202672202673202674202675202676202677202678202679202680202681202682202683202684202685202686202687202688202689202690202691202692202693202694202695202696202697202698202699202700202701202702202703202704202705202706202707202708202709202710202711202712202713202714202715202716202717202718202719202720202721202722202723202724202725202726202727202728202729202730202731202732202733202734202735202736202737202738202739202740202741202742202743202744202745202746202747202748202749202750202751202752202753202754202755202756202757202758202759202760202761202762202763202764202765202766202767202768202769202770202771202772202773202774202775202776202777202778202779202780202781202782202783202784202785202786202787202788202789202790202791202792202793202794202795202796202797202798202799202800202801202802202803202804202805202806202807202808202809202810202811202812202813202814202815202816202817202818202819202820202821202822202823202824202825202826202827202828202829202830202831202832202833202834202835202836202837202838202839202840202841202842202843202844202845202846202847202848202849202850202851202852202853202854202855202856202857202858202859202860202861202862202863202864202865202866202867202868202869202870202871202872202873202874202875202876202877202878202879202880202881202882202883202884202885202886202887202888202889202890202891202892202893202894202895202896202897202898202899202900202901202902202903202904202905202906202907202908202909202910202911202912202913202914202915202916202917202918202919202920202921202922202923202924202925202926202927202928202929202930202931202932202933202934202935202936202937202938202939202940202941202942202943202944202945202946202947202948202949202950202951202952202953202954202955202956202957202958202959202960202961202962202963202964202965202966202967202968202969202970202971202972202973202974202975202976202977202978202979202980202981202982202983202984202985202986202987202988202989202990202991202992202993202994202995202996202997202998202999203000203001203002203003203004203005203006203007203008203009203010203011203012203013203014203015203016203017203018203019203020203021203022203023203024203025203026203027203028203029203030203031203032203033203034203035203036203037203038203039203040203041203042203043203044203045203046203047203048203049203050203051203052203053203054203055203056203057203058203059203060203061203062203063203064203065203066203067203068203069203070203071203072203073203074203075203076203077203078203079203080203081203082203083203084203085203086203087203088203089203090203091203092203093203094203095203096203097203098203099203100203101203102203103203104203105203106203107203108203109203110203111203112203113203114203115203116203117203118203119203120203121203122203123203124203125203126203127203128203129203130203131203132203133203134203135203136203137203138203139203140203141203142203143203144203145203146203147203148203149203150203151203152203153203154203155203156203157203158203159203160203161203162203163203164203165203166203167203168203169203170203171203172203173203174203175203176203177203178203179203180203181203182203183203184203185203186203187203188203189203190203191203192203193203194203195203196203197203198203199203200203201203202203203203204203205203206203207203208203209203210203211203212203213203214203215203216203217203218203219203220203221203222203223203224203225203226203227203228203229203230203231203232203233203234203235203236203237203238203239203240203241203242203243203244203245203246203247203248203249203250203251203252203253203254203255203256203257203258203259203260203261203262203263203264203265203266203267203268203269203270203271203272203273203274203275203276203277203278203279203280203281203282203283203284203285203286203287203288203289203290203291203292203293203294203295203296203297203298203299203300203301203302203303203304203305203306203307203308203309203310203311203312203313203314203315203316203317203318203319203320203321203322203323203324203325203326203327203328203329203330203331203332203333203334203335203336203337203338203339203340203341203342203343203344203345203346203347203348203349203350203351203352203353203354203355203356203357203358203359203360203361203362203363203364203365203366203367203368203369203370203371203372203373203374203375203376203377203378203379203380203381203382203383203384203385203386203387203388203389203390203391203392203393203394203395203396203397203398203399203400203401203402203403203404203405203406203407203408203409203410203411203412203413203414203415203416203417203418203419203420203421203422203423203424203425203426203427203428203429203430203431203432203433203434203435203436203437203438203439203440203441203442203443203444203445203446203447203448203449203450203451203452203453203454203455203456203457203458203459203460203461203462203463203464203465203466203467203468203469203470203471203472203473203474203475203476203477203478203479203480203481203482203483203484203485203486203487203488203489203490203491203492203493203494203495203496203497203498203499203500203501203502203503203504203505203506203507203508203509203510203511203512203513203514203515203516203517203518203519203520203521203522203523203524203525203526203527203528203529203530203531203532203533203534203535203536203537203538203539203540203541203542203543203544203545203546203547203548203549203550203551203552203553203554203555203556203557203558203559203560203561203562203563203564203565203566203567203568203569203570203571203572203573203574203575203576203577203578203579203580203581203582203583203584203585203586203587203588203589203590203591203592203593203594203595203596203597203598203599203600203601203602203603203604203605203606203607203608203609203610203611203612203613203614203615203616203617203618203619203620203621203622203623203624203625203626203627203628203629203630203631203632203633203634203635203636203637203638203639203640203641203642203643203644203645203646203647203648203649203650203651203652203653203654203655203656203657203658203659203660203661203662203663203664203665203666203667203668203669203670203671203672203673203674203675203676203677203678203679203680203681203682203683203684203685203686203687203688203689203690203691203692203693203694203695203696203697203698203699203700203701203702203703203704203705203706203707203708203709203710203711203712203713203714203715203716203717203718203719203720203721203722203723203724203725203726203727203728203729203730203731203732203733203734203735203736203737203738203739203740203741203742203743203744203745203746203747203748203749203750203751203752203753203754203755203756203757203758203759203760203761203762203763203764203765203766203767203768203769203770203771203772203773203774203775203776203777203778203779203780203781203782203783203784203785203786203787203788203789203790203791203792203793203794203795203796203797203798203799203800203801203802203803203804203805203806203807203808203809203810203811203812203813203814203815203816203817203818203819203820203821203822203823203824203825203826203827203828203829203830203831203832203833203834203835203836203837203838203839203840203841203842203843203844203845203846203847203848203849203850203851203852203853203854203855203856203857203858203859203860203861203862203863203864203865203866203867203868203869203870203871203872203873203874203875203876203877203878203879203880203881203882203883203884203885203886203887203888203889203890203891203892203893203894203895203896203897203898203899203900203901203902203903203904203905203906203907203908203909203910203911203912203913203914203915203916203917203918203919203920203921203922203923203924203925203926203927203928203929203930203931203932203933203934203935203936203937203938203939203940203941203942203943203944203945203946203947203948203949203950203951203952203953203954203955203956203957203958203959203960203961203962203963203964203965203966203967203968203969203970203971203972203973203974203975203976203977203978203979203980203981203982203983203984203985203986203987203988203989203990203991203992203993203994203995203996203997203998203999204000204001204002204003204004204005204006204007204008204009204010204011204012204013204014204015204016204017204018204019204020204021204022204023204024204025204026204027204028204029204030204031204032204033204034204035204036204037204038204039204040204041204042204043204044204045204046204047204048204049204050204051204052204053204054204055204056204057204058204059204060204061204062204063204064204065204066204067204068204069204070204071204072204073204074204075204076204077204078204079204080204081204082204083204084204085204086204087204088204089204090204091204092204093204094204095204096204097204098204099204100204101204102204103204104204105204106204107204108204109204110204111204112204113204114204115204116204117204118204119204120204121204122204123204124204125204126204127204128204129204130204131204132204133204134204135204136204137204138204139204140204141204142204143204144204145204146204147204148204149204150204151204152204153204154204155204156204157204158204159204160204161204162204163204164204165204166204167204168204169204170204171204172204173204174204175204176204177204178204179204180204181204182204183204184204185204186204187204188204189204190204191204192204193204194204195204196204197204198204199204200204201204202204203204204204205204206204207204208204209204210204211204212204213204214204215204216204217204218204219204220204221204222204223204224204225204226204227204228204229204230204231204232204233204234204235204236204237204238204239204240204241204242204243204244204245204246204247204248204249204250204251204252204253204254204255204256204257204258204259204260204261204262204263204264204265204266204267204268204269204270204271204272204273204274204275204276204277204278204279204280204281204282204283204284204285204286204287204288204289204290204291204292204293204294204295204296204297204298204299204300204301204302204303204304204305204306204307204308204309204310204311204312204313204314204315204316204317204318204319204320204321204322204323204324204325204326204327204328204329204330204331204332204333204334204335204336204337204338204339204340204341204342204343204344204345204346204347204348204349204350204351204352204353204354204355204356204357204358204359204360204361204362204363204364204365204366204367204368204369204370204371204372204373204374204375204376204377204378204379204380204381204382204383204384204385204386204387204388204389204390204391204392204393204394204395204396204397204398204399204400204401204402204403204404204405204406204407204408204409204410204411204412204413204414204415204416204417204418204419204420204421204422204423204424204425204426204427204428204429204430204431204432204433204434204435204436204437204438204439204440204441204442204443204444204445204446204447204448204449204450204451204452204453204454204455204456204457204458204459204460204461204462204463204464204465204466204467204468204469204470204471204472204473204474204475204476204477204478204479204480204481204482204483204484204485204486204487204488204489204490204491204492204493204494204495204496204497204498204499204500204501204502204503204504204505204506204507204508204509204510204511204512204513204514204515204516204517204518204519204520204521204522204523204524204525204526204527204528204529204530204531204532204533204534204535204536204537204538204539204540204541204542204543204544204545204546204547204548204549204550204551204552204553204554204555204556204557204558204559204560204561204562204563204564204565204566204567204568204569204570204571204572204573204574204575204576204577204578204579204580204581204582204583204584204585204586204587204588204589204590204591204592204593204594204595204596204597204598204599204600204601204602204603204604204605204606204607204608204609204610204611204612204613204614204615204616204617204618204619204620204621204622204623204624204625204626204627204628204629204630204631204632204633204634204635204636204637204638204639204640204641204642204643204644204645204646204647204648204649204650204651204652204653204654204655204656204657204658204659204660204661204662204663204664204665204666204667204668204669204670204671204672204673204674204675204676204677204678204679204680204681204682204683204684204685204686204687204688204689204690204691204692204693204694204695204696204697204698204699204700204701204702204703204704204705204706204707204708204709204710204711204712204713204714204715204716204717204718204719204720204721204722204723204724204725204726204727204728204729204730204731204732204733204734204735204736204737204738204739204740204741204742204743204744204745204746204747204748204749204750204751204752204753204754204755204756204757204758204759204760204761204762204763204764204765204766204767204768204769204770204771204772204773204774204775204776204777204778204779204780204781204782204783204784204785204786204787204788204789204790204791204792204793204794204795204796204797204798204799204800204801204802204803204804204805204806204807204808204809204810204811204812204813204814204815204816204817204818204819204820204821204822204823204824204825204826204827204828204829204830204831204832204833204834204835204836204837204838204839204840204841204842204843204844204845204846204847204848204849204850204851204852204853204854204855204856204857204858204859204860204861204862204863204864204865204866204867204868204869204870204871204872204873204874204875204876204877204878204879204880204881204882204883204884204885204886204887204888204889204890204891204892204893204894204895204896204897204898204899204900204901204902204903204904204905204906204907204908204909204910204911204912204913204914204915204916204917204918204919204920204921204922204923204924204925204926204927204928204929204930204931204932204933204934204935204936204937204938204939204940204941204942204943204944204945204946204947204948204949204950204951204952204953204954204955204956204957204958204959204960204961204962204963204964204965204966204967204968204969204970204971204972204973204974204975204976204977204978204979204980204981204982204983204984204985204986204987204988204989204990204991204992204993204994204995204996204997204998204999205000205001205002205003205004205005205006205007205008205009205010205011205012205013205014205015205016205017205018205019205020205021205022205023205024205025205026205027205028205029205030205031205032205033205034205035205036205037205038205039205040205041205042205043205044205045205046205047205048205049205050205051205052205053205054205055205056205057205058205059205060205061205062205063205064205065205066205067205068205069205070205071205072205073205074205075205076205077205078205079205080205081205082205083205084205085205086205087205088205089205090205091205092205093205094205095205096205097205098205099205100205101205102205103205104205105205106205107205108205109205110205111205112205113205114205115205116205117205118205119205120205121205122205123205124205125205126205127205128205129205130205131205132205133205134205135205136205137205138205139205140205141205142205143205144205145205146205147205148205149205150205151205152205153205154205155205156205157205158205159205160205161205162205163205164205165205166205167205168205169205170205171205172205173205174205175205176205177205178205179205180205181205182205183205184205185205186205187205188205189205190205191205192205193205194205195205196205197205198205199205200205201205202205203205204205205205206205207205208205209205210205211205212205213205214205215205216205217205218205219205220205221205222205223205224205225205226205227205228205229205230205231205232205233205234205235205236205237205238205239205240205241205242205243205244205245205246205247205248205249205250205251205252205253205254205255205256205257205258205259205260205261205262205263205264205265205266205267205268205269205270205271205272205273205274205275205276205277205278205279205280205281205282205283205284205285205286205287205288205289205290205291205292205293205294205295205296205297205298205299205300205301205302205303205304205305205306205307205308205309205310205311205312205313205314205315205316205317205318205319205320205321205322205323205324205325205326205327205328205329205330205331205332205333205334205335205336205337205338205339205340205341205342205343205344205345205346205347205348205349205350205351205352205353205354205355205356205357205358205359205360205361205362205363205364205365205366205367205368205369205370205371205372205373205374205375205376205377205378205379205380205381205382205383205384205385205386205387205388205389205390205391205392205393205394205395205396205397205398205399205400205401205402205403205404205405205406205407205408205409205410205411205412205413205414205415205416205417205418205419205420205421205422205423205424205425205426205427205428205429205430205431205432205433205434205435205436205437205438205439205440205441205442205443205444205445205446205447205448205449205450205451205452205453205454205455205456205457205458205459205460205461205462205463205464205465205466205467205468205469205470205471205472205473205474205475205476205477205478205479205480205481205482205483205484205485205486205487205488205489205490205491205492205493205494205495205496205497205498205499205500205501205502205503205504205505205506205507205508205509205510205511205512205513205514205515205516205517205518205519205520205521205522205523205524205525205526205527205528205529205530205531205532205533205534205535205536205537205538205539205540205541205542205543205544205545205546205547205548205549205550205551205552205553205554205555205556205557205558205559205560205561205562205563205564205565205566205567205568205569205570205571205572205573205574205575205576205577205578205579205580205581205582205583205584205585205586205587205588205589205590205591205592205593205594205595205596205597205598205599205600205601205602205603205604205605205606205607205608205609205610205611205612205613205614205615205616205617205618205619205620205621205622205623205624205625205626205627205628205629205630205631205632205633205634205635205636205637205638205639205640205641205642205643205644205645205646205647205648205649205650205651205652205653205654205655205656205657205658205659205660205661205662205663205664205665205666205667205668205669205670205671205672205673205674205675205676205677205678205679205680205681205682205683205684205685205686205687205688205689205690205691205692205693205694205695205696205697205698205699205700205701205702205703205704205705205706205707205708205709205710205711205712205713205714205715205716205717205718205719205720205721205722205723205724205725205726205727205728205729205730205731205732205733205734205735205736205737205738205739205740205741205742205743205744205745205746205747205748205749205750205751205752205753205754205755205756205757205758205759205760205761205762205763205764205765205766205767205768205769205770205771205772205773205774205775205776205777205778205779205780205781205782205783205784205785205786205787205788205789205790205791205792205793205794205795205796205797205798205799205800205801205802205803205804205805205806205807205808205809205810205811205812205813205814205815205816205817205818205819205820205821205822205823205824205825205826205827205828205829205830205831205832205833205834205835205836205837205838205839205840205841205842205843205844205845205846205847205848205849205850205851205852205853205854205855205856205857205858205859205860205861205862205863205864205865205866205867205868205869205870205871205872205873205874205875205876205877205878205879205880205881205882205883205884205885205886205887205888205889205890205891205892205893205894205895205896205897205898205899205900205901205902205903205904205905205906205907205908205909205910205911205912205913205914205915205916205917205918205919205920205921205922205923205924205925205926205927205928205929205930205931205932205933205934205935205936205937205938205939205940205941205942205943205944205945205946205947205948205949205950205951205952205953205954205955205956205957205958205959205960205961205962205963205964205965205966205967205968205969205970205971205972205973205974205975205976205977205978205979205980205981205982205983205984205985205986205987205988205989205990205991205992205993205994205995205996205997205998205999206000206001206002206003206004206005206006206007206008206009206010206011206012206013206014206015206016206017206018206019206020206021206022206023206024206025206026206027206028206029206030206031206032206033206034206035206036206037206038206039206040206041206042206043206044206045206046206047206048206049206050206051206052206053206054206055206056206057206058206059206060206061206062206063206064206065206066206067206068206069206070206071206072206073206074206075206076206077206078206079206080206081206082206083206084206085206086206087206088206089206090206091206092206093206094206095206096206097206098206099206100206101206102206103206104206105206106206107206108206109206110206111206112206113206114206115206116206117206118206119206120206121206122206123206124206125206126206127206128206129206130206131206132206133206134206135206136206137206138206139206140206141206142206143206144206145206146206147206148206149206150206151206152206153206154206155206156206157206158206159206160206161206162206163206164206165206166206167206168206169206170206171206172206173206174206175206176206177206178206179206180206181206182206183206184206185206186206187206188206189206190206191206192206193206194206195206196206197206198206199206200206201206202206203206204206205206206206207206208206209206210206211206212206213206214206215206216206217206218206219206220206221206222206223206224206225206226206227206228206229206230206231206232206233206234206235206236206237206238206239206240206241206242206243206244206245206246206247206248206249206250206251206252206253206254206255206256206257206258206259206260206261206262206263206264206265206266206267206268206269206270206271206272206273206274206275206276206277206278206279206280206281206282206283206284206285206286206287206288206289206290206291206292206293206294206295206296206297206298206299206300206301206302206303206304206305206306206307206308206309206310206311206312206313206314206315206316206317206318206319206320206321206322206323206324206325206326206327206328206329206330206331206332206333206334206335206336206337206338206339206340206341206342206343206344206345206346206347206348206349206350206351206352206353206354206355206356206357206358206359206360206361206362206363206364206365206366206367206368206369206370206371206372206373206374206375206376206377206378206379206380206381206382206383206384206385206386206387206388206389206390206391206392206393206394206395206396206397206398206399206400206401206402206403206404206405206406206407206408206409206410206411206412206413206414206415206416206417206418206419206420206421206422206423206424206425206426206427206428206429206430206431206432206433206434206435206436206437206438206439206440206441206442206443206444206445206446206447206448206449206450206451206452206453206454206455206456206457206458206459206460206461206462206463206464206465206466206467206468206469206470206471206472206473206474206475206476206477206478206479206480206481206482206483206484206485206486206487206488206489206490206491206492206493206494206495206496206497206498206499206500206501206502206503206504206505206506206507206508206509206510206511206512206513206514206515206516206517206518206519206520206521206522206523206524206525206526206527206528206529206530206531206532206533206534206535206536206537206538206539206540206541206542206543206544206545206546206547206548206549206550206551206552206553206554206555206556206557206558206559206560206561206562206563206564206565206566206567206568206569206570206571206572206573206574206575206576206577206578206579206580206581206582206583206584206585206586206587206588206589206590206591206592206593206594206595206596206597206598206599206600206601206602206603206604206605206606206607206608206609206610206611206612206613206614206615206616206617206618206619206620206621206622206623206624206625206626206627206628206629206630206631206632206633206634206635206636206637206638206639206640206641206642206643206644206645206646206647206648206649206650206651206652206653206654206655206656206657206658206659206660206661206662206663206664206665206666206667206668206669206670206671206672206673206674206675206676206677206678206679206680206681206682206683206684206685206686206687206688206689206690206691206692206693206694206695206696206697206698206699206700206701206702206703206704206705206706206707206708206709206710206711206712206713206714206715206716206717206718206719206720206721206722206723206724206725206726206727206728206729206730206731206732206733206734206735206736206737206738206739206740206741206742206743206744206745206746206747206748206749206750206751206752206753206754206755206756206757206758206759206760206761206762206763206764206765206766206767206768206769206770206771206772206773206774206775206776206777206778206779206780206781206782206783206784206785206786206787206788206789206790206791206792206793206794206795206796206797206798206799206800206801206802206803206804206805206806206807206808206809206810206811206812206813206814206815206816206817206818206819206820206821206822206823206824206825206826206827206828206829206830206831206832206833206834206835206836206837206838206839206840206841206842206843206844206845206846206847206848206849206850206851206852206853206854206855206856206857206858206859206860206861206862206863206864206865206866206867206868206869206870206871206872206873206874206875206876206877206878206879206880206881206882206883206884206885206886206887206888206889206890206891206892206893206894206895206896206897206898206899206900206901206902206903206904206905206906206907206908206909206910206911206912206913206914206915206916206917206918206919206920206921206922206923206924206925206926206927206928206929206930206931206932206933206934206935206936206937206938206939206940206941206942206943206944206945206946206947206948206949206950206951206952206953206954206955206956206957206958206959206960206961206962206963206964206965206966206967206968206969206970206971206972206973206974206975206976206977206978206979206980206981206982206983206984206985206986206987206988206989206990206991206992206993206994206995206996206997206998206999207000207001207002207003207004207005207006207007207008207009207010207011207012207013207014207015207016207017207018207019207020207021207022207023207024207025207026207027207028207029207030207031207032207033207034207035207036207037207038207039207040207041207042207043207044207045207046207047207048207049207050207051207052207053207054207055207056207057207058207059207060207061207062207063207064207065207066207067207068207069207070207071207072207073207074207075207076207077207078207079207080207081207082207083207084207085207086207087207088207089207090207091207092207093207094207095207096207097207098207099207100207101207102207103207104207105207106207107207108207109207110207111207112207113207114207115207116207117207118207119207120207121207122207123207124207125207126207127207128207129207130207131207132207133207134207135207136207137207138207139207140207141207142207143207144207145207146207147207148207149207150207151207152207153207154207155207156207157207158207159207160207161207162207163207164207165207166207167207168207169207170207171207172207173207174207175207176207177207178207179207180207181207182207183207184207185207186207187207188207189207190207191207192207193207194207195207196207197207198207199207200207201207202207203207204207205207206207207207208207209207210207211207212207213207214207215207216207217207218207219207220207221207222207223207224207225207226207227207228207229207230207231207232207233207234207235207236207237207238207239207240207241207242207243207244207245207246207247207248207249207250207251207252207253207254207255207256207257207258207259207260207261207262207263207264207265207266207267207268207269207270207271207272207273207274207275207276207277207278207279207280207281207282207283207284207285207286207287207288207289207290207291207292207293207294207295207296207297207298207299207300207301207302207303207304207305207306207307207308207309207310207311207312207313207314207315207316207317207318207319207320207321207322207323207324207325207326207327207328207329207330207331207332207333207334207335207336207337207338207339207340207341207342207343207344207345207346207347207348207349207350207351207352207353207354207355207356207357207358207359207360207361207362207363207364207365207366207367207368207369207370207371207372207373207374207375207376207377207378207379207380207381207382207383207384207385207386207387207388207389207390207391207392207393207394207395207396207397207398207399207400207401207402207403207404207405207406207407207408207409207410207411207412207413207414207415207416207417207418207419207420207421207422207423207424207425207426207427207428207429207430207431207432207433207434207435207436207437207438207439207440207441207442207443207444207445207446207447207448207449207450207451207452207453207454207455207456207457207458207459207460207461207462207463207464207465207466207467207468207469207470207471207472207473207474207475207476207477207478207479207480207481207482207483207484207485207486207487207488207489207490207491207492207493207494207495207496207497207498207499207500207501207502207503207504207505207506207507207508207509207510207511207512207513207514207515207516207517207518207519207520207521207522207523207524207525207526207527207528207529207530207531207532207533207534207535207536207537207538207539207540207541207542207543207544207545207546207547207548207549207550207551207552207553207554207555207556207557207558207559207560207561207562207563207564207565207566207567207568207569207570207571207572207573207574207575207576207577207578207579207580207581207582207583207584207585207586207587207588207589207590207591207592207593207594207595207596207597207598207599207600207601207602207603207604207605207606207607207608207609207610207611207612207613207614207615207616207617207618207619207620207621207622207623207624207625207626207627207628207629207630207631207632207633207634207635207636207637207638207639207640207641207642207643207644207645207646207647207648207649207650207651207652207653207654207655207656207657207658207659207660207661207662207663207664207665207666207667207668207669207670207671207672207673207674207675207676207677207678207679207680207681207682207683207684207685207686207687207688207689207690207691207692207693207694207695207696207697207698207699207700207701207702207703207704207705207706207707207708207709207710207711207712207713207714207715207716207717207718207719207720207721207722207723207724207725207726207727207728207729207730207731207732207733207734207735207736207737207738207739207740207741207742207743207744207745207746207747207748207749207750207751207752207753207754207755207756207757207758207759207760207761207762207763207764207765207766207767207768207769207770207771207772207773207774207775207776207777207778207779207780207781207782207783207784207785207786207787207788207789207790207791207792207793207794207795207796207797207798207799207800207801207802207803207804207805207806207807207808207809207810207811207812207813207814207815207816207817207818207819207820207821207822207823207824207825207826207827207828207829207830207831207832207833207834207835207836207837207838207839207840207841207842207843207844207845207846207847207848207849207850207851207852207853207854207855207856207857207858207859207860207861207862207863207864207865207866207867207868207869207870207871207872207873207874207875207876207877207878207879207880207881207882207883207884207885207886207887207888207889207890207891207892207893207894207895207896207897207898207899207900207901207902207903207904207905207906207907207908207909207910207911207912207913207914207915207916207917207918207919207920207921207922207923207924207925207926207927207928207929207930207931207932207933207934207935207936207937207938207939207940207941207942207943207944207945207946207947207948207949207950207951207952207953207954207955207956207957207958207959207960207961207962207963207964207965207966207967207968207969207970207971207972207973207974207975207976207977207978207979207980207981207982207983207984207985207986207987207988207989207990207991207992207993207994207995207996207997207998207999208000208001208002208003208004208005208006208007208008208009208010208011208012208013208014208015208016208017208018208019208020208021208022208023208024208025208026208027208028208029208030208031208032208033208034208035208036208037208038208039208040208041208042208043208044208045208046208047208048208049208050208051208052208053208054208055208056208057208058208059208060208061208062208063208064208065208066208067208068208069208070208071208072208073208074208075208076208077208078208079208080208081208082208083208084208085208086208087208088208089208090208091208092208093208094208095208096208097208098208099208100208101208102208103208104208105208106208107208108208109208110208111208112208113208114208115208116208117208118208119208120208121208122208123208124208125208126208127208128208129208130208131208132208133208134208135208136208137208138208139208140208141208142208143208144208145208146208147208148208149208150208151208152208153208154208155208156208157208158208159208160208161208162208163208164208165208166208167208168208169208170208171208172208173208174208175208176208177208178208179208180208181208182208183208184208185208186208187208188208189208190208191208192208193208194208195208196208197208198208199208200208201208202208203208204208205208206208207208208208209208210208211208212208213208214208215208216208217208218208219208220208221208222208223208224208225208226208227208228208229208230208231208232208233208234208235208236208237208238208239208240208241208242208243208244208245208246208247208248208249208250208251208252208253208254208255208256208257208258208259208260208261208262208263208264208265208266208267208268208269208270208271208272208273208274208275208276208277208278208279208280208281208282208283208284208285208286208287208288208289208290208291208292208293208294208295208296208297208298208299208300208301208302208303208304208305208306208307208308208309208310208311208312208313208314208315208316208317208318208319208320208321208322208323208324208325208326208327208328208329208330208331208332208333208334208335208336208337208338208339208340208341208342208343208344208345208346208347208348208349208350208351208352208353208354208355208356208357208358208359208360208361208362208363208364208365208366208367208368208369208370208371208372208373208374208375208376208377208378208379208380208381208382208383208384208385208386208387208388208389208390208391208392208393208394208395208396208397208398208399208400208401208402208403208404208405208406208407208408208409208410208411208412208413208414208415208416208417208418208419208420208421208422208423208424208425208426208427208428208429208430208431208432208433208434208435208436208437208438208439208440208441208442208443208444208445208446208447208448208449208450208451208452208453208454208455208456208457208458208459208460208461208462208463208464208465208466208467208468208469208470208471208472208473208474208475208476208477208478208479208480208481208482208483208484208485208486208487208488208489208490208491208492208493208494208495208496208497208498208499208500208501208502208503208504208505208506208507208508208509208510208511208512208513208514208515208516208517208518208519208520208521208522208523208524208525208526208527208528208529208530208531208532208533208534208535208536208537208538208539208540208541208542208543208544208545208546208547208548208549208550208551208552208553208554208555208556208557208558208559208560208561208562208563208564208565208566208567208568208569208570208571208572208573208574208575208576208577208578208579208580208581208582208583208584208585208586208587208588208589208590208591208592208593208594208595208596208597208598208599208600208601208602208603208604208605208606208607208608208609208610208611208612208613208614208615208616208617208618208619208620208621208622208623208624208625208626208627208628208629208630208631208632208633208634208635208636208637208638208639208640208641208642208643208644208645208646208647208648208649208650208651208652208653208654208655208656208657208658208659208660208661208662208663208664208665208666208667208668208669208670208671208672208673208674208675208676208677208678208679208680208681208682208683208684208685208686208687208688208689208690208691208692208693208694208695208696208697208698208699208700208701208702208703208704208705208706208707208708208709208710208711208712208713208714208715208716208717208718208719208720208721208722208723208724208725208726208727208728208729208730208731208732208733208734208735208736208737208738208739208740208741208742208743208744208745208746208747208748208749208750208751208752208753208754208755208756208757208758208759208760208761208762208763208764208765208766208767208768208769208770208771208772208773208774208775208776208777208778208779208780208781208782208783208784208785208786208787208788208789208790208791208792208793208794208795208796208797208798208799208800208801208802208803208804208805208806208807208808208809208810208811208812208813208814208815208816208817208818208819208820208821208822208823208824208825208826208827208828208829208830208831208832208833208834208835208836208837208838208839208840208841208842208843208844208845208846208847208848208849208850208851208852208853208854208855208856208857208858208859208860208861208862208863208864208865208866208867208868208869208870208871208872208873208874208875208876208877208878208879208880208881208882208883208884208885208886208887208888208889208890208891208892208893208894208895208896208897208898208899208900208901208902208903208904208905208906208907208908208909208910208911208912208913208914208915208916208917208918208919208920208921208922208923208924208925208926208927208928208929208930208931208932208933208934208935208936208937208938208939208940208941208942208943208944208945208946208947208948208949208950208951208952208953208954208955208956208957208958208959208960208961208962208963208964208965208966208967208968208969208970208971208972208973208974208975208976208977208978208979208980208981208982208983208984208985208986208987208988208989208990208991208992208993208994208995208996208997208998208999209000209001209002209003209004209005209006209007209008209009209010209011209012209013209014209015209016209017209018209019209020209021209022209023209024209025209026209027209028209029209030209031209032209033209034209035209036209037209038209039209040209041209042209043209044209045209046209047209048209049209050209051209052209053209054209055209056209057209058209059209060209061209062209063209064209065209066209067209068209069209070209071209072209073209074209075209076209077209078209079209080209081209082209083209084209085209086209087209088209089209090209091209092209093209094209095209096209097209098209099209100209101209102209103209104209105209106209107209108209109209110209111209112209113209114209115209116209117209118209119209120209121209122209123209124209125209126209127209128209129209130209131209132209133209134209135209136209137209138209139209140209141209142209143209144209145209146209147209148209149209150209151209152209153209154209155209156209157209158209159209160209161209162209163209164209165209166209167209168209169209170209171209172209173209174209175209176209177209178209179209180209181209182209183209184209185209186209187209188209189209190209191209192209193209194209195209196209197209198209199209200209201209202209203209204209205209206209207209208209209209210209211209212209213209214209215209216209217209218209219209220209221209222209223209224209225209226209227209228209229209230209231209232209233209234209235209236209237209238209239209240209241209242209243209244209245209246209247209248209249209250209251209252209253209254209255209256209257209258209259209260209261209262209263209264209265209266209267209268209269209270209271209272209273209274209275209276209277209278209279209280209281209282209283209284209285209286209287209288209289209290209291209292209293209294209295209296209297209298209299209300209301209302209303209304209305209306209307209308209309209310209311209312209313209314209315209316209317209318209319209320209321209322209323209324209325209326209327209328209329209330209331209332209333209334209335209336209337209338209339209340209341209342209343209344209345209346209347209348209349209350209351209352209353209354209355209356209357209358209359209360209361209362209363209364209365209366209367209368209369209370209371209372209373209374209375209376209377209378209379209380209381209382209383209384209385209386209387209388209389209390209391209392209393209394209395209396209397209398209399209400209401209402209403209404209405209406209407209408209409209410209411209412209413209414209415209416209417209418209419209420209421209422209423209424209425209426209427209428209429209430209431209432209433209434209435209436209437209438209439209440209441209442209443209444209445209446209447209448209449209450209451209452209453209454209455209456209457209458209459209460209461209462209463209464209465209466209467209468209469209470209471209472209473209474209475209476209477209478209479209480209481209482209483209484209485209486209487209488209489209490209491209492209493209494209495209496209497209498209499209500209501209502209503209504209505209506209507209508209509209510209511209512209513209514209515209516209517209518209519209520209521209522209523209524209525209526209527209528209529209530209531209532209533209534209535209536209537209538209539209540209541209542209543209544209545209546209547209548209549209550209551209552209553209554209555209556209557209558209559209560209561209562209563209564209565209566209567209568209569209570209571209572209573209574209575209576209577209578209579209580209581209582209583209584209585209586209587209588209589209590209591209592209593209594209595209596209597209598209599209600209601209602209603209604209605209606209607209608209609209610209611209612209613209614209615209616209617209618209619209620209621209622209623209624209625209626209627209628209629209630209631209632209633209634209635209636209637209638209639209640209641209642209643209644209645209646209647209648209649209650209651209652209653209654209655209656209657209658209659209660209661209662209663209664209665209666209667209668209669209670209671209672209673209674209675209676209677209678209679209680209681209682209683209684209685209686209687209688209689209690209691209692209693209694209695209696209697209698209699209700209701209702209703209704209705209706209707209708209709209710209711209712209713209714209715209716209717209718209719209720209721209722209723209724209725209726209727209728209729209730209731209732209733209734209735209736209737209738209739209740209741209742209743209744209745209746209747209748209749209750209751209752209753209754209755209756209757209758209759209760209761209762209763209764209765209766209767209768209769209770209771209772209773209774209775209776209777209778209779209780209781209782209783209784209785209786209787209788209789209790209791209792209793209794209795209796209797209798209799209800209801209802209803209804209805209806209807209808209809209810209811209812209813209814209815209816209817209818209819209820209821209822209823209824209825209826209827209828209829209830209831209832209833209834209835209836209837209838209839209840209841209842209843209844209845209846209847209848209849209850209851209852209853209854209855209856209857209858209859209860209861209862209863209864209865209866209867209868209869209870209871209872209873209874209875209876209877209878209879209880209881209882209883209884209885209886209887209888209889209890209891209892209893209894209895209896209897209898209899209900209901209902209903209904209905209906209907209908209909209910209911209912209913209914209915209916209917209918209919209920209921209922209923209924209925209926209927209928209929209930209931209932209933209934209935209936209937209938209939209940209941209942209943209944209945209946209947209948209949209950209951209952209953209954209955209956209957209958209959209960209961209962209963209964209965209966209967209968209969209970209971209972209973209974209975209976209977209978209979209980209981209982209983209984209985209986209987209988209989209990209991209992209993209994209995209996209997209998209999210000210001210002210003210004210005210006210007210008210009210010210011210012210013210014210015210016210017210018210019210020210021210022210023210024210025210026210027210028210029210030210031210032210033210034210035210036210037210038210039210040210041210042210043210044210045210046210047210048210049210050210051210052210053210054210055210056210057210058210059210060210061210062210063210064210065210066210067210068210069210070210071210072210073210074210075210076210077210078210079210080210081210082210083210084210085210086210087210088210089210090210091210092210093210094210095210096210097210098210099210100210101210102210103210104210105210106210107210108210109210110210111210112210113210114210115210116210117210118210119210120210121210122210123210124210125210126210127210128210129210130210131210132210133210134210135210136210137210138210139210140210141210142210143210144210145210146210147210148210149210150210151210152210153210154210155210156210157210158210159210160210161210162210163210164210165210166210167210168210169210170210171210172210173210174210175210176210177210178210179210180210181210182210183210184210185210186210187210188210189210190210191210192210193210194210195210196210197210198210199210200210201210202210203210204210205210206210207210208210209210210210211210212210213210214210215210216210217210218210219210220210221210222210223210224210225210226210227210228210229210230210231210232210233210234210235210236210237210238210239210240210241210242210243210244210245210246210247210248210249210250210251210252210253210254210255210256210257210258210259210260210261210262210263210264210265210266210267210268210269210270210271210272210273210274210275210276210277210278210279210280210281210282210283210284210285210286210287210288210289210290210291210292210293210294210295210296210297210298210299210300210301210302210303210304210305210306210307210308210309210310210311210312210313210314210315210316210317210318210319210320210321210322210323210324210325210326210327210328210329210330210331210332210333210334210335210336210337210338210339210340210341210342210343210344210345210346210347210348210349210350210351210352210353210354210355210356210357210358210359210360210361210362210363210364210365210366210367210368210369210370210371210372210373210374210375210376210377210378210379210380210381210382210383210384210385210386210387210388210389210390210391210392210393210394210395210396210397210398210399210400210401210402210403210404210405210406210407210408210409210410210411210412210413210414210415210416210417210418210419210420210421210422210423210424210425210426210427210428210429210430210431210432210433210434210435210436210437210438210439210440210441210442210443210444210445210446210447210448210449210450210451210452210453210454210455210456210457210458210459210460210461210462210463210464210465210466210467210468210469210470210471210472210473210474210475210476210477210478210479210480210481210482210483210484210485210486210487210488210489210490210491210492210493210494210495210496210497210498210499210500210501210502210503210504210505210506210507210508210509210510210511210512210513210514210515210516210517210518210519210520210521210522210523210524210525210526210527210528210529210530210531210532210533210534210535210536210537210538210539210540210541210542210543210544210545210546210547210548210549210550210551210552210553210554210555210556210557210558210559210560210561210562210563210564210565210566210567210568210569210570210571210572210573210574210575210576210577210578210579210580210581210582210583210584210585210586210587210588210589210590210591210592210593210594210595210596210597210598210599210600210601210602210603210604210605210606210607210608210609210610210611210612210613210614210615210616210617210618210619210620210621210622210623210624210625210626210627210628210629210630210631210632210633210634210635210636210637210638210639210640210641210642210643210644210645210646210647210648210649210650210651210652210653210654210655210656210657210658210659210660210661210662210663210664210665210666210667210668210669210670210671210672210673210674210675210676210677210678210679210680210681210682210683210684210685210686210687210688210689210690210691210692210693210694210695210696210697210698210699210700210701210702210703210704210705210706210707210708210709210710210711210712210713210714210715210716210717210718210719210720210721210722210723210724210725210726210727210728210729210730210731210732210733210734210735210736210737210738210739210740210741210742210743210744210745210746210747210748210749210750210751210752210753210754210755210756210757210758210759210760210761210762210763210764210765210766210767210768210769210770210771210772210773210774210775210776210777210778210779210780210781210782210783210784210785210786210787210788210789210790210791210792210793210794210795210796210797210798210799210800210801210802210803210804210805210806210807210808210809210810210811210812210813210814210815210816210817210818210819210820210821210822210823210824210825210826210827210828210829210830210831210832210833210834210835210836210837210838210839210840210841210842210843210844210845210846210847210848210849210850210851210852210853210854210855210856210857210858210859210860210861210862210863210864210865210866210867210868210869210870210871210872210873210874210875210876210877210878210879210880210881210882210883210884210885210886210887210888210889210890210891210892210893210894210895210896210897210898210899210900210901210902210903210904210905210906210907210908210909210910210911210912210913210914210915210916210917210918210919210920210921210922210923210924210925210926210927210928210929210930210931210932210933210934210935210936210937210938210939210940210941210942210943210944210945210946210947210948210949210950210951210952210953210954210955210956210957210958210959210960210961210962210963210964210965210966210967210968210969210970210971210972210973210974210975210976210977210978210979210980210981210982210983210984210985210986210987210988210989210990210991210992210993210994210995210996210997210998210999211000211001211002211003211004211005211006211007211008211009211010211011211012211013211014211015211016211017211018211019211020211021211022211023211024211025211026211027211028211029211030211031211032211033211034211035211036211037211038211039211040211041211042211043211044211045211046211047211048211049211050211051211052211053211054211055211056211057211058211059211060211061211062211063211064211065211066211067211068211069211070211071211072211073211074211075211076211077211078211079211080211081211082211083211084211085211086211087211088211089211090211091211092211093211094211095211096211097211098211099211100211101211102211103211104211105211106211107211108211109211110211111211112211113211114211115211116211117211118211119211120211121211122211123211124211125211126211127211128211129211130211131211132211133211134211135211136211137211138211139211140211141211142211143211144211145211146211147211148211149211150211151211152211153211154211155211156211157211158211159211160211161211162211163211164211165211166211167211168211169211170211171211172211173211174211175211176211177211178211179211180211181211182211183211184211185211186211187211188211189211190211191211192211193211194211195211196211197211198211199211200211201211202211203211204211205211206211207211208211209211210211211211212211213211214211215211216211217211218211219211220211221211222211223211224211225211226211227211228211229211230211231211232211233211234211235211236211237211238211239211240211241211242211243211244211245211246211247211248211249211250211251211252211253211254211255211256211257211258211259211260211261211262211263211264211265211266211267211268211269211270211271211272211273211274211275211276211277211278211279211280211281211282211283211284211285211286211287211288211289211290211291211292211293211294211295211296211297211298211299211300211301211302211303211304211305211306211307211308211309211310211311211312211313211314211315211316211317211318211319211320211321211322211323211324211325211326211327211328211329211330211331211332211333211334211335211336211337211338211339211340211341211342211343211344211345211346211347211348211349211350211351211352211353211354211355211356211357211358211359211360211361211362211363211364211365211366211367211368211369211370211371211372211373211374211375211376211377211378211379211380211381211382211383211384211385211386211387211388211389211390211391211392211393211394211395211396211397211398211399211400211401211402211403211404211405211406211407211408211409211410211411211412211413211414211415211416211417211418211419211420211421211422211423211424211425211426211427211428211429211430211431211432211433211434211435211436211437211438211439211440211441211442211443211444211445211446211447211448211449211450211451211452211453211454211455211456211457211458211459211460211461211462211463211464211465211466211467211468211469211470211471211472211473211474211475211476211477211478211479211480211481211482211483211484211485211486211487211488211489211490211491211492211493211494211495211496211497211498211499211500211501211502211503211504211505211506211507211508211509211510211511211512211513211514211515211516211517211518211519211520211521211522211523211524211525211526211527211528211529211530211531211532211533211534211535211536211537211538211539211540211541211542211543211544211545211546211547211548211549211550211551211552211553211554211555211556211557211558211559211560211561211562211563211564211565211566211567211568211569211570211571211572211573211574211575211576211577211578211579211580211581211582211583211584211585211586211587211588211589211590211591211592211593211594211595211596211597211598211599211600211601211602211603211604211605211606211607211608211609211610211611211612211613211614211615211616211617211618211619211620211621211622211623211624211625211626211627211628211629211630211631211632211633211634211635211636211637211638211639211640211641211642211643211644211645211646211647211648211649211650211651211652211653211654211655211656211657211658211659211660211661211662211663211664211665211666211667211668211669211670211671211672211673211674211675211676211677211678211679211680211681211682211683211684211685211686211687211688211689211690211691211692211693211694211695211696211697211698211699211700211701211702211703211704211705211706211707211708211709211710211711211712211713211714211715211716211717211718211719211720211721211722211723211724211725211726211727211728211729211730211731211732211733211734211735211736211737211738211739211740211741211742211743211744211745211746211747211748211749211750211751211752211753211754211755211756211757211758211759211760211761211762211763211764211765211766211767211768211769211770211771211772211773211774211775211776211777211778211779211780211781211782211783211784211785211786211787211788211789211790211791211792211793211794211795211796211797211798211799211800211801211802211803211804211805211806211807211808211809211810211811211812211813211814211815211816211817211818211819211820211821211822211823211824211825211826211827211828211829211830211831211832211833211834211835211836211837211838211839211840211841211842211843211844211845211846211847211848211849211850211851211852211853211854211855211856211857211858211859211860211861211862211863211864211865211866211867211868211869211870211871211872211873211874211875211876211877211878211879211880211881211882211883211884211885211886211887211888211889211890211891211892211893211894211895211896211897211898211899211900211901211902211903211904211905211906211907211908211909211910211911211912211913211914211915211916211917211918211919211920211921211922211923211924211925211926211927211928211929211930211931211932211933211934211935211936211937211938211939211940211941211942211943211944211945211946211947211948211949211950211951211952211953211954211955211956211957211958211959211960211961211962211963211964211965211966211967211968211969211970211971211972211973211974211975211976211977211978211979211980211981211982211983211984211985211986211987211988211989211990211991211992211993211994211995211996211997211998211999212000212001212002212003212004212005212006212007212008212009212010212011212012212013212014212015212016212017212018212019212020212021212022212023212024212025212026212027212028212029212030212031212032212033212034212035212036212037212038212039212040212041212042212043212044212045212046212047212048212049212050212051212052212053212054212055212056212057212058212059212060212061212062212063212064212065212066212067212068212069212070212071212072212073212074212075212076212077212078212079212080212081212082212083212084212085212086212087212088212089212090212091212092212093212094212095212096212097212098212099212100212101212102212103212104212105212106212107212108212109212110212111212112212113212114212115212116212117212118212119212120212121212122212123212124212125212126212127212128212129212130212131212132212133212134212135212136212137212138212139212140212141212142212143212144212145212146212147212148212149212150212151212152212153212154212155212156212157212158212159212160212161212162212163212164212165212166212167212168212169212170212171212172212173212174212175212176212177212178212179212180212181212182212183212184212185212186212187212188212189212190212191212192212193212194212195212196212197212198212199212200212201212202212203212204212205212206212207212208212209212210212211212212212213212214212215212216212217212218212219212220212221212222212223212224212225212226212227212228212229212230212231212232212233212234212235212236212237212238212239212240212241212242212243212244212245212246212247212248212249212250212251212252212253212254212255212256212257212258212259212260212261212262212263212264212265212266212267212268212269212270212271212272212273212274212275212276212277212278212279212280212281212282212283212284212285212286212287212288212289212290212291212292212293212294212295212296212297212298212299212300212301212302212303212304212305212306212307212308212309212310212311212312212313212314212315212316212317212318212319212320212321212322212323212324212325212326212327212328212329212330212331212332212333212334212335212336212337212338212339212340212341212342212343212344212345212346212347212348212349212350212351212352212353212354212355212356212357212358212359212360212361212362212363212364212365212366212367212368212369212370212371212372212373212374212375212376212377212378212379212380212381212382212383212384212385212386212387212388212389212390212391212392212393212394212395212396212397212398212399212400212401212402212403212404212405212406212407212408212409212410212411212412212413212414212415212416212417212418212419212420212421212422212423212424212425212426212427212428212429212430212431212432212433212434212435212436212437212438212439212440212441212442212443212444212445212446212447212448212449212450212451212452212453212454212455212456212457212458212459212460212461212462212463212464212465212466212467212468212469212470212471212472212473212474212475212476212477212478212479212480212481212482212483212484212485212486212487212488212489212490212491212492212493212494212495212496212497212498212499212500212501212502212503212504212505212506212507212508212509212510212511212512212513212514212515212516212517212518212519212520212521212522212523212524212525212526212527212528212529212530212531212532212533212534212535212536212537212538212539212540212541212542212543212544212545212546212547212548212549212550212551212552212553212554212555212556212557212558212559212560212561212562212563212564212565212566212567212568212569212570212571212572212573212574212575212576212577212578212579212580212581212582212583212584212585212586212587212588212589212590212591212592212593212594212595212596212597212598212599212600212601212602212603212604212605212606212607212608212609212610212611212612212613212614212615212616212617212618212619212620212621212622212623212624212625212626212627212628212629212630212631212632212633212634212635212636212637212638212639212640212641212642212643212644212645212646212647212648212649212650212651212652212653212654212655212656212657212658212659212660212661212662212663212664212665212666212667212668212669212670212671212672212673212674212675212676212677212678212679212680212681212682212683212684212685212686212687212688212689212690212691212692212693212694212695212696212697212698212699212700212701212702212703212704212705212706212707212708212709212710212711212712212713212714212715212716212717212718212719212720212721212722212723212724212725212726212727212728212729212730212731212732212733212734212735212736212737212738212739212740212741212742212743212744212745212746212747212748212749212750212751212752212753212754212755212756212757212758212759212760212761212762212763212764212765212766212767212768212769212770212771212772212773212774212775212776212777212778212779212780212781212782212783212784212785212786212787212788212789212790212791212792212793212794212795212796212797212798212799212800212801212802212803212804212805212806212807212808212809212810212811212812212813212814212815212816212817212818212819212820212821212822212823212824212825212826212827212828212829212830212831212832212833212834212835212836212837212838212839212840212841212842212843212844212845212846212847212848212849212850212851212852212853212854212855212856212857212858212859212860212861212862212863212864212865212866212867212868212869212870212871212872212873212874212875212876212877212878212879212880212881212882212883212884212885212886212887212888212889212890212891212892212893212894212895212896212897212898212899212900212901212902212903212904212905212906212907212908212909212910212911212912212913212914212915212916212917212918212919212920212921212922212923212924212925212926212927212928212929212930212931212932212933212934212935212936212937212938212939212940212941212942212943212944212945212946212947212948212949212950212951212952212953212954212955212956212957212958212959212960212961212962212963212964212965212966212967212968212969212970212971212972212973212974212975212976212977212978212979212980212981212982212983212984212985212986212987212988212989212990212991212992212993212994212995212996212997212998212999213000213001213002213003213004213005213006213007213008213009213010213011213012213013213014213015213016213017213018213019213020213021213022213023213024213025213026213027213028213029213030213031213032213033213034213035213036213037213038213039213040213041213042213043213044213045213046213047213048213049213050213051213052213053213054213055213056213057213058213059213060213061213062213063213064213065213066213067213068213069213070213071213072213073213074213075213076213077213078213079213080213081213082213083213084213085213086213087213088213089213090213091213092213093213094213095213096213097213098213099213100213101213102213103213104213105213106213107213108213109213110213111213112213113213114213115213116213117213118213119213120213121213122213123213124213125213126213127213128213129213130213131213132213133213134213135213136213137213138213139213140213141213142213143213144213145213146213147213148213149213150213151213152213153213154213155213156213157213158213159213160213161213162213163213164213165213166213167213168213169213170213171213172213173213174213175213176213177213178213179213180213181213182213183213184213185213186213187213188213189213190213191213192213193213194213195213196213197213198213199213200213201213202213203213204213205213206213207213208213209213210213211213212213213213214213215213216213217213218213219213220213221213222213223213224213225213226213227213228213229213230213231213232213233213234213235213236213237213238213239213240213241213242213243213244213245213246213247213248213249213250213251213252213253213254213255213256213257213258213259213260213261213262213263213264213265213266213267213268213269213270213271213272213273213274213275213276213277213278213279213280213281213282213283213284213285213286213287213288213289213290213291213292213293213294213295213296213297213298213299213300213301213302213303213304213305213306213307213308213309213310213311213312213313213314213315213316213317213318213319213320213321213322213323213324213325213326213327213328213329213330213331213332213333213334213335213336213337213338213339213340213341213342213343213344213345213346213347213348213349213350213351213352213353213354213355213356213357213358213359213360213361213362213363213364213365213366213367213368213369213370213371213372213373213374213375213376213377213378213379213380213381213382213383213384213385213386213387213388213389213390213391213392213393213394213395213396213397213398213399213400213401213402213403213404213405213406213407213408213409213410213411213412213413213414213415213416213417213418213419213420213421213422213423213424213425213426213427213428213429213430213431213432213433213434213435213436213437213438213439213440213441213442213443213444213445213446213447213448213449213450213451213452213453213454213455213456213457213458213459213460213461213462213463213464213465213466213467213468213469213470213471213472213473213474213475213476213477213478213479213480213481213482213483213484213485213486213487213488213489213490213491213492213493213494213495213496213497213498213499213500213501213502213503213504213505213506213507213508213509213510213511213512213513213514213515213516213517213518213519213520213521213522213523213524213525213526213527213528213529213530213531213532213533213534213535213536213537213538213539213540213541213542213543213544213545213546213547213548213549213550213551213552213553213554213555213556213557213558213559213560213561213562213563213564213565213566213567213568213569213570213571213572213573213574213575213576213577213578213579213580213581213582213583213584213585213586213587213588213589213590213591213592213593213594213595213596213597213598213599213600213601213602213603213604213605213606213607213608213609213610213611213612213613213614213615213616213617213618213619213620213621213622213623213624213625213626213627213628213629213630213631213632213633213634213635213636213637213638213639213640213641213642213643213644213645213646213647213648213649213650213651213652213653213654213655213656213657213658213659213660213661213662213663213664213665213666213667213668213669213670213671213672213673213674213675213676213677213678213679213680213681213682213683213684213685213686213687213688213689213690213691213692213693213694213695213696213697213698213699213700213701213702213703213704213705213706213707213708213709213710213711213712213713213714213715213716213717213718213719213720213721213722213723213724213725213726213727213728213729213730213731213732213733213734213735213736213737213738213739213740213741213742213743213744213745213746213747213748213749213750213751213752213753213754213755213756213757213758213759213760213761213762213763213764213765213766213767213768213769213770213771213772213773213774213775213776213777213778213779213780213781213782213783213784213785213786213787213788213789213790213791213792213793213794213795213796213797213798213799213800213801213802213803213804213805213806213807213808213809213810213811213812213813213814213815213816213817213818213819213820213821213822213823213824213825213826213827213828213829213830213831213832213833213834213835213836213837213838213839213840213841213842213843213844213845213846213847213848213849213850213851213852213853213854213855213856213857213858213859213860213861213862213863213864213865213866213867213868213869213870213871213872213873213874213875213876213877213878213879213880213881213882213883213884213885213886213887213888213889213890213891213892213893213894213895213896213897213898213899213900213901213902213903213904213905213906213907213908213909213910213911213912213913213914213915213916213917213918213919213920213921213922213923213924213925213926213927213928213929213930213931213932213933213934213935213936213937213938213939213940213941213942213943213944213945213946213947213948213949213950213951213952213953213954213955213956213957213958213959213960213961213962213963213964213965213966213967213968213969213970213971213972213973213974213975213976213977213978213979213980213981213982213983213984213985213986213987213988213989213990213991213992213993213994213995213996213997213998213999214000214001214002214003214004214005214006214007214008214009214010214011214012214013214014214015214016214017214018214019214020214021214022214023214024214025214026214027214028214029214030214031214032214033214034214035214036214037214038214039214040214041214042214043214044214045214046214047214048214049214050214051214052214053214054214055214056214057214058214059214060214061214062214063214064214065214066214067214068214069214070214071214072214073214074214075214076214077214078214079214080214081214082214083214084214085214086214087214088214089214090214091214092214093214094214095214096214097214098214099214100214101214102214103214104214105214106214107214108214109214110214111214112214113214114214115214116214117214118214119214120214121214122214123214124214125214126214127214128214129214130214131214132214133214134214135214136214137214138214139214140214141214142214143214144214145214146214147214148214149214150214151214152214153214154214155214156214157214158214159214160214161214162214163214164214165214166214167214168214169214170214171214172214173214174214175214176214177214178214179214180214181214182214183214184214185214186214187214188214189214190214191214192214193214194214195214196214197214198214199214200214201214202214203214204214205214206214207214208214209214210214211214212214213214214214215214216214217214218214219214220214221214222214223214224214225214226214227214228214229214230214231214232214233214234214235214236214237214238214239214240214241214242214243214244214245214246214247214248214249214250214251214252214253214254214255214256214257214258214259214260214261214262214263214264214265214266214267214268214269214270214271214272214273214274214275214276214277214278214279214280214281214282214283214284214285214286214287214288214289214290214291214292214293214294214295214296214297214298214299214300214301214302214303214304214305214306214307214308214309214310214311214312214313214314214315214316214317214318214319214320214321214322214323214324214325214326214327214328214329214330214331214332214333214334214335214336214337214338214339214340214341214342214343214344214345214346214347214348214349214350214351214352214353214354214355214356214357214358214359214360214361214362214363214364214365214366214367214368214369214370214371214372214373214374214375214376214377214378214379214380214381214382214383214384214385214386214387214388214389214390214391214392214393214394214395214396214397214398214399214400214401214402214403214404214405214406214407214408214409214410214411214412214413214414214415214416214417214418214419214420214421214422214423214424214425214426214427214428214429214430214431214432214433214434214435214436214437214438214439214440214441214442214443214444214445214446214447214448214449214450214451214452214453214454214455214456214457214458214459214460214461214462214463214464214465214466214467214468214469214470214471214472214473214474214475214476214477214478214479214480214481214482214483214484214485214486214487214488214489214490214491214492214493214494214495214496214497214498214499214500214501214502214503214504214505214506214507214508214509214510214511214512214513214514214515214516214517214518214519214520214521214522214523214524214525214526214527214528214529214530214531214532214533214534214535214536214537214538214539214540214541214542214543214544214545214546214547214548214549214550214551214552214553214554214555214556214557214558214559214560214561214562214563214564214565214566214567214568214569214570214571214572214573214574214575214576214577214578214579214580214581214582214583214584214585214586214587214588214589214590214591214592214593214594214595214596214597214598214599214600214601214602214603214604214605214606214607214608214609214610214611214612214613214614214615214616214617214618214619214620214621214622214623214624214625214626214627214628214629214630214631214632214633214634214635214636214637214638214639214640214641214642214643214644214645214646214647214648214649214650214651214652214653214654214655214656214657214658214659214660214661214662214663214664214665214666214667214668214669214670214671214672214673214674214675214676214677214678214679214680214681214682214683214684214685214686214687214688214689214690214691214692214693214694214695214696214697214698214699214700214701214702214703214704214705214706214707214708214709214710214711214712214713214714214715214716214717214718214719214720214721214722214723214724214725214726214727214728214729214730214731214732214733214734214735214736214737214738214739214740214741214742214743214744214745214746214747214748214749214750214751214752214753214754214755214756214757214758214759214760214761214762214763214764214765214766214767214768214769214770214771214772214773214774214775214776214777214778214779214780214781214782214783214784214785214786214787214788214789214790214791214792214793214794214795214796214797214798214799214800214801214802214803214804214805214806214807214808214809214810214811214812214813214814214815214816214817214818214819214820214821214822214823214824214825214826214827214828214829214830214831214832214833214834214835214836214837214838214839214840214841214842214843214844214845214846214847214848214849214850214851214852214853214854214855214856214857214858214859214860214861214862214863214864214865214866214867214868214869214870214871214872214873214874214875214876214877214878214879214880214881214882214883214884214885214886214887214888214889214890214891214892214893214894214895214896214897214898214899214900214901214902214903214904214905214906214907214908214909214910214911214912214913214914214915214916214917214918214919214920214921214922214923214924214925214926214927214928214929214930214931214932214933214934214935214936214937214938214939214940214941214942214943214944214945214946214947214948214949214950214951214952214953214954214955214956214957214958214959214960214961214962214963214964214965214966214967214968214969214970214971214972214973214974214975214976214977214978214979214980214981214982214983214984214985214986214987214988214989214990214991214992214993214994214995214996214997214998214999215000215001215002215003215004215005215006215007215008215009215010215011215012215013215014215015215016215017215018215019215020215021215022215023215024215025215026215027215028215029215030215031215032215033215034215035215036215037215038215039215040215041215042215043215044215045215046215047215048215049215050215051215052215053215054215055215056215057215058215059215060215061215062215063215064215065215066215067215068215069215070215071215072215073215074215075215076215077215078215079215080215081215082215083215084215085215086215087215088215089215090215091215092215093215094215095215096215097215098215099215100215101215102215103215104215105215106215107215108215109215110215111215112215113215114215115215116215117215118215119215120215121215122215123215124215125215126215127215128215129215130215131215132215133215134215135215136215137215138215139215140215141215142215143215144215145215146215147215148215149215150215151215152215153215154215155215156215157215158215159215160215161215162215163215164215165215166215167215168215169215170215171215172215173215174215175215176215177215178215179215180215181215182215183215184215185215186215187215188215189215190215191215192215193215194215195215196215197215198215199215200215201215202215203215204215205215206215207215208215209215210215211215212215213215214215215215216215217215218215219215220215221215222215223215224215225215226215227215228215229215230215231215232215233215234215235215236215237215238215239215240215241215242215243215244215245215246215247215248215249215250215251215252215253215254215255215256215257215258215259215260215261215262215263215264215265215266215267215268215269215270215271215272215273215274215275215276215277215278215279215280215281215282215283215284215285215286215287215288215289215290215291215292215293215294215295215296215297215298215299215300215301215302215303215304215305215306215307215308215309215310215311215312215313215314215315215316215317215318215319215320215321215322215323215324215325215326215327215328215329215330215331215332215333215334215335215336215337215338215339215340215341215342215343215344215345215346215347215348215349215350215351215352215353215354215355215356215357215358215359215360215361215362215363215364215365215366215367215368215369215370215371215372215373215374215375215376215377215378215379215380215381215382215383215384215385215386215387215388215389215390215391215392215393215394215395215396215397215398215399215400215401215402215403215404215405215406215407215408215409215410215411215412215413215414215415215416215417215418215419215420215421215422215423215424215425215426215427215428215429215430215431215432215433215434215435215436215437215438215439215440215441215442215443215444215445215446215447215448215449215450215451215452215453215454215455215456215457215458215459215460215461215462215463215464215465215466215467215468215469215470215471215472215473215474215475215476215477215478215479215480215481215482215483215484215485215486215487215488215489215490215491215492215493215494215495215496215497215498215499215500215501215502215503215504215505215506215507215508215509215510215511215512215513215514215515215516215517215518215519215520215521215522215523215524215525215526215527215528215529215530215531215532215533215534215535215536215537215538215539215540215541215542215543215544215545215546215547215548215549215550215551215552215553215554215555215556215557215558215559215560215561215562215563215564215565215566215567215568215569215570215571215572215573215574215575215576215577215578215579215580215581215582215583215584215585215586215587215588215589215590215591215592215593215594215595215596215597215598215599215600215601215602215603215604215605215606215607215608215609215610215611215612215613215614215615215616215617215618215619215620215621215622215623215624215625215626215627215628215629215630215631215632215633215634215635215636215637215638215639215640215641215642215643215644215645215646215647215648215649215650215651215652215653215654215655215656215657215658215659215660215661215662215663215664215665215666215667215668215669215670215671215672215673215674215675215676215677215678215679215680215681215682215683215684215685215686215687215688215689215690215691215692215693215694215695215696215697215698215699215700215701215702215703215704215705215706215707215708215709215710215711215712215713215714215715215716215717215718215719215720215721215722215723215724215725215726215727215728215729215730215731215732215733215734215735215736215737215738215739215740215741215742215743215744215745215746215747215748215749215750215751215752215753215754215755215756215757215758215759215760215761215762215763215764215765215766215767215768215769215770215771215772215773215774215775215776215777215778215779215780215781215782215783215784215785215786215787215788215789215790215791215792215793215794215795215796215797215798215799215800215801215802215803215804215805215806215807215808215809215810215811215812215813215814215815215816215817215818215819215820215821215822215823215824215825215826215827215828215829215830215831215832215833215834215835215836215837215838215839215840215841215842215843215844215845215846215847215848215849215850215851215852215853215854215855215856215857215858215859215860215861215862215863215864215865215866215867215868215869215870215871215872215873215874215875215876215877215878215879215880215881215882215883215884215885215886215887215888215889215890215891215892215893215894215895215896215897215898215899215900215901215902215903215904215905215906215907215908215909215910215911215912215913215914215915215916215917215918215919215920215921215922215923215924215925215926215927215928215929215930215931215932215933215934215935215936215937215938215939215940215941215942215943215944215945215946215947215948215949215950215951215952215953215954215955215956215957215958215959215960215961215962215963215964215965215966215967215968215969215970215971215972215973215974215975215976215977215978215979215980215981215982215983215984215985215986215987215988215989215990215991215992215993215994215995215996215997215998215999216000216001216002216003216004216005216006216007216008216009216010216011216012216013216014216015216016216017216018216019216020216021216022216023216024216025216026216027216028216029216030216031216032216033216034216035216036216037216038216039216040216041216042216043216044216045216046216047216048216049216050216051216052216053216054216055216056216057216058216059216060216061216062216063216064216065216066216067216068216069216070216071216072216073216074216075216076216077216078216079216080216081216082216083216084216085216086216087216088216089216090216091216092216093216094216095216096216097216098216099216100216101216102216103216104216105216106216107216108216109216110216111216112216113216114216115216116216117216118216119216120216121216122216123216124216125216126216127216128216129216130216131216132216133216134216135216136216137216138216139216140216141216142216143216144216145216146216147216148216149216150216151216152216153216154216155216156216157216158216159216160216161216162216163216164216165216166216167216168216169216170216171216172216173216174216175216176216177216178216179216180216181216182216183216184216185216186216187216188216189216190216191216192216193216194216195216196216197216198216199216200216201216202216203216204216205216206216207216208216209216210216211216212216213216214216215216216216217216218216219216220216221216222216223216224216225216226216227216228216229216230216231216232216233216234216235216236216237216238216239216240216241216242216243216244216245216246216247216248216249216250216251216252216253216254216255216256216257216258216259216260216261216262216263216264216265216266216267216268216269216270216271216272216273216274216275216276216277216278216279216280216281216282216283216284216285216286216287216288216289216290216291216292216293216294216295216296216297216298216299216300216301216302216303216304216305216306216307216308216309216310216311216312216313216314216315216316216317216318216319216320216321216322216323216324216325216326216327216328216329216330216331216332216333216334216335216336216337216338216339216340216341216342216343216344216345216346216347216348216349216350216351216352216353216354216355216356216357216358216359216360216361216362216363216364216365216366216367216368216369216370216371216372216373216374216375216376216377216378216379216380216381216382216383216384216385216386216387216388216389216390216391216392216393216394216395216396216397216398216399216400216401216402216403216404216405216406216407216408216409216410216411216412216413216414216415216416216417216418216419216420216421216422216423216424216425216426216427216428216429216430216431216432216433216434216435216436216437216438216439216440216441216442216443216444216445216446216447216448216449216450216451216452216453216454216455216456216457216458216459216460216461216462216463216464216465216466216467216468216469216470216471216472216473216474216475216476216477216478216479216480216481216482216483216484216485216486216487216488216489216490216491216492216493216494216495216496216497216498216499216500216501216502216503216504216505216506216507216508216509216510216511216512216513216514216515216516216517216518216519216520216521216522216523216524216525216526216527216528216529216530216531216532216533216534216535216536216537216538216539216540216541216542216543216544216545216546216547216548216549216550216551216552216553216554216555216556216557216558216559216560216561216562216563216564216565216566216567216568216569216570216571216572216573216574216575216576216577216578216579216580216581216582216583216584216585216586216587216588216589216590216591216592216593216594216595216596216597216598216599216600216601216602216603216604216605216606216607216608216609216610216611216612216613216614216615216616216617216618216619216620216621216622216623216624216625216626216627216628216629216630216631216632216633216634216635216636216637216638216639216640216641216642216643216644216645216646216647216648216649216650216651216652216653216654216655216656216657216658216659216660216661216662216663216664216665216666216667216668216669216670216671216672216673216674216675216676216677216678216679216680216681216682216683216684216685216686216687216688216689216690216691216692216693216694216695216696216697216698216699216700216701216702216703216704216705216706216707216708216709216710216711216712216713216714216715216716216717216718216719216720216721216722216723216724216725216726216727216728216729216730216731216732216733216734216735216736216737216738216739216740216741216742216743216744216745216746216747216748216749216750216751216752216753216754216755216756216757216758216759216760216761216762216763216764216765216766216767216768216769216770216771216772216773216774216775216776216777216778216779216780216781216782216783216784216785216786216787216788216789216790216791216792216793216794216795216796216797216798216799216800216801216802216803216804216805216806216807216808216809216810216811216812216813216814216815216816216817216818216819216820216821216822216823216824216825216826216827216828216829216830216831216832216833216834216835216836216837216838216839216840216841216842216843216844216845216846216847216848216849216850216851216852216853216854216855216856216857216858216859216860216861216862216863216864216865216866216867216868216869216870216871216872216873216874216875216876216877216878216879216880216881216882216883216884216885216886216887216888216889216890216891216892216893216894216895216896216897216898216899216900216901216902216903216904216905216906216907216908216909216910216911216912216913216914216915216916216917216918216919216920216921216922216923216924216925216926216927216928216929216930216931216932216933216934216935216936216937216938216939216940216941216942216943216944216945216946216947216948216949216950216951216952216953216954216955216956216957216958216959216960216961216962216963216964216965216966216967216968216969216970216971216972216973216974216975216976216977216978216979216980216981216982216983216984216985216986216987216988216989216990216991216992216993216994216995216996216997216998216999217000217001217002217003217004217005217006217007217008217009217010217011217012217013217014217015217016217017217018217019217020217021217022217023217024217025217026217027217028217029217030217031217032217033217034217035217036217037217038217039217040217041217042217043217044217045217046217047217048217049217050217051217052217053217054217055217056217057217058217059217060217061217062217063217064217065217066217067217068217069217070217071217072217073217074217075217076217077217078217079217080217081217082217083217084217085217086217087217088217089217090217091217092217093217094217095217096217097217098217099217100217101217102217103217104217105217106217107217108217109217110217111217112217113217114217115217116217117217118217119217120217121217122217123217124217125217126217127217128217129217130217131217132217133217134217135217136217137217138217139217140217141217142217143217144217145217146217147217148217149217150217151217152217153217154217155217156217157217158217159217160217161217162217163217164217165217166217167217168217169217170217171217172217173217174217175217176217177217178217179217180217181217182217183217184217185217186217187217188217189217190217191217192217193217194217195217196217197217198217199217200217201217202217203217204217205217206217207217208217209217210217211217212217213217214217215217216217217217218217219217220217221217222217223217224217225217226217227217228217229217230217231217232217233217234217235217236217237217238217239217240217241217242217243217244217245217246217247217248217249217250217251217252217253217254217255217256217257217258217259217260217261217262217263217264217265217266217267217268217269217270217271217272217273217274217275217276217277217278217279217280217281217282217283217284217285217286217287217288217289217290217291217292217293217294217295217296217297217298217299217300217301217302217303217304217305217306217307217308217309217310217311217312217313217314217315217316217317217318217319217320217321217322217323217324217325217326217327217328217329217330217331217332217333217334217335217336217337217338217339217340217341217342217343217344217345217346217347217348217349217350217351217352217353217354217355217356217357217358217359217360217361217362217363217364217365217366217367217368217369217370217371217372217373217374217375217376217377217378217379217380217381217382217383217384217385217386217387217388217389217390217391217392217393217394217395217396217397217398217399217400217401217402217403217404217405217406217407217408217409217410217411217412217413217414217415217416217417217418217419217420217421217422217423217424217425217426217427217428217429217430217431217432217433217434217435217436217437217438217439217440217441217442217443217444217445217446217447217448217449217450217451217452217453217454217455217456217457217458217459217460217461217462217463217464217465217466217467217468217469217470217471217472217473217474217475217476217477217478217479217480217481217482217483217484217485217486217487217488217489217490217491217492217493217494217495217496217497217498217499217500217501217502217503217504217505217506217507217508217509217510217511217512217513217514217515217516217517217518217519217520217521217522217523217524217525217526217527217528217529217530217531217532217533217534217535217536217537217538217539217540217541217542217543217544217545217546217547217548217549217550217551217552217553217554217555217556217557217558217559217560217561217562217563217564217565217566217567217568217569217570217571217572217573217574217575217576217577217578217579217580217581217582217583217584217585217586217587217588217589217590217591217592217593217594217595217596217597217598217599217600217601217602217603217604217605217606217607217608217609217610217611217612217613217614217615217616217617217618217619217620217621217622217623217624217625217626217627217628217629217630217631217632217633217634217635217636217637217638217639217640217641217642217643217644217645217646217647217648217649217650217651217652217653217654217655217656217657217658217659217660217661217662217663217664217665217666217667217668217669217670217671217672217673217674217675217676217677217678217679217680217681217682217683217684217685217686217687217688217689217690217691217692217693217694217695217696217697217698217699217700217701217702217703217704217705217706217707217708217709217710217711217712217713217714217715217716217717217718217719217720217721217722217723217724217725217726217727217728217729217730217731217732217733217734217735217736217737217738217739217740217741217742217743217744217745217746217747217748217749217750217751217752217753217754217755217756217757217758217759217760217761217762217763217764217765217766217767217768217769217770217771217772217773217774217775217776217777217778217779217780217781217782217783217784217785217786217787217788217789217790217791217792217793217794217795217796217797217798217799217800217801217802217803217804217805217806217807217808217809217810217811217812217813217814217815217816217817217818217819217820217821217822217823217824217825217826217827217828217829217830217831217832217833217834217835217836217837217838217839217840217841217842217843217844217845217846217847217848217849217850217851217852217853217854217855217856217857217858217859217860217861217862217863217864217865217866217867217868217869217870217871217872217873217874217875217876217877217878217879217880217881217882217883217884217885217886217887217888217889217890217891217892217893217894217895217896217897217898217899217900217901217902217903217904217905217906217907217908217909217910217911217912217913217914217915217916217917217918217919217920217921217922217923217924217925217926217927217928217929217930217931217932217933217934217935217936217937217938217939217940217941217942217943217944217945217946217947217948217949217950217951217952217953217954217955217956217957217958217959217960217961217962217963217964217965217966217967217968217969217970217971217972217973217974217975217976217977217978217979217980217981217982217983217984217985217986217987217988217989217990217991217992217993217994217995217996217997217998217999218000218001218002218003218004218005218006218007218008218009218010218011218012218013218014218015218016218017218018218019218020218021218022218023218024218025218026218027218028218029218030218031218032218033218034218035218036218037218038218039218040218041218042218043218044218045218046218047218048218049218050218051218052218053218054218055218056218057218058218059218060218061218062218063218064218065218066218067218068218069218070218071218072218073218074218075218076218077218078218079218080218081218082218083218084218085218086218087218088218089218090218091218092218093218094218095218096218097218098218099218100218101218102218103218104218105218106218107218108218109218110218111218112218113218114218115218116218117218118218119218120218121218122218123218124218125218126218127218128218129218130218131218132218133218134218135218136218137218138218139218140218141218142218143218144218145218146218147218148218149218150218151218152218153218154218155218156218157218158218159218160218161218162218163218164218165218166218167218168218169218170218171218172218173218174218175218176218177218178218179218180218181218182218183218184218185218186218187218188218189218190218191218192218193218194218195218196218197218198218199218200218201218202218203218204218205218206218207218208218209218210218211218212218213218214218215218216218217218218218219218220218221218222218223218224218225218226218227218228218229218230218231218232218233218234218235218236218237218238218239218240218241218242218243218244218245218246218247218248218249218250218251218252218253218254218255218256218257218258218259218260218261218262218263218264218265218266218267218268218269218270218271218272218273218274218275218276218277218278218279218280218281218282218283218284218285218286218287218288218289218290218291218292218293218294218295218296218297218298218299218300218301218302218303218304218305218306218307218308218309218310218311218312218313218314218315218316218317218318218319218320218321218322218323218324218325218326218327218328218329218330218331218332218333218334218335218336218337218338218339218340218341218342218343218344218345218346218347218348218349218350218351218352218353218354218355218356218357218358218359218360218361218362218363218364218365218366218367218368218369218370218371218372218373218374218375218376218377218378218379218380218381218382218383218384218385218386218387218388218389218390218391218392218393218394218395218396218397218398218399218400218401218402218403218404218405218406218407218408218409218410218411218412218413218414218415218416218417218418218419218420218421218422218423218424218425218426218427218428218429218430218431218432218433218434218435218436218437218438218439218440218441218442218443218444218445218446218447218448218449218450218451218452218453218454218455218456218457218458218459218460218461218462218463218464218465218466218467218468218469218470218471218472218473218474218475218476218477218478218479218480218481218482218483218484218485218486218487218488218489218490218491218492218493218494218495218496218497218498218499218500218501218502218503218504218505218506218507218508218509218510218511218512218513218514218515218516218517218518218519218520218521218522218523218524218525218526218527218528218529218530218531218532218533218534218535218536218537218538218539218540218541218542218543218544218545218546218547218548218549218550218551218552218553218554218555218556218557218558218559218560218561218562218563218564218565218566218567218568218569218570218571218572218573218574218575218576218577218578218579218580218581218582218583218584218585218586218587218588218589218590218591218592218593218594218595218596218597218598218599218600218601218602
  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 j;
  100. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  101. for (j = a->used; j < size; j++) {
  102. r[j] = 0;
  103. }
  104. #elif DIGIT_BIT > 32
  105. int i;
  106. int j = 0;
  107. word32 s = 0;
  108. r[0] = 0;
  109. for (i = 0; i < a->used && j < size; i++) {
  110. r[j] |= ((sp_digit)a->dp[i] << s);
  111. r[j] &= 0xffffffff;
  112. s = 32U - s;
  113. if (j + 1 >= size) {
  114. break;
  115. }
  116. /* lint allow cast of mismatch word32 and mp_digit */
  117. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  118. while ((s + 32U) <= (word32)DIGIT_BIT) {
  119. s += 32U;
  120. r[j] &= 0xffffffff;
  121. if (j + 1 >= size) {
  122. break;
  123. }
  124. if (s < (word32)DIGIT_BIT) {
  125. /* lint allow cast of mismatch word32 and mp_digit */
  126. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  127. }
  128. else {
  129. r[++j] = (sp_digit)0;
  130. }
  131. }
  132. s = (word32)DIGIT_BIT - s;
  133. }
  134. for (j++; j < size; j++) {
  135. r[j] = 0;
  136. }
  137. #else
  138. int i;
  139. int j = 0;
  140. int s = 0;
  141. r[0] = 0;
  142. for (i = 0; i < a->used && j < size; i++) {
  143. r[j] |= ((sp_digit)a->dp[i]) << s;
  144. if (s + DIGIT_BIT >= 32) {
  145. r[j] &= 0xffffffff;
  146. if (j + 1 >= size) {
  147. break;
  148. }
  149. s = 32 - s;
  150. if (s == DIGIT_BIT) {
  151. r[++j] = 0;
  152. s = 0;
  153. }
  154. else {
  155. r[++j] = a->dp[i] >> s;
  156. s = DIGIT_BIT - s;
  157. }
  158. }
  159. else {
  160. s += DIGIT_BIT;
  161. }
  162. }
  163. for (j++; j < size; j++) {
  164. r[j] = 0;
  165. }
  166. #endif
  167. }
  168. /* Write r as big endian to byte array.
  169. * Fixed length number of bytes written: 256
  170. *
  171. * r A single precision integer.
  172. * a Byte array.
  173. */
  174. static void sp_2048_to_bin_64(sp_digit* r, byte* a)
  175. {
  176. int i;
  177. int j = 0;
  178. for (i = 63; i >= 0; i--) {
  179. a[j++] = r[i] >> 24;
  180. a[j++] = r[i] >> 16;
  181. a[j++] = r[i] >> 8;
  182. a[j++] = r[i] >> 0;
  183. }
  184. }
  185. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  186. /* Normalize the values in each word to 32.
  187. *
  188. * a Array of sp_digit to normalize.
  189. */
  190. #define sp_2048_norm_64(a)
  191. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  192. /* Normalize the values in each word to 32.
  193. *
  194. * a Array of sp_digit to normalize.
  195. */
  196. #define sp_2048_norm_64(a)
  197. #ifndef WOLFSSL_SP_SMALL
  198. #ifndef WOLFSSL_SP_LARGE_CODE
  199. /* Multiply a and b into r. (r = a * b)
  200. *
  201. * r A single precision integer.
  202. * a A single precision integer.
  203. * b A single precision integer.
  204. */
  205. SP_NOINLINE static void sp_2048_mul_8(sp_digit* r, const sp_digit* a,
  206. const sp_digit* b)
  207. {
  208. sp_digit t[8 * 2];
  209. sp_digit* tmp = t;
  210. __asm__ __volatile__ (
  211. "movs r3, #0\n\t"
  212. "movs r4, #0\n\t"
  213. "mov r8, r3\n\t"
  214. "mov r11, %[tmp]\n\t"
  215. "mov r9, %[a]\n\t"
  216. "mov r10, %[b]\n\t"
  217. "movs r6, #32\n\t"
  218. "add r6, r6, r9\n\t"
  219. "mov r12, r6\n\t"
  220. "\n"
  221. "L_sp_2048_mul_8_words_%=:\n\t"
  222. "movs %[tmp], #0\n\t"
  223. "movs r5, #0\n\t"
  224. "movs r6, #28\n\t"
  225. "mov %[a], r8\n\t"
  226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  227. "subs %[a], %[a], r6\n\t"
  228. #else
  229. "sub %[a], %[a], r6\n\t"
  230. #endif
  231. #ifdef WOLFSSL_KEIL
  232. "sbcs r6, r6, r6\n\t"
  233. #elif defined(__clang__)
  234. "sbcs r6, r6\n\t"
  235. #else
  236. "sbc r6, r6\n\t"
  237. #endif
  238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  239. "mvns r6, r6\n\t"
  240. #else
  241. "mvn r6, r6\n\t"
  242. #endif
  243. #ifdef WOLFSSL_KEIL
  244. "ands %[a], %[a], r6\n\t"
  245. #elif defined(__clang__)
  246. "ands %[a], r6\n\t"
  247. #else
  248. "and %[a], r6\n\t"
  249. #endif
  250. "mov %[b], r8\n\t"
  251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  252. "subs %[b], %[b], %[a]\n\t"
  253. #else
  254. "sub %[b], %[b], %[a]\n\t"
  255. #endif
  256. "add %[a], %[a], r9\n\t"
  257. "add %[b], %[b], r10\n\t"
  258. "\n"
  259. "L_sp_2048_mul_8_mul_%=:\n\t"
  260. "# Multiply Start\n\t"
  261. "ldrh r6, [%[a]]\n\t"
  262. "ldrh r7, [%[b]]\n\t"
  263. #ifdef WOLFSSL_KEIL
  264. "muls r7, r6, r7\n\t"
  265. #elif defined(__clang__)
  266. "muls r7, r6\n\t"
  267. #else
  268. "mul r7, r6\n\t"
  269. #endif
  270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  271. "adds r3, r3, r7\n\t"
  272. #else
  273. "add r3, r3, r7\n\t"
  274. #endif
  275. #ifdef WOLFSSL_KEIL
  276. "adcs r4, r4, %[tmp]\n\t"
  277. #elif defined(__clang__)
  278. "adcs r4, %[tmp]\n\t"
  279. #else
  280. "adc r4, %[tmp]\n\t"
  281. #endif
  282. #ifdef WOLFSSL_KEIL
  283. "adcs r5, r5, %[tmp]\n\t"
  284. #elif defined(__clang__)
  285. "adcs r5, %[tmp]\n\t"
  286. #else
  287. "adc r5, %[tmp]\n\t"
  288. #endif
  289. "ldr r7, [%[b]]\n\t"
  290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  291. "lsrs r7, r7, #16\n\t"
  292. #else
  293. "lsr r7, r7, #16\n\t"
  294. #endif
  295. #ifdef WOLFSSL_KEIL
  296. "muls r6, r7, r6\n\t"
  297. #elif defined(__clang__)
  298. "muls r6, r7\n\t"
  299. #else
  300. "mul r6, r7\n\t"
  301. #endif
  302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  303. "lsrs r7, r6, #16\n\t"
  304. #else
  305. "lsr r7, r6, #16\n\t"
  306. #endif
  307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  308. "lsls r6, r6, #16\n\t"
  309. #else
  310. "lsl r6, r6, #16\n\t"
  311. #endif
  312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  313. "adds r3, r3, r6\n\t"
  314. #else
  315. "add r3, r3, r6\n\t"
  316. #endif
  317. #ifdef WOLFSSL_KEIL
  318. "adcs r4, r4, r7\n\t"
  319. #elif defined(__clang__)
  320. "adcs r4, r7\n\t"
  321. #else
  322. "adc r4, r7\n\t"
  323. #endif
  324. #ifdef WOLFSSL_KEIL
  325. "adcs r5, r5, %[tmp]\n\t"
  326. #elif defined(__clang__)
  327. "adcs r5, %[tmp]\n\t"
  328. #else
  329. "adc r5, %[tmp]\n\t"
  330. #endif
  331. "ldr r6, [%[a]]\n\t"
  332. "ldr r7, [%[b]]\n\t"
  333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  334. "lsrs r6, r6, #16\n\t"
  335. #else
  336. "lsr r6, r6, #16\n\t"
  337. #endif
  338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  339. "lsrs r7, r7, #16\n\t"
  340. #else
  341. "lsr r7, r7, #16\n\t"
  342. #endif
  343. #ifdef WOLFSSL_KEIL
  344. "muls r7, r6, r7\n\t"
  345. #elif defined(__clang__)
  346. "muls r7, r6\n\t"
  347. #else
  348. "mul r7, r6\n\t"
  349. #endif
  350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  351. "adds r4, r4, r7\n\t"
  352. #else
  353. "add r4, r4, r7\n\t"
  354. #endif
  355. #ifdef WOLFSSL_KEIL
  356. "adcs r5, r5, %[tmp]\n\t"
  357. #elif defined(__clang__)
  358. "adcs r5, %[tmp]\n\t"
  359. #else
  360. "adc r5, %[tmp]\n\t"
  361. #endif
  362. "ldrh r7, [%[b]]\n\t"
  363. #ifdef WOLFSSL_KEIL
  364. "muls r6, r7, r6\n\t"
  365. #elif defined(__clang__)
  366. "muls r6, r7\n\t"
  367. #else
  368. "mul r6, r7\n\t"
  369. #endif
  370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  371. "lsrs r7, r6, #16\n\t"
  372. #else
  373. "lsr r7, r6, #16\n\t"
  374. #endif
  375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  376. "lsls r6, r6, #16\n\t"
  377. #else
  378. "lsl r6, r6, #16\n\t"
  379. #endif
  380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  381. "adds r3, r3, r6\n\t"
  382. #else
  383. "add r3, r3, r6\n\t"
  384. #endif
  385. #ifdef WOLFSSL_KEIL
  386. "adcs r4, r4, r7\n\t"
  387. #elif defined(__clang__)
  388. "adcs r4, r7\n\t"
  389. #else
  390. "adc r4, r7\n\t"
  391. #endif
  392. #ifdef WOLFSSL_KEIL
  393. "adcs r5, r5, %[tmp]\n\t"
  394. #elif defined(__clang__)
  395. "adcs r5, %[tmp]\n\t"
  396. #else
  397. "adc r5, %[tmp]\n\t"
  398. #endif
  399. "# Multiply Done\n\t"
  400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  401. "adds %[a], %[a], #4\n\t"
  402. #else
  403. "add %[a], %[a], #4\n\t"
  404. #endif
  405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  406. "subs %[b], %[b], #4\n\t"
  407. #else
  408. "sub %[b], %[b], #4\n\t"
  409. #endif
  410. "cmp %[a], r12\n\t"
  411. "beq L_sp_2048_mul_8_done_mul_%=\n\t"
  412. "mov r6, r8\n\t"
  413. "add r6, r6, r9\n\t"
  414. "cmp %[a], r6\n\t"
  415. "ble L_sp_2048_mul_8_mul_%=\n\t"
  416. "\n"
  417. "L_sp_2048_mul_8_done_mul_%=:\n\t"
  418. "mov %[tmp], r11\n\t"
  419. "mov r7, r8\n\t"
  420. "str r3, [%[tmp], r7]\n\t"
  421. "movs r3, r4\n\t"
  422. "movs r4, r5\n\t"
  423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  424. "adds r7, r7, #4\n\t"
  425. #else
  426. "add r7, r7, #4\n\t"
  427. #endif
  428. "mov r8, r7\n\t"
  429. "movs r6, #56\n\t"
  430. "cmp r7, r6\n\t"
  431. "ble L_sp_2048_mul_8_words_%=\n\t"
  432. "str r3, [%[tmp], r7]\n\t"
  433. "mov %[a], r9\n\t"
  434. "mov %[b], r10\n\t"
  435. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  436. :
  437. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  438. );
  439. XMEMCPY(r, t, sizeof(t));
  440. }
  441. #else
  442. /* Multiply a and b into r. (r = a * b)
  443. *
  444. * r A single precision integer.
  445. * a A single precision integer.
  446. * b A single precision integer.
  447. */
  448. SP_NOINLINE static void sp_2048_mul_8(sp_digit* r, const sp_digit* a,
  449. const sp_digit* b)
  450. {
  451. __asm__ __volatile__ (
  452. "sub sp, sp, #32\n\t"
  453. "mov r8, %[r]\n\t"
  454. "mov r9, %[a]\n\t"
  455. "mov r10, %[b]\n\t"
  456. "movs %[r], #0\n\t"
  457. "# A[0] * B[0]\n\t"
  458. "ldr %[a], [%[a]]\n\t"
  459. "ldr %[b], [%[b]]\n\t"
  460. "uxth r6, %[a]\n\t"
  461. "uxth r3, %[b]\n\t"
  462. #ifdef WOLFSSL_KEIL
  463. "muls r3, r6, r3\n\t"
  464. #elif defined(__clang__)
  465. "muls r3, r6\n\t"
  466. #else
  467. "mul r3, r6\n\t"
  468. #endif
  469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  470. "lsrs r7, %[b], #16\n\t"
  471. #else
  472. "lsr r7, %[b], #16\n\t"
  473. #endif
  474. #ifdef WOLFSSL_KEIL
  475. "muls r6, r7, r6\n\t"
  476. #elif defined(__clang__)
  477. "muls r6, r7\n\t"
  478. #else
  479. "mul r6, r7\n\t"
  480. #endif
  481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  482. "lsrs r4, r6, #16\n\t"
  483. #else
  484. "lsr r4, r6, #16\n\t"
  485. #endif
  486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  487. "lsls r6, r6, #16\n\t"
  488. #else
  489. "lsl r6, r6, #16\n\t"
  490. #endif
  491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  492. "adds r3, r3, r6\n\t"
  493. #else
  494. "add r3, r3, r6\n\t"
  495. #endif
  496. #ifdef WOLFSSL_KEIL
  497. "adcs r4, r4, %[r]\n\t"
  498. #elif defined(__clang__)
  499. "adcs r4, %[r]\n\t"
  500. #else
  501. "adc r4, %[r]\n\t"
  502. #endif
  503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  504. "lsrs r6, %[a], #16\n\t"
  505. #else
  506. "lsr r6, %[a], #16\n\t"
  507. #endif
  508. #ifdef WOLFSSL_KEIL
  509. "muls r7, r6, r7\n\t"
  510. #elif defined(__clang__)
  511. "muls r7, r6\n\t"
  512. #else
  513. "mul r7, r6\n\t"
  514. #endif
  515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  516. "adds r4, r4, r7\n\t"
  517. #else
  518. "add r4, r4, r7\n\t"
  519. #endif
  520. "uxth r7, %[b]\n\t"
  521. #ifdef WOLFSSL_KEIL
  522. "muls r6, r7, r6\n\t"
  523. #elif defined(__clang__)
  524. "muls r6, r7\n\t"
  525. #else
  526. "mul r6, r7\n\t"
  527. #endif
  528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  529. "lsrs r7, r6, #16\n\t"
  530. #else
  531. "lsr r7, r6, #16\n\t"
  532. #endif
  533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  534. "lsls r6, r6, #16\n\t"
  535. #else
  536. "lsl r6, r6, #16\n\t"
  537. #endif
  538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  539. "adds r3, r3, r6\n\t"
  540. #else
  541. "add r3, r3, r6\n\t"
  542. #endif
  543. #ifdef WOLFSSL_KEIL
  544. "adcs r4, r4, r7\n\t"
  545. #elif defined(__clang__)
  546. "adcs r4, r7\n\t"
  547. #else
  548. "adc r4, r7\n\t"
  549. #endif
  550. "movs r5, #0\n\t"
  551. "str r3, [sp]\n\t"
  552. "# A[0] * B[1]\n\t"
  553. "movs r3, #0\n\t"
  554. "mov %[a], r9\n\t"
  555. "mov %[b], r10\n\t"
  556. "ldr %[a], [%[a]]\n\t"
  557. "ldr %[b], [%[b], #4]\n\t"
  558. "uxth r6, %[a]\n\t"
  559. "uxth r7, %[b]\n\t"
  560. #ifdef WOLFSSL_KEIL
  561. "muls r7, r6, r7\n\t"
  562. #elif defined(__clang__)
  563. "muls r7, r6\n\t"
  564. #else
  565. "mul r7, r6\n\t"
  566. #endif
  567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  568. "adds r4, r4, r7\n\t"
  569. #else
  570. "add r4, r4, r7\n\t"
  571. #endif
  572. #ifdef WOLFSSL_KEIL
  573. "adcs r5, r5, %[r]\n\t"
  574. #elif defined(__clang__)
  575. "adcs r5, %[r]\n\t"
  576. #else
  577. "adc r5, %[r]\n\t"
  578. #endif
  579. #ifdef WOLFSSL_KEIL
  580. "adcs r3, r3, %[r]\n\t"
  581. #elif defined(__clang__)
  582. "adcs r3, %[r]\n\t"
  583. #else
  584. "adc r3, %[r]\n\t"
  585. #endif
  586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  587. "lsrs r7, %[b], #16\n\t"
  588. #else
  589. "lsr r7, %[b], #16\n\t"
  590. #endif
  591. #ifdef WOLFSSL_KEIL
  592. "muls r6, r7, r6\n\t"
  593. #elif defined(__clang__)
  594. "muls r6, r7\n\t"
  595. #else
  596. "mul r6, r7\n\t"
  597. #endif
  598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  599. "lsrs r7, r6, #16\n\t"
  600. #else
  601. "lsr r7, r6, #16\n\t"
  602. #endif
  603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  604. "lsls r6, r6, #16\n\t"
  605. #else
  606. "lsl r6, r6, #16\n\t"
  607. #endif
  608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  609. "adds r4, r4, r6\n\t"
  610. #else
  611. "add r4, r4, r6\n\t"
  612. #endif
  613. #ifdef WOLFSSL_KEIL
  614. "adcs r5, r5, r7\n\t"
  615. #elif defined(__clang__)
  616. "adcs r5, r7\n\t"
  617. #else
  618. "adc r5, r7\n\t"
  619. #endif
  620. #ifdef WOLFSSL_KEIL
  621. "adcs r3, r3, %[r]\n\t"
  622. #elif defined(__clang__)
  623. "adcs r3, %[r]\n\t"
  624. #else
  625. "adc r3, %[r]\n\t"
  626. #endif
  627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  628. "lsrs r6, %[a], #16\n\t"
  629. #else
  630. "lsr r6, %[a], #16\n\t"
  631. #endif
  632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  633. "lsrs r7, %[b], #16\n\t"
  634. #else
  635. "lsr r7, %[b], #16\n\t"
  636. #endif
  637. #ifdef WOLFSSL_KEIL
  638. "muls r7, r6, r7\n\t"
  639. #elif defined(__clang__)
  640. "muls r7, r6\n\t"
  641. #else
  642. "mul r7, r6\n\t"
  643. #endif
  644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  645. "adds r5, r5, r7\n\t"
  646. #else
  647. "add r5, r5, r7\n\t"
  648. #endif
  649. #ifdef WOLFSSL_KEIL
  650. "adcs r3, r3, %[r]\n\t"
  651. #elif defined(__clang__)
  652. "adcs r3, %[r]\n\t"
  653. #else
  654. "adc r3, %[r]\n\t"
  655. #endif
  656. "uxth r7, %[b]\n\t"
  657. #ifdef WOLFSSL_KEIL
  658. "muls r6, r7, r6\n\t"
  659. #elif defined(__clang__)
  660. "muls r6, r7\n\t"
  661. #else
  662. "mul r6, r7\n\t"
  663. #endif
  664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  665. "lsrs r7, r6, #16\n\t"
  666. #else
  667. "lsr r7, r6, #16\n\t"
  668. #endif
  669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  670. "lsls r6, r6, #16\n\t"
  671. #else
  672. "lsl r6, r6, #16\n\t"
  673. #endif
  674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  675. "adds r4, r4, r6\n\t"
  676. #else
  677. "add r4, r4, r6\n\t"
  678. #endif
  679. #ifdef WOLFSSL_KEIL
  680. "adcs r5, r5, r7\n\t"
  681. #elif defined(__clang__)
  682. "adcs r5, r7\n\t"
  683. #else
  684. "adc r5, r7\n\t"
  685. #endif
  686. #ifdef WOLFSSL_KEIL
  687. "adcs r3, r3, %[r]\n\t"
  688. #elif defined(__clang__)
  689. "adcs r3, %[r]\n\t"
  690. #else
  691. "adc r3, %[r]\n\t"
  692. #endif
  693. "# A[1] * B[0]\n\t"
  694. "mov %[a], r9\n\t"
  695. "mov %[b], r10\n\t"
  696. "ldr %[a], [%[a], #4]\n\t"
  697. "ldr %[b], [%[b]]\n\t"
  698. "uxth r6, %[a]\n\t"
  699. "uxth r7, %[b]\n\t"
  700. #ifdef WOLFSSL_KEIL
  701. "muls r7, r6, r7\n\t"
  702. #elif defined(__clang__)
  703. "muls r7, r6\n\t"
  704. #else
  705. "mul r7, r6\n\t"
  706. #endif
  707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  708. "adds r4, r4, r7\n\t"
  709. #else
  710. "add r4, r4, r7\n\t"
  711. #endif
  712. #ifdef WOLFSSL_KEIL
  713. "adcs r5, r5, %[r]\n\t"
  714. #elif defined(__clang__)
  715. "adcs r5, %[r]\n\t"
  716. #else
  717. "adc r5, %[r]\n\t"
  718. #endif
  719. #ifdef WOLFSSL_KEIL
  720. "adcs r3, r3, %[r]\n\t"
  721. #elif defined(__clang__)
  722. "adcs r3, %[r]\n\t"
  723. #else
  724. "adc r3, %[r]\n\t"
  725. #endif
  726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  727. "lsrs r7, %[b], #16\n\t"
  728. #else
  729. "lsr r7, %[b], #16\n\t"
  730. #endif
  731. #ifdef WOLFSSL_KEIL
  732. "muls r6, r7, r6\n\t"
  733. #elif defined(__clang__)
  734. "muls r6, r7\n\t"
  735. #else
  736. "mul r6, r7\n\t"
  737. #endif
  738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  739. "lsrs r7, r6, #16\n\t"
  740. #else
  741. "lsr r7, r6, #16\n\t"
  742. #endif
  743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  744. "lsls r6, r6, #16\n\t"
  745. #else
  746. "lsl r6, r6, #16\n\t"
  747. #endif
  748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  749. "adds r4, r4, r6\n\t"
  750. #else
  751. "add r4, r4, r6\n\t"
  752. #endif
  753. #ifdef WOLFSSL_KEIL
  754. "adcs r5, r5, r7\n\t"
  755. #elif defined(__clang__)
  756. "adcs r5, r7\n\t"
  757. #else
  758. "adc r5, r7\n\t"
  759. #endif
  760. #ifdef WOLFSSL_KEIL
  761. "adcs r3, r3, %[r]\n\t"
  762. #elif defined(__clang__)
  763. "adcs r3, %[r]\n\t"
  764. #else
  765. "adc r3, %[r]\n\t"
  766. #endif
  767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  768. "lsrs r6, %[a], #16\n\t"
  769. #else
  770. "lsr r6, %[a], #16\n\t"
  771. #endif
  772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  773. "lsrs r7, %[b], #16\n\t"
  774. #else
  775. "lsr r7, %[b], #16\n\t"
  776. #endif
  777. #ifdef WOLFSSL_KEIL
  778. "muls r7, r6, r7\n\t"
  779. #elif defined(__clang__)
  780. "muls r7, r6\n\t"
  781. #else
  782. "mul r7, r6\n\t"
  783. #endif
  784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  785. "adds r5, r5, r7\n\t"
  786. #else
  787. "add r5, r5, r7\n\t"
  788. #endif
  789. #ifdef WOLFSSL_KEIL
  790. "adcs r3, r3, %[r]\n\t"
  791. #elif defined(__clang__)
  792. "adcs r3, %[r]\n\t"
  793. #else
  794. "adc r3, %[r]\n\t"
  795. #endif
  796. "uxth r7, %[b]\n\t"
  797. #ifdef WOLFSSL_KEIL
  798. "muls r6, r7, r6\n\t"
  799. #elif defined(__clang__)
  800. "muls r6, r7\n\t"
  801. #else
  802. "mul r6, r7\n\t"
  803. #endif
  804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  805. "lsrs r7, r6, #16\n\t"
  806. #else
  807. "lsr r7, r6, #16\n\t"
  808. #endif
  809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  810. "lsls r6, r6, #16\n\t"
  811. #else
  812. "lsl r6, r6, #16\n\t"
  813. #endif
  814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  815. "adds r4, r4, r6\n\t"
  816. #else
  817. "add r4, r4, r6\n\t"
  818. #endif
  819. #ifdef WOLFSSL_KEIL
  820. "adcs r5, r5, r7\n\t"
  821. #elif defined(__clang__)
  822. "adcs r5, r7\n\t"
  823. #else
  824. "adc r5, r7\n\t"
  825. #endif
  826. #ifdef WOLFSSL_KEIL
  827. "adcs r3, r3, %[r]\n\t"
  828. #elif defined(__clang__)
  829. "adcs r3, %[r]\n\t"
  830. #else
  831. "adc r3, %[r]\n\t"
  832. #endif
  833. "str r4, [sp, #4]\n\t"
  834. "# A[2] * B[0]\n\t"
  835. "movs r4, #0\n\t"
  836. "mov %[a], r9\n\t"
  837. "mov %[b], r10\n\t"
  838. "ldr %[a], [%[a], #8]\n\t"
  839. "ldr %[b], [%[b]]\n\t"
  840. "uxth r6, %[a]\n\t"
  841. "uxth r7, %[b]\n\t"
  842. #ifdef WOLFSSL_KEIL
  843. "muls r7, r6, r7\n\t"
  844. #elif defined(__clang__)
  845. "muls r7, r6\n\t"
  846. #else
  847. "mul r7, r6\n\t"
  848. #endif
  849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  850. "adds r5, r5, r7\n\t"
  851. #else
  852. "add r5, r5, r7\n\t"
  853. #endif
  854. #ifdef WOLFSSL_KEIL
  855. "adcs r3, r3, %[r]\n\t"
  856. #elif defined(__clang__)
  857. "adcs r3, %[r]\n\t"
  858. #else
  859. "adc r3, %[r]\n\t"
  860. #endif
  861. #ifdef WOLFSSL_KEIL
  862. "adcs r4, r4, %[r]\n\t"
  863. #elif defined(__clang__)
  864. "adcs r4, %[r]\n\t"
  865. #else
  866. "adc r4, %[r]\n\t"
  867. #endif
  868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  869. "lsrs r7, %[b], #16\n\t"
  870. #else
  871. "lsr r7, %[b], #16\n\t"
  872. #endif
  873. #ifdef WOLFSSL_KEIL
  874. "muls r6, r7, r6\n\t"
  875. #elif defined(__clang__)
  876. "muls r6, r7\n\t"
  877. #else
  878. "mul r6, r7\n\t"
  879. #endif
  880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  881. "lsrs r7, r6, #16\n\t"
  882. #else
  883. "lsr r7, r6, #16\n\t"
  884. #endif
  885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  886. "lsls r6, r6, #16\n\t"
  887. #else
  888. "lsl r6, r6, #16\n\t"
  889. #endif
  890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  891. "adds r5, r5, r6\n\t"
  892. #else
  893. "add r5, r5, r6\n\t"
  894. #endif
  895. #ifdef WOLFSSL_KEIL
  896. "adcs r3, r3, r7\n\t"
  897. #elif defined(__clang__)
  898. "adcs r3, r7\n\t"
  899. #else
  900. "adc r3, r7\n\t"
  901. #endif
  902. #ifdef WOLFSSL_KEIL
  903. "adcs r4, r4, %[r]\n\t"
  904. #elif defined(__clang__)
  905. "adcs r4, %[r]\n\t"
  906. #else
  907. "adc r4, %[r]\n\t"
  908. #endif
  909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  910. "lsrs r6, %[a], #16\n\t"
  911. #else
  912. "lsr r6, %[a], #16\n\t"
  913. #endif
  914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  915. "lsrs r7, %[b], #16\n\t"
  916. #else
  917. "lsr r7, %[b], #16\n\t"
  918. #endif
  919. #ifdef WOLFSSL_KEIL
  920. "muls r7, r6, r7\n\t"
  921. #elif defined(__clang__)
  922. "muls r7, r6\n\t"
  923. #else
  924. "mul r7, r6\n\t"
  925. #endif
  926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  927. "adds r3, r3, r7\n\t"
  928. #else
  929. "add r3, r3, r7\n\t"
  930. #endif
  931. #ifdef WOLFSSL_KEIL
  932. "adcs r4, r4, %[r]\n\t"
  933. #elif defined(__clang__)
  934. "adcs r4, %[r]\n\t"
  935. #else
  936. "adc r4, %[r]\n\t"
  937. #endif
  938. "uxth r7, %[b]\n\t"
  939. #ifdef WOLFSSL_KEIL
  940. "muls r6, r7, r6\n\t"
  941. #elif defined(__clang__)
  942. "muls r6, r7\n\t"
  943. #else
  944. "mul r6, r7\n\t"
  945. #endif
  946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  947. "lsrs r7, r6, #16\n\t"
  948. #else
  949. "lsr r7, r6, #16\n\t"
  950. #endif
  951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  952. "lsls r6, r6, #16\n\t"
  953. #else
  954. "lsl r6, r6, #16\n\t"
  955. #endif
  956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  957. "adds r5, r5, r6\n\t"
  958. #else
  959. "add r5, r5, r6\n\t"
  960. #endif
  961. #ifdef WOLFSSL_KEIL
  962. "adcs r3, r3, r7\n\t"
  963. #elif defined(__clang__)
  964. "adcs r3, r7\n\t"
  965. #else
  966. "adc r3, r7\n\t"
  967. #endif
  968. #ifdef WOLFSSL_KEIL
  969. "adcs r4, r4, %[r]\n\t"
  970. #elif defined(__clang__)
  971. "adcs r4, %[r]\n\t"
  972. #else
  973. "adc r4, %[r]\n\t"
  974. #endif
  975. "# A[1] * B[1]\n\t"
  976. "mov %[a], r9\n\t"
  977. "mov %[b], r10\n\t"
  978. "ldr %[a], [%[a], #4]\n\t"
  979. "ldr %[b], [%[b], #4]\n\t"
  980. "uxth r6, %[a]\n\t"
  981. "uxth r7, %[b]\n\t"
  982. #ifdef WOLFSSL_KEIL
  983. "muls r7, r6, r7\n\t"
  984. #elif defined(__clang__)
  985. "muls r7, r6\n\t"
  986. #else
  987. "mul r7, r6\n\t"
  988. #endif
  989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  990. "adds r5, r5, r7\n\t"
  991. #else
  992. "add r5, r5, r7\n\t"
  993. #endif
  994. #ifdef WOLFSSL_KEIL
  995. "adcs r3, r3, %[r]\n\t"
  996. #elif defined(__clang__)
  997. "adcs r3, %[r]\n\t"
  998. #else
  999. "adc r3, %[r]\n\t"
  1000. #endif
  1001. #ifdef WOLFSSL_KEIL
  1002. "adcs r4, r4, %[r]\n\t"
  1003. #elif defined(__clang__)
  1004. "adcs r4, %[r]\n\t"
  1005. #else
  1006. "adc r4, %[r]\n\t"
  1007. #endif
  1008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1009. "lsrs r7, %[b], #16\n\t"
  1010. #else
  1011. "lsr r7, %[b], #16\n\t"
  1012. #endif
  1013. #ifdef WOLFSSL_KEIL
  1014. "muls r6, r7, r6\n\t"
  1015. #elif defined(__clang__)
  1016. "muls r6, r7\n\t"
  1017. #else
  1018. "mul r6, r7\n\t"
  1019. #endif
  1020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1021. "lsrs r7, r6, #16\n\t"
  1022. #else
  1023. "lsr r7, r6, #16\n\t"
  1024. #endif
  1025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1026. "lsls r6, r6, #16\n\t"
  1027. #else
  1028. "lsl r6, r6, #16\n\t"
  1029. #endif
  1030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1031. "adds r5, r5, r6\n\t"
  1032. #else
  1033. "add r5, r5, r6\n\t"
  1034. #endif
  1035. #ifdef WOLFSSL_KEIL
  1036. "adcs r3, r3, r7\n\t"
  1037. #elif defined(__clang__)
  1038. "adcs r3, r7\n\t"
  1039. #else
  1040. "adc r3, r7\n\t"
  1041. #endif
  1042. #ifdef WOLFSSL_KEIL
  1043. "adcs r4, r4, %[r]\n\t"
  1044. #elif defined(__clang__)
  1045. "adcs r4, %[r]\n\t"
  1046. #else
  1047. "adc r4, %[r]\n\t"
  1048. #endif
  1049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1050. "lsrs r6, %[a], #16\n\t"
  1051. #else
  1052. "lsr r6, %[a], #16\n\t"
  1053. #endif
  1054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1055. "lsrs r7, %[b], #16\n\t"
  1056. #else
  1057. "lsr r7, %[b], #16\n\t"
  1058. #endif
  1059. #ifdef WOLFSSL_KEIL
  1060. "muls r7, r6, r7\n\t"
  1061. #elif defined(__clang__)
  1062. "muls r7, r6\n\t"
  1063. #else
  1064. "mul r7, r6\n\t"
  1065. #endif
  1066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1067. "adds r3, r3, r7\n\t"
  1068. #else
  1069. "add r3, r3, r7\n\t"
  1070. #endif
  1071. #ifdef WOLFSSL_KEIL
  1072. "adcs r4, r4, %[r]\n\t"
  1073. #elif defined(__clang__)
  1074. "adcs r4, %[r]\n\t"
  1075. #else
  1076. "adc r4, %[r]\n\t"
  1077. #endif
  1078. "uxth r7, %[b]\n\t"
  1079. #ifdef WOLFSSL_KEIL
  1080. "muls r6, r7, r6\n\t"
  1081. #elif defined(__clang__)
  1082. "muls r6, r7\n\t"
  1083. #else
  1084. "mul r6, r7\n\t"
  1085. #endif
  1086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1087. "lsrs r7, r6, #16\n\t"
  1088. #else
  1089. "lsr r7, r6, #16\n\t"
  1090. #endif
  1091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1092. "lsls r6, r6, #16\n\t"
  1093. #else
  1094. "lsl r6, r6, #16\n\t"
  1095. #endif
  1096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1097. "adds r5, r5, r6\n\t"
  1098. #else
  1099. "add r5, r5, r6\n\t"
  1100. #endif
  1101. #ifdef WOLFSSL_KEIL
  1102. "adcs r3, r3, r7\n\t"
  1103. #elif defined(__clang__)
  1104. "adcs r3, r7\n\t"
  1105. #else
  1106. "adc r3, r7\n\t"
  1107. #endif
  1108. #ifdef WOLFSSL_KEIL
  1109. "adcs r4, r4, %[r]\n\t"
  1110. #elif defined(__clang__)
  1111. "adcs r4, %[r]\n\t"
  1112. #else
  1113. "adc r4, %[r]\n\t"
  1114. #endif
  1115. "# A[0] * B[2]\n\t"
  1116. "mov %[a], r9\n\t"
  1117. "mov %[b], r10\n\t"
  1118. "ldr %[a], [%[a]]\n\t"
  1119. "ldr %[b], [%[b], #8]\n\t"
  1120. "uxth r6, %[a]\n\t"
  1121. "uxth r7, %[b]\n\t"
  1122. #ifdef WOLFSSL_KEIL
  1123. "muls r7, r6, r7\n\t"
  1124. #elif defined(__clang__)
  1125. "muls r7, r6\n\t"
  1126. #else
  1127. "mul r7, r6\n\t"
  1128. #endif
  1129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1130. "adds r5, r5, r7\n\t"
  1131. #else
  1132. "add r5, r5, r7\n\t"
  1133. #endif
  1134. #ifdef WOLFSSL_KEIL
  1135. "adcs r3, r3, %[r]\n\t"
  1136. #elif defined(__clang__)
  1137. "adcs r3, %[r]\n\t"
  1138. #else
  1139. "adc r3, %[r]\n\t"
  1140. #endif
  1141. #ifdef WOLFSSL_KEIL
  1142. "adcs r4, r4, %[r]\n\t"
  1143. #elif defined(__clang__)
  1144. "adcs r4, %[r]\n\t"
  1145. #else
  1146. "adc r4, %[r]\n\t"
  1147. #endif
  1148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1149. "lsrs r7, %[b], #16\n\t"
  1150. #else
  1151. "lsr r7, %[b], #16\n\t"
  1152. #endif
  1153. #ifdef WOLFSSL_KEIL
  1154. "muls r6, r7, r6\n\t"
  1155. #elif defined(__clang__)
  1156. "muls r6, r7\n\t"
  1157. #else
  1158. "mul r6, r7\n\t"
  1159. #endif
  1160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1161. "lsrs r7, r6, #16\n\t"
  1162. #else
  1163. "lsr r7, r6, #16\n\t"
  1164. #endif
  1165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1166. "lsls r6, r6, #16\n\t"
  1167. #else
  1168. "lsl r6, r6, #16\n\t"
  1169. #endif
  1170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1171. "adds r5, r5, r6\n\t"
  1172. #else
  1173. "add r5, r5, r6\n\t"
  1174. #endif
  1175. #ifdef WOLFSSL_KEIL
  1176. "adcs r3, r3, r7\n\t"
  1177. #elif defined(__clang__)
  1178. "adcs r3, r7\n\t"
  1179. #else
  1180. "adc r3, r7\n\t"
  1181. #endif
  1182. #ifdef WOLFSSL_KEIL
  1183. "adcs r4, r4, %[r]\n\t"
  1184. #elif defined(__clang__)
  1185. "adcs r4, %[r]\n\t"
  1186. #else
  1187. "adc r4, %[r]\n\t"
  1188. #endif
  1189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1190. "lsrs r6, %[a], #16\n\t"
  1191. #else
  1192. "lsr r6, %[a], #16\n\t"
  1193. #endif
  1194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1195. "lsrs r7, %[b], #16\n\t"
  1196. #else
  1197. "lsr r7, %[b], #16\n\t"
  1198. #endif
  1199. #ifdef WOLFSSL_KEIL
  1200. "muls r7, r6, r7\n\t"
  1201. #elif defined(__clang__)
  1202. "muls r7, r6\n\t"
  1203. #else
  1204. "mul r7, r6\n\t"
  1205. #endif
  1206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1207. "adds r3, r3, r7\n\t"
  1208. #else
  1209. "add r3, r3, r7\n\t"
  1210. #endif
  1211. #ifdef WOLFSSL_KEIL
  1212. "adcs r4, r4, %[r]\n\t"
  1213. #elif defined(__clang__)
  1214. "adcs r4, %[r]\n\t"
  1215. #else
  1216. "adc r4, %[r]\n\t"
  1217. #endif
  1218. "uxth r7, %[b]\n\t"
  1219. #ifdef WOLFSSL_KEIL
  1220. "muls r6, r7, r6\n\t"
  1221. #elif defined(__clang__)
  1222. "muls r6, r7\n\t"
  1223. #else
  1224. "mul r6, r7\n\t"
  1225. #endif
  1226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1227. "lsrs r7, r6, #16\n\t"
  1228. #else
  1229. "lsr r7, r6, #16\n\t"
  1230. #endif
  1231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1232. "lsls r6, r6, #16\n\t"
  1233. #else
  1234. "lsl r6, r6, #16\n\t"
  1235. #endif
  1236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1237. "adds r5, r5, r6\n\t"
  1238. #else
  1239. "add r5, r5, r6\n\t"
  1240. #endif
  1241. #ifdef WOLFSSL_KEIL
  1242. "adcs r3, r3, r7\n\t"
  1243. #elif defined(__clang__)
  1244. "adcs r3, r7\n\t"
  1245. #else
  1246. "adc r3, r7\n\t"
  1247. #endif
  1248. #ifdef WOLFSSL_KEIL
  1249. "adcs r4, r4, %[r]\n\t"
  1250. #elif defined(__clang__)
  1251. "adcs r4, %[r]\n\t"
  1252. #else
  1253. "adc r4, %[r]\n\t"
  1254. #endif
  1255. "str r5, [sp, #8]\n\t"
  1256. "# A[0] * B[3]\n\t"
  1257. "movs r5, #0\n\t"
  1258. "mov %[a], r9\n\t"
  1259. "mov %[b], r10\n\t"
  1260. "ldr %[a], [%[a]]\n\t"
  1261. "ldr %[b], [%[b], #12]\n\t"
  1262. "uxth r6, %[a]\n\t"
  1263. "uxth r7, %[b]\n\t"
  1264. #ifdef WOLFSSL_KEIL
  1265. "muls r7, r6, r7\n\t"
  1266. #elif defined(__clang__)
  1267. "muls r7, r6\n\t"
  1268. #else
  1269. "mul r7, r6\n\t"
  1270. #endif
  1271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1272. "adds r3, r3, r7\n\t"
  1273. #else
  1274. "add r3, r3, r7\n\t"
  1275. #endif
  1276. #ifdef WOLFSSL_KEIL
  1277. "adcs r4, r4, %[r]\n\t"
  1278. #elif defined(__clang__)
  1279. "adcs r4, %[r]\n\t"
  1280. #else
  1281. "adc r4, %[r]\n\t"
  1282. #endif
  1283. #ifdef WOLFSSL_KEIL
  1284. "adcs r5, r5, %[r]\n\t"
  1285. #elif defined(__clang__)
  1286. "adcs r5, %[r]\n\t"
  1287. #else
  1288. "adc r5, %[r]\n\t"
  1289. #endif
  1290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1291. "lsrs r7, %[b], #16\n\t"
  1292. #else
  1293. "lsr r7, %[b], #16\n\t"
  1294. #endif
  1295. #ifdef WOLFSSL_KEIL
  1296. "muls r6, r7, r6\n\t"
  1297. #elif defined(__clang__)
  1298. "muls r6, r7\n\t"
  1299. #else
  1300. "mul r6, r7\n\t"
  1301. #endif
  1302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1303. "lsrs r7, r6, #16\n\t"
  1304. #else
  1305. "lsr r7, r6, #16\n\t"
  1306. #endif
  1307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1308. "lsls r6, r6, #16\n\t"
  1309. #else
  1310. "lsl r6, r6, #16\n\t"
  1311. #endif
  1312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1313. "adds r3, r3, r6\n\t"
  1314. #else
  1315. "add r3, r3, r6\n\t"
  1316. #endif
  1317. #ifdef WOLFSSL_KEIL
  1318. "adcs r4, r4, r7\n\t"
  1319. #elif defined(__clang__)
  1320. "adcs r4, r7\n\t"
  1321. #else
  1322. "adc r4, r7\n\t"
  1323. #endif
  1324. #ifdef WOLFSSL_KEIL
  1325. "adcs r5, r5, %[r]\n\t"
  1326. #elif defined(__clang__)
  1327. "adcs r5, %[r]\n\t"
  1328. #else
  1329. "adc r5, %[r]\n\t"
  1330. #endif
  1331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1332. "lsrs r6, %[a], #16\n\t"
  1333. #else
  1334. "lsr r6, %[a], #16\n\t"
  1335. #endif
  1336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1337. "lsrs r7, %[b], #16\n\t"
  1338. #else
  1339. "lsr r7, %[b], #16\n\t"
  1340. #endif
  1341. #ifdef WOLFSSL_KEIL
  1342. "muls r7, r6, r7\n\t"
  1343. #elif defined(__clang__)
  1344. "muls r7, r6\n\t"
  1345. #else
  1346. "mul r7, r6\n\t"
  1347. #endif
  1348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1349. "adds r4, r4, r7\n\t"
  1350. #else
  1351. "add r4, r4, r7\n\t"
  1352. #endif
  1353. #ifdef WOLFSSL_KEIL
  1354. "adcs r5, r5, %[r]\n\t"
  1355. #elif defined(__clang__)
  1356. "adcs r5, %[r]\n\t"
  1357. #else
  1358. "adc r5, %[r]\n\t"
  1359. #endif
  1360. "uxth r7, %[b]\n\t"
  1361. #ifdef WOLFSSL_KEIL
  1362. "muls r6, r7, r6\n\t"
  1363. #elif defined(__clang__)
  1364. "muls r6, r7\n\t"
  1365. #else
  1366. "mul r6, r7\n\t"
  1367. #endif
  1368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1369. "lsrs r7, r6, #16\n\t"
  1370. #else
  1371. "lsr r7, r6, #16\n\t"
  1372. #endif
  1373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1374. "lsls r6, r6, #16\n\t"
  1375. #else
  1376. "lsl r6, r6, #16\n\t"
  1377. #endif
  1378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1379. "adds r3, r3, r6\n\t"
  1380. #else
  1381. "add r3, r3, r6\n\t"
  1382. #endif
  1383. #ifdef WOLFSSL_KEIL
  1384. "adcs r4, r4, r7\n\t"
  1385. #elif defined(__clang__)
  1386. "adcs r4, r7\n\t"
  1387. #else
  1388. "adc r4, r7\n\t"
  1389. #endif
  1390. #ifdef WOLFSSL_KEIL
  1391. "adcs r5, r5, %[r]\n\t"
  1392. #elif defined(__clang__)
  1393. "adcs r5, %[r]\n\t"
  1394. #else
  1395. "adc r5, %[r]\n\t"
  1396. #endif
  1397. "# A[1] * B[2]\n\t"
  1398. "mov %[a], r9\n\t"
  1399. "mov %[b], r10\n\t"
  1400. "ldr %[a], [%[a], #4]\n\t"
  1401. "ldr %[b], [%[b], #8]\n\t"
  1402. "uxth r6, %[a]\n\t"
  1403. "uxth r7, %[b]\n\t"
  1404. #ifdef WOLFSSL_KEIL
  1405. "muls r7, r6, r7\n\t"
  1406. #elif defined(__clang__)
  1407. "muls r7, r6\n\t"
  1408. #else
  1409. "mul r7, r6\n\t"
  1410. #endif
  1411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1412. "adds r3, r3, r7\n\t"
  1413. #else
  1414. "add r3, r3, r7\n\t"
  1415. #endif
  1416. #ifdef WOLFSSL_KEIL
  1417. "adcs r4, r4, %[r]\n\t"
  1418. #elif defined(__clang__)
  1419. "adcs r4, %[r]\n\t"
  1420. #else
  1421. "adc r4, %[r]\n\t"
  1422. #endif
  1423. #ifdef WOLFSSL_KEIL
  1424. "adcs r5, r5, %[r]\n\t"
  1425. #elif defined(__clang__)
  1426. "adcs r5, %[r]\n\t"
  1427. #else
  1428. "adc r5, %[r]\n\t"
  1429. #endif
  1430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1431. "lsrs r7, %[b], #16\n\t"
  1432. #else
  1433. "lsr r7, %[b], #16\n\t"
  1434. #endif
  1435. #ifdef WOLFSSL_KEIL
  1436. "muls r6, r7, r6\n\t"
  1437. #elif defined(__clang__)
  1438. "muls r6, r7\n\t"
  1439. #else
  1440. "mul r6, r7\n\t"
  1441. #endif
  1442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1443. "lsrs r7, r6, #16\n\t"
  1444. #else
  1445. "lsr r7, r6, #16\n\t"
  1446. #endif
  1447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1448. "lsls r6, r6, #16\n\t"
  1449. #else
  1450. "lsl r6, r6, #16\n\t"
  1451. #endif
  1452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1453. "adds r3, r3, r6\n\t"
  1454. #else
  1455. "add r3, r3, r6\n\t"
  1456. #endif
  1457. #ifdef WOLFSSL_KEIL
  1458. "adcs r4, r4, r7\n\t"
  1459. #elif defined(__clang__)
  1460. "adcs r4, r7\n\t"
  1461. #else
  1462. "adc r4, r7\n\t"
  1463. #endif
  1464. #ifdef WOLFSSL_KEIL
  1465. "adcs r5, r5, %[r]\n\t"
  1466. #elif defined(__clang__)
  1467. "adcs r5, %[r]\n\t"
  1468. #else
  1469. "adc r5, %[r]\n\t"
  1470. #endif
  1471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1472. "lsrs r6, %[a], #16\n\t"
  1473. #else
  1474. "lsr r6, %[a], #16\n\t"
  1475. #endif
  1476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1477. "lsrs r7, %[b], #16\n\t"
  1478. #else
  1479. "lsr r7, %[b], #16\n\t"
  1480. #endif
  1481. #ifdef WOLFSSL_KEIL
  1482. "muls r7, r6, r7\n\t"
  1483. #elif defined(__clang__)
  1484. "muls r7, r6\n\t"
  1485. #else
  1486. "mul r7, r6\n\t"
  1487. #endif
  1488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1489. "adds r4, r4, r7\n\t"
  1490. #else
  1491. "add r4, r4, r7\n\t"
  1492. #endif
  1493. #ifdef WOLFSSL_KEIL
  1494. "adcs r5, r5, %[r]\n\t"
  1495. #elif defined(__clang__)
  1496. "adcs r5, %[r]\n\t"
  1497. #else
  1498. "adc r5, %[r]\n\t"
  1499. #endif
  1500. "uxth r7, %[b]\n\t"
  1501. #ifdef WOLFSSL_KEIL
  1502. "muls r6, r7, r6\n\t"
  1503. #elif defined(__clang__)
  1504. "muls r6, r7\n\t"
  1505. #else
  1506. "mul r6, r7\n\t"
  1507. #endif
  1508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1509. "lsrs r7, r6, #16\n\t"
  1510. #else
  1511. "lsr r7, r6, #16\n\t"
  1512. #endif
  1513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1514. "lsls r6, r6, #16\n\t"
  1515. #else
  1516. "lsl r6, r6, #16\n\t"
  1517. #endif
  1518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1519. "adds r3, r3, r6\n\t"
  1520. #else
  1521. "add r3, r3, r6\n\t"
  1522. #endif
  1523. #ifdef WOLFSSL_KEIL
  1524. "adcs r4, r4, r7\n\t"
  1525. #elif defined(__clang__)
  1526. "adcs r4, r7\n\t"
  1527. #else
  1528. "adc r4, r7\n\t"
  1529. #endif
  1530. #ifdef WOLFSSL_KEIL
  1531. "adcs r5, r5, %[r]\n\t"
  1532. #elif defined(__clang__)
  1533. "adcs r5, %[r]\n\t"
  1534. #else
  1535. "adc r5, %[r]\n\t"
  1536. #endif
  1537. "# A[2] * B[1]\n\t"
  1538. "mov %[a], r9\n\t"
  1539. "mov %[b], r10\n\t"
  1540. "ldr %[a], [%[a], #8]\n\t"
  1541. "ldr %[b], [%[b], #4]\n\t"
  1542. "uxth r6, %[a]\n\t"
  1543. "uxth r7, %[b]\n\t"
  1544. #ifdef WOLFSSL_KEIL
  1545. "muls r7, r6, r7\n\t"
  1546. #elif defined(__clang__)
  1547. "muls r7, r6\n\t"
  1548. #else
  1549. "mul r7, r6\n\t"
  1550. #endif
  1551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1552. "adds r3, r3, r7\n\t"
  1553. #else
  1554. "add r3, r3, r7\n\t"
  1555. #endif
  1556. #ifdef WOLFSSL_KEIL
  1557. "adcs r4, r4, %[r]\n\t"
  1558. #elif defined(__clang__)
  1559. "adcs r4, %[r]\n\t"
  1560. #else
  1561. "adc r4, %[r]\n\t"
  1562. #endif
  1563. #ifdef WOLFSSL_KEIL
  1564. "adcs r5, r5, %[r]\n\t"
  1565. #elif defined(__clang__)
  1566. "adcs r5, %[r]\n\t"
  1567. #else
  1568. "adc r5, %[r]\n\t"
  1569. #endif
  1570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1571. "lsrs r7, %[b], #16\n\t"
  1572. #else
  1573. "lsr r7, %[b], #16\n\t"
  1574. #endif
  1575. #ifdef WOLFSSL_KEIL
  1576. "muls r6, r7, r6\n\t"
  1577. #elif defined(__clang__)
  1578. "muls r6, r7\n\t"
  1579. #else
  1580. "mul r6, r7\n\t"
  1581. #endif
  1582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1583. "lsrs r7, r6, #16\n\t"
  1584. #else
  1585. "lsr r7, r6, #16\n\t"
  1586. #endif
  1587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1588. "lsls r6, r6, #16\n\t"
  1589. #else
  1590. "lsl r6, r6, #16\n\t"
  1591. #endif
  1592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1593. "adds r3, r3, r6\n\t"
  1594. #else
  1595. "add r3, r3, r6\n\t"
  1596. #endif
  1597. #ifdef WOLFSSL_KEIL
  1598. "adcs r4, r4, r7\n\t"
  1599. #elif defined(__clang__)
  1600. "adcs r4, r7\n\t"
  1601. #else
  1602. "adc r4, r7\n\t"
  1603. #endif
  1604. #ifdef WOLFSSL_KEIL
  1605. "adcs r5, r5, %[r]\n\t"
  1606. #elif defined(__clang__)
  1607. "adcs r5, %[r]\n\t"
  1608. #else
  1609. "adc r5, %[r]\n\t"
  1610. #endif
  1611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1612. "lsrs r6, %[a], #16\n\t"
  1613. #else
  1614. "lsr r6, %[a], #16\n\t"
  1615. #endif
  1616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1617. "lsrs r7, %[b], #16\n\t"
  1618. #else
  1619. "lsr r7, %[b], #16\n\t"
  1620. #endif
  1621. #ifdef WOLFSSL_KEIL
  1622. "muls r7, r6, r7\n\t"
  1623. #elif defined(__clang__)
  1624. "muls r7, r6\n\t"
  1625. #else
  1626. "mul r7, r6\n\t"
  1627. #endif
  1628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1629. "adds r4, r4, r7\n\t"
  1630. #else
  1631. "add r4, r4, r7\n\t"
  1632. #endif
  1633. #ifdef WOLFSSL_KEIL
  1634. "adcs r5, r5, %[r]\n\t"
  1635. #elif defined(__clang__)
  1636. "adcs r5, %[r]\n\t"
  1637. #else
  1638. "adc r5, %[r]\n\t"
  1639. #endif
  1640. "uxth r7, %[b]\n\t"
  1641. #ifdef WOLFSSL_KEIL
  1642. "muls r6, r7, r6\n\t"
  1643. #elif defined(__clang__)
  1644. "muls r6, r7\n\t"
  1645. #else
  1646. "mul r6, r7\n\t"
  1647. #endif
  1648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1649. "lsrs r7, r6, #16\n\t"
  1650. #else
  1651. "lsr r7, r6, #16\n\t"
  1652. #endif
  1653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1654. "lsls r6, r6, #16\n\t"
  1655. #else
  1656. "lsl r6, r6, #16\n\t"
  1657. #endif
  1658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1659. "adds r3, r3, r6\n\t"
  1660. #else
  1661. "add r3, r3, r6\n\t"
  1662. #endif
  1663. #ifdef WOLFSSL_KEIL
  1664. "adcs r4, r4, r7\n\t"
  1665. #elif defined(__clang__)
  1666. "adcs r4, r7\n\t"
  1667. #else
  1668. "adc r4, r7\n\t"
  1669. #endif
  1670. #ifdef WOLFSSL_KEIL
  1671. "adcs r5, r5, %[r]\n\t"
  1672. #elif defined(__clang__)
  1673. "adcs r5, %[r]\n\t"
  1674. #else
  1675. "adc r5, %[r]\n\t"
  1676. #endif
  1677. "# A[3] * B[0]\n\t"
  1678. "mov %[a], r9\n\t"
  1679. "mov %[b], r10\n\t"
  1680. "ldr %[a], [%[a], #12]\n\t"
  1681. "ldr %[b], [%[b]]\n\t"
  1682. "uxth r6, %[a]\n\t"
  1683. "uxth r7, %[b]\n\t"
  1684. #ifdef WOLFSSL_KEIL
  1685. "muls r7, r6, r7\n\t"
  1686. #elif defined(__clang__)
  1687. "muls r7, r6\n\t"
  1688. #else
  1689. "mul r7, r6\n\t"
  1690. #endif
  1691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1692. "adds r3, r3, r7\n\t"
  1693. #else
  1694. "add r3, r3, r7\n\t"
  1695. #endif
  1696. #ifdef WOLFSSL_KEIL
  1697. "adcs r4, r4, %[r]\n\t"
  1698. #elif defined(__clang__)
  1699. "adcs r4, %[r]\n\t"
  1700. #else
  1701. "adc r4, %[r]\n\t"
  1702. #endif
  1703. #ifdef WOLFSSL_KEIL
  1704. "adcs r5, r5, %[r]\n\t"
  1705. #elif defined(__clang__)
  1706. "adcs r5, %[r]\n\t"
  1707. #else
  1708. "adc r5, %[r]\n\t"
  1709. #endif
  1710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1711. "lsrs r7, %[b], #16\n\t"
  1712. #else
  1713. "lsr r7, %[b], #16\n\t"
  1714. #endif
  1715. #ifdef WOLFSSL_KEIL
  1716. "muls r6, r7, r6\n\t"
  1717. #elif defined(__clang__)
  1718. "muls r6, r7\n\t"
  1719. #else
  1720. "mul r6, r7\n\t"
  1721. #endif
  1722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1723. "lsrs r7, r6, #16\n\t"
  1724. #else
  1725. "lsr r7, r6, #16\n\t"
  1726. #endif
  1727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1728. "lsls r6, r6, #16\n\t"
  1729. #else
  1730. "lsl r6, r6, #16\n\t"
  1731. #endif
  1732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1733. "adds r3, r3, r6\n\t"
  1734. #else
  1735. "add r3, r3, r6\n\t"
  1736. #endif
  1737. #ifdef WOLFSSL_KEIL
  1738. "adcs r4, r4, r7\n\t"
  1739. #elif defined(__clang__)
  1740. "adcs r4, r7\n\t"
  1741. #else
  1742. "adc r4, r7\n\t"
  1743. #endif
  1744. #ifdef WOLFSSL_KEIL
  1745. "adcs r5, r5, %[r]\n\t"
  1746. #elif defined(__clang__)
  1747. "adcs r5, %[r]\n\t"
  1748. #else
  1749. "adc r5, %[r]\n\t"
  1750. #endif
  1751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1752. "lsrs r6, %[a], #16\n\t"
  1753. #else
  1754. "lsr r6, %[a], #16\n\t"
  1755. #endif
  1756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1757. "lsrs r7, %[b], #16\n\t"
  1758. #else
  1759. "lsr r7, %[b], #16\n\t"
  1760. #endif
  1761. #ifdef WOLFSSL_KEIL
  1762. "muls r7, r6, r7\n\t"
  1763. #elif defined(__clang__)
  1764. "muls r7, r6\n\t"
  1765. #else
  1766. "mul r7, r6\n\t"
  1767. #endif
  1768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1769. "adds r4, r4, r7\n\t"
  1770. #else
  1771. "add r4, r4, r7\n\t"
  1772. #endif
  1773. #ifdef WOLFSSL_KEIL
  1774. "adcs r5, r5, %[r]\n\t"
  1775. #elif defined(__clang__)
  1776. "adcs r5, %[r]\n\t"
  1777. #else
  1778. "adc r5, %[r]\n\t"
  1779. #endif
  1780. "uxth r7, %[b]\n\t"
  1781. #ifdef WOLFSSL_KEIL
  1782. "muls r6, r7, r6\n\t"
  1783. #elif defined(__clang__)
  1784. "muls r6, r7\n\t"
  1785. #else
  1786. "mul r6, r7\n\t"
  1787. #endif
  1788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1789. "lsrs r7, r6, #16\n\t"
  1790. #else
  1791. "lsr r7, r6, #16\n\t"
  1792. #endif
  1793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1794. "lsls r6, r6, #16\n\t"
  1795. #else
  1796. "lsl r6, r6, #16\n\t"
  1797. #endif
  1798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1799. "adds r3, r3, r6\n\t"
  1800. #else
  1801. "add r3, r3, r6\n\t"
  1802. #endif
  1803. #ifdef WOLFSSL_KEIL
  1804. "adcs r4, r4, r7\n\t"
  1805. #elif defined(__clang__)
  1806. "adcs r4, r7\n\t"
  1807. #else
  1808. "adc r4, r7\n\t"
  1809. #endif
  1810. #ifdef WOLFSSL_KEIL
  1811. "adcs r5, r5, %[r]\n\t"
  1812. #elif defined(__clang__)
  1813. "adcs r5, %[r]\n\t"
  1814. #else
  1815. "adc r5, %[r]\n\t"
  1816. #endif
  1817. "str r3, [sp, #12]\n\t"
  1818. "# A[4] * B[0]\n\t"
  1819. "movs r3, #0\n\t"
  1820. "mov %[a], r9\n\t"
  1821. "mov %[b], r10\n\t"
  1822. "ldr %[a], [%[a], #16]\n\t"
  1823. "ldr %[b], [%[b]]\n\t"
  1824. "uxth r6, %[a]\n\t"
  1825. "uxth r7, %[b]\n\t"
  1826. #ifdef WOLFSSL_KEIL
  1827. "muls r7, r6, r7\n\t"
  1828. #elif defined(__clang__)
  1829. "muls r7, r6\n\t"
  1830. #else
  1831. "mul r7, r6\n\t"
  1832. #endif
  1833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1834. "adds r4, r4, r7\n\t"
  1835. #else
  1836. "add r4, r4, r7\n\t"
  1837. #endif
  1838. #ifdef WOLFSSL_KEIL
  1839. "adcs r5, r5, %[r]\n\t"
  1840. #elif defined(__clang__)
  1841. "adcs r5, %[r]\n\t"
  1842. #else
  1843. "adc r5, %[r]\n\t"
  1844. #endif
  1845. #ifdef WOLFSSL_KEIL
  1846. "adcs r3, r3, %[r]\n\t"
  1847. #elif defined(__clang__)
  1848. "adcs r3, %[r]\n\t"
  1849. #else
  1850. "adc r3, %[r]\n\t"
  1851. #endif
  1852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1853. "lsrs r7, %[b], #16\n\t"
  1854. #else
  1855. "lsr r7, %[b], #16\n\t"
  1856. #endif
  1857. #ifdef WOLFSSL_KEIL
  1858. "muls r6, r7, r6\n\t"
  1859. #elif defined(__clang__)
  1860. "muls r6, r7\n\t"
  1861. #else
  1862. "mul r6, r7\n\t"
  1863. #endif
  1864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1865. "lsrs r7, r6, #16\n\t"
  1866. #else
  1867. "lsr r7, r6, #16\n\t"
  1868. #endif
  1869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1870. "lsls r6, r6, #16\n\t"
  1871. #else
  1872. "lsl r6, r6, #16\n\t"
  1873. #endif
  1874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1875. "adds r4, r4, r6\n\t"
  1876. #else
  1877. "add r4, r4, r6\n\t"
  1878. #endif
  1879. #ifdef WOLFSSL_KEIL
  1880. "adcs r5, r5, r7\n\t"
  1881. #elif defined(__clang__)
  1882. "adcs r5, r7\n\t"
  1883. #else
  1884. "adc r5, r7\n\t"
  1885. #endif
  1886. #ifdef WOLFSSL_KEIL
  1887. "adcs r3, r3, %[r]\n\t"
  1888. #elif defined(__clang__)
  1889. "adcs r3, %[r]\n\t"
  1890. #else
  1891. "adc r3, %[r]\n\t"
  1892. #endif
  1893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1894. "lsrs r6, %[a], #16\n\t"
  1895. #else
  1896. "lsr r6, %[a], #16\n\t"
  1897. #endif
  1898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1899. "lsrs r7, %[b], #16\n\t"
  1900. #else
  1901. "lsr r7, %[b], #16\n\t"
  1902. #endif
  1903. #ifdef WOLFSSL_KEIL
  1904. "muls r7, r6, r7\n\t"
  1905. #elif defined(__clang__)
  1906. "muls r7, r6\n\t"
  1907. #else
  1908. "mul r7, r6\n\t"
  1909. #endif
  1910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1911. "adds r5, r5, r7\n\t"
  1912. #else
  1913. "add r5, r5, r7\n\t"
  1914. #endif
  1915. #ifdef WOLFSSL_KEIL
  1916. "adcs r3, r3, %[r]\n\t"
  1917. #elif defined(__clang__)
  1918. "adcs r3, %[r]\n\t"
  1919. #else
  1920. "adc r3, %[r]\n\t"
  1921. #endif
  1922. "uxth r7, %[b]\n\t"
  1923. #ifdef WOLFSSL_KEIL
  1924. "muls r6, r7, r6\n\t"
  1925. #elif defined(__clang__)
  1926. "muls r6, r7\n\t"
  1927. #else
  1928. "mul r6, r7\n\t"
  1929. #endif
  1930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1931. "lsrs r7, r6, #16\n\t"
  1932. #else
  1933. "lsr r7, r6, #16\n\t"
  1934. #endif
  1935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1936. "lsls r6, r6, #16\n\t"
  1937. #else
  1938. "lsl r6, r6, #16\n\t"
  1939. #endif
  1940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1941. "adds r4, r4, r6\n\t"
  1942. #else
  1943. "add r4, r4, r6\n\t"
  1944. #endif
  1945. #ifdef WOLFSSL_KEIL
  1946. "adcs r5, r5, r7\n\t"
  1947. #elif defined(__clang__)
  1948. "adcs r5, r7\n\t"
  1949. #else
  1950. "adc r5, r7\n\t"
  1951. #endif
  1952. #ifdef WOLFSSL_KEIL
  1953. "adcs r3, r3, %[r]\n\t"
  1954. #elif defined(__clang__)
  1955. "adcs r3, %[r]\n\t"
  1956. #else
  1957. "adc r3, %[r]\n\t"
  1958. #endif
  1959. "# A[3] * B[1]\n\t"
  1960. "mov %[a], r9\n\t"
  1961. "mov %[b], r10\n\t"
  1962. "ldr %[a], [%[a], #12]\n\t"
  1963. "ldr %[b], [%[b], #4]\n\t"
  1964. "uxth r6, %[a]\n\t"
  1965. "uxth r7, %[b]\n\t"
  1966. #ifdef WOLFSSL_KEIL
  1967. "muls r7, r6, r7\n\t"
  1968. #elif defined(__clang__)
  1969. "muls r7, r6\n\t"
  1970. #else
  1971. "mul r7, r6\n\t"
  1972. #endif
  1973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1974. "adds r4, r4, r7\n\t"
  1975. #else
  1976. "add r4, r4, r7\n\t"
  1977. #endif
  1978. #ifdef WOLFSSL_KEIL
  1979. "adcs r5, r5, %[r]\n\t"
  1980. #elif defined(__clang__)
  1981. "adcs r5, %[r]\n\t"
  1982. #else
  1983. "adc r5, %[r]\n\t"
  1984. #endif
  1985. #ifdef WOLFSSL_KEIL
  1986. "adcs r3, r3, %[r]\n\t"
  1987. #elif defined(__clang__)
  1988. "adcs r3, %[r]\n\t"
  1989. #else
  1990. "adc r3, %[r]\n\t"
  1991. #endif
  1992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  1993. "lsrs r7, %[b], #16\n\t"
  1994. #else
  1995. "lsr r7, %[b], #16\n\t"
  1996. #endif
  1997. #ifdef WOLFSSL_KEIL
  1998. "muls r6, r7, r6\n\t"
  1999. #elif defined(__clang__)
  2000. "muls r6, r7\n\t"
  2001. #else
  2002. "mul r6, r7\n\t"
  2003. #endif
  2004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2005. "lsrs r7, r6, #16\n\t"
  2006. #else
  2007. "lsr r7, r6, #16\n\t"
  2008. #endif
  2009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2010. "lsls r6, r6, #16\n\t"
  2011. #else
  2012. "lsl r6, r6, #16\n\t"
  2013. #endif
  2014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2015. "adds r4, r4, r6\n\t"
  2016. #else
  2017. "add r4, r4, r6\n\t"
  2018. #endif
  2019. #ifdef WOLFSSL_KEIL
  2020. "adcs r5, r5, r7\n\t"
  2021. #elif defined(__clang__)
  2022. "adcs r5, r7\n\t"
  2023. #else
  2024. "adc r5, r7\n\t"
  2025. #endif
  2026. #ifdef WOLFSSL_KEIL
  2027. "adcs r3, r3, %[r]\n\t"
  2028. #elif defined(__clang__)
  2029. "adcs r3, %[r]\n\t"
  2030. #else
  2031. "adc r3, %[r]\n\t"
  2032. #endif
  2033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2034. "lsrs r6, %[a], #16\n\t"
  2035. #else
  2036. "lsr r6, %[a], #16\n\t"
  2037. #endif
  2038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2039. "lsrs r7, %[b], #16\n\t"
  2040. #else
  2041. "lsr r7, %[b], #16\n\t"
  2042. #endif
  2043. #ifdef WOLFSSL_KEIL
  2044. "muls r7, r6, r7\n\t"
  2045. #elif defined(__clang__)
  2046. "muls r7, r6\n\t"
  2047. #else
  2048. "mul r7, r6\n\t"
  2049. #endif
  2050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2051. "adds r5, r5, r7\n\t"
  2052. #else
  2053. "add r5, r5, r7\n\t"
  2054. #endif
  2055. #ifdef WOLFSSL_KEIL
  2056. "adcs r3, r3, %[r]\n\t"
  2057. #elif defined(__clang__)
  2058. "adcs r3, %[r]\n\t"
  2059. #else
  2060. "adc r3, %[r]\n\t"
  2061. #endif
  2062. "uxth r7, %[b]\n\t"
  2063. #ifdef WOLFSSL_KEIL
  2064. "muls r6, r7, r6\n\t"
  2065. #elif defined(__clang__)
  2066. "muls r6, r7\n\t"
  2067. #else
  2068. "mul r6, r7\n\t"
  2069. #endif
  2070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2071. "lsrs r7, r6, #16\n\t"
  2072. #else
  2073. "lsr r7, r6, #16\n\t"
  2074. #endif
  2075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2076. "lsls r6, r6, #16\n\t"
  2077. #else
  2078. "lsl r6, r6, #16\n\t"
  2079. #endif
  2080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2081. "adds r4, r4, r6\n\t"
  2082. #else
  2083. "add r4, r4, r6\n\t"
  2084. #endif
  2085. #ifdef WOLFSSL_KEIL
  2086. "adcs r5, r5, r7\n\t"
  2087. #elif defined(__clang__)
  2088. "adcs r5, r7\n\t"
  2089. #else
  2090. "adc r5, r7\n\t"
  2091. #endif
  2092. #ifdef WOLFSSL_KEIL
  2093. "adcs r3, r3, %[r]\n\t"
  2094. #elif defined(__clang__)
  2095. "adcs r3, %[r]\n\t"
  2096. #else
  2097. "adc r3, %[r]\n\t"
  2098. #endif
  2099. "# A[2] * B[2]\n\t"
  2100. "mov %[a], r9\n\t"
  2101. "mov %[b], r10\n\t"
  2102. "ldr %[a], [%[a], #8]\n\t"
  2103. "ldr %[b], [%[b], #8]\n\t"
  2104. "uxth r6, %[a]\n\t"
  2105. "uxth r7, %[b]\n\t"
  2106. #ifdef WOLFSSL_KEIL
  2107. "muls r7, r6, r7\n\t"
  2108. #elif defined(__clang__)
  2109. "muls r7, r6\n\t"
  2110. #else
  2111. "mul r7, r6\n\t"
  2112. #endif
  2113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2114. "adds r4, r4, r7\n\t"
  2115. #else
  2116. "add r4, r4, r7\n\t"
  2117. #endif
  2118. #ifdef WOLFSSL_KEIL
  2119. "adcs r5, r5, %[r]\n\t"
  2120. #elif defined(__clang__)
  2121. "adcs r5, %[r]\n\t"
  2122. #else
  2123. "adc r5, %[r]\n\t"
  2124. #endif
  2125. #ifdef WOLFSSL_KEIL
  2126. "adcs r3, r3, %[r]\n\t"
  2127. #elif defined(__clang__)
  2128. "adcs r3, %[r]\n\t"
  2129. #else
  2130. "adc r3, %[r]\n\t"
  2131. #endif
  2132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2133. "lsrs r7, %[b], #16\n\t"
  2134. #else
  2135. "lsr r7, %[b], #16\n\t"
  2136. #endif
  2137. #ifdef WOLFSSL_KEIL
  2138. "muls r6, r7, r6\n\t"
  2139. #elif defined(__clang__)
  2140. "muls r6, r7\n\t"
  2141. #else
  2142. "mul r6, r7\n\t"
  2143. #endif
  2144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2145. "lsrs r7, r6, #16\n\t"
  2146. #else
  2147. "lsr r7, r6, #16\n\t"
  2148. #endif
  2149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2150. "lsls r6, r6, #16\n\t"
  2151. #else
  2152. "lsl r6, r6, #16\n\t"
  2153. #endif
  2154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2155. "adds r4, r4, r6\n\t"
  2156. #else
  2157. "add r4, r4, r6\n\t"
  2158. #endif
  2159. #ifdef WOLFSSL_KEIL
  2160. "adcs r5, r5, r7\n\t"
  2161. #elif defined(__clang__)
  2162. "adcs r5, r7\n\t"
  2163. #else
  2164. "adc r5, r7\n\t"
  2165. #endif
  2166. #ifdef WOLFSSL_KEIL
  2167. "adcs r3, r3, %[r]\n\t"
  2168. #elif defined(__clang__)
  2169. "adcs r3, %[r]\n\t"
  2170. #else
  2171. "adc r3, %[r]\n\t"
  2172. #endif
  2173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2174. "lsrs r6, %[a], #16\n\t"
  2175. #else
  2176. "lsr r6, %[a], #16\n\t"
  2177. #endif
  2178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2179. "lsrs r7, %[b], #16\n\t"
  2180. #else
  2181. "lsr r7, %[b], #16\n\t"
  2182. #endif
  2183. #ifdef WOLFSSL_KEIL
  2184. "muls r7, r6, r7\n\t"
  2185. #elif defined(__clang__)
  2186. "muls r7, r6\n\t"
  2187. #else
  2188. "mul r7, r6\n\t"
  2189. #endif
  2190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2191. "adds r5, r5, r7\n\t"
  2192. #else
  2193. "add r5, r5, r7\n\t"
  2194. #endif
  2195. #ifdef WOLFSSL_KEIL
  2196. "adcs r3, r3, %[r]\n\t"
  2197. #elif defined(__clang__)
  2198. "adcs r3, %[r]\n\t"
  2199. #else
  2200. "adc r3, %[r]\n\t"
  2201. #endif
  2202. "uxth r7, %[b]\n\t"
  2203. #ifdef WOLFSSL_KEIL
  2204. "muls r6, r7, r6\n\t"
  2205. #elif defined(__clang__)
  2206. "muls r6, r7\n\t"
  2207. #else
  2208. "mul r6, r7\n\t"
  2209. #endif
  2210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2211. "lsrs r7, r6, #16\n\t"
  2212. #else
  2213. "lsr r7, r6, #16\n\t"
  2214. #endif
  2215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2216. "lsls r6, r6, #16\n\t"
  2217. #else
  2218. "lsl r6, r6, #16\n\t"
  2219. #endif
  2220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2221. "adds r4, r4, r6\n\t"
  2222. #else
  2223. "add r4, r4, r6\n\t"
  2224. #endif
  2225. #ifdef WOLFSSL_KEIL
  2226. "adcs r5, r5, r7\n\t"
  2227. #elif defined(__clang__)
  2228. "adcs r5, r7\n\t"
  2229. #else
  2230. "adc r5, r7\n\t"
  2231. #endif
  2232. #ifdef WOLFSSL_KEIL
  2233. "adcs r3, r3, %[r]\n\t"
  2234. #elif defined(__clang__)
  2235. "adcs r3, %[r]\n\t"
  2236. #else
  2237. "adc r3, %[r]\n\t"
  2238. #endif
  2239. "# A[1] * B[3]\n\t"
  2240. "mov %[a], r9\n\t"
  2241. "mov %[b], r10\n\t"
  2242. "ldr %[a], [%[a], #4]\n\t"
  2243. "ldr %[b], [%[b], #12]\n\t"
  2244. "uxth r6, %[a]\n\t"
  2245. "uxth r7, %[b]\n\t"
  2246. #ifdef WOLFSSL_KEIL
  2247. "muls r7, r6, r7\n\t"
  2248. #elif defined(__clang__)
  2249. "muls r7, r6\n\t"
  2250. #else
  2251. "mul r7, r6\n\t"
  2252. #endif
  2253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2254. "adds r4, r4, r7\n\t"
  2255. #else
  2256. "add r4, r4, r7\n\t"
  2257. #endif
  2258. #ifdef WOLFSSL_KEIL
  2259. "adcs r5, r5, %[r]\n\t"
  2260. #elif defined(__clang__)
  2261. "adcs r5, %[r]\n\t"
  2262. #else
  2263. "adc r5, %[r]\n\t"
  2264. #endif
  2265. #ifdef WOLFSSL_KEIL
  2266. "adcs r3, r3, %[r]\n\t"
  2267. #elif defined(__clang__)
  2268. "adcs r3, %[r]\n\t"
  2269. #else
  2270. "adc r3, %[r]\n\t"
  2271. #endif
  2272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2273. "lsrs r7, %[b], #16\n\t"
  2274. #else
  2275. "lsr r7, %[b], #16\n\t"
  2276. #endif
  2277. #ifdef WOLFSSL_KEIL
  2278. "muls r6, r7, r6\n\t"
  2279. #elif defined(__clang__)
  2280. "muls r6, r7\n\t"
  2281. #else
  2282. "mul r6, r7\n\t"
  2283. #endif
  2284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2285. "lsrs r7, r6, #16\n\t"
  2286. #else
  2287. "lsr r7, r6, #16\n\t"
  2288. #endif
  2289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2290. "lsls r6, r6, #16\n\t"
  2291. #else
  2292. "lsl r6, r6, #16\n\t"
  2293. #endif
  2294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2295. "adds r4, r4, r6\n\t"
  2296. #else
  2297. "add r4, r4, r6\n\t"
  2298. #endif
  2299. #ifdef WOLFSSL_KEIL
  2300. "adcs r5, r5, r7\n\t"
  2301. #elif defined(__clang__)
  2302. "adcs r5, r7\n\t"
  2303. #else
  2304. "adc r5, r7\n\t"
  2305. #endif
  2306. #ifdef WOLFSSL_KEIL
  2307. "adcs r3, r3, %[r]\n\t"
  2308. #elif defined(__clang__)
  2309. "adcs r3, %[r]\n\t"
  2310. #else
  2311. "adc r3, %[r]\n\t"
  2312. #endif
  2313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2314. "lsrs r6, %[a], #16\n\t"
  2315. #else
  2316. "lsr r6, %[a], #16\n\t"
  2317. #endif
  2318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2319. "lsrs r7, %[b], #16\n\t"
  2320. #else
  2321. "lsr r7, %[b], #16\n\t"
  2322. #endif
  2323. #ifdef WOLFSSL_KEIL
  2324. "muls r7, r6, r7\n\t"
  2325. #elif defined(__clang__)
  2326. "muls r7, r6\n\t"
  2327. #else
  2328. "mul r7, r6\n\t"
  2329. #endif
  2330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2331. "adds r5, r5, r7\n\t"
  2332. #else
  2333. "add r5, r5, r7\n\t"
  2334. #endif
  2335. #ifdef WOLFSSL_KEIL
  2336. "adcs r3, r3, %[r]\n\t"
  2337. #elif defined(__clang__)
  2338. "adcs r3, %[r]\n\t"
  2339. #else
  2340. "adc r3, %[r]\n\t"
  2341. #endif
  2342. "uxth r7, %[b]\n\t"
  2343. #ifdef WOLFSSL_KEIL
  2344. "muls r6, r7, r6\n\t"
  2345. #elif defined(__clang__)
  2346. "muls r6, r7\n\t"
  2347. #else
  2348. "mul r6, r7\n\t"
  2349. #endif
  2350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2351. "lsrs r7, r6, #16\n\t"
  2352. #else
  2353. "lsr r7, r6, #16\n\t"
  2354. #endif
  2355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2356. "lsls r6, r6, #16\n\t"
  2357. #else
  2358. "lsl r6, r6, #16\n\t"
  2359. #endif
  2360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2361. "adds r4, r4, r6\n\t"
  2362. #else
  2363. "add r4, r4, r6\n\t"
  2364. #endif
  2365. #ifdef WOLFSSL_KEIL
  2366. "adcs r5, r5, r7\n\t"
  2367. #elif defined(__clang__)
  2368. "adcs r5, r7\n\t"
  2369. #else
  2370. "adc r5, r7\n\t"
  2371. #endif
  2372. #ifdef WOLFSSL_KEIL
  2373. "adcs r3, r3, %[r]\n\t"
  2374. #elif defined(__clang__)
  2375. "adcs r3, %[r]\n\t"
  2376. #else
  2377. "adc r3, %[r]\n\t"
  2378. #endif
  2379. "# A[0] * B[4]\n\t"
  2380. "mov %[a], r9\n\t"
  2381. "mov %[b], r10\n\t"
  2382. "ldr %[a], [%[a]]\n\t"
  2383. "ldr %[b], [%[b], #16]\n\t"
  2384. "uxth r6, %[a]\n\t"
  2385. "uxth r7, %[b]\n\t"
  2386. #ifdef WOLFSSL_KEIL
  2387. "muls r7, r6, r7\n\t"
  2388. #elif defined(__clang__)
  2389. "muls r7, r6\n\t"
  2390. #else
  2391. "mul r7, r6\n\t"
  2392. #endif
  2393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2394. "adds r4, r4, r7\n\t"
  2395. #else
  2396. "add r4, r4, r7\n\t"
  2397. #endif
  2398. #ifdef WOLFSSL_KEIL
  2399. "adcs r5, r5, %[r]\n\t"
  2400. #elif defined(__clang__)
  2401. "adcs r5, %[r]\n\t"
  2402. #else
  2403. "adc r5, %[r]\n\t"
  2404. #endif
  2405. #ifdef WOLFSSL_KEIL
  2406. "adcs r3, r3, %[r]\n\t"
  2407. #elif defined(__clang__)
  2408. "adcs r3, %[r]\n\t"
  2409. #else
  2410. "adc r3, %[r]\n\t"
  2411. #endif
  2412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2413. "lsrs r7, %[b], #16\n\t"
  2414. #else
  2415. "lsr r7, %[b], #16\n\t"
  2416. #endif
  2417. #ifdef WOLFSSL_KEIL
  2418. "muls r6, r7, r6\n\t"
  2419. #elif defined(__clang__)
  2420. "muls r6, r7\n\t"
  2421. #else
  2422. "mul r6, r7\n\t"
  2423. #endif
  2424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2425. "lsrs r7, r6, #16\n\t"
  2426. #else
  2427. "lsr r7, r6, #16\n\t"
  2428. #endif
  2429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2430. "lsls r6, r6, #16\n\t"
  2431. #else
  2432. "lsl r6, r6, #16\n\t"
  2433. #endif
  2434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2435. "adds r4, r4, r6\n\t"
  2436. #else
  2437. "add r4, r4, r6\n\t"
  2438. #endif
  2439. #ifdef WOLFSSL_KEIL
  2440. "adcs r5, r5, r7\n\t"
  2441. #elif defined(__clang__)
  2442. "adcs r5, r7\n\t"
  2443. #else
  2444. "adc r5, r7\n\t"
  2445. #endif
  2446. #ifdef WOLFSSL_KEIL
  2447. "adcs r3, r3, %[r]\n\t"
  2448. #elif defined(__clang__)
  2449. "adcs r3, %[r]\n\t"
  2450. #else
  2451. "adc r3, %[r]\n\t"
  2452. #endif
  2453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2454. "lsrs r6, %[a], #16\n\t"
  2455. #else
  2456. "lsr r6, %[a], #16\n\t"
  2457. #endif
  2458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2459. "lsrs r7, %[b], #16\n\t"
  2460. #else
  2461. "lsr r7, %[b], #16\n\t"
  2462. #endif
  2463. #ifdef WOLFSSL_KEIL
  2464. "muls r7, r6, r7\n\t"
  2465. #elif defined(__clang__)
  2466. "muls r7, r6\n\t"
  2467. #else
  2468. "mul r7, r6\n\t"
  2469. #endif
  2470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2471. "adds r5, r5, r7\n\t"
  2472. #else
  2473. "add r5, r5, r7\n\t"
  2474. #endif
  2475. #ifdef WOLFSSL_KEIL
  2476. "adcs r3, r3, %[r]\n\t"
  2477. #elif defined(__clang__)
  2478. "adcs r3, %[r]\n\t"
  2479. #else
  2480. "adc r3, %[r]\n\t"
  2481. #endif
  2482. "uxth r7, %[b]\n\t"
  2483. #ifdef WOLFSSL_KEIL
  2484. "muls r6, r7, r6\n\t"
  2485. #elif defined(__clang__)
  2486. "muls r6, r7\n\t"
  2487. #else
  2488. "mul r6, r7\n\t"
  2489. #endif
  2490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2491. "lsrs r7, r6, #16\n\t"
  2492. #else
  2493. "lsr r7, r6, #16\n\t"
  2494. #endif
  2495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2496. "lsls r6, r6, #16\n\t"
  2497. #else
  2498. "lsl r6, r6, #16\n\t"
  2499. #endif
  2500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2501. "adds r4, r4, r6\n\t"
  2502. #else
  2503. "add r4, r4, r6\n\t"
  2504. #endif
  2505. #ifdef WOLFSSL_KEIL
  2506. "adcs r5, r5, r7\n\t"
  2507. #elif defined(__clang__)
  2508. "adcs r5, r7\n\t"
  2509. #else
  2510. "adc r5, r7\n\t"
  2511. #endif
  2512. #ifdef WOLFSSL_KEIL
  2513. "adcs r3, r3, %[r]\n\t"
  2514. #elif defined(__clang__)
  2515. "adcs r3, %[r]\n\t"
  2516. #else
  2517. "adc r3, %[r]\n\t"
  2518. #endif
  2519. "str r4, [sp, #16]\n\t"
  2520. "# A[0] * B[5]\n\t"
  2521. "movs r4, #0\n\t"
  2522. "mov %[a], r9\n\t"
  2523. "mov %[b], r10\n\t"
  2524. "ldr %[a], [%[a]]\n\t"
  2525. "ldr %[b], [%[b], #20]\n\t"
  2526. "uxth r6, %[a]\n\t"
  2527. "uxth r7, %[b]\n\t"
  2528. #ifdef WOLFSSL_KEIL
  2529. "muls r7, r6, r7\n\t"
  2530. #elif defined(__clang__)
  2531. "muls r7, r6\n\t"
  2532. #else
  2533. "mul r7, r6\n\t"
  2534. #endif
  2535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2536. "adds r5, r5, r7\n\t"
  2537. #else
  2538. "add r5, r5, r7\n\t"
  2539. #endif
  2540. #ifdef WOLFSSL_KEIL
  2541. "adcs r3, r3, %[r]\n\t"
  2542. #elif defined(__clang__)
  2543. "adcs r3, %[r]\n\t"
  2544. #else
  2545. "adc r3, %[r]\n\t"
  2546. #endif
  2547. #ifdef WOLFSSL_KEIL
  2548. "adcs r4, r4, %[r]\n\t"
  2549. #elif defined(__clang__)
  2550. "adcs r4, %[r]\n\t"
  2551. #else
  2552. "adc r4, %[r]\n\t"
  2553. #endif
  2554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2555. "lsrs r7, %[b], #16\n\t"
  2556. #else
  2557. "lsr r7, %[b], #16\n\t"
  2558. #endif
  2559. #ifdef WOLFSSL_KEIL
  2560. "muls r6, r7, r6\n\t"
  2561. #elif defined(__clang__)
  2562. "muls r6, r7\n\t"
  2563. #else
  2564. "mul r6, r7\n\t"
  2565. #endif
  2566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2567. "lsrs r7, r6, #16\n\t"
  2568. #else
  2569. "lsr r7, r6, #16\n\t"
  2570. #endif
  2571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2572. "lsls r6, r6, #16\n\t"
  2573. #else
  2574. "lsl r6, r6, #16\n\t"
  2575. #endif
  2576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2577. "adds r5, r5, r6\n\t"
  2578. #else
  2579. "add r5, r5, r6\n\t"
  2580. #endif
  2581. #ifdef WOLFSSL_KEIL
  2582. "adcs r3, r3, r7\n\t"
  2583. #elif defined(__clang__)
  2584. "adcs r3, r7\n\t"
  2585. #else
  2586. "adc r3, r7\n\t"
  2587. #endif
  2588. #ifdef WOLFSSL_KEIL
  2589. "adcs r4, r4, %[r]\n\t"
  2590. #elif defined(__clang__)
  2591. "adcs r4, %[r]\n\t"
  2592. #else
  2593. "adc r4, %[r]\n\t"
  2594. #endif
  2595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2596. "lsrs r6, %[a], #16\n\t"
  2597. #else
  2598. "lsr r6, %[a], #16\n\t"
  2599. #endif
  2600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2601. "lsrs r7, %[b], #16\n\t"
  2602. #else
  2603. "lsr r7, %[b], #16\n\t"
  2604. #endif
  2605. #ifdef WOLFSSL_KEIL
  2606. "muls r7, r6, r7\n\t"
  2607. #elif defined(__clang__)
  2608. "muls r7, r6\n\t"
  2609. #else
  2610. "mul r7, r6\n\t"
  2611. #endif
  2612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2613. "adds r3, r3, r7\n\t"
  2614. #else
  2615. "add r3, r3, r7\n\t"
  2616. #endif
  2617. #ifdef WOLFSSL_KEIL
  2618. "adcs r4, r4, %[r]\n\t"
  2619. #elif defined(__clang__)
  2620. "adcs r4, %[r]\n\t"
  2621. #else
  2622. "adc r4, %[r]\n\t"
  2623. #endif
  2624. "uxth r7, %[b]\n\t"
  2625. #ifdef WOLFSSL_KEIL
  2626. "muls r6, r7, r6\n\t"
  2627. #elif defined(__clang__)
  2628. "muls r6, r7\n\t"
  2629. #else
  2630. "mul r6, r7\n\t"
  2631. #endif
  2632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2633. "lsrs r7, r6, #16\n\t"
  2634. #else
  2635. "lsr r7, r6, #16\n\t"
  2636. #endif
  2637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2638. "lsls r6, r6, #16\n\t"
  2639. #else
  2640. "lsl r6, r6, #16\n\t"
  2641. #endif
  2642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2643. "adds r5, r5, r6\n\t"
  2644. #else
  2645. "add r5, r5, r6\n\t"
  2646. #endif
  2647. #ifdef WOLFSSL_KEIL
  2648. "adcs r3, r3, r7\n\t"
  2649. #elif defined(__clang__)
  2650. "adcs r3, r7\n\t"
  2651. #else
  2652. "adc r3, r7\n\t"
  2653. #endif
  2654. #ifdef WOLFSSL_KEIL
  2655. "adcs r4, r4, %[r]\n\t"
  2656. #elif defined(__clang__)
  2657. "adcs r4, %[r]\n\t"
  2658. #else
  2659. "adc r4, %[r]\n\t"
  2660. #endif
  2661. "# A[1] * B[4]\n\t"
  2662. "mov %[a], r9\n\t"
  2663. "mov %[b], r10\n\t"
  2664. "ldr %[a], [%[a], #4]\n\t"
  2665. "ldr %[b], [%[b], #16]\n\t"
  2666. "uxth r6, %[a]\n\t"
  2667. "uxth r7, %[b]\n\t"
  2668. #ifdef WOLFSSL_KEIL
  2669. "muls r7, r6, r7\n\t"
  2670. #elif defined(__clang__)
  2671. "muls r7, r6\n\t"
  2672. #else
  2673. "mul r7, r6\n\t"
  2674. #endif
  2675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2676. "adds r5, r5, r7\n\t"
  2677. #else
  2678. "add r5, r5, r7\n\t"
  2679. #endif
  2680. #ifdef WOLFSSL_KEIL
  2681. "adcs r3, r3, %[r]\n\t"
  2682. #elif defined(__clang__)
  2683. "adcs r3, %[r]\n\t"
  2684. #else
  2685. "adc r3, %[r]\n\t"
  2686. #endif
  2687. #ifdef WOLFSSL_KEIL
  2688. "adcs r4, r4, %[r]\n\t"
  2689. #elif defined(__clang__)
  2690. "adcs r4, %[r]\n\t"
  2691. #else
  2692. "adc r4, %[r]\n\t"
  2693. #endif
  2694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2695. "lsrs r7, %[b], #16\n\t"
  2696. #else
  2697. "lsr r7, %[b], #16\n\t"
  2698. #endif
  2699. #ifdef WOLFSSL_KEIL
  2700. "muls r6, r7, r6\n\t"
  2701. #elif defined(__clang__)
  2702. "muls r6, r7\n\t"
  2703. #else
  2704. "mul r6, r7\n\t"
  2705. #endif
  2706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2707. "lsrs r7, r6, #16\n\t"
  2708. #else
  2709. "lsr r7, r6, #16\n\t"
  2710. #endif
  2711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2712. "lsls r6, r6, #16\n\t"
  2713. #else
  2714. "lsl r6, r6, #16\n\t"
  2715. #endif
  2716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2717. "adds r5, r5, r6\n\t"
  2718. #else
  2719. "add r5, r5, r6\n\t"
  2720. #endif
  2721. #ifdef WOLFSSL_KEIL
  2722. "adcs r3, r3, r7\n\t"
  2723. #elif defined(__clang__)
  2724. "adcs r3, r7\n\t"
  2725. #else
  2726. "adc r3, r7\n\t"
  2727. #endif
  2728. #ifdef WOLFSSL_KEIL
  2729. "adcs r4, r4, %[r]\n\t"
  2730. #elif defined(__clang__)
  2731. "adcs r4, %[r]\n\t"
  2732. #else
  2733. "adc r4, %[r]\n\t"
  2734. #endif
  2735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2736. "lsrs r6, %[a], #16\n\t"
  2737. #else
  2738. "lsr r6, %[a], #16\n\t"
  2739. #endif
  2740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2741. "lsrs r7, %[b], #16\n\t"
  2742. #else
  2743. "lsr r7, %[b], #16\n\t"
  2744. #endif
  2745. #ifdef WOLFSSL_KEIL
  2746. "muls r7, r6, r7\n\t"
  2747. #elif defined(__clang__)
  2748. "muls r7, r6\n\t"
  2749. #else
  2750. "mul r7, r6\n\t"
  2751. #endif
  2752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2753. "adds r3, r3, r7\n\t"
  2754. #else
  2755. "add r3, r3, r7\n\t"
  2756. #endif
  2757. #ifdef WOLFSSL_KEIL
  2758. "adcs r4, r4, %[r]\n\t"
  2759. #elif defined(__clang__)
  2760. "adcs r4, %[r]\n\t"
  2761. #else
  2762. "adc r4, %[r]\n\t"
  2763. #endif
  2764. "uxth r7, %[b]\n\t"
  2765. #ifdef WOLFSSL_KEIL
  2766. "muls r6, r7, r6\n\t"
  2767. #elif defined(__clang__)
  2768. "muls r6, r7\n\t"
  2769. #else
  2770. "mul r6, r7\n\t"
  2771. #endif
  2772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2773. "lsrs r7, r6, #16\n\t"
  2774. #else
  2775. "lsr r7, r6, #16\n\t"
  2776. #endif
  2777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2778. "lsls r6, r6, #16\n\t"
  2779. #else
  2780. "lsl r6, r6, #16\n\t"
  2781. #endif
  2782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2783. "adds r5, r5, r6\n\t"
  2784. #else
  2785. "add r5, r5, r6\n\t"
  2786. #endif
  2787. #ifdef WOLFSSL_KEIL
  2788. "adcs r3, r3, r7\n\t"
  2789. #elif defined(__clang__)
  2790. "adcs r3, r7\n\t"
  2791. #else
  2792. "adc r3, r7\n\t"
  2793. #endif
  2794. #ifdef WOLFSSL_KEIL
  2795. "adcs r4, r4, %[r]\n\t"
  2796. #elif defined(__clang__)
  2797. "adcs r4, %[r]\n\t"
  2798. #else
  2799. "adc r4, %[r]\n\t"
  2800. #endif
  2801. "# A[2] * B[3]\n\t"
  2802. "mov %[a], r9\n\t"
  2803. "mov %[b], r10\n\t"
  2804. "ldr %[a], [%[a], #8]\n\t"
  2805. "ldr %[b], [%[b], #12]\n\t"
  2806. "uxth r6, %[a]\n\t"
  2807. "uxth r7, %[b]\n\t"
  2808. #ifdef WOLFSSL_KEIL
  2809. "muls r7, r6, r7\n\t"
  2810. #elif defined(__clang__)
  2811. "muls r7, r6\n\t"
  2812. #else
  2813. "mul r7, r6\n\t"
  2814. #endif
  2815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2816. "adds r5, r5, r7\n\t"
  2817. #else
  2818. "add r5, r5, r7\n\t"
  2819. #endif
  2820. #ifdef WOLFSSL_KEIL
  2821. "adcs r3, r3, %[r]\n\t"
  2822. #elif defined(__clang__)
  2823. "adcs r3, %[r]\n\t"
  2824. #else
  2825. "adc r3, %[r]\n\t"
  2826. #endif
  2827. #ifdef WOLFSSL_KEIL
  2828. "adcs r4, r4, %[r]\n\t"
  2829. #elif defined(__clang__)
  2830. "adcs r4, %[r]\n\t"
  2831. #else
  2832. "adc r4, %[r]\n\t"
  2833. #endif
  2834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2835. "lsrs r7, %[b], #16\n\t"
  2836. #else
  2837. "lsr r7, %[b], #16\n\t"
  2838. #endif
  2839. #ifdef WOLFSSL_KEIL
  2840. "muls r6, r7, r6\n\t"
  2841. #elif defined(__clang__)
  2842. "muls r6, r7\n\t"
  2843. #else
  2844. "mul r6, r7\n\t"
  2845. #endif
  2846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2847. "lsrs r7, r6, #16\n\t"
  2848. #else
  2849. "lsr r7, r6, #16\n\t"
  2850. #endif
  2851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2852. "lsls r6, r6, #16\n\t"
  2853. #else
  2854. "lsl r6, r6, #16\n\t"
  2855. #endif
  2856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2857. "adds r5, r5, r6\n\t"
  2858. #else
  2859. "add r5, r5, r6\n\t"
  2860. #endif
  2861. #ifdef WOLFSSL_KEIL
  2862. "adcs r3, r3, r7\n\t"
  2863. #elif defined(__clang__)
  2864. "adcs r3, r7\n\t"
  2865. #else
  2866. "adc r3, r7\n\t"
  2867. #endif
  2868. #ifdef WOLFSSL_KEIL
  2869. "adcs r4, r4, %[r]\n\t"
  2870. #elif defined(__clang__)
  2871. "adcs r4, %[r]\n\t"
  2872. #else
  2873. "adc r4, %[r]\n\t"
  2874. #endif
  2875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2876. "lsrs r6, %[a], #16\n\t"
  2877. #else
  2878. "lsr r6, %[a], #16\n\t"
  2879. #endif
  2880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2881. "lsrs r7, %[b], #16\n\t"
  2882. #else
  2883. "lsr r7, %[b], #16\n\t"
  2884. #endif
  2885. #ifdef WOLFSSL_KEIL
  2886. "muls r7, r6, r7\n\t"
  2887. #elif defined(__clang__)
  2888. "muls r7, r6\n\t"
  2889. #else
  2890. "mul r7, r6\n\t"
  2891. #endif
  2892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2893. "adds r3, r3, r7\n\t"
  2894. #else
  2895. "add r3, r3, r7\n\t"
  2896. #endif
  2897. #ifdef WOLFSSL_KEIL
  2898. "adcs r4, r4, %[r]\n\t"
  2899. #elif defined(__clang__)
  2900. "adcs r4, %[r]\n\t"
  2901. #else
  2902. "adc r4, %[r]\n\t"
  2903. #endif
  2904. "uxth r7, %[b]\n\t"
  2905. #ifdef WOLFSSL_KEIL
  2906. "muls r6, r7, r6\n\t"
  2907. #elif defined(__clang__)
  2908. "muls r6, r7\n\t"
  2909. #else
  2910. "mul r6, r7\n\t"
  2911. #endif
  2912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2913. "lsrs r7, r6, #16\n\t"
  2914. #else
  2915. "lsr r7, r6, #16\n\t"
  2916. #endif
  2917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2918. "lsls r6, r6, #16\n\t"
  2919. #else
  2920. "lsl r6, r6, #16\n\t"
  2921. #endif
  2922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2923. "adds r5, r5, r6\n\t"
  2924. #else
  2925. "add r5, r5, r6\n\t"
  2926. #endif
  2927. #ifdef WOLFSSL_KEIL
  2928. "adcs r3, r3, r7\n\t"
  2929. #elif defined(__clang__)
  2930. "adcs r3, r7\n\t"
  2931. #else
  2932. "adc r3, r7\n\t"
  2933. #endif
  2934. #ifdef WOLFSSL_KEIL
  2935. "adcs r4, r4, %[r]\n\t"
  2936. #elif defined(__clang__)
  2937. "adcs r4, %[r]\n\t"
  2938. #else
  2939. "adc r4, %[r]\n\t"
  2940. #endif
  2941. "# A[3] * B[2]\n\t"
  2942. "mov %[a], r9\n\t"
  2943. "mov %[b], r10\n\t"
  2944. "ldr %[a], [%[a], #12]\n\t"
  2945. "ldr %[b], [%[b], #8]\n\t"
  2946. "uxth r6, %[a]\n\t"
  2947. "uxth r7, %[b]\n\t"
  2948. #ifdef WOLFSSL_KEIL
  2949. "muls r7, r6, r7\n\t"
  2950. #elif defined(__clang__)
  2951. "muls r7, r6\n\t"
  2952. #else
  2953. "mul r7, r6\n\t"
  2954. #endif
  2955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2956. "adds r5, r5, r7\n\t"
  2957. #else
  2958. "add r5, r5, r7\n\t"
  2959. #endif
  2960. #ifdef WOLFSSL_KEIL
  2961. "adcs r3, r3, %[r]\n\t"
  2962. #elif defined(__clang__)
  2963. "adcs r3, %[r]\n\t"
  2964. #else
  2965. "adc r3, %[r]\n\t"
  2966. #endif
  2967. #ifdef WOLFSSL_KEIL
  2968. "adcs r4, r4, %[r]\n\t"
  2969. #elif defined(__clang__)
  2970. "adcs r4, %[r]\n\t"
  2971. #else
  2972. "adc r4, %[r]\n\t"
  2973. #endif
  2974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2975. "lsrs r7, %[b], #16\n\t"
  2976. #else
  2977. "lsr r7, %[b], #16\n\t"
  2978. #endif
  2979. #ifdef WOLFSSL_KEIL
  2980. "muls r6, r7, r6\n\t"
  2981. #elif defined(__clang__)
  2982. "muls r6, r7\n\t"
  2983. #else
  2984. "mul r6, r7\n\t"
  2985. #endif
  2986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2987. "lsrs r7, r6, #16\n\t"
  2988. #else
  2989. "lsr r7, r6, #16\n\t"
  2990. #endif
  2991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2992. "lsls r6, r6, #16\n\t"
  2993. #else
  2994. "lsl r6, r6, #16\n\t"
  2995. #endif
  2996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  2997. "adds r5, r5, r6\n\t"
  2998. #else
  2999. "add r5, r5, r6\n\t"
  3000. #endif
  3001. #ifdef WOLFSSL_KEIL
  3002. "adcs r3, r3, r7\n\t"
  3003. #elif defined(__clang__)
  3004. "adcs r3, r7\n\t"
  3005. #else
  3006. "adc r3, r7\n\t"
  3007. #endif
  3008. #ifdef WOLFSSL_KEIL
  3009. "adcs r4, r4, %[r]\n\t"
  3010. #elif defined(__clang__)
  3011. "adcs r4, %[r]\n\t"
  3012. #else
  3013. "adc r4, %[r]\n\t"
  3014. #endif
  3015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3016. "lsrs r6, %[a], #16\n\t"
  3017. #else
  3018. "lsr r6, %[a], #16\n\t"
  3019. #endif
  3020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3021. "lsrs r7, %[b], #16\n\t"
  3022. #else
  3023. "lsr r7, %[b], #16\n\t"
  3024. #endif
  3025. #ifdef WOLFSSL_KEIL
  3026. "muls r7, r6, r7\n\t"
  3027. #elif defined(__clang__)
  3028. "muls r7, r6\n\t"
  3029. #else
  3030. "mul r7, r6\n\t"
  3031. #endif
  3032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3033. "adds r3, r3, r7\n\t"
  3034. #else
  3035. "add r3, r3, r7\n\t"
  3036. #endif
  3037. #ifdef WOLFSSL_KEIL
  3038. "adcs r4, r4, %[r]\n\t"
  3039. #elif defined(__clang__)
  3040. "adcs r4, %[r]\n\t"
  3041. #else
  3042. "adc r4, %[r]\n\t"
  3043. #endif
  3044. "uxth r7, %[b]\n\t"
  3045. #ifdef WOLFSSL_KEIL
  3046. "muls r6, r7, r6\n\t"
  3047. #elif defined(__clang__)
  3048. "muls r6, r7\n\t"
  3049. #else
  3050. "mul r6, r7\n\t"
  3051. #endif
  3052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3053. "lsrs r7, r6, #16\n\t"
  3054. #else
  3055. "lsr r7, r6, #16\n\t"
  3056. #endif
  3057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3058. "lsls r6, r6, #16\n\t"
  3059. #else
  3060. "lsl r6, r6, #16\n\t"
  3061. #endif
  3062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3063. "adds r5, r5, r6\n\t"
  3064. #else
  3065. "add r5, r5, r6\n\t"
  3066. #endif
  3067. #ifdef WOLFSSL_KEIL
  3068. "adcs r3, r3, r7\n\t"
  3069. #elif defined(__clang__)
  3070. "adcs r3, r7\n\t"
  3071. #else
  3072. "adc r3, r7\n\t"
  3073. #endif
  3074. #ifdef WOLFSSL_KEIL
  3075. "adcs r4, r4, %[r]\n\t"
  3076. #elif defined(__clang__)
  3077. "adcs r4, %[r]\n\t"
  3078. #else
  3079. "adc r4, %[r]\n\t"
  3080. #endif
  3081. "# A[4] * B[1]\n\t"
  3082. "mov %[a], r9\n\t"
  3083. "mov %[b], r10\n\t"
  3084. "ldr %[a], [%[a], #16]\n\t"
  3085. "ldr %[b], [%[b], #4]\n\t"
  3086. "uxth r6, %[a]\n\t"
  3087. "uxth r7, %[b]\n\t"
  3088. #ifdef WOLFSSL_KEIL
  3089. "muls r7, r6, r7\n\t"
  3090. #elif defined(__clang__)
  3091. "muls r7, r6\n\t"
  3092. #else
  3093. "mul r7, r6\n\t"
  3094. #endif
  3095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3096. "adds r5, r5, r7\n\t"
  3097. #else
  3098. "add r5, r5, r7\n\t"
  3099. #endif
  3100. #ifdef WOLFSSL_KEIL
  3101. "adcs r3, r3, %[r]\n\t"
  3102. #elif defined(__clang__)
  3103. "adcs r3, %[r]\n\t"
  3104. #else
  3105. "adc r3, %[r]\n\t"
  3106. #endif
  3107. #ifdef WOLFSSL_KEIL
  3108. "adcs r4, r4, %[r]\n\t"
  3109. #elif defined(__clang__)
  3110. "adcs r4, %[r]\n\t"
  3111. #else
  3112. "adc r4, %[r]\n\t"
  3113. #endif
  3114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3115. "lsrs r7, %[b], #16\n\t"
  3116. #else
  3117. "lsr r7, %[b], #16\n\t"
  3118. #endif
  3119. #ifdef WOLFSSL_KEIL
  3120. "muls r6, r7, r6\n\t"
  3121. #elif defined(__clang__)
  3122. "muls r6, r7\n\t"
  3123. #else
  3124. "mul r6, r7\n\t"
  3125. #endif
  3126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3127. "lsrs r7, r6, #16\n\t"
  3128. #else
  3129. "lsr r7, r6, #16\n\t"
  3130. #endif
  3131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3132. "lsls r6, r6, #16\n\t"
  3133. #else
  3134. "lsl r6, r6, #16\n\t"
  3135. #endif
  3136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3137. "adds r5, r5, r6\n\t"
  3138. #else
  3139. "add r5, r5, r6\n\t"
  3140. #endif
  3141. #ifdef WOLFSSL_KEIL
  3142. "adcs r3, r3, r7\n\t"
  3143. #elif defined(__clang__)
  3144. "adcs r3, r7\n\t"
  3145. #else
  3146. "adc r3, r7\n\t"
  3147. #endif
  3148. #ifdef WOLFSSL_KEIL
  3149. "adcs r4, r4, %[r]\n\t"
  3150. #elif defined(__clang__)
  3151. "adcs r4, %[r]\n\t"
  3152. #else
  3153. "adc r4, %[r]\n\t"
  3154. #endif
  3155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3156. "lsrs r6, %[a], #16\n\t"
  3157. #else
  3158. "lsr r6, %[a], #16\n\t"
  3159. #endif
  3160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3161. "lsrs r7, %[b], #16\n\t"
  3162. #else
  3163. "lsr r7, %[b], #16\n\t"
  3164. #endif
  3165. #ifdef WOLFSSL_KEIL
  3166. "muls r7, r6, r7\n\t"
  3167. #elif defined(__clang__)
  3168. "muls r7, r6\n\t"
  3169. #else
  3170. "mul r7, r6\n\t"
  3171. #endif
  3172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3173. "adds r3, r3, r7\n\t"
  3174. #else
  3175. "add r3, r3, r7\n\t"
  3176. #endif
  3177. #ifdef WOLFSSL_KEIL
  3178. "adcs r4, r4, %[r]\n\t"
  3179. #elif defined(__clang__)
  3180. "adcs r4, %[r]\n\t"
  3181. #else
  3182. "adc r4, %[r]\n\t"
  3183. #endif
  3184. "uxth r7, %[b]\n\t"
  3185. #ifdef WOLFSSL_KEIL
  3186. "muls r6, r7, r6\n\t"
  3187. #elif defined(__clang__)
  3188. "muls r6, r7\n\t"
  3189. #else
  3190. "mul r6, r7\n\t"
  3191. #endif
  3192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3193. "lsrs r7, r6, #16\n\t"
  3194. #else
  3195. "lsr r7, r6, #16\n\t"
  3196. #endif
  3197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3198. "lsls r6, r6, #16\n\t"
  3199. #else
  3200. "lsl r6, r6, #16\n\t"
  3201. #endif
  3202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3203. "adds r5, r5, r6\n\t"
  3204. #else
  3205. "add r5, r5, r6\n\t"
  3206. #endif
  3207. #ifdef WOLFSSL_KEIL
  3208. "adcs r3, r3, r7\n\t"
  3209. #elif defined(__clang__)
  3210. "adcs r3, r7\n\t"
  3211. #else
  3212. "adc r3, r7\n\t"
  3213. #endif
  3214. #ifdef WOLFSSL_KEIL
  3215. "adcs r4, r4, %[r]\n\t"
  3216. #elif defined(__clang__)
  3217. "adcs r4, %[r]\n\t"
  3218. #else
  3219. "adc r4, %[r]\n\t"
  3220. #endif
  3221. "# A[5] * B[0]\n\t"
  3222. "mov %[a], r9\n\t"
  3223. "mov %[b], r10\n\t"
  3224. "ldr %[a], [%[a], #20]\n\t"
  3225. "ldr %[b], [%[b]]\n\t"
  3226. "uxth r6, %[a]\n\t"
  3227. "uxth r7, %[b]\n\t"
  3228. #ifdef WOLFSSL_KEIL
  3229. "muls r7, r6, r7\n\t"
  3230. #elif defined(__clang__)
  3231. "muls r7, r6\n\t"
  3232. #else
  3233. "mul r7, r6\n\t"
  3234. #endif
  3235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3236. "adds r5, r5, r7\n\t"
  3237. #else
  3238. "add r5, r5, r7\n\t"
  3239. #endif
  3240. #ifdef WOLFSSL_KEIL
  3241. "adcs r3, r3, %[r]\n\t"
  3242. #elif defined(__clang__)
  3243. "adcs r3, %[r]\n\t"
  3244. #else
  3245. "adc r3, %[r]\n\t"
  3246. #endif
  3247. #ifdef WOLFSSL_KEIL
  3248. "adcs r4, r4, %[r]\n\t"
  3249. #elif defined(__clang__)
  3250. "adcs r4, %[r]\n\t"
  3251. #else
  3252. "adc r4, %[r]\n\t"
  3253. #endif
  3254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3255. "lsrs r7, %[b], #16\n\t"
  3256. #else
  3257. "lsr r7, %[b], #16\n\t"
  3258. #endif
  3259. #ifdef WOLFSSL_KEIL
  3260. "muls r6, r7, r6\n\t"
  3261. #elif defined(__clang__)
  3262. "muls r6, r7\n\t"
  3263. #else
  3264. "mul r6, r7\n\t"
  3265. #endif
  3266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3267. "lsrs r7, r6, #16\n\t"
  3268. #else
  3269. "lsr r7, r6, #16\n\t"
  3270. #endif
  3271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3272. "lsls r6, r6, #16\n\t"
  3273. #else
  3274. "lsl r6, r6, #16\n\t"
  3275. #endif
  3276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3277. "adds r5, r5, r6\n\t"
  3278. #else
  3279. "add r5, r5, r6\n\t"
  3280. #endif
  3281. #ifdef WOLFSSL_KEIL
  3282. "adcs r3, r3, r7\n\t"
  3283. #elif defined(__clang__)
  3284. "adcs r3, r7\n\t"
  3285. #else
  3286. "adc r3, r7\n\t"
  3287. #endif
  3288. #ifdef WOLFSSL_KEIL
  3289. "adcs r4, r4, %[r]\n\t"
  3290. #elif defined(__clang__)
  3291. "adcs r4, %[r]\n\t"
  3292. #else
  3293. "adc r4, %[r]\n\t"
  3294. #endif
  3295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3296. "lsrs r6, %[a], #16\n\t"
  3297. #else
  3298. "lsr r6, %[a], #16\n\t"
  3299. #endif
  3300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3301. "lsrs r7, %[b], #16\n\t"
  3302. #else
  3303. "lsr r7, %[b], #16\n\t"
  3304. #endif
  3305. #ifdef WOLFSSL_KEIL
  3306. "muls r7, r6, r7\n\t"
  3307. #elif defined(__clang__)
  3308. "muls r7, r6\n\t"
  3309. #else
  3310. "mul r7, r6\n\t"
  3311. #endif
  3312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3313. "adds r3, r3, r7\n\t"
  3314. #else
  3315. "add r3, r3, r7\n\t"
  3316. #endif
  3317. #ifdef WOLFSSL_KEIL
  3318. "adcs r4, r4, %[r]\n\t"
  3319. #elif defined(__clang__)
  3320. "adcs r4, %[r]\n\t"
  3321. #else
  3322. "adc r4, %[r]\n\t"
  3323. #endif
  3324. "uxth r7, %[b]\n\t"
  3325. #ifdef WOLFSSL_KEIL
  3326. "muls r6, r7, r6\n\t"
  3327. #elif defined(__clang__)
  3328. "muls r6, r7\n\t"
  3329. #else
  3330. "mul r6, r7\n\t"
  3331. #endif
  3332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3333. "lsrs r7, r6, #16\n\t"
  3334. #else
  3335. "lsr r7, r6, #16\n\t"
  3336. #endif
  3337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3338. "lsls r6, r6, #16\n\t"
  3339. #else
  3340. "lsl r6, r6, #16\n\t"
  3341. #endif
  3342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3343. "adds r5, r5, r6\n\t"
  3344. #else
  3345. "add r5, r5, r6\n\t"
  3346. #endif
  3347. #ifdef WOLFSSL_KEIL
  3348. "adcs r3, r3, r7\n\t"
  3349. #elif defined(__clang__)
  3350. "adcs r3, r7\n\t"
  3351. #else
  3352. "adc r3, r7\n\t"
  3353. #endif
  3354. #ifdef WOLFSSL_KEIL
  3355. "adcs r4, r4, %[r]\n\t"
  3356. #elif defined(__clang__)
  3357. "adcs r4, %[r]\n\t"
  3358. #else
  3359. "adc r4, %[r]\n\t"
  3360. #endif
  3361. "str r5, [sp, #20]\n\t"
  3362. "# A[6] * B[0]\n\t"
  3363. "movs r5, #0\n\t"
  3364. "mov %[a], r9\n\t"
  3365. "mov %[b], r10\n\t"
  3366. "ldr %[a], [%[a], #24]\n\t"
  3367. "ldr %[b], [%[b]]\n\t"
  3368. "uxth r6, %[a]\n\t"
  3369. "uxth r7, %[b]\n\t"
  3370. #ifdef WOLFSSL_KEIL
  3371. "muls r7, r6, r7\n\t"
  3372. #elif defined(__clang__)
  3373. "muls r7, r6\n\t"
  3374. #else
  3375. "mul r7, r6\n\t"
  3376. #endif
  3377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3378. "adds r3, r3, r7\n\t"
  3379. #else
  3380. "add r3, r3, r7\n\t"
  3381. #endif
  3382. #ifdef WOLFSSL_KEIL
  3383. "adcs r4, r4, %[r]\n\t"
  3384. #elif defined(__clang__)
  3385. "adcs r4, %[r]\n\t"
  3386. #else
  3387. "adc r4, %[r]\n\t"
  3388. #endif
  3389. #ifdef WOLFSSL_KEIL
  3390. "adcs r5, r5, %[r]\n\t"
  3391. #elif defined(__clang__)
  3392. "adcs r5, %[r]\n\t"
  3393. #else
  3394. "adc r5, %[r]\n\t"
  3395. #endif
  3396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3397. "lsrs r7, %[b], #16\n\t"
  3398. #else
  3399. "lsr r7, %[b], #16\n\t"
  3400. #endif
  3401. #ifdef WOLFSSL_KEIL
  3402. "muls r6, r7, r6\n\t"
  3403. #elif defined(__clang__)
  3404. "muls r6, r7\n\t"
  3405. #else
  3406. "mul r6, r7\n\t"
  3407. #endif
  3408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3409. "lsrs r7, r6, #16\n\t"
  3410. #else
  3411. "lsr r7, r6, #16\n\t"
  3412. #endif
  3413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3414. "lsls r6, r6, #16\n\t"
  3415. #else
  3416. "lsl r6, r6, #16\n\t"
  3417. #endif
  3418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3419. "adds r3, r3, r6\n\t"
  3420. #else
  3421. "add r3, r3, r6\n\t"
  3422. #endif
  3423. #ifdef WOLFSSL_KEIL
  3424. "adcs r4, r4, r7\n\t"
  3425. #elif defined(__clang__)
  3426. "adcs r4, r7\n\t"
  3427. #else
  3428. "adc r4, r7\n\t"
  3429. #endif
  3430. #ifdef WOLFSSL_KEIL
  3431. "adcs r5, r5, %[r]\n\t"
  3432. #elif defined(__clang__)
  3433. "adcs r5, %[r]\n\t"
  3434. #else
  3435. "adc r5, %[r]\n\t"
  3436. #endif
  3437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3438. "lsrs r6, %[a], #16\n\t"
  3439. #else
  3440. "lsr r6, %[a], #16\n\t"
  3441. #endif
  3442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3443. "lsrs r7, %[b], #16\n\t"
  3444. #else
  3445. "lsr r7, %[b], #16\n\t"
  3446. #endif
  3447. #ifdef WOLFSSL_KEIL
  3448. "muls r7, r6, r7\n\t"
  3449. #elif defined(__clang__)
  3450. "muls r7, r6\n\t"
  3451. #else
  3452. "mul r7, r6\n\t"
  3453. #endif
  3454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3455. "adds r4, r4, r7\n\t"
  3456. #else
  3457. "add r4, r4, r7\n\t"
  3458. #endif
  3459. #ifdef WOLFSSL_KEIL
  3460. "adcs r5, r5, %[r]\n\t"
  3461. #elif defined(__clang__)
  3462. "adcs r5, %[r]\n\t"
  3463. #else
  3464. "adc r5, %[r]\n\t"
  3465. #endif
  3466. "uxth r7, %[b]\n\t"
  3467. #ifdef WOLFSSL_KEIL
  3468. "muls r6, r7, r6\n\t"
  3469. #elif defined(__clang__)
  3470. "muls r6, r7\n\t"
  3471. #else
  3472. "mul r6, r7\n\t"
  3473. #endif
  3474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3475. "lsrs r7, r6, #16\n\t"
  3476. #else
  3477. "lsr r7, r6, #16\n\t"
  3478. #endif
  3479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3480. "lsls r6, r6, #16\n\t"
  3481. #else
  3482. "lsl r6, r6, #16\n\t"
  3483. #endif
  3484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3485. "adds r3, r3, r6\n\t"
  3486. #else
  3487. "add r3, r3, r6\n\t"
  3488. #endif
  3489. #ifdef WOLFSSL_KEIL
  3490. "adcs r4, r4, r7\n\t"
  3491. #elif defined(__clang__)
  3492. "adcs r4, r7\n\t"
  3493. #else
  3494. "adc r4, r7\n\t"
  3495. #endif
  3496. #ifdef WOLFSSL_KEIL
  3497. "adcs r5, r5, %[r]\n\t"
  3498. #elif defined(__clang__)
  3499. "adcs r5, %[r]\n\t"
  3500. #else
  3501. "adc r5, %[r]\n\t"
  3502. #endif
  3503. "# A[5] * B[1]\n\t"
  3504. "mov %[a], r9\n\t"
  3505. "mov %[b], r10\n\t"
  3506. "ldr %[a], [%[a], #20]\n\t"
  3507. "ldr %[b], [%[b], #4]\n\t"
  3508. "uxth r6, %[a]\n\t"
  3509. "uxth r7, %[b]\n\t"
  3510. #ifdef WOLFSSL_KEIL
  3511. "muls r7, r6, r7\n\t"
  3512. #elif defined(__clang__)
  3513. "muls r7, r6\n\t"
  3514. #else
  3515. "mul r7, r6\n\t"
  3516. #endif
  3517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3518. "adds r3, r3, r7\n\t"
  3519. #else
  3520. "add r3, r3, r7\n\t"
  3521. #endif
  3522. #ifdef WOLFSSL_KEIL
  3523. "adcs r4, r4, %[r]\n\t"
  3524. #elif defined(__clang__)
  3525. "adcs r4, %[r]\n\t"
  3526. #else
  3527. "adc r4, %[r]\n\t"
  3528. #endif
  3529. #ifdef WOLFSSL_KEIL
  3530. "adcs r5, r5, %[r]\n\t"
  3531. #elif defined(__clang__)
  3532. "adcs r5, %[r]\n\t"
  3533. #else
  3534. "adc r5, %[r]\n\t"
  3535. #endif
  3536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3537. "lsrs r7, %[b], #16\n\t"
  3538. #else
  3539. "lsr r7, %[b], #16\n\t"
  3540. #endif
  3541. #ifdef WOLFSSL_KEIL
  3542. "muls r6, r7, r6\n\t"
  3543. #elif defined(__clang__)
  3544. "muls r6, r7\n\t"
  3545. #else
  3546. "mul r6, r7\n\t"
  3547. #endif
  3548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3549. "lsrs r7, r6, #16\n\t"
  3550. #else
  3551. "lsr r7, r6, #16\n\t"
  3552. #endif
  3553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3554. "lsls r6, r6, #16\n\t"
  3555. #else
  3556. "lsl r6, r6, #16\n\t"
  3557. #endif
  3558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3559. "adds r3, r3, r6\n\t"
  3560. #else
  3561. "add r3, r3, r6\n\t"
  3562. #endif
  3563. #ifdef WOLFSSL_KEIL
  3564. "adcs r4, r4, r7\n\t"
  3565. #elif defined(__clang__)
  3566. "adcs r4, r7\n\t"
  3567. #else
  3568. "adc r4, r7\n\t"
  3569. #endif
  3570. #ifdef WOLFSSL_KEIL
  3571. "adcs r5, r5, %[r]\n\t"
  3572. #elif defined(__clang__)
  3573. "adcs r5, %[r]\n\t"
  3574. #else
  3575. "adc r5, %[r]\n\t"
  3576. #endif
  3577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3578. "lsrs r6, %[a], #16\n\t"
  3579. #else
  3580. "lsr r6, %[a], #16\n\t"
  3581. #endif
  3582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3583. "lsrs r7, %[b], #16\n\t"
  3584. #else
  3585. "lsr r7, %[b], #16\n\t"
  3586. #endif
  3587. #ifdef WOLFSSL_KEIL
  3588. "muls r7, r6, r7\n\t"
  3589. #elif defined(__clang__)
  3590. "muls r7, r6\n\t"
  3591. #else
  3592. "mul r7, r6\n\t"
  3593. #endif
  3594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3595. "adds r4, r4, r7\n\t"
  3596. #else
  3597. "add r4, r4, r7\n\t"
  3598. #endif
  3599. #ifdef WOLFSSL_KEIL
  3600. "adcs r5, r5, %[r]\n\t"
  3601. #elif defined(__clang__)
  3602. "adcs r5, %[r]\n\t"
  3603. #else
  3604. "adc r5, %[r]\n\t"
  3605. #endif
  3606. "uxth r7, %[b]\n\t"
  3607. #ifdef WOLFSSL_KEIL
  3608. "muls r6, r7, r6\n\t"
  3609. #elif defined(__clang__)
  3610. "muls r6, r7\n\t"
  3611. #else
  3612. "mul r6, r7\n\t"
  3613. #endif
  3614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3615. "lsrs r7, r6, #16\n\t"
  3616. #else
  3617. "lsr r7, r6, #16\n\t"
  3618. #endif
  3619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3620. "lsls r6, r6, #16\n\t"
  3621. #else
  3622. "lsl r6, r6, #16\n\t"
  3623. #endif
  3624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3625. "adds r3, r3, r6\n\t"
  3626. #else
  3627. "add r3, r3, r6\n\t"
  3628. #endif
  3629. #ifdef WOLFSSL_KEIL
  3630. "adcs r4, r4, r7\n\t"
  3631. #elif defined(__clang__)
  3632. "adcs r4, r7\n\t"
  3633. #else
  3634. "adc r4, r7\n\t"
  3635. #endif
  3636. #ifdef WOLFSSL_KEIL
  3637. "adcs r5, r5, %[r]\n\t"
  3638. #elif defined(__clang__)
  3639. "adcs r5, %[r]\n\t"
  3640. #else
  3641. "adc r5, %[r]\n\t"
  3642. #endif
  3643. "# A[4] * B[2]\n\t"
  3644. "mov %[a], r9\n\t"
  3645. "mov %[b], r10\n\t"
  3646. "ldr %[a], [%[a], #16]\n\t"
  3647. "ldr %[b], [%[b], #8]\n\t"
  3648. "uxth r6, %[a]\n\t"
  3649. "uxth r7, %[b]\n\t"
  3650. #ifdef WOLFSSL_KEIL
  3651. "muls r7, r6, r7\n\t"
  3652. #elif defined(__clang__)
  3653. "muls r7, r6\n\t"
  3654. #else
  3655. "mul r7, r6\n\t"
  3656. #endif
  3657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3658. "adds r3, r3, r7\n\t"
  3659. #else
  3660. "add r3, r3, r7\n\t"
  3661. #endif
  3662. #ifdef WOLFSSL_KEIL
  3663. "adcs r4, r4, %[r]\n\t"
  3664. #elif defined(__clang__)
  3665. "adcs r4, %[r]\n\t"
  3666. #else
  3667. "adc r4, %[r]\n\t"
  3668. #endif
  3669. #ifdef WOLFSSL_KEIL
  3670. "adcs r5, r5, %[r]\n\t"
  3671. #elif defined(__clang__)
  3672. "adcs r5, %[r]\n\t"
  3673. #else
  3674. "adc r5, %[r]\n\t"
  3675. #endif
  3676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3677. "lsrs r7, %[b], #16\n\t"
  3678. #else
  3679. "lsr r7, %[b], #16\n\t"
  3680. #endif
  3681. #ifdef WOLFSSL_KEIL
  3682. "muls r6, r7, r6\n\t"
  3683. #elif defined(__clang__)
  3684. "muls r6, r7\n\t"
  3685. #else
  3686. "mul r6, r7\n\t"
  3687. #endif
  3688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3689. "lsrs r7, r6, #16\n\t"
  3690. #else
  3691. "lsr r7, r6, #16\n\t"
  3692. #endif
  3693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3694. "lsls r6, r6, #16\n\t"
  3695. #else
  3696. "lsl r6, r6, #16\n\t"
  3697. #endif
  3698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3699. "adds r3, r3, r6\n\t"
  3700. #else
  3701. "add r3, r3, r6\n\t"
  3702. #endif
  3703. #ifdef WOLFSSL_KEIL
  3704. "adcs r4, r4, r7\n\t"
  3705. #elif defined(__clang__)
  3706. "adcs r4, r7\n\t"
  3707. #else
  3708. "adc r4, r7\n\t"
  3709. #endif
  3710. #ifdef WOLFSSL_KEIL
  3711. "adcs r5, r5, %[r]\n\t"
  3712. #elif defined(__clang__)
  3713. "adcs r5, %[r]\n\t"
  3714. #else
  3715. "adc r5, %[r]\n\t"
  3716. #endif
  3717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3718. "lsrs r6, %[a], #16\n\t"
  3719. #else
  3720. "lsr r6, %[a], #16\n\t"
  3721. #endif
  3722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3723. "lsrs r7, %[b], #16\n\t"
  3724. #else
  3725. "lsr r7, %[b], #16\n\t"
  3726. #endif
  3727. #ifdef WOLFSSL_KEIL
  3728. "muls r7, r6, r7\n\t"
  3729. #elif defined(__clang__)
  3730. "muls r7, r6\n\t"
  3731. #else
  3732. "mul r7, r6\n\t"
  3733. #endif
  3734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3735. "adds r4, r4, r7\n\t"
  3736. #else
  3737. "add r4, r4, r7\n\t"
  3738. #endif
  3739. #ifdef WOLFSSL_KEIL
  3740. "adcs r5, r5, %[r]\n\t"
  3741. #elif defined(__clang__)
  3742. "adcs r5, %[r]\n\t"
  3743. #else
  3744. "adc r5, %[r]\n\t"
  3745. #endif
  3746. "uxth r7, %[b]\n\t"
  3747. #ifdef WOLFSSL_KEIL
  3748. "muls r6, r7, r6\n\t"
  3749. #elif defined(__clang__)
  3750. "muls r6, r7\n\t"
  3751. #else
  3752. "mul r6, r7\n\t"
  3753. #endif
  3754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3755. "lsrs r7, r6, #16\n\t"
  3756. #else
  3757. "lsr r7, r6, #16\n\t"
  3758. #endif
  3759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3760. "lsls r6, r6, #16\n\t"
  3761. #else
  3762. "lsl r6, r6, #16\n\t"
  3763. #endif
  3764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3765. "adds r3, r3, r6\n\t"
  3766. #else
  3767. "add r3, r3, r6\n\t"
  3768. #endif
  3769. #ifdef WOLFSSL_KEIL
  3770. "adcs r4, r4, r7\n\t"
  3771. #elif defined(__clang__)
  3772. "adcs r4, r7\n\t"
  3773. #else
  3774. "adc r4, r7\n\t"
  3775. #endif
  3776. #ifdef WOLFSSL_KEIL
  3777. "adcs r5, r5, %[r]\n\t"
  3778. #elif defined(__clang__)
  3779. "adcs r5, %[r]\n\t"
  3780. #else
  3781. "adc r5, %[r]\n\t"
  3782. #endif
  3783. "# A[3] * B[3]\n\t"
  3784. "mov %[a], r9\n\t"
  3785. "mov %[b], r10\n\t"
  3786. "ldr %[a], [%[a], #12]\n\t"
  3787. "ldr %[b], [%[b], #12]\n\t"
  3788. "uxth r6, %[a]\n\t"
  3789. "uxth r7, %[b]\n\t"
  3790. #ifdef WOLFSSL_KEIL
  3791. "muls r7, r6, r7\n\t"
  3792. #elif defined(__clang__)
  3793. "muls r7, r6\n\t"
  3794. #else
  3795. "mul r7, r6\n\t"
  3796. #endif
  3797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3798. "adds r3, r3, r7\n\t"
  3799. #else
  3800. "add r3, r3, r7\n\t"
  3801. #endif
  3802. #ifdef WOLFSSL_KEIL
  3803. "adcs r4, r4, %[r]\n\t"
  3804. #elif defined(__clang__)
  3805. "adcs r4, %[r]\n\t"
  3806. #else
  3807. "adc r4, %[r]\n\t"
  3808. #endif
  3809. #ifdef WOLFSSL_KEIL
  3810. "adcs r5, r5, %[r]\n\t"
  3811. #elif defined(__clang__)
  3812. "adcs r5, %[r]\n\t"
  3813. #else
  3814. "adc r5, %[r]\n\t"
  3815. #endif
  3816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3817. "lsrs r7, %[b], #16\n\t"
  3818. #else
  3819. "lsr r7, %[b], #16\n\t"
  3820. #endif
  3821. #ifdef WOLFSSL_KEIL
  3822. "muls r6, r7, r6\n\t"
  3823. #elif defined(__clang__)
  3824. "muls r6, r7\n\t"
  3825. #else
  3826. "mul r6, r7\n\t"
  3827. #endif
  3828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3829. "lsrs r7, r6, #16\n\t"
  3830. #else
  3831. "lsr r7, r6, #16\n\t"
  3832. #endif
  3833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3834. "lsls r6, r6, #16\n\t"
  3835. #else
  3836. "lsl r6, r6, #16\n\t"
  3837. #endif
  3838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3839. "adds r3, r3, r6\n\t"
  3840. #else
  3841. "add r3, r3, r6\n\t"
  3842. #endif
  3843. #ifdef WOLFSSL_KEIL
  3844. "adcs r4, r4, r7\n\t"
  3845. #elif defined(__clang__)
  3846. "adcs r4, r7\n\t"
  3847. #else
  3848. "adc r4, r7\n\t"
  3849. #endif
  3850. #ifdef WOLFSSL_KEIL
  3851. "adcs r5, r5, %[r]\n\t"
  3852. #elif defined(__clang__)
  3853. "adcs r5, %[r]\n\t"
  3854. #else
  3855. "adc r5, %[r]\n\t"
  3856. #endif
  3857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3858. "lsrs r6, %[a], #16\n\t"
  3859. #else
  3860. "lsr r6, %[a], #16\n\t"
  3861. #endif
  3862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3863. "lsrs r7, %[b], #16\n\t"
  3864. #else
  3865. "lsr r7, %[b], #16\n\t"
  3866. #endif
  3867. #ifdef WOLFSSL_KEIL
  3868. "muls r7, r6, r7\n\t"
  3869. #elif defined(__clang__)
  3870. "muls r7, r6\n\t"
  3871. #else
  3872. "mul r7, r6\n\t"
  3873. #endif
  3874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3875. "adds r4, r4, r7\n\t"
  3876. #else
  3877. "add r4, r4, r7\n\t"
  3878. #endif
  3879. #ifdef WOLFSSL_KEIL
  3880. "adcs r5, r5, %[r]\n\t"
  3881. #elif defined(__clang__)
  3882. "adcs r5, %[r]\n\t"
  3883. #else
  3884. "adc r5, %[r]\n\t"
  3885. #endif
  3886. "uxth r7, %[b]\n\t"
  3887. #ifdef WOLFSSL_KEIL
  3888. "muls r6, r7, r6\n\t"
  3889. #elif defined(__clang__)
  3890. "muls r6, r7\n\t"
  3891. #else
  3892. "mul r6, r7\n\t"
  3893. #endif
  3894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3895. "lsrs r7, r6, #16\n\t"
  3896. #else
  3897. "lsr r7, r6, #16\n\t"
  3898. #endif
  3899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3900. "lsls r6, r6, #16\n\t"
  3901. #else
  3902. "lsl r6, r6, #16\n\t"
  3903. #endif
  3904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3905. "adds r3, r3, r6\n\t"
  3906. #else
  3907. "add r3, r3, r6\n\t"
  3908. #endif
  3909. #ifdef WOLFSSL_KEIL
  3910. "adcs r4, r4, r7\n\t"
  3911. #elif defined(__clang__)
  3912. "adcs r4, r7\n\t"
  3913. #else
  3914. "adc r4, r7\n\t"
  3915. #endif
  3916. #ifdef WOLFSSL_KEIL
  3917. "adcs r5, r5, %[r]\n\t"
  3918. #elif defined(__clang__)
  3919. "adcs r5, %[r]\n\t"
  3920. #else
  3921. "adc r5, %[r]\n\t"
  3922. #endif
  3923. "# A[2] * B[4]\n\t"
  3924. "mov %[a], r9\n\t"
  3925. "mov %[b], r10\n\t"
  3926. "ldr %[a], [%[a], #8]\n\t"
  3927. "ldr %[b], [%[b], #16]\n\t"
  3928. "uxth r6, %[a]\n\t"
  3929. "uxth r7, %[b]\n\t"
  3930. #ifdef WOLFSSL_KEIL
  3931. "muls r7, r6, r7\n\t"
  3932. #elif defined(__clang__)
  3933. "muls r7, r6\n\t"
  3934. #else
  3935. "mul r7, r6\n\t"
  3936. #endif
  3937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3938. "adds r3, r3, r7\n\t"
  3939. #else
  3940. "add r3, r3, r7\n\t"
  3941. #endif
  3942. #ifdef WOLFSSL_KEIL
  3943. "adcs r4, r4, %[r]\n\t"
  3944. #elif defined(__clang__)
  3945. "adcs r4, %[r]\n\t"
  3946. #else
  3947. "adc r4, %[r]\n\t"
  3948. #endif
  3949. #ifdef WOLFSSL_KEIL
  3950. "adcs r5, r5, %[r]\n\t"
  3951. #elif defined(__clang__)
  3952. "adcs r5, %[r]\n\t"
  3953. #else
  3954. "adc r5, %[r]\n\t"
  3955. #endif
  3956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3957. "lsrs r7, %[b], #16\n\t"
  3958. #else
  3959. "lsr r7, %[b], #16\n\t"
  3960. #endif
  3961. #ifdef WOLFSSL_KEIL
  3962. "muls r6, r7, r6\n\t"
  3963. #elif defined(__clang__)
  3964. "muls r6, r7\n\t"
  3965. #else
  3966. "mul r6, r7\n\t"
  3967. #endif
  3968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3969. "lsrs r7, r6, #16\n\t"
  3970. #else
  3971. "lsr r7, r6, #16\n\t"
  3972. #endif
  3973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3974. "lsls r6, r6, #16\n\t"
  3975. #else
  3976. "lsl r6, r6, #16\n\t"
  3977. #endif
  3978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3979. "adds r3, r3, r6\n\t"
  3980. #else
  3981. "add r3, r3, r6\n\t"
  3982. #endif
  3983. #ifdef WOLFSSL_KEIL
  3984. "adcs r4, r4, r7\n\t"
  3985. #elif defined(__clang__)
  3986. "adcs r4, r7\n\t"
  3987. #else
  3988. "adc r4, r7\n\t"
  3989. #endif
  3990. #ifdef WOLFSSL_KEIL
  3991. "adcs r5, r5, %[r]\n\t"
  3992. #elif defined(__clang__)
  3993. "adcs r5, %[r]\n\t"
  3994. #else
  3995. "adc r5, %[r]\n\t"
  3996. #endif
  3997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  3998. "lsrs r6, %[a], #16\n\t"
  3999. #else
  4000. "lsr r6, %[a], #16\n\t"
  4001. #endif
  4002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4003. "lsrs r7, %[b], #16\n\t"
  4004. #else
  4005. "lsr r7, %[b], #16\n\t"
  4006. #endif
  4007. #ifdef WOLFSSL_KEIL
  4008. "muls r7, r6, r7\n\t"
  4009. #elif defined(__clang__)
  4010. "muls r7, r6\n\t"
  4011. #else
  4012. "mul r7, r6\n\t"
  4013. #endif
  4014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4015. "adds r4, r4, r7\n\t"
  4016. #else
  4017. "add r4, r4, r7\n\t"
  4018. #endif
  4019. #ifdef WOLFSSL_KEIL
  4020. "adcs r5, r5, %[r]\n\t"
  4021. #elif defined(__clang__)
  4022. "adcs r5, %[r]\n\t"
  4023. #else
  4024. "adc r5, %[r]\n\t"
  4025. #endif
  4026. "uxth r7, %[b]\n\t"
  4027. #ifdef WOLFSSL_KEIL
  4028. "muls r6, r7, r6\n\t"
  4029. #elif defined(__clang__)
  4030. "muls r6, r7\n\t"
  4031. #else
  4032. "mul r6, r7\n\t"
  4033. #endif
  4034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4035. "lsrs r7, r6, #16\n\t"
  4036. #else
  4037. "lsr r7, r6, #16\n\t"
  4038. #endif
  4039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4040. "lsls r6, r6, #16\n\t"
  4041. #else
  4042. "lsl r6, r6, #16\n\t"
  4043. #endif
  4044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4045. "adds r3, r3, r6\n\t"
  4046. #else
  4047. "add r3, r3, r6\n\t"
  4048. #endif
  4049. #ifdef WOLFSSL_KEIL
  4050. "adcs r4, r4, r7\n\t"
  4051. #elif defined(__clang__)
  4052. "adcs r4, r7\n\t"
  4053. #else
  4054. "adc r4, r7\n\t"
  4055. #endif
  4056. #ifdef WOLFSSL_KEIL
  4057. "adcs r5, r5, %[r]\n\t"
  4058. #elif defined(__clang__)
  4059. "adcs r5, %[r]\n\t"
  4060. #else
  4061. "adc r5, %[r]\n\t"
  4062. #endif
  4063. "# A[1] * B[5]\n\t"
  4064. "mov %[a], r9\n\t"
  4065. "mov %[b], r10\n\t"
  4066. "ldr %[a], [%[a], #4]\n\t"
  4067. "ldr %[b], [%[b], #20]\n\t"
  4068. "uxth r6, %[a]\n\t"
  4069. "uxth r7, %[b]\n\t"
  4070. #ifdef WOLFSSL_KEIL
  4071. "muls r7, r6, r7\n\t"
  4072. #elif defined(__clang__)
  4073. "muls r7, r6\n\t"
  4074. #else
  4075. "mul r7, r6\n\t"
  4076. #endif
  4077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4078. "adds r3, r3, r7\n\t"
  4079. #else
  4080. "add r3, r3, r7\n\t"
  4081. #endif
  4082. #ifdef WOLFSSL_KEIL
  4083. "adcs r4, r4, %[r]\n\t"
  4084. #elif defined(__clang__)
  4085. "adcs r4, %[r]\n\t"
  4086. #else
  4087. "adc r4, %[r]\n\t"
  4088. #endif
  4089. #ifdef WOLFSSL_KEIL
  4090. "adcs r5, r5, %[r]\n\t"
  4091. #elif defined(__clang__)
  4092. "adcs r5, %[r]\n\t"
  4093. #else
  4094. "adc r5, %[r]\n\t"
  4095. #endif
  4096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4097. "lsrs r7, %[b], #16\n\t"
  4098. #else
  4099. "lsr r7, %[b], #16\n\t"
  4100. #endif
  4101. #ifdef WOLFSSL_KEIL
  4102. "muls r6, r7, r6\n\t"
  4103. #elif defined(__clang__)
  4104. "muls r6, r7\n\t"
  4105. #else
  4106. "mul r6, r7\n\t"
  4107. #endif
  4108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4109. "lsrs r7, r6, #16\n\t"
  4110. #else
  4111. "lsr r7, r6, #16\n\t"
  4112. #endif
  4113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4114. "lsls r6, r6, #16\n\t"
  4115. #else
  4116. "lsl r6, r6, #16\n\t"
  4117. #endif
  4118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4119. "adds r3, r3, r6\n\t"
  4120. #else
  4121. "add r3, r3, r6\n\t"
  4122. #endif
  4123. #ifdef WOLFSSL_KEIL
  4124. "adcs r4, r4, r7\n\t"
  4125. #elif defined(__clang__)
  4126. "adcs r4, r7\n\t"
  4127. #else
  4128. "adc r4, r7\n\t"
  4129. #endif
  4130. #ifdef WOLFSSL_KEIL
  4131. "adcs r5, r5, %[r]\n\t"
  4132. #elif defined(__clang__)
  4133. "adcs r5, %[r]\n\t"
  4134. #else
  4135. "adc r5, %[r]\n\t"
  4136. #endif
  4137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4138. "lsrs r6, %[a], #16\n\t"
  4139. #else
  4140. "lsr r6, %[a], #16\n\t"
  4141. #endif
  4142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4143. "lsrs r7, %[b], #16\n\t"
  4144. #else
  4145. "lsr r7, %[b], #16\n\t"
  4146. #endif
  4147. #ifdef WOLFSSL_KEIL
  4148. "muls r7, r6, r7\n\t"
  4149. #elif defined(__clang__)
  4150. "muls r7, r6\n\t"
  4151. #else
  4152. "mul r7, r6\n\t"
  4153. #endif
  4154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4155. "adds r4, r4, r7\n\t"
  4156. #else
  4157. "add r4, r4, r7\n\t"
  4158. #endif
  4159. #ifdef WOLFSSL_KEIL
  4160. "adcs r5, r5, %[r]\n\t"
  4161. #elif defined(__clang__)
  4162. "adcs r5, %[r]\n\t"
  4163. #else
  4164. "adc r5, %[r]\n\t"
  4165. #endif
  4166. "uxth r7, %[b]\n\t"
  4167. #ifdef WOLFSSL_KEIL
  4168. "muls r6, r7, r6\n\t"
  4169. #elif defined(__clang__)
  4170. "muls r6, r7\n\t"
  4171. #else
  4172. "mul r6, r7\n\t"
  4173. #endif
  4174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4175. "lsrs r7, r6, #16\n\t"
  4176. #else
  4177. "lsr r7, r6, #16\n\t"
  4178. #endif
  4179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4180. "lsls r6, r6, #16\n\t"
  4181. #else
  4182. "lsl r6, r6, #16\n\t"
  4183. #endif
  4184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4185. "adds r3, r3, r6\n\t"
  4186. #else
  4187. "add r3, r3, r6\n\t"
  4188. #endif
  4189. #ifdef WOLFSSL_KEIL
  4190. "adcs r4, r4, r7\n\t"
  4191. #elif defined(__clang__)
  4192. "adcs r4, r7\n\t"
  4193. #else
  4194. "adc r4, r7\n\t"
  4195. #endif
  4196. #ifdef WOLFSSL_KEIL
  4197. "adcs r5, r5, %[r]\n\t"
  4198. #elif defined(__clang__)
  4199. "adcs r5, %[r]\n\t"
  4200. #else
  4201. "adc r5, %[r]\n\t"
  4202. #endif
  4203. "# A[0] * B[6]\n\t"
  4204. "mov %[a], r9\n\t"
  4205. "mov %[b], r10\n\t"
  4206. "ldr %[a], [%[a]]\n\t"
  4207. "ldr %[b], [%[b], #24]\n\t"
  4208. "uxth r6, %[a]\n\t"
  4209. "uxth r7, %[b]\n\t"
  4210. #ifdef WOLFSSL_KEIL
  4211. "muls r7, r6, r7\n\t"
  4212. #elif defined(__clang__)
  4213. "muls r7, r6\n\t"
  4214. #else
  4215. "mul r7, r6\n\t"
  4216. #endif
  4217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4218. "adds r3, r3, r7\n\t"
  4219. #else
  4220. "add r3, r3, r7\n\t"
  4221. #endif
  4222. #ifdef WOLFSSL_KEIL
  4223. "adcs r4, r4, %[r]\n\t"
  4224. #elif defined(__clang__)
  4225. "adcs r4, %[r]\n\t"
  4226. #else
  4227. "adc r4, %[r]\n\t"
  4228. #endif
  4229. #ifdef WOLFSSL_KEIL
  4230. "adcs r5, r5, %[r]\n\t"
  4231. #elif defined(__clang__)
  4232. "adcs r5, %[r]\n\t"
  4233. #else
  4234. "adc r5, %[r]\n\t"
  4235. #endif
  4236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4237. "lsrs r7, %[b], #16\n\t"
  4238. #else
  4239. "lsr r7, %[b], #16\n\t"
  4240. #endif
  4241. #ifdef WOLFSSL_KEIL
  4242. "muls r6, r7, r6\n\t"
  4243. #elif defined(__clang__)
  4244. "muls r6, r7\n\t"
  4245. #else
  4246. "mul r6, r7\n\t"
  4247. #endif
  4248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4249. "lsrs r7, r6, #16\n\t"
  4250. #else
  4251. "lsr r7, r6, #16\n\t"
  4252. #endif
  4253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4254. "lsls r6, r6, #16\n\t"
  4255. #else
  4256. "lsl r6, r6, #16\n\t"
  4257. #endif
  4258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4259. "adds r3, r3, r6\n\t"
  4260. #else
  4261. "add r3, r3, r6\n\t"
  4262. #endif
  4263. #ifdef WOLFSSL_KEIL
  4264. "adcs r4, r4, r7\n\t"
  4265. #elif defined(__clang__)
  4266. "adcs r4, r7\n\t"
  4267. #else
  4268. "adc r4, r7\n\t"
  4269. #endif
  4270. #ifdef WOLFSSL_KEIL
  4271. "adcs r5, r5, %[r]\n\t"
  4272. #elif defined(__clang__)
  4273. "adcs r5, %[r]\n\t"
  4274. #else
  4275. "adc r5, %[r]\n\t"
  4276. #endif
  4277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4278. "lsrs r6, %[a], #16\n\t"
  4279. #else
  4280. "lsr r6, %[a], #16\n\t"
  4281. #endif
  4282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4283. "lsrs r7, %[b], #16\n\t"
  4284. #else
  4285. "lsr r7, %[b], #16\n\t"
  4286. #endif
  4287. #ifdef WOLFSSL_KEIL
  4288. "muls r7, r6, r7\n\t"
  4289. #elif defined(__clang__)
  4290. "muls r7, r6\n\t"
  4291. #else
  4292. "mul r7, r6\n\t"
  4293. #endif
  4294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4295. "adds r4, r4, r7\n\t"
  4296. #else
  4297. "add r4, r4, r7\n\t"
  4298. #endif
  4299. #ifdef WOLFSSL_KEIL
  4300. "adcs r5, r5, %[r]\n\t"
  4301. #elif defined(__clang__)
  4302. "adcs r5, %[r]\n\t"
  4303. #else
  4304. "adc r5, %[r]\n\t"
  4305. #endif
  4306. "uxth r7, %[b]\n\t"
  4307. #ifdef WOLFSSL_KEIL
  4308. "muls r6, r7, r6\n\t"
  4309. #elif defined(__clang__)
  4310. "muls r6, r7\n\t"
  4311. #else
  4312. "mul r6, r7\n\t"
  4313. #endif
  4314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4315. "lsrs r7, r6, #16\n\t"
  4316. #else
  4317. "lsr r7, r6, #16\n\t"
  4318. #endif
  4319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4320. "lsls r6, r6, #16\n\t"
  4321. #else
  4322. "lsl r6, r6, #16\n\t"
  4323. #endif
  4324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4325. "adds r3, r3, r6\n\t"
  4326. #else
  4327. "add r3, r3, r6\n\t"
  4328. #endif
  4329. #ifdef WOLFSSL_KEIL
  4330. "adcs r4, r4, r7\n\t"
  4331. #elif defined(__clang__)
  4332. "adcs r4, r7\n\t"
  4333. #else
  4334. "adc r4, r7\n\t"
  4335. #endif
  4336. #ifdef WOLFSSL_KEIL
  4337. "adcs r5, r5, %[r]\n\t"
  4338. #elif defined(__clang__)
  4339. "adcs r5, %[r]\n\t"
  4340. #else
  4341. "adc r5, %[r]\n\t"
  4342. #endif
  4343. "str r3, [sp, #24]\n\t"
  4344. "# A[0] * B[7]\n\t"
  4345. "movs r3, #0\n\t"
  4346. "mov %[a], r9\n\t"
  4347. "mov %[b], r10\n\t"
  4348. "ldr %[a], [%[a]]\n\t"
  4349. "ldr %[b], [%[b], #28]\n\t"
  4350. "uxth r6, %[a]\n\t"
  4351. "uxth r7, %[b]\n\t"
  4352. #ifdef WOLFSSL_KEIL
  4353. "muls r7, r6, r7\n\t"
  4354. #elif defined(__clang__)
  4355. "muls r7, r6\n\t"
  4356. #else
  4357. "mul r7, r6\n\t"
  4358. #endif
  4359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4360. "adds r4, r4, r7\n\t"
  4361. #else
  4362. "add r4, r4, r7\n\t"
  4363. #endif
  4364. #ifdef WOLFSSL_KEIL
  4365. "adcs r5, r5, %[r]\n\t"
  4366. #elif defined(__clang__)
  4367. "adcs r5, %[r]\n\t"
  4368. #else
  4369. "adc r5, %[r]\n\t"
  4370. #endif
  4371. #ifdef WOLFSSL_KEIL
  4372. "adcs r3, r3, %[r]\n\t"
  4373. #elif defined(__clang__)
  4374. "adcs r3, %[r]\n\t"
  4375. #else
  4376. "adc r3, %[r]\n\t"
  4377. #endif
  4378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4379. "lsrs r7, %[b], #16\n\t"
  4380. #else
  4381. "lsr r7, %[b], #16\n\t"
  4382. #endif
  4383. #ifdef WOLFSSL_KEIL
  4384. "muls r6, r7, r6\n\t"
  4385. #elif defined(__clang__)
  4386. "muls r6, r7\n\t"
  4387. #else
  4388. "mul r6, r7\n\t"
  4389. #endif
  4390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4391. "lsrs r7, r6, #16\n\t"
  4392. #else
  4393. "lsr r7, r6, #16\n\t"
  4394. #endif
  4395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4396. "lsls r6, r6, #16\n\t"
  4397. #else
  4398. "lsl r6, r6, #16\n\t"
  4399. #endif
  4400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4401. "adds r4, r4, r6\n\t"
  4402. #else
  4403. "add r4, r4, r6\n\t"
  4404. #endif
  4405. #ifdef WOLFSSL_KEIL
  4406. "adcs r5, r5, r7\n\t"
  4407. #elif defined(__clang__)
  4408. "adcs r5, r7\n\t"
  4409. #else
  4410. "adc r5, r7\n\t"
  4411. #endif
  4412. #ifdef WOLFSSL_KEIL
  4413. "adcs r3, r3, %[r]\n\t"
  4414. #elif defined(__clang__)
  4415. "adcs r3, %[r]\n\t"
  4416. #else
  4417. "adc r3, %[r]\n\t"
  4418. #endif
  4419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4420. "lsrs r6, %[a], #16\n\t"
  4421. #else
  4422. "lsr r6, %[a], #16\n\t"
  4423. #endif
  4424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4425. "lsrs r7, %[b], #16\n\t"
  4426. #else
  4427. "lsr r7, %[b], #16\n\t"
  4428. #endif
  4429. #ifdef WOLFSSL_KEIL
  4430. "muls r7, r6, r7\n\t"
  4431. #elif defined(__clang__)
  4432. "muls r7, r6\n\t"
  4433. #else
  4434. "mul r7, r6\n\t"
  4435. #endif
  4436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4437. "adds r5, r5, r7\n\t"
  4438. #else
  4439. "add r5, r5, r7\n\t"
  4440. #endif
  4441. #ifdef WOLFSSL_KEIL
  4442. "adcs r3, r3, %[r]\n\t"
  4443. #elif defined(__clang__)
  4444. "adcs r3, %[r]\n\t"
  4445. #else
  4446. "adc r3, %[r]\n\t"
  4447. #endif
  4448. "uxth r7, %[b]\n\t"
  4449. #ifdef WOLFSSL_KEIL
  4450. "muls r6, r7, r6\n\t"
  4451. #elif defined(__clang__)
  4452. "muls r6, r7\n\t"
  4453. #else
  4454. "mul r6, r7\n\t"
  4455. #endif
  4456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4457. "lsrs r7, r6, #16\n\t"
  4458. #else
  4459. "lsr r7, r6, #16\n\t"
  4460. #endif
  4461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4462. "lsls r6, r6, #16\n\t"
  4463. #else
  4464. "lsl r6, r6, #16\n\t"
  4465. #endif
  4466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4467. "adds r4, r4, r6\n\t"
  4468. #else
  4469. "add r4, r4, r6\n\t"
  4470. #endif
  4471. #ifdef WOLFSSL_KEIL
  4472. "adcs r5, r5, r7\n\t"
  4473. #elif defined(__clang__)
  4474. "adcs r5, r7\n\t"
  4475. #else
  4476. "adc r5, r7\n\t"
  4477. #endif
  4478. #ifdef WOLFSSL_KEIL
  4479. "adcs r3, r3, %[r]\n\t"
  4480. #elif defined(__clang__)
  4481. "adcs r3, %[r]\n\t"
  4482. #else
  4483. "adc r3, %[r]\n\t"
  4484. #endif
  4485. "# A[1] * B[6]\n\t"
  4486. "mov %[a], r9\n\t"
  4487. "mov %[b], r10\n\t"
  4488. "ldr %[a], [%[a], #4]\n\t"
  4489. "ldr %[b], [%[b], #24]\n\t"
  4490. "uxth r6, %[a]\n\t"
  4491. "uxth r7, %[b]\n\t"
  4492. #ifdef WOLFSSL_KEIL
  4493. "muls r7, r6, r7\n\t"
  4494. #elif defined(__clang__)
  4495. "muls r7, r6\n\t"
  4496. #else
  4497. "mul r7, r6\n\t"
  4498. #endif
  4499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4500. "adds r4, r4, r7\n\t"
  4501. #else
  4502. "add r4, r4, r7\n\t"
  4503. #endif
  4504. #ifdef WOLFSSL_KEIL
  4505. "adcs r5, r5, %[r]\n\t"
  4506. #elif defined(__clang__)
  4507. "adcs r5, %[r]\n\t"
  4508. #else
  4509. "adc r5, %[r]\n\t"
  4510. #endif
  4511. #ifdef WOLFSSL_KEIL
  4512. "adcs r3, r3, %[r]\n\t"
  4513. #elif defined(__clang__)
  4514. "adcs r3, %[r]\n\t"
  4515. #else
  4516. "adc r3, %[r]\n\t"
  4517. #endif
  4518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4519. "lsrs r7, %[b], #16\n\t"
  4520. #else
  4521. "lsr r7, %[b], #16\n\t"
  4522. #endif
  4523. #ifdef WOLFSSL_KEIL
  4524. "muls r6, r7, r6\n\t"
  4525. #elif defined(__clang__)
  4526. "muls r6, r7\n\t"
  4527. #else
  4528. "mul r6, r7\n\t"
  4529. #endif
  4530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4531. "lsrs r7, r6, #16\n\t"
  4532. #else
  4533. "lsr r7, r6, #16\n\t"
  4534. #endif
  4535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4536. "lsls r6, r6, #16\n\t"
  4537. #else
  4538. "lsl r6, r6, #16\n\t"
  4539. #endif
  4540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4541. "adds r4, r4, r6\n\t"
  4542. #else
  4543. "add r4, r4, r6\n\t"
  4544. #endif
  4545. #ifdef WOLFSSL_KEIL
  4546. "adcs r5, r5, r7\n\t"
  4547. #elif defined(__clang__)
  4548. "adcs r5, r7\n\t"
  4549. #else
  4550. "adc r5, r7\n\t"
  4551. #endif
  4552. #ifdef WOLFSSL_KEIL
  4553. "adcs r3, r3, %[r]\n\t"
  4554. #elif defined(__clang__)
  4555. "adcs r3, %[r]\n\t"
  4556. #else
  4557. "adc r3, %[r]\n\t"
  4558. #endif
  4559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4560. "lsrs r6, %[a], #16\n\t"
  4561. #else
  4562. "lsr r6, %[a], #16\n\t"
  4563. #endif
  4564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4565. "lsrs r7, %[b], #16\n\t"
  4566. #else
  4567. "lsr r7, %[b], #16\n\t"
  4568. #endif
  4569. #ifdef WOLFSSL_KEIL
  4570. "muls r7, r6, r7\n\t"
  4571. #elif defined(__clang__)
  4572. "muls r7, r6\n\t"
  4573. #else
  4574. "mul r7, r6\n\t"
  4575. #endif
  4576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4577. "adds r5, r5, r7\n\t"
  4578. #else
  4579. "add r5, r5, r7\n\t"
  4580. #endif
  4581. #ifdef WOLFSSL_KEIL
  4582. "adcs r3, r3, %[r]\n\t"
  4583. #elif defined(__clang__)
  4584. "adcs r3, %[r]\n\t"
  4585. #else
  4586. "adc r3, %[r]\n\t"
  4587. #endif
  4588. "uxth r7, %[b]\n\t"
  4589. #ifdef WOLFSSL_KEIL
  4590. "muls r6, r7, r6\n\t"
  4591. #elif defined(__clang__)
  4592. "muls r6, r7\n\t"
  4593. #else
  4594. "mul r6, r7\n\t"
  4595. #endif
  4596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4597. "lsrs r7, r6, #16\n\t"
  4598. #else
  4599. "lsr r7, r6, #16\n\t"
  4600. #endif
  4601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4602. "lsls r6, r6, #16\n\t"
  4603. #else
  4604. "lsl r6, r6, #16\n\t"
  4605. #endif
  4606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4607. "adds r4, r4, r6\n\t"
  4608. #else
  4609. "add r4, r4, r6\n\t"
  4610. #endif
  4611. #ifdef WOLFSSL_KEIL
  4612. "adcs r5, r5, r7\n\t"
  4613. #elif defined(__clang__)
  4614. "adcs r5, r7\n\t"
  4615. #else
  4616. "adc r5, r7\n\t"
  4617. #endif
  4618. #ifdef WOLFSSL_KEIL
  4619. "adcs r3, r3, %[r]\n\t"
  4620. #elif defined(__clang__)
  4621. "adcs r3, %[r]\n\t"
  4622. #else
  4623. "adc r3, %[r]\n\t"
  4624. #endif
  4625. "# A[2] * B[5]\n\t"
  4626. "mov %[a], r9\n\t"
  4627. "mov %[b], r10\n\t"
  4628. "ldr %[a], [%[a], #8]\n\t"
  4629. "ldr %[b], [%[b], #20]\n\t"
  4630. "uxth r6, %[a]\n\t"
  4631. "uxth r7, %[b]\n\t"
  4632. #ifdef WOLFSSL_KEIL
  4633. "muls r7, r6, r7\n\t"
  4634. #elif defined(__clang__)
  4635. "muls r7, r6\n\t"
  4636. #else
  4637. "mul r7, r6\n\t"
  4638. #endif
  4639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4640. "adds r4, r4, r7\n\t"
  4641. #else
  4642. "add r4, r4, r7\n\t"
  4643. #endif
  4644. #ifdef WOLFSSL_KEIL
  4645. "adcs r5, r5, %[r]\n\t"
  4646. #elif defined(__clang__)
  4647. "adcs r5, %[r]\n\t"
  4648. #else
  4649. "adc r5, %[r]\n\t"
  4650. #endif
  4651. #ifdef WOLFSSL_KEIL
  4652. "adcs r3, r3, %[r]\n\t"
  4653. #elif defined(__clang__)
  4654. "adcs r3, %[r]\n\t"
  4655. #else
  4656. "adc r3, %[r]\n\t"
  4657. #endif
  4658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4659. "lsrs r7, %[b], #16\n\t"
  4660. #else
  4661. "lsr r7, %[b], #16\n\t"
  4662. #endif
  4663. #ifdef WOLFSSL_KEIL
  4664. "muls r6, r7, r6\n\t"
  4665. #elif defined(__clang__)
  4666. "muls r6, r7\n\t"
  4667. #else
  4668. "mul r6, r7\n\t"
  4669. #endif
  4670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4671. "lsrs r7, r6, #16\n\t"
  4672. #else
  4673. "lsr r7, r6, #16\n\t"
  4674. #endif
  4675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4676. "lsls r6, r6, #16\n\t"
  4677. #else
  4678. "lsl r6, r6, #16\n\t"
  4679. #endif
  4680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4681. "adds r4, r4, r6\n\t"
  4682. #else
  4683. "add r4, r4, r6\n\t"
  4684. #endif
  4685. #ifdef WOLFSSL_KEIL
  4686. "adcs r5, r5, r7\n\t"
  4687. #elif defined(__clang__)
  4688. "adcs r5, r7\n\t"
  4689. #else
  4690. "adc r5, r7\n\t"
  4691. #endif
  4692. #ifdef WOLFSSL_KEIL
  4693. "adcs r3, r3, %[r]\n\t"
  4694. #elif defined(__clang__)
  4695. "adcs r3, %[r]\n\t"
  4696. #else
  4697. "adc r3, %[r]\n\t"
  4698. #endif
  4699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4700. "lsrs r6, %[a], #16\n\t"
  4701. #else
  4702. "lsr r6, %[a], #16\n\t"
  4703. #endif
  4704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4705. "lsrs r7, %[b], #16\n\t"
  4706. #else
  4707. "lsr r7, %[b], #16\n\t"
  4708. #endif
  4709. #ifdef WOLFSSL_KEIL
  4710. "muls r7, r6, r7\n\t"
  4711. #elif defined(__clang__)
  4712. "muls r7, r6\n\t"
  4713. #else
  4714. "mul r7, r6\n\t"
  4715. #endif
  4716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4717. "adds r5, r5, r7\n\t"
  4718. #else
  4719. "add r5, r5, r7\n\t"
  4720. #endif
  4721. #ifdef WOLFSSL_KEIL
  4722. "adcs r3, r3, %[r]\n\t"
  4723. #elif defined(__clang__)
  4724. "adcs r3, %[r]\n\t"
  4725. #else
  4726. "adc r3, %[r]\n\t"
  4727. #endif
  4728. "uxth r7, %[b]\n\t"
  4729. #ifdef WOLFSSL_KEIL
  4730. "muls r6, r7, r6\n\t"
  4731. #elif defined(__clang__)
  4732. "muls r6, r7\n\t"
  4733. #else
  4734. "mul r6, r7\n\t"
  4735. #endif
  4736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4737. "lsrs r7, r6, #16\n\t"
  4738. #else
  4739. "lsr r7, r6, #16\n\t"
  4740. #endif
  4741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4742. "lsls r6, r6, #16\n\t"
  4743. #else
  4744. "lsl r6, r6, #16\n\t"
  4745. #endif
  4746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4747. "adds r4, r4, r6\n\t"
  4748. #else
  4749. "add r4, r4, r6\n\t"
  4750. #endif
  4751. #ifdef WOLFSSL_KEIL
  4752. "adcs r5, r5, r7\n\t"
  4753. #elif defined(__clang__)
  4754. "adcs r5, r7\n\t"
  4755. #else
  4756. "adc r5, r7\n\t"
  4757. #endif
  4758. #ifdef WOLFSSL_KEIL
  4759. "adcs r3, r3, %[r]\n\t"
  4760. #elif defined(__clang__)
  4761. "adcs r3, %[r]\n\t"
  4762. #else
  4763. "adc r3, %[r]\n\t"
  4764. #endif
  4765. "# A[3] * B[4]\n\t"
  4766. "mov %[a], r9\n\t"
  4767. "mov %[b], r10\n\t"
  4768. "ldr %[a], [%[a], #12]\n\t"
  4769. "ldr %[b], [%[b], #16]\n\t"
  4770. "uxth r6, %[a]\n\t"
  4771. "uxth r7, %[b]\n\t"
  4772. #ifdef WOLFSSL_KEIL
  4773. "muls r7, r6, r7\n\t"
  4774. #elif defined(__clang__)
  4775. "muls r7, r6\n\t"
  4776. #else
  4777. "mul r7, r6\n\t"
  4778. #endif
  4779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4780. "adds r4, r4, r7\n\t"
  4781. #else
  4782. "add r4, r4, r7\n\t"
  4783. #endif
  4784. #ifdef WOLFSSL_KEIL
  4785. "adcs r5, r5, %[r]\n\t"
  4786. #elif defined(__clang__)
  4787. "adcs r5, %[r]\n\t"
  4788. #else
  4789. "adc r5, %[r]\n\t"
  4790. #endif
  4791. #ifdef WOLFSSL_KEIL
  4792. "adcs r3, r3, %[r]\n\t"
  4793. #elif defined(__clang__)
  4794. "adcs r3, %[r]\n\t"
  4795. #else
  4796. "adc r3, %[r]\n\t"
  4797. #endif
  4798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4799. "lsrs r7, %[b], #16\n\t"
  4800. #else
  4801. "lsr r7, %[b], #16\n\t"
  4802. #endif
  4803. #ifdef WOLFSSL_KEIL
  4804. "muls r6, r7, r6\n\t"
  4805. #elif defined(__clang__)
  4806. "muls r6, r7\n\t"
  4807. #else
  4808. "mul r6, r7\n\t"
  4809. #endif
  4810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4811. "lsrs r7, r6, #16\n\t"
  4812. #else
  4813. "lsr r7, r6, #16\n\t"
  4814. #endif
  4815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4816. "lsls r6, r6, #16\n\t"
  4817. #else
  4818. "lsl r6, r6, #16\n\t"
  4819. #endif
  4820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4821. "adds r4, r4, r6\n\t"
  4822. #else
  4823. "add r4, r4, r6\n\t"
  4824. #endif
  4825. #ifdef WOLFSSL_KEIL
  4826. "adcs r5, r5, r7\n\t"
  4827. #elif defined(__clang__)
  4828. "adcs r5, r7\n\t"
  4829. #else
  4830. "adc r5, r7\n\t"
  4831. #endif
  4832. #ifdef WOLFSSL_KEIL
  4833. "adcs r3, r3, %[r]\n\t"
  4834. #elif defined(__clang__)
  4835. "adcs r3, %[r]\n\t"
  4836. #else
  4837. "adc r3, %[r]\n\t"
  4838. #endif
  4839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4840. "lsrs r6, %[a], #16\n\t"
  4841. #else
  4842. "lsr r6, %[a], #16\n\t"
  4843. #endif
  4844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4845. "lsrs r7, %[b], #16\n\t"
  4846. #else
  4847. "lsr r7, %[b], #16\n\t"
  4848. #endif
  4849. #ifdef WOLFSSL_KEIL
  4850. "muls r7, r6, r7\n\t"
  4851. #elif defined(__clang__)
  4852. "muls r7, r6\n\t"
  4853. #else
  4854. "mul r7, r6\n\t"
  4855. #endif
  4856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4857. "adds r5, r5, r7\n\t"
  4858. #else
  4859. "add r5, r5, r7\n\t"
  4860. #endif
  4861. #ifdef WOLFSSL_KEIL
  4862. "adcs r3, r3, %[r]\n\t"
  4863. #elif defined(__clang__)
  4864. "adcs r3, %[r]\n\t"
  4865. #else
  4866. "adc r3, %[r]\n\t"
  4867. #endif
  4868. "uxth r7, %[b]\n\t"
  4869. #ifdef WOLFSSL_KEIL
  4870. "muls r6, r7, r6\n\t"
  4871. #elif defined(__clang__)
  4872. "muls r6, r7\n\t"
  4873. #else
  4874. "mul r6, r7\n\t"
  4875. #endif
  4876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4877. "lsrs r7, r6, #16\n\t"
  4878. #else
  4879. "lsr r7, r6, #16\n\t"
  4880. #endif
  4881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4882. "lsls r6, r6, #16\n\t"
  4883. #else
  4884. "lsl r6, r6, #16\n\t"
  4885. #endif
  4886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4887. "adds r4, r4, r6\n\t"
  4888. #else
  4889. "add r4, r4, r6\n\t"
  4890. #endif
  4891. #ifdef WOLFSSL_KEIL
  4892. "adcs r5, r5, r7\n\t"
  4893. #elif defined(__clang__)
  4894. "adcs r5, r7\n\t"
  4895. #else
  4896. "adc r5, r7\n\t"
  4897. #endif
  4898. #ifdef WOLFSSL_KEIL
  4899. "adcs r3, r3, %[r]\n\t"
  4900. #elif defined(__clang__)
  4901. "adcs r3, %[r]\n\t"
  4902. #else
  4903. "adc r3, %[r]\n\t"
  4904. #endif
  4905. "# A[4] * B[3]\n\t"
  4906. "mov %[a], r9\n\t"
  4907. "mov %[b], r10\n\t"
  4908. "ldr %[a], [%[a], #16]\n\t"
  4909. "ldr %[b], [%[b], #12]\n\t"
  4910. "uxth r6, %[a]\n\t"
  4911. "uxth r7, %[b]\n\t"
  4912. #ifdef WOLFSSL_KEIL
  4913. "muls r7, r6, r7\n\t"
  4914. #elif defined(__clang__)
  4915. "muls r7, r6\n\t"
  4916. #else
  4917. "mul r7, r6\n\t"
  4918. #endif
  4919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4920. "adds r4, r4, r7\n\t"
  4921. #else
  4922. "add r4, r4, r7\n\t"
  4923. #endif
  4924. #ifdef WOLFSSL_KEIL
  4925. "adcs r5, r5, %[r]\n\t"
  4926. #elif defined(__clang__)
  4927. "adcs r5, %[r]\n\t"
  4928. #else
  4929. "adc r5, %[r]\n\t"
  4930. #endif
  4931. #ifdef WOLFSSL_KEIL
  4932. "adcs r3, r3, %[r]\n\t"
  4933. #elif defined(__clang__)
  4934. "adcs r3, %[r]\n\t"
  4935. #else
  4936. "adc r3, %[r]\n\t"
  4937. #endif
  4938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4939. "lsrs r7, %[b], #16\n\t"
  4940. #else
  4941. "lsr r7, %[b], #16\n\t"
  4942. #endif
  4943. #ifdef WOLFSSL_KEIL
  4944. "muls r6, r7, r6\n\t"
  4945. #elif defined(__clang__)
  4946. "muls r6, r7\n\t"
  4947. #else
  4948. "mul r6, r7\n\t"
  4949. #endif
  4950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4951. "lsrs r7, r6, #16\n\t"
  4952. #else
  4953. "lsr r7, r6, #16\n\t"
  4954. #endif
  4955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4956. "lsls r6, r6, #16\n\t"
  4957. #else
  4958. "lsl r6, r6, #16\n\t"
  4959. #endif
  4960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4961. "adds r4, r4, r6\n\t"
  4962. #else
  4963. "add r4, r4, r6\n\t"
  4964. #endif
  4965. #ifdef WOLFSSL_KEIL
  4966. "adcs r5, r5, r7\n\t"
  4967. #elif defined(__clang__)
  4968. "adcs r5, r7\n\t"
  4969. #else
  4970. "adc r5, r7\n\t"
  4971. #endif
  4972. #ifdef WOLFSSL_KEIL
  4973. "adcs r3, r3, %[r]\n\t"
  4974. #elif defined(__clang__)
  4975. "adcs r3, %[r]\n\t"
  4976. #else
  4977. "adc r3, %[r]\n\t"
  4978. #endif
  4979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4980. "lsrs r6, %[a], #16\n\t"
  4981. #else
  4982. "lsr r6, %[a], #16\n\t"
  4983. #endif
  4984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4985. "lsrs r7, %[b], #16\n\t"
  4986. #else
  4987. "lsr r7, %[b], #16\n\t"
  4988. #endif
  4989. #ifdef WOLFSSL_KEIL
  4990. "muls r7, r6, r7\n\t"
  4991. #elif defined(__clang__)
  4992. "muls r7, r6\n\t"
  4993. #else
  4994. "mul r7, r6\n\t"
  4995. #endif
  4996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  4997. "adds r5, r5, r7\n\t"
  4998. #else
  4999. "add r5, r5, r7\n\t"
  5000. #endif
  5001. #ifdef WOLFSSL_KEIL
  5002. "adcs r3, r3, %[r]\n\t"
  5003. #elif defined(__clang__)
  5004. "adcs r3, %[r]\n\t"
  5005. #else
  5006. "adc r3, %[r]\n\t"
  5007. #endif
  5008. "uxth r7, %[b]\n\t"
  5009. #ifdef WOLFSSL_KEIL
  5010. "muls r6, r7, r6\n\t"
  5011. #elif defined(__clang__)
  5012. "muls r6, r7\n\t"
  5013. #else
  5014. "mul r6, r7\n\t"
  5015. #endif
  5016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5017. "lsrs r7, r6, #16\n\t"
  5018. #else
  5019. "lsr r7, r6, #16\n\t"
  5020. #endif
  5021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5022. "lsls r6, r6, #16\n\t"
  5023. #else
  5024. "lsl r6, r6, #16\n\t"
  5025. #endif
  5026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5027. "adds r4, r4, r6\n\t"
  5028. #else
  5029. "add r4, r4, r6\n\t"
  5030. #endif
  5031. #ifdef WOLFSSL_KEIL
  5032. "adcs r5, r5, r7\n\t"
  5033. #elif defined(__clang__)
  5034. "adcs r5, r7\n\t"
  5035. #else
  5036. "adc r5, r7\n\t"
  5037. #endif
  5038. #ifdef WOLFSSL_KEIL
  5039. "adcs r3, r3, %[r]\n\t"
  5040. #elif defined(__clang__)
  5041. "adcs r3, %[r]\n\t"
  5042. #else
  5043. "adc r3, %[r]\n\t"
  5044. #endif
  5045. "# A[5] * B[2]\n\t"
  5046. "mov %[a], r9\n\t"
  5047. "mov %[b], r10\n\t"
  5048. "ldr %[a], [%[a], #20]\n\t"
  5049. "ldr %[b], [%[b], #8]\n\t"
  5050. "uxth r6, %[a]\n\t"
  5051. "uxth r7, %[b]\n\t"
  5052. #ifdef WOLFSSL_KEIL
  5053. "muls r7, r6, r7\n\t"
  5054. #elif defined(__clang__)
  5055. "muls r7, r6\n\t"
  5056. #else
  5057. "mul r7, r6\n\t"
  5058. #endif
  5059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5060. "adds r4, r4, r7\n\t"
  5061. #else
  5062. "add r4, r4, r7\n\t"
  5063. #endif
  5064. #ifdef WOLFSSL_KEIL
  5065. "adcs r5, r5, %[r]\n\t"
  5066. #elif defined(__clang__)
  5067. "adcs r5, %[r]\n\t"
  5068. #else
  5069. "adc r5, %[r]\n\t"
  5070. #endif
  5071. #ifdef WOLFSSL_KEIL
  5072. "adcs r3, r3, %[r]\n\t"
  5073. #elif defined(__clang__)
  5074. "adcs r3, %[r]\n\t"
  5075. #else
  5076. "adc r3, %[r]\n\t"
  5077. #endif
  5078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5079. "lsrs r7, %[b], #16\n\t"
  5080. #else
  5081. "lsr r7, %[b], #16\n\t"
  5082. #endif
  5083. #ifdef WOLFSSL_KEIL
  5084. "muls r6, r7, r6\n\t"
  5085. #elif defined(__clang__)
  5086. "muls r6, r7\n\t"
  5087. #else
  5088. "mul r6, r7\n\t"
  5089. #endif
  5090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5091. "lsrs r7, r6, #16\n\t"
  5092. #else
  5093. "lsr r7, r6, #16\n\t"
  5094. #endif
  5095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5096. "lsls r6, r6, #16\n\t"
  5097. #else
  5098. "lsl r6, r6, #16\n\t"
  5099. #endif
  5100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5101. "adds r4, r4, r6\n\t"
  5102. #else
  5103. "add r4, r4, r6\n\t"
  5104. #endif
  5105. #ifdef WOLFSSL_KEIL
  5106. "adcs r5, r5, r7\n\t"
  5107. #elif defined(__clang__)
  5108. "adcs r5, r7\n\t"
  5109. #else
  5110. "adc r5, r7\n\t"
  5111. #endif
  5112. #ifdef WOLFSSL_KEIL
  5113. "adcs r3, r3, %[r]\n\t"
  5114. #elif defined(__clang__)
  5115. "adcs r3, %[r]\n\t"
  5116. #else
  5117. "adc r3, %[r]\n\t"
  5118. #endif
  5119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5120. "lsrs r6, %[a], #16\n\t"
  5121. #else
  5122. "lsr r6, %[a], #16\n\t"
  5123. #endif
  5124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5125. "lsrs r7, %[b], #16\n\t"
  5126. #else
  5127. "lsr r7, %[b], #16\n\t"
  5128. #endif
  5129. #ifdef WOLFSSL_KEIL
  5130. "muls r7, r6, r7\n\t"
  5131. #elif defined(__clang__)
  5132. "muls r7, r6\n\t"
  5133. #else
  5134. "mul r7, r6\n\t"
  5135. #endif
  5136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5137. "adds r5, r5, r7\n\t"
  5138. #else
  5139. "add r5, r5, r7\n\t"
  5140. #endif
  5141. #ifdef WOLFSSL_KEIL
  5142. "adcs r3, r3, %[r]\n\t"
  5143. #elif defined(__clang__)
  5144. "adcs r3, %[r]\n\t"
  5145. #else
  5146. "adc r3, %[r]\n\t"
  5147. #endif
  5148. "uxth r7, %[b]\n\t"
  5149. #ifdef WOLFSSL_KEIL
  5150. "muls r6, r7, r6\n\t"
  5151. #elif defined(__clang__)
  5152. "muls r6, r7\n\t"
  5153. #else
  5154. "mul r6, r7\n\t"
  5155. #endif
  5156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5157. "lsrs r7, r6, #16\n\t"
  5158. #else
  5159. "lsr r7, r6, #16\n\t"
  5160. #endif
  5161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5162. "lsls r6, r6, #16\n\t"
  5163. #else
  5164. "lsl r6, r6, #16\n\t"
  5165. #endif
  5166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5167. "adds r4, r4, r6\n\t"
  5168. #else
  5169. "add r4, r4, r6\n\t"
  5170. #endif
  5171. #ifdef WOLFSSL_KEIL
  5172. "adcs r5, r5, r7\n\t"
  5173. #elif defined(__clang__)
  5174. "adcs r5, r7\n\t"
  5175. #else
  5176. "adc r5, r7\n\t"
  5177. #endif
  5178. #ifdef WOLFSSL_KEIL
  5179. "adcs r3, r3, %[r]\n\t"
  5180. #elif defined(__clang__)
  5181. "adcs r3, %[r]\n\t"
  5182. #else
  5183. "adc r3, %[r]\n\t"
  5184. #endif
  5185. "# A[6] * B[1]\n\t"
  5186. "mov %[a], r9\n\t"
  5187. "mov %[b], r10\n\t"
  5188. "ldr %[a], [%[a], #24]\n\t"
  5189. "ldr %[b], [%[b], #4]\n\t"
  5190. "uxth r6, %[a]\n\t"
  5191. "uxth r7, %[b]\n\t"
  5192. #ifdef WOLFSSL_KEIL
  5193. "muls r7, r6, r7\n\t"
  5194. #elif defined(__clang__)
  5195. "muls r7, r6\n\t"
  5196. #else
  5197. "mul r7, r6\n\t"
  5198. #endif
  5199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5200. "adds r4, r4, r7\n\t"
  5201. #else
  5202. "add r4, r4, r7\n\t"
  5203. #endif
  5204. #ifdef WOLFSSL_KEIL
  5205. "adcs r5, r5, %[r]\n\t"
  5206. #elif defined(__clang__)
  5207. "adcs r5, %[r]\n\t"
  5208. #else
  5209. "adc r5, %[r]\n\t"
  5210. #endif
  5211. #ifdef WOLFSSL_KEIL
  5212. "adcs r3, r3, %[r]\n\t"
  5213. #elif defined(__clang__)
  5214. "adcs r3, %[r]\n\t"
  5215. #else
  5216. "adc r3, %[r]\n\t"
  5217. #endif
  5218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5219. "lsrs r7, %[b], #16\n\t"
  5220. #else
  5221. "lsr r7, %[b], #16\n\t"
  5222. #endif
  5223. #ifdef WOLFSSL_KEIL
  5224. "muls r6, r7, r6\n\t"
  5225. #elif defined(__clang__)
  5226. "muls r6, r7\n\t"
  5227. #else
  5228. "mul r6, r7\n\t"
  5229. #endif
  5230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5231. "lsrs r7, r6, #16\n\t"
  5232. #else
  5233. "lsr r7, r6, #16\n\t"
  5234. #endif
  5235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5236. "lsls r6, r6, #16\n\t"
  5237. #else
  5238. "lsl r6, r6, #16\n\t"
  5239. #endif
  5240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5241. "adds r4, r4, r6\n\t"
  5242. #else
  5243. "add r4, r4, r6\n\t"
  5244. #endif
  5245. #ifdef WOLFSSL_KEIL
  5246. "adcs r5, r5, r7\n\t"
  5247. #elif defined(__clang__)
  5248. "adcs r5, r7\n\t"
  5249. #else
  5250. "adc r5, r7\n\t"
  5251. #endif
  5252. #ifdef WOLFSSL_KEIL
  5253. "adcs r3, r3, %[r]\n\t"
  5254. #elif defined(__clang__)
  5255. "adcs r3, %[r]\n\t"
  5256. #else
  5257. "adc r3, %[r]\n\t"
  5258. #endif
  5259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5260. "lsrs r6, %[a], #16\n\t"
  5261. #else
  5262. "lsr r6, %[a], #16\n\t"
  5263. #endif
  5264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5265. "lsrs r7, %[b], #16\n\t"
  5266. #else
  5267. "lsr r7, %[b], #16\n\t"
  5268. #endif
  5269. #ifdef WOLFSSL_KEIL
  5270. "muls r7, r6, r7\n\t"
  5271. #elif defined(__clang__)
  5272. "muls r7, r6\n\t"
  5273. #else
  5274. "mul r7, r6\n\t"
  5275. #endif
  5276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5277. "adds r5, r5, r7\n\t"
  5278. #else
  5279. "add r5, r5, r7\n\t"
  5280. #endif
  5281. #ifdef WOLFSSL_KEIL
  5282. "adcs r3, r3, %[r]\n\t"
  5283. #elif defined(__clang__)
  5284. "adcs r3, %[r]\n\t"
  5285. #else
  5286. "adc r3, %[r]\n\t"
  5287. #endif
  5288. "uxth r7, %[b]\n\t"
  5289. #ifdef WOLFSSL_KEIL
  5290. "muls r6, r7, r6\n\t"
  5291. #elif defined(__clang__)
  5292. "muls r6, r7\n\t"
  5293. #else
  5294. "mul r6, r7\n\t"
  5295. #endif
  5296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5297. "lsrs r7, r6, #16\n\t"
  5298. #else
  5299. "lsr r7, r6, #16\n\t"
  5300. #endif
  5301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5302. "lsls r6, r6, #16\n\t"
  5303. #else
  5304. "lsl r6, r6, #16\n\t"
  5305. #endif
  5306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5307. "adds r4, r4, r6\n\t"
  5308. #else
  5309. "add r4, r4, r6\n\t"
  5310. #endif
  5311. #ifdef WOLFSSL_KEIL
  5312. "adcs r5, r5, r7\n\t"
  5313. #elif defined(__clang__)
  5314. "adcs r5, r7\n\t"
  5315. #else
  5316. "adc r5, r7\n\t"
  5317. #endif
  5318. #ifdef WOLFSSL_KEIL
  5319. "adcs r3, r3, %[r]\n\t"
  5320. #elif defined(__clang__)
  5321. "adcs r3, %[r]\n\t"
  5322. #else
  5323. "adc r3, %[r]\n\t"
  5324. #endif
  5325. "# A[7] * B[0]\n\t"
  5326. "mov %[a], r9\n\t"
  5327. "mov %[b], r10\n\t"
  5328. "ldr %[a], [%[a], #28]\n\t"
  5329. "ldr %[b], [%[b]]\n\t"
  5330. "uxth r6, %[a]\n\t"
  5331. "uxth r7, %[b]\n\t"
  5332. #ifdef WOLFSSL_KEIL
  5333. "muls r7, r6, r7\n\t"
  5334. #elif defined(__clang__)
  5335. "muls r7, r6\n\t"
  5336. #else
  5337. "mul r7, r6\n\t"
  5338. #endif
  5339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5340. "adds r4, r4, r7\n\t"
  5341. #else
  5342. "add r4, r4, r7\n\t"
  5343. #endif
  5344. #ifdef WOLFSSL_KEIL
  5345. "adcs r5, r5, %[r]\n\t"
  5346. #elif defined(__clang__)
  5347. "adcs r5, %[r]\n\t"
  5348. #else
  5349. "adc r5, %[r]\n\t"
  5350. #endif
  5351. #ifdef WOLFSSL_KEIL
  5352. "adcs r3, r3, %[r]\n\t"
  5353. #elif defined(__clang__)
  5354. "adcs r3, %[r]\n\t"
  5355. #else
  5356. "adc r3, %[r]\n\t"
  5357. #endif
  5358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5359. "lsrs r7, %[b], #16\n\t"
  5360. #else
  5361. "lsr r7, %[b], #16\n\t"
  5362. #endif
  5363. #ifdef WOLFSSL_KEIL
  5364. "muls r6, r7, r6\n\t"
  5365. #elif defined(__clang__)
  5366. "muls r6, r7\n\t"
  5367. #else
  5368. "mul r6, r7\n\t"
  5369. #endif
  5370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5371. "lsrs r7, r6, #16\n\t"
  5372. #else
  5373. "lsr r7, r6, #16\n\t"
  5374. #endif
  5375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5376. "lsls r6, r6, #16\n\t"
  5377. #else
  5378. "lsl r6, r6, #16\n\t"
  5379. #endif
  5380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5381. "adds r4, r4, r6\n\t"
  5382. #else
  5383. "add r4, r4, r6\n\t"
  5384. #endif
  5385. #ifdef WOLFSSL_KEIL
  5386. "adcs r5, r5, r7\n\t"
  5387. #elif defined(__clang__)
  5388. "adcs r5, r7\n\t"
  5389. #else
  5390. "adc r5, r7\n\t"
  5391. #endif
  5392. #ifdef WOLFSSL_KEIL
  5393. "adcs r3, r3, %[r]\n\t"
  5394. #elif defined(__clang__)
  5395. "adcs r3, %[r]\n\t"
  5396. #else
  5397. "adc r3, %[r]\n\t"
  5398. #endif
  5399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5400. "lsrs r6, %[a], #16\n\t"
  5401. #else
  5402. "lsr r6, %[a], #16\n\t"
  5403. #endif
  5404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5405. "lsrs r7, %[b], #16\n\t"
  5406. #else
  5407. "lsr r7, %[b], #16\n\t"
  5408. #endif
  5409. #ifdef WOLFSSL_KEIL
  5410. "muls r7, r6, r7\n\t"
  5411. #elif defined(__clang__)
  5412. "muls r7, r6\n\t"
  5413. #else
  5414. "mul r7, r6\n\t"
  5415. #endif
  5416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5417. "adds r5, r5, r7\n\t"
  5418. #else
  5419. "add r5, r5, r7\n\t"
  5420. #endif
  5421. #ifdef WOLFSSL_KEIL
  5422. "adcs r3, r3, %[r]\n\t"
  5423. #elif defined(__clang__)
  5424. "adcs r3, %[r]\n\t"
  5425. #else
  5426. "adc r3, %[r]\n\t"
  5427. #endif
  5428. "uxth r7, %[b]\n\t"
  5429. #ifdef WOLFSSL_KEIL
  5430. "muls r6, r7, r6\n\t"
  5431. #elif defined(__clang__)
  5432. "muls r6, r7\n\t"
  5433. #else
  5434. "mul r6, r7\n\t"
  5435. #endif
  5436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5437. "lsrs r7, r6, #16\n\t"
  5438. #else
  5439. "lsr r7, r6, #16\n\t"
  5440. #endif
  5441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5442. "lsls r6, r6, #16\n\t"
  5443. #else
  5444. "lsl r6, r6, #16\n\t"
  5445. #endif
  5446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5447. "adds r4, r4, r6\n\t"
  5448. #else
  5449. "add r4, r4, r6\n\t"
  5450. #endif
  5451. #ifdef WOLFSSL_KEIL
  5452. "adcs r5, r5, r7\n\t"
  5453. #elif defined(__clang__)
  5454. "adcs r5, r7\n\t"
  5455. #else
  5456. "adc r5, r7\n\t"
  5457. #endif
  5458. #ifdef WOLFSSL_KEIL
  5459. "adcs r3, r3, %[r]\n\t"
  5460. #elif defined(__clang__)
  5461. "adcs r3, %[r]\n\t"
  5462. #else
  5463. "adc r3, %[r]\n\t"
  5464. #endif
  5465. "str r4, [sp, #28]\n\t"
  5466. "# A[7] * B[1]\n\t"
  5467. "movs r4, #0\n\t"
  5468. "mov %[a], r9\n\t"
  5469. "mov %[b], r10\n\t"
  5470. "ldr %[a], [%[a], #28]\n\t"
  5471. "ldr %[b], [%[b], #4]\n\t"
  5472. "uxth r6, %[a]\n\t"
  5473. "uxth r7, %[b]\n\t"
  5474. #ifdef WOLFSSL_KEIL
  5475. "muls r7, r6, r7\n\t"
  5476. #elif defined(__clang__)
  5477. "muls r7, r6\n\t"
  5478. #else
  5479. "mul r7, r6\n\t"
  5480. #endif
  5481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5482. "adds r5, r5, r7\n\t"
  5483. #else
  5484. "add r5, r5, r7\n\t"
  5485. #endif
  5486. #ifdef WOLFSSL_KEIL
  5487. "adcs r3, r3, %[r]\n\t"
  5488. #elif defined(__clang__)
  5489. "adcs r3, %[r]\n\t"
  5490. #else
  5491. "adc r3, %[r]\n\t"
  5492. #endif
  5493. #ifdef WOLFSSL_KEIL
  5494. "adcs r4, r4, %[r]\n\t"
  5495. #elif defined(__clang__)
  5496. "adcs r4, %[r]\n\t"
  5497. #else
  5498. "adc r4, %[r]\n\t"
  5499. #endif
  5500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5501. "lsrs r7, %[b], #16\n\t"
  5502. #else
  5503. "lsr r7, %[b], #16\n\t"
  5504. #endif
  5505. #ifdef WOLFSSL_KEIL
  5506. "muls r6, r7, r6\n\t"
  5507. #elif defined(__clang__)
  5508. "muls r6, r7\n\t"
  5509. #else
  5510. "mul r6, r7\n\t"
  5511. #endif
  5512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5513. "lsrs r7, r6, #16\n\t"
  5514. #else
  5515. "lsr r7, r6, #16\n\t"
  5516. #endif
  5517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5518. "lsls r6, r6, #16\n\t"
  5519. #else
  5520. "lsl r6, r6, #16\n\t"
  5521. #endif
  5522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5523. "adds r5, r5, r6\n\t"
  5524. #else
  5525. "add r5, r5, r6\n\t"
  5526. #endif
  5527. #ifdef WOLFSSL_KEIL
  5528. "adcs r3, r3, r7\n\t"
  5529. #elif defined(__clang__)
  5530. "adcs r3, r7\n\t"
  5531. #else
  5532. "adc r3, r7\n\t"
  5533. #endif
  5534. #ifdef WOLFSSL_KEIL
  5535. "adcs r4, r4, %[r]\n\t"
  5536. #elif defined(__clang__)
  5537. "adcs r4, %[r]\n\t"
  5538. #else
  5539. "adc r4, %[r]\n\t"
  5540. #endif
  5541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5542. "lsrs r6, %[a], #16\n\t"
  5543. #else
  5544. "lsr r6, %[a], #16\n\t"
  5545. #endif
  5546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5547. "lsrs r7, %[b], #16\n\t"
  5548. #else
  5549. "lsr r7, %[b], #16\n\t"
  5550. #endif
  5551. #ifdef WOLFSSL_KEIL
  5552. "muls r7, r6, r7\n\t"
  5553. #elif defined(__clang__)
  5554. "muls r7, r6\n\t"
  5555. #else
  5556. "mul r7, r6\n\t"
  5557. #endif
  5558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5559. "adds r3, r3, r7\n\t"
  5560. #else
  5561. "add r3, r3, r7\n\t"
  5562. #endif
  5563. #ifdef WOLFSSL_KEIL
  5564. "adcs r4, r4, %[r]\n\t"
  5565. #elif defined(__clang__)
  5566. "adcs r4, %[r]\n\t"
  5567. #else
  5568. "adc r4, %[r]\n\t"
  5569. #endif
  5570. "uxth r7, %[b]\n\t"
  5571. #ifdef WOLFSSL_KEIL
  5572. "muls r6, r7, r6\n\t"
  5573. #elif defined(__clang__)
  5574. "muls r6, r7\n\t"
  5575. #else
  5576. "mul r6, r7\n\t"
  5577. #endif
  5578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5579. "lsrs r7, r6, #16\n\t"
  5580. #else
  5581. "lsr r7, r6, #16\n\t"
  5582. #endif
  5583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5584. "lsls r6, r6, #16\n\t"
  5585. #else
  5586. "lsl r6, r6, #16\n\t"
  5587. #endif
  5588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5589. "adds r5, r5, r6\n\t"
  5590. #else
  5591. "add r5, r5, r6\n\t"
  5592. #endif
  5593. #ifdef WOLFSSL_KEIL
  5594. "adcs r3, r3, r7\n\t"
  5595. #elif defined(__clang__)
  5596. "adcs r3, r7\n\t"
  5597. #else
  5598. "adc r3, r7\n\t"
  5599. #endif
  5600. #ifdef WOLFSSL_KEIL
  5601. "adcs r4, r4, %[r]\n\t"
  5602. #elif defined(__clang__)
  5603. "adcs r4, %[r]\n\t"
  5604. #else
  5605. "adc r4, %[r]\n\t"
  5606. #endif
  5607. "# A[6] * B[2]\n\t"
  5608. "mov %[a], r9\n\t"
  5609. "mov %[b], r10\n\t"
  5610. "ldr %[a], [%[a], #24]\n\t"
  5611. "ldr %[b], [%[b], #8]\n\t"
  5612. "uxth r6, %[a]\n\t"
  5613. "uxth r7, %[b]\n\t"
  5614. #ifdef WOLFSSL_KEIL
  5615. "muls r7, r6, r7\n\t"
  5616. #elif defined(__clang__)
  5617. "muls r7, r6\n\t"
  5618. #else
  5619. "mul r7, r6\n\t"
  5620. #endif
  5621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5622. "adds r5, r5, r7\n\t"
  5623. #else
  5624. "add r5, r5, r7\n\t"
  5625. #endif
  5626. #ifdef WOLFSSL_KEIL
  5627. "adcs r3, r3, %[r]\n\t"
  5628. #elif defined(__clang__)
  5629. "adcs r3, %[r]\n\t"
  5630. #else
  5631. "adc r3, %[r]\n\t"
  5632. #endif
  5633. #ifdef WOLFSSL_KEIL
  5634. "adcs r4, r4, %[r]\n\t"
  5635. #elif defined(__clang__)
  5636. "adcs r4, %[r]\n\t"
  5637. #else
  5638. "adc r4, %[r]\n\t"
  5639. #endif
  5640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5641. "lsrs r7, %[b], #16\n\t"
  5642. #else
  5643. "lsr r7, %[b], #16\n\t"
  5644. #endif
  5645. #ifdef WOLFSSL_KEIL
  5646. "muls r6, r7, r6\n\t"
  5647. #elif defined(__clang__)
  5648. "muls r6, r7\n\t"
  5649. #else
  5650. "mul r6, r7\n\t"
  5651. #endif
  5652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5653. "lsrs r7, r6, #16\n\t"
  5654. #else
  5655. "lsr r7, r6, #16\n\t"
  5656. #endif
  5657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5658. "lsls r6, r6, #16\n\t"
  5659. #else
  5660. "lsl r6, r6, #16\n\t"
  5661. #endif
  5662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5663. "adds r5, r5, r6\n\t"
  5664. #else
  5665. "add r5, r5, r6\n\t"
  5666. #endif
  5667. #ifdef WOLFSSL_KEIL
  5668. "adcs r3, r3, r7\n\t"
  5669. #elif defined(__clang__)
  5670. "adcs r3, r7\n\t"
  5671. #else
  5672. "adc r3, r7\n\t"
  5673. #endif
  5674. #ifdef WOLFSSL_KEIL
  5675. "adcs r4, r4, %[r]\n\t"
  5676. #elif defined(__clang__)
  5677. "adcs r4, %[r]\n\t"
  5678. #else
  5679. "adc r4, %[r]\n\t"
  5680. #endif
  5681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5682. "lsrs r6, %[a], #16\n\t"
  5683. #else
  5684. "lsr r6, %[a], #16\n\t"
  5685. #endif
  5686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5687. "lsrs r7, %[b], #16\n\t"
  5688. #else
  5689. "lsr r7, %[b], #16\n\t"
  5690. #endif
  5691. #ifdef WOLFSSL_KEIL
  5692. "muls r7, r6, r7\n\t"
  5693. #elif defined(__clang__)
  5694. "muls r7, r6\n\t"
  5695. #else
  5696. "mul r7, r6\n\t"
  5697. #endif
  5698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5699. "adds r3, r3, r7\n\t"
  5700. #else
  5701. "add r3, r3, r7\n\t"
  5702. #endif
  5703. #ifdef WOLFSSL_KEIL
  5704. "adcs r4, r4, %[r]\n\t"
  5705. #elif defined(__clang__)
  5706. "adcs r4, %[r]\n\t"
  5707. #else
  5708. "adc r4, %[r]\n\t"
  5709. #endif
  5710. "uxth r7, %[b]\n\t"
  5711. #ifdef WOLFSSL_KEIL
  5712. "muls r6, r7, r6\n\t"
  5713. #elif defined(__clang__)
  5714. "muls r6, r7\n\t"
  5715. #else
  5716. "mul r6, r7\n\t"
  5717. #endif
  5718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5719. "lsrs r7, r6, #16\n\t"
  5720. #else
  5721. "lsr r7, r6, #16\n\t"
  5722. #endif
  5723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5724. "lsls r6, r6, #16\n\t"
  5725. #else
  5726. "lsl r6, r6, #16\n\t"
  5727. #endif
  5728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5729. "adds r5, r5, r6\n\t"
  5730. #else
  5731. "add r5, r5, r6\n\t"
  5732. #endif
  5733. #ifdef WOLFSSL_KEIL
  5734. "adcs r3, r3, r7\n\t"
  5735. #elif defined(__clang__)
  5736. "adcs r3, r7\n\t"
  5737. #else
  5738. "adc r3, r7\n\t"
  5739. #endif
  5740. #ifdef WOLFSSL_KEIL
  5741. "adcs r4, r4, %[r]\n\t"
  5742. #elif defined(__clang__)
  5743. "adcs r4, %[r]\n\t"
  5744. #else
  5745. "adc r4, %[r]\n\t"
  5746. #endif
  5747. "# A[5] * B[3]\n\t"
  5748. "mov %[a], r9\n\t"
  5749. "mov %[b], r10\n\t"
  5750. "ldr %[a], [%[a], #20]\n\t"
  5751. "ldr %[b], [%[b], #12]\n\t"
  5752. "uxth r6, %[a]\n\t"
  5753. "uxth r7, %[b]\n\t"
  5754. #ifdef WOLFSSL_KEIL
  5755. "muls r7, r6, r7\n\t"
  5756. #elif defined(__clang__)
  5757. "muls r7, r6\n\t"
  5758. #else
  5759. "mul r7, r6\n\t"
  5760. #endif
  5761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5762. "adds r5, r5, r7\n\t"
  5763. #else
  5764. "add r5, r5, r7\n\t"
  5765. #endif
  5766. #ifdef WOLFSSL_KEIL
  5767. "adcs r3, r3, %[r]\n\t"
  5768. #elif defined(__clang__)
  5769. "adcs r3, %[r]\n\t"
  5770. #else
  5771. "adc r3, %[r]\n\t"
  5772. #endif
  5773. #ifdef WOLFSSL_KEIL
  5774. "adcs r4, r4, %[r]\n\t"
  5775. #elif defined(__clang__)
  5776. "adcs r4, %[r]\n\t"
  5777. #else
  5778. "adc r4, %[r]\n\t"
  5779. #endif
  5780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5781. "lsrs r7, %[b], #16\n\t"
  5782. #else
  5783. "lsr r7, %[b], #16\n\t"
  5784. #endif
  5785. #ifdef WOLFSSL_KEIL
  5786. "muls r6, r7, r6\n\t"
  5787. #elif defined(__clang__)
  5788. "muls r6, r7\n\t"
  5789. #else
  5790. "mul r6, r7\n\t"
  5791. #endif
  5792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5793. "lsrs r7, r6, #16\n\t"
  5794. #else
  5795. "lsr r7, r6, #16\n\t"
  5796. #endif
  5797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5798. "lsls r6, r6, #16\n\t"
  5799. #else
  5800. "lsl r6, r6, #16\n\t"
  5801. #endif
  5802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5803. "adds r5, r5, r6\n\t"
  5804. #else
  5805. "add r5, r5, r6\n\t"
  5806. #endif
  5807. #ifdef WOLFSSL_KEIL
  5808. "adcs r3, r3, r7\n\t"
  5809. #elif defined(__clang__)
  5810. "adcs r3, r7\n\t"
  5811. #else
  5812. "adc r3, r7\n\t"
  5813. #endif
  5814. #ifdef WOLFSSL_KEIL
  5815. "adcs r4, r4, %[r]\n\t"
  5816. #elif defined(__clang__)
  5817. "adcs r4, %[r]\n\t"
  5818. #else
  5819. "adc r4, %[r]\n\t"
  5820. #endif
  5821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5822. "lsrs r6, %[a], #16\n\t"
  5823. #else
  5824. "lsr r6, %[a], #16\n\t"
  5825. #endif
  5826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5827. "lsrs r7, %[b], #16\n\t"
  5828. #else
  5829. "lsr r7, %[b], #16\n\t"
  5830. #endif
  5831. #ifdef WOLFSSL_KEIL
  5832. "muls r7, r6, r7\n\t"
  5833. #elif defined(__clang__)
  5834. "muls r7, r6\n\t"
  5835. #else
  5836. "mul r7, r6\n\t"
  5837. #endif
  5838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5839. "adds r3, r3, r7\n\t"
  5840. #else
  5841. "add r3, r3, r7\n\t"
  5842. #endif
  5843. #ifdef WOLFSSL_KEIL
  5844. "adcs r4, r4, %[r]\n\t"
  5845. #elif defined(__clang__)
  5846. "adcs r4, %[r]\n\t"
  5847. #else
  5848. "adc r4, %[r]\n\t"
  5849. #endif
  5850. "uxth r7, %[b]\n\t"
  5851. #ifdef WOLFSSL_KEIL
  5852. "muls r6, r7, r6\n\t"
  5853. #elif defined(__clang__)
  5854. "muls r6, r7\n\t"
  5855. #else
  5856. "mul r6, r7\n\t"
  5857. #endif
  5858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5859. "lsrs r7, r6, #16\n\t"
  5860. #else
  5861. "lsr r7, r6, #16\n\t"
  5862. #endif
  5863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5864. "lsls r6, r6, #16\n\t"
  5865. #else
  5866. "lsl r6, r6, #16\n\t"
  5867. #endif
  5868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5869. "adds r5, r5, r6\n\t"
  5870. #else
  5871. "add r5, r5, r6\n\t"
  5872. #endif
  5873. #ifdef WOLFSSL_KEIL
  5874. "adcs r3, r3, r7\n\t"
  5875. #elif defined(__clang__)
  5876. "adcs r3, r7\n\t"
  5877. #else
  5878. "adc r3, r7\n\t"
  5879. #endif
  5880. #ifdef WOLFSSL_KEIL
  5881. "adcs r4, r4, %[r]\n\t"
  5882. #elif defined(__clang__)
  5883. "adcs r4, %[r]\n\t"
  5884. #else
  5885. "adc r4, %[r]\n\t"
  5886. #endif
  5887. "# A[4] * B[4]\n\t"
  5888. "mov %[a], r9\n\t"
  5889. "mov %[b], r10\n\t"
  5890. "ldr %[a], [%[a], #16]\n\t"
  5891. "ldr %[b], [%[b], #16]\n\t"
  5892. "uxth r6, %[a]\n\t"
  5893. "uxth r7, %[b]\n\t"
  5894. #ifdef WOLFSSL_KEIL
  5895. "muls r7, r6, r7\n\t"
  5896. #elif defined(__clang__)
  5897. "muls r7, r6\n\t"
  5898. #else
  5899. "mul r7, r6\n\t"
  5900. #endif
  5901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5902. "adds r5, r5, r7\n\t"
  5903. #else
  5904. "add r5, r5, r7\n\t"
  5905. #endif
  5906. #ifdef WOLFSSL_KEIL
  5907. "adcs r3, r3, %[r]\n\t"
  5908. #elif defined(__clang__)
  5909. "adcs r3, %[r]\n\t"
  5910. #else
  5911. "adc r3, %[r]\n\t"
  5912. #endif
  5913. #ifdef WOLFSSL_KEIL
  5914. "adcs r4, r4, %[r]\n\t"
  5915. #elif defined(__clang__)
  5916. "adcs r4, %[r]\n\t"
  5917. #else
  5918. "adc r4, %[r]\n\t"
  5919. #endif
  5920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5921. "lsrs r7, %[b], #16\n\t"
  5922. #else
  5923. "lsr r7, %[b], #16\n\t"
  5924. #endif
  5925. #ifdef WOLFSSL_KEIL
  5926. "muls r6, r7, r6\n\t"
  5927. #elif defined(__clang__)
  5928. "muls r6, r7\n\t"
  5929. #else
  5930. "mul r6, r7\n\t"
  5931. #endif
  5932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5933. "lsrs r7, r6, #16\n\t"
  5934. #else
  5935. "lsr r7, r6, #16\n\t"
  5936. #endif
  5937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5938. "lsls r6, r6, #16\n\t"
  5939. #else
  5940. "lsl r6, r6, #16\n\t"
  5941. #endif
  5942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5943. "adds r5, r5, r6\n\t"
  5944. #else
  5945. "add r5, r5, r6\n\t"
  5946. #endif
  5947. #ifdef WOLFSSL_KEIL
  5948. "adcs r3, r3, r7\n\t"
  5949. #elif defined(__clang__)
  5950. "adcs r3, r7\n\t"
  5951. #else
  5952. "adc r3, r7\n\t"
  5953. #endif
  5954. #ifdef WOLFSSL_KEIL
  5955. "adcs r4, r4, %[r]\n\t"
  5956. #elif defined(__clang__)
  5957. "adcs r4, %[r]\n\t"
  5958. #else
  5959. "adc r4, %[r]\n\t"
  5960. #endif
  5961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5962. "lsrs r6, %[a], #16\n\t"
  5963. #else
  5964. "lsr r6, %[a], #16\n\t"
  5965. #endif
  5966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5967. "lsrs r7, %[b], #16\n\t"
  5968. #else
  5969. "lsr r7, %[b], #16\n\t"
  5970. #endif
  5971. #ifdef WOLFSSL_KEIL
  5972. "muls r7, r6, r7\n\t"
  5973. #elif defined(__clang__)
  5974. "muls r7, r6\n\t"
  5975. #else
  5976. "mul r7, r6\n\t"
  5977. #endif
  5978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5979. "adds r3, r3, r7\n\t"
  5980. #else
  5981. "add r3, r3, r7\n\t"
  5982. #endif
  5983. #ifdef WOLFSSL_KEIL
  5984. "adcs r4, r4, %[r]\n\t"
  5985. #elif defined(__clang__)
  5986. "adcs r4, %[r]\n\t"
  5987. #else
  5988. "adc r4, %[r]\n\t"
  5989. #endif
  5990. "uxth r7, %[b]\n\t"
  5991. #ifdef WOLFSSL_KEIL
  5992. "muls r6, r7, r6\n\t"
  5993. #elif defined(__clang__)
  5994. "muls r6, r7\n\t"
  5995. #else
  5996. "mul r6, r7\n\t"
  5997. #endif
  5998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  5999. "lsrs r7, r6, #16\n\t"
  6000. #else
  6001. "lsr r7, r6, #16\n\t"
  6002. #endif
  6003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6004. "lsls r6, r6, #16\n\t"
  6005. #else
  6006. "lsl r6, r6, #16\n\t"
  6007. #endif
  6008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6009. "adds r5, r5, r6\n\t"
  6010. #else
  6011. "add r5, r5, r6\n\t"
  6012. #endif
  6013. #ifdef WOLFSSL_KEIL
  6014. "adcs r3, r3, r7\n\t"
  6015. #elif defined(__clang__)
  6016. "adcs r3, r7\n\t"
  6017. #else
  6018. "adc r3, r7\n\t"
  6019. #endif
  6020. #ifdef WOLFSSL_KEIL
  6021. "adcs r4, r4, %[r]\n\t"
  6022. #elif defined(__clang__)
  6023. "adcs r4, %[r]\n\t"
  6024. #else
  6025. "adc r4, %[r]\n\t"
  6026. #endif
  6027. "# A[3] * B[5]\n\t"
  6028. "mov %[a], r9\n\t"
  6029. "mov %[b], r10\n\t"
  6030. "ldr %[a], [%[a], #12]\n\t"
  6031. "ldr %[b], [%[b], #20]\n\t"
  6032. "uxth r6, %[a]\n\t"
  6033. "uxth r7, %[b]\n\t"
  6034. #ifdef WOLFSSL_KEIL
  6035. "muls r7, r6, r7\n\t"
  6036. #elif defined(__clang__)
  6037. "muls r7, r6\n\t"
  6038. #else
  6039. "mul r7, r6\n\t"
  6040. #endif
  6041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6042. "adds r5, r5, r7\n\t"
  6043. #else
  6044. "add r5, r5, r7\n\t"
  6045. #endif
  6046. #ifdef WOLFSSL_KEIL
  6047. "adcs r3, r3, %[r]\n\t"
  6048. #elif defined(__clang__)
  6049. "adcs r3, %[r]\n\t"
  6050. #else
  6051. "adc r3, %[r]\n\t"
  6052. #endif
  6053. #ifdef WOLFSSL_KEIL
  6054. "adcs r4, r4, %[r]\n\t"
  6055. #elif defined(__clang__)
  6056. "adcs r4, %[r]\n\t"
  6057. #else
  6058. "adc r4, %[r]\n\t"
  6059. #endif
  6060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6061. "lsrs r7, %[b], #16\n\t"
  6062. #else
  6063. "lsr r7, %[b], #16\n\t"
  6064. #endif
  6065. #ifdef WOLFSSL_KEIL
  6066. "muls r6, r7, r6\n\t"
  6067. #elif defined(__clang__)
  6068. "muls r6, r7\n\t"
  6069. #else
  6070. "mul r6, r7\n\t"
  6071. #endif
  6072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6073. "lsrs r7, r6, #16\n\t"
  6074. #else
  6075. "lsr r7, r6, #16\n\t"
  6076. #endif
  6077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6078. "lsls r6, r6, #16\n\t"
  6079. #else
  6080. "lsl r6, r6, #16\n\t"
  6081. #endif
  6082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6083. "adds r5, r5, r6\n\t"
  6084. #else
  6085. "add r5, r5, r6\n\t"
  6086. #endif
  6087. #ifdef WOLFSSL_KEIL
  6088. "adcs r3, r3, r7\n\t"
  6089. #elif defined(__clang__)
  6090. "adcs r3, r7\n\t"
  6091. #else
  6092. "adc r3, r7\n\t"
  6093. #endif
  6094. #ifdef WOLFSSL_KEIL
  6095. "adcs r4, r4, %[r]\n\t"
  6096. #elif defined(__clang__)
  6097. "adcs r4, %[r]\n\t"
  6098. #else
  6099. "adc r4, %[r]\n\t"
  6100. #endif
  6101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6102. "lsrs r6, %[a], #16\n\t"
  6103. #else
  6104. "lsr r6, %[a], #16\n\t"
  6105. #endif
  6106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6107. "lsrs r7, %[b], #16\n\t"
  6108. #else
  6109. "lsr r7, %[b], #16\n\t"
  6110. #endif
  6111. #ifdef WOLFSSL_KEIL
  6112. "muls r7, r6, r7\n\t"
  6113. #elif defined(__clang__)
  6114. "muls r7, r6\n\t"
  6115. #else
  6116. "mul r7, r6\n\t"
  6117. #endif
  6118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6119. "adds r3, r3, r7\n\t"
  6120. #else
  6121. "add r3, r3, r7\n\t"
  6122. #endif
  6123. #ifdef WOLFSSL_KEIL
  6124. "adcs r4, r4, %[r]\n\t"
  6125. #elif defined(__clang__)
  6126. "adcs r4, %[r]\n\t"
  6127. #else
  6128. "adc r4, %[r]\n\t"
  6129. #endif
  6130. "uxth r7, %[b]\n\t"
  6131. #ifdef WOLFSSL_KEIL
  6132. "muls r6, r7, r6\n\t"
  6133. #elif defined(__clang__)
  6134. "muls r6, r7\n\t"
  6135. #else
  6136. "mul r6, r7\n\t"
  6137. #endif
  6138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6139. "lsrs r7, r6, #16\n\t"
  6140. #else
  6141. "lsr r7, r6, #16\n\t"
  6142. #endif
  6143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6144. "lsls r6, r6, #16\n\t"
  6145. #else
  6146. "lsl r6, r6, #16\n\t"
  6147. #endif
  6148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6149. "adds r5, r5, r6\n\t"
  6150. #else
  6151. "add r5, r5, r6\n\t"
  6152. #endif
  6153. #ifdef WOLFSSL_KEIL
  6154. "adcs r3, r3, r7\n\t"
  6155. #elif defined(__clang__)
  6156. "adcs r3, r7\n\t"
  6157. #else
  6158. "adc r3, r7\n\t"
  6159. #endif
  6160. #ifdef WOLFSSL_KEIL
  6161. "adcs r4, r4, %[r]\n\t"
  6162. #elif defined(__clang__)
  6163. "adcs r4, %[r]\n\t"
  6164. #else
  6165. "adc r4, %[r]\n\t"
  6166. #endif
  6167. "# A[2] * B[6]\n\t"
  6168. "mov %[a], r9\n\t"
  6169. "mov %[b], r10\n\t"
  6170. "ldr %[a], [%[a], #8]\n\t"
  6171. "ldr %[b], [%[b], #24]\n\t"
  6172. "uxth r6, %[a]\n\t"
  6173. "uxth r7, %[b]\n\t"
  6174. #ifdef WOLFSSL_KEIL
  6175. "muls r7, r6, r7\n\t"
  6176. #elif defined(__clang__)
  6177. "muls r7, r6\n\t"
  6178. #else
  6179. "mul r7, r6\n\t"
  6180. #endif
  6181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6182. "adds r5, r5, r7\n\t"
  6183. #else
  6184. "add r5, r5, r7\n\t"
  6185. #endif
  6186. #ifdef WOLFSSL_KEIL
  6187. "adcs r3, r3, %[r]\n\t"
  6188. #elif defined(__clang__)
  6189. "adcs r3, %[r]\n\t"
  6190. #else
  6191. "adc r3, %[r]\n\t"
  6192. #endif
  6193. #ifdef WOLFSSL_KEIL
  6194. "adcs r4, r4, %[r]\n\t"
  6195. #elif defined(__clang__)
  6196. "adcs r4, %[r]\n\t"
  6197. #else
  6198. "adc r4, %[r]\n\t"
  6199. #endif
  6200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6201. "lsrs r7, %[b], #16\n\t"
  6202. #else
  6203. "lsr r7, %[b], #16\n\t"
  6204. #endif
  6205. #ifdef WOLFSSL_KEIL
  6206. "muls r6, r7, r6\n\t"
  6207. #elif defined(__clang__)
  6208. "muls r6, r7\n\t"
  6209. #else
  6210. "mul r6, r7\n\t"
  6211. #endif
  6212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6213. "lsrs r7, r6, #16\n\t"
  6214. #else
  6215. "lsr r7, r6, #16\n\t"
  6216. #endif
  6217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6218. "lsls r6, r6, #16\n\t"
  6219. #else
  6220. "lsl r6, r6, #16\n\t"
  6221. #endif
  6222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6223. "adds r5, r5, r6\n\t"
  6224. #else
  6225. "add r5, r5, r6\n\t"
  6226. #endif
  6227. #ifdef WOLFSSL_KEIL
  6228. "adcs r3, r3, r7\n\t"
  6229. #elif defined(__clang__)
  6230. "adcs r3, r7\n\t"
  6231. #else
  6232. "adc r3, r7\n\t"
  6233. #endif
  6234. #ifdef WOLFSSL_KEIL
  6235. "adcs r4, r4, %[r]\n\t"
  6236. #elif defined(__clang__)
  6237. "adcs r4, %[r]\n\t"
  6238. #else
  6239. "adc r4, %[r]\n\t"
  6240. #endif
  6241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6242. "lsrs r6, %[a], #16\n\t"
  6243. #else
  6244. "lsr r6, %[a], #16\n\t"
  6245. #endif
  6246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6247. "lsrs r7, %[b], #16\n\t"
  6248. #else
  6249. "lsr r7, %[b], #16\n\t"
  6250. #endif
  6251. #ifdef WOLFSSL_KEIL
  6252. "muls r7, r6, r7\n\t"
  6253. #elif defined(__clang__)
  6254. "muls r7, r6\n\t"
  6255. #else
  6256. "mul r7, r6\n\t"
  6257. #endif
  6258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6259. "adds r3, r3, r7\n\t"
  6260. #else
  6261. "add r3, r3, r7\n\t"
  6262. #endif
  6263. #ifdef WOLFSSL_KEIL
  6264. "adcs r4, r4, %[r]\n\t"
  6265. #elif defined(__clang__)
  6266. "adcs r4, %[r]\n\t"
  6267. #else
  6268. "adc r4, %[r]\n\t"
  6269. #endif
  6270. "uxth r7, %[b]\n\t"
  6271. #ifdef WOLFSSL_KEIL
  6272. "muls r6, r7, r6\n\t"
  6273. #elif defined(__clang__)
  6274. "muls r6, r7\n\t"
  6275. #else
  6276. "mul r6, r7\n\t"
  6277. #endif
  6278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6279. "lsrs r7, r6, #16\n\t"
  6280. #else
  6281. "lsr r7, r6, #16\n\t"
  6282. #endif
  6283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6284. "lsls r6, r6, #16\n\t"
  6285. #else
  6286. "lsl r6, r6, #16\n\t"
  6287. #endif
  6288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6289. "adds r5, r5, r6\n\t"
  6290. #else
  6291. "add r5, r5, r6\n\t"
  6292. #endif
  6293. #ifdef WOLFSSL_KEIL
  6294. "adcs r3, r3, r7\n\t"
  6295. #elif defined(__clang__)
  6296. "adcs r3, r7\n\t"
  6297. #else
  6298. "adc r3, r7\n\t"
  6299. #endif
  6300. #ifdef WOLFSSL_KEIL
  6301. "adcs r4, r4, %[r]\n\t"
  6302. #elif defined(__clang__)
  6303. "adcs r4, %[r]\n\t"
  6304. #else
  6305. "adc r4, %[r]\n\t"
  6306. #endif
  6307. "# A[1] * B[7]\n\t"
  6308. "mov %[a], r9\n\t"
  6309. "mov %[b], r10\n\t"
  6310. "ldr %[a], [%[a], #4]\n\t"
  6311. "ldr %[b], [%[b], #28]\n\t"
  6312. "uxth r6, %[a]\n\t"
  6313. "uxth r7, %[b]\n\t"
  6314. #ifdef WOLFSSL_KEIL
  6315. "muls r7, r6, r7\n\t"
  6316. #elif defined(__clang__)
  6317. "muls r7, r6\n\t"
  6318. #else
  6319. "mul r7, r6\n\t"
  6320. #endif
  6321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6322. "adds r5, r5, r7\n\t"
  6323. #else
  6324. "add r5, r5, r7\n\t"
  6325. #endif
  6326. #ifdef WOLFSSL_KEIL
  6327. "adcs r3, r3, %[r]\n\t"
  6328. #elif defined(__clang__)
  6329. "adcs r3, %[r]\n\t"
  6330. #else
  6331. "adc r3, %[r]\n\t"
  6332. #endif
  6333. #ifdef WOLFSSL_KEIL
  6334. "adcs r4, r4, %[r]\n\t"
  6335. #elif defined(__clang__)
  6336. "adcs r4, %[r]\n\t"
  6337. #else
  6338. "adc r4, %[r]\n\t"
  6339. #endif
  6340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6341. "lsrs r7, %[b], #16\n\t"
  6342. #else
  6343. "lsr r7, %[b], #16\n\t"
  6344. #endif
  6345. #ifdef WOLFSSL_KEIL
  6346. "muls r6, r7, r6\n\t"
  6347. #elif defined(__clang__)
  6348. "muls r6, r7\n\t"
  6349. #else
  6350. "mul r6, r7\n\t"
  6351. #endif
  6352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6353. "lsrs r7, r6, #16\n\t"
  6354. #else
  6355. "lsr r7, r6, #16\n\t"
  6356. #endif
  6357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6358. "lsls r6, r6, #16\n\t"
  6359. #else
  6360. "lsl r6, r6, #16\n\t"
  6361. #endif
  6362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6363. "adds r5, r5, r6\n\t"
  6364. #else
  6365. "add r5, r5, r6\n\t"
  6366. #endif
  6367. #ifdef WOLFSSL_KEIL
  6368. "adcs r3, r3, r7\n\t"
  6369. #elif defined(__clang__)
  6370. "adcs r3, r7\n\t"
  6371. #else
  6372. "adc r3, r7\n\t"
  6373. #endif
  6374. #ifdef WOLFSSL_KEIL
  6375. "adcs r4, r4, %[r]\n\t"
  6376. #elif defined(__clang__)
  6377. "adcs r4, %[r]\n\t"
  6378. #else
  6379. "adc r4, %[r]\n\t"
  6380. #endif
  6381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6382. "lsrs r6, %[a], #16\n\t"
  6383. #else
  6384. "lsr r6, %[a], #16\n\t"
  6385. #endif
  6386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6387. "lsrs r7, %[b], #16\n\t"
  6388. #else
  6389. "lsr r7, %[b], #16\n\t"
  6390. #endif
  6391. #ifdef WOLFSSL_KEIL
  6392. "muls r7, r6, r7\n\t"
  6393. #elif defined(__clang__)
  6394. "muls r7, r6\n\t"
  6395. #else
  6396. "mul r7, r6\n\t"
  6397. #endif
  6398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6399. "adds r3, r3, r7\n\t"
  6400. #else
  6401. "add r3, r3, r7\n\t"
  6402. #endif
  6403. #ifdef WOLFSSL_KEIL
  6404. "adcs r4, r4, %[r]\n\t"
  6405. #elif defined(__clang__)
  6406. "adcs r4, %[r]\n\t"
  6407. #else
  6408. "adc r4, %[r]\n\t"
  6409. #endif
  6410. "uxth r7, %[b]\n\t"
  6411. #ifdef WOLFSSL_KEIL
  6412. "muls r6, r7, r6\n\t"
  6413. #elif defined(__clang__)
  6414. "muls r6, r7\n\t"
  6415. #else
  6416. "mul r6, r7\n\t"
  6417. #endif
  6418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6419. "lsrs r7, r6, #16\n\t"
  6420. #else
  6421. "lsr r7, r6, #16\n\t"
  6422. #endif
  6423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6424. "lsls r6, r6, #16\n\t"
  6425. #else
  6426. "lsl r6, r6, #16\n\t"
  6427. #endif
  6428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6429. "adds r5, r5, r6\n\t"
  6430. #else
  6431. "add r5, r5, r6\n\t"
  6432. #endif
  6433. #ifdef WOLFSSL_KEIL
  6434. "adcs r3, r3, r7\n\t"
  6435. #elif defined(__clang__)
  6436. "adcs r3, r7\n\t"
  6437. #else
  6438. "adc r3, r7\n\t"
  6439. #endif
  6440. #ifdef WOLFSSL_KEIL
  6441. "adcs r4, r4, %[r]\n\t"
  6442. #elif defined(__clang__)
  6443. "adcs r4, %[r]\n\t"
  6444. #else
  6445. "adc r4, %[r]\n\t"
  6446. #endif
  6447. "mov %[r], r8\n\t"
  6448. "str r5, [%[r], #32]\n\t"
  6449. "movs %[r], #0\n\t"
  6450. "# A[2] * B[7]\n\t"
  6451. "movs r5, #0\n\t"
  6452. "mov %[a], r9\n\t"
  6453. "mov %[b], r10\n\t"
  6454. "ldr %[a], [%[a], #8]\n\t"
  6455. "ldr %[b], [%[b], #28]\n\t"
  6456. "uxth r6, %[a]\n\t"
  6457. "uxth r7, %[b]\n\t"
  6458. #ifdef WOLFSSL_KEIL
  6459. "muls r7, r6, r7\n\t"
  6460. #elif defined(__clang__)
  6461. "muls r7, r6\n\t"
  6462. #else
  6463. "mul r7, r6\n\t"
  6464. #endif
  6465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6466. "adds r3, r3, r7\n\t"
  6467. #else
  6468. "add r3, r3, r7\n\t"
  6469. #endif
  6470. #ifdef WOLFSSL_KEIL
  6471. "adcs r4, r4, %[r]\n\t"
  6472. #elif defined(__clang__)
  6473. "adcs r4, %[r]\n\t"
  6474. #else
  6475. "adc r4, %[r]\n\t"
  6476. #endif
  6477. #ifdef WOLFSSL_KEIL
  6478. "adcs r5, r5, %[r]\n\t"
  6479. #elif defined(__clang__)
  6480. "adcs r5, %[r]\n\t"
  6481. #else
  6482. "adc r5, %[r]\n\t"
  6483. #endif
  6484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6485. "lsrs r7, %[b], #16\n\t"
  6486. #else
  6487. "lsr r7, %[b], #16\n\t"
  6488. #endif
  6489. #ifdef WOLFSSL_KEIL
  6490. "muls r6, r7, r6\n\t"
  6491. #elif defined(__clang__)
  6492. "muls r6, r7\n\t"
  6493. #else
  6494. "mul r6, r7\n\t"
  6495. #endif
  6496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6497. "lsrs r7, r6, #16\n\t"
  6498. #else
  6499. "lsr r7, r6, #16\n\t"
  6500. #endif
  6501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6502. "lsls r6, r6, #16\n\t"
  6503. #else
  6504. "lsl r6, r6, #16\n\t"
  6505. #endif
  6506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6507. "adds r3, r3, r6\n\t"
  6508. #else
  6509. "add r3, r3, r6\n\t"
  6510. #endif
  6511. #ifdef WOLFSSL_KEIL
  6512. "adcs r4, r4, r7\n\t"
  6513. #elif defined(__clang__)
  6514. "adcs r4, r7\n\t"
  6515. #else
  6516. "adc r4, r7\n\t"
  6517. #endif
  6518. #ifdef WOLFSSL_KEIL
  6519. "adcs r5, r5, %[r]\n\t"
  6520. #elif defined(__clang__)
  6521. "adcs r5, %[r]\n\t"
  6522. #else
  6523. "adc r5, %[r]\n\t"
  6524. #endif
  6525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6526. "lsrs r6, %[a], #16\n\t"
  6527. #else
  6528. "lsr r6, %[a], #16\n\t"
  6529. #endif
  6530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6531. "lsrs r7, %[b], #16\n\t"
  6532. #else
  6533. "lsr r7, %[b], #16\n\t"
  6534. #endif
  6535. #ifdef WOLFSSL_KEIL
  6536. "muls r7, r6, r7\n\t"
  6537. #elif defined(__clang__)
  6538. "muls r7, r6\n\t"
  6539. #else
  6540. "mul r7, r6\n\t"
  6541. #endif
  6542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6543. "adds r4, r4, r7\n\t"
  6544. #else
  6545. "add r4, r4, r7\n\t"
  6546. #endif
  6547. #ifdef WOLFSSL_KEIL
  6548. "adcs r5, r5, %[r]\n\t"
  6549. #elif defined(__clang__)
  6550. "adcs r5, %[r]\n\t"
  6551. #else
  6552. "adc r5, %[r]\n\t"
  6553. #endif
  6554. "uxth r7, %[b]\n\t"
  6555. #ifdef WOLFSSL_KEIL
  6556. "muls r6, r7, r6\n\t"
  6557. #elif defined(__clang__)
  6558. "muls r6, r7\n\t"
  6559. #else
  6560. "mul r6, r7\n\t"
  6561. #endif
  6562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6563. "lsrs r7, r6, #16\n\t"
  6564. #else
  6565. "lsr r7, r6, #16\n\t"
  6566. #endif
  6567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6568. "lsls r6, r6, #16\n\t"
  6569. #else
  6570. "lsl r6, r6, #16\n\t"
  6571. #endif
  6572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6573. "adds r3, r3, r6\n\t"
  6574. #else
  6575. "add r3, r3, r6\n\t"
  6576. #endif
  6577. #ifdef WOLFSSL_KEIL
  6578. "adcs r4, r4, r7\n\t"
  6579. #elif defined(__clang__)
  6580. "adcs r4, r7\n\t"
  6581. #else
  6582. "adc r4, r7\n\t"
  6583. #endif
  6584. #ifdef WOLFSSL_KEIL
  6585. "adcs r5, r5, %[r]\n\t"
  6586. #elif defined(__clang__)
  6587. "adcs r5, %[r]\n\t"
  6588. #else
  6589. "adc r5, %[r]\n\t"
  6590. #endif
  6591. "# A[3] * B[6]\n\t"
  6592. "mov %[a], r9\n\t"
  6593. "mov %[b], r10\n\t"
  6594. "ldr %[a], [%[a], #12]\n\t"
  6595. "ldr %[b], [%[b], #24]\n\t"
  6596. "uxth r6, %[a]\n\t"
  6597. "uxth r7, %[b]\n\t"
  6598. #ifdef WOLFSSL_KEIL
  6599. "muls r7, r6, r7\n\t"
  6600. #elif defined(__clang__)
  6601. "muls r7, r6\n\t"
  6602. #else
  6603. "mul r7, r6\n\t"
  6604. #endif
  6605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6606. "adds r3, r3, r7\n\t"
  6607. #else
  6608. "add r3, r3, r7\n\t"
  6609. #endif
  6610. #ifdef WOLFSSL_KEIL
  6611. "adcs r4, r4, %[r]\n\t"
  6612. #elif defined(__clang__)
  6613. "adcs r4, %[r]\n\t"
  6614. #else
  6615. "adc r4, %[r]\n\t"
  6616. #endif
  6617. #ifdef WOLFSSL_KEIL
  6618. "adcs r5, r5, %[r]\n\t"
  6619. #elif defined(__clang__)
  6620. "adcs r5, %[r]\n\t"
  6621. #else
  6622. "adc r5, %[r]\n\t"
  6623. #endif
  6624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6625. "lsrs r7, %[b], #16\n\t"
  6626. #else
  6627. "lsr r7, %[b], #16\n\t"
  6628. #endif
  6629. #ifdef WOLFSSL_KEIL
  6630. "muls r6, r7, r6\n\t"
  6631. #elif defined(__clang__)
  6632. "muls r6, r7\n\t"
  6633. #else
  6634. "mul r6, r7\n\t"
  6635. #endif
  6636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6637. "lsrs r7, r6, #16\n\t"
  6638. #else
  6639. "lsr r7, r6, #16\n\t"
  6640. #endif
  6641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6642. "lsls r6, r6, #16\n\t"
  6643. #else
  6644. "lsl r6, r6, #16\n\t"
  6645. #endif
  6646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6647. "adds r3, r3, r6\n\t"
  6648. #else
  6649. "add r3, r3, r6\n\t"
  6650. #endif
  6651. #ifdef WOLFSSL_KEIL
  6652. "adcs r4, r4, r7\n\t"
  6653. #elif defined(__clang__)
  6654. "adcs r4, r7\n\t"
  6655. #else
  6656. "adc r4, r7\n\t"
  6657. #endif
  6658. #ifdef WOLFSSL_KEIL
  6659. "adcs r5, r5, %[r]\n\t"
  6660. #elif defined(__clang__)
  6661. "adcs r5, %[r]\n\t"
  6662. #else
  6663. "adc r5, %[r]\n\t"
  6664. #endif
  6665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6666. "lsrs r6, %[a], #16\n\t"
  6667. #else
  6668. "lsr r6, %[a], #16\n\t"
  6669. #endif
  6670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6671. "lsrs r7, %[b], #16\n\t"
  6672. #else
  6673. "lsr r7, %[b], #16\n\t"
  6674. #endif
  6675. #ifdef WOLFSSL_KEIL
  6676. "muls r7, r6, r7\n\t"
  6677. #elif defined(__clang__)
  6678. "muls r7, r6\n\t"
  6679. #else
  6680. "mul r7, r6\n\t"
  6681. #endif
  6682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6683. "adds r4, r4, r7\n\t"
  6684. #else
  6685. "add r4, r4, r7\n\t"
  6686. #endif
  6687. #ifdef WOLFSSL_KEIL
  6688. "adcs r5, r5, %[r]\n\t"
  6689. #elif defined(__clang__)
  6690. "adcs r5, %[r]\n\t"
  6691. #else
  6692. "adc r5, %[r]\n\t"
  6693. #endif
  6694. "uxth r7, %[b]\n\t"
  6695. #ifdef WOLFSSL_KEIL
  6696. "muls r6, r7, r6\n\t"
  6697. #elif defined(__clang__)
  6698. "muls r6, r7\n\t"
  6699. #else
  6700. "mul r6, r7\n\t"
  6701. #endif
  6702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6703. "lsrs r7, r6, #16\n\t"
  6704. #else
  6705. "lsr r7, r6, #16\n\t"
  6706. #endif
  6707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6708. "lsls r6, r6, #16\n\t"
  6709. #else
  6710. "lsl r6, r6, #16\n\t"
  6711. #endif
  6712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6713. "adds r3, r3, r6\n\t"
  6714. #else
  6715. "add r3, r3, r6\n\t"
  6716. #endif
  6717. #ifdef WOLFSSL_KEIL
  6718. "adcs r4, r4, r7\n\t"
  6719. #elif defined(__clang__)
  6720. "adcs r4, r7\n\t"
  6721. #else
  6722. "adc r4, r7\n\t"
  6723. #endif
  6724. #ifdef WOLFSSL_KEIL
  6725. "adcs r5, r5, %[r]\n\t"
  6726. #elif defined(__clang__)
  6727. "adcs r5, %[r]\n\t"
  6728. #else
  6729. "adc r5, %[r]\n\t"
  6730. #endif
  6731. "# A[4] * B[5]\n\t"
  6732. "mov %[a], r9\n\t"
  6733. "mov %[b], r10\n\t"
  6734. "ldr %[a], [%[a], #16]\n\t"
  6735. "ldr %[b], [%[b], #20]\n\t"
  6736. "uxth r6, %[a]\n\t"
  6737. "uxth r7, %[b]\n\t"
  6738. #ifdef WOLFSSL_KEIL
  6739. "muls r7, r6, r7\n\t"
  6740. #elif defined(__clang__)
  6741. "muls r7, r6\n\t"
  6742. #else
  6743. "mul r7, r6\n\t"
  6744. #endif
  6745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6746. "adds r3, r3, r7\n\t"
  6747. #else
  6748. "add r3, r3, r7\n\t"
  6749. #endif
  6750. #ifdef WOLFSSL_KEIL
  6751. "adcs r4, r4, %[r]\n\t"
  6752. #elif defined(__clang__)
  6753. "adcs r4, %[r]\n\t"
  6754. #else
  6755. "adc r4, %[r]\n\t"
  6756. #endif
  6757. #ifdef WOLFSSL_KEIL
  6758. "adcs r5, r5, %[r]\n\t"
  6759. #elif defined(__clang__)
  6760. "adcs r5, %[r]\n\t"
  6761. #else
  6762. "adc r5, %[r]\n\t"
  6763. #endif
  6764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6765. "lsrs r7, %[b], #16\n\t"
  6766. #else
  6767. "lsr r7, %[b], #16\n\t"
  6768. #endif
  6769. #ifdef WOLFSSL_KEIL
  6770. "muls r6, r7, r6\n\t"
  6771. #elif defined(__clang__)
  6772. "muls r6, r7\n\t"
  6773. #else
  6774. "mul r6, r7\n\t"
  6775. #endif
  6776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6777. "lsrs r7, r6, #16\n\t"
  6778. #else
  6779. "lsr r7, r6, #16\n\t"
  6780. #endif
  6781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6782. "lsls r6, r6, #16\n\t"
  6783. #else
  6784. "lsl r6, r6, #16\n\t"
  6785. #endif
  6786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6787. "adds r3, r3, r6\n\t"
  6788. #else
  6789. "add r3, r3, r6\n\t"
  6790. #endif
  6791. #ifdef WOLFSSL_KEIL
  6792. "adcs r4, r4, r7\n\t"
  6793. #elif defined(__clang__)
  6794. "adcs r4, r7\n\t"
  6795. #else
  6796. "adc r4, r7\n\t"
  6797. #endif
  6798. #ifdef WOLFSSL_KEIL
  6799. "adcs r5, r5, %[r]\n\t"
  6800. #elif defined(__clang__)
  6801. "adcs r5, %[r]\n\t"
  6802. #else
  6803. "adc r5, %[r]\n\t"
  6804. #endif
  6805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6806. "lsrs r6, %[a], #16\n\t"
  6807. #else
  6808. "lsr r6, %[a], #16\n\t"
  6809. #endif
  6810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6811. "lsrs r7, %[b], #16\n\t"
  6812. #else
  6813. "lsr r7, %[b], #16\n\t"
  6814. #endif
  6815. #ifdef WOLFSSL_KEIL
  6816. "muls r7, r6, r7\n\t"
  6817. #elif defined(__clang__)
  6818. "muls r7, r6\n\t"
  6819. #else
  6820. "mul r7, r6\n\t"
  6821. #endif
  6822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6823. "adds r4, r4, r7\n\t"
  6824. #else
  6825. "add r4, r4, r7\n\t"
  6826. #endif
  6827. #ifdef WOLFSSL_KEIL
  6828. "adcs r5, r5, %[r]\n\t"
  6829. #elif defined(__clang__)
  6830. "adcs r5, %[r]\n\t"
  6831. #else
  6832. "adc r5, %[r]\n\t"
  6833. #endif
  6834. "uxth r7, %[b]\n\t"
  6835. #ifdef WOLFSSL_KEIL
  6836. "muls r6, r7, r6\n\t"
  6837. #elif defined(__clang__)
  6838. "muls r6, r7\n\t"
  6839. #else
  6840. "mul r6, r7\n\t"
  6841. #endif
  6842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6843. "lsrs r7, r6, #16\n\t"
  6844. #else
  6845. "lsr r7, r6, #16\n\t"
  6846. #endif
  6847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6848. "lsls r6, r6, #16\n\t"
  6849. #else
  6850. "lsl r6, r6, #16\n\t"
  6851. #endif
  6852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6853. "adds r3, r3, r6\n\t"
  6854. #else
  6855. "add r3, r3, r6\n\t"
  6856. #endif
  6857. #ifdef WOLFSSL_KEIL
  6858. "adcs r4, r4, r7\n\t"
  6859. #elif defined(__clang__)
  6860. "adcs r4, r7\n\t"
  6861. #else
  6862. "adc r4, r7\n\t"
  6863. #endif
  6864. #ifdef WOLFSSL_KEIL
  6865. "adcs r5, r5, %[r]\n\t"
  6866. #elif defined(__clang__)
  6867. "adcs r5, %[r]\n\t"
  6868. #else
  6869. "adc r5, %[r]\n\t"
  6870. #endif
  6871. "# A[5] * B[4]\n\t"
  6872. "mov %[a], r9\n\t"
  6873. "mov %[b], r10\n\t"
  6874. "ldr %[a], [%[a], #20]\n\t"
  6875. "ldr %[b], [%[b], #16]\n\t"
  6876. "uxth r6, %[a]\n\t"
  6877. "uxth r7, %[b]\n\t"
  6878. #ifdef WOLFSSL_KEIL
  6879. "muls r7, r6, r7\n\t"
  6880. #elif defined(__clang__)
  6881. "muls r7, r6\n\t"
  6882. #else
  6883. "mul r7, r6\n\t"
  6884. #endif
  6885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6886. "adds r3, r3, r7\n\t"
  6887. #else
  6888. "add r3, r3, r7\n\t"
  6889. #endif
  6890. #ifdef WOLFSSL_KEIL
  6891. "adcs r4, r4, %[r]\n\t"
  6892. #elif defined(__clang__)
  6893. "adcs r4, %[r]\n\t"
  6894. #else
  6895. "adc r4, %[r]\n\t"
  6896. #endif
  6897. #ifdef WOLFSSL_KEIL
  6898. "adcs r5, r5, %[r]\n\t"
  6899. #elif defined(__clang__)
  6900. "adcs r5, %[r]\n\t"
  6901. #else
  6902. "adc r5, %[r]\n\t"
  6903. #endif
  6904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6905. "lsrs r7, %[b], #16\n\t"
  6906. #else
  6907. "lsr r7, %[b], #16\n\t"
  6908. #endif
  6909. #ifdef WOLFSSL_KEIL
  6910. "muls r6, r7, r6\n\t"
  6911. #elif defined(__clang__)
  6912. "muls r6, r7\n\t"
  6913. #else
  6914. "mul r6, r7\n\t"
  6915. #endif
  6916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6917. "lsrs r7, r6, #16\n\t"
  6918. #else
  6919. "lsr r7, r6, #16\n\t"
  6920. #endif
  6921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6922. "lsls r6, r6, #16\n\t"
  6923. #else
  6924. "lsl r6, r6, #16\n\t"
  6925. #endif
  6926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6927. "adds r3, r3, r6\n\t"
  6928. #else
  6929. "add r3, r3, r6\n\t"
  6930. #endif
  6931. #ifdef WOLFSSL_KEIL
  6932. "adcs r4, r4, r7\n\t"
  6933. #elif defined(__clang__)
  6934. "adcs r4, r7\n\t"
  6935. #else
  6936. "adc r4, r7\n\t"
  6937. #endif
  6938. #ifdef WOLFSSL_KEIL
  6939. "adcs r5, r5, %[r]\n\t"
  6940. #elif defined(__clang__)
  6941. "adcs r5, %[r]\n\t"
  6942. #else
  6943. "adc r5, %[r]\n\t"
  6944. #endif
  6945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6946. "lsrs r6, %[a], #16\n\t"
  6947. #else
  6948. "lsr r6, %[a], #16\n\t"
  6949. #endif
  6950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6951. "lsrs r7, %[b], #16\n\t"
  6952. #else
  6953. "lsr r7, %[b], #16\n\t"
  6954. #endif
  6955. #ifdef WOLFSSL_KEIL
  6956. "muls r7, r6, r7\n\t"
  6957. #elif defined(__clang__)
  6958. "muls r7, r6\n\t"
  6959. #else
  6960. "mul r7, r6\n\t"
  6961. #endif
  6962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6963. "adds r4, r4, r7\n\t"
  6964. #else
  6965. "add r4, r4, r7\n\t"
  6966. #endif
  6967. #ifdef WOLFSSL_KEIL
  6968. "adcs r5, r5, %[r]\n\t"
  6969. #elif defined(__clang__)
  6970. "adcs r5, %[r]\n\t"
  6971. #else
  6972. "adc r5, %[r]\n\t"
  6973. #endif
  6974. "uxth r7, %[b]\n\t"
  6975. #ifdef WOLFSSL_KEIL
  6976. "muls r6, r7, r6\n\t"
  6977. #elif defined(__clang__)
  6978. "muls r6, r7\n\t"
  6979. #else
  6980. "mul r6, r7\n\t"
  6981. #endif
  6982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6983. "lsrs r7, r6, #16\n\t"
  6984. #else
  6985. "lsr r7, r6, #16\n\t"
  6986. #endif
  6987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6988. "lsls r6, r6, #16\n\t"
  6989. #else
  6990. "lsl r6, r6, #16\n\t"
  6991. #endif
  6992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  6993. "adds r3, r3, r6\n\t"
  6994. #else
  6995. "add r3, r3, r6\n\t"
  6996. #endif
  6997. #ifdef WOLFSSL_KEIL
  6998. "adcs r4, r4, r7\n\t"
  6999. #elif defined(__clang__)
  7000. "adcs r4, r7\n\t"
  7001. #else
  7002. "adc r4, r7\n\t"
  7003. #endif
  7004. #ifdef WOLFSSL_KEIL
  7005. "adcs r5, r5, %[r]\n\t"
  7006. #elif defined(__clang__)
  7007. "adcs r5, %[r]\n\t"
  7008. #else
  7009. "adc r5, %[r]\n\t"
  7010. #endif
  7011. "# A[6] * B[3]\n\t"
  7012. "mov %[a], r9\n\t"
  7013. "mov %[b], r10\n\t"
  7014. "ldr %[a], [%[a], #24]\n\t"
  7015. "ldr %[b], [%[b], #12]\n\t"
  7016. "uxth r6, %[a]\n\t"
  7017. "uxth r7, %[b]\n\t"
  7018. #ifdef WOLFSSL_KEIL
  7019. "muls r7, r6, r7\n\t"
  7020. #elif defined(__clang__)
  7021. "muls r7, r6\n\t"
  7022. #else
  7023. "mul r7, r6\n\t"
  7024. #endif
  7025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7026. "adds r3, r3, r7\n\t"
  7027. #else
  7028. "add r3, r3, r7\n\t"
  7029. #endif
  7030. #ifdef WOLFSSL_KEIL
  7031. "adcs r4, r4, %[r]\n\t"
  7032. #elif defined(__clang__)
  7033. "adcs r4, %[r]\n\t"
  7034. #else
  7035. "adc r4, %[r]\n\t"
  7036. #endif
  7037. #ifdef WOLFSSL_KEIL
  7038. "adcs r5, r5, %[r]\n\t"
  7039. #elif defined(__clang__)
  7040. "adcs r5, %[r]\n\t"
  7041. #else
  7042. "adc r5, %[r]\n\t"
  7043. #endif
  7044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7045. "lsrs r7, %[b], #16\n\t"
  7046. #else
  7047. "lsr r7, %[b], #16\n\t"
  7048. #endif
  7049. #ifdef WOLFSSL_KEIL
  7050. "muls r6, r7, r6\n\t"
  7051. #elif defined(__clang__)
  7052. "muls r6, r7\n\t"
  7053. #else
  7054. "mul r6, r7\n\t"
  7055. #endif
  7056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7057. "lsrs r7, r6, #16\n\t"
  7058. #else
  7059. "lsr r7, r6, #16\n\t"
  7060. #endif
  7061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7062. "lsls r6, r6, #16\n\t"
  7063. #else
  7064. "lsl r6, r6, #16\n\t"
  7065. #endif
  7066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7067. "adds r3, r3, r6\n\t"
  7068. #else
  7069. "add r3, r3, r6\n\t"
  7070. #endif
  7071. #ifdef WOLFSSL_KEIL
  7072. "adcs r4, r4, r7\n\t"
  7073. #elif defined(__clang__)
  7074. "adcs r4, r7\n\t"
  7075. #else
  7076. "adc r4, r7\n\t"
  7077. #endif
  7078. #ifdef WOLFSSL_KEIL
  7079. "adcs r5, r5, %[r]\n\t"
  7080. #elif defined(__clang__)
  7081. "adcs r5, %[r]\n\t"
  7082. #else
  7083. "adc r5, %[r]\n\t"
  7084. #endif
  7085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7086. "lsrs r6, %[a], #16\n\t"
  7087. #else
  7088. "lsr r6, %[a], #16\n\t"
  7089. #endif
  7090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7091. "lsrs r7, %[b], #16\n\t"
  7092. #else
  7093. "lsr r7, %[b], #16\n\t"
  7094. #endif
  7095. #ifdef WOLFSSL_KEIL
  7096. "muls r7, r6, r7\n\t"
  7097. #elif defined(__clang__)
  7098. "muls r7, r6\n\t"
  7099. #else
  7100. "mul r7, r6\n\t"
  7101. #endif
  7102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7103. "adds r4, r4, r7\n\t"
  7104. #else
  7105. "add r4, r4, r7\n\t"
  7106. #endif
  7107. #ifdef WOLFSSL_KEIL
  7108. "adcs r5, r5, %[r]\n\t"
  7109. #elif defined(__clang__)
  7110. "adcs r5, %[r]\n\t"
  7111. #else
  7112. "adc r5, %[r]\n\t"
  7113. #endif
  7114. "uxth r7, %[b]\n\t"
  7115. #ifdef WOLFSSL_KEIL
  7116. "muls r6, r7, r6\n\t"
  7117. #elif defined(__clang__)
  7118. "muls r6, r7\n\t"
  7119. #else
  7120. "mul r6, r7\n\t"
  7121. #endif
  7122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7123. "lsrs r7, r6, #16\n\t"
  7124. #else
  7125. "lsr r7, r6, #16\n\t"
  7126. #endif
  7127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7128. "lsls r6, r6, #16\n\t"
  7129. #else
  7130. "lsl r6, r6, #16\n\t"
  7131. #endif
  7132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7133. "adds r3, r3, r6\n\t"
  7134. #else
  7135. "add r3, r3, r6\n\t"
  7136. #endif
  7137. #ifdef WOLFSSL_KEIL
  7138. "adcs r4, r4, r7\n\t"
  7139. #elif defined(__clang__)
  7140. "adcs r4, r7\n\t"
  7141. #else
  7142. "adc r4, r7\n\t"
  7143. #endif
  7144. #ifdef WOLFSSL_KEIL
  7145. "adcs r5, r5, %[r]\n\t"
  7146. #elif defined(__clang__)
  7147. "adcs r5, %[r]\n\t"
  7148. #else
  7149. "adc r5, %[r]\n\t"
  7150. #endif
  7151. "# A[7] * B[2]\n\t"
  7152. "mov %[a], r9\n\t"
  7153. "mov %[b], r10\n\t"
  7154. "ldr %[a], [%[a], #28]\n\t"
  7155. "ldr %[b], [%[b], #8]\n\t"
  7156. "uxth r6, %[a]\n\t"
  7157. "uxth r7, %[b]\n\t"
  7158. #ifdef WOLFSSL_KEIL
  7159. "muls r7, r6, r7\n\t"
  7160. #elif defined(__clang__)
  7161. "muls r7, r6\n\t"
  7162. #else
  7163. "mul r7, r6\n\t"
  7164. #endif
  7165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7166. "adds r3, r3, r7\n\t"
  7167. #else
  7168. "add r3, r3, r7\n\t"
  7169. #endif
  7170. #ifdef WOLFSSL_KEIL
  7171. "adcs r4, r4, %[r]\n\t"
  7172. #elif defined(__clang__)
  7173. "adcs r4, %[r]\n\t"
  7174. #else
  7175. "adc r4, %[r]\n\t"
  7176. #endif
  7177. #ifdef WOLFSSL_KEIL
  7178. "adcs r5, r5, %[r]\n\t"
  7179. #elif defined(__clang__)
  7180. "adcs r5, %[r]\n\t"
  7181. #else
  7182. "adc r5, %[r]\n\t"
  7183. #endif
  7184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7185. "lsrs r7, %[b], #16\n\t"
  7186. #else
  7187. "lsr r7, %[b], #16\n\t"
  7188. #endif
  7189. #ifdef WOLFSSL_KEIL
  7190. "muls r6, r7, r6\n\t"
  7191. #elif defined(__clang__)
  7192. "muls r6, r7\n\t"
  7193. #else
  7194. "mul r6, r7\n\t"
  7195. #endif
  7196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7197. "lsrs r7, r6, #16\n\t"
  7198. #else
  7199. "lsr r7, r6, #16\n\t"
  7200. #endif
  7201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7202. "lsls r6, r6, #16\n\t"
  7203. #else
  7204. "lsl r6, r6, #16\n\t"
  7205. #endif
  7206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7207. "adds r3, r3, r6\n\t"
  7208. #else
  7209. "add r3, r3, r6\n\t"
  7210. #endif
  7211. #ifdef WOLFSSL_KEIL
  7212. "adcs r4, r4, r7\n\t"
  7213. #elif defined(__clang__)
  7214. "adcs r4, r7\n\t"
  7215. #else
  7216. "adc r4, r7\n\t"
  7217. #endif
  7218. #ifdef WOLFSSL_KEIL
  7219. "adcs r5, r5, %[r]\n\t"
  7220. #elif defined(__clang__)
  7221. "adcs r5, %[r]\n\t"
  7222. #else
  7223. "adc r5, %[r]\n\t"
  7224. #endif
  7225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7226. "lsrs r6, %[a], #16\n\t"
  7227. #else
  7228. "lsr r6, %[a], #16\n\t"
  7229. #endif
  7230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7231. "lsrs r7, %[b], #16\n\t"
  7232. #else
  7233. "lsr r7, %[b], #16\n\t"
  7234. #endif
  7235. #ifdef WOLFSSL_KEIL
  7236. "muls r7, r6, r7\n\t"
  7237. #elif defined(__clang__)
  7238. "muls r7, r6\n\t"
  7239. #else
  7240. "mul r7, r6\n\t"
  7241. #endif
  7242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7243. "adds r4, r4, r7\n\t"
  7244. #else
  7245. "add r4, r4, r7\n\t"
  7246. #endif
  7247. #ifdef WOLFSSL_KEIL
  7248. "adcs r5, r5, %[r]\n\t"
  7249. #elif defined(__clang__)
  7250. "adcs r5, %[r]\n\t"
  7251. #else
  7252. "adc r5, %[r]\n\t"
  7253. #endif
  7254. "uxth r7, %[b]\n\t"
  7255. #ifdef WOLFSSL_KEIL
  7256. "muls r6, r7, r6\n\t"
  7257. #elif defined(__clang__)
  7258. "muls r6, r7\n\t"
  7259. #else
  7260. "mul r6, r7\n\t"
  7261. #endif
  7262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7263. "lsrs r7, r6, #16\n\t"
  7264. #else
  7265. "lsr r7, r6, #16\n\t"
  7266. #endif
  7267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7268. "lsls r6, r6, #16\n\t"
  7269. #else
  7270. "lsl r6, r6, #16\n\t"
  7271. #endif
  7272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7273. "adds r3, r3, r6\n\t"
  7274. #else
  7275. "add r3, r3, r6\n\t"
  7276. #endif
  7277. #ifdef WOLFSSL_KEIL
  7278. "adcs r4, r4, r7\n\t"
  7279. #elif defined(__clang__)
  7280. "adcs r4, r7\n\t"
  7281. #else
  7282. "adc r4, r7\n\t"
  7283. #endif
  7284. #ifdef WOLFSSL_KEIL
  7285. "adcs r5, r5, %[r]\n\t"
  7286. #elif defined(__clang__)
  7287. "adcs r5, %[r]\n\t"
  7288. #else
  7289. "adc r5, %[r]\n\t"
  7290. #endif
  7291. "mov %[r], r8\n\t"
  7292. "str r3, [%[r], #36]\n\t"
  7293. "movs %[r], #0\n\t"
  7294. "# A[7] * B[3]\n\t"
  7295. "movs r3, #0\n\t"
  7296. "mov %[a], r9\n\t"
  7297. "mov %[b], r10\n\t"
  7298. "ldr %[a], [%[a], #28]\n\t"
  7299. "ldr %[b], [%[b], #12]\n\t"
  7300. "uxth r6, %[a]\n\t"
  7301. "uxth r7, %[b]\n\t"
  7302. #ifdef WOLFSSL_KEIL
  7303. "muls r7, r6, r7\n\t"
  7304. #elif defined(__clang__)
  7305. "muls r7, r6\n\t"
  7306. #else
  7307. "mul r7, r6\n\t"
  7308. #endif
  7309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7310. "adds r4, r4, r7\n\t"
  7311. #else
  7312. "add r4, r4, r7\n\t"
  7313. #endif
  7314. #ifdef WOLFSSL_KEIL
  7315. "adcs r5, r5, %[r]\n\t"
  7316. #elif defined(__clang__)
  7317. "adcs r5, %[r]\n\t"
  7318. #else
  7319. "adc r5, %[r]\n\t"
  7320. #endif
  7321. #ifdef WOLFSSL_KEIL
  7322. "adcs r3, r3, %[r]\n\t"
  7323. #elif defined(__clang__)
  7324. "adcs r3, %[r]\n\t"
  7325. #else
  7326. "adc r3, %[r]\n\t"
  7327. #endif
  7328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7329. "lsrs r7, %[b], #16\n\t"
  7330. #else
  7331. "lsr r7, %[b], #16\n\t"
  7332. #endif
  7333. #ifdef WOLFSSL_KEIL
  7334. "muls r6, r7, r6\n\t"
  7335. #elif defined(__clang__)
  7336. "muls r6, r7\n\t"
  7337. #else
  7338. "mul r6, r7\n\t"
  7339. #endif
  7340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7341. "lsrs r7, r6, #16\n\t"
  7342. #else
  7343. "lsr r7, r6, #16\n\t"
  7344. #endif
  7345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7346. "lsls r6, r6, #16\n\t"
  7347. #else
  7348. "lsl r6, r6, #16\n\t"
  7349. #endif
  7350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7351. "adds r4, r4, r6\n\t"
  7352. #else
  7353. "add r4, r4, r6\n\t"
  7354. #endif
  7355. #ifdef WOLFSSL_KEIL
  7356. "adcs r5, r5, r7\n\t"
  7357. #elif defined(__clang__)
  7358. "adcs r5, r7\n\t"
  7359. #else
  7360. "adc r5, r7\n\t"
  7361. #endif
  7362. #ifdef WOLFSSL_KEIL
  7363. "adcs r3, r3, %[r]\n\t"
  7364. #elif defined(__clang__)
  7365. "adcs r3, %[r]\n\t"
  7366. #else
  7367. "adc r3, %[r]\n\t"
  7368. #endif
  7369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7370. "lsrs r6, %[a], #16\n\t"
  7371. #else
  7372. "lsr r6, %[a], #16\n\t"
  7373. #endif
  7374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7375. "lsrs r7, %[b], #16\n\t"
  7376. #else
  7377. "lsr r7, %[b], #16\n\t"
  7378. #endif
  7379. #ifdef WOLFSSL_KEIL
  7380. "muls r7, r6, r7\n\t"
  7381. #elif defined(__clang__)
  7382. "muls r7, r6\n\t"
  7383. #else
  7384. "mul r7, r6\n\t"
  7385. #endif
  7386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7387. "adds r5, r5, r7\n\t"
  7388. #else
  7389. "add r5, r5, r7\n\t"
  7390. #endif
  7391. #ifdef WOLFSSL_KEIL
  7392. "adcs r3, r3, %[r]\n\t"
  7393. #elif defined(__clang__)
  7394. "adcs r3, %[r]\n\t"
  7395. #else
  7396. "adc r3, %[r]\n\t"
  7397. #endif
  7398. "uxth r7, %[b]\n\t"
  7399. #ifdef WOLFSSL_KEIL
  7400. "muls r6, r7, r6\n\t"
  7401. #elif defined(__clang__)
  7402. "muls r6, r7\n\t"
  7403. #else
  7404. "mul r6, r7\n\t"
  7405. #endif
  7406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7407. "lsrs r7, r6, #16\n\t"
  7408. #else
  7409. "lsr r7, r6, #16\n\t"
  7410. #endif
  7411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7412. "lsls r6, r6, #16\n\t"
  7413. #else
  7414. "lsl r6, r6, #16\n\t"
  7415. #endif
  7416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7417. "adds r4, r4, r6\n\t"
  7418. #else
  7419. "add r4, r4, r6\n\t"
  7420. #endif
  7421. #ifdef WOLFSSL_KEIL
  7422. "adcs r5, r5, r7\n\t"
  7423. #elif defined(__clang__)
  7424. "adcs r5, r7\n\t"
  7425. #else
  7426. "adc r5, r7\n\t"
  7427. #endif
  7428. #ifdef WOLFSSL_KEIL
  7429. "adcs r3, r3, %[r]\n\t"
  7430. #elif defined(__clang__)
  7431. "adcs r3, %[r]\n\t"
  7432. #else
  7433. "adc r3, %[r]\n\t"
  7434. #endif
  7435. "# A[6] * B[4]\n\t"
  7436. "mov %[a], r9\n\t"
  7437. "mov %[b], r10\n\t"
  7438. "ldr %[a], [%[a], #24]\n\t"
  7439. "ldr %[b], [%[b], #16]\n\t"
  7440. "uxth r6, %[a]\n\t"
  7441. "uxth r7, %[b]\n\t"
  7442. #ifdef WOLFSSL_KEIL
  7443. "muls r7, r6, r7\n\t"
  7444. #elif defined(__clang__)
  7445. "muls r7, r6\n\t"
  7446. #else
  7447. "mul r7, r6\n\t"
  7448. #endif
  7449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7450. "adds r4, r4, r7\n\t"
  7451. #else
  7452. "add r4, r4, r7\n\t"
  7453. #endif
  7454. #ifdef WOLFSSL_KEIL
  7455. "adcs r5, r5, %[r]\n\t"
  7456. #elif defined(__clang__)
  7457. "adcs r5, %[r]\n\t"
  7458. #else
  7459. "adc r5, %[r]\n\t"
  7460. #endif
  7461. #ifdef WOLFSSL_KEIL
  7462. "adcs r3, r3, %[r]\n\t"
  7463. #elif defined(__clang__)
  7464. "adcs r3, %[r]\n\t"
  7465. #else
  7466. "adc r3, %[r]\n\t"
  7467. #endif
  7468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7469. "lsrs r7, %[b], #16\n\t"
  7470. #else
  7471. "lsr r7, %[b], #16\n\t"
  7472. #endif
  7473. #ifdef WOLFSSL_KEIL
  7474. "muls r6, r7, r6\n\t"
  7475. #elif defined(__clang__)
  7476. "muls r6, r7\n\t"
  7477. #else
  7478. "mul r6, r7\n\t"
  7479. #endif
  7480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7481. "lsrs r7, r6, #16\n\t"
  7482. #else
  7483. "lsr r7, r6, #16\n\t"
  7484. #endif
  7485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7486. "lsls r6, r6, #16\n\t"
  7487. #else
  7488. "lsl r6, r6, #16\n\t"
  7489. #endif
  7490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7491. "adds r4, r4, r6\n\t"
  7492. #else
  7493. "add r4, r4, r6\n\t"
  7494. #endif
  7495. #ifdef WOLFSSL_KEIL
  7496. "adcs r5, r5, r7\n\t"
  7497. #elif defined(__clang__)
  7498. "adcs r5, r7\n\t"
  7499. #else
  7500. "adc r5, r7\n\t"
  7501. #endif
  7502. #ifdef WOLFSSL_KEIL
  7503. "adcs r3, r3, %[r]\n\t"
  7504. #elif defined(__clang__)
  7505. "adcs r3, %[r]\n\t"
  7506. #else
  7507. "adc r3, %[r]\n\t"
  7508. #endif
  7509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7510. "lsrs r6, %[a], #16\n\t"
  7511. #else
  7512. "lsr r6, %[a], #16\n\t"
  7513. #endif
  7514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7515. "lsrs r7, %[b], #16\n\t"
  7516. #else
  7517. "lsr r7, %[b], #16\n\t"
  7518. #endif
  7519. #ifdef WOLFSSL_KEIL
  7520. "muls r7, r6, r7\n\t"
  7521. #elif defined(__clang__)
  7522. "muls r7, r6\n\t"
  7523. #else
  7524. "mul r7, r6\n\t"
  7525. #endif
  7526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7527. "adds r5, r5, r7\n\t"
  7528. #else
  7529. "add r5, r5, r7\n\t"
  7530. #endif
  7531. #ifdef WOLFSSL_KEIL
  7532. "adcs r3, r3, %[r]\n\t"
  7533. #elif defined(__clang__)
  7534. "adcs r3, %[r]\n\t"
  7535. #else
  7536. "adc r3, %[r]\n\t"
  7537. #endif
  7538. "uxth r7, %[b]\n\t"
  7539. #ifdef WOLFSSL_KEIL
  7540. "muls r6, r7, r6\n\t"
  7541. #elif defined(__clang__)
  7542. "muls r6, r7\n\t"
  7543. #else
  7544. "mul r6, r7\n\t"
  7545. #endif
  7546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7547. "lsrs r7, r6, #16\n\t"
  7548. #else
  7549. "lsr r7, r6, #16\n\t"
  7550. #endif
  7551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7552. "lsls r6, r6, #16\n\t"
  7553. #else
  7554. "lsl r6, r6, #16\n\t"
  7555. #endif
  7556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7557. "adds r4, r4, r6\n\t"
  7558. #else
  7559. "add r4, r4, r6\n\t"
  7560. #endif
  7561. #ifdef WOLFSSL_KEIL
  7562. "adcs r5, r5, r7\n\t"
  7563. #elif defined(__clang__)
  7564. "adcs r5, r7\n\t"
  7565. #else
  7566. "adc r5, r7\n\t"
  7567. #endif
  7568. #ifdef WOLFSSL_KEIL
  7569. "adcs r3, r3, %[r]\n\t"
  7570. #elif defined(__clang__)
  7571. "adcs r3, %[r]\n\t"
  7572. #else
  7573. "adc r3, %[r]\n\t"
  7574. #endif
  7575. "# A[5] * B[5]\n\t"
  7576. "mov %[a], r9\n\t"
  7577. "mov %[b], r10\n\t"
  7578. "ldr %[a], [%[a], #20]\n\t"
  7579. "ldr %[b], [%[b], #20]\n\t"
  7580. "uxth r6, %[a]\n\t"
  7581. "uxth r7, %[b]\n\t"
  7582. #ifdef WOLFSSL_KEIL
  7583. "muls r7, r6, r7\n\t"
  7584. #elif defined(__clang__)
  7585. "muls r7, r6\n\t"
  7586. #else
  7587. "mul r7, r6\n\t"
  7588. #endif
  7589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7590. "adds r4, r4, r7\n\t"
  7591. #else
  7592. "add r4, r4, r7\n\t"
  7593. #endif
  7594. #ifdef WOLFSSL_KEIL
  7595. "adcs r5, r5, %[r]\n\t"
  7596. #elif defined(__clang__)
  7597. "adcs r5, %[r]\n\t"
  7598. #else
  7599. "adc r5, %[r]\n\t"
  7600. #endif
  7601. #ifdef WOLFSSL_KEIL
  7602. "adcs r3, r3, %[r]\n\t"
  7603. #elif defined(__clang__)
  7604. "adcs r3, %[r]\n\t"
  7605. #else
  7606. "adc r3, %[r]\n\t"
  7607. #endif
  7608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7609. "lsrs r7, %[b], #16\n\t"
  7610. #else
  7611. "lsr r7, %[b], #16\n\t"
  7612. #endif
  7613. #ifdef WOLFSSL_KEIL
  7614. "muls r6, r7, r6\n\t"
  7615. #elif defined(__clang__)
  7616. "muls r6, r7\n\t"
  7617. #else
  7618. "mul r6, r7\n\t"
  7619. #endif
  7620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7621. "lsrs r7, r6, #16\n\t"
  7622. #else
  7623. "lsr r7, r6, #16\n\t"
  7624. #endif
  7625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7626. "lsls r6, r6, #16\n\t"
  7627. #else
  7628. "lsl r6, r6, #16\n\t"
  7629. #endif
  7630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7631. "adds r4, r4, r6\n\t"
  7632. #else
  7633. "add r4, r4, r6\n\t"
  7634. #endif
  7635. #ifdef WOLFSSL_KEIL
  7636. "adcs r5, r5, r7\n\t"
  7637. #elif defined(__clang__)
  7638. "adcs r5, r7\n\t"
  7639. #else
  7640. "adc r5, r7\n\t"
  7641. #endif
  7642. #ifdef WOLFSSL_KEIL
  7643. "adcs r3, r3, %[r]\n\t"
  7644. #elif defined(__clang__)
  7645. "adcs r3, %[r]\n\t"
  7646. #else
  7647. "adc r3, %[r]\n\t"
  7648. #endif
  7649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7650. "lsrs r6, %[a], #16\n\t"
  7651. #else
  7652. "lsr r6, %[a], #16\n\t"
  7653. #endif
  7654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7655. "lsrs r7, %[b], #16\n\t"
  7656. #else
  7657. "lsr r7, %[b], #16\n\t"
  7658. #endif
  7659. #ifdef WOLFSSL_KEIL
  7660. "muls r7, r6, r7\n\t"
  7661. #elif defined(__clang__)
  7662. "muls r7, r6\n\t"
  7663. #else
  7664. "mul r7, r6\n\t"
  7665. #endif
  7666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7667. "adds r5, r5, r7\n\t"
  7668. #else
  7669. "add r5, r5, r7\n\t"
  7670. #endif
  7671. #ifdef WOLFSSL_KEIL
  7672. "adcs r3, r3, %[r]\n\t"
  7673. #elif defined(__clang__)
  7674. "adcs r3, %[r]\n\t"
  7675. #else
  7676. "adc r3, %[r]\n\t"
  7677. #endif
  7678. "uxth r7, %[b]\n\t"
  7679. #ifdef WOLFSSL_KEIL
  7680. "muls r6, r7, r6\n\t"
  7681. #elif defined(__clang__)
  7682. "muls r6, r7\n\t"
  7683. #else
  7684. "mul r6, r7\n\t"
  7685. #endif
  7686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7687. "lsrs r7, r6, #16\n\t"
  7688. #else
  7689. "lsr r7, r6, #16\n\t"
  7690. #endif
  7691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7692. "lsls r6, r6, #16\n\t"
  7693. #else
  7694. "lsl r6, r6, #16\n\t"
  7695. #endif
  7696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7697. "adds r4, r4, r6\n\t"
  7698. #else
  7699. "add r4, r4, r6\n\t"
  7700. #endif
  7701. #ifdef WOLFSSL_KEIL
  7702. "adcs r5, r5, r7\n\t"
  7703. #elif defined(__clang__)
  7704. "adcs r5, r7\n\t"
  7705. #else
  7706. "adc r5, r7\n\t"
  7707. #endif
  7708. #ifdef WOLFSSL_KEIL
  7709. "adcs r3, r3, %[r]\n\t"
  7710. #elif defined(__clang__)
  7711. "adcs r3, %[r]\n\t"
  7712. #else
  7713. "adc r3, %[r]\n\t"
  7714. #endif
  7715. "# A[4] * B[6]\n\t"
  7716. "mov %[a], r9\n\t"
  7717. "mov %[b], r10\n\t"
  7718. "ldr %[a], [%[a], #16]\n\t"
  7719. "ldr %[b], [%[b], #24]\n\t"
  7720. "uxth r6, %[a]\n\t"
  7721. "uxth r7, %[b]\n\t"
  7722. #ifdef WOLFSSL_KEIL
  7723. "muls r7, r6, r7\n\t"
  7724. #elif defined(__clang__)
  7725. "muls r7, r6\n\t"
  7726. #else
  7727. "mul r7, r6\n\t"
  7728. #endif
  7729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7730. "adds r4, r4, r7\n\t"
  7731. #else
  7732. "add r4, r4, r7\n\t"
  7733. #endif
  7734. #ifdef WOLFSSL_KEIL
  7735. "adcs r5, r5, %[r]\n\t"
  7736. #elif defined(__clang__)
  7737. "adcs r5, %[r]\n\t"
  7738. #else
  7739. "adc r5, %[r]\n\t"
  7740. #endif
  7741. #ifdef WOLFSSL_KEIL
  7742. "adcs r3, r3, %[r]\n\t"
  7743. #elif defined(__clang__)
  7744. "adcs r3, %[r]\n\t"
  7745. #else
  7746. "adc r3, %[r]\n\t"
  7747. #endif
  7748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7749. "lsrs r7, %[b], #16\n\t"
  7750. #else
  7751. "lsr r7, %[b], #16\n\t"
  7752. #endif
  7753. #ifdef WOLFSSL_KEIL
  7754. "muls r6, r7, r6\n\t"
  7755. #elif defined(__clang__)
  7756. "muls r6, r7\n\t"
  7757. #else
  7758. "mul r6, r7\n\t"
  7759. #endif
  7760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7761. "lsrs r7, r6, #16\n\t"
  7762. #else
  7763. "lsr r7, r6, #16\n\t"
  7764. #endif
  7765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7766. "lsls r6, r6, #16\n\t"
  7767. #else
  7768. "lsl r6, r6, #16\n\t"
  7769. #endif
  7770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7771. "adds r4, r4, r6\n\t"
  7772. #else
  7773. "add r4, r4, r6\n\t"
  7774. #endif
  7775. #ifdef WOLFSSL_KEIL
  7776. "adcs r5, r5, r7\n\t"
  7777. #elif defined(__clang__)
  7778. "adcs r5, r7\n\t"
  7779. #else
  7780. "adc r5, r7\n\t"
  7781. #endif
  7782. #ifdef WOLFSSL_KEIL
  7783. "adcs r3, r3, %[r]\n\t"
  7784. #elif defined(__clang__)
  7785. "adcs r3, %[r]\n\t"
  7786. #else
  7787. "adc r3, %[r]\n\t"
  7788. #endif
  7789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7790. "lsrs r6, %[a], #16\n\t"
  7791. #else
  7792. "lsr r6, %[a], #16\n\t"
  7793. #endif
  7794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7795. "lsrs r7, %[b], #16\n\t"
  7796. #else
  7797. "lsr r7, %[b], #16\n\t"
  7798. #endif
  7799. #ifdef WOLFSSL_KEIL
  7800. "muls r7, r6, r7\n\t"
  7801. #elif defined(__clang__)
  7802. "muls r7, r6\n\t"
  7803. #else
  7804. "mul r7, r6\n\t"
  7805. #endif
  7806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7807. "adds r5, r5, r7\n\t"
  7808. #else
  7809. "add r5, r5, r7\n\t"
  7810. #endif
  7811. #ifdef WOLFSSL_KEIL
  7812. "adcs r3, r3, %[r]\n\t"
  7813. #elif defined(__clang__)
  7814. "adcs r3, %[r]\n\t"
  7815. #else
  7816. "adc r3, %[r]\n\t"
  7817. #endif
  7818. "uxth r7, %[b]\n\t"
  7819. #ifdef WOLFSSL_KEIL
  7820. "muls r6, r7, r6\n\t"
  7821. #elif defined(__clang__)
  7822. "muls r6, r7\n\t"
  7823. #else
  7824. "mul r6, r7\n\t"
  7825. #endif
  7826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7827. "lsrs r7, r6, #16\n\t"
  7828. #else
  7829. "lsr r7, r6, #16\n\t"
  7830. #endif
  7831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7832. "lsls r6, r6, #16\n\t"
  7833. #else
  7834. "lsl r6, r6, #16\n\t"
  7835. #endif
  7836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7837. "adds r4, r4, r6\n\t"
  7838. #else
  7839. "add r4, r4, r6\n\t"
  7840. #endif
  7841. #ifdef WOLFSSL_KEIL
  7842. "adcs r5, r5, r7\n\t"
  7843. #elif defined(__clang__)
  7844. "adcs r5, r7\n\t"
  7845. #else
  7846. "adc r5, r7\n\t"
  7847. #endif
  7848. #ifdef WOLFSSL_KEIL
  7849. "adcs r3, r3, %[r]\n\t"
  7850. #elif defined(__clang__)
  7851. "adcs r3, %[r]\n\t"
  7852. #else
  7853. "adc r3, %[r]\n\t"
  7854. #endif
  7855. "# A[3] * B[7]\n\t"
  7856. "mov %[a], r9\n\t"
  7857. "mov %[b], r10\n\t"
  7858. "ldr %[a], [%[a], #12]\n\t"
  7859. "ldr %[b], [%[b], #28]\n\t"
  7860. "uxth r6, %[a]\n\t"
  7861. "uxth r7, %[b]\n\t"
  7862. #ifdef WOLFSSL_KEIL
  7863. "muls r7, r6, r7\n\t"
  7864. #elif defined(__clang__)
  7865. "muls r7, r6\n\t"
  7866. #else
  7867. "mul r7, r6\n\t"
  7868. #endif
  7869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7870. "adds r4, r4, r7\n\t"
  7871. #else
  7872. "add r4, r4, r7\n\t"
  7873. #endif
  7874. #ifdef WOLFSSL_KEIL
  7875. "adcs r5, r5, %[r]\n\t"
  7876. #elif defined(__clang__)
  7877. "adcs r5, %[r]\n\t"
  7878. #else
  7879. "adc r5, %[r]\n\t"
  7880. #endif
  7881. #ifdef WOLFSSL_KEIL
  7882. "adcs r3, r3, %[r]\n\t"
  7883. #elif defined(__clang__)
  7884. "adcs r3, %[r]\n\t"
  7885. #else
  7886. "adc r3, %[r]\n\t"
  7887. #endif
  7888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7889. "lsrs r7, %[b], #16\n\t"
  7890. #else
  7891. "lsr r7, %[b], #16\n\t"
  7892. #endif
  7893. #ifdef WOLFSSL_KEIL
  7894. "muls r6, r7, r6\n\t"
  7895. #elif defined(__clang__)
  7896. "muls r6, r7\n\t"
  7897. #else
  7898. "mul r6, r7\n\t"
  7899. #endif
  7900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7901. "lsrs r7, r6, #16\n\t"
  7902. #else
  7903. "lsr r7, r6, #16\n\t"
  7904. #endif
  7905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7906. "lsls r6, r6, #16\n\t"
  7907. #else
  7908. "lsl r6, r6, #16\n\t"
  7909. #endif
  7910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7911. "adds r4, r4, r6\n\t"
  7912. #else
  7913. "add r4, r4, r6\n\t"
  7914. #endif
  7915. #ifdef WOLFSSL_KEIL
  7916. "adcs r5, r5, r7\n\t"
  7917. #elif defined(__clang__)
  7918. "adcs r5, r7\n\t"
  7919. #else
  7920. "adc r5, r7\n\t"
  7921. #endif
  7922. #ifdef WOLFSSL_KEIL
  7923. "adcs r3, r3, %[r]\n\t"
  7924. #elif defined(__clang__)
  7925. "adcs r3, %[r]\n\t"
  7926. #else
  7927. "adc r3, %[r]\n\t"
  7928. #endif
  7929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7930. "lsrs r6, %[a], #16\n\t"
  7931. #else
  7932. "lsr r6, %[a], #16\n\t"
  7933. #endif
  7934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7935. "lsrs r7, %[b], #16\n\t"
  7936. #else
  7937. "lsr r7, %[b], #16\n\t"
  7938. #endif
  7939. #ifdef WOLFSSL_KEIL
  7940. "muls r7, r6, r7\n\t"
  7941. #elif defined(__clang__)
  7942. "muls r7, r6\n\t"
  7943. #else
  7944. "mul r7, r6\n\t"
  7945. #endif
  7946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7947. "adds r5, r5, r7\n\t"
  7948. #else
  7949. "add r5, r5, r7\n\t"
  7950. #endif
  7951. #ifdef WOLFSSL_KEIL
  7952. "adcs r3, r3, %[r]\n\t"
  7953. #elif defined(__clang__)
  7954. "adcs r3, %[r]\n\t"
  7955. #else
  7956. "adc r3, %[r]\n\t"
  7957. #endif
  7958. "uxth r7, %[b]\n\t"
  7959. #ifdef WOLFSSL_KEIL
  7960. "muls r6, r7, r6\n\t"
  7961. #elif defined(__clang__)
  7962. "muls r6, r7\n\t"
  7963. #else
  7964. "mul r6, r7\n\t"
  7965. #endif
  7966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7967. "lsrs r7, r6, #16\n\t"
  7968. #else
  7969. "lsr r7, r6, #16\n\t"
  7970. #endif
  7971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7972. "lsls r6, r6, #16\n\t"
  7973. #else
  7974. "lsl r6, r6, #16\n\t"
  7975. #endif
  7976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  7977. "adds r4, r4, r6\n\t"
  7978. #else
  7979. "add r4, r4, r6\n\t"
  7980. #endif
  7981. #ifdef WOLFSSL_KEIL
  7982. "adcs r5, r5, r7\n\t"
  7983. #elif defined(__clang__)
  7984. "adcs r5, r7\n\t"
  7985. #else
  7986. "adc r5, r7\n\t"
  7987. #endif
  7988. #ifdef WOLFSSL_KEIL
  7989. "adcs r3, r3, %[r]\n\t"
  7990. #elif defined(__clang__)
  7991. "adcs r3, %[r]\n\t"
  7992. #else
  7993. "adc r3, %[r]\n\t"
  7994. #endif
  7995. "mov %[r], r8\n\t"
  7996. "str r4, [%[r], #40]\n\t"
  7997. "movs %[r], #0\n\t"
  7998. "# A[4] * B[7]\n\t"
  7999. "movs r4, #0\n\t"
  8000. "mov %[a], r9\n\t"
  8001. "mov %[b], r10\n\t"
  8002. "ldr %[a], [%[a], #16]\n\t"
  8003. "ldr %[b], [%[b], #28]\n\t"
  8004. "uxth r6, %[a]\n\t"
  8005. "uxth r7, %[b]\n\t"
  8006. #ifdef WOLFSSL_KEIL
  8007. "muls r7, r6, r7\n\t"
  8008. #elif defined(__clang__)
  8009. "muls r7, r6\n\t"
  8010. #else
  8011. "mul r7, r6\n\t"
  8012. #endif
  8013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8014. "adds r5, r5, r7\n\t"
  8015. #else
  8016. "add r5, r5, r7\n\t"
  8017. #endif
  8018. #ifdef WOLFSSL_KEIL
  8019. "adcs r3, r3, %[r]\n\t"
  8020. #elif defined(__clang__)
  8021. "adcs r3, %[r]\n\t"
  8022. #else
  8023. "adc r3, %[r]\n\t"
  8024. #endif
  8025. #ifdef WOLFSSL_KEIL
  8026. "adcs r4, r4, %[r]\n\t"
  8027. #elif defined(__clang__)
  8028. "adcs r4, %[r]\n\t"
  8029. #else
  8030. "adc r4, %[r]\n\t"
  8031. #endif
  8032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8033. "lsrs r7, %[b], #16\n\t"
  8034. #else
  8035. "lsr r7, %[b], #16\n\t"
  8036. #endif
  8037. #ifdef WOLFSSL_KEIL
  8038. "muls r6, r7, r6\n\t"
  8039. #elif defined(__clang__)
  8040. "muls r6, r7\n\t"
  8041. #else
  8042. "mul r6, r7\n\t"
  8043. #endif
  8044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8045. "lsrs r7, r6, #16\n\t"
  8046. #else
  8047. "lsr r7, r6, #16\n\t"
  8048. #endif
  8049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8050. "lsls r6, r6, #16\n\t"
  8051. #else
  8052. "lsl r6, r6, #16\n\t"
  8053. #endif
  8054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8055. "adds r5, r5, r6\n\t"
  8056. #else
  8057. "add r5, r5, r6\n\t"
  8058. #endif
  8059. #ifdef WOLFSSL_KEIL
  8060. "adcs r3, r3, r7\n\t"
  8061. #elif defined(__clang__)
  8062. "adcs r3, r7\n\t"
  8063. #else
  8064. "adc r3, r7\n\t"
  8065. #endif
  8066. #ifdef WOLFSSL_KEIL
  8067. "adcs r4, r4, %[r]\n\t"
  8068. #elif defined(__clang__)
  8069. "adcs r4, %[r]\n\t"
  8070. #else
  8071. "adc r4, %[r]\n\t"
  8072. #endif
  8073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8074. "lsrs r6, %[a], #16\n\t"
  8075. #else
  8076. "lsr r6, %[a], #16\n\t"
  8077. #endif
  8078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8079. "lsrs r7, %[b], #16\n\t"
  8080. #else
  8081. "lsr r7, %[b], #16\n\t"
  8082. #endif
  8083. #ifdef WOLFSSL_KEIL
  8084. "muls r7, r6, r7\n\t"
  8085. #elif defined(__clang__)
  8086. "muls r7, r6\n\t"
  8087. #else
  8088. "mul r7, r6\n\t"
  8089. #endif
  8090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8091. "adds r3, r3, r7\n\t"
  8092. #else
  8093. "add r3, r3, r7\n\t"
  8094. #endif
  8095. #ifdef WOLFSSL_KEIL
  8096. "adcs r4, r4, %[r]\n\t"
  8097. #elif defined(__clang__)
  8098. "adcs r4, %[r]\n\t"
  8099. #else
  8100. "adc r4, %[r]\n\t"
  8101. #endif
  8102. "uxth r7, %[b]\n\t"
  8103. #ifdef WOLFSSL_KEIL
  8104. "muls r6, r7, r6\n\t"
  8105. #elif defined(__clang__)
  8106. "muls r6, r7\n\t"
  8107. #else
  8108. "mul r6, r7\n\t"
  8109. #endif
  8110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8111. "lsrs r7, r6, #16\n\t"
  8112. #else
  8113. "lsr r7, r6, #16\n\t"
  8114. #endif
  8115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8116. "lsls r6, r6, #16\n\t"
  8117. #else
  8118. "lsl r6, r6, #16\n\t"
  8119. #endif
  8120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8121. "adds r5, r5, r6\n\t"
  8122. #else
  8123. "add r5, r5, r6\n\t"
  8124. #endif
  8125. #ifdef WOLFSSL_KEIL
  8126. "adcs r3, r3, r7\n\t"
  8127. #elif defined(__clang__)
  8128. "adcs r3, r7\n\t"
  8129. #else
  8130. "adc r3, r7\n\t"
  8131. #endif
  8132. #ifdef WOLFSSL_KEIL
  8133. "adcs r4, r4, %[r]\n\t"
  8134. #elif defined(__clang__)
  8135. "adcs r4, %[r]\n\t"
  8136. #else
  8137. "adc r4, %[r]\n\t"
  8138. #endif
  8139. "# A[5] * B[6]\n\t"
  8140. "mov %[a], r9\n\t"
  8141. "mov %[b], r10\n\t"
  8142. "ldr %[a], [%[a], #20]\n\t"
  8143. "ldr %[b], [%[b], #24]\n\t"
  8144. "uxth r6, %[a]\n\t"
  8145. "uxth r7, %[b]\n\t"
  8146. #ifdef WOLFSSL_KEIL
  8147. "muls r7, r6, r7\n\t"
  8148. #elif defined(__clang__)
  8149. "muls r7, r6\n\t"
  8150. #else
  8151. "mul r7, r6\n\t"
  8152. #endif
  8153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8154. "adds r5, r5, r7\n\t"
  8155. #else
  8156. "add r5, r5, r7\n\t"
  8157. #endif
  8158. #ifdef WOLFSSL_KEIL
  8159. "adcs r3, r3, %[r]\n\t"
  8160. #elif defined(__clang__)
  8161. "adcs r3, %[r]\n\t"
  8162. #else
  8163. "adc r3, %[r]\n\t"
  8164. #endif
  8165. #ifdef WOLFSSL_KEIL
  8166. "adcs r4, r4, %[r]\n\t"
  8167. #elif defined(__clang__)
  8168. "adcs r4, %[r]\n\t"
  8169. #else
  8170. "adc r4, %[r]\n\t"
  8171. #endif
  8172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8173. "lsrs r7, %[b], #16\n\t"
  8174. #else
  8175. "lsr r7, %[b], #16\n\t"
  8176. #endif
  8177. #ifdef WOLFSSL_KEIL
  8178. "muls r6, r7, r6\n\t"
  8179. #elif defined(__clang__)
  8180. "muls r6, r7\n\t"
  8181. #else
  8182. "mul r6, r7\n\t"
  8183. #endif
  8184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8185. "lsrs r7, r6, #16\n\t"
  8186. #else
  8187. "lsr r7, r6, #16\n\t"
  8188. #endif
  8189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8190. "lsls r6, r6, #16\n\t"
  8191. #else
  8192. "lsl r6, r6, #16\n\t"
  8193. #endif
  8194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8195. "adds r5, r5, r6\n\t"
  8196. #else
  8197. "add r5, r5, r6\n\t"
  8198. #endif
  8199. #ifdef WOLFSSL_KEIL
  8200. "adcs r3, r3, r7\n\t"
  8201. #elif defined(__clang__)
  8202. "adcs r3, r7\n\t"
  8203. #else
  8204. "adc r3, r7\n\t"
  8205. #endif
  8206. #ifdef WOLFSSL_KEIL
  8207. "adcs r4, r4, %[r]\n\t"
  8208. #elif defined(__clang__)
  8209. "adcs r4, %[r]\n\t"
  8210. #else
  8211. "adc r4, %[r]\n\t"
  8212. #endif
  8213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8214. "lsrs r6, %[a], #16\n\t"
  8215. #else
  8216. "lsr r6, %[a], #16\n\t"
  8217. #endif
  8218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8219. "lsrs r7, %[b], #16\n\t"
  8220. #else
  8221. "lsr r7, %[b], #16\n\t"
  8222. #endif
  8223. #ifdef WOLFSSL_KEIL
  8224. "muls r7, r6, r7\n\t"
  8225. #elif defined(__clang__)
  8226. "muls r7, r6\n\t"
  8227. #else
  8228. "mul r7, r6\n\t"
  8229. #endif
  8230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8231. "adds r3, r3, r7\n\t"
  8232. #else
  8233. "add r3, r3, r7\n\t"
  8234. #endif
  8235. #ifdef WOLFSSL_KEIL
  8236. "adcs r4, r4, %[r]\n\t"
  8237. #elif defined(__clang__)
  8238. "adcs r4, %[r]\n\t"
  8239. #else
  8240. "adc r4, %[r]\n\t"
  8241. #endif
  8242. "uxth r7, %[b]\n\t"
  8243. #ifdef WOLFSSL_KEIL
  8244. "muls r6, r7, r6\n\t"
  8245. #elif defined(__clang__)
  8246. "muls r6, r7\n\t"
  8247. #else
  8248. "mul r6, r7\n\t"
  8249. #endif
  8250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8251. "lsrs r7, r6, #16\n\t"
  8252. #else
  8253. "lsr r7, r6, #16\n\t"
  8254. #endif
  8255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8256. "lsls r6, r6, #16\n\t"
  8257. #else
  8258. "lsl r6, r6, #16\n\t"
  8259. #endif
  8260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8261. "adds r5, r5, r6\n\t"
  8262. #else
  8263. "add r5, r5, r6\n\t"
  8264. #endif
  8265. #ifdef WOLFSSL_KEIL
  8266. "adcs r3, r3, r7\n\t"
  8267. #elif defined(__clang__)
  8268. "adcs r3, r7\n\t"
  8269. #else
  8270. "adc r3, r7\n\t"
  8271. #endif
  8272. #ifdef WOLFSSL_KEIL
  8273. "adcs r4, r4, %[r]\n\t"
  8274. #elif defined(__clang__)
  8275. "adcs r4, %[r]\n\t"
  8276. #else
  8277. "adc r4, %[r]\n\t"
  8278. #endif
  8279. "# A[6] * B[5]\n\t"
  8280. "mov %[a], r9\n\t"
  8281. "mov %[b], r10\n\t"
  8282. "ldr %[a], [%[a], #24]\n\t"
  8283. "ldr %[b], [%[b], #20]\n\t"
  8284. "uxth r6, %[a]\n\t"
  8285. "uxth r7, %[b]\n\t"
  8286. #ifdef WOLFSSL_KEIL
  8287. "muls r7, r6, r7\n\t"
  8288. #elif defined(__clang__)
  8289. "muls r7, r6\n\t"
  8290. #else
  8291. "mul r7, r6\n\t"
  8292. #endif
  8293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8294. "adds r5, r5, r7\n\t"
  8295. #else
  8296. "add r5, r5, r7\n\t"
  8297. #endif
  8298. #ifdef WOLFSSL_KEIL
  8299. "adcs r3, r3, %[r]\n\t"
  8300. #elif defined(__clang__)
  8301. "adcs r3, %[r]\n\t"
  8302. #else
  8303. "adc r3, %[r]\n\t"
  8304. #endif
  8305. #ifdef WOLFSSL_KEIL
  8306. "adcs r4, r4, %[r]\n\t"
  8307. #elif defined(__clang__)
  8308. "adcs r4, %[r]\n\t"
  8309. #else
  8310. "adc r4, %[r]\n\t"
  8311. #endif
  8312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8313. "lsrs r7, %[b], #16\n\t"
  8314. #else
  8315. "lsr r7, %[b], #16\n\t"
  8316. #endif
  8317. #ifdef WOLFSSL_KEIL
  8318. "muls r6, r7, r6\n\t"
  8319. #elif defined(__clang__)
  8320. "muls r6, r7\n\t"
  8321. #else
  8322. "mul r6, r7\n\t"
  8323. #endif
  8324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8325. "lsrs r7, r6, #16\n\t"
  8326. #else
  8327. "lsr r7, r6, #16\n\t"
  8328. #endif
  8329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8330. "lsls r6, r6, #16\n\t"
  8331. #else
  8332. "lsl r6, r6, #16\n\t"
  8333. #endif
  8334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8335. "adds r5, r5, r6\n\t"
  8336. #else
  8337. "add r5, r5, r6\n\t"
  8338. #endif
  8339. #ifdef WOLFSSL_KEIL
  8340. "adcs r3, r3, r7\n\t"
  8341. #elif defined(__clang__)
  8342. "adcs r3, r7\n\t"
  8343. #else
  8344. "adc r3, r7\n\t"
  8345. #endif
  8346. #ifdef WOLFSSL_KEIL
  8347. "adcs r4, r4, %[r]\n\t"
  8348. #elif defined(__clang__)
  8349. "adcs r4, %[r]\n\t"
  8350. #else
  8351. "adc r4, %[r]\n\t"
  8352. #endif
  8353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8354. "lsrs r6, %[a], #16\n\t"
  8355. #else
  8356. "lsr r6, %[a], #16\n\t"
  8357. #endif
  8358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8359. "lsrs r7, %[b], #16\n\t"
  8360. #else
  8361. "lsr r7, %[b], #16\n\t"
  8362. #endif
  8363. #ifdef WOLFSSL_KEIL
  8364. "muls r7, r6, r7\n\t"
  8365. #elif defined(__clang__)
  8366. "muls r7, r6\n\t"
  8367. #else
  8368. "mul r7, r6\n\t"
  8369. #endif
  8370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8371. "adds r3, r3, r7\n\t"
  8372. #else
  8373. "add r3, r3, r7\n\t"
  8374. #endif
  8375. #ifdef WOLFSSL_KEIL
  8376. "adcs r4, r4, %[r]\n\t"
  8377. #elif defined(__clang__)
  8378. "adcs r4, %[r]\n\t"
  8379. #else
  8380. "adc r4, %[r]\n\t"
  8381. #endif
  8382. "uxth r7, %[b]\n\t"
  8383. #ifdef WOLFSSL_KEIL
  8384. "muls r6, r7, r6\n\t"
  8385. #elif defined(__clang__)
  8386. "muls r6, r7\n\t"
  8387. #else
  8388. "mul r6, r7\n\t"
  8389. #endif
  8390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8391. "lsrs r7, r6, #16\n\t"
  8392. #else
  8393. "lsr r7, r6, #16\n\t"
  8394. #endif
  8395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8396. "lsls r6, r6, #16\n\t"
  8397. #else
  8398. "lsl r6, r6, #16\n\t"
  8399. #endif
  8400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8401. "adds r5, r5, r6\n\t"
  8402. #else
  8403. "add r5, r5, r6\n\t"
  8404. #endif
  8405. #ifdef WOLFSSL_KEIL
  8406. "adcs r3, r3, r7\n\t"
  8407. #elif defined(__clang__)
  8408. "adcs r3, r7\n\t"
  8409. #else
  8410. "adc r3, r7\n\t"
  8411. #endif
  8412. #ifdef WOLFSSL_KEIL
  8413. "adcs r4, r4, %[r]\n\t"
  8414. #elif defined(__clang__)
  8415. "adcs r4, %[r]\n\t"
  8416. #else
  8417. "adc r4, %[r]\n\t"
  8418. #endif
  8419. "# A[7] * B[4]\n\t"
  8420. "mov %[a], r9\n\t"
  8421. "mov %[b], r10\n\t"
  8422. "ldr %[a], [%[a], #28]\n\t"
  8423. "ldr %[b], [%[b], #16]\n\t"
  8424. "uxth r6, %[a]\n\t"
  8425. "uxth r7, %[b]\n\t"
  8426. #ifdef WOLFSSL_KEIL
  8427. "muls r7, r6, r7\n\t"
  8428. #elif defined(__clang__)
  8429. "muls r7, r6\n\t"
  8430. #else
  8431. "mul r7, r6\n\t"
  8432. #endif
  8433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8434. "adds r5, r5, r7\n\t"
  8435. #else
  8436. "add r5, r5, r7\n\t"
  8437. #endif
  8438. #ifdef WOLFSSL_KEIL
  8439. "adcs r3, r3, %[r]\n\t"
  8440. #elif defined(__clang__)
  8441. "adcs r3, %[r]\n\t"
  8442. #else
  8443. "adc r3, %[r]\n\t"
  8444. #endif
  8445. #ifdef WOLFSSL_KEIL
  8446. "adcs r4, r4, %[r]\n\t"
  8447. #elif defined(__clang__)
  8448. "adcs r4, %[r]\n\t"
  8449. #else
  8450. "adc r4, %[r]\n\t"
  8451. #endif
  8452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8453. "lsrs r7, %[b], #16\n\t"
  8454. #else
  8455. "lsr r7, %[b], #16\n\t"
  8456. #endif
  8457. #ifdef WOLFSSL_KEIL
  8458. "muls r6, r7, r6\n\t"
  8459. #elif defined(__clang__)
  8460. "muls r6, r7\n\t"
  8461. #else
  8462. "mul r6, r7\n\t"
  8463. #endif
  8464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8465. "lsrs r7, r6, #16\n\t"
  8466. #else
  8467. "lsr r7, r6, #16\n\t"
  8468. #endif
  8469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8470. "lsls r6, r6, #16\n\t"
  8471. #else
  8472. "lsl r6, r6, #16\n\t"
  8473. #endif
  8474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8475. "adds r5, r5, r6\n\t"
  8476. #else
  8477. "add r5, r5, r6\n\t"
  8478. #endif
  8479. #ifdef WOLFSSL_KEIL
  8480. "adcs r3, r3, r7\n\t"
  8481. #elif defined(__clang__)
  8482. "adcs r3, r7\n\t"
  8483. #else
  8484. "adc r3, r7\n\t"
  8485. #endif
  8486. #ifdef WOLFSSL_KEIL
  8487. "adcs r4, r4, %[r]\n\t"
  8488. #elif defined(__clang__)
  8489. "adcs r4, %[r]\n\t"
  8490. #else
  8491. "adc r4, %[r]\n\t"
  8492. #endif
  8493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8494. "lsrs r6, %[a], #16\n\t"
  8495. #else
  8496. "lsr r6, %[a], #16\n\t"
  8497. #endif
  8498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8499. "lsrs r7, %[b], #16\n\t"
  8500. #else
  8501. "lsr r7, %[b], #16\n\t"
  8502. #endif
  8503. #ifdef WOLFSSL_KEIL
  8504. "muls r7, r6, r7\n\t"
  8505. #elif defined(__clang__)
  8506. "muls r7, r6\n\t"
  8507. #else
  8508. "mul r7, r6\n\t"
  8509. #endif
  8510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8511. "adds r3, r3, r7\n\t"
  8512. #else
  8513. "add r3, r3, r7\n\t"
  8514. #endif
  8515. #ifdef WOLFSSL_KEIL
  8516. "adcs r4, r4, %[r]\n\t"
  8517. #elif defined(__clang__)
  8518. "adcs r4, %[r]\n\t"
  8519. #else
  8520. "adc r4, %[r]\n\t"
  8521. #endif
  8522. "uxth r7, %[b]\n\t"
  8523. #ifdef WOLFSSL_KEIL
  8524. "muls r6, r7, r6\n\t"
  8525. #elif defined(__clang__)
  8526. "muls r6, r7\n\t"
  8527. #else
  8528. "mul r6, r7\n\t"
  8529. #endif
  8530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8531. "lsrs r7, r6, #16\n\t"
  8532. #else
  8533. "lsr r7, r6, #16\n\t"
  8534. #endif
  8535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8536. "lsls r6, r6, #16\n\t"
  8537. #else
  8538. "lsl r6, r6, #16\n\t"
  8539. #endif
  8540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8541. "adds r5, r5, r6\n\t"
  8542. #else
  8543. "add r5, r5, r6\n\t"
  8544. #endif
  8545. #ifdef WOLFSSL_KEIL
  8546. "adcs r3, r3, r7\n\t"
  8547. #elif defined(__clang__)
  8548. "adcs r3, r7\n\t"
  8549. #else
  8550. "adc r3, r7\n\t"
  8551. #endif
  8552. #ifdef WOLFSSL_KEIL
  8553. "adcs r4, r4, %[r]\n\t"
  8554. #elif defined(__clang__)
  8555. "adcs r4, %[r]\n\t"
  8556. #else
  8557. "adc r4, %[r]\n\t"
  8558. #endif
  8559. "mov %[r], r8\n\t"
  8560. "str r5, [%[r], #44]\n\t"
  8561. "movs %[r], #0\n\t"
  8562. "# A[7] * B[5]\n\t"
  8563. "movs r5, #0\n\t"
  8564. "mov %[a], r9\n\t"
  8565. "mov %[b], r10\n\t"
  8566. "ldr %[a], [%[a], #28]\n\t"
  8567. "ldr %[b], [%[b], #20]\n\t"
  8568. "uxth r6, %[a]\n\t"
  8569. "uxth r7, %[b]\n\t"
  8570. #ifdef WOLFSSL_KEIL
  8571. "muls r7, r6, r7\n\t"
  8572. #elif defined(__clang__)
  8573. "muls r7, r6\n\t"
  8574. #else
  8575. "mul r7, r6\n\t"
  8576. #endif
  8577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8578. "adds r3, r3, r7\n\t"
  8579. #else
  8580. "add r3, r3, r7\n\t"
  8581. #endif
  8582. #ifdef WOLFSSL_KEIL
  8583. "adcs r4, r4, %[r]\n\t"
  8584. #elif defined(__clang__)
  8585. "adcs r4, %[r]\n\t"
  8586. #else
  8587. "adc r4, %[r]\n\t"
  8588. #endif
  8589. #ifdef WOLFSSL_KEIL
  8590. "adcs r5, r5, %[r]\n\t"
  8591. #elif defined(__clang__)
  8592. "adcs r5, %[r]\n\t"
  8593. #else
  8594. "adc r5, %[r]\n\t"
  8595. #endif
  8596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8597. "lsrs r7, %[b], #16\n\t"
  8598. #else
  8599. "lsr r7, %[b], #16\n\t"
  8600. #endif
  8601. #ifdef WOLFSSL_KEIL
  8602. "muls r6, r7, r6\n\t"
  8603. #elif defined(__clang__)
  8604. "muls r6, r7\n\t"
  8605. #else
  8606. "mul r6, r7\n\t"
  8607. #endif
  8608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8609. "lsrs r7, r6, #16\n\t"
  8610. #else
  8611. "lsr r7, r6, #16\n\t"
  8612. #endif
  8613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8614. "lsls r6, r6, #16\n\t"
  8615. #else
  8616. "lsl r6, r6, #16\n\t"
  8617. #endif
  8618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8619. "adds r3, r3, r6\n\t"
  8620. #else
  8621. "add r3, r3, r6\n\t"
  8622. #endif
  8623. #ifdef WOLFSSL_KEIL
  8624. "adcs r4, r4, r7\n\t"
  8625. #elif defined(__clang__)
  8626. "adcs r4, r7\n\t"
  8627. #else
  8628. "adc r4, r7\n\t"
  8629. #endif
  8630. #ifdef WOLFSSL_KEIL
  8631. "adcs r5, r5, %[r]\n\t"
  8632. #elif defined(__clang__)
  8633. "adcs r5, %[r]\n\t"
  8634. #else
  8635. "adc r5, %[r]\n\t"
  8636. #endif
  8637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8638. "lsrs r6, %[a], #16\n\t"
  8639. #else
  8640. "lsr r6, %[a], #16\n\t"
  8641. #endif
  8642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8643. "lsrs r7, %[b], #16\n\t"
  8644. #else
  8645. "lsr r7, %[b], #16\n\t"
  8646. #endif
  8647. #ifdef WOLFSSL_KEIL
  8648. "muls r7, r6, r7\n\t"
  8649. #elif defined(__clang__)
  8650. "muls r7, r6\n\t"
  8651. #else
  8652. "mul r7, r6\n\t"
  8653. #endif
  8654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8655. "adds r4, r4, r7\n\t"
  8656. #else
  8657. "add r4, r4, r7\n\t"
  8658. #endif
  8659. #ifdef WOLFSSL_KEIL
  8660. "adcs r5, r5, %[r]\n\t"
  8661. #elif defined(__clang__)
  8662. "adcs r5, %[r]\n\t"
  8663. #else
  8664. "adc r5, %[r]\n\t"
  8665. #endif
  8666. "uxth r7, %[b]\n\t"
  8667. #ifdef WOLFSSL_KEIL
  8668. "muls r6, r7, r6\n\t"
  8669. #elif defined(__clang__)
  8670. "muls r6, r7\n\t"
  8671. #else
  8672. "mul r6, r7\n\t"
  8673. #endif
  8674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8675. "lsrs r7, r6, #16\n\t"
  8676. #else
  8677. "lsr r7, r6, #16\n\t"
  8678. #endif
  8679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8680. "lsls r6, r6, #16\n\t"
  8681. #else
  8682. "lsl r6, r6, #16\n\t"
  8683. #endif
  8684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8685. "adds r3, r3, r6\n\t"
  8686. #else
  8687. "add r3, r3, r6\n\t"
  8688. #endif
  8689. #ifdef WOLFSSL_KEIL
  8690. "adcs r4, r4, r7\n\t"
  8691. #elif defined(__clang__)
  8692. "adcs r4, r7\n\t"
  8693. #else
  8694. "adc r4, r7\n\t"
  8695. #endif
  8696. #ifdef WOLFSSL_KEIL
  8697. "adcs r5, r5, %[r]\n\t"
  8698. #elif defined(__clang__)
  8699. "adcs r5, %[r]\n\t"
  8700. #else
  8701. "adc r5, %[r]\n\t"
  8702. #endif
  8703. "# A[6] * B[6]\n\t"
  8704. "mov %[a], r9\n\t"
  8705. "mov %[b], r10\n\t"
  8706. "ldr %[a], [%[a], #24]\n\t"
  8707. "ldr %[b], [%[b], #24]\n\t"
  8708. "uxth r6, %[a]\n\t"
  8709. "uxth r7, %[b]\n\t"
  8710. #ifdef WOLFSSL_KEIL
  8711. "muls r7, r6, r7\n\t"
  8712. #elif defined(__clang__)
  8713. "muls r7, r6\n\t"
  8714. #else
  8715. "mul r7, r6\n\t"
  8716. #endif
  8717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8718. "adds r3, r3, r7\n\t"
  8719. #else
  8720. "add r3, r3, r7\n\t"
  8721. #endif
  8722. #ifdef WOLFSSL_KEIL
  8723. "adcs r4, r4, %[r]\n\t"
  8724. #elif defined(__clang__)
  8725. "adcs r4, %[r]\n\t"
  8726. #else
  8727. "adc r4, %[r]\n\t"
  8728. #endif
  8729. #ifdef WOLFSSL_KEIL
  8730. "adcs r5, r5, %[r]\n\t"
  8731. #elif defined(__clang__)
  8732. "adcs r5, %[r]\n\t"
  8733. #else
  8734. "adc r5, %[r]\n\t"
  8735. #endif
  8736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8737. "lsrs r7, %[b], #16\n\t"
  8738. #else
  8739. "lsr r7, %[b], #16\n\t"
  8740. #endif
  8741. #ifdef WOLFSSL_KEIL
  8742. "muls r6, r7, r6\n\t"
  8743. #elif defined(__clang__)
  8744. "muls r6, r7\n\t"
  8745. #else
  8746. "mul r6, r7\n\t"
  8747. #endif
  8748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8749. "lsrs r7, r6, #16\n\t"
  8750. #else
  8751. "lsr r7, r6, #16\n\t"
  8752. #endif
  8753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8754. "lsls r6, r6, #16\n\t"
  8755. #else
  8756. "lsl r6, r6, #16\n\t"
  8757. #endif
  8758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8759. "adds r3, r3, r6\n\t"
  8760. #else
  8761. "add r3, r3, r6\n\t"
  8762. #endif
  8763. #ifdef WOLFSSL_KEIL
  8764. "adcs r4, r4, r7\n\t"
  8765. #elif defined(__clang__)
  8766. "adcs r4, r7\n\t"
  8767. #else
  8768. "adc r4, r7\n\t"
  8769. #endif
  8770. #ifdef WOLFSSL_KEIL
  8771. "adcs r5, r5, %[r]\n\t"
  8772. #elif defined(__clang__)
  8773. "adcs r5, %[r]\n\t"
  8774. #else
  8775. "adc r5, %[r]\n\t"
  8776. #endif
  8777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8778. "lsrs r6, %[a], #16\n\t"
  8779. #else
  8780. "lsr r6, %[a], #16\n\t"
  8781. #endif
  8782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8783. "lsrs r7, %[b], #16\n\t"
  8784. #else
  8785. "lsr r7, %[b], #16\n\t"
  8786. #endif
  8787. #ifdef WOLFSSL_KEIL
  8788. "muls r7, r6, r7\n\t"
  8789. #elif defined(__clang__)
  8790. "muls r7, r6\n\t"
  8791. #else
  8792. "mul r7, r6\n\t"
  8793. #endif
  8794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8795. "adds r4, r4, r7\n\t"
  8796. #else
  8797. "add r4, r4, r7\n\t"
  8798. #endif
  8799. #ifdef WOLFSSL_KEIL
  8800. "adcs r5, r5, %[r]\n\t"
  8801. #elif defined(__clang__)
  8802. "adcs r5, %[r]\n\t"
  8803. #else
  8804. "adc r5, %[r]\n\t"
  8805. #endif
  8806. "uxth r7, %[b]\n\t"
  8807. #ifdef WOLFSSL_KEIL
  8808. "muls r6, r7, r6\n\t"
  8809. #elif defined(__clang__)
  8810. "muls r6, r7\n\t"
  8811. #else
  8812. "mul r6, r7\n\t"
  8813. #endif
  8814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8815. "lsrs r7, r6, #16\n\t"
  8816. #else
  8817. "lsr r7, r6, #16\n\t"
  8818. #endif
  8819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8820. "lsls r6, r6, #16\n\t"
  8821. #else
  8822. "lsl r6, r6, #16\n\t"
  8823. #endif
  8824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8825. "adds r3, r3, r6\n\t"
  8826. #else
  8827. "add r3, r3, r6\n\t"
  8828. #endif
  8829. #ifdef WOLFSSL_KEIL
  8830. "adcs r4, r4, r7\n\t"
  8831. #elif defined(__clang__)
  8832. "adcs r4, r7\n\t"
  8833. #else
  8834. "adc r4, r7\n\t"
  8835. #endif
  8836. #ifdef WOLFSSL_KEIL
  8837. "adcs r5, r5, %[r]\n\t"
  8838. #elif defined(__clang__)
  8839. "adcs r5, %[r]\n\t"
  8840. #else
  8841. "adc r5, %[r]\n\t"
  8842. #endif
  8843. "# A[5] * B[7]\n\t"
  8844. "mov %[a], r9\n\t"
  8845. "mov %[b], r10\n\t"
  8846. "ldr %[a], [%[a], #20]\n\t"
  8847. "ldr %[b], [%[b], #28]\n\t"
  8848. "uxth r6, %[a]\n\t"
  8849. "uxth r7, %[b]\n\t"
  8850. #ifdef WOLFSSL_KEIL
  8851. "muls r7, r6, r7\n\t"
  8852. #elif defined(__clang__)
  8853. "muls r7, r6\n\t"
  8854. #else
  8855. "mul r7, r6\n\t"
  8856. #endif
  8857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8858. "adds r3, r3, r7\n\t"
  8859. #else
  8860. "add r3, r3, r7\n\t"
  8861. #endif
  8862. #ifdef WOLFSSL_KEIL
  8863. "adcs r4, r4, %[r]\n\t"
  8864. #elif defined(__clang__)
  8865. "adcs r4, %[r]\n\t"
  8866. #else
  8867. "adc r4, %[r]\n\t"
  8868. #endif
  8869. #ifdef WOLFSSL_KEIL
  8870. "adcs r5, r5, %[r]\n\t"
  8871. #elif defined(__clang__)
  8872. "adcs r5, %[r]\n\t"
  8873. #else
  8874. "adc r5, %[r]\n\t"
  8875. #endif
  8876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8877. "lsrs r7, %[b], #16\n\t"
  8878. #else
  8879. "lsr r7, %[b], #16\n\t"
  8880. #endif
  8881. #ifdef WOLFSSL_KEIL
  8882. "muls r6, r7, r6\n\t"
  8883. #elif defined(__clang__)
  8884. "muls r6, r7\n\t"
  8885. #else
  8886. "mul r6, r7\n\t"
  8887. #endif
  8888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8889. "lsrs r7, r6, #16\n\t"
  8890. #else
  8891. "lsr r7, r6, #16\n\t"
  8892. #endif
  8893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8894. "lsls r6, r6, #16\n\t"
  8895. #else
  8896. "lsl r6, r6, #16\n\t"
  8897. #endif
  8898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8899. "adds r3, r3, r6\n\t"
  8900. #else
  8901. "add r3, r3, r6\n\t"
  8902. #endif
  8903. #ifdef WOLFSSL_KEIL
  8904. "adcs r4, r4, r7\n\t"
  8905. #elif defined(__clang__)
  8906. "adcs r4, r7\n\t"
  8907. #else
  8908. "adc r4, r7\n\t"
  8909. #endif
  8910. #ifdef WOLFSSL_KEIL
  8911. "adcs r5, r5, %[r]\n\t"
  8912. #elif defined(__clang__)
  8913. "adcs r5, %[r]\n\t"
  8914. #else
  8915. "adc r5, %[r]\n\t"
  8916. #endif
  8917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8918. "lsrs r6, %[a], #16\n\t"
  8919. #else
  8920. "lsr r6, %[a], #16\n\t"
  8921. #endif
  8922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8923. "lsrs r7, %[b], #16\n\t"
  8924. #else
  8925. "lsr r7, %[b], #16\n\t"
  8926. #endif
  8927. #ifdef WOLFSSL_KEIL
  8928. "muls r7, r6, r7\n\t"
  8929. #elif defined(__clang__)
  8930. "muls r7, r6\n\t"
  8931. #else
  8932. "mul r7, r6\n\t"
  8933. #endif
  8934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8935. "adds r4, r4, r7\n\t"
  8936. #else
  8937. "add r4, r4, r7\n\t"
  8938. #endif
  8939. #ifdef WOLFSSL_KEIL
  8940. "adcs r5, r5, %[r]\n\t"
  8941. #elif defined(__clang__)
  8942. "adcs r5, %[r]\n\t"
  8943. #else
  8944. "adc r5, %[r]\n\t"
  8945. #endif
  8946. "uxth r7, %[b]\n\t"
  8947. #ifdef WOLFSSL_KEIL
  8948. "muls r6, r7, r6\n\t"
  8949. #elif defined(__clang__)
  8950. "muls r6, r7\n\t"
  8951. #else
  8952. "mul r6, r7\n\t"
  8953. #endif
  8954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8955. "lsrs r7, r6, #16\n\t"
  8956. #else
  8957. "lsr r7, r6, #16\n\t"
  8958. #endif
  8959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8960. "lsls r6, r6, #16\n\t"
  8961. #else
  8962. "lsl r6, r6, #16\n\t"
  8963. #endif
  8964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  8965. "adds r3, r3, r6\n\t"
  8966. #else
  8967. "add r3, r3, r6\n\t"
  8968. #endif
  8969. #ifdef WOLFSSL_KEIL
  8970. "adcs r4, r4, r7\n\t"
  8971. #elif defined(__clang__)
  8972. "adcs r4, r7\n\t"
  8973. #else
  8974. "adc r4, r7\n\t"
  8975. #endif
  8976. #ifdef WOLFSSL_KEIL
  8977. "adcs r5, r5, %[r]\n\t"
  8978. #elif defined(__clang__)
  8979. "adcs r5, %[r]\n\t"
  8980. #else
  8981. "adc r5, %[r]\n\t"
  8982. #endif
  8983. "mov %[r], r8\n\t"
  8984. "str r3, [%[r], #48]\n\t"
  8985. "movs %[r], #0\n\t"
  8986. "# A[6] * B[7]\n\t"
  8987. "movs r3, #0\n\t"
  8988. "mov %[a], r9\n\t"
  8989. "mov %[b], r10\n\t"
  8990. "ldr %[a], [%[a], #24]\n\t"
  8991. "ldr %[b], [%[b], #28]\n\t"
  8992. "uxth r6, %[a]\n\t"
  8993. "uxth r7, %[b]\n\t"
  8994. #ifdef WOLFSSL_KEIL
  8995. "muls r7, r6, r7\n\t"
  8996. #elif defined(__clang__)
  8997. "muls r7, r6\n\t"
  8998. #else
  8999. "mul r7, r6\n\t"
  9000. #endif
  9001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9002. "adds r4, r4, r7\n\t"
  9003. #else
  9004. "add r4, r4, r7\n\t"
  9005. #endif
  9006. #ifdef WOLFSSL_KEIL
  9007. "adcs r5, r5, %[r]\n\t"
  9008. #elif defined(__clang__)
  9009. "adcs r5, %[r]\n\t"
  9010. #else
  9011. "adc r5, %[r]\n\t"
  9012. #endif
  9013. #ifdef WOLFSSL_KEIL
  9014. "adcs r3, r3, %[r]\n\t"
  9015. #elif defined(__clang__)
  9016. "adcs r3, %[r]\n\t"
  9017. #else
  9018. "adc r3, %[r]\n\t"
  9019. #endif
  9020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9021. "lsrs r7, %[b], #16\n\t"
  9022. #else
  9023. "lsr r7, %[b], #16\n\t"
  9024. #endif
  9025. #ifdef WOLFSSL_KEIL
  9026. "muls r6, r7, r6\n\t"
  9027. #elif defined(__clang__)
  9028. "muls r6, r7\n\t"
  9029. #else
  9030. "mul r6, r7\n\t"
  9031. #endif
  9032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9033. "lsrs r7, r6, #16\n\t"
  9034. #else
  9035. "lsr r7, r6, #16\n\t"
  9036. #endif
  9037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9038. "lsls r6, r6, #16\n\t"
  9039. #else
  9040. "lsl r6, r6, #16\n\t"
  9041. #endif
  9042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9043. "adds r4, r4, r6\n\t"
  9044. #else
  9045. "add r4, r4, r6\n\t"
  9046. #endif
  9047. #ifdef WOLFSSL_KEIL
  9048. "adcs r5, r5, r7\n\t"
  9049. #elif defined(__clang__)
  9050. "adcs r5, r7\n\t"
  9051. #else
  9052. "adc r5, r7\n\t"
  9053. #endif
  9054. #ifdef WOLFSSL_KEIL
  9055. "adcs r3, r3, %[r]\n\t"
  9056. #elif defined(__clang__)
  9057. "adcs r3, %[r]\n\t"
  9058. #else
  9059. "adc r3, %[r]\n\t"
  9060. #endif
  9061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9062. "lsrs r6, %[a], #16\n\t"
  9063. #else
  9064. "lsr r6, %[a], #16\n\t"
  9065. #endif
  9066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9067. "lsrs r7, %[b], #16\n\t"
  9068. #else
  9069. "lsr r7, %[b], #16\n\t"
  9070. #endif
  9071. #ifdef WOLFSSL_KEIL
  9072. "muls r7, r6, r7\n\t"
  9073. #elif defined(__clang__)
  9074. "muls r7, r6\n\t"
  9075. #else
  9076. "mul r7, r6\n\t"
  9077. #endif
  9078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9079. "adds r5, r5, r7\n\t"
  9080. #else
  9081. "add r5, r5, r7\n\t"
  9082. #endif
  9083. #ifdef WOLFSSL_KEIL
  9084. "adcs r3, r3, %[r]\n\t"
  9085. #elif defined(__clang__)
  9086. "adcs r3, %[r]\n\t"
  9087. #else
  9088. "adc r3, %[r]\n\t"
  9089. #endif
  9090. "uxth r7, %[b]\n\t"
  9091. #ifdef WOLFSSL_KEIL
  9092. "muls r6, r7, r6\n\t"
  9093. #elif defined(__clang__)
  9094. "muls r6, r7\n\t"
  9095. #else
  9096. "mul r6, r7\n\t"
  9097. #endif
  9098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9099. "lsrs r7, r6, #16\n\t"
  9100. #else
  9101. "lsr r7, r6, #16\n\t"
  9102. #endif
  9103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9104. "lsls r6, r6, #16\n\t"
  9105. #else
  9106. "lsl r6, r6, #16\n\t"
  9107. #endif
  9108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9109. "adds r4, r4, r6\n\t"
  9110. #else
  9111. "add r4, r4, r6\n\t"
  9112. #endif
  9113. #ifdef WOLFSSL_KEIL
  9114. "adcs r5, r5, r7\n\t"
  9115. #elif defined(__clang__)
  9116. "adcs r5, r7\n\t"
  9117. #else
  9118. "adc r5, r7\n\t"
  9119. #endif
  9120. #ifdef WOLFSSL_KEIL
  9121. "adcs r3, r3, %[r]\n\t"
  9122. #elif defined(__clang__)
  9123. "adcs r3, %[r]\n\t"
  9124. #else
  9125. "adc r3, %[r]\n\t"
  9126. #endif
  9127. "# A[7] * B[6]\n\t"
  9128. "mov %[a], r9\n\t"
  9129. "mov %[b], r10\n\t"
  9130. "ldr %[a], [%[a], #28]\n\t"
  9131. "ldr %[b], [%[b], #24]\n\t"
  9132. "uxth r6, %[a]\n\t"
  9133. "uxth r7, %[b]\n\t"
  9134. #ifdef WOLFSSL_KEIL
  9135. "muls r7, r6, r7\n\t"
  9136. #elif defined(__clang__)
  9137. "muls r7, r6\n\t"
  9138. #else
  9139. "mul r7, r6\n\t"
  9140. #endif
  9141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9142. "adds r4, r4, r7\n\t"
  9143. #else
  9144. "add r4, r4, r7\n\t"
  9145. #endif
  9146. #ifdef WOLFSSL_KEIL
  9147. "adcs r5, r5, %[r]\n\t"
  9148. #elif defined(__clang__)
  9149. "adcs r5, %[r]\n\t"
  9150. #else
  9151. "adc r5, %[r]\n\t"
  9152. #endif
  9153. #ifdef WOLFSSL_KEIL
  9154. "adcs r3, r3, %[r]\n\t"
  9155. #elif defined(__clang__)
  9156. "adcs r3, %[r]\n\t"
  9157. #else
  9158. "adc r3, %[r]\n\t"
  9159. #endif
  9160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9161. "lsrs r7, %[b], #16\n\t"
  9162. #else
  9163. "lsr r7, %[b], #16\n\t"
  9164. #endif
  9165. #ifdef WOLFSSL_KEIL
  9166. "muls r6, r7, r6\n\t"
  9167. #elif defined(__clang__)
  9168. "muls r6, r7\n\t"
  9169. #else
  9170. "mul r6, r7\n\t"
  9171. #endif
  9172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9173. "lsrs r7, r6, #16\n\t"
  9174. #else
  9175. "lsr r7, r6, #16\n\t"
  9176. #endif
  9177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9178. "lsls r6, r6, #16\n\t"
  9179. #else
  9180. "lsl r6, r6, #16\n\t"
  9181. #endif
  9182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9183. "adds r4, r4, r6\n\t"
  9184. #else
  9185. "add r4, r4, r6\n\t"
  9186. #endif
  9187. #ifdef WOLFSSL_KEIL
  9188. "adcs r5, r5, r7\n\t"
  9189. #elif defined(__clang__)
  9190. "adcs r5, r7\n\t"
  9191. #else
  9192. "adc r5, r7\n\t"
  9193. #endif
  9194. #ifdef WOLFSSL_KEIL
  9195. "adcs r3, r3, %[r]\n\t"
  9196. #elif defined(__clang__)
  9197. "adcs r3, %[r]\n\t"
  9198. #else
  9199. "adc r3, %[r]\n\t"
  9200. #endif
  9201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9202. "lsrs r6, %[a], #16\n\t"
  9203. #else
  9204. "lsr r6, %[a], #16\n\t"
  9205. #endif
  9206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9207. "lsrs r7, %[b], #16\n\t"
  9208. #else
  9209. "lsr r7, %[b], #16\n\t"
  9210. #endif
  9211. #ifdef WOLFSSL_KEIL
  9212. "muls r7, r6, r7\n\t"
  9213. #elif defined(__clang__)
  9214. "muls r7, r6\n\t"
  9215. #else
  9216. "mul r7, r6\n\t"
  9217. #endif
  9218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9219. "adds r5, r5, r7\n\t"
  9220. #else
  9221. "add r5, r5, r7\n\t"
  9222. #endif
  9223. #ifdef WOLFSSL_KEIL
  9224. "adcs r3, r3, %[r]\n\t"
  9225. #elif defined(__clang__)
  9226. "adcs r3, %[r]\n\t"
  9227. #else
  9228. "adc r3, %[r]\n\t"
  9229. #endif
  9230. "uxth r7, %[b]\n\t"
  9231. #ifdef WOLFSSL_KEIL
  9232. "muls r6, r7, r6\n\t"
  9233. #elif defined(__clang__)
  9234. "muls r6, r7\n\t"
  9235. #else
  9236. "mul r6, r7\n\t"
  9237. #endif
  9238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9239. "lsrs r7, r6, #16\n\t"
  9240. #else
  9241. "lsr r7, r6, #16\n\t"
  9242. #endif
  9243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9244. "lsls r6, r6, #16\n\t"
  9245. #else
  9246. "lsl r6, r6, #16\n\t"
  9247. #endif
  9248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9249. "adds r4, r4, r6\n\t"
  9250. #else
  9251. "add r4, r4, r6\n\t"
  9252. #endif
  9253. #ifdef WOLFSSL_KEIL
  9254. "adcs r5, r5, r7\n\t"
  9255. #elif defined(__clang__)
  9256. "adcs r5, r7\n\t"
  9257. #else
  9258. "adc r5, r7\n\t"
  9259. #endif
  9260. #ifdef WOLFSSL_KEIL
  9261. "adcs r3, r3, %[r]\n\t"
  9262. #elif defined(__clang__)
  9263. "adcs r3, %[r]\n\t"
  9264. #else
  9265. "adc r3, %[r]\n\t"
  9266. #endif
  9267. "mov %[r], r8\n\t"
  9268. "str r4, [%[r], #52]\n\t"
  9269. "movs %[r], #0\n\t"
  9270. "# A[7] * B[7]\n\t"
  9271. "mov %[a], r9\n\t"
  9272. "mov %[b], r10\n\t"
  9273. "ldr %[a], [%[a], #28]\n\t"
  9274. "ldr %[b], [%[b], #28]\n\t"
  9275. "uxth r6, %[a]\n\t"
  9276. "uxth r7, %[b]\n\t"
  9277. #ifdef WOLFSSL_KEIL
  9278. "muls r7, r6, r7\n\t"
  9279. #elif defined(__clang__)
  9280. "muls r7, r6\n\t"
  9281. #else
  9282. "mul r7, r6\n\t"
  9283. #endif
  9284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9285. "adds r5, r5, r7\n\t"
  9286. #else
  9287. "add r5, r5, r7\n\t"
  9288. #endif
  9289. #ifdef WOLFSSL_KEIL
  9290. "adcs r3, r3, %[r]\n\t"
  9291. #elif defined(__clang__)
  9292. "adcs r3, %[r]\n\t"
  9293. #else
  9294. "adc r3, %[r]\n\t"
  9295. #endif
  9296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9297. "lsrs r7, %[b], #16\n\t"
  9298. #else
  9299. "lsr r7, %[b], #16\n\t"
  9300. #endif
  9301. #ifdef WOLFSSL_KEIL
  9302. "muls r6, r7, r6\n\t"
  9303. #elif defined(__clang__)
  9304. "muls r6, r7\n\t"
  9305. #else
  9306. "mul r6, r7\n\t"
  9307. #endif
  9308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9309. "lsrs r7, r6, #16\n\t"
  9310. #else
  9311. "lsr r7, r6, #16\n\t"
  9312. #endif
  9313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9314. "lsls r6, r6, #16\n\t"
  9315. #else
  9316. "lsl r6, r6, #16\n\t"
  9317. #endif
  9318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9319. "adds r5, r5, r6\n\t"
  9320. #else
  9321. "add r5, r5, r6\n\t"
  9322. #endif
  9323. #ifdef WOLFSSL_KEIL
  9324. "adcs r3, r3, r7\n\t"
  9325. #elif defined(__clang__)
  9326. "adcs r3, r7\n\t"
  9327. #else
  9328. "adc r3, r7\n\t"
  9329. #endif
  9330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9331. "lsrs r6, %[a], #16\n\t"
  9332. #else
  9333. "lsr r6, %[a], #16\n\t"
  9334. #endif
  9335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9336. "lsrs r7, %[b], #16\n\t"
  9337. #else
  9338. "lsr r7, %[b], #16\n\t"
  9339. #endif
  9340. #ifdef WOLFSSL_KEIL
  9341. "muls r7, r6, r7\n\t"
  9342. #elif defined(__clang__)
  9343. "muls r7, r6\n\t"
  9344. #else
  9345. "mul r7, r6\n\t"
  9346. #endif
  9347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9348. "adds r3, r3, r7\n\t"
  9349. #else
  9350. "add r3, r3, r7\n\t"
  9351. #endif
  9352. "uxth r7, %[b]\n\t"
  9353. #ifdef WOLFSSL_KEIL
  9354. "muls r6, r7, r6\n\t"
  9355. #elif defined(__clang__)
  9356. "muls r6, r7\n\t"
  9357. #else
  9358. "mul r6, r7\n\t"
  9359. #endif
  9360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9361. "lsrs r7, r6, #16\n\t"
  9362. #else
  9363. "lsr r7, r6, #16\n\t"
  9364. #endif
  9365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9366. "lsls r6, r6, #16\n\t"
  9367. #else
  9368. "lsl r6, r6, #16\n\t"
  9369. #endif
  9370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9371. "adds r5, r5, r6\n\t"
  9372. #else
  9373. "add r5, r5, r6\n\t"
  9374. #endif
  9375. #ifdef WOLFSSL_KEIL
  9376. "adcs r3, r3, r7\n\t"
  9377. #elif defined(__clang__)
  9378. "adcs r3, r7\n\t"
  9379. #else
  9380. "adc r3, r7\n\t"
  9381. #endif
  9382. "mov %[r], r8\n\t"
  9383. "str r5, [%[r], #56]\n\t"
  9384. "str r3, [%[r], #60]\n\t"
  9385. "pop {r3, r4, r5, r6}\n\t"
  9386. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  9387. "pop {r3, r4, r5, r6}\n\t"
  9388. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  9389. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  9390. :
  9391. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  9392. );
  9393. }
  9394. #endif /* !WOLFSSL_SP_LARGE_CODE */
  9395. /* Add b to a into r. (r = a + b)
  9396. *
  9397. * r A single precision integer.
  9398. * a A single precision integer.
  9399. * b A single precision integer.
  9400. */
  9401. SP_NOINLINE static sp_digit sp_2048_add_8(sp_digit* r, const sp_digit* a,
  9402. const sp_digit* b)
  9403. {
  9404. __asm__ __volatile__ (
  9405. "ldm %[b]!, {r5, r6}\n\t"
  9406. "ldm %[a]!, {r3, r4}\n\t"
  9407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9408. "adds r3, r3, r5\n\t"
  9409. #else
  9410. "add r3, r3, r5\n\t"
  9411. #endif
  9412. #ifdef WOLFSSL_KEIL
  9413. "adcs r4, r4, r6\n\t"
  9414. #elif defined(__clang__)
  9415. "adcs r4, r6\n\t"
  9416. #else
  9417. "adc r4, r6\n\t"
  9418. #endif
  9419. "stm %[r]!, {r3, r4}\n\t"
  9420. "ldm %[b]!, {r5, r6}\n\t"
  9421. "ldm %[a]!, {r3, r4}\n\t"
  9422. #ifdef WOLFSSL_KEIL
  9423. "adcs r3, r3, r5\n\t"
  9424. #elif defined(__clang__)
  9425. "adcs r3, r5\n\t"
  9426. #else
  9427. "adc r3, r5\n\t"
  9428. #endif
  9429. #ifdef WOLFSSL_KEIL
  9430. "adcs r4, r4, r6\n\t"
  9431. #elif defined(__clang__)
  9432. "adcs r4, r6\n\t"
  9433. #else
  9434. "adc r4, r6\n\t"
  9435. #endif
  9436. "stm %[r]!, {r3, r4}\n\t"
  9437. "ldm %[b]!, {r5, r6}\n\t"
  9438. "ldm %[a]!, {r3, r4}\n\t"
  9439. #ifdef WOLFSSL_KEIL
  9440. "adcs r3, r3, r5\n\t"
  9441. #elif defined(__clang__)
  9442. "adcs r3, r5\n\t"
  9443. #else
  9444. "adc r3, r5\n\t"
  9445. #endif
  9446. #ifdef WOLFSSL_KEIL
  9447. "adcs r4, r4, r6\n\t"
  9448. #elif defined(__clang__)
  9449. "adcs r4, r6\n\t"
  9450. #else
  9451. "adc r4, r6\n\t"
  9452. #endif
  9453. "stm %[r]!, {r3, r4}\n\t"
  9454. "ldm %[b]!, {r5, r6}\n\t"
  9455. "ldm %[a]!, {r3, r4}\n\t"
  9456. #ifdef WOLFSSL_KEIL
  9457. "adcs r3, r3, r5\n\t"
  9458. #elif defined(__clang__)
  9459. "adcs r3, r5\n\t"
  9460. #else
  9461. "adc r3, r5\n\t"
  9462. #endif
  9463. #ifdef WOLFSSL_KEIL
  9464. "adcs r4, r4, r6\n\t"
  9465. #elif defined(__clang__)
  9466. "adcs r4, r6\n\t"
  9467. #else
  9468. "adc r4, r6\n\t"
  9469. #endif
  9470. "stm %[r]!, {r3, r4}\n\t"
  9471. "movs %[r], #0\n\t"
  9472. #ifdef WOLFSSL_KEIL
  9473. "adcs %[r], %[r], %[r]\n\t"
  9474. #elif defined(__clang__)
  9475. "adcs %[r], %[r]\n\t"
  9476. #else
  9477. "adc %[r], %[r]\n\t"
  9478. #endif
  9479. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  9480. :
  9481. : "memory", "r3", "r4", "r5", "r6"
  9482. );
  9483. return (uint32_t)(size_t)r;
  9484. }
  9485. /* Add b to a into r. (r = a + b)
  9486. *
  9487. * r A single precision integer.
  9488. * a A single precision integer.
  9489. * b A single precision integer.
  9490. */
  9491. SP_NOINLINE static sp_digit sp_2048_add_word_8(sp_digit* r, const sp_digit* a,
  9492. sp_digit b)
  9493. {
  9494. __asm__ __volatile__ (
  9495. "movs r5, #0\n\t"
  9496. "ldm %[a]!, {r3, r4}\n\t"
  9497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9498. "adds r3, r3, %[b]\n\t"
  9499. #else
  9500. "add r3, r3, %[b]\n\t"
  9501. #endif
  9502. #ifdef WOLFSSL_KEIL
  9503. "adcs r4, r4, r5\n\t"
  9504. #elif defined(__clang__)
  9505. "adcs r4, r5\n\t"
  9506. #else
  9507. "adc r4, r5\n\t"
  9508. #endif
  9509. "stm %[r]!, {r3, r4}\n\t"
  9510. "ldm %[a]!, {r3, r4}\n\t"
  9511. #ifdef WOLFSSL_KEIL
  9512. "adcs r3, r3, r5\n\t"
  9513. #elif defined(__clang__)
  9514. "adcs r3, r5\n\t"
  9515. #else
  9516. "adc r3, r5\n\t"
  9517. #endif
  9518. #ifdef WOLFSSL_KEIL
  9519. "adcs r4, r4, r5\n\t"
  9520. #elif defined(__clang__)
  9521. "adcs r4, r5\n\t"
  9522. #else
  9523. "adc r4, r5\n\t"
  9524. #endif
  9525. "stm %[r]!, {r3, r4}\n\t"
  9526. "ldm %[a]!, {r3, r4}\n\t"
  9527. #ifdef WOLFSSL_KEIL
  9528. "adcs r3, r3, r5\n\t"
  9529. #elif defined(__clang__)
  9530. "adcs r3, r5\n\t"
  9531. #else
  9532. "adc r3, r5\n\t"
  9533. #endif
  9534. #ifdef WOLFSSL_KEIL
  9535. "adcs r4, r4, r5\n\t"
  9536. #elif defined(__clang__)
  9537. "adcs r4, r5\n\t"
  9538. #else
  9539. "adc r4, r5\n\t"
  9540. #endif
  9541. "stm %[r]!, {r3, r4}\n\t"
  9542. "ldm %[a]!, {r3, r4}\n\t"
  9543. #ifdef WOLFSSL_KEIL
  9544. "adcs r3, r3, r5\n\t"
  9545. #elif defined(__clang__)
  9546. "adcs r3, r5\n\t"
  9547. #else
  9548. "adc r3, r5\n\t"
  9549. #endif
  9550. #ifdef WOLFSSL_KEIL
  9551. "adcs r4, r4, r5\n\t"
  9552. #elif defined(__clang__)
  9553. "adcs r4, r5\n\t"
  9554. #else
  9555. "adc r4, r5\n\t"
  9556. #endif
  9557. "stm %[r]!, {r3, r4}\n\t"
  9558. "movs %[r], #0\n\t"
  9559. #ifdef WOLFSSL_KEIL
  9560. "adcs %[r], %[r], %[r]\n\t"
  9561. #elif defined(__clang__)
  9562. "adcs %[r], %[r]\n\t"
  9563. #else
  9564. "adc %[r], %[r]\n\t"
  9565. #endif
  9566. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  9567. :
  9568. : "memory", "r3", "r4", "r5"
  9569. );
  9570. return (uint32_t)(size_t)r;
  9571. }
  9572. /* Sub b from a into a. (a -= b)
  9573. *
  9574. * a A single precision integer.
  9575. * b A single precision integer.
  9576. */
  9577. SP_NOINLINE static sp_digit sp_2048_sub_in_place_16(sp_digit* a,
  9578. const sp_digit* b)
  9579. {
  9580. __asm__ __volatile__ (
  9581. "ldm %[b]!, {r4, r5}\n\t"
  9582. "ldr r2, [%[a]]\n\t"
  9583. "ldr r3, [%[a], #4]\n\t"
  9584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9585. "subs r2, r2, r4\n\t"
  9586. #else
  9587. "sub r2, r2, r4\n\t"
  9588. #endif
  9589. #ifdef WOLFSSL_KEIL
  9590. "sbcs r3, r3, r5\n\t"
  9591. #elif defined(__clang__)
  9592. "sbcs r3, r5\n\t"
  9593. #else
  9594. "sbc r3, r5\n\t"
  9595. #endif
  9596. "stm %[a]!, {r2, r3}\n\t"
  9597. "ldm %[b]!, {r4, r5}\n\t"
  9598. "ldr r2, [%[a]]\n\t"
  9599. "ldr r3, [%[a], #4]\n\t"
  9600. #ifdef WOLFSSL_KEIL
  9601. "sbcs r2, r2, r4\n\t"
  9602. #elif defined(__clang__)
  9603. "sbcs r2, r4\n\t"
  9604. #else
  9605. "sbc r2, r4\n\t"
  9606. #endif
  9607. #ifdef WOLFSSL_KEIL
  9608. "sbcs r3, r3, r5\n\t"
  9609. #elif defined(__clang__)
  9610. "sbcs r3, r5\n\t"
  9611. #else
  9612. "sbc r3, r5\n\t"
  9613. #endif
  9614. "stm %[a]!, {r2, r3}\n\t"
  9615. "ldm %[b]!, {r4, r5}\n\t"
  9616. "ldr r2, [%[a]]\n\t"
  9617. "ldr r3, [%[a], #4]\n\t"
  9618. #ifdef WOLFSSL_KEIL
  9619. "sbcs r2, r2, r4\n\t"
  9620. #elif defined(__clang__)
  9621. "sbcs r2, r4\n\t"
  9622. #else
  9623. "sbc r2, r4\n\t"
  9624. #endif
  9625. #ifdef WOLFSSL_KEIL
  9626. "sbcs r3, r3, r5\n\t"
  9627. #elif defined(__clang__)
  9628. "sbcs r3, r5\n\t"
  9629. #else
  9630. "sbc r3, r5\n\t"
  9631. #endif
  9632. "stm %[a]!, {r2, r3}\n\t"
  9633. "ldm %[b]!, {r4, r5}\n\t"
  9634. "ldr r2, [%[a]]\n\t"
  9635. "ldr r3, [%[a], #4]\n\t"
  9636. #ifdef WOLFSSL_KEIL
  9637. "sbcs r2, r2, r4\n\t"
  9638. #elif defined(__clang__)
  9639. "sbcs r2, r4\n\t"
  9640. #else
  9641. "sbc r2, r4\n\t"
  9642. #endif
  9643. #ifdef WOLFSSL_KEIL
  9644. "sbcs r3, r3, r5\n\t"
  9645. #elif defined(__clang__)
  9646. "sbcs r3, r5\n\t"
  9647. #else
  9648. "sbc r3, r5\n\t"
  9649. #endif
  9650. "stm %[a]!, {r2, r3}\n\t"
  9651. "ldm %[b]!, {r4, r5}\n\t"
  9652. "ldr r2, [%[a]]\n\t"
  9653. "ldr r3, [%[a], #4]\n\t"
  9654. #ifdef WOLFSSL_KEIL
  9655. "sbcs r2, r2, r4\n\t"
  9656. #elif defined(__clang__)
  9657. "sbcs r2, r4\n\t"
  9658. #else
  9659. "sbc r2, r4\n\t"
  9660. #endif
  9661. #ifdef WOLFSSL_KEIL
  9662. "sbcs r3, r3, r5\n\t"
  9663. #elif defined(__clang__)
  9664. "sbcs r3, r5\n\t"
  9665. #else
  9666. "sbc r3, r5\n\t"
  9667. #endif
  9668. "stm %[a]!, {r2, r3}\n\t"
  9669. "ldm %[b]!, {r4, r5}\n\t"
  9670. "ldr r2, [%[a]]\n\t"
  9671. "ldr r3, [%[a], #4]\n\t"
  9672. #ifdef WOLFSSL_KEIL
  9673. "sbcs r2, r2, r4\n\t"
  9674. #elif defined(__clang__)
  9675. "sbcs r2, r4\n\t"
  9676. #else
  9677. "sbc r2, r4\n\t"
  9678. #endif
  9679. #ifdef WOLFSSL_KEIL
  9680. "sbcs r3, r3, r5\n\t"
  9681. #elif defined(__clang__)
  9682. "sbcs r3, r5\n\t"
  9683. #else
  9684. "sbc r3, r5\n\t"
  9685. #endif
  9686. "stm %[a]!, {r2, r3}\n\t"
  9687. "ldm %[b]!, {r4, r5}\n\t"
  9688. "ldr r2, [%[a]]\n\t"
  9689. "ldr r3, [%[a], #4]\n\t"
  9690. #ifdef WOLFSSL_KEIL
  9691. "sbcs r2, r2, r4\n\t"
  9692. #elif defined(__clang__)
  9693. "sbcs r2, r4\n\t"
  9694. #else
  9695. "sbc r2, r4\n\t"
  9696. #endif
  9697. #ifdef WOLFSSL_KEIL
  9698. "sbcs r3, r3, r5\n\t"
  9699. #elif defined(__clang__)
  9700. "sbcs r3, r5\n\t"
  9701. #else
  9702. "sbc r3, r5\n\t"
  9703. #endif
  9704. "stm %[a]!, {r2, r3}\n\t"
  9705. "ldm %[b]!, {r4, r5}\n\t"
  9706. "ldr r2, [%[a]]\n\t"
  9707. "ldr r3, [%[a], #4]\n\t"
  9708. #ifdef WOLFSSL_KEIL
  9709. "sbcs r2, r2, r4\n\t"
  9710. #elif defined(__clang__)
  9711. "sbcs r2, r4\n\t"
  9712. #else
  9713. "sbc r2, r4\n\t"
  9714. #endif
  9715. #ifdef WOLFSSL_KEIL
  9716. "sbcs r3, r3, r5\n\t"
  9717. #elif defined(__clang__)
  9718. "sbcs r3, r5\n\t"
  9719. #else
  9720. "sbc r3, r5\n\t"
  9721. #endif
  9722. "stm %[a]!, {r2, r3}\n\t"
  9723. #ifdef WOLFSSL_KEIL
  9724. "sbcs %[a], %[a], %[a]\n\t"
  9725. #elif defined(__clang__)
  9726. "sbcs %[a], %[a]\n\t"
  9727. #else
  9728. "sbc %[a], %[a]\n\t"
  9729. #endif
  9730. : [a] "+l" (a), [b] "+l" (b)
  9731. :
  9732. : "memory", "r2", "r3", "r4", "r5"
  9733. );
  9734. return (uint32_t)(size_t)a;
  9735. }
  9736. /* Add b to a into r. (r = a + b)
  9737. *
  9738. * r A single precision integer.
  9739. * a A single precision integer.
  9740. * b A single precision integer.
  9741. */
  9742. SP_NOINLINE static sp_digit sp_2048_add_16(sp_digit* r, const sp_digit* a,
  9743. const sp_digit* b)
  9744. {
  9745. __asm__ __volatile__ (
  9746. "ldm %[b]!, {r5, r6}\n\t"
  9747. "ldm %[a]!, {r3, r4}\n\t"
  9748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9749. "adds r3, r3, r5\n\t"
  9750. #else
  9751. "add r3, r3, r5\n\t"
  9752. #endif
  9753. #ifdef WOLFSSL_KEIL
  9754. "adcs r4, r4, r6\n\t"
  9755. #elif defined(__clang__)
  9756. "adcs r4, r6\n\t"
  9757. #else
  9758. "adc r4, r6\n\t"
  9759. #endif
  9760. "stm %[r]!, {r3, r4}\n\t"
  9761. "ldm %[b]!, {r5, r6}\n\t"
  9762. "ldm %[a]!, {r3, r4}\n\t"
  9763. #ifdef WOLFSSL_KEIL
  9764. "adcs r3, r3, r5\n\t"
  9765. #elif defined(__clang__)
  9766. "adcs r3, r5\n\t"
  9767. #else
  9768. "adc r3, r5\n\t"
  9769. #endif
  9770. #ifdef WOLFSSL_KEIL
  9771. "adcs r4, r4, r6\n\t"
  9772. #elif defined(__clang__)
  9773. "adcs r4, r6\n\t"
  9774. #else
  9775. "adc r4, r6\n\t"
  9776. #endif
  9777. "stm %[r]!, {r3, r4}\n\t"
  9778. "ldm %[b]!, {r5, r6}\n\t"
  9779. "ldm %[a]!, {r3, r4}\n\t"
  9780. #ifdef WOLFSSL_KEIL
  9781. "adcs r3, r3, r5\n\t"
  9782. #elif defined(__clang__)
  9783. "adcs r3, r5\n\t"
  9784. #else
  9785. "adc r3, r5\n\t"
  9786. #endif
  9787. #ifdef WOLFSSL_KEIL
  9788. "adcs r4, r4, r6\n\t"
  9789. #elif defined(__clang__)
  9790. "adcs r4, r6\n\t"
  9791. #else
  9792. "adc r4, r6\n\t"
  9793. #endif
  9794. "stm %[r]!, {r3, r4}\n\t"
  9795. "ldm %[b]!, {r5, r6}\n\t"
  9796. "ldm %[a]!, {r3, r4}\n\t"
  9797. #ifdef WOLFSSL_KEIL
  9798. "adcs r3, r3, r5\n\t"
  9799. #elif defined(__clang__)
  9800. "adcs r3, r5\n\t"
  9801. #else
  9802. "adc r3, r5\n\t"
  9803. #endif
  9804. #ifdef WOLFSSL_KEIL
  9805. "adcs r4, r4, r6\n\t"
  9806. #elif defined(__clang__)
  9807. "adcs r4, r6\n\t"
  9808. #else
  9809. "adc r4, r6\n\t"
  9810. #endif
  9811. "stm %[r]!, {r3, r4}\n\t"
  9812. "ldm %[b]!, {r5, r6}\n\t"
  9813. "ldm %[a]!, {r3, r4}\n\t"
  9814. #ifdef WOLFSSL_KEIL
  9815. "adcs r3, r3, r5\n\t"
  9816. #elif defined(__clang__)
  9817. "adcs r3, r5\n\t"
  9818. #else
  9819. "adc r3, r5\n\t"
  9820. #endif
  9821. #ifdef WOLFSSL_KEIL
  9822. "adcs r4, r4, r6\n\t"
  9823. #elif defined(__clang__)
  9824. "adcs r4, r6\n\t"
  9825. #else
  9826. "adc r4, r6\n\t"
  9827. #endif
  9828. "stm %[r]!, {r3, r4}\n\t"
  9829. "ldm %[b]!, {r5, r6}\n\t"
  9830. "ldm %[a]!, {r3, r4}\n\t"
  9831. #ifdef WOLFSSL_KEIL
  9832. "adcs r3, r3, r5\n\t"
  9833. #elif defined(__clang__)
  9834. "adcs r3, r5\n\t"
  9835. #else
  9836. "adc r3, r5\n\t"
  9837. #endif
  9838. #ifdef WOLFSSL_KEIL
  9839. "adcs r4, r4, r6\n\t"
  9840. #elif defined(__clang__)
  9841. "adcs r4, r6\n\t"
  9842. #else
  9843. "adc r4, r6\n\t"
  9844. #endif
  9845. "stm %[r]!, {r3, r4}\n\t"
  9846. "ldm %[b]!, {r5, r6}\n\t"
  9847. "ldm %[a]!, {r3, r4}\n\t"
  9848. #ifdef WOLFSSL_KEIL
  9849. "adcs r3, r3, r5\n\t"
  9850. #elif defined(__clang__)
  9851. "adcs r3, r5\n\t"
  9852. #else
  9853. "adc r3, r5\n\t"
  9854. #endif
  9855. #ifdef WOLFSSL_KEIL
  9856. "adcs r4, r4, r6\n\t"
  9857. #elif defined(__clang__)
  9858. "adcs r4, r6\n\t"
  9859. #else
  9860. "adc r4, r6\n\t"
  9861. #endif
  9862. "stm %[r]!, {r3, r4}\n\t"
  9863. "ldm %[b]!, {r5, r6}\n\t"
  9864. "ldm %[a]!, {r3, r4}\n\t"
  9865. #ifdef WOLFSSL_KEIL
  9866. "adcs r3, r3, r5\n\t"
  9867. #elif defined(__clang__)
  9868. "adcs r3, r5\n\t"
  9869. #else
  9870. "adc r3, r5\n\t"
  9871. #endif
  9872. #ifdef WOLFSSL_KEIL
  9873. "adcs r4, r4, r6\n\t"
  9874. #elif defined(__clang__)
  9875. "adcs r4, r6\n\t"
  9876. #else
  9877. "adc r4, r6\n\t"
  9878. #endif
  9879. "stm %[r]!, {r3, r4}\n\t"
  9880. "movs %[r], #0\n\t"
  9881. #ifdef WOLFSSL_KEIL
  9882. "adcs %[r], %[r], %[r]\n\t"
  9883. #elif defined(__clang__)
  9884. "adcs %[r], %[r]\n\t"
  9885. #else
  9886. "adc %[r], %[r]\n\t"
  9887. #endif
  9888. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  9889. :
  9890. : "memory", "r3", "r4", "r5", "r6"
  9891. );
  9892. return (uint32_t)(size_t)r;
  9893. }
  9894. /* AND m into each word of a and store in r.
  9895. *
  9896. * r A single precision integer.
  9897. * a A single precision integer.
  9898. * m Mask to AND against each digit.
  9899. */
  9900. static void sp_2048_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  9901. {
  9902. #ifdef WOLFSSL_SP_SMALL
  9903. int i;
  9904. for (i=0; i<8; i++) {
  9905. r[i] = a[i] & m;
  9906. }
  9907. #else
  9908. r[0] = a[0] & m;
  9909. r[1] = a[1] & m;
  9910. r[2] = a[2] & m;
  9911. r[3] = a[3] & m;
  9912. r[4] = a[4] & m;
  9913. r[5] = a[5] & m;
  9914. r[6] = a[6] & m;
  9915. r[7] = a[7] & m;
  9916. #endif
  9917. }
  9918. /* Multiply a and b into r. (r = a * b)
  9919. *
  9920. * r A single precision integer.
  9921. * a A single precision integer.
  9922. * b A single precision integer.
  9923. */
  9924. SP_NOINLINE static void sp_2048_mul_16(sp_digit* r, const sp_digit* a,
  9925. const sp_digit* b)
  9926. {
  9927. sp_digit* z0 = r;
  9928. sp_digit z1[16];
  9929. sp_digit a1[8];
  9930. sp_digit b1[8];
  9931. sp_digit* z2 = r + 16;
  9932. sp_digit u;
  9933. sp_digit ca;
  9934. sp_digit cb;
  9935. ca = sp_2048_add_8(a1, a, &a[8]);
  9936. cb = sp_2048_add_8(b1, b, &b[8]);
  9937. u = ca & cb;
  9938. sp_2048_mul_8(z2, &a[8], &b[8]);
  9939. sp_2048_mul_8(z0, a, b);
  9940. sp_2048_mul_8(z1, a1, b1);
  9941. u += sp_2048_sub_in_place_16(z1, z0);
  9942. u += sp_2048_sub_in_place_16(z1, z2);
  9943. sp_2048_mask_8(a1, a1, 0 - cb);
  9944. u += sp_2048_add_8(z1 + 8, z1 + 8, a1);
  9945. sp_2048_mask_8(b1, b1, 0 - ca);
  9946. u += sp_2048_add_8(z1 + 8, z1 + 8, b1);
  9947. u += sp_2048_add_16(r + 8, r + 8, z1);
  9948. (void)sp_2048_add_word_8(r + 24, r + 24, u);
  9949. }
  9950. /* Add b to a into r. (r = a + b)
  9951. *
  9952. * r A single precision integer.
  9953. * a A single precision integer.
  9954. * b A single precision integer.
  9955. */
  9956. SP_NOINLINE static sp_digit sp_2048_add_word_16(sp_digit* r, const sp_digit* a,
  9957. sp_digit b)
  9958. {
  9959. __asm__ __volatile__ (
  9960. "movs r5, #0\n\t"
  9961. "ldm %[a]!, {r3, r4}\n\t"
  9962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  9963. "adds r3, r3, %[b]\n\t"
  9964. #else
  9965. "add r3, r3, %[b]\n\t"
  9966. #endif
  9967. #ifdef WOLFSSL_KEIL
  9968. "adcs r4, r4, r5\n\t"
  9969. #elif defined(__clang__)
  9970. "adcs r4, r5\n\t"
  9971. #else
  9972. "adc r4, r5\n\t"
  9973. #endif
  9974. "stm %[r]!, {r3, r4}\n\t"
  9975. "ldm %[a]!, {r3, r4}\n\t"
  9976. #ifdef WOLFSSL_KEIL
  9977. "adcs r3, r3, r5\n\t"
  9978. #elif defined(__clang__)
  9979. "adcs r3, r5\n\t"
  9980. #else
  9981. "adc r3, r5\n\t"
  9982. #endif
  9983. #ifdef WOLFSSL_KEIL
  9984. "adcs r4, r4, r5\n\t"
  9985. #elif defined(__clang__)
  9986. "adcs r4, r5\n\t"
  9987. #else
  9988. "adc r4, r5\n\t"
  9989. #endif
  9990. "stm %[r]!, {r3, r4}\n\t"
  9991. "ldm %[a]!, {r3, r4}\n\t"
  9992. #ifdef WOLFSSL_KEIL
  9993. "adcs r3, r3, r5\n\t"
  9994. #elif defined(__clang__)
  9995. "adcs r3, r5\n\t"
  9996. #else
  9997. "adc r3, r5\n\t"
  9998. #endif
  9999. #ifdef WOLFSSL_KEIL
  10000. "adcs r4, r4, r5\n\t"
  10001. #elif defined(__clang__)
  10002. "adcs r4, r5\n\t"
  10003. #else
  10004. "adc r4, r5\n\t"
  10005. #endif
  10006. "stm %[r]!, {r3, r4}\n\t"
  10007. "ldm %[a]!, {r3, r4}\n\t"
  10008. #ifdef WOLFSSL_KEIL
  10009. "adcs r3, r3, r5\n\t"
  10010. #elif defined(__clang__)
  10011. "adcs r3, r5\n\t"
  10012. #else
  10013. "adc r3, r5\n\t"
  10014. #endif
  10015. #ifdef WOLFSSL_KEIL
  10016. "adcs r4, r4, r5\n\t"
  10017. #elif defined(__clang__)
  10018. "adcs r4, r5\n\t"
  10019. #else
  10020. "adc r4, r5\n\t"
  10021. #endif
  10022. "stm %[r]!, {r3, r4}\n\t"
  10023. "ldm %[a]!, {r3, r4}\n\t"
  10024. #ifdef WOLFSSL_KEIL
  10025. "adcs r3, r3, r5\n\t"
  10026. #elif defined(__clang__)
  10027. "adcs r3, r5\n\t"
  10028. #else
  10029. "adc r3, r5\n\t"
  10030. #endif
  10031. #ifdef WOLFSSL_KEIL
  10032. "adcs r4, r4, r5\n\t"
  10033. #elif defined(__clang__)
  10034. "adcs r4, r5\n\t"
  10035. #else
  10036. "adc r4, r5\n\t"
  10037. #endif
  10038. "stm %[r]!, {r3, r4}\n\t"
  10039. "ldm %[a]!, {r3, r4}\n\t"
  10040. #ifdef WOLFSSL_KEIL
  10041. "adcs r3, r3, r5\n\t"
  10042. #elif defined(__clang__)
  10043. "adcs r3, r5\n\t"
  10044. #else
  10045. "adc r3, r5\n\t"
  10046. #endif
  10047. #ifdef WOLFSSL_KEIL
  10048. "adcs r4, r4, r5\n\t"
  10049. #elif defined(__clang__)
  10050. "adcs r4, r5\n\t"
  10051. #else
  10052. "adc r4, r5\n\t"
  10053. #endif
  10054. "stm %[r]!, {r3, r4}\n\t"
  10055. "ldm %[a]!, {r3, r4}\n\t"
  10056. #ifdef WOLFSSL_KEIL
  10057. "adcs r3, r3, r5\n\t"
  10058. #elif defined(__clang__)
  10059. "adcs r3, r5\n\t"
  10060. #else
  10061. "adc r3, r5\n\t"
  10062. #endif
  10063. #ifdef WOLFSSL_KEIL
  10064. "adcs r4, r4, r5\n\t"
  10065. #elif defined(__clang__)
  10066. "adcs r4, r5\n\t"
  10067. #else
  10068. "adc r4, r5\n\t"
  10069. #endif
  10070. "stm %[r]!, {r3, r4}\n\t"
  10071. "ldm %[a]!, {r3, r4}\n\t"
  10072. #ifdef WOLFSSL_KEIL
  10073. "adcs r3, r3, r5\n\t"
  10074. #elif defined(__clang__)
  10075. "adcs r3, r5\n\t"
  10076. #else
  10077. "adc r3, r5\n\t"
  10078. #endif
  10079. #ifdef WOLFSSL_KEIL
  10080. "adcs r4, r4, r5\n\t"
  10081. #elif defined(__clang__)
  10082. "adcs r4, r5\n\t"
  10083. #else
  10084. "adc r4, r5\n\t"
  10085. #endif
  10086. "stm %[r]!, {r3, r4}\n\t"
  10087. "movs %[r], #0\n\t"
  10088. #ifdef WOLFSSL_KEIL
  10089. "adcs %[r], %[r], %[r]\n\t"
  10090. #elif defined(__clang__)
  10091. "adcs %[r], %[r]\n\t"
  10092. #else
  10093. "adc %[r], %[r]\n\t"
  10094. #endif
  10095. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  10096. :
  10097. : "memory", "r3", "r4", "r5"
  10098. );
  10099. return (uint32_t)(size_t)r;
  10100. }
  10101. /* Sub b from a into a. (a -= b)
  10102. *
  10103. * a A single precision integer.
  10104. * b A single precision integer.
  10105. */
  10106. SP_NOINLINE static sp_digit sp_2048_sub_in_place_32(sp_digit* a,
  10107. const sp_digit* b)
  10108. {
  10109. __asm__ __volatile__ (
  10110. "ldm %[b]!, {r4, r5}\n\t"
  10111. "ldr r2, [%[a]]\n\t"
  10112. "ldr r3, [%[a], #4]\n\t"
  10113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10114. "subs r2, r2, r4\n\t"
  10115. #else
  10116. "sub r2, r2, r4\n\t"
  10117. #endif
  10118. #ifdef WOLFSSL_KEIL
  10119. "sbcs r3, r3, r5\n\t"
  10120. #elif defined(__clang__)
  10121. "sbcs r3, r5\n\t"
  10122. #else
  10123. "sbc r3, r5\n\t"
  10124. #endif
  10125. "stm %[a]!, {r2, r3}\n\t"
  10126. "ldm %[b]!, {r4, r5}\n\t"
  10127. "ldr r2, [%[a]]\n\t"
  10128. "ldr r3, [%[a], #4]\n\t"
  10129. #ifdef WOLFSSL_KEIL
  10130. "sbcs r2, r2, r4\n\t"
  10131. #elif defined(__clang__)
  10132. "sbcs r2, r4\n\t"
  10133. #else
  10134. "sbc r2, r4\n\t"
  10135. #endif
  10136. #ifdef WOLFSSL_KEIL
  10137. "sbcs r3, r3, r5\n\t"
  10138. #elif defined(__clang__)
  10139. "sbcs r3, r5\n\t"
  10140. #else
  10141. "sbc r3, r5\n\t"
  10142. #endif
  10143. "stm %[a]!, {r2, r3}\n\t"
  10144. "ldm %[b]!, {r4, r5}\n\t"
  10145. "ldr r2, [%[a]]\n\t"
  10146. "ldr r3, [%[a], #4]\n\t"
  10147. #ifdef WOLFSSL_KEIL
  10148. "sbcs r2, r2, r4\n\t"
  10149. #elif defined(__clang__)
  10150. "sbcs r2, r4\n\t"
  10151. #else
  10152. "sbc r2, r4\n\t"
  10153. #endif
  10154. #ifdef WOLFSSL_KEIL
  10155. "sbcs r3, r3, r5\n\t"
  10156. #elif defined(__clang__)
  10157. "sbcs r3, r5\n\t"
  10158. #else
  10159. "sbc r3, r5\n\t"
  10160. #endif
  10161. "stm %[a]!, {r2, r3}\n\t"
  10162. "ldm %[b]!, {r4, r5}\n\t"
  10163. "ldr r2, [%[a]]\n\t"
  10164. "ldr r3, [%[a], #4]\n\t"
  10165. #ifdef WOLFSSL_KEIL
  10166. "sbcs r2, r2, r4\n\t"
  10167. #elif defined(__clang__)
  10168. "sbcs r2, r4\n\t"
  10169. #else
  10170. "sbc r2, r4\n\t"
  10171. #endif
  10172. #ifdef WOLFSSL_KEIL
  10173. "sbcs r3, r3, r5\n\t"
  10174. #elif defined(__clang__)
  10175. "sbcs r3, r5\n\t"
  10176. #else
  10177. "sbc r3, r5\n\t"
  10178. #endif
  10179. "stm %[a]!, {r2, r3}\n\t"
  10180. "ldm %[b]!, {r4, r5}\n\t"
  10181. "ldr r2, [%[a]]\n\t"
  10182. "ldr r3, [%[a], #4]\n\t"
  10183. #ifdef WOLFSSL_KEIL
  10184. "sbcs r2, r2, r4\n\t"
  10185. #elif defined(__clang__)
  10186. "sbcs r2, r4\n\t"
  10187. #else
  10188. "sbc r2, r4\n\t"
  10189. #endif
  10190. #ifdef WOLFSSL_KEIL
  10191. "sbcs r3, r3, r5\n\t"
  10192. #elif defined(__clang__)
  10193. "sbcs r3, r5\n\t"
  10194. #else
  10195. "sbc r3, r5\n\t"
  10196. #endif
  10197. "stm %[a]!, {r2, r3}\n\t"
  10198. "ldm %[b]!, {r4, r5}\n\t"
  10199. "ldr r2, [%[a]]\n\t"
  10200. "ldr r3, [%[a], #4]\n\t"
  10201. #ifdef WOLFSSL_KEIL
  10202. "sbcs r2, r2, r4\n\t"
  10203. #elif defined(__clang__)
  10204. "sbcs r2, r4\n\t"
  10205. #else
  10206. "sbc r2, r4\n\t"
  10207. #endif
  10208. #ifdef WOLFSSL_KEIL
  10209. "sbcs r3, r3, r5\n\t"
  10210. #elif defined(__clang__)
  10211. "sbcs r3, r5\n\t"
  10212. #else
  10213. "sbc r3, r5\n\t"
  10214. #endif
  10215. "stm %[a]!, {r2, r3}\n\t"
  10216. "ldm %[b]!, {r4, r5}\n\t"
  10217. "ldr r2, [%[a]]\n\t"
  10218. "ldr r3, [%[a], #4]\n\t"
  10219. #ifdef WOLFSSL_KEIL
  10220. "sbcs r2, r2, r4\n\t"
  10221. #elif defined(__clang__)
  10222. "sbcs r2, r4\n\t"
  10223. #else
  10224. "sbc r2, r4\n\t"
  10225. #endif
  10226. #ifdef WOLFSSL_KEIL
  10227. "sbcs r3, r3, r5\n\t"
  10228. #elif defined(__clang__)
  10229. "sbcs r3, r5\n\t"
  10230. #else
  10231. "sbc r3, r5\n\t"
  10232. #endif
  10233. "stm %[a]!, {r2, r3}\n\t"
  10234. "ldm %[b]!, {r4, r5}\n\t"
  10235. "ldr r2, [%[a]]\n\t"
  10236. "ldr r3, [%[a], #4]\n\t"
  10237. #ifdef WOLFSSL_KEIL
  10238. "sbcs r2, r2, r4\n\t"
  10239. #elif defined(__clang__)
  10240. "sbcs r2, r4\n\t"
  10241. #else
  10242. "sbc r2, r4\n\t"
  10243. #endif
  10244. #ifdef WOLFSSL_KEIL
  10245. "sbcs r3, r3, r5\n\t"
  10246. #elif defined(__clang__)
  10247. "sbcs r3, r5\n\t"
  10248. #else
  10249. "sbc r3, r5\n\t"
  10250. #endif
  10251. "stm %[a]!, {r2, r3}\n\t"
  10252. "ldm %[b]!, {r4, r5}\n\t"
  10253. "ldr r2, [%[a]]\n\t"
  10254. "ldr r3, [%[a], #4]\n\t"
  10255. #ifdef WOLFSSL_KEIL
  10256. "sbcs r2, r2, r4\n\t"
  10257. #elif defined(__clang__)
  10258. "sbcs r2, r4\n\t"
  10259. #else
  10260. "sbc r2, r4\n\t"
  10261. #endif
  10262. #ifdef WOLFSSL_KEIL
  10263. "sbcs r3, r3, r5\n\t"
  10264. #elif defined(__clang__)
  10265. "sbcs r3, r5\n\t"
  10266. #else
  10267. "sbc r3, r5\n\t"
  10268. #endif
  10269. "stm %[a]!, {r2, r3}\n\t"
  10270. "ldm %[b]!, {r4, r5}\n\t"
  10271. "ldr r2, [%[a]]\n\t"
  10272. "ldr r3, [%[a], #4]\n\t"
  10273. #ifdef WOLFSSL_KEIL
  10274. "sbcs r2, r2, r4\n\t"
  10275. #elif defined(__clang__)
  10276. "sbcs r2, r4\n\t"
  10277. #else
  10278. "sbc r2, r4\n\t"
  10279. #endif
  10280. #ifdef WOLFSSL_KEIL
  10281. "sbcs r3, r3, r5\n\t"
  10282. #elif defined(__clang__)
  10283. "sbcs r3, r5\n\t"
  10284. #else
  10285. "sbc r3, r5\n\t"
  10286. #endif
  10287. "stm %[a]!, {r2, r3}\n\t"
  10288. "ldm %[b]!, {r4, r5}\n\t"
  10289. "ldr r2, [%[a]]\n\t"
  10290. "ldr r3, [%[a], #4]\n\t"
  10291. #ifdef WOLFSSL_KEIL
  10292. "sbcs r2, r2, r4\n\t"
  10293. #elif defined(__clang__)
  10294. "sbcs r2, r4\n\t"
  10295. #else
  10296. "sbc r2, r4\n\t"
  10297. #endif
  10298. #ifdef WOLFSSL_KEIL
  10299. "sbcs r3, r3, r5\n\t"
  10300. #elif defined(__clang__)
  10301. "sbcs r3, r5\n\t"
  10302. #else
  10303. "sbc r3, r5\n\t"
  10304. #endif
  10305. "stm %[a]!, {r2, r3}\n\t"
  10306. "ldm %[b]!, {r4, r5}\n\t"
  10307. "ldr r2, [%[a]]\n\t"
  10308. "ldr r3, [%[a], #4]\n\t"
  10309. #ifdef WOLFSSL_KEIL
  10310. "sbcs r2, r2, r4\n\t"
  10311. #elif defined(__clang__)
  10312. "sbcs r2, r4\n\t"
  10313. #else
  10314. "sbc r2, r4\n\t"
  10315. #endif
  10316. #ifdef WOLFSSL_KEIL
  10317. "sbcs r3, r3, r5\n\t"
  10318. #elif defined(__clang__)
  10319. "sbcs r3, r5\n\t"
  10320. #else
  10321. "sbc r3, r5\n\t"
  10322. #endif
  10323. "stm %[a]!, {r2, r3}\n\t"
  10324. "ldm %[b]!, {r4, r5}\n\t"
  10325. "ldr r2, [%[a]]\n\t"
  10326. "ldr r3, [%[a], #4]\n\t"
  10327. #ifdef WOLFSSL_KEIL
  10328. "sbcs r2, r2, r4\n\t"
  10329. #elif defined(__clang__)
  10330. "sbcs r2, r4\n\t"
  10331. #else
  10332. "sbc r2, r4\n\t"
  10333. #endif
  10334. #ifdef WOLFSSL_KEIL
  10335. "sbcs r3, r3, r5\n\t"
  10336. #elif defined(__clang__)
  10337. "sbcs r3, r5\n\t"
  10338. #else
  10339. "sbc r3, r5\n\t"
  10340. #endif
  10341. "stm %[a]!, {r2, r3}\n\t"
  10342. "ldm %[b]!, {r4, r5}\n\t"
  10343. "ldr r2, [%[a]]\n\t"
  10344. "ldr r3, [%[a], #4]\n\t"
  10345. #ifdef WOLFSSL_KEIL
  10346. "sbcs r2, r2, r4\n\t"
  10347. #elif defined(__clang__)
  10348. "sbcs r2, r4\n\t"
  10349. #else
  10350. "sbc r2, r4\n\t"
  10351. #endif
  10352. #ifdef WOLFSSL_KEIL
  10353. "sbcs r3, r3, r5\n\t"
  10354. #elif defined(__clang__)
  10355. "sbcs r3, r5\n\t"
  10356. #else
  10357. "sbc r3, r5\n\t"
  10358. #endif
  10359. "stm %[a]!, {r2, r3}\n\t"
  10360. "ldm %[b]!, {r4, r5}\n\t"
  10361. "ldr r2, [%[a]]\n\t"
  10362. "ldr r3, [%[a], #4]\n\t"
  10363. #ifdef WOLFSSL_KEIL
  10364. "sbcs r2, r2, r4\n\t"
  10365. #elif defined(__clang__)
  10366. "sbcs r2, r4\n\t"
  10367. #else
  10368. "sbc r2, r4\n\t"
  10369. #endif
  10370. #ifdef WOLFSSL_KEIL
  10371. "sbcs r3, r3, r5\n\t"
  10372. #elif defined(__clang__)
  10373. "sbcs r3, r5\n\t"
  10374. #else
  10375. "sbc r3, r5\n\t"
  10376. #endif
  10377. "stm %[a]!, {r2, r3}\n\t"
  10378. "ldm %[b]!, {r4, r5}\n\t"
  10379. "ldr r2, [%[a]]\n\t"
  10380. "ldr r3, [%[a], #4]\n\t"
  10381. #ifdef WOLFSSL_KEIL
  10382. "sbcs r2, r2, r4\n\t"
  10383. #elif defined(__clang__)
  10384. "sbcs r2, r4\n\t"
  10385. #else
  10386. "sbc r2, r4\n\t"
  10387. #endif
  10388. #ifdef WOLFSSL_KEIL
  10389. "sbcs r3, r3, r5\n\t"
  10390. #elif defined(__clang__)
  10391. "sbcs r3, r5\n\t"
  10392. #else
  10393. "sbc r3, r5\n\t"
  10394. #endif
  10395. "stm %[a]!, {r2, r3}\n\t"
  10396. #ifdef WOLFSSL_KEIL
  10397. "sbcs %[a], %[a], %[a]\n\t"
  10398. #elif defined(__clang__)
  10399. "sbcs %[a], %[a]\n\t"
  10400. #else
  10401. "sbc %[a], %[a]\n\t"
  10402. #endif
  10403. : [a] "+l" (a), [b] "+l" (b)
  10404. :
  10405. : "memory", "r2", "r3", "r4", "r5"
  10406. );
  10407. return (uint32_t)(size_t)a;
  10408. }
  10409. /* Add b to a into r. (r = a + b)
  10410. *
  10411. * r A single precision integer.
  10412. * a A single precision integer.
  10413. * b A single precision integer.
  10414. */
  10415. SP_NOINLINE static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a,
  10416. const sp_digit* b)
  10417. {
  10418. __asm__ __volatile__ (
  10419. "ldm %[b]!, {r5, r6}\n\t"
  10420. "ldm %[a]!, {r3, r4}\n\t"
  10421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10422. "adds r3, r3, r5\n\t"
  10423. #else
  10424. "add r3, r3, r5\n\t"
  10425. #endif
  10426. #ifdef WOLFSSL_KEIL
  10427. "adcs r4, r4, r6\n\t"
  10428. #elif defined(__clang__)
  10429. "adcs r4, r6\n\t"
  10430. #else
  10431. "adc r4, r6\n\t"
  10432. #endif
  10433. "stm %[r]!, {r3, r4}\n\t"
  10434. "ldm %[b]!, {r5, r6}\n\t"
  10435. "ldm %[a]!, {r3, r4}\n\t"
  10436. #ifdef WOLFSSL_KEIL
  10437. "adcs r3, r3, r5\n\t"
  10438. #elif defined(__clang__)
  10439. "adcs r3, r5\n\t"
  10440. #else
  10441. "adc r3, r5\n\t"
  10442. #endif
  10443. #ifdef WOLFSSL_KEIL
  10444. "adcs r4, r4, r6\n\t"
  10445. #elif defined(__clang__)
  10446. "adcs r4, r6\n\t"
  10447. #else
  10448. "adc r4, r6\n\t"
  10449. #endif
  10450. "stm %[r]!, {r3, r4}\n\t"
  10451. "ldm %[b]!, {r5, r6}\n\t"
  10452. "ldm %[a]!, {r3, r4}\n\t"
  10453. #ifdef WOLFSSL_KEIL
  10454. "adcs r3, r3, r5\n\t"
  10455. #elif defined(__clang__)
  10456. "adcs r3, r5\n\t"
  10457. #else
  10458. "adc r3, r5\n\t"
  10459. #endif
  10460. #ifdef WOLFSSL_KEIL
  10461. "adcs r4, r4, r6\n\t"
  10462. #elif defined(__clang__)
  10463. "adcs r4, r6\n\t"
  10464. #else
  10465. "adc r4, r6\n\t"
  10466. #endif
  10467. "stm %[r]!, {r3, r4}\n\t"
  10468. "ldm %[b]!, {r5, r6}\n\t"
  10469. "ldm %[a]!, {r3, r4}\n\t"
  10470. #ifdef WOLFSSL_KEIL
  10471. "adcs r3, r3, r5\n\t"
  10472. #elif defined(__clang__)
  10473. "adcs r3, r5\n\t"
  10474. #else
  10475. "adc r3, r5\n\t"
  10476. #endif
  10477. #ifdef WOLFSSL_KEIL
  10478. "adcs r4, r4, r6\n\t"
  10479. #elif defined(__clang__)
  10480. "adcs r4, r6\n\t"
  10481. #else
  10482. "adc r4, r6\n\t"
  10483. #endif
  10484. "stm %[r]!, {r3, r4}\n\t"
  10485. "ldm %[b]!, {r5, r6}\n\t"
  10486. "ldm %[a]!, {r3, r4}\n\t"
  10487. #ifdef WOLFSSL_KEIL
  10488. "adcs r3, r3, r5\n\t"
  10489. #elif defined(__clang__)
  10490. "adcs r3, r5\n\t"
  10491. #else
  10492. "adc r3, r5\n\t"
  10493. #endif
  10494. #ifdef WOLFSSL_KEIL
  10495. "adcs r4, r4, r6\n\t"
  10496. #elif defined(__clang__)
  10497. "adcs r4, r6\n\t"
  10498. #else
  10499. "adc r4, r6\n\t"
  10500. #endif
  10501. "stm %[r]!, {r3, r4}\n\t"
  10502. "ldm %[b]!, {r5, r6}\n\t"
  10503. "ldm %[a]!, {r3, r4}\n\t"
  10504. #ifdef WOLFSSL_KEIL
  10505. "adcs r3, r3, r5\n\t"
  10506. #elif defined(__clang__)
  10507. "adcs r3, r5\n\t"
  10508. #else
  10509. "adc r3, r5\n\t"
  10510. #endif
  10511. #ifdef WOLFSSL_KEIL
  10512. "adcs r4, r4, r6\n\t"
  10513. #elif defined(__clang__)
  10514. "adcs r4, r6\n\t"
  10515. #else
  10516. "adc r4, r6\n\t"
  10517. #endif
  10518. "stm %[r]!, {r3, r4}\n\t"
  10519. "ldm %[b]!, {r5, r6}\n\t"
  10520. "ldm %[a]!, {r3, r4}\n\t"
  10521. #ifdef WOLFSSL_KEIL
  10522. "adcs r3, r3, r5\n\t"
  10523. #elif defined(__clang__)
  10524. "adcs r3, r5\n\t"
  10525. #else
  10526. "adc r3, r5\n\t"
  10527. #endif
  10528. #ifdef WOLFSSL_KEIL
  10529. "adcs r4, r4, r6\n\t"
  10530. #elif defined(__clang__)
  10531. "adcs r4, r6\n\t"
  10532. #else
  10533. "adc r4, r6\n\t"
  10534. #endif
  10535. "stm %[r]!, {r3, r4}\n\t"
  10536. "ldm %[b]!, {r5, r6}\n\t"
  10537. "ldm %[a]!, {r3, r4}\n\t"
  10538. #ifdef WOLFSSL_KEIL
  10539. "adcs r3, r3, r5\n\t"
  10540. #elif defined(__clang__)
  10541. "adcs r3, r5\n\t"
  10542. #else
  10543. "adc r3, r5\n\t"
  10544. #endif
  10545. #ifdef WOLFSSL_KEIL
  10546. "adcs r4, r4, r6\n\t"
  10547. #elif defined(__clang__)
  10548. "adcs r4, r6\n\t"
  10549. #else
  10550. "adc r4, r6\n\t"
  10551. #endif
  10552. "stm %[r]!, {r3, r4}\n\t"
  10553. "ldm %[b]!, {r5, r6}\n\t"
  10554. "ldm %[a]!, {r3, r4}\n\t"
  10555. #ifdef WOLFSSL_KEIL
  10556. "adcs r3, r3, r5\n\t"
  10557. #elif defined(__clang__)
  10558. "adcs r3, r5\n\t"
  10559. #else
  10560. "adc r3, r5\n\t"
  10561. #endif
  10562. #ifdef WOLFSSL_KEIL
  10563. "adcs r4, r4, r6\n\t"
  10564. #elif defined(__clang__)
  10565. "adcs r4, r6\n\t"
  10566. #else
  10567. "adc r4, r6\n\t"
  10568. #endif
  10569. "stm %[r]!, {r3, r4}\n\t"
  10570. "ldm %[b]!, {r5, r6}\n\t"
  10571. "ldm %[a]!, {r3, r4}\n\t"
  10572. #ifdef WOLFSSL_KEIL
  10573. "adcs r3, r3, r5\n\t"
  10574. #elif defined(__clang__)
  10575. "adcs r3, r5\n\t"
  10576. #else
  10577. "adc r3, r5\n\t"
  10578. #endif
  10579. #ifdef WOLFSSL_KEIL
  10580. "adcs r4, r4, r6\n\t"
  10581. #elif defined(__clang__)
  10582. "adcs r4, r6\n\t"
  10583. #else
  10584. "adc r4, r6\n\t"
  10585. #endif
  10586. "stm %[r]!, {r3, r4}\n\t"
  10587. "ldm %[b]!, {r5, r6}\n\t"
  10588. "ldm %[a]!, {r3, r4}\n\t"
  10589. #ifdef WOLFSSL_KEIL
  10590. "adcs r3, r3, r5\n\t"
  10591. #elif defined(__clang__)
  10592. "adcs r3, r5\n\t"
  10593. #else
  10594. "adc r3, r5\n\t"
  10595. #endif
  10596. #ifdef WOLFSSL_KEIL
  10597. "adcs r4, r4, r6\n\t"
  10598. #elif defined(__clang__)
  10599. "adcs r4, r6\n\t"
  10600. #else
  10601. "adc r4, r6\n\t"
  10602. #endif
  10603. "stm %[r]!, {r3, r4}\n\t"
  10604. "ldm %[b]!, {r5, r6}\n\t"
  10605. "ldm %[a]!, {r3, r4}\n\t"
  10606. #ifdef WOLFSSL_KEIL
  10607. "adcs r3, r3, r5\n\t"
  10608. #elif defined(__clang__)
  10609. "adcs r3, r5\n\t"
  10610. #else
  10611. "adc r3, r5\n\t"
  10612. #endif
  10613. #ifdef WOLFSSL_KEIL
  10614. "adcs r4, r4, r6\n\t"
  10615. #elif defined(__clang__)
  10616. "adcs r4, r6\n\t"
  10617. #else
  10618. "adc r4, r6\n\t"
  10619. #endif
  10620. "stm %[r]!, {r3, r4}\n\t"
  10621. "ldm %[b]!, {r5, r6}\n\t"
  10622. "ldm %[a]!, {r3, r4}\n\t"
  10623. #ifdef WOLFSSL_KEIL
  10624. "adcs r3, r3, r5\n\t"
  10625. #elif defined(__clang__)
  10626. "adcs r3, r5\n\t"
  10627. #else
  10628. "adc r3, r5\n\t"
  10629. #endif
  10630. #ifdef WOLFSSL_KEIL
  10631. "adcs r4, r4, r6\n\t"
  10632. #elif defined(__clang__)
  10633. "adcs r4, r6\n\t"
  10634. #else
  10635. "adc r4, r6\n\t"
  10636. #endif
  10637. "stm %[r]!, {r3, r4}\n\t"
  10638. "ldm %[b]!, {r5, r6}\n\t"
  10639. "ldm %[a]!, {r3, r4}\n\t"
  10640. #ifdef WOLFSSL_KEIL
  10641. "adcs r3, r3, r5\n\t"
  10642. #elif defined(__clang__)
  10643. "adcs r3, r5\n\t"
  10644. #else
  10645. "adc r3, r5\n\t"
  10646. #endif
  10647. #ifdef WOLFSSL_KEIL
  10648. "adcs r4, r4, r6\n\t"
  10649. #elif defined(__clang__)
  10650. "adcs r4, r6\n\t"
  10651. #else
  10652. "adc r4, r6\n\t"
  10653. #endif
  10654. "stm %[r]!, {r3, r4}\n\t"
  10655. "ldm %[b]!, {r5, r6}\n\t"
  10656. "ldm %[a]!, {r3, r4}\n\t"
  10657. #ifdef WOLFSSL_KEIL
  10658. "adcs r3, r3, r5\n\t"
  10659. #elif defined(__clang__)
  10660. "adcs r3, r5\n\t"
  10661. #else
  10662. "adc r3, r5\n\t"
  10663. #endif
  10664. #ifdef WOLFSSL_KEIL
  10665. "adcs r4, r4, r6\n\t"
  10666. #elif defined(__clang__)
  10667. "adcs r4, r6\n\t"
  10668. #else
  10669. "adc r4, r6\n\t"
  10670. #endif
  10671. "stm %[r]!, {r3, r4}\n\t"
  10672. "ldm %[b]!, {r5, r6}\n\t"
  10673. "ldm %[a]!, {r3, r4}\n\t"
  10674. #ifdef WOLFSSL_KEIL
  10675. "adcs r3, r3, r5\n\t"
  10676. #elif defined(__clang__)
  10677. "adcs r3, r5\n\t"
  10678. #else
  10679. "adc r3, r5\n\t"
  10680. #endif
  10681. #ifdef WOLFSSL_KEIL
  10682. "adcs r4, r4, r6\n\t"
  10683. #elif defined(__clang__)
  10684. "adcs r4, r6\n\t"
  10685. #else
  10686. "adc r4, r6\n\t"
  10687. #endif
  10688. "stm %[r]!, {r3, r4}\n\t"
  10689. "movs %[r], #0\n\t"
  10690. #ifdef WOLFSSL_KEIL
  10691. "adcs %[r], %[r], %[r]\n\t"
  10692. #elif defined(__clang__)
  10693. "adcs %[r], %[r]\n\t"
  10694. #else
  10695. "adc %[r], %[r]\n\t"
  10696. #endif
  10697. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  10698. :
  10699. : "memory", "r3", "r4", "r5", "r6"
  10700. );
  10701. return (uint32_t)(size_t)r;
  10702. }
  10703. /* AND m into each word of a and store in r.
  10704. *
  10705. * r A single precision integer.
  10706. * a A single precision integer.
  10707. * m Mask to AND against each digit.
  10708. */
  10709. static void sp_2048_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  10710. {
  10711. #ifdef WOLFSSL_SP_SMALL
  10712. int i;
  10713. for (i=0; i<16; i++) {
  10714. r[i] = a[i] & m;
  10715. }
  10716. #else
  10717. int i;
  10718. for (i = 0; i < 16; i += 8) {
  10719. r[i+0] = a[i+0] & m;
  10720. r[i+1] = a[i+1] & m;
  10721. r[i+2] = a[i+2] & m;
  10722. r[i+3] = a[i+3] & m;
  10723. r[i+4] = a[i+4] & m;
  10724. r[i+5] = a[i+5] & m;
  10725. r[i+6] = a[i+6] & m;
  10726. r[i+7] = a[i+7] & m;
  10727. }
  10728. #endif
  10729. }
  10730. /* Multiply a and b into r. (r = a * b)
  10731. *
  10732. * r A single precision integer.
  10733. * a A single precision integer.
  10734. * b A single precision integer.
  10735. */
  10736. SP_NOINLINE static void sp_2048_mul_32(sp_digit* r, const sp_digit* a,
  10737. const sp_digit* b)
  10738. {
  10739. sp_digit* z0 = r;
  10740. sp_digit z1[32];
  10741. sp_digit a1[16];
  10742. sp_digit b1[16];
  10743. sp_digit* z2 = r + 32;
  10744. sp_digit u;
  10745. sp_digit ca;
  10746. sp_digit cb;
  10747. ca = sp_2048_add_16(a1, a, &a[16]);
  10748. cb = sp_2048_add_16(b1, b, &b[16]);
  10749. u = ca & cb;
  10750. sp_2048_mul_16(z2, &a[16], &b[16]);
  10751. sp_2048_mul_16(z0, a, b);
  10752. sp_2048_mul_16(z1, a1, b1);
  10753. u += sp_2048_sub_in_place_32(z1, z0);
  10754. u += sp_2048_sub_in_place_32(z1, z2);
  10755. sp_2048_mask_16(a1, a1, 0 - cb);
  10756. u += sp_2048_add_16(z1 + 16, z1 + 16, a1);
  10757. sp_2048_mask_16(b1, b1, 0 - ca);
  10758. u += sp_2048_add_16(z1 + 16, z1 + 16, b1);
  10759. u += sp_2048_add_32(r + 16, r + 16, z1);
  10760. (void)sp_2048_add_word_16(r + 48, r + 48, u);
  10761. }
  10762. /* Add b to a into r. (r = a + b)
  10763. *
  10764. * r A single precision integer.
  10765. * a A single precision integer.
  10766. * b A single precision integer.
  10767. */
  10768. SP_NOINLINE static sp_digit sp_2048_add_word_32(sp_digit* r, const sp_digit* a,
  10769. sp_digit b)
  10770. {
  10771. __asm__ __volatile__ (
  10772. "movs r5, #0\n\t"
  10773. "ldm %[a]!, {r3, r4}\n\t"
  10774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  10775. "adds r3, r3, %[b]\n\t"
  10776. #else
  10777. "add r3, r3, %[b]\n\t"
  10778. #endif
  10779. #ifdef WOLFSSL_KEIL
  10780. "adcs r4, r4, r5\n\t"
  10781. #elif defined(__clang__)
  10782. "adcs r4, r5\n\t"
  10783. #else
  10784. "adc r4, r5\n\t"
  10785. #endif
  10786. "stm %[r]!, {r3, r4}\n\t"
  10787. "ldm %[a]!, {r3, r4}\n\t"
  10788. #ifdef WOLFSSL_KEIL
  10789. "adcs r3, r3, r5\n\t"
  10790. #elif defined(__clang__)
  10791. "adcs r3, r5\n\t"
  10792. #else
  10793. "adc r3, r5\n\t"
  10794. #endif
  10795. #ifdef WOLFSSL_KEIL
  10796. "adcs r4, r4, r5\n\t"
  10797. #elif defined(__clang__)
  10798. "adcs r4, r5\n\t"
  10799. #else
  10800. "adc r4, r5\n\t"
  10801. #endif
  10802. "stm %[r]!, {r3, r4}\n\t"
  10803. "ldm %[a]!, {r3, r4}\n\t"
  10804. #ifdef WOLFSSL_KEIL
  10805. "adcs r3, r3, r5\n\t"
  10806. #elif defined(__clang__)
  10807. "adcs r3, r5\n\t"
  10808. #else
  10809. "adc r3, r5\n\t"
  10810. #endif
  10811. #ifdef WOLFSSL_KEIL
  10812. "adcs r4, r4, r5\n\t"
  10813. #elif defined(__clang__)
  10814. "adcs r4, r5\n\t"
  10815. #else
  10816. "adc r4, r5\n\t"
  10817. #endif
  10818. "stm %[r]!, {r3, r4}\n\t"
  10819. "ldm %[a]!, {r3, r4}\n\t"
  10820. #ifdef WOLFSSL_KEIL
  10821. "adcs r3, r3, r5\n\t"
  10822. #elif defined(__clang__)
  10823. "adcs r3, r5\n\t"
  10824. #else
  10825. "adc r3, r5\n\t"
  10826. #endif
  10827. #ifdef WOLFSSL_KEIL
  10828. "adcs r4, r4, r5\n\t"
  10829. #elif defined(__clang__)
  10830. "adcs r4, r5\n\t"
  10831. #else
  10832. "adc r4, r5\n\t"
  10833. #endif
  10834. "stm %[r]!, {r3, r4}\n\t"
  10835. "ldm %[a]!, {r3, r4}\n\t"
  10836. #ifdef WOLFSSL_KEIL
  10837. "adcs r3, r3, r5\n\t"
  10838. #elif defined(__clang__)
  10839. "adcs r3, r5\n\t"
  10840. #else
  10841. "adc r3, r5\n\t"
  10842. #endif
  10843. #ifdef WOLFSSL_KEIL
  10844. "adcs r4, r4, r5\n\t"
  10845. #elif defined(__clang__)
  10846. "adcs r4, r5\n\t"
  10847. #else
  10848. "adc r4, r5\n\t"
  10849. #endif
  10850. "stm %[r]!, {r3, r4}\n\t"
  10851. "ldm %[a]!, {r3, r4}\n\t"
  10852. #ifdef WOLFSSL_KEIL
  10853. "adcs r3, r3, r5\n\t"
  10854. #elif defined(__clang__)
  10855. "adcs r3, r5\n\t"
  10856. #else
  10857. "adc r3, r5\n\t"
  10858. #endif
  10859. #ifdef WOLFSSL_KEIL
  10860. "adcs r4, r4, r5\n\t"
  10861. #elif defined(__clang__)
  10862. "adcs r4, r5\n\t"
  10863. #else
  10864. "adc r4, r5\n\t"
  10865. #endif
  10866. "stm %[r]!, {r3, r4}\n\t"
  10867. "ldm %[a]!, {r3, r4}\n\t"
  10868. #ifdef WOLFSSL_KEIL
  10869. "adcs r3, r3, r5\n\t"
  10870. #elif defined(__clang__)
  10871. "adcs r3, r5\n\t"
  10872. #else
  10873. "adc r3, r5\n\t"
  10874. #endif
  10875. #ifdef WOLFSSL_KEIL
  10876. "adcs r4, r4, r5\n\t"
  10877. #elif defined(__clang__)
  10878. "adcs r4, r5\n\t"
  10879. #else
  10880. "adc r4, r5\n\t"
  10881. #endif
  10882. "stm %[r]!, {r3, r4}\n\t"
  10883. "ldm %[a]!, {r3, r4}\n\t"
  10884. #ifdef WOLFSSL_KEIL
  10885. "adcs r3, r3, r5\n\t"
  10886. #elif defined(__clang__)
  10887. "adcs r3, r5\n\t"
  10888. #else
  10889. "adc r3, r5\n\t"
  10890. #endif
  10891. #ifdef WOLFSSL_KEIL
  10892. "adcs r4, r4, r5\n\t"
  10893. #elif defined(__clang__)
  10894. "adcs r4, r5\n\t"
  10895. #else
  10896. "adc r4, r5\n\t"
  10897. #endif
  10898. "stm %[r]!, {r3, r4}\n\t"
  10899. "ldm %[a]!, {r3, r4}\n\t"
  10900. #ifdef WOLFSSL_KEIL
  10901. "adcs r3, r3, r5\n\t"
  10902. #elif defined(__clang__)
  10903. "adcs r3, r5\n\t"
  10904. #else
  10905. "adc r3, r5\n\t"
  10906. #endif
  10907. #ifdef WOLFSSL_KEIL
  10908. "adcs r4, r4, r5\n\t"
  10909. #elif defined(__clang__)
  10910. "adcs r4, r5\n\t"
  10911. #else
  10912. "adc r4, r5\n\t"
  10913. #endif
  10914. "stm %[r]!, {r3, r4}\n\t"
  10915. "ldm %[a]!, {r3, r4}\n\t"
  10916. #ifdef WOLFSSL_KEIL
  10917. "adcs r3, r3, r5\n\t"
  10918. #elif defined(__clang__)
  10919. "adcs r3, r5\n\t"
  10920. #else
  10921. "adc r3, r5\n\t"
  10922. #endif
  10923. #ifdef WOLFSSL_KEIL
  10924. "adcs r4, r4, r5\n\t"
  10925. #elif defined(__clang__)
  10926. "adcs r4, r5\n\t"
  10927. #else
  10928. "adc r4, r5\n\t"
  10929. #endif
  10930. "stm %[r]!, {r3, r4}\n\t"
  10931. "ldm %[a]!, {r3, r4}\n\t"
  10932. #ifdef WOLFSSL_KEIL
  10933. "adcs r3, r3, r5\n\t"
  10934. #elif defined(__clang__)
  10935. "adcs r3, r5\n\t"
  10936. #else
  10937. "adc r3, r5\n\t"
  10938. #endif
  10939. #ifdef WOLFSSL_KEIL
  10940. "adcs r4, r4, r5\n\t"
  10941. #elif defined(__clang__)
  10942. "adcs r4, r5\n\t"
  10943. #else
  10944. "adc r4, r5\n\t"
  10945. #endif
  10946. "stm %[r]!, {r3, r4}\n\t"
  10947. "ldm %[a]!, {r3, r4}\n\t"
  10948. #ifdef WOLFSSL_KEIL
  10949. "adcs r3, r3, r5\n\t"
  10950. #elif defined(__clang__)
  10951. "adcs r3, r5\n\t"
  10952. #else
  10953. "adc r3, r5\n\t"
  10954. #endif
  10955. #ifdef WOLFSSL_KEIL
  10956. "adcs r4, r4, r5\n\t"
  10957. #elif defined(__clang__)
  10958. "adcs r4, r5\n\t"
  10959. #else
  10960. "adc r4, r5\n\t"
  10961. #endif
  10962. "stm %[r]!, {r3, r4}\n\t"
  10963. "ldm %[a]!, {r3, r4}\n\t"
  10964. #ifdef WOLFSSL_KEIL
  10965. "adcs r3, r3, r5\n\t"
  10966. #elif defined(__clang__)
  10967. "adcs r3, r5\n\t"
  10968. #else
  10969. "adc r3, r5\n\t"
  10970. #endif
  10971. #ifdef WOLFSSL_KEIL
  10972. "adcs r4, r4, r5\n\t"
  10973. #elif defined(__clang__)
  10974. "adcs r4, r5\n\t"
  10975. #else
  10976. "adc r4, r5\n\t"
  10977. #endif
  10978. "stm %[r]!, {r3, r4}\n\t"
  10979. "ldm %[a]!, {r3, r4}\n\t"
  10980. #ifdef WOLFSSL_KEIL
  10981. "adcs r3, r3, r5\n\t"
  10982. #elif defined(__clang__)
  10983. "adcs r3, r5\n\t"
  10984. #else
  10985. "adc r3, r5\n\t"
  10986. #endif
  10987. #ifdef WOLFSSL_KEIL
  10988. "adcs r4, r4, r5\n\t"
  10989. #elif defined(__clang__)
  10990. "adcs r4, r5\n\t"
  10991. #else
  10992. "adc r4, r5\n\t"
  10993. #endif
  10994. "stm %[r]!, {r3, r4}\n\t"
  10995. "ldm %[a]!, {r3, r4}\n\t"
  10996. #ifdef WOLFSSL_KEIL
  10997. "adcs r3, r3, r5\n\t"
  10998. #elif defined(__clang__)
  10999. "adcs r3, r5\n\t"
  11000. #else
  11001. "adc r3, r5\n\t"
  11002. #endif
  11003. #ifdef WOLFSSL_KEIL
  11004. "adcs r4, r4, r5\n\t"
  11005. #elif defined(__clang__)
  11006. "adcs r4, r5\n\t"
  11007. #else
  11008. "adc r4, r5\n\t"
  11009. #endif
  11010. "stm %[r]!, {r3, r4}\n\t"
  11011. "ldm %[a]!, {r3, r4}\n\t"
  11012. #ifdef WOLFSSL_KEIL
  11013. "adcs r3, r3, r5\n\t"
  11014. #elif defined(__clang__)
  11015. "adcs r3, r5\n\t"
  11016. #else
  11017. "adc r3, r5\n\t"
  11018. #endif
  11019. #ifdef WOLFSSL_KEIL
  11020. "adcs r4, r4, r5\n\t"
  11021. #elif defined(__clang__)
  11022. "adcs r4, r5\n\t"
  11023. #else
  11024. "adc r4, r5\n\t"
  11025. #endif
  11026. "stm %[r]!, {r3, r4}\n\t"
  11027. "movs %[r], #0\n\t"
  11028. #ifdef WOLFSSL_KEIL
  11029. "adcs %[r], %[r], %[r]\n\t"
  11030. #elif defined(__clang__)
  11031. "adcs %[r], %[r]\n\t"
  11032. #else
  11033. "adc %[r], %[r]\n\t"
  11034. #endif
  11035. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  11036. :
  11037. : "memory", "r3", "r4", "r5"
  11038. );
  11039. return (uint32_t)(size_t)r;
  11040. }
  11041. /* Sub b from a into a. (a -= b)
  11042. *
  11043. * a A single precision integer.
  11044. * b A single precision integer.
  11045. */
  11046. SP_NOINLINE static sp_digit sp_2048_sub_in_place_64(sp_digit* a,
  11047. const sp_digit* b)
  11048. {
  11049. __asm__ __volatile__ (
  11050. "ldm %[b]!, {r4, r5}\n\t"
  11051. "ldr r2, [%[a]]\n\t"
  11052. "ldr r3, [%[a], #4]\n\t"
  11053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11054. "subs r2, r2, r4\n\t"
  11055. #else
  11056. "sub r2, r2, r4\n\t"
  11057. #endif
  11058. #ifdef WOLFSSL_KEIL
  11059. "sbcs r3, r3, r5\n\t"
  11060. #elif defined(__clang__)
  11061. "sbcs r3, r5\n\t"
  11062. #else
  11063. "sbc r3, r5\n\t"
  11064. #endif
  11065. "stm %[a]!, {r2, r3}\n\t"
  11066. "ldm %[b]!, {r4, r5}\n\t"
  11067. "ldr r2, [%[a]]\n\t"
  11068. "ldr r3, [%[a], #4]\n\t"
  11069. #ifdef WOLFSSL_KEIL
  11070. "sbcs r2, r2, r4\n\t"
  11071. #elif defined(__clang__)
  11072. "sbcs r2, r4\n\t"
  11073. #else
  11074. "sbc r2, r4\n\t"
  11075. #endif
  11076. #ifdef WOLFSSL_KEIL
  11077. "sbcs r3, r3, r5\n\t"
  11078. #elif defined(__clang__)
  11079. "sbcs r3, r5\n\t"
  11080. #else
  11081. "sbc r3, r5\n\t"
  11082. #endif
  11083. "stm %[a]!, {r2, r3}\n\t"
  11084. "ldm %[b]!, {r4, r5}\n\t"
  11085. "ldr r2, [%[a]]\n\t"
  11086. "ldr r3, [%[a], #4]\n\t"
  11087. #ifdef WOLFSSL_KEIL
  11088. "sbcs r2, r2, r4\n\t"
  11089. #elif defined(__clang__)
  11090. "sbcs r2, r4\n\t"
  11091. #else
  11092. "sbc r2, r4\n\t"
  11093. #endif
  11094. #ifdef WOLFSSL_KEIL
  11095. "sbcs r3, r3, r5\n\t"
  11096. #elif defined(__clang__)
  11097. "sbcs r3, r5\n\t"
  11098. #else
  11099. "sbc r3, r5\n\t"
  11100. #endif
  11101. "stm %[a]!, {r2, r3}\n\t"
  11102. "ldm %[b]!, {r4, r5}\n\t"
  11103. "ldr r2, [%[a]]\n\t"
  11104. "ldr r3, [%[a], #4]\n\t"
  11105. #ifdef WOLFSSL_KEIL
  11106. "sbcs r2, r2, r4\n\t"
  11107. #elif defined(__clang__)
  11108. "sbcs r2, r4\n\t"
  11109. #else
  11110. "sbc r2, r4\n\t"
  11111. #endif
  11112. #ifdef WOLFSSL_KEIL
  11113. "sbcs r3, r3, r5\n\t"
  11114. #elif defined(__clang__)
  11115. "sbcs r3, r5\n\t"
  11116. #else
  11117. "sbc r3, r5\n\t"
  11118. #endif
  11119. "stm %[a]!, {r2, r3}\n\t"
  11120. "ldm %[b]!, {r4, r5}\n\t"
  11121. "ldr r2, [%[a]]\n\t"
  11122. "ldr r3, [%[a], #4]\n\t"
  11123. #ifdef WOLFSSL_KEIL
  11124. "sbcs r2, r2, r4\n\t"
  11125. #elif defined(__clang__)
  11126. "sbcs r2, r4\n\t"
  11127. #else
  11128. "sbc r2, r4\n\t"
  11129. #endif
  11130. #ifdef WOLFSSL_KEIL
  11131. "sbcs r3, r3, r5\n\t"
  11132. #elif defined(__clang__)
  11133. "sbcs r3, r5\n\t"
  11134. #else
  11135. "sbc r3, r5\n\t"
  11136. #endif
  11137. "stm %[a]!, {r2, r3}\n\t"
  11138. "ldm %[b]!, {r4, r5}\n\t"
  11139. "ldr r2, [%[a]]\n\t"
  11140. "ldr r3, [%[a], #4]\n\t"
  11141. #ifdef WOLFSSL_KEIL
  11142. "sbcs r2, r2, r4\n\t"
  11143. #elif defined(__clang__)
  11144. "sbcs r2, r4\n\t"
  11145. #else
  11146. "sbc r2, r4\n\t"
  11147. #endif
  11148. #ifdef WOLFSSL_KEIL
  11149. "sbcs r3, r3, r5\n\t"
  11150. #elif defined(__clang__)
  11151. "sbcs r3, r5\n\t"
  11152. #else
  11153. "sbc r3, r5\n\t"
  11154. #endif
  11155. "stm %[a]!, {r2, r3}\n\t"
  11156. "ldm %[b]!, {r4, r5}\n\t"
  11157. "ldr r2, [%[a]]\n\t"
  11158. "ldr r3, [%[a], #4]\n\t"
  11159. #ifdef WOLFSSL_KEIL
  11160. "sbcs r2, r2, r4\n\t"
  11161. #elif defined(__clang__)
  11162. "sbcs r2, r4\n\t"
  11163. #else
  11164. "sbc r2, r4\n\t"
  11165. #endif
  11166. #ifdef WOLFSSL_KEIL
  11167. "sbcs r3, r3, r5\n\t"
  11168. #elif defined(__clang__)
  11169. "sbcs r3, r5\n\t"
  11170. #else
  11171. "sbc r3, r5\n\t"
  11172. #endif
  11173. "stm %[a]!, {r2, r3}\n\t"
  11174. "ldm %[b]!, {r4, r5}\n\t"
  11175. "ldr r2, [%[a]]\n\t"
  11176. "ldr r3, [%[a], #4]\n\t"
  11177. #ifdef WOLFSSL_KEIL
  11178. "sbcs r2, r2, r4\n\t"
  11179. #elif defined(__clang__)
  11180. "sbcs r2, r4\n\t"
  11181. #else
  11182. "sbc r2, r4\n\t"
  11183. #endif
  11184. #ifdef WOLFSSL_KEIL
  11185. "sbcs r3, r3, r5\n\t"
  11186. #elif defined(__clang__)
  11187. "sbcs r3, r5\n\t"
  11188. #else
  11189. "sbc r3, r5\n\t"
  11190. #endif
  11191. "stm %[a]!, {r2, r3}\n\t"
  11192. "ldm %[b]!, {r4, r5}\n\t"
  11193. "ldr r2, [%[a]]\n\t"
  11194. "ldr r3, [%[a], #4]\n\t"
  11195. #ifdef WOLFSSL_KEIL
  11196. "sbcs r2, r2, r4\n\t"
  11197. #elif defined(__clang__)
  11198. "sbcs r2, r4\n\t"
  11199. #else
  11200. "sbc r2, r4\n\t"
  11201. #endif
  11202. #ifdef WOLFSSL_KEIL
  11203. "sbcs r3, r3, r5\n\t"
  11204. #elif defined(__clang__)
  11205. "sbcs r3, r5\n\t"
  11206. #else
  11207. "sbc r3, r5\n\t"
  11208. #endif
  11209. "stm %[a]!, {r2, r3}\n\t"
  11210. "ldm %[b]!, {r4, r5}\n\t"
  11211. "ldr r2, [%[a]]\n\t"
  11212. "ldr r3, [%[a], #4]\n\t"
  11213. #ifdef WOLFSSL_KEIL
  11214. "sbcs r2, r2, r4\n\t"
  11215. #elif defined(__clang__)
  11216. "sbcs r2, r4\n\t"
  11217. #else
  11218. "sbc r2, r4\n\t"
  11219. #endif
  11220. #ifdef WOLFSSL_KEIL
  11221. "sbcs r3, r3, r5\n\t"
  11222. #elif defined(__clang__)
  11223. "sbcs r3, r5\n\t"
  11224. #else
  11225. "sbc r3, r5\n\t"
  11226. #endif
  11227. "stm %[a]!, {r2, r3}\n\t"
  11228. "ldm %[b]!, {r4, r5}\n\t"
  11229. "ldr r2, [%[a]]\n\t"
  11230. "ldr r3, [%[a], #4]\n\t"
  11231. #ifdef WOLFSSL_KEIL
  11232. "sbcs r2, r2, r4\n\t"
  11233. #elif defined(__clang__)
  11234. "sbcs r2, r4\n\t"
  11235. #else
  11236. "sbc r2, r4\n\t"
  11237. #endif
  11238. #ifdef WOLFSSL_KEIL
  11239. "sbcs r3, r3, r5\n\t"
  11240. #elif defined(__clang__)
  11241. "sbcs r3, r5\n\t"
  11242. #else
  11243. "sbc r3, r5\n\t"
  11244. #endif
  11245. "stm %[a]!, {r2, r3}\n\t"
  11246. "ldm %[b]!, {r4, r5}\n\t"
  11247. "ldr r2, [%[a]]\n\t"
  11248. "ldr r3, [%[a], #4]\n\t"
  11249. #ifdef WOLFSSL_KEIL
  11250. "sbcs r2, r2, r4\n\t"
  11251. #elif defined(__clang__)
  11252. "sbcs r2, r4\n\t"
  11253. #else
  11254. "sbc r2, r4\n\t"
  11255. #endif
  11256. #ifdef WOLFSSL_KEIL
  11257. "sbcs r3, r3, r5\n\t"
  11258. #elif defined(__clang__)
  11259. "sbcs r3, r5\n\t"
  11260. #else
  11261. "sbc r3, r5\n\t"
  11262. #endif
  11263. "stm %[a]!, {r2, r3}\n\t"
  11264. "ldm %[b]!, {r4, r5}\n\t"
  11265. "ldr r2, [%[a]]\n\t"
  11266. "ldr r3, [%[a], #4]\n\t"
  11267. #ifdef WOLFSSL_KEIL
  11268. "sbcs r2, r2, r4\n\t"
  11269. #elif defined(__clang__)
  11270. "sbcs r2, r4\n\t"
  11271. #else
  11272. "sbc r2, r4\n\t"
  11273. #endif
  11274. #ifdef WOLFSSL_KEIL
  11275. "sbcs r3, r3, r5\n\t"
  11276. #elif defined(__clang__)
  11277. "sbcs r3, r5\n\t"
  11278. #else
  11279. "sbc r3, r5\n\t"
  11280. #endif
  11281. "stm %[a]!, {r2, r3}\n\t"
  11282. "ldm %[b]!, {r4, r5}\n\t"
  11283. "ldr r2, [%[a]]\n\t"
  11284. "ldr r3, [%[a], #4]\n\t"
  11285. #ifdef WOLFSSL_KEIL
  11286. "sbcs r2, r2, r4\n\t"
  11287. #elif defined(__clang__)
  11288. "sbcs r2, r4\n\t"
  11289. #else
  11290. "sbc r2, r4\n\t"
  11291. #endif
  11292. #ifdef WOLFSSL_KEIL
  11293. "sbcs r3, r3, r5\n\t"
  11294. #elif defined(__clang__)
  11295. "sbcs r3, r5\n\t"
  11296. #else
  11297. "sbc r3, r5\n\t"
  11298. #endif
  11299. "stm %[a]!, {r2, r3}\n\t"
  11300. "ldm %[b]!, {r4, r5}\n\t"
  11301. "ldr r2, [%[a]]\n\t"
  11302. "ldr r3, [%[a], #4]\n\t"
  11303. #ifdef WOLFSSL_KEIL
  11304. "sbcs r2, r2, r4\n\t"
  11305. #elif defined(__clang__)
  11306. "sbcs r2, r4\n\t"
  11307. #else
  11308. "sbc r2, r4\n\t"
  11309. #endif
  11310. #ifdef WOLFSSL_KEIL
  11311. "sbcs r3, r3, r5\n\t"
  11312. #elif defined(__clang__)
  11313. "sbcs r3, r5\n\t"
  11314. #else
  11315. "sbc r3, r5\n\t"
  11316. #endif
  11317. "stm %[a]!, {r2, r3}\n\t"
  11318. "ldm %[b]!, {r4, r5}\n\t"
  11319. "ldr r2, [%[a]]\n\t"
  11320. "ldr r3, [%[a], #4]\n\t"
  11321. #ifdef WOLFSSL_KEIL
  11322. "sbcs r2, r2, r4\n\t"
  11323. #elif defined(__clang__)
  11324. "sbcs r2, r4\n\t"
  11325. #else
  11326. "sbc r2, r4\n\t"
  11327. #endif
  11328. #ifdef WOLFSSL_KEIL
  11329. "sbcs r3, r3, r5\n\t"
  11330. #elif defined(__clang__)
  11331. "sbcs r3, r5\n\t"
  11332. #else
  11333. "sbc r3, r5\n\t"
  11334. #endif
  11335. "stm %[a]!, {r2, r3}\n\t"
  11336. "ldm %[b]!, {r4, r5}\n\t"
  11337. "ldr r2, [%[a]]\n\t"
  11338. "ldr r3, [%[a], #4]\n\t"
  11339. #ifdef WOLFSSL_KEIL
  11340. "sbcs r2, r2, r4\n\t"
  11341. #elif defined(__clang__)
  11342. "sbcs r2, r4\n\t"
  11343. #else
  11344. "sbc r2, r4\n\t"
  11345. #endif
  11346. #ifdef WOLFSSL_KEIL
  11347. "sbcs r3, r3, r5\n\t"
  11348. #elif defined(__clang__)
  11349. "sbcs r3, r5\n\t"
  11350. #else
  11351. "sbc r3, r5\n\t"
  11352. #endif
  11353. "stm %[a]!, {r2, r3}\n\t"
  11354. "ldm %[b]!, {r4, r5}\n\t"
  11355. "ldr r2, [%[a]]\n\t"
  11356. "ldr r3, [%[a], #4]\n\t"
  11357. #ifdef WOLFSSL_KEIL
  11358. "sbcs r2, r2, r4\n\t"
  11359. #elif defined(__clang__)
  11360. "sbcs r2, r4\n\t"
  11361. #else
  11362. "sbc r2, r4\n\t"
  11363. #endif
  11364. #ifdef WOLFSSL_KEIL
  11365. "sbcs r3, r3, r5\n\t"
  11366. #elif defined(__clang__)
  11367. "sbcs r3, r5\n\t"
  11368. #else
  11369. "sbc r3, r5\n\t"
  11370. #endif
  11371. "stm %[a]!, {r2, r3}\n\t"
  11372. "ldm %[b]!, {r4, r5}\n\t"
  11373. "ldr r2, [%[a]]\n\t"
  11374. "ldr r3, [%[a], #4]\n\t"
  11375. #ifdef WOLFSSL_KEIL
  11376. "sbcs r2, r2, r4\n\t"
  11377. #elif defined(__clang__)
  11378. "sbcs r2, r4\n\t"
  11379. #else
  11380. "sbc r2, r4\n\t"
  11381. #endif
  11382. #ifdef WOLFSSL_KEIL
  11383. "sbcs r3, r3, r5\n\t"
  11384. #elif defined(__clang__)
  11385. "sbcs r3, r5\n\t"
  11386. #else
  11387. "sbc r3, r5\n\t"
  11388. #endif
  11389. "stm %[a]!, {r2, r3}\n\t"
  11390. "ldm %[b]!, {r4, r5}\n\t"
  11391. "ldr r2, [%[a]]\n\t"
  11392. "ldr r3, [%[a], #4]\n\t"
  11393. #ifdef WOLFSSL_KEIL
  11394. "sbcs r2, r2, r4\n\t"
  11395. #elif defined(__clang__)
  11396. "sbcs r2, r4\n\t"
  11397. #else
  11398. "sbc r2, r4\n\t"
  11399. #endif
  11400. #ifdef WOLFSSL_KEIL
  11401. "sbcs r3, r3, r5\n\t"
  11402. #elif defined(__clang__)
  11403. "sbcs r3, r5\n\t"
  11404. #else
  11405. "sbc r3, r5\n\t"
  11406. #endif
  11407. "stm %[a]!, {r2, r3}\n\t"
  11408. "ldm %[b]!, {r4, r5}\n\t"
  11409. "ldr r2, [%[a]]\n\t"
  11410. "ldr r3, [%[a], #4]\n\t"
  11411. #ifdef WOLFSSL_KEIL
  11412. "sbcs r2, r2, r4\n\t"
  11413. #elif defined(__clang__)
  11414. "sbcs r2, r4\n\t"
  11415. #else
  11416. "sbc r2, r4\n\t"
  11417. #endif
  11418. #ifdef WOLFSSL_KEIL
  11419. "sbcs r3, r3, r5\n\t"
  11420. #elif defined(__clang__)
  11421. "sbcs r3, r5\n\t"
  11422. #else
  11423. "sbc r3, r5\n\t"
  11424. #endif
  11425. "stm %[a]!, {r2, r3}\n\t"
  11426. "ldm %[b]!, {r4, r5}\n\t"
  11427. "ldr r2, [%[a]]\n\t"
  11428. "ldr r3, [%[a], #4]\n\t"
  11429. #ifdef WOLFSSL_KEIL
  11430. "sbcs r2, r2, r4\n\t"
  11431. #elif defined(__clang__)
  11432. "sbcs r2, r4\n\t"
  11433. #else
  11434. "sbc r2, r4\n\t"
  11435. #endif
  11436. #ifdef WOLFSSL_KEIL
  11437. "sbcs r3, r3, r5\n\t"
  11438. #elif defined(__clang__)
  11439. "sbcs r3, r5\n\t"
  11440. #else
  11441. "sbc r3, r5\n\t"
  11442. #endif
  11443. "stm %[a]!, {r2, r3}\n\t"
  11444. "ldm %[b]!, {r4, r5}\n\t"
  11445. "ldr r2, [%[a]]\n\t"
  11446. "ldr r3, [%[a], #4]\n\t"
  11447. #ifdef WOLFSSL_KEIL
  11448. "sbcs r2, r2, r4\n\t"
  11449. #elif defined(__clang__)
  11450. "sbcs r2, r4\n\t"
  11451. #else
  11452. "sbc r2, r4\n\t"
  11453. #endif
  11454. #ifdef WOLFSSL_KEIL
  11455. "sbcs r3, r3, r5\n\t"
  11456. #elif defined(__clang__)
  11457. "sbcs r3, r5\n\t"
  11458. #else
  11459. "sbc r3, r5\n\t"
  11460. #endif
  11461. "stm %[a]!, {r2, r3}\n\t"
  11462. "ldm %[b]!, {r4, r5}\n\t"
  11463. "ldr r2, [%[a]]\n\t"
  11464. "ldr r3, [%[a], #4]\n\t"
  11465. #ifdef WOLFSSL_KEIL
  11466. "sbcs r2, r2, r4\n\t"
  11467. #elif defined(__clang__)
  11468. "sbcs r2, r4\n\t"
  11469. #else
  11470. "sbc r2, r4\n\t"
  11471. #endif
  11472. #ifdef WOLFSSL_KEIL
  11473. "sbcs r3, r3, r5\n\t"
  11474. #elif defined(__clang__)
  11475. "sbcs r3, r5\n\t"
  11476. #else
  11477. "sbc r3, r5\n\t"
  11478. #endif
  11479. "stm %[a]!, {r2, r3}\n\t"
  11480. "ldm %[b]!, {r4, r5}\n\t"
  11481. "ldr r2, [%[a]]\n\t"
  11482. "ldr r3, [%[a], #4]\n\t"
  11483. #ifdef WOLFSSL_KEIL
  11484. "sbcs r2, r2, r4\n\t"
  11485. #elif defined(__clang__)
  11486. "sbcs r2, r4\n\t"
  11487. #else
  11488. "sbc r2, r4\n\t"
  11489. #endif
  11490. #ifdef WOLFSSL_KEIL
  11491. "sbcs r3, r3, r5\n\t"
  11492. #elif defined(__clang__)
  11493. "sbcs r3, r5\n\t"
  11494. #else
  11495. "sbc r3, r5\n\t"
  11496. #endif
  11497. "stm %[a]!, {r2, r3}\n\t"
  11498. "ldm %[b]!, {r4, r5}\n\t"
  11499. "ldr r2, [%[a]]\n\t"
  11500. "ldr r3, [%[a], #4]\n\t"
  11501. #ifdef WOLFSSL_KEIL
  11502. "sbcs r2, r2, r4\n\t"
  11503. #elif defined(__clang__)
  11504. "sbcs r2, r4\n\t"
  11505. #else
  11506. "sbc r2, r4\n\t"
  11507. #endif
  11508. #ifdef WOLFSSL_KEIL
  11509. "sbcs r3, r3, r5\n\t"
  11510. #elif defined(__clang__)
  11511. "sbcs r3, r5\n\t"
  11512. #else
  11513. "sbc r3, r5\n\t"
  11514. #endif
  11515. "stm %[a]!, {r2, r3}\n\t"
  11516. "ldm %[b]!, {r4, r5}\n\t"
  11517. "ldr r2, [%[a]]\n\t"
  11518. "ldr r3, [%[a], #4]\n\t"
  11519. #ifdef WOLFSSL_KEIL
  11520. "sbcs r2, r2, r4\n\t"
  11521. #elif defined(__clang__)
  11522. "sbcs r2, r4\n\t"
  11523. #else
  11524. "sbc r2, r4\n\t"
  11525. #endif
  11526. #ifdef WOLFSSL_KEIL
  11527. "sbcs r3, r3, r5\n\t"
  11528. #elif defined(__clang__)
  11529. "sbcs r3, r5\n\t"
  11530. #else
  11531. "sbc r3, r5\n\t"
  11532. #endif
  11533. "stm %[a]!, {r2, r3}\n\t"
  11534. "ldm %[b]!, {r4, r5}\n\t"
  11535. "ldr r2, [%[a]]\n\t"
  11536. "ldr r3, [%[a], #4]\n\t"
  11537. #ifdef WOLFSSL_KEIL
  11538. "sbcs r2, r2, r4\n\t"
  11539. #elif defined(__clang__)
  11540. "sbcs r2, r4\n\t"
  11541. #else
  11542. "sbc r2, r4\n\t"
  11543. #endif
  11544. #ifdef WOLFSSL_KEIL
  11545. "sbcs r3, r3, r5\n\t"
  11546. #elif defined(__clang__)
  11547. "sbcs r3, r5\n\t"
  11548. #else
  11549. "sbc r3, r5\n\t"
  11550. #endif
  11551. "stm %[a]!, {r2, r3}\n\t"
  11552. "ldm %[b]!, {r4, r5}\n\t"
  11553. "ldr r2, [%[a]]\n\t"
  11554. "ldr r3, [%[a], #4]\n\t"
  11555. #ifdef WOLFSSL_KEIL
  11556. "sbcs r2, r2, r4\n\t"
  11557. #elif defined(__clang__)
  11558. "sbcs r2, r4\n\t"
  11559. #else
  11560. "sbc r2, r4\n\t"
  11561. #endif
  11562. #ifdef WOLFSSL_KEIL
  11563. "sbcs r3, r3, r5\n\t"
  11564. #elif defined(__clang__)
  11565. "sbcs r3, r5\n\t"
  11566. #else
  11567. "sbc r3, r5\n\t"
  11568. #endif
  11569. "stm %[a]!, {r2, r3}\n\t"
  11570. "ldm %[b]!, {r4, r5}\n\t"
  11571. "ldr r2, [%[a]]\n\t"
  11572. "ldr r3, [%[a], #4]\n\t"
  11573. #ifdef WOLFSSL_KEIL
  11574. "sbcs r2, r2, r4\n\t"
  11575. #elif defined(__clang__)
  11576. "sbcs r2, r4\n\t"
  11577. #else
  11578. "sbc r2, r4\n\t"
  11579. #endif
  11580. #ifdef WOLFSSL_KEIL
  11581. "sbcs r3, r3, r5\n\t"
  11582. #elif defined(__clang__)
  11583. "sbcs r3, r5\n\t"
  11584. #else
  11585. "sbc r3, r5\n\t"
  11586. #endif
  11587. "stm %[a]!, {r2, r3}\n\t"
  11588. "ldm %[b]!, {r4, r5}\n\t"
  11589. "ldr r2, [%[a]]\n\t"
  11590. "ldr r3, [%[a], #4]\n\t"
  11591. #ifdef WOLFSSL_KEIL
  11592. "sbcs r2, r2, r4\n\t"
  11593. #elif defined(__clang__)
  11594. "sbcs r2, r4\n\t"
  11595. #else
  11596. "sbc r2, r4\n\t"
  11597. #endif
  11598. #ifdef WOLFSSL_KEIL
  11599. "sbcs r3, r3, r5\n\t"
  11600. #elif defined(__clang__)
  11601. "sbcs r3, r5\n\t"
  11602. #else
  11603. "sbc r3, r5\n\t"
  11604. #endif
  11605. "stm %[a]!, {r2, r3}\n\t"
  11606. "ldm %[b]!, {r4, r5}\n\t"
  11607. "ldr r2, [%[a]]\n\t"
  11608. "ldr r3, [%[a], #4]\n\t"
  11609. #ifdef WOLFSSL_KEIL
  11610. "sbcs r2, r2, r4\n\t"
  11611. #elif defined(__clang__)
  11612. "sbcs r2, r4\n\t"
  11613. #else
  11614. "sbc r2, r4\n\t"
  11615. #endif
  11616. #ifdef WOLFSSL_KEIL
  11617. "sbcs r3, r3, r5\n\t"
  11618. #elif defined(__clang__)
  11619. "sbcs r3, r5\n\t"
  11620. #else
  11621. "sbc r3, r5\n\t"
  11622. #endif
  11623. "stm %[a]!, {r2, r3}\n\t"
  11624. #ifdef WOLFSSL_KEIL
  11625. "sbcs %[a], %[a], %[a]\n\t"
  11626. #elif defined(__clang__)
  11627. "sbcs %[a], %[a]\n\t"
  11628. #else
  11629. "sbc %[a], %[a]\n\t"
  11630. #endif
  11631. : [a] "+l" (a), [b] "+l" (b)
  11632. :
  11633. : "memory", "r2", "r3", "r4", "r5"
  11634. );
  11635. return (uint32_t)(size_t)a;
  11636. }
  11637. /* Add b to a into r. (r = a + b)
  11638. *
  11639. * r A single precision integer.
  11640. * a A single precision integer.
  11641. * b A single precision integer.
  11642. */
  11643. SP_NOINLINE static sp_digit sp_2048_add_64(sp_digit* r, const sp_digit* a,
  11644. const sp_digit* b)
  11645. {
  11646. __asm__ __volatile__ (
  11647. "ldm %[b]!, {r5, r6}\n\t"
  11648. "ldm %[a]!, {r3, r4}\n\t"
  11649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  11650. "adds r3, r3, r5\n\t"
  11651. #else
  11652. "add r3, r3, r5\n\t"
  11653. #endif
  11654. #ifdef WOLFSSL_KEIL
  11655. "adcs r4, r4, r6\n\t"
  11656. #elif defined(__clang__)
  11657. "adcs r4, r6\n\t"
  11658. #else
  11659. "adc r4, r6\n\t"
  11660. #endif
  11661. "stm %[r]!, {r3, r4}\n\t"
  11662. "ldm %[b]!, {r5, r6}\n\t"
  11663. "ldm %[a]!, {r3, r4}\n\t"
  11664. #ifdef WOLFSSL_KEIL
  11665. "adcs r3, r3, r5\n\t"
  11666. #elif defined(__clang__)
  11667. "adcs r3, r5\n\t"
  11668. #else
  11669. "adc r3, r5\n\t"
  11670. #endif
  11671. #ifdef WOLFSSL_KEIL
  11672. "adcs r4, r4, r6\n\t"
  11673. #elif defined(__clang__)
  11674. "adcs r4, r6\n\t"
  11675. #else
  11676. "adc r4, r6\n\t"
  11677. #endif
  11678. "stm %[r]!, {r3, r4}\n\t"
  11679. "ldm %[b]!, {r5, r6}\n\t"
  11680. "ldm %[a]!, {r3, r4}\n\t"
  11681. #ifdef WOLFSSL_KEIL
  11682. "adcs r3, r3, r5\n\t"
  11683. #elif defined(__clang__)
  11684. "adcs r3, r5\n\t"
  11685. #else
  11686. "adc r3, r5\n\t"
  11687. #endif
  11688. #ifdef WOLFSSL_KEIL
  11689. "adcs r4, r4, r6\n\t"
  11690. #elif defined(__clang__)
  11691. "adcs r4, r6\n\t"
  11692. #else
  11693. "adc r4, r6\n\t"
  11694. #endif
  11695. "stm %[r]!, {r3, r4}\n\t"
  11696. "ldm %[b]!, {r5, r6}\n\t"
  11697. "ldm %[a]!, {r3, r4}\n\t"
  11698. #ifdef WOLFSSL_KEIL
  11699. "adcs r3, r3, r5\n\t"
  11700. #elif defined(__clang__)
  11701. "adcs r3, r5\n\t"
  11702. #else
  11703. "adc r3, r5\n\t"
  11704. #endif
  11705. #ifdef WOLFSSL_KEIL
  11706. "adcs r4, r4, r6\n\t"
  11707. #elif defined(__clang__)
  11708. "adcs r4, r6\n\t"
  11709. #else
  11710. "adc r4, r6\n\t"
  11711. #endif
  11712. "stm %[r]!, {r3, r4}\n\t"
  11713. "ldm %[b]!, {r5, r6}\n\t"
  11714. "ldm %[a]!, {r3, r4}\n\t"
  11715. #ifdef WOLFSSL_KEIL
  11716. "adcs r3, r3, r5\n\t"
  11717. #elif defined(__clang__)
  11718. "adcs r3, r5\n\t"
  11719. #else
  11720. "adc r3, r5\n\t"
  11721. #endif
  11722. #ifdef WOLFSSL_KEIL
  11723. "adcs r4, r4, r6\n\t"
  11724. #elif defined(__clang__)
  11725. "adcs r4, r6\n\t"
  11726. #else
  11727. "adc r4, r6\n\t"
  11728. #endif
  11729. "stm %[r]!, {r3, r4}\n\t"
  11730. "ldm %[b]!, {r5, r6}\n\t"
  11731. "ldm %[a]!, {r3, r4}\n\t"
  11732. #ifdef WOLFSSL_KEIL
  11733. "adcs r3, r3, r5\n\t"
  11734. #elif defined(__clang__)
  11735. "adcs r3, r5\n\t"
  11736. #else
  11737. "adc r3, r5\n\t"
  11738. #endif
  11739. #ifdef WOLFSSL_KEIL
  11740. "adcs r4, r4, r6\n\t"
  11741. #elif defined(__clang__)
  11742. "adcs r4, r6\n\t"
  11743. #else
  11744. "adc r4, r6\n\t"
  11745. #endif
  11746. "stm %[r]!, {r3, r4}\n\t"
  11747. "ldm %[b]!, {r5, r6}\n\t"
  11748. "ldm %[a]!, {r3, r4}\n\t"
  11749. #ifdef WOLFSSL_KEIL
  11750. "adcs r3, r3, r5\n\t"
  11751. #elif defined(__clang__)
  11752. "adcs r3, r5\n\t"
  11753. #else
  11754. "adc r3, r5\n\t"
  11755. #endif
  11756. #ifdef WOLFSSL_KEIL
  11757. "adcs r4, r4, r6\n\t"
  11758. #elif defined(__clang__)
  11759. "adcs r4, r6\n\t"
  11760. #else
  11761. "adc r4, r6\n\t"
  11762. #endif
  11763. "stm %[r]!, {r3, r4}\n\t"
  11764. "ldm %[b]!, {r5, r6}\n\t"
  11765. "ldm %[a]!, {r3, r4}\n\t"
  11766. #ifdef WOLFSSL_KEIL
  11767. "adcs r3, r3, r5\n\t"
  11768. #elif defined(__clang__)
  11769. "adcs r3, r5\n\t"
  11770. #else
  11771. "adc r3, r5\n\t"
  11772. #endif
  11773. #ifdef WOLFSSL_KEIL
  11774. "adcs r4, r4, r6\n\t"
  11775. #elif defined(__clang__)
  11776. "adcs r4, r6\n\t"
  11777. #else
  11778. "adc r4, r6\n\t"
  11779. #endif
  11780. "stm %[r]!, {r3, r4}\n\t"
  11781. "ldm %[b]!, {r5, r6}\n\t"
  11782. "ldm %[a]!, {r3, r4}\n\t"
  11783. #ifdef WOLFSSL_KEIL
  11784. "adcs r3, r3, r5\n\t"
  11785. #elif defined(__clang__)
  11786. "adcs r3, r5\n\t"
  11787. #else
  11788. "adc r3, r5\n\t"
  11789. #endif
  11790. #ifdef WOLFSSL_KEIL
  11791. "adcs r4, r4, r6\n\t"
  11792. #elif defined(__clang__)
  11793. "adcs r4, r6\n\t"
  11794. #else
  11795. "adc r4, r6\n\t"
  11796. #endif
  11797. "stm %[r]!, {r3, r4}\n\t"
  11798. "ldm %[b]!, {r5, r6}\n\t"
  11799. "ldm %[a]!, {r3, r4}\n\t"
  11800. #ifdef WOLFSSL_KEIL
  11801. "adcs r3, r3, r5\n\t"
  11802. #elif defined(__clang__)
  11803. "adcs r3, r5\n\t"
  11804. #else
  11805. "adc r3, r5\n\t"
  11806. #endif
  11807. #ifdef WOLFSSL_KEIL
  11808. "adcs r4, r4, r6\n\t"
  11809. #elif defined(__clang__)
  11810. "adcs r4, r6\n\t"
  11811. #else
  11812. "adc r4, r6\n\t"
  11813. #endif
  11814. "stm %[r]!, {r3, r4}\n\t"
  11815. "ldm %[b]!, {r5, r6}\n\t"
  11816. "ldm %[a]!, {r3, r4}\n\t"
  11817. #ifdef WOLFSSL_KEIL
  11818. "adcs r3, r3, r5\n\t"
  11819. #elif defined(__clang__)
  11820. "adcs r3, r5\n\t"
  11821. #else
  11822. "adc r3, r5\n\t"
  11823. #endif
  11824. #ifdef WOLFSSL_KEIL
  11825. "adcs r4, r4, r6\n\t"
  11826. #elif defined(__clang__)
  11827. "adcs r4, r6\n\t"
  11828. #else
  11829. "adc r4, r6\n\t"
  11830. #endif
  11831. "stm %[r]!, {r3, r4}\n\t"
  11832. "ldm %[b]!, {r5, r6}\n\t"
  11833. "ldm %[a]!, {r3, r4}\n\t"
  11834. #ifdef WOLFSSL_KEIL
  11835. "adcs r3, r3, r5\n\t"
  11836. #elif defined(__clang__)
  11837. "adcs r3, r5\n\t"
  11838. #else
  11839. "adc r3, r5\n\t"
  11840. #endif
  11841. #ifdef WOLFSSL_KEIL
  11842. "adcs r4, r4, r6\n\t"
  11843. #elif defined(__clang__)
  11844. "adcs r4, r6\n\t"
  11845. #else
  11846. "adc r4, r6\n\t"
  11847. #endif
  11848. "stm %[r]!, {r3, r4}\n\t"
  11849. "ldm %[b]!, {r5, r6}\n\t"
  11850. "ldm %[a]!, {r3, r4}\n\t"
  11851. #ifdef WOLFSSL_KEIL
  11852. "adcs r3, r3, r5\n\t"
  11853. #elif defined(__clang__)
  11854. "adcs r3, r5\n\t"
  11855. #else
  11856. "adc r3, r5\n\t"
  11857. #endif
  11858. #ifdef WOLFSSL_KEIL
  11859. "adcs r4, r4, r6\n\t"
  11860. #elif defined(__clang__)
  11861. "adcs r4, r6\n\t"
  11862. #else
  11863. "adc r4, r6\n\t"
  11864. #endif
  11865. "stm %[r]!, {r3, r4}\n\t"
  11866. "ldm %[b]!, {r5, r6}\n\t"
  11867. "ldm %[a]!, {r3, r4}\n\t"
  11868. #ifdef WOLFSSL_KEIL
  11869. "adcs r3, r3, r5\n\t"
  11870. #elif defined(__clang__)
  11871. "adcs r3, r5\n\t"
  11872. #else
  11873. "adc r3, r5\n\t"
  11874. #endif
  11875. #ifdef WOLFSSL_KEIL
  11876. "adcs r4, r4, r6\n\t"
  11877. #elif defined(__clang__)
  11878. "adcs r4, r6\n\t"
  11879. #else
  11880. "adc r4, r6\n\t"
  11881. #endif
  11882. "stm %[r]!, {r3, r4}\n\t"
  11883. "ldm %[b]!, {r5, r6}\n\t"
  11884. "ldm %[a]!, {r3, r4}\n\t"
  11885. #ifdef WOLFSSL_KEIL
  11886. "adcs r3, r3, r5\n\t"
  11887. #elif defined(__clang__)
  11888. "adcs r3, r5\n\t"
  11889. #else
  11890. "adc r3, r5\n\t"
  11891. #endif
  11892. #ifdef WOLFSSL_KEIL
  11893. "adcs r4, r4, r6\n\t"
  11894. #elif defined(__clang__)
  11895. "adcs r4, r6\n\t"
  11896. #else
  11897. "adc r4, r6\n\t"
  11898. #endif
  11899. "stm %[r]!, {r3, r4}\n\t"
  11900. "ldm %[b]!, {r5, r6}\n\t"
  11901. "ldm %[a]!, {r3, r4}\n\t"
  11902. #ifdef WOLFSSL_KEIL
  11903. "adcs r3, r3, r5\n\t"
  11904. #elif defined(__clang__)
  11905. "adcs r3, r5\n\t"
  11906. #else
  11907. "adc r3, r5\n\t"
  11908. #endif
  11909. #ifdef WOLFSSL_KEIL
  11910. "adcs r4, r4, r6\n\t"
  11911. #elif defined(__clang__)
  11912. "adcs r4, r6\n\t"
  11913. #else
  11914. "adc r4, r6\n\t"
  11915. #endif
  11916. "stm %[r]!, {r3, r4}\n\t"
  11917. "ldm %[b]!, {r5, r6}\n\t"
  11918. "ldm %[a]!, {r3, r4}\n\t"
  11919. #ifdef WOLFSSL_KEIL
  11920. "adcs r3, r3, r5\n\t"
  11921. #elif defined(__clang__)
  11922. "adcs r3, r5\n\t"
  11923. #else
  11924. "adc r3, r5\n\t"
  11925. #endif
  11926. #ifdef WOLFSSL_KEIL
  11927. "adcs r4, r4, r6\n\t"
  11928. #elif defined(__clang__)
  11929. "adcs r4, r6\n\t"
  11930. #else
  11931. "adc r4, r6\n\t"
  11932. #endif
  11933. "stm %[r]!, {r3, r4}\n\t"
  11934. "ldm %[b]!, {r5, r6}\n\t"
  11935. "ldm %[a]!, {r3, r4}\n\t"
  11936. #ifdef WOLFSSL_KEIL
  11937. "adcs r3, r3, r5\n\t"
  11938. #elif defined(__clang__)
  11939. "adcs r3, r5\n\t"
  11940. #else
  11941. "adc r3, r5\n\t"
  11942. #endif
  11943. #ifdef WOLFSSL_KEIL
  11944. "adcs r4, r4, r6\n\t"
  11945. #elif defined(__clang__)
  11946. "adcs r4, r6\n\t"
  11947. #else
  11948. "adc r4, r6\n\t"
  11949. #endif
  11950. "stm %[r]!, {r3, r4}\n\t"
  11951. "ldm %[b]!, {r5, r6}\n\t"
  11952. "ldm %[a]!, {r3, r4}\n\t"
  11953. #ifdef WOLFSSL_KEIL
  11954. "adcs r3, r3, r5\n\t"
  11955. #elif defined(__clang__)
  11956. "adcs r3, r5\n\t"
  11957. #else
  11958. "adc r3, r5\n\t"
  11959. #endif
  11960. #ifdef WOLFSSL_KEIL
  11961. "adcs r4, r4, r6\n\t"
  11962. #elif defined(__clang__)
  11963. "adcs r4, r6\n\t"
  11964. #else
  11965. "adc r4, r6\n\t"
  11966. #endif
  11967. "stm %[r]!, {r3, r4}\n\t"
  11968. "ldm %[b]!, {r5, r6}\n\t"
  11969. "ldm %[a]!, {r3, r4}\n\t"
  11970. #ifdef WOLFSSL_KEIL
  11971. "adcs r3, r3, r5\n\t"
  11972. #elif defined(__clang__)
  11973. "adcs r3, r5\n\t"
  11974. #else
  11975. "adc r3, r5\n\t"
  11976. #endif
  11977. #ifdef WOLFSSL_KEIL
  11978. "adcs r4, r4, r6\n\t"
  11979. #elif defined(__clang__)
  11980. "adcs r4, r6\n\t"
  11981. #else
  11982. "adc r4, r6\n\t"
  11983. #endif
  11984. "stm %[r]!, {r3, r4}\n\t"
  11985. "ldm %[b]!, {r5, r6}\n\t"
  11986. "ldm %[a]!, {r3, r4}\n\t"
  11987. #ifdef WOLFSSL_KEIL
  11988. "adcs r3, r3, r5\n\t"
  11989. #elif defined(__clang__)
  11990. "adcs r3, r5\n\t"
  11991. #else
  11992. "adc r3, r5\n\t"
  11993. #endif
  11994. #ifdef WOLFSSL_KEIL
  11995. "adcs r4, r4, r6\n\t"
  11996. #elif defined(__clang__)
  11997. "adcs r4, r6\n\t"
  11998. #else
  11999. "adc r4, r6\n\t"
  12000. #endif
  12001. "stm %[r]!, {r3, r4}\n\t"
  12002. "ldm %[b]!, {r5, r6}\n\t"
  12003. "ldm %[a]!, {r3, r4}\n\t"
  12004. #ifdef WOLFSSL_KEIL
  12005. "adcs r3, r3, r5\n\t"
  12006. #elif defined(__clang__)
  12007. "adcs r3, r5\n\t"
  12008. #else
  12009. "adc r3, r5\n\t"
  12010. #endif
  12011. #ifdef WOLFSSL_KEIL
  12012. "adcs r4, r4, r6\n\t"
  12013. #elif defined(__clang__)
  12014. "adcs r4, r6\n\t"
  12015. #else
  12016. "adc r4, r6\n\t"
  12017. #endif
  12018. "stm %[r]!, {r3, r4}\n\t"
  12019. "ldm %[b]!, {r5, r6}\n\t"
  12020. "ldm %[a]!, {r3, r4}\n\t"
  12021. #ifdef WOLFSSL_KEIL
  12022. "adcs r3, r3, r5\n\t"
  12023. #elif defined(__clang__)
  12024. "adcs r3, r5\n\t"
  12025. #else
  12026. "adc r3, r5\n\t"
  12027. #endif
  12028. #ifdef WOLFSSL_KEIL
  12029. "adcs r4, r4, r6\n\t"
  12030. #elif defined(__clang__)
  12031. "adcs r4, r6\n\t"
  12032. #else
  12033. "adc r4, r6\n\t"
  12034. #endif
  12035. "stm %[r]!, {r3, r4}\n\t"
  12036. "ldm %[b]!, {r5, r6}\n\t"
  12037. "ldm %[a]!, {r3, r4}\n\t"
  12038. #ifdef WOLFSSL_KEIL
  12039. "adcs r3, r3, r5\n\t"
  12040. #elif defined(__clang__)
  12041. "adcs r3, r5\n\t"
  12042. #else
  12043. "adc r3, r5\n\t"
  12044. #endif
  12045. #ifdef WOLFSSL_KEIL
  12046. "adcs r4, r4, r6\n\t"
  12047. #elif defined(__clang__)
  12048. "adcs r4, r6\n\t"
  12049. #else
  12050. "adc r4, r6\n\t"
  12051. #endif
  12052. "stm %[r]!, {r3, r4}\n\t"
  12053. "ldm %[b]!, {r5, r6}\n\t"
  12054. "ldm %[a]!, {r3, r4}\n\t"
  12055. #ifdef WOLFSSL_KEIL
  12056. "adcs r3, r3, r5\n\t"
  12057. #elif defined(__clang__)
  12058. "adcs r3, r5\n\t"
  12059. #else
  12060. "adc r3, r5\n\t"
  12061. #endif
  12062. #ifdef WOLFSSL_KEIL
  12063. "adcs r4, r4, r6\n\t"
  12064. #elif defined(__clang__)
  12065. "adcs r4, r6\n\t"
  12066. #else
  12067. "adc r4, r6\n\t"
  12068. #endif
  12069. "stm %[r]!, {r3, r4}\n\t"
  12070. "ldm %[b]!, {r5, r6}\n\t"
  12071. "ldm %[a]!, {r3, r4}\n\t"
  12072. #ifdef WOLFSSL_KEIL
  12073. "adcs r3, r3, r5\n\t"
  12074. #elif defined(__clang__)
  12075. "adcs r3, r5\n\t"
  12076. #else
  12077. "adc r3, r5\n\t"
  12078. #endif
  12079. #ifdef WOLFSSL_KEIL
  12080. "adcs r4, r4, r6\n\t"
  12081. #elif defined(__clang__)
  12082. "adcs r4, r6\n\t"
  12083. #else
  12084. "adc r4, r6\n\t"
  12085. #endif
  12086. "stm %[r]!, {r3, r4}\n\t"
  12087. "ldm %[b]!, {r5, r6}\n\t"
  12088. "ldm %[a]!, {r3, r4}\n\t"
  12089. #ifdef WOLFSSL_KEIL
  12090. "adcs r3, r3, r5\n\t"
  12091. #elif defined(__clang__)
  12092. "adcs r3, r5\n\t"
  12093. #else
  12094. "adc r3, r5\n\t"
  12095. #endif
  12096. #ifdef WOLFSSL_KEIL
  12097. "adcs r4, r4, r6\n\t"
  12098. #elif defined(__clang__)
  12099. "adcs r4, r6\n\t"
  12100. #else
  12101. "adc r4, r6\n\t"
  12102. #endif
  12103. "stm %[r]!, {r3, r4}\n\t"
  12104. "ldm %[b]!, {r5, r6}\n\t"
  12105. "ldm %[a]!, {r3, r4}\n\t"
  12106. #ifdef WOLFSSL_KEIL
  12107. "adcs r3, r3, r5\n\t"
  12108. #elif defined(__clang__)
  12109. "adcs r3, r5\n\t"
  12110. #else
  12111. "adc r3, r5\n\t"
  12112. #endif
  12113. #ifdef WOLFSSL_KEIL
  12114. "adcs r4, r4, r6\n\t"
  12115. #elif defined(__clang__)
  12116. "adcs r4, r6\n\t"
  12117. #else
  12118. "adc r4, r6\n\t"
  12119. #endif
  12120. "stm %[r]!, {r3, r4}\n\t"
  12121. "ldm %[b]!, {r5, r6}\n\t"
  12122. "ldm %[a]!, {r3, r4}\n\t"
  12123. #ifdef WOLFSSL_KEIL
  12124. "adcs r3, r3, r5\n\t"
  12125. #elif defined(__clang__)
  12126. "adcs r3, r5\n\t"
  12127. #else
  12128. "adc r3, r5\n\t"
  12129. #endif
  12130. #ifdef WOLFSSL_KEIL
  12131. "adcs r4, r4, r6\n\t"
  12132. #elif defined(__clang__)
  12133. "adcs r4, r6\n\t"
  12134. #else
  12135. "adc r4, r6\n\t"
  12136. #endif
  12137. "stm %[r]!, {r3, r4}\n\t"
  12138. "ldm %[b]!, {r5, r6}\n\t"
  12139. "ldm %[a]!, {r3, r4}\n\t"
  12140. #ifdef WOLFSSL_KEIL
  12141. "adcs r3, r3, r5\n\t"
  12142. #elif defined(__clang__)
  12143. "adcs r3, r5\n\t"
  12144. #else
  12145. "adc r3, r5\n\t"
  12146. #endif
  12147. #ifdef WOLFSSL_KEIL
  12148. "adcs r4, r4, r6\n\t"
  12149. #elif defined(__clang__)
  12150. "adcs r4, r6\n\t"
  12151. #else
  12152. "adc r4, r6\n\t"
  12153. #endif
  12154. "stm %[r]!, {r3, r4}\n\t"
  12155. "ldm %[b]!, {r5, r6}\n\t"
  12156. "ldm %[a]!, {r3, r4}\n\t"
  12157. #ifdef WOLFSSL_KEIL
  12158. "adcs r3, r3, r5\n\t"
  12159. #elif defined(__clang__)
  12160. "adcs r3, r5\n\t"
  12161. #else
  12162. "adc r3, r5\n\t"
  12163. #endif
  12164. #ifdef WOLFSSL_KEIL
  12165. "adcs r4, r4, r6\n\t"
  12166. #elif defined(__clang__)
  12167. "adcs r4, r6\n\t"
  12168. #else
  12169. "adc r4, r6\n\t"
  12170. #endif
  12171. "stm %[r]!, {r3, r4}\n\t"
  12172. "ldm %[b]!, {r5, r6}\n\t"
  12173. "ldm %[a]!, {r3, r4}\n\t"
  12174. #ifdef WOLFSSL_KEIL
  12175. "adcs r3, r3, r5\n\t"
  12176. #elif defined(__clang__)
  12177. "adcs r3, r5\n\t"
  12178. #else
  12179. "adc r3, r5\n\t"
  12180. #endif
  12181. #ifdef WOLFSSL_KEIL
  12182. "adcs r4, r4, r6\n\t"
  12183. #elif defined(__clang__)
  12184. "adcs r4, r6\n\t"
  12185. #else
  12186. "adc r4, r6\n\t"
  12187. #endif
  12188. "stm %[r]!, {r3, r4}\n\t"
  12189. "movs %[r], #0\n\t"
  12190. #ifdef WOLFSSL_KEIL
  12191. "adcs %[r], %[r], %[r]\n\t"
  12192. #elif defined(__clang__)
  12193. "adcs %[r], %[r]\n\t"
  12194. #else
  12195. "adc %[r], %[r]\n\t"
  12196. #endif
  12197. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  12198. :
  12199. : "memory", "r3", "r4", "r5", "r6"
  12200. );
  12201. return (uint32_t)(size_t)r;
  12202. }
  12203. /* AND m into each word of a and store in r.
  12204. *
  12205. * r A single precision integer.
  12206. * a A single precision integer.
  12207. * m Mask to AND against each digit.
  12208. */
  12209. static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  12210. {
  12211. #ifdef WOLFSSL_SP_SMALL
  12212. int i;
  12213. for (i=0; i<32; i++) {
  12214. r[i] = a[i] & m;
  12215. }
  12216. #else
  12217. int i;
  12218. for (i = 0; i < 32; i += 8) {
  12219. r[i+0] = a[i+0] & m;
  12220. r[i+1] = a[i+1] & m;
  12221. r[i+2] = a[i+2] & m;
  12222. r[i+3] = a[i+3] & m;
  12223. r[i+4] = a[i+4] & m;
  12224. r[i+5] = a[i+5] & m;
  12225. r[i+6] = a[i+6] & m;
  12226. r[i+7] = a[i+7] & m;
  12227. }
  12228. #endif
  12229. }
  12230. /* Multiply a and b into r. (r = a * b)
  12231. *
  12232. * r A single precision integer.
  12233. * a A single precision integer.
  12234. * b A single precision integer.
  12235. */
  12236. SP_NOINLINE static void sp_2048_mul_64(sp_digit* r, const sp_digit* a,
  12237. const sp_digit* b)
  12238. {
  12239. sp_digit* z0 = r;
  12240. sp_digit z1[64];
  12241. sp_digit a1[32];
  12242. sp_digit b1[32];
  12243. sp_digit* z2 = r + 64;
  12244. sp_digit u;
  12245. sp_digit ca;
  12246. sp_digit cb;
  12247. ca = sp_2048_add_32(a1, a, &a[32]);
  12248. cb = sp_2048_add_32(b1, b, &b[32]);
  12249. u = ca & cb;
  12250. sp_2048_mul_32(z2, &a[32], &b[32]);
  12251. sp_2048_mul_32(z0, a, b);
  12252. sp_2048_mul_32(z1, a1, b1);
  12253. u += sp_2048_sub_in_place_64(z1, z0);
  12254. u += sp_2048_sub_in_place_64(z1, z2);
  12255. sp_2048_mask_32(a1, a1, 0 - cb);
  12256. u += sp_2048_add_32(z1 + 32, z1 + 32, a1);
  12257. sp_2048_mask_32(b1, b1, 0 - ca);
  12258. u += sp_2048_add_32(z1 + 32, z1 + 32, b1);
  12259. u += sp_2048_add_64(r + 32, r + 32, z1);
  12260. (void)sp_2048_add_word_32(r + 96, r + 96, u);
  12261. }
  12262. #ifndef WOLFSSL_SP_LARGE_CODE
  12263. /* Square a and put result in r. (r = a * a)
  12264. *
  12265. * r A single precision integer.
  12266. * a A single precision integer.
  12267. */
  12268. SP_NOINLINE static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a)
  12269. {
  12270. __asm__ __volatile__ (
  12271. "movs r3, #0\n\t"
  12272. "movs r4, #0\n\t"
  12273. "movs r5, #0\n\t"
  12274. "mov r8, r3\n\t"
  12275. "mov r11, %[r]\n\t"
  12276. "movs r6, #0x40\n\t"
  12277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12278. "negs r6, r6\n\t"
  12279. #else
  12280. "neg r6, r6\n\t"
  12281. #endif
  12282. "add sp, sp, r6\n\t"
  12283. "mov r10, sp\n\t"
  12284. "mov r9, %[a]\n\t"
  12285. "\n"
  12286. "L_sp_2048_sqr_8_words_%=:\n\t"
  12287. "movs %[r], #0\n\t"
  12288. "movs r6, #28\n\t"
  12289. "mov %[a], r8\n\t"
  12290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12291. "subs %[a], %[a], r6\n\t"
  12292. #else
  12293. "sub %[a], %[a], r6\n\t"
  12294. #endif
  12295. #ifdef WOLFSSL_KEIL
  12296. "sbcs r6, r6, r6\n\t"
  12297. #elif defined(__clang__)
  12298. "sbcs r6, r6\n\t"
  12299. #else
  12300. "sbc r6, r6\n\t"
  12301. #endif
  12302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12303. "mvns r6, r6\n\t"
  12304. #else
  12305. "mvn r6, r6\n\t"
  12306. #endif
  12307. #ifdef WOLFSSL_KEIL
  12308. "ands %[a], %[a], r6\n\t"
  12309. #elif defined(__clang__)
  12310. "ands %[a], r6\n\t"
  12311. #else
  12312. "and %[a], r6\n\t"
  12313. #endif
  12314. "mov r2, r8\n\t"
  12315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12316. "subs r2, r2, %[a]\n\t"
  12317. #else
  12318. "sub r2, r2, %[a]\n\t"
  12319. #endif
  12320. "add %[a], %[a], r9\n\t"
  12321. "add r2, r2, r9\n\t"
  12322. "\n"
  12323. "L_sp_2048_sqr_8_mul_%=:\n\t"
  12324. "cmp r2, %[a]\n\t"
  12325. "beq L_sp_2048_sqr_8_sqr_%=\n\t"
  12326. "# Multiply * 2: Start\n\t"
  12327. "ldrh r6, [%[a]]\n\t"
  12328. "ldrh r7, [r2]\n\t"
  12329. #ifdef WOLFSSL_KEIL
  12330. "muls r7, r6, r7\n\t"
  12331. #elif defined(__clang__)
  12332. "muls r7, r6\n\t"
  12333. #else
  12334. "mul r7, r6\n\t"
  12335. #endif
  12336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12337. "adds r3, r3, r7\n\t"
  12338. #else
  12339. "add r3, r3, r7\n\t"
  12340. #endif
  12341. #ifdef WOLFSSL_KEIL
  12342. "adcs r4, r4, %[r]\n\t"
  12343. #elif defined(__clang__)
  12344. "adcs r4, %[r]\n\t"
  12345. #else
  12346. "adc r4, %[r]\n\t"
  12347. #endif
  12348. #ifdef WOLFSSL_KEIL
  12349. "adcs r5, r5, %[r]\n\t"
  12350. #elif defined(__clang__)
  12351. "adcs r5, %[r]\n\t"
  12352. #else
  12353. "adc r5, %[r]\n\t"
  12354. #endif
  12355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12356. "adds r3, r3, r7\n\t"
  12357. #else
  12358. "add r3, r3, r7\n\t"
  12359. #endif
  12360. #ifdef WOLFSSL_KEIL
  12361. "adcs r4, r4, %[r]\n\t"
  12362. #elif defined(__clang__)
  12363. "adcs r4, %[r]\n\t"
  12364. #else
  12365. "adc r4, %[r]\n\t"
  12366. #endif
  12367. #ifdef WOLFSSL_KEIL
  12368. "adcs r5, r5, %[r]\n\t"
  12369. #elif defined(__clang__)
  12370. "adcs r5, %[r]\n\t"
  12371. #else
  12372. "adc r5, %[r]\n\t"
  12373. #endif
  12374. "ldr r7, [r2]\n\t"
  12375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12376. "lsrs r7, r7, #16\n\t"
  12377. #else
  12378. "lsr r7, r7, #16\n\t"
  12379. #endif
  12380. #ifdef WOLFSSL_KEIL
  12381. "muls r6, r7, r6\n\t"
  12382. #elif defined(__clang__)
  12383. "muls r6, r7\n\t"
  12384. #else
  12385. "mul r6, r7\n\t"
  12386. #endif
  12387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12388. "lsrs r7, r6, #16\n\t"
  12389. #else
  12390. "lsr r7, r6, #16\n\t"
  12391. #endif
  12392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12393. "lsls r6, r6, #16\n\t"
  12394. #else
  12395. "lsl r6, r6, #16\n\t"
  12396. #endif
  12397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12398. "adds r3, r3, r6\n\t"
  12399. #else
  12400. "add r3, r3, r6\n\t"
  12401. #endif
  12402. #ifdef WOLFSSL_KEIL
  12403. "adcs r4, r4, r7\n\t"
  12404. #elif defined(__clang__)
  12405. "adcs r4, r7\n\t"
  12406. #else
  12407. "adc r4, r7\n\t"
  12408. #endif
  12409. #ifdef WOLFSSL_KEIL
  12410. "adcs r5, r5, %[r]\n\t"
  12411. #elif defined(__clang__)
  12412. "adcs r5, %[r]\n\t"
  12413. #else
  12414. "adc r5, %[r]\n\t"
  12415. #endif
  12416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12417. "adds r3, r3, r6\n\t"
  12418. #else
  12419. "add r3, r3, r6\n\t"
  12420. #endif
  12421. #ifdef WOLFSSL_KEIL
  12422. "adcs r4, r4, r7\n\t"
  12423. #elif defined(__clang__)
  12424. "adcs r4, r7\n\t"
  12425. #else
  12426. "adc r4, r7\n\t"
  12427. #endif
  12428. #ifdef WOLFSSL_KEIL
  12429. "adcs r5, r5, %[r]\n\t"
  12430. #elif defined(__clang__)
  12431. "adcs r5, %[r]\n\t"
  12432. #else
  12433. "adc r5, %[r]\n\t"
  12434. #endif
  12435. "ldr r6, [%[a]]\n\t"
  12436. "ldr r7, [r2]\n\t"
  12437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12438. "lsrs r6, r6, #16\n\t"
  12439. #else
  12440. "lsr r6, r6, #16\n\t"
  12441. #endif
  12442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12443. "lsrs r7, r7, #16\n\t"
  12444. #else
  12445. "lsr r7, r7, #16\n\t"
  12446. #endif
  12447. #ifdef WOLFSSL_KEIL
  12448. "muls r7, r6, r7\n\t"
  12449. #elif defined(__clang__)
  12450. "muls r7, r6\n\t"
  12451. #else
  12452. "mul r7, r6\n\t"
  12453. #endif
  12454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12455. "adds r4, r4, r7\n\t"
  12456. #else
  12457. "add r4, r4, r7\n\t"
  12458. #endif
  12459. #ifdef WOLFSSL_KEIL
  12460. "adcs r5, r5, %[r]\n\t"
  12461. #elif defined(__clang__)
  12462. "adcs r5, %[r]\n\t"
  12463. #else
  12464. "adc r5, %[r]\n\t"
  12465. #endif
  12466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12467. "adds r4, r4, r7\n\t"
  12468. #else
  12469. "add r4, r4, r7\n\t"
  12470. #endif
  12471. #ifdef WOLFSSL_KEIL
  12472. "adcs r5, r5, %[r]\n\t"
  12473. #elif defined(__clang__)
  12474. "adcs r5, %[r]\n\t"
  12475. #else
  12476. "adc r5, %[r]\n\t"
  12477. #endif
  12478. "ldrh r7, [r2]\n\t"
  12479. #ifdef WOLFSSL_KEIL
  12480. "muls r6, r7, r6\n\t"
  12481. #elif defined(__clang__)
  12482. "muls r6, r7\n\t"
  12483. #else
  12484. "mul r6, r7\n\t"
  12485. #endif
  12486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12487. "lsrs r7, r6, #16\n\t"
  12488. #else
  12489. "lsr r7, r6, #16\n\t"
  12490. #endif
  12491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12492. "lsls r6, r6, #16\n\t"
  12493. #else
  12494. "lsl r6, r6, #16\n\t"
  12495. #endif
  12496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12497. "adds r3, r3, r6\n\t"
  12498. #else
  12499. "add r3, r3, r6\n\t"
  12500. #endif
  12501. #ifdef WOLFSSL_KEIL
  12502. "adcs r4, r4, r7\n\t"
  12503. #elif defined(__clang__)
  12504. "adcs r4, r7\n\t"
  12505. #else
  12506. "adc r4, r7\n\t"
  12507. #endif
  12508. #ifdef WOLFSSL_KEIL
  12509. "adcs r5, r5, %[r]\n\t"
  12510. #elif defined(__clang__)
  12511. "adcs r5, %[r]\n\t"
  12512. #else
  12513. "adc r5, %[r]\n\t"
  12514. #endif
  12515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12516. "adds r3, r3, r6\n\t"
  12517. #else
  12518. "add r3, r3, r6\n\t"
  12519. #endif
  12520. #ifdef WOLFSSL_KEIL
  12521. "adcs r4, r4, r7\n\t"
  12522. #elif defined(__clang__)
  12523. "adcs r4, r7\n\t"
  12524. #else
  12525. "adc r4, r7\n\t"
  12526. #endif
  12527. #ifdef WOLFSSL_KEIL
  12528. "adcs r5, r5, %[r]\n\t"
  12529. #elif defined(__clang__)
  12530. "adcs r5, %[r]\n\t"
  12531. #else
  12532. "adc r5, %[r]\n\t"
  12533. #endif
  12534. "# Multiply * 2: Done\n\t"
  12535. "bal L_sp_2048_sqr_8_done_sqr_%=\n\t"
  12536. "\n"
  12537. "L_sp_2048_sqr_8_sqr_%=:\n\t"
  12538. "mov r12, r2\n\t"
  12539. "ldr r2, [%[a]]\n\t"
  12540. "# Square: Start\n\t"
  12541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12542. "lsrs r7, r2, #16\n\t"
  12543. #else
  12544. "lsr r7, r2, #16\n\t"
  12545. #endif
  12546. "uxth r6, r2\n\t"
  12547. #ifdef WOLFSSL_KEIL
  12548. "muls r6, r6, r6\n\t"
  12549. #elif defined(__clang__)
  12550. "muls r6, r6\n\t"
  12551. #else
  12552. "mul r6, r6\n\t"
  12553. #endif
  12554. #ifdef WOLFSSL_KEIL
  12555. "muls r7, r7, r7\n\t"
  12556. #elif defined(__clang__)
  12557. "muls r7, r7\n\t"
  12558. #else
  12559. "mul r7, r7\n\t"
  12560. #endif
  12561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12562. "adds r3, r3, r6\n\t"
  12563. #else
  12564. "add r3, r3, r6\n\t"
  12565. #endif
  12566. #ifdef WOLFSSL_KEIL
  12567. "adcs r4, r4, r7\n\t"
  12568. #elif defined(__clang__)
  12569. "adcs r4, r7\n\t"
  12570. #else
  12571. "adc r4, r7\n\t"
  12572. #endif
  12573. #ifdef WOLFSSL_KEIL
  12574. "adcs r5, r5, %[r]\n\t"
  12575. #elif defined(__clang__)
  12576. "adcs r5, %[r]\n\t"
  12577. #else
  12578. "adc r5, %[r]\n\t"
  12579. #endif
  12580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12581. "lsrs r7, r2, #16\n\t"
  12582. #else
  12583. "lsr r7, r2, #16\n\t"
  12584. #endif
  12585. "uxth r6, r2\n\t"
  12586. #ifdef WOLFSSL_KEIL
  12587. "muls r6, r7, r6\n\t"
  12588. #elif defined(__clang__)
  12589. "muls r6, r7\n\t"
  12590. #else
  12591. "mul r6, r7\n\t"
  12592. #endif
  12593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12594. "lsrs r7, r6, #15\n\t"
  12595. #else
  12596. "lsr r7, r6, #15\n\t"
  12597. #endif
  12598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12599. "lsls r6, r6, #17\n\t"
  12600. #else
  12601. "lsl r6, r6, #17\n\t"
  12602. #endif
  12603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12604. "adds r3, r3, r6\n\t"
  12605. #else
  12606. "add r3, r3, r6\n\t"
  12607. #endif
  12608. #ifdef WOLFSSL_KEIL
  12609. "adcs r4, r4, r7\n\t"
  12610. #elif defined(__clang__)
  12611. "adcs r4, r7\n\t"
  12612. #else
  12613. "adc r4, r7\n\t"
  12614. #endif
  12615. #ifdef WOLFSSL_KEIL
  12616. "adcs r5, r5, %[r]\n\t"
  12617. #elif defined(__clang__)
  12618. "adcs r5, %[r]\n\t"
  12619. #else
  12620. "adc r5, %[r]\n\t"
  12621. #endif
  12622. "# Square: Done\n\t"
  12623. "mov r2, r12\n\t"
  12624. "\n"
  12625. "L_sp_2048_sqr_8_done_sqr_%=:\n\t"
  12626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12627. "adds %[a], %[a], #4\n\t"
  12628. #else
  12629. "add %[a], %[a], #4\n\t"
  12630. #endif
  12631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12632. "subs r2, r2, #4\n\t"
  12633. #else
  12634. "sub r2, r2, #4\n\t"
  12635. #endif
  12636. "movs r6, #32\n\t"
  12637. "add r6, r6, r9\n\t"
  12638. "cmp %[a], r6\n\t"
  12639. "beq L_sp_2048_sqr_8_done_mul_%=\n\t"
  12640. "cmp %[a], r2\n\t"
  12641. "bgt L_sp_2048_sqr_8_done_mul_%=\n\t"
  12642. "mov r7, r8\n\t"
  12643. "add r7, r7, r9\n\t"
  12644. "cmp %[a], r7\n\t"
  12645. "ble L_sp_2048_sqr_8_mul_%=\n\t"
  12646. "\n"
  12647. "L_sp_2048_sqr_8_done_mul_%=:\n\t"
  12648. "mov %[r], r10\n\t"
  12649. "mov r7, r8\n\t"
  12650. "str r3, [%[r], r7]\n\t"
  12651. "movs r3, r4\n\t"
  12652. "movs r4, r5\n\t"
  12653. "movs r5, #0\n\t"
  12654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12655. "adds r7, r7, #4\n\t"
  12656. #else
  12657. "add r7, r7, #4\n\t"
  12658. #endif
  12659. "mov r8, r7\n\t"
  12660. "movs r6, #56\n\t"
  12661. "cmp r7, r6\n\t"
  12662. "ble L_sp_2048_sqr_8_words_%=\n\t"
  12663. "mov %[a], r9\n\t"
  12664. "str r3, [%[r], r7]\n\t"
  12665. "mov %[r], r11\n\t"
  12666. "mov %[a], r10\n\t"
  12667. "movs r3, #60\n\t"
  12668. "\n"
  12669. "L_sp_2048_sqr_8_store_%=:\n\t"
  12670. "ldr r6, [%[a], r3]\n\t"
  12671. "str r6, [%[r], r3]\n\t"
  12672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12673. "subs r3, r3, #4\n\t"
  12674. #else
  12675. "sub r3, r3, #4\n\t"
  12676. #endif
  12677. "bge L_sp_2048_sqr_8_store_%=\n\t"
  12678. "movs r6, #0x40\n\t"
  12679. "add sp, sp, r6\n\t"
  12680. : [r] "+l" (r), [a] "+l" (a)
  12681. :
  12682. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  12683. );
  12684. }
  12685. #else
  12686. /* Square a and put result in r. (r = a * a)
  12687. *
  12688. * r A single precision integer.
  12689. * a A single precision integer.
  12690. */
  12691. SP_NOINLINE static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a)
  12692. {
  12693. __asm__ __volatile__ (
  12694. "sub sp, sp, #32\n\t"
  12695. "mov r8, %[r]\n\t"
  12696. "mov r9, %[a]\n\t"
  12697. "movs %[r], #0\n\t"
  12698. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  12699. "mov r10, r2\n\t"
  12700. "mov r11, r3\n\t"
  12701. "mov r12, r4\n\t"
  12702. "mov lr, r5\n\t"
  12703. "mov %[a], r9\n\t"
  12704. "# A[0] * A[0]\n\t"
  12705. "movs r4, #0\n\t"
  12706. "mov r7, r10\n\t"
  12707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12708. "lsrs r6, r7, #16\n\t"
  12709. #else
  12710. "lsr r6, r7, #16\n\t"
  12711. #endif
  12712. "uxth r5, r7\n\t"
  12713. "movs r2, r5\n\t"
  12714. "movs r3, r6\n\t"
  12715. #ifdef WOLFSSL_KEIL
  12716. "muls r2, r2, r2\n\t"
  12717. #elif defined(__clang__)
  12718. "muls r2, r2\n\t"
  12719. #else
  12720. "mul r2, r2\n\t"
  12721. #endif
  12722. #ifdef WOLFSSL_KEIL
  12723. "muls r3, r3, r3\n\t"
  12724. #elif defined(__clang__)
  12725. "muls r3, r3\n\t"
  12726. #else
  12727. "mul r3, r3\n\t"
  12728. #endif
  12729. #ifdef WOLFSSL_KEIL
  12730. "muls r5, r6, r5\n\t"
  12731. #elif defined(__clang__)
  12732. "muls r5, r6\n\t"
  12733. #else
  12734. "mul r5, r6\n\t"
  12735. #endif
  12736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12737. "lsrs r6, r5, #15\n\t"
  12738. #else
  12739. "lsr r6, r5, #15\n\t"
  12740. #endif
  12741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12742. "lsls r5, r5, #17\n\t"
  12743. #else
  12744. "lsl r5, r5, #17\n\t"
  12745. #endif
  12746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12747. "adds r2, r2, r5\n\t"
  12748. #else
  12749. "add r2, r2, r5\n\t"
  12750. #endif
  12751. #ifdef WOLFSSL_KEIL
  12752. "adcs r3, r3, r6\n\t"
  12753. #elif defined(__clang__)
  12754. "adcs r3, r6\n\t"
  12755. #else
  12756. "adc r3, r6\n\t"
  12757. #endif
  12758. "str r2, [sp]\n\t"
  12759. "# A[1] * A[0]\n\t"
  12760. "movs r2, #0\n\t"
  12761. "mov %[a], r11\n\t"
  12762. "uxth r5, %[a]\n\t"
  12763. "uxth r6, r7\n\t"
  12764. #ifdef WOLFSSL_KEIL
  12765. "muls r6, r5, r6\n\t"
  12766. #elif defined(__clang__)
  12767. "muls r6, r5\n\t"
  12768. #else
  12769. "mul r6, r5\n\t"
  12770. #endif
  12771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12772. "adds r3, r3, r6\n\t"
  12773. #else
  12774. "add r3, r3, r6\n\t"
  12775. #endif
  12776. #ifdef WOLFSSL_KEIL
  12777. "adcs r4, r4, %[r]\n\t"
  12778. #elif defined(__clang__)
  12779. "adcs r4, %[r]\n\t"
  12780. #else
  12781. "adc r4, %[r]\n\t"
  12782. #endif
  12783. #ifdef WOLFSSL_KEIL
  12784. "adcs r2, r2, %[r]\n\t"
  12785. #elif defined(__clang__)
  12786. "adcs r2, %[r]\n\t"
  12787. #else
  12788. "adc r2, %[r]\n\t"
  12789. #endif
  12790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12791. "adds r3, r3, r6\n\t"
  12792. #else
  12793. "add r3, r3, r6\n\t"
  12794. #endif
  12795. #ifdef WOLFSSL_KEIL
  12796. "adcs r4, r4, %[r]\n\t"
  12797. #elif defined(__clang__)
  12798. "adcs r4, %[r]\n\t"
  12799. #else
  12800. "adc r4, %[r]\n\t"
  12801. #endif
  12802. #ifdef WOLFSSL_KEIL
  12803. "adcs r2, r2, %[r]\n\t"
  12804. #elif defined(__clang__)
  12805. "adcs r2, %[r]\n\t"
  12806. #else
  12807. "adc r2, %[r]\n\t"
  12808. #endif
  12809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12810. "lsrs r6, r7, #16\n\t"
  12811. #else
  12812. "lsr r6, r7, #16\n\t"
  12813. #endif
  12814. #ifdef WOLFSSL_KEIL
  12815. "muls r5, r6, r5\n\t"
  12816. #elif defined(__clang__)
  12817. "muls r5, r6\n\t"
  12818. #else
  12819. "mul r5, r6\n\t"
  12820. #endif
  12821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12822. "lsrs r6, r5, #16\n\t"
  12823. #else
  12824. "lsr r6, r5, #16\n\t"
  12825. #endif
  12826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12827. "lsls r5, r5, #16\n\t"
  12828. #else
  12829. "lsl r5, r5, #16\n\t"
  12830. #endif
  12831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12832. "adds r3, r3, r5\n\t"
  12833. #else
  12834. "add r3, r3, r5\n\t"
  12835. #endif
  12836. #ifdef WOLFSSL_KEIL
  12837. "adcs r4, r4, r6\n\t"
  12838. #elif defined(__clang__)
  12839. "adcs r4, r6\n\t"
  12840. #else
  12841. "adc r4, r6\n\t"
  12842. #endif
  12843. #ifdef WOLFSSL_KEIL
  12844. "adcs r2, r2, %[r]\n\t"
  12845. #elif defined(__clang__)
  12846. "adcs r2, %[r]\n\t"
  12847. #else
  12848. "adc r2, %[r]\n\t"
  12849. #endif
  12850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12851. "adds r3, r3, r5\n\t"
  12852. #else
  12853. "add r3, r3, r5\n\t"
  12854. #endif
  12855. #ifdef WOLFSSL_KEIL
  12856. "adcs r4, r4, r6\n\t"
  12857. #elif defined(__clang__)
  12858. "adcs r4, r6\n\t"
  12859. #else
  12860. "adc r4, r6\n\t"
  12861. #endif
  12862. #ifdef WOLFSSL_KEIL
  12863. "adcs r2, r2, %[r]\n\t"
  12864. #elif defined(__clang__)
  12865. "adcs r2, %[r]\n\t"
  12866. #else
  12867. "adc r2, %[r]\n\t"
  12868. #endif
  12869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12870. "lsrs r5, %[a], #16\n\t"
  12871. #else
  12872. "lsr r5, %[a], #16\n\t"
  12873. #endif
  12874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12875. "lsrs r6, r7, #16\n\t"
  12876. #else
  12877. "lsr r6, r7, #16\n\t"
  12878. #endif
  12879. #ifdef WOLFSSL_KEIL
  12880. "muls r6, r5, r6\n\t"
  12881. #elif defined(__clang__)
  12882. "muls r6, r5\n\t"
  12883. #else
  12884. "mul r6, r5\n\t"
  12885. #endif
  12886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12887. "adds r4, r4, r6\n\t"
  12888. #else
  12889. "add r4, r4, r6\n\t"
  12890. #endif
  12891. #ifdef WOLFSSL_KEIL
  12892. "adcs r2, r2, %[r]\n\t"
  12893. #elif defined(__clang__)
  12894. "adcs r2, %[r]\n\t"
  12895. #else
  12896. "adc r2, %[r]\n\t"
  12897. #endif
  12898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12899. "adds r4, r4, r6\n\t"
  12900. #else
  12901. "add r4, r4, r6\n\t"
  12902. #endif
  12903. #ifdef WOLFSSL_KEIL
  12904. "adcs r2, r2, %[r]\n\t"
  12905. #elif defined(__clang__)
  12906. "adcs r2, %[r]\n\t"
  12907. #else
  12908. "adc r2, %[r]\n\t"
  12909. #endif
  12910. "uxth r6, r7\n\t"
  12911. #ifdef WOLFSSL_KEIL
  12912. "muls r5, r6, r5\n\t"
  12913. #elif defined(__clang__)
  12914. "muls r5, r6\n\t"
  12915. #else
  12916. "mul r5, r6\n\t"
  12917. #endif
  12918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12919. "lsrs r6, r5, #16\n\t"
  12920. #else
  12921. "lsr r6, r5, #16\n\t"
  12922. #endif
  12923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12924. "lsls r5, r5, #16\n\t"
  12925. #else
  12926. "lsl r5, r5, #16\n\t"
  12927. #endif
  12928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12929. "adds r3, r3, r5\n\t"
  12930. #else
  12931. "add r3, r3, r5\n\t"
  12932. #endif
  12933. #ifdef WOLFSSL_KEIL
  12934. "adcs r4, r4, r6\n\t"
  12935. #elif defined(__clang__)
  12936. "adcs r4, r6\n\t"
  12937. #else
  12938. "adc r4, r6\n\t"
  12939. #endif
  12940. #ifdef WOLFSSL_KEIL
  12941. "adcs r2, r2, %[r]\n\t"
  12942. #elif defined(__clang__)
  12943. "adcs r2, %[r]\n\t"
  12944. #else
  12945. "adc r2, %[r]\n\t"
  12946. #endif
  12947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12948. "adds r3, r3, r5\n\t"
  12949. #else
  12950. "add r3, r3, r5\n\t"
  12951. #endif
  12952. #ifdef WOLFSSL_KEIL
  12953. "adcs r4, r4, r6\n\t"
  12954. #elif defined(__clang__)
  12955. "adcs r4, r6\n\t"
  12956. #else
  12957. "adc r4, r6\n\t"
  12958. #endif
  12959. #ifdef WOLFSSL_KEIL
  12960. "adcs r2, r2, %[r]\n\t"
  12961. #elif defined(__clang__)
  12962. "adcs r2, %[r]\n\t"
  12963. #else
  12964. "adc r2, %[r]\n\t"
  12965. #endif
  12966. "str r3, [sp, #4]\n\t"
  12967. "# A[2] * A[0]\n\t"
  12968. "movs r3, #0\n\t"
  12969. "mov %[a], r9\n\t"
  12970. "mov %[a], r12\n\t"
  12971. "uxth r5, %[a]\n\t"
  12972. "uxth r6, r7\n\t"
  12973. #ifdef WOLFSSL_KEIL
  12974. "muls r6, r5, r6\n\t"
  12975. #elif defined(__clang__)
  12976. "muls r6, r5\n\t"
  12977. #else
  12978. "mul r6, r5\n\t"
  12979. #endif
  12980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  12981. "adds r4, r4, r6\n\t"
  12982. #else
  12983. "add r4, r4, r6\n\t"
  12984. #endif
  12985. #ifdef WOLFSSL_KEIL
  12986. "adcs r2, r2, %[r]\n\t"
  12987. #elif defined(__clang__)
  12988. "adcs r2, %[r]\n\t"
  12989. #else
  12990. "adc r2, %[r]\n\t"
  12991. #endif
  12992. #ifdef WOLFSSL_KEIL
  12993. "adcs r3, r3, %[r]\n\t"
  12994. #elif defined(__clang__)
  12995. "adcs r3, %[r]\n\t"
  12996. #else
  12997. "adc r3, %[r]\n\t"
  12998. #endif
  12999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13000. "adds r4, r4, r6\n\t"
  13001. #else
  13002. "add r4, r4, r6\n\t"
  13003. #endif
  13004. #ifdef WOLFSSL_KEIL
  13005. "adcs r2, r2, %[r]\n\t"
  13006. #elif defined(__clang__)
  13007. "adcs r2, %[r]\n\t"
  13008. #else
  13009. "adc r2, %[r]\n\t"
  13010. #endif
  13011. #ifdef WOLFSSL_KEIL
  13012. "adcs r3, r3, %[r]\n\t"
  13013. #elif defined(__clang__)
  13014. "adcs r3, %[r]\n\t"
  13015. #else
  13016. "adc r3, %[r]\n\t"
  13017. #endif
  13018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13019. "lsrs r6, r7, #16\n\t"
  13020. #else
  13021. "lsr r6, r7, #16\n\t"
  13022. #endif
  13023. #ifdef WOLFSSL_KEIL
  13024. "muls r5, r6, r5\n\t"
  13025. #elif defined(__clang__)
  13026. "muls r5, r6\n\t"
  13027. #else
  13028. "mul r5, r6\n\t"
  13029. #endif
  13030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13031. "lsrs r6, r5, #16\n\t"
  13032. #else
  13033. "lsr r6, r5, #16\n\t"
  13034. #endif
  13035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13036. "lsls r5, r5, #16\n\t"
  13037. #else
  13038. "lsl r5, r5, #16\n\t"
  13039. #endif
  13040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13041. "adds r4, r4, r5\n\t"
  13042. #else
  13043. "add r4, r4, r5\n\t"
  13044. #endif
  13045. #ifdef WOLFSSL_KEIL
  13046. "adcs r2, r2, r6\n\t"
  13047. #elif defined(__clang__)
  13048. "adcs r2, r6\n\t"
  13049. #else
  13050. "adc r2, r6\n\t"
  13051. #endif
  13052. #ifdef WOLFSSL_KEIL
  13053. "adcs r3, r3, %[r]\n\t"
  13054. #elif defined(__clang__)
  13055. "adcs r3, %[r]\n\t"
  13056. #else
  13057. "adc r3, %[r]\n\t"
  13058. #endif
  13059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13060. "adds r4, r4, r5\n\t"
  13061. #else
  13062. "add r4, r4, r5\n\t"
  13063. #endif
  13064. #ifdef WOLFSSL_KEIL
  13065. "adcs r2, r2, r6\n\t"
  13066. #elif defined(__clang__)
  13067. "adcs r2, r6\n\t"
  13068. #else
  13069. "adc r2, r6\n\t"
  13070. #endif
  13071. #ifdef WOLFSSL_KEIL
  13072. "adcs r3, r3, %[r]\n\t"
  13073. #elif defined(__clang__)
  13074. "adcs r3, %[r]\n\t"
  13075. #else
  13076. "adc r3, %[r]\n\t"
  13077. #endif
  13078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13079. "lsrs r5, %[a], #16\n\t"
  13080. #else
  13081. "lsr r5, %[a], #16\n\t"
  13082. #endif
  13083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13084. "lsrs r6, r7, #16\n\t"
  13085. #else
  13086. "lsr r6, r7, #16\n\t"
  13087. #endif
  13088. #ifdef WOLFSSL_KEIL
  13089. "muls r6, r5, r6\n\t"
  13090. #elif defined(__clang__)
  13091. "muls r6, r5\n\t"
  13092. #else
  13093. "mul r6, r5\n\t"
  13094. #endif
  13095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13096. "adds r2, r2, r6\n\t"
  13097. #else
  13098. "add r2, r2, r6\n\t"
  13099. #endif
  13100. #ifdef WOLFSSL_KEIL
  13101. "adcs r3, r3, %[r]\n\t"
  13102. #elif defined(__clang__)
  13103. "adcs r3, %[r]\n\t"
  13104. #else
  13105. "adc r3, %[r]\n\t"
  13106. #endif
  13107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13108. "adds r2, r2, r6\n\t"
  13109. #else
  13110. "add r2, r2, r6\n\t"
  13111. #endif
  13112. #ifdef WOLFSSL_KEIL
  13113. "adcs r3, r3, %[r]\n\t"
  13114. #elif defined(__clang__)
  13115. "adcs r3, %[r]\n\t"
  13116. #else
  13117. "adc r3, %[r]\n\t"
  13118. #endif
  13119. "uxth r6, r7\n\t"
  13120. #ifdef WOLFSSL_KEIL
  13121. "muls r5, r6, r5\n\t"
  13122. #elif defined(__clang__)
  13123. "muls r5, r6\n\t"
  13124. #else
  13125. "mul r5, r6\n\t"
  13126. #endif
  13127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13128. "lsrs r6, r5, #16\n\t"
  13129. #else
  13130. "lsr r6, r5, #16\n\t"
  13131. #endif
  13132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13133. "lsls r5, r5, #16\n\t"
  13134. #else
  13135. "lsl r5, r5, #16\n\t"
  13136. #endif
  13137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13138. "adds r4, r4, r5\n\t"
  13139. #else
  13140. "add r4, r4, r5\n\t"
  13141. #endif
  13142. #ifdef WOLFSSL_KEIL
  13143. "adcs r2, r2, r6\n\t"
  13144. #elif defined(__clang__)
  13145. "adcs r2, r6\n\t"
  13146. #else
  13147. "adc r2, r6\n\t"
  13148. #endif
  13149. #ifdef WOLFSSL_KEIL
  13150. "adcs r3, r3, %[r]\n\t"
  13151. #elif defined(__clang__)
  13152. "adcs r3, %[r]\n\t"
  13153. #else
  13154. "adc r3, %[r]\n\t"
  13155. #endif
  13156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13157. "adds r4, r4, r5\n\t"
  13158. #else
  13159. "add r4, r4, r5\n\t"
  13160. #endif
  13161. #ifdef WOLFSSL_KEIL
  13162. "adcs r2, r2, r6\n\t"
  13163. #elif defined(__clang__)
  13164. "adcs r2, r6\n\t"
  13165. #else
  13166. "adc r2, r6\n\t"
  13167. #endif
  13168. #ifdef WOLFSSL_KEIL
  13169. "adcs r3, r3, %[r]\n\t"
  13170. #elif defined(__clang__)
  13171. "adcs r3, %[r]\n\t"
  13172. #else
  13173. "adc r3, %[r]\n\t"
  13174. #endif
  13175. "# A[1] * A[1]\n\t"
  13176. "mov r7, r11\n\t"
  13177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13178. "lsrs r6, r7, #16\n\t"
  13179. #else
  13180. "lsr r6, r7, #16\n\t"
  13181. #endif
  13182. "uxth r5, r7\n\t"
  13183. #ifdef WOLFSSL_KEIL
  13184. "muls r5, r5, r5\n\t"
  13185. #elif defined(__clang__)
  13186. "muls r5, r5\n\t"
  13187. #else
  13188. "mul r5, r5\n\t"
  13189. #endif
  13190. #ifdef WOLFSSL_KEIL
  13191. "muls r6, r6, r6\n\t"
  13192. #elif defined(__clang__)
  13193. "muls r6, r6\n\t"
  13194. #else
  13195. "mul r6, r6\n\t"
  13196. #endif
  13197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13198. "adds r4, r4, r5\n\t"
  13199. #else
  13200. "add r4, r4, r5\n\t"
  13201. #endif
  13202. #ifdef WOLFSSL_KEIL
  13203. "adcs r2, r2, r6\n\t"
  13204. #elif defined(__clang__)
  13205. "adcs r2, r6\n\t"
  13206. #else
  13207. "adc r2, r6\n\t"
  13208. #endif
  13209. #ifdef WOLFSSL_KEIL
  13210. "adcs r3, r3, %[r]\n\t"
  13211. #elif defined(__clang__)
  13212. "adcs r3, %[r]\n\t"
  13213. #else
  13214. "adc r3, %[r]\n\t"
  13215. #endif
  13216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13217. "lsrs r6, r7, #16\n\t"
  13218. #else
  13219. "lsr r6, r7, #16\n\t"
  13220. #endif
  13221. "uxth r5, r7\n\t"
  13222. #ifdef WOLFSSL_KEIL
  13223. "muls r5, r6, r5\n\t"
  13224. #elif defined(__clang__)
  13225. "muls r5, r6\n\t"
  13226. #else
  13227. "mul r5, r6\n\t"
  13228. #endif
  13229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13230. "lsrs r6, r5, #15\n\t"
  13231. #else
  13232. "lsr r6, r5, #15\n\t"
  13233. #endif
  13234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13235. "lsls r5, r5, #17\n\t"
  13236. #else
  13237. "lsl r5, r5, #17\n\t"
  13238. #endif
  13239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13240. "adds r4, r4, r5\n\t"
  13241. #else
  13242. "add r4, r4, r5\n\t"
  13243. #endif
  13244. #ifdef WOLFSSL_KEIL
  13245. "adcs r2, r2, r6\n\t"
  13246. #elif defined(__clang__)
  13247. "adcs r2, r6\n\t"
  13248. #else
  13249. "adc r2, r6\n\t"
  13250. #endif
  13251. #ifdef WOLFSSL_KEIL
  13252. "adcs r3, r3, %[r]\n\t"
  13253. #elif defined(__clang__)
  13254. "adcs r3, %[r]\n\t"
  13255. #else
  13256. "adc r3, %[r]\n\t"
  13257. #endif
  13258. "str r4, [sp, #8]\n\t"
  13259. "# A[2] * A[1]\n\t"
  13260. "movs r4, #0\n\t"
  13261. "mov %[a], r9\n\t"
  13262. "mov %[a], r12\n\t"
  13263. "uxth r5, %[a]\n\t"
  13264. "uxth r6, r7\n\t"
  13265. #ifdef WOLFSSL_KEIL
  13266. "muls r6, r5, r6\n\t"
  13267. #elif defined(__clang__)
  13268. "muls r6, r5\n\t"
  13269. #else
  13270. "mul r6, r5\n\t"
  13271. #endif
  13272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13273. "adds r2, r2, r6\n\t"
  13274. #else
  13275. "add r2, r2, r6\n\t"
  13276. #endif
  13277. #ifdef WOLFSSL_KEIL
  13278. "adcs r3, r3, %[r]\n\t"
  13279. #elif defined(__clang__)
  13280. "adcs r3, %[r]\n\t"
  13281. #else
  13282. "adc r3, %[r]\n\t"
  13283. #endif
  13284. #ifdef WOLFSSL_KEIL
  13285. "adcs r4, r4, %[r]\n\t"
  13286. #elif defined(__clang__)
  13287. "adcs r4, %[r]\n\t"
  13288. #else
  13289. "adc r4, %[r]\n\t"
  13290. #endif
  13291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13292. "adds r2, r2, r6\n\t"
  13293. #else
  13294. "add r2, r2, r6\n\t"
  13295. #endif
  13296. #ifdef WOLFSSL_KEIL
  13297. "adcs r3, r3, %[r]\n\t"
  13298. #elif defined(__clang__)
  13299. "adcs r3, %[r]\n\t"
  13300. #else
  13301. "adc r3, %[r]\n\t"
  13302. #endif
  13303. #ifdef WOLFSSL_KEIL
  13304. "adcs r4, r4, %[r]\n\t"
  13305. #elif defined(__clang__)
  13306. "adcs r4, %[r]\n\t"
  13307. #else
  13308. "adc r4, %[r]\n\t"
  13309. #endif
  13310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13311. "lsrs r6, r7, #16\n\t"
  13312. #else
  13313. "lsr r6, r7, #16\n\t"
  13314. #endif
  13315. #ifdef WOLFSSL_KEIL
  13316. "muls r5, r6, r5\n\t"
  13317. #elif defined(__clang__)
  13318. "muls r5, r6\n\t"
  13319. #else
  13320. "mul r5, r6\n\t"
  13321. #endif
  13322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13323. "lsrs r6, r5, #16\n\t"
  13324. #else
  13325. "lsr r6, r5, #16\n\t"
  13326. #endif
  13327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13328. "lsls r5, r5, #16\n\t"
  13329. #else
  13330. "lsl r5, r5, #16\n\t"
  13331. #endif
  13332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13333. "adds r2, r2, r5\n\t"
  13334. #else
  13335. "add r2, r2, r5\n\t"
  13336. #endif
  13337. #ifdef WOLFSSL_KEIL
  13338. "adcs r3, r3, r6\n\t"
  13339. #elif defined(__clang__)
  13340. "adcs r3, r6\n\t"
  13341. #else
  13342. "adc r3, r6\n\t"
  13343. #endif
  13344. #ifdef WOLFSSL_KEIL
  13345. "adcs r4, r4, %[r]\n\t"
  13346. #elif defined(__clang__)
  13347. "adcs r4, %[r]\n\t"
  13348. #else
  13349. "adc r4, %[r]\n\t"
  13350. #endif
  13351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13352. "adds r2, r2, r5\n\t"
  13353. #else
  13354. "add r2, r2, r5\n\t"
  13355. #endif
  13356. #ifdef WOLFSSL_KEIL
  13357. "adcs r3, r3, r6\n\t"
  13358. #elif defined(__clang__)
  13359. "adcs r3, r6\n\t"
  13360. #else
  13361. "adc r3, r6\n\t"
  13362. #endif
  13363. #ifdef WOLFSSL_KEIL
  13364. "adcs r4, r4, %[r]\n\t"
  13365. #elif defined(__clang__)
  13366. "adcs r4, %[r]\n\t"
  13367. #else
  13368. "adc r4, %[r]\n\t"
  13369. #endif
  13370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13371. "lsrs r5, %[a], #16\n\t"
  13372. #else
  13373. "lsr r5, %[a], #16\n\t"
  13374. #endif
  13375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13376. "lsrs r6, r7, #16\n\t"
  13377. #else
  13378. "lsr r6, r7, #16\n\t"
  13379. #endif
  13380. #ifdef WOLFSSL_KEIL
  13381. "muls r6, r5, r6\n\t"
  13382. #elif defined(__clang__)
  13383. "muls r6, r5\n\t"
  13384. #else
  13385. "mul r6, r5\n\t"
  13386. #endif
  13387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13388. "adds r3, r3, r6\n\t"
  13389. #else
  13390. "add r3, r3, r6\n\t"
  13391. #endif
  13392. #ifdef WOLFSSL_KEIL
  13393. "adcs r4, r4, %[r]\n\t"
  13394. #elif defined(__clang__)
  13395. "adcs r4, %[r]\n\t"
  13396. #else
  13397. "adc r4, %[r]\n\t"
  13398. #endif
  13399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13400. "adds r3, r3, r6\n\t"
  13401. #else
  13402. "add r3, r3, r6\n\t"
  13403. #endif
  13404. #ifdef WOLFSSL_KEIL
  13405. "adcs r4, r4, %[r]\n\t"
  13406. #elif defined(__clang__)
  13407. "adcs r4, %[r]\n\t"
  13408. #else
  13409. "adc r4, %[r]\n\t"
  13410. #endif
  13411. "uxth r6, r7\n\t"
  13412. #ifdef WOLFSSL_KEIL
  13413. "muls r5, r6, r5\n\t"
  13414. #elif defined(__clang__)
  13415. "muls r5, r6\n\t"
  13416. #else
  13417. "mul r5, r6\n\t"
  13418. #endif
  13419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13420. "lsrs r6, r5, #16\n\t"
  13421. #else
  13422. "lsr r6, r5, #16\n\t"
  13423. #endif
  13424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13425. "lsls r5, r5, #16\n\t"
  13426. #else
  13427. "lsl r5, r5, #16\n\t"
  13428. #endif
  13429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13430. "adds r2, r2, r5\n\t"
  13431. #else
  13432. "add r2, r2, r5\n\t"
  13433. #endif
  13434. #ifdef WOLFSSL_KEIL
  13435. "adcs r3, r3, r6\n\t"
  13436. #elif defined(__clang__)
  13437. "adcs r3, r6\n\t"
  13438. #else
  13439. "adc r3, r6\n\t"
  13440. #endif
  13441. #ifdef WOLFSSL_KEIL
  13442. "adcs r4, r4, %[r]\n\t"
  13443. #elif defined(__clang__)
  13444. "adcs r4, %[r]\n\t"
  13445. #else
  13446. "adc r4, %[r]\n\t"
  13447. #endif
  13448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13449. "adds r2, r2, r5\n\t"
  13450. #else
  13451. "add r2, r2, r5\n\t"
  13452. #endif
  13453. #ifdef WOLFSSL_KEIL
  13454. "adcs r3, r3, r6\n\t"
  13455. #elif defined(__clang__)
  13456. "adcs r3, r6\n\t"
  13457. #else
  13458. "adc r3, r6\n\t"
  13459. #endif
  13460. #ifdef WOLFSSL_KEIL
  13461. "adcs r4, r4, %[r]\n\t"
  13462. #elif defined(__clang__)
  13463. "adcs r4, %[r]\n\t"
  13464. #else
  13465. "adc r4, %[r]\n\t"
  13466. #endif
  13467. "# A[3] * A[0]\n\t"
  13468. "mov %[a], r9\n\t"
  13469. "mov r7, r10\n\t"
  13470. "mov %[a], lr\n\t"
  13471. "uxth r5, %[a]\n\t"
  13472. "uxth r6, r7\n\t"
  13473. #ifdef WOLFSSL_KEIL
  13474. "muls r6, r5, r6\n\t"
  13475. #elif defined(__clang__)
  13476. "muls r6, r5\n\t"
  13477. #else
  13478. "mul r6, r5\n\t"
  13479. #endif
  13480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13481. "adds r2, r2, r6\n\t"
  13482. #else
  13483. "add r2, r2, r6\n\t"
  13484. #endif
  13485. #ifdef WOLFSSL_KEIL
  13486. "adcs r3, r3, %[r]\n\t"
  13487. #elif defined(__clang__)
  13488. "adcs r3, %[r]\n\t"
  13489. #else
  13490. "adc r3, %[r]\n\t"
  13491. #endif
  13492. #ifdef WOLFSSL_KEIL
  13493. "adcs r4, r4, %[r]\n\t"
  13494. #elif defined(__clang__)
  13495. "adcs r4, %[r]\n\t"
  13496. #else
  13497. "adc r4, %[r]\n\t"
  13498. #endif
  13499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13500. "adds r2, r2, r6\n\t"
  13501. #else
  13502. "add r2, r2, r6\n\t"
  13503. #endif
  13504. #ifdef WOLFSSL_KEIL
  13505. "adcs r3, r3, %[r]\n\t"
  13506. #elif defined(__clang__)
  13507. "adcs r3, %[r]\n\t"
  13508. #else
  13509. "adc r3, %[r]\n\t"
  13510. #endif
  13511. #ifdef WOLFSSL_KEIL
  13512. "adcs r4, r4, %[r]\n\t"
  13513. #elif defined(__clang__)
  13514. "adcs r4, %[r]\n\t"
  13515. #else
  13516. "adc r4, %[r]\n\t"
  13517. #endif
  13518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13519. "lsrs r6, r7, #16\n\t"
  13520. #else
  13521. "lsr r6, r7, #16\n\t"
  13522. #endif
  13523. #ifdef WOLFSSL_KEIL
  13524. "muls r5, r6, r5\n\t"
  13525. #elif defined(__clang__)
  13526. "muls r5, r6\n\t"
  13527. #else
  13528. "mul r5, r6\n\t"
  13529. #endif
  13530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13531. "lsrs r6, r5, #16\n\t"
  13532. #else
  13533. "lsr r6, r5, #16\n\t"
  13534. #endif
  13535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13536. "lsls r5, r5, #16\n\t"
  13537. #else
  13538. "lsl r5, r5, #16\n\t"
  13539. #endif
  13540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13541. "adds r2, r2, r5\n\t"
  13542. #else
  13543. "add r2, r2, r5\n\t"
  13544. #endif
  13545. #ifdef WOLFSSL_KEIL
  13546. "adcs r3, r3, r6\n\t"
  13547. #elif defined(__clang__)
  13548. "adcs r3, r6\n\t"
  13549. #else
  13550. "adc r3, r6\n\t"
  13551. #endif
  13552. #ifdef WOLFSSL_KEIL
  13553. "adcs r4, r4, %[r]\n\t"
  13554. #elif defined(__clang__)
  13555. "adcs r4, %[r]\n\t"
  13556. #else
  13557. "adc r4, %[r]\n\t"
  13558. #endif
  13559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13560. "adds r2, r2, r5\n\t"
  13561. #else
  13562. "add r2, r2, r5\n\t"
  13563. #endif
  13564. #ifdef WOLFSSL_KEIL
  13565. "adcs r3, r3, r6\n\t"
  13566. #elif defined(__clang__)
  13567. "adcs r3, r6\n\t"
  13568. #else
  13569. "adc r3, r6\n\t"
  13570. #endif
  13571. #ifdef WOLFSSL_KEIL
  13572. "adcs r4, r4, %[r]\n\t"
  13573. #elif defined(__clang__)
  13574. "adcs r4, %[r]\n\t"
  13575. #else
  13576. "adc r4, %[r]\n\t"
  13577. #endif
  13578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13579. "lsrs r5, %[a], #16\n\t"
  13580. #else
  13581. "lsr r5, %[a], #16\n\t"
  13582. #endif
  13583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13584. "lsrs r6, r7, #16\n\t"
  13585. #else
  13586. "lsr r6, r7, #16\n\t"
  13587. #endif
  13588. #ifdef WOLFSSL_KEIL
  13589. "muls r6, r5, r6\n\t"
  13590. #elif defined(__clang__)
  13591. "muls r6, r5\n\t"
  13592. #else
  13593. "mul r6, r5\n\t"
  13594. #endif
  13595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13596. "adds r3, r3, r6\n\t"
  13597. #else
  13598. "add r3, r3, r6\n\t"
  13599. #endif
  13600. #ifdef WOLFSSL_KEIL
  13601. "adcs r4, r4, %[r]\n\t"
  13602. #elif defined(__clang__)
  13603. "adcs r4, %[r]\n\t"
  13604. #else
  13605. "adc r4, %[r]\n\t"
  13606. #endif
  13607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13608. "adds r3, r3, r6\n\t"
  13609. #else
  13610. "add r3, r3, r6\n\t"
  13611. #endif
  13612. #ifdef WOLFSSL_KEIL
  13613. "adcs r4, r4, %[r]\n\t"
  13614. #elif defined(__clang__)
  13615. "adcs r4, %[r]\n\t"
  13616. #else
  13617. "adc r4, %[r]\n\t"
  13618. #endif
  13619. "uxth r6, r7\n\t"
  13620. #ifdef WOLFSSL_KEIL
  13621. "muls r5, r6, r5\n\t"
  13622. #elif defined(__clang__)
  13623. "muls r5, r6\n\t"
  13624. #else
  13625. "mul r5, r6\n\t"
  13626. #endif
  13627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13628. "lsrs r6, r5, #16\n\t"
  13629. #else
  13630. "lsr r6, r5, #16\n\t"
  13631. #endif
  13632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13633. "lsls r5, r5, #16\n\t"
  13634. #else
  13635. "lsl r5, r5, #16\n\t"
  13636. #endif
  13637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13638. "adds r2, r2, r5\n\t"
  13639. #else
  13640. "add r2, r2, r5\n\t"
  13641. #endif
  13642. #ifdef WOLFSSL_KEIL
  13643. "adcs r3, r3, r6\n\t"
  13644. #elif defined(__clang__)
  13645. "adcs r3, r6\n\t"
  13646. #else
  13647. "adc r3, r6\n\t"
  13648. #endif
  13649. #ifdef WOLFSSL_KEIL
  13650. "adcs r4, r4, %[r]\n\t"
  13651. #elif defined(__clang__)
  13652. "adcs r4, %[r]\n\t"
  13653. #else
  13654. "adc r4, %[r]\n\t"
  13655. #endif
  13656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13657. "adds r2, r2, r5\n\t"
  13658. #else
  13659. "add r2, r2, r5\n\t"
  13660. #endif
  13661. #ifdef WOLFSSL_KEIL
  13662. "adcs r3, r3, r6\n\t"
  13663. #elif defined(__clang__)
  13664. "adcs r3, r6\n\t"
  13665. #else
  13666. "adc r3, r6\n\t"
  13667. #endif
  13668. #ifdef WOLFSSL_KEIL
  13669. "adcs r4, r4, %[r]\n\t"
  13670. #elif defined(__clang__)
  13671. "adcs r4, %[r]\n\t"
  13672. #else
  13673. "adc r4, %[r]\n\t"
  13674. #endif
  13675. "str r2, [sp, #12]\n\t"
  13676. "# A[4] * A[0]\n\t"
  13677. "movs r2, #0\n\t"
  13678. "mov %[a], r9\n\t"
  13679. "ldr %[a], [%[a], #16]\n\t"
  13680. "uxth r5, %[a]\n\t"
  13681. "uxth r6, r7\n\t"
  13682. #ifdef WOLFSSL_KEIL
  13683. "muls r6, r5, r6\n\t"
  13684. #elif defined(__clang__)
  13685. "muls r6, r5\n\t"
  13686. #else
  13687. "mul r6, r5\n\t"
  13688. #endif
  13689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13690. "adds r3, r3, r6\n\t"
  13691. #else
  13692. "add r3, r3, r6\n\t"
  13693. #endif
  13694. #ifdef WOLFSSL_KEIL
  13695. "adcs r4, r4, %[r]\n\t"
  13696. #elif defined(__clang__)
  13697. "adcs r4, %[r]\n\t"
  13698. #else
  13699. "adc r4, %[r]\n\t"
  13700. #endif
  13701. #ifdef WOLFSSL_KEIL
  13702. "adcs r2, r2, %[r]\n\t"
  13703. #elif defined(__clang__)
  13704. "adcs r2, %[r]\n\t"
  13705. #else
  13706. "adc r2, %[r]\n\t"
  13707. #endif
  13708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13709. "adds r3, r3, r6\n\t"
  13710. #else
  13711. "add r3, r3, r6\n\t"
  13712. #endif
  13713. #ifdef WOLFSSL_KEIL
  13714. "adcs r4, r4, %[r]\n\t"
  13715. #elif defined(__clang__)
  13716. "adcs r4, %[r]\n\t"
  13717. #else
  13718. "adc r4, %[r]\n\t"
  13719. #endif
  13720. #ifdef WOLFSSL_KEIL
  13721. "adcs r2, r2, %[r]\n\t"
  13722. #elif defined(__clang__)
  13723. "adcs r2, %[r]\n\t"
  13724. #else
  13725. "adc r2, %[r]\n\t"
  13726. #endif
  13727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13728. "lsrs r6, r7, #16\n\t"
  13729. #else
  13730. "lsr r6, r7, #16\n\t"
  13731. #endif
  13732. #ifdef WOLFSSL_KEIL
  13733. "muls r5, r6, r5\n\t"
  13734. #elif defined(__clang__)
  13735. "muls r5, r6\n\t"
  13736. #else
  13737. "mul r5, r6\n\t"
  13738. #endif
  13739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13740. "lsrs r6, r5, #16\n\t"
  13741. #else
  13742. "lsr r6, r5, #16\n\t"
  13743. #endif
  13744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13745. "lsls r5, r5, #16\n\t"
  13746. #else
  13747. "lsl r5, r5, #16\n\t"
  13748. #endif
  13749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13750. "adds r3, r3, r5\n\t"
  13751. #else
  13752. "add r3, r3, r5\n\t"
  13753. #endif
  13754. #ifdef WOLFSSL_KEIL
  13755. "adcs r4, r4, r6\n\t"
  13756. #elif defined(__clang__)
  13757. "adcs r4, r6\n\t"
  13758. #else
  13759. "adc r4, r6\n\t"
  13760. #endif
  13761. #ifdef WOLFSSL_KEIL
  13762. "adcs r2, r2, %[r]\n\t"
  13763. #elif defined(__clang__)
  13764. "adcs r2, %[r]\n\t"
  13765. #else
  13766. "adc r2, %[r]\n\t"
  13767. #endif
  13768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13769. "adds r3, r3, r5\n\t"
  13770. #else
  13771. "add r3, r3, r5\n\t"
  13772. #endif
  13773. #ifdef WOLFSSL_KEIL
  13774. "adcs r4, r4, r6\n\t"
  13775. #elif defined(__clang__)
  13776. "adcs r4, r6\n\t"
  13777. #else
  13778. "adc r4, r6\n\t"
  13779. #endif
  13780. #ifdef WOLFSSL_KEIL
  13781. "adcs r2, r2, %[r]\n\t"
  13782. #elif defined(__clang__)
  13783. "adcs r2, %[r]\n\t"
  13784. #else
  13785. "adc r2, %[r]\n\t"
  13786. #endif
  13787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13788. "lsrs r5, %[a], #16\n\t"
  13789. #else
  13790. "lsr r5, %[a], #16\n\t"
  13791. #endif
  13792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13793. "lsrs r6, r7, #16\n\t"
  13794. #else
  13795. "lsr r6, r7, #16\n\t"
  13796. #endif
  13797. #ifdef WOLFSSL_KEIL
  13798. "muls r6, r5, r6\n\t"
  13799. #elif defined(__clang__)
  13800. "muls r6, r5\n\t"
  13801. #else
  13802. "mul r6, r5\n\t"
  13803. #endif
  13804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13805. "adds r4, r4, r6\n\t"
  13806. #else
  13807. "add r4, r4, r6\n\t"
  13808. #endif
  13809. #ifdef WOLFSSL_KEIL
  13810. "adcs r2, r2, %[r]\n\t"
  13811. #elif defined(__clang__)
  13812. "adcs r2, %[r]\n\t"
  13813. #else
  13814. "adc r2, %[r]\n\t"
  13815. #endif
  13816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13817. "adds r4, r4, r6\n\t"
  13818. #else
  13819. "add r4, r4, r6\n\t"
  13820. #endif
  13821. #ifdef WOLFSSL_KEIL
  13822. "adcs r2, r2, %[r]\n\t"
  13823. #elif defined(__clang__)
  13824. "adcs r2, %[r]\n\t"
  13825. #else
  13826. "adc r2, %[r]\n\t"
  13827. #endif
  13828. "uxth r6, r7\n\t"
  13829. #ifdef WOLFSSL_KEIL
  13830. "muls r5, r6, r5\n\t"
  13831. #elif defined(__clang__)
  13832. "muls r5, r6\n\t"
  13833. #else
  13834. "mul r5, r6\n\t"
  13835. #endif
  13836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13837. "lsrs r6, r5, #16\n\t"
  13838. #else
  13839. "lsr r6, r5, #16\n\t"
  13840. #endif
  13841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13842. "lsls r5, r5, #16\n\t"
  13843. #else
  13844. "lsl r5, r5, #16\n\t"
  13845. #endif
  13846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13847. "adds r3, r3, r5\n\t"
  13848. #else
  13849. "add r3, r3, r5\n\t"
  13850. #endif
  13851. #ifdef WOLFSSL_KEIL
  13852. "adcs r4, r4, r6\n\t"
  13853. #elif defined(__clang__)
  13854. "adcs r4, r6\n\t"
  13855. #else
  13856. "adc r4, r6\n\t"
  13857. #endif
  13858. #ifdef WOLFSSL_KEIL
  13859. "adcs r2, r2, %[r]\n\t"
  13860. #elif defined(__clang__)
  13861. "adcs r2, %[r]\n\t"
  13862. #else
  13863. "adc r2, %[r]\n\t"
  13864. #endif
  13865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13866. "adds r3, r3, r5\n\t"
  13867. #else
  13868. "add r3, r3, r5\n\t"
  13869. #endif
  13870. #ifdef WOLFSSL_KEIL
  13871. "adcs r4, r4, r6\n\t"
  13872. #elif defined(__clang__)
  13873. "adcs r4, r6\n\t"
  13874. #else
  13875. "adc r4, r6\n\t"
  13876. #endif
  13877. #ifdef WOLFSSL_KEIL
  13878. "adcs r2, r2, %[r]\n\t"
  13879. #elif defined(__clang__)
  13880. "adcs r2, %[r]\n\t"
  13881. #else
  13882. "adc r2, %[r]\n\t"
  13883. #endif
  13884. "# A[3] * A[1]\n\t"
  13885. "mov %[a], r9\n\t"
  13886. "mov r7, r11\n\t"
  13887. "mov %[a], lr\n\t"
  13888. "uxth r5, %[a]\n\t"
  13889. "uxth r6, r7\n\t"
  13890. #ifdef WOLFSSL_KEIL
  13891. "muls r6, r5, r6\n\t"
  13892. #elif defined(__clang__)
  13893. "muls r6, r5\n\t"
  13894. #else
  13895. "mul r6, r5\n\t"
  13896. #endif
  13897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13898. "adds r3, r3, r6\n\t"
  13899. #else
  13900. "add r3, r3, r6\n\t"
  13901. #endif
  13902. #ifdef WOLFSSL_KEIL
  13903. "adcs r4, r4, %[r]\n\t"
  13904. #elif defined(__clang__)
  13905. "adcs r4, %[r]\n\t"
  13906. #else
  13907. "adc r4, %[r]\n\t"
  13908. #endif
  13909. #ifdef WOLFSSL_KEIL
  13910. "adcs r2, r2, %[r]\n\t"
  13911. #elif defined(__clang__)
  13912. "adcs r2, %[r]\n\t"
  13913. #else
  13914. "adc r2, %[r]\n\t"
  13915. #endif
  13916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13917. "adds r3, r3, r6\n\t"
  13918. #else
  13919. "add r3, r3, r6\n\t"
  13920. #endif
  13921. #ifdef WOLFSSL_KEIL
  13922. "adcs r4, r4, %[r]\n\t"
  13923. #elif defined(__clang__)
  13924. "adcs r4, %[r]\n\t"
  13925. #else
  13926. "adc r4, %[r]\n\t"
  13927. #endif
  13928. #ifdef WOLFSSL_KEIL
  13929. "adcs r2, r2, %[r]\n\t"
  13930. #elif defined(__clang__)
  13931. "adcs r2, %[r]\n\t"
  13932. #else
  13933. "adc r2, %[r]\n\t"
  13934. #endif
  13935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13936. "lsrs r6, r7, #16\n\t"
  13937. #else
  13938. "lsr r6, r7, #16\n\t"
  13939. #endif
  13940. #ifdef WOLFSSL_KEIL
  13941. "muls r5, r6, r5\n\t"
  13942. #elif defined(__clang__)
  13943. "muls r5, r6\n\t"
  13944. #else
  13945. "mul r5, r6\n\t"
  13946. #endif
  13947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13948. "lsrs r6, r5, #16\n\t"
  13949. #else
  13950. "lsr r6, r5, #16\n\t"
  13951. #endif
  13952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13953. "lsls r5, r5, #16\n\t"
  13954. #else
  13955. "lsl r5, r5, #16\n\t"
  13956. #endif
  13957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13958. "adds r3, r3, r5\n\t"
  13959. #else
  13960. "add r3, r3, r5\n\t"
  13961. #endif
  13962. #ifdef WOLFSSL_KEIL
  13963. "adcs r4, r4, r6\n\t"
  13964. #elif defined(__clang__)
  13965. "adcs r4, r6\n\t"
  13966. #else
  13967. "adc r4, r6\n\t"
  13968. #endif
  13969. #ifdef WOLFSSL_KEIL
  13970. "adcs r2, r2, %[r]\n\t"
  13971. #elif defined(__clang__)
  13972. "adcs r2, %[r]\n\t"
  13973. #else
  13974. "adc r2, %[r]\n\t"
  13975. #endif
  13976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13977. "adds r3, r3, r5\n\t"
  13978. #else
  13979. "add r3, r3, r5\n\t"
  13980. #endif
  13981. #ifdef WOLFSSL_KEIL
  13982. "adcs r4, r4, r6\n\t"
  13983. #elif defined(__clang__)
  13984. "adcs r4, r6\n\t"
  13985. #else
  13986. "adc r4, r6\n\t"
  13987. #endif
  13988. #ifdef WOLFSSL_KEIL
  13989. "adcs r2, r2, %[r]\n\t"
  13990. #elif defined(__clang__)
  13991. "adcs r2, %[r]\n\t"
  13992. #else
  13993. "adc r2, %[r]\n\t"
  13994. #endif
  13995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  13996. "lsrs r5, %[a], #16\n\t"
  13997. #else
  13998. "lsr r5, %[a], #16\n\t"
  13999. #endif
  14000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14001. "lsrs r6, r7, #16\n\t"
  14002. #else
  14003. "lsr r6, r7, #16\n\t"
  14004. #endif
  14005. #ifdef WOLFSSL_KEIL
  14006. "muls r6, r5, r6\n\t"
  14007. #elif defined(__clang__)
  14008. "muls r6, r5\n\t"
  14009. #else
  14010. "mul r6, r5\n\t"
  14011. #endif
  14012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14013. "adds r4, r4, r6\n\t"
  14014. #else
  14015. "add r4, r4, r6\n\t"
  14016. #endif
  14017. #ifdef WOLFSSL_KEIL
  14018. "adcs r2, r2, %[r]\n\t"
  14019. #elif defined(__clang__)
  14020. "adcs r2, %[r]\n\t"
  14021. #else
  14022. "adc r2, %[r]\n\t"
  14023. #endif
  14024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14025. "adds r4, r4, r6\n\t"
  14026. #else
  14027. "add r4, r4, r6\n\t"
  14028. #endif
  14029. #ifdef WOLFSSL_KEIL
  14030. "adcs r2, r2, %[r]\n\t"
  14031. #elif defined(__clang__)
  14032. "adcs r2, %[r]\n\t"
  14033. #else
  14034. "adc r2, %[r]\n\t"
  14035. #endif
  14036. "uxth r6, r7\n\t"
  14037. #ifdef WOLFSSL_KEIL
  14038. "muls r5, r6, r5\n\t"
  14039. #elif defined(__clang__)
  14040. "muls r5, r6\n\t"
  14041. #else
  14042. "mul r5, r6\n\t"
  14043. #endif
  14044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14045. "lsrs r6, r5, #16\n\t"
  14046. #else
  14047. "lsr r6, r5, #16\n\t"
  14048. #endif
  14049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14050. "lsls r5, r5, #16\n\t"
  14051. #else
  14052. "lsl r5, r5, #16\n\t"
  14053. #endif
  14054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14055. "adds r3, r3, r5\n\t"
  14056. #else
  14057. "add r3, r3, r5\n\t"
  14058. #endif
  14059. #ifdef WOLFSSL_KEIL
  14060. "adcs r4, r4, r6\n\t"
  14061. #elif defined(__clang__)
  14062. "adcs r4, r6\n\t"
  14063. #else
  14064. "adc r4, r6\n\t"
  14065. #endif
  14066. #ifdef WOLFSSL_KEIL
  14067. "adcs r2, r2, %[r]\n\t"
  14068. #elif defined(__clang__)
  14069. "adcs r2, %[r]\n\t"
  14070. #else
  14071. "adc r2, %[r]\n\t"
  14072. #endif
  14073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14074. "adds r3, r3, r5\n\t"
  14075. #else
  14076. "add r3, r3, r5\n\t"
  14077. #endif
  14078. #ifdef WOLFSSL_KEIL
  14079. "adcs r4, r4, r6\n\t"
  14080. #elif defined(__clang__)
  14081. "adcs r4, r6\n\t"
  14082. #else
  14083. "adc r4, r6\n\t"
  14084. #endif
  14085. #ifdef WOLFSSL_KEIL
  14086. "adcs r2, r2, %[r]\n\t"
  14087. #elif defined(__clang__)
  14088. "adcs r2, %[r]\n\t"
  14089. #else
  14090. "adc r2, %[r]\n\t"
  14091. #endif
  14092. "# A[2] * A[2]\n\t"
  14093. "mov r7, r12\n\t"
  14094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14095. "lsrs r6, r7, #16\n\t"
  14096. #else
  14097. "lsr r6, r7, #16\n\t"
  14098. #endif
  14099. "uxth r5, r7\n\t"
  14100. #ifdef WOLFSSL_KEIL
  14101. "muls r5, r5, r5\n\t"
  14102. #elif defined(__clang__)
  14103. "muls r5, r5\n\t"
  14104. #else
  14105. "mul r5, r5\n\t"
  14106. #endif
  14107. #ifdef WOLFSSL_KEIL
  14108. "muls r6, r6, r6\n\t"
  14109. #elif defined(__clang__)
  14110. "muls r6, r6\n\t"
  14111. #else
  14112. "mul r6, r6\n\t"
  14113. #endif
  14114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14115. "adds r3, r3, r5\n\t"
  14116. #else
  14117. "add r3, r3, r5\n\t"
  14118. #endif
  14119. #ifdef WOLFSSL_KEIL
  14120. "adcs r4, r4, r6\n\t"
  14121. #elif defined(__clang__)
  14122. "adcs r4, r6\n\t"
  14123. #else
  14124. "adc r4, r6\n\t"
  14125. #endif
  14126. #ifdef WOLFSSL_KEIL
  14127. "adcs r2, r2, %[r]\n\t"
  14128. #elif defined(__clang__)
  14129. "adcs r2, %[r]\n\t"
  14130. #else
  14131. "adc r2, %[r]\n\t"
  14132. #endif
  14133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14134. "lsrs r6, r7, #16\n\t"
  14135. #else
  14136. "lsr r6, r7, #16\n\t"
  14137. #endif
  14138. "uxth r5, r7\n\t"
  14139. #ifdef WOLFSSL_KEIL
  14140. "muls r5, r6, r5\n\t"
  14141. #elif defined(__clang__)
  14142. "muls r5, r6\n\t"
  14143. #else
  14144. "mul r5, r6\n\t"
  14145. #endif
  14146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14147. "lsrs r6, r5, #15\n\t"
  14148. #else
  14149. "lsr r6, r5, #15\n\t"
  14150. #endif
  14151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14152. "lsls r5, r5, #17\n\t"
  14153. #else
  14154. "lsl r5, r5, #17\n\t"
  14155. #endif
  14156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14157. "adds r3, r3, r5\n\t"
  14158. #else
  14159. "add r3, r3, r5\n\t"
  14160. #endif
  14161. #ifdef WOLFSSL_KEIL
  14162. "adcs r4, r4, r6\n\t"
  14163. #elif defined(__clang__)
  14164. "adcs r4, r6\n\t"
  14165. #else
  14166. "adc r4, r6\n\t"
  14167. #endif
  14168. #ifdef WOLFSSL_KEIL
  14169. "adcs r2, r2, %[r]\n\t"
  14170. #elif defined(__clang__)
  14171. "adcs r2, %[r]\n\t"
  14172. #else
  14173. "adc r2, %[r]\n\t"
  14174. #endif
  14175. "str r3, [sp, #16]\n\t"
  14176. "# A[3] * A[2]\n\t"
  14177. "movs r3, #0\n\t"
  14178. "mov %[a], r9\n\t"
  14179. "mov %[a], lr\n\t"
  14180. "uxth r5, %[a]\n\t"
  14181. "uxth r6, r7\n\t"
  14182. #ifdef WOLFSSL_KEIL
  14183. "muls r6, r5, r6\n\t"
  14184. #elif defined(__clang__)
  14185. "muls r6, r5\n\t"
  14186. #else
  14187. "mul r6, r5\n\t"
  14188. #endif
  14189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14190. "adds r4, r4, r6\n\t"
  14191. #else
  14192. "add r4, r4, r6\n\t"
  14193. #endif
  14194. #ifdef WOLFSSL_KEIL
  14195. "adcs r2, r2, %[r]\n\t"
  14196. #elif defined(__clang__)
  14197. "adcs r2, %[r]\n\t"
  14198. #else
  14199. "adc r2, %[r]\n\t"
  14200. #endif
  14201. #ifdef WOLFSSL_KEIL
  14202. "adcs r3, r3, %[r]\n\t"
  14203. #elif defined(__clang__)
  14204. "adcs r3, %[r]\n\t"
  14205. #else
  14206. "adc r3, %[r]\n\t"
  14207. #endif
  14208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14209. "adds r4, r4, r6\n\t"
  14210. #else
  14211. "add r4, r4, r6\n\t"
  14212. #endif
  14213. #ifdef WOLFSSL_KEIL
  14214. "adcs r2, r2, %[r]\n\t"
  14215. #elif defined(__clang__)
  14216. "adcs r2, %[r]\n\t"
  14217. #else
  14218. "adc r2, %[r]\n\t"
  14219. #endif
  14220. #ifdef WOLFSSL_KEIL
  14221. "adcs r3, r3, %[r]\n\t"
  14222. #elif defined(__clang__)
  14223. "adcs r3, %[r]\n\t"
  14224. #else
  14225. "adc r3, %[r]\n\t"
  14226. #endif
  14227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14228. "lsrs r6, r7, #16\n\t"
  14229. #else
  14230. "lsr r6, r7, #16\n\t"
  14231. #endif
  14232. #ifdef WOLFSSL_KEIL
  14233. "muls r5, r6, r5\n\t"
  14234. #elif defined(__clang__)
  14235. "muls r5, r6\n\t"
  14236. #else
  14237. "mul r5, r6\n\t"
  14238. #endif
  14239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14240. "lsrs r6, r5, #16\n\t"
  14241. #else
  14242. "lsr r6, r5, #16\n\t"
  14243. #endif
  14244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14245. "lsls r5, r5, #16\n\t"
  14246. #else
  14247. "lsl r5, r5, #16\n\t"
  14248. #endif
  14249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14250. "adds r4, r4, r5\n\t"
  14251. #else
  14252. "add r4, r4, r5\n\t"
  14253. #endif
  14254. #ifdef WOLFSSL_KEIL
  14255. "adcs r2, r2, r6\n\t"
  14256. #elif defined(__clang__)
  14257. "adcs r2, r6\n\t"
  14258. #else
  14259. "adc r2, r6\n\t"
  14260. #endif
  14261. #ifdef WOLFSSL_KEIL
  14262. "adcs r3, r3, %[r]\n\t"
  14263. #elif defined(__clang__)
  14264. "adcs r3, %[r]\n\t"
  14265. #else
  14266. "adc r3, %[r]\n\t"
  14267. #endif
  14268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14269. "adds r4, r4, r5\n\t"
  14270. #else
  14271. "add r4, r4, r5\n\t"
  14272. #endif
  14273. #ifdef WOLFSSL_KEIL
  14274. "adcs r2, r2, r6\n\t"
  14275. #elif defined(__clang__)
  14276. "adcs r2, r6\n\t"
  14277. #else
  14278. "adc r2, r6\n\t"
  14279. #endif
  14280. #ifdef WOLFSSL_KEIL
  14281. "adcs r3, r3, %[r]\n\t"
  14282. #elif defined(__clang__)
  14283. "adcs r3, %[r]\n\t"
  14284. #else
  14285. "adc r3, %[r]\n\t"
  14286. #endif
  14287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14288. "lsrs r5, %[a], #16\n\t"
  14289. #else
  14290. "lsr r5, %[a], #16\n\t"
  14291. #endif
  14292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14293. "lsrs r6, r7, #16\n\t"
  14294. #else
  14295. "lsr r6, r7, #16\n\t"
  14296. #endif
  14297. #ifdef WOLFSSL_KEIL
  14298. "muls r6, r5, r6\n\t"
  14299. #elif defined(__clang__)
  14300. "muls r6, r5\n\t"
  14301. #else
  14302. "mul r6, r5\n\t"
  14303. #endif
  14304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14305. "adds r2, r2, r6\n\t"
  14306. #else
  14307. "add r2, r2, r6\n\t"
  14308. #endif
  14309. #ifdef WOLFSSL_KEIL
  14310. "adcs r3, r3, %[r]\n\t"
  14311. #elif defined(__clang__)
  14312. "adcs r3, %[r]\n\t"
  14313. #else
  14314. "adc r3, %[r]\n\t"
  14315. #endif
  14316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14317. "adds r2, r2, r6\n\t"
  14318. #else
  14319. "add r2, r2, r6\n\t"
  14320. #endif
  14321. #ifdef WOLFSSL_KEIL
  14322. "adcs r3, r3, %[r]\n\t"
  14323. #elif defined(__clang__)
  14324. "adcs r3, %[r]\n\t"
  14325. #else
  14326. "adc r3, %[r]\n\t"
  14327. #endif
  14328. "uxth r6, r7\n\t"
  14329. #ifdef WOLFSSL_KEIL
  14330. "muls r5, r6, r5\n\t"
  14331. #elif defined(__clang__)
  14332. "muls r5, r6\n\t"
  14333. #else
  14334. "mul r5, r6\n\t"
  14335. #endif
  14336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14337. "lsrs r6, r5, #16\n\t"
  14338. #else
  14339. "lsr r6, r5, #16\n\t"
  14340. #endif
  14341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14342. "lsls r5, r5, #16\n\t"
  14343. #else
  14344. "lsl r5, r5, #16\n\t"
  14345. #endif
  14346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14347. "adds r4, r4, r5\n\t"
  14348. #else
  14349. "add r4, r4, r5\n\t"
  14350. #endif
  14351. #ifdef WOLFSSL_KEIL
  14352. "adcs r2, r2, r6\n\t"
  14353. #elif defined(__clang__)
  14354. "adcs r2, r6\n\t"
  14355. #else
  14356. "adc r2, r6\n\t"
  14357. #endif
  14358. #ifdef WOLFSSL_KEIL
  14359. "adcs r3, r3, %[r]\n\t"
  14360. #elif defined(__clang__)
  14361. "adcs r3, %[r]\n\t"
  14362. #else
  14363. "adc r3, %[r]\n\t"
  14364. #endif
  14365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14366. "adds r4, r4, r5\n\t"
  14367. #else
  14368. "add r4, r4, r5\n\t"
  14369. #endif
  14370. #ifdef WOLFSSL_KEIL
  14371. "adcs r2, r2, r6\n\t"
  14372. #elif defined(__clang__)
  14373. "adcs r2, r6\n\t"
  14374. #else
  14375. "adc r2, r6\n\t"
  14376. #endif
  14377. #ifdef WOLFSSL_KEIL
  14378. "adcs r3, r3, %[r]\n\t"
  14379. #elif defined(__clang__)
  14380. "adcs r3, %[r]\n\t"
  14381. #else
  14382. "adc r3, %[r]\n\t"
  14383. #endif
  14384. "# A[4] * A[1]\n\t"
  14385. "mov %[a], r9\n\t"
  14386. "mov r7, r11\n\t"
  14387. "ldr %[a], [%[a], #16]\n\t"
  14388. "uxth r5, %[a]\n\t"
  14389. "uxth r6, r7\n\t"
  14390. #ifdef WOLFSSL_KEIL
  14391. "muls r6, r5, r6\n\t"
  14392. #elif defined(__clang__)
  14393. "muls r6, r5\n\t"
  14394. #else
  14395. "mul r6, r5\n\t"
  14396. #endif
  14397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14398. "adds r4, r4, r6\n\t"
  14399. #else
  14400. "add r4, r4, r6\n\t"
  14401. #endif
  14402. #ifdef WOLFSSL_KEIL
  14403. "adcs r2, r2, %[r]\n\t"
  14404. #elif defined(__clang__)
  14405. "adcs r2, %[r]\n\t"
  14406. #else
  14407. "adc r2, %[r]\n\t"
  14408. #endif
  14409. #ifdef WOLFSSL_KEIL
  14410. "adcs r3, r3, %[r]\n\t"
  14411. #elif defined(__clang__)
  14412. "adcs r3, %[r]\n\t"
  14413. #else
  14414. "adc r3, %[r]\n\t"
  14415. #endif
  14416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14417. "adds r4, r4, r6\n\t"
  14418. #else
  14419. "add r4, r4, r6\n\t"
  14420. #endif
  14421. #ifdef WOLFSSL_KEIL
  14422. "adcs r2, r2, %[r]\n\t"
  14423. #elif defined(__clang__)
  14424. "adcs r2, %[r]\n\t"
  14425. #else
  14426. "adc r2, %[r]\n\t"
  14427. #endif
  14428. #ifdef WOLFSSL_KEIL
  14429. "adcs r3, r3, %[r]\n\t"
  14430. #elif defined(__clang__)
  14431. "adcs r3, %[r]\n\t"
  14432. #else
  14433. "adc r3, %[r]\n\t"
  14434. #endif
  14435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14436. "lsrs r6, r7, #16\n\t"
  14437. #else
  14438. "lsr r6, r7, #16\n\t"
  14439. #endif
  14440. #ifdef WOLFSSL_KEIL
  14441. "muls r5, r6, r5\n\t"
  14442. #elif defined(__clang__)
  14443. "muls r5, r6\n\t"
  14444. #else
  14445. "mul r5, r6\n\t"
  14446. #endif
  14447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14448. "lsrs r6, r5, #16\n\t"
  14449. #else
  14450. "lsr r6, r5, #16\n\t"
  14451. #endif
  14452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14453. "lsls r5, r5, #16\n\t"
  14454. #else
  14455. "lsl r5, r5, #16\n\t"
  14456. #endif
  14457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14458. "adds r4, r4, r5\n\t"
  14459. #else
  14460. "add r4, r4, r5\n\t"
  14461. #endif
  14462. #ifdef WOLFSSL_KEIL
  14463. "adcs r2, r2, r6\n\t"
  14464. #elif defined(__clang__)
  14465. "adcs r2, r6\n\t"
  14466. #else
  14467. "adc r2, r6\n\t"
  14468. #endif
  14469. #ifdef WOLFSSL_KEIL
  14470. "adcs r3, r3, %[r]\n\t"
  14471. #elif defined(__clang__)
  14472. "adcs r3, %[r]\n\t"
  14473. #else
  14474. "adc r3, %[r]\n\t"
  14475. #endif
  14476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14477. "adds r4, r4, r5\n\t"
  14478. #else
  14479. "add r4, r4, r5\n\t"
  14480. #endif
  14481. #ifdef WOLFSSL_KEIL
  14482. "adcs r2, r2, r6\n\t"
  14483. #elif defined(__clang__)
  14484. "adcs r2, r6\n\t"
  14485. #else
  14486. "adc r2, r6\n\t"
  14487. #endif
  14488. #ifdef WOLFSSL_KEIL
  14489. "adcs r3, r3, %[r]\n\t"
  14490. #elif defined(__clang__)
  14491. "adcs r3, %[r]\n\t"
  14492. #else
  14493. "adc r3, %[r]\n\t"
  14494. #endif
  14495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14496. "lsrs r5, %[a], #16\n\t"
  14497. #else
  14498. "lsr r5, %[a], #16\n\t"
  14499. #endif
  14500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14501. "lsrs r6, r7, #16\n\t"
  14502. #else
  14503. "lsr r6, r7, #16\n\t"
  14504. #endif
  14505. #ifdef WOLFSSL_KEIL
  14506. "muls r6, r5, r6\n\t"
  14507. #elif defined(__clang__)
  14508. "muls r6, r5\n\t"
  14509. #else
  14510. "mul r6, r5\n\t"
  14511. #endif
  14512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14513. "adds r2, r2, r6\n\t"
  14514. #else
  14515. "add r2, r2, r6\n\t"
  14516. #endif
  14517. #ifdef WOLFSSL_KEIL
  14518. "adcs r3, r3, %[r]\n\t"
  14519. #elif defined(__clang__)
  14520. "adcs r3, %[r]\n\t"
  14521. #else
  14522. "adc r3, %[r]\n\t"
  14523. #endif
  14524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14525. "adds r2, r2, r6\n\t"
  14526. #else
  14527. "add r2, r2, r6\n\t"
  14528. #endif
  14529. #ifdef WOLFSSL_KEIL
  14530. "adcs r3, r3, %[r]\n\t"
  14531. #elif defined(__clang__)
  14532. "adcs r3, %[r]\n\t"
  14533. #else
  14534. "adc r3, %[r]\n\t"
  14535. #endif
  14536. "uxth r6, r7\n\t"
  14537. #ifdef WOLFSSL_KEIL
  14538. "muls r5, r6, r5\n\t"
  14539. #elif defined(__clang__)
  14540. "muls r5, r6\n\t"
  14541. #else
  14542. "mul r5, r6\n\t"
  14543. #endif
  14544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14545. "lsrs r6, r5, #16\n\t"
  14546. #else
  14547. "lsr r6, r5, #16\n\t"
  14548. #endif
  14549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14550. "lsls r5, r5, #16\n\t"
  14551. #else
  14552. "lsl r5, r5, #16\n\t"
  14553. #endif
  14554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14555. "adds r4, r4, r5\n\t"
  14556. #else
  14557. "add r4, r4, r5\n\t"
  14558. #endif
  14559. #ifdef WOLFSSL_KEIL
  14560. "adcs r2, r2, r6\n\t"
  14561. #elif defined(__clang__)
  14562. "adcs r2, r6\n\t"
  14563. #else
  14564. "adc r2, r6\n\t"
  14565. #endif
  14566. #ifdef WOLFSSL_KEIL
  14567. "adcs r3, r3, %[r]\n\t"
  14568. #elif defined(__clang__)
  14569. "adcs r3, %[r]\n\t"
  14570. #else
  14571. "adc r3, %[r]\n\t"
  14572. #endif
  14573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14574. "adds r4, r4, r5\n\t"
  14575. #else
  14576. "add r4, r4, r5\n\t"
  14577. #endif
  14578. #ifdef WOLFSSL_KEIL
  14579. "adcs r2, r2, r6\n\t"
  14580. #elif defined(__clang__)
  14581. "adcs r2, r6\n\t"
  14582. #else
  14583. "adc r2, r6\n\t"
  14584. #endif
  14585. #ifdef WOLFSSL_KEIL
  14586. "adcs r3, r3, %[r]\n\t"
  14587. #elif defined(__clang__)
  14588. "adcs r3, %[r]\n\t"
  14589. #else
  14590. "adc r3, %[r]\n\t"
  14591. #endif
  14592. "# A[5] * A[0]\n\t"
  14593. "mov %[a], r9\n\t"
  14594. "mov r7, r10\n\t"
  14595. "ldr %[a], [%[a], #20]\n\t"
  14596. "uxth r5, %[a]\n\t"
  14597. "uxth r6, r7\n\t"
  14598. #ifdef WOLFSSL_KEIL
  14599. "muls r6, r5, r6\n\t"
  14600. #elif defined(__clang__)
  14601. "muls r6, r5\n\t"
  14602. #else
  14603. "mul r6, r5\n\t"
  14604. #endif
  14605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14606. "adds r4, r4, r6\n\t"
  14607. #else
  14608. "add r4, r4, r6\n\t"
  14609. #endif
  14610. #ifdef WOLFSSL_KEIL
  14611. "adcs r2, r2, %[r]\n\t"
  14612. #elif defined(__clang__)
  14613. "adcs r2, %[r]\n\t"
  14614. #else
  14615. "adc r2, %[r]\n\t"
  14616. #endif
  14617. #ifdef WOLFSSL_KEIL
  14618. "adcs r3, r3, %[r]\n\t"
  14619. #elif defined(__clang__)
  14620. "adcs r3, %[r]\n\t"
  14621. #else
  14622. "adc r3, %[r]\n\t"
  14623. #endif
  14624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14625. "adds r4, r4, r6\n\t"
  14626. #else
  14627. "add r4, r4, r6\n\t"
  14628. #endif
  14629. #ifdef WOLFSSL_KEIL
  14630. "adcs r2, r2, %[r]\n\t"
  14631. #elif defined(__clang__)
  14632. "adcs r2, %[r]\n\t"
  14633. #else
  14634. "adc r2, %[r]\n\t"
  14635. #endif
  14636. #ifdef WOLFSSL_KEIL
  14637. "adcs r3, r3, %[r]\n\t"
  14638. #elif defined(__clang__)
  14639. "adcs r3, %[r]\n\t"
  14640. #else
  14641. "adc r3, %[r]\n\t"
  14642. #endif
  14643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14644. "lsrs r6, r7, #16\n\t"
  14645. #else
  14646. "lsr r6, r7, #16\n\t"
  14647. #endif
  14648. #ifdef WOLFSSL_KEIL
  14649. "muls r5, r6, r5\n\t"
  14650. #elif defined(__clang__)
  14651. "muls r5, r6\n\t"
  14652. #else
  14653. "mul r5, r6\n\t"
  14654. #endif
  14655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14656. "lsrs r6, r5, #16\n\t"
  14657. #else
  14658. "lsr r6, r5, #16\n\t"
  14659. #endif
  14660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14661. "lsls r5, r5, #16\n\t"
  14662. #else
  14663. "lsl r5, r5, #16\n\t"
  14664. #endif
  14665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14666. "adds r4, r4, r5\n\t"
  14667. #else
  14668. "add r4, r4, r5\n\t"
  14669. #endif
  14670. #ifdef WOLFSSL_KEIL
  14671. "adcs r2, r2, r6\n\t"
  14672. #elif defined(__clang__)
  14673. "adcs r2, r6\n\t"
  14674. #else
  14675. "adc r2, r6\n\t"
  14676. #endif
  14677. #ifdef WOLFSSL_KEIL
  14678. "adcs r3, r3, %[r]\n\t"
  14679. #elif defined(__clang__)
  14680. "adcs r3, %[r]\n\t"
  14681. #else
  14682. "adc r3, %[r]\n\t"
  14683. #endif
  14684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14685. "adds r4, r4, r5\n\t"
  14686. #else
  14687. "add r4, r4, r5\n\t"
  14688. #endif
  14689. #ifdef WOLFSSL_KEIL
  14690. "adcs r2, r2, r6\n\t"
  14691. #elif defined(__clang__)
  14692. "adcs r2, r6\n\t"
  14693. #else
  14694. "adc r2, r6\n\t"
  14695. #endif
  14696. #ifdef WOLFSSL_KEIL
  14697. "adcs r3, r3, %[r]\n\t"
  14698. #elif defined(__clang__)
  14699. "adcs r3, %[r]\n\t"
  14700. #else
  14701. "adc r3, %[r]\n\t"
  14702. #endif
  14703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14704. "lsrs r5, %[a], #16\n\t"
  14705. #else
  14706. "lsr r5, %[a], #16\n\t"
  14707. #endif
  14708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14709. "lsrs r6, r7, #16\n\t"
  14710. #else
  14711. "lsr r6, r7, #16\n\t"
  14712. #endif
  14713. #ifdef WOLFSSL_KEIL
  14714. "muls r6, r5, r6\n\t"
  14715. #elif defined(__clang__)
  14716. "muls r6, r5\n\t"
  14717. #else
  14718. "mul r6, r5\n\t"
  14719. #endif
  14720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14721. "adds r2, r2, r6\n\t"
  14722. #else
  14723. "add r2, r2, r6\n\t"
  14724. #endif
  14725. #ifdef WOLFSSL_KEIL
  14726. "adcs r3, r3, %[r]\n\t"
  14727. #elif defined(__clang__)
  14728. "adcs r3, %[r]\n\t"
  14729. #else
  14730. "adc r3, %[r]\n\t"
  14731. #endif
  14732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14733. "adds r2, r2, r6\n\t"
  14734. #else
  14735. "add r2, r2, r6\n\t"
  14736. #endif
  14737. #ifdef WOLFSSL_KEIL
  14738. "adcs r3, r3, %[r]\n\t"
  14739. #elif defined(__clang__)
  14740. "adcs r3, %[r]\n\t"
  14741. #else
  14742. "adc r3, %[r]\n\t"
  14743. #endif
  14744. "uxth r6, r7\n\t"
  14745. #ifdef WOLFSSL_KEIL
  14746. "muls r5, r6, r5\n\t"
  14747. #elif defined(__clang__)
  14748. "muls r5, r6\n\t"
  14749. #else
  14750. "mul r5, r6\n\t"
  14751. #endif
  14752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14753. "lsrs r6, r5, #16\n\t"
  14754. #else
  14755. "lsr r6, r5, #16\n\t"
  14756. #endif
  14757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14758. "lsls r5, r5, #16\n\t"
  14759. #else
  14760. "lsl r5, r5, #16\n\t"
  14761. #endif
  14762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14763. "adds r4, r4, r5\n\t"
  14764. #else
  14765. "add r4, r4, r5\n\t"
  14766. #endif
  14767. #ifdef WOLFSSL_KEIL
  14768. "adcs r2, r2, r6\n\t"
  14769. #elif defined(__clang__)
  14770. "adcs r2, r6\n\t"
  14771. #else
  14772. "adc r2, r6\n\t"
  14773. #endif
  14774. #ifdef WOLFSSL_KEIL
  14775. "adcs r3, r3, %[r]\n\t"
  14776. #elif defined(__clang__)
  14777. "adcs r3, %[r]\n\t"
  14778. #else
  14779. "adc r3, %[r]\n\t"
  14780. #endif
  14781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14782. "adds r4, r4, r5\n\t"
  14783. #else
  14784. "add r4, r4, r5\n\t"
  14785. #endif
  14786. #ifdef WOLFSSL_KEIL
  14787. "adcs r2, r2, r6\n\t"
  14788. #elif defined(__clang__)
  14789. "adcs r2, r6\n\t"
  14790. #else
  14791. "adc r2, r6\n\t"
  14792. #endif
  14793. #ifdef WOLFSSL_KEIL
  14794. "adcs r3, r3, %[r]\n\t"
  14795. #elif defined(__clang__)
  14796. "adcs r3, %[r]\n\t"
  14797. #else
  14798. "adc r3, %[r]\n\t"
  14799. #endif
  14800. "str r4, [sp, #20]\n\t"
  14801. "# A[6] * A[0]\n\t"
  14802. "movs r4, #0\n\t"
  14803. "mov %[a], r9\n\t"
  14804. "ldr %[a], [%[a], #24]\n\t"
  14805. "uxth r5, %[a]\n\t"
  14806. "uxth r6, r7\n\t"
  14807. #ifdef WOLFSSL_KEIL
  14808. "muls r6, r5, r6\n\t"
  14809. #elif defined(__clang__)
  14810. "muls r6, r5\n\t"
  14811. #else
  14812. "mul r6, r5\n\t"
  14813. #endif
  14814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14815. "adds r2, r2, r6\n\t"
  14816. #else
  14817. "add r2, r2, r6\n\t"
  14818. #endif
  14819. #ifdef WOLFSSL_KEIL
  14820. "adcs r3, r3, %[r]\n\t"
  14821. #elif defined(__clang__)
  14822. "adcs r3, %[r]\n\t"
  14823. #else
  14824. "adc r3, %[r]\n\t"
  14825. #endif
  14826. #ifdef WOLFSSL_KEIL
  14827. "adcs r4, r4, %[r]\n\t"
  14828. #elif defined(__clang__)
  14829. "adcs r4, %[r]\n\t"
  14830. #else
  14831. "adc r4, %[r]\n\t"
  14832. #endif
  14833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14834. "adds r2, r2, r6\n\t"
  14835. #else
  14836. "add r2, r2, r6\n\t"
  14837. #endif
  14838. #ifdef WOLFSSL_KEIL
  14839. "adcs r3, r3, %[r]\n\t"
  14840. #elif defined(__clang__)
  14841. "adcs r3, %[r]\n\t"
  14842. #else
  14843. "adc r3, %[r]\n\t"
  14844. #endif
  14845. #ifdef WOLFSSL_KEIL
  14846. "adcs r4, r4, %[r]\n\t"
  14847. #elif defined(__clang__)
  14848. "adcs r4, %[r]\n\t"
  14849. #else
  14850. "adc r4, %[r]\n\t"
  14851. #endif
  14852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14853. "lsrs r6, r7, #16\n\t"
  14854. #else
  14855. "lsr r6, r7, #16\n\t"
  14856. #endif
  14857. #ifdef WOLFSSL_KEIL
  14858. "muls r5, r6, r5\n\t"
  14859. #elif defined(__clang__)
  14860. "muls r5, r6\n\t"
  14861. #else
  14862. "mul r5, r6\n\t"
  14863. #endif
  14864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14865. "lsrs r6, r5, #16\n\t"
  14866. #else
  14867. "lsr r6, r5, #16\n\t"
  14868. #endif
  14869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14870. "lsls r5, r5, #16\n\t"
  14871. #else
  14872. "lsl r5, r5, #16\n\t"
  14873. #endif
  14874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14875. "adds r2, r2, r5\n\t"
  14876. #else
  14877. "add r2, r2, r5\n\t"
  14878. #endif
  14879. #ifdef WOLFSSL_KEIL
  14880. "adcs r3, r3, r6\n\t"
  14881. #elif defined(__clang__)
  14882. "adcs r3, r6\n\t"
  14883. #else
  14884. "adc r3, r6\n\t"
  14885. #endif
  14886. #ifdef WOLFSSL_KEIL
  14887. "adcs r4, r4, %[r]\n\t"
  14888. #elif defined(__clang__)
  14889. "adcs r4, %[r]\n\t"
  14890. #else
  14891. "adc r4, %[r]\n\t"
  14892. #endif
  14893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14894. "adds r2, r2, r5\n\t"
  14895. #else
  14896. "add r2, r2, r5\n\t"
  14897. #endif
  14898. #ifdef WOLFSSL_KEIL
  14899. "adcs r3, r3, r6\n\t"
  14900. #elif defined(__clang__)
  14901. "adcs r3, r6\n\t"
  14902. #else
  14903. "adc r3, r6\n\t"
  14904. #endif
  14905. #ifdef WOLFSSL_KEIL
  14906. "adcs r4, r4, %[r]\n\t"
  14907. #elif defined(__clang__)
  14908. "adcs r4, %[r]\n\t"
  14909. #else
  14910. "adc r4, %[r]\n\t"
  14911. #endif
  14912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14913. "lsrs r5, %[a], #16\n\t"
  14914. #else
  14915. "lsr r5, %[a], #16\n\t"
  14916. #endif
  14917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14918. "lsrs r6, r7, #16\n\t"
  14919. #else
  14920. "lsr r6, r7, #16\n\t"
  14921. #endif
  14922. #ifdef WOLFSSL_KEIL
  14923. "muls r6, r5, r6\n\t"
  14924. #elif defined(__clang__)
  14925. "muls r6, r5\n\t"
  14926. #else
  14927. "mul r6, r5\n\t"
  14928. #endif
  14929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14930. "adds r3, r3, r6\n\t"
  14931. #else
  14932. "add r3, r3, r6\n\t"
  14933. #endif
  14934. #ifdef WOLFSSL_KEIL
  14935. "adcs r4, r4, %[r]\n\t"
  14936. #elif defined(__clang__)
  14937. "adcs r4, %[r]\n\t"
  14938. #else
  14939. "adc r4, %[r]\n\t"
  14940. #endif
  14941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14942. "adds r3, r3, r6\n\t"
  14943. #else
  14944. "add r3, r3, r6\n\t"
  14945. #endif
  14946. #ifdef WOLFSSL_KEIL
  14947. "adcs r4, r4, %[r]\n\t"
  14948. #elif defined(__clang__)
  14949. "adcs r4, %[r]\n\t"
  14950. #else
  14951. "adc r4, %[r]\n\t"
  14952. #endif
  14953. "uxth r6, r7\n\t"
  14954. #ifdef WOLFSSL_KEIL
  14955. "muls r5, r6, r5\n\t"
  14956. #elif defined(__clang__)
  14957. "muls r5, r6\n\t"
  14958. #else
  14959. "mul r5, r6\n\t"
  14960. #endif
  14961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14962. "lsrs r6, r5, #16\n\t"
  14963. #else
  14964. "lsr r6, r5, #16\n\t"
  14965. #endif
  14966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14967. "lsls r5, r5, #16\n\t"
  14968. #else
  14969. "lsl r5, r5, #16\n\t"
  14970. #endif
  14971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14972. "adds r2, r2, r5\n\t"
  14973. #else
  14974. "add r2, r2, r5\n\t"
  14975. #endif
  14976. #ifdef WOLFSSL_KEIL
  14977. "adcs r3, r3, r6\n\t"
  14978. #elif defined(__clang__)
  14979. "adcs r3, r6\n\t"
  14980. #else
  14981. "adc r3, r6\n\t"
  14982. #endif
  14983. #ifdef WOLFSSL_KEIL
  14984. "adcs r4, r4, %[r]\n\t"
  14985. #elif defined(__clang__)
  14986. "adcs r4, %[r]\n\t"
  14987. #else
  14988. "adc r4, %[r]\n\t"
  14989. #endif
  14990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  14991. "adds r2, r2, r5\n\t"
  14992. #else
  14993. "add r2, r2, r5\n\t"
  14994. #endif
  14995. #ifdef WOLFSSL_KEIL
  14996. "adcs r3, r3, r6\n\t"
  14997. #elif defined(__clang__)
  14998. "adcs r3, r6\n\t"
  14999. #else
  15000. "adc r3, r6\n\t"
  15001. #endif
  15002. #ifdef WOLFSSL_KEIL
  15003. "adcs r4, r4, %[r]\n\t"
  15004. #elif defined(__clang__)
  15005. "adcs r4, %[r]\n\t"
  15006. #else
  15007. "adc r4, %[r]\n\t"
  15008. #endif
  15009. "# A[5] * A[1]\n\t"
  15010. "mov %[a], r9\n\t"
  15011. "mov r7, r11\n\t"
  15012. "ldr %[a], [%[a], #20]\n\t"
  15013. "uxth r5, %[a]\n\t"
  15014. "uxth r6, r7\n\t"
  15015. #ifdef WOLFSSL_KEIL
  15016. "muls r6, r5, r6\n\t"
  15017. #elif defined(__clang__)
  15018. "muls r6, r5\n\t"
  15019. #else
  15020. "mul r6, r5\n\t"
  15021. #endif
  15022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15023. "adds r2, r2, r6\n\t"
  15024. #else
  15025. "add r2, r2, r6\n\t"
  15026. #endif
  15027. #ifdef WOLFSSL_KEIL
  15028. "adcs r3, r3, %[r]\n\t"
  15029. #elif defined(__clang__)
  15030. "adcs r3, %[r]\n\t"
  15031. #else
  15032. "adc r3, %[r]\n\t"
  15033. #endif
  15034. #ifdef WOLFSSL_KEIL
  15035. "adcs r4, r4, %[r]\n\t"
  15036. #elif defined(__clang__)
  15037. "adcs r4, %[r]\n\t"
  15038. #else
  15039. "adc r4, %[r]\n\t"
  15040. #endif
  15041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15042. "adds r2, r2, r6\n\t"
  15043. #else
  15044. "add r2, r2, r6\n\t"
  15045. #endif
  15046. #ifdef WOLFSSL_KEIL
  15047. "adcs r3, r3, %[r]\n\t"
  15048. #elif defined(__clang__)
  15049. "adcs r3, %[r]\n\t"
  15050. #else
  15051. "adc r3, %[r]\n\t"
  15052. #endif
  15053. #ifdef WOLFSSL_KEIL
  15054. "adcs r4, r4, %[r]\n\t"
  15055. #elif defined(__clang__)
  15056. "adcs r4, %[r]\n\t"
  15057. #else
  15058. "adc r4, %[r]\n\t"
  15059. #endif
  15060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15061. "lsrs r6, r7, #16\n\t"
  15062. #else
  15063. "lsr r6, r7, #16\n\t"
  15064. #endif
  15065. #ifdef WOLFSSL_KEIL
  15066. "muls r5, r6, r5\n\t"
  15067. #elif defined(__clang__)
  15068. "muls r5, r6\n\t"
  15069. #else
  15070. "mul r5, r6\n\t"
  15071. #endif
  15072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15073. "lsrs r6, r5, #16\n\t"
  15074. #else
  15075. "lsr r6, r5, #16\n\t"
  15076. #endif
  15077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15078. "lsls r5, r5, #16\n\t"
  15079. #else
  15080. "lsl r5, r5, #16\n\t"
  15081. #endif
  15082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15083. "adds r2, r2, r5\n\t"
  15084. #else
  15085. "add r2, r2, r5\n\t"
  15086. #endif
  15087. #ifdef WOLFSSL_KEIL
  15088. "adcs r3, r3, r6\n\t"
  15089. #elif defined(__clang__)
  15090. "adcs r3, r6\n\t"
  15091. #else
  15092. "adc r3, r6\n\t"
  15093. #endif
  15094. #ifdef WOLFSSL_KEIL
  15095. "adcs r4, r4, %[r]\n\t"
  15096. #elif defined(__clang__)
  15097. "adcs r4, %[r]\n\t"
  15098. #else
  15099. "adc r4, %[r]\n\t"
  15100. #endif
  15101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15102. "adds r2, r2, r5\n\t"
  15103. #else
  15104. "add r2, r2, r5\n\t"
  15105. #endif
  15106. #ifdef WOLFSSL_KEIL
  15107. "adcs r3, r3, r6\n\t"
  15108. #elif defined(__clang__)
  15109. "adcs r3, r6\n\t"
  15110. #else
  15111. "adc r3, r6\n\t"
  15112. #endif
  15113. #ifdef WOLFSSL_KEIL
  15114. "adcs r4, r4, %[r]\n\t"
  15115. #elif defined(__clang__)
  15116. "adcs r4, %[r]\n\t"
  15117. #else
  15118. "adc r4, %[r]\n\t"
  15119. #endif
  15120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15121. "lsrs r5, %[a], #16\n\t"
  15122. #else
  15123. "lsr r5, %[a], #16\n\t"
  15124. #endif
  15125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15126. "lsrs r6, r7, #16\n\t"
  15127. #else
  15128. "lsr r6, r7, #16\n\t"
  15129. #endif
  15130. #ifdef WOLFSSL_KEIL
  15131. "muls r6, r5, r6\n\t"
  15132. #elif defined(__clang__)
  15133. "muls r6, r5\n\t"
  15134. #else
  15135. "mul r6, r5\n\t"
  15136. #endif
  15137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15138. "adds r3, r3, r6\n\t"
  15139. #else
  15140. "add r3, r3, r6\n\t"
  15141. #endif
  15142. #ifdef WOLFSSL_KEIL
  15143. "adcs r4, r4, %[r]\n\t"
  15144. #elif defined(__clang__)
  15145. "adcs r4, %[r]\n\t"
  15146. #else
  15147. "adc r4, %[r]\n\t"
  15148. #endif
  15149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15150. "adds r3, r3, r6\n\t"
  15151. #else
  15152. "add r3, r3, r6\n\t"
  15153. #endif
  15154. #ifdef WOLFSSL_KEIL
  15155. "adcs r4, r4, %[r]\n\t"
  15156. #elif defined(__clang__)
  15157. "adcs r4, %[r]\n\t"
  15158. #else
  15159. "adc r4, %[r]\n\t"
  15160. #endif
  15161. "uxth r6, r7\n\t"
  15162. #ifdef WOLFSSL_KEIL
  15163. "muls r5, r6, r5\n\t"
  15164. #elif defined(__clang__)
  15165. "muls r5, r6\n\t"
  15166. #else
  15167. "mul r5, r6\n\t"
  15168. #endif
  15169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15170. "lsrs r6, r5, #16\n\t"
  15171. #else
  15172. "lsr r6, r5, #16\n\t"
  15173. #endif
  15174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15175. "lsls r5, r5, #16\n\t"
  15176. #else
  15177. "lsl r5, r5, #16\n\t"
  15178. #endif
  15179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15180. "adds r2, r2, r5\n\t"
  15181. #else
  15182. "add r2, r2, r5\n\t"
  15183. #endif
  15184. #ifdef WOLFSSL_KEIL
  15185. "adcs r3, r3, r6\n\t"
  15186. #elif defined(__clang__)
  15187. "adcs r3, r6\n\t"
  15188. #else
  15189. "adc r3, r6\n\t"
  15190. #endif
  15191. #ifdef WOLFSSL_KEIL
  15192. "adcs r4, r4, %[r]\n\t"
  15193. #elif defined(__clang__)
  15194. "adcs r4, %[r]\n\t"
  15195. #else
  15196. "adc r4, %[r]\n\t"
  15197. #endif
  15198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15199. "adds r2, r2, r5\n\t"
  15200. #else
  15201. "add r2, r2, r5\n\t"
  15202. #endif
  15203. #ifdef WOLFSSL_KEIL
  15204. "adcs r3, r3, r6\n\t"
  15205. #elif defined(__clang__)
  15206. "adcs r3, r6\n\t"
  15207. #else
  15208. "adc r3, r6\n\t"
  15209. #endif
  15210. #ifdef WOLFSSL_KEIL
  15211. "adcs r4, r4, %[r]\n\t"
  15212. #elif defined(__clang__)
  15213. "adcs r4, %[r]\n\t"
  15214. #else
  15215. "adc r4, %[r]\n\t"
  15216. #endif
  15217. "# A[4] * A[2]\n\t"
  15218. "mov %[a], r9\n\t"
  15219. "mov r7, r12\n\t"
  15220. "ldr %[a], [%[a], #16]\n\t"
  15221. "uxth r5, %[a]\n\t"
  15222. "uxth r6, r7\n\t"
  15223. #ifdef WOLFSSL_KEIL
  15224. "muls r6, r5, r6\n\t"
  15225. #elif defined(__clang__)
  15226. "muls r6, r5\n\t"
  15227. #else
  15228. "mul r6, r5\n\t"
  15229. #endif
  15230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15231. "adds r2, r2, r6\n\t"
  15232. #else
  15233. "add r2, r2, r6\n\t"
  15234. #endif
  15235. #ifdef WOLFSSL_KEIL
  15236. "adcs r3, r3, %[r]\n\t"
  15237. #elif defined(__clang__)
  15238. "adcs r3, %[r]\n\t"
  15239. #else
  15240. "adc r3, %[r]\n\t"
  15241. #endif
  15242. #ifdef WOLFSSL_KEIL
  15243. "adcs r4, r4, %[r]\n\t"
  15244. #elif defined(__clang__)
  15245. "adcs r4, %[r]\n\t"
  15246. #else
  15247. "adc r4, %[r]\n\t"
  15248. #endif
  15249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15250. "adds r2, r2, r6\n\t"
  15251. #else
  15252. "add r2, r2, r6\n\t"
  15253. #endif
  15254. #ifdef WOLFSSL_KEIL
  15255. "adcs r3, r3, %[r]\n\t"
  15256. #elif defined(__clang__)
  15257. "adcs r3, %[r]\n\t"
  15258. #else
  15259. "adc r3, %[r]\n\t"
  15260. #endif
  15261. #ifdef WOLFSSL_KEIL
  15262. "adcs r4, r4, %[r]\n\t"
  15263. #elif defined(__clang__)
  15264. "adcs r4, %[r]\n\t"
  15265. #else
  15266. "adc r4, %[r]\n\t"
  15267. #endif
  15268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15269. "lsrs r6, r7, #16\n\t"
  15270. #else
  15271. "lsr r6, r7, #16\n\t"
  15272. #endif
  15273. #ifdef WOLFSSL_KEIL
  15274. "muls r5, r6, r5\n\t"
  15275. #elif defined(__clang__)
  15276. "muls r5, r6\n\t"
  15277. #else
  15278. "mul r5, r6\n\t"
  15279. #endif
  15280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15281. "lsrs r6, r5, #16\n\t"
  15282. #else
  15283. "lsr r6, r5, #16\n\t"
  15284. #endif
  15285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15286. "lsls r5, r5, #16\n\t"
  15287. #else
  15288. "lsl r5, r5, #16\n\t"
  15289. #endif
  15290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15291. "adds r2, r2, r5\n\t"
  15292. #else
  15293. "add r2, r2, r5\n\t"
  15294. #endif
  15295. #ifdef WOLFSSL_KEIL
  15296. "adcs r3, r3, r6\n\t"
  15297. #elif defined(__clang__)
  15298. "adcs r3, r6\n\t"
  15299. #else
  15300. "adc r3, r6\n\t"
  15301. #endif
  15302. #ifdef WOLFSSL_KEIL
  15303. "adcs r4, r4, %[r]\n\t"
  15304. #elif defined(__clang__)
  15305. "adcs r4, %[r]\n\t"
  15306. #else
  15307. "adc r4, %[r]\n\t"
  15308. #endif
  15309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15310. "adds r2, r2, r5\n\t"
  15311. #else
  15312. "add r2, r2, r5\n\t"
  15313. #endif
  15314. #ifdef WOLFSSL_KEIL
  15315. "adcs r3, r3, r6\n\t"
  15316. #elif defined(__clang__)
  15317. "adcs r3, r6\n\t"
  15318. #else
  15319. "adc r3, r6\n\t"
  15320. #endif
  15321. #ifdef WOLFSSL_KEIL
  15322. "adcs r4, r4, %[r]\n\t"
  15323. #elif defined(__clang__)
  15324. "adcs r4, %[r]\n\t"
  15325. #else
  15326. "adc r4, %[r]\n\t"
  15327. #endif
  15328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15329. "lsrs r5, %[a], #16\n\t"
  15330. #else
  15331. "lsr r5, %[a], #16\n\t"
  15332. #endif
  15333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15334. "lsrs r6, r7, #16\n\t"
  15335. #else
  15336. "lsr r6, r7, #16\n\t"
  15337. #endif
  15338. #ifdef WOLFSSL_KEIL
  15339. "muls r6, r5, r6\n\t"
  15340. #elif defined(__clang__)
  15341. "muls r6, r5\n\t"
  15342. #else
  15343. "mul r6, r5\n\t"
  15344. #endif
  15345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15346. "adds r3, r3, r6\n\t"
  15347. #else
  15348. "add r3, r3, r6\n\t"
  15349. #endif
  15350. #ifdef WOLFSSL_KEIL
  15351. "adcs r4, r4, %[r]\n\t"
  15352. #elif defined(__clang__)
  15353. "adcs r4, %[r]\n\t"
  15354. #else
  15355. "adc r4, %[r]\n\t"
  15356. #endif
  15357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15358. "adds r3, r3, r6\n\t"
  15359. #else
  15360. "add r3, r3, r6\n\t"
  15361. #endif
  15362. #ifdef WOLFSSL_KEIL
  15363. "adcs r4, r4, %[r]\n\t"
  15364. #elif defined(__clang__)
  15365. "adcs r4, %[r]\n\t"
  15366. #else
  15367. "adc r4, %[r]\n\t"
  15368. #endif
  15369. "uxth r6, r7\n\t"
  15370. #ifdef WOLFSSL_KEIL
  15371. "muls r5, r6, r5\n\t"
  15372. #elif defined(__clang__)
  15373. "muls r5, r6\n\t"
  15374. #else
  15375. "mul r5, r6\n\t"
  15376. #endif
  15377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15378. "lsrs r6, r5, #16\n\t"
  15379. #else
  15380. "lsr r6, r5, #16\n\t"
  15381. #endif
  15382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15383. "lsls r5, r5, #16\n\t"
  15384. #else
  15385. "lsl r5, r5, #16\n\t"
  15386. #endif
  15387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15388. "adds r2, r2, r5\n\t"
  15389. #else
  15390. "add r2, r2, r5\n\t"
  15391. #endif
  15392. #ifdef WOLFSSL_KEIL
  15393. "adcs r3, r3, r6\n\t"
  15394. #elif defined(__clang__)
  15395. "adcs r3, r6\n\t"
  15396. #else
  15397. "adc r3, r6\n\t"
  15398. #endif
  15399. #ifdef WOLFSSL_KEIL
  15400. "adcs r4, r4, %[r]\n\t"
  15401. #elif defined(__clang__)
  15402. "adcs r4, %[r]\n\t"
  15403. #else
  15404. "adc r4, %[r]\n\t"
  15405. #endif
  15406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15407. "adds r2, r2, r5\n\t"
  15408. #else
  15409. "add r2, r2, r5\n\t"
  15410. #endif
  15411. #ifdef WOLFSSL_KEIL
  15412. "adcs r3, r3, r6\n\t"
  15413. #elif defined(__clang__)
  15414. "adcs r3, r6\n\t"
  15415. #else
  15416. "adc r3, r6\n\t"
  15417. #endif
  15418. #ifdef WOLFSSL_KEIL
  15419. "adcs r4, r4, %[r]\n\t"
  15420. #elif defined(__clang__)
  15421. "adcs r4, %[r]\n\t"
  15422. #else
  15423. "adc r4, %[r]\n\t"
  15424. #endif
  15425. "# A[3] * A[3]\n\t"
  15426. "mov r7, lr\n\t"
  15427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15428. "lsrs r6, r7, #16\n\t"
  15429. #else
  15430. "lsr r6, r7, #16\n\t"
  15431. #endif
  15432. "uxth r5, r7\n\t"
  15433. #ifdef WOLFSSL_KEIL
  15434. "muls r5, r5, r5\n\t"
  15435. #elif defined(__clang__)
  15436. "muls r5, r5\n\t"
  15437. #else
  15438. "mul r5, r5\n\t"
  15439. #endif
  15440. #ifdef WOLFSSL_KEIL
  15441. "muls r6, r6, r6\n\t"
  15442. #elif defined(__clang__)
  15443. "muls r6, r6\n\t"
  15444. #else
  15445. "mul r6, r6\n\t"
  15446. #endif
  15447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15448. "adds r2, r2, r5\n\t"
  15449. #else
  15450. "add r2, r2, r5\n\t"
  15451. #endif
  15452. #ifdef WOLFSSL_KEIL
  15453. "adcs r3, r3, r6\n\t"
  15454. #elif defined(__clang__)
  15455. "adcs r3, r6\n\t"
  15456. #else
  15457. "adc r3, r6\n\t"
  15458. #endif
  15459. #ifdef WOLFSSL_KEIL
  15460. "adcs r4, r4, %[r]\n\t"
  15461. #elif defined(__clang__)
  15462. "adcs r4, %[r]\n\t"
  15463. #else
  15464. "adc r4, %[r]\n\t"
  15465. #endif
  15466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15467. "lsrs r6, r7, #16\n\t"
  15468. #else
  15469. "lsr r6, r7, #16\n\t"
  15470. #endif
  15471. "uxth r5, r7\n\t"
  15472. #ifdef WOLFSSL_KEIL
  15473. "muls r5, r6, r5\n\t"
  15474. #elif defined(__clang__)
  15475. "muls r5, r6\n\t"
  15476. #else
  15477. "mul r5, r6\n\t"
  15478. #endif
  15479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15480. "lsrs r6, r5, #15\n\t"
  15481. #else
  15482. "lsr r6, r5, #15\n\t"
  15483. #endif
  15484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15485. "lsls r5, r5, #17\n\t"
  15486. #else
  15487. "lsl r5, r5, #17\n\t"
  15488. #endif
  15489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15490. "adds r2, r2, r5\n\t"
  15491. #else
  15492. "add r2, r2, r5\n\t"
  15493. #endif
  15494. #ifdef WOLFSSL_KEIL
  15495. "adcs r3, r3, r6\n\t"
  15496. #elif defined(__clang__)
  15497. "adcs r3, r6\n\t"
  15498. #else
  15499. "adc r3, r6\n\t"
  15500. #endif
  15501. #ifdef WOLFSSL_KEIL
  15502. "adcs r4, r4, %[r]\n\t"
  15503. #elif defined(__clang__)
  15504. "adcs r4, %[r]\n\t"
  15505. #else
  15506. "adc r4, %[r]\n\t"
  15507. #endif
  15508. "str r2, [sp, #24]\n\t"
  15509. "# A[4] * A[3]\n\t"
  15510. "movs r2, #0\n\t"
  15511. "mov %[a], r9\n\t"
  15512. "ldr %[a], [%[a], #16]\n\t"
  15513. "uxth r5, %[a]\n\t"
  15514. "uxth r6, r7\n\t"
  15515. #ifdef WOLFSSL_KEIL
  15516. "muls r6, r5, r6\n\t"
  15517. #elif defined(__clang__)
  15518. "muls r6, r5\n\t"
  15519. #else
  15520. "mul r6, r5\n\t"
  15521. #endif
  15522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15523. "adds r3, r3, r6\n\t"
  15524. #else
  15525. "add r3, r3, r6\n\t"
  15526. #endif
  15527. #ifdef WOLFSSL_KEIL
  15528. "adcs r4, r4, %[r]\n\t"
  15529. #elif defined(__clang__)
  15530. "adcs r4, %[r]\n\t"
  15531. #else
  15532. "adc r4, %[r]\n\t"
  15533. #endif
  15534. #ifdef WOLFSSL_KEIL
  15535. "adcs r2, r2, %[r]\n\t"
  15536. #elif defined(__clang__)
  15537. "adcs r2, %[r]\n\t"
  15538. #else
  15539. "adc r2, %[r]\n\t"
  15540. #endif
  15541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15542. "adds r3, r3, r6\n\t"
  15543. #else
  15544. "add r3, r3, r6\n\t"
  15545. #endif
  15546. #ifdef WOLFSSL_KEIL
  15547. "adcs r4, r4, %[r]\n\t"
  15548. #elif defined(__clang__)
  15549. "adcs r4, %[r]\n\t"
  15550. #else
  15551. "adc r4, %[r]\n\t"
  15552. #endif
  15553. #ifdef WOLFSSL_KEIL
  15554. "adcs r2, r2, %[r]\n\t"
  15555. #elif defined(__clang__)
  15556. "adcs r2, %[r]\n\t"
  15557. #else
  15558. "adc r2, %[r]\n\t"
  15559. #endif
  15560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15561. "lsrs r6, r7, #16\n\t"
  15562. #else
  15563. "lsr r6, r7, #16\n\t"
  15564. #endif
  15565. #ifdef WOLFSSL_KEIL
  15566. "muls r5, r6, r5\n\t"
  15567. #elif defined(__clang__)
  15568. "muls r5, r6\n\t"
  15569. #else
  15570. "mul r5, r6\n\t"
  15571. #endif
  15572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15573. "lsrs r6, r5, #16\n\t"
  15574. #else
  15575. "lsr r6, r5, #16\n\t"
  15576. #endif
  15577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15578. "lsls r5, r5, #16\n\t"
  15579. #else
  15580. "lsl r5, r5, #16\n\t"
  15581. #endif
  15582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15583. "adds r3, r3, r5\n\t"
  15584. #else
  15585. "add r3, r3, r5\n\t"
  15586. #endif
  15587. #ifdef WOLFSSL_KEIL
  15588. "adcs r4, r4, r6\n\t"
  15589. #elif defined(__clang__)
  15590. "adcs r4, r6\n\t"
  15591. #else
  15592. "adc r4, r6\n\t"
  15593. #endif
  15594. #ifdef WOLFSSL_KEIL
  15595. "adcs r2, r2, %[r]\n\t"
  15596. #elif defined(__clang__)
  15597. "adcs r2, %[r]\n\t"
  15598. #else
  15599. "adc r2, %[r]\n\t"
  15600. #endif
  15601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15602. "adds r3, r3, r5\n\t"
  15603. #else
  15604. "add r3, r3, r5\n\t"
  15605. #endif
  15606. #ifdef WOLFSSL_KEIL
  15607. "adcs r4, r4, r6\n\t"
  15608. #elif defined(__clang__)
  15609. "adcs r4, r6\n\t"
  15610. #else
  15611. "adc r4, r6\n\t"
  15612. #endif
  15613. #ifdef WOLFSSL_KEIL
  15614. "adcs r2, r2, %[r]\n\t"
  15615. #elif defined(__clang__)
  15616. "adcs r2, %[r]\n\t"
  15617. #else
  15618. "adc r2, %[r]\n\t"
  15619. #endif
  15620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15621. "lsrs r5, %[a], #16\n\t"
  15622. #else
  15623. "lsr r5, %[a], #16\n\t"
  15624. #endif
  15625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15626. "lsrs r6, r7, #16\n\t"
  15627. #else
  15628. "lsr r6, r7, #16\n\t"
  15629. #endif
  15630. #ifdef WOLFSSL_KEIL
  15631. "muls r6, r5, r6\n\t"
  15632. #elif defined(__clang__)
  15633. "muls r6, r5\n\t"
  15634. #else
  15635. "mul r6, r5\n\t"
  15636. #endif
  15637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15638. "adds r4, r4, r6\n\t"
  15639. #else
  15640. "add r4, r4, r6\n\t"
  15641. #endif
  15642. #ifdef WOLFSSL_KEIL
  15643. "adcs r2, r2, %[r]\n\t"
  15644. #elif defined(__clang__)
  15645. "adcs r2, %[r]\n\t"
  15646. #else
  15647. "adc r2, %[r]\n\t"
  15648. #endif
  15649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15650. "adds r4, r4, r6\n\t"
  15651. #else
  15652. "add r4, r4, r6\n\t"
  15653. #endif
  15654. #ifdef WOLFSSL_KEIL
  15655. "adcs r2, r2, %[r]\n\t"
  15656. #elif defined(__clang__)
  15657. "adcs r2, %[r]\n\t"
  15658. #else
  15659. "adc r2, %[r]\n\t"
  15660. #endif
  15661. "uxth r6, r7\n\t"
  15662. #ifdef WOLFSSL_KEIL
  15663. "muls r5, r6, r5\n\t"
  15664. #elif defined(__clang__)
  15665. "muls r5, r6\n\t"
  15666. #else
  15667. "mul r5, r6\n\t"
  15668. #endif
  15669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15670. "lsrs r6, r5, #16\n\t"
  15671. #else
  15672. "lsr r6, r5, #16\n\t"
  15673. #endif
  15674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15675. "lsls r5, r5, #16\n\t"
  15676. #else
  15677. "lsl r5, r5, #16\n\t"
  15678. #endif
  15679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15680. "adds r3, r3, r5\n\t"
  15681. #else
  15682. "add r3, r3, r5\n\t"
  15683. #endif
  15684. #ifdef WOLFSSL_KEIL
  15685. "adcs r4, r4, r6\n\t"
  15686. #elif defined(__clang__)
  15687. "adcs r4, r6\n\t"
  15688. #else
  15689. "adc r4, r6\n\t"
  15690. #endif
  15691. #ifdef WOLFSSL_KEIL
  15692. "adcs r2, r2, %[r]\n\t"
  15693. #elif defined(__clang__)
  15694. "adcs r2, %[r]\n\t"
  15695. #else
  15696. "adc r2, %[r]\n\t"
  15697. #endif
  15698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15699. "adds r3, r3, r5\n\t"
  15700. #else
  15701. "add r3, r3, r5\n\t"
  15702. #endif
  15703. #ifdef WOLFSSL_KEIL
  15704. "adcs r4, r4, r6\n\t"
  15705. #elif defined(__clang__)
  15706. "adcs r4, r6\n\t"
  15707. #else
  15708. "adc r4, r6\n\t"
  15709. #endif
  15710. #ifdef WOLFSSL_KEIL
  15711. "adcs r2, r2, %[r]\n\t"
  15712. #elif defined(__clang__)
  15713. "adcs r2, %[r]\n\t"
  15714. #else
  15715. "adc r2, %[r]\n\t"
  15716. #endif
  15717. "# A[5] * A[2]\n\t"
  15718. "mov %[a], r9\n\t"
  15719. "mov r7, r12\n\t"
  15720. "ldr %[a], [%[a], #20]\n\t"
  15721. "uxth r5, %[a]\n\t"
  15722. "uxth r6, r7\n\t"
  15723. #ifdef WOLFSSL_KEIL
  15724. "muls r6, r5, r6\n\t"
  15725. #elif defined(__clang__)
  15726. "muls r6, r5\n\t"
  15727. #else
  15728. "mul r6, r5\n\t"
  15729. #endif
  15730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15731. "adds r3, r3, r6\n\t"
  15732. #else
  15733. "add r3, r3, r6\n\t"
  15734. #endif
  15735. #ifdef WOLFSSL_KEIL
  15736. "adcs r4, r4, %[r]\n\t"
  15737. #elif defined(__clang__)
  15738. "adcs r4, %[r]\n\t"
  15739. #else
  15740. "adc r4, %[r]\n\t"
  15741. #endif
  15742. #ifdef WOLFSSL_KEIL
  15743. "adcs r2, r2, %[r]\n\t"
  15744. #elif defined(__clang__)
  15745. "adcs r2, %[r]\n\t"
  15746. #else
  15747. "adc r2, %[r]\n\t"
  15748. #endif
  15749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15750. "adds r3, r3, r6\n\t"
  15751. #else
  15752. "add r3, r3, r6\n\t"
  15753. #endif
  15754. #ifdef WOLFSSL_KEIL
  15755. "adcs r4, r4, %[r]\n\t"
  15756. #elif defined(__clang__)
  15757. "adcs r4, %[r]\n\t"
  15758. #else
  15759. "adc r4, %[r]\n\t"
  15760. #endif
  15761. #ifdef WOLFSSL_KEIL
  15762. "adcs r2, r2, %[r]\n\t"
  15763. #elif defined(__clang__)
  15764. "adcs r2, %[r]\n\t"
  15765. #else
  15766. "adc r2, %[r]\n\t"
  15767. #endif
  15768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15769. "lsrs r6, r7, #16\n\t"
  15770. #else
  15771. "lsr r6, r7, #16\n\t"
  15772. #endif
  15773. #ifdef WOLFSSL_KEIL
  15774. "muls r5, r6, r5\n\t"
  15775. #elif defined(__clang__)
  15776. "muls r5, r6\n\t"
  15777. #else
  15778. "mul r5, r6\n\t"
  15779. #endif
  15780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15781. "lsrs r6, r5, #16\n\t"
  15782. #else
  15783. "lsr r6, r5, #16\n\t"
  15784. #endif
  15785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15786. "lsls r5, r5, #16\n\t"
  15787. #else
  15788. "lsl r5, r5, #16\n\t"
  15789. #endif
  15790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15791. "adds r3, r3, r5\n\t"
  15792. #else
  15793. "add r3, r3, r5\n\t"
  15794. #endif
  15795. #ifdef WOLFSSL_KEIL
  15796. "adcs r4, r4, r6\n\t"
  15797. #elif defined(__clang__)
  15798. "adcs r4, r6\n\t"
  15799. #else
  15800. "adc r4, r6\n\t"
  15801. #endif
  15802. #ifdef WOLFSSL_KEIL
  15803. "adcs r2, r2, %[r]\n\t"
  15804. #elif defined(__clang__)
  15805. "adcs r2, %[r]\n\t"
  15806. #else
  15807. "adc r2, %[r]\n\t"
  15808. #endif
  15809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15810. "adds r3, r3, r5\n\t"
  15811. #else
  15812. "add r3, r3, r5\n\t"
  15813. #endif
  15814. #ifdef WOLFSSL_KEIL
  15815. "adcs r4, r4, r6\n\t"
  15816. #elif defined(__clang__)
  15817. "adcs r4, r6\n\t"
  15818. #else
  15819. "adc r4, r6\n\t"
  15820. #endif
  15821. #ifdef WOLFSSL_KEIL
  15822. "adcs r2, r2, %[r]\n\t"
  15823. #elif defined(__clang__)
  15824. "adcs r2, %[r]\n\t"
  15825. #else
  15826. "adc r2, %[r]\n\t"
  15827. #endif
  15828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15829. "lsrs r5, %[a], #16\n\t"
  15830. #else
  15831. "lsr r5, %[a], #16\n\t"
  15832. #endif
  15833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15834. "lsrs r6, r7, #16\n\t"
  15835. #else
  15836. "lsr r6, r7, #16\n\t"
  15837. #endif
  15838. #ifdef WOLFSSL_KEIL
  15839. "muls r6, r5, r6\n\t"
  15840. #elif defined(__clang__)
  15841. "muls r6, r5\n\t"
  15842. #else
  15843. "mul r6, r5\n\t"
  15844. #endif
  15845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15846. "adds r4, r4, r6\n\t"
  15847. #else
  15848. "add r4, r4, r6\n\t"
  15849. #endif
  15850. #ifdef WOLFSSL_KEIL
  15851. "adcs r2, r2, %[r]\n\t"
  15852. #elif defined(__clang__)
  15853. "adcs r2, %[r]\n\t"
  15854. #else
  15855. "adc r2, %[r]\n\t"
  15856. #endif
  15857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15858. "adds r4, r4, r6\n\t"
  15859. #else
  15860. "add r4, r4, r6\n\t"
  15861. #endif
  15862. #ifdef WOLFSSL_KEIL
  15863. "adcs r2, r2, %[r]\n\t"
  15864. #elif defined(__clang__)
  15865. "adcs r2, %[r]\n\t"
  15866. #else
  15867. "adc r2, %[r]\n\t"
  15868. #endif
  15869. "uxth r6, r7\n\t"
  15870. #ifdef WOLFSSL_KEIL
  15871. "muls r5, r6, r5\n\t"
  15872. #elif defined(__clang__)
  15873. "muls r5, r6\n\t"
  15874. #else
  15875. "mul r5, r6\n\t"
  15876. #endif
  15877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15878. "lsrs r6, r5, #16\n\t"
  15879. #else
  15880. "lsr r6, r5, #16\n\t"
  15881. #endif
  15882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15883. "lsls r5, r5, #16\n\t"
  15884. #else
  15885. "lsl r5, r5, #16\n\t"
  15886. #endif
  15887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15888. "adds r3, r3, r5\n\t"
  15889. #else
  15890. "add r3, r3, r5\n\t"
  15891. #endif
  15892. #ifdef WOLFSSL_KEIL
  15893. "adcs r4, r4, r6\n\t"
  15894. #elif defined(__clang__)
  15895. "adcs r4, r6\n\t"
  15896. #else
  15897. "adc r4, r6\n\t"
  15898. #endif
  15899. #ifdef WOLFSSL_KEIL
  15900. "adcs r2, r2, %[r]\n\t"
  15901. #elif defined(__clang__)
  15902. "adcs r2, %[r]\n\t"
  15903. #else
  15904. "adc r2, %[r]\n\t"
  15905. #endif
  15906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15907. "adds r3, r3, r5\n\t"
  15908. #else
  15909. "add r3, r3, r5\n\t"
  15910. #endif
  15911. #ifdef WOLFSSL_KEIL
  15912. "adcs r4, r4, r6\n\t"
  15913. #elif defined(__clang__)
  15914. "adcs r4, r6\n\t"
  15915. #else
  15916. "adc r4, r6\n\t"
  15917. #endif
  15918. #ifdef WOLFSSL_KEIL
  15919. "adcs r2, r2, %[r]\n\t"
  15920. #elif defined(__clang__)
  15921. "adcs r2, %[r]\n\t"
  15922. #else
  15923. "adc r2, %[r]\n\t"
  15924. #endif
  15925. "# A[6] * A[1]\n\t"
  15926. "mov %[a], r9\n\t"
  15927. "mov r7, r11\n\t"
  15928. "ldr %[a], [%[a], #24]\n\t"
  15929. "uxth r5, %[a]\n\t"
  15930. "uxth r6, r7\n\t"
  15931. #ifdef WOLFSSL_KEIL
  15932. "muls r6, r5, r6\n\t"
  15933. #elif defined(__clang__)
  15934. "muls r6, r5\n\t"
  15935. #else
  15936. "mul r6, r5\n\t"
  15937. #endif
  15938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15939. "adds r3, r3, r6\n\t"
  15940. #else
  15941. "add r3, r3, r6\n\t"
  15942. #endif
  15943. #ifdef WOLFSSL_KEIL
  15944. "adcs r4, r4, %[r]\n\t"
  15945. #elif defined(__clang__)
  15946. "adcs r4, %[r]\n\t"
  15947. #else
  15948. "adc r4, %[r]\n\t"
  15949. #endif
  15950. #ifdef WOLFSSL_KEIL
  15951. "adcs r2, r2, %[r]\n\t"
  15952. #elif defined(__clang__)
  15953. "adcs r2, %[r]\n\t"
  15954. #else
  15955. "adc r2, %[r]\n\t"
  15956. #endif
  15957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15958. "adds r3, r3, r6\n\t"
  15959. #else
  15960. "add r3, r3, r6\n\t"
  15961. #endif
  15962. #ifdef WOLFSSL_KEIL
  15963. "adcs r4, r4, %[r]\n\t"
  15964. #elif defined(__clang__)
  15965. "adcs r4, %[r]\n\t"
  15966. #else
  15967. "adc r4, %[r]\n\t"
  15968. #endif
  15969. #ifdef WOLFSSL_KEIL
  15970. "adcs r2, r2, %[r]\n\t"
  15971. #elif defined(__clang__)
  15972. "adcs r2, %[r]\n\t"
  15973. #else
  15974. "adc r2, %[r]\n\t"
  15975. #endif
  15976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15977. "lsrs r6, r7, #16\n\t"
  15978. #else
  15979. "lsr r6, r7, #16\n\t"
  15980. #endif
  15981. #ifdef WOLFSSL_KEIL
  15982. "muls r5, r6, r5\n\t"
  15983. #elif defined(__clang__)
  15984. "muls r5, r6\n\t"
  15985. #else
  15986. "mul r5, r6\n\t"
  15987. #endif
  15988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15989. "lsrs r6, r5, #16\n\t"
  15990. #else
  15991. "lsr r6, r5, #16\n\t"
  15992. #endif
  15993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15994. "lsls r5, r5, #16\n\t"
  15995. #else
  15996. "lsl r5, r5, #16\n\t"
  15997. #endif
  15998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  15999. "adds r3, r3, r5\n\t"
  16000. #else
  16001. "add r3, r3, r5\n\t"
  16002. #endif
  16003. #ifdef WOLFSSL_KEIL
  16004. "adcs r4, r4, r6\n\t"
  16005. #elif defined(__clang__)
  16006. "adcs r4, r6\n\t"
  16007. #else
  16008. "adc r4, r6\n\t"
  16009. #endif
  16010. #ifdef WOLFSSL_KEIL
  16011. "adcs r2, r2, %[r]\n\t"
  16012. #elif defined(__clang__)
  16013. "adcs r2, %[r]\n\t"
  16014. #else
  16015. "adc r2, %[r]\n\t"
  16016. #endif
  16017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16018. "adds r3, r3, r5\n\t"
  16019. #else
  16020. "add r3, r3, r5\n\t"
  16021. #endif
  16022. #ifdef WOLFSSL_KEIL
  16023. "adcs r4, r4, r6\n\t"
  16024. #elif defined(__clang__)
  16025. "adcs r4, r6\n\t"
  16026. #else
  16027. "adc r4, r6\n\t"
  16028. #endif
  16029. #ifdef WOLFSSL_KEIL
  16030. "adcs r2, r2, %[r]\n\t"
  16031. #elif defined(__clang__)
  16032. "adcs r2, %[r]\n\t"
  16033. #else
  16034. "adc r2, %[r]\n\t"
  16035. #endif
  16036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16037. "lsrs r5, %[a], #16\n\t"
  16038. #else
  16039. "lsr r5, %[a], #16\n\t"
  16040. #endif
  16041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16042. "lsrs r6, r7, #16\n\t"
  16043. #else
  16044. "lsr r6, r7, #16\n\t"
  16045. #endif
  16046. #ifdef WOLFSSL_KEIL
  16047. "muls r6, r5, r6\n\t"
  16048. #elif defined(__clang__)
  16049. "muls r6, r5\n\t"
  16050. #else
  16051. "mul r6, r5\n\t"
  16052. #endif
  16053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16054. "adds r4, r4, r6\n\t"
  16055. #else
  16056. "add r4, r4, r6\n\t"
  16057. #endif
  16058. #ifdef WOLFSSL_KEIL
  16059. "adcs r2, r2, %[r]\n\t"
  16060. #elif defined(__clang__)
  16061. "adcs r2, %[r]\n\t"
  16062. #else
  16063. "adc r2, %[r]\n\t"
  16064. #endif
  16065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16066. "adds r4, r4, r6\n\t"
  16067. #else
  16068. "add r4, r4, r6\n\t"
  16069. #endif
  16070. #ifdef WOLFSSL_KEIL
  16071. "adcs r2, r2, %[r]\n\t"
  16072. #elif defined(__clang__)
  16073. "adcs r2, %[r]\n\t"
  16074. #else
  16075. "adc r2, %[r]\n\t"
  16076. #endif
  16077. "uxth r6, r7\n\t"
  16078. #ifdef WOLFSSL_KEIL
  16079. "muls r5, r6, r5\n\t"
  16080. #elif defined(__clang__)
  16081. "muls r5, r6\n\t"
  16082. #else
  16083. "mul r5, r6\n\t"
  16084. #endif
  16085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16086. "lsrs r6, r5, #16\n\t"
  16087. #else
  16088. "lsr r6, r5, #16\n\t"
  16089. #endif
  16090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16091. "lsls r5, r5, #16\n\t"
  16092. #else
  16093. "lsl r5, r5, #16\n\t"
  16094. #endif
  16095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16096. "adds r3, r3, r5\n\t"
  16097. #else
  16098. "add r3, r3, r5\n\t"
  16099. #endif
  16100. #ifdef WOLFSSL_KEIL
  16101. "adcs r4, r4, r6\n\t"
  16102. #elif defined(__clang__)
  16103. "adcs r4, r6\n\t"
  16104. #else
  16105. "adc r4, r6\n\t"
  16106. #endif
  16107. #ifdef WOLFSSL_KEIL
  16108. "adcs r2, r2, %[r]\n\t"
  16109. #elif defined(__clang__)
  16110. "adcs r2, %[r]\n\t"
  16111. #else
  16112. "adc r2, %[r]\n\t"
  16113. #endif
  16114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16115. "adds r3, r3, r5\n\t"
  16116. #else
  16117. "add r3, r3, r5\n\t"
  16118. #endif
  16119. #ifdef WOLFSSL_KEIL
  16120. "adcs r4, r4, r6\n\t"
  16121. #elif defined(__clang__)
  16122. "adcs r4, r6\n\t"
  16123. #else
  16124. "adc r4, r6\n\t"
  16125. #endif
  16126. #ifdef WOLFSSL_KEIL
  16127. "adcs r2, r2, %[r]\n\t"
  16128. #elif defined(__clang__)
  16129. "adcs r2, %[r]\n\t"
  16130. #else
  16131. "adc r2, %[r]\n\t"
  16132. #endif
  16133. "# A[7] * A[0]\n\t"
  16134. "mov %[a], r9\n\t"
  16135. "mov r7, r10\n\t"
  16136. "ldr %[a], [%[a], #28]\n\t"
  16137. "uxth r5, %[a]\n\t"
  16138. "uxth r6, r7\n\t"
  16139. #ifdef WOLFSSL_KEIL
  16140. "muls r6, r5, r6\n\t"
  16141. #elif defined(__clang__)
  16142. "muls r6, r5\n\t"
  16143. #else
  16144. "mul r6, r5\n\t"
  16145. #endif
  16146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16147. "adds r3, r3, r6\n\t"
  16148. #else
  16149. "add r3, r3, r6\n\t"
  16150. #endif
  16151. #ifdef WOLFSSL_KEIL
  16152. "adcs r4, r4, %[r]\n\t"
  16153. #elif defined(__clang__)
  16154. "adcs r4, %[r]\n\t"
  16155. #else
  16156. "adc r4, %[r]\n\t"
  16157. #endif
  16158. #ifdef WOLFSSL_KEIL
  16159. "adcs r2, r2, %[r]\n\t"
  16160. #elif defined(__clang__)
  16161. "adcs r2, %[r]\n\t"
  16162. #else
  16163. "adc r2, %[r]\n\t"
  16164. #endif
  16165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16166. "adds r3, r3, r6\n\t"
  16167. #else
  16168. "add r3, r3, r6\n\t"
  16169. #endif
  16170. #ifdef WOLFSSL_KEIL
  16171. "adcs r4, r4, %[r]\n\t"
  16172. #elif defined(__clang__)
  16173. "adcs r4, %[r]\n\t"
  16174. #else
  16175. "adc r4, %[r]\n\t"
  16176. #endif
  16177. #ifdef WOLFSSL_KEIL
  16178. "adcs r2, r2, %[r]\n\t"
  16179. #elif defined(__clang__)
  16180. "adcs r2, %[r]\n\t"
  16181. #else
  16182. "adc r2, %[r]\n\t"
  16183. #endif
  16184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16185. "lsrs r6, r7, #16\n\t"
  16186. #else
  16187. "lsr r6, r7, #16\n\t"
  16188. #endif
  16189. #ifdef WOLFSSL_KEIL
  16190. "muls r5, r6, r5\n\t"
  16191. #elif defined(__clang__)
  16192. "muls r5, r6\n\t"
  16193. #else
  16194. "mul r5, r6\n\t"
  16195. #endif
  16196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16197. "lsrs r6, r5, #16\n\t"
  16198. #else
  16199. "lsr r6, r5, #16\n\t"
  16200. #endif
  16201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16202. "lsls r5, r5, #16\n\t"
  16203. #else
  16204. "lsl r5, r5, #16\n\t"
  16205. #endif
  16206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16207. "adds r3, r3, r5\n\t"
  16208. #else
  16209. "add r3, r3, r5\n\t"
  16210. #endif
  16211. #ifdef WOLFSSL_KEIL
  16212. "adcs r4, r4, r6\n\t"
  16213. #elif defined(__clang__)
  16214. "adcs r4, r6\n\t"
  16215. #else
  16216. "adc r4, r6\n\t"
  16217. #endif
  16218. #ifdef WOLFSSL_KEIL
  16219. "adcs r2, r2, %[r]\n\t"
  16220. #elif defined(__clang__)
  16221. "adcs r2, %[r]\n\t"
  16222. #else
  16223. "adc r2, %[r]\n\t"
  16224. #endif
  16225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16226. "adds r3, r3, r5\n\t"
  16227. #else
  16228. "add r3, r3, r5\n\t"
  16229. #endif
  16230. #ifdef WOLFSSL_KEIL
  16231. "adcs r4, r4, r6\n\t"
  16232. #elif defined(__clang__)
  16233. "adcs r4, r6\n\t"
  16234. #else
  16235. "adc r4, r6\n\t"
  16236. #endif
  16237. #ifdef WOLFSSL_KEIL
  16238. "adcs r2, r2, %[r]\n\t"
  16239. #elif defined(__clang__)
  16240. "adcs r2, %[r]\n\t"
  16241. #else
  16242. "adc r2, %[r]\n\t"
  16243. #endif
  16244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16245. "lsrs r5, %[a], #16\n\t"
  16246. #else
  16247. "lsr r5, %[a], #16\n\t"
  16248. #endif
  16249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16250. "lsrs r6, r7, #16\n\t"
  16251. #else
  16252. "lsr r6, r7, #16\n\t"
  16253. #endif
  16254. #ifdef WOLFSSL_KEIL
  16255. "muls r6, r5, r6\n\t"
  16256. #elif defined(__clang__)
  16257. "muls r6, r5\n\t"
  16258. #else
  16259. "mul r6, r5\n\t"
  16260. #endif
  16261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16262. "adds r4, r4, r6\n\t"
  16263. #else
  16264. "add r4, r4, r6\n\t"
  16265. #endif
  16266. #ifdef WOLFSSL_KEIL
  16267. "adcs r2, r2, %[r]\n\t"
  16268. #elif defined(__clang__)
  16269. "adcs r2, %[r]\n\t"
  16270. #else
  16271. "adc r2, %[r]\n\t"
  16272. #endif
  16273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16274. "adds r4, r4, r6\n\t"
  16275. #else
  16276. "add r4, r4, r6\n\t"
  16277. #endif
  16278. #ifdef WOLFSSL_KEIL
  16279. "adcs r2, r2, %[r]\n\t"
  16280. #elif defined(__clang__)
  16281. "adcs r2, %[r]\n\t"
  16282. #else
  16283. "adc r2, %[r]\n\t"
  16284. #endif
  16285. "uxth r6, r7\n\t"
  16286. #ifdef WOLFSSL_KEIL
  16287. "muls r5, r6, r5\n\t"
  16288. #elif defined(__clang__)
  16289. "muls r5, r6\n\t"
  16290. #else
  16291. "mul r5, r6\n\t"
  16292. #endif
  16293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16294. "lsrs r6, r5, #16\n\t"
  16295. #else
  16296. "lsr r6, r5, #16\n\t"
  16297. #endif
  16298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16299. "lsls r5, r5, #16\n\t"
  16300. #else
  16301. "lsl r5, r5, #16\n\t"
  16302. #endif
  16303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16304. "adds r3, r3, r5\n\t"
  16305. #else
  16306. "add r3, r3, r5\n\t"
  16307. #endif
  16308. #ifdef WOLFSSL_KEIL
  16309. "adcs r4, r4, r6\n\t"
  16310. #elif defined(__clang__)
  16311. "adcs r4, r6\n\t"
  16312. #else
  16313. "adc r4, r6\n\t"
  16314. #endif
  16315. #ifdef WOLFSSL_KEIL
  16316. "adcs r2, r2, %[r]\n\t"
  16317. #elif defined(__clang__)
  16318. "adcs r2, %[r]\n\t"
  16319. #else
  16320. "adc r2, %[r]\n\t"
  16321. #endif
  16322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16323. "adds r3, r3, r5\n\t"
  16324. #else
  16325. "add r3, r3, r5\n\t"
  16326. #endif
  16327. #ifdef WOLFSSL_KEIL
  16328. "adcs r4, r4, r6\n\t"
  16329. #elif defined(__clang__)
  16330. "adcs r4, r6\n\t"
  16331. #else
  16332. "adc r4, r6\n\t"
  16333. #endif
  16334. #ifdef WOLFSSL_KEIL
  16335. "adcs r2, r2, %[r]\n\t"
  16336. #elif defined(__clang__)
  16337. "adcs r2, %[r]\n\t"
  16338. #else
  16339. "adc r2, %[r]\n\t"
  16340. #endif
  16341. "str r3, [sp, #28]\n\t"
  16342. "# A[7] * A[1]\n\t"
  16343. "movs r3, #0\n\t"
  16344. "mov %[a], r9\n\t"
  16345. "mov r7, r11\n\t"
  16346. "ldr %[a], [%[a], #28]\n\t"
  16347. "uxth r5, %[a]\n\t"
  16348. "uxth r6, r7\n\t"
  16349. #ifdef WOLFSSL_KEIL
  16350. "muls r6, r5, r6\n\t"
  16351. #elif defined(__clang__)
  16352. "muls r6, r5\n\t"
  16353. #else
  16354. "mul r6, r5\n\t"
  16355. #endif
  16356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16357. "adds r4, r4, r6\n\t"
  16358. #else
  16359. "add r4, r4, r6\n\t"
  16360. #endif
  16361. #ifdef WOLFSSL_KEIL
  16362. "adcs r2, r2, %[r]\n\t"
  16363. #elif defined(__clang__)
  16364. "adcs r2, %[r]\n\t"
  16365. #else
  16366. "adc r2, %[r]\n\t"
  16367. #endif
  16368. #ifdef WOLFSSL_KEIL
  16369. "adcs r3, r3, %[r]\n\t"
  16370. #elif defined(__clang__)
  16371. "adcs r3, %[r]\n\t"
  16372. #else
  16373. "adc r3, %[r]\n\t"
  16374. #endif
  16375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16376. "adds r4, r4, r6\n\t"
  16377. #else
  16378. "add r4, r4, r6\n\t"
  16379. #endif
  16380. #ifdef WOLFSSL_KEIL
  16381. "adcs r2, r2, %[r]\n\t"
  16382. #elif defined(__clang__)
  16383. "adcs r2, %[r]\n\t"
  16384. #else
  16385. "adc r2, %[r]\n\t"
  16386. #endif
  16387. #ifdef WOLFSSL_KEIL
  16388. "adcs r3, r3, %[r]\n\t"
  16389. #elif defined(__clang__)
  16390. "adcs r3, %[r]\n\t"
  16391. #else
  16392. "adc r3, %[r]\n\t"
  16393. #endif
  16394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16395. "lsrs r6, r7, #16\n\t"
  16396. #else
  16397. "lsr r6, r7, #16\n\t"
  16398. #endif
  16399. #ifdef WOLFSSL_KEIL
  16400. "muls r5, r6, r5\n\t"
  16401. #elif defined(__clang__)
  16402. "muls r5, r6\n\t"
  16403. #else
  16404. "mul r5, r6\n\t"
  16405. #endif
  16406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16407. "lsrs r6, r5, #16\n\t"
  16408. #else
  16409. "lsr r6, r5, #16\n\t"
  16410. #endif
  16411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16412. "lsls r5, r5, #16\n\t"
  16413. #else
  16414. "lsl r5, r5, #16\n\t"
  16415. #endif
  16416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16417. "adds r4, r4, r5\n\t"
  16418. #else
  16419. "add r4, r4, r5\n\t"
  16420. #endif
  16421. #ifdef WOLFSSL_KEIL
  16422. "adcs r2, r2, r6\n\t"
  16423. #elif defined(__clang__)
  16424. "adcs r2, r6\n\t"
  16425. #else
  16426. "adc r2, r6\n\t"
  16427. #endif
  16428. #ifdef WOLFSSL_KEIL
  16429. "adcs r3, r3, %[r]\n\t"
  16430. #elif defined(__clang__)
  16431. "adcs r3, %[r]\n\t"
  16432. #else
  16433. "adc r3, %[r]\n\t"
  16434. #endif
  16435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16436. "adds r4, r4, r5\n\t"
  16437. #else
  16438. "add r4, r4, r5\n\t"
  16439. #endif
  16440. #ifdef WOLFSSL_KEIL
  16441. "adcs r2, r2, r6\n\t"
  16442. #elif defined(__clang__)
  16443. "adcs r2, r6\n\t"
  16444. #else
  16445. "adc r2, r6\n\t"
  16446. #endif
  16447. #ifdef WOLFSSL_KEIL
  16448. "adcs r3, r3, %[r]\n\t"
  16449. #elif defined(__clang__)
  16450. "adcs r3, %[r]\n\t"
  16451. #else
  16452. "adc r3, %[r]\n\t"
  16453. #endif
  16454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16455. "lsrs r5, %[a], #16\n\t"
  16456. #else
  16457. "lsr r5, %[a], #16\n\t"
  16458. #endif
  16459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16460. "lsrs r6, r7, #16\n\t"
  16461. #else
  16462. "lsr r6, r7, #16\n\t"
  16463. #endif
  16464. #ifdef WOLFSSL_KEIL
  16465. "muls r6, r5, r6\n\t"
  16466. #elif defined(__clang__)
  16467. "muls r6, r5\n\t"
  16468. #else
  16469. "mul r6, r5\n\t"
  16470. #endif
  16471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16472. "adds r2, r2, r6\n\t"
  16473. #else
  16474. "add r2, r2, r6\n\t"
  16475. #endif
  16476. #ifdef WOLFSSL_KEIL
  16477. "adcs r3, r3, %[r]\n\t"
  16478. #elif defined(__clang__)
  16479. "adcs r3, %[r]\n\t"
  16480. #else
  16481. "adc r3, %[r]\n\t"
  16482. #endif
  16483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16484. "adds r2, r2, r6\n\t"
  16485. #else
  16486. "add r2, r2, r6\n\t"
  16487. #endif
  16488. #ifdef WOLFSSL_KEIL
  16489. "adcs r3, r3, %[r]\n\t"
  16490. #elif defined(__clang__)
  16491. "adcs r3, %[r]\n\t"
  16492. #else
  16493. "adc r3, %[r]\n\t"
  16494. #endif
  16495. "uxth r6, r7\n\t"
  16496. #ifdef WOLFSSL_KEIL
  16497. "muls r5, r6, r5\n\t"
  16498. #elif defined(__clang__)
  16499. "muls r5, r6\n\t"
  16500. #else
  16501. "mul r5, r6\n\t"
  16502. #endif
  16503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16504. "lsrs r6, r5, #16\n\t"
  16505. #else
  16506. "lsr r6, r5, #16\n\t"
  16507. #endif
  16508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16509. "lsls r5, r5, #16\n\t"
  16510. #else
  16511. "lsl r5, r5, #16\n\t"
  16512. #endif
  16513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16514. "adds r4, r4, r5\n\t"
  16515. #else
  16516. "add r4, r4, r5\n\t"
  16517. #endif
  16518. #ifdef WOLFSSL_KEIL
  16519. "adcs r2, r2, r6\n\t"
  16520. #elif defined(__clang__)
  16521. "adcs r2, r6\n\t"
  16522. #else
  16523. "adc r2, r6\n\t"
  16524. #endif
  16525. #ifdef WOLFSSL_KEIL
  16526. "adcs r3, r3, %[r]\n\t"
  16527. #elif defined(__clang__)
  16528. "adcs r3, %[r]\n\t"
  16529. #else
  16530. "adc r3, %[r]\n\t"
  16531. #endif
  16532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16533. "adds r4, r4, r5\n\t"
  16534. #else
  16535. "add r4, r4, r5\n\t"
  16536. #endif
  16537. #ifdef WOLFSSL_KEIL
  16538. "adcs r2, r2, r6\n\t"
  16539. #elif defined(__clang__)
  16540. "adcs r2, r6\n\t"
  16541. #else
  16542. "adc r2, r6\n\t"
  16543. #endif
  16544. #ifdef WOLFSSL_KEIL
  16545. "adcs r3, r3, %[r]\n\t"
  16546. #elif defined(__clang__)
  16547. "adcs r3, %[r]\n\t"
  16548. #else
  16549. "adc r3, %[r]\n\t"
  16550. #endif
  16551. "# A[6] * A[2]\n\t"
  16552. "mov %[a], r9\n\t"
  16553. "mov r7, r12\n\t"
  16554. "ldr %[a], [%[a], #24]\n\t"
  16555. "uxth r5, %[a]\n\t"
  16556. "uxth r6, r7\n\t"
  16557. #ifdef WOLFSSL_KEIL
  16558. "muls r6, r5, r6\n\t"
  16559. #elif defined(__clang__)
  16560. "muls r6, r5\n\t"
  16561. #else
  16562. "mul r6, r5\n\t"
  16563. #endif
  16564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16565. "adds r4, r4, r6\n\t"
  16566. #else
  16567. "add r4, r4, r6\n\t"
  16568. #endif
  16569. #ifdef WOLFSSL_KEIL
  16570. "adcs r2, r2, %[r]\n\t"
  16571. #elif defined(__clang__)
  16572. "adcs r2, %[r]\n\t"
  16573. #else
  16574. "adc r2, %[r]\n\t"
  16575. #endif
  16576. #ifdef WOLFSSL_KEIL
  16577. "adcs r3, r3, %[r]\n\t"
  16578. #elif defined(__clang__)
  16579. "adcs r3, %[r]\n\t"
  16580. #else
  16581. "adc r3, %[r]\n\t"
  16582. #endif
  16583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16584. "adds r4, r4, r6\n\t"
  16585. #else
  16586. "add r4, r4, r6\n\t"
  16587. #endif
  16588. #ifdef WOLFSSL_KEIL
  16589. "adcs r2, r2, %[r]\n\t"
  16590. #elif defined(__clang__)
  16591. "adcs r2, %[r]\n\t"
  16592. #else
  16593. "adc r2, %[r]\n\t"
  16594. #endif
  16595. #ifdef WOLFSSL_KEIL
  16596. "adcs r3, r3, %[r]\n\t"
  16597. #elif defined(__clang__)
  16598. "adcs r3, %[r]\n\t"
  16599. #else
  16600. "adc r3, %[r]\n\t"
  16601. #endif
  16602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16603. "lsrs r6, r7, #16\n\t"
  16604. #else
  16605. "lsr r6, r7, #16\n\t"
  16606. #endif
  16607. #ifdef WOLFSSL_KEIL
  16608. "muls r5, r6, r5\n\t"
  16609. #elif defined(__clang__)
  16610. "muls r5, r6\n\t"
  16611. #else
  16612. "mul r5, r6\n\t"
  16613. #endif
  16614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16615. "lsrs r6, r5, #16\n\t"
  16616. #else
  16617. "lsr r6, r5, #16\n\t"
  16618. #endif
  16619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16620. "lsls r5, r5, #16\n\t"
  16621. #else
  16622. "lsl r5, r5, #16\n\t"
  16623. #endif
  16624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16625. "adds r4, r4, r5\n\t"
  16626. #else
  16627. "add r4, r4, r5\n\t"
  16628. #endif
  16629. #ifdef WOLFSSL_KEIL
  16630. "adcs r2, r2, r6\n\t"
  16631. #elif defined(__clang__)
  16632. "adcs r2, r6\n\t"
  16633. #else
  16634. "adc r2, r6\n\t"
  16635. #endif
  16636. #ifdef WOLFSSL_KEIL
  16637. "adcs r3, r3, %[r]\n\t"
  16638. #elif defined(__clang__)
  16639. "adcs r3, %[r]\n\t"
  16640. #else
  16641. "adc r3, %[r]\n\t"
  16642. #endif
  16643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16644. "adds r4, r4, r5\n\t"
  16645. #else
  16646. "add r4, r4, r5\n\t"
  16647. #endif
  16648. #ifdef WOLFSSL_KEIL
  16649. "adcs r2, r2, r6\n\t"
  16650. #elif defined(__clang__)
  16651. "adcs r2, r6\n\t"
  16652. #else
  16653. "adc r2, r6\n\t"
  16654. #endif
  16655. #ifdef WOLFSSL_KEIL
  16656. "adcs r3, r3, %[r]\n\t"
  16657. #elif defined(__clang__)
  16658. "adcs r3, %[r]\n\t"
  16659. #else
  16660. "adc r3, %[r]\n\t"
  16661. #endif
  16662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16663. "lsrs r5, %[a], #16\n\t"
  16664. #else
  16665. "lsr r5, %[a], #16\n\t"
  16666. #endif
  16667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16668. "lsrs r6, r7, #16\n\t"
  16669. #else
  16670. "lsr r6, r7, #16\n\t"
  16671. #endif
  16672. #ifdef WOLFSSL_KEIL
  16673. "muls r6, r5, r6\n\t"
  16674. #elif defined(__clang__)
  16675. "muls r6, r5\n\t"
  16676. #else
  16677. "mul r6, r5\n\t"
  16678. #endif
  16679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16680. "adds r2, r2, r6\n\t"
  16681. #else
  16682. "add r2, r2, r6\n\t"
  16683. #endif
  16684. #ifdef WOLFSSL_KEIL
  16685. "adcs r3, r3, %[r]\n\t"
  16686. #elif defined(__clang__)
  16687. "adcs r3, %[r]\n\t"
  16688. #else
  16689. "adc r3, %[r]\n\t"
  16690. #endif
  16691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16692. "adds r2, r2, r6\n\t"
  16693. #else
  16694. "add r2, r2, r6\n\t"
  16695. #endif
  16696. #ifdef WOLFSSL_KEIL
  16697. "adcs r3, r3, %[r]\n\t"
  16698. #elif defined(__clang__)
  16699. "adcs r3, %[r]\n\t"
  16700. #else
  16701. "adc r3, %[r]\n\t"
  16702. #endif
  16703. "uxth r6, r7\n\t"
  16704. #ifdef WOLFSSL_KEIL
  16705. "muls r5, r6, r5\n\t"
  16706. #elif defined(__clang__)
  16707. "muls r5, r6\n\t"
  16708. #else
  16709. "mul r5, r6\n\t"
  16710. #endif
  16711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16712. "lsrs r6, r5, #16\n\t"
  16713. #else
  16714. "lsr r6, r5, #16\n\t"
  16715. #endif
  16716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16717. "lsls r5, r5, #16\n\t"
  16718. #else
  16719. "lsl r5, r5, #16\n\t"
  16720. #endif
  16721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16722. "adds r4, r4, r5\n\t"
  16723. #else
  16724. "add r4, r4, r5\n\t"
  16725. #endif
  16726. #ifdef WOLFSSL_KEIL
  16727. "adcs r2, r2, r6\n\t"
  16728. #elif defined(__clang__)
  16729. "adcs r2, r6\n\t"
  16730. #else
  16731. "adc r2, r6\n\t"
  16732. #endif
  16733. #ifdef WOLFSSL_KEIL
  16734. "adcs r3, r3, %[r]\n\t"
  16735. #elif defined(__clang__)
  16736. "adcs r3, %[r]\n\t"
  16737. #else
  16738. "adc r3, %[r]\n\t"
  16739. #endif
  16740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16741. "adds r4, r4, r5\n\t"
  16742. #else
  16743. "add r4, r4, r5\n\t"
  16744. #endif
  16745. #ifdef WOLFSSL_KEIL
  16746. "adcs r2, r2, r6\n\t"
  16747. #elif defined(__clang__)
  16748. "adcs r2, r6\n\t"
  16749. #else
  16750. "adc r2, r6\n\t"
  16751. #endif
  16752. #ifdef WOLFSSL_KEIL
  16753. "adcs r3, r3, %[r]\n\t"
  16754. #elif defined(__clang__)
  16755. "adcs r3, %[r]\n\t"
  16756. #else
  16757. "adc r3, %[r]\n\t"
  16758. #endif
  16759. "# A[5] * A[3]\n\t"
  16760. "mov %[a], r9\n\t"
  16761. "mov r7, lr\n\t"
  16762. "ldr %[a], [%[a], #20]\n\t"
  16763. "uxth r5, %[a]\n\t"
  16764. "uxth r6, r7\n\t"
  16765. #ifdef WOLFSSL_KEIL
  16766. "muls r6, r5, r6\n\t"
  16767. #elif defined(__clang__)
  16768. "muls r6, r5\n\t"
  16769. #else
  16770. "mul r6, r5\n\t"
  16771. #endif
  16772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16773. "adds r4, r4, r6\n\t"
  16774. #else
  16775. "add r4, r4, r6\n\t"
  16776. #endif
  16777. #ifdef WOLFSSL_KEIL
  16778. "adcs r2, r2, %[r]\n\t"
  16779. #elif defined(__clang__)
  16780. "adcs r2, %[r]\n\t"
  16781. #else
  16782. "adc r2, %[r]\n\t"
  16783. #endif
  16784. #ifdef WOLFSSL_KEIL
  16785. "adcs r3, r3, %[r]\n\t"
  16786. #elif defined(__clang__)
  16787. "adcs r3, %[r]\n\t"
  16788. #else
  16789. "adc r3, %[r]\n\t"
  16790. #endif
  16791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16792. "adds r4, r4, r6\n\t"
  16793. #else
  16794. "add r4, r4, r6\n\t"
  16795. #endif
  16796. #ifdef WOLFSSL_KEIL
  16797. "adcs r2, r2, %[r]\n\t"
  16798. #elif defined(__clang__)
  16799. "adcs r2, %[r]\n\t"
  16800. #else
  16801. "adc r2, %[r]\n\t"
  16802. #endif
  16803. #ifdef WOLFSSL_KEIL
  16804. "adcs r3, r3, %[r]\n\t"
  16805. #elif defined(__clang__)
  16806. "adcs r3, %[r]\n\t"
  16807. #else
  16808. "adc r3, %[r]\n\t"
  16809. #endif
  16810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16811. "lsrs r6, r7, #16\n\t"
  16812. #else
  16813. "lsr r6, r7, #16\n\t"
  16814. #endif
  16815. #ifdef WOLFSSL_KEIL
  16816. "muls r5, r6, r5\n\t"
  16817. #elif defined(__clang__)
  16818. "muls r5, r6\n\t"
  16819. #else
  16820. "mul r5, r6\n\t"
  16821. #endif
  16822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16823. "lsrs r6, r5, #16\n\t"
  16824. #else
  16825. "lsr r6, r5, #16\n\t"
  16826. #endif
  16827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16828. "lsls r5, r5, #16\n\t"
  16829. #else
  16830. "lsl r5, r5, #16\n\t"
  16831. #endif
  16832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16833. "adds r4, r4, r5\n\t"
  16834. #else
  16835. "add r4, r4, r5\n\t"
  16836. #endif
  16837. #ifdef WOLFSSL_KEIL
  16838. "adcs r2, r2, r6\n\t"
  16839. #elif defined(__clang__)
  16840. "adcs r2, r6\n\t"
  16841. #else
  16842. "adc r2, r6\n\t"
  16843. #endif
  16844. #ifdef WOLFSSL_KEIL
  16845. "adcs r3, r3, %[r]\n\t"
  16846. #elif defined(__clang__)
  16847. "adcs r3, %[r]\n\t"
  16848. #else
  16849. "adc r3, %[r]\n\t"
  16850. #endif
  16851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16852. "adds r4, r4, r5\n\t"
  16853. #else
  16854. "add r4, r4, r5\n\t"
  16855. #endif
  16856. #ifdef WOLFSSL_KEIL
  16857. "adcs r2, r2, r6\n\t"
  16858. #elif defined(__clang__)
  16859. "adcs r2, r6\n\t"
  16860. #else
  16861. "adc r2, r6\n\t"
  16862. #endif
  16863. #ifdef WOLFSSL_KEIL
  16864. "adcs r3, r3, %[r]\n\t"
  16865. #elif defined(__clang__)
  16866. "adcs r3, %[r]\n\t"
  16867. #else
  16868. "adc r3, %[r]\n\t"
  16869. #endif
  16870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16871. "lsrs r5, %[a], #16\n\t"
  16872. #else
  16873. "lsr r5, %[a], #16\n\t"
  16874. #endif
  16875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16876. "lsrs r6, r7, #16\n\t"
  16877. #else
  16878. "lsr r6, r7, #16\n\t"
  16879. #endif
  16880. #ifdef WOLFSSL_KEIL
  16881. "muls r6, r5, r6\n\t"
  16882. #elif defined(__clang__)
  16883. "muls r6, r5\n\t"
  16884. #else
  16885. "mul r6, r5\n\t"
  16886. #endif
  16887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16888. "adds r2, r2, r6\n\t"
  16889. #else
  16890. "add r2, r2, r6\n\t"
  16891. #endif
  16892. #ifdef WOLFSSL_KEIL
  16893. "adcs r3, r3, %[r]\n\t"
  16894. #elif defined(__clang__)
  16895. "adcs r3, %[r]\n\t"
  16896. #else
  16897. "adc r3, %[r]\n\t"
  16898. #endif
  16899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16900. "adds r2, r2, r6\n\t"
  16901. #else
  16902. "add r2, r2, r6\n\t"
  16903. #endif
  16904. #ifdef WOLFSSL_KEIL
  16905. "adcs r3, r3, %[r]\n\t"
  16906. #elif defined(__clang__)
  16907. "adcs r3, %[r]\n\t"
  16908. #else
  16909. "adc r3, %[r]\n\t"
  16910. #endif
  16911. "uxth r6, r7\n\t"
  16912. #ifdef WOLFSSL_KEIL
  16913. "muls r5, r6, r5\n\t"
  16914. #elif defined(__clang__)
  16915. "muls r5, r6\n\t"
  16916. #else
  16917. "mul r5, r6\n\t"
  16918. #endif
  16919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16920. "lsrs r6, r5, #16\n\t"
  16921. #else
  16922. "lsr r6, r5, #16\n\t"
  16923. #endif
  16924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16925. "lsls r5, r5, #16\n\t"
  16926. #else
  16927. "lsl r5, r5, #16\n\t"
  16928. #endif
  16929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16930. "adds r4, r4, r5\n\t"
  16931. #else
  16932. "add r4, r4, r5\n\t"
  16933. #endif
  16934. #ifdef WOLFSSL_KEIL
  16935. "adcs r2, r2, r6\n\t"
  16936. #elif defined(__clang__)
  16937. "adcs r2, r6\n\t"
  16938. #else
  16939. "adc r2, r6\n\t"
  16940. #endif
  16941. #ifdef WOLFSSL_KEIL
  16942. "adcs r3, r3, %[r]\n\t"
  16943. #elif defined(__clang__)
  16944. "adcs r3, %[r]\n\t"
  16945. #else
  16946. "adc r3, %[r]\n\t"
  16947. #endif
  16948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16949. "adds r4, r4, r5\n\t"
  16950. #else
  16951. "add r4, r4, r5\n\t"
  16952. #endif
  16953. #ifdef WOLFSSL_KEIL
  16954. "adcs r2, r2, r6\n\t"
  16955. #elif defined(__clang__)
  16956. "adcs r2, r6\n\t"
  16957. #else
  16958. "adc r2, r6\n\t"
  16959. #endif
  16960. #ifdef WOLFSSL_KEIL
  16961. "adcs r3, r3, %[r]\n\t"
  16962. #elif defined(__clang__)
  16963. "adcs r3, %[r]\n\t"
  16964. #else
  16965. "adc r3, %[r]\n\t"
  16966. #endif
  16967. "# A[4] * A[4]\n\t"
  16968. "mov %[a], r9\n\t"
  16969. "ldr r7, [%[a], #16]\n\t"
  16970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16971. "lsrs r6, r7, #16\n\t"
  16972. #else
  16973. "lsr r6, r7, #16\n\t"
  16974. #endif
  16975. "uxth r5, r7\n\t"
  16976. #ifdef WOLFSSL_KEIL
  16977. "muls r5, r5, r5\n\t"
  16978. #elif defined(__clang__)
  16979. "muls r5, r5\n\t"
  16980. #else
  16981. "mul r5, r5\n\t"
  16982. #endif
  16983. #ifdef WOLFSSL_KEIL
  16984. "muls r6, r6, r6\n\t"
  16985. #elif defined(__clang__)
  16986. "muls r6, r6\n\t"
  16987. #else
  16988. "mul r6, r6\n\t"
  16989. #endif
  16990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  16991. "adds r4, r4, r5\n\t"
  16992. #else
  16993. "add r4, r4, r5\n\t"
  16994. #endif
  16995. #ifdef WOLFSSL_KEIL
  16996. "adcs r2, r2, r6\n\t"
  16997. #elif defined(__clang__)
  16998. "adcs r2, r6\n\t"
  16999. #else
  17000. "adc r2, r6\n\t"
  17001. #endif
  17002. #ifdef WOLFSSL_KEIL
  17003. "adcs r3, r3, %[r]\n\t"
  17004. #elif defined(__clang__)
  17005. "adcs r3, %[r]\n\t"
  17006. #else
  17007. "adc r3, %[r]\n\t"
  17008. #endif
  17009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17010. "lsrs r6, r7, #16\n\t"
  17011. #else
  17012. "lsr r6, r7, #16\n\t"
  17013. #endif
  17014. "uxth r5, r7\n\t"
  17015. #ifdef WOLFSSL_KEIL
  17016. "muls r5, r6, r5\n\t"
  17017. #elif defined(__clang__)
  17018. "muls r5, r6\n\t"
  17019. #else
  17020. "mul r5, r6\n\t"
  17021. #endif
  17022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17023. "lsrs r6, r5, #15\n\t"
  17024. #else
  17025. "lsr r6, r5, #15\n\t"
  17026. #endif
  17027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17028. "lsls r5, r5, #17\n\t"
  17029. #else
  17030. "lsl r5, r5, #17\n\t"
  17031. #endif
  17032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17033. "adds r4, r4, r5\n\t"
  17034. #else
  17035. "add r4, r4, r5\n\t"
  17036. #endif
  17037. #ifdef WOLFSSL_KEIL
  17038. "adcs r2, r2, r6\n\t"
  17039. #elif defined(__clang__)
  17040. "adcs r2, r6\n\t"
  17041. #else
  17042. "adc r2, r6\n\t"
  17043. #endif
  17044. #ifdef WOLFSSL_KEIL
  17045. "adcs r3, r3, %[r]\n\t"
  17046. #elif defined(__clang__)
  17047. "adcs r3, %[r]\n\t"
  17048. #else
  17049. "adc r3, %[r]\n\t"
  17050. #endif
  17051. "mov %[r], r8\n\t"
  17052. "str r4, [%[r], #32]\n\t"
  17053. "movs %[r], #0\n\t"
  17054. "movs %[a], #16\n\t"
  17055. "add %[a], %[a], r9\n\t"
  17056. "ldm %[a]!, {r5, r6}\n\t"
  17057. "mov r10, r5\n\t"
  17058. "mov r11, r6\n\t"
  17059. "ldm %[a]!, {r5, r6}\n\t"
  17060. "mov r12, r5\n\t"
  17061. "mov lr, r6\n\t"
  17062. "mov %[a], r9\n\t"
  17063. "# A[5] * A[4]\n\t"
  17064. "movs r4, #0\n\t"
  17065. "mov %[a], r11\n\t"
  17066. "uxth r5, %[a]\n\t"
  17067. "uxth r6, r7\n\t"
  17068. #ifdef WOLFSSL_KEIL
  17069. "muls r6, r5, r6\n\t"
  17070. #elif defined(__clang__)
  17071. "muls r6, r5\n\t"
  17072. #else
  17073. "mul r6, r5\n\t"
  17074. #endif
  17075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17076. "adds r2, r2, r6\n\t"
  17077. #else
  17078. "add r2, r2, r6\n\t"
  17079. #endif
  17080. #ifdef WOLFSSL_KEIL
  17081. "adcs r3, r3, %[r]\n\t"
  17082. #elif defined(__clang__)
  17083. "adcs r3, %[r]\n\t"
  17084. #else
  17085. "adc r3, %[r]\n\t"
  17086. #endif
  17087. #ifdef WOLFSSL_KEIL
  17088. "adcs r4, r4, %[r]\n\t"
  17089. #elif defined(__clang__)
  17090. "adcs r4, %[r]\n\t"
  17091. #else
  17092. "adc r4, %[r]\n\t"
  17093. #endif
  17094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17095. "adds r2, r2, r6\n\t"
  17096. #else
  17097. "add r2, r2, r6\n\t"
  17098. #endif
  17099. #ifdef WOLFSSL_KEIL
  17100. "adcs r3, r3, %[r]\n\t"
  17101. #elif defined(__clang__)
  17102. "adcs r3, %[r]\n\t"
  17103. #else
  17104. "adc r3, %[r]\n\t"
  17105. #endif
  17106. #ifdef WOLFSSL_KEIL
  17107. "adcs r4, r4, %[r]\n\t"
  17108. #elif defined(__clang__)
  17109. "adcs r4, %[r]\n\t"
  17110. #else
  17111. "adc r4, %[r]\n\t"
  17112. #endif
  17113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17114. "lsrs r6, r7, #16\n\t"
  17115. #else
  17116. "lsr r6, r7, #16\n\t"
  17117. #endif
  17118. #ifdef WOLFSSL_KEIL
  17119. "muls r5, r6, r5\n\t"
  17120. #elif defined(__clang__)
  17121. "muls r5, r6\n\t"
  17122. #else
  17123. "mul r5, r6\n\t"
  17124. #endif
  17125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17126. "lsrs r6, r5, #16\n\t"
  17127. #else
  17128. "lsr r6, r5, #16\n\t"
  17129. #endif
  17130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17131. "lsls r5, r5, #16\n\t"
  17132. #else
  17133. "lsl r5, r5, #16\n\t"
  17134. #endif
  17135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17136. "adds r2, r2, r5\n\t"
  17137. #else
  17138. "add r2, r2, r5\n\t"
  17139. #endif
  17140. #ifdef WOLFSSL_KEIL
  17141. "adcs r3, r3, r6\n\t"
  17142. #elif defined(__clang__)
  17143. "adcs r3, r6\n\t"
  17144. #else
  17145. "adc r3, r6\n\t"
  17146. #endif
  17147. #ifdef WOLFSSL_KEIL
  17148. "adcs r4, r4, %[r]\n\t"
  17149. #elif defined(__clang__)
  17150. "adcs r4, %[r]\n\t"
  17151. #else
  17152. "adc r4, %[r]\n\t"
  17153. #endif
  17154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17155. "adds r2, r2, r5\n\t"
  17156. #else
  17157. "add r2, r2, r5\n\t"
  17158. #endif
  17159. #ifdef WOLFSSL_KEIL
  17160. "adcs r3, r3, r6\n\t"
  17161. #elif defined(__clang__)
  17162. "adcs r3, r6\n\t"
  17163. #else
  17164. "adc r3, r6\n\t"
  17165. #endif
  17166. #ifdef WOLFSSL_KEIL
  17167. "adcs r4, r4, %[r]\n\t"
  17168. #elif defined(__clang__)
  17169. "adcs r4, %[r]\n\t"
  17170. #else
  17171. "adc r4, %[r]\n\t"
  17172. #endif
  17173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17174. "lsrs r5, %[a], #16\n\t"
  17175. #else
  17176. "lsr r5, %[a], #16\n\t"
  17177. #endif
  17178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17179. "lsrs r6, r7, #16\n\t"
  17180. #else
  17181. "lsr r6, r7, #16\n\t"
  17182. #endif
  17183. #ifdef WOLFSSL_KEIL
  17184. "muls r6, r5, r6\n\t"
  17185. #elif defined(__clang__)
  17186. "muls r6, r5\n\t"
  17187. #else
  17188. "mul r6, r5\n\t"
  17189. #endif
  17190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17191. "adds r3, r3, r6\n\t"
  17192. #else
  17193. "add r3, r3, r6\n\t"
  17194. #endif
  17195. #ifdef WOLFSSL_KEIL
  17196. "adcs r4, r4, %[r]\n\t"
  17197. #elif defined(__clang__)
  17198. "adcs r4, %[r]\n\t"
  17199. #else
  17200. "adc r4, %[r]\n\t"
  17201. #endif
  17202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17203. "adds r3, r3, r6\n\t"
  17204. #else
  17205. "add r3, r3, r6\n\t"
  17206. #endif
  17207. #ifdef WOLFSSL_KEIL
  17208. "adcs r4, r4, %[r]\n\t"
  17209. #elif defined(__clang__)
  17210. "adcs r4, %[r]\n\t"
  17211. #else
  17212. "adc r4, %[r]\n\t"
  17213. #endif
  17214. "uxth r6, r7\n\t"
  17215. #ifdef WOLFSSL_KEIL
  17216. "muls r5, r6, r5\n\t"
  17217. #elif defined(__clang__)
  17218. "muls r5, r6\n\t"
  17219. #else
  17220. "mul r5, r6\n\t"
  17221. #endif
  17222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17223. "lsrs r6, r5, #16\n\t"
  17224. #else
  17225. "lsr r6, r5, #16\n\t"
  17226. #endif
  17227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17228. "lsls r5, r5, #16\n\t"
  17229. #else
  17230. "lsl r5, r5, #16\n\t"
  17231. #endif
  17232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17233. "adds r2, r2, r5\n\t"
  17234. #else
  17235. "add r2, r2, r5\n\t"
  17236. #endif
  17237. #ifdef WOLFSSL_KEIL
  17238. "adcs r3, r3, r6\n\t"
  17239. #elif defined(__clang__)
  17240. "adcs r3, r6\n\t"
  17241. #else
  17242. "adc r3, r6\n\t"
  17243. #endif
  17244. #ifdef WOLFSSL_KEIL
  17245. "adcs r4, r4, %[r]\n\t"
  17246. #elif defined(__clang__)
  17247. "adcs r4, %[r]\n\t"
  17248. #else
  17249. "adc r4, %[r]\n\t"
  17250. #endif
  17251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17252. "adds r2, r2, r5\n\t"
  17253. #else
  17254. "add r2, r2, r5\n\t"
  17255. #endif
  17256. #ifdef WOLFSSL_KEIL
  17257. "adcs r3, r3, r6\n\t"
  17258. #elif defined(__clang__)
  17259. "adcs r3, r6\n\t"
  17260. #else
  17261. "adc r3, r6\n\t"
  17262. #endif
  17263. #ifdef WOLFSSL_KEIL
  17264. "adcs r4, r4, %[r]\n\t"
  17265. #elif defined(__clang__)
  17266. "adcs r4, %[r]\n\t"
  17267. #else
  17268. "adc r4, %[r]\n\t"
  17269. #endif
  17270. "# A[6] * A[3]\n\t"
  17271. "mov %[a], r9\n\t"
  17272. "ldr r7, [%[a], #12]\n\t"
  17273. "mov %[a], r12\n\t"
  17274. "uxth r5, %[a]\n\t"
  17275. "uxth r6, r7\n\t"
  17276. #ifdef WOLFSSL_KEIL
  17277. "muls r6, r5, r6\n\t"
  17278. #elif defined(__clang__)
  17279. "muls r6, r5\n\t"
  17280. #else
  17281. "mul r6, r5\n\t"
  17282. #endif
  17283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17284. "adds r2, r2, r6\n\t"
  17285. #else
  17286. "add r2, r2, r6\n\t"
  17287. #endif
  17288. #ifdef WOLFSSL_KEIL
  17289. "adcs r3, r3, %[r]\n\t"
  17290. #elif defined(__clang__)
  17291. "adcs r3, %[r]\n\t"
  17292. #else
  17293. "adc r3, %[r]\n\t"
  17294. #endif
  17295. #ifdef WOLFSSL_KEIL
  17296. "adcs r4, r4, %[r]\n\t"
  17297. #elif defined(__clang__)
  17298. "adcs r4, %[r]\n\t"
  17299. #else
  17300. "adc r4, %[r]\n\t"
  17301. #endif
  17302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17303. "adds r2, r2, r6\n\t"
  17304. #else
  17305. "add r2, r2, r6\n\t"
  17306. #endif
  17307. #ifdef WOLFSSL_KEIL
  17308. "adcs r3, r3, %[r]\n\t"
  17309. #elif defined(__clang__)
  17310. "adcs r3, %[r]\n\t"
  17311. #else
  17312. "adc r3, %[r]\n\t"
  17313. #endif
  17314. #ifdef WOLFSSL_KEIL
  17315. "adcs r4, r4, %[r]\n\t"
  17316. #elif defined(__clang__)
  17317. "adcs r4, %[r]\n\t"
  17318. #else
  17319. "adc r4, %[r]\n\t"
  17320. #endif
  17321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17322. "lsrs r6, r7, #16\n\t"
  17323. #else
  17324. "lsr r6, r7, #16\n\t"
  17325. #endif
  17326. #ifdef WOLFSSL_KEIL
  17327. "muls r5, r6, r5\n\t"
  17328. #elif defined(__clang__)
  17329. "muls r5, r6\n\t"
  17330. #else
  17331. "mul r5, r6\n\t"
  17332. #endif
  17333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17334. "lsrs r6, r5, #16\n\t"
  17335. #else
  17336. "lsr r6, r5, #16\n\t"
  17337. #endif
  17338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17339. "lsls r5, r5, #16\n\t"
  17340. #else
  17341. "lsl r5, r5, #16\n\t"
  17342. #endif
  17343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17344. "adds r2, r2, r5\n\t"
  17345. #else
  17346. "add r2, r2, r5\n\t"
  17347. #endif
  17348. #ifdef WOLFSSL_KEIL
  17349. "adcs r3, r3, r6\n\t"
  17350. #elif defined(__clang__)
  17351. "adcs r3, r6\n\t"
  17352. #else
  17353. "adc r3, r6\n\t"
  17354. #endif
  17355. #ifdef WOLFSSL_KEIL
  17356. "adcs r4, r4, %[r]\n\t"
  17357. #elif defined(__clang__)
  17358. "adcs r4, %[r]\n\t"
  17359. #else
  17360. "adc r4, %[r]\n\t"
  17361. #endif
  17362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17363. "adds r2, r2, r5\n\t"
  17364. #else
  17365. "add r2, r2, r5\n\t"
  17366. #endif
  17367. #ifdef WOLFSSL_KEIL
  17368. "adcs r3, r3, r6\n\t"
  17369. #elif defined(__clang__)
  17370. "adcs r3, r6\n\t"
  17371. #else
  17372. "adc r3, r6\n\t"
  17373. #endif
  17374. #ifdef WOLFSSL_KEIL
  17375. "adcs r4, r4, %[r]\n\t"
  17376. #elif defined(__clang__)
  17377. "adcs r4, %[r]\n\t"
  17378. #else
  17379. "adc r4, %[r]\n\t"
  17380. #endif
  17381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17382. "lsrs r5, %[a], #16\n\t"
  17383. #else
  17384. "lsr r5, %[a], #16\n\t"
  17385. #endif
  17386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17387. "lsrs r6, r7, #16\n\t"
  17388. #else
  17389. "lsr r6, r7, #16\n\t"
  17390. #endif
  17391. #ifdef WOLFSSL_KEIL
  17392. "muls r6, r5, r6\n\t"
  17393. #elif defined(__clang__)
  17394. "muls r6, r5\n\t"
  17395. #else
  17396. "mul r6, r5\n\t"
  17397. #endif
  17398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17399. "adds r3, r3, r6\n\t"
  17400. #else
  17401. "add r3, r3, r6\n\t"
  17402. #endif
  17403. #ifdef WOLFSSL_KEIL
  17404. "adcs r4, r4, %[r]\n\t"
  17405. #elif defined(__clang__)
  17406. "adcs r4, %[r]\n\t"
  17407. #else
  17408. "adc r4, %[r]\n\t"
  17409. #endif
  17410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17411. "adds r3, r3, r6\n\t"
  17412. #else
  17413. "add r3, r3, r6\n\t"
  17414. #endif
  17415. #ifdef WOLFSSL_KEIL
  17416. "adcs r4, r4, %[r]\n\t"
  17417. #elif defined(__clang__)
  17418. "adcs r4, %[r]\n\t"
  17419. #else
  17420. "adc r4, %[r]\n\t"
  17421. #endif
  17422. "uxth r6, r7\n\t"
  17423. #ifdef WOLFSSL_KEIL
  17424. "muls r5, r6, r5\n\t"
  17425. #elif defined(__clang__)
  17426. "muls r5, r6\n\t"
  17427. #else
  17428. "mul r5, r6\n\t"
  17429. #endif
  17430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17431. "lsrs r6, r5, #16\n\t"
  17432. #else
  17433. "lsr r6, r5, #16\n\t"
  17434. #endif
  17435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17436. "lsls r5, r5, #16\n\t"
  17437. #else
  17438. "lsl r5, r5, #16\n\t"
  17439. #endif
  17440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17441. "adds r2, r2, r5\n\t"
  17442. #else
  17443. "add r2, r2, r5\n\t"
  17444. #endif
  17445. #ifdef WOLFSSL_KEIL
  17446. "adcs r3, r3, r6\n\t"
  17447. #elif defined(__clang__)
  17448. "adcs r3, r6\n\t"
  17449. #else
  17450. "adc r3, r6\n\t"
  17451. #endif
  17452. #ifdef WOLFSSL_KEIL
  17453. "adcs r4, r4, %[r]\n\t"
  17454. #elif defined(__clang__)
  17455. "adcs r4, %[r]\n\t"
  17456. #else
  17457. "adc r4, %[r]\n\t"
  17458. #endif
  17459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17460. "adds r2, r2, r5\n\t"
  17461. #else
  17462. "add r2, r2, r5\n\t"
  17463. #endif
  17464. #ifdef WOLFSSL_KEIL
  17465. "adcs r3, r3, r6\n\t"
  17466. #elif defined(__clang__)
  17467. "adcs r3, r6\n\t"
  17468. #else
  17469. "adc r3, r6\n\t"
  17470. #endif
  17471. #ifdef WOLFSSL_KEIL
  17472. "adcs r4, r4, %[r]\n\t"
  17473. #elif defined(__clang__)
  17474. "adcs r4, %[r]\n\t"
  17475. #else
  17476. "adc r4, %[r]\n\t"
  17477. #endif
  17478. "# A[7] * A[2]\n\t"
  17479. "mov %[a], r9\n\t"
  17480. "ldr r7, [%[a], #8]\n\t"
  17481. "mov %[a], lr\n\t"
  17482. "uxth r5, %[a]\n\t"
  17483. "uxth r6, r7\n\t"
  17484. #ifdef WOLFSSL_KEIL
  17485. "muls r6, r5, r6\n\t"
  17486. #elif defined(__clang__)
  17487. "muls r6, r5\n\t"
  17488. #else
  17489. "mul r6, r5\n\t"
  17490. #endif
  17491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17492. "adds r2, r2, r6\n\t"
  17493. #else
  17494. "add r2, r2, r6\n\t"
  17495. #endif
  17496. #ifdef WOLFSSL_KEIL
  17497. "adcs r3, r3, %[r]\n\t"
  17498. #elif defined(__clang__)
  17499. "adcs r3, %[r]\n\t"
  17500. #else
  17501. "adc r3, %[r]\n\t"
  17502. #endif
  17503. #ifdef WOLFSSL_KEIL
  17504. "adcs r4, r4, %[r]\n\t"
  17505. #elif defined(__clang__)
  17506. "adcs r4, %[r]\n\t"
  17507. #else
  17508. "adc r4, %[r]\n\t"
  17509. #endif
  17510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17511. "adds r2, r2, r6\n\t"
  17512. #else
  17513. "add r2, r2, r6\n\t"
  17514. #endif
  17515. #ifdef WOLFSSL_KEIL
  17516. "adcs r3, r3, %[r]\n\t"
  17517. #elif defined(__clang__)
  17518. "adcs r3, %[r]\n\t"
  17519. #else
  17520. "adc r3, %[r]\n\t"
  17521. #endif
  17522. #ifdef WOLFSSL_KEIL
  17523. "adcs r4, r4, %[r]\n\t"
  17524. #elif defined(__clang__)
  17525. "adcs r4, %[r]\n\t"
  17526. #else
  17527. "adc r4, %[r]\n\t"
  17528. #endif
  17529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17530. "lsrs r6, r7, #16\n\t"
  17531. #else
  17532. "lsr r6, r7, #16\n\t"
  17533. #endif
  17534. #ifdef WOLFSSL_KEIL
  17535. "muls r5, r6, r5\n\t"
  17536. #elif defined(__clang__)
  17537. "muls r5, r6\n\t"
  17538. #else
  17539. "mul r5, r6\n\t"
  17540. #endif
  17541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17542. "lsrs r6, r5, #16\n\t"
  17543. #else
  17544. "lsr r6, r5, #16\n\t"
  17545. #endif
  17546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17547. "lsls r5, r5, #16\n\t"
  17548. #else
  17549. "lsl r5, r5, #16\n\t"
  17550. #endif
  17551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17552. "adds r2, r2, r5\n\t"
  17553. #else
  17554. "add r2, r2, r5\n\t"
  17555. #endif
  17556. #ifdef WOLFSSL_KEIL
  17557. "adcs r3, r3, r6\n\t"
  17558. #elif defined(__clang__)
  17559. "adcs r3, r6\n\t"
  17560. #else
  17561. "adc r3, r6\n\t"
  17562. #endif
  17563. #ifdef WOLFSSL_KEIL
  17564. "adcs r4, r4, %[r]\n\t"
  17565. #elif defined(__clang__)
  17566. "adcs r4, %[r]\n\t"
  17567. #else
  17568. "adc r4, %[r]\n\t"
  17569. #endif
  17570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17571. "adds r2, r2, r5\n\t"
  17572. #else
  17573. "add r2, r2, r5\n\t"
  17574. #endif
  17575. #ifdef WOLFSSL_KEIL
  17576. "adcs r3, r3, r6\n\t"
  17577. #elif defined(__clang__)
  17578. "adcs r3, r6\n\t"
  17579. #else
  17580. "adc r3, r6\n\t"
  17581. #endif
  17582. #ifdef WOLFSSL_KEIL
  17583. "adcs r4, r4, %[r]\n\t"
  17584. #elif defined(__clang__)
  17585. "adcs r4, %[r]\n\t"
  17586. #else
  17587. "adc r4, %[r]\n\t"
  17588. #endif
  17589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17590. "lsrs r5, %[a], #16\n\t"
  17591. #else
  17592. "lsr r5, %[a], #16\n\t"
  17593. #endif
  17594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17595. "lsrs r6, r7, #16\n\t"
  17596. #else
  17597. "lsr r6, r7, #16\n\t"
  17598. #endif
  17599. #ifdef WOLFSSL_KEIL
  17600. "muls r6, r5, r6\n\t"
  17601. #elif defined(__clang__)
  17602. "muls r6, r5\n\t"
  17603. #else
  17604. "mul r6, r5\n\t"
  17605. #endif
  17606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17607. "adds r3, r3, r6\n\t"
  17608. #else
  17609. "add r3, r3, r6\n\t"
  17610. #endif
  17611. #ifdef WOLFSSL_KEIL
  17612. "adcs r4, r4, %[r]\n\t"
  17613. #elif defined(__clang__)
  17614. "adcs r4, %[r]\n\t"
  17615. #else
  17616. "adc r4, %[r]\n\t"
  17617. #endif
  17618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17619. "adds r3, r3, r6\n\t"
  17620. #else
  17621. "add r3, r3, r6\n\t"
  17622. #endif
  17623. #ifdef WOLFSSL_KEIL
  17624. "adcs r4, r4, %[r]\n\t"
  17625. #elif defined(__clang__)
  17626. "adcs r4, %[r]\n\t"
  17627. #else
  17628. "adc r4, %[r]\n\t"
  17629. #endif
  17630. "uxth r6, r7\n\t"
  17631. #ifdef WOLFSSL_KEIL
  17632. "muls r5, r6, r5\n\t"
  17633. #elif defined(__clang__)
  17634. "muls r5, r6\n\t"
  17635. #else
  17636. "mul r5, r6\n\t"
  17637. #endif
  17638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17639. "lsrs r6, r5, #16\n\t"
  17640. #else
  17641. "lsr r6, r5, #16\n\t"
  17642. #endif
  17643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17644. "lsls r5, r5, #16\n\t"
  17645. #else
  17646. "lsl r5, r5, #16\n\t"
  17647. #endif
  17648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17649. "adds r2, r2, r5\n\t"
  17650. #else
  17651. "add r2, r2, r5\n\t"
  17652. #endif
  17653. #ifdef WOLFSSL_KEIL
  17654. "adcs r3, r3, r6\n\t"
  17655. #elif defined(__clang__)
  17656. "adcs r3, r6\n\t"
  17657. #else
  17658. "adc r3, r6\n\t"
  17659. #endif
  17660. #ifdef WOLFSSL_KEIL
  17661. "adcs r4, r4, %[r]\n\t"
  17662. #elif defined(__clang__)
  17663. "adcs r4, %[r]\n\t"
  17664. #else
  17665. "adc r4, %[r]\n\t"
  17666. #endif
  17667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17668. "adds r2, r2, r5\n\t"
  17669. #else
  17670. "add r2, r2, r5\n\t"
  17671. #endif
  17672. #ifdef WOLFSSL_KEIL
  17673. "adcs r3, r3, r6\n\t"
  17674. #elif defined(__clang__)
  17675. "adcs r3, r6\n\t"
  17676. #else
  17677. "adc r3, r6\n\t"
  17678. #endif
  17679. #ifdef WOLFSSL_KEIL
  17680. "adcs r4, r4, %[r]\n\t"
  17681. #elif defined(__clang__)
  17682. "adcs r4, %[r]\n\t"
  17683. #else
  17684. "adc r4, %[r]\n\t"
  17685. #endif
  17686. "mov %[r], r8\n\t"
  17687. "str r2, [%[r], #36]\n\t"
  17688. "movs %[r], #0\n\t"
  17689. "# A[7] * A[3]\n\t"
  17690. "movs r2, #0\n\t"
  17691. "mov %[a], r9\n\t"
  17692. "ldr r7, [%[a], #12]\n\t"
  17693. "mov %[a], lr\n\t"
  17694. "uxth r5, %[a]\n\t"
  17695. "uxth r6, r7\n\t"
  17696. #ifdef WOLFSSL_KEIL
  17697. "muls r6, r5, r6\n\t"
  17698. #elif defined(__clang__)
  17699. "muls r6, r5\n\t"
  17700. #else
  17701. "mul r6, r5\n\t"
  17702. #endif
  17703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17704. "adds r3, r3, r6\n\t"
  17705. #else
  17706. "add r3, r3, r6\n\t"
  17707. #endif
  17708. #ifdef WOLFSSL_KEIL
  17709. "adcs r4, r4, %[r]\n\t"
  17710. #elif defined(__clang__)
  17711. "adcs r4, %[r]\n\t"
  17712. #else
  17713. "adc r4, %[r]\n\t"
  17714. #endif
  17715. #ifdef WOLFSSL_KEIL
  17716. "adcs r2, r2, %[r]\n\t"
  17717. #elif defined(__clang__)
  17718. "adcs r2, %[r]\n\t"
  17719. #else
  17720. "adc r2, %[r]\n\t"
  17721. #endif
  17722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17723. "adds r3, r3, r6\n\t"
  17724. #else
  17725. "add r3, r3, r6\n\t"
  17726. #endif
  17727. #ifdef WOLFSSL_KEIL
  17728. "adcs r4, r4, %[r]\n\t"
  17729. #elif defined(__clang__)
  17730. "adcs r4, %[r]\n\t"
  17731. #else
  17732. "adc r4, %[r]\n\t"
  17733. #endif
  17734. #ifdef WOLFSSL_KEIL
  17735. "adcs r2, r2, %[r]\n\t"
  17736. #elif defined(__clang__)
  17737. "adcs r2, %[r]\n\t"
  17738. #else
  17739. "adc r2, %[r]\n\t"
  17740. #endif
  17741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17742. "lsrs r6, r7, #16\n\t"
  17743. #else
  17744. "lsr r6, r7, #16\n\t"
  17745. #endif
  17746. #ifdef WOLFSSL_KEIL
  17747. "muls r5, r6, r5\n\t"
  17748. #elif defined(__clang__)
  17749. "muls r5, r6\n\t"
  17750. #else
  17751. "mul r5, r6\n\t"
  17752. #endif
  17753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17754. "lsrs r6, r5, #16\n\t"
  17755. #else
  17756. "lsr r6, r5, #16\n\t"
  17757. #endif
  17758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17759. "lsls r5, r5, #16\n\t"
  17760. #else
  17761. "lsl r5, r5, #16\n\t"
  17762. #endif
  17763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17764. "adds r3, r3, r5\n\t"
  17765. #else
  17766. "add r3, r3, r5\n\t"
  17767. #endif
  17768. #ifdef WOLFSSL_KEIL
  17769. "adcs r4, r4, r6\n\t"
  17770. #elif defined(__clang__)
  17771. "adcs r4, r6\n\t"
  17772. #else
  17773. "adc r4, r6\n\t"
  17774. #endif
  17775. #ifdef WOLFSSL_KEIL
  17776. "adcs r2, r2, %[r]\n\t"
  17777. #elif defined(__clang__)
  17778. "adcs r2, %[r]\n\t"
  17779. #else
  17780. "adc r2, %[r]\n\t"
  17781. #endif
  17782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17783. "adds r3, r3, r5\n\t"
  17784. #else
  17785. "add r3, r3, r5\n\t"
  17786. #endif
  17787. #ifdef WOLFSSL_KEIL
  17788. "adcs r4, r4, r6\n\t"
  17789. #elif defined(__clang__)
  17790. "adcs r4, r6\n\t"
  17791. #else
  17792. "adc r4, r6\n\t"
  17793. #endif
  17794. #ifdef WOLFSSL_KEIL
  17795. "adcs r2, r2, %[r]\n\t"
  17796. #elif defined(__clang__)
  17797. "adcs r2, %[r]\n\t"
  17798. #else
  17799. "adc r2, %[r]\n\t"
  17800. #endif
  17801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17802. "lsrs r5, %[a], #16\n\t"
  17803. #else
  17804. "lsr r5, %[a], #16\n\t"
  17805. #endif
  17806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17807. "lsrs r6, r7, #16\n\t"
  17808. #else
  17809. "lsr r6, r7, #16\n\t"
  17810. #endif
  17811. #ifdef WOLFSSL_KEIL
  17812. "muls r6, r5, r6\n\t"
  17813. #elif defined(__clang__)
  17814. "muls r6, r5\n\t"
  17815. #else
  17816. "mul r6, r5\n\t"
  17817. #endif
  17818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17819. "adds r4, r4, r6\n\t"
  17820. #else
  17821. "add r4, r4, r6\n\t"
  17822. #endif
  17823. #ifdef WOLFSSL_KEIL
  17824. "adcs r2, r2, %[r]\n\t"
  17825. #elif defined(__clang__)
  17826. "adcs r2, %[r]\n\t"
  17827. #else
  17828. "adc r2, %[r]\n\t"
  17829. #endif
  17830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17831. "adds r4, r4, r6\n\t"
  17832. #else
  17833. "add r4, r4, r6\n\t"
  17834. #endif
  17835. #ifdef WOLFSSL_KEIL
  17836. "adcs r2, r2, %[r]\n\t"
  17837. #elif defined(__clang__)
  17838. "adcs r2, %[r]\n\t"
  17839. #else
  17840. "adc r2, %[r]\n\t"
  17841. #endif
  17842. "uxth r6, r7\n\t"
  17843. #ifdef WOLFSSL_KEIL
  17844. "muls r5, r6, r5\n\t"
  17845. #elif defined(__clang__)
  17846. "muls r5, r6\n\t"
  17847. #else
  17848. "mul r5, r6\n\t"
  17849. #endif
  17850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17851. "lsrs r6, r5, #16\n\t"
  17852. #else
  17853. "lsr r6, r5, #16\n\t"
  17854. #endif
  17855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17856. "lsls r5, r5, #16\n\t"
  17857. #else
  17858. "lsl r5, r5, #16\n\t"
  17859. #endif
  17860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17861. "adds r3, r3, r5\n\t"
  17862. #else
  17863. "add r3, r3, r5\n\t"
  17864. #endif
  17865. #ifdef WOLFSSL_KEIL
  17866. "adcs r4, r4, r6\n\t"
  17867. #elif defined(__clang__)
  17868. "adcs r4, r6\n\t"
  17869. #else
  17870. "adc r4, r6\n\t"
  17871. #endif
  17872. #ifdef WOLFSSL_KEIL
  17873. "adcs r2, r2, %[r]\n\t"
  17874. #elif defined(__clang__)
  17875. "adcs r2, %[r]\n\t"
  17876. #else
  17877. "adc r2, %[r]\n\t"
  17878. #endif
  17879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17880. "adds r3, r3, r5\n\t"
  17881. #else
  17882. "add r3, r3, r5\n\t"
  17883. #endif
  17884. #ifdef WOLFSSL_KEIL
  17885. "adcs r4, r4, r6\n\t"
  17886. #elif defined(__clang__)
  17887. "adcs r4, r6\n\t"
  17888. #else
  17889. "adc r4, r6\n\t"
  17890. #endif
  17891. #ifdef WOLFSSL_KEIL
  17892. "adcs r2, r2, %[r]\n\t"
  17893. #elif defined(__clang__)
  17894. "adcs r2, %[r]\n\t"
  17895. #else
  17896. "adc r2, %[r]\n\t"
  17897. #endif
  17898. "# A[6] * A[4]\n\t"
  17899. "mov %[a], r9\n\t"
  17900. "mov r7, r10\n\t"
  17901. "mov %[a], r12\n\t"
  17902. "uxth r5, %[a]\n\t"
  17903. "uxth r6, r7\n\t"
  17904. #ifdef WOLFSSL_KEIL
  17905. "muls r6, r5, r6\n\t"
  17906. #elif defined(__clang__)
  17907. "muls r6, r5\n\t"
  17908. #else
  17909. "mul r6, r5\n\t"
  17910. #endif
  17911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17912. "adds r3, r3, r6\n\t"
  17913. #else
  17914. "add r3, r3, r6\n\t"
  17915. #endif
  17916. #ifdef WOLFSSL_KEIL
  17917. "adcs r4, r4, %[r]\n\t"
  17918. #elif defined(__clang__)
  17919. "adcs r4, %[r]\n\t"
  17920. #else
  17921. "adc r4, %[r]\n\t"
  17922. #endif
  17923. #ifdef WOLFSSL_KEIL
  17924. "adcs r2, r2, %[r]\n\t"
  17925. #elif defined(__clang__)
  17926. "adcs r2, %[r]\n\t"
  17927. #else
  17928. "adc r2, %[r]\n\t"
  17929. #endif
  17930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17931. "adds r3, r3, r6\n\t"
  17932. #else
  17933. "add r3, r3, r6\n\t"
  17934. #endif
  17935. #ifdef WOLFSSL_KEIL
  17936. "adcs r4, r4, %[r]\n\t"
  17937. #elif defined(__clang__)
  17938. "adcs r4, %[r]\n\t"
  17939. #else
  17940. "adc r4, %[r]\n\t"
  17941. #endif
  17942. #ifdef WOLFSSL_KEIL
  17943. "adcs r2, r2, %[r]\n\t"
  17944. #elif defined(__clang__)
  17945. "adcs r2, %[r]\n\t"
  17946. #else
  17947. "adc r2, %[r]\n\t"
  17948. #endif
  17949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17950. "lsrs r6, r7, #16\n\t"
  17951. #else
  17952. "lsr r6, r7, #16\n\t"
  17953. #endif
  17954. #ifdef WOLFSSL_KEIL
  17955. "muls r5, r6, r5\n\t"
  17956. #elif defined(__clang__)
  17957. "muls r5, r6\n\t"
  17958. #else
  17959. "mul r5, r6\n\t"
  17960. #endif
  17961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17962. "lsrs r6, r5, #16\n\t"
  17963. #else
  17964. "lsr r6, r5, #16\n\t"
  17965. #endif
  17966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17967. "lsls r5, r5, #16\n\t"
  17968. #else
  17969. "lsl r5, r5, #16\n\t"
  17970. #endif
  17971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17972. "adds r3, r3, r5\n\t"
  17973. #else
  17974. "add r3, r3, r5\n\t"
  17975. #endif
  17976. #ifdef WOLFSSL_KEIL
  17977. "adcs r4, r4, r6\n\t"
  17978. #elif defined(__clang__)
  17979. "adcs r4, r6\n\t"
  17980. #else
  17981. "adc r4, r6\n\t"
  17982. #endif
  17983. #ifdef WOLFSSL_KEIL
  17984. "adcs r2, r2, %[r]\n\t"
  17985. #elif defined(__clang__)
  17986. "adcs r2, %[r]\n\t"
  17987. #else
  17988. "adc r2, %[r]\n\t"
  17989. #endif
  17990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  17991. "adds r3, r3, r5\n\t"
  17992. #else
  17993. "add r3, r3, r5\n\t"
  17994. #endif
  17995. #ifdef WOLFSSL_KEIL
  17996. "adcs r4, r4, r6\n\t"
  17997. #elif defined(__clang__)
  17998. "adcs r4, r6\n\t"
  17999. #else
  18000. "adc r4, r6\n\t"
  18001. #endif
  18002. #ifdef WOLFSSL_KEIL
  18003. "adcs r2, r2, %[r]\n\t"
  18004. #elif defined(__clang__)
  18005. "adcs r2, %[r]\n\t"
  18006. #else
  18007. "adc r2, %[r]\n\t"
  18008. #endif
  18009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18010. "lsrs r5, %[a], #16\n\t"
  18011. #else
  18012. "lsr r5, %[a], #16\n\t"
  18013. #endif
  18014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18015. "lsrs r6, r7, #16\n\t"
  18016. #else
  18017. "lsr r6, r7, #16\n\t"
  18018. #endif
  18019. #ifdef WOLFSSL_KEIL
  18020. "muls r6, r5, r6\n\t"
  18021. #elif defined(__clang__)
  18022. "muls r6, r5\n\t"
  18023. #else
  18024. "mul r6, r5\n\t"
  18025. #endif
  18026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18027. "adds r4, r4, r6\n\t"
  18028. #else
  18029. "add r4, r4, r6\n\t"
  18030. #endif
  18031. #ifdef WOLFSSL_KEIL
  18032. "adcs r2, r2, %[r]\n\t"
  18033. #elif defined(__clang__)
  18034. "adcs r2, %[r]\n\t"
  18035. #else
  18036. "adc r2, %[r]\n\t"
  18037. #endif
  18038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18039. "adds r4, r4, r6\n\t"
  18040. #else
  18041. "add r4, r4, r6\n\t"
  18042. #endif
  18043. #ifdef WOLFSSL_KEIL
  18044. "adcs r2, r2, %[r]\n\t"
  18045. #elif defined(__clang__)
  18046. "adcs r2, %[r]\n\t"
  18047. #else
  18048. "adc r2, %[r]\n\t"
  18049. #endif
  18050. "uxth r6, r7\n\t"
  18051. #ifdef WOLFSSL_KEIL
  18052. "muls r5, r6, r5\n\t"
  18053. #elif defined(__clang__)
  18054. "muls r5, r6\n\t"
  18055. #else
  18056. "mul r5, r6\n\t"
  18057. #endif
  18058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18059. "lsrs r6, r5, #16\n\t"
  18060. #else
  18061. "lsr r6, r5, #16\n\t"
  18062. #endif
  18063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18064. "lsls r5, r5, #16\n\t"
  18065. #else
  18066. "lsl r5, r5, #16\n\t"
  18067. #endif
  18068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18069. "adds r3, r3, r5\n\t"
  18070. #else
  18071. "add r3, r3, r5\n\t"
  18072. #endif
  18073. #ifdef WOLFSSL_KEIL
  18074. "adcs r4, r4, r6\n\t"
  18075. #elif defined(__clang__)
  18076. "adcs r4, r6\n\t"
  18077. #else
  18078. "adc r4, r6\n\t"
  18079. #endif
  18080. #ifdef WOLFSSL_KEIL
  18081. "adcs r2, r2, %[r]\n\t"
  18082. #elif defined(__clang__)
  18083. "adcs r2, %[r]\n\t"
  18084. #else
  18085. "adc r2, %[r]\n\t"
  18086. #endif
  18087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18088. "adds r3, r3, r5\n\t"
  18089. #else
  18090. "add r3, r3, r5\n\t"
  18091. #endif
  18092. #ifdef WOLFSSL_KEIL
  18093. "adcs r4, r4, r6\n\t"
  18094. #elif defined(__clang__)
  18095. "adcs r4, r6\n\t"
  18096. #else
  18097. "adc r4, r6\n\t"
  18098. #endif
  18099. #ifdef WOLFSSL_KEIL
  18100. "adcs r2, r2, %[r]\n\t"
  18101. #elif defined(__clang__)
  18102. "adcs r2, %[r]\n\t"
  18103. #else
  18104. "adc r2, %[r]\n\t"
  18105. #endif
  18106. "# A[5] * A[5]\n\t"
  18107. "mov r7, r11\n\t"
  18108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18109. "lsrs r6, r7, #16\n\t"
  18110. #else
  18111. "lsr r6, r7, #16\n\t"
  18112. #endif
  18113. "uxth r5, r7\n\t"
  18114. #ifdef WOLFSSL_KEIL
  18115. "muls r5, r5, r5\n\t"
  18116. #elif defined(__clang__)
  18117. "muls r5, r5\n\t"
  18118. #else
  18119. "mul r5, r5\n\t"
  18120. #endif
  18121. #ifdef WOLFSSL_KEIL
  18122. "muls r6, r6, r6\n\t"
  18123. #elif defined(__clang__)
  18124. "muls r6, r6\n\t"
  18125. #else
  18126. "mul r6, r6\n\t"
  18127. #endif
  18128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18129. "adds r3, r3, r5\n\t"
  18130. #else
  18131. "add r3, r3, r5\n\t"
  18132. #endif
  18133. #ifdef WOLFSSL_KEIL
  18134. "adcs r4, r4, r6\n\t"
  18135. #elif defined(__clang__)
  18136. "adcs r4, r6\n\t"
  18137. #else
  18138. "adc r4, r6\n\t"
  18139. #endif
  18140. #ifdef WOLFSSL_KEIL
  18141. "adcs r2, r2, %[r]\n\t"
  18142. #elif defined(__clang__)
  18143. "adcs r2, %[r]\n\t"
  18144. #else
  18145. "adc r2, %[r]\n\t"
  18146. #endif
  18147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18148. "lsrs r6, r7, #16\n\t"
  18149. #else
  18150. "lsr r6, r7, #16\n\t"
  18151. #endif
  18152. "uxth r5, r7\n\t"
  18153. #ifdef WOLFSSL_KEIL
  18154. "muls r5, r6, r5\n\t"
  18155. #elif defined(__clang__)
  18156. "muls r5, r6\n\t"
  18157. #else
  18158. "mul r5, r6\n\t"
  18159. #endif
  18160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18161. "lsrs r6, r5, #15\n\t"
  18162. #else
  18163. "lsr r6, r5, #15\n\t"
  18164. #endif
  18165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18166. "lsls r5, r5, #17\n\t"
  18167. #else
  18168. "lsl r5, r5, #17\n\t"
  18169. #endif
  18170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18171. "adds r3, r3, r5\n\t"
  18172. #else
  18173. "add r3, r3, r5\n\t"
  18174. #endif
  18175. #ifdef WOLFSSL_KEIL
  18176. "adcs r4, r4, r6\n\t"
  18177. #elif defined(__clang__)
  18178. "adcs r4, r6\n\t"
  18179. #else
  18180. "adc r4, r6\n\t"
  18181. #endif
  18182. #ifdef WOLFSSL_KEIL
  18183. "adcs r2, r2, %[r]\n\t"
  18184. #elif defined(__clang__)
  18185. "adcs r2, %[r]\n\t"
  18186. #else
  18187. "adc r2, %[r]\n\t"
  18188. #endif
  18189. "mov %[r], r8\n\t"
  18190. "str r3, [%[r], #40]\n\t"
  18191. "movs %[r], #0\n\t"
  18192. "# A[6] * A[5]\n\t"
  18193. "movs r3, #0\n\t"
  18194. "mov %[a], r9\n\t"
  18195. "mov %[a], r12\n\t"
  18196. "uxth r5, %[a]\n\t"
  18197. "uxth r6, r7\n\t"
  18198. #ifdef WOLFSSL_KEIL
  18199. "muls r6, r5, r6\n\t"
  18200. #elif defined(__clang__)
  18201. "muls r6, r5\n\t"
  18202. #else
  18203. "mul r6, r5\n\t"
  18204. #endif
  18205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18206. "adds r4, r4, r6\n\t"
  18207. #else
  18208. "add r4, r4, r6\n\t"
  18209. #endif
  18210. #ifdef WOLFSSL_KEIL
  18211. "adcs r2, r2, %[r]\n\t"
  18212. #elif defined(__clang__)
  18213. "adcs r2, %[r]\n\t"
  18214. #else
  18215. "adc r2, %[r]\n\t"
  18216. #endif
  18217. #ifdef WOLFSSL_KEIL
  18218. "adcs r3, r3, %[r]\n\t"
  18219. #elif defined(__clang__)
  18220. "adcs r3, %[r]\n\t"
  18221. #else
  18222. "adc r3, %[r]\n\t"
  18223. #endif
  18224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18225. "adds r4, r4, r6\n\t"
  18226. #else
  18227. "add r4, r4, r6\n\t"
  18228. #endif
  18229. #ifdef WOLFSSL_KEIL
  18230. "adcs r2, r2, %[r]\n\t"
  18231. #elif defined(__clang__)
  18232. "adcs r2, %[r]\n\t"
  18233. #else
  18234. "adc r2, %[r]\n\t"
  18235. #endif
  18236. #ifdef WOLFSSL_KEIL
  18237. "adcs r3, r3, %[r]\n\t"
  18238. #elif defined(__clang__)
  18239. "adcs r3, %[r]\n\t"
  18240. #else
  18241. "adc r3, %[r]\n\t"
  18242. #endif
  18243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18244. "lsrs r6, r7, #16\n\t"
  18245. #else
  18246. "lsr r6, r7, #16\n\t"
  18247. #endif
  18248. #ifdef WOLFSSL_KEIL
  18249. "muls r5, r6, r5\n\t"
  18250. #elif defined(__clang__)
  18251. "muls r5, r6\n\t"
  18252. #else
  18253. "mul r5, r6\n\t"
  18254. #endif
  18255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18256. "lsrs r6, r5, #16\n\t"
  18257. #else
  18258. "lsr r6, r5, #16\n\t"
  18259. #endif
  18260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18261. "lsls r5, r5, #16\n\t"
  18262. #else
  18263. "lsl r5, r5, #16\n\t"
  18264. #endif
  18265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18266. "adds r4, r4, r5\n\t"
  18267. #else
  18268. "add r4, r4, r5\n\t"
  18269. #endif
  18270. #ifdef WOLFSSL_KEIL
  18271. "adcs r2, r2, r6\n\t"
  18272. #elif defined(__clang__)
  18273. "adcs r2, r6\n\t"
  18274. #else
  18275. "adc r2, r6\n\t"
  18276. #endif
  18277. #ifdef WOLFSSL_KEIL
  18278. "adcs r3, r3, %[r]\n\t"
  18279. #elif defined(__clang__)
  18280. "adcs r3, %[r]\n\t"
  18281. #else
  18282. "adc r3, %[r]\n\t"
  18283. #endif
  18284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18285. "adds r4, r4, r5\n\t"
  18286. #else
  18287. "add r4, r4, r5\n\t"
  18288. #endif
  18289. #ifdef WOLFSSL_KEIL
  18290. "adcs r2, r2, r6\n\t"
  18291. #elif defined(__clang__)
  18292. "adcs r2, r6\n\t"
  18293. #else
  18294. "adc r2, r6\n\t"
  18295. #endif
  18296. #ifdef WOLFSSL_KEIL
  18297. "adcs r3, r3, %[r]\n\t"
  18298. #elif defined(__clang__)
  18299. "adcs r3, %[r]\n\t"
  18300. #else
  18301. "adc r3, %[r]\n\t"
  18302. #endif
  18303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18304. "lsrs r5, %[a], #16\n\t"
  18305. #else
  18306. "lsr r5, %[a], #16\n\t"
  18307. #endif
  18308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18309. "lsrs r6, r7, #16\n\t"
  18310. #else
  18311. "lsr r6, r7, #16\n\t"
  18312. #endif
  18313. #ifdef WOLFSSL_KEIL
  18314. "muls r6, r5, r6\n\t"
  18315. #elif defined(__clang__)
  18316. "muls r6, r5\n\t"
  18317. #else
  18318. "mul r6, r5\n\t"
  18319. #endif
  18320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18321. "adds r2, r2, r6\n\t"
  18322. #else
  18323. "add r2, r2, r6\n\t"
  18324. #endif
  18325. #ifdef WOLFSSL_KEIL
  18326. "adcs r3, r3, %[r]\n\t"
  18327. #elif defined(__clang__)
  18328. "adcs r3, %[r]\n\t"
  18329. #else
  18330. "adc r3, %[r]\n\t"
  18331. #endif
  18332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18333. "adds r2, r2, r6\n\t"
  18334. #else
  18335. "add r2, r2, r6\n\t"
  18336. #endif
  18337. #ifdef WOLFSSL_KEIL
  18338. "adcs r3, r3, %[r]\n\t"
  18339. #elif defined(__clang__)
  18340. "adcs r3, %[r]\n\t"
  18341. #else
  18342. "adc r3, %[r]\n\t"
  18343. #endif
  18344. "uxth r6, r7\n\t"
  18345. #ifdef WOLFSSL_KEIL
  18346. "muls r5, r6, r5\n\t"
  18347. #elif defined(__clang__)
  18348. "muls r5, r6\n\t"
  18349. #else
  18350. "mul r5, r6\n\t"
  18351. #endif
  18352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18353. "lsrs r6, r5, #16\n\t"
  18354. #else
  18355. "lsr r6, r5, #16\n\t"
  18356. #endif
  18357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18358. "lsls r5, r5, #16\n\t"
  18359. #else
  18360. "lsl r5, r5, #16\n\t"
  18361. #endif
  18362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18363. "adds r4, r4, r5\n\t"
  18364. #else
  18365. "add r4, r4, r5\n\t"
  18366. #endif
  18367. #ifdef WOLFSSL_KEIL
  18368. "adcs r2, r2, r6\n\t"
  18369. #elif defined(__clang__)
  18370. "adcs r2, r6\n\t"
  18371. #else
  18372. "adc r2, r6\n\t"
  18373. #endif
  18374. #ifdef WOLFSSL_KEIL
  18375. "adcs r3, r3, %[r]\n\t"
  18376. #elif defined(__clang__)
  18377. "adcs r3, %[r]\n\t"
  18378. #else
  18379. "adc r3, %[r]\n\t"
  18380. #endif
  18381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18382. "adds r4, r4, r5\n\t"
  18383. #else
  18384. "add r4, r4, r5\n\t"
  18385. #endif
  18386. #ifdef WOLFSSL_KEIL
  18387. "adcs r2, r2, r6\n\t"
  18388. #elif defined(__clang__)
  18389. "adcs r2, r6\n\t"
  18390. #else
  18391. "adc r2, r6\n\t"
  18392. #endif
  18393. #ifdef WOLFSSL_KEIL
  18394. "adcs r3, r3, %[r]\n\t"
  18395. #elif defined(__clang__)
  18396. "adcs r3, %[r]\n\t"
  18397. #else
  18398. "adc r3, %[r]\n\t"
  18399. #endif
  18400. "# A[7] * A[4]\n\t"
  18401. "mov %[a], r9\n\t"
  18402. "mov r7, r10\n\t"
  18403. "mov %[a], lr\n\t"
  18404. "uxth r5, %[a]\n\t"
  18405. "uxth r6, r7\n\t"
  18406. #ifdef WOLFSSL_KEIL
  18407. "muls r6, r5, r6\n\t"
  18408. #elif defined(__clang__)
  18409. "muls r6, r5\n\t"
  18410. #else
  18411. "mul r6, r5\n\t"
  18412. #endif
  18413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18414. "adds r4, r4, r6\n\t"
  18415. #else
  18416. "add r4, r4, r6\n\t"
  18417. #endif
  18418. #ifdef WOLFSSL_KEIL
  18419. "adcs r2, r2, %[r]\n\t"
  18420. #elif defined(__clang__)
  18421. "adcs r2, %[r]\n\t"
  18422. #else
  18423. "adc r2, %[r]\n\t"
  18424. #endif
  18425. #ifdef WOLFSSL_KEIL
  18426. "adcs r3, r3, %[r]\n\t"
  18427. #elif defined(__clang__)
  18428. "adcs r3, %[r]\n\t"
  18429. #else
  18430. "adc r3, %[r]\n\t"
  18431. #endif
  18432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18433. "adds r4, r4, r6\n\t"
  18434. #else
  18435. "add r4, r4, r6\n\t"
  18436. #endif
  18437. #ifdef WOLFSSL_KEIL
  18438. "adcs r2, r2, %[r]\n\t"
  18439. #elif defined(__clang__)
  18440. "adcs r2, %[r]\n\t"
  18441. #else
  18442. "adc r2, %[r]\n\t"
  18443. #endif
  18444. #ifdef WOLFSSL_KEIL
  18445. "adcs r3, r3, %[r]\n\t"
  18446. #elif defined(__clang__)
  18447. "adcs r3, %[r]\n\t"
  18448. #else
  18449. "adc r3, %[r]\n\t"
  18450. #endif
  18451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18452. "lsrs r6, r7, #16\n\t"
  18453. #else
  18454. "lsr r6, r7, #16\n\t"
  18455. #endif
  18456. #ifdef WOLFSSL_KEIL
  18457. "muls r5, r6, r5\n\t"
  18458. #elif defined(__clang__)
  18459. "muls r5, r6\n\t"
  18460. #else
  18461. "mul r5, r6\n\t"
  18462. #endif
  18463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18464. "lsrs r6, r5, #16\n\t"
  18465. #else
  18466. "lsr r6, r5, #16\n\t"
  18467. #endif
  18468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18469. "lsls r5, r5, #16\n\t"
  18470. #else
  18471. "lsl r5, r5, #16\n\t"
  18472. #endif
  18473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18474. "adds r4, r4, r5\n\t"
  18475. #else
  18476. "add r4, r4, r5\n\t"
  18477. #endif
  18478. #ifdef WOLFSSL_KEIL
  18479. "adcs r2, r2, r6\n\t"
  18480. #elif defined(__clang__)
  18481. "adcs r2, r6\n\t"
  18482. #else
  18483. "adc r2, r6\n\t"
  18484. #endif
  18485. #ifdef WOLFSSL_KEIL
  18486. "adcs r3, r3, %[r]\n\t"
  18487. #elif defined(__clang__)
  18488. "adcs r3, %[r]\n\t"
  18489. #else
  18490. "adc r3, %[r]\n\t"
  18491. #endif
  18492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18493. "adds r4, r4, r5\n\t"
  18494. #else
  18495. "add r4, r4, r5\n\t"
  18496. #endif
  18497. #ifdef WOLFSSL_KEIL
  18498. "adcs r2, r2, r6\n\t"
  18499. #elif defined(__clang__)
  18500. "adcs r2, r6\n\t"
  18501. #else
  18502. "adc r2, r6\n\t"
  18503. #endif
  18504. #ifdef WOLFSSL_KEIL
  18505. "adcs r3, r3, %[r]\n\t"
  18506. #elif defined(__clang__)
  18507. "adcs r3, %[r]\n\t"
  18508. #else
  18509. "adc r3, %[r]\n\t"
  18510. #endif
  18511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18512. "lsrs r5, %[a], #16\n\t"
  18513. #else
  18514. "lsr r5, %[a], #16\n\t"
  18515. #endif
  18516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18517. "lsrs r6, r7, #16\n\t"
  18518. #else
  18519. "lsr r6, r7, #16\n\t"
  18520. #endif
  18521. #ifdef WOLFSSL_KEIL
  18522. "muls r6, r5, r6\n\t"
  18523. #elif defined(__clang__)
  18524. "muls r6, r5\n\t"
  18525. #else
  18526. "mul r6, r5\n\t"
  18527. #endif
  18528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18529. "adds r2, r2, r6\n\t"
  18530. #else
  18531. "add r2, r2, r6\n\t"
  18532. #endif
  18533. #ifdef WOLFSSL_KEIL
  18534. "adcs r3, r3, %[r]\n\t"
  18535. #elif defined(__clang__)
  18536. "adcs r3, %[r]\n\t"
  18537. #else
  18538. "adc r3, %[r]\n\t"
  18539. #endif
  18540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18541. "adds r2, r2, r6\n\t"
  18542. #else
  18543. "add r2, r2, r6\n\t"
  18544. #endif
  18545. #ifdef WOLFSSL_KEIL
  18546. "adcs r3, r3, %[r]\n\t"
  18547. #elif defined(__clang__)
  18548. "adcs r3, %[r]\n\t"
  18549. #else
  18550. "adc r3, %[r]\n\t"
  18551. #endif
  18552. "uxth r6, r7\n\t"
  18553. #ifdef WOLFSSL_KEIL
  18554. "muls r5, r6, r5\n\t"
  18555. #elif defined(__clang__)
  18556. "muls r5, r6\n\t"
  18557. #else
  18558. "mul r5, r6\n\t"
  18559. #endif
  18560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18561. "lsrs r6, r5, #16\n\t"
  18562. #else
  18563. "lsr r6, r5, #16\n\t"
  18564. #endif
  18565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18566. "lsls r5, r5, #16\n\t"
  18567. #else
  18568. "lsl r5, r5, #16\n\t"
  18569. #endif
  18570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18571. "adds r4, r4, r5\n\t"
  18572. #else
  18573. "add r4, r4, r5\n\t"
  18574. #endif
  18575. #ifdef WOLFSSL_KEIL
  18576. "adcs r2, r2, r6\n\t"
  18577. #elif defined(__clang__)
  18578. "adcs r2, r6\n\t"
  18579. #else
  18580. "adc r2, r6\n\t"
  18581. #endif
  18582. #ifdef WOLFSSL_KEIL
  18583. "adcs r3, r3, %[r]\n\t"
  18584. #elif defined(__clang__)
  18585. "adcs r3, %[r]\n\t"
  18586. #else
  18587. "adc r3, %[r]\n\t"
  18588. #endif
  18589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18590. "adds r4, r4, r5\n\t"
  18591. #else
  18592. "add r4, r4, r5\n\t"
  18593. #endif
  18594. #ifdef WOLFSSL_KEIL
  18595. "adcs r2, r2, r6\n\t"
  18596. #elif defined(__clang__)
  18597. "adcs r2, r6\n\t"
  18598. #else
  18599. "adc r2, r6\n\t"
  18600. #endif
  18601. #ifdef WOLFSSL_KEIL
  18602. "adcs r3, r3, %[r]\n\t"
  18603. #elif defined(__clang__)
  18604. "adcs r3, %[r]\n\t"
  18605. #else
  18606. "adc r3, %[r]\n\t"
  18607. #endif
  18608. "mov %[r], r8\n\t"
  18609. "str r4, [%[r], #44]\n\t"
  18610. "movs %[r], #0\n\t"
  18611. "# A[7] * A[5]\n\t"
  18612. "movs r4, #0\n\t"
  18613. "mov %[a], r9\n\t"
  18614. "mov r7, r11\n\t"
  18615. "mov %[a], lr\n\t"
  18616. "uxth r5, %[a]\n\t"
  18617. "uxth r6, r7\n\t"
  18618. #ifdef WOLFSSL_KEIL
  18619. "muls r6, r5, r6\n\t"
  18620. #elif defined(__clang__)
  18621. "muls r6, r5\n\t"
  18622. #else
  18623. "mul r6, r5\n\t"
  18624. #endif
  18625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18626. "adds r2, r2, r6\n\t"
  18627. #else
  18628. "add r2, r2, r6\n\t"
  18629. #endif
  18630. #ifdef WOLFSSL_KEIL
  18631. "adcs r3, r3, %[r]\n\t"
  18632. #elif defined(__clang__)
  18633. "adcs r3, %[r]\n\t"
  18634. #else
  18635. "adc r3, %[r]\n\t"
  18636. #endif
  18637. #ifdef WOLFSSL_KEIL
  18638. "adcs r4, r4, %[r]\n\t"
  18639. #elif defined(__clang__)
  18640. "adcs r4, %[r]\n\t"
  18641. #else
  18642. "adc r4, %[r]\n\t"
  18643. #endif
  18644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18645. "adds r2, r2, r6\n\t"
  18646. #else
  18647. "add r2, r2, r6\n\t"
  18648. #endif
  18649. #ifdef WOLFSSL_KEIL
  18650. "adcs r3, r3, %[r]\n\t"
  18651. #elif defined(__clang__)
  18652. "adcs r3, %[r]\n\t"
  18653. #else
  18654. "adc r3, %[r]\n\t"
  18655. #endif
  18656. #ifdef WOLFSSL_KEIL
  18657. "adcs r4, r4, %[r]\n\t"
  18658. #elif defined(__clang__)
  18659. "adcs r4, %[r]\n\t"
  18660. #else
  18661. "adc r4, %[r]\n\t"
  18662. #endif
  18663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18664. "lsrs r6, r7, #16\n\t"
  18665. #else
  18666. "lsr r6, r7, #16\n\t"
  18667. #endif
  18668. #ifdef WOLFSSL_KEIL
  18669. "muls r5, r6, r5\n\t"
  18670. #elif defined(__clang__)
  18671. "muls r5, r6\n\t"
  18672. #else
  18673. "mul r5, r6\n\t"
  18674. #endif
  18675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18676. "lsrs r6, r5, #16\n\t"
  18677. #else
  18678. "lsr r6, r5, #16\n\t"
  18679. #endif
  18680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18681. "lsls r5, r5, #16\n\t"
  18682. #else
  18683. "lsl r5, r5, #16\n\t"
  18684. #endif
  18685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18686. "adds r2, r2, r5\n\t"
  18687. #else
  18688. "add r2, r2, r5\n\t"
  18689. #endif
  18690. #ifdef WOLFSSL_KEIL
  18691. "adcs r3, r3, r6\n\t"
  18692. #elif defined(__clang__)
  18693. "adcs r3, r6\n\t"
  18694. #else
  18695. "adc r3, r6\n\t"
  18696. #endif
  18697. #ifdef WOLFSSL_KEIL
  18698. "adcs r4, r4, %[r]\n\t"
  18699. #elif defined(__clang__)
  18700. "adcs r4, %[r]\n\t"
  18701. #else
  18702. "adc r4, %[r]\n\t"
  18703. #endif
  18704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18705. "adds r2, r2, r5\n\t"
  18706. #else
  18707. "add r2, r2, r5\n\t"
  18708. #endif
  18709. #ifdef WOLFSSL_KEIL
  18710. "adcs r3, r3, r6\n\t"
  18711. #elif defined(__clang__)
  18712. "adcs r3, r6\n\t"
  18713. #else
  18714. "adc r3, r6\n\t"
  18715. #endif
  18716. #ifdef WOLFSSL_KEIL
  18717. "adcs r4, r4, %[r]\n\t"
  18718. #elif defined(__clang__)
  18719. "adcs r4, %[r]\n\t"
  18720. #else
  18721. "adc r4, %[r]\n\t"
  18722. #endif
  18723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18724. "lsrs r5, %[a], #16\n\t"
  18725. #else
  18726. "lsr r5, %[a], #16\n\t"
  18727. #endif
  18728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18729. "lsrs r6, r7, #16\n\t"
  18730. #else
  18731. "lsr r6, r7, #16\n\t"
  18732. #endif
  18733. #ifdef WOLFSSL_KEIL
  18734. "muls r6, r5, r6\n\t"
  18735. #elif defined(__clang__)
  18736. "muls r6, r5\n\t"
  18737. #else
  18738. "mul r6, r5\n\t"
  18739. #endif
  18740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18741. "adds r3, r3, r6\n\t"
  18742. #else
  18743. "add r3, r3, r6\n\t"
  18744. #endif
  18745. #ifdef WOLFSSL_KEIL
  18746. "adcs r4, r4, %[r]\n\t"
  18747. #elif defined(__clang__)
  18748. "adcs r4, %[r]\n\t"
  18749. #else
  18750. "adc r4, %[r]\n\t"
  18751. #endif
  18752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18753. "adds r3, r3, r6\n\t"
  18754. #else
  18755. "add r3, r3, r6\n\t"
  18756. #endif
  18757. #ifdef WOLFSSL_KEIL
  18758. "adcs r4, r4, %[r]\n\t"
  18759. #elif defined(__clang__)
  18760. "adcs r4, %[r]\n\t"
  18761. #else
  18762. "adc r4, %[r]\n\t"
  18763. #endif
  18764. "uxth r6, r7\n\t"
  18765. #ifdef WOLFSSL_KEIL
  18766. "muls r5, r6, r5\n\t"
  18767. #elif defined(__clang__)
  18768. "muls r5, r6\n\t"
  18769. #else
  18770. "mul r5, r6\n\t"
  18771. #endif
  18772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18773. "lsrs r6, r5, #16\n\t"
  18774. #else
  18775. "lsr r6, r5, #16\n\t"
  18776. #endif
  18777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18778. "lsls r5, r5, #16\n\t"
  18779. #else
  18780. "lsl r5, r5, #16\n\t"
  18781. #endif
  18782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18783. "adds r2, r2, r5\n\t"
  18784. #else
  18785. "add r2, r2, r5\n\t"
  18786. #endif
  18787. #ifdef WOLFSSL_KEIL
  18788. "adcs r3, r3, r6\n\t"
  18789. #elif defined(__clang__)
  18790. "adcs r3, r6\n\t"
  18791. #else
  18792. "adc r3, r6\n\t"
  18793. #endif
  18794. #ifdef WOLFSSL_KEIL
  18795. "adcs r4, r4, %[r]\n\t"
  18796. #elif defined(__clang__)
  18797. "adcs r4, %[r]\n\t"
  18798. #else
  18799. "adc r4, %[r]\n\t"
  18800. #endif
  18801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18802. "adds r2, r2, r5\n\t"
  18803. #else
  18804. "add r2, r2, r5\n\t"
  18805. #endif
  18806. #ifdef WOLFSSL_KEIL
  18807. "adcs r3, r3, r6\n\t"
  18808. #elif defined(__clang__)
  18809. "adcs r3, r6\n\t"
  18810. #else
  18811. "adc r3, r6\n\t"
  18812. #endif
  18813. #ifdef WOLFSSL_KEIL
  18814. "adcs r4, r4, %[r]\n\t"
  18815. #elif defined(__clang__)
  18816. "adcs r4, %[r]\n\t"
  18817. #else
  18818. "adc r4, %[r]\n\t"
  18819. #endif
  18820. "# A[6] * A[6]\n\t"
  18821. "mov r7, r12\n\t"
  18822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18823. "lsrs r6, r7, #16\n\t"
  18824. #else
  18825. "lsr r6, r7, #16\n\t"
  18826. #endif
  18827. "uxth r5, r7\n\t"
  18828. #ifdef WOLFSSL_KEIL
  18829. "muls r5, r5, r5\n\t"
  18830. #elif defined(__clang__)
  18831. "muls r5, r5\n\t"
  18832. #else
  18833. "mul r5, r5\n\t"
  18834. #endif
  18835. #ifdef WOLFSSL_KEIL
  18836. "muls r6, r6, r6\n\t"
  18837. #elif defined(__clang__)
  18838. "muls r6, r6\n\t"
  18839. #else
  18840. "mul r6, r6\n\t"
  18841. #endif
  18842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18843. "adds r2, r2, r5\n\t"
  18844. #else
  18845. "add r2, r2, r5\n\t"
  18846. #endif
  18847. #ifdef WOLFSSL_KEIL
  18848. "adcs r3, r3, r6\n\t"
  18849. #elif defined(__clang__)
  18850. "adcs r3, r6\n\t"
  18851. #else
  18852. "adc r3, r6\n\t"
  18853. #endif
  18854. #ifdef WOLFSSL_KEIL
  18855. "adcs r4, r4, %[r]\n\t"
  18856. #elif defined(__clang__)
  18857. "adcs r4, %[r]\n\t"
  18858. #else
  18859. "adc r4, %[r]\n\t"
  18860. #endif
  18861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18862. "lsrs r6, r7, #16\n\t"
  18863. #else
  18864. "lsr r6, r7, #16\n\t"
  18865. #endif
  18866. "uxth r5, r7\n\t"
  18867. #ifdef WOLFSSL_KEIL
  18868. "muls r5, r6, r5\n\t"
  18869. #elif defined(__clang__)
  18870. "muls r5, r6\n\t"
  18871. #else
  18872. "mul r5, r6\n\t"
  18873. #endif
  18874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18875. "lsrs r6, r5, #15\n\t"
  18876. #else
  18877. "lsr r6, r5, #15\n\t"
  18878. #endif
  18879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18880. "lsls r5, r5, #17\n\t"
  18881. #else
  18882. "lsl r5, r5, #17\n\t"
  18883. #endif
  18884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18885. "adds r2, r2, r5\n\t"
  18886. #else
  18887. "add r2, r2, r5\n\t"
  18888. #endif
  18889. #ifdef WOLFSSL_KEIL
  18890. "adcs r3, r3, r6\n\t"
  18891. #elif defined(__clang__)
  18892. "adcs r3, r6\n\t"
  18893. #else
  18894. "adc r3, r6\n\t"
  18895. #endif
  18896. #ifdef WOLFSSL_KEIL
  18897. "adcs r4, r4, %[r]\n\t"
  18898. #elif defined(__clang__)
  18899. "adcs r4, %[r]\n\t"
  18900. #else
  18901. "adc r4, %[r]\n\t"
  18902. #endif
  18903. "mov %[r], r8\n\t"
  18904. "str r2, [%[r], #48]\n\t"
  18905. "movs %[r], #0\n\t"
  18906. "# A[7] * A[6]\n\t"
  18907. "movs r2, #0\n\t"
  18908. "mov %[a], r9\n\t"
  18909. "mov %[a], lr\n\t"
  18910. "uxth r5, %[a]\n\t"
  18911. "uxth r6, r7\n\t"
  18912. #ifdef WOLFSSL_KEIL
  18913. "muls r6, r5, r6\n\t"
  18914. #elif defined(__clang__)
  18915. "muls r6, r5\n\t"
  18916. #else
  18917. "mul r6, r5\n\t"
  18918. #endif
  18919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18920. "adds r3, r3, r6\n\t"
  18921. #else
  18922. "add r3, r3, r6\n\t"
  18923. #endif
  18924. #ifdef WOLFSSL_KEIL
  18925. "adcs r4, r4, %[r]\n\t"
  18926. #elif defined(__clang__)
  18927. "adcs r4, %[r]\n\t"
  18928. #else
  18929. "adc r4, %[r]\n\t"
  18930. #endif
  18931. #ifdef WOLFSSL_KEIL
  18932. "adcs r2, r2, %[r]\n\t"
  18933. #elif defined(__clang__)
  18934. "adcs r2, %[r]\n\t"
  18935. #else
  18936. "adc r2, %[r]\n\t"
  18937. #endif
  18938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18939. "adds r3, r3, r6\n\t"
  18940. #else
  18941. "add r3, r3, r6\n\t"
  18942. #endif
  18943. #ifdef WOLFSSL_KEIL
  18944. "adcs r4, r4, %[r]\n\t"
  18945. #elif defined(__clang__)
  18946. "adcs r4, %[r]\n\t"
  18947. #else
  18948. "adc r4, %[r]\n\t"
  18949. #endif
  18950. #ifdef WOLFSSL_KEIL
  18951. "adcs r2, r2, %[r]\n\t"
  18952. #elif defined(__clang__)
  18953. "adcs r2, %[r]\n\t"
  18954. #else
  18955. "adc r2, %[r]\n\t"
  18956. #endif
  18957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18958. "lsrs r6, r7, #16\n\t"
  18959. #else
  18960. "lsr r6, r7, #16\n\t"
  18961. #endif
  18962. #ifdef WOLFSSL_KEIL
  18963. "muls r5, r6, r5\n\t"
  18964. #elif defined(__clang__)
  18965. "muls r5, r6\n\t"
  18966. #else
  18967. "mul r5, r6\n\t"
  18968. #endif
  18969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18970. "lsrs r6, r5, #16\n\t"
  18971. #else
  18972. "lsr r6, r5, #16\n\t"
  18973. #endif
  18974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18975. "lsls r5, r5, #16\n\t"
  18976. #else
  18977. "lsl r5, r5, #16\n\t"
  18978. #endif
  18979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18980. "adds r3, r3, r5\n\t"
  18981. #else
  18982. "add r3, r3, r5\n\t"
  18983. #endif
  18984. #ifdef WOLFSSL_KEIL
  18985. "adcs r4, r4, r6\n\t"
  18986. #elif defined(__clang__)
  18987. "adcs r4, r6\n\t"
  18988. #else
  18989. "adc r4, r6\n\t"
  18990. #endif
  18991. #ifdef WOLFSSL_KEIL
  18992. "adcs r2, r2, %[r]\n\t"
  18993. #elif defined(__clang__)
  18994. "adcs r2, %[r]\n\t"
  18995. #else
  18996. "adc r2, %[r]\n\t"
  18997. #endif
  18998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  18999. "adds r3, r3, r5\n\t"
  19000. #else
  19001. "add r3, r3, r5\n\t"
  19002. #endif
  19003. #ifdef WOLFSSL_KEIL
  19004. "adcs r4, r4, r6\n\t"
  19005. #elif defined(__clang__)
  19006. "adcs r4, r6\n\t"
  19007. #else
  19008. "adc r4, r6\n\t"
  19009. #endif
  19010. #ifdef WOLFSSL_KEIL
  19011. "adcs r2, r2, %[r]\n\t"
  19012. #elif defined(__clang__)
  19013. "adcs r2, %[r]\n\t"
  19014. #else
  19015. "adc r2, %[r]\n\t"
  19016. #endif
  19017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19018. "lsrs r5, %[a], #16\n\t"
  19019. #else
  19020. "lsr r5, %[a], #16\n\t"
  19021. #endif
  19022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19023. "lsrs r6, r7, #16\n\t"
  19024. #else
  19025. "lsr r6, r7, #16\n\t"
  19026. #endif
  19027. #ifdef WOLFSSL_KEIL
  19028. "muls r6, r5, r6\n\t"
  19029. #elif defined(__clang__)
  19030. "muls r6, r5\n\t"
  19031. #else
  19032. "mul r6, r5\n\t"
  19033. #endif
  19034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19035. "adds r4, r4, r6\n\t"
  19036. #else
  19037. "add r4, r4, r6\n\t"
  19038. #endif
  19039. #ifdef WOLFSSL_KEIL
  19040. "adcs r2, r2, %[r]\n\t"
  19041. #elif defined(__clang__)
  19042. "adcs r2, %[r]\n\t"
  19043. #else
  19044. "adc r2, %[r]\n\t"
  19045. #endif
  19046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19047. "adds r4, r4, r6\n\t"
  19048. #else
  19049. "add r4, r4, r6\n\t"
  19050. #endif
  19051. #ifdef WOLFSSL_KEIL
  19052. "adcs r2, r2, %[r]\n\t"
  19053. #elif defined(__clang__)
  19054. "adcs r2, %[r]\n\t"
  19055. #else
  19056. "adc r2, %[r]\n\t"
  19057. #endif
  19058. "uxth r6, r7\n\t"
  19059. #ifdef WOLFSSL_KEIL
  19060. "muls r5, r6, r5\n\t"
  19061. #elif defined(__clang__)
  19062. "muls r5, r6\n\t"
  19063. #else
  19064. "mul r5, r6\n\t"
  19065. #endif
  19066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19067. "lsrs r6, r5, #16\n\t"
  19068. #else
  19069. "lsr r6, r5, #16\n\t"
  19070. #endif
  19071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19072. "lsls r5, r5, #16\n\t"
  19073. #else
  19074. "lsl r5, r5, #16\n\t"
  19075. #endif
  19076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19077. "adds r3, r3, r5\n\t"
  19078. #else
  19079. "add r3, r3, r5\n\t"
  19080. #endif
  19081. #ifdef WOLFSSL_KEIL
  19082. "adcs r4, r4, r6\n\t"
  19083. #elif defined(__clang__)
  19084. "adcs r4, r6\n\t"
  19085. #else
  19086. "adc r4, r6\n\t"
  19087. #endif
  19088. #ifdef WOLFSSL_KEIL
  19089. "adcs r2, r2, %[r]\n\t"
  19090. #elif defined(__clang__)
  19091. "adcs r2, %[r]\n\t"
  19092. #else
  19093. "adc r2, %[r]\n\t"
  19094. #endif
  19095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19096. "adds r3, r3, r5\n\t"
  19097. #else
  19098. "add r3, r3, r5\n\t"
  19099. #endif
  19100. #ifdef WOLFSSL_KEIL
  19101. "adcs r4, r4, r6\n\t"
  19102. #elif defined(__clang__)
  19103. "adcs r4, r6\n\t"
  19104. #else
  19105. "adc r4, r6\n\t"
  19106. #endif
  19107. #ifdef WOLFSSL_KEIL
  19108. "adcs r2, r2, %[r]\n\t"
  19109. #elif defined(__clang__)
  19110. "adcs r2, %[r]\n\t"
  19111. #else
  19112. "adc r2, %[r]\n\t"
  19113. #endif
  19114. "mov %[r], r8\n\t"
  19115. "str r3, [%[r], #52]\n\t"
  19116. "movs %[r], #0\n\t"
  19117. "# A[7] * A[7]\n\t"
  19118. "mov %[a], r9\n\t"
  19119. "mov r7, lr\n\t"
  19120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19121. "lsrs r6, r7, #16\n\t"
  19122. #else
  19123. "lsr r6, r7, #16\n\t"
  19124. #endif
  19125. "uxth r5, r7\n\t"
  19126. #ifdef WOLFSSL_KEIL
  19127. "muls r5, r5, r5\n\t"
  19128. #elif defined(__clang__)
  19129. "muls r5, r5\n\t"
  19130. #else
  19131. "mul r5, r5\n\t"
  19132. #endif
  19133. #ifdef WOLFSSL_KEIL
  19134. "muls r6, r6, r6\n\t"
  19135. #elif defined(__clang__)
  19136. "muls r6, r6\n\t"
  19137. #else
  19138. "mul r6, r6\n\t"
  19139. #endif
  19140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19141. "adds r4, r4, r5\n\t"
  19142. #else
  19143. "add r4, r4, r5\n\t"
  19144. #endif
  19145. #ifdef WOLFSSL_KEIL
  19146. "adcs r2, r2, r6\n\t"
  19147. #elif defined(__clang__)
  19148. "adcs r2, r6\n\t"
  19149. #else
  19150. "adc r2, r6\n\t"
  19151. #endif
  19152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19153. "lsrs r6, r7, #16\n\t"
  19154. #else
  19155. "lsr r6, r7, #16\n\t"
  19156. #endif
  19157. "uxth r5, r7\n\t"
  19158. #ifdef WOLFSSL_KEIL
  19159. "muls r5, r6, r5\n\t"
  19160. #elif defined(__clang__)
  19161. "muls r5, r6\n\t"
  19162. #else
  19163. "mul r5, r6\n\t"
  19164. #endif
  19165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19166. "lsrs r6, r5, #15\n\t"
  19167. #else
  19168. "lsr r6, r5, #15\n\t"
  19169. #endif
  19170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19171. "lsls r5, r5, #17\n\t"
  19172. #else
  19173. "lsl r5, r5, #17\n\t"
  19174. #endif
  19175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19176. "adds r4, r4, r5\n\t"
  19177. #else
  19178. "add r4, r4, r5\n\t"
  19179. #endif
  19180. #ifdef WOLFSSL_KEIL
  19181. "adcs r2, r2, r6\n\t"
  19182. #elif defined(__clang__)
  19183. "adcs r2, r6\n\t"
  19184. #else
  19185. "adc r2, r6\n\t"
  19186. #endif
  19187. "mov %[r], r8\n\t"
  19188. "str r4, [%[r], #56]\n\t"
  19189. "str r2, [%[r], #60]\n\t"
  19190. "pop {r2, r3, r4, r5}\n\t"
  19191. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19192. "pop {r2, r3, r4, r5}\n\t"
  19193. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  19194. : [r] "+l" (r), [a] "+l" (a)
  19195. :
  19196. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  19197. );
  19198. }
  19199. #endif /* !WOLFSSL_SP_LARGE_CODE */
  19200. /* Sub b from a into r. (r = a - b)
  19201. *
  19202. * r A single precision integer.
  19203. * a A single precision integer.
  19204. * b A single precision integer.
  19205. */
  19206. SP_NOINLINE static sp_digit sp_2048_sub_8(sp_digit* r, const sp_digit* a,
  19207. const sp_digit* b)
  19208. {
  19209. __asm__ __volatile__ (
  19210. "ldm %[b]!, {r5, r6}\n\t"
  19211. "ldm %[a]!, {r3, r4}\n\t"
  19212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19213. "subs r3, r3, r5\n\t"
  19214. #else
  19215. "sub r3, r3, r5\n\t"
  19216. #endif
  19217. #ifdef WOLFSSL_KEIL
  19218. "sbcs r4, r4, r6\n\t"
  19219. #elif defined(__clang__)
  19220. "sbcs r4, r6\n\t"
  19221. #else
  19222. "sbc r4, r6\n\t"
  19223. #endif
  19224. "stm %[r]!, {r3, r4}\n\t"
  19225. "ldm %[b]!, {r5, r6}\n\t"
  19226. "ldm %[a]!, {r3, r4}\n\t"
  19227. #ifdef WOLFSSL_KEIL
  19228. "sbcs r3, r3, r5\n\t"
  19229. #elif defined(__clang__)
  19230. "sbcs r3, r5\n\t"
  19231. #else
  19232. "sbc r3, r5\n\t"
  19233. #endif
  19234. #ifdef WOLFSSL_KEIL
  19235. "sbcs r4, r4, r6\n\t"
  19236. #elif defined(__clang__)
  19237. "sbcs r4, r6\n\t"
  19238. #else
  19239. "sbc r4, r6\n\t"
  19240. #endif
  19241. "stm %[r]!, {r3, r4}\n\t"
  19242. "ldm %[b]!, {r5, r6}\n\t"
  19243. "ldm %[a]!, {r3, r4}\n\t"
  19244. #ifdef WOLFSSL_KEIL
  19245. "sbcs r3, r3, r5\n\t"
  19246. #elif defined(__clang__)
  19247. "sbcs r3, r5\n\t"
  19248. #else
  19249. "sbc r3, r5\n\t"
  19250. #endif
  19251. #ifdef WOLFSSL_KEIL
  19252. "sbcs r4, r4, r6\n\t"
  19253. #elif defined(__clang__)
  19254. "sbcs r4, r6\n\t"
  19255. #else
  19256. "sbc r4, r6\n\t"
  19257. #endif
  19258. "stm %[r]!, {r3, r4}\n\t"
  19259. "ldm %[b]!, {r5, r6}\n\t"
  19260. "ldm %[a]!, {r3, r4}\n\t"
  19261. #ifdef WOLFSSL_KEIL
  19262. "sbcs r3, r3, r5\n\t"
  19263. #elif defined(__clang__)
  19264. "sbcs r3, r5\n\t"
  19265. #else
  19266. "sbc r3, r5\n\t"
  19267. #endif
  19268. #ifdef WOLFSSL_KEIL
  19269. "sbcs r4, r4, r6\n\t"
  19270. #elif defined(__clang__)
  19271. "sbcs r4, r6\n\t"
  19272. #else
  19273. "sbc r4, r6\n\t"
  19274. #endif
  19275. "stm %[r]!, {r3, r4}\n\t"
  19276. #ifdef WOLFSSL_KEIL
  19277. "sbcs %[r], %[r], %[r]\n\t"
  19278. #elif defined(__clang__)
  19279. "sbcs %[r], %[r]\n\t"
  19280. #else
  19281. "sbc %[r], %[r]\n\t"
  19282. #endif
  19283. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  19284. :
  19285. : "memory", "r3", "r4", "r5", "r6"
  19286. );
  19287. return (uint32_t)(size_t)r;
  19288. }
  19289. /* Square a and put result in r. (r = a * a)
  19290. *
  19291. * r A single precision integer.
  19292. * a A single precision integer.
  19293. */
  19294. SP_NOINLINE static void sp_2048_sqr_16(sp_digit* r, const sp_digit* a)
  19295. {
  19296. sp_digit* z0 = r;
  19297. sp_digit* z2 = r + 16;
  19298. sp_digit z1[16];
  19299. sp_digit* a1 = z1;
  19300. sp_digit* zero = z1 + 8;
  19301. sp_digit u;
  19302. sp_digit mask;
  19303. sp_digit* p1;
  19304. sp_digit* p2;
  19305. XMEMSET(zero, 0, sizeof(sp_digit) * 8);
  19306. mask = sp_2048_sub_8(a1, a, &a[8]);
  19307. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  19308. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  19309. (void)sp_2048_sub_8(a1, p1, p2);
  19310. sp_2048_sqr_8(z2, &a[8]);
  19311. sp_2048_sqr_8(z0, a);
  19312. sp_2048_sqr_8(z1, a1);
  19313. u = 0;
  19314. u -= sp_2048_sub_in_place_16(z1, z2);
  19315. u -= sp_2048_sub_in_place_16(z1, z0);
  19316. u += sp_2048_sub_in_place_16(r + 8, z1);
  19317. sp_2048_add_word_8(r + 24, r + 24, u);
  19318. }
  19319. /* Sub b from a into r. (r = a - b)
  19320. *
  19321. * r A single precision integer.
  19322. * a A single precision integer.
  19323. * b A single precision integer.
  19324. */
  19325. SP_NOINLINE static sp_digit sp_2048_sub_16(sp_digit* r, const sp_digit* a,
  19326. const sp_digit* b)
  19327. {
  19328. __asm__ __volatile__ (
  19329. "ldm %[b]!, {r5, r6}\n\t"
  19330. "ldm %[a]!, {r3, r4}\n\t"
  19331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19332. "subs r3, r3, r5\n\t"
  19333. #else
  19334. "sub r3, r3, r5\n\t"
  19335. #endif
  19336. #ifdef WOLFSSL_KEIL
  19337. "sbcs r4, r4, r6\n\t"
  19338. #elif defined(__clang__)
  19339. "sbcs r4, r6\n\t"
  19340. #else
  19341. "sbc r4, r6\n\t"
  19342. #endif
  19343. "stm %[r]!, {r3, r4}\n\t"
  19344. "ldm %[b]!, {r5, r6}\n\t"
  19345. "ldm %[a]!, {r3, r4}\n\t"
  19346. #ifdef WOLFSSL_KEIL
  19347. "sbcs r3, r3, r5\n\t"
  19348. #elif defined(__clang__)
  19349. "sbcs r3, r5\n\t"
  19350. #else
  19351. "sbc r3, r5\n\t"
  19352. #endif
  19353. #ifdef WOLFSSL_KEIL
  19354. "sbcs r4, r4, r6\n\t"
  19355. #elif defined(__clang__)
  19356. "sbcs r4, r6\n\t"
  19357. #else
  19358. "sbc r4, r6\n\t"
  19359. #endif
  19360. "stm %[r]!, {r3, r4}\n\t"
  19361. "ldm %[b]!, {r5, r6}\n\t"
  19362. "ldm %[a]!, {r3, r4}\n\t"
  19363. #ifdef WOLFSSL_KEIL
  19364. "sbcs r3, r3, r5\n\t"
  19365. #elif defined(__clang__)
  19366. "sbcs r3, r5\n\t"
  19367. #else
  19368. "sbc r3, r5\n\t"
  19369. #endif
  19370. #ifdef WOLFSSL_KEIL
  19371. "sbcs r4, r4, r6\n\t"
  19372. #elif defined(__clang__)
  19373. "sbcs r4, r6\n\t"
  19374. #else
  19375. "sbc r4, r6\n\t"
  19376. #endif
  19377. "stm %[r]!, {r3, r4}\n\t"
  19378. "ldm %[b]!, {r5, r6}\n\t"
  19379. "ldm %[a]!, {r3, r4}\n\t"
  19380. #ifdef WOLFSSL_KEIL
  19381. "sbcs r3, r3, r5\n\t"
  19382. #elif defined(__clang__)
  19383. "sbcs r3, r5\n\t"
  19384. #else
  19385. "sbc r3, r5\n\t"
  19386. #endif
  19387. #ifdef WOLFSSL_KEIL
  19388. "sbcs r4, r4, r6\n\t"
  19389. #elif defined(__clang__)
  19390. "sbcs r4, r6\n\t"
  19391. #else
  19392. "sbc r4, r6\n\t"
  19393. #endif
  19394. "stm %[r]!, {r3, r4}\n\t"
  19395. "ldm %[b]!, {r5, r6}\n\t"
  19396. "ldm %[a]!, {r3, r4}\n\t"
  19397. #ifdef WOLFSSL_KEIL
  19398. "sbcs r3, r3, r5\n\t"
  19399. #elif defined(__clang__)
  19400. "sbcs r3, r5\n\t"
  19401. #else
  19402. "sbc r3, r5\n\t"
  19403. #endif
  19404. #ifdef WOLFSSL_KEIL
  19405. "sbcs r4, r4, r6\n\t"
  19406. #elif defined(__clang__)
  19407. "sbcs r4, r6\n\t"
  19408. #else
  19409. "sbc r4, r6\n\t"
  19410. #endif
  19411. "stm %[r]!, {r3, r4}\n\t"
  19412. "ldm %[b]!, {r5, r6}\n\t"
  19413. "ldm %[a]!, {r3, r4}\n\t"
  19414. #ifdef WOLFSSL_KEIL
  19415. "sbcs r3, r3, r5\n\t"
  19416. #elif defined(__clang__)
  19417. "sbcs r3, r5\n\t"
  19418. #else
  19419. "sbc r3, r5\n\t"
  19420. #endif
  19421. #ifdef WOLFSSL_KEIL
  19422. "sbcs r4, r4, r6\n\t"
  19423. #elif defined(__clang__)
  19424. "sbcs r4, r6\n\t"
  19425. #else
  19426. "sbc r4, r6\n\t"
  19427. #endif
  19428. "stm %[r]!, {r3, r4}\n\t"
  19429. "ldm %[b]!, {r5, r6}\n\t"
  19430. "ldm %[a]!, {r3, r4}\n\t"
  19431. #ifdef WOLFSSL_KEIL
  19432. "sbcs r3, r3, r5\n\t"
  19433. #elif defined(__clang__)
  19434. "sbcs r3, r5\n\t"
  19435. #else
  19436. "sbc r3, r5\n\t"
  19437. #endif
  19438. #ifdef WOLFSSL_KEIL
  19439. "sbcs r4, r4, r6\n\t"
  19440. #elif defined(__clang__)
  19441. "sbcs r4, r6\n\t"
  19442. #else
  19443. "sbc r4, r6\n\t"
  19444. #endif
  19445. "stm %[r]!, {r3, r4}\n\t"
  19446. "ldm %[b]!, {r5, r6}\n\t"
  19447. "ldm %[a]!, {r3, r4}\n\t"
  19448. #ifdef WOLFSSL_KEIL
  19449. "sbcs r3, r3, r5\n\t"
  19450. #elif defined(__clang__)
  19451. "sbcs r3, r5\n\t"
  19452. #else
  19453. "sbc r3, r5\n\t"
  19454. #endif
  19455. #ifdef WOLFSSL_KEIL
  19456. "sbcs r4, r4, r6\n\t"
  19457. #elif defined(__clang__)
  19458. "sbcs r4, r6\n\t"
  19459. #else
  19460. "sbc r4, r6\n\t"
  19461. #endif
  19462. "stm %[r]!, {r3, r4}\n\t"
  19463. #ifdef WOLFSSL_KEIL
  19464. "sbcs %[r], %[r], %[r]\n\t"
  19465. #elif defined(__clang__)
  19466. "sbcs %[r], %[r]\n\t"
  19467. #else
  19468. "sbc %[r], %[r]\n\t"
  19469. #endif
  19470. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  19471. :
  19472. : "memory", "r3", "r4", "r5", "r6"
  19473. );
  19474. return (uint32_t)(size_t)r;
  19475. }
  19476. /* Square a and put result in r. (r = a * a)
  19477. *
  19478. * r A single precision integer.
  19479. * a A single precision integer.
  19480. */
  19481. SP_NOINLINE static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
  19482. {
  19483. sp_digit* z0 = r;
  19484. sp_digit* z2 = r + 32;
  19485. sp_digit z1[32];
  19486. sp_digit* a1 = z1;
  19487. sp_digit* zero = z1 + 16;
  19488. sp_digit u;
  19489. sp_digit mask;
  19490. sp_digit* p1;
  19491. sp_digit* p2;
  19492. XMEMSET(zero, 0, sizeof(sp_digit) * 16);
  19493. mask = sp_2048_sub_16(a1, a, &a[16]);
  19494. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  19495. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  19496. (void)sp_2048_sub_16(a1, p1, p2);
  19497. sp_2048_sqr_16(z2, &a[16]);
  19498. sp_2048_sqr_16(z0, a);
  19499. sp_2048_sqr_16(z1, a1);
  19500. u = 0;
  19501. u -= sp_2048_sub_in_place_32(z1, z2);
  19502. u -= sp_2048_sub_in_place_32(z1, z0);
  19503. u += sp_2048_sub_in_place_32(r + 16, z1);
  19504. sp_2048_add_word_16(r + 48, r + 48, u);
  19505. }
  19506. /* Sub b from a into r. (r = a - b)
  19507. *
  19508. * r A single precision integer.
  19509. * a A single precision integer.
  19510. * b A single precision integer.
  19511. */
  19512. SP_NOINLINE static sp_digit sp_2048_sub_32(sp_digit* r, const sp_digit* a,
  19513. const sp_digit* b)
  19514. {
  19515. __asm__ __volatile__ (
  19516. "ldm %[b]!, {r5, r6}\n\t"
  19517. "ldm %[a]!, {r3, r4}\n\t"
  19518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19519. "subs r3, r3, r5\n\t"
  19520. #else
  19521. "sub r3, r3, r5\n\t"
  19522. #endif
  19523. #ifdef WOLFSSL_KEIL
  19524. "sbcs r4, r4, r6\n\t"
  19525. #elif defined(__clang__)
  19526. "sbcs r4, r6\n\t"
  19527. #else
  19528. "sbc r4, r6\n\t"
  19529. #endif
  19530. "stm %[r]!, {r3, r4}\n\t"
  19531. "ldm %[b]!, {r5, r6}\n\t"
  19532. "ldm %[a]!, {r3, r4}\n\t"
  19533. #ifdef WOLFSSL_KEIL
  19534. "sbcs r3, r3, r5\n\t"
  19535. #elif defined(__clang__)
  19536. "sbcs r3, r5\n\t"
  19537. #else
  19538. "sbc r3, r5\n\t"
  19539. #endif
  19540. #ifdef WOLFSSL_KEIL
  19541. "sbcs r4, r4, r6\n\t"
  19542. #elif defined(__clang__)
  19543. "sbcs r4, r6\n\t"
  19544. #else
  19545. "sbc r4, r6\n\t"
  19546. #endif
  19547. "stm %[r]!, {r3, r4}\n\t"
  19548. "ldm %[b]!, {r5, r6}\n\t"
  19549. "ldm %[a]!, {r3, r4}\n\t"
  19550. #ifdef WOLFSSL_KEIL
  19551. "sbcs r3, r3, r5\n\t"
  19552. #elif defined(__clang__)
  19553. "sbcs r3, r5\n\t"
  19554. #else
  19555. "sbc r3, r5\n\t"
  19556. #endif
  19557. #ifdef WOLFSSL_KEIL
  19558. "sbcs r4, r4, r6\n\t"
  19559. #elif defined(__clang__)
  19560. "sbcs r4, r6\n\t"
  19561. #else
  19562. "sbc r4, r6\n\t"
  19563. #endif
  19564. "stm %[r]!, {r3, r4}\n\t"
  19565. "ldm %[b]!, {r5, r6}\n\t"
  19566. "ldm %[a]!, {r3, r4}\n\t"
  19567. #ifdef WOLFSSL_KEIL
  19568. "sbcs r3, r3, r5\n\t"
  19569. #elif defined(__clang__)
  19570. "sbcs r3, r5\n\t"
  19571. #else
  19572. "sbc r3, r5\n\t"
  19573. #endif
  19574. #ifdef WOLFSSL_KEIL
  19575. "sbcs r4, r4, r6\n\t"
  19576. #elif defined(__clang__)
  19577. "sbcs r4, r6\n\t"
  19578. #else
  19579. "sbc r4, r6\n\t"
  19580. #endif
  19581. "stm %[r]!, {r3, r4}\n\t"
  19582. "ldm %[b]!, {r5, r6}\n\t"
  19583. "ldm %[a]!, {r3, r4}\n\t"
  19584. #ifdef WOLFSSL_KEIL
  19585. "sbcs r3, r3, r5\n\t"
  19586. #elif defined(__clang__)
  19587. "sbcs r3, r5\n\t"
  19588. #else
  19589. "sbc r3, r5\n\t"
  19590. #endif
  19591. #ifdef WOLFSSL_KEIL
  19592. "sbcs r4, r4, r6\n\t"
  19593. #elif defined(__clang__)
  19594. "sbcs r4, r6\n\t"
  19595. #else
  19596. "sbc r4, r6\n\t"
  19597. #endif
  19598. "stm %[r]!, {r3, r4}\n\t"
  19599. "ldm %[b]!, {r5, r6}\n\t"
  19600. "ldm %[a]!, {r3, r4}\n\t"
  19601. #ifdef WOLFSSL_KEIL
  19602. "sbcs r3, r3, r5\n\t"
  19603. #elif defined(__clang__)
  19604. "sbcs r3, r5\n\t"
  19605. #else
  19606. "sbc r3, r5\n\t"
  19607. #endif
  19608. #ifdef WOLFSSL_KEIL
  19609. "sbcs r4, r4, r6\n\t"
  19610. #elif defined(__clang__)
  19611. "sbcs r4, r6\n\t"
  19612. #else
  19613. "sbc r4, r6\n\t"
  19614. #endif
  19615. "stm %[r]!, {r3, r4}\n\t"
  19616. "ldm %[b]!, {r5, r6}\n\t"
  19617. "ldm %[a]!, {r3, r4}\n\t"
  19618. #ifdef WOLFSSL_KEIL
  19619. "sbcs r3, r3, r5\n\t"
  19620. #elif defined(__clang__)
  19621. "sbcs r3, r5\n\t"
  19622. #else
  19623. "sbc r3, r5\n\t"
  19624. #endif
  19625. #ifdef WOLFSSL_KEIL
  19626. "sbcs r4, r4, r6\n\t"
  19627. #elif defined(__clang__)
  19628. "sbcs r4, r6\n\t"
  19629. #else
  19630. "sbc r4, r6\n\t"
  19631. #endif
  19632. "stm %[r]!, {r3, r4}\n\t"
  19633. "ldm %[b]!, {r5, r6}\n\t"
  19634. "ldm %[a]!, {r3, r4}\n\t"
  19635. #ifdef WOLFSSL_KEIL
  19636. "sbcs r3, r3, r5\n\t"
  19637. #elif defined(__clang__)
  19638. "sbcs r3, r5\n\t"
  19639. #else
  19640. "sbc r3, r5\n\t"
  19641. #endif
  19642. #ifdef WOLFSSL_KEIL
  19643. "sbcs r4, r4, r6\n\t"
  19644. #elif defined(__clang__)
  19645. "sbcs r4, r6\n\t"
  19646. #else
  19647. "sbc r4, r6\n\t"
  19648. #endif
  19649. "stm %[r]!, {r3, r4}\n\t"
  19650. "ldm %[b]!, {r5, r6}\n\t"
  19651. "ldm %[a]!, {r3, r4}\n\t"
  19652. #ifdef WOLFSSL_KEIL
  19653. "sbcs r3, r3, r5\n\t"
  19654. #elif defined(__clang__)
  19655. "sbcs r3, r5\n\t"
  19656. #else
  19657. "sbc r3, r5\n\t"
  19658. #endif
  19659. #ifdef WOLFSSL_KEIL
  19660. "sbcs r4, r4, r6\n\t"
  19661. #elif defined(__clang__)
  19662. "sbcs r4, r6\n\t"
  19663. #else
  19664. "sbc r4, r6\n\t"
  19665. #endif
  19666. "stm %[r]!, {r3, r4}\n\t"
  19667. "ldm %[b]!, {r5, r6}\n\t"
  19668. "ldm %[a]!, {r3, r4}\n\t"
  19669. #ifdef WOLFSSL_KEIL
  19670. "sbcs r3, r3, r5\n\t"
  19671. #elif defined(__clang__)
  19672. "sbcs r3, r5\n\t"
  19673. #else
  19674. "sbc r3, r5\n\t"
  19675. #endif
  19676. #ifdef WOLFSSL_KEIL
  19677. "sbcs r4, r4, r6\n\t"
  19678. #elif defined(__clang__)
  19679. "sbcs r4, r6\n\t"
  19680. #else
  19681. "sbc r4, r6\n\t"
  19682. #endif
  19683. "stm %[r]!, {r3, r4}\n\t"
  19684. "ldm %[b]!, {r5, r6}\n\t"
  19685. "ldm %[a]!, {r3, r4}\n\t"
  19686. #ifdef WOLFSSL_KEIL
  19687. "sbcs r3, r3, r5\n\t"
  19688. #elif defined(__clang__)
  19689. "sbcs r3, r5\n\t"
  19690. #else
  19691. "sbc r3, r5\n\t"
  19692. #endif
  19693. #ifdef WOLFSSL_KEIL
  19694. "sbcs r4, r4, r6\n\t"
  19695. #elif defined(__clang__)
  19696. "sbcs r4, r6\n\t"
  19697. #else
  19698. "sbc r4, r6\n\t"
  19699. #endif
  19700. "stm %[r]!, {r3, r4}\n\t"
  19701. "ldm %[b]!, {r5, r6}\n\t"
  19702. "ldm %[a]!, {r3, r4}\n\t"
  19703. #ifdef WOLFSSL_KEIL
  19704. "sbcs r3, r3, r5\n\t"
  19705. #elif defined(__clang__)
  19706. "sbcs r3, r5\n\t"
  19707. #else
  19708. "sbc r3, r5\n\t"
  19709. #endif
  19710. #ifdef WOLFSSL_KEIL
  19711. "sbcs r4, r4, r6\n\t"
  19712. #elif defined(__clang__)
  19713. "sbcs r4, r6\n\t"
  19714. #else
  19715. "sbc r4, r6\n\t"
  19716. #endif
  19717. "stm %[r]!, {r3, r4}\n\t"
  19718. "ldm %[b]!, {r5, r6}\n\t"
  19719. "ldm %[a]!, {r3, r4}\n\t"
  19720. #ifdef WOLFSSL_KEIL
  19721. "sbcs r3, r3, r5\n\t"
  19722. #elif defined(__clang__)
  19723. "sbcs r3, r5\n\t"
  19724. #else
  19725. "sbc r3, r5\n\t"
  19726. #endif
  19727. #ifdef WOLFSSL_KEIL
  19728. "sbcs r4, r4, r6\n\t"
  19729. #elif defined(__clang__)
  19730. "sbcs r4, r6\n\t"
  19731. #else
  19732. "sbc r4, r6\n\t"
  19733. #endif
  19734. "stm %[r]!, {r3, r4}\n\t"
  19735. "ldm %[b]!, {r5, r6}\n\t"
  19736. "ldm %[a]!, {r3, r4}\n\t"
  19737. #ifdef WOLFSSL_KEIL
  19738. "sbcs r3, r3, r5\n\t"
  19739. #elif defined(__clang__)
  19740. "sbcs r3, r5\n\t"
  19741. #else
  19742. "sbc r3, r5\n\t"
  19743. #endif
  19744. #ifdef WOLFSSL_KEIL
  19745. "sbcs r4, r4, r6\n\t"
  19746. #elif defined(__clang__)
  19747. "sbcs r4, r6\n\t"
  19748. #else
  19749. "sbc r4, r6\n\t"
  19750. #endif
  19751. "stm %[r]!, {r3, r4}\n\t"
  19752. "ldm %[b]!, {r5, r6}\n\t"
  19753. "ldm %[a]!, {r3, r4}\n\t"
  19754. #ifdef WOLFSSL_KEIL
  19755. "sbcs r3, r3, r5\n\t"
  19756. #elif defined(__clang__)
  19757. "sbcs r3, r5\n\t"
  19758. #else
  19759. "sbc r3, r5\n\t"
  19760. #endif
  19761. #ifdef WOLFSSL_KEIL
  19762. "sbcs r4, r4, r6\n\t"
  19763. #elif defined(__clang__)
  19764. "sbcs r4, r6\n\t"
  19765. #else
  19766. "sbc r4, r6\n\t"
  19767. #endif
  19768. "stm %[r]!, {r3, r4}\n\t"
  19769. "ldm %[b]!, {r5, r6}\n\t"
  19770. "ldm %[a]!, {r3, r4}\n\t"
  19771. #ifdef WOLFSSL_KEIL
  19772. "sbcs r3, r3, r5\n\t"
  19773. #elif defined(__clang__)
  19774. "sbcs r3, r5\n\t"
  19775. #else
  19776. "sbc r3, r5\n\t"
  19777. #endif
  19778. #ifdef WOLFSSL_KEIL
  19779. "sbcs r4, r4, r6\n\t"
  19780. #elif defined(__clang__)
  19781. "sbcs r4, r6\n\t"
  19782. #else
  19783. "sbc r4, r6\n\t"
  19784. #endif
  19785. "stm %[r]!, {r3, r4}\n\t"
  19786. #ifdef WOLFSSL_KEIL
  19787. "sbcs %[r], %[r], %[r]\n\t"
  19788. #elif defined(__clang__)
  19789. "sbcs %[r], %[r]\n\t"
  19790. #else
  19791. "sbc %[r], %[r]\n\t"
  19792. #endif
  19793. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  19794. :
  19795. : "memory", "r3", "r4", "r5", "r6"
  19796. );
  19797. return (uint32_t)(size_t)r;
  19798. }
  19799. /* Square a and put result in r. (r = a * a)
  19800. *
  19801. * r A single precision integer.
  19802. * a A single precision integer.
  19803. */
  19804. SP_NOINLINE static void sp_2048_sqr_64(sp_digit* r, const sp_digit* a)
  19805. {
  19806. sp_digit* z0 = r;
  19807. sp_digit* z2 = r + 64;
  19808. sp_digit z1[64];
  19809. sp_digit* a1 = z1;
  19810. sp_digit* zero = z1 + 32;
  19811. sp_digit u;
  19812. sp_digit mask;
  19813. sp_digit* p1;
  19814. sp_digit* p2;
  19815. XMEMSET(zero, 0, sizeof(sp_digit) * 32);
  19816. mask = sp_2048_sub_32(a1, a, &a[32]);
  19817. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  19818. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  19819. (void)sp_2048_sub_32(a1, p1, p2);
  19820. sp_2048_sqr_32(z2, &a[32]);
  19821. sp_2048_sqr_32(z0, a);
  19822. sp_2048_sqr_32(z1, a1);
  19823. u = 0;
  19824. u -= sp_2048_sub_in_place_64(z1, z2);
  19825. u -= sp_2048_sub_in_place_64(z1, z0);
  19826. u += sp_2048_sub_in_place_64(r + 32, z1);
  19827. sp_2048_add_word_32(r + 96, r + 96, u);
  19828. }
  19829. #endif /* !WOLFSSL_SP_SMALL */
  19830. #ifdef WOLFSSL_SP_SMALL
  19831. /* Add b to a into r. (r = a + b)
  19832. *
  19833. * r A single precision integer.
  19834. * a A single precision integer.
  19835. * b A single precision integer.
  19836. */
  19837. SP_NOINLINE static sp_digit sp_2048_add_64(sp_digit* r, const sp_digit* a,
  19838. const sp_digit* b)
  19839. {
  19840. __asm__ __volatile__ (
  19841. "movs r6, %[a]\n\t"
  19842. "movs r7, #0\n\t"
  19843. "movs r3, #0\n\t"
  19844. "movs r4, #0xff\n\t"
  19845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19846. "adds r4, r4, #1\n\t"
  19847. #else
  19848. "add r4, r4, #1\n\t"
  19849. #endif
  19850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19851. "subs r7, r7, #1\n\t"
  19852. #else
  19853. "sub r7, r7, #1\n\t"
  19854. #endif
  19855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19856. "adds r6, r6, r4\n\t"
  19857. #else
  19858. "add r6, r6, r4\n\t"
  19859. #endif
  19860. "\n"
  19861. "L_sp_2048_add_64_word_%=:\n\t"
  19862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19863. "adds r3, r3, r7\n\t"
  19864. #else
  19865. "add r3, r3, r7\n\t"
  19866. #endif
  19867. "ldr r4, [%[a]]\n\t"
  19868. "ldr r5, [%[b]]\n\t"
  19869. #ifdef WOLFSSL_KEIL
  19870. "adcs r4, r4, r5\n\t"
  19871. #elif defined(__clang__)
  19872. "adcs r4, r5\n\t"
  19873. #else
  19874. "adc r4, r5\n\t"
  19875. #endif
  19876. "str r4, [%[r]]\n\t"
  19877. "movs r3, #0\n\t"
  19878. #ifdef WOLFSSL_KEIL
  19879. "adcs r3, r3, r3\n\t"
  19880. #elif defined(__clang__)
  19881. "adcs r3, r3\n\t"
  19882. #else
  19883. "adc r3, r3\n\t"
  19884. #endif
  19885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19886. "adds %[a], %[a], #4\n\t"
  19887. #else
  19888. "add %[a], %[a], #4\n\t"
  19889. #endif
  19890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19891. "adds %[b], %[b], #4\n\t"
  19892. #else
  19893. "add %[b], %[b], #4\n\t"
  19894. #endif
  19895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19896. "adds %[r], %[r], #4\n\t"
  19897. #else
  19898. "add %[r], %[r], #4\n\t"
  19899. #endif
  19900. "cmp %[a], r6\n\t"
  19901. "bne L_sp_2048_add_64_word_%=\n\t"
  19902. "movs %[r], r3\n\t"
  19903. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  19904. :
  19905. : "memory", "r3", "r4", "r5", "r6", "r7"
  19906. );
  19907. return (uint32_t)(size_t)r;
  19908. }
  19909. #endif /* WOLFSSL_SP_SMALL */
  19910. #ifdef WOLFSSL_SP_SMALL
  19911. /* Sub b from a into a. (a -= b)
  19912. *
  19913. * a A single precision integer.
  19914. * b A single precision integer.
  19915. */
  19916. SP_NOINLINE static sp_digit sp_2048_sub_in_place_64(sp_digit* a,
  19917. const sp_digit* b)
  19918. {
  19919. __asm__ __volatile__ (
  19920. "movs r7, %[a]\n\t"
  19921. "movs r2, #0\n\t"
  19922. "movs r5, #0xff\n\t"
  19923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19924. "adds r5, r5, #1\n\t"
  19925. #else
  19926. "add r5, r5, #1\n\t"
  19927. #endif
  19928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19929. "adds r7, r7, r5\n\t"
  19930. #else
  19931. "add r7, r7, r5\n\t"
  19932. #endif
  19933. "\n"
  19934. "L_sp_2048_sub_in_place_64_words_%=:\n\t"
  19935. "movs r5, #0\n\t"
  19936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19937. "subs r5, r5, r2\n\t"
  19938. #else
  19939. "sub r5, r5, r2\n\t"
  19940. #endif
  19941. "ldr r3, [%[a]]\n\t"
  19942. "ldr r4, [%[a], #4]\n\t"
  19943. "ldr r5, [%[b]]\n\t"
  19944. "ldr r6, [%[b], #4]\n\t"
  19945. #ifdef WOLFSSL_KEIL
  19946. "sbcs r3, r3, r5\n\t"
  19947. #elif defined(__clang__)
  19948. "sbcs r3, r5\n\t"
  19949. #else
  19950. "sbc r3, r5\n\t"
  19951. #endif
  19952. #ifdef WOLFSSL_KEIL
  19953. "sbcs r4, r4, r6\n\t"
  19954. #elif defined(__clang__)
  19955. "sbcs r4, r6\n\t"
  19956. #else
  19957. "sbc r4, r6\n\t"
  19958. #endif
  19959. "str r3, [%[a]]\n\t"
  19960. "str r4, [%[a], #4]\n\t"
  19961. #ifdef WOLFSSL_KEIL
  19962. "sbcs r2, r2, r2\n\t"
  19963. #elif defined(__clang__)
  19964. "sbcs r2, r2\n\t"
  19965. #else
  19966. "sbc r2, r2\n\t"
  19967. #endif
  19968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19969. "adds %[a], %[a], #8\n\t"
  19970. #else
  19971. "add %[a], %[a], #8\n\t"
  19972. #endif
  19973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  19974. "adds %[b], %[b], #8\n\t"
  19975. #else
  19976. "add %[b], %[b], #8\n\t"
  19977. #endif
  19978. "cmp %[a], r7\n\t"
  19979. "bne L_sp_2048_sub_in_place_64_words_%=\n\t"
  19980. "movs %[a], r2\n\t"
  19981. : [a] "+l" (a), [b] "+l" (b)
  19982. :
  19983. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  19984. );
  19985. return (uint32_t)(size_t)a;
  19986. }
  19987. #endif /* WOLFSSL_SP_SMALL */
  19988. #ifdef WOLFSSL_SP_SMALL
  19989. /* Multiply a and b into r. (r = a * b)
  19990. *
  19991. * r A single precision integer.
  19992. * a A single precision integer.
  19993. * b A single precision integer.
  19994. */
  19995. SP_NOINLINE static void sp_2048_mul_64(sp_digit* r, const sp_digit* a,
  19996. const sp_digit* b)
  19997. {
  19998. sp_digit t[64 * 2];
  19999. sp_digit* tmp = t;
  20000. __asm__ __volatile__ (
  20001. "movs r3, #0\n\t"
  20002. "movs r4, #0\n\t"
  20003. "mov r8, r3\n\t"
  20004. "mov r11, %[tmp]\n\t"
  20005. "mov r9, %[a]\n\t"
  20006. "mov r10, %[b]\n\t"
  20007. "movs r6, #0xff\n\t"
  20008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20009. "adds r6, r6, #1\n\t"
  20010. #else
  20011. "add r6, r6, #1\n\t"
  20012. #endif
  20013. "add r6, r6, r9\n\t"
  20014. "mov r12, r6\n\t"
  20015. "\n"
  20016. "L_sp_2048_mul_64_words_%=:\n\t"
  20017. "movs %[tmp], #0\n\t"
  20018. "movs r5, #0\n\t"
  20019. "movs r6, #0xfc\n\t"
  20020. "mov %[a], r8\n\t"
  20021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20022. "subs %[a], %[a], r6\n\t"
  20023. #else
  20024. "sub %[a], %[a], r6\n\t"
  20025. #endif
  20026. #ifdef WOLFSSL_KEIL
  20027. "sbcs r6, r6, r6\n\t"
  20028. #elif defined(__clang__)
  20029. "sbcs r6, r6\n\t"
  20030. #else
  20031. "sbc r6, r6\n\t"
  20032. #endif
  20033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20034. "mvns r6, r6\n\t"
  20035. #else
  20036. "mvn r6, r6\n\t"
  20037. #endif
  20038. #ifdef WOLFSSL_KEIL
  20039. "ands %[a], %[a], r6\n\t"
  20040. #elif defined(__clang__)
  20041. "ands %[a], r6\n\t"
  20042. #else
  20043. "and %[a], r6\n\t"
  20044. #endif
  20045. "mov %[b], r8\n\t"
  20046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20047. "subs %[b], %[b], %[a]\n\t"
  20048. #else
  20049. "sub %[b], %[b], %[a]\n\t"
  20050. #endif
  20051. "add %[a], %[a], r9\n\t"
  20052. "add %[b], %[b], r10\n\t"
  20053. "\n"
  20054. "L_sp_2048_mul_64_mul_%=:\n\t"
  20055. "# Multiply Start\n\t"
  20056. "ldrh r6, [%[a]]\n\t"
  20057. "ldrh r7, [%[b]]\n\t"
  20058. #ifdef WOLFSSL_KEIL
  20059. "muls r7, r6, r7\n\t"
  20060. #elif defined(__clang__)
  20061. "muls r7, r6\n\t"
  20062. #else
  20063. "mul r7, r6\n\t"
  20064. #endif
  20065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20066. "adds r3, r3, r7\n\t"
  20067. #else
  20068. "add r3, r3, r7\n\t"
  20069. #endif
  20070. #ifdef WOLFSSL_KEIL
  20071. "adcs r4, r4, %[tmp]\n\t"
  20072. #elif defined(__clang__)
  20073. "adcs r4, %[tmp]\n\t"
  20074. #else
  20075. "adc r4, %[tmp]\n\t"
  20076. #endif
  20077. #ifdef WOLFSSL_KEIL
  20078. "adcs r5, r5, %[tmp]\n\t"
  20079. #elif defined(__clang__)
  20080. "adcs r5, %[tmp]\n\t"
  20081. #else
  20082. "adc r5, %[tmp]\n\t"
  20083. #endif
  20084. "ldr r7, [%[b]]\n\t"
  20085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20086. "lsrs r7, r7, #16\n\t"
  20087. #else
  20088. "lsr r7, r7, #16\n\t"
  20089. #endif
  20090. #ifdef WOLFSSL_KEIL
  20091. "muls r6, r7, r6\n\t"
  20092. #elif defined(__clang__)
  20093. "muls r6, r7\n\t"
  20094. #else
  20095. "mul r6, r7\n\t"
  20096. #endif
  20097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20098. "lsrs r7, r6, #16\n\t"
  20099. #else
  20100. "lsr r7, r6, #16\n\t"
  20101. #endif
  20102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20103. "lsls r6, r6, #16\n\t"
  20104. #else
  20105. "lsl r6, r6, #16\n\t"
  20106. #endif
  20107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20108. "adds r3, r3, r6\n\t"
  20109. #else
  20110. "add r3, r3, r6\n\t"
  20111. #endif
  20112. #ifdef WOLFSSL_KEIL
  20113. "adcs r4, r4, r7\n\t"
  20114. #elif defined(__clang__)
  20115. "adcs r4, r7\n\t"
  20116. #else
  20117. "adc r4, r7\n\t"
  20118. #endif
  20119. #ifdef WOLFSSL_KEIL
  20120. "adcs r5, r5, %[tmp]\n\t"
  20121. #elif defined(__clang__)
  20122. "adcs r5, %[tmp]\n\t"
  20123. #else
  20124. "adc r5, %[tmp]\n\t"
  20125. #endif
  20126. "ldr r6, [%[a]]\n\t"
  20127. "ldr r7, [%[b]]\n\t"
  20128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20129. "lsrs r6, r6, #16\n\t"
  20130. #else
  20131. "lsr r6, r6, #16\n\t"
  20132. #endif
  20133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20134. "lsrs r7, r7, #16\n\t"
  20135. #else
  20136. "lsr r7, r7, #16\n\t"
  20137. #endif
  20138. #ifdef WOLFSSL_KEIL
  20139. "muls r7, r6, r7\n\t"
  20140. #elif defined(__clang__)
  20141. "muls r7, r6\n\t"
  20142. #else
  20143. "mul r7, r6\n\t"
  20144. #endif
  20145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20146. "adds r4, r4, r7\n\t"
  20147. #else
  20148. "add r4, r4, r7\n\t"
  20149. #endif
  20150. #ifdef WOLFSSL_KEIL
  20151. "adcs r5, r5, %[tmp]\n\t"
  20152. #elif defined(__clang__)
  20153. "adcs r5, %[tmp]\n\t"
  20154. #else
  20155. "adc r5, %[tmp]\n\t"
  20156. #endif
  20157. "ldrh r7, [%[b]]\n\t"
  20158. #ifdef WOLFSSL_KEIL
  20159. "muls r6, r7, r6\n\t"
  20160. #elif defined(__clang__)
  20161. "muls r6, r7\n\t"
  20162. #else
  20163. "mul r6, r7\n\t"
  20164. #endif
  20165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20166. "lsrs r7, r6, #16\n\t"
  20167. #else
  20168. "lsr r7, r6, #16\n\t"
  20169. #endif
  20170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20171. "lsls r6, r6, #16\n\t"
  20172. #else
  20173. "lsl r6, r6, #16\n\t"
  20174. #endif
  20175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20176. "adds r3, r3, r6\n\t"
  20177. #else
  20178. "add r3, r3, r6\n\t"
  20179. #endif
  20180. #ifdef WOLFSSL_KEIL
  20181. "adcs r4, r4, r7\n\t"
  20182. #elif defined(__clang__)
  20183. "adcs r4, r7\n\t"
  20184. #else
  20185. "adc r4, r7\n\t"
  20186. #endif
  20187. #ifdef WOLFSSL_KEIL
  20188. "adcs r5, r5, %[tmp]\n\t"
  20189. #elif defined(__clang__)
  20190. "adcs r5, %[tmp]\n\t"
  20191. #else
  20192. "adc r5, %[tmp]\n\t"
  20193. #endif
  20194. "# Multiply Done\n\t"
  20195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20196. "adds %[a], %[a], #4\n\t"
  20197. #else
  20198. "add %[a], %[a], #4\n\t"
  20199. #endif
  20200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20201. "subs %[b], %[b], #4\n\t"
  20202. #else
  20203. "sub %[b], %[b], #4\n\t"
  20204. #endif
  20205. "cmp %[a], r12\n\t"
  20206. "beq L_sp_2048_mul_64_done_mul_%=\n\t"
  20207. "mov r6, r8\n\t"
  20208. "add r6, r6, r9\n\t"
  20209. "cmp %[a], r6\n\t"
  20210. "ble L_sp_2048_mul_64_mul_%=\n\t"
  20211. "\n"
  20212. "L_sp_2048_mul_64_done_mul_%=:\n\t"
  20213. "mov %[tmp], r11\n\t"
  20214. "mov r7, r8\n\t"
  20215. "str r3, [%[tmp], r7]\n\t"
  20216. "movs r3, r4\n\t"
  20217. "movs r4, r5\n\t"
  20218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20219. "adds r7, r7, #4\n\t"
  20220. #else
  20221. "add r7, r7, #4\n\t"
  20222. #endif
  20223. "mov r8, r7\n\t"
  20224. "movs r6, #0xff\n\t"
  20225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20226. "adds r6, r6, #0xf9\n\t"
  20227. #else
  20228. "add r6, r6, #0xf9\n\t"
  20229. #endif
  20230. "cmp r7, r6\n\t"
  20231. "ble L_sp_2048_mul_64_words_%=\n\t"
  20232. "str r3, [%[tmp], r7]\n\t"
  20233. "mov %[a], r9\n\t"
  20234. "mov %[b], r10\n\t"
  20235. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  20236. :
  20237. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  20238. );
  20239. XMEMCPY(r, t, sizeof(t));
  20240. }
  20241. /* Square a and put result in r. (r = a * a)
  20242. *
  20243. * r A single precision integer.
  20244. * a A single precision integer.
  20245. */
  20246. SP_NOINLINE static void sp_2048_sqr_64(sp_digit* r, const sp_digit* a)
  20247. {
  20248. __asm__ __volatile__ (
  20249. "movs r3, #0\n\t"
  20250. "movs r4, #0\n\t"
  20251. "movs r5, #0\n\t"
  20252. "mov r8, r3\n\t"
  20253. "mov r11, %[r]\n\t"
  20254. "movs r6, #2\n\t"
  20255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20256. "lsls r6, r6, #8\n\t"
  20257. #else
  20258. "lsl r6, r6, #8\n\t"
  20259. #endif
  20260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20261. "negs r6, r6\n\t"
  20262. #else
  20263. "neg r6, r6\n\t"
  20264. #endif
  20265. "add sp, sp, r6\n\t"
  20266. "mov r10, sp\n\t"
  20267. "mov r9, %[a]\n\t"
  20268. "\n"
  20269. "L_sp_2048_sqr_64_words_%=:\n\t"
  20270. "movs %[r], #0\n\t"
  20271. "movs r6, #0xfc\n\t"
  20272. "mov %[a], r8\n\t"
  20273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20274. "subs %[a], %[a], r6\n\t"
  20275. #else
  20276. "sub %[a], %[a], r6\n\t"
  20277. #endif
  20278. #ifdef WOLFSSL_KEIL
  20279. "sbcs r6, r6, r6\n\t"
  20280. #elif defined(__clang__)
  20281. "sbcs r6, r6\n\t"
  20282. #else
  20283. "sbc r6, r6\n\t"
  20284. #endif
  20285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20286. "mvns r6, r6\n\t"
  20287. #else
  20288. "mvn r6, r6\n\t"
  20289. #endif
  20290. #ifdef WOLFSSL_KEIL
  20291. "ands %[a], %[a], r6\n\t"
  20292. #elif defined(__clang__)
  20293. "ands %[a], r6\n\t"
  20294. #else
  20295. "and %[a], r6\n\t"
  20296. #endif
  20297. "mov r2, r8\n\t"
  20298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20299. "subs r2, r2, %[a]\n\t"
  20300. #else
  20301. "sub r2, r2, %[a]\n\t"
  20302. #endif
  20303. "add %[a], %[a], r9\n\t"
  20304. "add r2, r2, r9\n\t"
  20305. "\n"
  20306. "L_sp_2048_sqr_64_mul_%=:\n\t"
  20307. "cmp r2, %[a]\n\t"
  20308. "beq L_sp_2048_sqr_64_sqr_%=\n\t"
  20309. "# Multiply * 2: Start\n\t"
  20310. "ldrh r6, [%[a]]\n\t"
  20311. "ldrh r7, [r2]\n\t"
  20312. #ifdef WOLFSSL_KEIL
  20313. "muls r7, r6, r7\n\t"
  20314. #elif defined(__clang__)
  20315. "muls r7, r6\n\t"
  20316. #else
  20317. "mul r7, r6\n\t"
  20318. #endif
  20319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20320. "adds r3, r3, r7\n\t"
  20321. #else
  20322. "add r3, r3, r7\n\t"
  20323. #endif
  20324. #ifdef WOLFSSL_KEIL
  20325. "adcs r4, r4, %[r]\n\t"
  20326. #elif defined(__clang__)
  20327. "adcs r4, %[r]\n\t"
  20328. #else
  20329. "adc r4, %[r]\n\t"
  20330. #endif
  20331. #ifdef WOLFSSL_KEIL
  20332. "adcs r5, r5, %[r]\n\t"
  20333. #elif defined(__clang__)
  20334. "adcs r5, %[r]\n\t"
  20335. #else
  20336. "adc r5, %[r]\n\t"
  20337. #endif
  20338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20339. "adds r3, r3, r7\n\t"
  20340. #else
  20341. "add r3, r3, r7\n\t"
  20342. #endif
  20343. #ifdef WOLFSSL_KEIL
  20344. "adcs r4, r4, %[r]\n\t"
  20345. #elif defined(__clang__)
  20346. "adcs r4, %[r]\n\t"
  20347. #else
  20348. "adc r4, %[r]\n\t"
  20349. #endif
  20350. #ifdef WOLFSSL_KEIL
  20351. "adcs r5, r5, %[r]\n\t"
  20352. #elif defined(__clang__)
  20353. "adcs r5, %[r]\n\t"
  20354. #else
  20355. "adc r5, %[r]\n\t"
  20356. #endif
  20357. "ldr r7, [r2]\n\t"
  20358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20359. "lsrs r7, r7, #16\n\t"
  20360. #else
  20361. "lsr r7, r7, #16\n\t"
  20362. #endif
  20363. #ifdef WOLFSSL_KEIL
  20364. "muls r6, r7, r6\n\t"
  20365. #elif defined(__clang__)
  20366. "muls r6, r7\n\t"
  20367. #else
  20368. "mul r6, r7\n\t"
  20369. #endif
  20370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20371. "lsrs r7, r6, #16\n\t"
  20372. #else
  20373. "lsr r7, r6, #16\n\t"
  20374. #endif
  20375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20376. "lsls r6, r6, #16\n\t"
  20377. #else
  20378. "lsl r6, r6, #16\n\t"
  20379. #endif
  20380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20381. "adds r3, r3, r6\n\t"
  20382. #else
  20383. "add r3, r3, r6\n\t"
  20384. #endif
  20385. #ifdef WOLFSSL_KEIL
  20386. "adcs r4, r4, r7\n\t"
  20387. #elif defined(__clang__)
  20388. "adcs r4, r7\n\t"
  20389. #else
  20390. "adc r4, r7\n\t"
  20391. #endif
  20392. #ifdef WOLFSSL_KEIL
  20393. "adcs r5, r5, %[r]\n\t"
  20394. #elif defined(__clang__)
  20395. "adcs r5, %[r]\n\t"
  20396. #else
  20397. "adc r5, %[r]\n\t"
  20398. #endif
  20399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20400. "adds r3, r3, r6\n\t"
  20401. #else
  20402. "add r3, r3, r6\n\t"
  20403. #endif
  20404. #ifdef WOLFSSL_KEIL
  20405. "adcs r4, r4, r7\n\t"
  20406. #elif defined(__clang__)
  20407. "adcs r4, r7\n\t"
  20408. #else
  20409. "adc r4, r7\n\t"
  20410. #endif
  20411. #ifdef WOLFSSL_KEIL
  20412. "adcs r5, r5, %[r]\n\t"
  20413. #elif defined(__clang__)
  20414. "adcs r5, %[r]\n\t"
  20415. #else
  20416. "adc r5, %[r]\n\t"
  20417. #endif
  20418. "ldr r6, [%[a]]\n\t"
  20419. "ldr r7, [r2]\n\t"
  20420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20421. "lsrs r6, r6, #16\n\t"
  20422. #else
  20423. "lsr r6, r6, #16\n\t"
  20424. #endif
  20425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20426. "lsrs r7, r7, #16\n\t"
  20427. #else
  20428. "lsr r7, r7, #16\n\t"
  20429. #endif
  20430. #ifdef WOLFSSL_KEIL
  20431. "muls r7, r6, r7\n\t"
  20432. #elif defined(__clang__)
  20433. "muls r7, r6\n\t"
  20434. #else
  20435. "mul r7, r6\n\t"
  20436. #endif
  20437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20438. "adds r4, r4, r7\n\t"
  20439. #else
  20440. "add r4, r4, r7\n\t"
  20441. #endif
  20442. #ifdef WOLFSSL_KEIL
  20443. "adcs r5, r5, %[r]\n\t"
  20444. #elif defined(__clang__)
  20445. "adcs r5, %[r]\n\t"
  20446. #else
  20447. "adc r5, %[r]\n\t"
  20448. #endif
  20449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20450. "adds r4, r4, r7\n\t"
  20451. #else
  20452. "add r4, r4, r7\n\t"
  20453. #endif
  20454. #ifdef WOLFSSL_KEIL
  20455. "adcs r5, r5, %[r]\n\t"
  20456. #elif defined(__clang__)
  20457. "adcs r5, %[r]\n\t"
  20458. #else
  20459. "adc r5, %[r]\n\t"
  20460. #endif
  20461. "ldrh r7, [r2]\n\t"
  20462. #ifdef WOLFSSL_KEIL
  20463. "muls r6, r7, r6\n\t"
  20464. #elif defined(__clang__)
  20465. "muls r6, r7\n\t"
  20466. #else
  20467. "mul r6, r7\n\t"
  20468. #endif
  20469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20470. "lsrs r7, r6, #16\n\t"
  20471. #else
  20472. "lsr r7, r6, #16\n\t"
  20473. #endif
  20474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20475. "lsls r6, r6, #16\n\t"
  20476. #else
  20477. "lsl r6, r6, #16\n\t"
  20478. #endif
  20479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20480. "adds r3, r3, r6\n\t"
  20481. #else
  20482. "add r3, r3, r6\n\t"
  20483. #endif
  20484. #ifdef WOLFSSL_KEIL
  20485. "adcs r4, r4, r7\n\t"
  20486. #elif defined(__clang__)
  20487. "adcs r4, r7\n\t"
  20488. #else
  20489. "adc r4, r7\n\t"
  20490. #endif
  20491. #ifdef WOLFSSL_KEIL
  20492. "adcs r5, r5, %[r]\n\t"
  20493. #elif defined(__clang__)
  20494. "adcs r5, %[r]\n\t"
  20495. #else
  20496. "adc r5, %[r]\n\t"
  20497. #endif
  20498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20499. "adds r3, r3, r6\n\t"
  20500. #else
  20501. "add r3, r3, r6\n\t"
  20502. #endif
  20503. #ifdef WOLFSSL_KEIL
  20504. "adcs r4, r4, r7\n\t"
  20505. #elif defined(__clang__)
  20506. "adcs r4, r7\n\t"
  20507. #else
  20508. "adc r4, r7\n\t"
  20509. #endif
  20510. #ifdef WOLFSSL_KEIL
  20511. "adcs r5, r5, %[r]\n\t"
  20512. #elif defined(__clang__)
  20513. "adcs r5, %[r]\n\t"
  20514. #else
  20515. "adc r5, %[r]\n\t"
  20516. #endif
  20517. "# Multiply * 2: Done\n\t"
  20518. "bal L_sp_2048_sqr_64_done_sqr_%=\n\t"
  20519. "\n"
  20520. "L_sp_2048_sqr_64_sqr_%=:\n\t"
  20521. "mov r12, r2\n\t"
  20522. "ldr r2, [%[a]]\n\t"
  20523. "# Square: Start\n\t"
  20524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20525. "lsrs r7, r2, #16\n\t"
  20526. #else
  20527. "lsr r7, r2, #16\n\t"
  20528. #endif
  20529. "uxth r6, r2\n\t"
  20530. #ifdef WOLFSSL_KEIL
  20531. "muls r6, r6, r6\n\t"
  20532. #elif defined(__clang__)
  20533. "muls r6, r6\n\t"
  20534. #else
  20535. "mul r6, r6\n\t"
  20536. #endif
  20537. #ifdef WOLFSSL_KEIL
  20538. "muls r7, r7, r7\n\t"
  20539. #elif defined(__clang__)
  20540. "muls r7, r7\n\t"
  20541. #else
  20542. "mul r7, r7\n\t"
  20543. #endif
  20544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20545. "adds r3, r3, r6\n\t"
  20546. #else
  20547. "add r3, r3, r6\n\t"
  20548. #endif
  20549. #ifdef WOLFSSL_KEIL
  20550. "adcs r4, r4, r7\n\t"
  20551. #elif defined(__clang__)
  20552. "adcs r4, r7\n\t"
  20553. #else
  20554. "adc r4, r7\n\t"
  20555. #endif
  20556. #ifdef WOLFSSL_KEIL
  20557. "adcs r5, r5, %[r]\n\t"
  20558. #elif defined(__clang__)
  20559. "adcs r5, %[r]\n\t"
  20560. #else
  20561. "adc r5, %[r]\n\t"
  20562. #endif
  20563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20564. "lsrs r7, r2, #16\n\t"
  20565. #else
  20566. "lsr r7, r2, #16\n\t"
  20567. #endif
  20568. "uxth r6, r2\n\t"
  20569. #ifdef WOLFSSL_KEIL
  20570. "muls r6, r7, r6\n\t"
  20571. #elif defined(__clang__)
  20572. "muls r6, r7\n\t"
  20573. #else
  20574. "mul r6, r7\n\t"
  20575. #endif
  20576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20577. "lsrs r7, r6, #15\n\t"
  20578. #else
  20579. "lsr r7, r6, #15\n\t"
  20580. #endif
  20581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20582. "lsls r6, r6, #17\n\t"
  20583. #else
  20584. "lsl r6, r6, #17\n\t"
  20585. #endif
  20586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20587. "adds r3, r3, r6\n\t"
  20588. #else
  20589. "add r3, r3, r6\n\t"
  20590. #endif
  20591. #ifdef WOLFSSL_KEIL
  20592. "adcs r4, r4, r7\n\t"
  20593. #elif defined(__clang__)
  20594. "adcs r4, r7\n\t"
  20595. #else
  20596. "adc r4, r7\n\t"
  20597. #endif
  20598. #ifdef WOLFSSL_KEIL
  20599. "adcs r5, r5, %[r]\n\t"
  20600. #elif defined(__clang__)
  20601. "adcs r5, %[r]\n\t"
  20602. #else
  20603. "adc r5, %[r]\n\t"
  20604. #endif
  20605. "# Square: Done\n\t"
  20606. "mov r2, r12\n\t"
  20607. "\n"
  20608. "L_sp_2048_sqr_64_done_sqr_%=:\n\t"
  20609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20610. "adds %[a], %[a], #4\n\t"
  20611. #else
  20612. "add %[a], %[a], #4\n\t"
  20613. #endif
  20614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20615. "subs r2, r2, #4\n\t"
  20616. #else
  20617. "sub r2, r2, #4\n\t"
  20618. #endif
  20619. "movs r6, #0xff\n\t"
  20620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20621. "adds r6, r6, #1\n\t"
  20622. #else
  20623. "add r6, r6, #1\n\t"
  20624. #endif
  20625. "add r6, r6, r9\n\t"
  20626. "cmp %[a], r6\n\t"
  20627. "beq L_sp_2048_sqr_64_done_mul_%=\n\t"
  20628. "cmp %[a], r2\n\t"
  20629. "bgt L_sp_2048_sqr_64_done_mul_%=\n\t"
  20630. "mov r7, r8\n\t"
  20631. "add r7, r7, r9\n\t"
  20632. "cmp %[a], r7\n\t"
  20633. "ble L_sp_2048_sqr_64_mul_%=\n\t"
  20634. "\n"
  20635. "L_sp_2048_sqr_64_done_mul_%=:\n\t"
  20636. "mov %[r], r10\n\t"
  20637. "mov r7, r8\n\t"
  20638. "str r3, [%[r], r7]\n\t"
  20639. "movs r3, r4\n\t"
  20640. "movs r4, r5\n\t"
  20641. "movs r5, #0\n\t"
  20642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20643. "adds r7, r7, #4\n\t"
  20644. #else
  20645. "add r7, r7, #4\n\t"
  20646. #endif
  20647. "mov r8, r7\n\t"
  20648. "movs r6, #0xff\n\t"
  20649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20650. "adds r6, r6, #0xf9\n\t"
  20651. #else
  20652. "add r6, r6, #0xf9\n\t"
  20653. #endif
  20654. "cmp r7, r6\n\t"
  20655. "ble L_sp_2048_sqr_64_words_%=\n\t"
  20656. "mov %[a], r9\n\t"
  20657. "str r3, [%[r], r7]\n\t"
  20658. "mov %[r], r11\n\t"
  20659. "mov %[a], r10\n\t"
  20660. "movs r3, #0xff\n\t"
  20661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20662. "adds r3, r3, #0xfd\n\t"
  20663. #else
  20664. "add r3, r3, #0xfd\n\t"
  20665. #endif
  20666. "\n"
  20667. "L_sp_2048_sqr_64_store_%=:\n\t"
  20668. "ldr r6, [%[a], r3]\n\t"
  20669. "str r6, [%[r], r3]\n\t"
  20670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20671. "subs r3, r3, #4\n\t"
  20672. #else
  20673. "sub r3, r3, #4\n\t"
  20674. #endif
  20675. "bge L_sp_2048_sqr_64_store_%=\n\t"
  20676. "movs r6, #2\n\t"
  20677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20678. "lsls r6, r6, #8\n\t"
  20679. #else
  20680. "lsl r6, r6, #8\n\t"
  20681. #endif
  20682. "add sp, sp, r6\n\t"
  20683. : [r] "+l" (r), [a] "+l" (a)
  20684. :
  20685. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  20686. );
  20687. }
  20688. #endif /* WOLFSSL_SP_SMALL */
  20689. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  20690. #ifdef WOLFSSL_SP_SMALL
  20691. /* AND m into each word of a and store in r.
  20692. *
  20693. * r A single precision integer.
  20694. * a A single precision integer.
  20695. * m Mask to AND against each digit.
  20696. */
  20697. static void sp_2048_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  20698. {
  20699. int i;
  20700. for (i=0; i<32; i++) {
  20701. r[i] = a[i] & m;
  20702. }
  20703. }
  20704. #endif /* WOLFSSL_SP_SMALL */
  20705. #ifdef WOLFSSL_SP_SMALL
  20706. /* Add b to a into r. (r = a + b)
  20707. *
  20708. * r A single precision integer.
  20709. * a A single precision integer.
  20710. * b A single precision integer.
  20711. */
  20712. SP_NOINLINE static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a,
  20713. const sp_digit* b)
  20714. {
  20715. __asm__ __volatile__ (
  20716. "movs r6, %[a]\n\t"
  20717. "movs r7, #0\n\t"
  20718. "movs r3, #0\n\t"
  20719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20720. "adds r6, r6, #0x80\n\t"
  20721. #else
  20722. "add r6, r6, #0x80\n\t"
  20723. #endif
  20724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20725. "subs r7, r7, #1\n\t"
  20726. #else
  20727. "sub r7, r7, #1\n\t"
  20728. #endif
  20729. "\n"
  20730. "L_sp_2048_add_32_word_%=:\n\t"
  20731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20732. "adds r3, r3, r7\n\t"
  20733. #else
  20734. "add r3, r3, r7\n\t"
  20735. #endif
  20736. "ldr r4, [%[a]]\n\t"
  20737. "ldr r5, [%[b]]\n\t"
  20738. #ifdef WOLFSSL_KEIL
  20739. "adcs r4, r4, r5\n\t"
  20740. #elif defined(__clang__)
  20741. "adcs r4, r5\n\t"
  20742. #else
  20743. "adc r4, r5\n\t"
  20744. #endif
  20745. "str r4, [%[r]]\n\t"
  20746. "movs r3, #0\n\t"
  20747. #ifdef WOLFSSL_KEIL
  20748. "adcs r3, r3, r3\n\t"
  20749. #elif defined(__clang__)
  20750. "adcs r3, r3\n\t"
  20751. #else
  20752. "adc r3, r3\n\t"
  20753. #endif
  20754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20755. "adds %[a], %[a], #4\n\t"
  20756. #else
  20757. "add %[a], %[a], #4\n\t"
  20758. #endif
  20759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20760. "adds %[b], %[b], #4\n\t"
  20761. #else
  20762. "add %[b], %[b], #4\n\t"
  20763. #endif
  20764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20765. "adds %[r], %[r], #4\n\t"
  20766. #else
  20767. "add %[r], %[r], #4\n\t"
  20768. #endif
  20769. "cmp %[a], r6\n\t"
  20770. "bne L_sp_2048_add_32_word_%=\n\t"
  20771. "movs %[r], r3\n\t"
  20772. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  20773. :
  20774. : "memory", "r3", "r4", "r5", "r6", "r7"
  20775. );
  20776. return (uint32_t)(size_t)r;
  20777. }
  20778. #endif /* WOLFSSL_SP_SMALL */
  20779. #ifdef WOLFSSL_SP_SMALL
  20780. /* Sub b from a into a. (a -= b)
  20781. *
  20782. * a A single precision integer.
  20783. * b A single precision integer.
  20784. */
  20785. SP_NOINLINE static sp_digit sp_2048_sub_in_place_32(sp_digit* a,
  20786. const sp_digit* b)
  20787. {
  20788. __asm__ __volatile__ (
  20789. "movs r7, %[a]\n\t"
  20790. "movs r2, #0\n\t"
  20791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20792. "adds r7, r7, #0x80\n\t"
  20793. #else
  20794. "add r7, r7, #0x80\n\t"
  20795. #endif
  20796. "\n"
  20797. "L_sp_2048_sub_in_place_32_words_%=:\n\t"
  20798. "movs r5, #0\n\t"
  20799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20800. "subs r5, r5, r2\n\t"
  20801. #else
  20802. "sub r5, r5, r2\n\t"
  20803. #endif
  20804. "ldr r3, [%[a]]\n\t"
  20805. "ldr r4, [%[a], #4]\n\t"
  20806. "ldr r5, [%[b]]\n\t"
  20807. "ldr r6, [%[b], #4]\n\t"
  20808. #ifdef WOLFSSL_KEIL
  20809. "sbcs r3, r3, r5\n\t"
  20810. #elif defined(__clang__)
  20811. "sbcs r3, r5\n\t"
  20812. #else
  20813. "sbc r3, r5\n\t"
  20814. #endif
  20815. #ifdef WOLFSSL_KEIL
  20816. "sbcs r4, r4, r6\n\t"
  20817. #elif defined(__clang__)
  20818. "sbcs r4, r6\n\t"
  20819. #else
  20820. "sbc r4, r6\n\t"
  20821. #endif
  20822. "str r3, [%[a]]\n\t"
  20823. "str r4, [%[a], #4]\n\t"
  20824. #ifdef WOLFSSL_KEIL
  20825. "sbcs r2, r2, r2\n\t"
  20826. #elif defined(__clang__)
  20827. "sbcs r2, r2\n\t"
  20828. #else
  20829. "sbc r2, r2\n\t"
  20830. #endif
  20831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20832. "adds %[a], %[a], #8\n\t"
  20833. #else
  20834. "add %[a], %[a], #8\n\t"
  20835. #endif
  20836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20837. "adds %[b], %[b], #8\n\t"
  20838. #else
  20839. "add %[b], %[b], #8\n\t"
  20840. #endif
  20841. "cmp %[a], r7\n\t"
  20842. "bne L_sp_2048_sub_in_place_32_words_%=\n\t"
  20843. "movs %[a], r2\n\t"
  20844. : [a] "+l" (a), [b] "+l" (b)
  20845. :
  20846. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  20847. );
  20848. return (uint32_t)(size_t)a;
  20849. }
  20850. #endif /* WOLFSSL_SP_SMALL */
  20851. #ifdef WOLFSSL_SP_SMALL
  20852. /* Multiply a and b into r. (r = a * b)
  20853. *
  20854. * r A single precision integer.
  20855. * a A single precision integer.
  20856. * b A single precision integer.
  20857. */
  20858. SP_NOINLINE static void sp_2048_mul_32(sp_digit* r, const sp_digit* a,
  20859. const sp_digit* b)
  20860. {
  20861. sp_digit t[32 * 2];
  20862. sp_digit* tmp = t;
  20863. __asm__ __volatile__ (
  20864. "movs r3, #0\n\t"
  20865. "movs r4, #0\n\t"
  20866. "mov r8, r3\n\t"
  20867. "mov r11, %[tmp]\n\t"
  20868. "mov r9, %[a]\n\t"
  20869. "mov r10, %[b]\n\t"
  20870. "movs r6, #0x80\n\t"
  20871. "add r6, r6, r9\n\t"
  20872. "mov r12, r6\n\t"
  20873. "\n"
  20874. "L_sp_2048_mul_32_words_%=:\n\t"
  20875. "movs %[tmp], #0\n\t"
  20876. "movs r5, #0\n\t"
  20877. "movs r6, #0x7c\n\t"
  20878. "mov %[a], r8\n\t"
  20879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20880. "subs %[a], %[a], r6\n\t"
  20881. #else
  20882. "sub %[a], %[a], r6\n\t"
  20883. #endif
  20884. #ifdef WOLFSSL_KEIL
  20885. "sbcs r6, r6, r6\n\t"
  20886. #elif defined(__clang__)
  20887. "sbcs r6, r6\n\t"
  20888. #else
  20889. "sbc r6, r6\n\t"
  20890. #endif
  20891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20892. "mvns r6, r6\n\t"
  20893. #else
  20894. "mvn r6, r6\n\t"
  20895. #endif
  20896. #ifdef WOLFSSL_KEIL
  20897. "ands %[a], %[a], r6\n\t"
  20898. #elif defined(__clang__)
  20899. "ands %[a], r6\n\t"
  20900. #else
  20901. "and %[a], r6\n\t"
  20902. #endif
  20903. "mov %[b], r8\n\t"
  20904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20905. "subs %[b], %[b], %[a]\n\t"
  20906. #else
  20907. "sub %[b], %[b], %[a]\n\t"
  20908. #endif
  20909. "add %[a], %[a], r9\n\t"
  20910. "add %[b], %[b], r10\n\t"
  20911. "\n"
  20912. "L_sp_2048_mul_32_mul_%=:\n\t"
  20913. "# Multiply Start\n\t"
  20914. "ldrh r6, [%[a]]\n\t"
  20915. "ldrh r7, [%[b]]\n\t"
  20916. #ifdef WOLFSSL_KEIL
  20917. "muls r7, r6, r7\n\t"
  20918. #elif defined(__clang__)
  20919. "muls r7, r6\n\t"
  20920. #else
  20921. "mul r7, r6\n\t"
  20922. #endif
  20923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20924. "adds r3, r3, r7\n\t"
  20925. #else
  20926. "add r3, r3, r7\n\t"
  20927. #endif
  20928. #ifdef WOLFSSL_KEIL
  20929. "adcs r4, r4, %[tmp]\n\t"
  20930. #elif defined(__clang__)
  20931. "adcs r4, %[tmp]\n\t"
  20932. #else
  20933. "adc r4, %[tmp]\n\t"
  20934. #endif
  20935. #ifdef WOLFSSL_KEIL
  20936. "adcs r5, r5, %[tmp]\n\t"
  20937. #elif defined(__clang__)
  20938. "adcs r5, %[tmp]\n\t"
  20939. #else
  20940. "adc r5, %[tmp]\n\t"
  20941. #endif
  20942. "ldr r7, [%[b]]\n\t"
  20943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20944. "lsrs r7, r7, #16\n\t"
  20945. #else
  20946. "lsr r7, r7, #16\n\t"
  20947. #endif
  20948. #ifdef WOLFSSL_KEIL
  20949. "muls r6, r7, r6\n\t"
  20950. #elif defined(__clang__)
  20951. "muls r6, r7\n\t"
  20952. #else
  20953. "mul r6, r7\n\t"
  20954. #endif
  20955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20956. "lsrs r7, r6, #16\n\t"
  20957. #else
  20958. "lsr r7, r6, #16\n\t"
  20959. #endif
  20960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20961. "lsls r6, r6, #16\n\t"
  20962. #else
  20963. "lsl r6, r6, #16\n\t"
  20964. #endif
  20965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20966. "adds r3, r3, r6\n\t"
  20967. #else
  20968. "add r3, r3, r6\n\t"
  20969. #endif
  20970. #ifdef WOLFSSL_KEIL
  20971. "adcs r4, r4, r7\n\t"
  20972. #elif defined(__clang__)
  20973. "adcs r4, r7\n\t"
  20974. #else
  20975. "adc r4, r7\n\t"
  20976. #endif
  20977. #ifdef WOLFSSL_KEIL
  20978. "adcs r5, r5, %[tmp]\n\t"
  20979. #elif defined(__clang__)
  20980. "adcs r5, %[tmp]\n\t"
  20981. #else
  20982. "adc r5, %[tmp]\n\t"
  20983. #endif
  20984. "ldr r6, [%[a]]\n\t"
  20985. "ldr r7, [%[b]]\n\t"
  20986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20987. "lsrs r6, r6, #16\n\t"
  20988. #else
  20989. "lsr r6, r6, #16\n\t"
  20990. #endif
  20991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  20992. "lsrs r7, r7, #16\n\t"
  20993. #else
  20994. "lsr r7, r7, #16\n\t"
  20995. #endif
  20996. #ifdef WOLFSSL_KEIL
  20997. "muls r7, r6, r7\n\t"
  20998. #elif defined(__clang__)
  20999. "muls r7, r6\n\t"
  21000. #else
  21001. "mul r7, r6\n\t"
  21002. #endif
  21003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21004. "adds r4, r4, r7\n\t"
  21005. #else
  21006. "add r4, r4, r7\n\t"
  21007. #endif
  21008. #ifdef WOLFSSL_KEIL
  21009. "adcs r5, r5, %[tmp]\n\t"
  21010. #elif defined(__clang__)
  21011. "adcs r5, %[tmp]\n\t"
  21012. #else
  21013. "adc r5, %[tmp]\n\t"
  21014. #endif
  21015. "ldrh r7, [%[b]]\n\t"
  21016. #ifdef WOLFSSL_KEIL
  21017. "muls r6, r7, r6\n\t"
  21018. #elif defined(__clang__)
  21019. "muls r6, r7\n\t"
  21020. #else
  21021. "mul r6, r7\n\t"
  21022. #endif
  21023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21024. "lsrs r7, r6, #16\n\t"
  21025. #else
  21026. "lsr r7, r6, #16\n\t"
  21027. #endif
  21028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21029. "lsls r6, r6, #16\n\t"
  21030. #else
  21031. "lsl r6, r6, #16\n\t"
  21032. #endif
  21033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21034. "adds r3, r3, r6\n\t"
  21035. #else
  21036. "add r3, r3, r6\n\t"
  21037. #endif
  21038. #ifdef WOLFSSL_KEIL
  21039. "adcs r4, r4, r7\n\t"
  21040. #elif defined(__clang__)
  21041. "adcs r4, r7\n\t"
  21042. #else
  21043. "adc r4, r7\n\t"
  21044. #endif
  21045. #ifdef WOLFSSL_KEIL
  21046. "adcs r5, r5, %[tmp]\n\t"
  21047. #elif defined(__clang__)
  21048. "adcs r5, %[tmp]\n\t"
  21049. #else
  21050. "adc r5, %[tmp]\n\t"
  21051. #endif
  21052. "# Multiply Done\n\t"
  21053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21054. "adds %[a], %[a], #4\n\t"
  21055. #else
  21056. "add %[a], %[a], #4\n\t"
  21057. #endif
  21058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21059. "subs %[b], %[b], #4\n\t"
  21060. #else
  21061. "sub %[b], %[b], #4\n\t"
  21062. #endif
  21063. "cmp %[a], r12\n\t"
  21064. "beq L_sp_2048_mul_32_done_mul_%=\n\t"
  21065. "mov r6, r8\n\t"
  21066. "add r6, r6, r9\n\t"
  21067. "cmp %[a], r6\n\t"
  21068. "ble L_sp_2048_mul_32_mul_%=\n\t"
  21069. "\n"
  21070. "L_sp_2048_mul_32_done_mul_%=:\n\t"
  21071. "mov %[tmp], r11\n\t"
  21072. "mov r7, r8\n\t"
  21073. "str r3, [%[tmp], r7]\n\t"
  21074. "movs r3, r4\n\t"
  21075. "movs r4, r5\n\t"
  21076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21077. "adds r7, r7, #4\n\t"
  21078. #else
  21079. "add r7, r7, #4\n\t"
  21080. #endif
  21081. "mov r8, r7\n\t"
  21082. "movs r6, #0xf8\n\t"
  21083. "cmp r7, r6\n\t"
  21084. "ble L_sp_2048_mul_32_words_%=\n\t"
  21085. "str r3, [%[tmp], r7]\n\t"
  21086. "mov %[a], r9\n\t"
  21087. "mov %[b], r10\n\t"
  21088. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  21089. :
  21090. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  21091. );
  21092. XMEMCPY(r, t, sizeof(t));
  21093. }
  21094. /* Square a and put result in r. (r = a * a)
  21095. *
  21096. * r A single precision integer.
  21097. * a A single precision integer.
  21098. */
  21099. SP_NOINLINE static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a)
  21100. {
  21101. __asm__ __volatile__ (
  21102. "movs r3, #0\n\t"
  21103. "movs r4, #0\n\t"
  21104. "movs r5, #0\n\t"
  21105. "mov r8, r3\n\t"
  21106. "mov r11, %[r]\n\t"
  21107. "movs r6, #0xff\n\t"
  21108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21109. "adds r6, r6, #1\n\t"
  21110. #else
  21111. "add r6, r6, #1\n\t"
  21112. #endif
  21113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21114. "negs r6, r6\n\t"
  21115. #else
  21116. "neg r6, r6\n\t"
  21117. #endif
  21118. "add sp, sp, r6\n\t"
  21119. "mov r10, sp\n\t"
  21120. "mov r9, %[a]\n\t"
  21121. "\n"
  21122. "L_sp_2048_sqr_32_words_%=:\n\t"
  21123. "movs %[r], #0\n\t"
  21124. "movs r6, #0x7c\n\t"
  21125. "mov %[a], r8\n\t"
  21126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21127. "subs %[a], %[a], r6\n\t"
  21128. #else
  21129. "sub %[a], %[a], r6\n\t"
  21130. #endif
  21131. #ifdef WOLFSSL_KEIL
  21132. "sbcs r6, r6, r6\n\t"
  21133. #elif defined(__clang__)
  21134. "sbcs r6, r6\n\t"
  21135. #else
  21136. "sbc r6, r6\n\t"
  21137. #endif
  21138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21139. "mvns r6, r6\n\t"
  21140. #else
  21141. "mvn r6, r6\n\t"
  21142. #endif
  21143. #ifdef WOLFSSL_KEIL
  21144. "ands %[a], %[a], r6\n\t"
  21145. #elif defined(__clang__)
  21146. "ands %[a], r6\n\t"
  21147. #else
  21148. "and %[a], r6\n\t"
  21149. #endif
  21150. "mov r2, r8\n\t"
  21151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21152. "subs r2, r2, %[a]\n\t"
  21153. #else
  21154. "sub r2, r2, %[a]\n\t"
  21155. #endif
  21156. "add %[a], %[a], r9\n\t"
  21157. "add r2, r2, r9\n\t"
  21158. "\n"
  21159. "L_sp_2048_sqr_32_mul_%=:\n\t"
  21160. "cmp r2, %[a]\n\t"
  21161. "beq L_sp_2048_sqr_32_sqr_%=\n\t"
  21162. "# Multiply * 2: Start\n\t"
  21163. "ldrh r6, [%[a]]\n\t"
  21164. "ldrh r7, [r2]\n\t"
  21165. #ifdef WOLFSSL_KEIL
  21166. "muls r7, r6, r7\n\t"
  21167. #elif defined(__clang__)
  21168. "muls r7, r6\n\t"
  21169. #else
  21170. "mul r7, r6\n\t"
  21171. #endif
  21172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21173. "adds r3, r3, r7\n\t"
  21174. #else
  21175. "add r3, r3, r7\n\t"
  21176. #endif
  21177. #ifdef WOLFSSL_KEIL
  21178. "adcs r4, r4, %[r]\n\t"
  21179. #elif defined(__clang__)
  21180. "adcs r4, %[r]\n\t"
  21181. #else
  21182. "adc r4, %[r]\n\t"
  21183. #endif
  21184. #ifdef WOLFSSL_KEIL
  21185. "adcs r5, r5, %[r]\n\t"
  21186. #elif defined(__clang__)
  21187. "adcs r5, %[r]\n\t"
  21188. #else
  21189. "adc r5, %[r]\n\t"
  21190. #endif
  21191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21192. "adds r3, r3, r7\n\t"
  21193. #else
  21194. "add r3, r3, r7\n\t"
  21195. #endif
  21196. #ifdef WOLFSSL_KEIL
  21197. "adcs r4, r4, %[r]\n\t"
  21198. #elif defined(__clang__)
  21199. "adcs r4, %[r]\n\t"
  21200. #else
  21201. "adc r4, %[r]\n\t"
  21202. #endif
  21203. #ifdef WOLFSSL_KEIL
  21204. "adcs r5, r5, %[r]\n\t"
  21205. #elif defined(__clang__)
  21206. "adcs r5, %[r]\n\t"
  21207. #else
  21208. "adc r5, %[r]\n\t"
  21209. #endif
  21210. "ldr r7, [r2]\n\t"
  21211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21212. "lsrs r7, r7, #16\n\t"
  21213. #else
  21214. "lsr r7, r7, #16\n\t"
  21215. #endif
  21216. #ifdef WOLFSSL_KEIL
  21217. "muls r6, r7, r6\n\t"
  21218. #elif defined(__clang__)
  21219. "muls r6, r7\n\t"
  21220. #else
  21221. "mul r6, r7\n\t"
  21222. #endif
  21223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21224. "lsrs r7, r6, #16\n\t"
  21225. #else
  21226. "lsr r7, r6, #16\n\t"
  21227. #endif
  21228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21229. "lsls r6, r6, #16\n\t"
  21230. #else
  21231. "lsl r6, r6, #16\n\t"
  21232. #endif
  21233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21234. "adds r3, r3, r6\n\t"
  21235. #else
  21236. "add r3, r3, r6\n\t"
  21237. #endif
  21238. #ifdef WOLFSSL_KEIL
  21239. "adcs r4, r4, r7\n\t"
  21240. #elif defined(__clang__)
  21241. "adcs r4, r7\n\t"
  21242. #else
  21243. "adc r4, r7\n\t"
  21244. #endif
  21245. #ifdef WOLFSSL_KEIL
  21246. "adcs r5, r5, %[r]\n\t"
  21247. #elif defined(__clang__)
  21248. "adcs r5, %[r]\n\t"
  21249. #else
  21250. "adc r5, %[r]\n\t"
  21251. #endif
  21252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21253. "adds r3, r3, r6\n\t"
  21254. #else
  21255. "add r3, r3, r6\n\t"
  21256. #endif
  21257. #ifdef WOLFSSL_KEIL
  21258. "adcs r4, r4, r7\n\t"
  21259. #elif defined(__clang__)
  21260. "adcs r4, r7\n\t"
  21261. #else
  21262. "adc r4, r7\n\t"
  21263. #endif
  21264. #ifdef WOLFSSL_KEIL
  21265. "adcs r5, r5, %[r]\n\t"
  21266. #elif defined(__clang__)
  21267. "adcs r5, %[r]\n\t"
  21268. #else
  21269. "adc r5, %[r]\n\t"
  21270. #endif
  21271. "ldr r6, [%[a]]\n\t"
  21272. "ldr r7, [r2]\n\t"
  21273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21274. "lsrs r6, r6, #16\n\t"
  21275. #else
  21276. "lsr r6, r6, #16\n\t"
  21277. #endif
  21278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21279. "lsrs r7, r7, #16\n\t"
  21280. #else
  21281. "lsr r7, r7, #16\n\t"
  21282. #endif
  21283. #ifdef WOLFSSL_KEIL
  21284. "muls r7, r6, r7\n\t"
  21285. #elif defined(__clang__)
  21286. "muls r7, r6\n\t"
  21287. #else
  21288. "mul r7, r6\n\t"
  21289. #endif
  21290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21291. "adds r4, r4, r7\n\t"
  21292. #else
  21293. "add r4, r4, r7\n\t"
  21294. #endif
  21295. #ifdef WOLFSSL_KEIL
  21296. "adcs r5, r5, %[r]\n\t"
  21297. #elif defined(__clang__)
  21298. "adcs r5, %[r]\n\t"
  21299. #else
  21300. "adc r5, %[r]\n\t"
  21301. #endif
  21302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21303. "adds r4, r4, r7\n\t"
  21304. #else
  21305. "add r4, r4, r7\n\t"
  21306. #endif
  21307. #ifdef WOLFSSL_KEIL
  21308. "adcs r5, r5, %[r]\n\t"
  21309. #elif defined(__clang__)
  21310. "adcs r5, %[r]\n\t"
  21311. #else
  21312. "adc r5, %[r]\n\t"
  21313. #endif
  21314. "ldrh r7, [r2]\n\t"
  21315. #ifdef WOLFSSL_KEIL
  21316. "muls r6, r7, r6\n\t"
  21317. #elif defined(__clang__)
  21318. "muls r6, r7\n\t"
  21319. #else
  21320. "mul r6, r7\n\t"
  21321. #endif
  21322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21323. "lsrs r7, r6, #16\n\t"
  21324. #else
  21325. "lsr r7, r6, #16\n\t"
  21326. #endif
  21327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21328. "lsls r6, r6, #16\n\t"
  21329. #else
  21330. "lsl r6, r6, #16\n\t"
  21331. #endif
  21332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21333. "adds r3, r3, r6\n\t"
  21334. #else
  21335. "add r3, r3, r6\n\t"
  21336. #endif
  21337. #ifdef WOLFSSL_KEIL
  21338. "adcs r4, r4, r7\n\t"
  21339. #elif defined(__clang__)
  21340. "adcs r4, r7\n\t"
  21341. #else
  21342. "adc r4, r7\n\t"
  21343. #endif
  21344. #ifdef WOLFSSL_KEIL
  21345. "adcs r5, r5, %[r]\n\t"
  21346. #elif defined(__clang__)
  21347. "adcs r5, %[r]\n\t"
  21348. #else
  21349. "adc r5, %[r]\n\t"
  21350. #endif
  21351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21352. "adds r3, r3, r6\n\t"
  21353. #else
  21354. "add r3, r3, r6\n\t"
  21355. #endif
  21356. #ifdef WOLFSSL_KEIL
  21357. "adcs r4, r4, r7\n\t"
  21358. #elif defined(__clang__)
  21359. "adcs r4, r7\n\t"
  21360. #else
  21361. "adc r4, r7\n\t"
  21362. #endif
  21363. #ifdef WOLFSSL_KEIL
  21364. "adcs r5, r5, %[r]\n\t"
  21365. #elif defined(__clang__)
  21366. "adcs r5, %[r]\n\t"
  21367. #else
  21368. "adc r5, %[r]\n\t"
  21369. #endif
  21370. "# Multiply * 2: Done\n\t"
  21371. "bal L_sp_2048_sqr_32_done_sqr_%=\n\t"
  21372. "\n"
  21373. "L_sp_2048_sqr_32_sqr_%=:\n\t"
  21374. "mov r12, r2\n\t"
  21375. "ldr r2, [%[a]]\n\t"
  21376. "# Square: Start\n\t"
  21377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21378. "lsrs r7, r2, #16\n\t"
  21379. #else
  21380. "lsr r7, r2, #16\n\t"
  21381. #endif
  21382. "uxth r6, r2\n\t"
  21383. #ifdef WOLFSSL_KEIL
  21384. "muls r6, r6, r6\n\t"
  21385. #elif defined(__clang__)
  21386. "muls r6, r6\n\t"
  21387. #else
  21388. "mul r6, r6\n\t"
  21389. #endif
  21390. #ifdef WOLFSSL_KEIL
  21391. "muls r7, r7, r7\n\t"
  21392. #elif defined(__clang__)
  21393. "muls r7, r7\n\t"
  21394. #else
  21395. "mul r7, r7\n\t"
  21396. #endif
  21397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21398. "adds r3, r3, r6\n\t"
  21399. #else
  21400. "add r3, r3, r6\n\t"
  21401. #endif
  21402. #ifdef WOLFSSL_KEIL
  21403. "adcs r4, r4, r7\n\t"
  21404. #elif defined(__clang__)
  21405. "adcs r4, r7\n\t"
  21406. #else
  21407. "adc r4, r7\n\t"
  21408. #endif
  21409. #ifdef WOLFSSL_KEIL
  21410. "adcs r5, r5, %[r]\n\t"
  21411. #elif defined(__clang__)
  21412. "adcs r5, %[r]\n\t"
  21413. #else
  21414. "adc r5, %[r]\n\t"
  21415. #endif
  21416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21417. "lsrs r7, r2, #16\n\t"
  21418. #else
  21419. "lsr r7, r2, #16\n\t"
  21420. #endif
  21421. "uxth r6, r2\n\t"
  21422. #ifdef WOLFSSL_KEIL
  21423. "muls r6, r7, r6\n\t"
  21424. #elif defined(__clang__)
  21425. "muls r6, r7\n\t"
  21426. #else
  21427. "mul r6, r7\n\t"
  21428. #endif
  21429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21430. "lsrs r7, r6, #15\n\t"
  21431. #else
  21432. "lsr r7, r6, #15\n\t"
  21433. #endif
  21434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21435. "lsls r6, r6, #17\n\t"
  21436. #else
  21437. "lsl r6, r6, #17\n\t"
  21438. #endif
  21439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21440. "adds r3, r3, r6\n\t"
  21441. #else
  21442. "add r3, r3, r6\n\t"
  21443. #endif
  21444. #ifdef WOLFSSL_KEIL
  21445. "adcs r4, r4, r7\n\t"
  21446. #elif defined(__clang__)
  21447. "adcs r4, r7\n\t"
  21448. #else
  21449. "adc r4, r7\n\t"
  21450. #endif
  21451. #ifdef WOLFSSL_KEIL
  21452. "adcs r5, r5, %[r]\n\t"
  21453. #elif defined(__clang__)
  21454. "adcs r5, %[r]\n\t"
  21455. #else
  21456. "adc r5, %[r]\n\t"
  21457. #endif
  21458. "# Square: Done\n\t"
  21459. "mov r2, r12\n\t"
  21460. "\n"
  21461. "L_sp_2048_sqr_32_done_sqr_%=:\n\t"
  21462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21463. "adds %[a], %[a], #4\n\t"
  21464. #else
  21465. "add %[a], %[a], #4\n\t"
  21466. #endif
  21467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21468. "subs r2, r2, #4\n\t"
  21469. #else
  21470. "sub r2, r2, #4\n\t"
  21471. #endif
  21472. "movs r6, #0x80\n\t"
  21473. "add r6, r6, r9\n\t"
  21474. "cmp %[a], r6\n\t"
  21475. "beq L_sp_2048_sqr_32_done_mul_%=\n\t"
  21476. "cmp %[a], r2\n\t"
  21477. "bgt L_sp_2048_sqr_32_done_mul_%=\n\t"
  21478. "mov r7, r8\n\t"
  21479. "add r7, r7, r9\n\t"
  21480. "cmp %[a], r7\n\t"
  21481. "ble L_sp_2048_sqr_32_mul_%=\n\t"
  21482. "\n"
  21483. "L_sp_2048_sqr_32_done_mul_%=:\n\t"
  21484. "mov %[r], r10\n\t"
  21485. "mov r7, r8\n\t"
  21486. "str r3, [%[r], r7]\n\t"
  21487. "movs r3, r4\n\t"
  21488. "movs r4, r5\n\t"
  21489. "movs r5, #0\n\t"
  21490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21491. "adds r7, r7, #4\n\t"
  21492. #else
  21493. "add r7, r7, #4\n\t"
  21494. #endif
  21495. "mov r8, r7\n\t"
  21496. "movs r6, #0xf8\n\t"
  21497. "cmp r7, r6\n\t"
  21498. "ble L_sp_2048_sqr_32_words_%=\n\t"
  21499. "mov %[a], r9\n\t"
  21500. "str r3, [%[r], r7]\n\t"
  21501. "mov %[r], r11\n\t"
  21502. "mov %[a], r10\n\t"
  21503. "movs r3, #0xfc\n\t"
  21504. "\n"
  21505. "L_sp_2048_sqr_32_store_%=:\n\t"
  21506. "ldr r6, [%[a], r3]\n\t"
  21507. "str r6, [%[r], r3]\n\t"
  21508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21509. "subs r3, r3, #4\n\t"
  21510. #else
  21511. "sub r3, r3, #4\n\t"
  21512. #endif
  21513. "bge L_sp_2048_sqr_32_store_%=\n\t"
  21514. "movs r6, #0xff\n\t"
  21515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21516. "adds r6, r6, #1\n\t"
  21517. #else
  21518. "add r6, r6, #1\n\t"
  21519. #endif
  21520. "add sp, sp, r6\n\t"
  21521. : [r] "+l" (r), [a] "+l" (a)
  21522. :
  21523. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  21524. );
  21525. }
  21526. #endif /* WOLFSSL_SP_SMALL */
  21527. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  21528. /* Caclulate the bottom digit of -1/a mod 2^n.
  21529. *
  21530. * a A single precision number.
  21531. * rho Bottom word of inverse.
  21532. */
  21533. static void sp_2048_mont_setup(const sp_digit* a, sp_digit* rho)
  21534. {
  21535. sp_digit x;
  21536. sp_digit b;
  21537. b = a[0];
  21538. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  21539. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  21540. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  21541. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  21542. /* rho = -1/m mod b */
  21543. *rho = (sp_digit)0 - x;
  21544. }
  21545. /* Mul a by digit b into r. (r = a * b)
  21546. *
  21547. * r A single precision integer.
  21548. * a A single precision integer.
  21549. * b A single precision digit.
  21550. */
  21551. SP_NOINLINE static void sp_2048_mul_d_64(sp_digit* r, const sp_digit* a,
  21552. sp_digit b)
  21553. {
  21554. __asm__ __volatile__ (
  21555. "movs r6, #0xff\n\t"
  21556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21557. "adds r6, r6, #1\n\t"
  21558. #else
  21559. "add r6, r6, #1\n\t"
  21560. #endif
  21561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21562. "adds r6, r6, %[a]\n\t"
  21563. #else
  21564. "add r6, r6, %[a]\n\t"
  21565. #endif
  21566. "mov r8, %[r]\n\t"
  21567. "mov r9, r6\n\t"
  21568. "movs r3, #0\n\t"
  21569. "movs r4, #0\n\t"
  21570. "\n"
  21571. "L_sp_2048_mul_d_64_%=:\n\t"
  21572. "movs %[r], #0\n\t"
  21573. "movs r5, #0\n\t"
  21574. "# A[] * B\n\t"
  21575. "ldrh r6, [%[a]]\n\t"
  21576. "uxth r7, %[b]\n\t"
  21577. #ifdef WOLFSSL_KEIL
  21578. "muls r7, r6, r7\n\t"
  21579. #elif defined(__clang__)
  21580. "muls r7, r6\n\t"
  21581. #else
  21582. "mul r7, r6\n\t"
  21583. #endif
  21584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21585. "adds r3, r3, r7\n\t"
  21586. #else
  21587. "add r3, r3, r7\n\t"
  21588. #endif
  21589. #ifdef WOLFSSL_KEIL
  21590. "adcs r4, r4, %[r]\n\t"
  21591. #elif defined(__clang__)
  21592. "adcs r4, %[r]\n\t"
  21593. #else
  21594. "adc r4, %[r]\n\t"
  21595. #endif
  21596. #ifdef WOLFSSL_KEIL
  21597. "adcs r5, r5, %[r]\n\t"
  21598. #elif defined(__clang__)
  21599. "adcs r5, %[r]\n\t"
  21600. #else
  21601. "adc r5, %[r]\n\t"
  21602. #endif
  21603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21604. "lsrs r7, %[b], #16\n\t"
  21605. #else
  21606. "lsr r7, %[b], #16\n\t"
  21607. #endif
  21608. #ifdef WOLFSSL_KEIL
  21609. "muls r6, r7, r6\n\t"
  21610. #elif defined(__clang__)
  21611. "muls r6, r7\n\t"
  21612. #else
  21613. "mul r6, r7\n\t"
  21614. #endif
  21615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21616. "lsrs r7, r6, #16\n\t"
  21617. #else
  21618. "lsr r7, r6, #16\n\t"
  21619. #endif
  21620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21621. "lsls r6, r6, #16\n\t"
  21622. #else
  21623. "lsl r6, r6, #16\n\t"
  21624. #endif
  21625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21626. "adds r3, r3, r6\n\t"
  21627. #else
  21628. "add r3, r3, r6\n\t"
  21629. #endif
  21630. #ifdef WOLFSSL_KEIL
  21631. "adcs r4, r4, r7\n\t"
  21632. #elif defined(__clang__)
  21633. "adcs r4, r7\n\t"
  21634. #else
  21635. "adc r4, r7\n\t"
  21636. #endif
  21637. #ifdef WOLFSSL_KEIL
  21638. "adcs r5, r5, %[r]\n\t"
  21639. #elif defined(__clang__)
  21640. "adcs r5, %[r]\n\t"
  21641. #else
  21642. "adc r5, %[r]\n\t"
  21643. #endif
  21644. "ldr r6, [%[a]]\n\t"
  21645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21646. "lsrs r6, r6, #16\n\t"
  21647. #else
  21648. "lsr r6, r6, #16\n\t"
  21649. #endif
  21650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21651. "lsrs r7, %[b], #16\n\t"
  21652. #else
  21653. "lsr r7, %[b], #16\n\t"
  21654. #endif
  21655. #ifdef WOLFSSL_KEIL
  21656. "muls r7, r6, r7\n\t"
  21657. #elif defined(__clang__)
  21658. "muls r7, r6\n\t"
  21659. #else
  21660. "mul r7, r6\n\t"
  21661. #endif
  21662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21663. "adds r4, r4, r7\n\t"
  21664. #else
  21665. "add r4, r4, r7\n\t"
  21666. #endif
  21667. #ifdef WOLFSSL_KEIL
  21668. "adcs r5, r5, %[r]\n\t"
  21669. #elif defined(__clang__)
  21670. "adcs r5, %[r]\n\t"
  21671. #else
  21672. "adc r5, %[r]\n\t"
  21673. #endif
  21674. "uxth r7, %[b]\n\t"
  21675. #ifdef WOLFSSL_KEIL
  21676. "muls r6, r7, r6\n\t"
  21677. #elif defined(__clang__)
  21678. "muls r6, r7\n\t"
  21679. #else
  21680. "mul r6, r7\n\t"
  21681. #endif
  21682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21683. "lsrs r7, r6, #16\n\t"
  21684. #else
  21685. "lsr r7, r6, #16\n\t"
  21686. #endif
  21687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21688. "lsls r6, r6, #16\n\t"
  21689. #else
  21690. "lsl r6, r6, #16\n\t"
  21691. #endif
  21692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21693. "adds r3, r3, r6\n\t"
  21694. #else
  21695. "add r3, r3, r6\n\t"
  21696. #endif
  21697. #ifdef WOLFSSL_KEIL
  21698. "adcs r4, r4, r7\n\t"
  21699. #elif defined(__clang__)
  21700. "adcs r4, r7\n\t"
  21701. #else
  21702. "adc r4, r7\n\t"
  21703. #endif
  21704. #ifdef WOLFSSL_KEIL
  21705. "adcs r5, r5, %[r]\n\t"
  21706. #elif defined(__clang__)
  21707. "adcs r5, %[r]\n\t"
  21708. #else
  21709. "adc r5, %[r]\n\t"
  21710. #endif
  21711. "# A[] * B - Done\n\t"
  21712. "mov %[r], r8\n\t"
  21713. "str r3, [%[r]]\n\t"
  21714. "movs r3, r4\n\t"
  21715. "movs r4, r5\n\t"
  21716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21717. "adds %[r], %[r], #4\n\t"
  21718. #else
  21719. "add %[r], %[r], #4\n\t"
  21720. #endif
  21721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21722. "adds %[a], %[a], #4\n\t"
  21723. #else
  21724. "add %[a], %[a], #4\n\t"
  21725. #endif
  21726. "mov r8, %[r]\n\t"
  21727. "cmp %[a], r9\n\t"
  21728. "blt L_sp_2048_mul_d_64_%=\n\t"
  21729. "str r3, [%[r]]\n\t"
  21730. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  21731. :
  21732. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  21733. );
  21734. }
  21735. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  21736. /* r = 2^n mod m where n is the number of bits to reduce by.
  21737. * Given m must be 2048 bits, just need to subtract.
  21738. *
  21739. * r A single precision number.
  21740. * m A single precision number.
  21741. */
  21742. static void sp_2048_mont_norm_32(sp_digit* r, const sp_digit* m)
  21743. {
  21744. XMEMSET(r, 0, sizeof(sp_digit) * 32);
  21745. /* r = 2^n mod m */
  21746. sp_2048_sub_in_place_32(r, m);
  21747. }
  21748. /* Conditionally subtract b from a using the mask m.
  21749. * m is -1 to subtract and 0 when not copying.
  21750. *
  21751. * r A single precision number representing condition subtract result.
  21752. * a A single precision number to subtract from.
  21753. * b A single precision number to subtract.
  21754. * m Mask value to apply.
  21755. */
  21756. SP_NOINLINE static sp_digit sp_2048_cond_sub_32(sp_digit* r, const sp_digit* a,
  21757. const sp_digit* b, sp_digit m)
  21758. {
  21759. __asm__ __volatile__ (
  21760. "movs r4, #0\n\t"
  21761. "movs r5, #0x80\n\t"
  21762. "mov r8, r5\n\t"
  21763. "movs r7, #0\n\t"
  21764. "\n"
  21765. "L_sp_2048_cond_sub_32_words_%=:\n\t"
  21766. "ldr r6, [%[b], r7]\n\t"
  21767. #ifdef WOLFSSL_KEIL
  21768. "ands r6, r6, %[m]\n\t"
  21769. #elif defined(__clang__)
  21770. "ands r6, %[m]\n\t"
  21771. #else
  21772. "and r6, %[m]\n\t"
  21773. #endif
  21774. "movs r5, #0\n\t"
  21775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21776. "subs r5, r5, r4\n\t"
  21777. #else
  21778. "sub r5, r5, r4\n\t"
  21779. #endif
  21780. "ldr r5, [%[a], r7]\n\t"
  21781. #ifdef WOLFSSL_KEIL
  21782. "sbcs r5, r5, r6\n\t"
  21783. #elif defined(__clang__)
  21784. "sbcs r5, r6\n\t"
  21785. #else
  21786. "sbc r5, r6\n\t"
  21787. #endif
  21788. #ifdef WOLFSSL_KEIL
  21789. "sbcs r4, r4, r4\n\t"
  21790. #elif defined(__clang__)
  21791. "sbcs r4, r4\n\t"
  21792. #else
  21793. "sbc r4, r4\n\t"
  21794. #endif
  21795. "str r5, [%[r], r7]\n\t"
  21796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21797. "adds r7, r7, #4\n\t"
  21798. #else
  21799. "add r7, r7, #4\n\t"
  21800. #endif
  21801. "cmp r7, r8\n\t"
  21802. "blt L_sp_2048_cond_sub_32_words_%=\n\t"
  21803. "movs %[r], r4\n\t"
  21804. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  21805. :
  21806. : "memory", "r4", "r5", "r6", "r7", "r8"
  21807. );
  21808. return (uint32_t)(size_t)r;
  21809. }
  21810. /* Reduce the number back to 2048 bits using Montgomery reduction.
  21811. *
  21812. * a A single precision number to reduce in place.
  21813. * m The single precision number representing the modulus.
  21814. * mp The digit representing the negative inverse of m mod 2^n.
  21815. */
  21816. SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a, const sp_digit* m,
  21817. sp_digit mp)
  21818. {
  21819. __asm__ __volatile__ (
  21820. "movs r7, #0\n\t"
  21821. "mov r8, %[mp]\n\t"
  21822. "mov r12, r7\n\t"
  21823. "mov lr, %[m]\n\t"
  21824. "mov r9, %[a]\n\t"
  21825. "mov r11, %[a]\n\t"
  21826. "movs r5, #0x7c\n\t"
  21827. "movs r6, #0x80\n\t"
  21828. "add r9, r9, r5\n\t"
  21829. "add r11, r11, r6\n\t"
  21830. "\n"
  21831. "L_sp_2048_mont_reduce_32_mod_%=:\n\t"
  21832. "movs r7, #0\n\t"
  21833. "movs r4, #0\n\t"
  21834. "# a[i] += m[0] * mu\n\t"
  21835. "ldm %[m]!, {%[mp]}\n\t"
  21836. "ldm %[a]!, {r3}\n\t"
  21837. "# mu = a[i] * mp\n\t"
  21838. "mov r5, r8\n\t"
  21839. #ifdef WOLFSSL_KEIL
  21840. "muls r5, r3, r5\n\t"
  21841. #elif defined(__clang__)
  21842. "muls r5, r3\n\t"
  21843. #else
  21844. "mul r5, r3\n\t"
  21845. #endif
  21846. "mov r10, r5\n\t"
  21847. "# Multiply m[0] and mu - Start\n\t"
  21848. "mov r5, r10\n\t"
  21849. "uxth r6, %[mp]\n\t"
  21850. "uxth r5, r5\n\t"
  21851. #ifdef WOLFSSL_KEIL
  21852. "muls r6, r5, r6\n\t"
  21853. #elif defined(__clang__)
  21854. "muls r6, r5\n\t"
  21855. #else
  21856. "mul r6, r5\n\t"
  21857. #endif
  21858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21859. "adds r3, r3, r6\n\t"
  21860. #else
  21861. "add r3, r3, r6\n\t"
  21862. #endif
  21863. #ifdef WOLFSSL_KEIL
  21864. "adcs r4, r4, r7\n\t"
  21865. #elif defined(__clang__)
  21866. "adcs r4, r7\n\t"
  21867. #else
  21868. "adc r4, r7\n\t"
  21869. #endif
  21870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21871. "lsrs r6, %[mp], #16\n\t"
  21872. #else
  21873. "lsr r6, %[mp], #16\n\t"
  21874. #endif
  21875. #ifdef WOLFSSL_KEIL
  21876. "muls r5, r6, r5\n\t"
  21877. #elif defined(__clang__)
  21878. "muls r5, r6\n\t"
  21879. #else
  21880. "mul r5, r6\n\t"
  21881. #endif
  21882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21883. "lsrs r6, r5, #16\n\t"
  21884. #else
  21885. "lsr r6, r5, #16\n\t"
  21886. #endif
  21887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21888. "lsls r5, r5, #16\n\t"
  21889. #else
  21890. "lsl r5, r5, #16\n\t"
  21891. #endif
  21892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21893. "adds r3, r3, r5\n\t"
  21894. #else
  21895. "add r3, r3, r5\n\t"
  21896. #endif
  21897. #ifdef WOLFSSL_KEIL
  21898. "adcs r4, r4, r6\n\t"
  21899. #elif defined(__clang__)
  21900. "adcs r4, r6\n\t"
  21901. #else
  21902. "adc r4, r6\n\t"
  21903. #endif
  21904. "mov r5, r10\n\t"
  21905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21906. "lsrs r6, %[mp], #16\n\t"
  21907. #else
  21908. "lsr r6, %[mp], #16\n\t"
  21909. #endif
  21910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21911. "lsrs r5, r5, #16\n\t"
  21912. #else
  21913. "lsr r5, r5, #16\n\t"
  21914. #endif
  21915. #ifdef WOLFSSL_KEIL
  21916. "muls r6, r5, r6\n\t"
  21917. #elif defined(__clang__)
  21918. "muls r6, r5\n\t"
  21919. #else
  21920. "mul r6, r5\n\t"
  21921. #endif
  21922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21923. "adds r4, r4, r6\n\t"
  21924. #else
  21925. "add r4, r4, r6\n\t"
  21926. #endif
  21927. "uxth r6, %[mp]\n\t"
  21928. #ifdef WOLFSSL_KEIL
  21929. "muls r5, r6, r5\n\t"
  21930. #elif defined(__clang__)
  21931. "muls r5, r6\n\t"
  21932. #else
  21933. "mul r5, r6\n\t"
  21934. #endif
  21935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21936. "lsrs r6, r5, #16\n\t"
  21937. #else
  21938. "lsr r6, r5, #16\n\t"
  21939. #endif
  21940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21941. "lsls r5, r5, #16\n\t"
  21942. #else
  21943. "lsl r5, r5, #16\n\t"
  21944. #endif
  21945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21946. "adds r3, r3, r5\n\t"
  21947. #else
  21948. "add r3, r3, r5\n\t"
  21949. #endif
  21950. #ifdef WOLFSSL_KEIL
  21951. "adcs r4, r4, r6\n\t"
  21952. #elif defined(__clang__)
  21953. "adcs r4, r6\n\t"
  21954. #else
  21955. "adc r4, r6\n\t"
  21956. #endif
  21957. "# Multiply m[0] and mu - Done\n\t"
  21958. "\n"
  21959. "L_sp_2048_mont_reduce_32_word_%=:\n\t"
  21960. "# a[i+j] += m[j] * mu\n\t"
  21961. "ldr r3, [%[a]]\n\t"
  21962. "ldm %[m]!, {%[mp]}\n\t"
  21963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21964. "adds r3, r3, r4\n\t"
  21965. #else
  21966. "add r3, r3, r4\n\t"
  21967. #endif
  21968. "movs r4, #0\n\t"
  21969. #ifdef WOLFSSL_KEIL
  21970. "adcs r4, r4, r7\n\t"
  21971. #elif defined(__clang__)
  21972. "adcs r4, r7\n\t"
  21973. #else
  21974. "adc r4, r7\n\t"
  21975. #endif
  21976. "# Multiply m[j] and mu - Start\n\t"
  21977. "mov r5, r10\n\t"
  21978. "uxth r6, %[mp]\n\t"
  21979. "uxth r5, r5\n\t"
  21980. #ifdef WOLFSSL_KEIL
  21981. "muls r6, r5, r6\n\t"
  21982. #elif defined(__clang__)
  21983. "muls r6, r5\n\t"
  21984. #else
  21985. "mul r6, r5\n\t"
  21986. #endif
  21987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  21988. "adds r3, r3, r6\n\t"
  21989. #else
  21990. "add r3, r3, r6\n\t"
  21991. #endif
  21992. #ifdef WOLFSSL_KEIL
  21993. "adcs r4, r4, r7\n\t"
  21994. #elif defined(__clang__)
  21995. "adcs r4, r7\n\t"
  21996. #else
  21997. "adc r4, r7\n\t"
  21998. #endif
  21999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22000. "lsrs r6, %[mp], #16\n\t"
  22001. #else
  22002. "lsr r6, %[mp], #16\n\t"
  22003. #endif
  22004. #ifdef WOLFSSL_KEIL
  22005. "muls r5, r6, r5\n\t"
  22006. #elif defined(__clang__)
  22007. "muls r5, r6\n\t"
  22008. #else
  22009. "mul r5, r6\n\t"
  22010. #endif
  22011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22012. "lsrs r6, r5, #16\n\t"
  22013. #else
  22014. "lsr r6, r5, #16\n\t"
  22015. #endif
  22016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22017. "lsls r5, r5, #16\n\t"
  22018. #else
  22019. "lsl r5, r5, #16\n\t"
  22020. #endif
  22021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22022. "adds r3, r3, r5\n\t"
  22023. #else
  22024. "add r3, r3, r5\n\t"
  22025. #endif
  22026. #ifdef WOLFSSL_KEIL
  22027. "adcs r4, r4, r6\n\t"
  22028. #elif defined(__clang__)
  22029. "adcs r4, r6\n\t"
  22030. #else
  22031. "adc r4, r6\n\t"
  22032. #endif
  22033. "mov r5, r10\n\t"
  22034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22035. "lsrs r6, %[mp], #16\n\t"
  22036. #else
  22037. "lsr r6, %[mp], #16\n\t"
  22038. #endif
  22039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22040. "lsrs r5, r5, #16\n\t"
  22041. #else
  22042. "lsr r5, r5, #16\n\t"
  22043. #endif
  22044. #ifdef WOLFSSL_KEIL
  22045. "muls r6, r5, r6\n\t"
  22046. #elif defined(__clang__)
  22047. "muls r6, r5\n\t"
  22048. #else
  22049. "mul r6, r5\n\t"
  22050. #endif
  22051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22052. "adds r4, r4, r6\n\t"
  22053. #else
  22054. "add r4, r4, r6\n\t"
  22055. #endif
  22056. "uxth r6, %[mp]\n\t"
  22057. #ifdef WOLFSSL_KEIL
  22058. "muls r5, r6, r5\n\t"
  22059. #elif defined(__clang__)
  22060. "muls r5, r6\n\t"
  22061. #else
  22062. "mul r5, r6\n\t"
  22063. #endif
  22064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22065. "lsrs r6, r5, #16\n\t"
  22066. #else
  22067. "lsr r6, r5, #16\n\t"
  22068. #endif
  22069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22070. "lsls r5, r5, #16\n\t"
  22071. #else
  22072. "lsl r5, r5, #16\n\t"
  22073. #endif
  22074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22075. "adds r3, r3, r5\n\t"
  22076. #else
  22077. "add r3, r3, r5\n\t"
  22078. #endif
  22079. #ifdef WOLFSSL_KEIL
  22080. "adcs r4, r4, r6\n\t"
  22081. #elif defined(__clang__)
  22082. "adcs r4, r6\n\t"
  22083. #else
  22084. "adc r4, r6\n\t"
  22085. #endif
  22086. "# Multiply m[j] and mu - Done\n\t"
  22087. "stm %[a]!, {r3}\n\t"
  22088. "cmp %[a], r9\n\t"
  22089. "blt L_sp_2048_mont_reduce_32_word_%=\n\t"
  22090. "# a[i+31] += m[31] * mu\n\t"
  22091. "ldr %[mp], [%[m]]\n\t"
  22092. "mov r3, r12\n\t"
  22093. "# Multiply m[31] and mu - Start\n\t"
  22094. "mov r5, r10\n\t"
  22095. "uxth r6, %[mp]\n\t"
  22096. "uxth r5, r5\n\t"
  22097. #ifdef WOLFSSL_KEIL
  22098. "muls r6, r5, r6\n\t"
  22099. #elif defined(__clang__)
  22100. "muls r6, r5\n\t"
  22101. #else
  22102. "mul r6, r5\n\t"
  22103. #endif
  22104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22105. "adds r4, r4, r6\n\t"
  22106. #else
  22107. "add r4, r4, r6\n\t"
  22108. #endif
  22109. #ifdef WOLFSSL_KEIL
  22110. "adcs r3, r3, r7\n\t"
  22111. #elif defined(__clang__)
  22112. "adcs r3, r7\n\t"
  22113. #else
  22114. "adc r3, r7\n\t"
  22115. #endif
  22116. #ifdef WOLFSSL_KEIL
  22117. "adcs r7, r7, r7\n\t"
  22118. #elif defined(__clang__)
  22119. "adcs r7, r7\n\t"
  22120. #else
  22121. "adc r7, r7\n\t"
  22122. #endif
  22123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22124. "lsrs r6, %[mp], #16\n\t"
  22125. #else
  22126. "lsr r6, %[mp], #16\n\t"
  22127. #endif
  22128. #ifdef WOLFSSL_KEIL
  22129. "muls r5, r6, r5\n\t"
  22130. #elif defined(__clang__)
  22131. "muls r5, r6\n\t"
  22132. #else
  22133. "mul r5, r6\n\t"
  22134. #endif
  22135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22136. "lsrs r6, r5, #16\n\t"
  22137. #else
  22138. "lsr r6, r5, #16\n\t"
  22139. #endif
  22140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22141. "lsls r5, r5, #16\n\t"
  22142. #else
  22143. "lsl r5, r5, #16\n\t"
  22144. #endif
  22145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22146. "adds r4, r4, r5\n\t"
  22147. #else
  22148. "add r4, r4, r5\n\t"
  22149. #endif
  22150. #ifdef WOLFSSL_KEIL
  22151. "adcs r3, r3, r6\n\t"
  22152. #elif defined(__clang__)
  22153. "adcs r3, r6\n\t"
  22154. #else
  22155. "adc r3, r6\n\t"
  22156. #endif
  22157. #ifdef WOLFSSL_KEIL
  22158. "adcs r7, r7, r7\n\t"
  22159. #elif defined(__clang__)
  22160. "adcs r7, r7\n\t"
  22161. #else
  22162. "adc r7, r7\n\t"
  22163. #endif
  22164. "mov r5, r10\n\t"
  22165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22166. "lsrs r6, %[mp], #16\n\t"
  22167. #else
  22168. "lsr r6, %[mp], #16\n\t"
  22169. #endif
  22170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22171. "lsrs r5, r5, #16\n\t"
  22172. #else
  22173. "lsr r5, r5, #16\n\t"
  22174. #endif
  22175. #ifdef WOLFSSL_KEIL
  22176. "muls r6, r5, r6\n\t"
  22177. #elif defined(__clang__)
  22178. "muls r6, r5\n\t"
  22179. #else
  22180. "mul r6, r5\n\t"
  22181. #endif
  22182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22183. "adds r3, r3, r6\n\t"
  22184. #else
  22185. "add r3, r3, r6\n\t"
  22186. #endif
  22187. #ifdef WOLFSSL_KEIL
  22188. "adcs r7, r7, r7\n\t"
  22189. #elif defined(__clang__)
  22190. "adcs r7, r7\n\t"
  22191. #else
  22192. "adc r7, r7\n\t"
  22193. #endif
  22194. "uxth r6, %[mp]\n\t"
  22195. #ifdef WOLFSSL_KEIL
  22196. "muls r5, r6, r5\n\t"
  22197. #elif defined(__clang__)
  22198. "muls r5, r6\n\t"
  22199. #else
  22200. "mul r5, r6\n\t"
  22201. #endif
  22202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22203. "lsrs r6, r5, #16\n\t"
  22204. #else
  22205. "lsr r6, r5, #16\n\t"
  22206. #endif
  22207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22208. "lsls r5, r5, #16\n\t"
  22209. #else
  22210. "lsl r5, r5, #16\n\t"
  22211. #endif
  22212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22213. "adds r4, r4, r5\n\t"
  22214. #else
  22215. "add r4, r4, r5\n\t"
  22216. #endif
  22217. #ifdef WOLFSSL_KEIL
  22218. "adcs r3, r3, r6\n\t"
  22219. #elif defined(__clang__)
  22220. "adcs r3, r6\n\t"
  22221. #else
  22222. "adc r3, r6\n\t"
  22223. #endif
  22224. #ifdef WOLFSSL_KEIL
  22225. "adcs r7, r7, r7\n\t"
  22226. #elif defined(__clang__)
  22227. "adcs r7, r7\n\t"
  22228. #else
  22229. "adc r7, r7\n\t"
  22230. #endif
  22231. "# Multiply m[31] and mu - Done\n\t"
  22232. "ldr r5, [%[a]]\n\t"
  22233. "ldr r6, [%[a], #4]\n\t"
  22234. "movs %[mp], #0\n\t"
  22235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22236. "adds r5, r5, r4\n\t"
  22237. #else
  22238. "add r5, r5, r4\n\t"
  22239. #endif
  22240. #ifdef WOLFSSL_KEIL
  22241. "adcs r6, r6, r3\n\t"
  22242. #elif defined(__clang__)
  22243. "adcs r6, r3\n\t"
  22244. #else
  22245. "adc r6, r3\n\t"
  22246. #endif
  22247. #ifdef WOLFSSL_KEIL
  22248. "adcs r7, r7, %[mp]\n\t"
  22249. #elif defined(__clang__)
  22250. "adcs r7, %[mp]\n\t"
  22251. #else
  22252. "adc r7, %[mp]\n\t"
  22253. #endif
  22254. "stm %[a]!, {r5, r6}\n\t"
  22255. "# i += 1\n\t"
  22256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22257. "subs %[a], %[a], #4\n\t"
  22258. #else
  22259. "sub %[a], %[a], #4\n\t"
  22260. #endif
  22261. "movs r3, #0x7c\n\t"
  22262. "mov r9, %[a]\n\t"
  22263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22264. "subs %[a], %[a], r3\n\t"
  22265. #else
  22266. "sub %[a], %[a], r3\n\t"
  22267. #endif
  22268. "mov r12, r7\n\t"
  22269. "mov %[m], lr\n\t"
  22270. "cmp r11, %[a]\n\t"
  22271. "bgt L_sp_2048_mont_reduce_32_mod_%=\n\t"
  22272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22273. "negs r7, r7\n\t"
  22274. #else
  22275. "neg r7, r7\n\t"
  22276. #endif
  22277. "# Subtract masked modulus\n\t"
  22278. "movs r4, #0x80\n\t"
  22279. "movs %[mp], #0\n\t"
  22280. "movs r3, #0\n\t"
  22281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22282. "subs %[a], %[a], r4\n\t"
  22283. #else
  22284. "sub %[a], %[a], r4\n\t"
  22285. #endif
  22286. #ifndef WOLFSSL_SP_LARGE_CODE
  22287. "\n"
  22288. "L_sp_2048_mont_reduce_32_sub_mask_%=:\n\t"
  22289. "ldm %[m]!, {r6}\n\t"
  22290. "movs r5, #0\n\t"
  22291. #ifdef WOLFSSL_KEIL
  22292. "ands r6, r6, r7\n\t"
  22293. #elif defined(__clang__)
  22294. "ands r6, r7\n\t"
  22295. #else
  22296. "and r6, r7\n\t"
  22297. #endif
  22298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22299. "subs r5, r5, %[mp]\n\t"
  22300. #else
  22301. "sub r5, r5, %[mp]\n\t"
  22302. #endif
  22303. "ldr r5, [%[a], r4]\n\t"
  22304. #ifdef WOLFSSL_KEIL
  22305. "sbcs r5, r5, r6\n\t"
  22306. #elif defined(__clang__)
  22307. "sbcs r5, r6\n\t"
  22308. #else
  22309. "sbc r5, r6\n\t"
  22310. #endif
  22311. #ifdef WOLFSSL_KEIL
  22312. "sbcs %[mp], %[mp], %[mp]\n\t"
  22313. #elif defined(__clang__)
  22314. "sbcs %[mp], %[mp]\n\t"
  22315. #else
  22316. "sbc %[mp], %[mp]\n\t"
  22317. #endif
  22318. "stm %[a]!, {r5}\n\t"
  22319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22320. "adds r3, r3, #4\n\t"
  22321. #else
  22322. "add r3, r3, #4\n\t"
  22323. #endif
  22324. "cmp r3, r4\n\t"
  22325. "blt L_sp_2048_mont_reduce_32_sub_mask_%=\n\t"
  22326. #else /* WOLFSSL_SP_LARGE_CODE */
  22327. "ldm %[m]!, {r6}\n\t"
  22328. #ifdef WOLFSSL_KEIL
  22329. "ands r6, r6, r7\n\t"
  22330. #elif defined(__clang__)
  22331. "ands r6, r7\n\t"
  22332. #else
  22333. "and r6, r7\n\t"
  22334. #endif
  22335. "ldr r5, [%[a], r4]\n\t"
  22336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22337. "subs r5, r5, r6\n\t"
  22338. #else
  22339. "sub r5, r5, r6\n\t"
  22340. #endif
  22341. "stm %[a]!, {r5}\n\t"
  22342. "ldm %[m]!, {r6}\n\t"
  22343. #ifdef WOLFSSL_KEIL
  22344. "ands r6, r6, r7\n\t"
  22345. #elif defined(__clang__)
  22346. "ands r6, r7\n\t"
  22347. #else
  22348. "and r6, r7\n\t"
  22349. #endif
  22350. "ldr r5, [%[a], r4]\n\t"
  22351. #ifdef WOLFSSL_KEIL
  22352. "sbcs r5, r5, r6\n\t"
  22353. #elif defined(__clang__)
  22354. "sbcs r5, r6\n\t"
  22355. #else
  22356. "sbc r5, r6\n\t"
  22357. #endif
  22358. "stm %[a]!, {r5}\n\t"
  22359. "ldm %[m]!, {r6}\n\t"
  22360. #ifdef WOLFSSL_KEIL
  22361. "ands r6, r6, r7\n\t"
  22362. #elif defined(__clang__)
  22363. "ands r6, r7\n\t"
  22364. #else
  22365. "and r6, r7\n\t"
  22366. #endif
  22367. "ldr r5, [%[a], r4]\n\t"
  22368. #ifdef WOLFSSL_KEIL
  22369. "sbcs r5, r5, r6\n\t"
  22370. #elif defined(__clang__)
  22371. "sbcs r5, r6\n\t"
  22372. #else
  22373. "sbc r5, r6\n\t"
  22374. #endif
  22375. "stm %[a]!, {r5}\n\t"
  22376. "ldm %[m]!, {r6}\n\t"
  22377. #ifdef WOLFSSL_KEIL
  22378. "ands r6, r6, r7\n\t"
  22379. #elif defined(__clang__)
  22380. "ands r6, r7\n\t"
  22381. #else
  22382. "and r6, r7\n\t"
  22383. #endif
  22384. "ldr r5, [%[a], r4]\n\t"
  22385. #ifdef WOLFSSL_KEIL
  22386. "sbcs r5, r5, r6\n\t"
  22387. #elif defined(__clang__)
  22388. "sbcs r5, r6\n\t"
  22389. #else
  22390. "sbc r5, r6\n\t"
  22391. #endif
  22392. "stm %[a]!, {r5}\n\t"
  22393. "ldm %[m]!, {r6}\n\t"
  22394. #ifdef WOLFSSL_KEIL
  22395. "ands r6, r6, r7\n\t"
  22396. #elif defined(__clang__)
  22397. "ands r6, r7\n\t"
  22398. #else
  22399. "and r6, r7\n\t"
  22400. #endif
  22401. "ldr r5, [%[a], r4]\n\t"
  22402. #ifdef WOLFSSL_KEIL
  22403. "sbcs r5, r5, r6\n\t"
  22404. #elif defined(__clang__)
  22405. "sbcs r5, r6\n\t"
  22406. #else
  22407. "sbc r5, r6\n\t"
  22408. #endif
  22409. "stm %[a]!, {r5}\n\t"
  22410. "ldm %[m]!, {r6}\n\t"
  22411. #ifdef WOLFSSL_KEIL
  22412. "ands r6, r6, r7\n\t"
  22413. #elif defined(__clang__)
  22414. "ands r6, r7\n\t"
  22415. #else
  22416. "and r6, r7\n\t"
  22417. #endif
  22418. "ldr r5, [%[a], r4]\n\t"
  22419. #ifdef WOLFSSL_KEIL
  22420. "sbcs r5, r5, r6\n\t"
  22421. #elif defined(__clang__)
  22422. "sbcs r5, r6\n\t"
  22423. #else
  22424. "sbc r5, r6\n\t"
  22425. #endif
  22426. "stm %[a]!, {r5}\n\t"
  22427. "ldm %[m]!, {r6}\n\t"
  22428. #ifdef WOLFSSL_KEIL
  22429. "ands r6, r6, r7\n\t"
  22430. #elif defined(__clang__)
  22431. "ands r6, r7\n\t"
  22432. #else
  22433. "and r6, r7\n\t"
  22434. #endif
  22435. "ldr r5, [%[a], r4]\n\t"
  22436. #ifdef WOLFSSL_KEIL
  22437. "sbcs r5, r5, r6\n\t"
  22438. #elif defined(__clang__)
  22439. "sbcs r5, r6\n\t"
  22440. #else
  22441. "sbc r5, r6\n\t"
  22442. #endif
  22443. "stm %[a]!, {r5}\n\t"
  22444. "ldm %[m]!, {r6}\n\t"
  22445. #ifdef WOLFSSL_KEIL
  22446. "ands r6, r6, r7\n\t"
  22447. #elif defined(__clang__)
  22448. "ands r6, r7\n\t"
  22449. #else
  22450. "and r6, r7\n\t"
  22451. #endif
  22452. "ldr r5, [%[a], r4]\n\t"
  22453. #ifdef WOLFSSL_KEIL
  22454. "sbcs r5, r5, r6\n\t"
  22455. #elif defined(__clang__)
  22456. "sbcs r5, r6\n\t"
  22457. #else
  22458. "sbc r5, r6\n\t"
  22459. #endif
  22460. "stm %[a]!, {r5}\n\t"
  22461. "ldm %[m]!, {r6}\n\t"
  22462. #ifdef WOLFSSL_KEIL
  22463. "ands r6, r6, r7\n\t"
  22464. #elif defined(__clang__)
  22465. "ands r6, r7\n\t"
  22466. #else
  22467. "and r6, r7\n\t"
  22468. #endif
  22469. "ldr r5, [%[a], r4]\n\t"
  22470. #ifdef WOLFSSL_KEIL
  22471. "sbcs r5, r5, r6\n\t"
  22472. #elif defined(__clang__)
  22473. "sbcs r5, r6\n\t"
  22474. #else
  22475. "sbc r5, r6\n\t"
  22476. #endif
  22477. "stm %[a]!, {r5}\n\t"
  22478. "ldm %[m]!, {r6}\n\t"
  22479. #ifdef WOLFSSL_KEIL
  22480. "ands r6, r6, r7\n\t"
  22481. #elif defined(__clang__)
  22482. "ands r6, r7\n\t"
  22483. #else
  22484. "and r6, r7\n\t"
  22485. #endif
  22486. "ldr r5, [%[a], r4]\n\t"
  22487. #ifdef WOLFSSL_KEIL
  22488. "sbcs r5, r5, r6\n\t"
  22489. #elif defined(__clang__)
  22490. "sbcs r5, r6\n\t"
  22491. #else
  22492. "sbc r5, r6\n\t"
  22493. #endif
  22494. "stm %[a]!, {r5}\n\t"
  22495. "ldm %[m]!, {r6}\n\t"
  22496. #ifdef WOLFSSL_KEIL
  22497. "ands r6, r6, r7\n\t"
  22498. #elif defined(__clang__)
  22499. "ands r6, r7\n\t"
  22500. #else
  22501. "and r6, r7\n\t"
  22502. #endif
  22503. "ldr r5, [%[a], r4]\n\t"
  22504. #ifdef WOLFSSL_KEIL
  22505. "sbcs r5, r5, r6\n\t"
  22506. #elif defined(__clang__)
  22507. "sbcs r5, r6\n\t"
  22508. #else
  22509. "sbc r5, r6\n\t"
  22510. #endif
  22511. "stm %[a]!, {r5}\n\t"
  22512. "ldm %[m]!, {r6}\n\t"
  22513. #ifdef WOLFSSL_KEIL
  22514. "ands r6, r6, r7\n\t"
  22515. #elif defined(__clang__)
  22516. "ands r6, r7\n\t"
  22517. #else
  22518. "and r6, r7\n\t"
  22519. #endif
  22520. "ldr r5, [%[a], r4]\n\t"
  22521. #ifdef WOLFSSL_KEIL
  22522. "sbcs r5, r5, r6\n\t"
  22523. #elif defined(__clang__)
  22524. "sbcs r5, r6\n\t"
  22525. #else
  22526. "sbc r5, r6\n\t"
  22527. #endif
  22528. "stm %[a]!, {r5}\n\t"
  22529. "ldm %[m]!, {r6}\n\t"
  22530. #ifdef WOLFSSL_KEIL
  22531. "ands r6, r6, r7\n\t"
  22532. #elif defined(__clang__)
  22533. "ands r6, r7\n\t"
  22534. #else
  22535. "and r6, r7\n\t"
  22536. #endif
  22537. "ldr r5, [%[a], r4]\n\t"
  22538. #ifdef WOLFSSL_KEIL
  22539. "sbcs r5, r5, r6\n\t"
  22540. #elif defined(__clang__)
  22541. "sbcs r5, r6\n\t"
  22542. #else
  22543. "sbc r5, r6\n\t"
  22544. #endif
  22545. "stm %[a]!, {r5}\n\t"
  22546. "ldm %[m]!, {r6}\n\t"
  22547. #ifdef WOLFSSL_KEIL
  22548. "ands r6, r6, r7\n\t"
  22549. #elif defined(__clang__)
  22550. "ands r6, r7\n\t"
  22551. #else
  22552. "and r6, r7\n\t"
  22553. #endif
  22554. "ldr r5, [%[a], r4]\n\t"
  22555. #ifdef WOLFSSL_KEIL
  22556. "sbcs r5, r5, r6\n\t"
  22557. #elif defined(__clang__)
  22558. "sbcs r5, r6\n\t"
  22559. #else
  22560. "sbc r5, r6\n\t"
  22561. #endif
  22562. "stm %[a]!, {r5}\n\t"
  22563. "ldm %[m]!, {r6}\n\t"
  22564. #ifdef WOLFSSL_KEIL
  22565. "ands r6, r6, r7\n\t"
  22566. #elif defined(__clang__)
  22567. "ands r6, r7\n\t"
  22568. #else
  22569. "and r6, r7\n\t"
  22570. #endif
  22571. "ldr r5, [%[a], r4]\n\t"
  22572. #ifdef WOLFSSL_KEIL
  22573. "sbcs r5, r5, r6\n\t"
  22574. #elif defined(__clang__)
  22575. "sbcs r5, r6\n\t"
  22576. #else
  22577. "sbc r5, r6\n\t"
  22578. #endif
  22579. "stm %[a]!, {r5}\n\t"
  22580. "ldm %[m]!, {r6}\n\t"
  22581. #ifdef WOLFSSL_KEIL
  22582. "ands r6, r6, r7\n\t"
  22583. #elif defined(__clang__)
  22584. "ands r6, r7\n\t"
  22585. #else
  22586. "and r6, r7\n\t"
  22587. #endif
  22588. "ldr r5, [%[a], r4]\n\t"
  22589. #ifdef WOLFSSL_KEIL
  22590. "sbcs r5, r5, r6\n\t"
  22591. #elif defined(__clang__)
  22592. "sbcs r5, r6\n\t"
  22593. #else
  22594. "sbc r5, r6\n\t"
  22595. #endif
  22596. "stm %[a]!, {r5}\n\t"
  22597. "ldm %[m]!, {r6}\n\t"
  22598. #ifdef WOLFSSL_KEIL
  22599. "ands r6, r6, r7\n\t"
  22600. #elif defined(__clang__)
  22601. "ands r6, r7\n\t"
  22602. #else
  22603. "and r6, r7\n\t"
  22604. #endif
  22605. "ldr r5, [%[a], r4]\n\t"
  22606. #ifdef WOLFSSL_KEIL
  22607. "sbcs r5, r5, r6\n\t"
  22608. #elif defined(__clang__)
  22609. "sbcs r5, r6\n\t"
  22610. #else
  22611. "sbc r5, r6\n\t"
  22612. #endif
  22613. "stm %[a]!, {r5}\n\t"
  22614. "ldm %[m]!, {r6}\n\t"
  22615. #ifdef WOLFSSL_KEIL
  22616. "ands r6, r6, r7\n\t"
  22617. #elif defined(__clang__)
  22618. "ands r6, r7\n\t"
  22619. #else
  22620. "and r6, r7\n\t"
  22621. #endif
  22622. "ldr r5, [%[a], r4]\n\t"
  22623. #ifdef WOLFSSL_KEIL
  22624. "sbcs r5, r5, r6\n\t"
  22625. #elif defined(__clang__)
  22626. "sbcs r5, r6\n\t"
  22627. #else
  22628. "sbc r5, r6\n\t"
  22629. #endif
  22630. "stm %[a]!, {r5}\n\t"
  22631. "ldm %[m]!, {r6}\n\t"
  22632. #ifdef WOLFSSL_KEIL
  22633. "ands r6, r6, r7\n\t"
  22634. #elif defined(__clang__)
  22635. "ands r6, r7\n\t"
  22636. #else
  22637. "and r6, r7\n\t"
  22638. #endif
  22639. "ldr r5, [%[a], r4]\n\t"
  22640. #ifdef WOLFSSL_KEIL
  22641. "sbcs r5, r5, r6\n\t"
  22642. #elif defined(__clang__)
  22643. "sbcs r5, r6\n\t"
  22644. #else
  22645. "sbc r5, r6\n\t"
  22646. #endif
  22647. "stm %[a]!, {r5}\n\t"
  22648. "ldm %[m]!, {r6}\n\t"
  22649. #ifdef WOLFSSL_KEIL
  22650. "ands r6, r6, r7\n\t"
  22651. #elif defined(__clang__)
  22652. "ands r6, r7\n\t"
  22653. #else
  22654. "and r6, r7\n\t"
  22655. #endif
  22656. "ldr r5, [%[a], r4]\n\t"
  22657. #ifdef WOLFSSL_KEIL
  22658. "sbcs r5, r5, r6\n\t"
  22659. #elif defined(__clang__)
  22660. "sbcs r5, r6\n\t"
  22661. #else
  22662. "sbc r5, r6\n\t"
  22663. #endif
  22664. "stm %[a]!, {r5}\n\t"
  22665. "ldm %[m]!, {r6}\n\t"
  22666. #ifdef WOLFSSL_KEIL
  22667. "ands r6, r6, r7\n\t"
  22668. #elif defined(__clang__)
  22669. "ands r6, r7\n\t"
  22670. #else
  22671. "and r6, r7\n\t"
  22672. #endif
  22673. "ldr r5, [%[a], r4]\n\t"
  22674. #ifdef WOLFSSL_KEIL
  22675. "sbcs r5, r5, r6\n\t"
  22676. #elif defined(__clang__)
  22677. "sbcs r5, r6\n\t"
  22678. #else
  22679. "sbc r5, r6\n\t"
  22680. #endif
  22681. "stm %[a]!, {r5}\n\t"
  22682. "ldm %[m]!, {r6}\n\t"
  22683. #ifdef WOLFSSL_KEIL
  22684. "ands r6, r6, r7\n\t"
  22685. #elif defined(__clang__)
  22686. "ands r6, r7\n\t"
  22687. #else
  22688. "and r6, r7\n\t"
  22689. #endif
  22690. "ldr r5, [%[a], r4]\n\t"
  22691. #ifdef WOLFSSL_KEIL
  22692. "sbcs r5, r5, r6\n\t"
  22693. #elif defined(__clang__)
  22694. "sbcs r5, r6\n\t"
  22695. #else
  22696. "sbc r5, r6\n\t"
  22697. #endif
  22698. "stm %[a]!, {r5}\n\t"
  22699. "ldm %[m]!, {r6}\n\t"
  22700. #ifdef WOLFSSL_KEIL
  22701. "ands r6, r6, r7\n\t"
  22702. #elif defined(__clang__)
  22703. "ands r6, r7\n\t"
  22704. #else
  22705. "and r6, r7\n\t"
  22706. #endif
  22707. "ldr r5, [%[a], r4]\n\t"
  22708. #ifdef WOLFSSL_KEIL
  22709. "sbcs r5, r5, r6\n\t"
  22710. #elif defined(__clang__)
  22711. "sbcs r5, r6\n\t"
  22712. #else
  22713. "sbc r5, r6\n\t"
  22714. #endif
  22715. "stm %[a]!, {r5}\n\t"
  22716. "ldm %[m]!, {r6}\n\t"
  22717. #ifdef WOLFSSL_KEIL
  22718. "ands r6, r6, r7\n\t"
  22719. #elif defined(__clang__)
  22720. "ands r6, r7\n\t"
  22721. #else
  22722. "and r6, r7\n\t"
  22723. #endif
  22724. "ldr r5, [%[a], r4]\n\t"
  22725. #ifdef WOLFSSL_KEIL
  22726. "sbcs r5, r5, r6\n\t"
  22727. #elif defined(__clang__)
  22728. "sbcs r5, r6\n\t"
  22729. #else
  22730. "sbc r5, r6\n\t"
  22731. #endif
  22732. "stm %[a]!, {r5}\n\t"
  22733. "ldm %[m]!, {r6}\n\t"
  22734. #ifdef WOLFSSL_KEIL
  22735. "ands r6, r6, r7\n\t"
  22736. #elif defined(__clang__)
  22737. "ands r6, r7\n\t"
  22738. #else
  22739. "and r6, r7\n\t"
  22740. #endif
  22741. "ldr r5, [%[a], r4]\n\t"
  22742. #ifdef WOLFSSL_KEIL
  22743. "sbcs r5, r5, r6\n\t"
  22744. #elif defined(__clang__)
  22745. "sbcs r5, r6\n\t"
  22746. #else
  22747. "sbc r5, r6\n\t"
  22748. #endif
  22749. "stm %[a]!, {r5}\n\t"
  22750. "ldm %[m]!, {r6}\n\t"
  22751. #ifdef WOLFSSL_KEIL
  22752. "ands r6, r6, r7\n\t"
  22753. #elif defined(__clang__)
  22754. "ands r6, r7\n\t"
  22755. #else
  22756. "and r6, r7\n\t"
  22757. #endif
  22758. "ldr r5, [%[a], r4]\n\t"
  22759. #ifdef WOLFSSL_KEIL
  22760. "sbcs r5, r5, r6\n\t"
  22761. #elif defined(__clang__)
  22762. "sbcs r5, r6\n\t"
  22763. #else
  22764. "sbc r5, r6\n\t"
  22765. #endif
  22766. "stm %[a]!, {r5}\n\t"
  22767. "ldm %[m]!, {r6}\n\t"
  22768. #ifdef WOLFSSL_KEIL
  22769. "ands r6, r6, r7\n\t"
  22770. #elif defined(__clang__)
  22771. "ands r6, r7\n\t"
  22772. #else
  22773. "and r6, r7\n\t"
  22774. #endif
  22775. "ldr r5, [%[a], r4]\n\t"
  22776. #ifdef WOLFSSL_KEIL
  22777. "sbcs r5, r5, r6\n\t"
  22778. #elif defined(__clang__)
  22779. "sbcs r5, r6\n\t"
  22780. #else
  22781. "sbc r5, r6\n\t"
  22782. #endif
  22783. "stm %[a]!, {r5}\n\t"
  22784. "ldm %[m]!, {r6}\n\t"
  22785. #ifdef WOLFSSL_KEIL
  22786. "ands r6, r6, r7\n\t"
  22787. #elif defined(__clang__)
  22788. "ands r6, r7\n\t"
  22789. #else
  22790. "and r6, r7\n\t"
  22791. #endif
  22792. "ldr r5, [%[a], r4]\n\t"
  22793. #ifdef WOLFSSL_KEIL
  22794. "sbcs r5, r5, r6\n\t"
  22795. #elif defined(__clang__)
  22796. "sbcs r5, r6\n\t"
  22797. #else
  22798. "sbc r5, r6\n\t"
  22799. #endif
  22800. "stm %[a]!, {r5}\n\t"
  22801. "ldm %[m]!, {r6}\n\t"
  22802. #ifdef WOLFSSL_KEIL
  22803. "ands r6, r6, r7\n\t"
  22804. #elif defined(__clang__)
  22805. "ands r6, r7\n\t"
  22806. #else
  22807. "and r6, r7\n\t"
  22808. #endif
  22809. "ldr r5, [%[a], r4]\n\t"
  22810. #ifdef WOLFSSL_KEIL
  22811. "sbcs r5, r5, r6\n\t"
  22812. #elif defined(__clang__)
  22813. "sbcs r5, r6\n\t"
  22814. #else
  22815. "sbc r5, r6\n\t"
  22816. #endif
  22817. "stm %[a]!, {r5}\n\t"
  22818. "ldm %[m]!, {r6}\n\t"
  22819. #ifdef WOLFSSL_KEIL
  22820. "ands r6, r6, r7\n\t"
  22821. #elif defined(__clang__)
  22822. "ands r6, r7\n\t"
  22823. #else
  22824. "and r6, r7\n\t"
  22825. #endif
  22826. "ldr r5, [%[a], r4]\n\t"
  22827. #ifdef WOLFSSL_KEIL
  22828. "sbcs r5, r5, r6\n\t"
  22829. #elif defined(__clang__)
  22830. "sbcs r5, r6\n\t"
  22831. #else
  22832. "sbc r5, r6\n\t"
  22833. #endif
  22834. "stm %[a]!, {r5}\n\t"
  22835. "ldm %[m]!, {r6}\n\t"
  22836. #ifdef WOLFSSL_KEIL
  22837. "ands r6, r6, r7\n\t"
  22838. #elif defined(__clang__)
  22839. "ands r6, r7\n\t"
  22840. #else
  22841. "and r6, r7\n\t"
  22842. #endif
  22843. "ldr r5, [%[a], r4]\n\t"
  22844. #ifdef WOLFSSL_KEIL
  22845. "sbcs r5, r5, r6\n\t"
  22846. #elif defined(__clang__)
  22847. "sbcs r5, r6\n\t"
  22848. #else
  22849. "sbc r5, r6\n\t"
  22850. #endif
  22851. "stm %[a]!, {r5}\n\t"
  22852. "ldm %[m]!, {r6}\n\t"
  22853. #ifdef WOLFSSL_KEIL
  22854. "ands r6, r6, r7\n\t"
  22855. #elif defined(__clang__)
  22856. "ands r6, r7\n\t"
  22857. #else
  22858. "and r6, r7\n\t"
  22859. #endif
  22860. "ldr r5, [%[a], r4]\n\t"
  22861. #ifdef WOLFSSL_KEIL
  22862. "sbcs r5, r5, r6\n\t"
  22863. #elif defined(__clang__)
  22864. "sbcs r5, r6\n\t"
  22865. #else
  22866. "sbc r5, r6\n\t"
  22867. #endif
  22868. "stm %[a]!, {r5}\n\t"
  22869. #endif /* WOLFSSL_SP_LARGE_CODE */
  22870. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  22871. :
  22872. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  22873. );
  22874. }
  22875. /* Multiply two Montgomery form numbers mod the modulus (prime).
  22876. * (r = a * b mod m)
  22877. *
  22878. * r Result of multiplication.
  22879. * a First number to multiply in Montgomery form.
  22880. * b Second number to multiply in Montgomery form.
  22881. * m Modulus (prime).
  22882. * mp Montgomery mulitplier.
  22883. */
  22884. SP_NOINLINE static void sp_2048_mont_mul_32(sp_digit* r, const sp_digit* a,
  22885. const sp_digit* b, const sp_digit* m, sp_digit mp)
  22886. {
  22887. sp_2048_mul_32(r, a, b);
  22888. sp_2048_mont_reduce_32(r, m, mp);
  22889. }
  22890. /* Square the Montgomery form number. (r = a * a mod m)
  22891. *
  22892. * r Result of squaring.
  22893. * a Number to square in Montgomery form.
  22894. * m Modulus (prime).
  22895. * mp Montgomery mulitplier.
  22896. */
  22897. SP_NOINLINE static void sp_2048_mont_sqr_32(sp_digit* r, const sp_digit* a,
  22898. const sp_digit* m, sp_digit mp)
  22899. {
  22900. sp_2048_sqr_32(r, a);
  22901. sp_2048_mont_reduce_32(r, m, mp);
  22902. }
  22903. /* Mul a by digit b into r. (r = a * b)
  22904. *
  22905. * r A single precision integer.
  22906. * a A single precision integer.
  22907. * b A single precision digit.
  22908. */
  22909. SP_NOINLINE static void sp_2048_mul_d_32(sp_digit* r, const sp_digit* a,
  22910. sp_digit b)
  22911. {
  22912. __asm__ __volatile__ (
  22913. "movs r6, #0x80\n\t"
  22914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22915. "adds r6, r6, %[a]\n\t"
  22916. #else
  22917. "add r6, r6, %[a]\n\t"
  22918. #endif
  22919. "mov r8, %[r]\n\t"
  22920. "mov r9, r6\n\t"
  22921. "movs r3, #0\n\t"
  22922. "movs r4, #0\n\t"
  22923. "\n"
  22924. "L_sp_2048_mul_d_32_%=:\n\t"
  22925. "movs %[r], #0\n\t"
  22926. "movs r5, #0\n\t"
  22927. "# A[] * B\n\t"
  22928. "ldrh r6, [%[a]]\n\t"
  22929. "uxth r7, %[b]\n\t"
  22930. #ifdef WOLFSSL_KEIL
  22931. "muls r7, r6, r7\n\t"
  22932. #elif defined(__clang__)
  22933. "muls r7, r6\n\t"
  22934. #else
  22935. "mul r7, r6\n\t"
  22936. #endif
  22937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22938. "adds r3, r3, r7\n\t"
  22939. #else
  22940. "add r3, r3, r7\n\t"
  22941. #endif
  22942. #ifdef WOLFSSL_KEIL
  22943. "adcs r4, r4, %[r]\n\t"
  22944. #elif defined(__clang__)
  22945. "adcs r4, %[r]\n\t"
  22946. #else
  22947. "adc r4, %[r]\n\t"
  22948. #endif
  22949. #ifdef WOLFSSL_KEIL
  22950. "adcs r5, r5, %[r]\n\t"
  22951. #elif defined(__clang__)
  22952. "adcs r5, %[r]\n\t"
  22953. #else
  22954. "adc r5, %[r]\n\t"
  22955. #endif
  22956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22957. "lsrs r7, %[b], #16\n\t"
  22958. #else
  22959. "lsr r7, %[b], #16\n\t"
  22960. #endif
  22961. #ifdef WOLFSSL_KEIL
  22962. "muls r6, r7, r6\n\t"
  22963. #elif defined(__clang__)
  22964. "muls r6, r7\n\t"
  22965. #else
  22966. "mul r6, r7\n\t"
  22967. #endif
  22968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22969. "lsrs r7, r6, #16\n\t"
  22970. #else
  22971. "lsr r7, r6, #16\n\t"
  22972. #endif
  22973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22974. "lsls r6, r6, #16\n\t"
  22975. #else
  22976. "lsl r6, r6, #16\n\t"
  22977. #endif
  22978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22979. "adds r3, r3, r6\n\t"
  22980. #else
  22981. "add r3, r3, r6\n\t"
  22982. #endif
  22983. #ifdef WOLFSSL_KEIL
  22984. "adcs r4, r4, r7\n\t"
  22985. #elif defined(__clang__)
  22986. "adcs r4, r7\n\t"
  22987. #else
  22988. "adc r4, r7\n\t"
  22989. #endif
  22990. #ifdef WOLFSSL_KEIL
  22991. "adcs r5, r5, %[r]\n\t"
  22992. #elif defined(__clang__)
  22993. "adcs r5, %[r]\n\t"
  22994. #else
  22995. "adc r5, %[r]\n\t"
  22996. #endif
  22997. "ldr r6, [%[a]]\n\t"
  22998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  22999. "lsrs r6, r6, #16\n\t"
  23000. #else
  23001. "lsr r6, r6, #16\n\t"
  23002. #endif
  23003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23004. "lsrs r7, %[b], #16\n\t"
  23005. #else
  23006. "lsr r7, %[b], #16\n\t"
  23007. #endif
  23008. #ifdef WOLFSSL_KEIL
  23009. "muls r7, r6, r7\n\t"
  23010. #elif defined(__clang__)
  23011. "muls r7, r6\n\t"
  23012. #else
  23013. "mul r7, r6\n\t"
  23014. #endif
  23015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23016. "adds r4, r4, r7\n\t"
  23017. #else
  23018. "add r4, r4, r7\n\t"
  23019. #endif
  23020. #ifdef WOLFSSL_KEIL
  23021. "adcs r5, r5, %[r]\n\t"
  23022. #elif defined(__clang__)
  23023. "adcs r5, %[r]\n\t"
  23024. #else
  23025. "adc r5, %[r]\n\t"
  23026. #endif
  23027. "uxth r7, %[b]\n\t"
  23028. #ifdef WOLFSSL_KEIL
  23029. "muls r6, r7, r6\n\t"
  23030. #elif defined(__clang__)
  23031. "muls r6, r7\n\t"
  23032. #else
  23033. "mul r6, r7\n\t"
  23034. #endif
  23035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23036. "lsrs r7, r6, #16\n\t"
  23037. #else
  23038. "lsr r7, r6, #16\n\t"
  23039. #endif
  23040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23041. "lsls r6, r6, #16\n\t"
  23042. #else
  23043. "lsl r6, r6, #16\n\t"
  23044. #endif
  23045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23046. "adds r3, r3, r6\n\t"
  23047. #else
  23048. "add r3, r3, r6\n\t"
  23049. #endif
  23050. #ifdef WOLFSSL_KEIL
  23051. "adcs r4, r4, r7\n\t"
  23052. #elif defined(__clang__)
  23053. "adcs r4, r7\n\t"
  23054. #else
  23055. "adc r4, r7\n\t"
  23056. #endif
  23057. #ifdef WOLFSSL_KEIL
  23058. "adcs r5, r5, %[r]\n\t"
  23059. #elif defined(__clang__)
  23060. "adcs r5, %[r]\n\t"
  23061. #else
  23062. "adc r5, %[r]\n\t"
  23063. #endif
  23064. "# A[] * B - Done\n\t"
  23065. "mov %[r], r8\n\t"
  23066. "str r3, [%[r]]\n\t"
  23067. "movs r3, r4\n\t"
  23068. "movs r4, r5\n\t"
  23069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23070. "adds %[r], %[r], #4\n\t"
  23071. #else
  23072. "add %[r], %[r], #4\n\t"
  23073. #endif
  23074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23075. "adds %[a], %[a], #4\n\t"
  23076. #else
  23077. "add %[a], %[a], #4\n\t"
  23078. #endif
  23079. "mov r8, %[r]\n\t"
  23080. "cmp %[a], r9\n\t"
  23081. "blt L_sp_2048_mul_d_32_%=\n\t"
  23082. "str r3, [%[r]]\n\t"
  23083. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  23084. :
  23085. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  23086. );
  23087. }
  23088. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  23089. *
  23090. * d1 The high order half of the number to divide.
  23091. * d0 The low order half of the number to divide.
  23092. * div The divisor.
  23093. * returns the result of the division.
  23094. *
  23095. * Note that this is an approximate div. It may give an answer 1 larger.
  23096. */
  23097. SP_NOINLINE static sp_digit div_2048_word_32(sp_digit d1, sp_digit d0,
  23098. sp_digit div)
  23099. {
  23100. __asm__ __volatile__ (
  23101. "movs r3, #0\n\t"
  23102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23103. "lsrs r5, %[div], #1\n\t"
  23104. #else
  23105. "lsr r5, %[div], #1\n\t"
  23106. #endif
  23107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23108. "adds r5, r5, #1\n\t"
  23109. #else
  23110. "add r5, r5, #1\n\t"
  23111. #endif
  23112. "mov r8, %[d0]\n\t"
  23113. "mov r9, %[d1]\n\t"
  23114. "# Do top 32\n\t"
  23115. "movs r6, r5\n\t"
  23116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23117. "subs r6, r6, %[d1]\n\t"
  23118. #else
  23119. "sub r6, r6, %[d1]\n\t"
  23120. #endif
  23121. #ifdef WOLFSSL_KEIL
  23122. "sbcs r6, r6, r6\n\t"
  23123. #elif defined(__clang__)
  23124. "sbcs r6, r6\n\t"
  23125. #else
  23126. "sbc r6, r6\n\t"
  23127. #endif
  23128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23129. "adds r3, r3, r3\n\t"
  23130. #else
  23131. "add r3, r3, r3\n\t"
  23132. #endif
  23133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23134. "subs r3, r3, r6\n\t"
  23135. #else
  23136. "sub r3, r3, r6\n\t"
  23137. #endif
  23138. #ifdef WOLFSSL_KEIL
  23139. "ands r6, r6, r5\n\t"
  23140. #elif defined(__clang__)
  23141. "ands r6, r5\n\t"
  23142. #else
  23143. "and r6, r5\n\t"
  23144. #endif
  23145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23146. "subs %[d1], %[d1], r6\n\t"
  23147. #else
  23148. "sub %[d1], %[d1], r6\n\t"
  23149. #endif
  23150. "movs r4, #29\n\t"
  23151. "\n"
  23152. "L_div_2048_word_32_loop_%=:\n\t"
  23153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23154. "lsls %[d0], %[d0], #1\n\t"
  23155. #else
  23156. "lsl %[d0], %[d0], #1\n\t"
  23157. #endif
  23158. #ifdef WOLFSSL_KEIL
  23159. "adcs %[d1], %[d1], %[d1]\n\t"
  23160. #elif defined(__clang__)
  23161. "adcs %[d1], %[d1]\n\t"
  23162. #else
  23163. "adc %[d1], %[d1]\n\t"
  23164. #endif
  23165. "movs r6, r5\n\t"
  23166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23167. "subs r6, r6, %[d1]\n\t"
  23168. #else
  23169. "sub r6, r6, %[d1]\n\t"
  23170. #endif
  23171. #ifdef WOLFSSL_KEIL
  23172. "sbcs r6, r6, r6\n\t"
  23173. #elif defined(__clang__)
  23174. "sbcs r6, r6\n\t"
  23175. #else
  23176. "sbc r6, r6\n\t"
  23177. #endif
  23178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23179. "adds r3, r3, r3\n\t"
  23180. #else
  23181. "add r3, r3, r3\n\t"
  23182. #endif
  23183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23184. "subs r3, r3, r6\n\t"
  23185. #else
  23186. "sub r3, r3, r6\n\t"
  23187. #endif
  23188. #ifdef WOLFSSL_KEIL
  23189. "ands r6, r6, r5\n\t"
  23190. #elif defined(__clang__)
  23191. "ands r6, r5\n\t"
  23192. #else
  23193. "and r6, r5\n\t"
  23194. #endif
  23195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23196. "subs %[d1], %[d1], r6\n\t"
  23197. #else
  23198. "sub %[d1], %[d1], r6\n\t"
  23199. #endif
  23200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23201. "subs r4, r4, #1\n\t"
  23202. #else
  23203. "sub r4, r4, #1\n\t"
  23204. #endif
  23205. "bpl L_div_2048_word_32_loop_%=\n\t"
  23206. "movs r7, #0\n\t"
  23207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23208. "adds r3, r3, r3\n\t"
  23209. #else
  23210. "add r3, r3, r3\n\t"
  23211. #endif
  23212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23213. "adds r3, r3, #1\n\t"
  23214. #else
  23215. "add r3, r3, #1\n\t"
  23216. #endif
  23217. "# r * div - Start\n\t"
  23218. "uxth %[d1], r3\n\t"
  23219. "uxth r4, %[div]\n\t"
  23220. #ifdef WOLFSSL_KEIL
  23221. "muls r4, %[d1], r4\n\t"
  23222. #elif defined(__clang__)
  23223. "muls r4, %[d1]\n\t"
  23224. #else
  23225. "mul r4, %[d1]\n\t"
  23226. #endif
  23227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23228. "lsrs r6, %[div], #16\n\t"
  23229. #else
  23230. "lsr r6, %[div], #16\n\t"
  23231. #endif
  23232. #ifdef WOLFSSL_KEIL
  23233. "muls %[d1], r6, %[d1]\n\t"
  23234. #elif defined(__clang__)
  23235. "muls %[d1], r6\n\t"
  23236. #else
  23237. "mul %[d1], r6\n\t"
  23238. #endif
  23239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23240. "lsrs r5, %[d1], #16\n\t"
  23241. #else
  23242. "lsr r5, %[d1], #16\n\t"
  23243. #endif
  23244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23245. "lsls %[d1], %[d1], #16\n\t"
  23246. #else
  23247. "lsl %[d1], %[d1], #16\n\t"
  23248. #endif
  23249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23250. "adds r4, r4, %[d1]\n\t"
  23251. #else
  23252. "add r4, r4, %[d1]\n\t"
  23253. #endif
  23254. #ifdef WOLFSSL_KEIL
  23255. "adcs r5, r5, r7\n\t"
  23256. #elif defined(__clang__)
  23257. "adcs r5, r7\n\t"
  23258. #else
  23259. "adc r5, r7\n\t"
  23260. #endif
  23261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23262. "lsrs %[d1], r3, #16\n\t"
  23263. #else
  23264. "lsr %[d1], r3, #16\n\t"
  23265. #endif
  23266. #ifdef WOLFSSL_KEIL
  23267. "muls r6, %[d1], r6\n\t"
  23268. #elif defined(__clang__)
  23269. "muls r6, %[d1]\n\t"
  23270. #else
  23271. "mul r6, %[d1]\n\t"
  23272. #endif
  23273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23274. "adds r5, r5, r6\n\t"
  23275. #else
  23276. "add r5, r5, r6\n\t"
  23277. #endif
  23278. "uxth r6, %[div]\n\t"
  23279. #ifdef WOLFSSL_KEIL
  23280. "muls %[d1], r6, %[d1]\n\t"
  23281. #elif defined(__clang__)
  23282. "muls %[d1], r6\n\t"
  23283. #else
  23284. "mul %[d1], r6\n\t"
  23285. #endif
  23286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23287. "lsrs r6, %[d1], #16\n\t"
  23288. #else
  23289. "lsr r6, %[d1], #16\n\t"
  23290. #endif
  23291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23292. "lsls %[d1], %[d1], #16\n\t"
  23293. #else
  23294. "lsl %[d1], %[d1], #16\n\t"
  23295. #endif
  23296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23297. "adds r4, r4, %[d1]\n\t"
  23298. #else
  23299. "add r4, r4, %[d1]\n\t"
  23300. #endif
  23301. #ifdef WOLFSSL_KEIL
  23302. "adcs r5, r5, r6\n\t"
  23303. #elif defined(__clang__)
  23304. "adcs r5, r6\n\t"
  23305. #else
  23306. "adc r5, r6\n\t"
  23307. #endif
  23308. "# r * div - Done\n\t"
  23309. "mov %[d1], r8\n\t"
  23310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23311. "subs %[d1], %[d1], r4\n\t"
  23312. #else
  23313. "sub %[d1], %[d1], r4\n\t"
  23314. #endif
  23315. "movs r4, %[d1]\n\t"
  23316. "mov %[d1], r9\n\t"
  23317. #ifdef WOLFSSL_KEIL
  23318. "sbcs %[d1], %[d1], r5\n\t"
  23319. #elif defined(__clang__)
  23320. "sbcs %[d1], r5\n\t"
  23321. #else
  23322. "sbc %[d1], r5\n\t"
  23323. #endif
  23324. "movs r5, %[d1]\n\t"
  23325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23326. "adds r3, r3, r5\n\t"
  23327. #else
  23328. "add r3, r3, r5\n\t"
  23329. #endif
  23330. "# r * div - Start\n\t"
  23331. "uxth %[d1], r3\n\t"
  23332. "uxth r4, %[div]\n\t"
  23333. #ifdef WOLFSSL_KEIL
  23334. "muls r4, %[d1], r4\n\t"
  23335. #elif defined(__clang__)
  23336. "muls r4, %[d1]\n\t"
  23337. #else
  23338. "mul r4, %[d1]\n\t"
  23339. #endif
  23340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23341. "lsrs r6, %[div], #16\n\t"
  23342. #else
  23343. "lsr r6, %[div], #16\n\t"
  23344. #endif
  23345. #ifdef WOLFSSL_KEIL
  23346. "muls %[d1], r6, %[d1]\n\t"
  23347. #elif defined(__clang__)
  23348. "muls %[d1], r6\n\t"
  23349. #else
  23350. "mul %[d1], r6\n\t"
  23351. #endif
  23352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23353. "lsrs r5, %[d1], #16\n\t"
  23354. #else
  23355. "lsr r5, %[d1], #16\n\t"
  23356. #endif
  23357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23358. "lsls %[d1], %[d1], #16\n\t"
  23359. #else
  23360. "lsl %[d1], %[d1], #16\n\t"
  23361. #endif
  23362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23363. "adds r4, r4, %[d1]\n\t"
  23364. #else
  23365. "add r4, r4, %[d1]\n\t"
  23366. #endif
  23367. #ifdef WOLFSSL_KEIL
  23368. "adcs r5, r5, r7\n\t"
  23369. #elif defined(__clang__)
  23370. "adcs r5, r7\n\t"
  23371. #else
  23372. "adc r5, r7\n\t"
  23373. #endif
  23374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23375. "lsrs %[d1], r3, #16\n\t"
  23376. #else
  23377. "lsr %[d1], r3, #16\n\t"
  23378. #endif
  23379. #ifdef WOLFSSL_KEIL
  23380. "muls r6, %[d1], r6\n\t"
  23381. #elif defined(__clang__)
  23382. "muls r6, %[d1]\n\t"
  23383. #else
  23384. "mul r6, %[d1]\n\t"
  23385. #endif
  23386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23387. "adds r5, r5, r6\n\t"
  23388. #else
  23389. "add r5, r5, r6\n\t"
  23390. #endif
  23391. "uxth r6, %[div]\n\t"
  23392. #ifdef WOLFSSL_KEIL
  23393. "muls %[d1], r6, %[d1]\n\t"
  23394. #elif defined(__clang__)
  23395. "muls %[d1], r6\n\t"
  23396. #else
  23397. "mul %[d1], r6\n\t"
  23398. #endif
  23399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23400. "lsrs r6, %[d1], #16\n\t"
  23401. #else
  23402. "lsr r6, %[d1], #16\n\t"
  23403. #endif
  23404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23405. "lsls %[d1], %[d1], #16\n\t"
  23406. #else
  23407. "lsl %[d1], %[d1], #16\n\t"
  23408. #endif
  23409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23410. "adds r4, r4, %[d1]\n\t"
  23411. #else
  23412. "add r4, r4, %[d1]\n\t"
  23413. #endif
  23414. #ifdef WOLFSSL_KEIL
  23415. "adcs r5, r5, r6\n\t"
  23416. #elif defined(__clang__)
  23417. "adcs r5, r6\n\t"
  23418. #else
  23419. "adc r5, r6\n\t"
  23420. #endif
  23421. "# r * div - Done\n\t"
  23422. "mov %[d1], r8\n\t"
  23423. "mov r6, r9\n\t"
  23424. #ifdef WOLFSSL_KEIL
  23425. "subs r4, %[d1], r4\n\t"
  23426. #else
  23427. #ifdef __clang__
  23428. "subs r4, %[d1], r4\n\t"
  23429. #else
  23430. "sub r4, %[d1], r4\n\t"
  23431. #endif
  23432. #endif
  23433. #ifdef WOLFSSL_KEIL
  23434. "sbcs r6, r6, r5\n\t"
  23435. #elif defined(__clang__)
  23436. "sbcs r6, r5\n\t"
  23437. #else
  23438. "sbc r6, r5\n\t"
  23439. #endif
  23440. "movs r5, r6\n\t"
  23441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23442. "adds r3, r3, r5\n\t"
  23443. #else
  23444. "add r3, r3, r5\n\t"
  23445. #endif
  23446. "# r * div - Start\n\t"
  23447. "uxth %[d1], r3\n\t"
  23448. "uxth r4, %[div]\n\t"
  23449. #ifdef WOLFSSL_KEIL
  23450. "muls r4, %[d1], r4\n\t"
  23451. #elif defined(__clang__)
  23452. "muls r4, %[d1]\n\t"
  23453. #else
  23454. "mul r4, %[d1]\n\t"
  23455. #endif
  23456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23457. "lsrs r6, %[div], #16\n\t"
  23458. #else
  23459. "lsr r6, %[div], #16\n\t"
  23460. #endif
  23461. #ifdef WOLFSSL_KEIL
  23462. "muls %[d1], r6, %[d1]\n\t"
  23463. #elif defined(__clang__)
  23464. "muls %[d1], r6\n\t"
  23465. #else
  23466. "mul %[d1], r6\n\t"
  23467. #endif
  23468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23469. "lsrs r5, %[d1], #16\n\t"
  23470. #else
  23471. "lsr r5, %[d1], #16\n\t"
  23472. #endif
  23473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23474. "lsls %[d1], %[d1], #16\n\t"
  23475. #else
  23476. "lsl %[d1], %[d1], #16\n\t"
  23477. #endif
  23478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23479. "adds r4, r4, %[d1]\n\t"
  23480. #else
  23481. "add r4, r4, %[d1]\n\t"
  23482. #endif
  23483. #ifdef WOLFSSL_KEIL
  23484. "adcs r5, r5, r7\n\t"
  23485. #elif defined(__clang__)
  23486. "adcs r5, r7\n\t"
  23487. #else
  23488. "adc r5, r7\n\t"
  23489. #endif
  23490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23491. "lsrs %[d1], r3, #16\n\t"
  23492. #else
  23493. "lsr %[d1], r3, #16\n\t"
  23494. #endif
  23495. #ifdef WOLFSSL_KEIL
  23496. "muls r6, %[d1], r6\n\t"
  23497. #elif defined(__clang__)
  23498. "muls r6, %[d1]\n\t"
  23499. #else
  23500. "mul r6, %[d1]\n\t"
  23501. #endif
  23502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23503. "adds r5, r5, r6\n\t"
  23504. #else
  23505. "add r5, r5, r6\n\t"
  23506. #endif
  23507. "uxth r6, %[div]\n\t"
  23508. #ifdef WOLFSSL_KEIL
  23509. "muls %[d1], r6, %[d1]\n\t"
  23510. #elif defined(__clang__)
  23511. "muls %[d1], r6\n\t"
  23512. #else
  23513. "mul %[d1], r6\n\t"
  23514. #endif
  23515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23516. "lsrs r6, %[d1], #16\n\t"
  23517. #else
  23518. "lsr r6, %[d1], #16\n\t"
  23519. #endif
  23520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23521. "lsls %[d1], %[d1], #16\n\t"
  23522. #else
  23523. "lsl %[d1], %[d1], #16\n\t"
  23524. #endif
  23525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23526. "adds r4, r4, %[d1]\n\t"
  23527. #else
  23528. "add r4, r4, %[d1]\n\t"
  23529. #endif
  23530. #ifdef WOLFSSL_KEIL
  23531. "adcs r5, r5, r6\n\t"
  23532. #elif defined(__clang__)
  23533. "adcs r5, r6\n\t"
  23534. #else
  23535. "adc r5, r6\n\t"
  23536. #endif
  23537. "# r * div - Done\n\t"
  23538. "mov %[d1], r8\n\t"
  23539. "mov r6, r9\n\t"
  23540. #ifdef WOLFSSL_KEIL
  23541. "subs r4, %[d1], r4\n\t"
  23542. #else
  23543. #ifdef __clang__
  23544. "subs r4, %[d1], r4\n\t"
  23545. #else
  23546. "sub r4, %[d1], r4\n\t"
  23547. #endif
  23548. #endif
  23549. #ifdef WOLFSSL_KEIL
  23550. "sbcs r6, r6, r5\n\t"
  23551. #elif defined(__clang__)
  23552. "sbcs r6, r5\n\t"
  23553. #else
  23554. "sbc r6, r5\n\t"
  23555. #endif
  23556. "movs r5, r6\n\t"
  23557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23558. "adds r3, r3, r5\n\t"
  23559. #else
  23560. "add r3, r3, r5\n\t"
  23561. #endif
  23562. "# r * div - Start\n\t"
  23563. "uxth %[d1], r3\n\t"
  23564. "uxth r4, %[div]\n\t"
  23565. #ifdef WOLFSSL_KEIL
  23566. "muls r4, %[d1], r4\n\t"
  23567. #elif defined(__clang__)
  23568. "muls r4, %[d1]\n\t"
  23569. #else
  23570. "mul r4, %[d1]\n\t"
  23571. #endif
  23572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23573. "lsrs r6, %[div], #16\n\t"
  23574. #else
  23575. "lsr r6, %[div], #16\n\t"
  23576. #endif
  23577. #ifdef WOLFSSL_KEIL
  23578. "muls %[d1], r6, %[d1]\n\t"
  23579. #elif defined(__clang__)
  23580. "muls %[d1], r6\n\t"
  23581. #else
  23582. "mul %[d1], r6\n\t"
  23583. #endif
  23584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23585. "lsrs r5, %[d1], #16\n\t"
  23586. #else
  23587. "lsr r5, %[d1], #16\n\t"
  23588. #endif
  23589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23590. "lsls %[d1], %[d1], #16\n\t"
  23591. #else
  23592. "lsl %[d1], %[d1], #16\n\t"
  23593. #endif
  23594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23595. "adds r4, r4, %[d1]\n\t"
  23596. #else
  23597. "add r4, r4, %[d1]\n\t"
  23598. #endif
  23599. #ifdef WOLFSSL_KEIL
  23600. "adcs r5, r5, r7\n\t"
  23601. #elif defined(__clang__)
  23602. "adcs r5, r7\n\t"
  23603. #else
  23604. "adc r5, r7\n\t"
  23605. #endif
  23606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23607. "lsrs %[d1], r3, #16\n\t"
  23608. #else
  23609. "lsr %[d1], r3, #16\n\t"
  23610. #endif
  23611. #ifdef WOLFSSL_KEIL
  23612. "muls r6, %[d1], r6\n\t"
  23613. #elif defined(__clang__)
  23614. "muls r6, %[d1]\n\t"
  23615. #else
  23616. "mul r6, %[d1]\n\t"
  23617. #endif
  23618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23619. "adds r5, r5, r6\n\t"
  23620. #else
  23621. "add r5, r5, r6\n\t"
  23622. #endif
  23623. "uxth r6, %[div]\n\t"
  23624. #ifdef WOLFSSL_KEIL
  23625. "muls %[d1], r6, %[d1]\n\t"
  23626. #elif defined(__clang__)
  23627. "muls %[d1], r6\n\t"
  23628. #else
  23629. "mul %[d1], r6\n\t"
  23630. #endif
  23631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23632. "lsrs r6, %[d1], #16\n\t"
  23633. #else
  23634. "lsr r6, %[d1], #16\n\t"
  23635. #endif
  23636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23637. "lsls %[d1], %[d1], #16\n\t"
  23638. #else
  23639. "lsl %[d1], %[d1], #16\n\t"
  23640. #endif
  23641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23642. "adds r4, r4, %[d1]\n\t"
  23643. #else
  23644. "add r4, r4, %[d1]\n\t"
  23645. #endif
  23646. #ifdef WOLFSSL_KEIL
  23647. "adcs r5, r5, r6\n\t"
  23648. #elif defined(__clang__)
  23649. "adcs r5, r6\n\t"
  23650. #else
  23651. "adc r5, r6\n\t"
  23652. #endif
  23653. "# r * div - Done\n\t"
  23654. "mov %[d1], r8\n\t"
  23655. "mov r6, r9\n\t"
  23656. #ifdef WOLFSSL_KEIL
  23657. "subs r4, %[d1], r4\n\t"
  23658. #else
  23659. #ifdef __clang__
  23660. "subs r4, %[d1], r4\n\t"
  23661. #else
  23662. "sub r4, %[d1], r4\n\t"
  23663. #endif
  23664. #endif
  23665. #ifdef WOLFSSL_KEIL
  23666. "sbcs r6, r6, r5\n\t"
  23667. #elif defined(__clang__)
  23668. "sbcs r6, r5\n\t"
  23669. #else
  23670. "sbc r6, r5\n\t"
  23671. #endif
  23672. "movs r5, r6\n\t"
  23673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23674. "adds r3, r3, r5\n\t"
  23675. #else
  23676. "add r3, r3, r5\n\t"
  23677. #endif
  23678. "movs r6, %[div]\n\t"
  23679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23680. "subs r6, r6, r4\n\t"
  23681. #else
  23682. "sub r6, r6, r4\n\t"
  23683. #endif
  23684. #ifdef WOLFSSL_KEIL
  23685. "sbcs r6, r6, r6\n\t"
  23686. #elif defined(__clang__)
  23687. "sbcs r6, r6\n\t"
  23688. #else
  23689. "sbc r6, r6\n\t"
  23690. #endif
  23691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23692. "subs r3, r3, r6\n\t"
  23693. #else
  23694. "sub r3, r3, r6\n\t"
  23695. #endif
  23696. "movs %[d1], r3\n\t"
  23697. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  23698. :
  23699. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  23700. );
  23701. return (uint32_t)(size_t)d1;
  23702. }
  23703. /* Compare a with b in constant time.
  23704. *
  23705. * a A single precision integer.
  23706. * b A single precision integer.
  23707. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  23708. * respectively.
  23709. */
  23710. SP_NOINLINE static sp_int32 sp_2048_cmp_32(const sp_digit* a, const sp_digit* b)
  23711. {
  23712. __asm__ __volatile__ (
  23713. "movs r2, #0\n\t"
  23714. "movs r3, #0\n\t"
  23715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23716. "mvns r3, r3\n\t"
  23717. #else
  23718. "mvn r3, r3\n\t"
  23719. #endif
  23720. "movs r6, #0x7c\n\t"
  23721. "\n"
  23722. "L_sp_2048_cmp_32_words_%=:\n\t"
  23723. "ldr r7, [%[a], r6]\n\t"
  23724. "ldr r5, [%[b], r6]\n\t"
  23725. #ifdef WOLFSSL_KEIL
  23726. "ands r7, r7, r3\n\t"
  23727. #elif defined(__clang__)
  23728. "ands r7, r3\n\t"
  23729. #else
  23730. "and r7, r3\n\t"
  23731. #endif
  23732. #ifdef WOLFSSL_KEIL
  23733. "ands r5, r5, r3\n\t"
  23734. #elif defined(__clang__)
  23735. "ands r5, r3\n\t"
  23736. #else
  23737. "and r5, r3\n\t"
  23738. #endif
  23739. "movs r4, r7\n\t"
  23740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23741. "subs r7, r7, r5\n\t"
  23742. #else
  23743. "sub r7, r7, r5\n\t"
  23744. #endif
  23745. #ifdef WOLFSSL_KEIL
  23746. "sbcs r7, r7, r7\n\t"
  23747. #elif defined(__clang__)
  23748. "sbcs r7, r7\n\t"
  23749. #else
  23750. "sbc r7, r7\n\t"
  23751. #endif
  23752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23753. "adds r2, r2, r7\n\t"
  23754. #else
  23755. "add r2, r2, r7\n\t"
  23756. #endif
  23757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23758. "mvns r7, r7\n\t"
  23759. #else
  23760. "mvn r7, r7\n\t"
  23761. #endif
  23762. #ifdef WOLFSSL_KEIL
  23763. "ands r3, r3, r7\n\t"
  23764. #elif defined(__clang__)
  23765. "ands r3, r7\n\t"
  23766. #else
  23767. "and r3, r7\n\t"
  23768. #endif
  23769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23770. "subs r5, r5, r4\n\t"
  23771. #else
  23772. "sub r5, r5, r4\n\t"
  23773. #endif
  23774. #ifdef WOLFSSL_KEIL
  23775. "sbcs r7, r7, r7\n\t"
  23776. #elif defined(__clang__)
  23777. "sbcs r7, r7\n\t"
  23778. #else
  23779. "sbc r7, r7\n\t"
  23780. #endif
  23781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23782. "subs r2, r2, r7\n\t"
  23783. #else
  23784. "sub r2, r2, r7\n\t"
  23785. #endif
  23786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23787. "mvns r7, r7\n\t"
  23788. #else
  23789. "mvn r7, r7\n\t"
  23790. #endif
  23791. #ifdef WOLFSSL_KEIL
  23792. "ands r3, r3, r7\n\t"
  23793. #elif defined(__clang__)
  23794. "ands r3, r7\n\t"
  23795. #else
  23796. "and r3, r7\n\t"
  23797. #endif
  23798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  23799. "subs r6, r6, #4\n\t"
  23800. #else
  23801. "sub r6, r6, #4\n\t"
  23802. #endif
  23803. "bge L_sp_2048_cmp_32_words_%=\n\t"
  23804. "movs %[a], r2\n\t"
  23805. : [a] "+l" (a), [b] "+l" (b)
  23806. :
  23807. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  23808. );
  23809. return (uint32_t)(size_t)a;
  23810. }
  23811. /* Divide d in a and put remainder into r (m*d + r = a)
  23812. * m is not calculated as it is not needed at this time.
  23813. *
  23814. * a Number to be divided.
  23815. * d Number to divide with.
  23816. * m Multiplier result.
  23817. * r Remainder from the division.
  23818. * returns MP_OKAY indicating success.
  23819. */
  23820. static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m,
  23821. sp_digit* r)
  23822. {
  23823. sp_digit t1[64], t2[33];
  23824. sp_digit div, r1;
  23825. int i;
  23826. (void)m;
  23827. div = d[31];
  23828. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  23829. r1 = sp_2048_cmp_32(&t1[32], d) >= 0;
  23830. sp_2048_cond_sub_32(&t1[32], &t1[32], d, (sp_digit)0 - r1);
  23831. for (i = 31; i >= 0; i--) {
  23832. sp_digit mask = 0 - (t1[32 + i] == div);
  23833. sp_digit hi = t1[32 + i] + mask;
  23834. r1 = div_2048_word_32(hi, t1[32 + i - 1], div);
  23835. r1 |= mask;
  23836. sp_2048_mul_d_32(t2, d, r1);
  23837. t1[32 + i] += sp_2048_sub_in_place_32(&t1[i], t2);
  23838. t1[32 + i] -= t2[32];
  23839. sp_2048_mask_32(t2, d, t1[32 + i]);
  23840. t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
  23841. sp_2048_mask_32(t2, d, t1[32 + i]);
  23842. t1[32 + i] += sp_2048_add_32(&t1[i], &t1[i], t2);
  23843. }
  23844. r1 = sp_2048_cmp_32(t1, d) >= 0;
  23845. sp_2048_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  23846. return MP_OKAY;
  23847. }
  23848. /* Reduce a modulo m into r. (r = a mod m)
  23849. *
  23850. * r A single precision number that is the reduced result.
  23851. * a A single precision number that is to be reduced.
  23852. * m A single precision number that is the modulus to reduce with.
  23853. * returns MP_OKAY indicating success.
  23854. */
  23855. static WC_INLINE int sp_2048_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  23856. {
  23857. int ret;
  23858. ret = sp_2048_div_32(a, m, NULL, r);
  23859. return ret;
  23860. }
  23861. #ifdef WOLFSSL_SP_SMALL
  23862. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  23863. *
  23864. * r A single precision number that is the result of the operation.
  23865. * a A single precision number being exponentiated.
  23866. * e A single precision number that is the exponent.
  23867. * bits The number of bits in the exponent.
  23868. * m A single precision number that is the modulus.
  23869. * returns 0 on success.
  23870. * returns MEMORY_E on dynamic memory allocation failure.
  23871. * returns MP_VAL when base is even or exponent is 0.
  23872. */
  23873. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  23874. int bits, const sp_digit* m, int reduceA)
  23875. {
  23876. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  23877. sp_digit* td = NULL;
  23878. #else
  23879. sp_digit td[16 * 64];
  23880. #endif
  23881. sp_digit* t[16];
  23882. sp_digit* norm = NULL;
  23883. sp_digit mp = 1;
  23884. sp_digit n;
  23885. sp_digit mask;
  23886. int i;
  23887. int c;
  23888. byte y;
  23889. int err = MP_OKAY;
  23890. if (bits == 0) {
  23891. err = MP_VAL;
  23892. }
  23893. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  23894. if (err == MP_OKAY) {
  23895. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 64), NULL,
  23896. DYNAMIC_TYPE_TMP_BUFFER);
  23897. if (td == NULL)
  23898. err = MEMORY_E;
  23899. }
  23900. #endif
  23901. if (err == MP_OKAY) {
  23902. norm = td;
  23903. for (i=0; i<16; i++) {
  23904. t[i] = td + i * 64;
  23905. }
  23906. sp_2048_mont_setup(m, &mp);
  23907. sp_2048_mont_norm_32(norm, m);
  23908. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  23909. if (reduceA != 0) {
  23910. err = sp_2048_mod_32(t[1] + 32, a, m);
  23911. if (err == MP_OKAY) {
  23912. err = sp_2048_mod_32(t[1], t[1], m);
  23913. }
  23914. }
  23915. else {
  23916. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  23917. err = sp_2048_mod_32(t[1], t[1], m);
  23918. }
  23919. }
  23920. if (err == MP_OKAY) {
  23921. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  23922. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  23923. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  23924. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  23925. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  23926. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  23927. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  23928. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  23929. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  23930. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  23931. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  23932. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  23933. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  23934. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  23935. i = (bits - 1) / 32;
  23936. n = e[i--];
  23937. c = bits & 31;
  23938. if (c == 0) {
  23939. c = 32;
  23940. }
  23941. c -= bits % 4;
  23942. if (c == 32) {
  23943. c = 28;
  23944. }
  23945. if (c < 0) {
  23946. /* Number of bits in top word is less than number needed. */
  23947. c = -c;
  23948. y = (byte)(n << c);
  23949. n = e[i--];
  23950. y |= (byte)(n >> (64 - c));
  23951. n <<= c;
  23952. c = 64 - c;
  23953. }
  23954. else if (c == 0) {
  23955. /* All bits in top word used. */
  23956. y = (byte)n;
  23957. }
  23958. else {
  23959. y = (byte)(n >> c);
  23960. n <<= 32 - c;
  23961. }
  23962. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  23963. for (; i>=0 || c>=4; ) {
  23964. if (c == 0) {
  23965. n = e[i--];
  23966. y = (byte)(n >> 28);
  23967. n <<= 4;
  23968. c = 28;
  23969. }
  23970. else if (c < 4) {
  23971. y = (byte)(n >> 28);
  23972. n = e[i--];
  23973. c = 4 - c;
  23974. y |= (byte)(n >> (32 - c));
  23975. n <<= c;
  23976. c = 32 - c;
  23977. }
  23978. else {
  23979. y = (byte)((n >> 28) & 0xf);
  23980. n <<= 4;
  23981. c -= 4;
  23982. }
  23983. sp_2048_mont_sqr_32(r, r, m, mp);
  23984. sp_2048_mont_sqr_32(r, r, m, mp);
  23985. sp_2048_mont_sqr_32(r, r, m, mp);
  23986. sp_2048_mont_sqr_32(r, r, m, mp);
  23987. sp_2048_mont_mul_32(r, r, t[y], m, mp);
  23988. }
  23989. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  23990. sp_2048_mont_reduce_32(r, m, mp);
  23991. mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
  23992. sp_2048_cond_sub_32(r, r, m, mask);
  23993. }
  23994. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  23995. if (td != NULL)
  23996. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  23997. #endif
  23998. return err;
  23999. }
  24000. #else
  24001. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  24002. *
  24003. * r A single precision number that is the result of the operation.
  24004. * a A single precision number being exponentiated.
  24005. * e A single precision number that is the exponent.
  24006. * bits The number of bits in the exponent.
  24007. * m A single precision number that is the modulus.
  24008. * returns 0 on success.
  24009. * returns MEMORY_E on dynamic memory allocation failure.
  24010. * returns MP_VAL when base is even or exponent is 0.
  24011. */
  24012. static int sp_2048_mod_exp_32(sp_digit* r, const sp_digit* a, const sp_digit* e,
  24013. int bits, const sp_digit* m, int reduceA)
  24014. {
  24015. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  24016. sp_digit* td = NULL;
  24017. #else
  24018. sp_digit td[32 * 64];
  24019. #endif
  24020. sp_digit* t[32];
  24021. sp_digit* norm = NULL;
  24022. sp_digit mp = 1;
  24023. sp_digit n;
  24024. sp_digit mask;
  24025. int i;
  24026. int c;
  24027. byte y;
  24028. int err = MP_OKAY;
  24029. if (bits == 0) {
  24030. err = MP_VAL;
  24031. }
  24032. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  24033. if (err == MP_OKAY) {
  24034. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 64), NULL,
  24035. DYNAMIC_TYPE_TMP_BUFFER);
  24036. if (td == NULL)
  24037. err = MEMORY_E;
  24038. }
  24039. #endif
  24040. if (err == MP_OKAY) {
  24041. norm = td;
  24042. for (i=0; i<32; i++) {
  24043. t[i] = td + i * 64;
  24044. }
  24045. sp_2048_mont_setup(m, &mp);
  24046. sp_2048_mont_norm_32(norm, m);
  24047. XMEMSET(t[1], 0, sizeof(sp_digit) * 32U);
  24048. if (reduceA != 0) {
  24049. err = sp_2048_mod_32(t[1] + 32, a, m);
  24050. if (err == MP_OKAY) {
  24051. err = sp_2048_mod_32(t[1], t[1], m);
  24052. }
  24053. }
  24054. else {
  24055. XMEMCPY(t[1] + 32, a, sizeof(sp_digit) * 32);
  24056. err = sp_2048_mod_32(t[1], t[1], m);
  24057. }
  24058. }
  24059. if (err == MP_OKAY) {
  24060. sp_2048_mont_sqr_32(t[ 2], t[ 1], m, mp);
  24061. sp_2048_mont_mul_32(t[ 3], t[ 2], t[ 1], m, mp);
  24062. sp_2048_mont_sqr_32(t[ 4], t[ 2], m, mp);
  24063. sp_2048_mont_mul_32(t[ 5], t[ 3], t[ 2], m, mp);
  24064. sp_2048_mont_sqr_32(t[ 6], t[ 3], m, mp);
  24065. sp_2048_mont_mul_32(t[ 7], t[ 4], t[ 3], m, mp);
  24066. sp_2048_mont_sqr_32(t[ 8], t[ 4], m, mp);
  24067. sp_2048_mont_mul_32(t[ 9], t[ 5], t[ 4], m, mp);
  24068. sp_2048_mont_sqr_32(t[10], t[ 5], m, mp);
  24069. sp_2048_mont_mul_32(t[11], t[ 6], t[ 5], m, mp);
  24070. sp_2048_mont_sqr_32(t[12], t[ 6], m, mp);
  24071. sp_2048_mont_mul_32(t[13], t[ 7], t[ 6], m, mp);
  24072. sp_2048_mont_sqr_32(t[14], t[ 7], m, mp);
  24073. sp_2048_mont_mul_32(t[15], t[ 8], t[ 7], m, mp);
  24074. sp_2048_mont_sqr_32(t[16], t[ 8], m, mp);
  24075. sp_2048_mont_mul_32(t[17], t[ 9], t[ 8], m, mp);
  24076. sp_2048_mont_sqr_32(t[18], t[ 9], m, mp);
  24077. sp_2048_mont_mul_32(t[19], t[10], t[ 9], m, mp);
  24078. sp_2048_mont_sqr_32(t[20], t[10], m, mp);
  24079. sp_2048_mont_mul_32(t[21], t[11], t[10], m, mp);
  24080. sp_2048_mont_sqr_32(t[22], t[11], m, mp);
  24081. sp_2048_mont_mul_32(t[23], t[12], t[11], m, mp);
  24082. sp_2048_mont_sqr_32(t[24], t[12], m, mp);
  24083. sp_2048_mont_mul_32(t[25], t[13], t[12], m, mp);
  24084. sp_2048_mont_sqr_32(t[26], t[13], m, mp);
  24085. sp_2048_mont_mul_32(t[27], t[14], t[13], m, mp);
  24086. sp_2048_mont_sqr_32(t[28], t[14], m, mp);
  24087. sp_2048_mont_mul_32(t[29], t[15], t[14], m, mp);
  24088. sp_2048_mont_sqr_32(t[30], t[15], m, mp);
  24089. sp_2048_mont_mul_32(t[31], t[16], t[15], m, mp);
  24090. i = (bits - 1) / 32;
  24091. n = e[i--];
  24092. c = bits & 31;
  24093. if (c == 0) {
  24094. c = 32;
  24095. }
  24096. c -= bits % 5;
  24097. if (c == 32) {
  24098. c = 27;
  24099. }
  24100. if (c < 0) {
  24101. /* Number of bits in top word is less than number needed. */
  24102. c = -c;
  24103. y = (byte)(n << c);
  24104. n = e[i--];
  24105. y |= (byte)(n >> (64 - c));
  24106. n <<= c;
  24107. c = 64 - c;
  24108. }
  24109. else if (c == 0) {
  24110. /* All bits in top word used. */
  24111. y = (byte)n;
  24112. }
  24113. else {
  24114. y = (byte)(n >> c);
  24115. n <<= 32 - c;
  24116. }
  24117. XMEMCPY(r, t[y], sizeof(sp_digit) * 32);
  24118. for (; i>=0 || c>=5; ) {
  24119. if (c == 0) {
  24120. n = e[i--];
  24121. y = (byte)(n >> 27);
  24122. n <<= 5;
  24123. c = 27;
  24124. }
  24125. else if (c < 5) {
  24126. y = (byte)(n >> 27);
  24127. n = e[i--];
  24128. c = 5 - c;
  24129. y |= (byte)(n >> (32 - c));
  24130. n <<= c;
  24131. c = 32 - c;
  24132. }
  24133. else {
  24134. y = (byte)((n >> 27) & 0x1f);
  24135. n <<= 5;
  24136. c -= 5;
  24137. }
  24138. sp_2048_mont_sqr_32(r, r, m, mp);
  24139. sp_2048_mont_sqr_32(r, r, m, mp);
  24140. sp_2048_mont_sqr_32(r, r, m, mp);
  24141. sp_2048_mont_sqr_32(r, r, m, mp);
  24142. sp_2048_mont_sqr_32(r, r, m, mp);
  24143. sp_2048_mont_mul_32(r, r, t[y], m, mp);
  24144. }
  24145. XMEMSET(&r[32], 0, sizeof(sp_digit) * 32U);
  24146. sp_2048_mont_reduce_32(r, m, mp);
  24147. mask = 0 - (sp_2048_cmp_32(r, m) >= 0);
  24148. sp_2048_cond_sub_32(r, r, m, mask);
  24149. }
  24150. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  24151. if (td != NULL)
  24152. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  24153. #endif
  24154. return err;
  24155. }
  24156. #endif /* WOLFSSL_SP_SMALL */
  24157. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  24158. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  24159. /* r = 2^n mod m where n is the number of bits to reduce by.
  24160. * Given m must be 2048 bits, just need to subtract.
  24161. *
  24162. * r A single precision number.
  24163. * m A single precision number.
  24164. */
  24165. static void sp_2048_mont_norm_64(sp_digit* r, const sp_digit* m)
  24166. {
  24167. XMEMSET(r, 0, sizeof(sp_digit) * 64);
  24168. /* r = 2^n mod m */
  24169. sp_2048_sub_in_place_64(r, m);
  24170. }
  24171. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  24172. /* Conditionally subtract b from a using the mask m.
  24173. * m is -1 to subtract and 0 when not copying.
  24174. *
  24175. * r A single precision number representing condition subtract result.
  24176. * a A single precision number to subtract from.
  24177. * b A single precision number to subtract.
  24178. * m Mask value to apply.
  24179. */
  24180. SP_NOINLINE static sp_digit sp_2048_cond_sub_64(sp_digit* r, const sp_digit* a,
  24181. const sp_digit* b, sp_digit m)
  24182. {
  24183. __asm__ __volatile__ (
  24184. "movs r4, #0\n\t"
  24185. "movs r5, #0xff\n\t"
  24186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24187. "adds r5, r5, #1\n\t"
  24188. #else
  24189. "add r5, r5, #1\n\t"
  24190. #endif
  24191. "mov r8, r5\n\t"
  24192. "movs r7, #0\n\t"
  24193. "\n"
  24194. "L_sp_2048_cond_sub_64_words_%=:\n\t"
  24195. "ldr r6, [%[b], r7]\n\t"
  24196. #ifdef WOLFSSL_KEIL
  24197. "ands r6, r6, %[m]\n\t"
  24198. #elif defined(__clang__)
  24199. "ands r6, %[m]\n\t"
  24200. #else
  24201. "and r6, %[m]\n\t"
  24202. #endif
  24203. "movs r5, #0\n\t"
  24204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24205. "subs r5, r5, r4\n\t"
  24206. #else
  24207. "sub r5, r5, r4\n\t"
  24208. #endif
  24209. "ldr r5, [%[a], r7]\n\t"
  24210. #ifdef WOLFSSL_KEIL
  24211. "sbcs r5, r5, r6\n\t"
  24212. #elif defined(__clang__)
  24213. "sbcs r5, r6\n\t"
  24214. #else
  24215. "sbc r5, r6\n\t"
  24216. #endif
  24217. #ifdef WOLFSSL_KEIL
  24218. "sbcs r4, r4, r4\n\t"
  24219. #elif defined(__clang__)
  24220. "sbcs r4, r4\n\t"
  24221. #else
  24222. "sbc r4, r4\n\t"
  24223. #endif
  24224. "str r5, [%[r], r7]\n\t"
  24225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24226. "adds r7, r7, #4\n\t"
  24227. #else
  24228. "add r7, r7, #4\n\t"
  24229. #endif
  24230. "cmp r7, r8\n\t"
  24231. "blt L_sp_2048_cond_sub_64_words_%=\n\t"
  24232. "movs %[r], r4\n\t"
  24233. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  24234. :
  24235. : "memory", "r4", "r5", "r6", "r7", "r8"
  24236. );
  24237. return (uint32_t)(size_t)r;
  24238. }
  24239. /* Reduce the number back to 2048 bits using Montgomery reduction.
  24240. *
  24241. * a A single precision number to reduce in place.
  24242. * m The single precision number representing the modulus.
  24243. * mp The digit representing the negative inverse of m mod 2^n.
  24244. */
  24245. SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a, const sp_digit* m,
  24246. sp_digit mp)
  24247. {
  24248. __asm__ __volatile__ (
  24249. "movs r7, #0\n\t"
  24250. "mov r8, %[mp]\n\t"
  24251. "mov r12, r7\n\t"
  24252. "mov lr, %[m]\n\t"
  24253. "mov r9, %[a]\n\t"
  24254. "mov r11, %[a]\n\t"
  24255. "movs r5, #0xfc\n\t"
  24256. "movs r6, #0xff\n\t"
  24257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24258. "adds r6, r6, #1\n\t"
  24259. #else
  24260. "add r6, r6, #1\n\t"
  24261. #endif
  24262. "add r9, r9, r5\n\t"
  24263. "add r11, r11, r6\n\t"
  24264. "\n"
  24265. "L_sp_2048_mont_reduce_64_mod_%=:\n\t"
  24266. "movs r7, #0\n\t"
  24267. "movs r4, #0\n\t"
  24268. "# a[i] += m[0] * mu\n\t"
  24269. "ldm %[m]!, {%[mp]}\n\t"
  24270. "ldm %[a]!, {r3}\n\t"
  24271. "# mu = a[i] * mp\n\t"
  24272. "mov r5, r8\n\t"
  24273. #ifdef WOLFSSL_KEIL
  24274. "muls r5, r3, r5\n\t"
  24275. #elif defined(__clang__)
  24276. "muls r5, r3\n\t"
  24277. #else
  24278. "mul r5, r3\n\t"
  24279. #endif
  24280. "mov r10, r5\n\t"
  24281. "# Multiply m[0] and mu - Start\n\t"
  24282. "mov r5, r10\n\t"
  24283. "uxth r6, %[mp]\n\t"
  24284. "uxth r5, r5\n\t"
  24285. #ifdef WOLFSSL_KEIL
  24286. "muls r6, r5, r6\n\t"
  24287. #elif defined(__clang__)
  24288. "muls r6, r5\n\t"
  24289. #else
  24290. "mul r6, r5\n\t"
  24291. #endif
  24292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24293. "adds r3, r3, r6\n\t"
  24294. #else
  24295. "add r3, r3, r6\n\t"
  24296. #endif
  24297. #ifdef WOLFSSL_KEIL
  24298. "adcs r4, r4, r7\n\t"
  24299. #elif defined(__clang__)
  24300. "adcs r4, r7\n\t"
  24301. #else
  24302. "adc r4, r7\n\t"
  24303. #endif
  24304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24305. "lsrs r6, %[mp], #16\n\t"
  24306. #else
  24307. "lsr r6, %[mp], #16\n\t"
  24308. #endif
  24309. #ifdef WOLFSSL_KEIL
  24310. "muls r5, r6, r5\n\t"
  24311. #elif defined(__clang__)
  24312. "muls r5, r6\n\t"
  24313. #else
  24314. "mul r5, r6\n\t"
  24315. #endif
  24316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24317. "lsrs r6, r5, #16\n\t"
  24318. #else
  24319. "lsr r6, r5, #16\n\t"
  24320. #endif
  24321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24322. "lsls r5, r5, #16\n\t"
  24323. #else
  24324. "lsl r5, r5, #16\n\t"
  24325. #endif
  24326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24327. "adds r3, r3, r5\n\t"
  24328. #else
  24329. "add r3, r3, r5\n\t"
  24330. #endif
  24331. #ifdef WOLFSSL_KEIL
  24332. "adcs r4, r4, r6\n\t"
  24333. #elif defined(__clang__)
  24334. "adcs r4, r6\n\t"
  24335. #else
  24336. "adc r4, r6\n\t"
  24337. #endif
  24338. "mov r5, r10\n\t"
  24339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24340. "lsrs r6, %[mp], #16\n\t"
  24341. #else
  24342. "lsr r6, %[mp], #16\n\t"
  24343. #endif
  24344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24345. "lsrs r5, r5, #16\n\t"
  24346. #else
  24347. "lsr r5, r5, #16\n\t"
  24348. #endif
  24349. #ifdef WOLFSSL_KEIL
  24350. "muls r6, r5, r6\n\t"
  24351. #elif defined(__clang__)
  24352. "muls r6, r5\n\t"
  24353. #else
  24354. "mul r6, r5\n\t"
  24355. #endif
  24356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24357. "adds r4, r4, r6\n\t"
  24358. #else
  24359. "add r4, r4, r6\n\t"
  24360. #endif
  24361. "uxth r6, %[mp]\n\t"
  24362. #ifdef WOLFSSL_KEIL
  24363. "muls r5, r6, r5\n\t"
  24364. #elif defined(__clang__)
  24365. "muls r5, r6\n\t"
  24366. #else
  24367. "mul r5, r6\n\t"
  24368. #endif
  24369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24370. "lsrs r6, r5, #16\n\t"
  24371. #else
  24372. "lsr r6, r5, #16\n\t"
  24373. #endif
  24374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24375. "lsls r5, r5, #16\n\t"
  24376. #else
  24377. "lsl r5, r5, #16\n\t"
  24378. #endif
  24379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24380. "adds r3, r3, r5\n\t"
  24381. #else
  24382. "add r3, r3, r5\n\t"
  24383. #endif
  24384. #ifdef WOLFSSL_KEIL
  24385. "adcs r4, r4, r6\n\t"
  24386. #elif defined(__clang__)
  24387. "adcs r4, r6\n\t"
  24388. #else
  24389. "adc r4, r6\n\t"
  24390. #endif
  24391. "# Multiply m[0] and mu - Done\n\t"
  24392. "\n"
  24393. "L_sp_2048_mont_reduce_64_word_%=:\n\t"
  24394. "# a[i+j] += m[j] * mu\n\t"
  24395. "ldr r3, [%[a]]\n\t"
  24396. "ldm %[m]!, {%[mp]}\n\t"
  24397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24398. "adds r3, r3, r4\n\t"
  24399. #else
  24400. "add r3, r3, r4\n\t"
  24401. #endif
  24402. "movs r4, #0\n\t"
  24403. #ifdef WOLFSSL_KEIL
  24404. "adcs r4, r4, r7\n\t"
  24405. #elif defined(__clang__)
  24406. "adcs r4, r7\n\t"
  24407. #else
  24408. "adc r4, r7\n\t"
  24409. #endif
  24410. "# Multiply m[j] and mu - Start\n\t"
  24411. "mov r5, r10\n\t"
  24412. "uxth r6, %[mp]\n\t"
  24413. "uxth r5, r5\n\t"
  24414. #ifdef WOLFSSL_KEIL
  24415. "muls r6, r5, r6\n\t"
  24416. #elif defined(__clang__)
  24417. "muls r6, r5\n\t"
  24418. #else
  24419. "mul r6, r5\n\t"
  24420. #endif
  24421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24422. "adds r3, r3, r6\n\t"
  24423. #else
  24424. "add r3, r3, r6\n\t"
  24425. #endif
  24426. #ifdef WOLFSSL_KEIL
  24427. "adcs r4, r4, r7\n\t"
  24428. #elif defined(__clang__)
  24429. "adcs r4, r7\n\t"
  24430. #else
  24431. "adc r4, r7\n\t"
  24432. #endif
  24433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24434. "lsrs r6, %[mp], #16\n\t"
  24435. #else
  24436. "lsr r6, %[mp], #16\n\t"
  24437. #endif
  24438. #ifdef WOLFSSL_KEIL
  24439. "muls r5, r6, r5\n\t"
  24440. #elif defined(__clang__)
  24441. "muls r5, r6\n\t"
  24442. #else
  24443. "mul r5, r6\n\t"
  24444. #endif
  24445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24446. "lsrs r6, r5, #16\n\t"
  24447. #else
  24448. "lsr r6, r5, #16\n\t"
  24449. #endif
  24450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24451. "lsls r5, r5, #16\n\t"
  24452. #else
  24453. "lsl r5, r5, #16\n\t"
  24454. #endif
  24455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24456. "adds r3, r3, r5\n\t"
  24457. #else
  24458. "add r3, r3, r5\n\t"
  24459. #endif
  24460. #ifdef WOLFSSL_KEIL
  24461. "adcs r4, r4, r6\n\t"
  24462. #elif defined(__clang__)
  24463. "adcs r4, r6\n\t"
  24464. #else
  24465. "adc r4, r6\n\t"
  24466. #endif
  24467. "mov r5, r10\n\t"
  24468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24469. "lsrs r6, %[mp], #16\n\t"
  24470. #else
  24471. "lsr r6, %[mp], #16\n\t"
  24472. #endif
  24473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24474. "lsrs r5, r5, #16\n\t"
  24475. #else
  24476. "lsr r5, r5, #16\n\t"
  24477. #endif
  24478. #ifdef WOLFSSL_KEIL
  24479. "muls r6, r5, r6\n\t"
  24480. #elif defined(__clang__)
  24481. "muls r6, r5\n\t"
  24482. #else
  24483. "mul r6, r5\n\t"
  24484. #endif
  24485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24486. "adds r4, r4, r6\n\t"
  24487. #else
  24488. "add r4, r4, r6\n\t"
  24489. #endif
  24490. "uxth r6, %[mp]\n\t"
  24491. #ifdef WOLFSSL_KEIL
  24492. "muls r5, r6, r5\n\t"
  24493. #elif defined(__clang__)
  24494. "muls r5, r6\n\t"
  24495. #else
  24496. "mul r5, r6\n\t"
  24497. #endif
  24498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24499. "lsrs r6, r5, #16\n\t"
  24500. #else
  24501. "lsr r6, r5, #16\n\t"
  24502. #endif
  24503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24504. "lsls r5, r5, #16\n\t"
  24505. #else
  24506. "lsl r5, r5, #16\n\t"
  24507. #endif
  24508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24509. "adds r3, r3, r5\n\t"
  24510. #else
  24511. "add r3, r3, r5\n\t"
  24512. #endif
  24513. #ifdef WOLFSSL_KEIL
  24514. "adcs r4, r4, r6\n\t"
  24515. #elif defined(__clang__)
  24516. "adcs r4, r6\n\t"
  24517. #else
  24518. "adc r4, r6\n\t"
  24519. #endif
  24520. "# Multiply m[j] and mu - Done\n\t"
  24521. "stm %[a]!, {r3}\n\t"
  24522. "cmp %[a], r9\n\t"
  24523. "blt L_sp_2048_mont_reduce_64_word_%=\n\t"
  24524. "# a[i+63] += m[63] * mu\n\t"
  24525. "ldr %[mp], [%[m]]\n\t"
  24526. "mov r3, r12\n\t"
  24527. "# Multiply m[63] and mu - Start\n\t"
  24528. "mov r5, r10\n\t"
  24529. "uxth r6, %[mp]\n\t"
  24530. "uxth r5, r5\n\t"
  24531. #ifdef WOLFSSL_KEIL
  24532. "muls r6, r5, r6\n\t"
  24533. #elif defined(__clang__)
  24534. "muls r6, r5\n\t"
  24535. #else
  24536. "mul r6, r5\n\t"
  24537. #endif
  24538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24539. "adds r4, r4, r6\n\t"
  24540. #else
  24541. "add r4, r4, r6\n\t"
  24542. #endif
  24543. #ifdef WOLFSSL_KEIL
  24544. "adcs r3, r3, r7\n\t"
  24545. #elif defined(__clang__)
  24546. "adcs r3, r7\n\t"
  24547. #else
  24548. "adc r3, r7\n\t"
  24549. #endif
  24550. #ifdef WOLFSSL_KEIL
  24551. "adcs r7, r7, r7\n\t"
  24552. #elif defined(__clang__)
  24553. "adcs r7, r7\n\t"
  24554. #else
  24555. "adc r7, r7\n\t"
  24556. #endif
  24557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24558. "lsrs r6, %[mp], #16\n\t"
  24559. #else
  24560. "lsr r6, %[mp], #16\n\t"
  24561. #endif
  24562. #ifdef WOLFSSL_KEIL
  24563. "muls r5, r6, r5\n\t"
  24564. #elif defined(__clang__)
  24565. "muls r5, r6\n\t"
  24566. #else
  24567. "mul r5, r6\n\t"
  24568. #endif
  24569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24570. "lsrs r6, r5, #16\n\t"
  24571. #else
  24572. "lsr r6, r5, #16\n\t"
  24573. #endif
  24574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24575. "lsls r5, r5, #16\n\t"
  24576. #else
  24577. "lsl r5, r5, #16\n\t"
  24578. #endif
  24579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24580. "adds r4, r4, r5\n\t"
  24581. #else
  24582. "add r4, r4, r5\n\t"
  24583. #endif
  24584. #ifdef WOLFSSL_KEIL
  24585. "adcs r3, r3, r6\n\t"
  24586. #elif defined(__clang__)
  24587. "adcs r3, r6\n\t"
  24588. #else
  24589. "adc r3, r6\n\t"
  24590. #endif
  24591. #ifdef WOLFSSL_KEIL
  24592. "adcs r7, r7, r7\n\t"
  24593. #elif defined(__clang__)
  24594. "adcs r7, r7\n\t"
  24595. #else
  24596. "adc r7, r7\n\t"
  24597. #endif
  24598. "mov r5, r10\n\t"
  24599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24600. "lsrs r6, %[mp], #16\n\t"
  24601. #else
  24602. "lsr r6, %[mp], #16\n\t"
  24603. #endif
  24604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24605. "lsrs r5, r5, #16\n\t"
  24606. #else
  24607. "lsr r5, r5, #16\n\t"
  24608. #endif
  24609. #ifdef WOLFSSL_KEIL
  24610. "muls r6, r5, r6\n\t"
  24611. #elif defined(__clang__)
  24612. "muls r6, r5\n\t"
  24613. #else
  24614. "mul r6, r5\n\t"
  24615. #endif
  24616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24617. "adds r3, r3, r6\n\t"
  24618. #else
  24619. "add r3, r3, r6\n\t"
  24620. #endif
  24621. #ifdef WOLFSSL_KEIL
  24622. "adcs r7, r7, r7\n\t"
  24623. #elif defined(__clang__)
  24624. "adcs r7, r7\n\t"
  24625. #else
  24626. "adc r7, r7\n\t"
  24627. #endif
  24628. "uxth r6, %[mp]\n\t"
  24629. #ifdef WOLFSSL_KEIL
  24630. "muls r5, r6, r5\n\t"
  24631. #elif defined(__clang__)
  24632. "muls r5, r6\n\t"
  24633. #else
  24634. "mul r5, r6\n\t"
  24635. #endif
  24636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24637. "lsrs r6, r5, #16\n\t"
  24638. #else
  24639. "lsr r6, r5, #16\n\t"
  24640. #endif
  24641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24642. "lsls r5, r5, #16\n\t"
  24643. #else
  24644. "lsl r5, r5, #16\n\t"
  24645. #endif
  24646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24647. "adds r4, r4, r5\n\t"
  24648. #else
  24649. "add r4, r4, r5\n\t"
  24650. #endif
  24651. #ifdef WOLFSSL_KEIL
  24652. "adcs r3, r3, r6\n\t"
  24653. #elif defined(__clang__)
  24654. "adcs r3, r6\n\t"
  24655. #else
  24656. "adc r3, r6\n\t"
  24657. #endif
  24658. #ifdef WOLFSSL_KEIL
  24659. "adcs r7, r7, r7\n\t"
  24660. #elif defined(__clang__)
  24661. "adcs r7, r7\n\t"
  24662. #else
  24663. "adc r7, r7\n\t"
  24664. #endif
  24665. "# Multiply m[63] and mu - Done\n\t"
  24666. "ldr r5, [%[a]]\n\t"
  24667. "ldr r6, [%[a], #4]\n\t"
  24668. "movs %[mp], #0\n\t"
  24669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24670. "adds r5, r5, r4\n\t"
  24671. #else
  24672. "add r5, r5, r4\n\t"
  24673. #endif
  24674. #ifdef WOLFSSL_KEIL
  24675. "adcs r6, r6, r3\n\t"
  24676. #elif defined(__clang__)
  24677. "adcs r6, r3\n\t"
  24678. #else
  24679. "adc r6, r3\n\t"
  24680. #endif
  24681. #ifdef WOLFSSL_KEIL
  24682. "adcs r7, r7, %[mp]\n\t"
  24683. #elif defined(__clang__)
  24684. "adcs r7, %[mp]\n\t"
  24685. #else
  24686. "adc r7, %[mp]\n\t"
  24687. #endif
  24688. "stm %[a]!, {r5, r6}\n\t"
  24689. "# i += 1\n\t"
  24690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24691. "subs %[a], %[a], #4\n\t"
  24692. #else
  24693. "sub %[a], %[a], #4\n\t"
  24694. #endif
  24695. "movs r3, #0xfc\n\t"
  24696. "mov r9, %[a]\n\t"
  24697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24698. "subs %[a], %[a], r3\n\t"
  24699. #else
  24700. "sub %[a], %[a], r3\n\t"
  24701. #endif
  24702. "mov r12, r7\n\t"
  24703. "mov %[m], lr\n\t"
  24704. "cmp r11, %[a]\n\t"
  24705. "bgt L_sp_2048_mont_reduce_64_mod_%=\n\t"
  24706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24707. "negs r7, r7\n\t"
  24708. #else
  24709. "neg r7, r7\n\t"
  24710. #endif
  24711. "# Subtract masked modulus\n\t"
  24712. "movs r4, #0xff\n\t"
  24713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24714. "adds r4, r4, #1\n\t"
  24715. #else
  24716. "add r4, r4, #1\n\t"
  24717. #endif
  24718. "movs %[mp], #0\n\t"
  24719. "movs r3, #0\n\t"
  24720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24721. "subs %[a], %[a], r4\n\t"
  24722. #else
  24723. "sub %[a], %[a], r4\n\t"
  24724. #endif
  24725. #ifndef WOLFSSL_SP_LARGE_CODE
  24726. "\n"
  24727. "L_sp_2048_mont_reduce_64_sub_mask_%=:\n\t"
  24728. "ldm %[m]!, {r6}\n\t"
  24729. "movs r5, #0\n\t"
  24730. #ifdef WOLFSSL_KEIL
  24731. "ands r6, r6, r7\n\t"
  24732. #elif defined(__clang__)
  24733. "ands r6, r7\n\t"
  24734. #else
  24735. "and r6, r7\n\t"
  24736. #endif
  24737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24738. "subs r5, r5, %[mp]\n\t"
  24739. #else
  24740. "sub r5, r5, %[mp]\n\t"
  24741. #endif
  24742. "ldr r5, [%[a], r4]\n\t"
  24743. #ifdef WOLFSSL_KEIL
  24744. "sbcs r5, r5, r6\n\t"
  24745. #elif defined(__clang__)
  24746. "sbcs r5, r6\n\t"
  24747. #else
  24748. "sbc r5, r6\n\t"
  24749. #endif
  24750. #ifdef WOLFSSL_KEIL
  24751. "sbcs %[mp], %[mp], %[mp]\n\t"
  24752. #elif defined(__clang__)
  24753. "sbcs %[mp], %[mp]\n\t"
  24754. #else
  24755. "sbc %[mp], %[mp]\n\t"
  24756. #endif
  24757. "stm %[a]!, {r5}\n\t"
  24758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24759. "adds r3, r3, #4\n\t"
  24760. #else
  24761. "add r3, r3, #4\n\t"
  24762. #endif
  24763. "cmp r3, r4\n\t"
  24764. "blt L_sp_2048_mont_reduce_64_sub_mask_%=\n\t"
  24765. #else /* WOLFSSL_SP_LARGE_CODE */
  24766. "ldm %[m]!, {r6}\n\t"
  24767. #ifdef WOLFSSL_KEIL
  24768. "ands r6, r6, r7\n\t"
  24769. #elif defined(__clang__)
  24770. "ands r6, r7\n\t"
  24771. #else
  24772. "and r6, r7\n\t"
  24773. #endif
  24774. "ldr r5, [%[a], r4]\n\t"
  24775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  24776. "subs r5, r5, r6\n\t"
  24777. #else
  24778. "sub r5, r5, r6\n\t"
  24779. #endif
  24780. "stm %[a]!, {r5}\n\t"
  24781. "ldm %[m]!, {r6}\n\t"
  24782. #ifdef WOLFSSL_KEIL
  24783. "ands r6, r6, r7\n\t"
  24784. #elif defined(__clang__)
  24785. "ands r6, r7\n\t"
  24786. #else
  24787. "and r6, r7\n\t"
  24788. #endif
  24789. "ldr r5, [%[a], r4]\n\t"
  24790. #ifdef WOLFSSL_KEIL
  24791. "sbcs r5, r5, r6\n\t"
  24792. #elif defined(__clang__)
  24793. "sbcs r5, r6\n\t"
  24794. #else
  24795. "sbc r5, r6\n\t"
  24796. #endif
  24797. "stm %[a]!, {r5}\n\t"
  24798. "ldm %[m]!, {r6}\n\t"
  24799. #ifdef WOLFSSL_KEIL
  24800. "ands r6, r6, r7\n\t"
  24801. #elif defined(__clang__)
  24802. "ands r6, r7\n\t"
  24803. #else
  24804. "and r6, r7\n\t"
  24805. #endif
  24806. "ldr r5, [%[a], r4]\n\t"
  24807. #ifdef WOLFSSL_KEIL
  24808. "sbcs r5, r5, r6\n\t"
  24809. #elif defined(__clang__)
  24810. "sbcs r5, r6\n\t"
  24811. #else
  24812. "sbc r5, r6\n\t"
  24813. #endif
  24814. "stm %[a]!, {r5}\n\t"
  24815. "ldm %[m]!, {r6}\n\t"
  24816. #ifdef WOLFSSL_KEIL
  24817. "ands r6, r6, r7\n\t"
  24818. #elif defined(__clang__)
  24819. "ands r6, r7\n\t"
  24820. #else
  24821. "and r6, r7\n\t"
  24822. #endif
  24823. "ldr r5, [%[a], r4]\n\t"
  24824. #ifdef WOLFSSL_KEIL
  24825. "sbcs r5, r5, r6\n\t"
  24826. #elif defined(__clang__)
  24827. "sbcs r5, r6\n\t"
  24828. #else
  24829. "sbc r5, r6\n\t"
  24830. #endif
  24831. "stm %[a]!, {r5}\n\t"
  24832. "ldm %[m]!, {r6}\n\t"
  24833. #ifdef WOLFSSL_KEIL
  24834. "ands r6, r6, r7\n\t"
  24835. #elif defined(__clang__)
  24836. "ands r6, r7\n\t"
  24837. #else
  24838. "and r6, r7\n\t"
  24839. #endif
  24840. "ldr r5, [%[a], r4]\n\t"
  24841. #ifdef WOLFSSL_KEIL
  24842. "sbcs r5, r5, r6\n\t"
  24843. #elif defined(__clang__)
  24844. "sbcs r5, r6\n\t"
  24845. #else
  24846. "sbc r5, r6\n\t"
  24847. #endif
  24848. "stm %[a]!, {r5}\n\t"
  24849. "ldm %[m]!, {r6}\n\t"
  24850. #ifdef WOLFSSL_KEIL
  24851. "ands r6, r6, r7\n\t"
  24852. #elif defined(__clang__)
  24853. "ands r6, r7\n\t"
  24854. #else
  24855. "and r6, r7\n\t"
  24856. #endif
  24857. "ldr r5, [%[a], r4]\n\t"
  24858. #ifdef WOLFSSL_KEIL
  24859. "sbcs r5, r5, r6\n\t"
  24860. #elif defined(__clang__)
  24861. "sbcs r5, r6\n\t"
  24862. #else
  24863. "sbc r5, r6\n\t"
  24864. #endif
  24865. "stm %[a]!, {r5}\n\t"
  24866. "ldm %[m]!, {r6}\n\t"
  24867. #ifdef WOLFSSL_KEIL
  24868. "ands r6, r6, r7\n\t"
  24869. #elif defined(__clang__)
  24870. "ands r6, r7\n\t"
  24871. #else
  24872. "and r6, r7\n\t"
  24873. #endif
  24874. "ldr r5, [%[a], r4]\n\t"
  24875. #ifdef WOLFSSL_KEIL
  24876. "sbcs r5, r5, r6\n\t"
  24877. #elif defined(__clang__)
  24878. "sbcs r5, r6\n\t"
  24879. #else
  24880. "sbc r5, r6\n\t"
  24881. #endif
  24882. "stm %[a]!, {r5}\n\t"
  24883. "ldm %[m]!, {r6}\n\t"
  24884. #ifdef WOLFSSL_KEIL
  24885. "ands r6, r6, r7\n\t"
  24886. #elif defined(__clang__)
  24887. "ands r6, r7\n\t"
  24888. #else
  24889. "and r6, r7\n\t"
  24890. #endif
  24891. "ldr r5, [%[a], r4]\n\t"
  24892. #ifdef WOLFSSL_KEIL
  24893. "sbcs r5, r5, r6\n\t"
  24894. #elif defined(__clang__)
  24895. "sbcs r5, r6\n\t"
  24896. #else
  24897. "sbc r5, r6\n\t"
  24898. #endif
  24899. "stm %[a]!, {r5}\n\t"
  24900. "ldm %[m]!, {r6}\n\t"
  24901. #ifdef WOLFSSL_KEIL
  24902. "ands r6, r6, r7\n\t"
  24903. #elif defined(__clang__)
  24904. "ands r6, r7\n\t"
  24905. #else
  24906. "and r6, r7\n\t"
  24907. #endif
  24908. "ldr r5, [%[a], r4]\n\t"
  24909. #ifdef WOLFSSL_KEIL
  24910. "sbcs r5, r5, r6\n\t"
  24911. #elif defined(__clang__)
  24912. "sbcs r5, r6\n\t"
  24913. #else
  24914. "sbc r5, r6\n\t"
  24915. #endif
  24916. "stm %[a]!, {r5}\n\t"
  24917. "ldm %[m]!, {r6}\n\t"
  24918. #ifdef WOLFSSL_KEIL
  24919. "ands r6, r6, r7\n\t"
  24920. #elif defined(__clang__)
  24921. "ands r6, r7\n\t"
  24922. #else
  24923. "and r6, r7\n\t"
  24924. #endif
  24925. "ldr r5, [%[a], r4]\n\t"
  24926. #ifdef WOLFSSL_KEIL
  24927. "sbcs r5, r5, r6\n\t"
  24928. #elif defined(__clang__)
  24929. "sbcs r5, r6\n\t"
  24930. #else
  24931. "sbc r5, r6\n\t"
  24932. #endif
  24933. "stm %[a]!, {r5}\n\t"
  24934. "ldm %[m]!, {r6}\n\t"
  24935. #ifdef WOLFSSL_KEIL
  24936. "ands r6, r6, r7\n\t"
  24937. #elif defined(__clang__)
  24938. "ands r6, r7\n\t"
  24939. #else
  24940. "and r6, r7\n\t"
  24941. #endif
  24942. "ldr r5, [%[a], r4]\n\t"
  24943. #ifdef WOLFSSL_KEIL
  24944. "sbcs r5, r5, r6\n\t"
  24945. #elif defined(__clang__)
  24946. "sbcs r5, r6\n\t"
  24947. #else
  24948. "sbc r5, r6\n\t"
  24949. #endif
  24950. "stm %[a]!, {r5}\n\t"
  24951. "ldm %[m]!, {r6}\n\t"
  24952. #ifdef WOLFSSL_KEIL
  24953. "ands r6, r6, r7\n\t"
  24954. #elif defined(__clang__)
  24955. "ands r6, r7\n\t"
  24956. #else
  24957. "and r6, r7\n\t"
  24958. #endif
  24959. "ldr r5, [%[a], r4]\n\t"
  24960. #ifdef WOLFSSL_KEIL
  24961. "sbcs r5, r5, r6\n\t"
  24962. #elif defined(__clang__)
  24963. "sbcs r5, r6\n\t"
  24964. #else
  24965. "sbc r5, r6\n\t"
  24966. #endif
  24967. "stm %[a]!, {r5}\n\t"
  24968. "ldm %[m]!, {r6}\n\t"
  24969. #ifdef WOLFSSL_KEIL
  24970. "ands r6, r6, r7\n\t"
  24971. #elif defined(__clang__)
  24972. "ands r6, r7\n\t"
  24973. #else
  24974. "and r6, r7\n\t"
  24975. #endif
  24976. "ldr r5, [%[a], r4]\n\t"
  24977. #ifdef WOLFSSL_KEIL
  24978. "sbcs r5, r5, r6\n\t"
  24979. #elif defined(__clang__)
  24980. "sbcs r5, r6\n\t"
  24981. #else
  24982. "sbc r5, r6\n\t"
  24983. #endif
  24984. "stm %[a]!, {r5}\n\t"
  24985. "ldm %[m]!, {r6}\n\t"
  24986. #ifdef WOLFSSL_KEIL
  24987. "ands r6, r6, r7\n\t"
  24988. #elif defined(__clang__)
  24989. "ands r6, r7\n\t"
  24990. #else
  24991. "and r6, r7\n\t"
  24992. #endif
  24993. "ldr r5, [%[a], r4]\n\t"
  24994. #ifdef WOLFSSL_KEIL
  24995. "sbcs r5, r5, r6\n\t"
  24996. #elif defined(__clang__)
  24997. "sbcs r5, r6\n\t"
  24998. #else
  24999. "sbc r5, r6\n\t"
  25000. #endif
  25001. "stm %[a]!, {r5}\n\t"
  25002. "ldm %[m]!, {r6}\n\t"
  25003. #ifdef WOLFSSL_KEIL
  25004. "ands r6, r6, r7\n\t"
  25005. #elif defined(__clang__)
  25006. "ands r6, r7\n\t"
  25007. #else
  25008. "and r6, r7\n\t"
  25009. #endif
  25010. "ldr r5, [%[a], r4]\n\t"
  25011. #ifdef WOLFSSL_KEIL
  25012. "sbcs r5, r5, r6\n\t"
  25013. #elif defined(__clang__)
  25014. "sbcs r5, r6\n\t"
  25015. #else
  25016. "sbc r5, r6\n\t"
  25017. #endif
  25018. "stm %[a]!, {r5}\n\t"
  25019. "ldm %[m]!, {r6}\n\t"
  25020. #ifdef WOLFSSL_KEIL
  25021. "ands r6, r6, r7\n\t"
  25022. #elif defined(__clang__)
  25023. "ands r6, r7\n\t"
  25024. #else
  25025. "and r6, r7\n\t"
  25026. #endif
  25027. "ldr r5, [%[a], r4]\n\t"
  25028. #ifdef WOLFSSL_KEIL
  25029. "sbcs r5, r5, r6\n\t"
  25030. #elif defined(__clang__)
  25031. "sbcs r5, r6\n\t"
  25032. #else
  25033. "sbc r5, r6\n\t"
  25034. #endif
  25035. "stm %[a]!, {r5}\n\t"
  25036. "ldm %[m]!, {r6}\n\t"
  25037. #ifdef WOLFSSL_KEIL
  25038. "ands r6, r6, r7\n\t"
  25039. #elif defined(__clang__)
  25040. "ands r6, r7\n\t"
  25041. #else
  25042. "and r6, r7\n\t"
  25043. #endif
  25044. "ldr r5, [%[a], r4]\n\t"
  25045. #ifdef WOLFSSL_KEIL
  25046. "sbcs r5, r5, r6\n\t"
  25047. #elif defined(__clang__)
  25048. "sbcs r5, r6\n\t"
  25049. #else
  25050. "sbc r5, r6\n\t"
  25051. #endif
  25052. "stm %[a]!, {r5}\n\t"
  25053. "ldm %[m]!, {r6}\n\t"
  25054. #ifdef WOLFSSL_KEIL
  25055. "ands r6, r6, r7\n\t"
  25056. #elif defined(__clang__)
  25057. "ands r6, r7\n\t"
  25058. #else
  25059. "and r6, r7\n\t"
  25060. #endif
  25061. "ldr r5, [%[a], r4]\n\t"
  25062. #ifdef WOLFSSL_KEIL
  25063. "sbcs r5, r5, r6\n\t"
  25064. #elif defined(__clang__)
  25065. "sbcs r5, r6\n\t"
  25066. #else
  25067. "sbc r5, r6\n\t"
  25068. #endif
  25069. "stm %[a]!, {r5}\n\t"
  25070. "ldm %[m]!, {r6}\n\t"
  25071. #ifdef WOLFSSL_KEIL
  25072. "ands r6, r6, r7\n\t"
  25073. #elif defined(__clang__)
  25074. "ands r6, r7\n\t"
  25075. #else
  25076. "and r6, r7\n\t"
  25077. #endif
  25078. "ldr r5, [%[a], r4]\n\t"
  25079. #ifdef WOLFSSL_KEIL
  25080. "sbcs r5, r5, r6\n\t"
  25081. #elif defined(__clang__)
  25082. "sbcs r5, r6\n\t"
  25083. #else
  25084. "sbc r5, r6\n\t"
  25085. #endif
  25086. "stm %[a]!, {r5}\n\t"
  25087. "ldm %[m]!, {r6}\n\t"
  25088. #ifdef WOLFSSL_KEIL
  25089. "ands r6, r6, r7\n\t"
  25090. #elif defined(__clang__)
  25091. "ands r6, r7\n\t"
  25092. #else
  25093. "and r6, r7\n\t"
  25094. #endif
  25095. "ldr r5, [%[a], r4]\n\t"
  25096. #ifdef WOLFSSL_KEIL
  25097. "sbcs r5, r5, r6\n\t"
  25098. #elif defined(__clang__)
  25099. "sbcs r5, r6\n\t"
  25100. #else
  25101. "sbc r5, r6\n\t"
  25102. #endif
  25103. "stm %[a]!, {r5}\n\t"
  25104. "ldm %[m]!, {r6}\n\t"
  25105. #ifdef WOLFSSL_KEIL
  25106. "ands r6, r6, r7\n\t"
  25107. #elif defined(__clang__)
  25108. "ands r6, r7\n\t"
  25109. #else
  25110. "and r6, r7\n\t"
  25111. #endif
  25112. "ldr r5, [%[a], r4]\n\t"
  25113. #ifdef WOLFSSL_KEIL
  25114. "sbcs r5, r5, r6\n\t"
  25115. #elif defined(__clang__)
  25116. "sbcs r5, r6\n\t"
  25117. #else
  25118. "sbc r5, r6\n\t"
  25119. #endif
  25120. "stm %[a]!, {r5}\n\t"
  25121. "ldm %[m]!, {r6}\n\t"
  25122. #ifdef WOLFSSL_KEIL
  25123. "ands r6, r6, r7\n\t"
  25124. #elif defined(__clang__)
  25125. "ands r6, r7\n\t"
  25126. #else
  25127. "and r6, r7\n\t"
  25128. #endif
  25129. "ldr r5, [%[a], r4]\n\t"
  25130. #ifdef WOLFSSL_KEIL
  25131. "sbcs r5, r5, r6\n\t"
  25132. #elif defined(__clang__)
  25133. "sbcs r5, r6\n\t"
  25134. #else
  25135. "sbc r5, r6\n\t"
  25136. #endif
  25137. "stm %[a]!, {r5}\n\t"
  25138. "ldm %[m]!, {r6}\n\t"
  25139. #ifdef WOLFSSL_KEIL
  25140. "ands r6, r6, r7\n\t"
  25141. #elif defined(__clang__)
  25142. "ands r6, r7\n\t"
  25143. #else
  25144. "and r6, r7\n\t"
  25145. #endif
  25146. "ldr r5, [%[a], r4]\n\t"
  25147. #ifdef WOLFSSL_KEIL
  25148. "sbcs r5, r5, r6\n\t"
  25149. #elif defined(__clang__)
  25150. "sbcs r5, r6\n\t"
  25151. #else
  25152. "sbc r5, r6\n\t"
  25153. #endif
  25154. "stm %[a]!, {r5}\n\t"
  25155. "ldm %[m]!, {r6}\n\t"
  25156. #ifdef WOLFSSL_KEIL
  25157. "ands r6, r6, r7\n\t"
  25158. #elif defined(__clang__)
  25159. "ands r6, r7\n\t"
  25160. #else
  25161. "and r6, r7\n\t"
  25162. #endif
  25163. "ldr r5, [%[a], r4]\n\t"
  25164. #ifdef WOLFSSL_KEIL
  25165. "sbcs r5, r5, r6\n\t"
  25166. #elif defined(__clang__)
  25167. "sbcs r5, r6\n\t"
  25168. #else
  25169. "sbc r5, r6\n\t"
  25170. #endif
  25171. "stm %[a]!, {r5}\n\t"
  25172. "ldm %[m]!, {r6}\n\t"
  25173. #ifdef WOLFSSL_KEIL
  25174. "ands r6, r6, r7\n\t"
  25175. #elif defined(__clang__)
  25176. "ands r6, r7\n\t"
  25177. #else
  25178. "and r6, r7\n\t"
  25179. #endif
  25180. "ldr r5, [%[a], r4]\n\t"
  25181. #ifdef WOLFSSL_KEIL
  25182. "sbcs r5, r5, r6\n\t"
  25183. #elif defined(__clang__)
  25184. "sbcs r5, r6\n\t"
  25185. #else
  25186. "sbc r5, r6\n\t"
  25187. #endif
  25188. "stm %[a]!, {r5}\n\t"
  25189. "ldm %[m]!, {r6}\n\t"
  25190. #ifdef WOLFSSL_KEIL
  25191. "ands r6, r6, r7\n\t"
  25192. #elif defined(__clang__)
  25193. "ands r6, r7\n\t"
  25194. #else
  25195. "and r6, r7\n\t"
  25196. #endif
  25197. "ldr r5, [%[a], r4]\n\t"
  25198. #ifdef WOLFSSL_KEIL
  25199. "sbcs r5, r5, r6\n\t"
  25200. #elif defined(__clang__)
  25201. "sbcs r5, r6\n\t"
  25202. #else
  25203. "sbc r5, r6\n\t"
  25204. #endif
  25205. "stm %[a]!, {r5}\n\t"
  25206. "ldm %[m]!, {r6}\n\t"
  25207. #ifdef WOLFSSL_KEIL
  25208. "ands r6, r6, r7\n\t"
  25209. #elif defined(__clang__)
  25210. "ands r6, r7\n\t"
  25211. #else
  25212. "and r6, r7\n\t"
  25213. #endif
  25214. "ldr r5, [%[a], r4]\n\t"
  25215. #ifdef WOLFSSL_KEIL
  25216. "sbcs r5, r5, r6\n\t"
  25217. #elif defined(__clang__)
  25218. "sbcs r5, r6\n\t"
  25219. #else
  25220. "sbc r5, r6\n\t"
  25221. #endif
  25222. "stm %[a]!, {r5}\n\t"
  25223. "ldm %[m]!, {r6}\n\t"
  25224. #ifdef WOLFSSL_KEIL
  25225. "ands r6, r6, r7\n\t"
  25226. #elif defined(__clang__)
  25227. "ands r6, r7\n\t"
  25228. #else
  25229. "and r6, r7\n\t"
  25230. #endif
  25231. "ldr r5, [%[a], r4]\n\t"
  25232. #ifdef WOLFSSL_KEIL
  25233. "sbcs r5, r5, r6\n\t"
  25234. #elif defined(__clang__)
  25235. "sbcs r5, r6\n\t"
  25236. #else
  25237. "sbc r5, r6\n\t"
  25238. #endif
  25239. "stm %[a]!, {r5}\n\t"
  25240. "ldm %[m]!, {r6}\n\t"
  25241. #ifdef WOLFSSL_KEIL
  25242. "ands r6, r6, r7\n\t"
  25243. #elif defined(__clang__)
  25244. "ands r6, r7\n\t"
  25245. #else
  25246. "and r6, r7\n\t"
  25247. #endif
  25248. "ldr r5, [%[a], r4]\n\t"
  25249. #ifdef WOLFSSL_KEIL
  25250. "sbcs r5, r5, r6\n\t"
  25251. #elif defined(__clang__)
  25252. "sbcs r5, r6\n\t"
  25253. #else
  25254. "sbc r5, r6\n\t"
  25255. #endif
  25256. "stm %[a]!, {r5}\n\t"
  25257. "ldm %[m]!, {r6}\n\t"
  25258. #ifdef WOLFSSL_KEIL
  25259. "ands r6, r6, r7\n\t"
  25260. #elif defined(__clang__)
  25261. "ands r6, r7\n\t"
  25262. #else
  25263. "and r6, r7\n\t"
  25264. #endif
  25265. "ldr r5, [%[a], r4]\n\t"
  25266. #ifdef WOLFSSL_KEIL
  25267. "sbcs r5, r5, r6\n\t"
  25268. #elif defined(__clang__)
  25269. "sbcs r5, r6\n\t"
  25270. #else
  25271. "sbc r5, r6\n\t"
  25272. #endif
  25273. "stm %[a]!, {r5}\n\t"
  25274. "ldm %[m]!, {r6}\n\t"
  25275. #ifdef WOLFSSL_KEIL
  25276. "ands r6, r6, r7\n\t"
  25277. #elif defined(__clang__)
  25278. "ands r6, r7\n\t"
  25279. #else
  25280. "and r6, r7\n\t"
  25281. #endif
  25282. "ldr r5, [%[a], r4]\n\t"
  25283. #ifdef WOLFSSL_KEIL
  25284. "sbcs r5, r5, r6\n\t"
  25285. #elif defined(__clang__)
  25286. "sbcs r5, r6\n\t"
  25287. #else
  25288. "sbc r5, r6\n\t"
  25289. #endif
  25290. "stm %[a]!, {r5}\n\t"
  25291. "ldm %[m]!, {r6}\n\t"
  25292. #ifdef WOLFSSL_KEIL
  25293. "ands r6, r6, r7\n\t"
  25294. #elif defined(__clang__)
  25295. "ands r6, r7\n\t"
  25296. #else
  25297. "and r6, r7\n\t"
  25298. #endif
  25299. "ldr r5, [%[a], r4]\n\t"
  25300. #ifdef WOLFSSL_KEIL
  25301. "sbcs r5, r5, r6\n\t"
  25302. #elif defined(__clang__)
  25303. "sbcs r5, r6\n\t"
  25304. #else
  25305. "sbc r5, r6\n\t"
  25306. #endif
  25307. "stm %[a]!, {r5}\n\t"
  25308. "ldm %[m]!, {r6}\n\t"
  25309. #ifdef WOLFSSL_KEIL
  25310. "ands r6, r6, r7\n\t"
  25311. #elif defined(__clang__)
  25312. "ands r6, r7\n\t"
  25313. #else
  25314. "and r6, r7\n\t"
  25315. #endif
  25316. "ldr r5, [%[a], r4]\n\t"
  25317. #ifdef WOLFSSL_KEIL
  25318. "sbcs r5, r5, r6\n\t"
  25319. #elif defined(__clang__)
  25320. "sbcs r5, r6\n\t"
  25321. #else
  25322. "sbc r5, r6\n\t"
  25323. #endif
  25324. "stm %[a]!, {r5}\n\t"
  25325. "ldm %[m]!, {r6}\n\t"
  25326. #ifdef WOLFSSL_KEIL
  25327. "ands r6, r6, r7\n\t"
  25328. #elif defined(__clang__)
  25329. "ands r6, r7\n\t"
  25330. #else
  25331. "and r6, r7\n\t"
  25332. #endif
  25333. "ldr r5, [%[a], r4]\n\t"
  25334. #ifdef WOLFSSL_KEIL
  25335. "sbcs r5, r5, r6\n\t"
  25336. #elif defined(__clang__)
  25337. "sbcs r5, r6\n\t"
  25338. #else
  25339. "sbc r5, r6\n\t"
  25340. #endif
  25341. "stm %[a]!, {r5}\n\t"
  25342. "ldm %[m]!, {r6}\n\t"
  25343. #ifdef WOLFSSL_KEIL
  25344. "ands r6, r6, r7\n\t"
  25345. #elif defined(__clang__)
  25346. "ands r6, r7\n\t"
  25347. #else
  25348. "and r6, r7\n\t"
  25349. #endif
  25350. "ldr r5, [%[a], r4]\n\t"
  25351. #ifdef WOLFSSL_KEIL
  25352. "sbcs r5, r5, r6\n\t"
  25353. #elif defined(__clang__)
  25354. "sbcs r5, r6\n\t"
  25355. #else
  25356. "sbc r5, r6\n\t"
  25357. #endif
  25358. "stm %[a]!, {r5}\n\t"
  25359. "ldm %[m]!, {r6}\n\t"
  25360. #ifdef WOLFSSL_KEIL
  25361. "ands r6, r6, r7\n\t"
  25362. #elif defined(__clang__)
  25363. "ands r6, r7\n\t"
  25364. #else
  25365. "and r6, r7\n\t"
  25366. #endif
  25367. "ldr r5, [%[a], r4]\n\t"
  25368. #ifdef WOLFSSL_KEIL
  25369. "sbcs r5, r5, r6\n\t"
  25370. #elif defined(__clang__)
  25371. "sbcs r5, r6\n\t"
  25372. #else
  25373. "sbc r5, r6\n\t"
  25374. #endif
  25375. "stm %[a]!, {r5}\n\t"
  25376. "ldm %[m]!, {r6}\n\t"
  25377. #ifdef WOLFSSL_KEIL
  25378. "ands r6, r6, r7\n\t"
  25379. #elif defined(__clang__)
  25380. "ands r6, r7\n\t"
  25381. #else
  25382. "and r6, r7\n\t"
  25383. #endif
  25384. "ldr r5, [%[a], r4]\n\t"
  25385. #ifdef WOLFSSL_KEIL
  25386. "sbcs r5, r5, r6\n\t"
  25387. #elif defined(__clang__)
  25388. "sbcs r5, r6\n\t"
  25389. #else
  25390. "sbc r5, r6\n\t"
  25391. #endif
  25392. "stm %[a]!, {r5}\n\t"
  25393. "ldm %[m]!, {r6}\n\t"
  25394. #ifdef WOLFSSL_KEIL
  25395. "ands r6, r6, r7\n\t"
  25396. #elif defined(__clang__)
  25397. "ands r6, r7\n\t"
  25398. #else
  25399. "and r6, r7\n\t"
  25400. #endif
  25401. "ldr r5, [%[a], r4]\n\t"
  25402. #ifdef WOLFSSL_KEIL
  25403. "sbcs r5, r5, r6\n\t"
  25404. #elif defined(__clang__)
  25405. "sbcs r5, r6\n\t"
  25406. #else
  25407. "sbc r5, r6\n\t"
  25408. #endif
  25409. "stm %[a]!, {r5}\n\t"
  25410. "ldm %[m]!, {r6}\n\t"
  25411. #ifdef WOLFSSL_KEIL
  25412. "ands r6, r6, r7\n\t"
  25413. #elif defined(__clang__)
  25414. "ands r6, r7\n\t"
  25415. #else
  25416. "and r6, r7\n\t"
  25417. #endif
  25418. "ldr r5, [%[a], r4]\n\t"
  25419. #ifdef WOLFSSL_KEIL
  25420. "sbcs r5, r5, r6\n\t"
  25421. #elif defined(__clang__)
  25422. "sbcs r5, r6\n\t"
  25423. #else
  25424. "sbc r5, r6\n\t"
  25425. #endif
  25426. "stm %[a]!, {r5}\n\t"
  25427. "ldm %[m]!, {r6}\n\t"
  25428. #ifdef WOLFSSL_KEIL
  25429. "ands r6, r6, r7\n\t"
  25430. #elif defined(__clang__)
  25431. "ands r6, r7\n\t"
  25432. #else
  25433. "and r6, r7\n\t"
  25434. #endif
  25435. "ldr r5, [%[a], r4]\n\t"
  25436. #ifdef WOLFSSL_KEIL
  25437. "sbcs r5, r5, r6\n\t"
  25438. #elif defined(__clang__)
  25439. "sbcs r5, r6\n\t"
  25440. #else
  25441. "sbc r5, r6\n\t"
  25442. #endif
  25443. "stm %[a]!, {r5}\n\t"
  25444. "ldm %[m]!, {r6}\n\t"
  25445. #ifdef WOLFSSL_KEIL
  25446. "ands r6, r6, r7\n\t"
  25447. #elif defined(__clang__)
  25448. "ands r6, r7\n\t"
  25449. #else
  25450. "and r6, r7\n\t"
  25451. #endif
  25452. "ldr r5, [%[a], r4]\n\t"
  25453. #ifdef WOLFSSL_KEIL
  25454. "sbcs r5, r5, r6\n\t"
  25455. #elif defined(__clang__)
  25456. "sbcs r5, r6\n\t"
  25457. #else
  25458. "sbc r5, r6\n\t"
  25459. #endif
  25460. "stm %[a]!, {r5}\n\t"
  25461. "ldm %[m]!, {r6}\n\t"
  25462. #ifdef WOLFSSL_KEIL
  25463. "ands r6, r6, r7\n\t"
  25464. #elif defined(__clang__)
  25465. "ands r6, r7\n\t"
  25466. #else
  25467. "and r6, r7\n\t"
  25468. #endif
  25469. "ldr r5, [%[a], r4]\n\t"
  25470. #ifdef WOLFSSL_KEIL
  25471. "sbcs r5, r5, r6\n\t"
  25472. #elif defined(__clang__)
  25473. "sbcs r5, r6\n\t"
  25474. #else
  25475. "sbc r5, r6\n\t"
  25476. #endif
  25477. "stm %[a]!, {r5}\n\t"
  25478. "ldm %[m]!, {r6}\n\t"
  25479. #ifdef WOLFSSL_KEIL
  25480. "ands r6, r6, r7\n\t"
  25481. #elif defined(__clang__)
  25482. "ands r6, r7\n\t"
  25483. #else
  25484. "and r6, r7\n\t"
  25485. #endif
  25486. "ldr r5, [%[a], r4]\n\t"
  25487. #ifdef WOLFSSL_KEIL
  25488. "sbcs r5, r5, r6\n\t"
  25489. #elif defined(__clang__)
  25490. "sbcs r5, r6\n\t"
  25491. #else
  25492. "sbc r5, r6\n\t"
  25493. #endif
  25494. "stm %[a]!, {r5}\n\t"
  25495. "ldm %[m]!, {r6}\n\t"
  25496. #ifdef WOLFSSL_KEIL
  25497. "ands r6, r6, r7\n\t"
  25498. #elif defined(__clang__)
  25499. "ands r6, r7\n\t"
  25500. #else
  25501. "and r6, r7\n\t"
  25502. #endif
  25503. "ldr r5, [%[a], r4]\n\t"
  25504. #ifdef WOLFSSL_KEIL
  25505. "sbcs r5, r5, r6\n\t"
  25506. #elif defined(__clang__)
  25507. "sbcs r5, r6\n\t"
  25508. #else
  25509. "sbc r5, r6\n\t"
  25510. #endif
  25511. "stm %[a]!, {r5}\n\t"
  25512. "ldm %[m]!, {r6}\n\t"
  25513. #ifdef WOLFSSL_KEIL
  25514. "ands r6, r6, r7\n\t"
  25515. #elif defined(__clang__)
  25516. "ands r6, r7\n\t"
  25517. #else
  25518. "and r6, r7\n\t"
  25519. #endif
  25520. "ldr r5, [%[a], r4]\n\t"
  25521. #ifdef WOLFSSL_KEIL
  25522. "sbcs r5, r5, r6\n\t"
  25523. #elif defined(__clang__)
  25524. "sbcs r5, r6\n\t"
  25525. #else
  25526. "sbc r5, r6\n\t"
  25527. #endif
  25528. "stm %[a]!, {r5}\n\t"
  25529. "ldm %[m]!, {r6}\n\t"
  25530. #ifdef WOLFSSL_KEIL
  25531. "ands r6, r6, r7\n\t"
  25532. #elif defined(__clang__)
  25533. "ands r6, r7\n\t"
  25534. #else
  25535. "and r6, r7\n\t"
  25536. #endif
  25537. "ldr r5, [%[a], r4]\n\t"
  25538. #ifdef WOLFSSL_KEIL
  25539. "sbcs r5, r5, r6\n\t"
  25540. #elif defined(__clang__)
  25541. "sbcs r5, r6\n\t"
  25542. #else
  25543. "sbc r5, r6\n\t"
  25544. #endif
  25545. "stm %[a]!, {r5}\n\t"
  25546. "ldm %[m]!, {r6}\n\t"
  25547. #ifdef WOLFSSL_KEIL
  25548. "ands r6, r6, r7\n\t"
  25549. #elif defined(__clang__)
  25550. "ands r6, r7\n\t"
  25551. #else
  25552. "and r6, r7\n\t"
  25553. #endif
  25554. "ldr r5, [%[a], r4]\n\t"
  25555. #ifdef WOLFSSL_KEIL
  25556. "sbcs r5, r5, r6\n\t"
  25557. #elif defined(__clang__)
  25558. "sbcs r5, r6\n\t"
  25559. #else
  25560. "sbc r5, r6\n\t"
  25561. #endif
  25562. "stm %[a]!, {r5}\n\t"
  25563. "ldm %[m]!, {r6}\n\t"
  25564. #ifdef WOLFSSL_KEIL
  25565. "ands r6, r6, r7\n\t"
  25566. #elif defined(__clang__)
  25567. "ands r6, r7\n\t"
  25568. #else
  25569. "and r6, r7\n\t"
  25570. #endif
  25571. "ldr r5, [%[a], r4]\n\t"
  25572. #ifdef WOLFSSL_KEIL
  25573. "sbcs r5, r5, r6\n\t"
  25574. #elif defined(__clang__)
  25575. "sbcs r5, r6\n\t"
  25576. #else
  25577. "sbc r5, r6\n\t"
  25578. #endif
  25579. "stm %[a]!, {r5}\n\t"
  25580. "ldm %[m]!, {r6}\n\t"
  25581. #ifdef WOLFSSL_KEIL
  25582. "ands r6, r6, r7\n\t"
  25583. #elif defined(__clang__)
  25584. "ands r6, r7\n\t"
  25585. #else
  25586. "and r6, r7\n\t"
  25587. #endif
  25588. "ldr r5, [%[a], r4]\n\t"
  25589. #ifdef WOLFSSL_KEIL
  25590. "sbcs r5, r5, r6\n\t"
  25591. #elif defined(__clang__)
  25592. "sbcs r5, r6\n\t"
  25593. #else
  25594. "sbc r5, r6\n\t"
  25595. #endif
  25596. "stm %[a]!, {r5}\n\t"
  25597. "ldm %[m]!, {r6}\n\t"
  25598. #ifdef WOLFSSL_KEIL
  25599. "ands r6, r6, r7\n\t"
  25600. #elif defined(__clang__)
  25601. "ands r6, r7\n\t"
  25602. #else
  25603. "and r6, r7\n\t"
  25604. #endif
  25605. "ldr r5, [%[a], r4]\n\t"
  25606. #ifdef WOLFSSL_KEIL
  25607. "sbcs r5, r5, r6\n\t"
  25608. #elif defined(__clang__)
  25609. "sbcs r5, r6\n\t"
  25610. #else
  25611. "sbc r5, r6\n\t"
  25612. #endif
  25613. "stm %[a]!, {r5}\n\t"
  25614. "ldm %[m]!, {r6}\n\t"
  25615. #ifdef WOLFSSL_KEIL
  25616. "ands r6, r6, r7\n\t"
  25617. #elif defined(__clang__)
  25618. "ands r6, r7\n\t"
  25619. #else
  25620. "and r6, r7\n\t"
  25621. #endif
  25622. "ldr r5, [%[a], r4]\n\t"
  25623. #ifdef WOLFSSL_KEIL
  25624. "sbcs r5, r5, r6\n\t"
  25625. #elif defined(__clang__)
  25626. "sbcs r5, r6\n\t"
  25627. #else
  25628. "sbc r5, r6\n\t"
  25629. #endif
  25630. "stm %[a]!, {r5}\n\t"
  25631. "ldm %[m]!, {r6}\n\t"
  25632. #ifdef WOLFSSL_KEIL
  25633. "ands r6, r6, r7\n\t"
  25634. #elif defined(__clang__)
  25635. "ands r6, r7\n\t"
  25636. #else
  25637. "and r6, r7\n\t"
  25638. #endif
  25639. "ldr r5, [%[a], r4]\n\t"
  25640. #ifdef WOLFSSL_KEIL
  25641. "sbcs r5, r5, r6\n\t"
  25642. #elif defined(__clang__)
  25643. "sbcs r5, r6\n\t"
  25644. #else
  25645. "sbc r5, r6\n\t"
  25646. #endif
  25647. "stm %[a]!, {r5}\n\t"
  25648. "ldm %[m]!, {r6}\n\t"
  25649. #ifdef WOLFSSL_KEIL
  25650. "ands r6, r6, r7\n\t"
  25651. #elif defined(__clang__)
  25652. "ands r6, r7\n\t"
  25653. #else
  25654. "and r6, r7\n\t"
  25655. #endif
  25656. "ldr r5, [%[a], r4]\n\t"
  25657. #ifdef WOLFSSL_KEIL
  25658. "sbcs r5, r5, r6\n\t"
  25659. #elif defined(__clang__)
  25660. "sbcs r5, r6\n\t"
  25661. #else
  25662. "sbc r5, r6\n\t"
  25663. #endif
  25664. "stm %[a]!, {r5}\n\t"
  25665. "ldm %[m]!, {r6}\n\t"
  25666. #ifdef WOLFSSL_KEIL
  25667. "ands r6, r6, r7\n\t"
  25668. #elif defined(__clang__)
  25669. "ands r6, r7\n\t"
  25670. #else
  25671. "and r6, r7\n\t"
  25672. #endif
  25673. "ldr r5, [%[a], r4]\n\t"
  25674. #ifdef WOLFSSL_KEIL
  25675. "sbcs r5, r5, r6\n\t"
  25676. #elif defined(__clang__)
  25677. "sbcs r5, r6\n\t"
  25678. #else
  25679. "sbc r5, r6\n\t"
  25680. #endif
  25681. "stm %[a]!, {r5}\n\t"
  25682. "ldm %[m]!, {r6}\n\t"
  25683. #ifdef WOLFSSL_KEIL
  25684. "ands r6, r6, r7\n\t"
  25685. #elif defined(__clang__)
  25686. "ands r6, r7\n\t"
  25687. #else
  25688. "and r6, r7\n\t"
  25689. #endif
  25690. "ldr r5, [%[a], r4]\n\t"
  25691. #ifdef WOLFSSL_KEIL
  25692. "sbcs r5, r5, r6\n\t"
  25693. #elif defined(__clang__)
  25694. "sbcs r5, r6\n\t"
  25695. #else
  25696. "sbc r5, r6\n\t"
  25697. #endif
  25698. "stm %[a]!, {r5}\n\t"
  25699. "ldm %[m]!, {r6}\n\t"
  25700. #ifdef WOLFSSL_KEIL
  25701. "ands r6, r6, r7\n\t"
  25702. #elif defined(__clang__)
  25703. "ands r6, r7\n\t"
  25704. #else
  25705. "and r6, r7\n\t"
  25706. #endif
  25707. "ldr r5, [%[a], r4]\n\t"
  25708. #ifdef WOLFSSL_KEIL
  25709. "sbcs r5, r5, r6\n\t"
  25710. #elif defined(__clang__)
  25711. "sbcs r5, r6\n\t"
  25712. #else
  25713. "sbc r5, r6\n\t"
  25714. #endif
  25715. "stm %[a]!, {r5}\n\t"
  25716. "ldm %[m]!, {r6}\n\t"
  25717. #ifdef WOLFSSL_KEIL
  25718. "ands r6, r6, r7\n\t"
  25719. #elif defined(__clang__)
  25720. "ands r6, r7\n\t"
  25721. #else
  25722. "and r6, r7\n\t"
  25723. #endif
  25724. "ldr r5, [%[a], r4]\n\t"
  25725. #ifdef WOLFSSL_KEIL
  25726. "sbcs r5, r5, r6\n\t"
  25727. #elif defined(__clang__)
  25728. "sbcs r5, r6\n\t"
  25729. #else
  25730. "sbc r5, r6\n\t"
  25731. #endif
  25732. "stm %[a]!, {r5}\n\t"
  25733. "ldm %[m]!, {r6}\n\t"
  25734. #ifdef WOLFSSL_KEIL
  25735. "ands r6, r6, r7\n\t"
  25736. #elif defined(__clang__)
  25737. "ands r6, r7\n\t"
  25738. #else
  25739. "and r6, r7\n\t"
  25740. #endif
  25741. "ldr r5, [%[a], r4]\n\t"
  25742. #ifdef WOLFSSL_KEIL
  25743. "sbcs r5, r5, r6\n\t"
  25744. #elif defined(__clang__)
  25745. "sbcs r5, r6\n\t"
  25746. #else
  25747. "sbc r5, r6\n\t"
  25748. #endif
  25749. "stm %[a]!, {r5}\n\t"
  25750. "ldm %[m]!, {r6}\n\t"
  25751. #ifdef WOLFSSL_KEIL
  25752. "ands r6, r6, r7\n\t"
  25753. #elif defined(__clang__)
  25754. "ands r6, r7\n\t"
  25755. #else
  25756. "and r6, r7\n\t"
  25757. #endif
  25758. "ldr r5, [%[a], r4]\n\t"
  25759. #ifdef WOLFSSL_KEIL
  25760. "sbcs r5, r5, r6\n\t"
  25761. #elif defined(__clang__)
  25762. "sbcs r5, r6\n\t"
  25763. #else
  25764. "sbc r5, r6\n\t"
  25765. #endif
  25766. "stm %[a]!, {r5}\n\t"
  25767. "ldm %[m]!, {r6}\n\t"
  25768. #ifdef WOLFSSL_KEIL
  25769. "ands r6, r6, r7\n\t"
  25770. #elif defined(__clang__)
  25771. "ands r6, r7\n\t"
  25772. #else
  25773. "and r6, r7\n\t"
  25774. #endif
  25775. "ldr r5, [%[a], r4]\n\t"
  25776. #ifdef WOLFSSL_KEIL
  25777. "sbcs r5, r5, r6\n\t"
  25778. #elif defined(__clang__)
  25779. "sbcs r5, r6\n\t"
  25780. #else
  25781. "sbc r5, r6\n\t"
  25782. #endif
  25783. "stm %[a]!, {r5}\n\t"
  25784. "ldm %[m]!, {r6}\n\t"
  25785. #ifdef WOLFSSL_KEIL
  25786. "ands r6, r6, r7\n\t"
  25787. #elif defined(__clang__)
  25788. "ands r6, r7\n\t"
  25789. #else
  25790. "and r6, r7\n\t"
  25791. #endif
  25792. "ldr r5, [%[a], r4]\n\t"
  25793. #ifdef WOLFSSL_KEIL
  25794. "sbcs r5, r5, r6\n\t"
  25795. #elif defined(__clang__)
  25796. "sbcs r5, r6\n\t"
  25797. #else
  25798. "sbc r5, r6\n\t"
  25799. #endif
  25800. "stm %[a]!, {r5}\n\t"
  25801. "ldm %[m]!, {r6}\n\t"
  25802. #ifdef WOLFSSL_KEIL
  25803. "ands r6, r6, r7\n\t"
  25804. #elif defined(__clang__)
  25805. "ands r6, r7\n\t"
  25806. #else
  25807. "and r6, r7\n\t"
  25808. #endif
  25809. "ldr r5, [%[a], r4]\n\t"
  25810. #ifdef WOLFSSL_KEIL
  25811. "sbcs r5, r5, r6\n\t"
  25812. #elif defined(__clang__)
  25813. "sbcs r5, r6\n\t"
  25814. #else
  25815. "sbc r5, r6\n\t"
  25816. #endif
  25817. "stm %[a]!, {r5}\n\t"
  25818. "ldm %[m]!, {r6}\n\t"
  25819. #ifdef WOLFSSL_KEIL
  25820. "ands r6, r6, r7\n\t"
  25821. #elif defined(__clang__)
  25822. "ands r6, r7\n\t"
  25823. #else
  25824. "and r6, r7\n\t"
  25825. #endif
  25826. "ldr r5, [%[a], r4]\n\t"
  25827. #ifdef WOLFSSL_KEIL
  25828. "sbcs r5, r5, r6\n\t"
  25829. #elif defined(__clang__)
  25830. "sbcs r5, r6\n\t"
  25831. #else
  25832. "sbc r5, r6\n\t"
  25833. #endif
  25834. "stm %[a]!, {r5}\n\t"
  25835. "ldm %[m]!, {r6}\n\t"
  25836. #ifdef WOLFSSL_KEIL
  25837. "ands r6, r6, r7\n\t"
  25838. #elif defined(__clang__)
  25839. "ands r6, r7\n\t"
  25840. #else
  25841. "and r6, r7\n\t"
  25842. #endif
  25843. "ldr r5, [%[a], r4]\n\t"
  25844. #ifdef WOLFSSL_KEIL
  25845. "sbcs r5, r5, r6\n\t"
  25846. #elif defined(__clang__)
  25847. "sbcs r5, r6\n\t"
  25848. #else
  25849. "sbc r5, r6\n\t"
  25850. #endif
  25851. "stm %[a]!, {r5}\n\t"
  25852. #endif /* WOLFSSL_SP_LARGE_CODE */
  25853. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  25854. :
  25855. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  25856. );
  25857. }
  25858. /* Multiply two Montgomery form numbers mod the modulus (prime).
  25859. * (r = a * b mod m)
  25860. *
  25861. * r Result of multiplication.
  25862. * a First number to multiply in Montgomery form.
  25863. * b Second number to multiply in Montgomery form.
  25864. * m Modulus (prime).
  25865. * mp Montgomery mulitplier.
  25866. */
  25867. SP_NOINLINE static void sp_2048_mont_mul_64(sp_digit* r, const sp_digit* a,
  25868. const sp_digit* b, const sp_digit* m, sp_digit mp)
  25869. {
  25870. sp_2048_mul_64(r, a, b);
  25871. sp_2048_mont_reduce_64(r, m, mp);
  25872. }
  25873. /* Square the Montgomery form number. (r = a * a mod m)
  25874. *
  25875. * r Result of squaring.
  25876. * a Number to square in Montgomery form.
  25877. * m Modulus (prime).
  25878. * mp Montgomery mulitplier.
  25879. */
  25880. SP_NOINLINE static void sp_2048_mont_sqr_64(sp_digit* r, const sp_digit* a,
  25881. const sp_digit* m, sp_digit mp)
  25882. {
  25883. sp_2048_sqr_64(r, a);
  25884. sp_2048_mont_reduce_64(r, m, mp);
  25885. }
  25886. #ifdef WOLFSSL_SP_SMALL
  25887. /* Sub b from a into r. (r = a - b)
  25888. *
  25889. * r A single precision integer.
  25890. * a A single precision integer.
  25891. * b A single precision integer.
  25892. */
  25893. SP_NOINLINE static sp_digit sp_2048_sub_64(sp_digit* r, const sp_digit* a,
  25894. const sp_digit* b)
  25895. {
  25896. __asm__ __volatile__ (
  25897. "movs r6, %[a]\n\t"
  25898. "movs r3, #0\n\t"
  25899. "movs r5, #0xff\n\t"
  25900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25901. "adds r5, r5, #1\n\t"
  25902. #else
  25903. "add r5, r5, #1\n\t"
  25904. #endif
  25905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25906. "adds r6, r6, r5\n\t"
  25907. #else
  25908. "add r6, r6, r5\n\t"
  25909. #endif
  25910. "\n"
  25911. "L_sp_2048_sub_64_word_%=:\n\t"
  25912. "movs r5, #0\n\t"
  25913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25914. "subs r5, r5, r3\n\t"
  25915. #else
  25916. "sub r5, r5, r3\n\t"
  25917. #endif
  25918. "ldr r4, [%[a]]\n\t"
  25919. "ldr r5, [%[b]]\n\t"
  25920. #ifdef WOLFSSL_KEIL
  25921. "sbcs r4, r4, r5\n\t"
  25922. #elif defined(__clang__)
  25923. "sbcs r4, r5\n\t"
  25924. #else
  25925. "sbc r4, r5\n\t"
  25926. #endif
  25927. "str r4, [%[r]]\n\t"
  25928. #ifdef WOLFSSL_KEIL
  25929. "sbcs r3, r3, r3\n\t"
  25930. #elif defined(__clang__)
  25931. "sbcs r3, r3\n\t"
  25932. #else
  25933. "sbc r3, r3\n\t"
  25934. #endif
  25935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25936. "adds %[a], %[a], #4\n\t"
  25937. #else
  25938. "add %[a], %[a], #4\n\t"
  25939. #endif
  25940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25941. "adds %[b], %[b], #4\n\t"
  25942. #else
  25943. "add %[b], %[b], #4\n\t"
  25944. #endif
  25945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25946. "adds %[r], %[r], #4\n\t"
  25947. #else
  25948. "add %[r], %[r], #4\n\t"
  25949. #endif
  25950. "cmp %[a], r6\n\t"
  25951. "bne L_sp_2048_sub_64_word_%=\n\t"
  25952. "movs %[r], r3\n\t"
  25953. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  25954. :
  25955. : "memory", "r3", "r4", "r5", "r6"
  25956. );
  25957. return (uint32_t)(size_t)r;
  25958. }
  25959. #else
  25960. /* Sub b from a into r. (r = a - b)
  25961. *
  25962. * r A single precision integer.
  25963. * a A single precision integer.
  25964. * b A single precision integer.
  25965. */
  25966. SP_NOINLINE static sp_digit sp_2048_sub_64(sp_digit* r, const sp_digit* a,
  25967. const sp_digit* b)
  25968. {
  25969. __asm__ __volatile__ (
  25970. "ldm %[b]!, {r5, r6}\n\t"
  25971. "ldm %[a]!, {r3, r4}\n\t"
  25972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  25973. "subs r3, r3, r5\n\t"
  25974. #else
  25975. "sub r3, r3, r5\n\t"
  25976. #endif
  25977. #ifdef WOLFSSL_KEIL
  25978. "sbcs r4, r4, r6\n\t"
  25979. #elif defined(__clang__)
  25980. "sbcs r4, r6\n\t"
  25981. #else
  25982. "sbc r4, r6\n\t"
  25983. #endif
  25984. "stm %[r]!, {r3, r4}\n\t"
  25985. "ldm %[b]!, {r5, r6}\n\t"
  25986. "ldm %[a]!, {r3, r4}\n\t"
  25987. #ifdef WOLFSSL_KEIL
  25988. "sbcs r3, r3, r5\n\t"
  25989. #elif defined(__clang__)
  25990. "sbcs r3, r5\n\t"
  25991. #else
  25992. "sbc r3, r5\n\t"
  25993. #endif
  25994. #ifdef WOLFSSL_KEIL
  25995. "sbcs r4, r4, r6\n\t"
  25996. #elif defined(__clang__)
  25997. "sbcs r4, r6\n\t"
  25998. #else
  25999. "sbc r4, r6\n\t"
  26000. #endif
  26001. "stm %[r]!, {r3, r4}\n\t"
  26002. "ldm %[b]!, {r5, r6}\n\t"
  26003. "ldm %[a]!, {r3, r4}\n\t"
  26004. #ifdef WOLFSSL_KEIL
  26005. "sbcs r3, r3, r5\n\t"
  26006. #elif defined(__clang__)
  26007. "sbcs r3, r5\n\t"
  26008. #else
  26009. "sbc r3, r5\n\t"
  26010. #endif
  26011. #ifdef WOLFSSL_KEIL
  26012. "sbcs r4, r4, r6\n\t"
  26013. #elif defined(__clang__)
  26014. "sbcs r4, r6\n\t"
  26015. #else
  26016. "sbc r4, r6\n\t"
  26017. #endif
  26018. "stm %[r]!, {r3, r4}\n\t"
  26019. "ldm %[b]!, {r5, r6}\n\t"
  26020. "ldm %[a]!, {r3, r4}\n\t"
  26021. #ifdef WOLFSSL_KEIL
  26022. "sbcs r3, r3, r5\n\t"
  26023. #elif defined(__clang__)
  26024. "sbcs r3, r5\n\t"
  26025. #else
  26026. "sbc r3, r5\n\t"
  26027. #endif
  26028. #ifdef WOLFSSL_KEIL
  26029. "sbcs r4, r4, r6\n\t"
  26030. #elif defined(__clang__)
  26031. "sbcs r4, r6\n\t"
  26032. #else
  26033. "sbc r4, r6\n\t"
  26034. #endif
  26035. "stm %[r]!, {r3, r4}\n\t"
  26036. "ldm %[b]!, {r5, r6}\n\t"
  26037. "ldm %[a]!, {r3, r4}\n\t"
  26038. #ifdef WOLFSSL_KEIL
  26039. "sbcs r3, r3, r5\n\t"
  26040. #elif defined(__clang__)
  26041. "sbcs r3, r5\n\t"
  26042. #else
  26043. "sbc r3, r5\n\t"
  26044. #endif
  26045. #ifdef WOLFSSL_KEIL
  26046. "sbcs r4, r4, r6\n\t"
  26047. #elif defined(__clang__)
  26048. "sbcs r4, r6\n\t"
  26049. #else
  26050. "sbc r4, r6\n\t"
  26051. #endif
  26052. "stm %[r]!, {r3, r4}\n\t"
  26053. "ldm %[b]!, {r5, r6}\n\t"
  26054. "ldm %[a]!, {r3, r4}\n\t"
  26055. #ifdef WOLFSSL_KEIL
  26056. "sbcs r3, r3, r5\n\t"
  26057. #elif defined(__clang__)
  26058. "sbcs r3, r5\n\t"
  26059. #else
  26060. "sbc r3, r5\n\t"
  26061. #endif
  26062. #ifdef WOLFSSL_KEIL
  26063. "sbcs r4, r4, r6\n\t"
  26064. #elif defined(__clang__)
  26065. "sbcs r4, r6\n\t"
  26066. #else
  26067. "sbc r4, r6\n\t"
  26068. #endif
  26069. "stm %[r]!, {r3, r4}\n\t"
  26070. "ldm %[b]!, {r5, r6}\n\t"
  26071. "ldm %[a]!, {r3, r4}\n\t"
  26072. #ifdef WOLFSSL_KEIL
  26073. "sbcs r3, r3, r5\n\t"
  26074. #elif defined(__clang__)
  26075. "sbcs r3, r5\n\t"
  26076. #else
  26077. "sbc r3, r5\n\t"
  26078. #endif
  26079. #ifdef WOLFSSL_KEIL
  26080. "sbcs r4, r4, r6\n\t"
  26081. #elif defined(__clang__)
  26082. "sbcs r4, r6\n\t"
  26083. #else
  26084. "sbc r4, r6\n\t"
  26085. #endif
  26086. "stm %[r]!, {r3, r4}\n\t"
  26087. "ldm %[b]!, {r5, r6}\n\t"
  26088. "ldm %[a]!, {r3, r4}\n\t"
  26089. #ifdef WOLFSSL_KEIL
  26090. "sbcs r3, r3, r5\n\t"
  26091. #elif defined(__clang__)
  26092. "sbcs r3, r5\n\t"
  26093. #else
  26094. "sbc r3, r5\n\t"
  26095. #endif
  26096. #ifdef WOLFSSL_KEIL
  26097. "sbcs r4, r4, r6\n\t"
  26098. #elif defined(__clang__)
  26099. "sbcs r4, r6\n\t"
  26100. #else
  26101. "sbc r4, r6\n\t"
  26102. #endif
  26103. "stm %[r]!, {r3, r4}\n\t"
  26104. "ldm %[b]!, {r5, r6}\n\t"
  26105. "ldm %[a]!, {r3, r4}\n\t"
  26106. #ifdef WOLFSSL_KEIL
  26107. "sbcs r3, r3, r5\n\t"
  26108. #elif defined(__clang__)
  26109. "sbcs r3, r5\n\t"
  26110. #else
  26111. "sbc r3, r5\n\t"
  26112. #endif
  26113. #ifdef WOLFSSL_KEIL
  26114. "sbcs r4, r4, r6\n\t"
  26115. #elif defined(__clang__)
  26116. "sbcs r4, r6\n\t"
  26117. #else
  26118. "sbc r4, r6\n\t"
  26119. #endif
  26120. "stm %[r]!, {r3, r4}\n\t"
  26121. "ldm %[b]!, {r5, r6}\n\t"
  26122. "ldm %[a]!, {r3, r4}\n\t"
  26123. #ifdef WOLFSSL_KEIL
  26124. "sbcs r3, r3, r5\n\t"
  26125. #elif defined(__clang__)
  26126. "sbcs r3, r5\n\t"
  26127. #else
  26128. "sbc r3, r5\n\t"
  26129. #endif
  26130. #ifdef WOLFSSL_KEIL
  26131. "sbcs r4, r4, r6\n\t"
  26132. #elif defined(__clang__)
  26133. "sbcs r4, r6\n\t"
  26134. #else
  26135. "sbc r4, r6\n\t"
  26136. #endif
  26137. "stm %[r]!, {r3, r4}\n\t"
  26138. "ldm %[b]!, {r5, r6}\n\t"
  26139. "ldm %[a]!, {r3, r4}\n\t"
  26140. #ifdef WOLFSSL_KEIL
  26141. "sbcs r3, r3, r5\n\t"
  26142. #elif defined(__clang__)
  26143. "sbcs r3, r5\n\t"
  26144. #else
  26145. "sbc r3, r5\n\t"
  26146. #endif
  26147. #ifdef WOLFSSL_KEIL
  26148. "sbcs r4, r4, r6\n\t"
  26149. #elif defined(__clang__)
  26150. "sbcs r4, r6\n\t"
  26151. #else
  26152. "sbc r4, r6\n\t"
  26153. #endif
  26154. "stm %[r]!, {r3, r4}\n\t"
  26155. "ldm %[b]!, {r5, r6}\n\t"
  26156. "ldm %[a]!, {r3, r4}\n\t"
  26157. #ifdef WOLFSSL_KEIL
  26158. "sbcs r3, r3, r5\n\t"
  26159. #elif defined(__clang__)
  26160. "sbcs r3, r5\n\t"
  26161. #else
  26162. "sbc r3, r5\n\t"
  26163. #endif
  26164. #ifdef WOLFSSL_KEIL
  26165. "sbcs r4, r4, r6\n\t"
  26166. #elif defined(__clang__)
  26167. "sbcs r4, r6\n\t"
  26168. #else
  26169. "sbc r4, r6\n\t"
  26170. #endif
  26171. "stm %[r]!, {r3, r4}\n\t"
  26172. "ldm %[b]!, {r5, r6}\n\t"
  26173. "ldm %[a]!, {r3, r4}\n\t"
  26174. #ifdef WOLFSSL_KEIL
  26175. "sbcs r3, r3, r5\n\t"
  26176. #elif defined(__clang__)
  26177. "sbcs r3, r5\n\t"
  26178. #else
  26179. "sbc r3, r5\n\t"
  26180. #endif
  26181. #ifdef WOLFSSL_KEIL
  26182. "sbcs r4, r4, r6\n\t"
  26183. #elif defined(__clang__)
  26184. "sbcs r4, r6\n\t"
  26185. #else
  26186. "sbc r4, r6\n\t"
  26187. #endif
  26188. "stm %[r]!, {r3, r4}\n\t"
  26189. "ldm %[b]!, {r5, r6}\n\t"
  26190. "ldm %[a]!, {r3, r4}\n\t"
  26191. #ifdef WOLFSSL_KEIL
  26192. "sbcs r3, r3, r5\n\t"
  26193. #elif defined(__clang__)
  26194. "sbcs r3, r5\n\t"
  26195. #else
  26196. "sbc r3, r5\n\t"
  26197. #endif
  26198. #ifdef WOLFSSL_KEIL
  26199. "sbcs r4, r4, r6\n\t"
  26200. #elif defined(__clang__)
  26201. "sbcs r4, r6\n\t"
  26202. #else
  26203. "sbc r4, r6\n\t"
  26204. #endif
  26205. "stm %[r]!, {r3, r4}\n\t"
  26206. "ldm %[b]!, {r5, r6}\n\t"
  26207. "ldm %[a]!, {r3, r4}\n\t"
  26208. #ifdef WOLFSSL_KEIL
  26209. "sbcs r3, r3, r5\n\t"
  26210. #elif defined(__clang__)
  26211. "sbcs r3, r5\n\t"
  26212. #else
  26213. "sbc r3, r5\n\t"
  26214. #endif
  26215. #ifdef WOLFSSL_KEIL
  26216. "sbcs r4, r4, r6\n\t"
  26217. #elif defined(__clang__)
  26218. "sbcs r4, r6\n\t"
  26219. #else
  26220. "sbc r4, r6\n\t"
  26221. #endif
  26222. "stm %[r]!, {r3, r4}\n\t"
  26223. "ldm %[b]!, {r5, r6}\n\t"
  26224. "ldm %[a]!, {r3, r4}\n\t"
  26225. #ifdef WOLFSSL_KEIL
  26226. "sbcs r3, r3, r5\n\t"
  26227. #elif defined(__clang__)
  26228. "sbcs r3, r5\n\t"
  26229. #else
  26230. "sbc r3, r5\n\t"
  26231. #endif
  26232. #ifdef WOLFSSL_KEIL
  26233. "sbcs r4, r4, r6\n\t"
  26234. #elif defined(__clang__)
  26235. "sbcs r4, r6\n\t"
  26236. #else
  26237. "sbc r4, r6\n\t"
  26238. #endif
  26239. "stm %[r]!, {r3, r4}\n\t"
  26240. "ldm %[b]!, {r5, r6}\n\t"
  26241. "ldm %[a]!, {r3, r4}\n\t"
  26242. #ifdef WOLFSSL_KEIL
  26243. "sbcs r3, r3, r5\n\t"
  26244. #elif defined(__clang__)
  26245. "sbcs r3, r5\n\t"
  26246. #else
  26247. "sbc r3, r5\n\t"
  26248. #endif
  26249. #ifdef WOLFSSL_KEIL
  26250. "sbcs r4, r4, r6\n\t"
  26251. #elif defined(__clang__)
  26252. "sbcs r4, r6\n\t"
  26253. #else
  26254. "sbc r4, r6\n\t"
  26255. #endif
  26256. "stm %[r]!, {r3, r4}\n\t"
  26257. "ldm %[b]!, {r5, r6}\n\t"
  26258. "ldm %[a]!, {r3, r4}\n\t"
  26259. #ifdef WOLFSSL_KEIL
  26260. "sbcs r3, r3, r5\n\t"
  26261. #elif defined(__clang__)
  26262. "sbcs r3, r5\n\t"
  26263. #else
  26264. "sbc r3, r5\n\t"
  26265. #endif
  26266. #ifdef WOLFSSL_KEIL
  26267. "sbcs r4, r4, r6\n\t"
  26268. #elif defined(__clang__)
  26269. "sbcs r4, r6\n\t"
  26270. #else
  26271. "sbc r4, r6\n\t"
  26272. #endif
  26273. "stm %[r]!, {r3, r4}\n\t"
  26274. "ldm %[b]!, {r5, r6}\n\t"
  26275. "ldm %[a]!, {r3, r4}\n\t"
  26276. #ifdef WOLFSSL_KEIL
  26277. "sbcs r3, r3, r5\n\t"
  26278. #elif defined(__clang__)
  26279. "sbcs r3, r5\n\t"
  26280. #else
  26281. "sbc r3, r5\n\t"
  26282. #endif
  26283. #ifdef WOLFSSL_KEIL
  26284. "sbcs r4, r4, r6\n\t"
  26285. #elif defined(__clang__)
  26286. "sbcs r4, r6\n\t"
  26287. #else
  26288. "sbc r4, r6\n\t"
  26289. #endif
  26290. "stm %[r]!, {r3, r4}\n\t"
  26291. "ldm %[b]!, {r5, r6}\n\t"
  26292. "ldm %[a]!, {r3, r4}\n\t"
  26293. #ifdef WOLFSSL_KEIL
  26294. "sbcs r3, r3, r5\n\t"
  26295. #elif defined(__clang__)
  26296. "sbcs r3, r5\n\t"
  26297. #else
  26298. "sbc r3, r5\n\t"
  26299. #endif
  26300. #ifdef WOLFSSL_KEIL
  26301. "sbcs r4, r4, r6\n\t"
  26302. #elif defined(__clang__)
  26303. "sbcs r4, r6\n\t"
  26304. #else
  26305. "sbc r4, r6\n\t"
  26306. #endif
  26307. "stm %[r]!, {r3, r4}\n\t"
  26308. "ldm %[b]!, {r5, r6}\n\t"
  26309. "ldm %[a]!, {r3, r4}\n\t"
  26310. #ifdef WOLFSSL_KEIL
  26311. "sbcs r3, r3, r5\n\t"
  26312. #elif defined(__clang__)
  26313. "sbcs r3, r5\n\t"
  26314. #else
  26315. "sbc r3, r5\n\t"
  26316. #endif
  26317. #ifdef WOLFSSL_KEIL
  26318. "sbcs r4, r4, r6\n\t"
  26319. #elif defined(__clang__)
  26320. "sbcs r4, r6\n\t"
  26321. #else
  26322. "sbc r4, r6\n\t"
  26323. #endif
  26324. "stm %[r]!, {r3, r4}\n\t"
  26325. "ldm %[b]!, {r5, r6}\n\t"
  26326. "ldm %[a]!, {r3, r4}\n\t"
  26327. #ifdef WOLFSSL_KEIL
  26328. "sbcs r3, r3, r5\n\t"
  26329. #elif defined(__clang__)
  26330. "sbcs r3, r5\n\t"
  26331. #else
  26332. "sbc r3, r5\n\t"
  26333. #endif
  26334. #ifdef WOLFSSL_KEIL
  26335. "sbcs r4, r4, r6\n\t"
  26336. #elif defined(__clang__)
  26337. "sbcs r4, r6\n\t"
  26338. #else
  26339. "sbc r4, r6\n\t"
  26340. #endif
  26341. "stm %[r]!, {r3, r4}\n\t"
  26342. "ldm %[b]!, {r5, r6}\n\t"
  26343. "ldm %[a]!, {r3, r4}\n\t"
  26344. #ifdef WOLFSSL_KEIL
  26345. "sbcs r3, r3, r5\n\t"
  26346. #elif defined(__clang__)
  26347. "sbcs r3, r5\n\t"
  26348. #else
  26349. "sbc r3, r5\n\t"
  26350. #endif
  26351. #ifdef WOLFSSL_KEIL
  26352. "sbcs r4, r4, r6\n\t"
  26353. #elif defined(__clang__)
  26354. "sbcs r4, r6\n\t"
  26355. #else
  26356. "sbc r4, r6\n\t"
  26357. #endif
  26358. "stm %[r]!, {r3, r4}\n\t"
  26359. "ldm %[b]!, {r5, r6}\n\t"
  26360. "ldm %[a]!, {r3, r4}\n\t"
  26361. #ifdef WOLFSSL_KEIL
  26362. "sbcs r3, r3, r5\n\t"
  26363. #elif defined(__clang__)
  26364. "sbcs r3, r5\n\t"
  26365. #else
  26366. "sbc r3, r5\n\t"
  26367. #endif
  26368. #ifdef WOLFSSL_KEIL
  26369. "sbcs r4, r4, r6\n\t"
  26370. #elif defined(__clang__)
  26371. "sbcs r4, r6\n\t"
  26372. #else
  26373. "sbc r4, r6\n\t"
  26374. #endif
  26375. "stm %[r]!, {r3, r4}\n\t"
  26376. "ldm %[b]!, {r5, r6}\n\t"
  26377. "ldm %[a]!, {r3, r4}\n\t"
  26378. #ifdef WOLFSSL_KEIL
  26379. "sbcs r3, r3, r5\n\t"
  26380. #elif defined(__clang__)
  26381. "sbcs r3, r5\n\t"
  26382. #else
  26383. "sbc r3, r5\n\t"
  26384. #endif
  26385. #ifdef WOLFSSL_KEIL
  26386. "sbcs r4, r4, r6\n\t"
  26387. #elif defined(__clang__)
  26388. "sbcs r4, r6\n\t"
  26389. #else
  26390. "sbc r4, r6\n\t"
  26391. #endif
  26392. "stm %[r]!, {r3, r4}\n\t"
  26393. "ldm %[b]!, {r5, r6}\n\t"
  26394. "ldm %[a]!, {r3, r4}\n\t"
  26395. #ifdef WOLFSSL_KEIL
  26396. "sbcs r3, r3, r5\n\t"
  26397. #elif defined(__clang__)
  26398. "sbcs r3, r5\n\t"
  26399. #else
  26400. "sbc r3, r5\n\t"
  26401. #endif
  26402. #ifdef WOLFSSL_KEIL
  26403. "sbcs r4, r4, r6\n\t"
  26404. #elif defined(__clang__)
  26405. "sbcs r4, r6\n\t"
  26406. #else
  26407. "sbc r4, r6\n\t"
  26408. #endif
  26409. "stm %[r]!, {r3, r4}\n\t"
  26410. "ldm %[b]!, {r5, r6}\n\t"
  26411. "ldm %[a]!, {r3, r4}\n\t"
  26412. #ifdef WOLFSSL_KEIL
  26413. "sbcs r3, r3, r5\n\t"
  26414. #elif defined(__clang__)
  26415. "sbcs r3, r5\n\t"
  26416. #else
  26417. "sbc r3, r5\n\t"
  26418. #endif
  26419. #ifdef WOLFSSL_KEIL
  26420. "sbcs r4, r4, r6\n\t"
  26421. #elif defined(__clang__)
  26422. "sbcs r4, r6\n\t"
  26423. #else
  26424. "sbc r4, r6\n\t"
  26425. #endif
  26426. "stm %[r]!, {r3, r4}\n\t"
  26427. "ldm %[b]!, {r5, r6}\n\t"
  26428. "ldm %[a]!, {r3, r4}\n\t"
  26429. #ifdef WOLFSSL_KEIL
  26430. "sbcs r3, r3, r5\n\t"
  26431. #elif defined(__clang__)
  26432. "sbcs r3, r5\n\t"
  26433. #else
  26434. "sbc r3, r5\n\t"
  26435. #endif
  26436. #ifdef WOLFSSL_KEIL
  26437. "sbcs r4, r4, r6\n\t"
  26438. #elif defined(__clang__)
  26439. "sbcs r4, r6\n\t"
  26440. #else
  26441. "sbc r4, r6\n\t"
  26442. #endif
  26443. "stm %[r]!, {r3, r4}\n\t"
  26444. "ldm %[b]!, {r5, r6}\n\t"
  26445. "ldm %[a]!, {r3, r4}\n\t"
  26446. #ifdef WOLFSSL_KEIL
  26447. "sbcs r3, r3, r5\n\t"
  26448. #elif defined(__clang__)
  26449. "sbcs r3, r5\n\t"
  26450. #else
  26451. "sbc r3, r5\n\t"
  26452. #endif
  26453. #ifdef WOLFSSL_KEIL
  26454. "sbcs r4, r4, r6\n\t"
  26455. #elif defined(__clang__)
  26456. "sbcs r4, r6\n\t"
  26457. #else
  26458. "sbc r4, r6\n\t"
  26459. #endif
  26460. "stm %[r]!, {r3, r4}\n\t"
  26461. "ldm %[b]!, {r5, r6}\n\t"
  26462. "ldm %[a]!, {r3, r4}\n\t"
  26463. #ifdef WOLFSSL_KEIL
  26464. "sbcs r3, r3, r5\n\t"
  26465. #elif defined(__clang__)
  26466. "sbcs r3, r5\n\t"
  26467. #else
  26468. "sbc r3, r5\n\t"
  26469. #endif
  26470. #ifdef WOLFSSL_KEIL
  26471. "sbcs r4, r4, r6\n\t"
  26472. #elif defined(__clang__)
  26473. "sbcs r4, r6\n\t"
  26474. #else
  26475. "sbc r4, r6\n\t"
  26476. #endif
  26477. "stm %[r]!, {r3, r4}\n\t"
  26478. "ldm %[b]!, {r5, r6}\n\t"
  26479. "ldm %[a]!, {r3, r4}\n\t"
  26480. #ifdef WOLFSSL_KEIL
  26481. "sbcs r3, r3, r5\n\t"
  26482. #elif defined(__clang__)
  26483. "sbcs r3, r5\n\t"
  26484. #else
  26485. "sbc r3, r5\n\t"
  26486. #endif
  26487. #ifdef WOLFSSL_KEIL
  26488. "sbcs r4, r4, r6\n\t"
  26489. #elif defined(__clang__)
  26490. "sbcs r4, r6\n\t"
  26491. #else
  26492. "sbc r4, r6\n\t"
  26493. #endif
  26494. "stm %[r]!, {r3, r4}\n\t"
  26495. "ldm %[b]!, {r5, r6}\n\t"
  26496. "ldm %[a]!, {r3, r4}\n\t"
  26497. #ifdef WOLFSSL_KEIL
  26498. "sbcs r3, r3, r5\n\t"
  26499. #elif defined(__clang__)
  26500. "sbcs r3, r5\n\t"
  26501. #else
  26502. "sbc r3, r5\n\t"
  26503. #endif
  26504. #ifdef WOLFSSL_KEIL
  26505. "sbcs r4, r4, r6\n\t"
  26506. #elif defined(__clang__)
  26507. "sbcs r4, r6\n\t"
  26508. #else
  26509. "sbc r4, r6\n\t"
  26510. #endif
  26511. "stm %[r]!, {r3, r4}\n\t"
  26512. #ifdef WOLFSSL_KEIL
  26513. "sbcs %[r], %[r], %[r]\n\t"
  26514. #elif defined(__clang__)
  26515. "sbcs %[r], %[r]\n\t"
  26516. #else
  26517. "sbc %[r], %[r]\n\t"
  26518. #endif
  26519. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  26520. :
  26521. : "memory", "r3", "r4", "r5", "r6"
  26522. );
  26523. return (uint32_t)(size_t)r;
  26524. }
  26525. #endif /* WOLFSSL_SP_SMALL */
  26526. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  26527. *
  26528. * d1 The high order half of the number to divide.
  26529. * d0 The low order half of the number to divide.
  26530. * div The divisor.
  26531. * returns the result of the division.
  26532. *
  26533. * Note that this is an approximate div. It may give an answer 1 larger.
  26534. */
  26535. SP_NOINLINE static sp_digit div_2048_word_64(sp_digit d1, sp_digit d0,
  26536. sp_digit div)
  26537. {
  26538. __asm__ __volatile__ (
  26539. "movs r3, #0\n\t"
  26540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26541. "lsrs r5, %[div], #1\n\t"
  26542. #else
  26543. "lsr r5, %[div], #1\n\t"
  26544. #endif
  26545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26546. "adds r5, r5, #1\n\t"
  26547. #else
  26548. "add r5, r5, #1\n\t"
  26549. #endif
  26550. "mov r8, %[d0]\n\t"
  26551. "mov r9, %[d1]\n\t"
  26552. "# Do top 32\n\t"
  26553. "movs r6, r5\n\t"
  26554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26555. "subs r6, r6, %[d1]\n\t"
  26556. #else
  26557. "sub r6, r6, %[d1]\n\t"
  26558. #endif
  26559. #ifdef WOLFSSL_KEIL
  26560. "sbcs r6, r6, r6\n\t"
  26561. #elif defined(__clang__)
  26562. "sbcs r6, r6\n\t"
  26563. #else
  26564. "sbc r6, r6\n\t"
  26565. #endif
  26566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26567. "adds r3, r3, r3\n\t"
  26568. #else
  26569. "add r3, r3, r3\n\t"
  26570. #endif
  26571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26572. "subs r3, r3, r6\n\t"
  26573. #else
  26574. "sub r3, r3, r6\n\t"
  26575. #endif
  26576. #ifdef WOLFSSL_KEIL
  26577. "ands r6, r6, r5\n\t"
  26578. #elif defined(__clang__)
  26579. "ands r6, r5\n\t"
  26580. #else
  26581. "and r6, r5\n\t"
  26582. #endif
  26583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26584. "subs %[d1], %[d1], r6\n\t"
  26585. #else
  26586. "sub %[d1], %[d1], r6\n\t"
  26587. #endif
  26588. "movs r4, #29\n\t"
  26589. "\n"
  26590. "L_div_2048_word_64_loop_%=:\n\t"
  26591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26592. "lsls %[d0], %[d0], #1\n\t"
  26593. #else
  26594. "lsl %[d0], %[d0], #1\n\t"
  26595. #endif
  26596. #ifdef WOLFSSL_KEIL
  26597. "adcs %[d1], %[d1], %[d1]\n\t"
  26598. #elif defined(__clang__)
  26599. "adcs %[d1], %[d1]\n\t"
  26600. #else
  26601. "adc %[d1], %[d1]\n\t"
  26602. #endif
  26603. "movs r6, r5\n\t"
  26604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26605. "subs r6, r6, %[d1]\n\t"
  26606. #else
  26607. "sub r6, r6, %[d1]\n\t"
  26608. #endif
  26609. #ifdef WOLFSSL_KEIL
  26610. "sbcs r6, r6, r6\n\t"
  26611. #elif defined(__clang__)
  26612. "sbcs r6, r6\n\t"
  26613. #else
  26614. "sbc r6, r6\n\t"
  26615. #endif
  26616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26617. "adds r3, r3, r3\n\t"
  26618. #else
  26619. "add r3, r3, r3\n\t"
  26620. #endif
  26621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26622. "subs r3, r3, r6\n\t"
  26623. #else
  26624. "sub r3, r3, r6\n\t"
  26625. #endif
  26626. #ifdef WOLFSSL_KEIL
  26627. "ands r6, r6, r5\n\t"
  26628. #elif defined(__clang__)
  26629. "ands r6, r5\n\t"
  26630. #else
  26631. "and r6, r5\n\t"
  26632. #endif
  26633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26634. "subs %[d1], %[d1], r6\n\t"
  26635. #else
  26636. "sub %[d1], %[d1], r6\n\t"
  26637. #endif
  26638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26639. "subs r4, r4, #1\n\t"
  26640. #else
  26641. "sub r4, r4, #1\n\t"
  26642. #endif
  26643. "bpl L_div_2048_word_64_loop_%=\n\t"
  26644. "movs r7, #0\n\t"
  26645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26646. "adds r3, r3, r3\n\t"
  26647. #else
  26648. "add r3, r3, r3\n\t"
  26649. #endif
  26650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26651. "adds r3, r3, #1\n\t"
  26652. #else
  26653. "add r3, r3, #1\n\t"
  26654. #endif
  26655. "# r * div - Start\n\t"
  26656. "uxth %[d1], r3\n\t"
  26657. "uxth r4, %[div]\n\t"
  26658. #ifdef WOLFSSL_KEIL
  26659. "muls r4, %[d1], r4\n\t"
  26660. #elif defined(__clang__)
  26661. "muls r4, %[d1]\n\t"
  26662. #else
  26663. "mul r4, %[d1]\n\t"
  26664. #endif
  26665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26666. "lsrs r6, %[div], #16\n\t"
  26667. #else
  26668. "lsr r6, %[div], #16\n\t"
  26669. #endif
  26670. #ifdef WOLFSSL_KEIL
  26671. "muls %[d1], r6, %[d1]\n\t"
  26672. #elif defined(__clang__)
  26673. "muls %[d1], r6\n\t"
  26674. #else
  26675. "mul %[d1], r6\n\t"
  26676. #endif
  26677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26678. "lsrs r5, %[d1], #16\n\t"
  26679. #else
  26680. "lsr r5, %[d1], #16\n\t"
  26681. #endif
  26682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26683. "lsls %[d1], %[d1], #16\n\t"
  26684. #else
  26685. "lsl %[d1], %[d1], #16\n\t"
  26686. #endif
  26687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26688. "adds r4, r4, %[d1]\n\t"
  26689. #else
  26690. "add r4, r4, %[d1]\n\t"
  26691. #endif
  26692. #ifdef WOLFSSL_KEIL
  26693. "adcs r5, r5, r7\n\t"
  26694. #elif defined(__clang__)
  26695. "adcs r5, r7\n\t"
  26696. #else
  26697. "adc r5, r7\n\t"
  26698. #endif
  26699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26700. "lsrs %[d1], r3, #16\n\t"
  26701. #else
  26702. "lsr %[d1], r3, #16\n\t"
  26703. #endif
  26704. #ifdef WOLFSSL_KEIL
  26705. "muls r6, %[d1], r6\n\t"
  26706. #elif defined(__clang__)
  26707. "muls r6, %[d1]\n\t"
  26708. #else
  26709. "mul r6, %[d1]\n\t"
  26710. #endif
  26711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26712. "adds r5, r5, r6\n\t"
  26713. #else
  26714. "add r5, r5, r6\n\t"
  26715. #endif
  26716. "uxth r6, %[div]\n\t"
  26717. #ifdef WOLFSSL_KEIL
  26718. "muls %[d1], r6, %[d1]\n\t"
  26719. #elif defined(__clang__)
  26720. "muls %[d1], r6\n\t"
  26721. #else
  26722. "mul %[d1], r6\n\t"
  26723. #endif
  26724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26725. "lsrs r6, %[d1], #16\n\t"
  26726. #else
  26727. "lsr r6, %[d1], #16\n\t"
  26728. #endif
  26729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26730. "lsls %[d1], %[d1], #16\n\t"
  26731. #else
  26732. "lsl %[d1], %[d1], #16\n\t"
  26733. #endif
  26734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26735. "adds r4, r4, %[d1]\n\t"
  26736. #else
  26737. "add r4, r4, %[d1]\n\t"
  26738. #endif
  26739. #ifdef WOLFSSL_KEIL
  26740. "adcs r5, r5, r6\n\t"
  26741. #elif defined(__clang__)
  26742. "adcs r5, r6\n\t"
  26743. #else
  26744. "adc r5, r6\n\t"
  26745. #endif
  26746. "# r * div - Done\n\t"
  26747. "mov %[d1], r8\n\t"
  26748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26749. "subs %[d1], %[d1], r4\n\t"
  26750. #else
  26751. "sub %[d1], %[d1], r4\n\t"
  26752. #endif
  26753. "movs r4, %[d1]\n\t"
  26754. "mov %[d1], r9\n\t"
  26755. #ifdef WOLFSSL_KEIL
  26756. "sbcs %[d1], %[d1], r5\n\t"
  26757. #elif defined(__clang__)
  26758. "sbcs %[d1], r5\n\t"
  26759. #else
  26760. "sbc %[d1], r5\n\t"
  26761. #endif
  26762. "movs r5, %[d1]\n\t"
  26763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26764. "adds r3, r3, r5\n\t"
  26765. #else
  26766. "add r3, r3, r5\n\t"
  26767. #endif
  26768. "# r * div - Start\n\t"
  26769. "uxth %[d1], r3\n\t"
  26770. "uxth r4, %[div]\n\t"
  26771. #ifdef WOLFSSL_KEIL
  26772. "muls r4, %[d1], r4\n\t"
  26773. #elif defined(__clang__)
  26774. "muls r4, %[d1]\n\t"
  26775. #else
  26776. "mul r4, %[d1]\n\t"
  26777. #endif
  26778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26779. "lsrs r6, %[div], #16\n\t"
  26780. #else
  26781. "lsr r6, %[div], #16\n\t"
  26782. #endif
  26783. #ifdef WOLFSSL_KEIL
  26784. "muls %[d1], r6, %[d1]\n\t"
  26785. #elif defined(__clang__)
  26786. "muls %[d1], r6\n\t"
  26787. #else
  26788. "mul %[d1], r6\n\t"
  26789. #endif
  26790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26791. "lsrs r5, %[d1], #16\n\t"
  26792. #else
  26793. "lsr r5, %[d1], #16\n\t"
  26794. #endif
  26795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26796. "lsls %[d1], %[d1], #16\n\t"
  26797. #else
  26798. "lsl %[d1], %[d1], #16\n\t"
  26799. #endif
  26800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26801. "adds r4, r4, %[d1]\n\t"
  26802. #else
  26803. "add r4, r4, %[d1]\n\t"
  26804. #endif
  26805. #ifdef WOLFSSL_KEIL
  26806. "adcs r5, r5, r7\n\t"
  26807. #elif defined(__clang__)
  26808. "adcs r5, r7\n\t"
  26809. #else
  26810. "adc r5, r7\n\t"
  26811. #endif
  26812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26813. "lsrs %[d1], r3, #16\n\t"
  26814. #else
  26815. "lsr %[d1], r3, #16\n\t"
  26816. #endif
  26817. #ifdef WOLFSSL_KEIL
  26818. "muls r6, %[d1], r6\n\t"
  26819. #elif defined(__clang__)
  26820. "muls r6, %[d1]\n\t"
  26821. #else
  26822. "mul r6, %[d1]\n\t"
  26823. #endif
  26824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26825. "adds r5, r5, r6\n\t"
  26826. #else
  26827. "add r5, r5, r6\n\t"
  26828. #endif
  26829. "uxth r6, %[div]\n\t"
  26830. #ifdef WOLFSSL_KEIL
  26831. "muls %[d1], r6, %[d1]\n\t"
  26832. #elif defined(__clang__)
  26833. "muls %[d1], r6\n\t"
  26834. #else
  26835. "mul %[d1], r6\n\t"
  26836. #endif
  26837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26838. "lsrs r6, %[d1], #16\n\t"
  26839. #else
  26840. "lsr r6, %[d1], #16\n\t"
  26841. #endif
  26842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26843. "lsls %[d1], %[d1], #16\n\t"
  26844. #else
  26845. "lsl %[d1], %[d1], #16\n\t"
  26846. #endif
  26847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26848. "adds r4, r4, %[d1]\n\t"
  26849. #else
  26850. "add r4, r4, %[d1]\n\t"
  26851. #endif
  26852. #ifdef WOLFSSL_KEIL
  26853. "adcs r5, r5, r6\n\t"
  26854. #elif defined(__clang__)
  26855. "adcs r5, r6\n\t"
  26856. #else
  26857. "adc r5, r6\n\t"
  26858. #endif
  26859. "# r * div - Done\n\t"
  26860. "mov %[d1], r8\n\t"
  26861. "mov r6, r9\n\t"
  26862. #ifdef WOLFSSL_KEIL
  26863. "subs r4, %[d1], r4\n\t"
  26864. #else
  26865. #ifdef __clang__
  26866. "subs r4, %[d1], r4\n\t"
  26867. #else
  26868. "sub r4, %[d1], r4\n\t"
  26869. #endif
  26870. #endif
  26871. #ifdef WOLFSSL_KEIL
  26872. "sbcs r6, r6, r5\n\t"
  26873. #elif defined(__clang__)
  26874. "sbcs r6, r5\n\t"
  26875. #else
  26876. "sbc r6, r5\n\t"
  26877. #endif
  26878. "movs r5, r6\n\t"
  26879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26880. "adds r3, r3, r5\n\t"
  26881. #else
  26882. "add r3, r3, r5\n\t"
  26883. #endif
  26884. "# r * div - Start\n\t"
  26885. "uxth %[d1], r3\n\t"
  26886. "uxth r4, %[div]\n\t"
  26887. #ifdef WOLFSSL_KEIL
  26888. "muls r4, %[d1], r4\n\t"
  26889. #elif defined(__clang__)
  26890. "muls r4, %[d1]\n\t"
  26891. #else
  26892. "mul r4, %[d1]\n\t"
  26893. #endif
  26894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26895. "lsrs r6, %[div], #16\n\t"
  26896. #else
  26897. "lsr r6, %[div], #16\n\t"
  26898. #endif
  26899. #ifdef WOLFSSL_KEIL
  26900. "muls %[d1], r6, %[d1]\n\t"
  26901. #elif defined(__clang__)
  26902. "muls %[d1], r6\n\t"
  26903. #else
  26904. "mul %[d1], r6\n\t"
  26905. #endif
  26906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26907. "lsrs r5, %[d1], #16\n\t"
  26908. #else
  26909. "lsr r5, %[d1], #16\n\t"
  26910. #endif
  26911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26912. "lsls %[d1], %[d1], #16\n\t"
  26913. #else
  26914. "lsl %[d1], %[d1], #16\n\t"
  26915. #endif
  26916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26917. "adds r4, r4, %[d1]\n\t"
  26918. #else
  26919. "add r4, r4, %[d1]\n\t"
  26920. #endif
  26921. #ifdef WOLFSSL_KEIL
  26922. "adcs r5, r5, r7\n\t"
  26923. #elif defined(__clang__)
  26924. "adcs r5, r7\n\t"
  26925. #else
  26926. "adc r5, r7\n\t"
  26927. #endif
  26928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26929. "lsrs %[d1], r3, #16\n\t"
  26930. #else
  26931. "lsr %[d1], r3, #16\n\t"
  26932. #endif
  26933. #ifdef WOLFSSL_KEIL
  26934. "muls r6, %[d1], r6\n\t"
  26935. #elif defined(__clang__)
  26936. "muls r6, %[d1]\n\t"
  26937. #else
  26938. "mul r6, %[d1]\n\t"
  26939. #endif
  26940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26941. "adds r5, r5, r6\n\t"
  26942. #else
  26943. "add r5, r5, r6\n\t"
  26944. #endif
  26945. "uxth r6, %[div]\n\t"
  26946. #ifdef WOLFSSL_KEIL
  26947. "muls %[d1], r6, %[d1]\n\t"
  26948. #elif defined(__clang__)
  26949. "muls %[d1], r6\n\t"
  26950. #else
  26951. "mul %[d1], r6\n\t"
  26952. #endif
  26953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26954. "lsrs r6, %[d1], #16\n\t"
  26955. #else
  26956. "lsr r6, %[d1], #16\n\t"
  26957. #endif
  26958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26959. "lsls %[d1], %[d1], #16\n\t"
  26960. #else
  26961. "lsl %[d1], %[d1], #16\n\t"
  26962. #endif
  26963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26964. "adds r4, r4, %[d1]\n\t"
  26965. #else
  26966. "add r4, r4, %[d1]\n\t"
  26967. #endif
  26968. #ifdef WOLFSSL_KEIL
  26969. "adcs r5, r5, r6\n\t"
  26970. #elif defined(__clang__)
  26971. "adcs r5, r6\n\t"
  26972. #else
  26973. "adc r5, r6\n\t"
  26974. #endif
  26975. "# r * div - Done\n\t"
  26976. "mov %[d1], r8\n\t"
  26977. "mov r6, r9\n\t"
  26978. #ifdef WOLFSSL_KEIL
  26979. "subs r4, %[d1], r4\n\t"
  26980. #else
  26981. #ifdef __clang__
  26982. "subs r4, %[d1], r4\n\t"
  26983. #else
  26984. "sub r4, %[d1], r4\n\t"
  26985. #endif
  26986. #endif
  26987. #ifdef WOLFSSL_KEIL
  26988. "sbcs r6, r6, r5\n\t"
  26989. #elif defined(__clang__)
  26990. "sbcs r6, r5\n\t"
  26991. #else
  26992. "sbc r6, r5\n\t"
  26993. #endif
  26994. "movs r5, r6\n\t"
  26995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  26996. "adds r3, r3, r5\n\t"
  26997. #else
  26998. "add r3, r3, r5\n\t"
  26999. #endif
  27000. "# r * div - Start\n\t"
  27001. "uxth %[d1], r3\n\t"
  27002. "uxth r4, %[div]\n\t"
  27003. #ifdef WOLFSSL_KEIL
  27004. "muls r4, %[d1], r4\n\t"
  27005. #elif defined(__clang__)
  27006. "muls r4, %[d1]\n\t"
  27007. #else
  27008. "mul r4, %[d1]\n\t"
  27009. #endif
  27010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27011. "lsrs r6, %[div], #16\n\t"
  27012. #else
  27013. "lsr r6, %[div], #16\n\t"
  27014. #endif
  27015. #ifdef WOLFSSL_KEIL
  27016. "muls %[d1], r6, %[d1]\n\t"
  27017. #elif defined(__clang__)
  27018. "muls %[d1], r6\n\t"
  27019. #else
  27020. "mul %[d1], r6\n\t"
  27021. #endif
  27022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27023. "lsrs r5, %[d1], #16\n\t"
  27024. #else
  27025. "lsr r5, %[d1], #16\n\t"
  27026. #endif
  27027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27028. "lsls %[d1], %[d1], #16\n\t"
  27029. #else
  27030. "lsl %[d1], %[d1], #16\n\t"
  27031. #endif
  27032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27033. "adds r4, r4, %[d1]\n\t"
  27034. #else
  27035. "add r4, r4, %[d1]\n\t"
  27036. #endif
  27037. #ifdef WOLFSSL_KEIL
  27038. "adcs r5, r5, r7\n\t"
  27039. #elif defined(__clang__)
  27040. "adcs r5, r7\n\t"
  27041. #else
  27042. "adc r5, r7\n\t"
  27043. #endif
  27044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27045. "lsrs %[d1], r3, #16\n\t"
  27046. #else
  27047. "lsr %[d1], r3, #16\n\t"
  27048. #endif
  27049. #ifdef WOLFSSL_KEIL
  27050. "muls r6, %[d1], r6\n\t"
  27051. #elif defined(__clang__)
  27052. "muls r6, %[d1]\n\t"
  27053. #else
  27054. "mul r6, %[d1]\n\t"
  27055. #endif
  27056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27057. "adds r5, r5, r6\n\t"
  27058. #else
  27059. "add r5, r5, r6\n\t"
  27060. #endif
  27061. "uxth r6, %[div]\n\t"
  27062. #ifdef WOLFSSL_KEIL
  27063. "muls %[d1], r6, %[d1]\n\t"
  27064. #elif defined(__clang__)
  27065. "muls %[d1], r6\n\t"
  27066. #else
  27067. "mul %[d1], r6\n\t"
  27068. #endif
  27069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27070. "lsrs r6, %[d1], #16\n\t"
  27071. #else
  27072. "lsr r6, %[d1], #16\n\t"
  27073. #endif
  27074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27075. "lsls %[d1], %[d1], #16\n\t"
  27076. #else
  27077. "lsl %[d1], %[d1], #16\n\t"
  27078. #endif
  27079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27080. "adds r4, r4, %[d1]\n\t"
  27081. #else
  27082. "add r4, r4, %[d1]\n\t"
  27083. #endif
  27084. #ifdef WOLFSSL_KEIL
  27085. "adcs r5, r5, r6\n\t"
  27086. #elif defined(__clang__)
  27087. "adcs r5, r6\n\t"
  27088. #else
  27089. "adc r5, r6\n\t"
  27090. #endif
  27091. "# r * div - Done\n\t"
  27092. "mov %[d1], r8\n\t"
  27093. "mov r6, r9\n\t"
  27094. #ifdef WOLFSSL_KEIL
  27095. "subs r4, %[d1], r4\n\t"
  27096. #else
  27097. #ifdef __clang__
  27098. "subs r4, %[d1], r4\n\t"
  27099. #else
  27100. "sub r4, %[d1], r4\n\t"
  27101. #endif
  27102. #endif
  27103. #ifdef WOLFSSL_KEIL
  27104. "sbcs r6, r6, r5\n\t"
  27105. #elif defined(__clang__)
  27106. "sbcs r6, r5\n\t"
  27107. #else
  27108. "sbc r6, r5\n\t"
  27109. #endif
  27110. "movs r5, r6\n\t"
  27111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27112. "adds r3, r3, r5\n\t"
  27113. #else
  27114. "add r3, r3, r5\n\t"
  27115. #endif
  27116. "movs r6, %[div]\n\t"
  27117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27118. "subs r6, r6, r4\n\t"
  27119. #else
  27120. "sub r6, r6, r4\n\t"
  27121. #endif
  27122. #ifdef WOLFSSL_KEIL
  27123. "sbcs r6, r6, r6\n\t"
  27124. #elif defined(__clang__)
  27125. "sbcs r6, r6\n\t"
  27126. #else
  27127. "sbc r6, r6\n\t"
  27128. #endif
  27129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27130. "subs r3, r3, r6\n\t"
  27131. #else
  27132. "sub r3, r3, r6\n\t"
  27133. #endif
  27134. "movs %[d1], r3\n\t"
  27135. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  27136. :
  27137. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  27138. );
  27139. return (uint32_t)(size_t)d1;
  27140. }
  27141. /* Divide d in a and put remainder into r (m*d + r = a)
  27142. * m is not calculated as it is not needed at this time.
  27143. *
  27144. * a Number to be divided.
  27145. * d Number to divide with.
  27146. * m Multiplier result.
  27147. * r Remainder from the division.
  27148. * returns MP_OKAY indicating success.
  27149. */
  27150. static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
  27151. sp_digit* r)
  27152. {
  27153. sp_digit t1[128], t2[65];
  27154. sp_digit div, r1;
  27155. int i;
  27156. (void)m;
  27157. div = d[63];
  27158. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  27159. for (i = 63; i > 0; i--) {
  27160. if (t1[i + 64] != d[i])
  27161. break;
  27162. }
  27163. if (t1[i + 64] >= d[i]) {
  27164. sp_2048_sub_in_place_64(&t1[64], d);
  27165. }
  27166. for (i = 63; i >= 0; i--) {
  27167. if (t1[64 + i] == div) {
  27168. r1 = SP_DIGIT_MAX;
  27169. }
  27170. else {
  27171. r1 = div_2048_word_64(t1[64 + i], t1[64 + i - 1], div);
  27172. }
  27173. sp_2048_mul_d_64(t2, d, r1);
  27174. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  27175. t1[64 + i] -= t2[64];
  27176. if (t1[64 + i] != 0) {
  27177. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  27178. if (t1[64 + i] != 0)
  27179. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], d);
  27180. }
  27181. }
  27182. for (i = 63; i > 0; i--) {
  27183. if (t1[i] != d[i])
  27184. break;
  27185. }
  27186. if (t1[i] >= d[i]) {
  27187. sp_2048_sub_64(r, t1, d);
  27188. }
  27189. else {
  27190. XMEMCPY(r, t1, sizeof(*t1) * 64);
  27191. }
  27192. return MP_OKAY;
  27193. }
  27194. /* Reduce a modulo m into r. (r = a mod m)
  27195. *
  27196. * r A single precision number that is the reduced result.
  27197. * a A single precision number that is to be reduced.
  27198. * m A single precision number that is the modulus to reduce with.
  27199. * returns MP_OKAY indicating success.
  27200. */
  27201. static WC_INLINE int sp_2048_mod_64_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  27202. {
  27203. int ret;
  27204. ret = sp_2048_div_64_cond(a, m, NULL, r);
  27205. return ret;
  27206. }
  27207. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  27208. /* AND m into each word of a and store in r.
  27209. *
  27210. * r A single precision integer.
  27211. * a A single precision integer.
  27212. * m Mask to AND against each digit.
  27213. */
  27214. static void sp_2048_mask_64(sp_digit* r, const sp_digit* a, sp_digit m)
  27215. {
  27216. #ifdef WOLFSSL_SP_SMALL
  27217. int i;
  27218. for (i=0; i<64; i++) {
  27219. r[i] = a[i] & m;
  27220. }
  27221. #else
  27222. int i;
  27223. for (i = 0; i < 64; i += 8) {
  27224. r[i+0] = a[i+0] & m;
  27225. r[i+1] = a[i+1] & m;
  27226. r[i+2] = a[i+2] & m;
  27227. r[i+3] = a[i+3] & m;
  27228. r[i+4] = a[i+4] & m;
  27229. r[i+5] = a[i+5] & m;
  27230. r[i+6] = a[i+6] & m;
  27231. r[i+7] = a[i+7] & m;
  27232. }
  27233. #endif
  27234. }
  27235. /* Compare a with b in constant time.
  27236. *
  27237. * a A single precision integer.
  27238. * b A single precision integer.
  27239. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  27240. * respectively.
  27241. */
  27242. SP_NOINLINE static sp_int32 sp_2048_cmp_64(const sp_digit* a, const sp_digit* b)
  27243. {
  27244. __asm__ __volatile__ (
  27245. "movs r2, #0\n\t"
  27246. "movs r3, #0\n\t"
  27247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27248. "mvns r3, r3\n\t"
  27249. #else
  27250. "mvn r3, r3\n\t"
  27251. #endif
  27252. "movs r6, #0xfc\n\t"
  27253. "\n"
  27254. "L_sp_2048_cmp_64_words_%=:\n\t"
  27255. "ldr r7, [%[a], r6]\n\t"
  27256. "ldr r5, [%[b], r6]\n\t"
  27257. #ifdef WOLFSSL_KEIL
  27258. "ands r7, r7, r3\n\t"
  27259. #elif defined(__clang__)
  27260. "ands r7, r3\n\t"
  27261. #else
  27262. "and r7, r3\n\t"
  27263. #endif
  27264. #ifdef WOLFSSL_KEIL
  27265. "ands r5, r5, r3\n\t"
  27266. #elif defined(__clang__)
  27267. "ands r5, r3\n\t"
  27268. #else
  27269. "and r5, r3\n\t"
  27270. #endif
  27271. "movs r4, r7\n\t"
  27272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27273. "subs r7, r7, r5\n\t"
  27274. #else
  27275. "sub r7, r7, r5\n\t"
  27276. #endif
  27277. #ifdef WOLFSSL_KEIL
  27278. "sbcs r7, r7, r7\n\t"
  27279. #elif defined(__clang__)
  27280. "sbcs r7, r7\n\t"
  27281. #else
  27282. "sbc r7, r7\n\t"
  27283. #endif
  27284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27285. "adds r2, r2, r7\n\t"
  27286. #else
  27287. "add r2, r2, r7\n\t"
  27288. #endif
  27289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27290. "mvns r7, r7\n\t"
  27291. #else
  27292. "mvn r7, r7\n\t"
  27293. #endif
  27294. #ifdef WOLFSSL_KEIL
  27295. "ands r3, r3, r7\n\t"
  27296. #elif defined(__clang__)
  27297. "ands r3, r7\n\t"
  27298. #else
  27299. "and r3, r7\n\t"
  27300. #endif
  27301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27302. "subs r5, r5, r4\n\t"
  27303. #else
  27304. "sub r5, r5, r4\n\t"
  27305. #endif
  27306. #ifdef WOLFSSL_KEIL
  27307. "sbcs r7, r7, r7\n\t"
  27308. #elif defined(__clang__)
  27309. "sbcs r7, r7\n\t"
  27310. #else
  27311. "sbc r7, r7\n\t"
  27312. #endif
  27313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27314. "subs r2, r2, r7\n\t"
  27315. #else
  27316. "sub r2, r2, r7\n\t"
  27317. #endif
  27318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27319. "mvns r7, r7\n\t"
  27320. #else
  27321. "mvn r7, r7\n\t"
  27322. #endif
  27323. #ifdef WOLFSSL_KEIL
  27324. "ands r3, r3, r7\n\t"
  27325. #elif defined(__clang__)
  27326. "ands r3, r7\n\t"
  27327. #else
  27328. "and r3, r7\n\t"
  27329. #endif
  27330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27331. "subs r6, r6, #4\n\t"
  27332. #else
  27333. "sub r6, r6, #4\n\t"
  27334. #endif
  27335. "bge L_sp_2048_cmp_64_words_%=\n\t"
  27336. "movs %[a], r2\n\t"
  27337. : [a] "+l" (a), [b] "+l" (b)
  27338. :
  27339. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  27340. );
  27341. return (uint32_t)(size_t)a;
  27342. }
  27343. /* Divide d in a and put remainder into r (m*d + r = a)
  27344. * m is not calculated as it is not needed at this time.
  27345. *
  27346. * a Number to be divided.
  27347. * d Number to divide with.
  27348. * m Multiplier result.
  27349. * r Remainder from the division.
  27350. * returns MP_OKAY indicating success.
  27351. */
  27352. static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d, sp_digit* m,
  27353. sp_digit* r)
  27354. {
  27355. sp_digit t1[128], t2[65];
  27356. sp_digit div, r1;
  27357. int i;
  27358. (void)m;
  27359. div = d[63];
  27360. XMEMCPY(t1, a, sizeof(*t1) * 2 * 64);
  27361. r1 = sp_2048_cmp_64(&t1[64], d) >= 0;
  27362. sp_2048_cond_sub_64(&t1[64], &t1[64], d, (sp_digit)0 - r1);
  27363. for (i = 63; i >= 0; i--) {
  27364. sp_digit mask = 0 - (t1[64 + i] == div);
  27365. sp_digit hi = t1[64 + i] + mask;
  27366. r1 = div_2048_word_64(hi, t1[64 + i - 1], div);
  27367. r1 |= mask;
  27368. sp_2048_mul_d_64(t2, d, r1);
  27369. t1[64 + i] += sp_2048_sub_in_place_64(&t1[i], t2);
  27370. t1[64 + i] -= t2[64];
  27371. sp_2048_mask_64(t2, d, t1[64 + i]);
  27372. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  27373. sp_2048_mask_64(t2, d, t1[64 + i]);
  27374. t1[64 + i] += sp_2048_add_64(&t1[i], &t1[i], t2);
  27375. }
  27376. r1 = sp_2048_cmp_64(t1, d) >= 0;
  27377. sp_2048_cond_sub_64(r, t1, d, (sp_digit)0 - r1);
  27378. return MP_OKAY;
  27379. }
  27380. /* Reduce a modulo m into r. (r = a mod m)
  27381. *
  27382. * r A single precision number that is the reduced result.
  27383. * a A single precision number that is to be reduced.
  27384. * m A single precision number that is the modulus to reduce with.
  27385. * returns MP_OKAY indicating success.
  27386. */
  27387. static WC_INLINE int sp_2048_mod_64(sp_digit* r, const sp_digit* a, const sp_digit* m)
  27388. {
  27389. int ret;
  27390. ret = sp_2048_div_64(a, m, NULL, r);
  27391. return ret;
  27392. }
  27393. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  27394. defined(WOLFSSL_HAVE_SP_DH)
  27395. #ifdef WOLFSSL_SP_SMALL
  27396. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  27397. *
  27398. * r A single precision number that is the result of the operation.
  27399. * a A single precision number being exponentiated.
  27400. * e A single precision number that is the exponent.
  27401. * bits The number of bits in the exponent.
  27402. * m A single precision number that is the modulus.
  27403. * returns 0 on success.
  27404. * returns MEMORY_E on dynamic memory allocation failure.
  27405. * returns MP_VAL when base is even or exponent is 0.
  27406. */
  27407. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  27408. int bits, const sp_digit* m, int reduceA)
  27409. {
  27410. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27411. sp_digit* td = NULL;
  27412. #else
  27413. sp_digit td[8 * 128];
  27414. #endif
  27415. sp_digit* t[8];
  27416. sp_digit* norm = NULL;
  27417. sp_digit mp = 1;
  27418. sp_digit n;
  27419. sp_digit mask;
  27420. int i;
  27421. int c;
  27422. byte y;
  27423. int err = MP_OKAY;
  27424. if (bits == 0) {
  27425. err = MP_VAL;
  27426. }
  27427. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27428. if (err == MP_OKAY) {
  27429. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 128), NULL,
  27430. DYNAMIC_TYPE_TMP_BUFFER);
  27431. if (td == NULL)
  27432. err = MEMORY_E;
  27433. }
  27434. #endif
  27435. if (err == MP_OKAY) {
  27436. norm = td;
  27437. for (i=0; i<8; i++) {
  27438. t[i] = td + i * 128;
  27439. }
  27440. sp_2048_mont_setup(m, &mp);
  27441. sp_2048_mont_norm_64(norm, m);
  27442. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  27443. if (reduceA != 0) {
  27444. err = sp_2048_mod_64(t[1] + 64, a, m);
  27445. if (err == MP_OKAY) {
  27446. err = sp_2048_mod_64(t[1], t[1], m);
  27447. }
  27448. }
  27449. else {
  27450. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  27451. err = sp_2048_mod_64(t[1], t[1], m);
  27452. }
  27453. }
  27454. if (err == MP_OKAY) {
  27455. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  27456. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  27457. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  27458. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  27459. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  27460. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  27461. i = (bits - 1) / 32;
  27462. n = e[i--];
  27463. c = bits & 31;
  27464. if (c == 0) {
  27465. c = 32;
  27466. }
  27467. c -= bits % 3;
  27468. if (c == 32) {
  27469. c = 29;
  27470. }
  27471. if (c < 0) {
  27472. /* Number of bits in top word is less than number needed. */
  27473. c = -c;
  27474. y = (byte)(n << c);
  27475. n = e[i--];
  27476. y |= (byte)(n >> (64 - c));
  27477. n <<= c;
  27478. c = 64 - c;
  27479. }
  27480. else if (c == 0) {
  27481. /* All bits in top word used. */
  27482. y = (byte)n;
  27483. }
  27484. else {
  27485. y = (byte)(n >> c);
  27486. n <<= 32 - c;
  27487. }
  27488. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  27489. for (; i>=0 || c>=3; ) {
  27490. if (c == 0) {
  27491. n = e[i--];
  27492. y = (byte)(n >> 29);
  27493. n <<= 3;
  27494. c = 29;
  27495. }
  27496. else if (c < 3) {
  27497. y = (byte)(n >> 29);
  27498. n = e[i--];
  27499. c = 3 - c;
  27500. y |= (byte)(n >> (32 - c));
  27501. n <<= c;
  27502. c = 32 - c;
  27503. }
  27504. else {
  27505. y = (byte)((n >> 29) & 0x7);
  27506. n <<= 3;
  27507. c -= 3;
  27508. }
  27509. sp_2048_mont_sqr_64(r, r, m, mp);
  27510. sp_2048_mont_sqr_64(r, r, m, mp);
  27511. sp_2048_mont_sqr_64(r, r, m, mp);
  27512. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  27513. }
  27514. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  27515. sp_2048_mont_reduce_64(r, m, mp);
  27516. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  27517. sp_2048_cond_sub_64(r, r, m, mask);
  27518. }
  27519. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27520. if (td != NULL)
  27521. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27522. #endif
  27523. return err;
  27524. }
  27525. #else
  27526. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  27527. *
  27528. * r A single precision number that is the result of the operation.
  27529. * a A single precision number being exponentiated.
  27530. * e A single precision number that is the exponent.
  27531. * bits The number of bits in the exponent.
  27532. * m A single precision number that is the modulus.
  27533. * returns 0 on success.
  27534. * returns MEMORY_E on dynamic memory allocation failure.
  27535. * returns MP_VAL when base is even or exponent is 0.
  27536. */
  27537. static int sp_2048_mod_exp_64(sp_digit* r, const sp_digit* a, const sp_digit* e,
  27538. int bits, const sp_digit* m, int reduceA)
  27539. {
  27540. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27541. sp_digit* td = NULL;
  27542. #else
  27543. sp_digit td[16 * 128];
  27544. #endif
  27545. sp_digit* t[16];
  27546. sp_digit* norm = NULL;
  27547. sp_digit mp = 1;
  27548. sp_digit n;
  27549. sp_digit mask;
  27550. int i;
  27551. int c;
  27552. byte y;
  27553. int err = MP_OKAY;
  27554. if (bits == 0) {
  27555. err = MP_VAL;
  27556. }
  27557. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27558. if (err == MP_OKAY) {
  27559. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 128), NULL,
  27560. DYNAMIC_TYPE_TMP_BUFFER);
  27561. if (td == NULL)
  27562. err = MEMORY_E;
  27563. }
  27564. #endif
  27565. if (err == MP_OKAY) {
  27566. norm = td;
  27567. for (i=0; i<16; i++) {
  27568. t[i] = td + i * 128;
  27569. }
  27570. sp_2048_mont_setup(m, &mp);
  27571. sp_2048_mont_norm_64(norm, m);
  27572. XMEMSET(t[1], 0, sizeof(sp_digit) * 64U);
  27573. if (reduceA != 0) {
  27574. err = sp_2048_mod_64(t[1] + 64, a, m);
  27575. if (err == MP_OKAY) {
  27576. err = sp_2048_mod_64(t[1], t[1], m);
  27577. }
  27578. }
  27579. else {
  27580. XMEMCPY(t[1] + 64, a, sizeof(sp_digit) * 64);
  27581. err = sp_2048_mod_64(t[1], t[1], m);
  27582. }
  27583. }
  27584. if (err == MP_OKAY) {
  27585. sp_2048_mont_sqr_64(t[ 2], t[ 1], m, mp);
  27586. sp_2048_mont_mul_64(t[ 3], t[ 2], t[ 1], m, mp);
  27587. sp_2048_mont_sqr_64(t[ 4], t[ 2], m, mp);
  27588. sp_2048_mont_mul_64(t[ 5], t[ 3], t[ 2], m, mp);
  27589. sp_2048_mont_sqr_64(t[ 6], t[ 3], m, mp);
  27590. sp_2048_mont_mul_64(t[ 7], t[ 4], t[ 3], m, mp);
  27591. sp_2048_mont_sqr_64(t[ 8], t[ 4], m, mp);
  27592. sp_2048_mont_mul_64(t[ 9], t[ 5], t[ 4], m, mp);
  27593. sp_2048_mont_sqr_64(t[10], t[ 5], m, mp);
  27594. sp_2048_mont_mul_64(t[11], t[ 6], t[ 5], m, mp);
  27595. sp_2048_mont_sqr_64(t[12], t[ 6], m, mp);
  27596. sp_2048_mont_mul_64(t[13], t[ 7], t[ 6], m, mp);
  27597. sp_2048_mont_sqr_64(t[14], t[ 7], m, mp);
  27598. sp_2048_mont_mul_64(t[15], t[ 8], t[ 7], m, mp);
  27599. i = (bits - 1) / 32;
  27600. n = e[i--];
  27601. c = bits & 31;
  27602. if (c == 0) {
  27603. c = 32;
  27604. }
  27605. c -= bits % 4;
  27606. if (c == 32) {
  27607. c = 28;
  27608. }
  27609. if (c < 0) {
  27610. /* Number of bits in top word is less than number needed. */
  27611. c = -c;
  27612. y = (byte)(n << c);
  27613. n = e[i--];
  27614. y |= (byte)(n >> (64 - c));
  27615. n <<= c;
  27616. c = 64 - c;
  27617. }
  27618. else if (c == 0) {
  27619. /* All bits in top word used. */
  27620. y = (byte)n;
  27621. }
  27622. else {
  27623. y = (byte)(n >> c);
  27624. n <<= 32 - c;
  27625. }
  27626. XMEMCPY(r, t[y], sizeof(sp_digit) * 64);
  27627. for (; i>=0 || c>=4; ) {
  27628. if (c == 0) {
  27629. n = e[i--];
  27630. y = (byte)(n >> 28);
  27631. n <<= 4;
  27632. c = 28;
  27633. }
  27634. else if (c < 4) {
  27635. y = (byte)(n >> 28);
  27636. n = e[i--];
  27637. c = 4 - c;
  27638. y |= (byte)(n >> (32 - c));
  27639. n <<= c;
  27640. c = 32 - c;
  27641. }
  27642. else {
  27643. y = (byte)((n >> 28) & 0xf);
  27644. n <<= 4;
  27645. c -= 4;
  27646. }
  27647. sp_2048_mont_sqr_64(r, r, m, mp);
  27648. sp_2048_mont_sqr_64(r, r, m, mp);
  27649. sp_2048_mont_sqr_64(r, r, m, mp);
  27650. sp_2048_mont_sqr_64(r, r, m, mp);
  27651. sp_2048_mont_mul_64(r, r, t[y], m, mp);
  27652. }
  27653. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  27654. sp_2048_mont_reduce_64(r, m, mp);
  27655. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  27656. sp_2048_cond_sub_64(r, r, m, mask);
  27657. }
  27658. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27659. if (td != NULL)
  27660. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  27661. #endif
  27662. return err;
  27663. }
  27664. #endif /* WOLFSSL_SP_SMALL */
  27665. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  27666. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  27667. #ifdef WOLFSSL_HAVE_SP_RSA
  27668. /* RSA public key operation.
  27669. *
  27670. * in Array of bytes representing the number to exponentiate, base.
  27671. * inLen Number of bytes in base.
  27672. * em Public exponent.
  27673. * mm Modulus.
  27674. * out Buffer to hold big-endian bytes of exponentiation result.
  27675. * Must be at least 256 bytes long.
  27676. * outLen Number of bytes in result.
  27677. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  27678. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  27679. */
  27680. int sp_RsaPublic_2048(const byte* in, word32 inLen, const mp_int* em,
  27681. const mp_int* mm, byte* out, word32* outLen)
  27682. {
  27683. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27684. sp_digit* a = NULL;
  27685. #else
  27686. sp_digit a[64 * 5];
  27687. #endif
  27688. sp_digit* m = NULL;
  27689. sp_digit* r = NULL;
  27690. sp_digit *ah = NULL;
  27691. sp_digit e[1] = {0};
  27692. int err = MP_OKAY;
  27693. if (*outLen < 256) {
  27694. err = MP_TO_E;
  27695. }
  27696. else if (mp_count_bits(em) > 32 || inLen > 256 ||
  27697. mp_count_bits(mm) != 2048) {
  27698. err = MP_READ_E;
  27699. }
  27700. else if (mp_iseven(mm)) {
  27701. err = MP_VAL;
  27702. }
  27703. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27704. if (err == MP_OKAY) {
  27705. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 5, NULL,
  27706. DYNAMIC_TYPE_RSA);
  27707. if (a == NULL)
  27708. err = MEMORY_E;
  27709. }
  27710. #endif
  27711. if (err == MP_OKAY) {
  27712. ah = a + 64;
  27713. r = a + 64 * 2;
  27714. m = r + 64 * 2;
  27715. sp_2048_from_bin(ah, 64, in, inLen);
  27716. #if DIGIT_BIT >= 32
  27717. e[0] = em->dp[0];
  27718. #else
  27719. e[0] = em->dp[0];
  27720. if (em->used > 1) {
  27721. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  27722. }
  27723. #endif
  27724. if (e[0] == 0) {
  27725. err = MP_EXPTMOD_E;
  27726. }
  27727. }
  27728. if (err == MP_OKAY) {
  27729. sp_2048_from_mp(m, 64, mm);
  27730. if (e[0] == 0x10001) {
  27731. int i;
  27732. sp_digit mp;
  27733. sp_2048_mont_setup(m, &mp);
  27734. /* Convert to Montgomery form. */
  27735. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  27736. err = sp_2048_mod_64_cond(r, a, m);
  27737. /* Montgomery form: r = a.R mod m */
  27738. if (err == MP_OKAY) {
  27739. /* r = a ^ 0x10000 => r = a squared 16 times */
  27740. for (i = 15; i >= 0; i--) {
  27741. sp_2048_mont_sqr_64(r, r, m, mp);
  27742. }
  27743. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  27744. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  27745. */
  27746. sp_2048_mont_mul_64(r, r, ah, m, mp);
  27747. for (i = 63; i > 0; i--) {
  27748. if (r[i] != m[i]) {
  27749. break;
  27750. }
  27751. }
  27752. if (r[i] >= m[i]) {
  27753. sp_2048_sub_in_place_64(r, m);
  27754. }
  27755. }
  27756. }
  27757. else if (e[0] == 0x3) {
  27758. if (err == MP_OKAY) {
  27759. sp_2048_sqr_64(r, ah);
  27760. err = sp_2048_mod_64_cond(r, r, m);
  27761. }
  27762. if (err == MP_OKAY) {
  27763. sp_2048_mul_64(r, ah, r);
  27764. err = sp_2048_mod_64_cond(r, r, m);
  27765. }
  27766. }
  27767. else {
  27768. int i;
  27769. sp_digit mp;
  27770. sp_2048_mont_setup(m, &mp);
  27771. /* Convert to Montgomery form. */
  27772. XMEMSET(a, 0, sizeof(sp_digit) * 64);
  27773. err = sp_2048_mod_64_cond(a, a, m);
  27774. if (err == MP_OKAY) {
  27775. for (i = 31; i >= 0; i--) {
  27776. if (e[0] >> i) {
  27777. break;
  27778. }
  27779. }
  27780. XMEMCPY(r, a, sizeof(sp_digit) * 64);
  27781. for (i--; i >= 0; i--) {
  27782. sp_2048_mont_sqr_64(r, r, m, mp);
  27783. if (((e[0] >> i) & 1) == 1) {
  27784. sp_2048_mont_mul_64(r, r, a, m, mp);
  27785. }
  27786. }
  27787. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64);
  27788. sp_2048_mont_reduce_64(r, m, mp);
  27789. for (i = 63; i > 0; i--) {
  27790. if (r[i] != m[i]) {
  27791. break;
  27792. }
  27793. }
  27794. if (r[i] >= m[i]) {
  27795. sp_2048_sub_in_place_64(r, m);
  27796. }
  27797. }
  27798. }
  27799. }
  27800. if (err == MP_OKAY) {
  27801. sp_2048_to_bin_64(r, out);
  27802. *outLen = 256;
  27803. }
  27804. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27805. if (a != NULL)
  27806. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  27807. #endif
  27808. return err;
  27809. }
  27810. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  27811. /* Conditionally add a and b using the mask m.
  27812. * m is -1 to add and 0 when not.
  27813. *
  27814. * r A single precision number representing conditional add result.
  27815. * a A single precision number to add with.
  27816. * b A single precision number to add.
  27817. * m Mask value to apply.
  27818. */
  27819. SP_NOINLINE static sp_digit sp_2048_cond_add_32(sp_digit* r, const sp_digit* a,
  27820. const sp_digit* b, sp_digit m)
  27821. {
  27822. __asm__ __volatile__ (
  27823. "movs r4, #0\n\t"
  27824. "movs r5, #0x80\n\t"
  27825. "mov r8, r5\n\t"
  27826. "movs r7, #0\n\t"
  27827. "\n"
  27828. "L_sp_2048_cond_add_32_words_%=:\n\t"
  27829. "ldr r6, [%[b], r7]\n\t"
  27830. #ifdef WOLFSSL_KEIL
  27831. "ands r6, r6, %[m]\n\t"
  27832. #elif defined(__clang__)
  27833. "ands r6, %[m]\n\t"
  27834. #else
  27835. "and r6, %[m]\n\t"
  27836. #endif
  27837. "movs r5, #0\n\t"
  27838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27839. "subs r5, r5, #1\n\t"
  27840. #else
  27841. "sub r5, r5, #1\n\t"
  27842. #endif
  27843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27844. "adds r5, r5, r4\n\t"
  27845. #else
  27846. "add r5, r5, r4\n\t"
  27847. #endif
  27848. "ldr r5, [%[a], r7]\n\t"
  27849. #ifdef WOLFSSL_KEIL
  27850. "adcs r5, r5, r6\n\t"
  27851. #elif defined(__clang__)
  27852. "adcs r5, r6\n\t"
  27853. #else
  27854. "adc r5, r6\n\t"
  27855. #endif
  27856. "movs r4, #0\n\t"
  27857. #ifdef WOLFSSL_KEIL
  27858. "adcs r4, r4, r4\n\t"
  27859. #elif defined(__clang__)
  27860. "adcs r4, r4\n\t"
  27861. #else
  27862. "adc r4, r4\n\t"
  27863. #endif
  27864. "str r5, [%[r], r7]\n\t"
  27865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  27866. "adds r7, r7, #4\n\t"
  27867. #else
  27868. "add r7, r7, #4\n\t"
  27869. #endif
  27870. "cmp r7, r8\n\t"
  27871. "blt L_sp_2048_cond_add_32_words_%=\n\t"
  27872. "movs %[r], r4\n\t"
  27873. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  27874. :
  27875. : "memory", "r4", "r5", "r6", "r7", "r8"
  27876. );
  27877. return (uint32_t)(size_t)r;
  27878. }
  27879. /* RSA private key operation.
  27880. *
  27881. * in Array of bytes representing the number to exponentiate, base.
  27882. * inLen Number of bytes in base.
  27883. * dm Private exponent.
  27884. * pm First prime.
  27885. * qm Second prime.
  27886. * dpm First prime's CRT exponent.
  27887. * dqm Second prime's CRT exponent.
  27888. * qim Inverse of second prime mod p.
  27889. * mm Modulus.
  27890. * out Buffer to hold big-endian bytes of exponentiation result.
  27891. * Must be at least 256 bytes long.
  27892. * outLen Number of bytes in result.
  27893. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  27894. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  27895. */
  27896. int sp_RsaPrivate_2048(const byte* in, word32 inLen, const mp_int* dm,
  27897. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  27898. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  27899. {
  27900. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  27901. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27902. sp_digit* d = NULL;
  27903. #else
  27904. sp_digit d[64 * 4];
  27905. #endif
  27906. sp_digit* a = NULL;
  27907. sp_digit* m = NULL;
  27908. sp_digit* r = NULL;
  27909. int err = MP_OKAY;
  27910. (void)pm;
  27911. (void)qm;
  27912. (void)dpm;
  27913. (void)dqm;
  27914. (void)qim;
  27915. if (*outLen < 256U) {
  27916. err = MP_TO_E;
  27917. }
  27918. if (err == MP_OKAY) {
  27919. if (mp_count_bits(dm) > 2048) {
  27920. err = MP_READ_E;
  27921. }
  27922. else if (inLen > 256) {
  27923. err = MP_READ_E;
  27924. }
  27925. else if (mp_count_bits(mm) != 2048) {
  27926. err = MP_READ_E;
  27927. }
  27928. else if (mp_iseven(mm)) {
  27929. err = MP_VAL;
  27930. }
  27931. }
  27932. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27933. if (err == MP_OKAY) {
  27934. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 4, NULL,
  27935. DYNAMIC_TYPE_RSA);
  27936. if (d == NULL)
  27937. err = MEMORY_E;
  27938. }
  27939. #endif
  27940. if (err == MP_OKAY) {
  27941. a = d + 64;
  27942. m = a + 128;
  27943. r = a;
  27944. sp_2048_from_bin(a, 64, in, inLen);
  27945. sp_2048_from_mp(d, 64, dm);
  27946. sp_2048_from_mp(m, 64, mm);
  27947. err = sp_2048_mod_exp_64(r, a, d, 2048, m, 0);
  27948. }
  27949. if (err == MP_OKAY) {
  27950. sp_2048_to_bin_64(r, out);
  27951. *outLen = 256;
  27952. }
  27953. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27954. if (d != NULL)
  27955. #endif
  27956. {
  27957. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  27958. if (a != NULL)
  27959. ForceZero(a, sizeof(sp_digit) * 64);
  27960. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27961. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  27962. #endif
  27963. }
  27964. return err;
  27965. #else
  27966. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27967. sp_digit* a = NULL;
  27968. #else
  27969. sp_digit a[32 * 11];
  27970. #endif
  27971. sp_digit* p = NULL;
  27972. sp_digit* q = NULL;
  27973. sp_digit* dp = NULL;
  27974. sp_digit* tmpa = NULL;
  27975. sp_digit* tmpb = NULL;
  27976. sp_digit* r = NULL;
  27977. sp_digit* qi = NULL;
  27978. sp_digit* dq = NULL;
  27979. sp_digit c;
  27980. int err = MP_OKAY;
  27981. (void)dm;
  27982. (void)mm;
  27983. if (*outLen < 256) {
  27984. err = MP_TO_E;
  27985. }
  27986. else if (inLen > 256 || mp_count_bits(mm) != 2048) {
  27987. err = MP_READ_E;
  27988. }
  27989. else if (mp_iseven(mm)) {
  27990. err = MP_VAL;
  27991. }
  27992. else if (mp_iseven(pm)) {
  27993. err = MP_VAL;
  27994. }
  27995. else if (mp_iseven(qm)) {
  27996. err = MP_VAL;
  27997. }
  27998. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  27999. if (err == MP_OKAY) {
  28000. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 11, NULL,
  28001. DYNAMIC_TYPE_RSA);
  28002. if (a == NULL)
  28003. err = MEMORY_E;
  28004. }
  28005. #endif
  28006. if (err == MP_OKAY) {
  28007. p = a + 64 * 2;
  28008. q = p + 32;
  28009. qi = dq = dp = q + 32;
  28010. tmpa = qi + 32;
  28011. tmpb = tmpa + 64;
  28012. r = a;
  28013. sp_2048_from_bin(a, 64, in, inLen);
  28014. sp_2048_from_mp(p, 32, pm);
  28015. sp_2048_from_mp(q, 32, qm);
  28016. sp_2048_from_mp(dp, 32, dpm);
  28017. err = sp_2048_mod_exp_32(tmpa, a, dp, 1024, p, 1);
  28018. }
  28019. if (err == MP_OKAY) {
  28020. sp_2048_from_mp(dq, 32, dqm);
  28021. err = sp_2048_mod_exp_32(tmpb, a, dq, 1024, q, 1);
  28022. }
  28023. if (err == MP_OKAY) {
  28024. c = sp_2048_sub_in_place_32(tmpa, tmpb);
  28025. c += sp_2048_cond_add_32(tmpa, tmpa, p, c);
  28026. sp_2048_cond_add_32(tmpa, tmpa, p, c);
  28027. sp_2048_from_mp(qi, 32, qim);
  28028. sp_2048_mul_32(tmpa, tmpa, qi);
  28029. err = sp_2048_mod_32(tmpa, tmpa, p);
  28030. }
  28031. if (err == MP_OKAY) {
  28032. sp_2048_mul_32(tmpa, q, tmpa);
  28033. XMEMSET(&tmpb[32], 0, sizeof(sp_digit) * 32);
  28034. sp_2048_add_64(r, tmpb, tmpa);
  28035. sp_2048_to_bin_64(r, out);
  28036. *outLen = 256;
  28037. }
  28038. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  28039. if (a != NULL)
  28040. #endif
  28041. {
  28042. ForceZero(a, sizeof(sp_digit) * 32 * 11);
  28043. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  28044. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  28045. #endif
  28046. }
  28047. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  28048. return err;
  28049. }
  28050. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  28051. #endif /* WOLFSSL_HAVE_SP_RSA */
  28052. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  28053. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  28054. /* Convert an array of sp_digit to an mp_int.
  28055. *
  28056. * a A single precision integer.
  28057. * r A multi-precision integer.
  28058. */
  28059. static int sp_2048_to_mp(const sp_digit* a, mp_int* r)
  28060. {
  28061. int err;
  28062. err = mp_grow(r, (2048 + DIGIT_BIT - 1) / DIGIT_BIT);
  28063. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  28064. #if DIGIT_BIT == 32
  28065. XMEMCPY(r->dp, a, sizeof(sp_digit) * 64);
  28066. r->used = 64;
  28067. mp_clamp(r);
  28068. #elif DIGIT_BIT < 32
  28069. int i;
  28070. int j = 0;
  28071. int s = 0;
  28072. r->dp[0] = 0;
  28073. for (i = 0; i < 64; i++) {
  28074. r->dp[j] |= (mp_digit)(a[i] << s);
  28075. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  28076. s = DIGIT_BIT - s;
  28077. r->dp[++j] = (mp_digit)(a[i] >> s);
  28078. while (s + DIGIT_BIT <= 32) {
  28079. s += DIGIT_BIT;
  28080. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  28081. if (s == SP_WORD_SIZE) {
  28082. r->dp[j] = 0;
  28083. }
  28084. else {
  28085. r->dp[j] = (mp_digit)(a[i] >> s);
  28086. }
  28087. }
  28088. s = 32 - s;
  28089. }
  28090. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  28091. mp_clamp(r);
  28092. #else
  28093. int i;
  28094. int j = 0;
  28095. int s = 0;
  28096. r->dp[0] = 0;
  28097. for (i = 0; i < 64; i++) {
  28098. r->dp[j] |= ((mp_digit)a[i]) << s;
  28099. if (s + 32 >= DIGIT_BIT) {
  28100. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  28101. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  28102. #endif
  28103. s = DIGIT_BIT - s;
  28104. r->dp[++j] = a[i] >> s;
  28105. s = 32 - s;
  28106. }
  28107. else {
  28108. s += 32;
  28109. }
  28110. }
  28111. r->used = (2048 + DIGIT_BIT - 1) / DIGIT_BIT;
  28112. mp_clamp(r);
  28113. #endif
  28114. }
  28115. return err;
  28116. }
  28117. /* Perform the modular exponentiation for Diffie-Hellman.
  28118. *
  28119. * base Base. MP integer.
  28120. * exp Exponent. MP integer.
  28121. * mod Modulus. MP integer.
  28122. * res Result. MP integer.
  28123. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  28124. * and MEMORY_E if memory allocation fails.
  28125. */
  28126. int sp_ModExp_2048(const mp_int* base, const mp_int* exp, const mp_int* mod,
  28127. mp_int* res)
  28128. {
  28129. int err = MP_OKAY;
  28130. sp_digit b[128];
  28131. sp_digit e[64];
  28132. sp_digit m[64];
  28133. sp_digit* r = b;
  28134. int expBits = mp_count_bits(exp);
  28135. if (mp_count_bits(base) > 2048) {
  28136. err = MP_READ_E;
  28137. }
  28138. else if (expBits > 2048) {
  28139. err = MP_READ_E;
  28140. }
  28141. else if (mp_count_bits(mod) != 2048) {
  28142. err = MP_READ_E;
  28143. }
  28144. else if (mp_iseven(mod)) {
  28145. err = MP_VAL;
  28146. }
  28147. if (err == MP_OKAY) {
  28148. sp_2048_from_mp(b, 64, base);
  28149. sp_2048_from_mp(e, 64, exp);
  28150. sp_2048_from_mp(m, 64, mod);
  28151. err = sp_2048_mod_exp_64(r, b, e, expBits, m, 0);
  28152. }
  28153. if (err == MP_OKAY) {
  28154. err = sp_2048_to_mp(r, res);
  28155. }
  28156. XMEMSET(e, 0, sizeof(e));
  28157. return err;
  28158. }
  28159. #ifdef WOLFSSL_HAVE_SP_DH
  28160. #ifdef HAVE_FFDHE_2048
  28161. /* Lefy shift a by n bits into r. (r = a << n)
  28162. *
  28163. * r A single precision integer.
  28164. * a A single precision integer.
  28165. * n Integer representing number of bits to shift.
  28166. */
  28167. static void sp_2048_lshift_64(sp_digit* r, const sp_digit* a, byte n)
  28168. {
  28169. __asm__ __volatile__ (
  28170. "movs r7, #31\n\t"
  28171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28172. "subs r7, r7, %[n]\n\t"
  28173. #else
  28174. "sub r7, r7, %[n]\n\t"
  28175. #endif
  28176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28177. "adds %[a], %[a], #0xc0\n\t"
  28178. #else
  28179. "add %[a], %[a], #0xc0\n\t"
  28180. #endif
  28181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28182. "adds %[r], %[r], #0xc0\n\t"
  28183. #else
  28184. "add %[r], %[r], #0xc0\n\t"
  28185. #endif
  28186. "ldr r4, [%[a], #60]\n\t"
  28187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28188. "lsrs r5, r4, #1\n\t"
  28189. #else
  28190. "lsr r5, r4, #1\n\t"
  28191. #endif
  28192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28193. "lsls r4, r4, %[n]\n\t"
  28194. #else
  28195. "lsl r4, r4, %[n]\n\t"
  28196. #endif
  28197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28198. "lsrs r5, r5, r7\n\t"
  28199. #else
  28200. "lsr r5, r5, r7\n\t"
  28201. #endif
  28202. "ldr r3, [%[a], #56]\n\t"
  28203. "str r5, [%[r], #64]\n\t"
  28204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28205. "lsrs r6, r3, #1\n\t"
  28206. #else
  28207. "lsr r6, r3, #1\n\t"
  28208. #endif
  28209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28210. "lsls r3, r3, %[n]\n\t"
  28211. #else
  28212. "lsl r3, r3, %[n]\n\t"
  28213. #endif
  28214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28215. "lsrs r6, r6, r7\n\t"
  28216. #else
  28217. "lsr r6, r6, r7\n\t"
  28218. #endif
  28219. #ifdef WOLFSSL_KEIL
  28220. "orrs r4, r4, r6\n\t"
  28221. #elif defined(__clang__)
  28222. "orrs r4, r6\n\t"
  28223. #else
  28224. "orr r4, r6\n\t"
  28225. #endif
  28226. "ldr r5, [%[a], #52]\n\t"
  28227. "str r4, [%[r], #60]\n\t"
  28228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28229. "lsrs r6, r5, #1\n\t"
  28230. #else
  28231. "lsr r6, r5, #1\n\t"
  28232. #endif
  28233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28234. "lsls r5, r5, %[n]\n\t"
  28235. #else
  28236. "lsl r5, r5, %[n]\n\t"
  28237. #endif
  28238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28239. "lsrs r6, r6, r7\n\t"
  28240. #else
  28241. "lsr r6, r6, r7\n\t"
  28242. #endif
  28243. #ifdef WOLFSSL_KEIL
  28244. "orrs r3, r3, r6\n\t"
  28245. #elif defined(__clang__)
  28246. "orrs r3, r6\n\t"
  28247. #else
  28248. "orr r3, r6\n\t"
  28249. #endif
  28250. "ldr r4, [%[a], #48]\n\t"
  28251. "str r3, [%[r], #56]\n\t"
  28252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28253. "lsrs r6, r4, #1\n\t"
  28254. #else
  28255. "lsr r6, r4, #1\n\t"
  28256. #endif
  28257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28258. "lsls r4, r4, %[n]\n\t"
  28259. #else
  28260. "lsl r4, r4, %[n]\n\t"
  28261. #endif
  28262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28263. "lsrs r6, r6, r7\n\t"
  28264. #else
  28265. "lsr r6, r6, r7\n\t"
  28266. #endif
  28267. #ifdef WOLFSSL_KEIL
  28268. "orrs r5, r5, r6\n\t"
  28269. #elif defined(__clang__)
  28270. "orrs r5, r6\n\t"
  28271. #else
  28272. "orr r5, r6\n\t"
  28273. #endif
  28274. "ldr r3, [%[a], #44]\n\t"
  28275. "str r5, [%[r], #52]\n\t"
  28276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28277. "lsrs r6, r3, #1\n\t"
  28278. #else
  28279. "lsr r6, r3, #1\n\t"
  28280. #endif
  28281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28282. "lsls r3, r3, %[n]\n\t"
  28283. #else
  28284. "lsl r3, r3, %[n]\n\t"
  28285. #endif
  28286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28287. "lsrs r6, r6, r7\n\t"
  28288. #else
  28289. "lsr r6, r6, r7\n\t"
  28290. #endif
  28291. #ifdef WOLFSSL_KEIL
  28292. "orrs r4, r4, r6\n\t"
  28293. #elif defined(__clang__)
  28294. "orrs r4, r6\n\t"
  28295. #else
  28296. "orr r4, r6\n\t"
  28297. #endif
  28298. "ldr r5, [%[a], #40]\n\t"
  28299. "str r4, [%[r], #48]\n\t"
  28300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28301. "lsrs r6, r5, #1\n\t"
  28302. #else
  28303. "lsr r6, r5, #1\n\t"
  28304. #endif
  28305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28306. "lsls r5, r5, %[n]\n\t"
  28307. #else
  28308. "lsl r5, r5, %[n]\n\t"
  28309. #endif
  28310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28311. "lsrs r6, r6, r7\n\t"
  28312. #else
  28313. "lsr r6, r6, r7\n\t"
  28314. #endif
  28315. #ifdef WOLFSSL_KEIL
  28316. "orrs r3, r3, r6\n\t"
  28317. #elif defined(__clang__)
  28318. "orrs r3, r6\n\t"
  28319. #else
  28320. "orr r3, r6\n\t"
  28321. #endif
  28322. "ldr r4, [%[a], #36]\n\t"
  28323. "str r3, [%[r], #44]\n\t"
  28324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28325. "lsrs r6, r4, #1\n\t"
  28326. #else
  28327. "lsr r6, r4, #1\n\t"
  28328. #endif
  28329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28330. "lsls r4, r4, %[n]\n\t"
  28331. #else
  28332. "lsl r4, r4, %[n]\n\t"
  28333. #endif
  28334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28335. "lsrs r6, r6, r7\n\t"
  28336. #else
  28337. "lsr r6, r6, r7\n\t"
  28338. #endif
  28339. #ifdef WOLFSSL_KEIL
  28340. "orrs r5, r5, r6\n\t"
  28341. #elif defined(__clang__)
  28342. "orrs r5, r6\n\t"
  28343. #else
  28344. "orr r5, r6\n\t"
  28345. #endif
  28346. "ldr r3, [%[a], #32]\n\t"
  28347. "str r5, [%[r], #40]\n\t"
  28348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28349. "lsrs r6, r3, #1\n\t"
  28350. #else
  28351. "lsr r6, r3, #1\n\t"
  28352. #endif
  28353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28354. "lsls r3, r3, %[n]\n\t"
  28355. #else
  28356. "lsl r3, r3, %[n]\n\t"
  28357. #endif
  28358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28359. "lsrs r6, r6, r7\n\t"
  28360. #else
  28361. "lsr r6, r6, r7\n\t"
  28362. #endif
  28363. #ifdef WOLFSSL_KEIL
  28364. "orrs r4, r4, r6\n\t"
  28365. #elif defined(__clang__)
  28366. "orrs r4, r6\n\t"
  28367. #else
  28368. "orr r4, r6\n\t"
  28369. #endif
  28370. "ldr r5, [%[a], #28]\n\t"
  28371. "str r4, [%[r], #36]\n\t"
  28372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28373. "lsrs r6, r5, #1\n\t"
  28374. #else
  28375. "lsr r6, r5, #1\n\t"
  28376. #endif
  28377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28378. "lsls r5, r5, %[n]\n\t"
  28379. #else
  28380. "lsl r5, r5, %[n]\n\t"
  28381. #endif
  28382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28383. "lsrs r6, r6, r7\n\t"
  28384. #else
  28385. "lsr r6, r6, r7\n\t"
  28386. #endif
  28387. #ifdef WOLFSSL_KEIL
  28388. "orrs r3, r3, r6\n\t"
  28389. #elif defined(__clang__)
  28390. "orrs r3, r6\n\t"
  28391. #else
  28392. "orr r3, r6\n\t"
  28393. #endif
  28394. "ldr r4, [%[a], #24]\n\t"
  28395. "str r3, [%[r], #32]\n\t"
  28396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28397. "lsrs r6, r4, #1\n\t"
  28398. #else
  28399. "lsr r6, r4, #1\n\t"
  28400. #endif
  28401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28402. "lsls r4, r4, %[n]\n\t"
  28403. #else
  28404. "lsl r4, r4, %[n]\n\t"
  28405. #endif
  28406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28407. "lsrs r6, r6, r7\n\t"
  28408. #else
  28409. "lsr r6, r6, r7\n\t"
  28410. #endif
  28411. #ifdef WOLFSSL_KEIL
  28412. "orrs r5, r5, r6\n\t"
  28413. #elif defined(__clang__)
  28414. "orrs r5, r6\n\t"
  28415. #else
  28416. "orr r5, r6\n\t"
  28417. #endif
  28418. "ldr r3, [%[a], #20]\n\t"
  28419. "str r5, [%[r], #28]\n\t"
  28420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28421. "lsrs r6, r3, #1\n\t"
  28422. #else
  28423. "lsr r6, r3, #1\n\t"
  28424. #endif
  28425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28426. "lsls r3, r3, %[n]\n\t"
  28427. #else
  28428. "lsl r3, r3, %[n]\n\t"
  28429. #endif
  28430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28431. "lsrs r6, r6, r7\n\t"
  28432. #else
  28433. "lsr r6, r6, r7\n\t"
  28434. #endif
  28435. #ifdef WOLFSSL_KEIL
  28436. "orrs r4, r4, r6\n\t"
  28437. #elif defined(__clang__)
  28438. "orrs r4, r6\n\t"
  28439. #else
  28440. "orr r4, r6\n\t"
  28441. #endif
  28442. "ldr r5, [%[a], #16]\n\t"
  28443. "str r4, [%[r], #24]\n\t"
  28444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28445. "lsrs r6, r5, #1\n\t"
  28446. #else
  28447. "lsr r6, r5, #1\n\t"
  28448. #endif
  28449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28450. "lsls r5, r5, %[n]\n\t"
  28451. #else
  28452. "lsl r5, r5, %[n]\n\t"
  28453. #endif
  28454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28455. "lsrs r6, r6, r7\n\t"
  28456. #else
  28457. "lsr r6, r6, r7\n\t"
  28458. #endif
  28459. #ifdef WOLFSSL_KEIL
  28460. "orrs r3, r3, r6\n\t"
  28461. #elif defined(__clang__)
  28462. "orrs r3, r6\n\t"
  28463. #else
  28464. "orr r3, r6\n\t"
  28465. #endif
  28466. "ldr r4, [%[a], #12]\n\t"
  28467. "str r3, [%[r], #20]\n\t"
  28468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28469. "lsrs r6, r4, #1\n\t"
  28470. #else
  28471. "lsr r6, r4, #1\n\t"
  28472. #endif
  28473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28474. "lsls r4, r4, %[n]\n\t"
  28475. #else
  28476. "lsl r4, r4, %[n]\n\t"
  28477. #endif
  28478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28479. "lsrs r6, r6, r7\n\t"
  28480. #else
  28481. "lsr r6, r6, r7\n\t"
  28482. #endif
  28483. #ifdef WOLFSSL_KEIL
  28484. "orrs r5, r5, r6\n\t"
  28485. #elif defined(__clang__)
  28486. "orrs r5, r6\n\t"
  28487. #else
  28488. "orr r5, r6\n\t"
  28489. #endif
  28490. "ldr r3, [%[a], #8]\n\t"
  28491. "str r5, [%[r], #16]\n\t"
  28492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28493. "lsrs r6, r3, #1\n\t"
  28494. #else
  28495. "lsr r6, r3, #1\n\t"
  28496. #endif
  28497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28498. "lsls r3, r3, %[n]\n\t"
  28499. #else
  28500. "lsl r3, r3, %[n]\n\t"
  28501. #endif
  28502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28503. "lsrs r6, r6, r7\n\t"
  28504. #else
  28505. "lsr r6, r6, r7\n\t"
  28506. #endif
  28507. #ifdef WOLFSSL_KEIL
  28508. "orrs r4, r4, r6\n\t"
  28509. #elif defined(__clang__)
  28510. "orrs r4, r6\n\t"
  28511. #else
  28512. "orr r4, r6\n\t"
  28513. #endif
  28514. "ldr r5, [%[a], #4]\n\t"
  28515. "str r4, [%[r], #12]\n\t"
  28516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28517. "lsrs r6, r5, #1\n\t"
  28518. #else
  28519. "lsr r6, r5, #1\n\t"
  28520. #endif
  28521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28522. "lsls r5, r5, %[n]\n\t"
  28523. #else
  28524. "lsl r5, r5, %[n]\n\t"
  28525. #endif
  28526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28527. "lsrs r6, r6, r7\n\t"
  28528. #else
  28529. "lsr r6, r6, r7\n\t"
  28530. #endif
  28531. #ifdef WOLFSSL_KEIL
  28532. "orrs r3, r3, r6\n\t"
  28533. #elif defined(__clang__)
  28534. "orrs r3, r6\n\t"
  28535. #else
  28536. "orr r3, r6\n\t"
  28537. #endif
  28538. "ldr r4, [%[a]]\n\t"
  28539. "str r3, [%[r], #8]\n\t"
  28540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28541. "lsrs r6, r4, #1\n\t"
  28542. #else
  28543. "lsr r6, r4, #1\n\t"
  28544. #endif
  28545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28546. "lsls r4, r4, %[n]\n\t"
  28547. #else
  28548. "lsl r4, r4, %[n]\n\t"
  28549. #endif
  28550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28551. "lsrs r6, r6, r7\n\t"
  28552. #else
  28553. "lsr r6, r6, r7\n\t"
  28554. #endif
  28555. #ifdef WOLFSSL_KEIL
  28556. "orrs r5, r5, r6\n\t"
  28557. #elif defined(__clang__)
  28558. "orrs r5, r6\n\t"
  28559. #else
  28560. "orr r5, r6\n\t"
  28561. #endif
  28562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28563. "subs %[a], %[a], #0x40\n\t"
  28564. #else
  28565. "sub %[a], %[a], #0x40\n\t"
  28566. #endif
  28567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28568. "subs %[r], %[r], #0x40\n\t"
  28569. #else
  28570. "sub %[r], %[r], #0x40\n\t"
  28571. #endif
  28572. "ldr r3, [%[a], #60]\n\t"
  28573. "str r5, [%[r], #68]\n\t"
  28574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28575. "lsrs r6, r3, #1\n\t"
  28576. #else
  28577. "lsr r6, r3, #1\n\t"
  28578. #endif
  28579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28580. "lsls r3, r3, %[n]\n\t"
  28581. #else
  28582. "lsl r3, r3, %[n]\n\t"
  28583. #endif
  28584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28585. "lsrs r6, r6, r7\n\t"
  28586. #else
  28587. "lsr r6, r6, r7\n\t"
  28588. #endif
  28589. #ifdef WOLFSSL_KEIL
  28590. "orrs r4, r4, r6\n\t"
  28591. #elif defined(__clang__)
  28592. "orrs r4, r6\n\t"
  28593. #else
  28594. "orr r4, r6\n\t"
  28595. #endif
  28596. "ldr r5, [%[a], #56]\n\t"
  28597. "str r4, [%[r], #64]\n\t"
  28598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28599. "lsrs r6, r5, #1\n\t"
  28600. #else
  28601. "lsr r6, r5, #1\n\t"
  28602. #endif
  28603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28604. "lsls r5, r5, %[n]\n\t"
  28605. #else
  28606. "lsl r5, r5, %[n]\n\t"
  28607. #endif
  28608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28609. "lsrs r6, r6, r7\n\t"
  28610. #else
  28611. "lsr r6, r6, r7\n\t"
  28612. #endif
  28613. #ifdef WOLFSSL_KEIL
  28614. "orrs r3, r3, r6\n\t"
  28615. #elif defined(__clang__)
  28616. "orrs r3, r6\n\t"
  28617. #else
  28618. "orr r3, r6\n\t"
  28619. #endif
  28620. "ldr r4, [%[a], #52]\n\t"
  28621. "str r3, [%[r], #60]\n\t"
  28622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28623. "lsrs r6, r4, #1\n\t"
  28624. #else
  28625. "lsr r6, r4, #1\n\t"
  28626. #endif
  28627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28628. "lsls r4, r4, %[n]\n\t"
  28629. #else
  28630. "lsl r4, r4, %[n]\n\t"
  28631. #endif
  28632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28633. "lsrs r6, r6, r7\n\t"
  28634. #else
  28635. "lsr r6, r6, r7\n\t"
  28636. #endif
  28637. #ifdef WOLFSSL_KEIL
  28638. "orrs r5, r5, r6\n\t"
  28639. #elif defined(__clang__)
  28640. "orrs r5, r6\n\t"
  28641. #else
  28642. "orr r5, r6\n\t"
  28643. #endif
  28644. "ldr r3, [%[a], #48]\n\t"
  28645. "str r5, [%[r], #56]\n\t"
  28646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28647. "lsrs r6, r3, #1\n\t"
  28648. #else
  28649. "lsr r6, r3, #1\n\t"
  28650. #endif
  28651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28652. "lsls r3, r3, %[n]\n\t"
  28653. #else
  28654. "lsl r3, r3, %[n]\n\t"
  28655. #endif
  28656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28657. "lsrs r6, r6, r7\n\t"
  28658. #else
  28659. "lsr r6, r6, r7\n\t"
  28660. #endif
  28661. #ifdef WOLFSSL_KEIL
  28662. "orrs r4, r4, r6\n\t"
  28663. #elif defined(__clang__)
  28664. "orrs r4, r6\n\t"
  28665. #else
  28666. "orr r4, r6\n\t"
  28667. #endif
  28668. "ldr r5, [%[a], #44]\n\t"
  28669. "str r4, [%[r], #52]\n\t"
  28670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28671. "lsrs r6, r5, #1\n\t"
  28672. #else
  28673. "lsr r6, r5, #1\n\t"
  28674. #endif
  28675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28676. "lsls r5, r5, %[n]\n\t"
  28677. #else
  28678. "lsl r5, r5, %[n]\n\t"
  28679. #endif
  28680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28681. "lsrs r6, r6, r7\n\t"
  28682. #else
  28683. "lsr r6, r6, r7\n\t"
  28684. #endif
  28685. #ifdef WOLFSSL_KEIL
  28686. "orrs r3, r3, r6\n\t"
  28687. #elif defined(__clang__)
  28688. "orrs r3, r6\n\t"
  28689. #else
  28690. "orr r3, r6\n\t"
  28691. #endif
  28692. "ldr r4, [%[a], #40]\n\t"
  28693. "str r3, [%[r], #48]\n\t"
  28694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28695. "lsrs r6, r4, #1\n\t"
  28696. #else
  28697. "lsr r6, r4, #1\n\t"
  28698. #endif
  28699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28700. "lsls r4, r4, %[n]\n\t"
  28701. #else
  28702. "lsl r4, r4, %[n]\n\t"
  28703. #endif
  28704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28705. "lsrs r6, r6, r7\n\t"
  28706. #else
  28707. "lsr r6, r6, r7\n\t"
  28708. #endif
  28709. #ifdef WOLFSSL_KEIL
  28710. "orrs r5, r5, r6\n\t"
  28711. #elif defined(__clang__)
  28712. "orrs r5, r6\n\t"
  28713. #else
  28714. "orr r5, r6\n\t"
  28715. #endif
  28716. "ldr r3, [%[a], #36]\n\t"
  28717. "str r5, [%[r], #44]\n\t"
  28718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28719. "lsrs r6, r3, #1\n\t"
  28720. #else
  28721. "lsr r6, r3, #1\n\t"
  28722. #endif
  28723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28724. "lsls r3, r3, %[n]\n\t"
  28725. #else
  28726. "lsl r3, r3, %[n]\n\t"
  28727. #endif
  28728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28729. "lsrs r6, r6, r7\n\t"
  28730. #else
  28731. "lsr r6, r6, r7\n\t"
  28732. #endif
  28733. #ifdef WOLFSSL_KEIL
  28734. "orrs r4, r4, r6\n\t"
  28735. #elif defined(__clang__)
  28736. "orrs r4, r6\n\t"
  28737. #else
  28738. "orr r4, r6\n\t"
  28739. #endif
  28740. "ldr r5, [%[a], #32]\n\t"
  28741. "str r4, [%[r], #40]\n\t"
  28742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28743. "lsrs r6, r5, #1\n\t"
  28744. #else
  28745. "lsr r6, r5, #1\n\t"
  28746. #endif
  28747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28748. "lsls r5, r5, %[n]\n\t"
  28749. #else
  28750. "lsl r5, r5, %[n]\n\t"
  28751. #endif
  28752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28753. "lsrs r6, r6, r7\n\t"
  28754. #else
  28755. "lsr r6, r6, r7\n\t"
  28756. #endif
  28757. #ifdef WOLFSSL_KEIL
  28758. "orrs r3, r3, r6\n\t"
  28759. #elif defined(__clang__)
  28760. "orrs r3, r6\n\t"
  28761. #else
  28762. "orr r3, r6\n\t"
  28763. #endif
  28764. "ldr r4, [%[a], #28]\n\t"
  28765. "str r3, [%[r], #36]\n\t"
  28766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28767. "lsrs r6, r4, #1\n\t"
  28768. #else
  28769. "lsr r6, r4, #1\n\t"
  28770. #endif
  28771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28772. "lsls r4, r4, %[n]\n\t"
  28773. #else
  28774. "lsl r4, r4, %[n]\n\t"
  28775. #endif
  28776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28777. "lsrs r6, r6, r7\n\t"
  28778. #else
  28779. "lsr r6, r6, r7\n\t"
  28780. #endif
  28781. #ifdef WOLFSSL_KEIL
  28782. "orrs r5, r5, r6\n\t"
  28783. #elif defined(__clang__)
  28784. "orrs r5, r6\n\t"
  28785. #else
  28786. "orr r5, r6\n\t"
  28787. #endif
  28788. "ldr r3, [%[a], #24]\n\t"
  28789. "str r5, [%[r], #32]\n\t"
  28790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28791. "lsrs r6, r3, #1\n\t"
  28792. #else
  28793. "lsr r6, r3, #1\n\t"
  28794. #endif
  28795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28796. "lsls r3, r3, %[n]\n\t"
  28797. #else
  28798. "lsl r3, r3, %[n]\n\t"
  28799. #endif
  28800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28801. "lsrs r6, r6, r7\n\t"
  28802. #else
  28803. "lsr r6, r6, r7\n\t"
  28804. #endif
  28805. #ifdef WOLFSSL_KEIL
  28806. "orrs r4, r4, r6\n\t"
  28807. #elif defined(__clang__)
  28808. "orrs r4, r6\n\t"
  28809. #else
  28810. "orr r4, r6\n\t"
  28811. #endif
  28812. "ldr r5, [%[a], #20]\n\t"
  28813. "str r4, [%[r], #28]\n\t"
  28814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28815. "lsrs r6, r5, #1\n\t"
  28816. #else
  28817. "lsr r6, r5, #1\n\t"
  28818. #endif
  28819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28820. "lsls r5, r5, %[n]\n\t"
  28821. #else
  28822. "lsl r5, r5, %[n]\n\t"
  28823. #endif
  28824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28825. "lsrs r6, r6, r7\n\t"
  28826. #else
  28827. "lsr r6, r6, r7\n\t"
  28828. #endif
  28829. #ifdef WOLFSSL_KEIL
  28830. "orrs r3, r3, r6\n\t"
  28831. #elif defined(__clang__)
  28832. "orrs r3, r6\n\t"
  28833. #else
  28834. "orr r3, r6\n\t"
  28835. #endif
  28836. "ldr r4, [%[a], #16]\n\t"
  28837. "str r3, [%[r], #24]\n\t"
  28838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28839. "lsrs r6, r4, #1\n\t"
  28840. #else
  28841. "lsr r6, r4, #1\n\t"
  28842. #endif
  28843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28844. "lsls r4, r4, %[n]\n\t"
  28845. #else
  28846. "lsl r4, r4, %[n]\n\t"
  28847. #endif
  28848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28849. "lsrs r6, r6, r7\n\t"
  28850. #else
  28851. "lsr r6, r6, r7\n\t"
  28852. #endif
  28853. #ifdef WOLFSSL_KEIL
  28854. "orrs r5, r5, r6\n\t"
  28855. #elif defined(__clang__)
  28856. "orrs r5, r6\n\t"
  28857. #else
  28858. "orr r5, r6\n\t"
  28859. #endif
  28860. "ldr r3, [%[a], #12]\n\t"
  28861. "str r5, [%[r], #20]\n\t"
  28862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28863. "lsrs r6, r3, #1\n\t"
  28864. #else
  28865. "lsr r6, r3, #1\n\t"
  28866. #endif
  28867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28868. "lsls r3, r3, %[n]\n\t"
  28869. #else
  28870. "lsl r3, r3, %[n]\n\t"
  28871. #endif
  28872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28873. "lsrs r6, r6, r7\n\t"
  28874. #else
  28875. "lsr r6, r6, r7\n\t"
  28876. #endif
  28877. #ifdef WOLFSSL_KEIL
  28878. "orrs r4, r4, r6\n\t"
  28879. #elif defined(__clang__)
  28880. "orrs r4, r6\n\t"
  28881. #else
  28882. "orr r4, r6\n\t"
  28883. #endif
  28884. "ldr r5, [%[a], #8]\n\t"
  28885. "str r4, [%[r], #16]\n\t"
  28886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28887. "lsrs r6, r5, #1\n\t"
  28888. #else
  28889. "lsr r6, r5, #1\n\t"
  28890. #endif
  28891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28892. "lsls r5, r5, %[n]\n\t"
  28893. #else
  28894. "lsl r5, r5, %[n]\n\t"
  28895. #endif
  28896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28897. "lsrs r6, r6, r7\n\t"
  28898. #else
  28899. "lsr r6, r6, r7\n\t"
  28900. #endif
  28901. #ifdef WOLFSSL_KEIL
  28902. "orrs r3, r3, r6\n\t"
  28903. #elif defined(__clang__)
  28904. "orrs r3, r6\n\t"
  28905. #else
  28906. "orr r3, r6\n\t"
  28907. #endif
  28908. "ldr r4, [%[a], #4]\n\t"
  28909. "str r3, [%[r], #12]\n\t"
  28910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28911. "lsrs r6, r4, #1\n\t"
  28912. #else
  28913. "lsr r6, r4, #1\n\t"
  28914. #endif
  28915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28916. "lsls r4, r4, %[n]\n\t"
  28917. #else
  28918. "lsl r4, r4, %[n]\n\t"
  28919. #endif
  28920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28921. "lsrs r6, r6, r7\n\t"
  28922. #else
  28923. "lsr r6, r6, r7\n\t"
  28924. #endif
  28925. #ifdef WOLFSSL_KEIL
  28926. "orrs r5, r5, r6\n\t"
  28927. #elif defined(__clang__)
  28928. "orrs r5, r6\n\t"
  28929. #else
  28930. "orr r5, r6\n\t"
  28931. #endif
  28932. "ldr r3, [%[a]]\n\t"
  28933. "str r5, [%[r], #8]\n\t"
  28934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28935. "lsrs r6, r3, #1\n\t"
  28936. #else
  28937. "lsr r6, r3, #1\n\t"
  28938. #endif
  28939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28940. "lsls r3, r3, %[n]\n\t"
  28941. #else
  28942. "lsl r3, r3, %[n]\n\t"
  28943. #endif
  28944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28945. "lsrs r6, r6, r7\n\t"
  28946. #else
  28947. "lsr r6, r6, r7\n\t"
  28948. #endif
  28949. #ifdef WOLFSSL_KEIL
  28950. "orrs r4, r4, r6\n\t"
  28951. #elif defined(__clang__)
  28952. "orrs r4, r6\n\t"
  28953. #else
  28954. "orr r4, r6\n\t"
  28955. #endif
  28956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28957. "subs %[a], %[a], #0x40\n\t"
  28958. #else
  28959. "sub %[a], %[a], #0x40\n\t"
  28960. #endif
  28961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28962. "subs %[r], %[r], #0x40\n\t"
  28963. #else
  28964. "sub %[r], %[r], #0x40\n\t"
  28965. #endif
  28966. "ldr r5, [%[a], #60]\n\t"
  28967. "str r4, [%[r], #68]\n\t"
  28968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28969. "lsrs r6, r5, #1\n\t"
  28970. #else
  28971. "lsr r6, r5, #1\n\t"
  28972. #endif
  28973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28974. "lsls r5, r5, %[n]\n\t"
  28975. #else
  28976. "lsl r5, r5, %[n]\n\t"
  28977. #endif
  28978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28979. "lsrs r6, r6, r7\n\t"
  28980. #else
  28981. "lsr r6, r6, r7\n\t"
  28982. #endif
  28983. #ifdef WOLFSSL_KEIL
  28984. "orrs r3, r3, r6\n\t"
  28985. #elif defined(__clang__)
  28986. "orrs r3, r6\n\t"
  28987. #else
  28988. "orr r3, r6\n\t"
  28989. #endif
  28990. "ldr r4, [%[a], #56]\n\t"
  28991. "str r3, [%[r], #64]\n\t"
  28992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28993. "lsrs r6, r4, #1\n\t"
  28994. #else
  28995. "lsr r6, r4, #1\n\t"
  28996. #endif
  28997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  28998. "lsls r4, r4, %[n]\n\t"
  28999. #else
  29000. "lsl r4, r4, %[n]\n\t"
  29001. #endif
  29002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29003. "lsrs r6, r6, r7\n\t"
  29004. #else
  29005. "lsr r6, r6, r7\n\t"
  29006. #endif
  29007. #ifdef WOLFSSL_KEIL
  29008. "orrs r5, r5, r6\n\t"
  29009. #elif defined(__clang__)
  29010. "orrs r5, r6\n\t"
  29011. #else
  29012. "orr r5, r6\n\t"
  29013. #endif
  29014. "ldr r3, [%[a], #52]\n\t"
  29015. "str r5, [%[r], #60]\n\t"
  29016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29017. "lsrs r6, r3, #1\n\t"
  29018. #else
  29019. "lsr r6, r3, #1\n\t"
  29020. #endif
  29021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29022. "lsls r3, r3, %[n]\n\t"
  29023. #else
  29024. "lsl r3, r3, %[n]\n\t"
  29025. #endif
  29026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29027. "lsrs r6, r6, r7\n\t"
  29028. #else
  29029. "lsr r6, r6, r7\n\t"
  29030. #endif
  29031. #ifdef WOLFSSL_KEIL
  29032. "orrs r4, r4, r6\n\t"
  29033. #elif defined(__clang__)
  29034. "orrs r4, r6\n\t"
  29035. #else
  29036. "orr r4, r6\n\t"
  29037. #endif
  29038. "ldr r5, [%[a], #48]\n\t"
  29039. "str r4, [%[r], #56]\n\t"
  29040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29041. "lsrs r6, r5, #1\n\t"
  29042. #else
  29043. "lsr r6, r5, #1\n\t"
  29044. #endif
  29045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29046. "lsls r5, r5, %[n]\n\t"
  29047. #else
  29048. "lsl r5, r5, %[n]\n\t"
  29049. #endif
  29050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29051. "lsrs r6, r6, r7\n\t"
  29052. #else
  29053. "lsr r6, r6, r7\n\t"
  29054. #endif
  29055. #ifdef WOLFSSL_KEIL
  29056. "orrs r3, r3, r6\n\t"
  29057. #elif defined(__clang__)
  29058. "orrs r3, r6\n\t"
  29059. #else
  29060. "orr r3, r6\n\t"
  29061. #endif
  29062. "ldr r4, [%[a], #44]\n\t"
  29063. "str r3, [%[r], #52]\n\t"
  29064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29065. "lsrs r6, r4, #1\n\t"
  29066. #else
  29067. "lsr r6, r4, #1\n\t"
  29068. #endif
  29069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29070. "lsls r4, r4, %[n]\n\t"
  29071. #else
  29072. "lsl r4, r4, %[n]\n\t"
  29073. #endif
  29074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29075. "lsrs r6, r6, r7\n\t"
  29076. #else
  29077. "lsr r6, r6, r7\n\t"
  29078. #endif
  29079. #ifdef WOLFSSL_KEIL
  29080. "orrs r5, r5, r6\n\t"
  29081. #elif defined(__clang__)
  29082. "orrs r5, r6\n\t"
  29083. #else
  29084. "orr r5, r6\n\t"
  29085. #endif
  29086. "ldr r3, [%[a], #40]\n\t"
  29087. "str r5, [%[r], #48]\n\t"
  29088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29089. "lsrs r6, r3, #1\n\t"
  29090. #else
  29091. "lsr r6, r3, #1\n\t"
  29092. #endif
  29093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29094. "lsls r3, r3, %[n]\n\t"
  29095. #else
  29096. "lsl r3, r3, %[n]\n\t"
  29097. #endif
  29098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29099. "lsrs r6, r6, r7\n\t"
  29100. #else
  29101. "lsr r6, r6, r7\n\t"
  29102. #endif
  29103. #ifdef WOLFSSL_KEIL
  29104. "orrs r4, r4, r6\n\t"
  29105. #elif defined(__clang__)
  29106. "orrs r4, r6\n\t"
  29107. #else
  29108. "orr r4, r6\n\t"
  29109. #endif
  29110. "ldr r5, [%[a], #36]\n\t"
  29111. "str r4, [%[r], #44]\n\t"
  29112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29113. "lsrs r6, r5, #1\n\t"
  29114. #else
  29115. "lsr r6, r5, #1\n\t"
  29116. #endif
  29117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29118. "lsls r5, r5, %[n]\n\t"
  29119. #else
  29120. "lsl r5, r5, %[n]\n\t"
  29121. #endif
  29122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29123. "lsrs r6, r6, r7\n\t"
  29124. #else
  29125. "lsr r6, r6, r7\n\t"
  29126. #endif
  29127. #ifdef WOLFSSL_KEIL
  29128. "orrs r3, r3, r6\n\t"
  29129. #elif defined(__clang__)
  29130. "orrs r3, r6\n\t"
  29131. #else
  29132. "orr r3, r6\n\t"
  29133. #endif
  29134. "ldr r4, [%[a], #32]\n\t"
  29135. "str r3, [%[r], #40]\n\t"
  29136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29137. "lsrs r6, r4, #1\n\t"
  29138. #else
  29139. "lsr r6, r4, #1\n\t"
  29140. #endif
  29141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29142. "lsls r4, r4, %[n]\n\t"
  29143. #else
  29144. "lsl r4, r4, %[n]\n\t"
  29145. #endif
  29146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29147. "lsrs r6, r6, r7\n\t"
  29148. #else
  29149. "lsr r6, r6, r7\n\t"
  29150. #endif
  29151. #ifdef WOLFSSL_KEIL
  29152. "orrs r5, r5, r6\n\t"
  29153. #elif defined(__clang__)
  29154. "orrs r5, r6\n\t"
  29155. #else
  29156. "orr r5, r6\n\t"
  29157. #endif
  29158. "ldr r3, [%[a], #28]\n\t"
  29159. "str r5, [%[r], #36]\n\t"
  29160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29161. "lsrs r6, r3, #1\n\t"
  29162. #else
  29163. "lsr r6, r3, #1\n\t"
  29164. #endif
  29165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29166. "lsls r3, r3, %[n]\n\t"
  29167. #else
  29168. "lsl r3, r3, %[n]\n\t"
  29169. #endif
  29170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29171. "lsrs r6, r6, r7\n\t"
  29172. #else
  29173. "lsr r6, r6, r7\n\t"
  29174. #endif
  29175. #ifdef WOLFSSL_KEIL
  29176. "orrs r4, r4, r6\n\t"
  29177. #elif defined(__clang__)
  29178. "orrs r4, r6\n\t"
  29179. #else
  29180. "orr r4, r6\n\t"
  29181. #endif
  29182. "ldr r5, [%[a], #24]\n\t"
  29183. "str r4, [%[r], #32]\n\t"
  29184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29185. "lsrs r6, r5, #1\n\t"
  29186. #else
  29187. "lsr r6, r5, #1\n\t"
  29188. #endif
  29189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29190. "lsls r5, r5, %[n]\n\t"
  29191. #else
  29192. "lsl r5, r5, %[n]\n\t"
  29193. #endif
  29194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29195. "lsrs r6, r6, r7\n\t"
  29196. #else
  29197. "lsr r6, r6, r7\n\t"
  29198. #endif
  29199. #ifdef WOLFSSL_KEIL
  29200. "orrs r3, r3, r6\n\t"
  29201. #elif defined(__clang__)
  29202. "orrs r3, r6\n\t"
  29203. #else
  29204. "orr r3, r6\n\t"
  29205. #endif
  29206. "ldr r4, [%[a], #20]\n\t"
  29207. "str r3, [%[r], #28]\n\t"
  29208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29209. "lsrs r6, r4, #1\n\t"
  29210. #else
  29211. "lsr r6, r4, #1\n\t"
  29212. #endif
  29213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29214. "lsls r4, r4, %[n]\n\t"
  29215. #else
  29216. "lsl r4, r4, %[n]\n\t"
  29217. #endif
  29218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29219. "lsrs r6, r6, r7\n\t"
  29220. #else
  29221. "lsr r6, r6, r7\n\t"
  29222. #endif
  29223. #ifdef WOLFSSL_KEIL
  29224. "orrs r5, r5, r6\n\t"
  29225. #elif defined(__clang__)
  29226. "orrs r5, r6\n\t"
  29227. #else
  29228. "orr r5, r6\n\t"
  29229. #endif
  29230. "ldr r3, [%[a], #16]\n\t"
  29231. "str r5, [%[r], #24]\n\t"
  29232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29233. "lsrs r6, r3, #1\n\t"
  29234. #else
  29235. "lsr r6, r3, #1\n\t"
  29236. #endif
  29237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29238. "lsls r3, r3, %[n]\n\t"
  29239. #else
  29240. "lsl r3, r3, %[n]\n\t"
  29241. #endif
  29242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29243. "lsrs r6, r6, r7\n\t"
  29244. #else
  29245. "lsr r6, r6, r7\n\t"
  29246. #endif
  29247. #ifdef WOLFSSL_KEIL
  29248. "orrs r4, r4, r6\n\t"
  29249. #elif defined(__clang__)
  29250. "orrs r4, r6\n\t"
  29251. #else
  29252. "orr r4, r6\n\t"
  29253. #endif
  29254. "ldr r5, [%[a], #12]\n\t"
  29255. "str r4, [%[r], #20]\n\t"
  29256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29257. "lsrs r6, r5, #1\n\t"
  29258. #else
  29259. "lsr r6, r5, #1\n\t"
  29260. #endif
  29261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29262. "lsls r5, r5, %[n]\n\t"
  29263. #else
  29264. "lsl r5, r5, %[n]\n\t"
  29265. #endif
  29266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29267. "lsrs r6, r6, r7\n\t"
  29268. #else
  29269. "lsr r6, r6, r7\n\t"
  29270. #endif
  29271. #ifdef WOLFSSL_KEIL
  29272. "orrs r3, r3, r6\n\t"
  29273. #elif defined(__clang__)
  29274. "orrs r3, r6\n\t"
  29275. #else
  29276. "orr r3, r6\n\t"
  29277. #endif
  29278. "ldr r4, [%[a], #8]\n\t"
  29279. "str r3, [%[r], #16]\n\t"
  29280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29281. "lsrs r6, r4, #1\n\t"
  29282. #else
  29283. "lsr r6, r4, #1\n\t"
  29284. #endif
  29285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29286. "lsls r4, r4, %[n]\n\t"
  29287. #else
  29288. "lsl r4, r4, %[n]\n\t"
  29289. #endif
  29290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29291. "lsrs r6, r6, r7\n\t"
  29292. #else
  29293. "lsr r6, r6, r7\n\t"
  29294. #endif
  29295. #ifdef WOLFSSL_KEIL
  29296. "orrs r5, r5, r6\n\t"
  29297. #elif defined(__clang__)
  29298. "orrs r5, r6\n\t"
  29299. #else
  29300. "orr r5, r6\n\t"
  29301. #endif
  29302. "ldr r3, [%[a], #4]\n\t"
  29303. "str r5, [%[r], #12]\n\t"
  29304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29305. "lsrs r6, r3, #1\n\t"
  29306. #else
  29307. "lsr r6, r3, #1\n\t"
  29308. #endif
  29309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29310. "lsls r3, r3, %[n]\n\t"
  29311. #else
  29312. "lsl r3, r3, %[n]\n\t"
  29313. #endif
  29314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29315. "lsrs r6, r6, r7\n\t"
  29316. #else
  29317. "lsr r6, r6, r7\n\t"
  29318. #endif
  29319. #ifdef WOLFSSL_KEIL
  29320. "orrs r4, r4, r6\n\t"
  29321. #elif defined(__clang__)
  29322. "orrs r4, r6\n\t"
  29323. #else
  29324. "orr r4, r6\n\t"
  29325. #endif
  29326. "ldr r5, [%[a]]\n\t"
  29327. "str r4, [%[r], #8]\n\t"
  29328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29329. "lsrs r6, r5, #1\n\t"
  29330. #else
  29331. "lsr r6, r5, #1\n\t"
  29332. #endif
  29333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29334. "lsls r5, r5, %[n]\n\t"
  29335. #else
  29336. "lsl r5, r5, %[n]\n\t"
  29337. #endif
  29338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29339. "lsrs r6, r6, r7\n\t"
  29340. #else
  29341. "lsr r6, r6, r7\n\t"
  29342. #endif
  29343. #ifdef WOLFSSL_KEIL
  29344. "orrs r3, r3, r6\n\t"
  29345. #elif defined(__clang__)
  29346. "orrs r3, r6\n\t"
  29347. #else
  29348. "orr r3, r6\n\t"
  29349. #endif
  29350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29351. "subs %[a], %[a], #0x40\n\t"
  29352. #else
  29353. "sub %[a], %[a], #0x40\n\t"
  29354. #endif
  29355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29356. "subs %[r], %[r], #0x40\n\t"
  29357. #else
  29358. "sub %[r], %[r], #0x40\n\t"
  29359. #endif
  29360. "ldr r4, [%[a], #60]\n\t"
  29361. "str r3, [%[r], #68]\n\t"
  29362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29363. "lsrs r6, r4, #1\n\t"
  29364. #else
  29365. "lsr r6, r4, #1\n\t"
  29366. #endif
  29367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29368. "lsls r4, r4, %[n]\n\t"
  29369. #else
  29370. "lsl r4, r4, %[n]\n\t"
  29371. #endif
  29372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29373. "lsrs r6, r6, r7\n\t"
  29374. #else
  29375. "lsr r6, r6, r7\n\t"
  29376. #endif
  29377. #ifdef WOLFSSL_KEIL
  29378. "orrs r5, r5, r6\n\t"
  29379. #elif defined(__clang__)
  29380. "orrs r5, r6\n\t"
  29381. #else
  29382. "orr r5, r6\n\t"
  29383. #endif
  29384. "ldr r3, [%[a], #56]\n\t"
  29385. "str r5, [%[r], #64]\n\t"
  29386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29387. "lsrs r6, r3, #1\n\t"
  29388. #else
  29389. "lsr r6, r3, #1\n\t"
  29390. #endif
  29391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29392. "lsls r3, r3, %[n]\n\t"
  29393. #else
  29394. "lsl r3, r3, %[n]\n\t"
  29395. #endif
  29396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29397. "lsrs r6, r6, r7\n\t"
  29398. #else
  29399. "lsr r6, r6, r7\n\t"
  29400. #endif
  29401. #ifdef WOLFSSL_KEIL
  29402. "orrs r4, r4, r6\n\t"
  29403. #elif defined(__clang__)
  29404. "orrs r4, r6\n\t"
  29405. #else
  29406. "orr r4, r6\n\t"
  29407. #endif
  29408. "ldr r5, [%[a], #52]\n\t"
  29409. "str r4, [%[r], #60]\n\t"
  29410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29411. "lsrs r6, r5, #1\n\t"
  29412. #else
  29413. "lsr r6, r5, #1\n\t"
  29414. #endif
  29415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29416. "lsls r5, r5, %[n]\n\t"
  29417. #else
  29418. "lsl r5, r5, %[n]\n\t"
  29419. #endif
  29420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29421. "lsrs r6, r6, r7\n\t"
  29422. #else
  29423. "lsr r6, r6, r7\n\t"
  29424. #endif
  29425. #ifdef WOLFSSL_KEIL
  29426. "orrs r3, r3, r6\n\t"
  29427. #elif defined(__clang__)
  29428. "orrs r3, r6\n\t"
  29429. #else
  29430. "orr r3, r6\n\t"
  29431. #endif
  29432. "ldr r4, [%[a], #48]\n\t"
  29433. "str r3, [%[r], #56]\n\t"
  29434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29435. "lsrs r6, r4, #1\n\t"
  29436. #else
  29437. "lsr r6, r4, #1\n\t"
  29438. #endif
  29439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29440. "lsls r4, r4, %[n]\n\t"
  29441. #else
  29442. "lsl r4, r4, %[n]\n\t"
  29443. #endif
  29444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29445. "lsrs r6, r6, r7\n\t"
  29446. #else
  29447. "lsr r6, r6, r7\n\t"
  29448. #endif
  29449. #ifdef WOLFSSL_KEIL
  29450. "orrs r5, r5, r6\n\t"
  29451. #elif defined(__clang__)
  29452. "orrs r5, r6\n\t"
  29453. #else
  29454. "orr r5, r6\n\t"
  29455. #endif
  29456. "ldr r3, [%[a], #44]\n\t"
  29457. "str r5, [%[r], #52]\n\t"
  29458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29459. "lsrs r6, r3, #1\n\t"
  29460. #else
  29461. "lsr r6, r3, #1\n\t"
  29462. #endif
  29463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29464. "lsls r3, r3, %[n]\n\t"
  29465. #else
  29466. "lsl r3, r3, %[n]\n\t"
  29467. #endif
  29468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29469. "lsrs r6, r6, r7\n\t"
  29470. #else
  29471. "lsr r6, r6, r7\n\t"
  29472. #endif
  29473. #ifdef WOLFSSL_KEIL
  29474. "orrs r4, r4, r6\n\t"
  29475. #elif defined(__clang__)
  29476. "orrs r4, r6\n\t"
  29477. #else
  29478. "orr r4, r6\n\t"
  29479. #endif
  29480. "ldr r5, [%[a], #40]\n\t"
  29481. "str r4, [%[r], #48]\n\t"
  29482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29483. "lsrs r6, r5, #1\n\t"
  29484. #else
  29485. "lsr r6, r5, #1\n\t"
  29486. #endif
  29487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29488. "lsls r5, r5, %[n]\n\t"
  29489. #else
  29490. "lsl r5, r5, %[n]\n\t"
  29491. #endif
  29492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29493. "lsrs r6, r6, r7\n\t"
  29494. #else
  29495. "lsr r6, r6, r7\n\t"
  29496. #endif
  29497. #ifdef WOLFSSL_KEIL
  29498. "orrs r3, r3, r6\n\t"
  29499. #elif defined(__clang__)
  29500. "orrs r3, r6\n\t"
  29501. #else
  29502. "orr r3, r6\n\t"
  29503. #endif
  29504. "ldr r4, [%[a], #36]\n\t"
  29505. "str r3, [%[r], #44]\n\t"
  29506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29507. "lsrs r6, r4, #1\n\t"
  29508. #else
  29509. "lsr r6, r4, #1\n\t"
  29510. #endif
  29511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29512. "lsls r4, r4, %[n]\n\t"
  29513. #else
  29514. "lsl r4, r4, %[n]\n\t"
  29515. #endif
  29516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29517. "lsrs r6, r6, r7\n\t"
  29518. #else
  29519. "lsr r6, r6, r7\n\t"
  29520. #endif
  29521. #ifdef WOLFSSL_KEIL
  29522. "orrs r5, r5, r6\n\t"
  29523. #elif defined(__clang__)
  29524. "orrs r5, r6\n\t"
  29525. #else
  29526. "orr r5, r6\n\t"
  29527. #endif
  29528. "ldr r3, [%[a], #32]\n\t"
  29529. "str r5, [%[r], #40]\n\t"
  29530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29531. "lsrs r6, r3, #1\n\t"
  29532. #else
  29533. "lsr r6, r3, #1\n\t"
  29534. #endif
  29535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29536. "lsls r3, r3, %[n]\n\t"
  29537. #else
  29538. "lsl r3, r3, %[n]\n\t"
  29539. #endif
  29540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29541. "lsrs r6, r6, r7\n\t"
  29542. #else
  29543. "lsr r6, r6, r7\n\t"
  29544. #endif
  29545. #ifdef WOLFSSL_KEIL
  29546. "orrs r4, r4, r6\n\t"
  29547. #elif defined(__clang__)
  29548. "orrs r4, r6\n\t"
  29549. #else
  29550. "orr r4, r6\n\t"
  29551. #endif
  29552. "ldr r5, [%[a], #28]\n\t"
  29553. "str r4, [%[r], #36]\n\t"
  29554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29555. "lsrs r6, r5, #1\n\t"
  29556. #else
  29557. "lsr r6, r5, #1\n\t"
  29558. #endif
  29559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29560. "lsls r5, r5, %[n]\n\t"
  29561. #else
  29562. "lsl r5, r5, %[n]\n\t"
  29563. #endif
  29564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29565. "lsrs r6, r6, r7\n\t"
  29566. #else
  29567. "lsr r6, r6, r7\n\t"
  29568. #endif
  29569. #ifdef WOLFSSL_KEIL
  29570. "orrs r3, r3, r6\n\t"
  29571. #elif defined(__clang__)
  29572. "orrs r3, r6\n\t"
  29573. #else
  29574. "orr r3, r6\n\t"
  29575. #endif
  29576. "ldr r4, [%[a], #24]\n\t"
  29577. "str r3, [%[r], #32]\n\t"
  29578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29579. "lsrs r6, r4, #1\n\t"
  29580. #else
  29581. "lsr r6, r4, #1\n\t"
  29582. #endif
  29583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29584. "lsls r4, r4, %[n]\n\t"
  29585. #else
  29586. "lsl r4, r4, %[n]\n\t"
  29587. #endif
  29588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29589. "lsrs r6, r6, r7\n\t"
  29590. #else
  29591. "lsr r6, r6, r7\n\t"
  29592. #endif
  29593. #ifdef WOLFSSL_KEIL
  29594. "orrs r5, r5, r6\n\t"
  29595. #elif defined(__clang__)
  29596. "orrs r5, r6\n\t"
  29597. #else
  29598. "orr r5, r6\n\t"
  29599. #endif
  29600. "ldr r3, [%[a], #20]\n\t"
  29601. "str r5, [%[r], #28]\n\t"
  29602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29603. "lsrs r6, r3, #1\n\t"
  29604. #else
  29605. "lsr r6, r3, #1\n\t"
  29606. #endif
  29607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29608. "lsls r3, r3, %[n]\n\t"
  29609. #else
  29610. "lsl r3, r3, %[n]\n\t"
  29611. #endif
  29612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29613. "lsrs r6, r6, r7\n\t"
  29614. #else
  29615. "lsr r6, r6, r7\n\t"
  29616. #endif
  29617. #ifdef WOLFSSL_KEIL
  29618. "orrs r4, r4, r6\n\t"
  29619. #elif defined(__clang__)
  29620. "orrs r4, r6\n\t"
  29621. #else
  29622. "orr r4, r6\n\t"
  29623. #endif
  29624. "ldr r5, [%[a], #16]\n\t"
  29625. "str r4, [%[r], #24]\n\t"
  29626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29627. "lsrs r6, r5, #1\n\t"
  29628. #else
  29629. "lsr r6, r5, #1\n\t"
  29630. #endif
  29631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29632. "lsls r5, r5, %[n]\n\t"
  29633. #else
  29634. "lsl r5, r5, %[n]\n\t"
  29635. #endif
  29636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29637. "lsrs r6, r6, r7\n\t"
  29638. #else
  29639. "lsr r6, r6, r7\n\t"
  29640. #endif
  29641. #ifdef WOLFSSL_KEIL
  29642. "orrs r3, r3, r6\n\t"
  29643. #elif defined(__clang__)
  29644. "orrs r3, r6\n\t"
  29645. #else
  29646. "orr r3, r6\n\t"
  29647. #endif
  29648. "ldr r4, [%[a], #12]\n\t"
  29649. "str r3, [%[r], #20]\n\t"
  29650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29651. "lsrs r6, r4, #1\n\t"
  29652. #else
  29653. "lsr r6, r4, #1\n\t"
  29654. #endif
  29655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29656. "lsls r4, r4, %[n]\n\t"
  29657. #else
  29658. "lsl r4, r4, %[n]\n\t"
  29659. #endif
  29660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29661. "lsrs r6, r6, r7\n\t"
  29662. #else
  29663. "lsr r6, r6, r7\n\t"
  29664. #endif
  29665. #ifdef WOLFSSL_KEIL
  29666. "orrs r5, r5, r6\n\t"
  29667. #elif defined(__clang__)
  29668. "orrs r5, r6\n\t"
  29669. #else
  29670. "orr r5, r6\n\t"
  29671. #endif
  29672. "ldr r3, [%[a], #8]\n\t"
  29673. "str r5, [%[r], #16]\n\t"
  29674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29675. "lsrs r6, r3, #1\n\t"
  29676. #else
  29677. "lsr r6, r3, #1\n\t"
  29678. #endif
  29679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29680. "lsls r3, r3, %[n]\n\t"
  29681. #else
  29682. "lsl r3, r3, %[n]\n\t"
  29683. #endif
  29684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29685. "lsrs r6, r6, r7\n\t"
  29686. #else
  29687. "lsr r6, r6, r7\n\t"
  29688. #endif
  29689. #ifdef WOLFSSL_KEIL
  29690. "orrs r4, r4, r6\n\t"
  29691. #elif defined(__clang__)
  29692. "orrs r4, r6\n\t"
  29693. #else
  29694. "orr r4, r6\n\t"
  29695. #endif
  29696. "ldr r5, [%[a], #4]\n\t"
  29697. "str r4, [%[r], #12]\n\t"
  29698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29699. "lsrs r6, r5, #1\n\t"
  29700. #else
  29701. "lsr r6, r5, #1\n\t"
  29702. #endif
  29703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29704. "lsls r5, r5, %[n]\n\t"
  29705. #else
  29706. "lsl r5, r5, %[n]\n\t"
  29707. #endif
  29708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29709. "lsrs r6, r6, r7\n\t"
  29710. #else
  29711. "lsr r6, r6, r7\n\t"
  29712. #endif
  29713. #ifdef WOLFSSL_KEIL
  29714. "orrs r3, r3, r6\n\t"
  29715. #elif defined(__clang__)
  29716. "orrs r3, r6\n\t"
  29717. #else
  29718. "orr r3, r6\n\t"
  29719. #endif
  29720. "ldr r4, [%[a]]\n\t"
  29721. "str r3, [%[r], #8]\n\t"
  29722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29723. "lsrs r6, r4, #1\n\t"
  29724. #else
  29725. "lsr r6, r4, #1\n\t"
  29726. #endif
  29727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29728. "lsls r4, r4, %[n]\n\t"
  29729. #else
  29730. "lsl r4, r4, %[n]\n\t"
  29731. #endif
  29732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  29733. "lsrs r6, r6, r7\n\t"
  29734. #else
  29735. "lsr r6, r6, r7\n\t"
  29736. #endif
  29737. #ifdef WOLFSSL_KEIL
  29738. "orrs r5, r5, r6\n\t"
  29739. #elif defined(__clang__)
  29740. "orrs r5, r6\n\t"
  29741. #else
  29742. "orr r5, r6\n\t"
  29743. #endif
  29744. "str r4, [%[r]]\n\t"
  29745. "str r5, [%[r], #4]\n\t"
  29746. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  29747. :
  29748. : "memory", "r3", "r4", "r5", "r6", "r7"
  29749. );
  29750. }
  29751. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  29752. *
  29753. * r A single precision number that is the result of the operation.
  29754. * e A single precision number that is the exponent.
  29755. * bits The number of bits in the exponent.
  29756. * m A single precision number that is the modulus.
  29757. * returns 0 on success.
  29758. * returns MEMORY_E on dynamic memory allocation failure.
  29759. * returns MP_VAL when base is even.
  29760. */
  29761. static int sp_2048_mod_exp_2_64(sp_digit* r, const sp_digit* e, int bits,
  29762. const sp_digit* m)
  29763. {
  29764. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  29765. sp_digit* td = NULL;
  29766. #else
  29767. sp_digit td[193];
  29768. #endif
  29769. sp_digit* norm = NULL;
  29770. sp_digit* tmp = NULL;
  29771. sp_digit mp = 1;
  29772. sp_digit n;
  29773. sp_digit o;
  29774. sp_digit mask;
  29775. int i;
  29776. int c;
  29777. byte y;
  29778. int err = MP_OKAY;
  29779. if (bits == 0) {
  29780. err = MP_VAL;
  29781. }
  29782. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  29783. if (err == MP_OKAY) {
  29784. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 193, NULL,
  29785. DYNAMIC_TYPE_TMP_BUFFER);
  29786. if (td == NULL)
  29787. err = MEMORY_E;
  29788. }
  29789. #endif
  29790. if (err == MP_OKAY) {
  29791. norm = td;
  29792. tmp = td + 128;
  29793. sp_2048_mont_setup(m, &mp);
  29794. sp_2048_mont_norm_64(norm, m);
  29795. i = (bits - 1) / 32;
  29796. n = e[i--];
  29797. c = bits & 31;
  29798. if (c == 0) {
  29799. c = 32;
  29800. }
  29801. c -= bits % 5;
  29802. if (c == 32) {
  29803. c = 27;
  29804. }
  29805. if (c < 0) {
  29806. /* Number of bits in top word is less than number needed. */
  29807. c = -c;
  29808. y = (byte)(n << c);
  29809. n = e[i--];
  29810. y |= (byte)(n >> (64 - c));
  29811. n <<= c;
  29812. c = 64 - c;
  29813. }
  29814. else if (c == 0) {
  29815. /* All bits in top word used. */
  29816. y = (byte)n;
  29817. }
  29818. else {
  29819. y = (byte)(n >> c);
  29820. n <<= 32 - c;
  29821. }
  29822. sp_2048_lshift_64(r, norm, y);
  29823. for (; i>=0 || c>=5; ) {
  29824. if (c == 0) {
  29825. n = e[i--];
  29826. y = (byte)(n >> 27);
  29827. n <<= 5;
  29828. c = 27;
  29829. }
  29830. else if (c < 5) {
  29831. y = (byte)(n >> 27);
  29832. n = e[i--];
  29833. c = 5 - c;
  29834. y |= (byte)(n >> (32 - c));
  29835. n <<= c;
  29836. c = 32 - c;
  29837. }
  29838. else {
  29839. y = (byte)((n >> 27) & 0x1f);
  29840. n <<= 5;
  29841. c -= 5;
  29842. }
  29843. sp_2048_mont_sqr_64(r, r, m, mp);
  29844. sp_2048_mont_sqr_64(r, r, m, mp);
  29845. sp_2048_mont_sqr_64(r, r, m, mp);
  29846. sp_2048_mont_sqr_64(r, r, m, mp);
  29847. sp_2048_mont_sqr_64(r, r, m, mp);
  29848. sp_2048_lshift_64(r, r, y);
  29849. sp_2048_mul_d_64(tmp, norm, r[64]);
  29850. r[64] = 0;
  29851. o = sp_2048_add_64(r, r, tmp);
  29852. sp_2048_cond_sub_64(r, r, m, (sp_digit)0 - o);
  29853. }
  29854. XMEMSET(&r[64], 0, sizeof(sp_digit) * 64U);
  29855. sp_2048_mont_reduce_64(r, m, mp);
  29856. mask = 0 - (sp_2048_cmp_64(r, m) >= 0);
  29857. sp_2048_cond_sub_64(r, r, m, mask);
  29858. }
  29859. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  29860. if (td != NULL)
  29861. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  29862. #endif
  29863. return err;
  29864. }
  29865. #endif /* HAVE_FFDHE_2048 */
  29866. /* Perform the modular exponentiation for Diffie-Hellman.
  29867. *
  29868. * base Base.
  29869. * exp Array of bytes that is the exponent.
  29870. * expLen Length of data, in bytes, in exponent.
  29871. * mod Modulus.
  29872. * out Buffer to hold big-endian bytes of exponentiation result.
  29873. * Must be at least 256 bytes long.
  29874. * outLen Length, in bytes, of exponentiation result.
  29875. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  29876. * and MEMORY_E if memory allocation fails.
  29877. */
  29878. int sp_DhExp_2048(const mp_int* base, const byte* exp, word32 expLen,
  29879. const mp_int* mod, byte* out, word32* outLen)
  29880. {
  29881. int err = MP_OKAY;
  29882. sp_digit b[128];
  29883. sp_digit e[64];
  29884. sp_digit m[64];
  29885. sp_digit* r = b;
  29886. word32 i;
  29887. if (mp_count_bits(base) > 2048) {
  29888. err = MP_READ_E;
  29889. }
  29890. else if (expLen > 256) {
  29891. err = MP_READ_E;
  29892. }
  29893. else if (mp_count_bits(mod) != 2048) {
  29894. err = MP_READ_E;
  29895. }
  29896. else if (mp_iseven(mod)) {
  29897. err = MP_VAL;
  29898. }
  29899. if (err == MP_OKAY) {
  29900. sp_2048_from_mp(b, 64, base);
  29901. sp_2048_from_bin(e, 64, exp, expLen);
  29902. sp_2048_from_mp(m, 64, mod);
  29903. #ifdef HAVE_FFDHE_2048
  29904. if (base->used == 1 && base->dp[0] == 2 && m[63] == (sp_digit)-1)
  29905. err = sp_2048_mod_exp_2_64(r, e, expLen * 8, m);
  29906. else
  29907. #endif
  29908. err = sp_2048_mod_exp_64(r, b, e, expLen * 8, m, 0);
  29909. }
  29910. if (err == MP_OKAY) {
  29911. sp_2048_to_bin_64(r, out);
  29912. *outLen = 256;
  29913. for (i=0; i<256 && out[i] == 0; i++) {
  29914. /* Search for first non-zero. */
  29915. }
  29916. *outLen -= i;
  29917. XMEMMOVE(out, out + i, *outLen);
  29918. }
  29919. XMEMSET(e, 0, sizeof(e));
  29920. return err;
  29921. }
  29922. #endif /* WOLFSSL_HAVE_SP_DH */
  29923. /* Perform the modular exponentiation for Diffie-Hellman.
  29924. *
  29925. * base Base. MP integer.
  29926. * exp Exponent. MP integer.
  29927. * mod Modulus. MP integer.
  29928. * res Result. MP integer.
  29929. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  29930. * and MEMORY_E if memory allocation fails.
  29931. */
  29932. int sp_ModExp_1024(const mp_int* base, const mp_int* exp, const mp_int* mod,
  29933. mp_int* res)
  29934. {
  29935. int err = MP_OKAY;
  29936. sp_digit b[64];
  29937. sp_digit e[32];
  29938. sp_digit m[32];
  29939. sp_digit* r = b;
  29940. int expBits = mp_count_bits(exp);
  29941. if (mp_count_bits(base) > 1024) {
  29942. err = MP_READ_E;
  29943. }
  29944. else if (expBits > 1024) {
  29945. err = MP_READ_E;
  29946. }
  29947. else if (mp_count_bits(mod) != 1024) {
  29948. err = MP_READ_E;
  29949. }
  29950. else if (mp_iseven(mod)) {
  29951. err = MP_VAL;
  29952. }
  29953. if (err == MP_OKAY) {
  29954. sp_2048_from_mp(b, 32, base);
  29955. sp_2048_from_mp(e, 32, exp);
  29956. sp_2048_from_mp(m, 32, mod);
  29957. err = sp_2048_mod_exp_32(r, b, e, expBits, m, 0);
  29958. }
  29959. if (err == MP_OKAY) {
  29960. XMEMSET(r + 32, 0, sizeof(*r) * 32U);
  29961. err = sp_2048_to_mp(r, res);
  29962. res->used = mod->used;
  29963. mp_clamp(res);
  29964. }
  29965. XMEMSET(e, 0, sizeof(e));
  29966. return err;
  29967. }
  29968. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  29969. #endif /* !WOLFSSL_SP_NO_2048 */
  29970. #ifndef WOLFSSL_SP_NO_3072
  29971. /* Read big endian unsigned byte array into r.
  29972. *
  29973. * r A single precision integer.
  29974. * size Maximum number of bytes to convert
  29975. * a Byte array.
  29976. * n Number of bytes in array to read.
  29977. */
  29978. static void sp_3072_from_bin(sp_digit* r, int size, const byte* a, int n)
  29979. {
  29980. int i;
  29981. int j;
  29982. byte* d;
  29983. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  29984. r[j] = ((sp_digit)a[i - 0] << 0) |
  29985. ((sp_digit)a[i - 1] << 8) |
  29986. ((sp_digit)a[i - 2] << 16) |
  29987. ((sp_digit)a[i - 3] << 24);
  29988. j++;
  29989. }
  29990. if (i >= 0) {
  29991. r[j] = 0;
  29992. d = (byte*)r;
  29993. switch (i) {
  29994. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  29995. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  29996. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  29997. }
  29998. j++;
  29999. }
  30000. for (; j < size; j++) {
  30001. r[j] = 0;
  30002. }
  30003. }
  30004. /* Convert an mp_int to an array of sp_digit.
  30005. *
  30006. * r A single precision integer.
  30007. * size Maximum number of bytes to convert
  30008. * a A multi-precision integer.
  30009. */
  30010. static void sp_3072_from_mp(sp_digit* r, int size, const mp_int* a)
  30011. {
  30012. #if DIGIT_BIT == 32
  30013. int j;
  30014. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  30015. for (j = a->used; j < size; j++) {
  30016. r[j] = 0;
  30017. }
  30018. #elif DIGIT_BIT > 32
  30019. int i;
  30020. int j = 0;
  30021. word32 s = 0;
  30022. r[0] = 0;
  30023. for (i = 0; i < a->used && j < size; i++) {
  30024. r[j] |= ((sp_digit)a->dp[i] << s);
  30025. r[j] &= 0xffffffff;
  30026. s = 32U - s;
  30027. if (j + 1 >= size) {
  30028. break;
  30029. }
  30030. /* lint allow cast of mismatch word32 and mp_digit */
  30031. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  30032. while ((s + 32U) <= (word32)DIGIT_BIT) {
  30033. s += 32U;
  30034. r[j] &= 0xffffffff;
  30035. if (j + 1 >= size) {
  30036. break;
  30037. }
  30038. if (s < (word32)DIGIT_BIT) {
  30039. /* lint allow cast of mismatch word32 and mp_digit */
  30040. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  30041. }
  30042. else {
  30043. r[++j] = (sp_digit)0;
  30044. }
  30045. }
  30046. s = (word32)DIGIT_BIT - s;
  30047. }
  30048. for (j++; j < size; j++) {
  30049. r[j] = 0;
  30050. }
  30051. #else
  30052. int i;
  30053. int j = 0;
  30054. int s = 0;
  30055. r[0] = 0;
  30056. for (i = 0; i < a->used && j < size; i++) {
  30057. r[j] |= ((sp_digit)a->dp[i]) << s;
  30058. if (s + DIGIT_BIT >= 32) {
  30059. r[j] &= 0xffffffff;
  30060. if (j + 1 >= size) {
  30061. break;
  30062. }
  30063. s = 32 - s;
  30064. if (s == DIGIT_BIT) {
  30065. r[++j] = 0;
  30066. s = 0;
  30067. }
  30068. else {
  30069. r[++j] = a->dp[i] >> s;
  30070. s = DIGIT_BIT - s;
  30071. }
  30072. }
  30073. else {
  30074. s += DIGIT_BIT;
  30075. }
  30076. }
  30077. for (j++; j < size; j++) {
  30078. r[j] = 0;
  30079. }
  30080. #endif
  30081. }
  30082. /* Write r as big endian to byte array.
  30083. * Fixed length number of bytes written: 384
  30084. *
  30085. * r A single precision integer.
  30086. * a Byte array.
  30087. */
  30088. static void sp_3072_to_bin_96(sp_digit* r, byte* a)
  30089. {
  30090. int i;
  30091. int j = 0;
  30092. for (i = 95; i >= 0; i--) {
  30093. a[j++] = r[i] >> 24;
  30094. a[j++] = r[i] >> 16;
  30095. a[j++] = r[i] >> 8;
  30096. a[j++] = r[i] >> 0;
  30097. }
  30098. }
  30099. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  30100. /* Normalize the values in each word to 32.
  30101. *
  30102. * a Array of sp_digit to normalize.
  30103. */
  30104. #define sp_3072_norm_96(a)
  30105. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  30106. /* Normalize the values in each word to 32.
  30107. *
  30108. * a Array of sp_digit to normalize.
  30109. */
  30110. #define sp_3072_norm_96(a)
  30111. #ifndef WOLFSSL_SP_SMALL
  30112. #ifndef WOLFSSL_SP_LARGE_CODE
  30113. /* Multiply a and b into r. (r = a * b)
  30114. *
  30115. * r A single precision integer.
  30116. * a A single precision integer.
  30117. * b A single precision integer.
  30118. */
  30119. SP_NOINLINE static void sp_3072_mul_12(sp_digit* r, const sp_digit* a,
  30120. const sp_digit* b)
  30121. {
  30122. sp_digit t[12 * 2];
  30123. sp_digit* tmp = t;
  30124. __asm__ __volatile__ (
  30125. "movs r3, #0\n\t"
  30126. "movs r4, #0\n\t"
  30127. "mov r8, r3\n\t"
  30128. "mov r11, %[tmp]\n\t"
  30129. "mov r9, %[a]\n\t"
  30130. "mov r10, %[b]\n\t"
  30131. "movs r6, #48\n\t"
  30132. "add r6, r6, r9\n\t"
  30133. "mov r12, r6\n\t"
  30134. "\n"
  30135. "L_sp_3072_mul_12_words_%=:\n\t"
  30136. "movs %[tmp], #0\n\t"
  30137. "movs r5, #0\n\t"
  30138. "movs r6, #44\n\t"
  30139. "mov %[a], r8\n\t"
  30140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30141. "subs %[a], %[a], r6\n\t"
  30142. #else
  30143. "sub %[a], %[a], r6\n\t"
  30144. #endif
  30145. #ifdef WOLFSSL_KEIL
  30146. "sbcs r6, r6, r6\n\t"
  30147. #elif defined(__clang__)
  30148. "sbcs r6, r6\n\t"
  30149. #else
  30150. "sbc r6, r6\n\t"
  30151. #endif
  30152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30153. "mvns r6, r6\n\t"
  30154. #else
  30155. "mvn r6, r6\n\t"
  30156. #endif
  30157. #ifdef WOLFSSL_KEIL
  30158. "ands %[a], %[a], r6\n\t"
  30159. #elif defined(__clang__)
  30160. "ands %[a], r6\n\t"
  30161. #else
  30162. "and %[a], r6\n\t"
  30163. #endif
  30164. "mov %[b], r8\n\t"
  30165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30166. "subs %[b], %[b], %[a]\n\t"
  30167. #else
  30168. "sub %[b], %[b], %[a]\n\t"
  30169. #endif
  30170. "add %[a], %[a], r9\n\t"
  30171. "add %[b], %[b], r10\n\t"
  30172. "\n"
  30173. "L_sp_3072_mul_12_mul_%=:\n\t"
  30174. "# Multiply Start\n\t"
  30175. "ldrh r6, [%[a]]\n\t"
  30176. "ldrh r7, [%[b]]\n\t"
  30177. #ifdef WOLFSSL_KEIL
  30178. "muls r7, r6, r7\n\t"
  30179. #elif defined(__clang__)
  30180. "muls r7, r6\n\t"
  30181. #else
  30182. "mul r7, r6\n\t"
  30183. #endif
  30184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30185. "adds r3, r3, r7\n\t"
  30186. #else
  30187. "add r3, r3, r7\n\t"
  30188. #endif
  30189. #ifdef WOLFSSL_KEIL
  30190. "adcs r4, r4, %[tmp]\n\t"
  30191. #elif defined(__clang__)
  30192. "adcs r4, %[tmp]\n\t"
  30193. #else
  30194. "adc r4, %[tmp]\n\t"
  30195. #endif
  30196. #ifdef WOLFSSL_KEIL
  30197. "adcs r5, r5, %[tmp]\n\t"
  30198. #elif defined(__clang__)
  30199. "adcs r5, %[tmp]\n\t"
  30200. #else
  30201. "adc r5, %[tmp]\n\t"
  30202. #endif
  30203. "ldr r7, [%[b]]\n\t"
  30204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30205. "lsrs r7, r7, #16\n\t"
  30206. #else
  30207. "lsr r7, r7, #16\n\t"
  30208. #endif
  30209. #ifdef WOLFSSL_KEIL
  30210. "muls r6, r7, r6\n\t"
  30211. #elif defined(__clang__)
  30212. "muls r6, r7\n\t"
  30213. #else
  30214. "mul r6, r7\n\t"
  30215. #endif
  30216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30217. "lsrs r7, r6, #16\n\t"
  30218. #else
  30219. "lsr r7, r6, #16\n\t"
  30220. #endif
  30221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30222. "lsls r6, r6, #16\n\t"
  30223. #else
  30224. "lsl r6, r6, #16\n\t"
  30225. #endif
  30226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30227. "adds r3, r3, r6\n\t"
  30228. #else
  30229. "add r3, r3, r6\n\t"
  30230. #endif
  30231. #ifdef WOLFSSL_KEIL
  30232. "adcs r4, r4, r7\n\t"
  30233. #elif defined(__clang__)
  30234. "adcs r4, r7\n\t"
  30235. #else
  30236. "adc r4, r7\n\t"
  30237. #endif
  30238. #ifdef WOLFSSL_KEIL
  30239. "adcs r5, r5, %[tmp]\n\t"
  30240. #elif defined(__clang__)
  30241. "adcs r5, %[tmp]\n\t"
  30242. #else
  30243. "adc r5, %[tmp]\n\t"
  30244. #endif
  30245. "ldr r6, [%[a]]\n\t"
  30246. "ldr r7, [%[b]]\n\t"
  30247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30248. "lsrs r6, r6, #16\n\t"
  30249. #else
  30250. "lsr r6, r6, #16\n\t"
  30251. #endif
  30252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30253. "lsrs r7, r7, #16\n\t"
  30254. #else
  30255. "lsr r7, r7, #16\n\t"
  30256. #endif
  30257. #ifdef WOLFSSL_KEIL
  30258. "muls r7, r6, r7\n\t"
  30259. #elif defined(__clang__)
  30260. "muls r7, r6\n\t"
  30261. #else
  30262. "mul r7, r6\n\t"
  30263. #endif
  30264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30265. "adds r4, r4, r7\n\t"
  30266. #else
  30267. "add r4, r4, r7\n\t"
  30268. #endif
  30269. #ifdef WOLFSSL_KEIL
  30270. "adcs r5, r5, %[tmp]\n\t"
  30271. #elif defined(__clang__)
  30272. "adcs r5, %[tmp]\n\t"
  30273. #else
  30274. "adc r5, %[tmp]\n\t"
  30275. #endif
  30276. "ldrh r7, [%[b]]\n\t"
  30277. #ifdef WOLFSSL_KEIL
  30278. "muls r6, r7, r6\n\t"
  30279. #elif defined(__clang__)
  30280. "muls r6, r7\n\t"
  30281. #else
  30282. "mul r6, r7\n\t"
  30283. #endif
  30284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30285. "lsrs r7, r6, #16\n\t"
  30286. #else
  30287. "lsr r7, r6, #16\n\t"
  30288. #endif
  30289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30290. "lsls r6, r6, #16\n\t"
  30291. #else
  30292. "lsl r6, r6, #16\n\t"
  30293. #endif
  30294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30295. "adds r3, r3, r6\n\t"
  30296. #else
  30297. "add r3, r3, r6\n\t"
  30298. #endif
  30299. #ifdef WOLFSSL_KEIL
  30300. "adcs r4, r4, r7\n\t"
  30301. #elif defined(__clang__)
  30302. "adcs r4, r7\n\t"
  30303. #else
  30304. "adc r4, r7\n\t"
  30305. #endif
  30306. #ifdef WOLFSSL_KEIL
  30307. "adcs r5, r5, %[tmp]\n\t"
  30308. #elif defined(__clang__)
  30309. "adcs r5, %[tmp]\n\t"
  30310. #else
  30311. "adc r5, %[tmp]\n\t"
  30312. #endif
  30313. "# Multiply Done\n\t"
  30314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30315. "adds %[a], %[a], #4\n\t"
  30316. #else
  30317. "add %[a], %[a], #4\n\t"
  30318. #endif
  30319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30320. "subs %[b], %[b], #4\n\t"
  30321. #else
  30322. "sub %[b], %[b], #4\n\t"
  30323. #endif
  30324. "cmp %[a], r12\n\t"
  30325. "beq L_sp_3072_mul_12_done_mul_%=\n\t"
  30326. "mov r6, r8\n\t"
  30327. "add r6, r6, r9\n\t"
  30328. "cmp %[a], r6\n\t"
  30329. "ble L_sp_3072_mul_12_mul_%=\n\t"
  30330. "\n"
  30331. "L_sp_3072_mul_12_done_mul_%=:\n\t"
  30332. "mov %[tmp], r11\n\t"
  30333. "mov r7, r8\n\t"
  30334. "str r3, [%[tmp], r7]\n\t"
  30335. "movs r3, r4\n\t"
  30336. "movs r4, r5\n\t"
  30337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30338. "adds r7, r7, #4\n\t"
  30339. #else
  30340. "add r7, r7, #4\n\t"
  30341. #endif
  30342. "mov r8, r7\n\t"
  30343. "movs r6, #0x58\n\t"
  30344. "cmp r7, r6\n\t"
  30345. "ble L_sp_3072_mul_12_words_%=\n\t"
  30346. "str r3, [%[tmp], r7]\n\t"
  30347. "mov %[a], r9\n\t"
  30348. "mov %[b], r10\n\t"
  30349. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  30350. :
  30351. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  30352. );
  30353. XMEMCPY(r, t, sizeof(t));
  30354. }
  30355. #else
  30356. /* Multiply a and b into r. (r = a * b)
  30357. *
  30358. * r A single precision integer.
  30359. * a A single precision integer.
  30360. * b A single precision integer.
  30361. */
  30362. SP_NOINLINE static void sp_3072_mul_12(sp_digit* r, const sp_digit* a,
  30363. const sp_digit* b)
  30364. {
  30365. __asm__ __volatile__ (
  30366. "sub sp, sp, #48\n\t"
  30367. "mov r8, %[r]\n\t"
  30368. "mov r9, %[a]\n\t"
  30369. "mov r10, %[b]\n\t"
  30370. "movs %[r], #0\n\t"
  30371. "# A[0] * B[0]\n\t"
  30372. "ldr %[a], [%[a]]\n\t"
  30373. "ldr %[b], [%[b]]\n\t"
  30374. "uxth r6, %[a]\n\t"
  30375. "uxth r3, %[b]\n\t"
  30376. #ifdef WOLFSSL_KEIL
  30377. "muls r3, r6, r3\n\t"
  30378. #elif defined(__clang__)
  30379. "muls r3, r6\n\t"
  30380. #else
  30381. "mul r3, r6\n\t"
  30382. #endif
  30383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30384. "lsrs r7, %[b], #16\n\t"
  30385. #else
  30386. "lsr r7, %[b], #16\n\t"
  30387. #endif
  30388. #ifdef WOLFSSL_KEIL
  30389. "muls r6, r7, r6\n\t"
  30390. #elif defined(__clang__)
  30391. "muls r6, r7\n\t"
  30392. #else
  30393. "mul r6, r7\n\t"
  30394. #endif
  30395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30396. "lsrs r4, r6, #16\n\t"
  30397. #else
  30398. "lsr r4, r6, #16\n\t"
  30399. #endif
  30400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30401. "lsls r6, r6, #16\n\t"
  30402. #else
  30403. "lsl r6, r6, #16\n\t"
  30404. #endif
  30405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30406. "adds r3, r3, r6\n\t"
  30407. #else
  30408. "add r3, r3, r6\n\t"
  30409. #endif
  30410. #ifdef WOLFSSL_KEIL
  30411. "adcs r4, r4, %[r]\n\t"
  30412. #elif defined(__clang__)
  30413. "adcs r4, %[r]\n\t"
  30414. #else
  30415. "adc r4, %[r]\n\t"
  30416. #endif
  30417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30418. "lsrs r6, %[a], #16\n\t"
  30419. #else
  30420. "lsr r6, %[a], #16\n\t"
  30421. #endif
  30422. #ifdef WOLFSSL_KEIL
  30423. "muls r7, r6, r7\n\t"
  30424. #elif defined(__clang__)
  30425. "muls r7, r6\n\t"
  30426. #else
  30427. "mul r7, r6\n\t"
  30428. #endif
  30429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30430. "adds r4, r4, r7\n\t"
  30431. #else
  30432. "add r4, r4, r7\n\t"
  30433. #endif
  30434. "uxth r7, %[b]\n\t"
  30435. #ifdef WOLFSSL_KEIL
  30436. "muls r6, r7, r6\n\t"
  30437. #elif defined(__clang__)
  30438. "muls r6, r7\n\t"
  30439. #else
  30440. "mul r6, r7\n\t"
  30441. #endif
  30442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30443. "lsrs r7, r6, #16\n\t"
  30444. #else
  30445. "lsr r7, r6, #16\n\t"
  30446. #endif
  30447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30448. "lsls r6, r6, #16\n\t"
  30449. #else
  30450. "lsl r6, r6, #16\n\t"
  30451. #endif
  30452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30453. "adds r3, r3, r6\n\t"
  30454. #else
  30455. "add r3, r3, r6\n\t"
  30456. #endif
  30457. #ifdef WOLFSSL_KEIL
  30458. "adcs r4, r4, r7\n\t"
  30459. #elif defined(__clang__)
  30460. "adcs r4, r7\n\t"
  30461. #else
  30462. "adc r4, r7\n\t"
  30463. #endif
  30464. "movs r5, #0\n\t"
  30465. "str r3, [sp]\n\t"
  30466. "# A[0] * B[1]\n\t"
  30467. "movs r3, #0\n\t"
  30468. "mov %[a], r9\n\t"
  30469. "mov %[b], r10\n\t"
  30470. "ldr %[a], [%[a]]\n\t"
  30471. "ldr %[b], [%[b], #4]\n\t"
  30472. "uxth r6, %[a]\n\t"
  30473. "uxth r7, %[b]\n\t"
  30474. #ifdef WOLFSSL_KEIL
  30475. "muls r7, r6, r7\n\t"
  30476. #elif defined(__clang__)
  30477. "muls r7, r6\n\t"
  30478. #else
  30479. "mul r7, r6\n\t"
  30480. #endif
  30481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30482. "adds r4, r4, r7\n\t"
  30483. #else
  30484. "add r4, r4, r7\n\t"
  30485. #endif
  30486. #ifdef WOLFSSL_KEIL
  30487. "adcs r5, r5, %[r]\n\t"
  30488. #elif defined(__clang__)
  30489. "adcs r5, %[r]\n\t"
  30490. #else
  30491. "adc r5, %[r]\n\t"
  30492. #endif
  30493. #ifdef WOLFSSL_KEIL
  30494. "adcs r3, r3, %[r]\n\t"
  30495. #elif defined(__clang__)
  30496. "adcs r3, %[r]\n\t"
  30497. #else
  30498. "adc r3, %[r]\n\t"
  30499. #endif
  30500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30501. "lsrs r7, %[b], #16\n\t"
  30502. #else
  30503. "lsr r7, %[b], #16\n\t"
  30504. #endif
  30505. #ifdef WOLFSSL_KEIL
  30506. "muls r6, r7, r6\n\t"
  30507. #elif defined(__clang__)
  30508. "muls r6, r7\n\t"
  30509. #else
  30510. "mul r6, r7\n\t"
  30511. #endif
  30512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30513. "lsrs r7, r6, #16\n\t"
  30514. #else
  30515. "lsr r7, r6, #16\n\t"
  30516. #endif
  30517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30518. "lsls r6, r6, #16\n\t"
  30519. #else
  30520. "lsl r6, r6, #16\n\t"
  30521. #endif
  30522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30523. "adds r4, r4, r6\n\t"
  30524. #else
  30525. "add r4, r4, r6\n\t"
  30526. #endif
  30527. #ifdef WOLFSSL_KEIL
  30528. "adcs r5, r5, r7\n\t"
  30529. #elif defined(__clang__)
  30530. "adcs r5, r7\n\t"
  30531. #else
  30532. "adc r5, r7\n\t"
  30533. #endif
  30534. #ifdef WOLFSSL_KEIL
  30535. "adcs r3, r3, %[r]\n\t"
  30536. #elif defined(__clang__)
  30537. "adcs r3, %[r]\n\t"
  30538. #else
  30539. "adc r3, %[r]\n\t"
  30540. #endif
  30541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30542. "lsrs r6, %[a], #16\n\t"
  30543. #else
  30544. "lsr r6, %[a], #16\n\t"
  30545. #endif
  30546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30547. "lsrs r7, %[b], #16\n\t"
  30548. #else
  30549. "lsr r7, %[b], #16\n\t"
  30550. #endif
  30551. #ifdef WOLFSSL_KEIL
  30552. "muls r7, r6, r7\n\t"
  30553. #elif defined(__clang__)
  30554. "muls r7, r6\n\t"
  30555. #else
  30556. "mul r7, r6\n\t"
  30557. #endif
  30558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30559. "adds r5, r5, r7\n\t"
  30560. #else
  30561. "add r5, r5, r7\n\t"
  30562. #endif
  30563. #ifdef WOLFSSL_KEIL
  30564. "adcs r3, r3, %[r]\n\t"
  30565. #elif defined(__clang__)
  30566. "adcs r3, %[r]\n\t"
  30567. #else
  30568. "adc r3, %[r]\n\t"
  30569. #endif
  30570. "uxth r7, %[b]\n\t"
  30571. #ifdef WOLFSSL_KEIL
  30572. "muls r6, r7, r6\n\t"
  30573. #elif defined(__clang__)
  30574. "muls r6, r7\n\t"
  30575. #else
  30576. "mul r6, r7\n\t"
  30577. #endif
  30578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30579. "lsrs r7, r6, #16\n\t"
  30580. #else
  30581. "lsr r7, r6, #16\n\t"
  30582. #endif
  30583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30584. "lsls r6, r6, #16\n\t"
  30585. #else
  30586. "lsl r6, r6, #16\n\t"
  30587. #endif
  30588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30589. "adds r4, r4, r6\n\t"
  30590. #else
  30591. "add r4, r4, r6\n\t"
  30592. #endif
  30593. #ifdef WOLFSSL_KEIL
  30594. "adcs r5, r5, r7\n\t"
  30595. #elif defined(__clang__)
  30596. "adcs r5, r7\n\t"
  30597. #else
  30598. "adc r5, r7\n\t"
  30599. #endif
  30600. #ifdef WOLFSSL_KEIL
  30601. "adcs r3, r3, %[r]\n\t"
  30602. #elif defined(__clang__)
  30603. "adcs r3, %[r]\n\t"
  30604. #else
  30605. "adc r3, %[r]\n\t"
  30606. #endif
  30607. "# A[1] * B[0]\n\t"
  30608. "mov %[a], r9\n\t"
  30609. "mov %[b], r10\n\t"
  30610. "ldr %[a], [%[a], #4]\n\t"
  30611. "ldr %[b], [%[b]]\n\t"
  30612. "uxth r6, %[a]\n\t"
  30613. "uxth r7, %[b]\n\t"
  30614. #ifdef WOLFSSL_KEIL
  30615. "muls r7, r6, r7\n\t"
  30616. #elif defined(__clang__)
  30617. "muls r7, r6\n\t"
  30618. #else
  30619. "mul r7, r6\n\t"
  30620. #endif
  30621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30622. "adds r4, r4, r7\n\t"
  30623. #else
  30624. "add r4, r4, r7\n\t"
  30625. #endif
  30626. #ifdef WOLFSSL_KEIL
  30627. "adcs r5, r5, %[r]\n\t"
  30628. #elif defined(__clang__)
  30629. "adcs r5, %[r]\n\t"
  30630. #else
  30631. "adc r5, %[r]\n\t"
  30632. #endif
  30633. #ifdef WOLFSSL_KEIL
  30634. "adcs r3, r3, %[r]\n\t"
  30635. #elif defined(__clang__)
  30636. "adcs r3, %[r]\n\t"
  30637. #else
  30638. "adc r3, %[r]\n\t"
  30639. #endif
  30640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30641. "lsrs r7, %[b], #16\n\t"
  30642. #else
  30643. "lsr r7, %[b], #16\n\t"
  30644. #endif
  30645. #ifdef WOLFSSL_KEIL
  30646. "muls r6, r7, r6\n\t"
  30647. #elif defined(__clang__)
  30648. "muls r6, r7\n\t"
  30649. #else
  30650. "mul r6, r7\n\t"
  30651. #endif
  30652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30653. "lsrs r7, r6, #16\n\t"
  30654. #else
  30655. "lsr r7, r6, #16\n\t"
  30656. #endif
  30657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30658. "lsls r6, r6, #16\n\t"
  30659. #else
  30660. "lsl r6, r6, #16\n\t"
  30661. #endif
  30662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30663. "adds r4, r4, r6\n\t"
  30664. #else
  30665. "add r4, r4, r6\n\t"
  30666. #endif
  30667. #ifdef WOLFSSL_KEIL
  30668. "adcs r5, r5, r7\n\t"
  30669. #elif defined(__clang__)
  30670. "adcs r5, r7\n\t"
  30671. #else
  30672. "adc r5, r7\n\t"
  30673. #endif
  30674. #ifdef WOLFSSL_KEIL
  30675. "adcs r3, r3, %[r]\n\t"
  30676. #elif defined(__clang__)
  30677. "adcs r3, %[r]\n\t"
  30678. #else
  30679. "adc r3, %[r]\n\t"
  30680. #endif
  30681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30682. "lsrs r6, %[a], #16\n\t"
  30683. #else
  30684. "lsr r6, %[a], #16\n\t"
  30685. #endif
  30686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30687. "lsrs r7, %[b], #16\n\t"
  30688. #else
  30689. "lsr r7, %[b], #16\n\t"
  30690. #endif
  30691. #ifdef WOLFSSL_KEIL
  30692. "muls r7, r6, r7\n\t"
  30693. #elif defined(__clang__)
  30694. "muls r7, r6\n\t"
  30695. #else
  30696. "mul r7, r6\n\t"
  30697. #endif
  30698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30699. "adds r5, r5, r7\n\t"
  30700. #else
  30701. "add r5, r5, r7\n\t"
  30702. #endif
  30703. #ifdef WOLFSSL_KEIL
  30704. "adcs r3, r3, %[r]\n\t"
  30705. #elif defined(__clang__)
  30706. "adcs r3, %[r]\n\t"
  30707. #else
  30708. "adc r3, %[r]\n\t"
  30709. #endif
  30710. "uxth r7, %[b]\n\t"
  30711. #ifdef WOLFSSL_KEIL
  30712. "muls r6, r7, r6\n\t"
  30713. #elif defined(__clang__)
  30714. "muls r6, r7\n\t"
  30715. #else
  30716. "mul r6, r7\n\t"
  30717. #endif
  30718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30719. "lsrs r7, r6, #16\n\t"
  30720. #else
  30721. "lsr r7, r6, #16\n\t"
  30722. #endif
  30723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30724. "lsls r6, r6, #16\n\t"
  30725. #else
  30726. "lsl r6, r6, #16\n\t"
  30727. #endif
  30728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30729. "adds r4, r4, r6\n\t"
  30730. #else
  30731. "add r4, r4, r6\n\t"
  30732. #endif
  30733. #ifdef WOLFSSL_KEIL
  30734. "adcs r5, r5, r7\n\t"
  30735. #elif defined(__clang__)
  30736. "adcs r5, r7\n\t"
  30737. #else
  30738. "adc r5, r7\n\t"
  30739. #endif
  30740. #ifdef WOLFSSL_KEIL
  30741. "adcs r3, r3, %[r]\n\t"
  30742. #elif defined(__clang__)
  30743. "adcs r3, %[r]\n\t"
  30744. #else
  30745. "adc r3, %[r]\n\t"
  30746. #endif
  30747. "str r4, [sp, #4]\n\t"
  30748. "# A[2] * B[0]\n\t"
  30749. "movs r4, #0\n\t"
  30750. "mov %[a], r9\n\t"
  30751. "mov %[b], r10\n\t"
  30752. "ldr %[a], [%[a], #8]\n\t"
  30753. "ldr %[b], [%[b]]\n\t"
  30754. "uxth r6, %[a]\n\t"
  30755. "uxth r7, %[b]\n\t"
  30756. #ifdef WOLFSSL_KEIL
  30757. "muls r7, r6, r7\n\t"
  30758. #elif defined(__clang__)
  30759. "muls r7, r6\n\t"
  30760. #else
  30761. "mul r7, r6\n\t"
  30762. #endif
  30763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30764. "adds r5, r5, r7\n\t"
  30765. #else
  30766. "add r5, r5, r7\n\t"
  30767. #endif
  30768. #ifdef WOLFSSL_KEIL
  30769. "adcs r3, r3, %[r]\n\t"
  30770. #elif defined(__clang__)
  30771. "adcs r3, %[r]\n\t"
  30772. #else
  30773. "adc r3, %[r]\n\t"
  30774. #endif
  30775. #ifdef WOLFSSL_KEIL
  30776. "adcs r4, r4, %[r]\n\t"
  30777. #elif defined(__clang__)
  30778. "adcs r4, %[r]\n\t"
  30779. #else
  30780. "adc r4, %[r]\n\t"
  30781. #endif
  30782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30783. "lsrs r7, %[b], #16\n\t"
  30784. #else
  30785. "lsr r7, %[b], #16\n\t"
  30786. #endif
  30787. #ifdef WOLFSSL_KEIL
  30788. "muls r6, r7, r6\n\t"
  30789. #elif defined(__clang__)
  30790. "muls r6, r7\n\t"
  30791. #else
  30792. "mul r6, r7\n\t"
  30793. #endif
  30794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30795. "lsrs r7, r6, #16\n\t"
  30796. #else
  30797. "lsr r7, r6, #16\n\t"
  30798. #endif
  30799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30800. "lsls r6, r6, #16\n\t"
  30801. #else
  30802. "lsl r6, r6, #16\n\t"
  30803. #endif
  30804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30805. "adds r5, r5, r6\n\t"
  30806. #else
  30807. "add r5, r5, r6\n\t"
  30808. #endif
  30809. #ifdef WOLFSSL_KEIL
  30810. "adcs r3, r3, r7\n\t"
  30811. #elif defined(__clang__)
  30812. "adcs r3, r7\n\t"
  30813. #else
  30814. "adc r3, r7\n\t"
  30815. #endif
  30816. #ifdef WOLFSSL_KEIL
  30817. "adcs r4, r4, %[r]\n\t"
  30818. #elif defined(__clang__)
  30819. "adcs r4, %[r]\n\t"
  30820. #else
  30821. "adc r4, %[r]\n\t"
  30822. #endif
  30823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30824. "lsrs r6, %[a], #16\n\t"
  30825. #else
  30826. "lsr r6, %[a], #16\n\t"
  30827. #endif
  30828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30829. "lsrs r7, %[b], #16\n\t"
  30830. #else
  30831. "lsr r7, %[b], #16\n\t"
  30832. #endif
  30833. #ifdef WOLFSSL_KEIL
  30834. "muls r7, r6, r7\n\t"
  30835. #elif defined(__clang__)
  30836. "muls r7, r6\n\t"
  30837. #else
  30838. "mul r7, r6\n\t"
  30839. #endif
  30840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30841. "adds r3, r3, r7\n\t"
  30842. #else
  30843. "add r3, r3, r7\n\t"
  30844. #endif
  30845. #ifdef WOLFSSL_KEIL
  30846. "adcs r4, r4, %[r]\n\t"
  30847. #elif defined(__clang__)
  30848. "adcs r4, %[r]\n\t"
  30849. #else
  30850. "adc r4, %[r]\n\t"
  30851. #endif
  30852. "uxth r7, %[b]\n\t"
  30853. #ifdef WOLFSSL_KEIL
  30854. "muls r6, r7, r6\n\t"
  30855. #elif defined(__clang__)
  30856. "muls r6, r7\n\t"
  30857. #else
  30858. "mul r6, r7\n\t"
  30859. #endif
  30860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30861. "lsrs r7, r6, #16\n\t"
  30862. #else
  30863. "lsr r7, r6, #16\n\t"
  30864. #endif
  30865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30866. "lsls r6, r6, #16\n\t"
  30867. #else
  30868. "lsl r6, r6, #16\n\t"
  30869. #endif
  30870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30871. "adds r5, r5, r6\n\t"
  30872. #else
  30873. "add r5, r5, r6\n\t"
  30874. #endif
  30875. #ifdef WOLFSSL_KEIL
  30876. "adcs r3, r3, r7\n\t"
  30877. #elif defined(__clang__)
  30878. "adcs r3, r7\n\t"
  30879. #else
  30880. "adc r3, r7\n\t"
  30881. #endif
  30882. #ifdef WOLFSSL_KEIL
  30883. "adcs r4, r4, %[r]\n\t"
  30884. #elif defined(__clang__)
  30885. "adcs r4, %[r]\n\t"
  30886. #else
  30887. "adc r4, %[r]\n\t"
  30888. #endif
  30889. "# A[1] * B[1]\n\t"
  30890. "mov %[a], r9\n\t"
  30891. "mov %[b], r10\n\t"
  30892. "ldr %[a], [%[a], #4]\n\t"
  30893. "ldr %[b], [%[b], #4]\n\t"
  30894. "uxth r6, %[a]\n\t"
  30895. "uxth r7, %[b]\n\t"
  30896. #ifdef WOLFSSL_KEIL
  30897. "muls r7, r6, r7\n\t"
  30898. #elif defined(__clang__)
  30899. "muls r7, r6\n\t"
  30900. #else
  30901. "mul r7, r6\n\t"
  30902. #endif
  30903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30904. "adds r5, r5, r7\n\t"
  30905. #else
  30906. "add r5, r5, r7\n\t"
  30907. #endif
  30908. #ifdef WOLFSSL_KEIL
  30909. "adcs r3, r3, %[r]\n\t"
  30910. #elif defined(__clang__)
  30911. "adcs r3, %[r]\n\t"
  30912. #else
  30913. "adc r3, %[r]\n\t"
  30914. #endif
  30915. #ifdef WOLFSSL_KEIL
  30916. "adcs r4, r4, %[r]\n\t"
  30917. #elif defined(__clang__)
  30918. "adcs r4, %[r]\n\t"
  30919. #else
  30920. "adc r4, %[r]\n\t"
  30921. #endif
  30922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30923. "lsrs r7, %[b], #16\n\t"
  30924. #else
  30925. "lsr r7, %[b], #16\n\t"
  30926. #endif
  30927. #ifdef WOLFSSL_KEIL
  30928. "muls r6, r7, r6\n\t"
  30929. #elif defined(__clang__)
  30930. "muls r6, r7\n\t"
  30931. #else
  30932. "mul r6, r7\n\t"
  30933. #endif
  30934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30935. "lsrs r7, r6, #16\n\t"
  30936. #else
  30937. "lsr r7, r6, #16\n\t"
  30938. #endif
  30939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30940. "lsls r6, r6, #16\n\t"
  30941. #else
  30942. "lsl r6, r6, #16\n\t"
  30943. #endif
  30944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30945. "adds r5, r5, r6\n\t"
  30946. #else
  30947. "add r5, r5, r6\n\t"
  30948. #endif
  30949. #ifdef WOLFSSL_KEIL
  30950. "adcs r3, r3, r7\n\t"
  30951. #elif defined(__clang__)
  30952. "adcs r3, r7\n\t"
  30953. #else
  30954. "adc r3, r7\n\t"
  30955. #endif
  30956. #ifdef WOLFSSL_KEIL
  30957. "adcs r4, r4, %[r]\n\t"
  30958. #elif defined(__clang__)
  30959. "adcs r4, %[r]\n\t"
  30960. #else
  30961. "adc r4, %[r]\n\t"
  30962. #endif
  30963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30964. "lsrs r6, %[a], #16\n\t"
  30965. #else
  30966. "lsr r6, %[a], #16\n\t"
  30967. #endif
  30968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30969. "lsrs r7, %[b], #16\n\t"
  30970. #else
  30971. "lsr r7, %[b], #16\n\t"
  30972. #endif
  30973. #ifdef WOLFSSL_KEIL
  30974. "muls r7, r6, r7\n\t"
  30975. #elif defined(__clang__)
  30976. "muls r7, r6\n\t"
  30977. #else
  30978. "mul r7, r6\n\t"
  30979. #endif
  30980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  30981. "adds r3, r3, r7\n\t"
  30982. #else
  30983. "add r3, r3, r7\n\t"
  30984. #endif
  30985. #ifdef WOLFSSL_KEIL
  30986. "adcs r4, r4, %[r]\n\t"
  30987. #elif defined(__clang__)
  30988. "adcs r4, %[r]\n\t"
  30989. #else
  30990. "adc r4, %[r]\n\t"
  30991. #endif
  30992. "uxth r7, %[b]\n\t"
  30993. #ifdef WOLFSSL_KEIL
  30994. "muls r6, r7, r6\n\t"
  30995. #elif defined(__clang__)
  30996. "muls r6, r7\n\t"
  30997. #else
  30998. "mul r6, r7\n\t"
  30999. #endif
  31000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31001. "lsrs r7, r6, #16\n\t"
  31002. #else
  31003. "lsr r7, r6, #16\n\t"
  31004. #endif
  31005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31006. "lsls r6, r6, #16\n\t"
  31007. #else
  31008. "lsl r6, r6, #16\n\t"
  31009. #endif
  31010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31011. "adds r5, r5, r6\n\t"
  31012. #else
  31013. "add r5, r5, r6\n\t"
  31014. #endif
  31015. #ifdef WOLFSSL_KEIL
  31016. "adcs r3, r3, r7\n\t"
  31017. #elif defined(__clang__)
  31018. "adcs r3, r7\n\t"
  31019. #else
  31020. "adc r3, r7\n\t"
  31021. #endif
  31022. #ifdef WOLFSSL_KEIL
  31023. "adcs r4, r4, %[r]\n\t"
  31024. #elif defined(__clang__)
  31025. "adcs r4, %[r]\n\t"
  31026. #else
  31027. "adc r4, %[r]\n\t"
  31028. #endif
  31029. "# A[0] * B[2]\n\t"
  31030. "mov %[a], r9\n\t"
  31031. "mov %[b], r10\n\t"
  31032. "ldr %[a], [%[a]]\n\t"
  31033. "ldr %[b], [%[b], #8]\n\t"
  31034. "uxth r6, %[a]\n\t"
  31035. "uxth r7, %[b]\n\t"
  31036. #ifdef WOLFSSL_KEIL
  31037. "muls r7, r6, r7\n\t"
  31038. #elif defined(__clang__)
  31039. "muls r7, r6\n\t"
  31040. #else
  31041. "mul r7, r6\n\t"
  31042. #endif
  31043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31044. "adds r5, r5, r7\n\t"
  31045. #else
  31046. "add r5, r5, r7\n\t"
  31047. #endif
  31048. #ifdef WOLFSSL_KEIL
  31049. "adcs r3, r3, %[r]\n\t"
  31050. #elif defined(__clang__)
  31051. "adcs r3, %[r]\n\t"
  31052. #else
  31053. "adc r3, %[r]\n\t"
  31054. #endif
  31055. #ifdef WOLFSSL_KEIL
  31056. "adcs r4, r4, %[r]\n\t"
  31057. #elif defined(__clang__)
  31058. "adcs r4, %[r]\n\t"
  31059. #else
  31060. "adc r4, %[r]\n\t"
  31061. #endif
  31062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31063. "lsrs r7, %[b], #16\n\t"
  31064. #else
  31065. "lsr r7, %[b], #16\n\t"
  31066. #endif
  31067. #ifdef WOLFSSL_KEIL
  31068. "muls r6, r7, r6\n\t"
  31069. #elif defined(__clang__)
  31070. "muls r6, r7\n\t"
  31071. #else
  31072. "mul r6, r7\n\t"
  31073. #endif
  31074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31075. "lsrs r7, r6, #16\n\t"
  31076. #else
  31077. "lsr r7, r6, #16\n\t"
  31078. #endif
  31079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31080. "lsls r6, r6, #16\n\t"
  31081. #else
  31082. "lsl r6, r6, #16\n\t"
  31083. #endif
  31084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31085. "adds r5, r5, r6\n\t"
  31086. #else
  31087. "add r5, r5, r6\n\t"
  31088. #endif
  31089. #ifdef WOLFSSL_KEIL
  31090. "adcs r3, r3, r7\n\t"
  31091. #elif defined(__clang__)
  31092. "adcs r3, r7\n\t"
  31093. #else
  31094. "adc r3, r7\n\t"
  31095. #endif
  31096. #ifdef WOLFSSL_KEIL
  31097. "adcs r4, r4, %[r]\n\t"
  31098. #elif defined(__clang__)
  31099. "adcs r4, %[r]\n\t"
  31100. #else
  31101. "adc r4, %[r]\n\t"
  31102. #endif
  31103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31104. "lsrs r6, %[a], #16\n\t"
  31105. #else
  31106. "lsr r6, %[a], #16\n\t"
  31107. #endif
  31108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31109. "lsrs r7, %[b], #16\n\t"
  31110. #else
  31111. "lsr r7, %[b], #16\n\t"
  31112. #endif
  31113. #ifdef WOLFSSL_KEIL
  31114. "muls r7, r6, r7\n\t"
  31115. #elif defined(__clang__)
  31116. "muls r7, r6\n\t"
  31117. #else
  31118. "mul r7, r6\n\t"
  31119. #endif
  31120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31121. "adds r3, r3, r7\n\t"
  31122. #else
  31123. "add r3, r3, r7\n\t"
  31124. #endif
  31125. #ifdef WOLFSSL_KEIL
  31126. "adcs r4, r4, %[r]\n\t"
  31127. #elif defined(__clang__)
  31128. "adcs r4, %[r]\n\t"
  31129. #else
  31130. "adc r4, %[r]\n\t"
  31131. #endif
  31132. "uxth r7, %[b]\n\t"
  31133. #ifdef WOLFSSL_KEIL
  31134. "muls r6, r7, r6\n\t"
  31135. #elif defined(__clang__)
  31136. "muls r6, r7\n\t"
  31137. #else
  31138. "mul r6, r7\n\t"
  31139. #endif
  31140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31141. "lsrs r7, r6, #16\n\t"
  31142. #else
  31143. "lsr r7, r6, #16\n\t"
  31144. #endif
  31145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31146. "lsls r6, r6, #16\n\t"
  31147. #else
  31148. "lsl r6, r6, #16\n\t"
  31149. #endif
  31150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31151. "adds r5, r5, r6\n\t"
  31152. #else
  31153. "add r5, r5, r6\n\t"
  31154. #endif
  31155. #ifdef WOLFSSL_KEIL
  31156. "adcs r3, r3, r7\n\t"
  31157. #elif defined(__clang__)
  31158. "adcs r3, r7\n\t"
  31159. #else
  31160. "adc r3, r7\n\t"
  31161. #endif
  31162. #ifdef WOLFSSL_KEIL
  31163. "adcs r4, r4, %[r]\n\t"
  31164. #elif defined(__clang__)
  31165. "adcs r4, %[r]\n\t"
  31166. #else
  31167. "adc r4, %[r]\n\t"
  31168. #endif
  31169. "str r5, [sp, #8]\n\t"
  31170. "# A[0] * B[3]\n\t"
  31171. "movs r5, #0\n\t"
  31172. "mov %[a], r9\n\t"
  31173. "mov %[b], r10\n\t"
  31174. "ldr %[a], [%[a]]\n\t"
  31175. "ldr %[b], [%[b], #12]\n\t"
  31176. "uxth r6, %[a]\n\t"
  31177. "uxth r7, %[b]\n\t"
  31178. #ifdef WOLFSSL_KEIL
  31179. "muls r7, r6, r7\n\t"
  31180. #elif defined(__clang__)
  31181. "muls r7, r6\n\t"
  31182. #else
  31183. "mul r7, r6\n\t"
  31184. #endif
  31185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31186. "adds r3, r3, r7\n\t"
  31187. #else
  31188. "add r3, r3, r7\n\t"
  31189. #endif
  31190. #ifdef WOLFSSL_KEIL
  31191. "adcs r4, r4, %[r]\n\t"
  31192. #elif defined(__clang__)
  31193. "adcs r4, %[r]\n\t"
  31194. #else
  31195. "adc r4, %[r]\n\t"
  31196. #endif
  31197. #ifdef WOLFSSL_KEIL
  31198. "adcs r5, r5, %[r]\n\t"
  31199. #elif defined(__clang__)
  31200. "adcs r5, %[r]\n\t"
  31201. #else
  31202. "adc r5, %[r]\n\t"
  31203. #endif
  31204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31205. "lsrs r7, %[b], #16\n\t"
  31206. #else
  31207. "lsr r7, %[b], #16\n\t"
  31208. #endif
  31209. #ifdef WOLFSSL_KEIL
  31210. "muls r6, r7, r6\n\t"
  31211. #elif defined(__clang__)
  31212. "muls r6, r7\n\t"
  31213. #else
  31214. "mul r6, r7\n\t"
  31215. #endif
  31216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31217. "lsrs r7, r6, #16\n\t"
  31218. #else
  31219. "lsr r7, r6, #16\n\t"
  31220. #endif
  31221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31222. "lsls r6, r6, #16\n\t"
  31223. #else
  31224. "lsl r6, r6, #16\n\t"
  31225. #endif
  31226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31227. "adds r3, r3, r6\n\t"
  31228. #else
  31229. "add r3, r3, r6\n\t"
  31230. #endif
  31231. #ifdef WOLFSSL_KEIL
  31232. "adcs r4, r4, r7\n\t"
  31233. #elif defined(__clang__)
  31234. "adcs r4, r7\n\t"
  31235. #else
  31236. "adc r4, r7\n\t"
  31237. #endif
  31238. #ifdef WOLFSSL_KEIL
  31239. "adcs r5, r5, %[r]\n\t"
  31240. #elif defined(__clang__)
  31241. "adcs r5, %[r]\n\t"
  31242. #else
  31243. "adc r5, %[r]\n\t"
  31244. #endif
  31245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31246. "lsrs r6, %[a], #16\n\t"
  31247. #else
  31248. "lsr r6, %[a], #16\n\t"
  31249. #endif
  31250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31251. "lsrs r7, %[b], #16\n\t"
  31252. #else
  31253. "lsr r7, %[b], #16\n\t"
  31254. #endif
  31255. #ifdef WOLFSSL_KEIL
  31256. "muls r7, r6, r7\n\t"
  31257. #elif defined(__clang__)
  31258. "muls r7, r6\n\t"
  31259. #else
  31260. "mul r7, r6\n\t"
  31261. #endif
  31262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31263. "adds r4, r4, r7\n\t"
  31264. #else
  31265. "add r4, r4, r7\n\t"
  31266. #endif
  31267. #ifdef WOLFSSL_KEIL
  31268. "adcs r5, r5, %[r]\n\t"
  31269. #elif defined(__clang__)
  31270. "adcs r5, %[r]\n\t"
  31271. #else
  31272. "adc r5, %[r]\n\t"
  31273. #endif
  31274. "uxth r7, %[b]\n\t"
  31275. #ifdef WOLFSSL_KEIL
  31276. "muls r6, r7, r6\n\t"
  31277. #elif defined(__clang__)
  31278. "muls r6, r7\n\t"
  31279. #else
  31280. "mul r6, r7\n\t"
  31281. #endif
  31282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31283. "lsrs r7, r6, #16\n\t"
  31284. #else
  31285. "lsr r7, r6, #16\n\t"
  31286. #endif
  31287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31288. "lsls r6, r6, #16\n\t"
  31289. #else
  31290. "lsl r6, r6, #16\n\t"
  31291. #endif
  31292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31293. "adds r3, r3, r6\n\t"
  31294. #else
  31295. "add r3, r3, r6\n\t"
  31296. #endif
  31297. #ifdef WOLFSSL_KEIL
  31298. "adcs r4, r4, r7\n\t"
  31299. #elif defined(__clang__)
  31300. "adcs r4, r7\n\t"
  31301. #else
  31302. "adc r4, r7\n\t"
  31303. #endif
  31304. #ifdef WOLFSSL_KEIL
  31305. "adcs r5, r5, %[r]\n\t"
  31306. #elif defined(__clang__)
  31307. "adcs r5, %[r]\n\t"
  31308. #else
  31309. "adc r5, %[r]\n\t"
  31310. #endif
  31311. "# A[1] * B[2]\n\t"
  31312. "mov %[a], r9\n\t"
  31313. "mov %[b], r10\n\t"
  31314. "ldr %[a], [%[a], #4]\n\t"
  31315. "ldr %[b], [%[b], #8]\n\t"
  31316. "uxth r6, %[a]\n\t"
  31317. "uxth r7, %[b]\n\t"
  31318. #ifdef WOLFSSL_KEIL
  31319. "muls r7, r6, r7\n\t"
  31320. #elif defined(__clang__)
  31321. "muls r7, r6\n\t"
  31322. #else
  31323. "mul r7, r6\n\t"
  31324. #endif
  31325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31326. "adds r3, r3, r7\n\t"
  31327. #else
  31328. "add r3, r3, r7\n\t"
  31329. #endif
  31330. #ifdef WOLFSSL_KEIL
  31331. "adcs r4, r4, %[r]\n\t"
  31332. #elif defined(__clang__)
  31333. "adcs r4, %[r]\n\t"
  31334. #else
  31335. "adc r4, %[r]\n\t"
  31336. #endif
  31337. #ifdef WOLFSSL_KEIL
  31338. "adcs r5, r5, %[r]\n\t"
  31339. #elif defined(__clang__)
  31340. "adcs r5, %[r]\n\t"
  31341. #else
  31342. "adc r5, %[r]\n\t"
  31343. #endif
  31344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31345. "lsrs r7, %[b], #16\n\t"
  31346. #else
  31347. "lsr r7, %[b], #16\n\t"
  31348. #endif
  31349. #ifdef WOLFSSL_KEIL
  31350. "muls r6, r7, r6\n\t"
  31351. #elif defined(__clang__)
  31352. "muls r6, r7\n\t"
  31353. #else
  31354. "mul r6, r7\n\t"
  31355. #endif
  31356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31357. "lsrs r7, r6, #16\n\t"
  31358. #else
  31359. "lsr r7, r6, #16\n\t"
  31360. #endif
  31361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31362. "lsls r6, r6, #16\n\t"
  31363. #else
  31364. "lsl r6, r6, #16\n\t"
  31365. #endif
  31366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31367. "adds r3, r3, r6\n\t"
  31368. #else
  31369. "add r3, r3, r6\n\t"
  31370. #endif
  31371. #ifdef WOLFSSL_KEIL
  31372. "adcs r4, r4, r7\n\t"
  31373. #elif defined(__clang__)
  31374. "adcs r4, r7\n\t"
  31375. #else
  31376. "adc r4, r7\n\t"
  31377. #endif
  31378. #ifdef WOLFSSL_KEIL
  31379. "adcs r5, r5, %[r]\n\t"
  31380. #elif defined(__clang__)
  31381. "adcs r5, %[r]\n\t"
  31382. #else
  31383. "adc r5, %[r]\n\t"
  31384. #endif
  31385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31386. "lsrs r6, %[a], #16\n\t"
  31387. #else
  31388. "lsr r6, %[a], #16\n\t"
  31389. #endif
  31390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31391. "lsrs r7, %[b], #16\n\t"
  31392. #else
  31393. "lsr r7, %[b], #16\n\t"
  31394. #endif
  31395. #ifdef WOLFSSL_KEIL
  31396. "muls r7, r6, r7\n\t"
  31397. #elif defined(__clang__)
  31398. "muls r7, r6\n\t"
  31399. #else
  31400. "mul r7, r6\n\t"
  31401. #endif
  31402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31403. "adds r4, r4, r7\n\t"
  31404. #else
  31405. "add r4, r4, r7\n\t"
  31406. #endif
  31407. #ifdef WOLFSSL_KEIL
  31408. "adcs r5, r5, %[r]\n\t"
  31409. #elif defined(__clang__)
  31410. "adcs r5, %[r]\n\t"
  31411. #else
  31412. "adc r5, %[r]\n\t"
  31413. #endif
  31414. "uxth r7, %[b]\n\t"
  31415. #ifdef WOLFSSL_KEIL
  31416. "muls r6, r7, r6\n\t"
  31417. #elif defined(__clang__)
  31418. "muls r6, r7\n\t"
  31419. #else
  31420. "mul r6, r7\n\t"
  31421. #endif
  31422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31423. "lsrs r7, r6, #16\n\t"
  31424. #else
  31425. "lsr r7, r6, #16\n\t"
  31426. #endif
  31427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31428. "lsls r6, r6, #16\n\t"
  31429. #else
  31430. "lsl r6, r6, #16\n\t"
  31431. #endif
  31432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31433. "adds r3, r3, r6\n\t"
  31434. #else
  31435. "add r3, r3, r6\n\t"
  31436. #endif
  31437. #ifdef WOLFSSL_KEIL
  31438. "adcs r4, r4, r7\n\t"
  31439. #elif defined(__clang__)
  31440. "adcs r4, r7\n\t"
  31441. #else
  31442. "adc r4, r7\n\t"
  31443. #endif
  31444. #ifdef WOLFSSL_KEIL
  31445. "adcs r5, r5, %[r]\n\t"
  31446. #elif defined(__clang__)
  31447. "adcs r5, %[r]\n\t"
  31448. #else
  31449. "adc r5, %[r]\n\t"
  31450. #endif
  31451. "# A[2] * B[1]\n\t"
  31452. "mov %[a], r9\n\t"
  31453. "mov %[b], r10\n\t"
  31454. "ldr %[a], [%[a], #8]\n\t"
  31455. "ldr %[b], [%[b], #4]\n\t"
  31456. "uxth r6, %[a]\n\t"
  31457. "uxth r7, %[b]\n\t"
  31458. #ifdef WOLFSSL_KEIL
  31459. "muls r7, r6, r7\n\t"
  31460. #elif defined(__clang__)
  31461. "muls r7, r6\n\t"
  31462. #else
  31463. "mul r7, r6\n\t"
  31464. #endif
  31465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31466. "adds r3, r3, r7\n\t"
  31467. #else
  31468. "add r3, r3, r7\n\t"
  31469. #endif
  31470. #ifdef WOLFSSL_KEIL
  31471. "adcs r4, r4, %[r]\n\t"
  31472. #elif defined(__clang__)
  31473. "adcs r4, %[r]\n\t"
  31474. #else
  31475. "adc r4, %[r]\n\t"
  31476. #endif
  31477. #ifdef WOLFSSL_KEIL
  31478. "adcs r5, r5, %[r]\n\t"
  31479. #elif defined(__clang__)
  31480. "adcs r5, %[r]\n\t"
  31481. #else
  31482. "adc r5, %[r]\n\t"
  31483. #endif
  31484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31485. "lsrs r7, %[b], #16\n\t"
  31486. #else
  31487. "lsr r7, %[b], #16\n\t"
  31488. #endif
  31489. #ifdef WOLFSSL_KEIL
  31490. "muls r6, r7, r6\n\t"
  31491. #elif defined(__clang__)
  31492. "muls r6, r7\n\t"
  31493. #else
  31494. "mul r6, r7\n\t"
  31495. #endif
  31496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31497. "lsrs r7, r6, #16\n\t"
  31498. #else
  31499. "lsr r7, r6, #16\n\t"
  31500. #endif
  31501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31502. "lsls r6, r6, #16\n\t"
  31503. #else
  31504. "lsl r6, r6, #16\n\t"
  31505. #endif
  31506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31507. "adds r3, r3, r6\n\t"
  31508. #else
  31509. "add r3, r3, r6\n\t"
  31510. #endif
  31511. #ifdef WOLFSSL_KEIL
  31512. "adcs r4, r4, r7\n\t"
  31513. #elif defined(__clang__)
  31514. "adcs r4, r7\n\t"
  31515. #else
  31516. "adc r4, r7\n\t"
  31517. #endif
  31518. #ifdef WOLFSSL_KEIL
  31519. "adcs r5, r5, %[r]\n\t"
  31520. #elif defined(__clang__)
  31521. "adcs r5, %[r]\n\t"
  31522. #else
  31523. "adc r5, %[r]\n\t"
  31524. #endif
  31525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31526. "lsrs r6, %[a], #16\n\t"
  31527. #else
  31528. "lsr r6, %[a], #16\n\t"
  31529. #endif
  31530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31531. "lsrs r7, %[b], #16\n\t"
  31532. #else
  31533. "lsr r7, %[b], #16\n\t"
  31534. #endif
  31535. #ifdef WOLFSSL_KEIL
  31536. "muls r7, r6, r7\n\t"
  31537. #elif defined(__clang__)
  31538. "muls r7, r6\n\t"
  31539. #else
  31540. "mul r7, r6\n\t"
  31541. #endif
  31542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31543. "adds r4, r4, r7\n\t"
  31544. #else
  31545. "add r4, r4, r7\n\t"
  31546. #endif
  31547. #ifdef WOLFSSL_KEIL
  31548. "adcs r5, r5, %[r]\n\t"
  31549. #elif defined(__clang__)
  31550. "adcs r5, %[r]\n\t"
  31551. #else
  31552. "adc r5, %[r]\n\t"
  31553. #endif
  31554. "uxth r7, %[b]\n\t"
  31555. #ifdef WOLFSSL_KEIL
  31556. "muls r6, r7, r6\n\t"
  31557. #elif defined(__clang__)
  31558. "muls r6, r7\n\t"
  31559. #else
  31560. "mul r6, r7\n\t"
  31561. #endif
  31562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31563. "lsrs r7, r6, #16\n\t"
  31564. #else
  31565. "lsr r7, r6, #16\n\t"
  31566. #endif
  31567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31568. "lsls r6, r6, #16\n\t"
  31569. #else
  31570. "lsl r6, r6, #16\n\t"
  31571. #endif
  31572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31573. "adds r3, r3, r6\n\t"
  31574. #else
  31575. "add r3, r3, r6\n\t"
  31576. #endif
  31577. #ifdef WOLFSSL_KEIL
  31578. "adcs r4, r4, r7\n\t"
  31579. #elif defined(__clang__)
  31580. "adcs r4, r7\n\t"
  31581. #else
  31582. "adc r4, r7\n\t"
  31583. #endif
  31584. #ifdef WOLFSSL_KEIL
  31585. "adcs r5, r5, %[r]\n\t"
  31586. #elif defined(__clang__)
  31587. "adcs r5, %[r]\n\t"
  31588. #else
  31589. "adc r5, %[r]\n\t"
  31590. #endif
  31591. "# A[3] * B[0]\n\t"
  31592. "mov %[a], r9\n\t"
  31593. "mov %[b], r10\n\t"
  31594. "ldr %[a], [%[a], #12]\n\t"
  31595. "ldr %[b], [%[b]]\n\t"
  31596. "uxth r6, %[a]\n\t"
  31597. "uxth r7, %[b]\n\t"
  31598. #ifdef WOLFSSL_KEIL
  31599. "muls r7, r6, r7\n\t"
  31600. #elif defined(__clang__)
  31601. "muls r7, r6\n\t"
  31602. #else
  31603. "mul r7, r6\n\t"
  31604. #endif
  31605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31606. "adds r3, r3, r7\n\t"
  31607. #else
  31608. "add r3, r3, r7\n\t"
  31609. #endif
  31610. #ifdef WOLFSSL_KEIL
  31611. "adcs r4, r4, %[r]\n\t"
  31612. #elif defined(__clang__)
  31613. "adcs r4, %[r]\n\t"
  31614. #else
  31615. "adc r4, %[r]\n\t"
  31616. #endif
  31617. #ifdef WOLFSSL_KEIL
  31618. "adcs r5, r5, %[r]\n\t"
  31619. #elif defined(__clang__)
  31620. "adcs r5, %[r]\n\t"
  31621. #else
  31622. "adc r5, %[r]\n\t"
  31623. #endif
  31624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31625. "lsrs r7, %[b], #16\n\t"
  31626. #else
  31627. "lsr r7, %[b], #16\n\t"
  31628. #endif
  31629. #ifdef WOLFSSL_KEIL
  31630. "muls r6, r7, r6\n\t"
  31631. #elif defined(__clang__)
  31632. "muls r6, r7\n\t"
  31633. #else
  31634. "mul r6, r7\n\t"
  31635. #endif
  31636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31637. "lsrs r7, r6, #16\n\t"
  31638. #else
  31639. "lsr r7, r6, #16\n\t"
  31640. #endif
  31641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31642. "lsls r6, r6, #16\n\t"
  31643. #else
  31644. "lsl r6, r6, #16\n\t"
  31645. #endif
  31646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31647. "adds r3, r3, r6\n\t"
  31648. #else
  31649. "add r3, r3, r6\n\t"
  31650. #endif
  31651. #ifdef WOLFSSL_KEIL
  31652. "adcs r4, r4, r7\n\t"
  31653. #elif defined(__clang__)
  31654. "adcs r4, r7\n\t"
  31655. #else
  31656. "adc r4, r7\n\t"
  31657. #endif
  31658. #ifdef WOLFSSL_KEIL
  31659. "adcs r5, r5, %[r]\n\t"
  31660. #elif defined(__clang__)
  31661. "adcs r5, %[r]\n\t"
  31662. #else
  31663. "adc r5, %[r]\n\t"
  31664. #endif
  31665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31666. "lsrs r6, %[a], #16\n\t"
  31667. #else
  31668. "lsr r6, %[a], #16\n\t"
  31669. #endif
  31670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31671. "lsrs r7, %[b], #16\n\t"
  31672. #else
  31673. "lsr r7, %[b], #16\n\t"
  31674. #endif
  31675. #ifdef WOLFSSL_KEIL
  31676. "muls r7, r6, r7\n\t"
  31677. #elif defined(__clang__)
  31678. "muls r7, r6\n\t"
  31679. #else
  31680. "mul r7, r6\n\t"
  31681. #endif
  31682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31683. "adds r4, r4, r7\n\t"
  31684. #else
  31685. "add r4, r4, r7\n\t"
  31686. #endif
  31687. #ifdef WOLFSSL_KEIL
  31688. "adcs r5, r5, %[r]\n\t"
  31689. #elif defined(__clang__)
  31690. "adcs r5, %[r]\n\t"
  31691. #else
  31692. "adc r5, %[r]\n\t"
  31693. #endif
  31694. "uxth r7, %[b]\n\t"
  31695. #ifdef WOLFSSL_KEIL
  31696. "muls r6, r7, r6\n\t"
  31697. #elif defined(__clang__)
  31698. "muls r6, r7\n\t"
  31699. #else
  31700. "mul r6, r7\n\t"
  31701. #endif
  31702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31703. "lsrs r7, r6, #16\n\t"
  31704. #else
  31705. "lsr r7, r6, #16\n\t"
  31706. #endif
  31707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31708. "lsls r6, r6, #16\n\t"
  31709. #else
  31710. "lsl r6, r6, #16\n\t"
  31711. #endif
  31712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31713. "adds r3, r3, r6\n\t"
  31714. #else
  31715. "add r3, r3, r6\n\t"
  31716. #endif
  31717. #ifdef WOLFSSL_KEIL
  31718. "adcs r4, r4, r7\n\t"
  31719. #elif defined(__clang__)
  31720. "adcs r4, r7\n\t"
  31721. #else
  31722. "adc r4, r7\n\t"
  31723. #endif
  31724. #ifdef WOLFSSL_KEIL
  31725. "adcs r5, r5, %[r]\n\t"
  31726. #elif defined(__clang__)
  31727. "adcs r5, %[r]\n\t"
  31728. #else
  31729. "adc r5, %[r]\n\t"
  31730. #endif
  31731. "str r3, [sp, #12]\n\t"
  31732. "# A[4] * B[0]\n\t"
  31733. "movs r3, #0\n\t"
  31734. "mov %[a], r9\n\t"
  31735. "mov %[b], r10\n\t"
  31736. "ldr %[a], [%[a], #16]\n\t"
  31737. "ldr %[b], [%[b]]\n\t"
  31738. "uxth r6, %[a]\n\t"
  31739. "uxth r7, %[b]\n\t"
  31740. #ifdef WOLFSSL_KEIL
  31741. "muls r7, r6, r7\n\t"
  31742. #elif defined(__clang__)
  31743. "muls r7, r6\n\t"
  31744. #else
  31745. "mul r7, r6\n\t"
  31746. #endif
  31747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31748. "adds r4, r4, r7\n\t"
  31749. #else
  31750. "add r4, r4, r7\n\t"
  31751. #endif
  31752. #ifdef WOLFSSL_KEIL
  31753. "adcs r5, r5, %[r]\n\t"
  31754. #elif defined(__clang__)
  31755. "adcs r5, %[r]\n\t"
  31756. #else
  31757. "adc r5, %[r]\n\t"
  31758. #endif
  31759. #ifdef WOLFSSL_KEIL
  31760. "adcs r3, r3, %[r]\n\t"
  31761. #elif defined(__clang__)
  31762. "adcs r3, %[r]\n\t"
  31763. #else
  31764. "adc r3, %[r]\n\t"
  31765. #endif
  31766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31767. "lsrs r7, %[b], #16\n\t"
  31768. #else
  31769. "lsr r7, %[b], #16\n\t"
  31770. #endif
  31771. #ifdef WOLFSSL_KEIL
  31772. "muls r6, r7, r6\n\t"
  31773. #elif defined(__clang__)
  31774. "muls r6, r7\n\t"
  31775. #else
  31776. "mul r6, r7\n\t"
  31777. #endif
  31778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31779. "lsrs r7, r6, #16\n\t"
  31780. #else
  31781. "lsr r7, r6, #16\n\t"
  31782. #endif
  31783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31784. "lsls r6, r6, #16\n\t"
  31785. #else
  31786. "lsl r6, r6, #16\n\t"
  31787. #endif
  31788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31789. "adds r4, r4, r6\n\t"
  31790. #else
  31791. "add r4, r4, r6\n\t"
  31792. #endif
  31793. #ifdef WOLFSSL_KEIL
  31794. "adcs r5, r5, r7\n\t"
  31795. #elif defined(__clang__)
  31796. "adcs r5, r7\n\t"
  31797. #else
  31798. "adc r5, r7\n\t"
  31799. #endif
  31800. #ifdef WOLFSSL_KEIL
  31801. "adcs r3, r3, %[r]\n\t"
  31802. #elif defined(__clang__)
  31803. "adcs r3, %[r]\n\t"
  31804. #else
  31805. "adc r3, %[r]\n\t"
  31806. #endif
  31807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31808. "lsrs r6, %[a], #16\n\t"
  31809. #else
  31810. "lsr r6, %[a], #16\n\t"
  31811. #endif
  31812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31813. "lsrs r7, %[b], #16\n\t"
  31814. #else
  31815. "lsr r7, %[b], #16\n\t"
  31816. #endif
  31817. #ifdef WOLFSSL_KEIL
  31818. "muls r7, r6, r7\n\t"
  31819. #elif defined(__clang__)
  31820. "muls r7, r6\n\t"
  31821. #else
  31822. "mul r7, r6\n\t"
  31823. #endif
  31824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31825. "adds r5, r5, r7\n\t"
  31826. #else
  31827. "add r5, r5, r7\n\t"
  31828. #endif
  31829. #ifdef WOLFSSL_KEIL
  31830. "adcs r3, r3, %[r]\n\t"
  31831. #elif defined(__clang__)
  31832. "adcs r3, %[r]\n\t"
  31833. #else
  31834. "adc r3, %[r]\n\t"
  31835. #endif
  31836. "uxth r7, %[b]\n\t"
  31837. #ifdef WOLFSSL_KEIL
  31838. "muls r6, r7, r6\n\t"
  31839. #elif defined(__clang__)
  31840. "muls r6, r7\n\t"
  31841. #else
  31842. "mul r6, r7\n\t"
  31843. #endif
  31844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31845. "lsrs r7, r6, #16\n\t"
  31846. #else
  31847. "lsr r7, r6, #16\n\t"
  31848. #endif
  31849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31850. "lsls r6, r6, #16\n\t"
  31851. #else
  31852. "lsl r6, r6, #16\n\t"
  31853. #endif
  31854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31855. "adds r4, r4, r6\n\t"
  31856. #else
  31857. "add r4, r4, r6\n\t"
  31858. #endif
  31859. #ifdef WOLFSSL_KEIL
  31860. "adcs r5, r5, r7\n\t"
  31861. #elif defined(__clang__)
  31862. "adcs r5, r7\n\t"
  31863. #else
  31864. "adc r5, r7\n\t"
  31865. #endif
  31866. #ifdef WOLFSSL_KEIL
  31867. "adcs r3, r3, %[r]\n\t"
  31868. #elif defined(__clang__)
  31869. "adcs r3, %[r]\n\t"
  31870. #else
  31871. "adc r3, %[r]\n\t"
  31872. #endif
  31873. "# A[3] * B[1]\n\t"
  31874. "mov %[a], r9\n\t"
  31875. "mov %[b], r10\n\t"
  31876. "ldr %[a], [%[a], #12]\n\t"
  31877. "ldr %[b], [%[b], #4]\n\t"
  31878. "uxth r6, %[a]\n\t"
  31879. "uxth r7, %[b]\n\t"
  31880. #ifdef WOLFSSL_KEIL
  31881. "muls r7, r6, r7\n\t"
  31882. #elif defined(__clang__)
  31883. "muls r7, r6\n\t"
  31884. #else
  31885. "mul r7, r6\n\t"
  31886. #endif
  31887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31888. "adds r4, r4, r7\n\t"
  31889. #else
  31890. "add r4, r4, r7\n\t"
  31891. #endif
  31892. #ifdef WOLFSSL_KEIL
  31893. "adcs r5, r5, %[r]\n\t"
  31894. #elif defined(__clang__)
  31895. "adcs r5, %[r]\n\t"
  31896. #else
  31897. "adc r5, %[r]\n\t"
  31898. #endif
  31899. #ifdef WOLFSSL_KEIL
  31900. "adcs r3, r3, %[r]\n\t"
  31901. #elif defined(__clang__)
  31902. "adcs r3, %[r]\n\t"
  31903. #else
  31904. "adc r3, %[r]\n\t"
  31905. #endif
  31906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31907. "lsrs r7, %[b], #16\n\t"
  31908. #else
  31909. "lsr r7, %[b], #16\n\t"
  31910. #endif
  31911. #ifdef WOLFSSL_KEIL
  31912. "muls r6, r7, r6\n\t"
  31913. #elif defined(__clang__)
  31914. "muls r6, r7\n\t"
  31915. #else
  31916. "mul r6, r7\n\t"
  31917. #endif
  31918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31919. "lsrs r7, r6, #16\n\t"
  31920. #else
  31921. "lsr r7, r6, #16\n\t"
  31922. #endif
  31923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31924. "lsls r6, r6, #16\n\t"
  31925. #else
  31926. "lsl r6, r6, #16\n\t"
  31927. #endif
  31928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31929. "adds r4, r4, r6\n\t"
  31930. #else
  31931. "add r4, r4, r6\n\t"
  31932. #endif
  31933. #ifdef WOLFSSL_KEIL
  31934. "adcs r5, r5, r7\n\t"
  31935. #elif defined(__clang__)
  31936. "adcs r5, r7\n\t"
  31937. #else
  31938. "adc r5, r7\n\t"
  31939. #endif
  31940. #ifdef WOLFSSL_KEIL
  31941. "adcs r3, r3, %[r]\n\t"
  31942. #elif defined(__clang__)
  31943. "adcs r3, %[r]\n\t"
  31944. #else
  31945. "adc r3, %[r]\n\t"
  31946. #endif
  31947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31948. "lsrs r6, %[a], #16\n\t"
  31949. #else
  31950. "lsr r6, %[a], #16\n\t"
  31951. #endif
  31952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31953. "lsrs r7, %[b], #16\n\t"
  31954. #else
  31955. "lsr r7, %[b], #16\n\t"
  31956. #endif
  31957. #ifdef WOLFSSL_KEIL
  31958. "muls r7, r6, r7\n\t"
  31959. #elif defined(__clang__)
  31960. "muls r7, r6\n\t"
  31961. #else
  31962. "mul r7, r6\n\t"
  31963. #endif
  31964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31965. "adds r5, r5, r7\n\t"
  31966. #else
  31967. "add r5, r5, r7\n\t"
  31968. #endif
  31969. #ifdef WOLFSSL_KEIL
  31970. "adcs r3, r3, %[r]\n\t"
  31971. #elif defined(__clang__)
  31972. "adcs r3, %[r]\n\t"
  31973. #else
  31974. "adc r3, %[r]\n\t"
  31975. #endif
  31976. "uxth r7, %[b]\n\t"
  31977. #ifdef WOLFSSL_KEIL
  31978. "muls r6, r7, r6\n\t"
  31979. #elif defined(__clang__)
  31980. "muls r6, r7\n\t"
  31981. #else
  31982. "mul r6, r7\n\t"
  31983. #endif
  31984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31985. "lsrs r7, r6, #16\n\t"
  31986. #else
  31987. "lsr r7, r6, #16\n\t"
  31988. #endif
  31989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31990. "lsls r6, r6, #16\n\t"
  31991. #else
  31992. "lsl r6, r6, #16\n\t"
  31993. #endif
  31994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  31995. "adds r4, r4, r6\n\t"
  31996. #else
  31997. "add r4, r4, r6\n\t"
  31998. #endif
  31999. #ifdef WOLFSSL_KEIL
  32000. "adcs r5, r5, r7\n\t"
  32001. #elif defined(__clang__)
  32002. "adcs r5, r7\n\t"
  32003. #else
  32004. "adc r5, r7\n\t"
  32005. #endif
  32006. #ifdef WOLFSSL_KEIL
  32007. "adcs r3, r3, %[r]\n\t"
  32008. #elif defined(__clang__)
  32009. "adcs r3, %[r]\n\t"
  32010. #else
  32011. "adc r3, %[r]\n\t"
  32012. #endif
  32013. "# A[2] * B[2]\n\t"
  32014. "mov %[a], r9\n\t"
  32015. "mov %[b], r10\n\t"
  32016. "ldr %[a], [%[a], #8]\n\t"
  32017. "ldr %[b], [%[b], #8]\n\t"
  32018. "uxth r6, %[a]\n\t"
  32019. "uxth r7, %[b]\n\t"
  32020. #ifdef WOLFSSL_KEIL
  32021. "muls r7, r6, r7\n\t"
  32022. #elif defined(__clang__)
  32023. "muls r7, r6\n\t"
  32024. #else
  32025. "mul r7, r6\n\t"
  32026. #endif
  32027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32028. "adds r4, r4, r7\n\t"
  32029. #else
  32030. "add r4, r4, r7\n\t"
  32031. #endif
  32032. #ifdef WOLFSSL_KEIL
  32033. "adcs r5, r5, %[r]\n\t"
  32034. #elif defined(__clang__)
  32035. "adcs r5, %[r]\n\t"
  32036. #else
  32037. "adc r5, %[r]\n\t"
  32038. #endif
  32039. #ifdef WOLFSSL_KEIL
  32040. "adcs r3, r3, %[r]\n\t"
  32041. #elif defined(__clang__)
  32042. "adcs r3, %[r]\n\t"
  32043. #else
  32044. "adc r3, %[r]\n\t"
  32045. #endif
  32046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32047. "lsrs r7, %[b], #16\n\t"
  32048. #else
  32049. "lsr r7, %[b], #16\n\t"
  32050. #endif
  32051. #ifdef WOLFSSL_KEIL
  32052. "muls r6, r7, r6\n\t"
  32053. #elif defined(__clang__)
  32054. "muls r6, r7\n\t"
  32055. #else
  32056. "mul r6, r7\n\t"
  32057. #endif
  32058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32059. "lsrs r7, r6, #16\n\t"
  32060. #else
  32061. "lsr r7, r6, #16\n\t"
  32062. #endif
  32063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32064. "lsls r6, r6, #16\n\t"
  32065. #else
  32066. "lsl r6, r6, #16\n\t"
  32067. #endif
  32068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32069. "adds r4, r4, r6\n\t"
  32070. #else
  32071. "add r4, r4, r6\n\t"
  32072. #endif
  32073. #ifdef WOLFSSL_KEIL
  32074. "adcs r5, r5, r7\n\t"
  32075. #elif defined(__clang__)
  32076. "adcs r5, r7\n\t"
  32077. #else
  32078. "adc r5, r7\n\t"
  32079. #endif
  32080. #ifdef WOLFSSL_KEIL
  32081. "adcs r3, r3, %[r]\n\t"
  32082. #elif defined(__clang__)
  32083. "adcs r3, %[r]\n\t"
  32084. #else
  32085. "adc r3, %[r]\n\t"
  32086. #endif
  32087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32088. "lsrs r6, %[a], #16\n\t"
  32089. #else
  32090. "lsr r6, %[a], #16\n\t"
  32091. #endif
  32092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32093. "lsrs r7, %[b], #16\n\t"
  32094. #else
  32095. "lsr r7, %[b], #16\n\t"
  32096. #endif
  32097. #ifdef WOLFSSL_KEIL
  32098. "muls r7, r6, r7\n\t"
  32099. #elif defined(__clang__)
  32100. "muls r7, r6\n\t"
  32101. #else
  32102. "mul r7, r6\n\t"
  32103. #endif
  32104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32105. "adds r5, r5, r7\n\t"
  32106. #else
  32107. "add r5, r5, r7\n\t"
  32108. #endif
  32109. #ifdef WOLFSSL_KEIL
  32110. "adcs r3, r3, %[r]\n\t"
  32111. #elif defined(__clang__)
  32112. "adcs r3, %[r]\n\t"
  32113. #else
  32114. "adc r3, %[r]\n\t"
  32115. #endif
  32116. "uxth r7, %[b]\n\t"
  32117. #ifdef WOLFSSL_KEIL
  32118. "muls r6, r7, r6\n\t"
  32119. #elif defined(__clang__)
  32120. "muls r6, r7\n\t"
  32121. #else
  32122. "mul r6, r7\n\t"
  32123. #endif
  32124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32125. "lsrs r7, r6, #16\n\t"
  32126. #else
  32127. "lsr r7, r6, #16\n\t"
  32128. #endif
  32129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32130. "lsls r6, r6, #16\n\t"
  32131. #else
  32132. "lsl r6, r6, #16\n\t"
  32133. #endif
  32134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32135. "adds r4, r4, r6\n\t"
  32136. #else
  32137. "add r4, r4, r6\n\t"
  32138. #endif
  32139. #ifdef WOLFSSL_KEIL
  32140. "adcs r5, r5, r7\n\t"
  32141. #elif defined(__clang__)
  32142. "adcs r5, r7\n\t"
  32143. #else
  32144. "adc r5, r7\n\t"
  32145. #endif
  32146. #ifdef WOLFSSL_KEIL
  32147. "adcs r3, r3, %[r]\n\t"
  32148. #elif defined(__clang__)
  32149. "adcs r3, %[r]\n\t"
  32150. #else
  32151. "adc r3, %[r]\n\t"
  32152. #endif
  32153. "# A[1] * B[3]\n\t"
  32154. "mov %[a], r9\n\t"
  32155. "mov %[b], r10\n\t"
  32156. "ldr %[a], [%[a], #4]\n\t"
  32157. "ldr %[b], [%[b], #12]\n\t"
  32158. "uxth r6, %[a]\n\t"
  32159. "uxth r7, %[b]\n\t"
  32160. #ifdef WOLFSSL_KEIL
  32161. "muls r7, r6, r7\n\t"
  32162. #elif defined(__clang__)
  32163. "muls r7, r6\n\t"
  32164. #else
  32165. "mul r7, r6\n\t"
  32166. #endif
  32167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32168. "adds r4, r4, r7\n\t"
  32169. #else
  32170. "add r4, r4, r7\n\t"
  32171. #endif
  32172. #ifdef WOLFSSL_KEIL
  32173. "adcs r5, r5, %[r]\n\t"
  32174. #elif defined(__clang__)
  32175. "adcs r5, %[r]\n\t"
  32176. #else
  32177. "adc r5, %[r]\n\t"
  32178. #endif
  32179. #ifdef WOLFSSL_KEIL
  32180. "adcs r3, r3, %[r]\n\t"
  32181. #elif defined(__clang__)
  32182. "adcs r3, %[r]\n\t"
  32183. #else
  32184. "adc r3, %[r]\n\t"
  32185. #endif
  32186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32187. "lsrs r7, %[b], #16\n\t"
  32188. #else
  32189. "lsr r7, %[b], #16\n\t"
  32190. #endif
  32191. #ifdef WOLFSSL_KEIL
  32192. "muls r6, r7, r6\n\t"
  32193. #elif defined(__clang__)
  32194. "muls r6, r7\n\t"
  32195. #else
  32196. "mul r6, r7\n\t"
  32197. #endif
  32198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32199. "lsrs r7, r6, #16\n\t"
  32200. #else
  32201. "lsr r7, r6, #16\n\t"
  32202. #endif
  32203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32204. "lsls r6, r6, #16\n\t"
  32205. #else
  32206. "lsl r6, r6, #16\n\t"
  32207. #endif
  32208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32209. "adds r4, r4, r6\n\t"
  32210. #else
  32211. "add r4, r4, r6\n\t"
  32212. #endif
  32213. #ifdef WOLFSSL_KEIL
  32214. "adcs r5, r5, r7\n\t"
  32215. #elif defined(__clang__)
  32216. "adcs r5, r7\n\t"
  32217. #else
  32218. "adc r5, r7\n\t"
  32219. #endif
  32220. #ifdef WOLFSSL_KEIL
  32221. "adcs r3, r3, %[r]\n\t"
  32222. #elif defined(__clang__)
  32223. "adcs r3, %[r]\n\t"
  32224. #else
  32225. "adc r3, %[r]\n\t"
  32226. #endif
  32227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32228. "lsrs r6, %[a], #16\n\t"
  32229. #else
  32230. "lsr r6, %[a], #16\n\t"
  32231. #endif
  32232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32233. "lsrs r7, %[b], #16\n\t"
  32234. #else
  32235. "lsr r7, %[b], #16\n\t"
  32236. #endif
  32237. #ifdef WOLFSSL_KEIL
  32238. "muls r7, r6, r7\n\t"
  32239. #elif defined(__clang__)
  32240. "muls r7, r6\n\t"
  32241. #else
  32242. "mul r7, r6\n\t"
  32243. #endif
  32244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32245. "adds r5, r5, r7\n\t"
  32246. #else
  32247. "add r5, r5, r7\n\t"
  32248. #endif
  32249. #ifdef WOLFSSL_KEIL
  32250. "adcs r3, r3, %[r]\n\t"
  32251. #elif defined(__clang__)
  32252. "adcs r3, %[r]\n\t"
  32253. #else
  32254. "adc r3, %[r]\n\t"
  32255. #endif
  32256. "uxth r7, %[b]\n\t"
  32257. #ifdef WOLFSSL_KEIL
  32258. "muls r6, r7, r6\n\t"
  32259. #elif defined(__clang__)
  32260. "muls r6, r7\n\t"
  32261. #else
  32262. "mul r6, r7\n\t"
  32263. #endif
  32264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32265. "lsrs r7, r6, #16\n\t"
  32266. #else
  32267. "lsr r7, r6, #16\n\t"
  32268. #endif
  32269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32270. "lsls r6, r6, #16\n\t"
  32271. #else
  32272. "lsl r6, r6, #16\n\t"
  32273. #endif
  32274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32275. "adds r4, r4, r6\n\t"
  32276. #else
  32277. "add r4, r4, r6\n\t"
  32278. #endif
  32279. #ifdef WOLFSSL_KEIL
  32280. "adcs r5, r5, r7\n\t"
  32281. #elif defined(__clang__)
  32282. "adcs r5, r7\n\t"
  32283. #else
  32284. "adc r5, r7\n\t"
  32285. #endif
  32286. #ifdef WOLFSSL_KEIL
  32287. "adcs r3, r3, %[r]\n\t"
  32288. #elif defined(__clang__)
  32289. "adcs r3, %[r]\n\t"
  32290. #else
  32291. "adc r3, %[r]\n\t"
  32292. #endif
  32293. "# A[0] * B[4]\n\t"
  32294. "mov %[a], r9\n\t"
  32295. "mov %[b], r10\n\t"
  32296. "ldr %[a], [%[a]]\n\t"
  32297. "ldr %[b], [%[b], #16]\n\t"
  32298. "uxth r6, %[a]\n\t"
  32299. "uxth r7, %[b]\n\t"
  32300. #ifdef WOLFSSL_KEIL
  32301. "muls r7, r6, r7\n\t"
  32302. #elif defined(__clang__)
  32303. "muls r7, r6\n\t"
  32304. #else
  32305. "mul r7, r6\n\t"
  32306. #endif
  32307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32308. "adds r4, r4, r7\n\t"
  32309. #else
  32310. "add r4, r4, r7\n\t"
  32311. #endif
  32312. #ifdef WOLFSSL_KEIL
  32313. "adcs r5, r5, %[r]\n\t"
  32314. #elif defined(__clang__)
  32315. "adcs r5, %[r]\n\t"
  32316. #else
  32317. "adc r5, %[r]\n\t"
  32318. #endif
  32319. #ifdef WOLFSSL_KEIL
  32320. "adcs r3, r3, %[r]\n\t"
  32321. #elif defined(__clang__)
  32322. "adcs r3, %[r]\n\t"
  32323. #else
  32324. "adc r3, %[r]\n\t"
  32325. #endif
  32326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32327. "lsrs r7, %[b], #16\n\t"
  32328. #else
  32329. "lsr r7, %[b], #16\n\t"
  32330. #endif
  32331. #ifdef WOLFSSL_KEIL
  32332. "muls r6, r7, r6\n\t"
  32333. #elif defined(__clang__)
  32334. "muls r6, r7\n\t"
  32335. #else
  32336. "mul r6, r7\n\t"
  32337. #endif
  32338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32339. "lsrs r7, r6, #16\n\t"
  32340. #else
  32341. "lsr r7, r6, #16\n\t"
  32342. #endif
  32343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32344. "lsls r6, r6, #16\n\t"
  32345. #else
  32346. "lsl r6, r6, #16\n\t"
  32347. #endif
  32348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32349. "adds r4, r4, r6\n\t"
  32350. #else
  32351. "add r4, r4, r6\n\t"
  32352. #endif
  32353. #ifdef WOLFSSL_KEIL
  32354. "adcs r5, r5, r7\n\t"
  32355. #elif defined(__clang__)
  32356. "adcs r5, r7\n\t"
  32357. #else
  32358. "adc r5, r7\n\t"
  32359. #endif
  32360. #ifdef WOLFSSL_KEIL
  32361. "adcs r3, r3, %[r]\n\t"
  32362. #elif defined(__clang__)
  32363. "adcs r3, %[r]\n\t"
  32364. #else
  32365. "adc r3, %[r]\n\t"
  32366. #endif
  32367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32368. "lsrs r6, %[a], #16\n\t"
  32369. #else
  32370. "lsr r6, %[a], #16\n\t"
  32371. #endif
  32372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32373. "lsrs r7, %[b], #16\n\t"
  32374. #else
  32375. "lsr r7, %[b], #16\n\t"
  32376. #endif
  32377. #ifdef WOLFSSL_KEIL
  32378. "muls r7, r6, r7\n\t"
  32379. #elif defined(__clang__)
  32380. "muls r7, r6\n\t"
  32381. #else
  32382. "mul r7, r6\n\t"
  32383. #endif
  32384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32385. "adds r5, r5, r7\n\t"
  32386. #else
  32387. "add r5, r5, r7\n\t"
  32388. #endif
  32389. #ifdef WOLFSSL_KEIL
  32390. "adcs r3, r3, %[r]\n\t"
  32391. #elif defined(__clang__)
  32392. "adcs r3, %[r]\n\t"
  32393. #else
  32394. "adc r3, %[r]\n\t"
  32395. #endif
  32396. "uxth r7, %[b]\n\t"
  32397. #ifdef WOLFSSL_KEIL
  32398. "muls r6, r7, r6\n\t"
  32399. #elif defined(__clang__)
  32400. "muls r6, r7\n\t"
  32401. #else
  32402. "mul r6, r7\n\t"
  32403. #endif
  32404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32405. "lsrs r7, r6, #16\n\t"
  32406. #else
  32407. "lsr r7, r6, #16\n\t"
  32408. #endif
  32409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32410. "lsls r6, r6, #16\n\t"
  32411. #else
  32412. "lsl r6, r6, #16\n\t"
  32413. #endif
  32414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32415. "adds r4, r4, r6\n\t"
  32416. #else
  32417. "add r4, r4, r6\n\t"
  32418. #endif
  32419. #ifdef WOLFSSL_KEIL
  32420. "adcs r5, r5, r7\n\t"
  32421. #elif defined(__clang__)
  32422. "adcs r5, r7\n\t"
  32423. #else
  32424. "adc r5, r7\n\t"
  32425. #endif
  32426. #ifdef WOLFSSL_KEIL
  32427. "adcs r3, r3, %[r]\n\t"
  32428. #elif defined(__clang__)
  32429. "adcs r3, %[r]\n\t"
  32430. #else
  32431. "adc r3, %[r]\n\t"
  32432. #endif
  32433. "str r4, [sp, #16]\n\t"
  32434. "# A[0] * B[5]\n\t"
  32435. "movs r4, #0\n\t"
  32436. "mov %[a], r9\n\t"
  32437. "mov %[b], r10\n\t"
  32438. "ldr %[a], [%[a]]\n\t"
  32439. "ldr %[b], [%[b], #20]\n\t"
  32440. "uxth r6, %[a]\n\t"
  32441. "uxth r7, %[b]\n\t"
  32442. #ifdef WOLFSSL_KEIL
  32443. "muls r7, r6, r7\n\t"
  32444. #elif defined(__clang__)
  32445. "muls r7, r6\n\t"
  32446. #else
  32447. "mul r7, r6\n\t"
  32448. #endif
  32449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32450. "adds r5, r5, r7\n\t"
  32451. #else
  32452. "add r5, r5, r7\n\t"
  32453. #endif
  32454. #ifdef WOLFSSL_KEIL
  32455. "adcs r3, r3, %[r]\n\t"
  32456. #elif defined(__clang__)
  32457. "adcs r3, %[r]\n\t"
  32458. #else
  32459. "adc r3, %[r]\n\t"
  32460. #endif
  32461. #ifdef WOLFSSL_KEIL
  32462. "adcs r4, r4, %[r]\n\t"
  32463. #elif defined(__clang__)
  32464. "adcs r4, %[r]\n\t"
  32465. #else
  32466. "adc r4, %[r]\n\t"
  32467. #endif
  32468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32469. "lsrs r7, %[b], #16\n\t"
  32470. #else
  32471. "lsr r7, %[b], #16\n\t"
  32472. #endif
  32473. #ifdef WOLFSSL_KEIL
  32474. "muls r6, r7, r6\n\t"
  32475. #elif defined(__clang__)
  32476. "muls r6, r7\n\t"
  32477. #else
  32478. "mul r6, r7\n\t"
  32479. #endif
  32480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32481. "lsrs r7, r6, #16\n\t"
  32482. #else
  32483. "lsr r7, r6, #16\n\t"
  32484. #endif
  32485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32486. "lsls r6, r6, #16\n\t"
  32487. #else
  32488. "lsl r6, r6, #16\n\t"
  32489. #endif
  32490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32491. "adds r5, r5, r6\n\t"
  32492. #else
  32493. "add r5, r5, r6\n\t"
  32494. #endif
  32495. #ifdef WOLFSSL_KEIL
  32496. "adcs r3, r3, r7\n\t"
  32497. #elif defined(__clang__)
  32498. "adcs r3, r7\n\t"
  32499. #else
  32500. "adc r3, r7\n\t"
  32501. #endif
  32502. #ifdef WOLFSSL_KEIL
  32503. "adcs r4, r4, %[r]\n\t"
  32504. #elif defined(__clang__)
  32505. "adcs r4, %[r]\n\t"
  32506. #else
  32507. "adc r4, %[r]\n\t"
  32508. #endif
  32509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32510. "lsrs r6, %[a], #16\n\t"
  32511. #else
  32512. "lsr r6, %[a], #16\n\t"
  32513. #endif
  32514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32515. "lsrs r7, %[b], #16\n\t"
  32516. #else
  32517. "lsr r7, %[b], #16\n\t"
  32518. #endif
  32519. #ifdef WOLFSSL_KEIL
  32520. "muls r7, r6, r7\n\t"
  32521. #elif defined(__clang__)
  32522. "muls r7, r6\n\t"
  32523. #else
  32524. "mul r7, r6\n\t"
  32525. #endif
  32526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32527. "adds r3, r3, r7\n\t"
  32528. #else
  32529. "add r3, r3, r7\n\t"
  32530. #endif
  32531. #ifdef WOLFSSL_KEIL
  32532. "adcs r4, r4, %[r]\n\t"
  32533. #elif defined(__clang__)
  32534. "adcs r4, %[r]\n\t"
  32535. #else
  32536. "adc r4, %[r]\n\t"
  32537. #endif
  32538. "uxth r7, %[b]\n\t"
  32539. #ifdef WOLFSSL_KEIL
  32540. "muls r6, r7, r6\n\t"
  32541. #elif defined(__clang__)
  32542. "muls r6, r7\n\t"
  32543. #else
  32544. "mul r6, r7\n\t"
  32545. #endif
  32546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32547. "lsrs r7, r6, #16\n\t"
  32548. #else
  32549. "lsr r7, r6, #16\n\t"
  32550. #endif
  32551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32552. "lsls r6, r6, #16\n\t"
  32553. #else
  32554. "lsl r6, r6, #16\n\t"
  32555. #endif
  32556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32557. "adds r5, r5, r6\n\t"
  32558. #else
  32559. "add r5, r5, r6\n\t"
  32560. #endif
  32561. #ifdef WOLFSSL_KEIL
  32562. "adcs r3, r3, r7\n\t"
  32563. #elif defined(__clang__)
  32564. "adcs r3, r7\n\t"
  32565. #else
  32566. "adc r3, r7\n\t"
  32567. #endif
  32568. #ifdef WOLFSSL_KEIL
  32569. "adcs r4, r4, %[r]\n\t"
  32570. #elif defined(__clang__)
  32571. "adcs r4, %[r]\n\t"
  32572. #else
  32573. "adc r4, %[r]\n\t"
  32574. #endif
  32575. "# A[1] * B[4]\n\t"
  32576. "mov %[a], r9\n\t"
  32577. "mov %[b], r10\n\t"
  32578. "ldr %[a], [%[a], #4]\n\t"
  32579. "ldr %[b], [%[b], #16]\n\t"
  32580. "uxth r6, %[a]\n\t"
  32581. "uxth r7, %[b]\n\t"
  32582. #ifdef WOLFSSL_KEIL
  32583. "muls r7, r6, r7\n\t"
  32584. #elif defined(__clang__)
  32585. "muls r7, r6\n\t"
  32586. #else
  32587. "mul r7, r6\n\t"
  32588. #endif
  32589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32590. "adds r5, r5, r7\n\t"
  32591. #else
  32592. "add r5, r5, r7\n\t"
  32593. #endif
  32594. #ifdef WOLFSSL_KEIL
  32595. "adcs r3, r3, %[r]\n\t"
  32596. #elif defined(__clang__)
  32597. "adcs r3, %[r]\n\t"
  32598. #else
  32599. "adc r3, %[r]\n\t"
  32600. #endif
  32601. #ifdef WOLFSSL_KEIL
  32602. "adcs r4, r4, %[r]\n\t"
  32603. #elif defined(__clang__)
  32604. "adcs r4, %[r]\n\t"
  32605. #else
  32606. "adc r4, %[r]\n\t"
  32607. #endif
  32608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32609. "lsrs r7, %[b], #16\n\t"
  32610. #else
  32611. "lsr r7, %[b], #16\n\t"
  32612. #endif
  32613. #ifdef WOLFSSL_KEIL
  32614. "muls r6, r7, r6\n\t"
  32615. #elif defined(__clang__)
  32616. "muls r6, r7\n\t"
  32617. #else
  32618. "mul r6, r7\n\t"
  32619. #endif
  32620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32621. "lsrs r7, r6, #16\n\t"
  32622. #else
  32623. "lsr r7, r6, #16\n\t"
  32624. #endif
  32625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32626. "lsls r6, r6, #16\n\t"
  32627. #else
  32628. "lsl r6, r6, #16\n\t"
  32629. #endif
  32630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32631. "adds r5, r5, r6\n\t"
  32632. #else
  32633. "add r5, r5, r6\n\t"
  32634. #endif
  32635. #ifdef WOLFSSL_KEIL
  32636. "adcs r3, r3, r7\n\t"
  32637. #elif defined(__clang__)
  32638. "adcs r3, r7\n\t"
  32639. #else
  32640. "adc r3, r7\n\t"
  32641. #endif
  32642. #ifdef WOLFSSL_KEIL
  32643. "adcs r4, r4, %[r]\n\t"
  32644. #elif defined(__clang__)
  32645. "adcs r4, %[r]\n\t"
  32646. #else
  32647. "adc r4, %[r]\n\t"
  32648. #endif
  32649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32650. "lsrs r6, %[a], #16\n\t"
  32651. #else
  32652. "lsr r6, %[a], #16\n\t"
  32653. #endif
  32654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32655. "lsrs r7, %[b], #16\n\t"
  32656. #else
  32657. "lsr r7, %[b], #16\n\t"
  32658. #endif
  32659. #ifdef WOLFSSL_KEIL
  32660. "muls r7, r6, r7\n\t"
  32661. #elif defined(__clang__)
  32662. "muls r7, r6\n\t"
  32663. #else
  32664. "mul r7, r6\n\t"
  32665. #endif
  32666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32667. "adds r3, r3, r7\n\t"
  32668. #else
  32669. "add r3, r3, r7\n\t"
  32670. #endif
  32671. #ifdef WOLFSSL_KEIL
  32672. "adcs r4, r4, %[r]\n\t"
  32673. #elif defined(__clang__)
  32674. "adcs r4, %[r]\n\t"
  32675. #else
  32676. "adc r4, %[r]\n\t"
  32677. #endif
  32678. "uxth r7, %[b]\n\t"
  32679. #ifdef WOLFSSL_KEIL
  32680. "muls r6, r7, r6\n\t"
  32681. #elif defined(__clang__)
  32682. "muls r6, r7\n\t"
  32683. #else
  32684. "mul r6, r7\n\t"
  32685. #endif
  32686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32687. "lsrs r7, r6, #16\n\t"
  32688. #else
  32689. "lsr r7, r6, #16\n\t"
  32690. #endif
  32691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32692. "lsls r6, r6, #16\n\t"
  32693. #else
  32694. "lsl r6, r6, #16\n\t"
  32695. #endif
  32696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32697. "adds r5, r5, r6\n\t"
  32698. #else
  32699. "add r5, r5, r6\n\t"
  32700. #endif
  32701. #ifdef WOLFSSL_KEIL
  32702. "adcs r3, r3, r7\n\t"
  32703. #elif defined(__clang__)
  32704. "adcs r3, r7\n\t"
  32705. #else
  32706. "adc r3, r7\n\t"
  32707. #endif
  32708. #ifdef WOLFSSL_KEIL
  32709. "adcs r4, r4, %[r]\n\t"
  32710. #elif defined(__clang__)
  32711. "adcs r4, %[r]\n\t"
  32712. #else
  32713. "adc r4, %[r]\n\t"
  32714. #endif
  32715. "# A[2] * B[3]\n\t"
  32716. "mov %[a], r9\n\t"
  32717. "mov %[b], r10\n\t"
  32718. "ldr %[a], [%[a], #8]\n\t"
  32719. "ldr %[b], [%[b], #12]\n\t"
  32720. "uxth r6, %[a]\n\t"
  32721. "uxth r7, %[b]\n\t"
  32722. #ifdef WOLFSSL_KEIL
  32723. "muls r7, r6, r7\n\t"
  32724. #elif defined(__clang__)
  32725. "muls r7, r6\n\t"
  32726. #else
  32727. "mul r7, r6\n\t"
  32728. #endif
  32729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32730. "adds r5, r5, r7\n\t"
  32731. #else
  32732. "add r5, r5, r7\n\t"
  32733. #endif
  32734. #ifdef WOLFSSL_KEIL
  32735. "adcs r3, r3, %[r]\n\t"
  32736. #elif defined(__clang__)
  32737. "adcs r3, %[r]\n\t"
  32738. #else
  32739. "adc r3, %[r]\n\t"
  32740. #endif
  32741. #ifdef WOLFSSL_KEIL
  32742. "adcs r4, r4, %[r]\n\t"
  32743. #elif defined(__clang__)
  32744. "adcs r4, %[r]\n\t"
  32745. #else
  32746. "adc r4, %[r]\n\t"
  32747. #endif
  32748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32749. "lsrs r7, %[b], #16\n\t"
  32750. #else
  32751. "lsr r7, %[b], #16\n\t"
  32752. #endif
  32753. #ifdef WOLFSSL_KEIL
  32754. "muls r6, r7, r6\n\t"
  32755. #elif defined(__clang__)
  32756. "muls r6, r7\n\t"
  32757. #else
  32758. "mul r6, r7\n\t"
  32759. #endif
  32760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32761. "lsrs r7, r6, #16\n\t"
  32762. #else
  32763. "lsr r7, r6, #16\n\t"
  32764. #endif
  32765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32766. "lsls r6, r6, #16\n\t"
  32767. #else
  32768. "lsl r6, r6, #16\n\t"
  32769. #endif
  32770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32771. "adds r5, r5, r6\n\t"
  32772. #else
  32773. "add r5, r5, r6\n\t"
  32774. #endif
  32775. #ifdef WOLFSSL_KEIL
  32776. "adcs r3, r3, r7\n\t"
  32777. #elif defined(__clang__)
  32778. "adcs r3, r7\n\t"
  32779. #else
  32780. "adc r3, r7\n\t"
  32781. #endif
  32782. #ifdef WOLFSSL_KEIL
  32783. "adcs r4, r4, %[r]\n\t"
  32784. #elif defined(__clang__)
  32785. "adcs r4, %[r]\n\t"
  32786. #else
  32787. "adc r4, %[r]\n\t"
  32788. #endif
  32789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32790. "lsrs r6, %[a], #16\n\t"
  32791. #else
  32792. "lsr r6, %[a], #16\n\t"
  32793. #endif
  32794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32795. "lsrs r7, %[b], #16\n\t"
  32796. #else
  32797. "lsr r7, %[b], #16\n\t"
  32798. #endif
  32799. #ifdef WOLFSSL_KEIL
  32800. "muls r7, r6, r7\n\t"
  32801. #elif defined(__clang__)
  32802. "muls r7, r6\n\t"
  32803. #else
  32804. "mul r7, r6\n\t"
  32805. #endif
  32806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32807. "adds r3, r3, r7\n\t"
  32808. #else
  32809. "add r3, r3, r7\n\t"
  32810. #endif
  32811. #ifdef WOLFSSL_KEIL
  32812. "adcs r4, r4, %[r]\n\t"
  32813. #elif defined(__clang__)
  32814. "adcs r4, %[r]\n\t"
  32815. #else
  32816. "adc r4, %[r]\n\t"
  32817. #endif
  32818. "uxth r7, %[b]\n\t"
  32819. #ifdef WOLFSSL_KEIL
  32820. "muls r6, r7, r6\n\t"
  32821. #elif defined(__clang__)
  32822. "muls r6, r7\n\t"
  32823. #else
  32824. "mul r6, r7\n\t"
  32825. #endif
  32826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32827. "lsrs r7, r6, #16\n\t"
  32828. #else
  32829. "lsr r7, r6, #16\n\t"
  32830. #endif
  32831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32832. "lsls r6, r6, #16\n\t"
  32833. #else
  32834. "lsl r6, r6, #16\n\t"
  32835. #endif
  32836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32837. "adds r5, r5, r6\n\t"
  32838. #else
  32839. "add r5, r5, r6\n\t"
  32840. #endif
  32841. #ifdef WOLFSSL_KEIL
  32842. "adcs r3, r3, r7\n\t"
  32843. #elif defined(__clang__)
  32844. "adcs r3, r7\n\t"
  32845. #else
  32846. "adc r3, r7\n\t"
  32847. #endif
  32848. #ifdef WOLFSSL_KEIL
  32849. "adcs r4, r4, %[r]\n\t"
  32850. #elif defined(__clang__)
  32851. "adcs r4, %[r]\n\t"
  32852. #else
  32853. "adc r4, %[r]\n\t"
  32854. #endif
  32855. "# A[3] * B[2]\n\t"
  32856. "mov %[a], r9\n\t"
  32857. "mov %[b], r10\n\t"
  32858. "ldr %[a], [%[a], #12]\n\t"
  32859. "ldr %[b], [%[b], #8]\n\t"
  32860. "uxth r6, %[a]\n\t"
  32861. "uxth r7, %[b]\n\t"
  32862. #ifdef WOLFSSL_KEIL
  32863. "muls r7, r6, r7\n\t"
  32864. #elif defined(__clang__)
  32865. "muls r7, r6\n\t"
  32866. #else
  32867. "mul r7, r6\n\t"
  32868. #endif
  32869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32870. "adds r5, r5, r7\n\t"
  32871. #else
  32872. "add r5, r5, r7\n\t"
  32873. #endif
  32874. #ifdef WOLFSSL_KEIL
  32875. "adcs r3, r3, %[r]\n\t"
  32876. #elif defined(__clang__)
  32877. "adcs r3, %[r]\n\t"
  32878. #else
  32879. "adc r3, %[r]\n\t"
  32880. #endif
  32881. #ifdef WOLFSSL_KEIL
  32882. "adcs r4, r4, %[r]\n\t"
  32883. #elif defined(__clang__)
  32884. "adcs r4, %[r]\n\t"
  32885. #else
  32886. "adc r4, %[r]\n\t"
  32887. #endif
  32888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32889. "lsrs r7, %[b], #16\n\t"
  32890. #else
  32891. "lsr r7, %[b], #16\n\t"
  32892. #endif
  32893. #ifdef WOLFSSL_KEIL
  32894. "muls r6, r7, r6\n\t"
  32895. #elif defined(__clang__)
  32896. "muls r6, r7\n\t"
  32897. #else
  32898. "mul r6, r7\n\t"
  32899. #endif
  32900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32901. "lsrs r7, r6, #16\n\t"
  32902. #else
  32903. "lsr r7, r6, #16\n\t"
  32904. #endif
  32905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32906. "lsls r6, r6, #16\n\t"
  32907. #else
  32908. "lsl r6, r6, #16\n\t"
  32909. #endif
  32910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32911. "adds r5, r5, r6\n\t"
  32912. #else
  32913. "add r5, r5, r6\n\t"
  32914. #endif
  32915. #ifdef WOLFSSL_KEIL
  32916. "adcs r3, r3, r7\n\t"
  32917. #elif defined(__clang__)
  32918. "adcs r3, r7\n\t"
  32919. #else
  32920. "adc r3, r7\n\t"
  32921. #endif
  32922. #ifdef WOLFSSL_KEIL
  32923. "adcs r4, r4, %[r]\n\t"
  32924. #elif defined(__clang__)
  32925. "adcs r4, %[r]\n\t"
  32926. #else
  32927. "adc r4, %[r]\n\t"
  32928. #endif
  32929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32930. "lsrs r6, %[a], #16\n\t"
  32931. #else
  32932. "lsr r6, %[a], #16\n\t"
  32933. #endif
  32934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32935. "lsrs r7, %[b], #16\n\t"
  32936. #else
  32937. "lsr r7, %[b], #16\n\t"
  32938. #endif
  32939. #ifdef WOLFSSL_KEIL
  32940. "muls r7, r6, r7\n\t"
  32941. #elif defined(__clang__)
  32942. "muls r7, r6\n\t"
  32943. #else
  32944. "mul r7, r6\n\t"
  32945. #endif
  32946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32947. "adds r3, r3, r7\n\t"
  32948. #else
  32949. "add r3, r3, r7\n\t"
  32950. #endif
  32951. #ifdef WOLFSSL_KEIL
  32952. "adcs r4, r4, %[r]\n\t"
  32953. #elif defined(__clang__)
  32954. "adcs r4, %[r]\n\t"
  32955. #else
  32956. "adc r4, %[r]\n\t"
  32957. #endif
  32958. "uxth r7, %[b]\n\t"
  32959. #ifdef WOLFSSL_KEIL
  32960. "muls r6, r7, r6\n\t"
  32961. #elif defined(__clang__)
  32962. "muls r6, r7\n\t"
  32963. #else
  32964. "mul r6, r7\n\t"
  32965. #endif
  32966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32967. "lsrs r7, r6, #16\n\t"
  32968. #else
  32969. "lsr r7, r6, #16\n\t"
  32970. #endif
  32971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32972. "lsls r6, r6, #16\n\t"
  32973. #else
  32974. "lsl r6, r6, #16\n\t"
  32975. #endif
  32976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  32977. "adds r5, r5, r6\n\t"
  32978. #else
  32979. "add r5, r5, r6\n\t"
  32980. #endif
  32981. #ifdef WOLFSSL_KEIL
  32982. "adcs r3, r3, r7\n\t"
  32983. #elif defined(__clang__)
  32984. "adcs r3, r7\n\t"
  32985. #else
  32986. "adc r3, r7\n\t"
  32987. #endif
  32988. #ifdef WOLFSSL_KEIL
  32989. "adcs r4, r4, %[r]\n\t"
  32990. #elif defined(__clang__)
  32991. "adcs r4, %[r]\n\t"
  32992. #else
  32993. "adc r4, %[r]\n\t"
  32994. #endif
  32995. "# A[4] * B[1]\n\t"
  32996. "mov %[a], r9\n\t"
  32997. "mov %[b], r10\n\t"
  32998. "ldr %[a], [%[a], #16]\n\t"
  32999. "ldr %[b], [%[b], #4]\n\t"
  33000. "uxth r6, %[a]\n\t"
  33001. "uxth r7, %[b]\n\t"
  33002. #ifdef WOLFSSL_KEIL
  33003. "muls r7, r6, r7\n\t"
  33004. #elif defined(__clang__)
  33005. "muls r7, r6\n\t"
  33006. #else
  33007. "mul r7, r6\n\t"
  33008. #endif
  33009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33010. "adds r5, r5, r7\n\t"
  33011. #else
  33012. "add r5, r5, r7\n\t"
  33013. #endif
  33014. #ifdef WOLFSSL_KEIL
  33015. "adcs r3, r3, %[r]\n\t"
  33016. #elif defined(__clang__)
  33017. "adcs r3, %[r]\n\t"
  33018. #else
  33019. "adc r3, %[r]\n\t"
  33020. #endif
  33021. #ifdef WOLFSSL_KEIL
  33022. "adcs r4, r4, %[r]\n\t"
  33023. #elif defined(__clang__)
  33024. "adcs r4, %[r]\n\t"
  33025. #else
  33026. "adc r4, %[r]\n\t"
  33027. #endif
  33028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33029. "lsrs r7, %[b], #16\n\t"
  33030. #else
  33031. "lsr r7, %[b], #16\n\t"
  33032. #endif
  33033. #ifdef WOLFSSL_KEIL
  33034. "muls r6, r7, r6\n\t"
  33035. #elif defined(__clang__)
  33036. "muls r6, r7\n\t"
  33037. #else
  33038. "mul r6, r7\n\t"
  33039. #endif
  33040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33041. "lsrs r7, r6, #16\n\t"
  33042. #else
  33043. "lsr r7, r6, #16\n\t"
  33044. #endif
  33045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33046. "lsls r6, r6, #16\n\t"
  33047. #else
  33048. "lsl r6, r6, #16\n\t"
  33049. #endif
  33050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33051. "adds r5, r5, r6\n\t"
  33052. #else
  33053. "add r5, r5, r6\n\t"
  33054. #endif
  33055. #ifdef WOLFSSL_KEIL
  33056. "adcs r3, r3, r7\n\t"
  33057. #elif defined(__clang__)
  33058. "adcs r3, r7\n\t"
  33059. #else
  33060. "adc r3, r7\n\t"
  33061. #endif
  33062. #ifdef WOLFSSL_KEIL
  33063. "adcs r4, r4, %[r]\n\t"
  33064. #elif defined(__clang__)
  33065. "adcs r4, %[r]\n\t"
  33066. #else
  33067. "adc r4, %[r]\n\t"
  33068. #endif
  33069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33070. "lsrs r6, %[a], #16\n\t"
  33071. #else
  33072. "lsr r6, %[a], #16\n\t"
  33073. #endif
  33074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33075. "lsrs r7, %[b], #16\n\t"
  33076. #else
  33077. "lsr r7, %[b], #16\n\t"
  33078. #endif
  33079. #ifdef WOLFSSL_KEIL
  33080. "muls r7, r6, r7\n\t"
  33081. #elif defined(__clang__)
  33082. "muls r7, r6\n\t"
  33083. #else
  33084. "mul r7, r6\n\t"
  33085. #endif
  33086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33087. "adds r3, r3, r7\n\t"
  33088. #else
  33089. "add r3, r3, r7\n\t"
  33090. #endif
  33091. #ifdef WOLFSSL_KEIL
  33092. "adcs r4, r4, %[r]\n\t"
  33093. #elif defined(__clang__)
  33094. "adcs r4, %[r]\n\t"
  33095. #else
  33096. "adc r4, %[r]\n\t"
  33097. #endif
  33098. "uxth r7, %[b]\n\t"
  33099. #ifdef WOLFSSL_KEIL
  33100. "muls r6, r7, r6\n\t"
  33101. #elif defined(__clang__)
  33102. "muls r6, r7\n\t"
  33103. #else
  33104. "mul r6, r7\n\t"
  33105. #endif
  33106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33107. "lsrs r7, r6, #16\n\t"
  33108. #else
  33109. "lsr r7, r6, #16\n\t"
  33110. #endif
  33111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33112. "lsls r6, r6, #16\n\t"
  33113. #else
  33114. "lsl r6, r6, #16\n\t"
  33115. #endif
  33116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33117. "adds r5, r5, r6\n\t"
  33118. #else
  33119. "add r5, r5, r6\n\t"
  33120. #endif
  33121. #ifdef WOLFSSL_KEIL
  33122. "adcs r3, r3, r7\n\t"
  33123. #elif defined(__clang__)
  33124. "adcs r3, r7\n\t"
  33125. #else
  33126. "adc r3, r7\n\t"
  33127. #endif
  33128. #ifdef WOLFSSL_KEIL
  33129. "adcs r4, r4, %[r]\n\t"
  33130. #elif defined(__clang__)
  33131. "adcs r4, %[r]\n\t"
  33132. #else
  33133. "adc r4, %[r]\n\t"
  33134. #endif
  33135. "# A[5] * B[0]\n\t"
  33136. "mov %[a], r9\n\t"
  33137. "mov %[b], r10\n\t"
  33138. "ldr %[a], [%[a], #20]\n\t"
  33139. "ldr %[b], [%[b]]\n\t"
  33140. "uxth r6, %[a]\n\t"
  33141. "uxth r7, %[b]\n\t"
  33142. #ifdef WOLFSSL_KEIL
  33143. "muls r7, r6, r7\n\t"
  33144. #elif defined(__clang__)
  33145. "muls r7, r6\n\t"
  33146. #else
  33147. "mul r7, r6\n\t"
  33148. #endif
  33149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33150. "adds r5, r5, r7\n\t"
  33151. #else
  33152. "add r5, r5, r7\n\t"
  33153. #endif
  33154. #ifdef WOLFSSL_KEIL
  33155. "adcs r3, r3, %[r]\n\t"
  33156. #elif defined(__clang__)
  33157. "adcs r3, %[r]\n\t"
  33158. #else
  33159. "adc r3, %[r]\n\t"
  33160. #endif
  33161. #ifdef WOLFSSL_KEIL
  33162. "adcs r4, r4, %[r]\n\t"
  33163. #elif defined(__clang__)
  33164. "adcs r4, %[r]\n\t"
  33165. #else
  33166. "adc r4, %[r]\n\t"
  33167. #endif
  33168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33169. "lsrs r7, %[b], #16\n\t"
  33170. #else
  33171. "lsr r7, %[b], #16\n\t"
  33172. #endif
  33173. #ifdef WOLFSSL_KEIL
  33174. "muls r6, r7, r6\n\t"
  33175. #elif defined(__clang__)
  33176. "muls r6, r7\n\t"
  33177. #else
  33178. "mul r6, r7\n\t"
  33179. #endif
  33180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33181. "lsrs r7, r6, #16\n\t"
  33182. #else
  33183. "lsr r7, r6, #16\n\t"
  33184. #endif
  33185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33186. "lsls r6, r6, #16\n\t"
  33187. #else
  33188. "lsl r6, r6, #16\n\t"
  33189. #endif
  33190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33191. "adds r5, r5, r6\n\t"
  33192. #else
  33193. "add r5, r5, r6\n\t"
  33194. #endif
  33195. #ifdef WOLFSSL_KEIL
  33196. "adcs r3, r3, r7\n\t"
  33197. #elif defined(__clang__)
  33198. "adcs r3, r7\n\t"
  33199. #else
  33200. "adc r3, r7\n\t"
  33201. #endif
  33202. #ifdef WOLFSSL_KEIL
  33203. "adcs r4, r4, %[r]\n\t"
  33204. #elif defined(__clang__)
  33205. "adcs r4, %[r]\n\t"
  33206. #else
  33207. "adc r4, %[r]\n\t"
  33208. #endif
  33209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33210. "lsrs r6, %[a], #16\n\t"
  33211. #else
  33212. "lsr r6, %[a], #16\n\t"
  33213. #endif
  33214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33215. "lsrs r7, %[b], #16\n\t"
  33216. #else
  33217. "lsr r7, %[b], #16\n\t"
  33218. #endif
  33219. #ifdef WOLFSSL_KEIL
  33220. "muls r7, r6, r7\n\t"
  33221. #elif defined(__clang__)
  33222. "muls r7, r6\n\t"
  33223. #else
  33224. "mul r7, r6\n\t"
  33225. #endif
  33226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33227. "adds r3, r3, r7\n\t"
  33228. #else
  33229. "add r3, r3, r7\n\t"
  33230. #endif
  33231. #ifdef WOLFSSL_KEIL
  33232. "adcs r4, r4, %[r]\n\t"
  33233. #elif defined(__clang__)
  33234. "adcs r4, %[r]\n\t"
  33235. #else
  33236. "adc r4, %[r]\n\t"
  33237. #endif
  33238. "uxth r7, %[b]\n\t"
  33239. #ifdef WOLFSSL_KEIL
  33240. "muls r6, r7, r6\n\t"
  33241. #elif defined(__clang__)
  33242. "muls r6, r7\n\t"
  33243. #else
  33244. "mul r6, r7\n\t"
  33245. #endif
  33246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33247. "lsrs r7, r6, #16\n\t"
  33248. #else
  33249. "lsr r7, r6, #16\n\t"
  33250. #endif
  33251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33252. "lsls r6, r6, #16\n\t"
  33253. #else
  33254. "lsl r6, r6, #16\n\t"
  33255. #endif
  33256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33257. "adds r5, r5, r6\n\t"
  33258. #else
  33259. "add r5, r5, r6\n\t"
  33260. #endif
  33261. #ifdef WOLFSSL_KEIL
  33262. "adcs r3, r3, r7\n\t"
  33263. #elif defined(__clang__)
  33264. "adcs r3, r7\n\t"
  33265. #else
  33266. "adc r3, r7\n\t"
  33267. #endif
  33268. #ifdef WOLFSSL_KEIL
  33269. "adcs r4, r4, %[r]\n\t"
  33270. #elif defined(__clang__)
  33271. "adcs r4, %[r]\n\t"
  33272. #else
  33273. "adc r4, %[r]\n\t"
  33274. #endif
  33275. "str r5, [sp, #20]\n\t"
  33276. "# A[6] * B[0]\n\t"
  33277. "movs r5, #0\n\t"
  33278. "mov %[a], r9\n\t"
  33279. "mov %[b], r10\n\t"
  33280. "ldr %[a], [%[a], #24]\n\t"
  33281. "ldr %[b], [%[b]]\n\t"
  33282. "uxth r6, %[a]\n\t"
  33283. "uxth r7, %[b]\n\t"
  33284. #ifdef WOLFSSL_KEIL
  33285. "muls r7, r6, r7\n\t"
  33286. #elif defined(__clang__)
  33287. "muls r7, r6\n\t"
  33288. #else
  33289. "mul r7, r6\n\t"
  33290. #endif
  33291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33292. "adds r3, r3, r7\n\t"
  33293. #else
  33294. "add r3, r3, r7\n\t"
  33295. #endif
  33296. #ifdef WOLFSSL_KEIL
  33297. "adcs r4, r4, %[r]\n\t"
  33298. #elif defined(__clang__)
  33299. "adcs r4, %[r]\n\t"
  33300. #else
  33301. "adc r4, %[r]\n\t"
  33302. #endif
  33303. #ifdef WOLFSSL_KEIL
  33304. "adcs r5, r5, %[r]\n\t"
  33305. #elif defined(__clang__)
  33306. "adcs r5, %[r]\n\t"
  33307. #else
  33308. "adc r5, %[r]\n\t"
  33309. #endif
  33310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33311. "lsrs r7, %[b], #16\n\t"
  33312. #else
  33313. "lsr r7, %[b], #16\n\t"
  33314. #endif
  33315. #ifdef WOLFSSL_KEIL
  33316. "muls r6, r7, r6\n\t"
  33317. #elif defined(__clang__)
  33318. "muls r6, r7\n\t"
  33319. #else
  33320. "mul r6, r7\n\t"
  33321. #endif
  33322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33323. "lsrs r7, r6, #16\n\t"
  33324. #else
  33325. "lsr r7, r6, #16\n\t"
  33326. #endif
  33327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33328. "lsls r6, r6, #16\n\t"
  33329. #else
  33330. "lsl r6, r6, #16\n\t"
  33331. #endif
  33332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33333. "adds r3, r3, r6\n\t"
  33334. #else
  33335. "add r3, r3, r6\n\t"
  33336. #endif
  33337. #ifdef WOLFSSL_KEIL
  33338. "adcs r4, r4, r7\n\t"
  33339. #elif defined(__clang__)
  33340. "adcs r4, r7\n\t"
  33341. #else
  33342. "adc r4, r7\n\t"
  33343. #endif
  33344. #ifdef WOLFSSL_KEIL
  33345. "adcs r5, r5, %[r]\n\t"
  33346. #elif defined(__clang__)
  33347. "adcs r5, %[r]\n\t"
  33348. #else
  33349. "adc r5, %[r]\n\t"
  33350. #endif
  33351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33352. "lsrs r6, %[a], #16\n\t"
  33353. #else
  33354. "lsr r6, %[a], #16\n\t"
  33355. #endif
  33356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33357. "lsrs r7, %[b], #16\n\t"
  33358. #else
  33359. "lsr r7, %[b], #16\n\t"
  33360. #endif
  33361. #ifdef WOLFSSL_KEIL
  33362. "muls r7, r6, r7\n\t"
  33363. #elif defined(__clang__)
  33364. "muls r7, r6\n\t"
  33365. #else
  33366. "mul r7, r6\n\t"
  33367. #endif
  33368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33369. "adds r4, r4, r7\n\t"
  33370. #else
  33371. "add r4, r4, r7\n\t"
  33372. #endif
  33373. #ifdef WOLFSSL_KEIL
  33374. "adcs r5, r5, %[r]\n\t"
  33375. #elif defined(__clang__)
  33376. "adcs r5, %[r]\n\t"
  33377. #else
  33378. "adc r5, %[r]\n\t"
  33379. #endif
  33380. "uxth r7, %[b]\n\t"
  33381. #ifdef WOLFSSL_KEIL
  33382. "muls r6, r7, r6\n\t"
  33383. #elif defined(__clang__)
  33384. "muls r6, r7\n\t"
  33385. #else
  33386. "mul r6, r7\n\t"
  33387. #endif
  33388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33389. "lsrs r7, r6, #16\n\t"
  33390. #else
  33391. "lsr r7, r6, #16\n\t"
  33392. #endif
  33393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33394. "lsls r6, r6, #16\n\t"
  33395. #else
  33396. "lsl r6, r6, #16\n\t"
  33397. #endif
  33398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33399. "adds r3, r3, r6\n\t"
  33400. #else
  33401. "add r3, r3, r6\n\t"
  33402. #endif
  33403. #ifdef WOLFSSL_KEIL
  33404. "adcs r4, r4, r7\n\t"
  33405. #elif defined(__clang__)
  33406. "adcs r4, r7\n\t"
  33407. #else
  33408. "adc r4, r7\n\t"
  33409. #endif
  33410. #ifdef WOLFSSL_KEIL
  33411. "adcs r5, r5, %[r]\n\t"
  33412. #elif defined(__clang__)
  33413. "adcs r5, %[r]\n\t"
  33414. #else
  33415. "adc r5, %[r]\n\t"
  33416. #endif
  33417. "# A[5] * B[1]\n\t"
  33418. "mov %[a], r9\n\t"
  33419. "mov %[b], r10\n\t"
  33420. "ldr %[a], [%[a], #20]\n\t"
  33421. "ldr %[b], [%[b], #4]\n\t"
  33422. "uxth r6, %[a]\n\t"
  33423. "uxth r7, %[b]\n\t"
  33424. #ifdef WOLFSSL_KEIL
  33425. "muls r7, r6, r7\n\t"
  33426. #elif defined(__clang__)
  33427. "muls r7, r6\n\t"
  33428. #else
  33429. "mul r7, r6\n\t"
  33430. #endif
  33431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33432. "adds r3, r3, r7\n\t"
  33433. #else
  33434. "add r3, r3, r7\n\t"
  33435. #endif
  33436. #ifdef WOLFSSL_KEIL
  33437. "adcs r4, r4, %[r]\n\t"
  33438. #elif defined(__clang__)
  33439. "adcs r4, %[r]\n\t"
  33440. #else
  33441. "adc r4, %[r]\n\t"
  33442. #endif
  33443. #ifdef WOLFSSL_KEIL
  33444. "adcs r5, r5, %[r]\n\t"
  33445. #elif defined(__clang__)
  33446. "adcs r5, %[r]\n\t"
  33447. #else
  33448. "adc r5, %[r]\n\t"
  33449. #endif
  33450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33451. "lsrs r7, %[b], #16\n\t"
  33452. #else
  33453. "lsr r7, %[b], #16\n\t"
  33454. #endif
  33455. #ifdef WOLFSSL_KEIL
  33456. "muls r6, r7, r6\n\t"
  33457. #elif defined(__clang__)
  33458. "muls r6, r7\n\t"
  33459. #else
  33460. "mul r6, r7\n\t"
  33461. #endif
  33462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33463. "lsrs r7, r6, #16\n\t"
  33464. #else
  33465. "lsr r7, r6, #16\n\t"
  33466. #endif
  33467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33468. "lsls r6, r6, #16\n\t"
  33469. #else
  33470. "lsl r6, r6, #16\n\t"
  33471. #endif
  33472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33473. "adds r3, r3, r6\n\t"
  33474. #else
  33475. "add r3, r3, r6\n\t"
  33476. #endif
  33477. #ifdef WOLFSSL_KEIL
  33478. "adcs r4, r4, r7\n\t"
  33479. #elif defined(__clang__)
  33480. "adcs r4, r7\n\t"
  33481. #else
  33482. "adc r4, r7\n\t"
  33483. #endif
  33484. #ifdef WOLFSSL_KEIL
  33485. "adcs r5, r5, %[r]\n\t"
  33486. #elif defined(__clang__)
  33487. "adcs r5, %[r]\n\t"
  33488. #else
  33489. "adc r5, %[r]\n\t"
  33490. #endif
  33491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33492. "lsrs r6, %[a], #16\n\t"
  33493. #else
  33494. "lsr r6, %[a], #16\n\t"
  33495. #endif
  33496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33497. "lsrs r7, %[b], #16\n\t"
  33498. #else
  33499. "lsr r7, %[b], #16\n\t"
  33500. #endif
  33501. #ifdef WOLFSSL_KEIL
  33502. "muls r7, r6, r7\n\t"
  33503. #elif defined(__clang__)
  33504. "muls r7, r6\n\t"
  33505. #else
  33506. "mul r7, r6\n\t"
  33507. #endif
  33508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33509. "adds r4, r4, r7\n\t"
  33510. #else
  33511. "add r4, r4, r7\n\t"
  33512. #endif
  33513. #ifdef WOLFSSL_KEIL
  33514. "adcs r5, r5, %[r]\n\t"
  33515. #elif defined(__clang__)
  33516. "adcs r5, %[r]\n\t"
  33517. #else
  33518. "adc r5, %[r]\n\t"
  33519. #endif
  33520. "uxth r7, %[b]\n\t"
  33521. #ifdef WOLFSSL_KEIL
  33522. "muls r6, r7, r6\n\t"
  33523. #elif defined(__clang__)
  33524. "muls r6, r7\n\t"
  33525. #else
  33526. "mul r6, r7\n\t"
  33527. #endif
  33528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33529. "lsrs r7, r6, #16\n\t"
  33530. #else
  33531. "lsr r7, r6, #16\n\t"
  33532. #endif
  33533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33534. "lsls r6, r6, #16\n\t"
  33535. #else
  33536. "lsl r6, r6, #16\n\t"
  33537. #endif
  33538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33539. "adds r3, r3, r6\n\t"
  33540. #else
  33541. "add r3, r3, r6\n\t"
  33542. #endif
  33543. #ifdef WOLFSSL_KEIL
  33544. "adcs r4, r4, r7\n\t"
  33545. #elif defined(__clang__)
  33546. "adcs r4, r7\n\t"
  33547. #else
  33548. "adc r4, r7\n\t"
  33549. #endif
  33550. #ifdef WOLFSSL_KEIL
  33551. "adcs r5, r5, %[r]\n\t"
  33552. #elif defined(__clang__)
  33553. "adcs r5, %[r]\n\t"
  33554. #else
  33555. "adc r5, %[r]\n\t"
  33556. #endif
  33557. "# A[4] * B[2]\n\t"
  33558. "mov %[a], r9\n\t"
  33559. "mov %[b], r10\n\t"
  33560. "ldr %[a], [%[a], #16]\n\t"
  33561. "ldr %[b], [%[b], #8]\n\t"
  33562. "uxth r6, %[a]\n\t"
  33563. "uxth r7, %[b]\n\t"
  33564. #ifdef WOLFSSL_KEIL
  33565. "muls r7, r6, r7\n\t"
  33566. #elif defined(__clang__)
  33567. "muls r7, r6\n\t"
  33568. #else
  33569. "mul r7, r6\n\t"
  33570. #endif
  33571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33572. "adds r3, r3, r7\n\t"
  33573. #else
  33574. "add r3, r3, r7\n\t"
  33575. #endif
  33576. #ifdef WOLFSSL_KEIL
  33577. "adcs r4, r4, %[r]\n\t"
  33578. #elif defined(__clang__)
  33579. "adcs r4, %[r]\n\t"
  33580. #else
  33581. "adc r4, %[r]\n\t"
  33582. #endif
  33583. #ifdef WOLFSSL_KEIL
  33584. "adcs r5, r5, %[r]\n\t"
  33585. #elif defined(__clang__)
  33586. "adcs r5, %[r]\n\t"
  33587. #else
  33588. "adc r5, %[r]\n\t"
  33589. #endif
  33590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33591. "lsrs r7, %[b], #16\n\t"
  33592. #else
  33593. "lsr r7, %[b], #16\n\t"
  33594. #endif
  33595. #ifdef WOLFSSL_KEIL
  33596. "muls r6, r7, r6\n\t"
  33597. #elif defined(__clang__)
  33598. "muls r6, r7\n\t"
  33599. #else
  33600. "mul r6, r7\n\t"
  33601. #endif
  33602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33603. "lsrs r7, r6, #16\n\t"
  33604. #else
  33605. "lsr r7, r6, #16\n\t"
  33606. #endif
  33607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33608. "lsls r6, r6, #16\n\t"
  33609. #else
  33610. "lsl r6, r6, #16\n\t"
  33611. #endif
  33612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33613. "adds r3, r3, r6\n\t"
  33614. #else
  33615. "add r3, r3, r6\n\t"
  33616. #endif
  33617. #ifdef WOLFSSL_KEIL
  33618. "adcs r4, r4, r7\n\t"
  33619. #elif defined(__clang__)
  33620. "adcs r4, r7\n\t"
  33621. #else
  33622. "adc r4, r7\n\t"
  33623. #endif
  33624. #ifdef WOLFSSL_KEIL
  33625. "adcs r5, r5, %[r]\n\t"
  33626. #elif defined(__clang__)
  33627. "adcs r5, %[r]\n\t"
  33628. #else
  33629. "adc r5, %[r]\n\t"
  33630. #endif
  33631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33632. "lsrs r6, %[a], #16\n\t"
  33633. #else
  33634. "lsr r6, %[a], #16\n\t"
  33635. #endif
  33636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33637. "lsrs r7, %[b], #16\n\t"
  33638. #else
  33639. "lsr r7, %[b], #16\n\t"
  33640. #endif
  33641. #ifdef WOLFSSL_KEIL
  33642. "muls r7, r6, r7\n\t"
  33643. #elif defined(__clang__)
  33644. "muls r7, r6\n\t"
  33645. #else
  33646. "mul r7, r6\n\t"
  33647. #endif
  33648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33649. "adds r4, r4, r7\n\t"
  33650. #else
  33651. "add r4, r4, r7\n\t"
  33652. #endif
  33653. #ifdef WOLFSSL_KEIL
  33654. "adcs r5, r5, %[r]\n\t"
  33655. #elif defined(__clang__)
  33656. "adcs r5, %[r]\n\t"
  33657. #else
  33658. "adc r5, %[r]\n\t"
  33659. #endif
  33660. "uxth r7, %[b]\n\t"
  33661. #ifdef WOLFSSL_KEIL
  33662. "muls r6, r7, r6\n\t"
  33663. #elif defined(__clang__)
  33664. "muls r6, r7\n\t"
  33665. #else
  33666. "mul r6, r7\n\t"
  33667. #endif
  33668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33669. "lsrs r7, r6, #16\n\t"
  33670. #else
  33671. "lsr r7, r6, #16\n\t"
  33672. #endif
  33673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33674. "lsls r6, r6, #16\n\t"
  33675. #else
  33676. "lsl r6, r6, #16\n\t"
  33677. #endif
  33678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33679. "adds r3, r3, r6\n\t"
  33680. #else
  33681. "add r3, r3, r6\n\t"
  33682. #endif
  33683. #ifdef WOLFSSL_KEIL
  33684. "adcs r4, r4, r7\n\t"
  33685. #elif defined(__clang__)
  33686. "adcs r4, r7\n\t"
  33687. #else
  33688. "adc r4, r7\n\t"
  33689. #endif
  33690. #ifdef WOLFSSL_KEIL
  33691. "adcs r5, r5, %[r]\n\t"
  33692. #elif defined(__clang__)
  33693. "adcs r5, %[r]\n\t"
  33694. #else
  33695. "adc r5, %[r]\n\t"
  33696. #endif
  33697. "# A[3] * B[3]\n\t"
  33698. "mov %[a], r9\n\t"
  33699. "mov %[b], r10\n\t"
  33700. "ldr %[a], [%[a], #12]\n\t"
  33701. "ldr %[b], [%[b], #12]\n\t"
  33702. "uxth r6, %[a]\n\t"
  33703. "uxth r7, %[b]\n\t"
  33704. #ifdef WOLFSSL_KEIL
  33705. "muls r7, r6, r7\n\t"
  33706. #elif defined(__clang__)
  33707. "muls r7, r6\n\t"
  33708. #else
  33709. "mul r7, r6\n\t"
  33710. #endif
  33711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33712. "adds r3, r3, r7\n\t"
  33713. #else
  33714. "add r3, r3, r7\n\t"
  33715. #endif
  33716. #ifdef WOLFSSL_KEIL
  33717. "adcs r4, r4, %[r]\n\t"
  33718. #elif defined(__clang__)
  33719. "adcs r4, %[r]\n\t"
  33720. #else
  33721. "adc r4, %[r]\n\t"
  33722. #endif
  33723. #ifdef WOLFSSL_KEIL
  33724. "adcs r5, r5, %[r]\n\t"
  33725. #elif defined(__clang__)
  33726. "adcs r5, %[r]\n\t"
  33727. #else
  33728. "adc r5, %[r]\n\t"
  33729. #endif
  33730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33731. "lsrs r7, %[b], #16\n\t"
  33732. #else
  33733. "lsr r7, %[b], #16\n\t"
  33734. #endif
  33735. #ifdef WOLFSSL_KEIL
  33736. "muls r6, r7, r6\n\t"
  33737. #elif defined(__clang__)
  33738. "muls r6, r7\n\t"
  33739. #else
  33740. "mul r6, r7\n\t"
  33741. #endif
  33742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33743. "lsrs r7, r6, #16\n\t"
  33744. #else
  33745. "lsr r7, r6, #16\n\t"
  33746. #endif
  33747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33748. "lsls r6, r6, #16\n\t"
  33749. #else
  33750. "lsl r6, r6, #16\n\t"
  33751. #endif
  33752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33753. "adds r3, r3, r6\n\t"
  33754. #else
  33755. "add r3, r3, r6\n\t"
  33756. #endif
  33757. #ifdef WOLFSSL_KEIL
  33758. "adcs r4, r4, r7\n\t"
  33759. #elif defined(__clang__)
  33760. "adcs r4, r7\n\t"
  33761. #else
  33762. "adc r4, r7\n\t"
  33763. #endif
  33764. #ifdef WOLFSSL_KEIL
  33765. "adcs r5, r5, %[r]\n\t"
  33766. #elif defined(__clang__)
  33767. "adcs r5, %[r]\n\t"
  33768. #else
  33769. "adc r5, %[r]\n\t"
  33770. #endif
  33771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33772. "lsrs r6, %[a], #16\n\t"
  33773. #else
  33774. "lsr r6, %[a], #16\n\t"
  33775. #endif
  33776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33777. "lsrs r7, %[b], #16\n\t"
  33778. #else
  33779. "lsr r7, %[b], #16\n\t"
  33780. #endif
  33781. #ifdef WOLFSSL_KEIL
  33782. "muls r7, r6, r7\n\t"
  33783. #elif defined(__clang__)
  33784. "muls r7, r6\n\t"
  33785. #else
  33786. "mul r7, r6\n\t"
  33787. #endif
  33788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33789. "adds r4, r4, r7\n\t"
  33790. #else
  33791. "add r4, r4, r7\n\t"
  33792. #endif
  33793. #ifdef WOLFSSL_KEIL
  33794. "adcs r5, r5, %[r]\n\t"
  33795. #elif defined(__clang__)
  33796. "adcs r5, %[r]\n\t"
  33797. #else
  33798. "adc r5, %[r]\n\t"
  33799. #endif
  33800. "uxth r7, %[b]\n\t"
  33801. #ifdef WOLFSSL_KEIL
  33802. "muls r6, r7, r6\n\t"
  33803. #elif defined(__clang__)
  33804. "muls r6, r7\n\t"
  33805. #else
  33806. "mul r6, r7\n\t"
  33807. #endif
  33808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33809. "lsrs r7, r6, #16\n\t"
  33810. #else
  33811. "lsr r7, r6, #16\n\t"
  33812. #endif
  33813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33814. "lsls r6, r6, #16\n\t"
  33815. #else
  33816. "lsl r6, r6, #16\n\t"
  33817. #endif
  33818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33819. "adds r3, r3, r6\n\t"
  33820. #else
  33821. "add r3, r3, r6\n\t"
  33822. #endif
  33823. #ifdef WOLFSSL_KEIL
  33824. "adcs r4, r4, r7\n\t"
  33825. #elif defined(__clang__)
  33826. "adcs r4, r7\n\t"
  33827. #else
  33828. "adc r4, r7\n\t"
  33829. #endif
  33830. #ifdef WOLFSSL_KEIL
  33831. "adcs r5, r5, %[r]\n\t"
  33832. #elif defined(__clang__)
  33833. "adcs r5, %[r]\n\t"
  33834. #else
  33835. "adc r5, %[r]\n\t"
  33836. #endif
  33837. "# A[2] * B[4]\n\t"
  33838. "mov %[a], r9\n\t"
  33839. "mov %[b], r10\n\t"
  33840. "ldr %[a], [%[a], #8]\n\t"
  33841. "ldr %[b], [%[b], #16]\n\t"
  33842. "uxth r6, %[a]\n\t"
  33843. "uxth r7, %[b]\n\t"
  33844. #ifdef WOLFSSL_KEIL
  33845. "muls r7, r6, r7\n\t"
  33846. #elif defined(__clang__)
  33847. "muls r7, r6\n\t"
  33848. #else
  33849. "mul r7, r6\n\t"
  33850. #endif
  33851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33852. "adds r3, r3, r7\n\t"
  33853. #else
  33854. "add r3, r3, r7\n\t"
  33855. #endif
  33856. #ifdef WOLFSSL_KEIL
  33857. "adcs r4, r4, %[r]\n\t"
  33858. #elif defined(__clang__)
  33859. "adcs r4, %[r]\n\t"
  33860. #else
  33861. "adc r4, %[r]\n\t"
  33862. #endif
  33863. #ifdef WOLFSSL_KEIL
  33864. "adcs r5, r5, %[r]\n\t"
  33865. #elif defined(__clang__)
  33866. "adcs r5, %[r]\n\t"
  33867. #else
  33868. "adc r5, %[r]\n\t"
  33869. #endif
  33870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33871. "lsrs r7, %[b], #16\n\t"
  33872. #else
  33873. "lsr r7, %[b], #16\n\t"
  33874. #endif
  33875. #ifdef WOLFSSL_KEIL
  33876. "muls r6, r7, r6\n\t"
  33877. #elif defined(__clang__)
  33878. "muls r6, r7\n\t"
  33879. #else
  33880. "mul r6, r7\n\t"
  33881. #endif
  33882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33883. "lsrs r7, r6, #16\n\t"
  33884. #else
  33885. "lsr r7, r6, #16\n\t"
  33886. #endif
  33887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33888. "lsls r6, r6, #16\n\t"
  33889. #else
  33890. "lsl r6, r6, #16\n\t"
  33891. #endif
  33892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33893. "adds r3, r3, r6\n\t"
  33894. #else
  33895. "add r3, r3, r6\n\t"
  33896. #endif
  33897. #ifdef WOLFSSL_KEIL
  33898. "adcs r4, r4, r7\n\t"
  33899. #elif defined(__clang__)
  33900. "adcs r4, r7\n\t"
  33901. #else
  33902. "adc r4, r7\n\t"
  33903. #endif
  33904. #ifdef WOLFSSL_KEIL
  33905. "adcs r5, r5, %[r]\n\t"
  33906. #elif defined(__clang__)
  33907. "adcs r5, %[r]\n\t"
  33908. #else
  33909. "adc r5, %[r]\n\t"
  33910. #endif
  33911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33912. "lsrs r6, %[a], #16\n\t"
  33913. #else
  33914. "lsr r6, %[a], #16\n\t"
  33915. #endif
  33916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33917. "lsrs r7, %[b], #16\n\t"
  33918. #else
  33919. "lsr r7, %[b], #16\n\t"
  33920. #endif
  33921. #ifdef WOLFSSL_KEIL
  33922. "muls r7, r6, r7\n\t"
  33923. #elif defined(__clang__)
  33924. "muls r7, r6\n\t"
  33925. #else
  33926. "mul r7, r6\n\t"
  33927. #endif
  33928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33929. "adds r4, r4, r7\n\t"
  33930. #else
  33931. "add r4, r4, r7\n\t"
  33932. #endif
  33933. #ifdef WOLFSSL_KEIL
  33934. "adcs r5, r5, %[r]\n\t"
  33935. #elif defined(__clang__)
  33936. "adcs r5, %[r]\n\t"
  33937. #else
  33938. "adc r5, %[r]\n\t"
  33939. #endif
  33940. "uxth r7, %[b]\n\t"
  33941. #ifdef WOLFSSL_KEIL
  33942. "muls r6, r7, r6\n\t"
  33943. #elif defined(__clang__)
  33944. "muls r6, r7\n\t"
  33945. #else
  33946. "mul r6, r7\n\t"
  33947. #endif
  33948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33949. "lsrs r7, r6, #16\n\t"
  33950. #else
  33951. "lsr r7, r6, #16\n\t"
  33952. #endif
  33953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33954. "lsls r6, r6, #16\n\t"
  33955. #else
  33956. "lsl r6, r6, #16\n\t"
  33957. #endif
  33958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33959. "adds r3, r3, r6\n\t"
  33960. #else
  33961. "add r3, r3, r6\n\t"
  33962. #endif
  33963. #ifdef WOLFSSL_KEIL
  33964. "adcs r4, r4, r7\n\t"
  33965. #elif defined(__clang__)
  33966. "adcs r4, r7\n\t"
  33967. #else
  33968. "adc r4, r7\n\t"
  33969. #endif
  33970. #ifdef WOLFSSL_KEIL
  33971. "adcs r5, r5, %[r]\n\t"
  33972. #elif defined(__clang__)
  33973. "adcs r5, %[r]\n\t"
  33974. #else
  33975. "adc r5, %[r]\n\t"
  33976. #endif
  33977. "# A[1] * B[5]\n\t"
  33978. "mov %[a], r9\n\t"
  33979. "mov %[b], r10\n\t"
  33980. "ldr %[a], [%[a], #4]\n\t"
  33981. "ldr %[b], [%[b], #20]\n\t"
  33982. "uxth r6, %[a]\n\t"
  33983. "uxth r7, %[b]\n\t"
  33984. #ifdef WOLFSSL_KEIL
  33985. "muls r7, r6, r7\n\t"
  33986. #elif defined(__clang__)
  33987. "muls r7, r6\n\t"
  33988. #else
  33989. "mul r7, r6\n\t"
  33990. #endif
  33991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  33992. "adds r3, r3, r7\n\t"
  33993. #else
  33994. "add r3, r3, r7\n\t"
  33995. #endif
  33996. #ifdef WOLFSSL_KEIL
  33997. "adcs r4, r4, %[r]\n\t"
  33998. #elif defined(__clang__)
  33999. "adcs r4, %[r]\n\t"
  34000. #else
  34001. "adc r4, %[r]\n\t"
  34002. #endif
  34003. #ifdef WOLFSSL_KEIL
  34004. "adcs r5, r5, %[r]\n\t"
  34005. #elif defined(__clang__)
  34006. "adcs r5, %[r]\n\t"
  34007. #else
  34008. "adc r5, %[r]\n\t"
  34009. #endif
  34010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34011. "lsrs r7, %[b], #16\n\t"
  34012. #else
  34013. "lsr r7, %[b], #16\n\t"
  34014. #endif
  34015. #ifdef WOLFSSL_KEIL
  34016. "muls r6, r7, r6\n\t"
  34017. #elif defined(__clang__)
  34018. "muls r6, r7\n\t"
  34019. #else
  34020. "mul r6, r7\n\t"
  34021. #endif
  34022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34023. "lsrs r7, r6, #16\n\t"
  34024. #else
  34025. "lsr r7, r6, #16\n\t"
  34026. #endif
  34027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34028. "lsls r6, r6, #16\n\t"
  34029. #else
  34030. "lsl r6, r6, #16\n\t"
  34031. #endif
  34032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34033. "adds r3, r3, r6\n\t"
  34034. #else
  34035. "add r3, r3, r6\n\t"
  34036. #endif
  34037. #ifdef WOLFSSL_KEIL
  34038. "adcs r4, r4, r7\n\t"
  34039. #elif defined(__clang__)
  34040. "adcs r4, r7\n\t"
  34041. #else
  34042. "adc r4, r7\n\t"
  34043. #endif
  34044. #ifdef WOLFSSL_KEIL
  34045. "adcs r5, r5, %[r]\n\t"
  34046. #elif defined(__clang__)
  34047. "adcs r5, %[r]\n\t"
  34048. #else
  34049. "adc r5, %[r]\n\t"
  34050. #endif
  34051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34052. "lsrs r6, %[a], #16\n\t"
  34053. #else
  34054. "lsr r6, %[a], #16\n\t"
  34055. #endif
  34056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34057. "lsrs r7, %[b], #16\n\t"
  34058. #else
  34059. "lsr r7, %[b], #16\n\t"
  34060. #endif
  34061. #ifdef WOLFSSL_KEIL
  34062. "muls r7, r6, r7\n\t"
  34063. #elif defined(__clang__)
  34064. "muls r7, r6\n\t"
  34065. #else
  34066. "mul r7, r6\n\t"
  34067. #endif
  34068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34069. "adds r4, r4, r7\n\t"
  34070. #else
  34071. "add r4, r4, r7\n\t"
  34072. #endif
  34073. #ifdef WOLFSSL_KEIL
  34074. "adcs r5, r5, %[r]\n\t"
  34075. #elif defined(__clang__)
  34076. "adcs r5, %[r]\n\t"
  34077. #else
  34078. "adc r5, %[r]\n\t"
  34079. #endif
  34080. "uxth r7, %[b]\n\t"
  34081. #ifdef WOLFSSL_KEIL
  34082. "muls r6, r7, r6\n\t"
  34083. #elif defined(__clang__)
  34084. "muls r6, r7\n\t"
  34085. #else
  34086. "mul r6, r7\n\t"
  34087. #endif
  34088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34089. "lsrs r7, r6, #16\n\t"
  34090. #else
  34091. "lsr r7, r6, #16\n\t"
  34092. #endif
  34093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34094. "lsls r6, r6, #16\n\t"
  34095. #else
  34096. "lsl r6, r6, #16\n\t"
  34097. #endif
  34098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34099. "adds r3, r3, r6\n\t"
  34100. #else
  34101. "add r3, r3, r6\n\t"
  34102. #endif
  34103. #ifdef WOLFSSL_KEIL
  34104. "adcs r4, r4, r7\n\t"
  34105. #elif defined(__clang__)
  34106. "adcs r4, r7\n\t"
  34107. #else
  34108. "adc r4, r7\n\t"
  34109. #endif
  34110. #ifdef WOLFSSL_KEIL
  34111. "adcs r5, r5, %[r]\n\t"
  34112. #elif defined(__clang__)
  34113. "adcs r5, %[r]\n\t"
  34114. #else
  34115. "adc r5, %[r]\n\t"
  34116. #endif
  34117. "# A[0] * B[6]\n\t"
  34118. "mov %[a], r9\n\t"
  34119. "mov %[b], r10\n\t"
  34120. "ldr %[a], [%[a]]\n\t"
  34121. "ldr %[b], [%[b], #24]\n\t"
  34122. "uxth r6, %[a]\n\t"
  34123. "uxth r7, %[b]\n\t"
  34124. #ifdef WOLFSSL_KEIL
  34125. "muls r7, r6, r7\n\t"
  34126. #elif defined(__clang__)
  34127. "muls r7, r6\n\t"
  34128. #else
  34129. "mul r7, r6\n\t"
  34130. #endif
  34131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34132. "adds r3, r3, r7\n\t"
  34133. #else
  34134. "add r3, r3, r7\n\t"
  34135. #endif
  34136. #ifdef WOLFSSL_KEIL
  34137. "adcs r4, r4, %[r]\n\t"
  34138. #elif defined(__clang__)
  34139. "adcs r4, %[r]\n\t"
  34140. #else
  34141. "adc r4, %[r]\n\t"
  34142. #endif
  34143. #ifdef WOLFSSL_KEIL
  34144. "adcs r5, r5, %[r]\n\t"
  34145. #elif defined(__clang__)
  34146. "adcs r5, %[r]\n\t"
  34147. #else
  34148. "adc r5, %[r]\n\t"
  34149. #endif
  34150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34151. "lsrs r7, %[b], #16\n\t"
  34152. #else
  34153. "lsr r7, %[b], #16\n\t"
  34154. #endif
  34155. #ifdef WOLFSSL_KEIL
  34156. "muls r6, r7, r6\n\t"
  34157. #elif defined(__clang__)
  34158. "muls r6, r7\n\t"
  34159. #else
  34160. "mul r6, r7\n\t"
  34161. #endif
  34162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34163. "lsrs r7, r6, #16\n\t"
  34164. #else
  34165. "lsr r7, r6, #16\n\t"
  34166. #endif
  34167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34168. "lsls r6, r6, #16\n\t"
  34169. #else
  34170. "lsl r6, r6, #16\n\t"
  34171. #endif
  34172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34173. "adds r3, r3, r6\n\t"
  34174. #else
  34175. "add r3, r3, r6\n\t"
  34176. #endif
  34177. #ifdef WOLFSSL_KEIL
  34178. "adcs r4, r4, r7\n\t"
  34179. #elif defined(__clang__)
  34180. "adcs r4, r7\n\t"
  34181. #else
  34182. "adc r4, r7\n\t"
  34183. #endif
  34184. #ifdef WOLFSSL_KEIL
  34185. "adcs r5, r5, %[r]\n\t"
  34186. #elif defined(__clang__)
  34187. "adcs r5, %[r]\n\t"
  34188. #else
  34189. "adc r5, %[r]\n\t"
  34190. #endif
  34191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34192. "lsrs r6, %[a], #16\n\t"
  34193. #else
  34194. "lsr r6, %[a], #16\n\t"
  34195. #endif
  34196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34197. "lsrs r7, %[b], #16\n\t"
  34198. #else
  34199. "lsr r7, %[b], #16\n\t"
  34200. #endif
  34201. #ifdef WOLFSSL_KEIL
  34202. "muls r7, r6, r7\n\t"
  34203. #elif defined(__clang__)
  34204. "muls r7, r6\n\t"
  34205. #else
  34206. "mul r7, r6\n\t"
  34207. #endif
  34208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34209. "adds r4, r4, r7\n\t"
  34210. #else
  34211. "add r4, r4, r7\n\t"
  34212. #endif
  34213. #ifdef WOLFSSL_KEIL
  34214. "adcs r5, r5, %[r]\n\t"
  34215. #elif defined(__clang__)
  34216. "adcs r5, %[r]\n\t"
  34217. #else
  34218. "adc r5, %[r]\n\t"
  34219. #endif
  34220. "uxth r7, %[b]\n\t"
  34221. #ifdef WOLFSSL_KEIL
  34222. "muls r6, r7, r6\n\t"
  34223. #elif defined(__clang__)
  34224. "muls r6, r7\n\t"
  34225. #else
  34226. "mul r6, r7\n\t"
  34227. #endif
  34228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34229. "lsrs r7, r6, #16\n\t"
  34230. #else
  34231. "lsr r7, r6, #16\n\t"
  34232. #endif
  34233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34234. "lsls r6, r6, #16\n\t"
  34235. #else
  34236. "lsl r6, r6, #16\n\t"
  34237. #endif
  34238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34239. "adds r3, r3, r6\n\t"
  34240. #else
  34241. "add r3, r3, r6\n\t"
  34242. #endif
  34243. #ifdef WOLFSSL_KEIL
  34244. "adcs r4, r4, r7\n\t"
  34245. #elif defined(__clang__)
  34246. "adcs r4, r7\n\t"
  34247. #else
  34248. "adc r4, r7\n\t"
  34249. #endif
  34250. #ifdef WOLFSSL_KEIL
  34251. "adcs r5, r5, %[r]\n\t"
  34252. #elif defined(__clang__)
  34253. "adcs r5, %[r]\n\t"
  34254. #else
  34255. "adc r5, %[r]\n\t"
  34256. #endif
  34257. "str r3, [sp, #24]\n\t"
  34258. "# A[0] * B[7]\n\t"
  34259. "movs r3, #0\n\t"
  34260. "mov %[a], r9\n\t"
  34261. "mov %[b], r10\n\t"
  34262. "ldr %[a], [%[a]]\n\t"
  34263. "ldr %[b], [%[b], #28]\n\t"
  34264. "uxth r6, %[a]\n\t"
  34265. "uxth r7, %[b]\n\t"
  34266. #ifdef WOLFSSL_KEIL
  34267. "muls r7, r6, r7\n\t"
  34268. #elif defined(__clang__)
  34269. "muls r7, r6\n\t"
  34270. #else
  34271. "mul r7, r6\n\t"
  34272. #endif
  34273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34274. "adds r4, r4, r7\n\t"
  34275. #else
  34276. "add r4, r4, r7\n\t"
  34277. #endif
  34278. #ifdef WOLFSSL_KEIL
  34279. "adcs r5, r5, %[r]\n\t"
  34280. #elif defined(__clang__)
  34281. "adcs r5, %[r]\n\t"
  34282. #else
  34283. "adc r5, %[r]\n\t"
  34284. #endif
  34285. #ifdef WOLFSSL_KEIL
  34286. "adcs r3, r3, %[r]\n\t"
  34287. #elif defined(__clang__)
  34288. "adcs r3, %[r]\n\t"
  34289. #else
  34290. "adc r3, %[r]\n\t"
  34291. #endif
  34292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34293. "lsrs r7, %[b], #16\n\t"
  34294. #else
  34295. "lsr r7, %[b], #16\n\t"
  34296. #endif
  34297. #ifdef WOLFSSL_KEIL
  34298. "muls r6, r7, r6\n\t"
  34299. #elif defined(__clang__)
  34300. "muls r6, r7\n\t"
  34301. #else
  34302. "mul r6, r7\n\t"
  34303. #endif
  34304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34305. "lsrs r7, r6, #16\n\t"
  34306. #else
  34307. "lsr r7, r6, #16\n\t"
  34308. #endif
  34309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34310. "lsls r6, r6, #16\n\t"
  34311. #else
  34312. "lsl r6, r6, #16\n\t"
  34313. #endif
  34314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34315. "adds r4, r4, r6\n\t"
  34316. #else
  34317. "add r4, r4, r6\n\t"
  34318. #endif
  34319. #ifdef WOLFSSL_KEIL
  34320. "adcs r5, r5, r7\n\t"
  34321. #elif defined(__clang__)
  34322. "adcs r5, r7\n\t"
  34323. #else
  34324. "adc r5, r7\n\t"
  34325. #endif
  34326. #ifdef WOLFSSL_KEIL
  34327. "adcs r3, r3, %[r]\n\t"
  34328. #elif defined(__clang__)
  34329. "adcs r3, %[r]\n\t"
  34330. #else
  34331. "adc r3, %[r]\n\t"
  34332. #endif
  34333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34334. "lsrs r6, %[a], #16\n\t"
  34335. #else
  34336. "lsr r6, %[a], #16\n\t"
  34337. #endif
  34338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34339. "lsrs r7, %[b], #16\n\t"
  34340. #else
  34341. "lsr r7, %[b], #16\n\t"
  34342. #endif
  34343. #ifdef WOLFSSL_KEIL
  34344. "muls r7, r6, r7\n\t"
  34345. #elif defined(__clang__)
  34346. "muls r7, r6\n\t"
  34347. #else
  34348. "mul r7, r6\n\t"
  34349. #endif
  34350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34351. "adds r5, r5, r7\n\t"
  34352. #else
  34353. "add r5, r5, r7\n\t"
  34354. #endif
  34355. #ifdef WOLFSSL_KEIL
  34356. "adcs r3, r3, %[r]\n\t"
  34357. #elif defined(__clang__)
  34358. "adcs r3, %[r]\n\t"
  34359. #else
  34360. "adc r3, %[r]\n\t"
  34361. #endif
  34362. "uxth r7, %[b]\n\t"
  34363. #ifdef WOLFSSL_KEIL
  34364. "muls r6, r7, r6\n\t"
  34365. #elif defined(__clang__)
  34366. "muls r6, r7\n\t"
  34367. #else
  34368. "mul r6, r7\n\t"
  34369. #endif
  34370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34371. "lsrs r7, r6, #16\n\t"
  34372. #else
  34373. "lsr r7, r6, #16\n\t"
  34374. #endif
  34375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34376. "lsls r6, r6, #16\n\t"
  34377. #else
  34378. "lsl r6, r6, #16\n\t"
  34379. #endif
  34380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34381. "adds r4, r4, r6\n\t"
  34382. #else
  34383. "add r4, r4, r6\n\t"
  34384. #endif
  34385. #ifdef WOLFSSL_KEIL
  34386. "adcs r5, r5, r7\n\t"
  34387. #elif defined(__clang__)
  34388. "adcs r5, r7\n\t"
  34389. #else
  34390. "adc r5, r7\n\t"
  34391. #endif
  34392. #ifdef WOLFSSL_KEIL
  34393. "adcs r3, r3, %[r]\n\t"
  34394. #elif defined(__clang__)
  34395. "adcs r3, %[r]\n\t"
  34396. #else
  34397. "adc r3, %[r]\n\t"
  34398. #endif
  34399. "# A[1] * B[6]\n\t"
  34400. "mov %[a], r9\n\t"
  34401. "mov %[b], r10\n\t"
  34402. "ldr %[a], [%[a], #4]\n\t"
  34403. "ldr %[b], [%[b], #24]\n\t"
  34404. "uxth r6, %[a]\n\t"
  34405. "uxth r7, %[b]\n\t"
  34406. #ifdef WOLFSSL_KEIL
  34407. "muls r7, r6, r7\n\t"
  34408. #elif defined(__clang__)
  34409. "muls r7, r6\n\t"
  34410. #else
  34411. "mul r7, r6\n\t"
  34412. #endif
  34413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34414. "adds r4, r4, r7\n\t"
  34415. #else
  34416. "add r4, r4, r7\n\t"
  34417. #endif
  34418. #ifdef WOLFSSL_KEIL
  34419. "adcs r5, r5, %[r]\n\t"
  34420. #elif defined(__clang__)
  34421. "adcs r5, %[r]\n\t"
  34422. #else
  34423. "adc r5, %[r]\n\t"
  34424. #endif
  34425. #ifdef WOLFSSL_KEIL
  34426. "adcs r3, r3, %[r]\n\t"
  34427. #elif defined(__clang__)
  34428. "adcs r3, %[r]\n\t"
  34429. #else
  34430. "adc r3, %[r]\n\t"
  34431. #endif
  34432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34433. "lsrs r7, %[b], #16\n\t"
  34434. #else
  34435. "lsr r7, %[b], #16\n\t"
  34436. #endif
  34437. #ifdef WOLFSSL_KEIL
  34438. "muls r6, r7, r6\n\t"
  34439. #elif defined(__clang__)
  34440. "muls r6, r7\n\t"
  34441. #else
  34442. "mul r6, r7\n\t"
  34443. #endif
  34444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34445. "lsrs r7, r6, #16\n\t"
  34446. #else
  34447. "lsr r7, r6, #16\n\t"
  34448. #endif
  34449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34450. "lsls r6, r6, #16\n\t"
  34451. #else
  34452. "lsl r6, r6, #16\n\t"
  34453. #endif
  34454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34455. "adds r4, r4, r6\n\t"
  34456. #else
  34457. "add r4, r4, r6\n\t"
  34458. #endif
  34459. #ifdef WOLFSSL_KEIL
  34460. "adcs r5, r5, r7\n\t"
  34461. #elif defined(__clang__)
  34462. "adcs r5, r7\n\t"
  34463. #else
  34464. "adc r5, r7\n\t"
  34465. #endif
  34466. #ifdef WOLFSSL_KEIL
  34467. "adcs r3, r3, %[r]\n\t"
  34468. #elif defined(__clang__)
  34469. "adcs r3, %[r]\n\t"
  34470. #else
  34471. "adc r3, %[r]\n\t"
  34472. #endif
  34473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34474. "lsrs r6, %[a], #16\n\t"
  34475. #else
  34476. "lsr r6, %[a], #16\n\t"
  34477. #endif
  34478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34479. "lsrs r7, %[b], #16\n\t"
  34480. #else
  34481. "lsr r7, %[b], #16\n\t"
  34482. #endif
  34483. #ifdef WOLFSSL_KEIL
  34484. "muls r7, r6, r7\n\t"
  34485. #elif defined(__clang__)
  34486. "muls r7, r6\n\t"
  34487. #else
  34488. "mul r7, r6\n\t"
  34489. #endif
  34490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34491. "adds r5, r5, r7\n\t"
  34492. #else
  34493. "add r5, r5, r7\n\t"
  34494. #endif
  34495. #ifdef WOLFSSL_KEIL
  34496. "adcs r3, r3, %[r]\n\t"
  34497. #elif defined(__clang__)
  34498. "adcs r3, %[r]\n\t"
  34499. #else
  34500. "adc r3, %[r]\n\t"
  34501. #endif
  34502. "uxth r7, %[b]\n\t"
  34503. #ifdef WOLFSSL_KEIL
  34504. "muls r6, r7, r6\n\t"
  34505. #elif defined(__clang__)
  34506. "muls r6, r7\n\t"
  34507. #else
  34508. "mul r6, r7\n\t"
  34509. #endif
  34510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34511. "lsrs r7, r6, #16\n\t"
  34512. #else
  34513. "lsr r7, r6, #16\n\t"
  34514. #endif
  34515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34516. "lsls r6, r6, #16\n\t"
  34517. #else
  34518. "lsl r6, r6, #16\n\t"
  34519. #endif
  34520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34521. "adds r4, r4, r6\n\t"
  34522. #else
  34523. "add r4, r4, r6\n\t"
  34524. #endif
  34525. #ifdef WOLFSSL_KEIL
  34526. "adcs r5, r5, r7\n\t"
  34527. #elif defined(__clang__)
  34528. "adcs r5, r7\n\t"
  34529. #else
  34530. "adc r5, r7\n\t"
  34531. #endif
  34532. #ifdef WOLFSSL_KEIL
  34533. "adcs r3, r3, %[r]\n\t"
  34534. #elif defined(__clang__)
  34535. "adcs r3, %[r]\n\t"
  34536. #else
  34537. "adc r3, %[r]\n\t"
  34538. #endif
  34539. "# A[2] * B[5]\n\t"
  34540. "mov %[a], r9\n\t"
  34541. "mov %[b], r10\n\t"
  34542. "ldr %[a], [%[a], #8]\n\t"
  34543. "ldr %[b], [%[b], #20]\n\t"
  34544. "uxth r6, %[a]\n\t"
  34545. "uxth r7, %[b]\n\t"
  34546. #ifdef WOLFSSL_KEIL
  34547. "muls r7, r6, r7\n\t"
  34548. #elif defined(__clang__)
  34549. "muls r7, r6\n\t"
  34550. #else
  34551. "mul r7, r6\n\t"
  34552. #endif
  34553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34554. "adds r4, r4, r7\n\t"
  34555. #else
  34556. "add r4, r4, r7\n\t"
  34557. #endif
  34558. #ifdef WOLFSSL_KEIL
  34559. "adcs r5, r5, %[r]\n\t"
  34560. #elif defined(__clang__)
  34561. "adcs r5, %[r]\n\t"
  34562. #else
  34563. "adc r5, %[r]\n\t"
  34564. #endif
  34565. #ifdef WOLFSSL_KEIL
  34566. "adcs r3, r3, %[r]\n\t"
  34567. #elif defined(__clang__)
  34568. "adcs r3, %[r]\n\t"
  34569. #else
  34570. "adc r3, %[r]\n\t"
  34571. #endif
  34572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34573. "lsrs r7, %[b], #16\n\t"
  34574. #else
  34575. "lsr r7, %[b], #16\n\t"
  34576. #endif
  34577. #ifdef WOLFSSL_KEIL
  34578. "muls r6, r7, r6\n\t"
  34579. #elif defined(__clang__)
  34580. "muls r6, r7\n\t"
  34581. #else
  34582. "mul r6, r7\n\t"
  34583. #endif
  34584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34585. "lsrs r7, r6, #16\n\t"
  34586. #else
  34587. "lsr r7, r6, #16\n\t"
  34588. #endif
  34589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34590. "lsls r6, r6, #16\n\t"
  34591. #else
  34592. "lsl r6, r6, #16\n\t"
  34593. #endif
  34594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34595. "adds r4, r4, r6\n\t"
  34596. #else
  34597. "add r4, r4, r6\n\t"
  34598. #endif
  34599. #ifdef WOLFSSL_KEIL
  34600. "adcs r5, r5, r7\n\t"
  34601. #elif defined(__clang__)
  34602. "adcs r5, r7\n\t"
  34603. #else
  34604. "adc r5, r7\n\t"
  34605. #endif
  34606. #ifdef WOLFSSL_KEIL
  34607. "adcs r3, r3, %[r]\n\t"
  34608. #elif defined(__clang__)
  34609. "adcs r3, %[r]\n\t"
  34610. #else
  34611. "adc r3, %[r]\n\t"
  34612. #endif
  34613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34614. "lsrs r6, %[a], #16\n\t"
  34615. #else
  34616. "lsr r6, %[a], #16\n\t"
  34617. #endif
  34618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34619. "lsrs r7, %[b], #16\n\t"
  34620. #else
  34621. "lsr r7, %[b], #16\n\t"
  34622. #endif
  34623. #ifdef WOLFSSL_KEIL
  34624. "muls r7, r6, r7\n\t"
  34625. #elif defined(__clang__)
  34626. "muls r7, r6\n\t"
  34627. #else
  34628. "mul r7, r6\n\t"
  34629. #endif
  34630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34631. "adds r5, r5, r7\n\t"
  34632. #else
  34633. "add r5, r5, r7\n\t"
  34634. #endif
  34635. #ifdef WOLFSSL_KEIL
  34636. "adcs r3, r3, %[r]\n\t"
  34637. #elif defined(__clang__)
  34638. "adcs r3, %[r]\n\t"
  34639. #else
  34640. "adc r3, %[r]\n\t"
  34641. #endif
  34642. "uxth r7, %[b]\n\t"
  34643. #ifdef WOLFSSL_KEIL
  34644. "muls r6, r7, r6\n\t"
  34645. #elif defined(__clang__)
  34646. "muls r6, r7\n\t"
  34647. #else
  34648. "mul r6, r7\n\t"
  34649. #endif
  34650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34651. "lsrs r7, r6, #16\n\t"
  34652. #else
  34653. "lsr r7, r6, #16\n\t"
  34654. #endif
  34655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34656. "lsls r6, r6, #16\n\t"
  34657. #else
  34658. "lsl r6, r6, #16\n\t"
  34659. #endif
  34660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34661. "adds r4, r4, r6\n\t"
  34662. #else
  34663. "add r4, r4, r6\n\t"
  34664. #endif
  34665. #ifdef WOLFSSL_KEIL
  34666. "adcs r5, r5, r7\n\t"
  34667. #elif defined(__clang__)
  34668. "adcs r5, r7\n\t"
  34669. #else
  34670. "adc r5, r7\n\t"
  34671. #endif
  34672. #ifdef WOLFSSL_KEIL
  34673. "adcs r3, r3, %[r]\n\t"
  34674. #elif defined(__clang__)
  34675. "adcs r3, %[r]\n\t"
  34676. #else
  34677. "adc r3, %[r]\n\t"
  34678. #endif
  34679. "# A[3] * B[4]\n\t"
  34680. "mov %[a], r9\n\t"
  34681. "mov %[b], r10\n\t"
  34682. "ldr %[a], [%[a], #12]\n\t"
  34683. "ldr %[b], [%[b], #16]\n\t"
  34684. "uxth r6, %[a]\n\t"
  34685. "uxth r7, %[b]\n\t"
  34686. #ifdef WOLFSSL_KEIL
  34687. "muls r7, r6, r7\n\t"
  34688. #elif defined(__clang__)
  34689. "muls r7, r6\n\t"
  34690. #else
  34691. "mul r7, r6\n\t"
  34692. #endif
  34693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34694. "adds r4, r4, r7\n\t"
  34695. #else
  34696. "add r4, r4, r7\n\t"
  34697. #endif
  34698. #ifdef WOLFSSL_KEIL
  34699. "adcs r5, r5, %[r]\n\t"
  34700. #elif defined(__clang__)
  34701. "adcs r5, %[r]\n\t"
  34702. #else
  34703. "adc r5, %[r]\n\t"
  34704. #endif
  34705. #ifdef WOLFSSL_KEIL
  34706. "adcs r3, r3, %[r]\n\t"
  34707. #elif defined(__clang__)
  34708. "adcs r3, %[r]\n\t"
  34709. #else
  34710. "adc r3, %[r]\n\t"
  34711. #endif
  34712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34713. "lsrs r7, %[b], #16\n\t"
  34714. #else
  34715. "lsr r7, %[b], #16\n\t"
  34716. #endif
  34717. #ifdef WOLFSSL_KEIL
  34718. "muls r6, r7, r6\n\t"
  34719. #elif defined(__clang__)
  34720. "muls r6, r7\n\t"
  34721. #else
  34722. "mul r6, r7\n\t"
  34723. #endif
  34724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34725. "lsrs r7, r6, #16\n\t"
  34726. #else
  34727. "lsr r7, r6, #16\n\t"
  34728. #endif
  34729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34730. "lsls r6, r6, #16\n\t"
  34731. #else
  34732. "lsl r6, r6, #16\n\t"
  34733. #endif
  34734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34735. "adds r4, r4, r6\n\t"
  34736. #else
  34737. "add r4, r4, r6\n\t"
  34738. #endif
  34739. #ifdef WOLFSSL_KEIL
  34740. "adcs r5, r5, r7\n\t"
  34741. #elif defined(__clang__)
  34742. "adcs r5, r7\n\t"
  34743. #else
  34744. "adc r5, r7\n\t"
  34745. #endif
  34746. #ifdef WOLFSSL_KEIL
  34747. "adcs r3, r3, %[r]\n\t"
  34748. #elif defined(__clang__)
  34749. "adcs r3, %[r]\n\t"
  34750. #else
  34751. "adc r3, %[r]\n\t"
  34752. #endif
  34753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34754. "lsrs r6, %[a], #16\n\t"
  34755. #else
  34756. "lsr r6, %[a], #16\n\t"
  34757. #endif
  34758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34759. "lsrs r7, %[b], #16\n\t"
  34760. #else
  34761. "lsr r7, %[b], #16\n\t"
  34762. #endif
  34763. #ifdef WOLFSSL_KEIL
  34764. "muls r7, r6, r7\n\t"
  34765. #elif defined(__clang__)
  34766. "muls r7, r6\n\t"
  34767. #else
  34768. "mul r7, r6\n\t"
  34769. #endif
  34770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34771. "adds r5, r5, r7\n\t"
  34772. #else
  34773. "add r5, r5, r7\n\t"
  34774. #endif
  34775. #ifdef WOLFSSL_KEIL
  34776. "adcs r3, r3, %[r]\n\t"
  34777. #elif defined(__clang__)
  34778. "adcs r3, %[r]\n\t"
  34779. #else
  34780. "adc r3, %[r]\n\t"
  34781. #endif
  34782. "uxth r7, %[b]\n\t"
  34783. #ifdef WOLFSSL_KEIL
  34784. "muls r6, r7, r6\n\t"
  34785. #elif defined(__clang__)
  34786. "muls r6, r7\n\t"
  34787. #else
  34788. "mul r6, r7\n\t"
  34789. #endif
  34790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34791. "lsrs r7, r6, #16\n\t"
  34792. #else
  34793. "lsr r7, r6, #16\n\t"
  34794. #endif
  34795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34796. "lsls r6, r6, #16\n\t"
  34797. #else
  34798. "lsl r6, r6, #16\n\t"
  34799. #endif
  34800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34801. "adds r4, r4, r6\n\t"
  34802. #else
  34803. "add r4, r4, r6\n\t"
  34804. #endif
  34805. #ifdef WOLFSSL_KEIL
  34806. "adcs r5, r5, r7\n\t"
  34807. #elif defined(__clang__)
  34808. "adcs r5, r7\n\t"
  34809. #else
  34810. "adc r5, r7\n\t"
  34811. #endif
  34812. #ifdef WOLFSSL_KEIL
  34813. "adcs r3, r3, %[r]\n\t"
  34814. #elif defined(__clang__)
  34815. "adcs r3, %[r]\n\t"
  34816. #else
  34817. "adc r3, %[r]\n\t"
  34818. #endif
  34819. "# A[4] * B[3]\n\t"
  34820. "mov %[a], r9\n\t"
  34821. "mov %[b], r10\n\t"
  34822. "ldr %[a], [%[a], #16]\n\t"
  34823. "ldr %[b], [%[b], #12]\n\t"
  34824. "uxth r6, %[a]\n\t"
  34825. "uxth r7, %[b]\n\t"
  34826. #ifdef WOLFSSL_KEIL
  34827. "muls r7, r6, r7\n\t"
  34828. #elif defined(__clang__)
  34829. "muls r7, r6\n\t"
  34830. #else
  34831. "mul r7, r6\n\t"
  34832. #endif
  34833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34834. "adds r4, r4, r7\n\t"
  34835. #else
  34836. "add r4, r4, r7\n\t"
  34837. #endif
  34838. #ifdef WOLFSSL_KEIL
  34839. "adcs r5, r5, %[r]\n\t"
  34840. #elif defined(__clang__)
  34841. "adcs r5, %[r]\n\t"
  34842. #else
  34843. "adc r5, %[r]\n\t"
  34844. #endif
  34845. #ifdef WOLFSSL_KEIL
  34846. "adcs r3, r3, %[r]\n\t"
  34847. #elif defined(__clang__)
  34848. "adcs r3, %[r]\n\t"
  34849. #else
  34850. "adc r3, %[r]\n\t"
  34851. #endif
  34852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34853. "lsrs r7, %[b], #16\n\t"
  34854. #else
  34855. "lsr r7, %[b], #16\n\t"
  34856. #endif
  34857. #ifdef WOLFSSL_KEIL
  34858. "muls r6, r7, r6\n\t"
  34859. #elif defined(__clang__)
  34860. "muls r6, r7\n\t"
  34861. #else
  34862. "mul r6, r7\n\t"
  34863. #endif
  34864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34865. "lsrs r7, r6, #16\n\t"
  34866. #else
  34867. "lsr r7, r6, #16\n\t"
  34868. #endif
  34869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34870. "lsls r6, r6, #16\n\t"
  34871. #else
  34872. "lsl r6, r6, #16\n\t"
  34873. #endif
  34874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34875. "adds r4, r4, r6\n\t"
  34876. #else
  34877. "add r4, r4, r6\n\t"
  34878. #endif
  34879. #ifdef WOLFSSL_KEIL
  34880. "adcs r5, r5, r7\n\t"
  34881. #elif defined(__clang__)
  34882. "adcs r5, r7\n\t"
  34883. #else
  34884. "adc r5, r7\n\t"
  34885. #endif
  34886. #ifdef WOLFSSL_KEIL
  34887. "adcs r3, r3, %[r]\n\t"
  34888. #elif defined(__clang__)
  34889. "adcs r3, %[r]\n\t"
  34890. #else
  34891. "adc r3, %[r]\n\t"
  34892. #endif
  34893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34894. "lsrs r6, %[a], #16\n\t"
  34895. #else
  34896. "lsr r6, %[a], #16\n\t"
  34897. #endif
  34898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34899. "lsrs r7, %[b], #16\n\t"
  34900. #else
  34901. "lsr r7, %[b], #16\n\t"
  34902. #endif
  34903. #ifdef WOLFSSL_KEIL
  34904. "muls r7, r6, r7\n\t"
  34905. #elif defined(__clang__)
  34906. "muls r7, r6\n\t"
  34907. #else
  34908. "mul r7, r6\n\t"
  34909. #endif
  34910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34911. "adds r5, r5, r7\n\t"
  34912. #else
  34913. "add r5, r5, r7\n\t"
  34914. #endif
  34915. #ifdef WOLFSSL_KEIL
  34916. "adcs r3, r3, %[r]\n\t"
  34917. #elif defined(__clang__)
  34918. "adcs r3, %[r]\n\t"
  34919. #else
  34920. "adc r3, %[r]\n\t"
  34921. #endif
  34922. "uxth r7, %[b]\n\t"
  34923. #ifdef WOLFSSL_KEIL
  34924. "muls r6, r7, r6\n\t"
  34925. #elif defined(__clang__)
  34926. "muls r6, r7\n\t"
  34927. #else
  34928. "mul r6, r7\n\t"
  34929. #endif
  34930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34931. "lsrs r7, r6, #16\n\t"
  34932. #else
  34933. "lsr r7, r6, #16\n\t"
  34934. #endif
  34935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34936. "lsls r6, r6, #16\n\t"
  34937. #else
  34938. "lsl r6, r6, #16\n\t"
  34939. #endif
  34940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34941. "adds r4, r4, r6\n\t"
  34942. #else
  34943. "add r4, r4, r6\n\t"
  34944. #endif
  34945. #ifdef WOLFSSL_KEIL
  34946. "adcs r5, r5, r7\n\t"
  34947. #elif defined(__clang__)
  34948. "adcs r5, r7\n\t"
  34949. #else
  34950. "adc r5, r7\n\t"
  34951. #endif
  34952. #ifdef WOLFSSL_KEIL
  34953. "adcs r3, r3, %[r]\n\t"
  34954. #elif defined(__clang__)
  34955. "adcs r3, %[r]\n\t"
  34956. #else
  34957. "adc r3, %[r]\n\t"
  34958. #endif
  34959. "# A[5] * B[2]\n\t"
  34960. "mov %[a], r9\n\t"
  34961. "mov %[b], r10\n\t"
  34962. "ldr %[a], [%[a], #20]\n\t"
  34963. "ldr %[b], [%[b], #8]\n\t"
  34964. "uxth r6, %[a]\n\t"
  34965. "uxth r7, %[b]\n\t"
  34966. #ifdef WOLFSSL_KEIL
  34967. "muls r7, r6, r7\n\t"
  34968. #elif defined(__clang__)
  34969. "muls r7, r6\n\t"
  34970. #else
  34971. "mul r7, r6\n\t"
  34972. #endif
  34973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34974. "adds r4, r4, r7\n\t"
  34975. #else
  34976. "add r4, r4, r7\n\t"
  34977. #endif
  34978. #ifdef WOLFSSL_KEIL
  34979. "adcs r5, r5, %[r]\n\t"
  34980. #elif defined(__clang__)
  34981. "adcs r5, %[r]\n\t"
  34982. #else
  34983. "adc r5, %[r]\n\t"
  34984. #endif
  34985. #ifdef WOLFSSL_KEIL
  34986. "adcs r3, r3, %[r]\n\t"
  34987. #elif defined(__clang__)
  34988. "adcs r3, %[r]\n\t"
  34989. #else
  34990. "adc r3, %[r]\n\t"
  34991. #endif
  34992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  34993. "lsrs r7, %[b], #16\n\t"
  34994. #else
  34995. "lsr r7, %[b], #16\n\t"
  34996. #endif
  34997. #ifdef WOLFSSL_KEIL
  34998. "muls r6, r7, r6\n\t"
  34999. #elif defined(__clang__)
  35000. "muls r6, r7\n\t"
  35001. #else
  35002. "mul r6, r7\n\t"
  35003. #endif
  35004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35005. "lsrs r7, r6, #16\n\t"
  35006. #else
  35007. "lsr r7, r6, #16\n\t"
  35008. #endif
  35009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35010. "lsls r6, r6, #16\n\t"
  35011. #else
  35012. "lsl r6, r6, #16\n\t"
  35013. #endif
  35014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35015. "adds r4, r4, r6\n\t"
  35016. #else
  35017. "add r4, r4, r6\n\t"
  35018. #endif
  35019. #ifdef WOLFSSL_KEIL
  35020. "adcs r5, r5, r7\n\t"
  35021. #elif defined(__clang__)
  35022. "adcs r5, r7\n\t"
  35023. #else
  35024. "adc r5, r7\n\t"
  35025. #endif
  35026. #ifdef WOLFSSL_KEIL
  35027. "adcs r3, r3, %[r]\n\t"
  35028. #elif defined(__clang__)
  35029. "adcs r3, %[r]\n\t"
  35030. #else
  35031. "adc r3, %[r]\n\t"
  35032. #endif
  35033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35034. "lsrs r6, %[a], #16\n\t"
  35035. #else
  35036. "lsr r6, %[a], #16\n\t"
  35037. #endif
  35038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35039. "lsrs r7, %[b], #16\n\t"
  35040. #else
  35041. "lsr r7, %[b], #16\n\t"
  35042. #endif
  35043. #ifdef WOLFSSL_KEIL
  35044. "muls r7, r6, r7\n\t"
  35045. #elif defined(__clang__)
  35046. "muls r7, r6\n\t"
  35047. #else
  35048. "mul r7, r6\n\t"
  35049. #endif
  35050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35051. "adds r5, r5, r7\n\t"
  35052. #else
  35053. "add r5, r5, r7\n\t"
  35054. #endif
  35055. #ifdef WOLFSSL_KEIL
  35056. "adcs r3, r3, %[r]\n\t"
  35057. #elif defined(__clang__)
  35058. "adcs r3, %[r]\n\t"
  35059. #else
  35060. "adc r3, %[r]\n\t"
  35061. #endif
  35062. "uxth r7, %[b]\n\t"
  35063. #ifdef WOLFSSL_KEIL
  35064. "muls r6, r7, r6\n\t"
  35065. #elif defined(__clang__)
  35066. "muls r6, r7\n\t"
  35067. #else
  35068. "mul r6, r7\n\t"
  35069. #endif
  35070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35071. "lsrs r7, r6, #16\n\t"
  35072. #else
  35073. "lsr r7, r6, #16\n\t"
  35074. #endif
  35075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35076. "lsls r6, r6, #16\n\t"
  35077. #else
  35078. "lsl r6, r6, #16\n\t"
  35079. #endif
  35080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35081. "adds r4, r4, r6\n\t"
  35082. #else
  35083. "add r4, r4, r6\n\t"
  35084. #endif
  35085. #ifdef WOLFSSL_KEIL
  35086. "adcs r5, r5, r7\n\t"
  35087. #elif defined(__clang__)
  35088. "adcs r5, r7\n\t"
  35089. #else
  35090. "adc r5, r7\n\t"
  35091. #endif
  35092. #ifdef WOLFSSL_KEIL
  35093. "adcs r3, r3, %[r]\n\t"
  35094. #elif defined(__clang__)
  35095. "adcs r3, %[r]\n\t"
  35096. #else
  35097. "adc r3, %[r]\n\t"
  35098. #endif
  35099. "# A[6] * B[1]\n\t"
  35100. "mov %[a], r9\n\t"
  35101. "mov %[b], r10\n\t"
  35102. "ldr %[a], [%[a], #24]\n\t"
  35103. "ldr %[b], [%[b], #4]\n\t"
  35104. "uxth r6, %[a]\n\t"
  35105. "uxth r7, %[b]\n\t"
  35106. #ifdef WOLFSSL_KEIL
  35107. "muls r7, r6, r7\n\t"
  35108. #elif defined(__clang__)
  35109. "muls r7, r6\n\t"
  35110. #else
  35111. "mul r7, r6\n\t"
  35112. #endif
  35113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35114. "adds r4, r4, r7\n\t"
  35115. #else
  35116. "add r4, r4, r7\n\t"
  35117. #endif
  35118. #ifdef WOLFSSL_KEIL
  35119. "adcs r5, r5, %[r]\n\t"
  35120. #elif defined(__clang__)
  35121. "adcs r5, %[r]\n\t"
  35122. #else
  35123. "adc r5, %[r]\n\t"
  35124. #endif
  35125. #ifdef WOLFSSL_KEIL
  35126. "adcs r3, r3, %[r]\n\t"
  35127. #elif defined(__clang__)
  35128. "adcs r3, %[r]\n\t"
  35129. #else
  35130. "adc r3, %[r]\n\t"
  35131. #endif
  35132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35133. "lsrs r7, %[b], #16\n\t"
  35134. #else
  35135. "lsr r7, %[b], #16\n\t"
  35136. #endif
  35137. #ifdef WOLFSSL_KEIL
  35138. "muls r6, r7, r6\n\t"
  35139. #elif defined(__clang__)
  35140. "muls r6, r7\n\t"
  35141. #else
  35142. "mul r6, r7\n\t"
  35143. #endif
  35144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35145. "lsrs r7, r6, #16\n\t"
  35146. #else
  35147. "lsr r7, r6, #16\n\t"
  35148. #endif
  35149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35150. "lsls r6, r6, #16\n\t"
  35151. #else
  35152. "lsl r6, r6, #16\n\t"
  35153. #endif
  35154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35155. "adds r4, r4, r6\n\t"
  35156. #else
  35157. "add r4, r4, r6\n\t"
  35158. #endif
  35159. #ifdef WOLFSSL_KEIL
  35160. "adcs r5, r5, r7\n\t"
  35161. #elif defined(__clang__)
  35162. "adcs r5, r7\n\t"
  35163. #else
  35164. "adc r5, r7\n\t"
  35165. #endif
  35166. #ifdef WOLFSSL_KEIL
  35167. "adcs r3, r3, %[r]\n\t"
  35168. #elif defined(__clang__)
  35169. "adcs r3, %[r]\n\t"
  35170. #else
  35171. "adc r3, %[r]\n\t"
  35172. #endif
  35173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35174. "lsrs r6, %[a], #16\n\t"
  35175. #else
  35176. "lsr r6, %[a], #16\n\t"
  35177. #endif
  35178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35179. "lsrs r7, %[b], #16\n\t"
  35180. #else
  35181. "lsr r7, %[b], #16\n\t"
  35182. #endif
  35183. #ifdef WOLFSSL_KEIL
  35184. "muls r7, r6, r7\n\t"
  35185. #elif defined(__clang__)
  35186. "muls r7, r6\n\t"
  35187. #else
  35188. "mul r7, r6\n\t"
  35189. #endif
  35190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35191. "adds r5, r5, r7\n\t"
  35192. #else
  35193. "add r5, r5, r7\n\t"
  35194. #endif
  35195. #ifdef WOLFSSL_KEIL
  35196. "adcs r3, r3, %[r]\n\t"
  35197. #elif defined(__clang__)
  35198. "adcs r3, %[r]\n\t"
  35199. #else
  35200. "adc r3, %[r]\n\t"
  35201. #endif
  35202. "uxth r7, %[b]\n\t"
  35203. #ifdef WOLFSSL_KEIL
  35204. "muls r6, r7, r6\n\t"
  35205. #elif defined(__clang__)
  35206. "muls r6, r7\n\t"
  35207. #else
  35208. "mul r6, r7\n\t"
  35209. #endif
  35210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35211. "lsrs r7, r6, #16\n\t"
  35212. #else
  35213. "lsr r7, r6, #16\n\t"
  35214. #endif
  35215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35216. "lsls r6, r6, #16\n\t"
  35217. #else
  35218. "lsl r6, r6, #16\n\t"
  35219. #endif
  35220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35221. "adds r4, r4, r6\n\t"
  35222. #else
  35223. "add r4, r4, r6\n\t"
  35224. #endif
  35225. #ifdef WOLFSSL_KEIL
  35226. "adcs r5, r5, r7\n\t"
  35227. #elif defined(__clang__)
  35228. "adcs r5, r7\n\t"
  35229. #else
  35230. "adc r5, r7\n\t"
  35231. #endif
  35232. #ifdef WOLFSSL_KEIL
  35233. "adcs r3, r3, %[r]\n\t"
  35234. #elif defined(__clang__)
  35235. "adcs r3, %[r]\n\t"
  35236. #else
  35237. "adc r3, %[r]\n\t"
  35238. #endif
  35239. "# A[7] * B[0]\n\t"
  35240. "mov %[a], r9\n\t"
  35241. "mov %[b], r10\n\t"
  35242. "ldr %[a], [%[a], #28]\n\t"
  35243. "ldr %[b], [%[b]]\n\t"
  35244. "uxth r6, %[a]\n\t"
  35245. "uxth r7, %[b]\n\t"
  35246. #ifdef WOLFSSL_KEIL
  35247. "muls r7, r6, r7\n\t"
  35248. #elif defined(__clang__)
  35249. "muls r7, r6\n\t"
  35250. #else
  35251. "mul r7, r6\n\t"
  35252. #endif
  35253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35254. "adds r4, r4, r7\n\t"
  35255. #else
  35256. "add r4, r4, r7\n\t"
  35257. #endif
  35258. #ifdef WOLFSSL_KEIL
  35259. "adcs r5, r5, %[r]\n\t"
  35260. #elif defined(__clang__)
  35261. "adcs r5, %[r]\n\t"
  35262. #else
  35263. "adc r5, %[r]\n\t"
  35264. #endif
  35265. #ifdef WOLFSSL_KEIL
  35266. "adcs r3, r3, %[r]\n\t"
  35267. #elif defined(__clang__)
  35268. "adcs r3, %[r]\n\t"
  35269. #else
  35270. "adc r3, %[r]\n\t"
  35271. #endif
  35272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35273. "lsrs r7, %[b], #16\n\t"
  35274. #else
  35275. "lsr r7, %[b], #16\n\t"
  35276. #endif
  35277. #ifdef WOLFSSL_KEIL
  35278. "muls r6, r7, r6\n\t"
  35279. #elif defined(__clang__)
  35280. "muls r6, r7\n\t"
  35281. #else
  35282. "mul r6, r7\n\t"
  35283. #endif
  35284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35285. "lsrs r7, r6, #16\n\t"
  35286. #else
  35287. "lsr r7, r6, #16\n\t"
  35288. #endif
  35289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35290. "lsls r6, r6, #16\n\t"
  35291. #else
  35292. "lsl r6, r6, #16\n\t"
  35293. #endif
  35294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35295. "adds r4, r4, r6\n\t"
  35296. #else
  35297. "add r4, r4, r6\n\t"
  35298. #endif
  35299. #ifdef WOLFSSL_KEIL
  35300. "adcs r5, r5, r7\n\t"
  35301. #elif defined(__clang__)
  35302. "adcs r5, r7\n\t"
  35303. #else
  35304. "adc r5, r7\n\t"
  35305. #endif
  35306. #ifdef WOLFSSL_KEIL
  35307. "adcs r3, r3, %[r]\n\t"
  35308. #elif defined(__clang__)
  35309. "adcs r3, %[r]\n\t"
  35310. #else
  35311. "adc r3, %[r]\n\t"
  35312. #endif
  35313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35314. "lsrs r6, %[a], #16\n\t"
  35315. #else
  35316. "lsr r6, %[a], #16\n\t"
  35317. #endif
  35318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35319. "lsrs r7, %[b], #16\n\t"
  35320. #else
  35321. "lsr r7, %[b], #16\n\t"
  35322. #endif
  35323. #ifdef WOLFSSL_KEIL
  35324. "muls r7, r6, r7\n\t"
  35325. #elif defined(__clang__)
  35326. "muls r7, r6\n\t"
  35327. #else
  35328. "mul r7, r6\n\t"
  35329. #endif
  35330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35331. "adds r5, r5, r7\n\t"
  35332. #else
  35333. "add r5, r5, r7\n\t"
  35334. #endif
  35335. #ifdef WOLFSSL_KEIL
  35336. "adcs r3, r3, %[r]\n\t"
  35337. #elif defined(__clang__)
  35338. "adcs r3, %[r]\n\t"
  35339. #else
  35340. "adc r3, %[r]\n\t"
  35341. #endif
  35342. "uxth r7, %[b]\n\t"
  35343. #ifdef WOLFSSL_KEIL
  35344. "muls r6, r7, r6\n\t"
  35345. #elif defined(__clang__)
  35346. "muls r6, r7\n\t"
  35347. #else
  35348. "mul r6, r7\n\t"
  35349. #endif
  35350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35351. "lsrs r7, r6, #16\n\t"
  35352. #else
  35353. "lsr r7, r6, #16\n\t"
  35354. #endif
  35355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35356. "lsls r6, r6, #16\n\t"
  35357. #else
  35358. "lsl r6, r6, #16\n\t"
  35359. #endif
  35360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35361. "adds r4, r4, r6\n\t"
  35362. #else
  35363. "add r4, r4, r6\n\t"
  35364. #endif
  35365. #ifdef WOLFSSL_KEIL
  35366. "adcs r5, r5, r7\n\t"
  35367. #elif defined(__clang__)
  35368. "adcs r5, r7\n\t"
  35369. #else
  35370. "adc r5, r7\n\t"
  35371. #endif
  35372. #ifdef WOLFSSL_KEIL
  35373. "adcs r3, r3, %[r]\n\t"
  35374. #elif defined(__clang__)
  35375. "adcs r3, %[r]\n\t"
  35376. #else
  35377. "adc r3, %[r]\n\t"
  35378. #endif
  35379. "str r4, [sp, #28]\n\t"
  35380. "# A[8] * B[0]\n\t"
  35381. "movs r4, #0\n\t"
  35382. "mov %[a], r9\n\t"
  35383. "mov %[b], r10\n\t"
  35384. "ldr %[a], [%[a], #32]\n\t"
  35385. "ldr %[b], [%[b]]\n\t"
  35386. "uxth r6, %[a]\n\t"
  35387. "uxth r7, %[b]\n\t"
  35388. #ifdef WOLFSSL_KEIL
  35389. "muls r7, r6, r7\n\t"
  35390. #elif defined(__clang__)
  35391. "muls r7, r6\n\t"
  35392. #else
  35393. "mul r7, r6\n\t"
  35394. #endif
  35395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35396. "adds r5, r5, r7\n\t"
  35397. #else
  35398. "add r5, r5, r7\n\t"
  35399. #endif
  35400. #ifdef WOLFSSL_KEIL
  35401. "adcs r3, r3, %[r]\n\t"
  35402. #elif defined(__clang__)
  35403. "adcs r3, %[r]\n\t"
  35404. #else
  35405. "adc r3, %[r]\n\t"
  35406. #endif
  35407. #ifdef WOLFSSL_KEIL
  35408. "adcs r4, r4, %[r]\n\t"
  35409. #elif defined(__clang__)
  35410. "adcs r4, %[r]\n\t"
  35411. #else
  35412. "adc r4, %[r]\n\t"
  35413. #endif
  35414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35415. "lsrs r7, %[b], #16\n\t"
  35416. #else
  35417. "lsr r7, %[b], #16\n\t"
  35418. #endif
  35419. #ifdef WOLFSSL_KEIL
  35420. "muls r6, r7, r6\n\t"
  35421. #elif defined(__clang__)
  35422. "muls r6, r7\n\t"
  35423. #else
  35424. "mul r6, r7\n\t"
  35425. #endif
  35426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35427. "lsrs r7, r6, #16\n\t"
  35428. #else
  35429. "lsr r7, r6, #16\n\t"
  35430. #endif
  35431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35432. "lsls r6, r6, #16\n\t"
  35433. #else
  35434. "lsl r6, r6, #16\n\t"
  35435. #endif
  35436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35437. "adds r5, r5, r6\n\t"
  35438. #else
  35439. "add r5, r5, r6\n\t"
  35440. #endif
  35441. #ifdef WOLFSSL_KEIL
  35442. "adcs r3, r3, r7\n\t"
  35443. #elif defined(__clang__)
  35444. "adcs r3, r7\n\t"
  35445. #else
  35446. "adc r3, r7\n\t"
  35447. #endif
  35448. #ifdef WOLFSSL_KEIL
  35449. "adcs r4, r4, %[r]\n\t"
  35450. #elif defined(__clang__)
  35451. "adcs r4, %[r]\n\t"
  35452. #else
  35453. "adc r4, %[r]\n\t"
  35454. #endif
  35455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35456. "lsrs r6, %[a], #16\n\t"
  35457. #else
  35458. "lsr r6, %[a], #16\n\t"
  35459. #endif
  35460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35461. "lsrs r7, %[b], #16\n\t"
  35462. #else
  35463. "lsr r7, %[b], #16\n\t"
  35464. #endif
  35465. #ifdef WOLFSSL_KEIL
  35466. "muls r7, r6, r7\n\t"
  35467. #elif defined(__clang__)
  35468. "muls r7, r6\n\t"
  35469. #else
  35470. "mul r7, r6\n\t"
  35471. #endif
  35472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35473. "adds r3, r3, r7\n\t"
  35474. #else
  35475. "add r3, r3, r7\n\t"
  35476. #endif
  35477. #ifdef WOLFSSL_KEIL
  35478. "adcs r4, r4, %[r]\n\t"
  35479. #elif defined(__clang__)
  35480. "adcs r4, %[r]\n\t"
  35481. #else
  35482. "adc r4, %[r]\n\t"
  35483. #endif
  35484. "uxth r7, %[b]\n\t"
  35485. #ifdef WOLFSSL_KEIL
  35486. "muls r6, r7, r6\n\t"
  35487. #elif defined(__clang__)
  35488. "muls r6, r7\n\t"
  35489. #else
  35490. "mul r6, r7\n\t"
  35491. #endif
  35492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35493. "lsrs r7, r6, #16\n\t"
  35494. #else
  35495. "lsr r7, r6, #16\n\t"
  35496. #endif
  35497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35498. "lsls r6, r6, #16\n\t"
  35499. #else
  35500. "lsl r6, r6, #16\n\t"
  35501. #endif
  35502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35503. "adds r5, r5, r6\n\t"
  35504. #else
  35505. "add r5, r5, r6\n\t"
  35506. #endif
  35507. #ifdef WOLFSSL_KEIL
  35508. "adcs r3, r3, r7\n\t"
  35509. #elif defined(__clang__)
  35510. "adcs r3, r7\n\t"
  35511. #else
  35512. "adc r3, r7\n\t"
  35513. #endif
  35514. #ifdef WOLFSSL_KEIL
  35515. "adcs r4, r4, %[r]\n\t"
  35516. #elif defined(__clang__)
  35517. "adcs r4, %[r]\n\t"
  35518. #else
  35519. "adc r4, %[r]\n\t"
  35520. #endif
  35521. "# A[7] * B[1]\n\t"
  35522. "mov %[a], r9\n\t"
  35523. "mov %[b], r10\n\t"
  35524. "ldr %[a], [%[a], #28]\n\t"
  35525. "ldr %[b], [%[b], #4]\n\t"
  35526. "uxth r6, %[a]\n\t"
  35527. "uxth r7, %[b]\n\t"
  35528. #ifdef WOLFSSL_KEIL
  35529. "muls r7, r6, r7\n\t"
  35530. #elif defined(__clang__)
  35531. "muls r7, r6\n\t"
  35532. #else
  35533. "mul r7, r6\n\t"
  35534. #endif
  35535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35536. "adds r5, r5, r7\n\t"
  35537. #else
  35538. "add r5, r5, r7\n\t"
  35539. #endif
  35540. #ifdef WOLFSSL_KEIL
  35541. "adcs r3, r3, %[r]\n\t"
  35542. #elif defined(__clang__)
  35543. "adcs r3, %[r]\n\t"
  35544. #else
  35545. "adc r3, %[r]\n\t"
  35546. #endif
  35547. #ifdef WOLFSSL_KEIL
  35548. "adcs r4, r4, %[r]\n\t"
  35549. #elif defined(__clang__)
  35550. "adcs r4, %[r]\n\t"
  35551. #else
  35552. "adc r4, %[r]\n\t"
  35553. #endif
  35554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35555. "lsrs r7, %[b], #16\n\t"
  35556. #else
  35557. "lsr r7, %[b], #16\n\t"
  35558. #endif
  35559. #ifdef WOLFSSL_KEIL
  35560. "muls r6, r7, r6\n\t"
  35561. #elif defined(__clang__)
  35562. "muls r6, r7\n\t"
  35563. #else
  35564. "mul r6, r7\n\t"
  35565. #endif
  35566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35567. "lsrs r7, r6, #16\n\t"
  35568. #else
  35569. "lsr r7, r6, #16\n\t"
  35570. #endif
  35571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35572. "lsls r6, r6, #16\n\t"
  35573. #else
  35574. "lsl r6, r6, #16\n\t"
  35575. #endif
  35576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35577. "adds r5, r5, r6\n\t"
  35578. #else
  35579. "add r5, r5, r6\n\t"
  35580. #endif
  35581. #ifdef WOLFSSL_KEIL
  35582. "adcs r3, r3, r7\n\t"
  35583. #elif defined(__clang__)
  35584. "adcs r3, r7\n\t"
  35585. #else
  35586. "adc r3, r7\n\t"
  35587. #endif
  35588. #ifdef WOLFSSL_KEIL
  35589. "adcs r4, r4, %[r]\n\t"
  35590. #elif defined(__clang__)
  35591. "adcs r4, %[r]\n\t"
  35592. #else
  35593. "adc r4, %[r]\n\t"
  35594. #endif
  35595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35596. "lsrs r6, %[a], #16\n\t"
  35597. #else
  35598. "lsr r6, %[a], #16\n\t"
  35599. #endif
  35600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35601. "lsrs r7, %[b], #16\n\t"
  35602. #else
  35603. "lsr r7, %[b], #16\n\t"
  35604. #endif
  35605. #ifdef WOLFSSL_KEIL
  35606. "muls r7, r6, r7\n\t"
  35607. #elif defined(__clang__)
  35608. "muls r7, r6\n\t"
  35609. #else
  35610. "mul r7, r6\n\t"
  35611. #endif
  35612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35613. "adds r3, r3, r7\n\t"
  35614. #else
  35615. "add r3, r3, r7\n\t"
  35616. #endif
  35617. #ifdef WOLFSSL_KEIL
  35618. "adcs r4, r4, %[r]\n\t"
  35619. #elif defined(__clang__)
  35620. "adcs r4, %[r]\n\t"
  35621. #else
  35622. "adc r4, %[r]\n\t"
  35623. #endif
  35624. "uxth r7, %[b]\n\t"
  35625. #ifdef WOLFSSL_KEIL
  35626. "muls r6, r7, r6\n\t"
  35627. #elif defined(__clang__)
  35628. "muls r6, r7\n\t"
  35629. #else
  35630. "mul r6, r7\n\t"
  35631. #endif
  35632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35633. "lsrs r7, r6, #16\n\t"
  35634. #else
  35635. "lsr r7, r6, #16\n\t"
  35636. #endif
  35637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35638. "lsls r6, r6, #16\n\t"
  35639. #else
  35640. "lsl r6, r6, #16\n\t"
  35641. #endif
  35642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35643. "adds r5, r5, r6\n\t"
  35644. #else
  35645. "add r5, r5, r6\n\t"
  35646. #endif
  35647. #ifdef WOLFSSL_KEIL
  35648. "adcs r3, r3, r7\n\t"
  35649. #elif defined(__clang__)
  35650. "adcs r3, r7\n\t"
  35651. #else
  35652. "adc r3, r7\n\t"
  35653. #endif
  35654. #ifdef WOLFSSL_KEIL
  35655. "adcs r4, r4, %[r]\n\t"
  35656. #elif defined(__clang__)
  35657. "adcs r4, %[r]\n\t"
  35658. #else
  35659. "adc r4, %[r]\n\t"
  35660. #endif
  35661. "# A[6] * B[2]\n\t"
  35662. "mov %[a], r9\n\t"
  35663. "mov %[b], r10\n\t"
  35664. "ldr %[a], [%[a], #24]\n\t"
  35665. "ldr %[b], [%[b], #8]\n\t"
  35666. "uxth r6, %[a]\n\t"
  35667. "uxth r7, %[b]\n\t"
  35668. #ifdef WOLFSSL_KEIL
  35669. "muls r7, r6, r7\n\t"
  35670. #elif defined(__clang__)
  35671. "muls r7, r6\n\t"
  35672. #else
  35673. "mul r7, r6\n\t"
  35674. #endif
  35675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35676. "adds r5, r5, r7\n\t"
  35677. #else
  35678. "add r5, r5, r7\n\t"
  35679. #endif
  35680. #ifdef WOLFSSL_KEIL
  35681. "adcs r3, r3, %[r]\n\t"
  35682. #elif defined(__clang__)
  35683. "adcs r3, %[r]\n\t"
  35684. #else
  35685. "adc r3, %[r]\n\t"
  35686. #endif
  35687. #ifdef WOLFSSL_KEIL
  35688. "adcs r4, r4, %[r]\n\t"
  35689. #elif defined(__clang__)
  35690. "adcs r4, %[r]\n\t"
  35691. #else
  35692. "adc r4, %[r]\n\t"
  35693. #endif
  35694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35695. "lsrs r7, %[b], #16\n\t"
  35696. #else
  35697. "lsr r7, %[b], #16\n\t"
  35698. #endif
  35699. #ifdef WOLFSSL_KEIL
  35700. "muls r6, r7, r6\n\t"
  35701. #elif defined(__clang__)
  35702. "muls r6, r7\n\t"
  35703. #else
  35704. "mul r6, r7\n\t"
  35705. #endif
  35706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35707. "lsrs r7, r6, #16\n\t"
  35708. #else
  35709. "lsr r7, r6, #16\n\t"
  35710. #endif
  35711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35712. "lsls r6, r6, #16\n\t"
  35713. #else
  35714. "lsl r6, r6, #16\n\t"
  35715. #endif
  35716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35717. "adds r5, r5, r6\n\t"
  35718. #else
  35719. "add r5, r5, r6\n\t"
  35720. #endif
  35721. #ifdef WOLFSSL_KEIL
  35722. "adcs r3, r3, r7\n\t"
  35723. #elif defined(__clang__)
  35724. "adcs r3, r7\n\t"
  35725. #else
  35726. "adc r3, r7\n\t"
  35727. #endif
  35728. #ifdef WOLFSSL_KEIL
  35729. "adcs r4, r4, %[r]\n\t"
  35730. #elif defined(__clang__)
  35731. "adcs r4, %[r]\n\t"
  35732. #else
  35733. "adc r4, %[r]\n\t"
  35734. #endif
  35735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35736. "lsrs r6, %[a], #16\n\t"
  35737. #else
  35738. "lsr r6, %[a], #16\n\t"
  35739. #endif
  35740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35741. "lsrs r7, %[b], #16\n\t"
  35742. #else
  35743. "lsr r7, %[b], #16\n\t"
  35744. #endif
  35745. #ifdef WOLFSSL_KEIL
  35746. "muls r7, r6, r7\n\t"
  35747. #elif defined(__clang__)
  35748. "muls r7, r6\n\t"
  35749. #else
  35750. "mul r7, r6\n\t"
  35751. #endif
  35752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35753. "adds r3, r3, r7\n\t"
  35754. #else
  35755. "add r3, r3, r7\n\t"
  35756. #endif
  35757. #ifdef WOLFSSL_KEIL
  35758. "adcs r4, r4, %[r]\n\t"
  35759. #elif defined(__clang__)
  35760. "adcs r4, %[r]\n\t"
  35761. #else
  35762. "adc r4, %[r]\n\t"
  35763. #endif
  35764. "uxth r7, %[b]\n\t"
  35765. #ifdef WOLFSSL_KEIL
  35766. "muls r6, r7, r6\n\t"
  35767. #elif defined(__clang__)
  35768. "muls r6, r7\n\t"
  35769. #else
  35770. "mul r6, r7\n\t"
  35771. #endif
  35772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35773. "lsrs r7, r6, #16\n\t"
  35774. #else
  35775. "lsr r7, r6, #16\n\t"
  35776. #endif
  35777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35778. "lsls r6, r6, #16\n\t"
  35779. #else
  35780. "lsl r6, r6, #16\n\t"
  35781. #endif
  35782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35783. "adds r5, r5, r6\n\t"
  35784. #else
  35785. "add r5, r5, r6\n\t"
  35786. #endif
  35787. #ifdef WOLFSSL_KEIL
  35788. "adcs r3, r3, r7\n\t"
  35789. #elif defined(__clang__)
  35790. "adcs r3, r7\n\t"
  35791. #else
  35792. "adc r3, r7\n\t"
  35793. #endif
  35794. #ifdef WOLFSSL_KEIL
  35795. "adcs r4, r4, %[r]\n\t"
  35796. #elif defined(__clang__)
  35797. "adcs r4, %[r]\n\t"
  35798. #else
  35799. "adc r4, %[r]\n\t"
  35800. #endif
  35801. "# A[5] * B[3]\n\t"
  35802. "mov %[a], r9\n\t"
  35803. "mov %[b], r10\n\t"
  35804. "ldr %[a], [%[a], #20]\n\t"
  35805. "ldr %[b], [%[b], #12]\n\t"
  35806. "uxth r6, %[a]\n\t"
  35807. "uxth r7, %[b]\n\t"
  35808. #ifdef WOLFSSL_KEIL
  35809. "muls r7, r6, r7\n\t"
  35810. #elif defined(__clang__)
  35811. "muls r7, r6\n\t"
  35812. #else
  35813. "mul r7, r6\n\t"
  35814. #endif
  35815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35816. "adds r5, r5, r7\n\t"
  35817. #else
  35818. "add r5, r5, r7\n\t"
  35819. #endif
  35820. #ifdef WOLFSSL_KEIL
  35821. "adcs r3, r3, %[r]\n\t"
  35822. #elif defined(__clang__)
  35823. "adcs r3, %[r]\n\t"
  35824. #else
  35825. "adc r3, %[r]\n\t"
  35826. #endif
  35827. #ifdef WOLFSSL_KEIL
  35828. "adcs r4, r4, %[r]\n\t"
  35829. #elif defined(__clang__)
  35830. "adcs r4, %[r]\n\t"
  35831. #else
  35832. "adc r4, %[r]\n\t"
  35833. #endif
  35834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35835. "lsrs r7, %[b], #16\n\t"
  35836. #else
  35837. "lsr r7, %[b], #16\n\t"
  35838. #endif
  35839. #ifdef WOLFSSL_KEIL
  35840. "muls r6, r7, r6\n\t"
  35841. #elif defined(__clang__)
  35842. "muls r6, r7\n\t"
  35843. #else
  35844. "mul r6, r7\n\t"
  35845. #endif
  35846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35847. "lsrs r7, r6, #16\n\t"
  35848. #else
  35849. "lsr r7, r6, #16\n\t"
  35850. #endif
  35851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35852. "lsls r6, r6, #16\n\t"
  35853. #else
  35854. "lsl r6, r6, #16\n\t"
  35855. #endif
  35856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35857. "adds r5, r5, r6\n\t"
  35858. #else
  35859. "add r5, r5, r6\n\t"
  35860. #endif
  35861. #ifdef WOLFSSL_KEIL
  35862. "adcs r3, r3, r7\n\t"
  35863. #elif defined(__clang__)
  35864. "adcs r3, r7\n\t"
  35865. #else
  35866. "adc r3, r7\n\t"
  35867. #endif
  35868. #ifdef WOLFSSL_KEIL
  35869. "adcs r4, r4, %[r]\n\t"
  35870. #elif defined(__clang__)
  35871. "adcs r4, %[r]\n\t"
  35872. #else
  35873. "adc r4, %[r]\n\t"
  35874. #endif
  35875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35876. "lsrs r6, %[a], #16\n\t"
  35877. #else
  35878. "lsr r6, %[a], #16\n\t"
  35879. #endif
  35880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35881. "lsrs r7, %[b], #16\n\t"
  35882. #else
  35883. "lsr r7, %[b], #16\n\t"
  35884. #endif
  35885. #ifdef WOLFSSL_KEIL
  35886. "muls r7, r6, r7\n\t"
  35887. #elif defined(__clang__)
  35888. "muls r7, r6\n\t"
  35889. #else
  35890. "mul r7, r6\n\t"
  35891. #endif
  35892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35893. "adds r3, r3, r7\n\t"
  35894. #else
  35895. "add r3, r3, r7\n\t"
  35896. #endif
  35897. #ifdef WOLFSSL_KEIL
  35898. "adcs r4, r4, %[r]\n\t"
  35899. #elif defined(__clang__)
  35900. "adcs r4, %[r]\n\t"
  35901. #else
  35902. "adc r4, %[r]\n\t"
  35903. #endif
  35904. "uxth r7, %[b]\n\t"
  35905. #ifdef WOLFSSL_KEIL
  35906. "muls r6, r7, r6\n\t"
  35907. #elif defined(__clang__)
  35908. "muls r6, r7\n\t"
  35909. #else
  35910. "mul r6, r7\n\t"
  35911. #endif
  35912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35913. "lsrs r7, r6, #16\n\t"
  35914. #else
  35915. "lsr r7, r6, #16\n\t"
  35916. #endif
  35917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35918. "lsls r6, r6, #16\n\t"
  35919. #else
  35920. "lsl r6, r6, #16\n\t"
  35921. #endif
  35922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35923. "adds r5, r5, r6\n\t"
  35924. #else
  35925. "add r5, r5, r6\n\t"
  35926. #endif
  35927. #ifdef WOLFSSL_KEIL
  35928. "adcs r3, r3, r7\n\t"
  35929. #elif defined(__clang__)
  35930. "adcs r3, r7\n\t"
  35931. #else
  35932. "adc r3, r7\n\t"
  35933. #endif
  35934. #ifdef WOLFSSL_KEIL
  35935. "adcs r4, r4, %[r]\n\t"
  35936. #elif defined(__clang__)
  35937. "adcs r4, %[r]\n\t"
  35938. #else
  35939. "adc r4, %[r]\n\t"
  35940. #endif
  35941. "# A[4] * B[4]\n\t"
  35942. "mov %[a], r9\n\t"
  35943. "mov %[b], r10\n\t"
  35944. "ldr %[a], [%[a], #16]\n\t"
  35945. "ldr %[b], [%[b], #16]\n\t"
  35946. "uxth r6, %[a]\n\t"
  35947. "uxth r7, %[b]\n\t"
  35948. #ifdef WOLFSSL_KEIL
  35949. "muls r7, r6, r7\n\t"
  35950. #elif defined(__clang__)
  35951. "muls r7, r6\n\t"
  35952. #else
  35953. "mul r7, r6\n\t"
  35954. #endif
  35955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35956. "adds r5, r5, r7\n\t"
  35957. #else
  35958. "add r5, r5, r7\n\t"
  35959. #endif
  35960. #ifdef WOLFSSL_KEIL
  35961. "adcs r3, r3, %[r]\n\t"
  35962. #elif defined(__clang__)
  35963. "adcs r3, %[r]\n\t"
  35964. #else
  35965. "adc r3, %[r]\n\t"
  35966. #endif
  35967. #ifdef WOLFSSL_KEIL
  35968. "adcs r4, r4, %[r]\n\t"
  35969. #elif defined(__clang__)
  35970. "adcs r4, %[r]\n\t"
  35971. #else
  35972. "adc r4, %[r]\n\t"
  35973. #endif
  35974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35975. "lsrs r7, %[b], #16\n\t"
  35976. #else
  35977. "lsr r7, %[b], #16\n\t"
  35978. #endif
  35979. #ifdef WOLFSSL_KEIL
  35980. "muls r6, r7, r6\n\t"
  35981. #elif defined(__clang__)
  35982. "muls r6, r7\n\t"
  35983. #else
  35984. "mul r6, r7\n\t"
  35985. #endif
  35986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35987. "lsrs r7, r6, #16\n\t"
  35988. #else
  35989. "lsr r7, r6, #16\n\t"
  35990. #endif
  35991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35992. "lsls r6, r6, #16\n\t"
  35993. #else
  35994. "lsl r6, r6, #16\n\t"
  35995. #endif
  35996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  35997. "adds r5, r5, r6\n\t"
  35998. #else
  35999. "add r5, r5, r6\n\t"
  36000. #endif
  36001. #ifdef WOLFSSL_KEIL
  36002. "adcs r3, r3, r7\n\t"
  36003. #elif defined(__clang__)
  36004. "adcs r3, r7\n\t"
  36005. #else
  36006. "adc r3, r7\n\t"
  36007. #endif
  36008. #ifdef WOLFSSL_KEIL
  36009. "adcs r4, r4, %[r]\n\t"
  36010. #elif defined(__clang__)
  36011. "adcs r4, %[r]\n\t"
  36012. #else
  36013. "adc r4, %[r]\n\t"
  36014. #endif
  36015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36016. "lsrs r6, %[a], #16\n\t"
  36017. #else
  36018. "lsr r6, %[a], #16\n\t"
  36019. #endif
  36020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36021. "lsrs r7, %[b], #16\n\t"
  36022. #else
  36023. "lsr r7, %[b], #16\n\t"
  36024. #endif
  36025. #ifdef WOLFSSL_KEIL
  36026. "muls r7, r6, r7\n\t"
  36027. #elif defined(__clang__)
  36028. "muls r7, r6\n\t"
  36029. #else
  36030. "mul r7, r6\n\t"
  36031. #endif
  36032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36033. "adds r3, r3, r7\n\t"
  36034. #else
  36035. "add r3, r3, r7\n\t"
  36036. #endif
  36037. #ifdef WOLFSSL_KEIL
  36038. "adcs r4, r4, %[r]\n\t"
  36039. #elif defined(__clang__)
  36040. "adcs r4, %[r]\n\t"
  36041. #else
  36042. "adc r4, %[r]\n\t"
  36043. #endif
  36044. "uxth r7, %[b]\n\t"
  36045. #ifdef WOLFSSL_KEIL
  36046. "muls r6, r7, r6\n\t"
  36047. #elif defined(__clang__)
  36048. "muls r6, r7\n\t"
  36049. #else
  36050. "mul r6, r7\n\t"
  36051. #endif
  36052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36053. "lsrs r7, r6, #16\n\t"
  36054. #else
  36055. "lsr r7, r6, #16\n\t"
  36056. #endif
  36057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36058. "lsls r6, r6, #16\n\t"
  36059. #else
  36060. "lsl r6, r6, #16\n\t"
  36061. #endif
  36062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36063. "adds r5, r5, r6\n\t"
  36064. #else
  36065. "add r5, r5, r6\n\t"
  36066. #endif
  36067. #ifdef WOLFSSL_KEIL
  36068. "adcs r3, r3, r7\n\t"
  36069. #elif defined(__clang__)
  36070. "adcs r3, r7\n\t"
  36071. #else
  36072. "adc r3, r7\n\t"
  36073. #endif
  36074. #ifdef WOLFSSL_KEIL
  36075. "adcs r4, r4, %[r]\n\t"
  36076. #elif defined(__clang__)
  36077. "adcs r4, %[r]\n\t"
  36078. #else
  36079. "adc r4, %[r]\n\t"
  36080. #endif
  36081. "# A[3] * B[5]\n\t"
  36082. "mov %[a], r9\n\t"
  36083. "mov %[b], r10\n\t"
  36084. "ldr %[a], [%[a], #12]\n\t"
  36085. "ldr %[b], [%[b], #20]\n\t"
  36086. "uxth r6, %[a]\n\t"
  36087. "uxth r7, %[b]\n\t"
  36088. #ifdef WOLFSSL_KEIL
  36089. "muls r7, r6, r7\n\t"
  36090. #elif defined(__clang__)
  36091. "muls r7, r6\n\t"
  36092. #else
  36093. "mul r7, r6\n\t"
  36094. #endif
  36095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36096. "adds r5, r5, r7\n\t"
  36097. #else
  36098. "add r5, r5, r7\n\t"
  36099. #endif
  36100. #ifdef WOLFSSL_KEIL
  36101. "adcs r3, r3, %[r]\n\t"
  36102. #elif defined(__clang__)
  36103. "adcs r3, %[r]\n\t"
  36104. #else
  36105. "adc r3, %[r]\n\t"
  36106. #endif
  36107. #ifdef WOLFSSL_KEIL
  36108. "adcs r4, r4, %[r]\n\t"
  36109. #elif defined(__clang__)
  36110. "adcs r4, %[r]\n\t"
  36111. #else
  36112. "adc r4, %[r]\n\t"
  36113. #endif
  36114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36115. "lsrs r7, %[b], #16\n\t"
  36116. #else
  36117. "lsr r7, %[b], #16\n\t"
  36118. #endif
  36119. #ifdef WOLFSSL_KEIL
  36120. "muls r6, r7, r6\n\t"
  36121. #elif defined(__clang__)
  36122. "muls r6, r7\n\t"
  36123. #else
  36124. "mul r6, r7\n\t"
  36125. #endif
  36126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36127. "lsrs r7, r6, #16\n\t"
  36128. #else
  36129. "lsr r7, r6, #16\n\t"
  36130. #endif
  36131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36132. "lsls r6, r6, #16\n\t"
  36133. #else
  36134. "lsl r6, r6, #16\n\t"
  36135. #endif
  36136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36137. "adds r5, r5, r6\n\t"
  36138. #else
  36139. "add r5, r5, r6\n\t"
  36140. #endif
  36141. #ifdef WOLFSSL_KEIL
  36142. "adcs r3, r3, r7\n\t"
  36143. #elif defined(__clang__)
  36144. "adcs r3, r7\n\t"
  36145. #else
  36146. "adc r3, r7\n\t"
  36147. #endif
  36148. #ifdef WOLFSSL_KEIL
  36149. "adcs r4, r4, %[r]\n\t"
  36150. #elif defined(__clang__)
  36151. "adcs r4, %[r]\n\t"
  36152. #else
  36153. "adc r4, %[r]\n\t"
  36154. #endif
  36155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36156. "lsrs r6, %[a], #16\n\t"
  36157. #else
  36158. "lsr r6, %[a], #16\n\t"
  36159. #endif
  36160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36161. "lsrs r7, %[b], #16\n\t"
  36162. #else
  36163. "lsr r7, %[b], #16\n\t"
  36164. #endif
  36165. #ifdef WOLFSSL_KEIL
  36166. "muls r7, r6, r7\n\t"
  36167. #elif defined(__clang__)
  36168. "muls r7, r6\n\t"
  36169. #else
  36170. "mul r7, r6\n\t"
  36171. #endif
  36172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36173. "adds r3, r3, r7\n\t"
  36174. #else
  36175. "add r3, r3, r7\n\t"
  36176. #endif
  36177. #ifdef WOLFSSL_KEIL
  36178. "adcs r4, r4, %[r]\n\t"
  36179. #elif defined(__clang__)
  36180. "adcs r4, %[r]\n\t"
  36181. #else
  36182. "adc r4, %[r]\n\t"
  36183. #endif
  36184. "uxth r7, %[b]\n\t"
  36185. #ifdef WOLFSSL_KEIL
  36186. "muls r6, r7, r6\n\t"
  36187. #elif defined(__clang__)
  36188. "muls r6, r7\n\t"
  36189. #else
  36190. "mul r6, r7\n\t"
  36191. #endif
  36192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36193. "lsrs r7, r6, #16\n\t"
  36194. #else
  36195. "lsr r7, r6, #16\n\t"
  36196. #endif
  36197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36198. "lsls r6, r6, #16\n\t"
  36199. #else
  36200. "lsl r6, r6, #16\n\t"
  36201. #endif
  36202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36203. "adds r5, r5, r6\n\t"
  36204. #else
  36205. "add r5, r5, r6\n\t"
  36206. #endif
  36207. #ifdef WOLFSSL_KEIL
  36208. "adcs r3, r3, r7\n\t"
  36209. #elif defined(__clang__)
  36210. "adcs r3, r7\n\t"
  36211. #else
  36212. "adc r3, r7\n\t"
  36213. #endif
  36214. #ifdef WOLFSSL_KEIL
  36215. "adcs r4, r4, %[r]\n\t"
  36216. #elif defined(__clang__)
  36217. "adcs r4, %[r]\n\t"
  36218. #else
  36219. "adc r4, %[r]\n\t"
  36220. #endif
  36221. "# A[2] * B[6]\n\t"
  36222. "mov %[a], r9\n\t"
  36223. "mov %[b], r10\n\t"
  36224. "ldr %[a], [%[a], #8]\n\t"
  36225. "ldr %[b], [%[b], #24]\n\t"
  36226. "uxth r6, %[a]\n\t"
  36227. "uxth r7, %[b]\n\t"
  36228. #ifdef WOLFSSL_KEIL
  36229. "muls r7, r6, r7\n\t"
  36230. #elif defined(__clang__)
  36231. "muls r7, r6\n\t"
  36232. #else
  36233. "mul r7, r6\n\t"
  36234. #endif
  36235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36236. "adds r5, r5, r7\n\t"
  36237. #else
  36238. "add r5, r5, r7\n\t"
  36239. #endif
  36240. #ifdef WOLFSSL_KEIL
  36241. "adcs r3, r3, %[r]\n\t"
  36242. #elif defined(__clang__)
  36243. "adcs r3, %[r]\n\t"
  36244. #else
  36245. "adc r3, %[r]\n\t"
  36246. #endif
  36247. #ifdef WOLFSSL_KEIL
  36248. "adcs r4, r4, %[r]\n\t"
  36249. #elif defined(__clang__)
  36250. "adcs r4, %[r]\n\t"
  36251. #else
  36252. "adc r4, %[r]\n\t"
  36253. #endif
  36254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36255. "lsrs r7, %[b], #16\n\t"
  36256. #else
  36257. "lsr r7, %[b], #16\n\t"
  36258. #endif
  36259. #ifdef WOLFSSL_KEIL
  36260. "muls r6, r7, r6\n\t"
  36261. #elif defined(__clang__)
  36262. "muls r6, r7\n\t"
  36263. #else
  36264. "mul r6, r7\n\t"
  36265. #endif
  36266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36267. "lsrs r7, r6, #16\n\t"
  36268. #else
  36269. "lsr r7, r6, #16\n\t"
  36270. #endif
  36271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36272. "lsls r6, r6, #16\n\t"
  36273. #else
  36274. "lsl r6, r6, #16\n\t"
  36275. #endif
  36276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36277. "adds r5, r5, r6\n\t"
  36278. #else
  36279. "add r5, r5, r6\n\t"
  36280. #endif
  36281. #ifdef WOLFSSL_KEIL
  36282. "adcs r3, r3, r7\n\t"
  36283. #elif defined(__clang__)
  36284. "adcs r3, r7\n\t"
  36285. #else
  36286. "adc r3, r7\n\t"
  36287. #endif
  36288. #ifdef WOLFSSL_KEIL
  36289. "adcs r4, r4, %[r]\n\t"
  36290. #elif defined(__clang__)
  36291. "adcs r4, %[r]\n\t"
  36292. #else
  36293. "adc r4, %[r]\n\t"
  36294. #endif
  36295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36296. "lsrs r6, %[a], #16\n\t"
  36297. #else
  36298. "lsr r6, %[a], #16\n\t"
  36299. #endif
  36300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36301. "lsrs r7, %[b], #16\n\t"
  36302. #else
  36303. "lsr r7, %[b], #16\n\t"
  36304. #endif
  36305. #ifdef WOLFSSL_KEIL
  36306. "muls r7, r6, r7\n\t"
  36307. #elif defined(__clang__)
  36308. "muls r7, r6\n\t"
  36309. #else
  36310. "mul r7, r6\n\t"
  36311. #endif
  36312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36313. "adds r3, r3, r7\n\t"
  36314. #else
  36315. "add r3, r3, r7\n\t"
  36316. #endif
  36317. #ifdef WOLFSSL_KEIL
  36318. "adcs r4, r4, %[r]\n\t"
  36319. #elif defined(__clang__)
  36320. "adcs r4, %[r]\n\t"
  36321. #else
  36322. "adc r4, %[r]\n\t"
  36323. #endif
  36324. "uxth r7, %[b]\n\t"
  36325. #ifdef WOLFSSL_KEIL
  36326. "muls r6, r7, r6\n\t"
  36327. #elif defined(__clang__)
  36328. "muls r6, r7\n\t"
  36329. #else
  36330. "mul r6, r7\n\t"
  36331. #endif
  36332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36333. "lsrs r7, r6, #16\n\t"
  36334. #else
  36335. "lsr r7, r6, #16\n\t"
  36336. #endif
  36337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36338. "lsls r6, r6, #16\n\t"
  36339. #else
  36340. "lsl r6, r6, #16\n\t"
  36341. #endif
  36342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36343. "adds r5, r5, r6\n\t"
  36344. #else
  36345. "add r5, r5, r6\n\t"
  36346. #endif
  36347. #ifdef WOLFSSL_KEIL
  36348. "adcs r3, r3, r7\n\t"
  36349. #elif defined(__clang__)
  36350. "adcs r3, r7\n\t"
  36351. #else
  36352. "adc r3, r7\n\t"
  36353. #endif
  36354. #ifdef WOLFSSL_KEIL
  36355. "adcs r4, r4, %[r]\n\t"
  36356. #elif defined(__clang__)
  36357. "adcs r4, %[r]\n\t"
  36358. #else
  36359. "adc r4, %[r]\n\t"
  36360. #endif
  36361. "# A[1] * B[7]\n\t"
  36362. "mov %[a], r9\n\t"
  36363. "mov %[b], r10\n\t"
  36364. "ldr %[a], [%[a], #4]\n\t"
  36365. "ldr %[b], [%[b], #28]\n\t"
  36366. "uxth r6, %[a]\n\t"
  36367. "uxth r7, %[b]\n\t"
  36368. #ifdef WOLFSSL_KEIL
  36369. "muls r7, r6, r7\n\t"
  36370. #elif defined(__clang__)
  36371. "muls r7, r6\n\t"
  36372. #else
  36373. "mul r7, r6\n\t"
  36374. #endif
  36375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36376. "adds r5, r5, r7\n\t"
  36377. #else
  36378. "add r5, r5, r7\n\t"
  36379. #endif
  36380. #ifdef WOLFSSL_KEIL
  36381. "adcs r3, r3, %[r]\n\t"
  36382. #elif defined(__clang__)
  36383. "adcs r3, %[r]\n\t"
  36384. #else
  36385. "adc r3, %[r]\n\t"
  36386. #endif
  36387. #ifdef WOLFSSL_KEIL
  36388. "adcs r4, r4, %[r]\n\t"
  36389. #elif defined(__clang__)
  36390. "adcs r4, %[r]\n\t"
  36391. #else
  36392. "adc r4, %[r]\n\t"
  36393. #endif
  36394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36395. "lsrs r7, %[b], #16\n\t"
  36396. #else
  36397. "lsr r7, %[b], #16\n\t"
  36398. #endif
  36399. #ifdef WOLFSSL_KEIL
  36400. "muls r6, r7, r6\n\t"
  36401. #elif defined(__clang__)
  36402. "muls r6, r7\n\t"
  36403. #else
  36404. "mul r6, r7\n\t"
  36405. #endif
  36406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36407. "lsrs r7, r6, #16\n\t"
  36408. #else
  36409. "lsr r7, r6, #16\n\t"
  36410. #endif
  36411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36412. "lsls r6, r6, #16\n\t"
  36413. #else
  36414. "lsl r6, r6, #16\n\t"
  36415. #endif
  36416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36417. "adds r5, r5, r6\n\t"
  36418. #else
  36419. "add r5, r5, r6\n\t"
  36420. #endif
  36421. #ifdef WOLFSSL_KEIL
  36422. "adcs r3, r3, r7\n\t"
  36423. #elif defined(__clang__)
  36424. "adcs r3, r7\n\t"
  36425. #else
  36426. "adc r3, r7\n\t"
  36427. #endif
  36428. #ifdef WOLFSSL_KEIL
  36429. "adcs r4, r4, %[r]\n\t"
  36430. #elif defined(__clang__)
  36431. "adcs r4, %[r]\n\t"
  36432. #else
  36433. "adc r4, %[r]\n\t"
  36434. #endif
  36435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36436. "lsrs r6, %[a], #16\n\t"
  36437. #else
  36438. "lsr r6, %[a], #16\n\t"
  36439. #endif
  36440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36441. "lsrs r7, %[b], #16\n\t"
  36442. #else
  36443. "lsr r7, %[b], #16\n\t"
  36444. #endif
  36445. #ifdef WOLFSSL_KEIL
  36446. "muls r7, r6, r7\n\t"
  36447. #elif defined(__clang__)
  36448. "muls r7, r6\n\t"
  36449. #else
  36450. "mul r7, r6\n\t"
  36451. #endif
  36452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36453. "adds r3, r3, r7\n\t"
  36454. #else
  36455. "add r3, r3, r7\n\t"
  36456. #endif
  36457. #ifdef WOLFSSL_KEIL
  36458. "adcs r4, r4, %[r]\n\t"
  36459. #elif defined(__clang__)
  36460. "adcs r4, %[r]\n\t"
  36461. #else
  36462. "adc r4, %[r]\n\t"
  36463. #endif
  36464. "uxth r7, %[b]\n\t"
  36465. #ifdef WOLFSSL_KEIL
  36466. "muls r6, r7, r6\n\t"
  36467. #elif defined(__clang__)
  36468. "muls r6, r7\n\t"
  36469. #else
  36470. "mul r6, r7\n\t"
  36471. #endif
  36472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36473. "lsrs r7, r6, #16\n\t"
  36474. #else
  36475. "lsr r7, r6, #16\n\t"
  36476. #endif
  36477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36478. "lsls r6, r6, #16\n\t"
  36479. #else
  36480. "lsl r6, r6, #16\n\t"
  36481. #endif
  36482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36483. "adds r5, r5, r6\n\t"
  36484. #else
  36485. "add r5, r5, r6\n\t"
  36486. #endif
  36487. #ifdef WOLFSSL_KEIL
  36488. "adcs r3, r3, r7\n\t"
  36489. #elif defined(__clang__)
  36490. "adcs r3, r7\n\t"
  36491. #else
  36492. "adc r3, r7\n\t"
  36493. #endif
  36494. #ifdef WOLFSSL_KEIL
  36495. "adcs r4, r4, %[r]\n\t"
  36496. #elif defined(__clang__)
  36497. "adcs r4, %[r]\n\t"
  36498. #else
  36499. "adc r4, %[r]\n\t"
  36500. #endif
  36501. "# A[0] * B[8]\n\t"
  36502. "mov %[a], r9\n\t"
  36503. "mov %[b], r10\n\t"
  36504. "ldr %[a], [%[a]]\n\t"
  36505. "ldr %[b], [%[b], #32]\n\t"
  36506. "uxth r6, %[a]\n\t"
  36507. "uxth r7, %[b]\n\t"
  36508. #ifdef WOLFSSL_KEIL
  36509. "muls r7, r6, r7\n\t"
  36510. #elif defined(__clang__)
  36511. "muls r7, r6\n\t"
  36512. #else
  36513. "mul r7, r6\n\t"
  36514. #endif
  36515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36516. "adds r5, r5, r7\n\t"
  36517. #else
  36518. "add r5, r5, r7\n\t"
  36519. #endif
  36520. #ifdef WOLFSSL_KEIL
  36521. "adcs r3, r3, %[r]\n\t"
  36522. #elif defined(__clang__)
  36523. "adcs r3, %[r]\n\t"
  36524. #else
  36525. "adc r3, %[r]\n\t"
  36526. #endif
  36527. #ifdef WOLFSSL_KEIL
  36528. "adcs r4, r4, %[r]\n\t"
  36529. #elif defined(__clang__)
  36530. "adcs r4, %[r]\n\t"
  36531. #else
  36532. "adc r4, %[r]\n\t"
  36533. #endif
  36534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36535. "lsrs r7, %[b], #16\n\t"
  36536. #else
  36537. "lsr r7, %[b], #16\n\t"
  36538. #endif
  36539. #ifdef WOLFSSL_KEIL
  36540. "muls r6, r7, r6\n\t"
  36541. #elif defined(__clang__)
  36542. "muls r6, r7\n\t"
  36543. #else
  36544. "mul r6, r7\n\t"
  36545. #endif
  36546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36547. "lsrs r7, r6, #16\n\t"
  36548. #else
  36549. "lsr r7, r6, #16\n\t"
  36550. #endif
  36551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36552. "lsls r6, r6, #16\n\t"
  36553. #else
  36554. "lsl r6, r6, #16\n\t"
  36555. #endif
  36556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36557. "adds r5, r5, r6\n\t"
  36558. #else
  36559. "add r5, r5, r6\n\t"
  36560. #endif
  36561. #ifdef WOLFSSL_KEIL
  36562. "adcs r3, r3, r7\n\t"
  36563. #elif defined(__clang__)
  36564. "adcs r3, r7\n\t"
  36565. #else
  36566. "adc r3, r7\n\t"
  36567. #endif
  36568. #ifdef WOLFSSL_KEIL
  36569. "adcs r4, r4, %[r]\n\t"
  36570. #elif defined(__clang__)
  36571. "adcs r4, %[r]\n\t"
  36572. #else
  36573. "adc r4, %[r]\n\t"
  36574. #endif
  36575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36576. "lsrs r6, %[a], #16\n\t"
  36577. #else
  36578. "lsr r6, %[a], #16\n\t"
  36579. #endif
  36580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36581. "lsrs r7, %[b], #16\n\t"
  36582. #else
  36583. "lsr r7, %[b], #16\n\t"
  36584. #endif
  36585. #ifdef WOLFSSL_KEIL
  36586. "muls r7, r6, r7\n\t"
  36587. #elif defined(__clang__)
  36588. "muls r7, r6\n\t"
  36589. #else
  36590. "mul r7, r6\n\t"
  36591. #endif
  36592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36593. "adds r3, r3, r7\n\t"
  36594. #else
  36595. "add r3, r3, r7\n\t"
  36596. #endif
  36597. #ifdef WOLFSSL_KEIL
  36598. "adcs r4, r4, %[r]\n\t"
  36599. #elif defined(__clang__)
  36600. "adcs r4, %[r]\n\t"
  36601. #else
  36602. "adc r4, %[r]\n\t"
  36603. #endif
  36604. "uxth r7, %[b]\n\t"
  36605. #ifdef WOLFSSL_KEIL
  36606. "muls r6, r7, r6\n\t"
  36607. #elif defined(__clang__)
  36608. "muls r6, r7\n\t"
  36609. #else
  36610. "mul r6, r7\n\t"
  36611. #endif
  36612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36613. "lsrs r7, r6, #16\n\t"
  36614. #else
  36615. "lsr r7, r6, #16\n\t"
  36616. #endif
  36617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36618. "lsls r6, r6, #16\n\t"
  36619. #else
  36620. "lsl r6, r6, #16\n\t"
  36621. #endif
  36622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36623. "adds r5, r5, r6\n\t"
  36624. #else
  36625. "add r5, r5, r6\n\t"
  36626. #endif
  36627. #ifdef WOLFSSL_KEIL
  36628. "adcs r3, r3, r7\n\t"
  36629. #elif defined(__clang__)
  36630. "adcs r3, r7\n\t"
  36631. #else
  36632. "adc r3, r7\n\t"
  36633. #endif
  36634. #ifdef WOLFSSL_KEIL
  36635. "adcs r4, r4, %[r]\n\t"
  36636. #elif defined(__clang__)
  36637. "adcs r4, %[r]\n\t"
  36638. #else
  36639. "adc r4, %[r]\n\t"
  36640. #endif
  36641. "str r5, [sp, #32]\n\t"
  36642. "# A[0] * B[9]\n\t"
  36643. "movs r5, #0\n\t"
  36644. "mov %[a], r9\n\t"
  36645. "mov %[b], r10\n\t"
  36646. "ldr %[a], [%[a]]\n\t"
  36647. "ldr %[b], [%[b], #36]\n\t"
  36648. "uxth r6, %[a]\n\t"
  36649. "uxth r7, %[b]\n\t"
  36650. #ifdef WOLFSSL_KEIL
  36651. "muls r7, r6, r7\n\t"
  36652. #elif defined(__clang__)
  36653. "muls r7, r6\n\t"
  36654. #else
  36655. "mul r7, r6\n\t"
  36656. #endif
  36657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36658. "adds r3, r3, r7\n\t"
  36659. #else
  36660. "add r3, r3, r7\n\t"
  36661. #endif
  36662. #ifdef WOLFSSL_KEIL
  36663. "adcs r4, r4, %[r]\n\t"
  36664. #elif defined(__clang__)
  36665. "adcs r4, %[r]\n\t"
  36666. #else
  36667. "adc r4, %[r]\n\t"
  36668. #endif
  36669. #ifdef WOLFSSL_KEIL
  36670. "adcs r5, r5, %[r]\n\t"
  36671. #elif defined(__clang__)
  36672. "adcs r5, %[r]\n\t"
  36673. #else
  36674. "adc r5, %[r]\n\t"
  36675. #endif
  36676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36677. "lsrs r7, %[b], #16\n\t"
  36678. #else
  36679. "lsr r7, %[b], #16\n\t"
  36680. #endif
  36681. #ifdef WOLFSSL_KEIL
  36682. "muls r6, r7, r6\n\t"
  36683. #elif defined(__clang__)
  36684. "muls r6, r7\n\t"
  36685. #else
  36686. "mul r6, r7\n\t"
  36687. #endif
  36688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36689. "lsrs r7, r6, #16\n\t"
  36690. #else
  36691. "lsr r7, r6, #16\n\t"
  36692. #endif
  36693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36694. "lsls r6, r6, #16\n\t"
  36695. #else
  36696. "lsl r6, r6, #16\n\t"
  36697. #endif
  36698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36699. "adds r3, r3, r6\n\t"
  36700. #else
  36701. "add r3, r3, r6\n\t"
  36702. #endif
  36703. #ifdef WOLFSSL_KEIL
  36704. "adcs r4, r4, r7\n\t"
  36705. #elif defined(__clang__)
  36706. "adcs r4, r7\n\t"
  36707. #else
  36708. "adc r4, r7\n\t"
  36709. #endif
  36710. #ifdef WOLFSSL_KEIL
  36711. "adcs r5, r5, %[r]\n\t"
  36712. #elif defined(__clang__)
  36713. "adcs r5, %[r]\n\t"
  36714. #else
  36715. "adc r5, %[r]\n\t"
  36716. #endif
  36717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36718. "lsrs r6, %[a], #16\n\t"
  36719. #else
  36720. "lsr r6, %[a], #16\n\t"
  36721. #endif
  36722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36723. "lsrs r7, %[b], #16\n\t"
  36724. #else
  36725. "lsr r7, %[b], #16\n\t"
  36726. #endif
  36727. #ifdef WOLFSSL_KEIL
  36728. "muls r7, r6, r7\n\t"
  36729. #elif defined(__clang__)
  36730. "muls r7, r6\n\t"
  36731. #else
  36732. "mul r7, r6\n\t"
  36733. #endif
  36734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36735. "adds r4, r4, r7\n\t"
  36736. #else
  36737. "add r4, r4, r7\n\t"
  36738. #endif
  36739. #ifdef WOLFSSL_KEIL
  36740. "adcs r5, r5, %[r]\n\t"
  36741. #elif defined(__clang__)
  36742. "adcs r5, %[r]\n\t"
  36743. #else
  36744. "adc r5, %[r]\n\t"
  36745. #endif
  36746. "uxth r7, %[b]\n\t"
  36747. #ifdef WOLFSSL_KEIL
  36748. "muls r6, r7, r6\n\t"
  36749. #elif defined(__clang__)
  36750. "muls r6, r7\n\t"
  36751. #else
  36752. "mul r6, r7\n\t"
  36753. #endif
  36754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36755. "lsrs r7, r6, #16\n\t"
  36756. #else
  36757. "lsr r7, r6, #16\n\t"
  36758. #endif
  36759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36760. "lsls r6, r6, #16\n\t"
  36761. #else
  36762. "lsl r6, r6, #16\n\t"
  36763. #endif
  36764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36765. "adds r3, r3, r6\n\t"
  36766. #else
  36767. "add r3, r3, r6\n\t"
  36768. #endif
  36769. #ifdef WOLFSSL_KEIL
  36770. "adcs r4, r4, r7\n\t"
  36771. #elif defined(__clang__)
  36772. "adcs r4, r7\n\t"
  36773. #else
  36774. "adc r4, r7\n\t"
  36775. #endif
  36776. #ifdef WOLFSSL_KEIL
  36777. "adcs r5, r5, %[r]\n\t"
  36778. #elif defined(__clang__)
  36779. "adcs r5, %[r]\n\t"
  36780. #else
  36781. "adc r5, %[r]\n\t"
  36782. #endif
  36783. "# A[1] * B[8]\n\t"
  36784. "mov %[a], r9\n\t"
  36785. "mov %[b], r10\n\t"
  36786. "ldr %[a], [%[a], #4]\n\t"
  36787. "ldr %[b], [%[b], #32]\n\t"
  36788. "uxth r6, %[a]\n\t"
  36789. "uxth r7, %[b]\n\t"
  36790. #ifdef WOLFSSL_KEIL
  36791. "muls r7, r6, r7\n\t"
  36792. #elif defined(__clang__)
  36793. "muls r7, r6\n\t"
  36794. #else
  36795. "mul r7, r6\n\t"
  36796. #endif
  36797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36798. "adds r3, r3, r7\n\t"
  36799. #else
  36800. "add r3, r3, r7\n\t"
  36801. #endif
  36802. #ifdef WOLFSSL_KEIL
  36803. "adcs r4, r4, %[r]\n\t"
  36804. #elif defined(__clang__)
  36805. "adcs r4, %[r]\n\t"
  36806. #else
  36807. "adc r4, %[r]\n\t"
  36808. #endif
  36809. #ifdef WOLFSSL_KEIL
  36810. "adcs r5, r5, %[r]\n\t"
  36811. #elif defined(__clang__)
  36812. "adcs r5, %[r]\n\t"
  36813. #else
  36814. "adc r5, %[r]\n\t"
  36815. #endif
  36816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36817. "lsrs r7, %[b], #16\n\t"
  36818. #else
  36819. "lsr r7, %[b], #16\n\t"
  36820. #endif
  36821. #ifdef WOLFSSL_KEIL
  36822. "muls r6, r7, r6\n\t"
  36823. #elif defined(__clang__)
  36824. "muls r6, r7\n\t"
  36825. #else
  36826. "mul r6, r7\n\t"
  36827. #endif
  36828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36829. "lsrs r7, r6, #16\n\t"
  36830. #else
  36831. "lsr r7, r6, #16\n\t"
  36832. #endif
  36833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36834. "lsls r6, r6, #16\n\t"
  36835. #else
  36836. "lsl r6, r6, #16\n\t"
  36837. #endif
  36838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36839. "adds r3, r3, r6\n\t"
  36840. #else
  36841. "add r3, r3, r6\n\t"
  36842. #endif
  36843. #ifdef WOLFSSL_KEIL
  36844. "adcs r4, r4, r7\n\t"
  36845. #elif defined(__clang__)
  36846. "adcs r4, r7\n\t"
  36847. #else
  36848. "adc r4, r7\n\t"
  36849. #endif
  36850. #ifdef WOLFSSL_KEIL
  36851. "adcs r5, r5, %[r]\n\t"
  36852. #elif defined(__clang__)
  36853. "adcs r5, %[r]\n\t"
  36854. #else
  36855. "adc r5, %[r]\n\t"
  36856. #endif
  36857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36858. "lsrs r6, %[a], #16\n\t"
  36859. #else
  36860. "lsr r6, %[a], #16\n\t"
  36861. #endif
  36862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36863. "lsrs r7, %[b], #16\n\t"
  36864. #else
  36865. "lsr r7, %[b], #16\n\t"
  36866. #endif
  36867. #ifdef WOLFSSL_KEIL
  36868. "muls r7, r6, r7\n\t"
  36869. #elif defined(__clang__)
  36870. "muls r7, r6\n\t"
  36871. #else
  36872. "mul r7, r6\n\t"
  36873. #endif
  36874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36875. "adds r4, r4, r7\n\t"
  36876. #else
  36877. "add r4, r4, r7\n\t"
  36878. #endif
  36879. #ifdef WOLFSSL_KEIL
  36880. "adcs r5, r5, %[r]\n\t"
  36881. #elif defined(__clang__)
  36882. "adcs r5, %[r]\n\t"
  36883. #else
  36884. "adc r5, %[r]\n\t"
  36885. #endif
  36886. "uxth r7, %[b]\n\t"
  36887. #ifdef WOLFSSL_KEIL
  36888. "muls r6, r7, r6\n\t"
  36889. #elif defined(__clang__)
  36890. "muls r6, r7\n\t"
  36891. #else
  36892. "mul r6, r7\n\t"
  36893. #endif
  36894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36895. "lsrs r7, r6, #16\n\t"
  36896. #else
  36897. "lsr r7, r6, #16\n\t"
  36898. #endif
  36899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36900. "lsls r6, r6, #16\n\t"
  36901. #else
  36902. "lsl r6, r6, #16\n\t"
  36903. #endif
  36904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36905. "adds r3, r3, r6\n\t"
  36906. #else
  36907. "add r3, r3, r6\n\t"
  36908. #endif
  36909. #ifdef WOLFSSL_KEIL
  36910. "adcs r4, r4, r7\n\t"
  36911. #elif defined(__clang__)
  36912. "adcs r4, r7\n\t"
  36913. #else
  36914. "adc r4, r7\n\t"
  36915. #endif
  36916. #ifdef WOLFSSL_KEIL
  36917. "adcs r5, r5, %[r]\n\t"
  36918. #elif defined(__clang__)
  36919. "adcs r5, %[r]\n\t"
  36920. #else
  36921. "adc r5, %[r]\n\t"
  36922. #endif
  36923. "# A[2] * B[7]\n\t"
  36924. "mov %[a], r9\n\t"
  36925. "mov %[b], r10\n\t"
  36926. "ldr %[a], [%[a], #8]\n\t"
  36927. "ldr %[b], [%[b], #28]\n\t"
  36928. "uxth r6, %[a]\n\t"
  36929. "uxth r7, %[b]\n\t"
  36930. #ifdef WOLFSSL_KEIL
  36931. "muls r7, r6, r7\n\t"
  36932. #elif defined(__clang__)
  36933. "muls r7, r6\n\t"
  36934. #else
  36935. "mul r7, r6\n\t"
  36936. #endif
  36937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36938. "adds r3, r3, r7\n\t"
  36939. #else
  36940. "add r3, r3, r7\n\t"
  36941. #endif
  36942. #ifdef WOLFSSL_KEIL
  36943. "adcs r4, r4, %[r]\n\t"
  36944. #elif defined(__clang__)
  36945. "adcs r4, %[r]\n\t"
  36946. #else
  36947. "adc r4, %[r]\n\t"
  36948. #endif
  36949. #ifdef WOLFSSL_KEIL
  36950. "adcs r5, r5, %[r]\n\t"
  36951. #elif defined(__clang__)
  36952. "adcs r5, %[r]\n\t"
  36953. #else
  36954. "adc r5, %[r]\n\t"
  36955. #endif
  36956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36957. "lsrs r7, %[b], #16\n\t"
  36958. #else
  36959. "lsr r7, %[b], #16\n\t"
  36960. #endif
  36961. #ifdef WOLFSSL_KEIL
  36962. "muls r6, r7, r6\n\t"
  36963. #elif defined(__clang__)
  36964. "muls r6, r7\n\t"
  36965. #else
  36966. "mul r6, r7\n\t"
  36967. #endif
  36968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36969. "lsrs r7, r6, #16\n\t"
  36970. #else
  36971. "lsr r7, r6, #16\n\t"
  36972. #endif
  36973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36974. "lsls r6, r6, #16\n\t"
  36975. #else
  36976. "lsl r6, r6, #16\n\t"
  36977. #endif
  36978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36979. "adds r3, r3, r6\n\t"
  36980. #else
  36981. "add r3, r3, r6\n\t"
  36982. #endif
  36983. #ifdef WOLFSSL_KEIL
  36984. "adcs r4, r4, r7\n\t"
  36985. #elif defined(__clang__)
  36986. "adcs r4, r7\n\t"
  36987. #else
  36988. "adc r4, r7\n\t"
  36989. #endif
  36990. #ifdef WOLFSSL_KEIL
  36991. "adcs r5, r5, %[r]\n\t"
  36992. #elif defined(__clang__)
  36993. "adcs r5, %[r]\n\t"
  36994. #else
  36995. "adc r5, %[r]\n\t"
  36996. #endif
  36997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  36998. "lsrs r6, %[a], #16\n\t"
  36999. #else
  37000. "lsr r6, %[a], #16\n\t"
  37001. #endif
  37002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37003. "lsrs r7, %[b], #16\n\t"
  37004. #else
  37005. "lsr r7, %[b], #16\n\t"
  37006. #endif
  37007. #ifdef WOLFSSL_KEIL
  37008. "muls r7, r6, r7\n\t"
  37009. #elif defined(__clang__)
  37010. "muls r7, r6\n\t"
  37011. #else
  37012. "mul r7, r6\n\t"
  37013. #endif
  37014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37015. "adds r4, r4, r7\n\t"
  37016. #else
  37017. "add r4, r4, r7\n\t"
  37018. #endif
  37019. #ifdef WOLFSSL_KEIL
  37020. "adcs r5, r5, %[r]\n\t"
  37021. #elif defined(__clang__)
  37022. "adcs r5, %[r]\n\t"
  37023. #else
  37024. "adc r5, %[r]\n\t"
  37025. #endif
  37026. "uxth r7, %[b]\n\t"
  37027. #ifdef WOLFSSL_KEIL
  37028. "muls r6, r7, r6\n\t"
  37029. #elif defined(__clang__)
  37030. "muls r6, r7\n\t"
  37031. #else
  37032. "mul r6, r7\n\t"
  37033. #endif
  37034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37035. "lsrs r7, r6, #16\n\t"
  37036. #else
  37037. "lsr r7, r6, #16\n\t"
  37038. #endif
  37039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37040. "lsls r6, r6, #16\n\t"
  37041. #else
  37042. "lsl r6, r6, #16\n\t"
  37043. #endif
  37044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37045. "adds r3, r3, r6\n\t"
  37046. #else
  37047. "add r3, r3, r6\n\t"
  37048. #endif
  37049. #ifdef WOLFSSL_KEIL
  37050. "adcs r4, r4, r7\n\t"
  37051. #elif defined(__clang__)
  37052. "adcs r4, r7\n\t"
  37053. #else
  37054. "adc r4, r7\n\t"
  37055. #endif
  37056. #ifdef WOLFSSL_KEIL
  37057. "adcs r5, r5, %[r]\n\t"
  37058. #elif defined(__clang__)
  37059. "adcs r5, %[r]\n\t"
  37060. #else
  37061. "adc r5, %[r]\n\t"
  37062. #endif
  37063. "# A[3] * B[6]\n\t"
  37064. "mov %[a], r9\n\t"
  37065. "mov %[b], r10\n\t"
  37066. "ldr %[a], [%[a], #12]\n\t"
  37067. "ldr %[b], [%[b], #24]\n\t"
  37068. "uxth r6, %[a]\n\t"
  37069. "uxth r7, %[b]\n\t"
  37070. #ifdef WOLFSSL_KEIL
  37071. "muls r7, r6, r7\n\t"
  37072. #elif defined(__clang__)
  37073. "muls r7, r6\n\t"
  37074. #else
  37075. "mul r7, r6\n\t"
  37076. #endif
  37077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37078. "adds r3, r3, r7\n\t"
  37079. #else
  37080. "add r3, r3, r7\n\t"
  37081. #endif
  37082. #ifdef WOLFSSL_KEIL
  37083. "adcs r4, r4, %[r]\n\t"
  37084. #elif defined(__clang__)
  37085. "adcs r4, %[r]\n\t"
  37086. #else
  37087. "adc r4, %[r]\n\t"
  37088. #endif
  37089. #ifdef WOLFSSL_KEIL
  37090. "adcs r5, r5, %[r]\n\t"
  37091. #elif defined(__clang__)
  37092. "adcs r5, %[r]\n\t"
  37093. #else
  37094. "adc r5, %[r]\n\t"
  37095. #endif
  37096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37097. "lsrs r7, %[b], #16\n\t"
  37098. #else
  37099. "lsr r7, %[b], #16\n\t"
  37100. #endif
  37101. #ifdef WOLFSSL_KEIL
  37102. "muls r6, r7, r6\n\t"
  37103. #elif defined(__clang__)
  37104. "muls r6, r7\n\t"
  37105. #else
  37106. "mul r6, r7\n\t"
  37107. #endif
  37108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37109. "lsrs r7, r6, #16\n\t"
  37110. #else
  37111. "lsr r7, r6, #16\n\t"
  37112. #endif
  37113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37114. "lsls r6, r6, #16\n\t"
  37115. #else
  37116. "lsl r6, r6, #16\n\t"
  37117. #endif
  37118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37119. "adds r3, r3, r6\n\t"
  37120. #else
  37121. "add r3, r3, r6\n\t"
  37122. #endif
  37123. #ifdef WOLFSSL_KEIL
  37124. "adcs r4, r4, r7\n\t"
  37125. #elif defined(__clang__)
  37126. "adcs r4, r7\n\t"
  37127. #else
  37128. "adc r4, r7\n\t"
  37129. #endif
  37130. #ifdef WOLFSSL_KEIL
  37131. "adcs r5, r5, %[r]\n\t"
  37132. #elif defined(__clang__)
  37133. "adcs r5, %[r]\n\t"
  37134. #else
  37135. "adc r5, %[r]\n\t"
  37136. #endif
  37137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37138. "lsrs r6, %[a], #16\n\t"
  37139. #else
  37140. "lsr r6, %[a], #16\n\t"
  37141. #endif
  37142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37143. "lsrs r7, %[b], #16\n\t"
  37144. #else
  37145. "lsr r7, %[b], #16\n\t"
  37146. #endif
  37147. #ifdef WOLFSSL_KEIL
  37148. "muls r7, r6, r7\n\t"
  37149. #elif defined(__clang__)
  37150. "muls r7, r6\n\t"
  37151. #else
  37152. "mul r7, r6\n\t"
  37153. #endif
  37154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37155. "adds r4, r4, r7\n\t"
  37156. #else
  37157. "add r4, r4, r7\n\t"
  37158. #endif
  37159. #ifdef WOLFSSL_KEIL
  37160. "adcs r5, r5, %[r]\n\t"
  37161. #elif defined(__clang__)
  37162. "adcs r5, %[r]\n\t"
  37163. #else
  37164. "adc r5, %[r]\n\t"
  37165. #endif
  37166. "uxth r7, %[b]\n\t"
  37167. #ifdef WOLFSSL_KEIL
  37168. "muls r6, r7, r6\n\t"
  37169. #elif defined(__clang__)
  37170. "muls r6, r7\n\t"
  37171. #else
  37172. "mul r6, r7\n\t"
  37173. #endif
  37174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37175. "lsrs r7, r6, #16\n\t"
  37176. #else
  37177. "lsr r7, r6, #16\n\t"
  37178. #endif
  37179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37180. "lsls r6, r6, #16\n\t"
  37181. #else
  37182. "lsl r6, r6, #16\n\t"
  37183. #endif
  37184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37185. "adds r3, r3, r6\n\t"
  37186. #else
  37187. "add r3, r3, r6\n\t"
  37188. #endif
  37189. #ifdef WOLFSSL_KEIL
  37190. "adcs r4, r4, r7\n\t"
  37191. #elif defined(__clang__)
  37192. "adcs r4, r7\n\t"
  37193. #else
  37194. "adc r4, r7\n\t"
  37195. #endif
  37196. #ifdef WOLFSSL_KEIL
  37197. "adcs r5, r5, %[r]\n\t"
  37198. #elif defined(__clang__)
  37199. "adcs r5, %[r]\n\t"
  37200. #else
  37201. "adc r5, %[r]\n\t"
  37202. #endif
  37203. "# A[4] * B[5]\n\t"
  37204. "mov %[a], r9\n\t"
  37205. "mov %[b], r10\n\t"
  37206. "ldr %[a], [%[a], #16]\n\t"
  37207. "ldr %[b], [%[b], #20]\n\t"
  37208. "uxth r6, %[a]\n\t"
  37209. "uxth r7, %[b]\n\t"
  37210. #ifdef WOLFSSL_KEIL
  37211. "muls r7, r6, r7\n\t"
  37212. #elif defined(__clang__)
  37213. "muls r7, r6\n\t"
  37214. #else
  37215. "mul r7, r6\n\t"
  37216. #endif
  37217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37218. "adds r3, r3, r7\n\t"
  37219. #else
  37220. "add r3, r3, r7\n\t"
  37221. #endif
  37222. #ifdef WOLFSSL_KEIL
  37223. "adcs r4, r4, %[r]\n\t"
  37224. #elif defined(__clang__)
  37225. "adcs r4, %[r]\n\t"
  37226. #else
  37227. "adc r4, %[r]\n\t"
  37228. #endif
  37229. #ifdef WOLFSSL_KEIL
  37230. "adcs r5, r5, %[r]\n\t"
  37231. #elif defined(__clang__)
  37232. "adcs r5, %[r]\n\t"
  37233. #else
  37234. "adc r5, %[r]\n\t"
  37235. #endif
  37236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37237. "lsrs r7, %[b], #16\n\t"
  37238. #else
  37239. "lsr r7, %[b], #16\n\t"
  37240. #endif
  37241. #ifdef WOLFSSL_KEIL
  37242. "muls r6, r7, r6\n\t"
  37243. #elif defined(__clang__)
  37244. "muls r6, r7\n\t"
  37245. #else
  37246. "mul r6, r7\n\t"
  37247. #endif
  37248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37249. "lsrs r7, r6, #16\n\t"
  37250. #else
  37251. "lsr r7, r6, #16\n\t"
  37252. #endif
  37253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37254. "lsls r6, r6, #16\n\t"
  37255. #else
  37256. "lsl r6, r6, #16\n\t"
  37257. #endif
  37258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37259. "adds r3, r3, r6\n\t"
  37260. #else
  37261. "add r3, r3, r6\n\t"
  37262. #endif
  37263. #ifdef WOLFSSL_KEIL
  37264. "adcs r4, r4, r7\n\t"
  37265. #elif defined(__clang__)
  37266. "adcs r4, r7\n\t"
  37267. #else
  37268. "adc r4, r7\n\t"
  37269. #endif
  37270. #ifdef WOLFSSL_KEIL
  37271. "adcs r5, r5, %[r]\n\t"
  37272. #elif defined(__clang__)
  37273. "adcs r5, %[r]\n\t"
  37274. #else
  37275. "adc r5, %[r]\n\t"
  37276. #endif
  37277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37278. "lsrs r6, %[a], #16\n\t"
  37279. #else
  37280. "lsr r6, %[a], #16\n\t"
  37281. #endif
  37282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37283. "lsrs r7, %[b], #16\n\t"
  37284. #else
  37285. "lsr r7, %[b], #16\n\t"
  37286. #endif
  37287. #ifdef WOLFSSL_KEIL
  37288. "muls r7, r6, r7\n\t"
  37289. #elif defined(__clang__)
  37290. "muls r7, r6\n\t"
  37291. #else
  37292. "mul r7, r6\n\t"
  37293. #endif
  37294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37295. "adds r4, r4, r7\n\t"
  37296. #else
  37297. "add r4, r4, r7\n\t"
  37298. #endif
  37299. #ifdef WOLFSSL_KEIL
  37300. "adcs r5, r5, %[r]\n\t"
  37301. #elif defined(__clang__)
  37302. "adcs r5, %[r]\n\t"
  37303. #else
  37304. "adc r5, %[r]\n\t"
  37305. #endif
  37306. "uxth r7, %[b]\n\t"
  37307. #ifdef WOLFSSL_KEIL
  37308. "muls r6, r7, r6\n\t"
  37309. #elif defined(__clang__)
  37310. "muls r6, r7\n\t"
  37311. #else
  37312. "mul r6, r7\n\t"
  37313. #endif
  37314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37315. "lsrs r7, r6, #16\n\t"
  37316. #else
  37317. "lsr r7, r6, #16\n\t"
  37318. #endif
  37319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37320. "lsls r6, r6, #16\n\t"
  37321. #else
  37322. "lsl r6, r6, #16\n\t"
  37323. #endif
  37324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37325. "adds r3, r3, r6\n\t"
  37326. #else
  37327. "add r3, r3, r6\n\t"
  37328. #endif
  37329. #ifdef WOLFSSL_KEIL
  37330. "adcs r4, r4, r7\n\t"
  37331. #elif defined(__clang__)
  37332. "adcs r4, r7\n\t"
  37333. #else
  37334. "adc r4, r7\n\t"
  37335. #endif
  37336. #ifdef WOLFSSL_KEIL
  37337. "adcs r5, r5, %[r]\n\t"
  37338. #elif defined(__clang__)
  37339. "adcs r5, %[r]\n\t"
  37340. #else
  37341. "adc r5, %[r]\n\t"
  37342. #endif
  37343. "# A[5] * B[4]\n\t"
  37344. "mov %[a], r9\n\t"
  37345. "mov %[b], r10\n\t"
  37346. "ldr %[a], [%[a], #20]\n\t"
  37347. "ldr %[b], [%[b], #16]\n\t"
  37348. "uxth r6, %[a]\n\t"
  37349. "uxth r7, %[b]\n\t"
  37350. #ifdef WOLFSSL_KEIL
  37351. "muls r7, r6, r7\n\t"
  37352. #elif defined(__clang__)
  37353. "muls r7, r6\n\t"
  37354. #else
  37355. "mul r7, r6\n\t"
  37356. #endif
  37357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37358. "adds r3, r3, r7\n\t"
  37359. #else
  37360. "add r3, r3, r7\n\t"
  37361. #endif
  37362. #ifdef WOLFSSL_KEIL
  37363. "adcs r4, r4, %[r]\n\t"
  37364. #elif defined(__clang__)
  37365. "adcs r4, %[r]\n\t"
  37366. #else
  37367. "adc r4, %[r]\n\t"
  37368. #endif
  37369. #ifdef WOLFSSL_KEIL
  37370. "adcs r5, r5, %[r]\n\t"
  37371. #elif defined(__clang__)
  37372. "adcs r5, %[r]\n\t"
  37373. #else
  37374. "adc r5, %[r]\n\t"
  37375. #endif
  37376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37377. "lsrs r7, %[b], #16\n\t"
  37378. #else
  37379. "lsr r7, %[b], #16\n\t"
  37380. #endif
  37381. #ifdef WOLFSSL_KEIL
  37382. "muls r6, r7, r6\n\t"
  37383. #elif defined(__clang__)
  37384. "muls r6, r7\n\t"
  37385. #else
  37386. "mul r6, r7\n\t"
  37387. #endif
  37388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37389. "lsrs r7, r6, #16\n\t"
  37390. #else
  37391. "lsr r7, r6, #16\n\t"
  37392. #endif
  37393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37394. "lsls r6, r6, #16\n\t"
  37395. #else
  37396. "lsl r6, r6, #16\n\t"
  37397. #endif
  37398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37399. "adds r3, r3, r6\n\t"
  37400. #else
  37401. "add r3, r3, r6\n\t"
  37402. #endif
  37403. #ifdef WOLFSSL_KEIL
  37404. "adcs r4, r4, r7\n\t"
  37405. #elif defined(__clang__)
  37406. "adcs r4, r7\n\t"
  37407. #else
  37408. "adc r4, r7\n\t"
  37409. #endif
  37410. #ifdef WOLFSSL_KEIL
  37411. "adcs r5, r5, %[r]\n\t"
  37412. #elif defined(__clang__)
  37413. "adcs r5, %[r]\n\t"
  37414. #else
  37415. "adc r5, %[r]\n\t"
  37416. #endif
  37417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37418. "lsrs r6, %[a], #16\n\t"
  37419. #else
  37420. "lsr r6, %[a], #16\n\t"
  37421. #endif
  37422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37423. "lsrs r7, %[b], #16\n\t"
  37424. #else
  37425. "lsr r7, %[b], #16\n\t"
  37426. #endif
  37427. #ifdef WOLFSSL_KEIL
  37428. "muls r7, r6, r7\n\t"
  37429. #elif defined(__clang__)
  37430. "muls r7, r6\n\t"
  37431. #else
  37432. "mul r7, r6\n\t"
  37433. #endif
  37434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37435. "adds r4, r4, r7\n\t"
  37436. #else
  37437. "add r4, r4, r7\n\t"
  37438. #endif
  37439. #ifdef WOLFSSL_KEIL
  37440. "adcs r5, r5, %[r]\n\t"
  37441. #elif defined(__clang__)
  37442. "adcs r5, %[r]\n\t"
  37443. #else
  37444. "adc r5, %[r]\n\t"
  37445. #endif
  37446. "uxth r7, %[b]\n\t"
  37447. #ifdef WOLFSSL_KEIL
  37448. "muls r6, r7, r6\n\t"
  37449. #elif defined(__clang__)
  37450. "muls r6, r7\n\t"
  37451. #else
  37452. "mul r6, r7\n\t"
  37453. #endif
  37454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37455. "lsrs r7, r6, #16\n\t"
  37456. #else
  37457. "lsr r7, r6, #16\n\t"
  37458. #endif
  37459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37460. "lsls r6, r6, #16\n\t"
  37461. #else
  37462. "lsl r6, r6, #16\n\t"
  37463. #endif
  37464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37465. "adds r3, r3, r6\n\t"
  37466. #else
  37467. "add r3, r3, r6\n\t"
  37468. #endif
  37469. #ifdef WOLFSSL_KEIL
  37470. "adcs r4, r4, r7\n\t"
  37471. #elif defined(__clang__)
  37472. "adcs r4, r7\n\t"
  37473. #else
  37474. "adc r4, r7\n\t"
  37475. #endif
  37476. #ifdef WOLFSSL_KEIL
  37477. "adcs r5, r5, %[r]\n\t"
  37478. #elif defined(__clang__)
  37479. "adcs r5, %[r]\n\t"
  37480. #else
  37481. "adc r5, %[r]\n\t"
  37482. #endif
  37483. "# A[6] * B[3]\n\t"
  37484. "mov %[a], r9\n\t"
  37485. "mov %[b], r10\n\t"
  37486. "ldr %[a], [%[a], #24]\n\t"
  37487. "ldr %[b], [%[b], #12]\n\t"
  37488. "uxth r6, %[a]\n\t"
  37489. "uxth r7, %[b]\n\t"
  37490. #ifdef WOLFSSL_KEIL
  37491. "muls r7, r6, r7\n\t"
  37492. #elif defined(__clang__)
  37493. "muls r7, r6\n\t"
  37494. #else
  37495. "mul r7, r6\n\t"
  37496. #endif
  37497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37498. "adds r3, r3, r7\n\t"
  37499. #else
  37500. "add r3, r3, r7\n\t"
  37501. #endif
  37502. #ifdef WOLFSSL_KEIL
  37503. "adcs r4, r4, %[r]\n\t"
  37504. #elif defined(__clang__)
  37505. "adcs r4, %[r]\n\t"
  37506. #else
  37507. "adc r4, %[r]\n\t"
  37508. #endif
  37509. #ifdef WOLFSSL_KEIL
  37510. "adcs r5, r5, %[r]\n\t"
  37511. #elif defined(__clang__)
  37512. "adcs r5, %[r]\n\t"
  37513. #else
  37514. "adc r5, %[r]\n\t"
  37515. #endif
  37516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37517. "lsrs r7, %[b], #16\n\t"
  37518. #else
  37519. "lsr r7, %[b], #16\n\t"
  37520. #endif
  37521. #ifdef WOLFSSL_KEIL
  37522. "muls r6, r7, r6\n\t"
  37523. #elif defined(__clang__)
  37524. "muls r6, r7\n\t"
  37525. #else
  37526. "mul r6, r7\n\t"
  37527. #endif
  37528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37529. "lsrs r7, r6, #16\n\t"
  37530. #else
  37531. "lsr r7, r6, #16\n\t"
  37532. #endif
  37533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37534. "lsls r6, r6, #16\n\t"
  37535. #else
  37536. "lsl r6, r6, #16\n\t"
  37537. #endif
  37538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37539. "adds r3, r3, r6\n\t"
  37540. #else
  37541. "add r3, r3, r6\n\t"
  37542. #endif
  37543. #ifdef WOLFSSL_KEIL
  37544. "adcs r4, r4, r7\n\t"
  37545. #elif defined(__clang__)
  37546. "adcs r4, r7\n\t"
  37547. #else
  37548. "adc r4, r7\n\t"
  37549. #endif
  37550. #ifdef WOLFSSL_KEIL
  37551. "adcs r5, r5, %[r]\n\t"
  37552. #elif defined(__clang__)
  37553. "adcs r5, %[r]\n\t"
  37554. #else
  37555. "adc r5, %[r]\n\t"
  37556. #endif
  37557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37558. "lsrs r6, %[a], #16\n\t"
  37559. #else
  37560. "lsr r6, %[a], #16\n\t"
  37561. #endif
  37562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37563. "lsrs r7, %[b], #16\n\t"
  37564. #else
  37565. "lsr r7, %[b], #16\n\t"
  37566. #endif
  37567. #ifdef WOLFSSL_KEIL
  37568. "muls r7, r6, r7\n\t"
  37569. #elif defined(__clang__)
  37570. "muls r7, r6\n\t"
  37571. #else
  37572. "mul r7, r6\n\t"
  37573. #endif
  37574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37575. "adds r4, r4, r7\n\t"
  37576. #else
  37577. "add r4, r4, r7\n\t"
  37578. #endif
  37579. #ifdef WOLFSSL_KEIL
  37580. "adcs r5, r5, %[r]\n\t"
  37581. #elif defined(__clang__)
  37582. "adcs r5, %[r]\n\t"
  37583. #else
  37584. "adc r5, %[r]\n\t"
  37585. #endif
  37586. "uxth r7, %[b]\n\t"
  37587. #ifdef WOLFSSL_KEIL
  37588. "muls r6, r7, r6\n\t"
  37589. #elif defined(__clang__)
  37590. "muls r6, r7\n\t"
  37591. #else
  37592. "mul r6, r7\n\t"
  37593. #endif
  37594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37595. "lsrs r7, r6, #16\n\t"
  37596. #else
  37597. "lsr r7, r6, #16\n\t"
  37598. #endif
  37599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37600. "lsls r6, r6, #16\n\t"
  37601. #else
  37602. "lsl r6, r6, #16\n\t"
  37603. #endif
  37604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37605. "adds r3, r3, r6\n\t"
  37606. #else
  37607. "add r3, r3, r6\n\t"
  37608. #endif
  37609. #ifdef WOLFSSL_KEIL
  37610. "adcs r4, r4, r7\n\t"
  37611. #elif defined(__clang__)
  37612. "adcs r4, r7\n\t"
  37613. #else
  37614. "adc r4, r7\n\t"
  37615. #endif
  37616. #ifdef WOLFSSL_KEIL
  37617. "adcs r5, r5, %[r]\n\t"
  37618. #elif defined(__clang__)
  37619. "adcs r5, %[r]\n\t"
  37620. #else
  37621. "adc r5, %[r]\n\t"
  37622. #endif
  37623. "# A[7] * B[2]\n\t"
  37624. "mov %[a], r9\n\t"
  37625. "mov %[b], r10\n\t"
  37626. "ldr %[a], [%[a], #28]\n\t"
  37627. "ldr %[b], [%[b], #8]\n\t"
  37628. "uxth r6, %[a]\n\t"
  37629. "uxth r7, %[b]\n\t"
  37630. #ifdef WOLFSSL_KEIL
  37631. "muls r7, r6, r7\n\t"
  37632. #elif defined(__clang__)
  37633. "muls r7, r6\n\t"
  37634. #else
  37635. "mul r7, r6\n\t"
  37636. #endif
  37637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37638. "adds r3, r3, r7\n\t"
  37639. #else
  37640. "add r3, r3, r7\n\t"
  37641. #endif
  37642. #ifdef WOLFSSL_KEIL
  37643. "adcs r4, r4, %[r]\n\t"
  37644. #elif defined(__clang__)
  37645. "adcs r4, %[r]\n\t"
  37646. #else
  37647. "adc r4, %[r]\n\t"
  37648. #endif
  37649. #ifdef WOLFSSL_KEIL
  37650. "adcs r5, r5, %[r]\n\t"
  37651. #elif defined(__clang__)
  37652. "adcs r5, %[r]\n\t"
  37653. #else
  37654. "adc r5, %[r]\n\t"
  37655. #endif
  37656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37657. "lsrs r7, %[b], #16\n\t"
  37658. #else
  37659. "lsr r7, %[b], #16\n\t"
  37660. #endif
  37661. #ifdef WOLFSSL_KEIL
  37662. "muls r6, r7, r6\n\t"
  37663. #elif defined(__clang__)
  37664. "muls r6, r7\n\t"
  37665. #else
  37666. "mul r6, r7\n\t"
  37667. #endif
  37668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37669. "lsrs r7, r6, #16\n\t"
  37670. #else
  37671. "lsr r7, r6, #16\n\t"
  37672. #endif
  37673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37674. "lsls r6, r6, #16\n\t"
  37675. #else
  37676. "lsl r6, r6, #16\n\t"
  37677. #endif
  37678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37679. "adds r3, r3, r6\n\t"
  37680. #else
  37681. "add r3, r3, r6\n\t"
  37682. #endif
  37683. #ifdef WOLFSSL_KEIL
  37684. "adcs r4, r4, r7\n\t"
  37685. #elif defined(__clang__)
  37686. "adcs r4, r7\n\t"
  37687. #else
  37688. "adc r4, r7\n\t"
  37689. #endif
  37690. #ifdef WOLFSSL_KEIL
  37691. "adcs r5, r5, %[r]\n\t"
  37692. #elif defined(__clang__)
  37693. "adcs r5, %[r]\n\t"
  37694. #else
  37695. "adc r5, %[r]\n\t"
  37696. #endif
  37697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37698. "lsrs r6, %[a], #16\n\t"
  37699. #else
  37700. "lsr r6, %[a], #16\n\t"
  37701. #endif
  37702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37703. "lsrs r7, %[b], #16\n\t"
  37704. #else
  37705. "lsr r7, %[b], #16\n\t"
  37706. #endif
  37707. #ifdef WOLFSSL_KEIL
  37708. "muls r7, r6, r7\n\t"
  37709. #elif defined(__clang__)
  37710. "muls r7, r6\n\t"
  37711. #else
  37712. "mul r7, r6\n\t"
  37713. #endif
  37714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37715. "adds r4, r4, r7\n\t"
  37716. #else
  37717. "add r4, r4, r7\n\t"
  37718. #endif
  37719. #ifdef WOLFSSL_KEIL
  37720. "adcs r5, r5, %[r]\n\t"
  37721. #elif defined(__clang__)
  37722. "adcs r5, %[r]\n\t"
  37723. #else
  37724. "adc r5, %[r]\n\t"
  37725. #endif
  37726. "uxth r7, %[b]\n\t"
  37727. #ifdef WOLFSSL_KEIL
  37728. "muls r6, r7, r6\n\t"
  37729. #elif defined(__clang__)
  37730. "muls r6, r7\n\t"
  37731. #else
  37732. "mul r6, r7\n\t"
  37733. #endif
  37734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37735. "lsrs r7, r6, #16\n\t"
  37736. #else
  37737. "lsr r7, r6, #16\n\t"
  37738. #endif
  37739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37740. "lsls r6, r6, #16\n\t"
  37741. #else
  37742. "lsl r6, r6, #16\n\t"
  37743. #endif
  37744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37745. "adds r3, r3, r6\n\t"
  37746. #else
  37747. "add r3, r3, r6\n\t"
  37748. #endif
  37749. #ifdef WOLFSSL_KEIL
  37750. "adcs r4, r4, r7\n\t"
  37751. #elif defined(__clang__)
  37752. "adcs r4, r7\n\t"
  37753. #else
  37754. "adc r4, r7\n\t"
  37755. #endif
  37756. #ifdef WOLFSSL_KEIL
  37757. "adcs r5, r5, %[r]\n\t"
  37758. #elif defined(__clang__)
  37759. "adcs r5, %[r]\n\t"
  37760. #else
  37761. "adc r5, %[r]\n\t"
  37762. #endif
  37763. "# A[8] * B[1]\n\t"
  37764. "mov %[a], r9\n\t"
  37765. "mov %[b], r10\n\t"
  37766. "ldr %[a], [%[a], #32]\n\t"
  37767. "ldr %[b], [%[b], #4]\n\t"
  37768. "uxth r6, %[a]\n\t"
  37769. "uxth r7, %[b]\n\t"
  37770. #ifdef WOLFSSL_KEIL
  37771. "muls r7, r6, r7\n\t"
  37772. #elif defined(__clang__)
  37773. "muls r7, r6\n\t"
  37774. #else
  37775. "mul r7, r6\n\t"
  37776. #endif
  37777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37778. "adds r3, r3, r7\n\t"
  37779. #else
  37780. "add r3, r3, r7\n\t"
  37781. #endif
  37782. #ifdef WOLFSSL_KEIL
  37783. "adcs r4, r4, %[r]\n\t"
  37784. #elif defined(__clang__)
  37785. "adcs r4, %[r]\n\t"
  37786. #else
  37787. "adc r4, %[r]\n\t"
  37788. #endif
  37789. #ifdef WOLFSSL_KEIL
  37790. "adcs r5, r5, %[r]\n\t"
  37791. #elif defined(__clang__)
  37792. "adcs r5, %[r]\n\t"
  37793. #else
  37794. "adc r5, %[r]\n\t"
  37795. #endif
  37796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37797. "lsrs r7, %[b], #16\n\t"
  37798. #else
  37799. "lsr r7, %[b], #16\n\t"
  37800. #endif
  37801. #ifdef WOLFSSL_KEIL
  37802. "muls r6, r7, r6\n\t"
  37803. #elif defined(__clang__)
  37804. "muls r6, r7\n\t"
  37805. #else
  37806. "mul r6, r7\n\t"
  37807. #endif
  37808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37809. "lsrs r7, r6, #16\n\t"
  37810. #else
  37811. "lsr r7, r6, #16\n\t"
  37812. #endif
  37813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37814. "lsls r6, r6, #16\n\t"
  37815. #else
  37816. "lsl r6, r6, #16\n\t"
  37817. #endif
  37818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37819. "adds r3, r3, r6\n\t"
  37820. #else
  37821. "add r3, r3, r6\n\t"
  37822. #endif
  37823. #ifdef WOLFSSL_KEIL
  37824. "adcs r4, r4, r7\n\t"
  37825. #elif defined(__clang__)
  37826. "adcs r4, r7\n\t"
  37827. #else
  37828. "adc r4, r7\n\t"
  37829. #endif
  37830. #ifdef WOLFSSL_KEIL
  37831. "adcs r5, r5, %[r]\n\t"
  37832. #elif defined(__clang__)
  37833. "adcs r5, %[r]\n\t"
  37834. #else
  37835. "adc r5, %[r]\n\t"
  37836. #endif
  37837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37838. "lsrs r6, %[a], #16\n\t"
  37839. #else
  37840. "lsr r6, %[a], #16\n\t"
  37841. #endif
  37842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37843. "lsrs r7, %[b], #16\n\t"
  37844. #else
  37845. "lsr r7, %[b], #16\n\t"
  37846. #endif
  37847. #ifdef WOLFSSL_KEIL
  37848. "muls r7, r6, r7\n\t"
  37849. #elif defined(__clang__)
  37850. "muls r7, r6\n\t"
  37851. #else
  37852. "mul r7, r6\n\t"
  37853. #endif
  37854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37855. "adds r4, r4, r7\n\t"
  37856. #else
  37857. "add r4, r4, r7\n\t"
  37858. #endif
  37859. #ifdef WOLFSSL_KEIL
  37860. "adcs r5, r5, %[r]\n\t"
  37861. #elif defined(__clang__)
  37862. "adcs r5, %[r]\n\t"
  37863. #else
  37864. "adc r5, %[r]\n\t"
  37865. #endif
  37866. "uxth r7, %[b]\n\t"
  37867. #ifdef WOLFSSL_KEIL
  37868. "muls r6, r7, r6\n\t"
  37869. #elif defined(__clang__)
  37870. "muls r6, r7\n\t"
  37871. #else
  37872. "mul r6, r7\n\t"
  37873. #endif
  37874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37875. "lsrs r7, r6, #16\n\t"
  37876. #else
  37877. "lsr r7, r6, #16\n\t"
  37878. #endif
  37879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37880. "lsls r6, r6, #16\n\t"
  37881. #else
  37882. "lsl r6, r6, #16\n\t"
  37883. #endif
  37884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37885. "adds r3, r3, r6\n\t"
  37886. #else
  37887. "add r3, r3, r6\n\t"
  37888. #endif
  37889. #ifdef WOLFSSL_KEIL
  37890. "adcs r4, r4, r7\n\t"
  37891. #elif defined(__clang__)
  37892. "adcs r4, r7\n\t"
  37893. #else
  37894. "adc r4, r7\n\t"
  37895. #endif
  37896. #ifdef WOLFSSL_KEIL
  37897. "adcs r5, r5, %[r]\n\t"
  37898. #elif defined(__clang__)
  37899. "adcs r5, %[r]\n\t"
  37900. #else
  37901. "adc r5, %[r]\n\t"
  37902. #endif
  37903. "# A[9] * B[0]\n\t"
  37904. "mov %[a], r9\n\t"
  37905. "mov %[b], r10\n\t"
  37906. "ldr %[a], [%[a], #36]\n\t"
  37907. "ldr %[b], [%[b]]\n\t"
  37908. "uxth r6, %[a]\n\t"
  37909. "uxth r7, %[b]\n\t"
  37910. #ifdef WOLFSSL_KEIL
  37911. "muls r7, r6, r7\n\t"
  37912. #elif defined(__clang__)
  37913. "muls r7, r6\n\t"
  37914. #else
  37915. "mul r7, r6\n\t"
  37916. #endif
  37917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37918. "adds r3, r3, r7\n\t"
  37919. #else
  37920. "add r3, r3, r7\n\t"
  37921. #endif
  37922. #ifdef WOLFSSL_KEIL
  37923. "adcs r4, r4, %[r]\n\t"
  37924. #elif defined(__clang__)
  37925. "adcs r4, %[r]\n\t"
  37926. #else
  37927. "adc r4, %[r]\n\t"
  37928. #endif
  37929. #ifdef WOLFSSL_KEIL
  37930. "adcs r5, r5, %[r]\n\t"
  37931. #elif defined(__clang__)
  37932. "adcs r5, %[r]\n\t"
  37933. #else
  37934. "adc r5, %[r]\n\t"
  37935. #endif
  37936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37937. "lsrs r7, %[b], #16\n\t"
  37938. #else
  37939. "lsr r7, %[b], #16\n\t"
  37940. #endif
  37941. #ifdef WOLFSSL_KEIL
  37942. "muls r6, r7, r6\n\t"
  37943. #elif defined(__clang__)
  37944. "muls r6, r7\n\t"
  37945. #else
  37946. "mul r6, r7\n\t"
  37947. #endif
  37948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37949. "lsrs r7, r6, #16\n\t"
  37950. #else
  37951. "lsr r7, r6, #16\n\t"
  37952. #endif
  37953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37954. "lsls r6, r6, #16\n\t"
  37955. #else
  37956. "lsl r6, r6, #16\n\t"
  37957. #endif
  37958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37959. "adds r3, r3, r6\n\t"
  37960. #else
  37961. "add r3, r3, r6\n\t"
  37962. #endif
  37963. #ifdef WOLFSSL_KEIL
  37964. "adcs r4, r4, r7\n\t"
  37965. #elif defined(__clang__)
  37966. "adcs r4, r7\n\t"
  37967. #else
  37968. "adc r4, r7\n\t"
  37969. #endif
  37970. #ifdef WOLFSSL_KEIL
  37971. "adcs r5, r5, %[r]\n\t"
  37972. #elif defined(__clang__)
  37973. "adcs r5, %[r]\n\t"
  37974. #else
  37975. "adc r5, %[r]\n\t"
  37976. #endif
  37977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37978. "lsrs r6, %[a], #16\n\t"
  37979. #else
  37980. "lsr r6, %[a], #16\n\t"
  37981. #endif
  37982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37983. "lsrs r7, %[b], #16\n\t"
  37984. #else
  37985. "lsr r7, %[b], #16\n\t"
  37986. #endif
  37987. #ifdef WOLFSSL_KEIL
  37988. "muls r7, r6, r7\n\t"
  37989. #elif defined(__clang__)
  37990. "muls r7, r6\n\t"
  37991. #else
  37992. "mul r7, r6\n\t"
  37993. #endif
  37994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  37995. "adds r4, r4, r7\n\t"
  37996. #else
  37997. "add r4, r4, r7\n\t"
  37998. #endif
  37999. #ifdef WOLFSSL_KEIL
  38000. "adcs r5, r5, %[r]\n\t"
  38001. #elif defined(__clang__)
  38002. "adcs r5, %[r]\n\t"
  38003. #else
  38004. "adc r5, %[r]\n\t"
  38005. #endif
  38006. "uxth r7, %[b]\n\t"
  38007. #ifdef WOLFSSL_KEIL
  38008. "muls r6, r7, r6\n\t"
  38009. #elif defined(__clang__)
  38010. "muls r6, r7\n\t"
  38011. #else
  38012. "mul r6, r7\n\t"
  38013. #endif
  38014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38015. "lsrs r7, r6, #16\n\t"
  38016. #else
  38017. "lsr r7, r6, #16\n\t"
  38018. #endif
  38019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38020. "lsls r6, r6, #16\n\t"
  38021. #else
  38022. "lsl r6, r6, #16\n\t"
  38023. #endif
  38024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38025. "adds r3, r3, r6\n\t"
  38026. #else
  38027. "add r3, r3, r6\n\t"
  38028. #endif
  38029. #ifdef WOLFSSL_KEIL
  38030. "adcs r4, r4, r7\n\t"
  38031. #elif defined(__clang__)
  38032. "adcs r4, r7\n\t"
  38033. #else
  38034. "adc r4, r7\n\t"
  38035. #endif
  38036. #ifdef WOLFSSL_KEIL
  38037. "adcs r5, r5, %[r]\n\t"
  38038. #elif defined(__clang__)
  38039. "adcs r5, %[r]\n\t"
  38040. #else
  38041. "adc r5, %[r]\n\t"
  38042. #endif
  38043. "str r3, [sp, #36]\n\t"
  38044. "# A[10] * B[0]\n\t"
  38045. "movs r3, #0\n\t"
  38046. "mov %[a], r9\n\t"
  38047. "mov %[b], r10\n\t"
  38048. "ldr %[a], [%[a], #40]\n\t"
  38049. "ldr %[b], [%[b]]\n\t"
  38050. "uxth r6, %[a]\n\t"
  38051. "uxth r7, %[b]\n\t"
  38052. #ifdef WOLFSSL_KEIL
  38053. "muls r7, r6, r7\n\t"
  38054. #elif defined(__clang__)
  38055. "muls r7, r6\n\t"
  38056. #else
  38057. "mul r7, r6\n\t"
  38058. #endif
  38059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38060. "adds r4, r4, r7\n\t"
  38061. #else
  38062. "add r4, r4, r7\n\t"
  38063. #endif
  38064. #ifdef WOLFSSL_KEIL
  38065. "adcs r5, r5, %[r]\n\t"
  38066. #elif defined(__clang__)
  38067. "adcs r5, %[r]\n\t"
  38068. #else
  38069. "adc r5, %[r]\n\t"
  38070. #endif
  38071. #ifdef WOLFSSL_KEIL
  38072. "adcs r3, r3, %[r]\n\t"
  38073. #elif defined(__clang__)
  38074. "adcs r3, %[r]\n\t"
  38075. #else
  38076. "adc r3, %[r]\n\t"
  38077. #endif
  38078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38079. "lsrs r7, %[b], #16\n\t"
  38080. #else
  38081. "lsr r7, %[b], #16\n\t"
  38082. #endif
  38083. #ifdef WOLFSSL_KEIL
  38084. "muls r6, r7, r6\n\t"
  38085. #elif defined(__clang__)
  38086. "muls r6, r7\n\t"
  38087. #else
  38088. "mul r6, r7\n\t"
  38089. #endif
  38090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38091. "lsrs r7, r6, #16\n\t"
  38092. #else
  38093. "lsr r7, r6, #16\n\t"
  38094. #endif
  38095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38096. "lsls r6, r6, #16\n\t"
  38097. #else
  38098. "lsl r6, r6, #16\n\t"
  38099. #endif
  38100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38101. "adds r4, r4, r6\n\t"
  38102. #else
  38103. "add r4, r4, r6\n\t"
  38104. #endif
  38105. #ifdef WOLFSSL_KEIL
  38106. "adcs r5, r5, r7\n\t"
  38107. #elif defined(__clang__)
  38108. "adcs r5, r7\n\t"
  38109. #else
  38110. "adc r5, r7\n\t"
  38111. #endif
  38112. #ifdef WOLFSSL_KEIL
  38113. "adcs r3, r3, %[r]\n\t"
  38114. #elif defined(__clang__)
  38115. "adcs r3, %[r]\n\t"
  38116. #else
  38117. "adc r3, %[r]\n\t"
  38118. #endif
  38119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38120. "lsrs r6, %[a], #16\n\t"
  38121. #else
  38122. "lsr r6, %[a], #16\n\t"
  38123. #endif
  38124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38125. "lsrs r7, %[b], #16\n\t"
  38126. #else
  38127. "lsr r7, %[b], #16\n\t"
  38128. #endif
  38129. #ifdef WOLFSSL_KEIL
  38130. "muls r7, r6, r7\n\t"
  38131. #elif defined(__clang__)
  38132. "muls r7, r6\n\t"
  38133. #else
  38134. "mul r7, r6\n\t"
  38135. #endif
  38136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38137. "adds r5, r5, r7\n\t"
  38138. #else
  38139. "add r5, r5, r7\n\t"
  38140. #endif
  38141. #ifdef WOLFSSL_KEIL
  38142. "adcs r3, r3, %[r]\n\t"
  38143. #elif defined(__clang__)
  38144. "adcs r3, %[r]\n\t"
  38145. #else
  38146. "adc r3, %[r]\n\t"
  38147. #endif
  38148. "uxth r7, %[b]\n\t"
  38149. #ifdef WOLFSSL_KEIL
  38150. "muls r6, r7, r6\n\t"
  38151. #elif defined(__clang__)
  38152. "muls r6, r7\n\t"
  38153. #else
  38154. "mul r6, r7\n\t"
  38155. #endif
  38156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38157. "lsrs r7, r6, #16\n\t"
  38158. #else
  38159. "lsr r7, r6, #16\n\t"
  38160. #endif
  38161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38162. "lsls r6, r6, #16\n\t"
  38163. #else
  38164. "lsl r6, r6, #16\n\t"
  38165. #endif
  38166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38167. "adds r4, r4, r6\n\t"
  38168. #else
  38169. "add r4, r4, r6\n\t"
  38170. #endif
  38171. #ifdef WOLFSSL_KEIL
  38172. "adcs r5, r5, r7\n\t"
  38173. #elif defined(__clang__)
  38174. "adcs r5, r7\n\t"
  38175. #else
  38176. "adc r5, r7\n\t"
  38177. #endif
  38178. #ifdef WOLFSSL_KEIL
  38179. "adcs r3, r3, %[r]\n\t"
  38180. #elif defined(__clang__)
  38181. "adcs r3, %[r]\n\t"
  38182. #else
  38183. "adc r3, %[r]\n\t"
  38184. #endif
  38185. "# A[9] * B[1]\n\t"
  38186. "mov %[a], r9\n\t"
  38187. "mov %[b], r10\n\t"
  38188. "ldr %[a], [%[a], #36]\n\t"
  38189. "ldr %[b], [%[b], #4]\n\t"
  38190. "uxth r6, %[a]\n\t"
  38191. "uxth r7, %[b]\n\t"
  38192. #ifdef WOLFSSL_KEIL
  38193. "muls r7, r6, r7\n\t"
  38194. #elif defined(__clang__)
  38195. "muls r7, r6\n\t"
  38196. #else
  38197. "mul r7, r6\n\t"
  38198. #endif
  38199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38200. "adds r4, r4, r7\n\t"
  38201. #else
  38202. "add r4, r4, r7\n\t"
  38203. #endif
  38204. #ifdef WOLFSSL_KEIL
  38205. "adcs r5, r5, %[r]\n\t"
  38206. #elif defined(__clang__)
  38207. "adcs r5, %[r]\n\t"
  38208. #else
  38209. "adc r5, %[r]\n\t"
  38210. #endif
  38211. #ifdef WOLFSSL_KEIL
  38212. "adcs r3, r3, %[r]\n\t"
  38213. #elif defined(__clang__)
  38214. "adcs r3, %[r]\n\t"
  38215. #else
  38216. "adc r3, %[r]\n\t"
  38217. #endif
  38218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38219. "lsrs r7, %[b], #16\n\t"
  38220. #else
  38221. "lsr r7, %[b], #16\n\t"
  38222. #endif
  38223. #ifdef WOLFSSL_KEIL
  38224. "muls r6, r7, r6\n\t"
  38225. #elif defined(__clang__)
  38226. "muls r6, r7\n\t"
  38227. #else
  38228. "mul r6, r7\n\t"
  38229. #endif
  38230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38231. "lsrs r7, r6, #16\n\t"
  38232. #else
  38233. "lsr r7, r6, #16\n\t"
  38234. #endif
  38235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38236. "lsls r6, r6, #16\n\t"
  38237. #else
  38238. "lsl r6, r6, #16\n\t"
  38239. #endif
  38240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38241. "adds r4, r4, r6\n\t"
  38242. #else
  38243. "add r4, r4, r6\n\t"
  38244. #endif
  38245. #ifdef WOLFSSL_KEIL
  38246. "adcs r5, r5, r7\n\t"
  38247. #elif defined(__clang__)
  38248. "adcs r5, r7\n\t"
  38249. #else
  38250. "adc r5, r7\n\t"
  38251. #endif
  38252. #ifdef WOLFSSL_KEIL
  38253. "adcs r3, r3, %[r]\n\t"
  38254. #elif defined(__clang__)
  38255. "adcs r3, %[r]\n\t"
  38256. #else
  38257. "adc r3, %[r]\n\t"
  38258. #endif
  38259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38260. "lsrs r6, %[a], #16\n\t"
  38261. #else
  38262. "lsr r6, %[a], #16\n\t"
  38263. #endif
  38264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38265. "lsrs r7, %[b], #16\n\t"
  38266. #else
  38267. "lsr r7, %[b], #16\n\t"
  38268. #endif
  38269. #ifdef WOLFSSL_KEIL
  38270. "muls r7, r6, r7\n\t"
  38271. #elif defined(__clang__)
  38272. "muls r7, r6\n\t"
  38273. #else
  38274. "mul r7, r6\n\t"
  38275. #endif
  38276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38277. "adds r5, r5, r7\n\t"
  38278. #else
  38279. "add r5, r5, r7\n\t"
  38280. #endif
  38281. #ifdef WOLFSSL_KEIL
  38282. "adcs r3, r3, %[r]\n\t"
  38283. #elif defined(__clang__)
  38284. "adcs r3, %[r]\n\t"
  38285. #else
  38286. "adc r3, %[r]\n\t"
  38287. #endif
  38288. "uxth r7, %[b]\n\t"
  38289. #ifdef WOLFSSL_KEIL
  38290. "muls r6, r7, r6\n\t"
  38291. #elif defined(__clang__)
  38292. "muls r6, r7\n\t"
  38293. #else
  38294. "mul r6, r7\n\t"
  38295. #endif
  38296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38297. "lsrs r7, r6, #16\n\t"
  38298. #else
  38299. "lsr r7, r6, #16\n\t"
  38300. #endif
  38301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38302. "lsls r6, r6, #16\n\t"
  38303. #else
  38304. "lsl r6, r6, #16\n\t"
  38305. #endif
  38306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38307. "adds r4, r4, r6\n\t"
  38308. #else
  38309. "add r4, r4, r6\n\t"
  38310. #endif
  38311. #ifdef WOLFSSL_KEIL
  38312. "adcs r5, r5, r7\n\t"
  38313. #elif defined(__clang__)
  38314. "adcs r5, r7\n\t"
  38315. #else
  38316. "adc r5, r7\n\t"
  38317. #endif
  38318. #ifdef WOLFSSL_KEIL
  38319. "adcs r3, r3, %[r]\n\t"
  38320. #elif defined(__clang__)
  38321. "adcs r3, %[r]\n\t"
  38322. #else
  38323. "adc r3, %[r]\n\t"
  38324. #endif
  38325. "# A[8] * B[2]\n\t"
  38326. "mov %[a], r9\n\t"
  38327. "mov %[b], r10\n\t"
  38328. "ldr %[a], [%[a], #32]\n\t"
  38329. "ldr %[b], [%[b], #8]\n\t"
  38330. "uxth r6, %[a]\n\t"
  38331. "uxth r7, %[b]\n\t"
  38332. #ifdef WOLFSSL_KEIL
  38333. "muls r7, r6, r7\n\t"
  38334. #elif defined(__clang__)
  38335. "muls r7, r6\n\t"
  38336. #else
  38337. "mul r7, r6\n\t"
  38338. #endif
  38339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38340. "adds r4, r4, r7\n\t"
  38341. #else
  38342. "add r4, r4, r7\n\t"
  38343. #endif
  38344. #ifdef WOLFSSL_KEIL
  38345. "adcs r5, r5, %[r]\n\t"
  38346. #elif defined(__clang__)
  38347. "adcs r5, %[r]\n\t"
  38348. #else
  38349. "adc r5, %[r]\n\t"
  38350. #endif
  38351. #ifdef WOLFSSL_KEIL
  38352. "adcs r3, r3, %[r]\n\t"
  38353. #elif defined(__clang__)
  38354. "adcs r3, %[r]\n\t"
  38355. #else
  38356. "adc r3, %[r]\n\t"
  38357. #endif
  38358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38359. "lsrs r7, %[b], #16\n\t"
  38360. #else
  38361. "lsr r7, %[b], #16\n\t"
  38362. #endif
  38363. #ifdef WOLFSSL_KEIL
  38364. "muls r6, r7, r6\n\t"
  38365. #elif defined(__clang__)
  38366. "muls r6, r7\n\t"
  38367. #else
  38368. "mul r6, r7\n\t"
  38369. #endif
  38370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38371. "lsrs r7, r6, #16\n\t"
  38372. #else
  38373. "lsr r7, r6, #16\n\t"
  38374. #endif
  38375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38376. "lsls r6, r6, #16\n\t"
  38377. #else
  38378. "lsl r6, r6, #16\n\t"
  38379. #endif
  38380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38381. "adds r4, r4, r6\n\t"
  38382. #else
  38383. "add r4, r4, r6\n\t"
  38384. #endif
  38385. #ifdef WOLFSSL_KEIL
  38386. "adcs r5, r5, r7\n\t"
  38387. #elif defined(__clang__)
  38388. "adcs r5, r7\n\t"
  38389. #else
  38390. "adc r5, r7\n\t"
  38391. #endif
  38392. #ifdef WOLFSSL_KEIL
  38393. "adcs r3, r3, %[r]\n\t"
  38394. #elif defined(__clang__)
  38395. "adcs r3, %[r]\n\t"
  38396. #else
  38397. "adc r3, %[r]\n\t"
  38398. #endif
  38399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38400. "lsrs r6, %[a], #16\n\t"
  38401. #else
  38402. "lsr r6, %[a], #16\n\t"
  38403. #endif
  38404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38405. "lsrs r7, %[b], #16\n\t"
  38406. #else
  38407. "lsr r7, %[b], #16\n\t"
  38408. #endif
  38409. #ifdef WOLFSSL_KEIL
  38410. "muls r7, r6, r7\n\t"
  38411. #elif defined(__clang__)
  38412. "muls r7, r6\n\t"
  38413. #else
  38414. "mul r7, r6\n\t"
  38415. #endif
  38416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38417. "adds r5, r5, r7\n\t"
  38418. #else
  38419. "add r5, r5, r7\n\t"
  38420. #endif
  38421. #ifdef WOLFSSL_KEIL
  38422. "adcs r3, r3, %[r]\n\t"
  38423. #elif defined(__clang__)
  38424. "adcs r3, %[r]\n\t"
  38425. #else
  38426. "adc r3, %[r]\n\t"
  38427. #endif
  38428. "uxth r7, %[b]\n\t"
  38429. #ifdef WOLFSSL_KEIL
  38430. "muls r6, r7, r6\n\t"
  38431. #elif defined(__clang__)
  38432. "muls r6, r7\n\t"
  38433. #else
  38434. "mul r6, r7\n\t"
  38435. #endif
  38436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38437. "lsrs r7, r6, #16\n\t"
  38438. #else
  38439. "lsr r7, r6, #16\n\t"
  38440. #endif
  38441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38442. "lsls r6, r6, #16\n\t"
  38443. #else
  38444. "lsl r6, r6, #16\n\t"
  38445. #endif
  38446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38447. "adds r4, r4, r6\n\t"
  38448. #else
  38449. "add r4, r4, r6\n\t"
  38450. #endif
  38451. #ifdef WOLFSSL_KEIL
  38452. "adcs r5, r5, r7\n\t"
  38453. #elif defined(__clang__)
  38454. "adcs r5, r7\n\t"
  38455. #else
  38456. "adc r5, r7\n\t"
  38457. #endif
  38458. #ifdef WOLFSSL_KEIL
  38459. "adcs r3, r3, %[r]\n\t"
  38460. #elif defined(__clang__)
  38461. "adcs r3, %[r]\n\t"
  38462. #else
  38463. "adc r3, %[r]\n\t"
  38464. #endif
  38465. "# A[7] * B[3]\n\t"
  38466. "mov %[a], r9\n\t"
  38467. "mov %[b], r10\n\t"
  38468. "ldr %[a], [%[a], #28]\n\t"
  38469. "ldr %[b], [%[b], #12]\n\t"
  38470. "uxth r6, %[a]\n\t"
  38471. "uxth r7, %[b]\n\t"
  38472. #ifdef WOLFSSL_KEIL
  38473. "muls r7, r6, r7\n\t"
  38474. #elif defined(__clang__)
  38475. "muls r7, r6\n\t"
  38476. #else
  38477. "mul r7, r6\n\t"
  38478. #endif
  38479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38480. "adds r4, r4, r7\n\t"
  38481. #else
  38482. "add r4, r4, r7\n\t"
  38483. #endif
  38484. #ifdef WOLFSSL_KEIL
  38485. "adcs r5, r5, %[r]\n\t"
  38486. #elif defined(__clang__)
  38487. "adcs r5, %[r]\n\t"
  38488. #else
  38489. "adc r5, %[r]\n\t"
  38490. #endif
  38491. #ifdef WOLFSSL_KEIL
  38492. "adcs r3, r3, %[r]\n\t"
  38493. #elif defined(__clang__)
  38494. "adcs r3, %[r]\n\t"
  38495. #else
  38496. "adc r3, %[r]\n\t"
  38497. #endif
  38498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38499. "lsrs r7, %[b], #16\n\t"
  38500. #else
  38501. "lsr r7, %[b], #16\n\t"
  38502. #endif
  38503. #ifdef WOLFSSL_KEIL
  38504. "muls r6, r7, r6\n\t"
  38505. #elif defined(__clang__)
  38506. "muls r6, r7\n\t"
  38507. #else
  38508. "mul r6, r7\n\t"
  38509. #endif
  38510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38511. "lsrs r7, r6, #16\n\t"
  38512. #else
  38513. "lsr r7, r6, #16\n\t"
  38514. #endif
  38515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38516. "lsls r6, r6, #16\n\t"
  38517. #else
  38518. "lsl r6, r6, #16\n\t"
  38519. #endif
  38520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38521. "adds r4, r4, r6\n\t"
  38522. #else
  38523. "add r4, r4, r6\n\t"
  38524. #endif
  38525. #ifdef WOLFSSL_KEIL
  38526. "adcs r5, r5, r7\n\t"
  38527. #elif defined(__clang__)
  38528. "adcs r5, r7\n\t"
  38529. #else
  38530. "adc r5, r7\n\t"
  38531. #endif
  38532. #ifdef WOLFSSL_KEIL
  38533. "adcs r3, r3, %[r]\n\t"
  38534. #elif defined(__clang__)
  38535. "adcs r3, %[r]\n\t"
  38536. #else
  38537. "adc r3, %[r]\n\t"
  38538. #endif
  38539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38540. "lsrs r6, %[a], #16\n\t"
  38541. #else
  38542. "lsr r6, %[a], #16\n\t"
  38543. #endif
  38544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38545. "lsrs r7, %[b], #16\n\t"
  38546. #else
  38547. "lsr r7, %[b], #16\n\t"
  38548. #endif
  38549. #ifdef WOLFSSL_KEIL
  38550. "muls r7, r6, r7\n\t"
  38551. #elif defined(__clang__)
  38552. "muls r7, r6\n\t"
  38553. #else
  38554. "mul r7, r6\n\t"
  38555. #endif
  38556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38557. "adds r5, r5, r7\n\t"
  38558. #else
  38559. "add r5, r5, r7\n\t"
  38560. #endif
  38561. #ifdef WOLFSSL_KEIL
  38562. "adcs r3, r3, %[r]\n\t"
  38563. #elif defined(__clang__)
  38564. "adcs r3, %[r]\n\t"
  38565. #else
  38566. "adc r3, %[r]\n\t"
  38567. #endif
  38568. "uxth r7, %[b]\n\t"
  38569. #ifdef WOLFSSL_KEIL
  38570. "muls r6, r7, r6\n\t"
  38571. #elif defined(__clang__)
  38572. "muls r6, r7\n\t"
  38573. #else
  38574. "mul r6, r7\n\t"
  38575. #endif
  38576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38577. "lsrs r7, r6, #16\n\t"
  38578. #else
  38579. "lsr r7, r6, #16\n\t"
  38580. #endif
  38581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38582. "lsls r6, r6, #16\n\t"
  38583. #else
  38584. "lsl r6, r6, #16\n\t"
  38585. #endif
  38586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38587. "adds r4, r4, r6\n\t"
  38588. #else
  38589. "add r4, r4, r6\n\t"
  38590. #endif
  38591. #ifdef WOLFSSL_KEIL
  38592. "adcs r5, r5, r7\n\t"
  38593. #elif defined(__clang__)
  38594. "adcs r5, r7\n\t"
  38595. #else
  38596. "adc r5, r7\n\t"
  38597. #endif
  38598. #ifdef WOLFSSL_KEIL
  38599. "adcs r3, r3, %[r]\n\t"
  38600. #elif defined(__clang__)
  38601. "adcs r3, %[r]\n\t"
  38602. #else
  38603. "adc r3, %[r]\n\t"
  38604. #endif
  38605. "# A[6] * B[4]\n\t"
  38606. "mov %[a], r9\n\t"
  38607. "mov %[b], r10\n\t"
  38608. "ldr %[a], [%[a], #24]\n\t"
  38609. "ldr %[b], [%[b], #16]\n\t"
  38610. "uxth r6, %[a]\n\t"
  38611. "uxth r7, %[b]\n\t"
  38612. #ifdef WOLFSSL_KEIL
  38613. "muls r7, r6, r7\n\t"
  38614. #elif defined(__clang__)
  38615. "muls r7, r6\n\t"
  38616. #else
  38617. "mul r7, r6\n\t"
  38618. #endif
  38619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38620. "adds r4, r4, r7\n\t"
  38621. #else
  38622. "add r4, r4, r7\n\t"
  38623. #endif
  38624. #ifdef WOLFSSL_KEIL
  38625. "adcs r5, r5, %[r]\n\t"
  38626. #elif defined(__clang__)
  38627. "adcs r5, %[r]\n\t"
  38628. #else
  38629. "adc r5, %[r]\n\t"
  38630. #endif
  38631. #ifdef WOLFSSL_KEIL
  38632. "adcs r3, r3, %[r]\n\t"
  38633. #elif defined(__clang__)
  38634. "adcs r3, %[r]\n\t"
  38635. #else
  38636. "adc r3, %[r]\n\t"
  38637. #endif
  38638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38639. "lsrs r7, %[b], #16\n\t"
  38640. #else
  38641. "lsr r7, %[b], #16\n\t"
  38642. #endif
  38643. #ifdef WOLFSSL_KEIL
  38644. "muls r6, r7, r6\n\t"
  38645. #elif defined(__clang__)
  38646. "muls r6, r7\n\t"
  38647. #else
  38648. "mul r6, r7\n\t"
  38649. #endif
  38650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38651. "lsrs r7, r6, #16\n\t"
  38652. #else
  38653. "lsr r7, r6, #16\n\t"
  38654. #endif
  38655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38656. "lsls r6, r6, #16\n\t"
  38657. #else
  38658. "lsl r6, r6, #16\n\t"
  38659. #endif
  38660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38661. "adds r4, r4, r6\n\t"
  38662. #else
  38663. "add r4, r4, r6\n\t"
  38664. #endif
  38665. #ifdef WOLFSSL_KEIL
  38666. "adcs r5, r5, r7\n\t"
  38667. #elif defined(__clang__)
  38668. "adcs r5, r7\n\t"
  38669. #else
  38670. "adc r5, r7\n\t"
  38671. #endif
  38672. #ifdef WOLFSSL_KEIL
  38673. "adcs r3, r3, %[r]\n\t"
  38674. #elif defined(__clang__)
  38675. "adcs r3, %[r]\n\t"
  38676. #else
  38677. "adc r3, %[r]\n\t"
  38678. #endif
  38679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38680. "lsrs r6, %[a], #16\n\t"
  38681. #else
  38682. "lsr r6, %[a], #16\n\t"
  38683. #endif
  38684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38685. "lsrs r7, %[b], #16\n\t"
  38686. #else
  38687. "lsr r7, %[b], #16\n\t"
  38688. #endif
  38689. #ifdef WOLFSSL_KEIL
  38690. "muls r7, r6, r7\n\t"
  38691. #elif defined(__clang__)
  38692. "muls r7, r6\n\t"
  38693. #else
  38694. "mul r7, r6\n\t"
  38695. #endif
  38696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38697. "adds r5, r5, r7\n\t"
  38698. #else
  38699. "add r5, r5, r7\n\t"
  38700. #endif
  38701. #ifdef WOLFSSL_KEIL
  38702. "adcs r3, r3, %[r]\n\t"
  38703. #elif defined(__clang__)
  38704. "adcs r3, %[r]\n\t"
  38705. #else
  38706. "adc r3, %[r]\n\t"
  38707. #endif
  38708. "uxth r7, %[b]\n\t"
  38709. #ifdef WOLFSSL_KEIL
  38710. "muls r6, r7, r6\n\t"
  38711. #elif defined(__clang__)
  38712. "muls r6, r7\n\t"
  38713. #else
  38714. "mul r6, r7\n\t"
  38715. #endif
  38716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38717. "lsrs r7, r6, #16\n\t"
  38718. #else
  38719. "lsr r7, r6, #16\n\t"
  38720. #endif
  38721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38722. "lsls r6, r6, #16\n\t"
  38723. #else
  38724. "lsl r6, r6, #16\n\t"
  38725. #endif
  38726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38727. "adds r4, r4, r6\n\t"
  38728. #else
  38729. "add r4, r4, r6\n\t"
  38730. #endif
  38731. #ifdef WOLFSSL_KEIL
  38732. "adcs r5, r5, r7\n\t"
  38733. #elif defined(__clang__)
  38734. "adcs r5, r7\n\t"
  38735. #else
  38736. "adc r5, r7\n\t"
  38737. #endif
  38738. #ifdef WOLFSSL_KEIL
  38739. "adcs r3, r3, %[r]\n\t"
  38740. #elif defined(__clang__)
  38741. "adcs r3, %[r]\n\t"
  38742. #else
  38743. "adc r3, %[r]\n\t"
  38744. #endif
  38745. "# A[5] * B[5]\n\t"
  38746. "mov %[a], r9\n\t"
  38747. "mov %[b], r10\n\t"
  38748. "ldr %[a], [%[a], #20]\n\t"
  38749. "ldr %[b], [%[b], #20]\n\t"
  38750. "uxth r6, %[a]\n\t"
  38751. "uxth r7, %[b]\n\t"
  38752. #ifdef WOLFSSL_KEIL
  38753. "muls r7, r6, r7\n\t"
  38754. #elif defined(__clang__)
  38755. "muls r7, r6\n\t"
  38756. #else
  38757. "mul r7, r6\n\t"
  38758. #endif
  38759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38760. "adds r4, r4, r7\n\t"
  38761. #else
  38762. "add r4, r4, r7\n\t"
  38763. #endif
  38764. #ifdef WOLFSSL_KEIL
  38765. "adcs r5, r5, %[r]\n\t"
  38766. #elif defined(__clang__)
  38767. "adcs r5, %[r]\n\t"
  38768. #else
  38769. "adc r5, %[r]\n\t"
  38770. #endif
  38771. #ifdef WOLFSSL_KEIL
  38772. "adcs r3, r3, %[r]\n\t"
  38773. #elif defined(__clang__)
  38774. "adcs r3, %[r]\n\t"
  38775. #else
  38776. "adc r3, %[r]\n\t"
  38777. #endif
  38778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38779. "lsrs r7, %[b], #16\n\t"
  38780. #else
  38781. "lsr r7, %[b], #16\n\t"
  38782. #endif
  38783. #ifdef WOLFSSL_KEIL
  38784. "muls r6, r7, r6\n\t"
  38785. #elif defined(__clang__)
  38786. "muls r6, r7\n\t"
  38787. #else
  38788. "mul r6, r7\n\t"
  38789. #endif
  38790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38791. "lsrs r7, r6, #16\n\t"
  38792. #else
  38793. "lsr r7, r6, #16\n\t"
  38794. #endif
  38795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38796. "lsls r6, r6, #16\n\t"
  38797. #else
  38798. "lsl r6, r6, #16\n\t"
  38799. #endif
  38800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38801. "adds r4, r4, r6\n\t"
  38802. #else
  38803. "add r4, r4, r6\n\t"
  38804. #endif
  38805. #ifdef WOLFSSL_KEIL
  38806. "adcs r5, r5, r7\n\t"
  38807. #elif defined(__clang__)
  38808. "adcs r5, r7\n\t"
  38809. #else
  38810. "adc r5, r7\n\t"
  38811. #endif
  38812. #ifdef WOLFSSL_KEIL
  38813. "adcs r3, r3, %[r]\n\t"
  38814. #elif defined(__clang__)
  38815. "adcs r3, %[r]\n\t"
  38816. #else
  38817. "adc r3, %[r]\n\t"
  38818. #endif
  38819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38820. "lsrs r6, %[a], #16\n\t"
  38821. #else
  38822. "lsr r6, %[a], #16\n\t"
  38823. #endif
  38824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38825. "lsrs r7, %[b], #16\n\t"
  38826. #else
  38827. "lsr r7, %[b], #16\n\t"
  38828. #endif
  38829. #ifdef WOLFSSL_KEIL
  38830. "muls r7, r6, r7\n\t"
  38831. #elif defined(__clang__)
  38832. "muls r7, r6\n\t"
  38833. #else
  38834. "mul r7, r6\n\t"
  38835. #endif
  38836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38837. "adds r5, r5, r7\n\t"
  38838. #else
  38839. "add r5, r5, r7\n\t"
  38840. #endif
  38841. #ifdef WOLFSSL_KEIL
  38842. "adcs r3, r3, %[r]\n\t"
  38843. #elif defined(__clang__)
  38844. "adcs r3, %[r]\n\t"
  38845. #else
  38846. "adc r3, %[r]\n\t"
  38847. #endif
  38848. "uxth r7, %[b]\n\t"
  38849. #ifdef WOLFSSL_KEIL
  38850. "muls r6, r7, r6\n\t"
  38851. #elif defined(__clang__)
  38852. "muls r6, r7\n\t"
  38853. #else
  38854. "mul r6, r7\n\t"
  38855. #endif
  38856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38857. "lsrs r7, r6, #16\n\t"
  38858. #else
  38859. "lsr r7, r6, #16\n\t"
  38860. #endif
  38861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38862. "lsls r6, r6, #16\n\t"
  38863. #else
  38864. "lsl r6, r6, #16\n\t"
  38865. #endif
  38866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38867. "adds r4, r4, r6\n\t"
  38868. #else
  38869. "add r4, r4, r6\n\t"
  38870. #endif
  38871. #ifdef WOLFSSL_KEIL
  38872. "adcs r5, r5, r7\n\t"
  38873. #elif defined(__clang__)
  38874. "adcs r5, r7\n\t"
  38875. #else
  38876. "adc r5, r7\n\t"
  38877. #endif
  38878. #ifdef WOLFSSL_KEIL
  38879. "adcs r3, r3, %[r]\n\t"
  38880. #elif defined(__clang__)
  38881. "adcs r3, %[r]\n\t"
  38882. #else
  38883. "adc r3, %[r]\n\t"
  38884. #endif
  38885. "# A[4] * B[6]\n\t"
  38886. "mov %[a], r9\n\t"
  38887. "mov %[b], r10\n\t"
  38888. "ldr %[a], [%[a], #16]\n\t"
  38889. "ldr %[b], [%[b], #24]\n\t"
  38890. "uxth r6, %[a]\n\t"
  38891. "uxth r7, %[b]\n\t"
  38892. #ifdef WOLFSSL_KEIL
  38893. "muls r7, r6, r7\n\t"
  38894. #elif defined(__clang__)
  38895. "muls r7, r6\n\t"
  38896. #else
  38897. "mul r7, r6\n\t"
  38898. #endif
  38899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38900. "adds r4, r4, r7\n\t"
  38901. #else
  38902. "add r4, r4, r7\n\t"
  38903. #endif
  38904. #ifdef WOLFSSL_KEIL
  38905. "adcs r5, r5, %[r]\n\t"
  38906. #elif defined(__clang__)
  38907. "adcs r5, %[r]\n\t"
  38908. #else
  38909. "adc r5, %[r]\n\t"
  38910. #endif
  38911. #ifdef WOLFSSL_KEIL
  38912. "adcs r3, r3, %[r]\n\t"
  38913. #elif defined(__clang__)
  38914. "adcs r3, %[r]\n\t"
  38915. #else
  38916. "adc r3, %[r]\n\t"
  38917. #endif
  38918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38919. "lsrs r7, %[b], #16\n\t"
  38920. #else
  38921. "lsr r7, %[b], #16\n\t"
  38922. #endif
  38923. #ifdef WOLFSSL_KEIL
  38924. "muls r6, r7, r6\n\t"
  38925. #elif defined(__clang__)
  38926. "muls r6, r7\n\t"
  38927. #else
  38928. "mul r6, r7\n\t"
  38929. #endif
  38930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38931. "lsrs r7, r6, #16\n\t"
  38932. #else
  38933. "lsr r7, r6, #16\n\t"
  38934. #endif
  38935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38936. "lsls r6, r6, #16\n\t"
  38937. #else
  38938. "lsl r6, r6, #16\n\t"
  38939. #endif
  38940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38941. "adds r4, r4, r6\n\t"
  38942. #else
  38943. "add r4, r4, r6\n\t"
  38944. #endif
  38945. #ifdef WOLFSSL_KEIL
  38946. "adcs r5, r5, r7\n\t"
  38947. #elif defined(__clang__)
  38948. "adcs r5, r7\n\t"
  38949. #else
  38950. "adc r5, r7\n\t"
  38951. #endif
  38952. #ifdef WOLFSSL_KEIL
  38953. "adcs r3, r3, %[r]\n\t"
  38954. #elif defined(__clang__)
  38955. "adcs r3, %[r]\n\t"
  38956. #else
  38957. "adc r3, %[r]\n\t"
  38958. #endif
  38959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38960. "lsrs r6, %[a], #16\n\t"
  38961. #else
  38962. "lsr r6, %[a], #16\n\t"
  38963. #endif
  38964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38965. "lsrs r7, %[b], #16\n\t"
  38966. #else
  38967. "lsr r7, %[b], #16\n\t"
  38968. #endif
  38969. #ifdef WOLFSSL_KEIL
  38970. "muls r7, r6, r7\n\t"
  38971. #elif defined(__clang__)
  38972. "muls r7, r6\n\t"
  38973. #else
  38974. "mul r7, r6\n\t"
  38975. #endif
  38976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38977. "adds r5, r5, r7\n\t"
  38978. #else
  38979. "add r5, r5, r7\n\t"
  38980. #endif
  38981. #ifdef WOLFSSL_KEIL
  38982. "adcs r3, r3, %[r]\n\t"
  38983. #elif defined(__clang__)
  38984. "adcs r3, %[r]\n\t"
  38985. #else
  38986. "adc r3, %[r]\n\t"
  38987. #endif
  38988. "uxth r7, %[b]\n\t"
  38989. #ifdef WOLFSSL_KEIL
  38990. "muls r6, r7, r6\n\t"
  38991. #elif defined(__clang__)
  38992. "muls r6, r7\n\t"
  38993. #else
  38994. "mul r6, r7\n\t"
  38995. #endif
  38996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  38997. "lsrs r7, r6, #16\n\t"
  38998. #else
  38999. "lsr r7, r6, #16\n\t"
  39000. #endif
  39001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39002. "lsls r6, r6, #16\n\t"
  39003. #else
  39004. "lsl r6, r6, #16\n\t"
  39005. #endif
  39006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39007. "adds r4, r4, r6\n\t"
  39008. #else
  39009. "add r4, r4, r6\n\t"
  39010. #endif
  39011. #ifdef WOLFSSL_KEIL
  39012. "adcs r5, r5, r7\n\t"
  39013. #elif defined(__clang__)
  39014. "adcs r5, r7\n\t"
  39015. #else
  39016. "adc r5, r7\n\t"
  39017. #endif
  39018. #ifdef WOLFSSL_KEIL
  39019. "adcs r3, r3, %[r]\n\t"
  39020. #elif defined(__clang__)
  39021. "adcs r3, %[r]\n\t"
  39022. #else
  39023. "adc r3, %[r]\n\t"
  39024. #endif
  39025. "# A[3] * B[7]\n\t"
  39026. "mov %[a], r9\n\t"
  39027. "mov %[b], r10\n\t"
  39028. "ldr %[a], [%[a], #12]\n\t"
  39029. "ldr %[b], [%[b], #28]\n\t"
  39030. "uxth r6, %[a]\n\t"
  39031. "uxth r7, %[b]\n\t"
  39032. #ifdef WOLFSSL_KEIL
  39033. "muls r7, r6, r7\n\t"
  39034. #elif defined(__clang__)
  39035. "muls r7, r6\n\t"
  39036. #else
  39037. "mul r7, r6\n\t"
  39038. #endif
  39039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39040. "adds r4, r4, r7\n\t"
  39041. #else
  39042. "add r4, r4, r7\n\t"
  39043. #endif
  39044. #ifdef WOLFSSL_KEIL
  39045. "adcs r5, r5, %[r]\n\t"
  39046. #elif defined(__clang__)
  39047. "adcs r5, %[r]\n\t"
  39048. #else
  39049. "adc r5, %[r]\n\t"
  39050. #endif
  39051. #ifdef WOLFSSL_KEIL
  39052. "adcs r3, r3, %[r]\n\t"
  39053. #elif defined(__clang__)
  39054. "adcs r3, %[r]\n\t"
  39055. #else
  39056. "adc r3, %[r]\n\t"
  39057. #endif
  39058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39059. "lsrs r7, %[b], #16\n\t"
  39060. #else
  39061. "lsr r7, %[b], #16\n\t"
  39062. #endif
  39063. #ifdef WOLFSSL_KEIL
  39064. "muls r6, r7, r6\n\t"
  39065. #elif defined(__clang__)
  39066. "muls r6, r7\n\t"
  39067. #else
  39068. "mul r6, r7\n\t"
  39069. #endif
  39070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39071. "lsrs r7, r6, #16\n\t"
  39072. #else
  39073. "lsr r7, r6, #16\n\t"
  39074. #endif
  39075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39076. "lsls r6, r6, #16\n\t"
  39077. #else
  39078. "lsl r6, r6, #16\n\t"
  39079. #endif
  39080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39081. "adds r4, r4, r6\n\t"
  39082. #else
  39083. "add r4, r4, r6\n\t"
  39084. #endif
  39085. #ifdef WOLFSSL_KEIL
  39086. "adcs r5, r5, r7\n\t"
  39087. #elif defined(__clang__)
  39088. "adcs r5, r7\n\t"
  39089. #else
  39090. "adc r5, r7\n\t"
  39091. #endif
  39092. #ifdef WOLFSSL_KEIL
  39093. "adcs r3, r3, %[r]\n\t"
  39094. #elif defined(__clang__)
  39095. "adcs r3, %[r]\n\t"
  39096. #else
  39097. "adc r3, %[r]\n\t"
  39098. #endif
  39099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39100. "lsrs r6, %[a], #16\n\t"
  39101. #else
  39102. "lsr r6, %[a], #16\n\t"
  39103. #endif
  39104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39105. "lsrs r7, %[b], #16\n\t"
  39106. #else
  39107. "lsr r7, %[b], #16\n\t"
  39108. #endif
  39109. #ifdef WOLFSSL_KEIL
  39110. "muls r7, r6, r7\n\t"
  39111. #elif defined(__clang__)
  39112. "muls r7, r6\n\t"
  39113. #else
  39114. "mul r7, r6\n\t"
  39115. #endif
  39116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39117. "adds r5, r5, r7\n\t"
  39118. #else
  39119. "add r5, r5, r7\n\t"
  39120. #endif
  39121. #ifdef WOLFSSL_KEIL
  39122. "adcs r3, r3, %[r]\n\t"
  39123. #elif defined(__clang__)
  39124. "adcs r3, %[r]\n\t"
  39125. #else
  39126. "adc r3, %[r]\n\t"
  39127. #endif
  39128. "uxth r7, %[b]\n\t"
  39129. #ifdef WOLFSSL_KEIL
  39130. "muls r6, r7, r6\n\t"
  39131. #elif defined(__clang__)
  39132. "muls r6, r7\n\t"
  39133. #else
  39134. "mul r6, r7\n\t"
  39135. #endif
  39136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39137. "lsrs r7, r6, #16\n\t"
  39138. #else
  39139. "lsr r7, r6, #16\n\t"
  39140. #endif
  39141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39142. "lsls r6, r6, #16\n\t"
  39143. #else
  39144. "lsl r6, r6, #16\n\t"
  39145. #endif
  39146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39147. "adds r4, r4, r6\n\t"
  39148. #else
  39149. "add r4, r4, r6\n\t"
  39150. #endif
  39151. #ifdef WOLFSSL_KEIL
  39152. "adcs r5, r5, r7\n\t"
  39153. #elif defined(__clang__)
  39154. "adcs r5, r7\n\t"
  39155. #else
  39156. "adc r5, r7\n\t"
  39157. #endif
  39158. #ifdef WOLFSSL_KEIL
  39159. "adcs r3, r3, %[r]\n\t"
  39160. #elif defined(__clang__)
  39161. "adcs r3, %[r]\n\t"
  39162. #else
  39163. "adc r3, %[r]\n\t"
  39164. #endif
  39165. "# A[2] * B[8]\n\t"
  39166. "mov %[a], r9\n\t"
  39167. "mov %[b], r10\n\t"
  39168. "ldr %[a], [%[a], #8]\n\t"
  39169. "ldr %[b], [%[b], #32]\n\t"
  39170. "uxth r6, %[a]\n\t"
  39171. "uxth r7, %[b]\n\t"
  39172. #ifdef WOLFSSL_KEIL
  39173. "muls r7, r6, r7\n\t"
  39174. #elif defined(__clang__)
  39175. "muls r7, r6\n\t"
  39176. #else
  39177. "mul r7, r6\n\t"
  39178. #endif
  39179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39180. "adds r4, r4, r7\n\t"
  39181. #else
  39182. "add r4, r4, r7\n\t"
  39183. #endif
  39184. #ifdef WOLFSSL_KEIL
  39185. "adcs r5, r5, %[r]\n\t"
  39186. #elif defined(__clang__)
  39187. "adcs r5, %[r]\n\t"
  39188. #else
  39189. "adc r5, %[r]\n\t"
  39190. #endif
  39191. #ifdef WOLFSSL_KEIL
  39192. "adcs r3, r3, %[r]\n\t"
  39193. #elif defined(__clang__)
  39194. "adcs r3, %[r]\n\t"
  39195. #else
  39196. "adc r3, %[r]\n\t"
  39197. #endif
  39198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39199. "lsrs r7, %[b], #16\n\t"
  39200. #else
  39201. "lsr r7, %[b], #16\n\t"
  39202. #endif
  39203. #ifdef WOLFSSL_KEIL
  39204. "muls r6, r7, r6\n\t"
  39205. #elif defined(__clang__)
  39206. "muls r6, r7\n\t"
  39207. #else
  39208. "mul r6, r7\n\t"
  39209. #endif
  39210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39211. "lsrs r7, r6, #16\n\t"
  39212. #else
  39213. "lsr r7, r6, #16\n\t"
  39214. #endif
  39215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39216. "lsls r6, r6, #16\n\t"
  39217. #else
  39218. "lsl r6, r6, #16\n\t"
  39219. #endif
  39220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39221. "adds r4, r4, r6\n\t"
  39222. #else
  39223. "add r4, r4, r6\n\t"
  39224. #endif
  39225. #ifdef WOLFSSL_KEIL
  39226. "adcs r5, r5, r7\n\t"
  39227. #elif defined(__clang__)
  39228. "adcs r5, r7\n\t"
  39229. #else
  39230. "adc r5, r7\n\t"
  39231. #endif
  39232. #ifdef WOLFSSL_KEIL
  39233. "adcs r3, r3, %[r]\n\t"
  39234. #elif defined(__clang__)
  39235. "adcs r3, %[r]\n\t"
  39236. #else
  39237. "adc r3, %[r]\n\t"
  39238. #endif
  39239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39240. "lsrs r6, %[a], #16\n\t"
  39241. #else
  39242. "lsr r6, %[a], #16\n\t"
  39243. #endif
  39244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39245. "lsrs r7, %[b], #16\n\t"
  39246. #else
  39247. "lsr r7, %[b], #16\n\t"
  39248. #endif
  39249. #ifdef WOLFSSL_KEIL
  39250. "muls r7, r6, r7\n\t"
  39251. #elif defined(__clang__)
  39252. "muls r7, r6\n\t"
  39253. #else
  39254. "mul r7, r6\n\t"
  39255. #endif
  39256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39257. "adds r5, r5, r7\n\t"
  39258. #else
  39259. "add r5, r5, r7\n\t"
  39260. #endif
  39261. #ifdef WOLFSSL_KEIL
  39262. "adcs r3, r3, %[r]\n\t"
  39263. #elif defined(__clang__)
  39264. "adcs r3, %[r]\n\t"
  39265. #else
  39266. "adc r3, %[r]\n\t"
  39267. #endif
  39268. "uxth r7, %[b]\n\t"
  39269. #ifdef WOLFSSL_KEIL
  39270. "muls r6, r7, r6\n\t"
  39271. #elif defined(__clang__)
  39272. "muls r6, r7\n\t"
  39273. #else
  39274. "mul r6, r7\n\t"
  39275. #endif
  39276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39277. "lsrs r7, r6, #16\n\t"
  39278. #else
  39279. "lsr r7, r6, #16\n\t"
  39280. #endif
  39281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39282. "lsls r6, r6, #16\n\t"
  39283. #else
  39284. "lsl r6, r6, #16\n\t"
  39285. #endif
  39286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39287. "adds r4, r4, r6\n\t"
  39288. #else
  39289. "add r4, r4, r6\n\t"
  39290. #endif
  39291. #ifdef WOLFSSL_KEIL
  39292. "adcs r5, r5, r7\n\t"
  39293. #elif defined(__clang__)
  39294. "adcs r5, r7\n\t"
  39295. #else
  39296. "adc r5, r7\n\t"
  39297. #endif
  39298. #ifdef WOLFSSL_KEIL
  39299. "adcs r3, r3, %[r]\n\t"
  39300. #elif defined(__clang__)
  39301. "adcs r3, %[r]\n\t"
  39302. #else
  39303. "adc r3, %[r]\n\t"
  39304. #endif
  39305. "# A[1] * B[9]\n\t"
  39306. "mov %[a], r9\n\t"
  39307. "mov %[b], r10\n\t"
  39308. "ldr %[a], [%[a], #4]\n\t"
  39309. "ldr %[b], [%[b], #36]\n\t"
  39310. "uxth r6, %[a]\n\t"
  39311. "uxth r7, %[b]\n\t"
  39312. #ifdef WOLFSSL_KEIL
  39313. "muls r7, r6, r7\n\t"
  39314. #elif defined(__clang__)
  39315. "muls r7, r6\n\t"
  39316. #else
  39317. "mul r7, r6\n\t"
  39318. #endif
  39319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39320. "adds r4, r4, r7\n\t"
  39321. #else
  39322. "add r4, r4, r7\n\t"
  39323. #endif
  39324. #ifdef WOLFSSL_KEIL
  39325. "adcs r5, r5, %[r]\n\t"
  39326. #elif defined(__clang__)
  39327. "adcs r5, %[r]\n\t"
  39328. #else
  39329. "adc r5, %[r]\n\t"
  39330. #endif
  39331. #ifdef WOLFSSL_KEIL
  39332. "adcs r3, r3, %[r]\n\t"
  39333. #elif defined(__clang__)
  39334. "adcs r3, %[r]\n\t"
  39335. #else
  39336. "adc r3, %[r]\n\t"
  39337. #endif
  39338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39339. "lsrs r7, %[b], #16\n\t"
  39340. #else
  39341. "lsr r7, %[b], #16\n\t"
  39342. #endif
  39343. #ifdef WOLFSSL_KEIL
  39344. "muls r6, r7, r6\n\t"
  39345. #elif defined(__clang__)
  39346. "muls r6, r7\n\t"
  39347. #else
  39348. "mul r6, r7\n\t"
  39349. #endif
  39350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39351. "lsrs r7, r6, #16\n\t"
  39352. #else
  39353. "lsr r7, r6, #16\n\t"
  39354. #endif
  39355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39356. "lsls r6, r6, #16\n\t"
  39357. #else
  39358. "lsl r6, r6, #16\n\t"
  39359. #endif
  39360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39361. "adds r4, r4, r6\n\t"
  39362. #else
  39363. "add r4, r4, r6\n\t"
  39364. #endif
  39365. #ifdef WOLFSSL_KEIL
  39366. "adcs r5, r5, r7\n\t"
  39367. #elif defined(__clang__)
  39368. "adcs r5, r7\n\t"
  39369. #else
  39370. "adc r5, r7\n\t"
  39371. #endif
  39372. #ifdef WOLFSSL_KEIL
  39373. "adcs r3, r3, %[r]\n\t"
  39374. #elif defined(__clang__)
  39375. "adcs r3, %[r]\n\t"
  39376. #else
  39377. "adc r3, %[r]\n\t"
  39378. #endif
  39379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39380. "lsrs r6, %[a], #16\n\t"
  39381. #else
  39382. "lsr r6, %[a], #16\n\t"
  39383. #endif
  39384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39385. "lsrs r7, %[b], #16\n\t"
  39386. #else
  39387. "lsr r7, %[b], #16\n\t"
  39388. #endif
  39389. #ifdef WOLFSSL_KEIL
  39390. "muls r7, r6, r7\n\t"
  39391. #elif defined(__clang__)
  39392. "muls r7, r6\n\t"
  39393. #else
  39394. "mul r7, r6\n\t"
  39395. #endif
  39396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39397. "adds r5, r5, r7\n\t"
  39398. #else
  39399. "add r5, r5, r7\n\t"
  39400. #endif
  39401. #ifdef WOLFSSL_KEIL
  39402. "adcs r3, r3, %[r]\n\t"
  39403. #elif defined(__clang__)
  39404. "adcs r3, %[r]\n\t"
  39405. #else
  39406. "adc r3, %[r]\n\t"
  39407. #endif
  39408. "uxth r7, %[b]\n\t"
  39409. #ifdef WOLFSSL_KEIL
  39410. "muls r6, r7, r6\n\t"
  39411. #elif defined(__clang__)
  39412. "muls r6, r7\n\t"
  39413. #else
  39414. "mul r6, r7\n\t"
  39415. #endif
  39416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39417. "lsrs r7, r6, #16\n\t"
  39418. #else
  39419. "lsr r7, r6, #16\n\t"
  39420. #endif
  39421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39422. "lsls r6, r6, #16\n\t"
  39423. #else
  39424. "lsl r6, r6, #16\n\t"
  39425. #endif
  39426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39427. "adds r4, r4, r6\n\t"
  39428. #else
  39429. "add r4, r4, r6\n\t"
  39430. #endif
  39431. #ifdef WOLFSSL_KEIL
  39432. "adcs r5, r5, r7\n\t"
  39433. #elif defined(__clang__)
  39434. "adcs r5, r7\n\t"
  39435. #else
  39436. "adc r5, r7\n\t"
  39437. #endif
  39438. #ifdef WOLFSSL_KEIL
  39439. "adcs r3, r3, %[r]\n\t"
  39440. #elif defined(__clang__)
  39441. "adcs r3, %[r]\n\t"
  39442. #else
  39443. "adc r3, %[r]\n\t"
  39444. #endif
  39445. "# A[0] * B[10]\n\t"
  39446. "mov %[a], r9\n\t"
  39447. "mov %[b], r10\n\t"
  39448. "ldr %[a], [%[a]]\n\t"
  39449. "ldr %[b], [%[b], #40]\n\t"
  39450. "uxth r6, %[a]\n\t"
  39451. "uxth r7, %[b]\n\t"
  39452. #ifdef WOLFSSL_KEIL
  39453. "muls r7, r6, r7\n\t"
  39454. #elif defined(__clang__)
  39455. "muls r7, r6\n\t"
  39456. #else
  39457. "mul r7, r6\n\t"
  39458. #endif
  39459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39460. "adds r4, r4, r7\n\t"
  39461. #else
  39462. "add r4, r4, r7\n\t"
  39463. #endif
  39464. #ifdef WOLFSSL_KEIL
  39465. "adcs r5, r5, %[r]\n\t"
  39466. #elif defined(__clang__)
  39467. "adcs r5, %[r]\n\t"
  39468. #else
  39469. "adc r5, %[r]\n\t"
  39470. #endif
  39471. #ifdef WOLFSSL_KEIL
  39472. "adcs r3, r3, %[r]\n\t"
  39473. #elif defined(__clang__)
  39474. "adcs r3, %[r]\n\t"
  39475. #else
  39476. "adc r3, %[r]\n\t"
  39477. #endif
  39478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39479. "lsrs r7, %[b], #16\n\t"
  39480. #else
  39481. "lsr r7, %[b], #16\n\t"
  39482. #endif
  39483. #ifdef WOLFSSL_KEIL
  39484. "muls r6, r7, r6\n\t"
  39485. #elif defined(__clang__)
  39486. "muls r6, r7\n\t"
  39487. #else
  39488. "mul r6, r7\n\t"
  39489. #endif
  39490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39491. "lsrs r7, r6, #16\n\t"
  39492. #else
  39493. "lsr r7, r6, #16\n\t"
  39494. #endif
  39495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39496. "lsls r6, r6, #16\n\t"
  39497. #else
  39498. "lsl r6, r6, #16\n\t"
  39499. #endif
  39500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39501. "adds r4, r4, r6\n\t"
  39502. #else
  39503. "add r4, r4, r6\n\t"
  39504. #endif
  39505. #ifdef WOLFSSL_KEIL
  39506. "adcs r5, r5, r7\n\t"
  39507. #elif defined(__clang__)
  39508. "adcs r5, r7\n\t"
  39509. #else
  39510. "adc r5, r7\n\t"
  39511. #endif
  39512. #ifdef WOLFSSL_KEIL
  39513. "adcs r3, r3, %[r]\n\t"
  39514. #elif defined(__clang__)
  39515. "adcs r3, %[r]\n\t"
  39516. #else
  39517. "adc r3, %[r]\n\t"
  39518. #endif
  39519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39520. "lsrs r6, %[a], #16\n\t"
  39521. #else
  39522. "lsr r6, %[a], #16\n\t"
  39523. #endif
  39524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39525. "lsrs r7, %[b], #16\n\t"
  39526. #else
  39527. "lsr r7, %[b], #16\n\t"
  39528. #endif
  39529. #ifdef WOLFSSL_KEIL
  39530. "muls r7, r6, r7\n\t"
  39531. #elif defined(__clang__)
  39532. "muls r7, r6\n\t"
  39533. #else
  39534. "mul r7, r6\n\t"
  39535. #endif
  39536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39537. "adds r5, r5, r7\n\t"
  39538. #else
  39539. "add r5, r5, r7\n\t"
  39540. #endif
  39541. #ifdef WOLFSSL_KEIL
  39542. "adcs r3, r3, %[r]\n\t"
  39543. #elif defined(__clang__)
  39544. "adcs r3, %[r]\n\t"
  39545. #else
  39546. "adc r3, %[r]\n\t"
  39547. #endif
  39548. "uxth r7, %[b]\n\t"
  39549. #ifdef WOLFSSL_KEIL
  39550. "muls r6, r7, r6\n\t"
  39551. #elif defined(__clang__)
  39552. "muls r6, r7\n\t"
  39553. #else
  39554. "mul r6, r7\n\t"
  39555. #endif
  39556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39557. "lsrs r7, r6, #16\n\t"
  39558. #else
  39559. "lsr r7, r6, #16\n\t"
  39560. #endif
  39561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39562. "lsls r6, r6, #16\n\t"
  39563. #else
  39564. "lsl r6, r6, #16\n\t"
  39565. #endif
  39566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39567. "adds r4, r4, r6\n\t"
  39568. #else
  39569. "add r4, r4, r6\n\t"
  39570. #endif
  39571. #ifdef WOLFSSL_KEIL
  39572. "adcs r5, r5, r7\n\t"
  39573. #elif defined(__clang__)
  39574. "adcs r5, r7\n\t"
  39575. #else
  39576. "adc r5, r7\n\t"
  39577. #endif
  39578. #ifdef WOLFSSL_KEIL
  39579. "adcs r3, r3, %[r]\n\t"
  39580. #elif defined(__clang__)
  39581. "adcs r3, %[r]\n\t"
  39582. #else
  39583. "adc r3, %[r]\n\t"
  39584. #endif
  39585. "str r4, [sp, #40]\n\t"
  39586. "# A[0] * B[11]\n\t"
  39587. "movs r4, #0\n\t"
  39588. "mov %[a], r9\n\t"
  39589. "mov %[b], r10\n\t"
  39590. "ldr %[a], [%[a]]\n\t"
  39591. "ldr %[b], [%[b], #44]\n\t"
  39592. "uxth r6, %[a]\n\t"
  39593. "uxth r7, %[b]\n\t"
  39594. #ifdef WOLFSSL_KEIL
  39595. "muls r7, r6, r7\n\t"
  39596. #elif defined(__clang__)
  39597. "muls r7, r6\n\t"
  39598. #else
  39599. "mul r7, r6\n\t"
  39600. #endif
  39601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39602. "adds r5, r5, r7\n\t"
  39603. #else
  39604. "add r5, r5, r7\n\t"
  39605. #endif
  39606. #ifdef WOLFSSL_KEIL
  39607. "adcs r3, r3, %[r]\n\t"
  39608. #elif defined(__clang__)
  39609. "adcs r3, %[r]\n\t"
  39610. #else
  39611. "adc r3, %[r]\n\t"
  39612. #endif
  39613. #ifdef WOLFSSL_KEIL
  39614. "adcs r4, r4, %[r]\n\t"
  39615. #elif defined(__clang__)
  39616. "adcs r4, %[r]\n\t"
  39617. #else
  39618. "adc r4, %[r]\n\t"
  39619. #endif
  39620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39621. "lsrs r7, %[b], #16\n\t"
  39622. #else
  39623. "lsr r7, %[b], #16\n\t"
  39624. #endif
  39625. #ifdef WOLFSSL_KEIL
  39626. "muls r6, r7, r6\n\t"
  39627. #elif defined(__clang__)
  39628. "muls r6, r7\n\t"
  39629. #else
  39630. "mul r6, r7\n\t"
  39631. #endif
  39632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39633. "lsrs r7, r6, #16\n\t"
  39634. #else
  39635. "lsr r7, r6, #16\n\t"
  39636. #endif
  39637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39638. "lsls r6, r6, #16\n\t"
  39639. #else
  39640. "lsl r6, r6, #16\n\t"
  39641. #endif
  39642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39643. "adds r5, r5, r6\n\t"
  39644. #else
  39645. "add r5, r5, r6\n\t"
  39646. #endif
  39647. #ifdef WOLFSSL_KEIL
  39648. "adcs r3, r3, r7\n\t"
  39649. #elif defined(__clang__)
  39650. "adcs r3, r7\n\t"
  39651. #else
  39652. "adc r3, r7\n\t"
  39653. #endif
  39654. #ifdef WOLFSSL_KEIL
  39655. "adcs r4, r4, %[r]\n\t"
  39656. #elif defined(__clang__)
  39657. "adcs r4, %[r]\n\t"
  39658. #else
  39659. "adc r4, %[r]\n\t"
  39660. #endif
  39661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39662. "lsrs r6, %[a], #16\n\t"
  39663. #else
  39664. "lsr r6, %[a], #16\n\t"
  39665. #endif
  39666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39667. "lsrs r7, %[b], #16\n\t"
  39668. #else
  39669. "lsr r7, %[b], #16\n\t"
  39670. #endif
  39671. #ifdef WOLFSSL_KEIL
  39672. "muls r7, r6, r7\n\t"
  39673. #elif defined(__clang__)
  39674. "muls r7, r6\n\t"
  39675. #else
  39676. "mul r7, r6\n\t"
  39677. #endif
  39678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39679. "adds r3, r3, r7\n\t"
  39680. #else
  39681. "add r3, r3, r7\n\t"
  39682. #endif
  39683. #ifdef WOLFSSL_KEIL
  39684. "adcs r4, r4, %[r]\n\t"
  39685. #elif defined(__clang__)
  39686. "adcs r4, %[r]\n\t"
  39687. #else
  39688. "adc r4, %[r]\n\t"
  39689. #endif
  39690. "uxth r7, %[b]\n\t"
  39691. #ifdef WOLFSSL_KEIL
  39692. "muls r6, r7, r6\n\t"
  39693. #elif defined(__clang__)
  39694. "muls r6, r7\n\t"
  39695. #else
  39696. "mul r6, r7\n\t"
  39697. #endif
  39698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39699. "lsrs r7, r6, #16\n\t"
  39700. #else
  39701. "lsr r7, r6, #16\n\t"
  39702. #endif
  39703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39704. "lsls r6, r6, #16\n\t"
  39705. #else
  39706. "lsl r6, r6, #16\n\t"
  39707. #endif
  39708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39709. "adds r5, r5, r6\n\t"
  39710. #else
  39711. "add r5, r5, r6\n\t"
  39712. #endif
  39713. #ifdef WOLFSSL_KEIL
  39714. "adcs r3, r3, r7\n\t"
  39715. #elif defined(__clang__)
  39716. "adcs r3, r7\n\t"
  39717. #else
  39718. "adc r3, r7\n\t"
  39719. #endif
  39720. #ifdef WOLFSSL_KEIL
  39721. "adcs r4, r4, %[r]\n\t"
  39722. #elif defined(__clang__)
  39723. "adcs r4, %[r]\n\t"
  39724. #else
  39725. "adc r4, %[r]\n\t"
  39726. #endif
  39727. "# A[1] * B[10]\n\t"
  39728. "mov %[a], r9\n\t"
  39729. "mov %[b], r10\n\t"
  39730. "ldr %[a], [%[a], #4]\n\t"
  39731. "ldr %[b], [%[b], #40]\n\t"
  39732. "uxth r6, %[a]\n\t"
  39733. "uxth r7, %[b]\n\t"
  39734. #ifdef WOLFSSL_KEIL
  39735. "muls r7, r6, r7\n\t"
  39736. #elif defined(__clang__)
  39737. "muls r7, r6\n\t"
  39738. #else
  39739. "mul r7, r6\n\t"
  39740. #endif
  39741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39742. "adds r5, r5, r7\n\t"
  39743. #else
  39744. "add r5, r5, r7\n\t"
  39745. #endif
  39746. #ifdef WOLFSSL_KEIL
  39747. "adcs r3, r3, %[r]\n\t"
  39748. #elif defined(__clang__)
  39749. "adcs r3, %[r]\n\t"
  39750. #else
  39751. "adc r3, %[r]\n\t"
  39752. #endif
  39753. #ifdef WOLFSSL_KEIL
  39754. "adcs r4, r4, %[r]\n\t"
  39755. #elif defined(__clang__)
  39756. "adcs r4, %[r]\n\t"
  39757. #else
  39758. "adc r4, %[r]\n\t"
  39759. #endif
  39760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39761. "lsrs r7, %[b], #16\n\t"
  39762. #else
  39763. "lsr r7, %[b], #16\n\t"
  39764. #endif
  39765. #ifdef WOLFSSL_KEIL
  39766. "muls r6, r7, r6\n\t"
  39767. #elif defined(__clang__)
  39768. "muls r6, r7\n\t"
  39769. #else
  39770. "mul r6, r7\n\t"
  39771. #endif
  39772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39773. "lsrs r7, r6, #16\n\t"
  39774. #else
  39775. "lsr r7, r6, #16\n\t"
  39776. #endif
  39777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39778. "lsls r6, r6, #16\n\t"
  39779. #else
  39780. "lsl r6, r6, #16\n\t"
  39781. #endif
  39782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39783. "adds r5, r5, r6\n\t"
  39784. #else
  39785. "add r5, r5, r6\n\t"
  39786. #endif
  39787. #ifdef WOLFSSL_KEIL
  39788. "adcs r3, r3, r7\n\t"
  39789. #elif defined(__clang__)
  39790. "adcs r3, r7\n\t"
  39791. #else
  39792. "adc r3, r7\n\t"
  39793. #endif
  39794. #ifdef WOLFSSL_KEIL
  39795. "adcs r4, r4, %[r]\n\t"
  39796. #elif defined(__clang__)
  39797. "adcs r4, %[r]\n\t"
  39798. #else
  39799. "adc r4, %[r]\n\t"
  39800. #endif
  39801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39802. "lsrs r6, %[a], #16\n\t"
  39803. #else
  39804. "lsr r6, %[a], #16\n\t"
  39805. #endif
  39806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39807. "lsrs r7, %[b], #16\n\t"
  39808. #else
  39809. "lsr r7, %[b], #16\n\t"
  39810. #endif
  39811. #ifdef WOLFSSL_KEIL
  39812. "muls r7, r6, r7\n\t"
  39813. #elif defined(__clang__)
  39814. "muls r7, r6\n\t"
  39815. #else
  39816. "mul r7, r6\n\t"
  39817. #endif
  39818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39819. "adds r3, r3, r7\n\t"
  39820. #else
  39821. "add r3, r3, r7\n\t"
  39822. #endif
  39823. #ifdef WOLFSSL_KEIL
  39824. "adcs r4, r4, %[r]\n\t"
  39825. #elif defined(__clang__)
  39826. "adcs r4, %[r]\n\t"
  39827. #else
  39828. "adc r4, %[r]\n\t"
  39829. #endif
  39830. "uxth r7, %[b]\n\t"
  39831. #ifdef WOLFSSL_KEIL
  39832. "muls r6, r7, r6\n\t"
  39833. #elif defined(__clang__)
  39834. "muls r6, r7\n\t"
  39835. #else
  39836. "mul r6, r7\n\t"
  39837. #endif
  39838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39839. "lsrs r7, r6, #16\n\t"
  39840. #else
  39841. "lsr r7, r6, #16\n\t"
  39842. #endif
  39843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39844. "lsls r6, r6, #16\n\t"
  39845. #else
  39846. "lsl r6, r6, #16\n\t"
  39847. #endif
  39848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39849. "adds r5, r5, r6\n\t"
  39850. #else
  39851. "add r5, r5, r6\n\t"
  39852. #endif
  39853. #ifdef WOLFSSL_KEIL
  39854. "adcs r3, r3, r7\n\t"
  39855. #elif defined(__clang__)
  39856. "adcs r3, r7\n\t"
  39857. #else
  39858. "adc r3, r7\n\t"
  39859. #endif
  39860. #ifdef WOLFSSL_KEIL
  39861. "adcs r4, r4, %[r]\n\t"
  39862. #elif defined(__clang__)
  39863. "adcs r4, %[r]\n\t"
  39864. #else
  39865. "adc r4, %[r]\n\t"
  39866. #endif
  39867. "# A[2] * B[9]\n\t"
  39868. "mov %[a], r9\n\t"
  39869. "mov %[b], r10\n\t"
  39870. "ldr %[a], [%[a], #8]\n\t"
  39871. "ldr %[b], [%[b], #36]\n\t"
  39872. "uxth r6, %[a]\n\t"
  39873. "uxth r7, %[b]\n\t"
  39874. #ifdef WOLFSSL_KEIL
  39875. "muls r7, r6, r7\n\t"
  39876. #elif defined(__clang__)
  39877. "muls r7, r6\n\t"
  39878. #else
  39879. "mul r7, r6\n\t"
  39880. #endif
  39881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39882. "adds r5, r5, r7\n\t"
  39883. #else
  39884. "add r5, r5, r7\n\t"
  39885. #endif
  39886. #ifdef WOLFSSL_KEIL
  39887. "adcs r3, r3, %[r]\n\t"
  39888. #elif defined(__clang__)
  39889. "adcs r3, %[r]\n\t"
  39890. #else
  39891. "adc r3, %[r]\n\t"
  39892. #endif
  39893. #ifdef WOLFSSL_KEIL
  39894. "adcs r4, r4, %[r]\n\t"
  39895. #elif defined(__clang__)
  39896. "adcs r4, %[r]\n\t"
  39897. #else
  39898. "adc r4, %[r]\n\t"
  39899. #endif
  39900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39901. "lsrs r7, %[b], #16\n\t"
  39902. #else
  39903. "lsr r7, %[b], #16\n\t"
  39904. #endif
  39905. #ifdef WOLFSSL_KEIL
  39906. "muls r6, r7, r6\n\t"
  39907. #elif defined(__clang__)
  39908. "muls r6, r7\n\t"
  39909. #else
  39910. "mul r6, r7\n\t"
  39911. #endif
  39912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39913. "lsrs r7, r6, #16\n\t"
  39914. #else
  39915. "lsr r7, r6, #16\n\t"
  39916. #endif
  39917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39918. "lsls r6, r6, #16\n\t"
  39919. #else
  39920. "lsl r6, r6, #16\n\t"
  39921. #endif
  39922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39923. "adds r5, r5, r6\n\t"
  39924. #else
  39925. "add r5, r5, r6\n\t"
  39926. #endif
  39927. #ifdef WOLFSSL_KEIL
  39928. "adcs r3, r3, r7\n\t"
  39929. #elif defined(__clang__)
  39930. "adcs r3, r7\n\t"
  39931. #else
  39932. "adc r3, r7\n\t"
  39933. #endif
  39934. #ifdef WOLFSSL_KEIL
  39935. "adcs r4, r4, %[r]\n\t"
  39936. #elif defined(__clang__)
  39937. "adcs r4, %[r]\n\t"
  39938. #else
  39939. "adc r4, %[r]\n\t"
  39940. #endif
  39941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39942. "lsrs r6, %[a], #16\n\t"
  39943. #else
  39944. "lsr r6, %[a], #16\n\t"
  39945. #endif
  39946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39947. "lsrs r7, %[b], #16\n\t"
  39948. #else
  39949. "lsr r7, %[b], #16\n\t"
  39950. #endif
  39951. #ifdef WOLFSSL_KEIL
  39952. "muls r7, r6, r7\n\t"
  39953. #elif defined(__clang__)
  39954. "muls r7, r6\n\t"
  39955. #else
  39956. "mul r7, r6\n\t"
  39957. #endif
  39958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39959. "adds r3, r3, r7\n\t"
  39960. #else
  39961. "add r3, r3, r7\n\t"
  39962. #endif
  39963. #ifdef WOLFSSL_KEIL
  39964. "adcs r4, r4, %[r]\n\t"
  39965. #elif defined(__clang__)
  39966. "adcs r4, %[r]\n\t"
  39967. #else
  39968. "adc r4, %[r]\n\t"
  39969. #endif
  39970. "uxth r7, %[b]\n\t"
  39971. #ifdef WOLFSSL_KEIL
  39972. "muls r6, r7, r6\n\t"
  39973. #elif defined(__clang__)
  39974. "muls r6, r7\n\t"
  39975. #else
  39976. "mul r6, r7\n\t"
  39977. #endif
  39978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39979. "lsrs r7, r6, #16\n\t"
  39980. #else
  39981. "lsr r7, r6, #16\n\t"
  39982. #endif
  39983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39984. "lsls r6, r6, #16\n\t"
  39985. #else
  39986. "lsl r6, r6, #16\n\t"
  39987. #endif
  39988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  39989. "adds r5, r5, r6\n\t"
  39990. #else
  39991. "add r5, r5, r6\n\t"
  39992. #endif
  39993. #ifdef WOLFSSL_KEIL
  39994. "adcs r3, r3, r7\n\t"
  39995. #elif defined(__clang__)
  39996. "adcs r3, r7\n\t"
  39997. #else
  39998. "adc r3, r7\n\t"
  39999. #endif
  40000. #ifdef WOLFSSL_KEIL
  40001. "adcs r4, r4, %[r]\n\t"
  40002. #elif defined(__clang__)
  40003. "adcs r4, %[r]\n\t"
  40004. #else
  40005. "adc r4, %[r]\n\t"
  40006. #endif
  40007. "# A[3] * B[8]\n\t"
  40008. "mov %[a], r9\n\t"
  40009. "mov %[b], r10\n\t"
  40010. "ldr %[a], [%[a], #12]\n\t"
  40011. "ldr %[b], [%[b], #32]\n\t"
  40012. "uxth r6, %[a]\n\t"
  40013. "uxth r7, %[b]\n\t"
  40014. #ifdef WOLFSSL_KEIL
  40015. "muls r7, r6, r7\n\t"
  40016. #elif defined(__clang__)
  40017. "muls r7, r6\n\t"
  40018. #else
  40019. "mul r7, r6\n\t"
  40020. #endif
  40021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40022. "adds r5, r5, r7\n\t"
  40023. #else
  40024. "add r5, r5, r7\n\t"
  40025. #endif
  40026. #ifdef WOLFSSL_KEIL
  40027. "adcs r3, r3, %[r]\n\t"
  40028. #elif defined(__clang__)
  40029. "adcs r3, %[r]\n\t"
  40030. #else
  40031. "adc r3, %[r]\n\t"
  40032. #endif
  40033. #ifdef WOLFSSL_KEIL
  40034. "adcs r4, r4, %[r]\n\t"
  40035. #elif defined(__clang__)
  40036. "adcs r4, %[r]\n\t"
  40037. #else
  40038. "adc r4, %[r]\n\t"
  40039. #endif
  40040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40041. "lsrs r7, %[b], #16\n\t"
  40042. #else
  40043. "lsr r7, %[b], #16\n\t"
  40044. #endif
  40045. #ifdef WOLFSSL_KEIL
  40046. "muls r6, r7, r6\n\t"
  40047. #elif defined(__clang__)
  40048. "muls r6, r7\n\t"
  40049. #else
  40050. "mul r6, r7\n\t"
  40051. #endif
  40052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40053. "lsrs r7, r6, #16\n\t"
  40054. #else
  40055. "lsr r7, r6, #16\n\t"
  40056. #endif
  40057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40058. "lsls r6, r6, #16\n\t"
  40059. #else
  40060. "lsl r6, r6, #16\n\t"
  40061. #endif
  40062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40063. "adds r5, r5, r6\n\t"
  40064. #else
  40065. "add r5, r5, r6\n\t"
  40066. #endif
  40067. #ifdef WOLFSSL_KEIL
  40068. "adcs r3, r3, r7\n\t"
  40069. #elif defined(__clang__)
  40070. "adcs r3, r7\n\t"
  40071. #else
  40072. "adc r3, r7\n\t"
  40073. #endif
  40074. #ifdef WOLFSSL_KEIL
  40075. "adcs r4, r4, %[r]\n\t"
  40076. #elif defined(__clang__)
  40077. "adcs r4, %[r]\n\t"
  40078. #else
  40079. "adc r4, %[r]\n\t"
  40080. #endif
  40081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40082. "lsrs r6, %[a], #16\n\t"
  40083. #else
  40084. "lsr r6, %[a], #16\n\t"
  40085. #endif
  40086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40087. "lsrs r7, %[b], #16\n\t"
  40088. #else
  40089. "lsr r7, %[b], #16\n\t"
  40090. #endif
  40091. #ifdef WOLFSSL_KEIL
  40092. "muls r7, r6, r7\n\t"
  40093. #elif defined(__clang__)
  40094. "muls r7, r6\n\t"
  40095. #else
  40096. "mul r7, r6\n\t"
  40097. #endif
  40098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40099. "adds r3, r3, r7\n\t"
  40100. #else
  40101. "add r3, r3, r7\n\t"
  40102. #endif
  40103. #ifdef WOLFSSL_KEIL
  40104. "adcs r4, r4, %[r]\n\t"
  40105. #elif defined(__clang__)
  40106. "adcs r4, %[r]\n\t"
  40107. #else
  40108. "adc r4, %[r]\n\t"
  40109. #endif
  40110. "uxth r7, %[b]\n\t"
  40111. #ifdef WOLFSSL_KEIL
  40112. "muls r6, r7, r6\n\t"
  40113. #elif defined(__clang__)
  40114. "muls r6, r7\n\t"
  40115. #else
  40116. "mul r6, r7\n\t"
  40117. #endif
  40118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40119. "lsrs r7, r6, #16\n\t"
  40120. #else
  40121. "lsr r7, r6, #16\n\t"
  40122. #endif
  40123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40124. "lsls r6, r6, #16\n\t"
  40125. #else
  40126. "lsl r6, r6, #16\n\t"
  40127. #endif
  40128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40129. "adds r5, r5, r6\n\t"
  40130. #else
  40131. "add r5, r5, r6\n\t"
  40132. #endif
  40133. #ifdef WOLFSSL_KEIL
  40134. "adcs r3, r3, r7\n\t"
  40135. #elif defined(__clang__)
  40136. "adcs r3, r7\n\t"
  40137. #else
  40138. "adc r3, r7\n\t"
  40139. #endif
  40140. #ifdef WOLFSSL_KEIL
  40141. "adcs r4, r4, %[r]\n\t"
  40142. #elif defined(__clang__)
  40143. "adcs r4, %[r]\n\t"
  40144. #else
  40145. "adc r4, %[r]\n\t"
  40146. #endif
  40147. "# A[4] * B[7]\n\t"
  40148. "mov %[a], r9\n\t"
  40149. "mov %[b], r10\n\t"
  40150. "ldr %[a], [%[a], #16]\n\t"
  40151. "ldr %[b], [%[b], #28]\n\t"
  40152. "uxth r6, %[a]\n\t"
  40153. "uxth r7, %[b]\n\t"
  40154. #ifdef WOLFSSL_KEIL
  40155. "muls r7, r6, r7\n\t"
  40156. #elif defined(__clang__)
  40157. "muls r7, r6\n\t"
  40158. #else
  40159. "mul r7, r6\n\t"
  40160. #endif
  40161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40162. "adds r5, r5, r7\n\t"
  40163. #else
  40164. "add r5, r5, r7\n\t"
  40165. #endif
  40166. #ifdef WOLFSSL_KEIL
  40167. "adcs r3, r3, %[r]\n\t"
  40168. #elif defined(__clang__)
  40169. "adcs r3, %[r]\n\t"
  40170. #else
  40171. "adc r3, %[r]\n\t"
  40172. #endif
  40173. #ifdef WOLFSSL_KEIL
  40174. "adcs r4, r4, %[r]\n\t"
  40175. #elif defined(__clang__)
  40176. "adcs r4, %[r]\n\t"
  40177. #else
  40178. "adc r4, %[r]\n\t"
  40179. #endif
  40180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40181. "lsrs r7, %[b], #16\n\t"
  40182. #else
  40183. "lsr r7, %[b], #16\n\t"
  40184. #endif
  40185. #ifdef WOLFSSL_KEIL
  40186. "muls r6, r7, r6\n\t"
  40187. #elif defined(__clang__)
  40188. "muls r6, r7\n\t"
  40189. #else
  40190. "mul r6, r7\n\t"
  40191. #endif
  40192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40193. "lsrs r7, r6, #16\n\t"
  40194. #else
  40195. "lsr r7, r6, #16\n\t"
  40196. #endif
  40197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40198. "lsls r6, r6, #16\n\t"
  40199. #else
  40200. "lsl r6, r6, #16\n\t"
  40201. #endif
  40202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40203. "adds r5, r5, r6\n\t"
  40204. #else
  40205. "add r5, r5, r6\n\t"
  40206. #endif
  40207. #ifdef WOLFSSL_KEIL
  40208. "adcs r3, r3, r7\n\t"
  40209. #elif defined(__clang__)
  40210. "adcs r3, r7\n\t"
  40211. #else
  40212. "adc r3, r7\n\t"
  40213. #endif
  40214. #ifdef WOLFSSL_KEIL
  40215. "adcs r4, r4, %[r]\n\t"
  40216. #elif defined(__clang__)
  40217. "adcs r4, %[r]\n\t"
  40218. #else
  40219. "adc r4, %[r]\n\t"
  40220. #endif
  40221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40222. "lsrs r6, %[a], #16\n\t"
  40223. #else
  40224. "lsr r6, %[a], #16\n\t"
  40225. #endif
  40226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40227. "lsrs r7, %[b], #16\n\t"
  40228. #else
  40229. "lsr r7, %[b], #16\n\t"
  40230. #endif
  40231. #ifdef WOLFSSL_KEIL
  40232. "muls r7, r6, r7\n\t"
  40233. #elif defined(__clang__)
  40234. "muls r7, r6\n\t"
  40235. #else
  40236. "mul r7, r6\n\t"
  40237. #endif
  40238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40239. "adds r3, r3, r7\n\t"
  40240. #else
  40241. "add r3, r3, r7\n\t"
  40242. #endif
  40243. #ifdef WOLFSSL_KEIL
  40244. "adcs r4, r4, %[r]\n\t"
  40245. #elif defined(__clang__)
  40246. "adcs r4, %[r]\n\t"
  40247. #else
  40248. "adc r4, %[r]\n\t"
  40249. #endif
  40250. "uxth r7, %[b]\n\t"
  40251. #ifdef WOLFSSL_KEIL
  40252. "muls r6, r7, r6\n\t"
  40253. #elif defined(__clang__)
  40254. "muls r6, r7\n\t"
  40255. #else
  40256. "mul r6, r7\n\t"
  40257. #endif
  40258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40259. "lsrs r7, r6, #16\n\t"
  40260. #else
  40261. "lsr r7, r6, #16\n\t"
  40262. #endif
  40263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40264. "lsls r6, r6, #16\n\t"
  40265. #else
  40266. "lsl r6, r6, #16\n\t"
  40267. #endif
  40268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40269. "adds r5, r5, r6\n\t"
  40270. #else
  40271. "add r5, r5, r6\n\t"
  40272. #endif
  40273. #ifdef WOLFSSL_KEIL
  40274. "adcs r3, r3, r7\n\t"
  40275. #elif defined(__clang__)
  40276. "adcs r3, r7\n\t"
  40277. #else
  40278. "adc r3, r7\n\t"
  40279. #endif
  40280. #ifdef WOLFSSL_KEIL
  40281. "adcs r4, r4, %[r]\n\t"
  40282. #elif defined(__clang__)
  40283. "adcs r4, %[r]\n\t"
  40284. #else
  40285. "adc r4, %[r]\n\t"
  40286. #endif
  40287. "# A[5] * B[6]\n\t"
  40288. "mov %[a], r9\n\t"
  40289. "mov %[b], r10\n\t"
  40290. "ldr %[a], [%[a], #20]\n\t"
  40291. "ldr %[b], [%[b], #24]\n\t"
  40292. "uxth r6, %[a]\n\t"
  40293. "uxth r7, %[b]\n\t"
  40294. #ifdef WOLFSSL_KEIL
  40295. "muls r7, r6, r7\n\t"
  40296. #elif defined(__clang__)
  40297. "muls r7, r6\n\t"
  40298. #else
  40299. "mul r7, r6\n\t"
  40300. #endif
  40301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40302. "adds r5, r5, r7\n\t"
  40303. #else
  40304. "add r5, r5, r7\n\t"
  40305. #endif
  40306. #ifdef WOLFSSL_KEIL
  40307. "adcs r3, r3, %[r]\n\t"
  40308. #elif defined(__clang__)
  40309. "adcs r3, %[r]\n\t"
  40310. #else
  40311. "adc r3, %[r]\n\t"
  40312. #endif
  40313. #ifdef WOLFSSL_KEIL
  40314. "adcs r4, r4, %[r]\n\t"
  40315. #elif defined(__clang__)
  40316. "adcs r4, %[r]\n\t"
  40317. #else
  40318. "adc r4, %[r]\n\t"
  40319. #endif
  40320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40321. "lsrs r7, %[b], #16\n\t"
  40322. #else
  40323. "lsr r7, %[b], #16\n\t"
  40324. #endif
  40325. #ifdef WOLFSSL_KEIL
  40326. "muls r6, r7, r6\n\t"
  40327. #elif defined(__clang__)
  40328. "muls r6, r7\n\t"
  40329. #else
  40330. "mul r6, r7\n\t"
  40331. #endif
  40332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40333. "lsrs r7, r6, #16\n\t"
  40334. #else
  40335. "lsr r7, r6, #16\n\t"
  40336. #endif
  40337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40338. "lsls r6, r6, #16\n\t"
  40339. #else
  40340. "lsl r6, r6, #16\n\t"
  40341. #endif
  40342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40343. "adds r5, r5, r6\n\t"
  40344. #else
  40345. "add r5, r5, r6\n\t"
  40346. #endif
  40347. #ifdef WOLFSSL_KEIL
  40348. "adcs r3, r3, r7\n\t"
  40349. #elif defined(__clang__)
  40350. "adcs r3, r7\n\t"
  40351. #else
  40352. "adc r3, r7\n\t"
  40353. #endif
  40354. #ifdef WOLFSSL_KEIL
  40355. "adcs r4, r4, %[r]\n\t"
  40356. #elif defined(__clang__)
  40357. "adcs r4, %[r]\n\t"
  40358. #else
  40359. "adc r4, %[r]\n\t"
  40360. #endif
  40361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40362. "lsrs r6, %[a], #16\n\t"
  40363. #else
  40364. "lsr r6, %[a], #16\n\t"
  40365. #endif
  40366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40367. "lsrs r7, %[b], #16\n\t"
  40368. #else
  40369. "lsr r7, %[b], #16\n\t"
  40370. #endif
  40371. #ifdef WOLFSSL_KEIL
  40372. "muls r7, r6, r7\n\t"
  40373. #elif defined(__clang__)
  40374. "muls r7, r6\n\t"
  40375. #else
  40376. "mul r7, r6\n\t"
  40377. #endif
  40378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40379. "adds r3, r3, r7\n\t"
  40380. #else
  40381. "add r3, r3, r7\n\t"
  40382. #endif
  40383. #ifdef WOLFSSL_KEIL
  40384. "adcs r4, r4, %[r]\n\t"
  40385. #elif defined(__clang__)
  40386. "adcs r4, %[r]\n\t"
  40387. #else
  40388. "adc r4, %[r]\n\t"
  40389. #endif
  40390. "uxth r7, %[b]\n\t"
  40391. #ifdef WOLFSSL_KEIL
  40392. "muls r6, r7, r6\n\t"
  40393. #elif defined(__clang__)
  40394. "muls r6, r7\n\t"
  40395. #else
  40396. "mul r6, r7\n\t"
  40397. #endif
  40398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40399. "lsrs r7, r6, #16\n\t"
  40400. #else
  40401. "lsr r7, r6, #16\n\t"
  40402. #endif
  40403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40404. "lsls r6, r6, #16\n\t"
  40405. #else
  40406. "lsl r6, r6, #16\n\t"
  40407. #endif
  40408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40409. "adds r5, r5, r6\n\t"
  40410. #else
  40411. "add r5, r5, r6\n\t"
  40412. #endif
  40413. #ifdef WOLFSSL_KEIL
  40414. "adcs r3, r3, r7\n\t"
  40415. #elif defined(__clang__)
  40416. "adcs r3, r7\n\t"
  40417. #else
  40418. "adc r3, r7\n\t"
  40419. #endif
  40420. #ifdef WOLFSSL_KEIL
  40421. "adcs r4, r4, %[r]\n\t"
  40422. #elif defined(__clang__)
  40423. "adcs r4, %[r]\n\t"
  40424. #else
  40425. "adc r4, %[r]\n\t"
  40426. #endif
  40427. "# A[6] * B[5]\n\t"
  40428. "mov %[a], r9\n\t"
  40429. "mov %[b], r10\n\t"
  40430. "ldr %[a], [%[a], #24]\n\t"
  40431. "ldr %[b], [%[b], #20]\n\t"
  40432. "uxth r6, %[a]\n\t"
  40433. "uxth r7, %[b]\n\t"
  40434. #ifdef WOLFSSL_KEIL
  40435. "muls r7, r6, r7\n\t"
  40436. #elif defined(__clang__)
  40437. "muls r7, r6\n\t"
  40438. #else
  40439. "mul r7, r6\n\t"
  40440. #endif
  40441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40442. "adds r5, r5, r7\n\t"
  40443. #else
  40444. "add r5, r5, r7\n\t"
  40445. #endif
  40446. #ifdef WOLFSSL_KEIL
  40447. "adcs r3, r3, %[r]\n\t"
  40448. #elif defined(__clang__)
  40449. "adcs r3, %[r]\n\t"
  40450. #else
  40451. "adc r3, %[r]\n\t"
  40452. #endif
  40453. #ifdef WOLFSSL_KEIL
  40454. "adcs r4, r4, %[r]\n\t"
  40455. #elif defined(__clang__)
  40456. "adcs r4, %[r]\n\t"
  40457. #else
  40458. "adc r4, %[r]\n\t"
  40459. #endif
  40460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40461. "lsrs r7, %[b], #16\n\t"
  40462. #else
  40463. "lsr r7, %[b], #16\n\t"
  40464. #endif
  40465. #ifdef WOLFSSL_KEIL
  40466. "muls r6, r7, r6\n\t"
  40467. #elif defined(__clang__)
  40468. "muls r6, r7\n\t"
  40469. #else
  40470. "mul r6, r7\n\t"
  40471. #endif
  40472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40473. "lsrs r7, r6, #16\n\t"
  40474. #else
  40475. "lsr r7, r6, #16\n\t"
  40476. #endif
  40477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40478. "lsls r6, r6, #16\n\t"
  40479. #else
  40480. "lsl r6, r6, #16\n\t"
  40481. #endif
  40482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40483. "adds r5, r5, r6\n\t"
  40484. #else
  40485. "add r5, r5, r6\n\t"
  40486. #endif
  40487. #ifdef WOLFSSL_KEIL
  40488. "adcs r3, r3, r7\n\t"
  40489. #elif defined(__clang__)
  40490. "adcs r3, r7\n\t"
  40491. #else
  40492. "adc r3, r7\n\t"
  40493. #endif
  40494. #ifdef WOLFSSL_KEIL
  40495. "adcs r4, r4, %[r]\n\t"
  40496. #elif defined(__clang__)
  40497. "adcs r4, %[r]\n\t"
  40498. #else
  40499. "adc r4, %[r]\n\t"
  40500. #endif
  40501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40502. "lsrs r6, %[a], #16\n\t"
  40503. #else
  40504. "lsr r6, %[a], #16\n\t"
  40505. #endif
  40506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40507. "lsrs r7, %[b], #16\n\t"
  40508. #else
  40509. "lsr r7, %[b], #16\n\t"
  40510. #endif
  40511. #ifdef WOLFSSL_KEIL
  40512. "muls r7, r6, r7\n\t"
  40513. #elif defined(__clang__)
  40514. "muls r7, r6\n\t"
  40515. #else
  40516. "mul r7, r6\n\t"
  40517. #endif
  40518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40519. "adds r3, r3, r7\n\t"
  40520. #else
  40521. "add r3, r3, r7\n\t"
  40522. #endif
  40523. #ifdef WOLFSSL_KEIL
  40524. "adcs r4, r4, %[r]\n\t"
  40525. #elif defined(__clang__)
  40526. "adcs r4, %[r]\n\t"
  40527. #else
  40528. "adc r4, %[r]\n\t"
  40529. #endif
  40530. "uxth r7, %[b]\n\t"
  40531. #ifdef WOLFSSL_KEIL
  40532. "muls r6, r7, r6\n\t"
  40533. #elif defined(__clang__)
  40534. "muls r6, r7\n\t"
  40535. #else
  40536. "mul r6, r7\n\t"
  40537. #endif
  40538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40539. "lsrs r7, r6, #16\n\t"
  40540. #else
  40541. "lsr r7, r6, #16\n\t"
  40542. #endif
  40543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40544. "lsls r6, r6, #16\n\t"
  40545. #else
  40546. "lsl r6, r6, #16\n\t"
  40547. #endif
  40548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40549. "adds r5, r5, r6\n\t"
  40550. #else
  40551. "add r5, r5, r6\n\t"
  40552. #endif
  40553. #ifdef WOLFSSL_KEIL
  40554. "adcs r3, r3, r7\n\t"
  40555. #elif defined(__clang__)
  40556. "adcs r3, r7\n\t"
  40557. #else
  40558. "adc r3, r7\n\t"
  40559. #endif
  40560. #ifdef WOLFSSL_KEIL
  40561. "adcs r4, r4, %[r]\n\t"
  40562. #elif defined(__clang__)
  40563. "adcs r4, %[r]\n\t"
  40564. #else
  40565. "adc r4, %[r]\n\t"
  40566. #endif
  40567. "# A[7] * B[4]\n\t"
  40568. "mov %[a], r9\n\t"
  40569. "mov %[b], r10\n\t"
  40570. "ldr %[a], [%[a], #28]\n\t"
  40571. "ldr %[b], [%[b], #16]\n\t"
  40572. "uxth r6, %[a]\n\t"
  40573. "uxth r7, %[b]\n\t"
  40574. #ifdef WOLFSSL_KEIL
  40575. "muls r7, r6, r7\n\t"
  40576. #elif defined(__clang__)
  40577. "muls r7, r6\n\t"
  40578. #else
  40579. "mul r7, r6\n\t"
  40580. #endif
  40581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40582. "adds r5, r5, r7\n\t"
  40583. #else
  40584. "add r5, r5, r7\n\t"
  40585. #endif
  40586. #ifdef WOLFSSL_KEIL
  40587. "adcs r3, r3, %[r]\n\t"
  40588. #elif defined(__clang__)
  40589. "adcs r3, %[r]\n\t"
  40590. #else
  40591. "adc r3, %[r]\n\t"
  40592. #endif
  40593. #ifdef WOLFSSL_KEIL
  40594. "adcs r4, r4, %[r]\n\t"
  40595. #elif defined(__clang__)
  40596. "adcs r4, %[r]\n\t"
  40597. #else
  40598. "adc r4, %[r]\n\t"
  40599. #endif
  40600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40601. "lsrs r7, %[b], #16\n\t"
  40602. #else
  40603. "lsr r7, %[b], #16\n\t"
  40604. #endif
  40605. #ifdef WOLFSSL_KEIL
  40606. "muls r6, r7, r6\n\t"
  40607. #elif defined(__clang__)
  40608. "muls r6, r7\n\t"
  40609. #else
  40610. "mul r6, r7\n\t"
  40611. #endif
  40612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40613. "lsrs r7, r6, #16\n\t"
  40614. #else
  40615. "lsr r7, r6, #16\n\t"
  40616. #endif
  40617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40618. "lsls r6, r6, #16\n\t"
  40619. #else
  40620. "lsl r6, r6, #16\n\t"
  40621. #endif
  40622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40623. "adds r5, r5, r6\n\t"
  40624. #else
  40625. "add r5, r5, r6\n\t"
  40626. #endif
  40627. #ifdef WOLFSSL_KEIL
  40628. "adcs r3, r3, r7\n\t"
  40629. #elif defined(__clang__)
  40630. "adcs r3, r7\n\t"
  40631. #else
  40632. "adc r3, r7\n\t"
  40633. #endif
  40634. #ifdef WOLFSSL_KEIL
  40635. "adcs r4, r4, %[r]\n\t"
  40636. #elif defined(__clang__)
  40637. "adcs r4, %[r]\n\t"
  40638. #else
  40639. "adc r4, %[r]\n\t"
  40640. #endif
  40641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40642. "lsrs r6, %[a], #16\n\t"
  40643. #else
  40644. "lsr r6, %[a], #16\n\t"
  40645. #endif
  40646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40647. "lsrs r7, %[b], #16\n\t"
  40648. #else
  40649. "lsr r7, %[b], #16\n\t"
  40650. #endif
  40651. #ifdef WOLFSSL_KEIL
  40652. "muls r7, r6, r7\n\t"
  40653. #elif defined(__clang__)
  40654. "muls r7, r6\n\t"
  40655. #else
  40656. "mul r7, r6\n\t"
  40657. #endif
  40658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40659. "adds r3, r3, r7\n\t"
  40660. #else
  40661. "add r3, r3, r7\n\t"
  40662. #endif
  40663. #ifdef WOLFSSL_KEIL
  40664. "adcs r4, r4, %[r]\n\t"
  40665. #elif defined(__clang__)
  40666. "adcs r4, %[r]\n\t"
  40667. #else
  40668. "adc r4, %[r]\n\t"
  40669. #endif
  40670. "uxth r7, %[b]\n\t"
  40671. #ifdef WOLFSSL_KEIL
  40672. "muls r6, r7, r6\n\t"
  40673. #elif defined(__clang__)
  40674. "muls r6, r7\n\t"
  40675. #else
  40676. "mul r6, r7\n\t"
  40677. #endif
  40678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40679. "lsrs r7, r6, #16\n\t"
  40680. #else
  40681. "lsr r7, r6, #16\n\t"
  40682. #endif
  40683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40684. "lsls r6, r6, #16\n\t"
  40685. #else
  40686. "lsl r6, r6, #16\n\t"
  40687. #endif
  40688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40689. "adds r5, r5, r6\n\t"
  40690. #else
  40691. "add r5, r5, r6\n\t"
  40692. #endif
  40693. #ifdef WOLFSSL_KEIL
  40694. "adcs r3, r3, r7\n\t"
  40695. #elif defined(__clang__)
  40696. "adcs r3, r7\n\t"
  40697. #else
  40698. "adc r3, r7\n\t"
  40699. #endif
  40700. #ifdef WOLFSSL_KEIL
  40701. "adcs r4, r4, %[r]\n\t"
  40702. #elif defined(__clang__)
  40703. "adcs r4, %[r]\n\t"
  40704. #else
  40705. "adc r4, %[r]\n\t"
  40706. #endif
  40707. "# A[8] * B[3]\n\t"
  40708. "mov %[a], r9\n\t"
  40709. "mov %[b], r10\n\t"
  40710. "ldr %[a], [%[a], #32]\n\t"
  40711. "ldr %[b], [%[b], #12]\n\t"
  40712. "uxth r6, %[a]\n\t"
  40713. "uxth r7, %[b]\n\t"
  40714. #ifdef WOLFSSL_KEIL
  40715. "muls r7, r6, r7\n\t"
  40716. #elif defined(__clang__)
  40717. "muls r7, r6\n\t"
  40718. #else
  40719. "mul r7, r6\n\t"
  40720. #endif
  40721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40722. "adds r5, r5, r7\n\t"
  40723. #else
  40724. "add r5, r5, r7\n\t"
  40725. #endif
  40726. #ifdef WOLFSSL_KEIL
  40727. "adcs r3, r3, %[r]\n\t"
  40728. #elif defined(__clang__)
  40729. "adcs r3, %[r]\n\t"
  40730. #else
  40731. "adc r3, %[r]\n\t"
  40732. #endif
  40733. #ifdef WOLFSSL_KEIL
  40734. "adcs r4, r4, %[r]\n\t"
  40735. #elif defined(__clang__)
  40736. "adcs r4, %[r]\n\t"
  40737. #else
  40738. "adc r4, %[r]\n\t"
  40739. #endif
  40740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40741. "lsrs r7, %[b], #16\n\t"
  40742. #else
  40743. "lsr r7, %[b], #16\n\t"
  40744. #endif
  40745. #ifdef WOLFSSL_KEIL
  40746. "muls r6, r7, r6\n\t"
  40747. #elif defined(__clang__)
  40748. "muls r6, r7\n\t"
  40749. #else
  40750. "mul r6, r7\n\t"
  40751. #endif
  40752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40753. "lsrs r7, r6, #16\n\t"
  40754. #else
  40755. "lsr r7, r6, #16\n\t"
  40756. #endif
  40757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40758. "lsls r6, r6, #16\n\t"
  40759. #else
  40760. "lsl r6, r6, #16\n\t"
  40761. #endif
  40762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40763. "adds r5, r5, r6\n\t"
  40764. #else
  40765. "add r5, r5, r6\n\t"
  40766. #endif
  40767. #ifdef WOLFSSL_KEIL
  40768. "adcs r3, r3, r7\n\t"
  40769. #elif defined(__clang__)
  40770. "adcs r3, r7\n\t"
  40771. #else
  40772. "adc r3, r7\n\t"
  40773. #endif
  40774. #ifdef WOLFSSL_KEIL
  40775. "adcs r4, r4, %[r]\n\t"
  40776. #elif defined(__clang__)
  40777. "adcs r4, %[r]\n\t"
  40778. #else
  40779. "adc r4, %[r]\n\t"
  40780. #endif
  40781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40782. "lsrs r6, %[a], #16\n\t"
  40783. #else
  40784. "lsr r6, %[a], #16\n\t"
  40785. #endif
  40786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40787. "lsrs r7, %[b], #16\n\t"
  40788. #else
  40789. "lsr r7, %[b], #16\n\t"
  40790. #endif
  40791. #ifdef WOLFSSL_KEIL
  40792. "muls r7, r6, r7\n\t"
  40793. #elif defined(__clang__)
  40794. "muls r7, r6\n\t"
  40795. #else
  40796. "mul r7, r6\n\t"
  40797. #endif
  40798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40799. "adds r3, r3, r7\n\t"
  40800. #else
  40801. "add r3, r3, r7\n\t"
  40802. #endif
  40803. #ifdef WOLFSSL_KEIL
  40804. "adcs r4, r4, %[r]\n\t"
  40805. #elif defined(__clang__)
  40806. "adcs r4, %[r]\n\t"
  40807. #else
  40808. "adc r4, %[r]\n\t"
  40809. #endif
  40810. "uxth r7, %[b]\n\t"
  40811. #ifdef WOLFSSL_KEIL
  40812. "muls r6, r7, r6\n\t"
  40813. #elif defined(__clang__)
  40814. "muls r6, r7\n\t"
  40815. #else
  40816. "mul r6, r7\n\t"
  40817. #endif
  40818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40819. "lsrs r7, r6, #16\n\t"
  40820. #else
  40821. "lsr r7, r6, #16\n\t"
  40822. #endif
  40823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40824. "lsls r6, r6, #16\n\t"
  40825. #else
  40826. "lsl r6, r6, #16\n\t"
  40827. #endif
  40828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40829. "adds r5, r5, r6\n\t"
  40830. #else
  40831. "add r5, r5, r6\n\t"
  40832. #endif
  40833. #ifdef WOLFSSL_KEIL
  40834. "adcs r3, r3, r7\n\t"
  40835. #elif defined(__clang__)
  40836. "adcs r3, r7\n\t"
  40837. #else
  40838. "adc r3, r7\n\t"
  40839. #endif
  40840. #ifdef WOLFSSL_KEIL
  40841. "adcs r4, r4, %[r]\n\t"
  40842. #elif defined(__clang__)
  40843. "adcs r4, %[r]\n\t"
  40844. #else
  40845. "adc r4, %[r]\n\t"
  40846. #endif
  40847. "# A[9] * B[2]\n\t"
  40848. "mov %[a], r9\n\t"
  40849. "mov %[b], r10\n\t"
  40850. "ldr %[a], [%[a], #36]\n\t"
  40851. "ldr %[b], [%[b], #8]\n\t"
  40852. "uxth r6, %[a]\n\t"
  40853. "uxth r7, %[b]\n\t"
  40854. #ifdef WOLFSSL_KEIL
  40855. "muls r7, r6, r7\n\t"
  40856. #elif defined(__clang__)
  40857. "muls r7, r6\n\t"
  40858. #else
  40859. "mul r7, r6\n\t"
  40860. #endif
  40861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40862. "adds r5, r5, r7\n\t"
  40863. #else
  40864. "add r5, r5, r7\n\t"
  40865. #endif
  40866. #ifdef WOLFSSL_KEIL
  40867. "adcs r3, r3, %[r]\n\t"
  40868. #elif defined(__clang__)
  40869. "adcs r3, %[r]\n\t"
  40870. #else
  40871. "adc r3, %[r]\n\t"
  40872. #endif
  40873. #ifdef WOLFSSL_KEIL
  40874. "adcs r4, r4, %[r]\n\t"
  40875. #elif defined(__clang__)
  40876. "adcs r4, %[r]\n\t"
  40877. #else
  40878. "adc r4, %[r]\n\t"
  40879. #endif
  40880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40881. "lsrs r7, %[b], #16\n\t"
  40882. #else
  40883. "lsr r7, %[b], #16\n\t"
  40884. #endif
  40885. #ifdef WOLFSSL_KEIL
  40886. "muls r6, r7, r6\n\t"
  40887. #elif defined(__clang__)
  40888. "muls r6, r7\n\t"
  40889. #else
  40890. "mul r6, r7\n\t"
  40891. #endif
  40892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40893. "lsrs r7, r6, #16\n\t"
  40894. #else
  40895. "lsr r7, r6, #16\n\t"
  40896. #endif
  40897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40898. "lsls r6, r6, #16\n\t"
  40899. #else
  40900. "lsl r6, r6, #16\n\t"
  40901. #endif
  40902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40903. "adds r5, r5, r6\n\t"
  40904. #else
  40905. "add r5, r5, r6\n\t"
  40906. #endif
  40907. #ifdef WOLFSSL_KEIL
  40908. "adcs r3, r3, r7\n\t"
  40909. #elif defined(__clang__)
  40910. "adcs r3, r7\n\t"
  40911. #else
  40912. "adc r3, r7\n\t"
  40913. #endif
  40914. #ifdef WOLFSSL_KEIL
  40915. "adcs r4, r4, %[r]\n\t"
  40916. #elif defined(__clang__)
  40917. "adcs r4, %[r]\n\t"
  40918. #else
  40919. "adc r4, %[r]\n\t"
  40920. #endif
  40921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40922. "lsrs r6, %[a], #16\n\t"
  40923. #else
  40924. "lsr r6, %[a], #16\n\t"
  40925. #endif
  40926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40927. "lsrs r7, %[b], #16\n\t"
  40928. #else
  40929. "lsr r7, %[b], #16\n\t"
  40930. #endif
  40931. #ifdef WOLFSSL_KEIL
  40932. "muls r7, r6, r7\n\t"
  40933. #elif defined(__clang__)
  40934. "muls r7, r6\n\t"
  40935. #else
  40936. "mul r7, r6\n\t"
  40937. #endif
  40938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40939. "adds r3, r3, r7\n\t"
  40940. #else
  40941. "add r3, r3, r7\n\t"
  40942. #endif
  40943. #ifdef WOLFSSL_KEIL
  40944. "adcs r4, r4, %[r]\n\t"
  40945. #elif defined(__clang__)
  40946. "adcs r4, %[r]\n\t"
  40947. #else
  40948. "adc r4, %[r]\n\t"
  40949. #endif
  40950. "uxth r7, %[b]\n\t"
  40951. #ifdef WOLFSSL_KEIL
  40952. "muls r6, r7, r6\n\t"
  40953. #elif defined(__clang__)
  40954. "muls r6, r7\n\t"
  40955. #else
  40956. "mul r6, r7\n\t"
  40957. #endif
  40958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40959. "lsrs r7, r6, #16\n\t"
  40960. #else
  40961. "lsr r7, r6, #16\n\t"
  40962. #endif
  40963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40964. "lsls r6, r6, #16\n\t"
  40965. #else
  40966. "lsl r6, r6, #16\n\t"
  40967. #endif
  40968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  40969. "adds r5, r5, r6\n\t"
  40970. #else
  40971. "add r5, r5, r6\n\t"
  40972. #endif
  40973. #ifdef WOLFSSL_KEIL
  40974. "adcs r3, r3, r7\n\t"
  40975. #elif defined(__clang__)
  40976. "adcs r3, r7\n\t"
  40977. #else
  40978. "adc r3, r7\n\t"
  40979. #endif
  40980. #ifdef WOLFSSL_KEIL
  40981. "adcs r4, r4, %[r]\n\t"
  40982. #elif defined(__clang__)
  40983. "adcs r4, %[r]\n\t"
  40984. #else
  40985. "adc r4, %[r]\n\t"
  40986. #endif
  40987. "# A[10] * B[1]\n\t"
  40988. "mov %[a], r9\n\t"
  40989. "mov %[b], r10\n\t"
  40990. "ldr %[a], [%[a], #40]\n\t"
  40991. "ldr %[b], [%[b], #4]\n\t"
  40992. "uxth r6, %[a]\n\t"
  40993. "uxth r7, %[b]\n\t"
  40994. #ifdef WOLFSSL_KEIL
  40995. "muls r7, r6, r7\n\t"
  40996. #elif defined(__clang__)
  40997. "muls r7, r6\n\t"
  40998. #else
  40999. "mul r7, r6\n\t"
  41000. #endif
  41001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41002. "adds r5, r5, r7\n\t"
  41003. #else
  41004. "add r5, r5, r7\n\t"
  41005. #endif
  41006. #ifdef WOLFSSL_KEIL
  41007. "adcs r3, r3, %[r]\n\t"
  41008. #elif defined(__clang__)
  41009. "adcs r3, %[r]\n\t"
  41010. #else
  41011. "adc r3, %[r]\n\t"
  41012. #endif
  41013. #ifdef WOLFSSL_KEIL
  41014. "adcs r4, r4, %[r]\n\t"
  41015. #elif defined(__clang__)
  41016. "adcs r4, %[r]\n\t"
  41017. #else
  41018. "adc r4, %[r]\n\t"
  41019. #endif
  41020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41021. "lsrs r7, %[b], #16\n\t"
  41022. #else
  41023. "lsr r7, %[b], #16\n\t"
  41024. #endif
  41025. #ifdef WOLFSSL_KEIL
  41026. "muls r6, r7, r6\n\t"
  41027. #elif defined(__clang__)
  41028. "muls r6, r7\n\t"
  41029. #else
  41030. "mul r6, r7\n\t"
  41031. #endif
  41032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41033. "lsrs r7, r6, #16\n\t"
  41034. #else
  41035. "lsr r7, r6, #16\n\t"
  41036. #endif
  41037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41038. "lsls r6, r6, #16\n\t"
  41039. #else
  41040. "lsl r6, r6, #16\n\t"
  41041. #endif
  41042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41043. "adds r5, r5, r6\n\t"
  41044. #else
  41045. "add r5, r5, r6\n\t"
  41046. #endif
  41047. #ifdef WOLFSSL_KEIL
  41048. "adcs r3, r3, r7\n\t"
  41049. #elif defined(__clang__)
  41050. "adcs r3, r7\n\t"
  41051. #else
  41052. "adc r3, r7\n\t"
  41053. #endif
  41054. #ifdef WOLFSSL_KEIL
  41055. "adcs r4, r4, %[r]\n\t"
  41056. #elif defined(__clang__)
  41057. "adcs r4, %[r]\n\t"
  41058. #else
  41059. "adc r4, %[r]\n\t"
  41060. #endif
  41061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41062. "lsrs r6, %[a], #16\n\t"
  41063. #else
  41064. "lsr r6, %[a], #16\n\t"
  41065. #endif
  41066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41067. "lsrs r7, %[b], #16\n\t"
  41068. #else
  41069. "lsr r7, %[b], #16\n\t"
  41070. #endif
  41071. #ifdef WOLFSSL_KEIL
  41072. "muls r7, r6, r7\n\t"
  41073. #elif defined(__clang__)
  41074. "muls r7, r6\n\t"
  41075. #else
  41076. "mul r7, r6\n\t"
  41077. #endif
  41078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41079. "adds r3, r3, r7\n\t"
  41080. #else
  41081. "add r3, r3, r7\n\t"
  41082. #endif
  41083. #ifdef WOLFSSL_KEIL
  41084. "adcs r4, r4, %[r]\n\t"
  41085. #elif defined(__clang__)
  41086. "adcs r4, %[r]\n\t"
  41087. #else
  41088. "adc r4, %[r]\n\t"
  41089. #endif
  41090. "uxth r7, %[b]\n\t"
  41091. #ifdef WOLFSSL_KEIL
  41092. "muls r6, r7, r6\n\t"
  41093. #elif defined(__clang__)
  41094. "muls r6, r7\n\t"
  41095. #else
  41096. "mul r6, r7\n\t"
  41097. #endif
  41098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41099. "lsrs r7, r6, #16\n\t"
  41100. #else
  41101. "lsr r7, r6, #16\n\t"
  41102. #endif
  41103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41104. "lsls r6, r6, #16\n\t"
  41105. #else
  41106. "lsl r6, r6, #16\n\t"
  41107. #endif
  41108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41109. "adds r5, r5, r6\n\t"
  41110. #else
  41111. "add r5, r5, r6\n\t"
  41112. #endif
  41113. #ifdef WOLFSSL_KEIL
  41114. "adcs r3, r3, r7\n\t"
  41115. #elif defined(__clang__)
  41116. "adcs r3, r7\n\t"
  41117. #else
  41118. "adc r3, r7\n\t"
  41119. #endif
  41120. #ifdef WOLFSSL_KEIL
  41121. "adcs r4, r4, %[r]\n\t"
  41122. #elif defined(__clang__)
  41123. "adcs r4, %[r]\n\t"
  41124. #else
  41125. "adc r4, %[r]\n\t"
  41126. #endif
  41127. "# A[11] * B[0]\n\t"
  41128. "mov %[a], r9\n\t"
  41129. "mov %[b], r10\n\t"
  41130. "ldr %[a], [%[a], #44]\n\t"
  41131. "ldr %[b], [%[b]]\n\t"
  41132. "uxth r6, %[a]\n\t"
  41133. "uxth r7, %[b]\n\t"
  41134. #ifdef WOLFSSL_KEIL
  41135. "muls r7, r6, r7\n\t"
  41136. #elif defined(__clang__)
  41137. "muls r7, r6\n\t"
  41138. #else
  41139. "mul r7, r6\n\t"
  41140. #endif
  41141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41142. "adds r5, r5, r7\n\t"
  41143. #else
  41144. "add r5, r5, r7\n\t"
  41145. #endif
  41146. #ifdef WOLFSSL_KEIL
  41147. "adcs r3, r3, %[r]\n\t"
  41148. #elif defined(__clang__)
  41149. "adcs r3, %[r]\n\t"
  41150. #else
  41151. "adc r3, %[r]\n\t"
  41152. #endif
  41153. #ifdef WOLFSSL_KEIL
  41154. "adcs r4, r4, %[r]\n\t"
  41155. #elif defined(__clang__)
  41156. "adcs r4, %[r]\n\t"
  41157. #else
  41158. "adc r4, %[r]\n\t"
  41159. #endif
  41160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41161. "lsrs r7, %[b], #16\n\t"
  41162. #else
  41163. "lsr r7, %[b], #16\n\t"
  41164. #endif
  41165. #ifdef WOLFSSL_KEIL
  41166. "muls r6, r7, r6\n\t"
  41167. #elif defined(__clang__)
  41168. "muls r6, r7\n\t"
  41169. #else
  41170. "mul r6, r7\n\t"
  41171. #endif
  41172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41173. "lsrs r7, r6, #16\n\t"
  41174. #else
  41175. "lsr r7, r6, #16\n\t"
  41176. #endif
  41177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41178. "lsls r6, r6, #16\n\t"
  41179. #else
  41180. "lsl r6, r6, #16\n\t"
  41181. #endif
  41182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41183. "adds r5, r5, r6\n\t"
  41184. #else
  41185. "add r5, r5, r6\n\t"
  41186. #endif
  41187. #ifdef WOLFSSL_KEIL
  41188. "adcs r3, r3, r7\n\t"
  41189. #elif defined(__clang__)
  41190. "adcs r3, r7\n\t"
  41191. #else
  41192. "adc r3, r7\n\t"
  41193. #endif
  41194. #ifdef WOLFSSL_KEIL
  41195. "adcs r4, r4, %[r]\n\t"
  41196. #elif defined(__clang__)
  41197. "adcs r4, %[r]\n\t"
  41198. #else
  41199. "adc r4, %[r]\n\t"
  41200. #endif
  41201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41202. "lsrs r6, %[a], #16\n\t"
  41203. #else
  41204. "lsr r6, %[a], #16\n\t"
  41205. #endif
  41206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41207. "lsrs r7, %[b], #16\n\t"
  41208. #else
  41209. "lsr r7, %[b], #16\n\t"
  41210. #endif
  41211. #ifdef WOLFSSL_KEIL
  41212. "muls r7, r6, r7\n\t"
  41213. #elif defined(__clang__)
  41214. "muls r7, r6\n\t"
  41215. #else
  41216. "mul r7, r6\n\t"
  41217. #endif
  41218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41219. "adds r3, r3, r7\n\t"
  41220. #else
  41221. "add r3, r3, r7\n\t"
  41222. #endif
  41223. #ifdef WOLFSSL_KEIL
  41224. "adcs r4, r4, %[r]\n\t"
  41225. #elif defined(__clang__)
  41226. "adcs r4, %[r]\n\t"
  41227. #else
  41228. "adc r4, %[r]\n\t"
  41229. #endif
  41230. "uxth r7, %[b]\n\t"
  41231. #ifdef WOLFSSL_KEIL
  41232. "muls r6, r7, r6\n\t"
  41233. #elif defined(__clang__)
  41234. "muls r6, r7\n\t"
  41235. #else
  41236. "mul r6, r7\n\t"
  41237. #endif
  41238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41239. "lsrs r7, r6, #16\n\t"
  41240. #else
  41241. "lsr r7, r6, #16\n\t"
  41242. #endif
  41243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41244. "lsls r6, r6, #16\n\t"
  41245. #else
  41246. "lsl r6, r6, #16\n\t"
  41247. #endif
  41248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41249. "adds r5, r5, r6\n\t"
  41250. #else
  41251. "add r5, r5, r6\n\t"
  41252. #endif
  41253. #ifdef WOLFSSL_KEIL
  41254. "adcs r3, r3, r7\n\t"
  41255. #elif defined(__clang__)
  41256. "adcs r3, r7\n\t"
  41257. #else
  41258. "adc r3, r7\n\t"
  41259. #endif
  41260. #ifdef WOLFSSL_KEIL
  41261. "adcs r4, r4, %[r]\n\t"
  41262. #elif defined(__clang__)
  41263. "adcs r4, %[r]\n\t"
  41264. #else
  41265. "adc r4, %[r]\n\t"
  41266. #endif
  41267. "str r5, [sp, #44]\n\t"
  41268. "# A[11] * B[1]\n\t"
  41269. "movs r5, #0\n\t"
  41270. "mov %[a], r9\n\t"
  41271. "mov %[b], r10\n\t"
  41272. "ldr %[a], [%[a], #44]\n\t"
  41273. "ldr %[b], [%[b], #4]\n\t"
  41274. "uxth r6, %[a]\n\t"
  41275. "uxth r7, %[b]\n\t"
  41276. #ifdef WOLFSSL_KEIL
  41277. "muls r7, r6, r7\n\t"
  41278. #elif defined(__clang__)
  41279. "muls r7, r6\n\t"
  41280. #else
  41281. "mul r7, r6\n\t"
  41282. #endif
  41283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41284. "adds r3, r3, r7\n\t"
  41285. #else
  41286. "add r3, r3, r7\n\t"
  41287. #endif
  41288. #ifdef WOLFSSL_KEIL
  41289. "adcs r4, r4, %[r]\n\t"
  41290. #elif defined(__clang__)
  41291. "adcs r4, %[r]\n\t"
  41292. #else
  41293. "adc r4, %[r]\n\t"
  41294. #endif
  41295. #ifdef WOLFSSL_KEIL
  41296. "adcs r5, r5, %[r]\n\t"
  41297. #elif defined(__clang__)
  41298. "adcs r5, %[r]\n\t"
  41299. #else
  41300. "adc r5, %[r]\n\t"
  41301. #endif
  41302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41303. "lsrs r7, %[b], #16\n\t"
  41304. #else
  41305. "lsr r7, %[b], #16\n\t"
  41306. #endif
  41307. #ifdef WOLFSSL_KEIL
  41308. "muls r6, r7, r6\n\t"
  41309. #elif defined(__clang__)
  41310. "muls r6, r7\n\t"
  41311. #else
  41312. "mul r6, r7\n\t"
  41313. #endif
  41314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41315. "lsrs r7, r6, #16\n\t"
  41316. #else
  41317. "lsr r7, r6, #16\n\t"
  41318. #endif
  41319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41320. "lsls r6, r6, #16\n\t"
  41321. #else
  41322. "lsl r6, r6, #16\n\t"
  41323. #endif
  41324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41325. "adds r3, r3, r6\n\t"
  41326. #else
  41327. "add r3, r3, r6\n\t"
  41328. #endif
  41329. #ifdef WOLFSSL_KEIL
  41330. "adcs r4, r4, r7\n\t"
  41331. #elif defined(__clang__)
  41332. "adcs r4, r7\n\t"
  41333. #else
  41334. "adc r4, r7\n\t"
  41335. #endif
  41336. #ifdef WOLFSSL_KEIL
  41337. "adcs r5, r5, %[r]\n\t"
  41338. #elif defined(__clang__)
  41339. "adcs r5, %[r]\n\t"
  41340. #else
  41341. "adc r5, %[r]\n\t"
  41342. #endif
  41343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41344. "lsrs r6, %[a], #16\n\t"
  41345. #else
  41346. "lsr r6, %[a], #16\n\t"
  41347. #endif
  41348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41349. "lsrs r7, %[b], #16\n\t"
  41350. #else
  41351. "lsr r7, %[b], #16\n\t"
  41352. #endif
  41353. #ifdef WOLFSSL_KEIL
  41354. "muls r7, r6, r7\n\t"
  41355. #elif defined(__clang__)
  41356. "muls r7, r6\n\t"
  41357. #else
  41358. "mul r7, r6\n\t"
  41359. #endif
  41360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41361. "adds r4, r4, r7\n\t"
  41362. #else
  41363. "add r4, r4, r7\n\t"
  41364. #endif
  41365. #ifdef WOLFSSL_KEIL
  41366. "adcs r5, r5, %[r]\n\t"
  41367. #elif defined(__clang__)
  41368. "adcs r5, %[r]\n\t"
  41369. #else
  41370. "adc r5, %[r]\n\t"
  41371. #endif
  41372. "uxth r7, %[b]\n\t"
  41373. #ifdef WOLFSSL_KEIL
  41374. "muls r6, r7, r6\n\t"
  41375. #elif defined(__clang__)
  41376. "muls r6, r7\n\t"
  41377. #else
  41378. "mul r6, r7\n\t"
  41379. #endif
  41380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41381. "lsrs r7, r6, #16\n\t"
  41382. #else
  41383. "lsr r7, r6, #16\n\t"
  41384. #endif
  41385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41386. "lsls r6, r6, #16\n\t"
  41387. #else
  41388. "lsl r6, r6, #16\n\t"
  41389. #endif
  41390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41391. "adds r3, r3, r6\n\t"
  41392. #else
  41393. "add r3, r3, r6\n\t"
  41394. #endif
  41395. #ifdef WOLFSSL_KEIL
  41396. "adcs r4, r4, r7\n\t"
  41397. #elif defined(__clang__)
  41398. "adcs r4, r7\n\t"
  41399. #else
  41400. "adc r4, r7\n\t"
  41401. #endif
  41402. #ifdef WOLFSSL_KEIL
  41403. "adcs r5, r5, %[r]\n\t"
  41404. #elif defined(__clang__)
  41405. "adcs r5, %[r]\n\t"
  41406. #else
  41407. "adc r5, %[r]\n\t"
  41408. #endif
  41409. "# A[10] * B[2]\n\t"
  41410. "mov %[a], r9\n\t"
  41411. "mov %[b], r10\n\t"
  41412. "ldr %[a], [%[a], #40]\n\t"
  41413. "ldr %[b], [%[b], #8]\n\t"
  41414. "uxth r6, %[a]\n\t"
  41415. "uxth r7, %[b]\n\t"
  41416. #ifdef WOLFSSL_KEIL
  41417. "muls r7, r6, r7\n\t"
  41418. #elif defined(__clang__)
  41419. "muls r7, r6\n\t"
  41420. #else
  41421. "mul r7, r6\n\t"
  41422. #endif
  41423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41424. "adds r3, r3, r7\n\t"
  41425. #else
  41426. "add r3, r3, r7\n\t"
  41427. #endif
  41428. #ifdef WOLFSSL_KEIL
  41429. "adcs r4, r4, %[r]\n\t"
  41430. #elif defined(__clang__)
  41431. "adcs r4, %[r]\n\t"
  41432. #else
  41433. "adc r4, %[r]\n\t"
  41434. #endif
  41435. #ifdef WOLFSSL_KEIL
  41436. "adcs r5, r5, %[r]\n\t"
  41437. #elif defined(__clang__)
  41438. "adcs r5, %[r]\n\t"
  41439. #else
  41440. "adc r5, %[r]\n\t"
  41441. #endif
  41442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41443. "lsrs r7, %[b], #16\n\t"
  41444. #else
  41445. "lsr r7, %[b], #16\n\t"
  41446. #endif
  41447. #ifdef WOLFSSL_KEIL
  41448. "muls r6, r7, r6\n\t"
  41449. #elif defined(__clang__)
  41450. "muls r6, r7\n\t"
  41451. #else
  41452. "mul r6, r7\n\t"
  41453. #endif
  41454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41455. "lsrs r7, r6, #16\n\t"
  41456. #else
  41457. "lsr r7, r6, #16\n\t"
  41458. #endif
  41459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41460. "lsls r6, r6, #16\n\t"
  41461. #else
  41462. "lsl r6, r6, #16\n\t"
  41463. #endif
  41464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41465. "adds r3, r3, r6\n\t"
  41466. #else
  41467. "add r3, r3, r6\n\t"
  41468. #endif
  41469. #ifdef WOLFSSL_KEIL
  41470. "adcs r4, r4, r7\n\t"
  41471. #elif defined(__clang__)
  41472. "adcs r4, r7\n\t"
  41473. #else
  41474. "adc r4, r7\n\t"
  41475. #endif
  41476. #ifdef WOLFSSL_KEIL
  41477. "adcs r5, r5, %[r]\n\t"
  41478. #elif defined(__clang__)
  41479. "adcs r5, %[r]\n\t"
  41480. #else
  41481. "adc r5, %[r]\n\t"
  41482. #endif
  41483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41484. "lsrs r6, %[a], #16\n\t"
  41485. #else
  41486. "lsr r6, %[a], #16\n\t"
  41487. #endif
  41488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41489. "lsrs r7, %[b], #16\n\t"
  41490. #else
  41491. "lsr r7, %[b], #16\n\t"
  41492. #endif
  41493. #ifdef WOLFSSL_KEIL
  41494. "muls r7, r6, r7\n\t"
  41495. #elif defined(__clang__)
  41496. "muls r7, r6\n\t"
  41497. #else
  41498. "mul r7, r6\n\t"
  41499. #endif
  41500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41501. "adds r4, r4, r7\n\t"
  41502. #else
  41503. "add r4, r4, r7\n\t"
  41504. #endif
  41505. #ifdef WOLFSSL_KEIL
  41506. "adcs r5, r5, %[r]\n\t"
  41507. #elif defined(__clang__)
  41508. "adcs r5, %[r]\n\t"
  41509. #else
  41510. "adc r5, %[r]\n\t"
  41511. #endif
  41512. "uxth r7, %[b]\n\t"
  41513. #ifdef WOLFSSL_KEIL
  41514. "muls r6, r7, r6\n\t"
  41515. #elif defined(__clang__)
  41516. "muls r6, r7\n\t"
  41517. #else
  41518. "mul r6, r7\n\t"
  41519. #endif
  41520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41521. "lsrs r7, r6, #16\n\t"
  41522. #else
  41523. "lsr r7, r6, #16\n\t"
  41524. #endif
  41525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41526. "lsls r6, r6, #16\n\t"
  41527. #else
  41528. "lsl r6, r6, #16\n\t"
  41529. #endif
  41530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41531. "adds r3, r3, r6\n\t"
  41532. #else
  41533. "add r3, r3, r6\n\t"
  41534. #endif
  41535. #ifdef WOLFSSL_KEIL
  41536. "adcs r4, r4, r7\n\t"
  41537. #elif defined(__clang__)
  41538. "adcs r4, r7\n\t"
  41539. #else
  41540. "adc r4, r7\n\t"
  41541. #endif
  41542. #ifdef WOLFSSL_KEIL
  41543. "adcs r5, r5, %[r]\n\t"
  41544. #elif defined(__clang__)
  41545. "adcs r5, %[r]\n\t"
  41546. #else
  41547. "adc r5, %[r]\n\t"
  41548. #endif
  41549. "# A[9] * B[3]\n\t"
  41550. "mov %[a], r9\n\t"
  41551. "mov %[b], r10\n\t"
  41552. "ldr %[a], [%[a], #36]\n\t"
  41553. "ldr %[b], [%[b], #12]\n\t"
  41554. "uxth r6, %[a]\n\t"
  41555. "uxth r7, %[b]\n\t"
  41556. #ifdef WOLFSSL_KEIL
  41557. "muls r7, r6, r7\n\t"
  41558. #elif defined(__clang__)
  41559. "muls r7, r6\n\t"
  41560. #else
  41561. "mul r7, r6\n\t"
  41562. #endif
  41563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41564. "adds r3, r3, r7\n\t"
  41565. #else
  41566. "add r3, r3, r7\n\t"
  41567. #endif
  41568. #ifdef WOLFSSL_KEIL
  41569. "adcs r4, r4, %[r]\n\t"
  41570. #elif defined(__clang__)
  41571. "adcs r4, %[r]\n\t"
  41572. #else
  41573. "adc r4, %[r]\n\t"
  41574. #endif
  41575. #ifdef WOLFSSL_KEIL
  41576. "adcs r5, r5, %[r]\n\t"
  41577. #elif defined(__clang__)
  41578. "adcs r5, %[r]\n\t"
  41579. #else
  41580. "adc r5, %[r]\n\t"
  41581. #endif
  41582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41583. "lsrs r7, %[b], #16\n\t"
  41584. #else
  41585. "lsr r7, %[b], #16\n\t"
  41586. #endif
  41587. #ifdef WOLFSSL_KEIL
  41588. "muls r6, r7, r6\n\t"
  41589. #elif defined(__clang__)
  41590. "muls r6, r7\n\t"
  41591. #else
  41592. "mul r6, r7\n\t"
  41593. #endif
  41594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41595. "lsrs r7, r6, #16\n\t"
  41596. #else
  41597. "lsr r7, r6, #16\n\t"
  41598. #endif
  41599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41600. "lsls r6, r6, #16\n\t"
  41601. #else
  41602. "lsl r6, r6, #16\n\t"
  41603. #endif
  41604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41605. "adds r3, r3, r6\n\t"
  41606. #else
  41607. "add r3, r3, r6\n\t"
  41608. #endif
  41609. #ifdef WOLFSSL_KEIL
  41610. "adcs r4, r4, r7\n\t"
  41611. #elif defined(__clang__)
  41612. "adcs r4, r7\n\t"
  41613. #else
  41614. "adc r4, r7\n\t"
  41615. #endif
  41616. #ifdef WOLFSSL_KEIL
  41617. "adcs r5, r5, %[r]\n\t"
  41618. #elif defined(__clang__)
  41619. "adcs r5, %[r]\n\t"
  41620. #else
  41621. "adc r5, %[r]\n\t"
  41622. #endif
  41623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41624. "lsrs r6, %[a], #16\n\t"
  41625. #else
  41626. "lsr r6, %[a], #16\n\t"
  41627. #endif
  41628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41629. "lsrs r7, %[b], #16\n\t"
  41630. #else
  41631. "lsr r7, %[b], #16\n\t"
  41632. #endif
  41633. #ifdef WOLFSSL_KEIL
  41634. "muls r7, r6, r7\n\t"
  41635. #elif defined(__clang__)
  41636. "muls r7, r6\n\t"
  41637. #else
  41638. "mul r7, r6\n\t"
  41639. #endif
  41640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41641. "adds r4, r4, r7\n\t"
  41642. #else
  41643. "add r4, r4, r7\n\t"
  41644. #endif
  41645. #ifdef WOLFSSL_KEIL
  41646. "adcs r5, r5, %[r]\n\t"
  41647. #elif defined(__clang__)
  41648. "adcs r5, %[r]\n\t"
  41649. #else
  41650. "adc r5, %[r]\n\t"
  41651. #endif
  41652. "uxth r7, %[b]\n\t"
  41653. #ifdef WOLFSSL_KEIL
  41654. "muls r6, r7, r6\n\t"
  41655. #elif defined(__clang__)
  41656. "muls r6, r7\n\t"
  41657. #else
  41658. "mul r6, r7\n\t"
  41659. #endif
  41660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41661. "lsrs r7, r6, #16\n\t"
  41662. #else
  41663. "lsr r7, r6, #16\n\t"
  41664. #endif
  41665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41666. "lsls r6, r6, #16\n\t"
  41667. #else
  41668. "lsl r6, r6, #16\n\t"
  41669. #endif
  41670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41671. "adds r3, r3, r6\n\t"
  41672. #else
  41673. "add r3, r3, r6\n\t"
  41674. #endif
  41675. #ifdef WOLFSSL_KEIL
  41676. "adcs r4, r4, r7\n\t"
  41677. #elif defined(__clang__)
  41678. "adcs r4, r7\n\t"
  41679. #else
  41680. "adc r4, r7\n\t"
  41681. #endif
  41682. #ifdef WOLFSSL_KEIL
  41683. "adcs r5, r5, %[r]\n\t"
  41684. #elif defined(__clang__)
  41685. "adcs r5, %[r]\n\t"
  41686. #else
  41687. "adc r5, %[r]\n\t"
  41688. #endif
  41689. "# A[8] * B[4]\n\t"
  41690. "mov %[a], r9\n\t"
  41691. "mov %[b], r10\n\t"
  41692. "ldr %[a], [%[a], #32]\n\t"
  41693. "ldr %[b], [%[b], #16]\n\t"
  41694. "uxth r6, %[a]\n\t"
  41695. "uxth r7, %[b]\n\t"
  41696. #ifdef WOLFSSL_KEIL
  41697. "muls r7, r6, r7\n\t"
  41698. #elif defined(__clang__)
  41699. "muls r7, r6\n\t"
  41700. #else
  41701. "mul r7, r6\n\t"
  41702. #endif
  41703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41704. "adds r3, r3, r7\n\t"
  41705. #else
  41706. "add r3, r3, r7\n\t"
  41707. #endif
  41708. #ifdef WOLFSSL_KEIL
  41709. "adcs r4, r4, %[r]\n\t"
  41710. #elif defined(__clang__)
  41711. "adcs r4, %[r]\n\t"
  41712. #else
  41713. "adc r4, %[r]\n\t"
  41714. #endif
  41715. #ifdef WOLFSSL_KEIL
  41716. "adcs r5, r5, %[r]\n\t"
  41717. #elif defined(__clang__)
  41718. "adcs r5, %[r]\n\t"
  41719. #else
  41720. "adc r5, %[r]\n\t"
  41721. #endif
  41722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41723. "lsrs r7, %[b], #16\n\t"
  41724. #else
  41725. "lsr r7, %[b], #16\n\t"
  41726. #endif
  41727. #ifdef WOLFSSL_KEIL
  41728. "muls r6, r7, r6\n\t"
  41729. #elif defined(__clang__)
  41730. "muls r6, r7\n\t"
  41731. #else
  41732. "mul r6, r7\n\t"
  41733. #endif
  41734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41735. "lsrs r7, r6, #16\n\t"
  41736. #else
  41737. "lsr r7, r6, #16\n\t"
  41738. #endif
  41739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41740. "lsls r6, r6, #16\n\t"
  41741. #else
  41742. "lsl r6, r6, #16\n\t"
  41743. #endif
  41744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41745. "adds r3, r3, r6\n\t"
  41746. #else
  41747. "add r3, r3, r6\n\t"
  41748. #endif
  41749. #ifdef WOLFSSL_KEIL
  41750. "adcs r4, r4, r7\n\t"
  41751. #elif defined(__clang__)
  41752. "adcs r4, r7\n\t"
  41753. #else
  41754. "adc r4, r7\n\t"
  41755. #endif
  41756. #ifdef WOLFSSL_KEIL
  41757. "adcs r5, r5, %[r]\n\t"
  41758. #elif defined(__clang__)
  41759. "adcs r5, %[r]\n\t"
  41760. #else
  41761. "adc r5, %[r]\n\t"
  41762. #endif
  41763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41764. "lsrs r6, %[a], #16\n\t"
  41765. #else
  41766. "lsr r6, %[a], #16\n\t"
  41767. #endif
  41768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41769. "lsrs r7, %[b], #16\n\t"
  41770. #else
  41771. "lsr r7, %[b], #16\n\t"
  41772. #endif
  41773. #ifdef WOLFSSL_KEIL
  41774. "muls r7, r6, r7\n\t"
  41775. #elif defined(__clang__)
  41776. "muls r7, r6\n\t"
  41777. #else
  41778. "mul r7, r6\n\t"
  41779. #endif
  41780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41781. "adds r4, r4, r7\n\t"
  41782. #else
  41783. "add r4, r4, r7\n\t"
  41784. #endif
  41785. #ifdef WOLFSSL_KEIL
  41786. "adcs r5, r5, %[r]\n\t"
  41787. #elif defined(__clang__)
  41788. "adcs r5, %[r]\n\t"
  41789. #else
  41790. "adc r5, %[r]\n\t"
  41791. #endif
  41792. "uxth r7, %[b]\n\t"
  41793. #ifdef WOLFSSL_KEIL
  41794. "muls r6, r7, r6\n\t"
  41795. #elif defined(__clang__)
  41796. "muls r6, r7\n\t"
  41797. #else
  41798. "mul r6, r7\n\t"
  41799. #endif
  41800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41801. "lsrs r7, r6, #16\n\t"
  41802. #else
  41803. "lsr r7, r6, #16\n\t"
  41804. #endif
  41805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41806. "lsls r6, r6, #16\n\t"
  41807. #else
  41808. "lsl r6, r6, #16\n\t"
  41809. #endif
  41810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41811. "adds r3, r3, r6\n\t"
  41812. #else
  41813. "add r3, r3, r6\n\t"
  41814. #endif
  41815. #ifdef WOLFSSL_KEIL
  41816. "adcs r4, r4, r7\n\t"
  41817. #elif defined(__clang__)
  41818. "adcs r4, r7\n\t"
  41819. #else
  41820. "adc r4, r7\n\t"
  41821. #endif
  41822. #ifdef WOLFSSL_KEIL
  41823. "adcs r5, r5, %[r]\n\t"
  41824. #elif defined(__clang__)
  41825. "adcs r5, %[r]\n\t"
  41826. #else
  41827. "adc r5, %[r]\n\t"
  41828. #endif
  41829. "# A[7] * B[5]\n\t"
  41830. "mov %[a], r9\n\t"
  41831. "mov %[b], r10\n\t"
  41832. "ldr %[a], [%[a], #28]\n\t"
  41833. "ldr %[b], [%[b], #20]\n\t"
  41834. "uxth r6, %[a]\n\t"
  41835. "uxth r7, %[b]\n\t"
  41836. #ifdef WOLFSSL_KEIL
  41837. "muls r7, r6, r7\n\t"
  41838. #elif defined(__clang__)
  41839. "muls r7, r6\n\t"
  41840. #else
  41841. "mul r7, r6\n\t"
  41842. #endif
  41843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41844. "adds r3, r3, r7\n\t"
  41845. #else
  41846. "add r3, r3, r7\n\t"
  41847. #endif
  41848. #ifdef WOLFSSL_KEIL
  41849. "adcs r4, r4, %[r]\n\t"
  41850. #elif defined(__clang__)
  41851. "adcs r4, %[r]\n\t"
  41852. #else
  41853. "adc r4, %[r]\n\t"
  41854. #endif
  41855. #ifdef WOLFSSL_KEIL
  41856. "adcs r5, r5, %[r]\n\t"
  41857. #elif defined(__clang__)
  41858. "adcs r5, %[r]\n\t"
  41859. #else
  41860. "adc r5, %[r]\n\t"
  41861. #endif
  41862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41863. "lsrs r7, %[b], #16\n\t"
  41864. #else
  41865. "lsr r7, %[b], #16\n\t"
  41866. #endif
  41867. #ifdef WOLFSSL_KEIL
  41868. "muls r6, r7, r6\n\t"
  41869. #elif defined(__clang__)
  41870. "muls r6, r7\n\t"
  41871. #else
  41872. "mul r6, r7\n\t"
  41873. #endif
  41874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41875. "lsrs r7, r6, #16\n\t"
  41876. #else
  41877. "lsr r7, r6, #16\n\t"
  41878. #endif
  41879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41880. "lsls r6, r6, #16\n\t"
  41881. #else
  41882. "lsl r6, r6, #16\n\t"
  41883. #endif
  41884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41885. "adds r3, r3, r6\n\t"
  41886. #else
  41887. "add r3, r3, r6\n\t"
  41888. #endif
  41889. #ifdef WOLFSSL_KEIL
  41890. "adcs r4, r4, r7\n\t"
  41891. #elif defined(__clang__)
  41892. "adcs r4, r7\n\t"
  41893. #else
  41894. "adc r4, r7\n\t"
  41895. #endif
  41896. #ifdef WOLFSSL_KEIL
  41897. "adcs r5, r5, %[r]\n\t"
  41898. #elif defined(__clang__)
  41899. "adcs r5, %[r]\n\t"
  41900. #else
  41901. "adc r5, %[r]\n\t"
  41902. #endif
  41903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41904. "lsrs r6, %[a], #16\n\t"
  41905. #else
  41906. "lsr r6, %[a], #16\n\t"
  41907. #endif
  41908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41909. "lsrs r7, %[b], #16\n\t"
  41910. #else
  41911. "lsr r7, %[b], #16\n\t"
  41912. #endif
  41913. #ifdef WOLFSSL_KEIL
  41914. "muls r7, r6, r7\n\t"
  41915. #elif defined(__clang__)
  41916. "muls r7, r6\n\t"
  41917. #else
  41918. "mul r7, r6\n\t"
  41919. #endif
  41920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41921. "adds r4, r4, r7\n\t"
  41922. #else
  41923. "add r4, r4, r7\n\t"
  41924. #endif
  41925. #ifdef WOLFSSL_KEIL
  41926. "adcs r5, r5, %[r]\n\t"
  41927. #elif defined(__clang__)
  41928. "adcs r5, %[r]\n\t"
  41929. #else
  41930. "adc r5, %[r]\n\t"
  41931. #endif
  41932. "uxth r7, %[b]\n\t"
  41933. #ifdef WOLFSSL_KEIL
  41934. "muls r6, r7, r6\n\t"
  41935. #elif defined(__clang__)
  41936. "muls r6, r7\n\t"
  41937. #else
  41938. "mul r6, r7\n\t"
  41939. #endif
  41940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41941. "lsrs r7, r6, #16\n\t"
  41942. #else
  41943. "lsr r7, r6, #16\n\t"
  41944. #endif
  41945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41946. "lsls r6, r6, #16\n\t"
  41947. #else
  41948. "lsl r6, r6, #16\n\t"
  41949. #endif
  41950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41951. "adds r3, r3, r6\n\t"
  41952. #else
  41953. "add r3, r3, r6\n\t"
  41954. #endif
  41955. #ifdef WOLFSSL_KEIL
  41956. "adcs r4, r4, r7\n\t"
  41957. #elif defined(__clang__)
  41958. "adcs r4, r7\n\t"
  41959. #else
  41960. "adc r4, r7\n\t"
  41961. #endif
  41962. #ifdef WOLFSSL_KEIL
  41963. "adcs r5, r5, %[r]\n\t"
  41964. #elif defined(__clang__)
  41965. "adcs r5, %[r]\n\t"
  41966. #else
  41967. "adc r5, %[r]\n\t"
  41968. #endif
  41969. "# A[6] * B[6]\n\t"
  41970. "mov %[a], r9\n\t"
  41971. "mov %[b], r10\n\t"
  41972. "ldr %[a], [%[a], #24]\n\t"
  41973. "ldr %[b], [%[b], #24]\n\t"
  41974. "uxth r6, %[a]\n\t"
  41975. "uxth r7, %[b]\n\t"
  41976. #ifdef WOLFSSL_KEIL
  41977. "muls r7, r6, r7\n\t"
  41978. #elif defined(__clang__)
  41979. "muls r7, r6\n\t"
  41980. #else
  41981. "mul r7, r6\n\t"
  41982. #endif
  41983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  41984. "adds r3, r3, r7\n\t"
  41985. #else
  41986. "add r3, r3, r7\n\t"
  41987. #endif
  41988. #ifdef WOLFSSL_KEIL
  41989. "adcs r4, r4, %[r]\n\t"
  41990. #elif defined(__clang__)
  41991. "adcs r4, %[r]\n\t"
  41992. #else
  41993. "adc r4, %[r]\n\t"
  41994. #endif
  41995. #ifdef WOLFSSL_KEIL
  41996. "adcs r5, r5, %[r]\n\t"
  41997. #elif defined(__clang__)
  41998. "adcs r5, %[r]\n\t"
  41999. #else
  42000. "adc r5, %[r]\n\t"
  42001. #endif
  42002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42003. "lsrs r7, %[b], #16\n\t"
  42004. #else
  42005. "lsr r7, %[b], #16\n\t"
  42006. #endif
  42007. #ifdef WOLFSSL_KEIL
  42008. "muls r6, r7, r6\n\t"
  42009. #elif defined(__clang__)
  42010. "muls r6, r7\n\t"
  42011. #else
  42012. "mul r6, r7\n\t"
  42013. #endif
  42014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42015. "lsrs r7, r6, #16\n\t"
  42016. #else
  42017. "lsr r7, r6, #16\n\t"
  42018. #endif
  42019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42020. "lsls r6, r6, #16\n\t"
  42021. #else
  42022. "lsl r6, r6, #16\n\t"
  42023. #endif
  42024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42025. "adds r3, r3, r6\n\t"
  42026. #else
  42027. "add r3, r3, r6\n\t"
  42028. #endif
  42029. #ifdef WOLFSSL_KEIL
  42030. "adcs r4, r4, r7\n\t"
  42031. #elif defined(__clang__)
  42032. "adcs r4, r7\n\t"
  42033. #else
  42034. "adc r4, r7\n\t"
  42035. #endif
  42036. #ifdef WOLFSSL_KEIL
  42037. "adcs r5, r5, %[r]\n\t"
  42038. #elif defined(__clang__)
  42039. "adcs r5, %[r]\n\t"
  42040. #else
  42041. "adc r5, %[r]\n\t"
  42042. #endif
  42043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42044. "lsrs r6, %[a], #16\n\t"
  42045. #else
  42046. "lsr r6, %[a], #16\n\t"
  42047. #endif
  42048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42049. "lsrs r7, %[b], #16\n\t"
  42050. #else
  42051. "lsr r7, %[b], #16\n\t"
  42052. #endif
  42053. #ifdef WOLFSSL_KEIL
  42054. "muls r7, r6, r7\n\t"
  42055. #elif defined(__clang__)
  42056. "muls r7, r6\n\t"
  42057. #else
  42058. "mul r7, r6\n\t"
  42059. #endif
  42060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42061. "adds r4, r4, r7\n\t"
  42062. #else
  42063. "add r4, r4, r7\n\t"
  42064. #endif
  42065. #ifdef WOLFSSL_KEIL
  42066. "adcs r5, r5, %[r]\n\t"
  42067. #elif defined(__clang__)
  42068. "adcs r5, %[r]\n\t"
  42069. #else
  42070. "adc r5, %[r]\n\t"
  42071. #endif
  42072. "uxth r7, %[b]\n\t"
  42073. #ifdef WOLFSSL_KEIL
  42074. "muls r6, r7, r6\n\t"
  42075. #elif defined(__clang__)
  42076. "muls r6, r7\n\t"
  42077. #else
  42078. "mul r6, r7\n\t"
  42079. #endif
  42080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42081. "lsrs r7, r6, #16\n\t"
  42082. #else
  42083. "lsr r7, r6, #16\n\t"
  42084. #endif
  42085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42086. "lsls r6, r6, #16\n\t"
  42087. #else
  42088. "lsl r6, r6, #16\n\t"
  42089. #endif
  42090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42091. "adds r3, r3, r6\n\t"
  42092. #else
  42093. "add r3, r3, r6\n\t"
  42094. #endif
  42095. #ifdef WOLFSSL_KEIL
  42096. "adcs r4, r4, r7\n\t"
  42097. #elif defined(__clang__)
  42098. "adcs r4, r7\n\t"
  42099. #else
  42100. "adc r4, r7\n\t"
  42101. #endif
  42102. #ifdef WOLFSSL_KEIL
  42103. "adcs r5, r5, %[r]\n\t"
  42104. #elif defined(__clang__)
  42105. "adcs r5, %[r]\n\t"
  42106. #else
  42107. "adc r5, %[r]\n\t"
  42108. #endif
  42109. "# A[5] * B[7]\n\t"
  42110. "mov %[a], r9\n\t"
  42111. "mov %[b], r10\n\t"
  42112. "ldr %[a], [%[a], #20]\n\t"
  42113. "ldr %[b], [%[b], #28]\n\t"
  42114. "uxth r6, %[a]\n\t"
  42115. "uxth r7, %[b]\n\t"
  42116. #ifdef WOLFSSL_KEIL
  42117. "muls r7, r6, r7\n\t"
  42118. #elif defined(__clang__)
  42119. "muls r7, r6\n\t"
  42120. #else
  42121. "mul r7, r6\n\t"
  42122. #endif
  42123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42124. "adds r3, r3, r7\n\t"
  42125. #else
  42126. "add r3, r3, r7\n\t"
  42127. #endif
  42128. #ifdef WOLFSSL_KEIL
  42129. "adcs r4, r4, %[r]\n\t"
  42130. #elif defined(__clang__)
  42131. "adcs r4, %[r]\n\t"
  42132. #else
  42133. "adc r4, %[r]\n\t"
  42134. #endif
  42135. #ifdef WOLFSSL_KEIL
  42136. "adcs r5, r5, %[r]\n\t"
  42137. #elif defined(__clang__)
  42138. "adcs r5, %[r]\n\t"
  42139. #else
  42140. "adc r5, %[r]\n\t"
  42141. #endif
  42142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42143. "lsrs r7, %[b], #16\n\t"
  42144. #else
  42145. "lsr r7, %[b], #16\n\t"
  42146. #endif
  42147. #ifdef WOLFSSL_KEIL
  42148. "muls r6, r7, r6\n\t"
  42149. #elif defined(__clang__)
  42150. "muls r6, r7\n\t"
  42151. #else
  42152. "mul r6, r7\n\t"
  42153. #endif
  42154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42155. "lsrs r7, r6, #16\n\t"
  42156. #else
  42157. "lsr r7, r6, #16\n\t"
  42158. #endif
  42159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42160. "lsls r6, r6, #16\n\t"
  42161. #else
  42162. "lsl r6, r6, #16\n\t"
  42163. #endif
  42164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42165. "adds r3, r3, r6\n\t"
  42166. #else
  42167. "add r3, r3, r6\n\t"
  42168. #endif
  42169. #ifdef WOLFSSL_KEIL
  42170. "adcs r4, r4, r7\n\t"
  42171. #elif defined(__clang__)
  42172. "adcs r4, r7\n\t"
  42173. #else
  42174. "adc r4, r7\n\t"
  42175. #endif
  42176. #ifdef WOLFSSL_KEIL
  42177. "adcs r5, r5, %[r]\n\t"
  42178. #elif defined(__clang__)
  42179. "adcs r5, %[r]\n\t"
  42180. #else
  42181. "adc r5, %[r]\n\t"
  42182. #endif
  42183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42184. "lsrs r6, %[a], #16\n\t"
  42185. #else
  42186. "lsr r6, %[a], #16\n\t"
  42187. #endif
  42188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42189. "lsrs r7, %[b], #16\n\t"
  42190. #else
  42191. "lsr r7, %[b], #16\n\t"
  42192. #endif
  42193. #ifdef WOLFSSL_KEIL
  42194. "muls r7, r6, r7\n\t"
  42195. #elif defined(__clang__)
  42196. "muls r7, r6\n\t"
  42197. #else
  42198. "mul r7, r6\n\t"
  42199. #endif
  42200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42201. "adds r4, r4, r7\n\t"
  42202. #else
  42203. "add r4, r4, r7\n\t"
  42204. #endif
  42205. #ifdef WOLFSSL_KEIL
  42206. "adcs r5, r5, %[r]\n\t"
  42207. #elif defined(__clang__)
  42208. "adcs r5, %[r]\n\t"
  42209. #else
  42210. "adc r5, %[r]\n\t"
  42211. #endif
  42212. "uxth r7, %[b]\n\t"
  42213. #ifdef WOLFSSL_KEIL
  42214. "muls r6, r7, r6\n\t"
  42215. #elif defined(__clang__)
  42216. "muls r6, r7\n\t"
  42217. #else
  42218. "mul r6, r7\n\t"
  42219. #endif
  42220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42221. "lsrs r7, r6, #16\n\t"
  42222. #else
  42223. "lsr r7, r6, #16\n\t"
  42224. #endif
  42225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42226. "lsls r6, r6, #16\n\t"
  42227. #else
  42228. "lsl r6, r6, #16\n\t"
  42229. #endif
  42230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42231. "adds r3, r3, r6\n\t"
  42232. #else
  42233. "add r3, r3, r6\n\t"
  42234. #endif
  42235. #ifdef WOLFSSL_KEIL
  42236. "adcs r4, r4, r7\n\t"
  42237. #elif defined(__clang__)
  42238. "adcs r4, r7\n\t"
  42239. #else
  42240. "adc r4, r7\n\t"
  42241. #endif
  42242. #ifdef WOLFSSL_KEIL
  42243. "adcs r5, r5, %[r]\n\t"
  42244. #elif defined(__clang__)
  42245. "adcs r5, %[r]\n\t"
  42246. #else
  42247. "adc r5, %[r]\n\t"
  42248. #endif
  42249. "# A[4] * B[8]\n\t"
  42250. "mov %[a], r9\n\t"
  42251. "mov %[b], r10\n\t"
  42252. "ldr %[a], [%[a], #16]\n\t"
  42253. "ldr %[b], [%[b], #32]\n\t"
  42254. "uxth r6, %[a]\n\t"
  42255. "uxth r7, %[b]\n\t"
  42256. #ifdef WOLFSSL_KEIL
  42257. "muls r7, r6, r7\n\t"
  42258. #elif defined(__clang__)
  42259. "muls r7, r6\n\t"
  42260. #else
  42261. "mul r7, r6\n\t"
  42262. #endif
  42263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42264. "adds r3, r3, r7\n\t"
  42265. #else
  42266. "add r3, r3, r7\n\t"
  42267. #endif
  42268. #ifdef WOLFSSL_KEIL
  42269. "adcs r4, r4, %[r]\n\t"
  42270. #elif defined(__clang__)
  42271. "adcs r4, %[r]\n\t"
  42272. #else
  42273. "adc r4, %[r]\n\t"
  42274. #endif
  42275. #ifdef WOLFSSL_KEIL
  42276. "adcs r5, r5, %[r]\n\t"
  42277. #elif defined(__clang__)
  42278. "adcs r5, %[r]\n\t"
  42279. #else
  42280. "adc r5, %[r]\n\t"
  42281. #endif
  42282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42283. "lsrs r7, %[b], #16\n\t"
  42284. #else
  42285. "lsr r7, %[b], #16\n\t"
  42286. #endif
  42287. #ifdef WOLFSSL_KEIL
  42288. "muls r6, r7, r6\n\t"
  42289. #elif defined(__clang__)
  42290. "muls r6, r7\n\t"
  42291. #else
  42292. "mul r6, r7\n\t"
  42293. #endif
  42294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42295. "lsrs r7, r6, #16\n\t"
  42296. #else
  42297. "lsr r7, r6, #16\n\t"
  42298. #endif
  42299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42300. "lsls r6, r6, #16\n\t"
  42301. #else
  42302. "lsl r6, r6, #16\n\t"
  42303. #endif
  42304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42305. "adds r3, r3, r6\n\t"
  42306. #else
  42307. "add r3, r3, r6\n\t"
  42308. #endif
  42309. #ifdef WOLFSSL_KEIL
  42310. "adcs r4, r4, r7\n\t"
  42311. #elif defined(__clang__)
  42312. "adcs r4, r7\n\t"
  42313. #else
  42314. "adc r4, r7\n\t"
  42315. #endif
  42316. #ifdef WOLFSSL_KEIL
  42317. "adcs r5, r5, %[r]\n\t"
  42318. #elif defined(__clang__)
  42319. "adcs r5, %[r]\n\t"
  42320. #else
  42321. "adc r5, %[r]\n\t"
  42322. #endif
  42323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42324. "lsrs r6, %[a], #16\n\t"
  42325. #else
  42326. "lsr r6, %[a], #16\n\t"
  42327. #endif
  42328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42329. "lsrs r7, %[b], #16\n\t"
  42330. #else
  42331. "lsr r7, %[b], #16\n\t"
  42332. #endif
  42333. #ifdef WOLFSSL_KEIL
  42334. "muls r7, r6, r7\n\t"
  42335. #elif defined(__clang__)
  42336. "muls r7, r6\n\t"
  42337. #else
  42338. "mul r7, r6\n\t"
  42339. #endif
  42340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42341. "adds r4, r4, r7\n\t"
  42342. #else
  42343. "add r4, r4, r7\n\t"
  42344. #endif
  42345. #ifdef WOLFSSL_KEIL
  42346. "adcs r5, r5, %[r]\n\t"
  42347. #elif defined(__clang__)
  42348. "adcs r5, %[r]\n\t"
  42349. #else
  42350. "adc r5, %[r]\n\t"
  42351. #endif
  42352. "uxth r7, %[b]\n\t"
  42353. #ifdef WOLFSSL_KEIL
  42354. "muls r6, r7, r6\n\t"
  42355. #elif defined(__clang__)
  42356. "muls r6, r7\n\t"
  42357. #else
  42358. "mul r6, r7\n\t"
  42359. #endif
  42360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42361. "lsrs r7, r6, #16\n\t"
  42362. #else
  42363. "lsr r7, r6, #16\n\t"
  42364. #endif
  42365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42366. "lsls r6, r6, #16\n\t"
  42367. #else
  42368. "lsl r6, r6, #16\n\t"
  42369. #endif
  42370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42371. "adds r3, r3, r6\n\t"
  42372. #else
  42373. "add r3, r3, r6\n\t"
  42374. #endif
  42375. #ifdef WOLFSSL_KEIL
  42376. "adcs r4, r4, r7\n\t"
  42377. #elif defined(__clang__)
  42378. "adcs r4, r7\n\t"
  42379. #else
  42380. "adc r4, r7\n\t"
  42381. #endif
  42382. #ifdef WOLFSSL_KEIL
  42383. "adcs r5, r5, %[r]\n\t"
  42384. #elif defined(__clang__)
  42385. "adcs r5, %[r]\n\t"
  42386. #else
  42387. "adc r5, %[r]\n\t"
  42388. #endif
  42389. "# A[3] * B[9]\n\t"
  42390. "mov %[a], r9\n\t"
  42391. "mov %[b], r10\n\t"
  42392. "ldr %[a], [%[a], #12]\n\t"
  42393. "ldr %[b], [%[b], #36]\n\t"
  42394. "uxth r6, %[a]\n\t"
  42395. "uxth r7, %[b]\n\t"
  42396. #ifdef WOLFSSL_KEIL
  42397. "muls r7, r6, r7\n\t"
  42398. #elif defined(__clang__)
  42399. "muls r7, r6\n\t"
  42400. #else
  42401. "mul r7, r6\n\t"
  42402. #endif
  42403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42404. "adds r3, r3, r7\n\t"
  42405. #else
  42406. "add r3, r3, r7\n\t"
  42407. #endif
  42408. #ifdef WOLFSSL_KEIL
  42409. "adcs r4, r4, %[r]\n\t"
  42410. #elif defined(__clang__)
  42411. "adcs r4, %[r]\n\t"
  42412. #else
  42413. "adc r4, %[r]\n\t"
  42414. #endif
  42415. #ifdef WOLFSSL_KEIL
  42416. "adcs r5, r5, %[r]\n\t"
  42417. #elif defined(__clang__)
  42418. "adcs r5, %[r]\n\t"
  42419. #else
  42420. "adc r5, %[r]\n\t"
  42421. #endif
  42422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42423. "lsrs r7, %[b], #16\n\t"
  42424. #else
  42425. "lsr r7, %[b], #16\n\t"
  42426. #endif
  42427. #ifdef WOLFSSL_KEIL
  42428. "muls r6, r7, r6\n\t"
  42429. #elif defined(__clang__)
  42430. "muls r6, r7\n\t"
  42431. #else
  42432. "mul r6, r7\n\t"
  42433. #endif
  42434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42435. "lsrs r7, r6, #16\n\t"
  42436. #else
  42437. "lsr r7, r6, #16\n\t"
  42438. #endif
  42439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42440. "lsls r6, r6, #16\n\t"
  42441. #else
  42442. "lsl r6, r6, #16\n\t"
  42443. #endif
  42444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42445. "adds r3, r3, r6\n\t"
  42446. #else
  42447. "add r3, r3, r6\n\t"
  42448. #endif
  42449. #ifdef WOLFSSL_KEIL
  42450. "adcs r4, r4, r7\n\t"
  42451. #elif defined(__clang__)
  42452. "adcs r4, r7\n\t"
  42453. #else
  42454. "adc r4, r7\n\t"
  42455. #endif
  42456. #ifdef WOLFSSL_KEIL
  42457. "adcs r5, r5, %[r]\n\t"
  42458. #elif defined(__clang__)
  42459. "adcs r5, %[r]\n\t"
  42460. #else
  42461. "adc r5, %[r]\n\t"
  42462. #endif
  42463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42464. "lsrs r6, %[a], #16\n\t"
  42465. #else
  42466. "lsr r6, %[a], #16\n\t"
  42467. #endif
  42468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42469. "lsrs r7, %[b], #16\n\t"
  42470. #else
  42471. "lsr r7, %[b], #16\n\t"
  42472. #endif
  42473. #ifdef WOLFSSL_KEIL
  42474. "muls r7, r6, r7\n\t"
  42475. #elif defined(__clang__)
  42476. "muls r7, r6\n\t"
  42477. #else
  42478. "mul r7, r6\n\t"
  42479. #endif
  42480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42481. "adds r4, r4, r7\n\t"
  42482. #else
  42483. "add r4, r4, r7\n\t"
  42484. #endif
  42485. #ifdef WOLFSSL_KEIL
  42486. "adcs r5, r5, %[r]\n\t"
  42487. #elif defined(__clang__)
  42488. "adcs r5, %[r]\n\t"
  42489. #else
  42490. "adc r5, %[r]\n\t"
  42491. #endif
  42492. "uxth r7, %[b]\n\t"
  42493. #ifdef WOLFSSL_KEIL
  42494. "muls r6, r7, r6\n\t"
  42495. #elif defined(__clang__)
  42496. "muls r6, r7\n\t"
  42497. #else
  42498. "mul r6, r7\n\t"
  42499. #endif
  42500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42501. "lsrs r7, r6, #16\n\t"
  42502. #else
  42503. "lsr r7, r6, #16\n\t"
  42504. #endif
  42505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42506. "lsls r6, r6, #16\n\t"
  42507. #else
  42508. "lsl r6, r6, #16\n\t"
  42509. #endif
  42510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42511. "adds r3, r3, r6\n\t"
  42512. #else
  42513. "add r3, r3, r6\n\t"
  42514. #endif
  42515. #ifdef WOLFSSL_KEIL
  42516. "adcs r4, r4, r7\n\t"
  42517. #elif defined(__clang__)
  42518. "adcs r4, r7\n\t"
  42519. #else
  42520. "adc r4, r7\n\t"
  42521. #endif
  42522. #ifdef WOLFSSL_KEIL
  42523. "adcs r5, r5, %[r]\n\t"
  42524. #elif defined(__clang__)
  42525. "adcs r5, %[r]\n\t"
  42526. #else
  42527. "adc r5, %[r]\n\t"
  42528. #endif
  42529. "# A[2] * B[10]\n\t"
  42530. "mov %[a], r9\n\t"
  42531. "mov %[b], r10\n\t"
  42532. "ldr %[a], [%[a], #8]\n\t"
  42533. "ldr %[b], [%[b], #40]\n\t"
  42534. "uxth r6, %[a]\n\t"
  42535. "uxth r7, %[b]\n\t"
  42536. #ifdef WOLFSSL_KEIL
  42537. "muls r7, r6, r7\n\t"
  42538. #elif defined(__clang__)
  42539. "muls r7, r6\n\t"
  42540. #else
  42541. "mul r7, r6\n\t"
  42542. #endif
  42543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42544. "adds r3, r3, r7\n\t"
  42545. #else
  42546. "add r3, r3, r7\n\t"
  42547. #endif
  42548. #ifdef WOLFSSL_KEIL
  42549. "adcs r4, r4, %[r]\n\t"
  42550. #elif defined(__clang__)
  42551. "adcs r4, %[r]\n\t"
  42552. #else
  42553. "adc r4, %[r]\n\t"
  42554. #endif
  42555. #ifdef WOLFSSL_KEIL
  42556. "adcs r5, r5, %[r]\n\t"
  42557. #elif defined(__clang__)
  42558. "adcs r5, %[r]\n\t"
  42559. #else
  42560. "adc r5, %[r]\n\t"
  42561. #endif
  42562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42563. "lsrs r7, %[b], #16\n\t"
  42564. #else
  42565. "lsr r7, %[b], #16\n\t"
  42566. #endif
  42567. #ifdef WOLFSSL_KEIL
  42568. "muls r6, r7, r6\n\t"
  42569. #elif defined(__clang__)
  42570. "muls r6, r7\n\t"
  42571. #else
  42572. "mul r6, r7\n\t"
  42573. #endif
  42574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42575. "lsrs r7, r6, #16\n\t"
  42576. #else
  42577. "lsr r7, r6, #16\n\t"
  42578. #endif
  42579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42580. "lsls r6, r6, #16\n\t"
  42581. #else
  42582. "lsl r6, r6, #16\n\t"
  42583. #endif
  42584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42585. "adds r3, r3, r6\n\t"
  42586. #else
  42587. "add r3, r3, r6\n\t"
  42588. #endif
  42589. #ifdef WOLFSSL_KEIL
  42590. "adcs r4, r4, r7\n\t"
  42591. #elif defined(__clang__)
  42592. "adcs r4, r7\n\t"
  42593. #else
  42594. "adc r4, r7\n\t"
  42595. #endif
  42596. #ifdef WOLFSSL_KEIL
  42597. "adcs r5, r5, %[r]\n\t"
  42598. #elif defined(__clang__)
  42599. "adcs r5, %[r]\n\t"
  42600. #else
  42601. "adc r5, %[r]\n\t"
  42602. #endif
  42603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42604. "lsrs r6, %[a], #16\n\t"
  42605. #else
  42606. "lsr r6, %[a], #16\n\t"
  42607. #endif
  42608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42609. "lsrs r7, %[b], #16\n\t"
  42610. #else
  42611. "lsr r7, %[b], #16\n\t"
  42612. #endif
  42613. #ifdef WOLFSSL_KEIL
  42614. "muls r7, r6, r7\n\t"
  42615. #elif defined(__clang__)
  42616. "muls r7, r6\n\t"
  42617. #else
  42618. "mul r7, r6\n\t"
  42619. #endif
  42620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42621. "adds r4, r4, r7\n\t"
  42622. #else
  42623. "add r4, r4, r7\n\t"
  42624. #endif
  42625. #ifdef WOLFSSL_KEIL
  42626. "adcs r5, r5, %[r]\n\t"
  42627. #elif defined(__clang__)
  42628. "adcs r5, %[r]\n\t"
  42629. #else
  42630. "adc r5, %[r]\n\t"
  42631. #endif
  42632. "uxth r7, %[b]\n\t"
  42633. #ifdef WOLFSSL_KEIL
  42634. "muls r6, r7, r6\n\t"
  42635. #elif defined(__clang__)
  42636. "muls r6, r7\n\t"
  42637. #else
  42638. "mul r6, r7\n\t"
  42639. #endif
  42640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42641. "lsrs r7, r6, #16\n\t"
  42642. #else
  42643. "lsr r7, r6, #16\n\t"
  42644. #endif
  42645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42646. "lsls r6, r6, #16\n\t"
  42647. #else
  42648. "lsl r6, r6, #16\n\t"
  42649. #endif
  42650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42651. "adds r3, r3, r6\n\t"
  42652. #else
  42653. "add r3, r3, r6\n\t"
  42654. #endif
  42655. #ifdef WOLFSSL_KEIL
  42656. "adcs r4, r4, r7\n\t"
  42657. #elif defined(__clang__)
  42658. "adcs r4, r7\n\t"
  42659. #else
  42660. "adc r4, r7\n\t"
  42661. #endif
  42662. #ifdef WOLFSSL_KEIL
  42663. "adcs r5, r5, %[r]\n\t"
  42664. #elif defined(__clang__)
  42665. "adcs r5, %[r]\n\t"
  42666. #else
  42667. "adc r5, %[r]\n\t"
  42668. #endif
  42669. "# A[1] * B[11]\n\t"
  42670. "mov %[a], r9\n\t"
  42671. "mov %[b], r10\n\t"
  42672. "ldr %[a], [%[a], #4]\n\t"
  42673. "ldr %[b], [%[b], #44]\n\t"
  42674. "uxth r6, %[a]\n\t"
  42675. "uxth r7, %[b]\n\t"
  42676. #ifdef WOLFSSL_KEIL
  42677. "muls r7, r6, r7\n\t"
  42678. #elif defined(__clang__)
  42679. "muls r7, r6\n\t"
  42680. #else
  42681. "mul r7, r6\n\t"
  42682. #endif
  42683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42684. "adds r3, r3, r7\n\t"
  42685. #else
  42686. "add r3, r3, r7\n\t"
  42687. #endif
  42688. #ifdef WOLFSSL_KEIL
  42689. "adcs r4, r4, %[r]\n\t"
  42690. #elif defined(__clang__)
  42691. "adcs r4, %[r]\n\t"
  42692. #else
  42693. "adc r4, %[r]\n\t"
  42694. #endif
  42695. #ifdef WOLFSSL_KEIL
  42696. "adcs r5, r5, %[r]\n\t"
  42697. #elif defined(__clang__)
  42698. "adcs r5, %[r]\n\t"
  42699. #else
  42700. "adc r5, %[r]\n\t"
  42701. #endif
  42702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42703. "lsrs r7, %[b], #16\n\t"
  42704. #else
  42705. "lsr r7, %[b], #16\n\t"
  42706. #endif
  42707. #ifdef WOLFSSL_KEIL
  42708. "muls r6, r7, r6\n\t"
  42709. #elif defined(__clang__)
  42710. "muls r6, r7\n\t"
  42711. #else
  42712. "mul r6, r7\n\t"
  42713. #endif
  42714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42715. "lsrs r7, r6, #16\n\t"
  42716. #else
  42717. "lsr r7, r6, #16\n\t"
  42718. #endif
  42719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42720. "lsls r6, r6, #16\n\t"
  42721. #else
  42722. "lsl r6, r6, #16\n\t"
  42723. #endif
  42724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42725. "adds r3, r3, r6\n\t"
  42726. #else
  42727. "add r3, r3, r6\n\t"
  42728. #endif
  42729. #ifdef WOLFSSL_KEIL
  42730. "adcs r4, r4, r7\n\t"
  42731. #elif defined(__clang__)
  42732. "adcs r4, r7\n\t"
  42733. #else
  42734. "adc r4, r7\n\t"
  42735. #endif
  42736. #ifdef WOLFSSL_KEIL
  42737. "adcs r5, r5, %[r]\n\t"
  42738. #elif defined(__clang__)
  42739. "adcs r5, %[r]\n\t"
  42740. #else
  42741. "adc r5, %[r]\n\t"
  42742. #endif
  42743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42744. "lsrs r6, %[a], #16\n\t"
  42745. #else
  42746. "lsr r6, %[a], #16\n\t"
  42747. #endif
  42748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42749. "lsrs r7, %[b], #16\n\t"
  42750. #else
  42751. "lsr r7, %[b], #16\n\t"
  42752. #endif
  42753. #ifdef WOLFSSL_KEIL
  42754. "muls r7, r6, r7\n\t"
  42755. #elif defined(__clang__)
  42756. "muls r7, r6\n\t"
  42757. #else
  42758. "mul r7, r6\n\t"
  42759. #endif
  42760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42761. "adds r4, r4, r7\n\t"
  42762. #else
  42763. "add r4, r4, r7\n\t"
  42764. #endif
  42765. #ifdef WOLFSSL_KEIL
  42766. "adcs r5, r5, %[r]\n\t"
  42767. #elif defined(__clang__)
  42768. "adcs r5, %[r]\n\t"
  42769. #else
  42770. "adc r5, %[r]\n\t"
  42771. #endif
  42772. "uxth r7, %[b]\n\t"
  42773. #ifdef WOLFSSL_KEIL
  42774. "muls r6, r7, r6\n\t"
  42775. #elif defined(__clang__)
  42776. "muls r6, r7\n\t"
  42777. #else
  42778. "mul r6, r7\n\t"
  42779. #endif
  42780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42781. "lsrs r7, r6, #16\n\t"
  42782. #else
  42783. "lsr r7, r6, #16\n\t"
  42784. #endif
  42785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42786. "lsls r6, r6, #16\n\t"
  42787. #else
  42788. "lsl r6, r6, #16\n\t"
  42789. #endif
  42790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42791. "adds r3, r3, r6\n\t"
  42792. #else
  42793. "add r3, r3, r6\n\t"
  42794. #endif
  42795. #ifdef WOLFSSL_KEIL
  42796. "adcs r4, r4, r7\n\t"
  42797. #elif defined(__clang__)
  42798. "adcs r4, r7\n\t"
  42799. #else
  42800. "adc r4, r7\n\t"
  42801. #endif
  42802. #ifdef WOLFSSL_KEIL
  42803. "adcs r5, r5, %[r]\n\t"
  42804. #elif defined(__clang__)
  42805. "adcs r5, %[r]\n\t"
  42806. #else
  42807. "adc r5, %[r]\n\t"
  42808. #endif
  42809. "mov %[r], r8\n\t"
  42810. "str r3, [%[r], #48]\n\t"
  42811. "movs %[r], #0\n\t"
  42812. "# A[2] * B[11]\n\t"
  42813. "movs r3, #0\n\t"
  42814. "mov %[a], r9\n\t"
  42815. "mov %[b], r10\n\t"
  42816. "ldr %[a], [%[a], #8]\n\t"
  42817. "ldr %[b], [%[b], #44]\n\t"
  42818. "uxth r6, %[a]\n\t"
  42819. "uxth r7, %[b]\n\t"
  42820. #ifdef WOLFSSL_KEIL
  42821. "muls r7, r6, r7\n\t"
  42822. #elif defined(__clang__)
  42823. "muls r7, r6\n\t"
  42824. #else
  42825. "mul r7, r6\n\t"
  42826. #endif
  42827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42828. "adds r4, r4, r7\n\t"
  42829. #else
  42830. "add r4, r4, r7\n\t"
  42831. #endif
  42832. #ifdef WOLFSSL_KEIL
  42833. "adcs r5, r5, %[r]\n\t"
  42834. #elif defined(__clang__)
  42835. "adcs r5, %[r]\n\t"
  42836. #else
  42837. "adc r5, %[r]\n\t"
  42838. #endif
  42839. #ifdef WOLFSSL_KEIL
  42840. "adcs r3, r3, %[r]\n\t"
  42841. #elif defined(__clang__)
  42842. "adcs r3, %[r]\n\t"
  42843. #else
  42844. "adc r3, %[r]\n\t"
  42845. #endif
  42846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42847. "lsrs r7, %[b], #16\n\t"
  42848. #else
  42849. "lsr r7, %[b], #16\n\t"
  42850. #endif
  42851. #ifdef WOLFSSL_KEIL
  42852. "muls r6, r7, r6\n\t"
  42853. #elif defined(__clang__)
  42854. "muls r6, r7\n\t"
  42855. #else
  42856. "mul r6, r7\n\t"
  42857. #endif
  42858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42859. "lsrs r7, r6, #16\n\t"
  42860. #else
  42861. "lsr r7, r6, #16\n\t"
  42862. #endif
  42863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42864. "lsls r6, r6, #16\n\t"
  42865. #else
  42866. "lsl r6, r6, #16\n\t"
  42867. #endif
  42868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42869. "adds r4, r4, r6\n\t"
  42870. #else
  42871. "add r4, r4, r6\n\t"
  42872. #endif
  42873. #ifdef WOLFSSL_KEIL
  42874. "adcs r5, r5, r7\n\t"
  42875. #elif defined(__clang__)
  42876. "adcs r5, r7\n\t"
  42877. #else
  42878. "adc r5, r7\n\t"
  42879. #endif
  42880. #ifdef WOLFSSL_KEIL
  42881. "adcs r3, r3, %[r]\n\t"
  42882. #elif defined(__clang__)
  42883. "adcs r3, %[r]\n\t"
  42884. #else
  42885. "adc r3, %[r]\n\t"
  42886. #endif
  42887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42888. "lsrs r6, %[a], #16\n\t"
  42889. #else
  42890. "lsr r6, %[a], #16\n\t"
  42891. #endif
  42892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42893. "lsrs r7, %[b], #16\n\t"
  42894. #else
  42895. "lsr r7, %[b], #16\n\t"
  42896. #endif
  42897. #ifdef WOLFSSL_KEIL
  42898. "muls r7, r6, r7\n\t"
  42899. #elif defined(__clang__)
  42900. "muls r7, r6\n\t"
  42901. #else
  42902. "mul r7, r6\n\t"
  42903. #endif
  42904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42905. "adds r5, r5, r7\n\t"
  42906. #else
  42907. "add r5, r5, r7\n\t"
  42908. #endif
  42909. #ifdef WOLFSSL_KEIL
  42910. "adcs r3, r3, %[r]\n\t"
  42911. #elif defined(__clang__)
  42912. "adcs r3, %[r]\n\t"
  42913. #else
  42914. "adc r3, %[r]\n\t"
  42915. #endif
  42916. "uxth r7, %[b]\n\t"
  42917. #ifdef WOLFSSL_KEIL
  42918. "muls r6, r7, r6\n\t"
  42919. #elif defined(__clang__)
  42920. "muls r6, r7\n\t"
  42921. #else
  42922. "mul r6, r7\n\t"
  42923. #endif
  42924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42925. "lsrs r7, r6, #16\n\t"
  42926. #else
  42927. "lsr r7, r6, #16\n\t"
  42928. #endif
  42929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42930. "lsls r6, r6, #16\n\t"
  42931. #else
  42932. "lsl r6, r6, #16\n\t"
  42933. #endif
  42934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42935. "adds r4, r4, r6\n\t"
  42936. #else
  42937. "add r4, r4, r6\n\t"
  42938. #endif
  42939. #ifdef WOLFSSL_KEIL
  42940. "adcs r5, r5, r7\n\t"
  42941. #elif defined(__clang__)
  42942. "adcs r5, r7\n\t"
  42943. #else
  42944. "adc r5, r7\n\t"
  42945. #endif
  42946. #ifdef WOLFSSL_KEIL
  42947. "adcs r3, r3, %[r]\n\t"
  42948. #elif defined(__clang__)
  42949. "adcs r3, %[r]\n\t"
  42950. #else
  42951. "adc r3, %[r]\n\t"
  42952. #endif
  42953. "# A[3] * B[10]\n\t"
  42954. "mov %[a], r9\n\t"
  42955. "mov %[b], r10\n\t"
  42956. "ldr %[a], [%[a], #12]\n\t"
  42957. "ldr %[b], [%[b], #40]\n\t"
  42958. "uxth r6, %[a]\n\t"
  42959. "uxth r7, %[b]\n\t"
  42960. #ifdef WOLFSSL_KEIL
  42961. "muls r7, r6, r7\n\t"
  42962. #elif defined(__clang__)
  42963. "muls r7, r6\n\t"
  42964. #else
  42965. "mul r7, r6\n\t"
  42966. #endif
  42967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42968. "adds r4, r4, r7\n\t"
  42969. #else
  42970. "add r4, r4, r7\n\t"
  42971. #endif
  42972. #ifdef WOLFSSL_KEIL
  42973. "adcs r5, r5, %[r]\n\t"
  42974. #elif defined(__clang__)
  42975. "adcs r5, %[r]\n\t"
  42976. #else
  42977. "adc r5, %[r]\n\t"
  42978. #endif
  42979. #ifdef WOLFSSL_KEIL
  42980. "adcs r3, r3, %[r]\n\t"
  42981. #elif defined(__clang__)
  42982. "adcs r3, %[r]\n\t"
  42983. #else
  42984. "adc r3, %[r]\n\t"
  42985. #endif
  42986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42987. "lsrs r7, %[b], #16\n\t"
  42988. #else
  42989. "lsr r7, %[b], #16\n\t"
  42990. #endif
  42991. #ifdef WOLFSSL_KEIL
  42992. "muls r6, r7, r6\n\t"
  42993. #elif defined(__clang__)
  42994. "muls r6, r7\n\t"
  42995. #else
  42996. "mul r6, r7\n\t"
  42997. #endif
  42998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  42999. "lsrs r7, r6, #16\n\t"
  43000. #else
  43001. "lsr r7, r6, #16\n\t"
  43002. #endif
  43003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43004. "lsls r6, r6, #16\n\t"
  43005. #else
  43006. "lsl r6, r6, #16\n\t"
  43007. #endif
  43008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43009. "adds r4, r4, r6\n\t"
  43010. #else
  43011. "add r4, r4, r6\n\t"
  43012. #endif
  43013. #ifdef WOLFSSL_KEIL
  43014. "adcs r5, r5, r7\n\t"
  43015. #elif defined(__clang__)
  43016. "adcs r5, r7\n\t"
  43017. #else
  43018. "adc r5, r7\n\t"
  43019. #endif
  43020. #ifdef WOLFSSL_KEIL
  43021. "adcs r3, r3, %[r]\n\t"
  43022. #elif defined(__clang__)
  43023. "adcs r3, %[r]\n\t"
  43024. #else
  43025. "adc r3, %[r]\n\t"
  43026. #endif
  43027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43028. "lsrs r6, %[a], #16\n\t"
  43029. #else
  43030. "lsr r6, %[a], #16\n\t"
  43031. #endif
  43032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43033. "lsrs r7, %[b], #16\n\t"
  43034. #else
  43035. "lsr r7, %[b], #16\n\t"
  43036. #endif
  43037. #ifdef WOLFSSL_KEIL
  43038. "muls r7, r6, r7\n\t"
  43039. #elif defined(__clang__)
  43040. "muls r7, r6\n\t"
  43041. #else
  43042. "mul r7, r6\n\t"
  43043. #endif
  43044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43045. "adds r5, r5, r7\n\t"
  43046. #else
  43047. "add r5, r5, r7\n\t"
  43048. #endif
  43049. #ifdef WOLFSSL_KEIL
  43050. "adcs r3, r3, %[r]\n\t"
  43051. #elif defined(__clang__)
  43052. "adcs r3, %[r]\n\t"
  43053. #else
  43054. "adc r3, %[r]\n\t"
  43055. #endif
  43056. "uxth r7, %[b]\n\t"
  43057. #ifdef WOLFSSL_KEIL
  43058. "muls r6, r7, r6\n\t"
  43059. #elif defined(__clang__)
  43060. "muls r6, r7\n\t"
  43061. #else
  43062. "mul r6, r7\n\t"
  43063. #endif
  43064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43065. "lsrs r7, r6, #16\n\t"
  43066. #else
  43067. "lsr r7, r6, #16\n\t"
  43068. #endif
  43069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43070. "lsls r6, r6, #16\n\t"
  43071. #else
  43072. "lsl r6, r6, #16\n\t"
  43073. #endif
  43074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43075. "adds r4, r4, r6\n\t"
  43076. #else
  43077. "add r4, r4, r6\n\t"
  43078. #endif
  43079. #ifdef WOLFSSL_KEIL
  43080. "adcs r5, r5, r7\n\t"
  43081. #elif defined(__clang__)
  43082. "adcs r5, r7\n\t"
  43083. #else
  43084. "adc r5, r7\n\t"
  43085. #endif
  43086. #ifdef WOLFSSL_KEIL
  43087. "adcs r3, r3, %[r]\n\t"
  43088. #elif defined(__clang__)
  43089. "adcs r3, %[r]\n\t"
  43090. #else
  43091. "adc r3, %[r]\n\t"
  43092. #endif
  43093. "# A[4] * B[9]\n\t"
  43094. "mov %[a], r9\n\t"
  43095. "mov %[b], r10\n\t"
  43096. "ldr %[a], [%[a], #16]\n\t"
  43097. "ldr %[b], [%[b], #36]\n\t"
  43098. "uxth r6, %[a]\n\t"
  43099. "uxth r7, %[b]\n\t"
  43100. #ifdef WOLFSSL_KEIL
  43101. "muls r7, r6, r7\n\t"
  43102. #elif defined(__clang__)
  43103. "muls r7, r6\n\t"
  43104. #else
  43105. "mul r7, r6\n\t"
  43106. #endif
  43107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43108. "adds r4, r4, r7\n\t"
  43109. #else
  43110. "add r4, r4, r7\n\t"
  43111. #endif
  43112. #ifdef WOLFSSL_KEIL
  43113. "adcs r5, r5, %[r]\n\t"
  43114. #elif defined(__clang__)
  43115. "adcs r5, %[r]\n\t"
  43116. #else
  43117. "adc r5, %[r]\n\t"
  43118. #endif
  43119. #ifdef WOLFSSL_KEIL
  43120. "adcs r3, r3, %[r]\n\t"
  43121. #elif defined(__clang__)
  43122. "adcs r3, %[r]\n\t"
  43123. #else
  43124. "adc r3, %[r]\n\t"
  43125. #endif
  43126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43127. "lsrs r7, %[b], #16\n\t"
  43128. #else
  43129. "lsr r7, %[b], #16\n\t"
  43130. #endif
  43131. #ifdef WOLFSSL_KEIL
  43132. "muls r6, r7, r6\n\t"
  43133. #elif defined(__clang__)
  43134. "muls r6, r7\n\t"
  43135. #else
  43136. "mul r6, r7\n\t"
  43137. #endif
  43138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43139. "lsrs r7, r6, #16\n\t"
  43140. #else
  43141. "lsr r7, r6, #16\n\t"
  43142. #endif
  43143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43144. "lsls r6, r6, #16\n\t"
  43145. #else
  43146. "lsl r6, r6, #16\n\t"
  43147. #endif
  43148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43149. "adds r4, r4, r6\n\t"
  43150. #else
  43151. "add r4, r4, r6\n\t"
  43152. #endif
  43153. #ifdef WOLFSSL_KEIL
  43154. "adcs r5, r5, r7\n\t"
  43155. #elif defined(__clang__)
  43156. "adcs r5, r7\n\t"
  43157. #else
  43158. "adc r5, r7\n\t"
  43159. #endif
  43160. #ifdef WOLFSSL_KEIL
  43161. "adcs r3, r3, %[r]\n\t"
  43162. #elif defined(__clang__)
  43163. "adcs r3, %[r]\n\t"
  43164. #else
  43165. "adc r3, %[r]\n\t"
  43166. #endif
  43167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43168. "lsrs r6, %[a], #16\n\t"
  43169. #else
  43170. "lsr r6, %[a], #16\n\t"
  43171. #endif
  43172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43173. "lsrs r7, %[b], #16\n\t"
  43174. #else
  43175. "lsr r7, %[b], #16\n\t"
  43176. #endif
  43177. #ifdef WOLFSSL_KEIL
  43178. "muls r7, r6, r7\n\t"
  43179. #elif defined(__clang__)
  43180. "muls r7, r6\n\t"
  43181. #else
  43182. "mul r7, r6\n\t"
  43183. #endif
  43184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43185. "adds r5, r5, r7\n\t"
  43186. #else
  43187. "add r5, r5, r7\n\t"
  43188. #endif
  43189. #ifdef WOLFSSL_KEIL
  43190. "adcs r3, r3, %[r]\n\t"
  43191. #elif defined(__clang__)
  43192. "adcs r3, %[r]\n\t"
  43193. #else
  43194. "adc r3, %[r]\n\t"
  43195. #endif
  43196. "uxth r7, %[b]\n\t"
  43197. #ifdef WOLFSSL_KEIL
  43198. "muls r6, r7, r6\n\t"
  43199. #elif defined(__clang__)
  43200. "muls r6, r7\n\t"
  43201. #else
  43202. "mul r6, r7\n\t"
  43203. #endif
  43204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43205. "lsrs r7, r6, #16\n\t"
  43206. #else
  43207. "lsr r7, r6, #16\n\t"
  43208. #endif
  43209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43210. "lsls r6, r6, #16\n\t"
  43211. #else
  43212. "lsl r6, r6, #16\n\t"
  43213. #endif
  43214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43215. "adds r4, r4, r6\n\t"
  43216. #else
  43217. "add r4, r4, r6\n\t"
  43218. #endif
  43219. #ifdef WOLFSSL_KEIL
  43220. "adcs r5, r5, r7\n\t"
  43221. #elif defined(__clang__)
  43222. "adcs r5, r7\n\t"
  43223. #else
  43224. "adc r5, r7\n\t"
  43225. #endif
  43226. #ifdef WOLFSSL_KEIL
  43227. "adcs r3, r3, %[r]\n\t"
  43228. #elif defined(__clang__)
  43229. "adcs r3, %[r]\n\t"
  43230. #else
  43231. "adc r3, %[r]\n\t"
  43232. #endif
  43233. "# A[5] * B[8]\n\t"
  43234. "mov %[a], r9\n\t"
  43235. "mov %[b], r10\n\t"
  43236. "ldr %[a], [%[a], #20]\n\t"
  43237. "ldr %[b], [%[b], #32]\n\t"
  43238. "uxth r6, %[a]\n\t"
  43239. "uxth r7, %[b]\n\t"
  43240. #ifdef WOLFSSL_KEIL
  43241. "muls r7, r6, r7\n\t"
  43242. #elif defined(__clang__)
  43243. "muls r7, r6\n\t"
  43244. #else
  43245. "mul r7, r6\n\t"
  43246. #endif
  43247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43248. "adds r4, r4, r7\n\t"
  43249. #else
  43250. "add r4, r4, r7\n\t"
  43251. #endif
  43252. #ifdef WOLFSSL_KEIL
  43253. "adcs r5, r5, %[r]\n\t"
  43254. #elif defined(__clang__)
  43255. "adcs r5, %[r]\n\t"
  43256. #else
  43257. "adc r5, %[r]\n\t"
  43258. #endif
  43259. #ifdef WOLFSSL_KEIL
  43260. "adcs r3, r3, %[r]\n\t"
  43261. #elif defined(__clang__)
  43262. "adcs r3, %[r]\n\t"
  43263. #else
  43264. "adc r3, %[r]\n\t"
  43265. #endif
  43266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43267. "lsrs r7, %[b], #16\n\t"
  43268. #else
  43269. "lsr r7, %[b], #16\n\t"
  43270. #endif
  43271. #ifdef WOLFSSL_KEIL
  43272. "muls r6, r7, r6\n\t"
  43273. #elif defined(__clang__)
  43274. "muls r6, r7\n\t"
  43275. #else
  43276. "mul r6, r7\n\t"
  43277. #endif
  43278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43279. "lsrs r7, r6, #16\n\t"
  43280. #else
  43281. "lsr r7, r6, #16\n\t"
  43282. #endif
  43283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43284. "lsls r6, r6, #16\n\t"
  43285. #else
  43286. "lsl r6, r6, #16\n\t"
  43287. #endif
  43288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43289. "adds r4, r4, r6\n\t"
  43290. #else
  43291. "add r4, r4, r6\n\t"
  43292. #endif
  43293. #ifdef WOLFSSL_KEIL
  43294. "adcs r5, r5, r7\n\t"
  43295. #elif defined(__clang__)
  43296. "adcs r5, r7\n\t"
  43297. #else
  43298. "adc r5, r7\n\t"
  43299. #endif
  43300. #ifdef WOLFSSL_KEIL
  43301. "adcs r3, r3, %[r]\n\t"
  43302. #elif defined(__clang__)
  43303. "adcs r3, %[r]\n\t"
  43304. #else
  43305. "adc r3, %[r]\n\t"
  43306. #endif
  43307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43308. "lsrs r6, %[a], #16\n\t"
  43309. #else
  43310. "lsr r6, %[a], #16\n\t"
  43311. #endif
  43312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43313. "lsrs r7, %[b], #16\n\t"
  43314. #else
  43315. "lsr r7, %[b], #16\n\t"
  43316. #endif
  43317. #ifdef WOLFSSL_KEIL
  43318. "muls r7, r6, r7\n\t"
  43319. #elif defined(__clang__)
  43320. "muls r7, r6\n\t"
  43321. #else
  43322. "mul r7, r6\n\t"
  43323. #endif
  43324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43325. "adds r5, r5, r7\n\t"
  43326. #else
  43327. "add r5, r5, r7\n\t"
  43328. #endif
  43329. #ifdef WOLFSSL_KEIL
  43330. "adcs r3, r3, %[r]\n\t"
  43331. #elif defined(__clang__)
  43332. "adcs r3, %[r]\n\t"
  43333. #else
  43334. "adc r3, %[r]\n\t"
  43335. #endif
  43336. "uxth r7, %[b]\n\t"
  43337. #ifdef WOLFSSL_KEIL
  43338. "muls r6, r7, r6\n\t"
  43339. #elif defined(__clang__)
  43340. "muls r6, r7\n\t"
  43341. #else
  43342. "mul r6, r7\n\t"
  43343. #endif
  43344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43345. "lsrs r7, r6, #16\n\t"
  43346. #else
  43347. "lsr r7, r6, #16\n\t"
  43348. #endif
  43349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43350. "lsls r6, r6, #16\n\t"
  43351. #else
  43352. "lsl r6, r6, #16\n\t"
  43353. #endif
  43354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43355. "adds r4, r4, r6\n\t"
  43356. #else
  43357. "add r4, r4, r6\n\t"
  43358. #endif
  43359. #ifdef WOLFSSL_KEIL
  43360. "adcs r5, r5, r7\n\t"
  43361. #elif defined(__clang__)
  43362. "adcs r5, r7\n\t"
  43363. #else
  43364. "adc r5, r7\n\t"
  43365. #endif
  43366. #ifdef WOLFSSL_KEIL
  43367. "adcs r3, r3, %[r]\n\t"
  43368. #elif defined(__clang__)
  43369. "adcs r3, %[r]\n\t"
  43370. #else
  43371. "adc r3, %[r]\n\t"
  43372. #endif
  43373. "# A[6] * B[7]\n\t"
  43374. "mov %[a], r9\n\t"
  43375. "mov %[b], r10\n\t"
  43376. "ldr %[a], [%[a], #24]\n\t"
  43377. "ldr %[b], [%[b], #28]\n\t"
  43378. "uxth r6, %[a]\n\t"
  43379. "uxth r7, %[b]\n\t"
  43380. #ifdef WOLFSSL_KEIL
  43381. "muls r7, r6, r7\n\t"
  43382. #elif defined(__clang__)
  43383. "muls r7, r6\n\t"
  43384. #else
  43385. "mul r7, r6\n\t"
  43386. #endif
  43387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43388. "adds r4, r4, r7\n\t"
  43389. #else
  43390. "add r4, r4, r7\n\t"
  43391. #endif
  43392. #ifdef WOLFSSL_KEIL
  43393. "adcs r5, r5, %[r]\n\t"
  43394. #elif defined(__clang__)
  43395. "adcs r5, %[r]\n\t"
  43396. #else
  43397. "adc r5, %[r]\n\t"
  43398. #endif
  43399. #ifdef WOLFSSL_KEIL
  43400. "adcs r3, r3, %[r]\n\t"
  43401. #elif defined(__clang__)
  43402. "adcs r3, %[r]\n\t"
  43403. #else
  43404. "adc r3, %[r]\n\t"
  43405. #endif
  43406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43407. "lsrs r7, %[b], #16\n\t"
  43408. #else
  43409. "lsr r7, %[b], #16\n\t"
  43410. #endif
  43411. #ifdef WOLFSSL_KEIL
  43412. "muls r6, r7, r6\n\t"
  43413. #elif defined(__clang__)
  43414. "muls r6, r7\n\t"
  43415. #else
  43416. "mul r6, r7\n\t"
  43417. #endif
  43418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43419. "lsrs r7, r6, #16\n\t"
  43420. #else
  43421. "lsr r7, r6, #16\n\t"
  43422. #endif
  43423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43424. "lsls r6, r6, #16\n\t"
  43425. #else
  43426. "lsl r6, r6, #16\n\t"
  43427. #endif
  43428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43429. "adds r4, r4, r6\n\t"
  43430. #else
  43431. "add r4, r4, r6\n\t"
  43432. #endif
  43433. #ifdef WOLFSSL_KEIL
  43434. "adcs r5, r5, r7\n\t"
  43435. #elif defined(__clang__)
  43436. "adcs r5, r7\n\t"
  43437. #else
  43438. "adc r5, r7\n\t"
  43439. #endif
  43440. #ifdef WOLFSSL_KEIL
  43441. "adcs r3, r3, %[r]\n\t"
  43442. #elif defined(__clang__)
  43443. "adcs r3, %[r]\n\t"
  43444. #else
  43445. "adc r3, %[r]\n\t"
  43446. #endif
  43447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43448. "lsrs r6, %[a], #16\n\t"
  43449. #else
  43450. "lsr r6, %[a], #16\n\t"
  43451. #endif
  43452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43453. "lsrs r7, %[b], #16\n\t"
  43454. #else
  43455. "lsr r7, %[b], #16\n\t"
  43456. #endif
  43457. #ifdef WOLFSSL_KEIL
  43458. "muls r7, r6, r7\n\t"
  43459. #elif defined(__clang__)
  43460. "muls r7, r6\n\t"
  43461. #else
  43462. "mul r7, r6\n\t"
  43463. #endif
  43464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43465. "adds r5, r5, r7\n\t"
  43466. #else
  43467. "add r5, r5, r7\n\t"
  43468. #endif
  43469. #ifdef WOLFSSL_KEIL
  43470. "adcs r3, r3, %[r]\n\t"
  43471. #elif defined(__clang__)
  43472. "adcs r3, %[r]\n\t"
  43473. #else
  43474. "adc r3, %[r]\n\t"
  43475. #endif
  43476. "uxth r7, %[b]\n\t"
  43477. #ifdef WOLFSSL_KEIL
  43478. "muls r6, r7, r6\n\t"
  43479. #elif defined(__clang__)
  43480. "muls r6, r7\n\t"
  43481. #else
  43482. "mul r6, r7\n\t"
  43483. #endif
  43484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43485. "lsrs r7, r6, #16\n\t"
  43486. #else
  43487. "lsr r7, r6, #16\n\t"
  43488. #endif
  43489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43490. "lsls r6, r6, #16\n\t"
  43491. #else
  43492. "lsl r6, r6, #16\n\t"
  43493. #endif
  43494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43495. "adds r4, r4, r6\n\t"
  43496. #else
  43497. "add r4, r4, r6\n\t"
  43498. #endif
  43499. #ifdef WOLFSSL_KEIL
  43500. "adcs r5, r5, r7\n\t"
  43501. #elif defined(__clang__)
  43502. "adcs r5, r7\n\t"
  43503. #else
  43504. "adc r5, r7\n\t"
  43505. #endif
  43506. #ifdef WOLFSSL_KEIL
  43507. "adcs r3, r3, %[r]\n\t"
  43508. #elif defined(__clang__)
  43509. "adcs r3, %[r]\n\t"
  43510. #else
  43511. "adc r3, %[r]\n\t"
  43512. #endif
  43513. "# A[7] * B[6]\n\t"
  43514. "mov %[a], r9\n\t"
  43515. "mov %[b], r10\n\t"
  43516. "ldr %[a], [%[a], #28]\n\t"
  43517. "ldr %[b], [%[b], #24]\n\t"
  43518. "uxth r6, %[a]\n\t"
  43519. "uxth r7, %[b]\n\t"
  43520. #ifdef WOLFSSL_KEIL
  43521. "muls r7, r6, r7\n\t"
  43522. #elif defined(__clang__)
  43523. "muls r7, r6\n\t"
  43524. #else
  43525. "mul r7, r6\n\t"
  43526. #endif
  43527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43528. "adds r4, r4, r7\n\t"
  43529. #else
  43530. "add r4, r4, r7\n\t"
  43531. #endif
  43532. #ifdef WOLFSSL_KEIL
  43533. "adcs r5, r5, %[r]\n\t"
  43534. #elif defined(__clang__)
  43535. "adcs r5, %[r]\n\t"
  43536. #else
  43537. "adc r5, %[r]\n\t"
  43538. #endif
  43539. #ifdef WOLFSSL_KEIL
  43540. "adcs r3, r3, %[r]\n\t"
  43541. #elif defined(__clang__)
  43542. "adcs r3, %[r]\n\t"
  43543. #else
  43544. "adc r3, %[r]\n\t"
  43545. #endif
  43546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43547. "lsrs r7, %[b], #16\n\t"
  43548. #else
  43549. "lsr r7, %[b], #16\n\t"
  43550. #endif
  43551. #ifdef WOLFSSL_KEIL
  43552. "muls r6, r7, r6\n\t"
  43553. #elif defined(__clang__)
  43554. "muls r6, r7\n\t"
  43555. #else
  43556. "mul r6, r7\n\t"
  43557. #endif
  43558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43559. "lsrs r7, r6, #16\n\t"
  43560. #else
  43561. "lsr r7, r6, #16\n\t"
  43562. #endif
  43563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43564. "lsls r6, r6, #16\n\t"
  43565. #else
  43566. "lsl r6, r6, #16\n\t"
  43567. #endif
  43568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43569. "adds r4, r4, r6\n\t"
  43570. #else
  43571. "add r4, r4, r6\n\t"
  43572. #endif
  43573. #ifdef WOLFSSL_KEIL
  43574. "adcs r5, r5, r7\n\t"
  43575. #elif defined(__clang__)
  43576. "adcs r5, r7\n\t"
  43577. #else
  43578. "adc r5, r7\n\t"
  43579. #endif
  43580. #ifdef WOLFSSL_KEIL
  43581. "adcs r3, r3, %[r]\n\t"
  43582. #elif defined(__clang__)
  43583. "adcs r3, %[r]\n\t"
  43584. #else
  43585. "adc r3, %[r]\n\t"
  43586. #endif
  43587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43588. "lsrs r6, %[a], #16\n\t"
  43589. #else
  43590. "lsr r6, %[a], #16\n\t"
  43591. #endif
  43592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43593. "lsrs r7, %[b], #16\n\t"
  43594. #else
  43595. "lsr r7, %[b], #16\n\t"
  43596. #endif
  43597. #ifdef WOLFSSL_KEIL
  43598. "muls r7, r6, r7\n\t"
  43599. #elif defined(__clang__)
  43600. "muls r7, r6\n\t"
  43601. #else
  43602. "mul r7, r6\n\t"
  43603. #endif
  43604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43605. "adds r5, r5, r7\n\t"
  43606. #else
  43607. "add r5, r5, r7\n\t"
  43608. #endif
  43609. #ifdef WOLFSSL_KEIL
  43610. "adcs r3, r3, %[r]\n\t"
  43611. #elif defined(__clang__)
  43612. "adcs r3, %[r]\n\t"
  43613. #else
  43614. "adc r3, %[r]\n\t"
  43615. #endif
  43616. "uxth r7, %[b]\n\t"
  43617. #ifdef WOLFSSL_KEIL
  43618. "muls r6, r7, r6\n\t"
  43619. #elif defined(__clang__)
  43620. "muls r6, r7\n\t"
  43621. #else
  43622. "mul r6, r7\n\t"
  43623. #endif
  43624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43625. "lsrs r7, r6, #16\n\t"
  43626. #else
  43627. "lsr r7, r6, #16\n\t"
  43628. #endif
  43629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43630. "lsls r6, r6, #16\n\t"
  43631. #else
  43632. "lsl r6, r6, #16\n\t"
  43633. #endif
  43634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43635. "adds r4, r4, r6\n\t"
  43636. #else
  43637. "add r4, r4, r6\n\t"
  43638. #endif
  43639. #ifdef WOLFSSL_KEIL
  43640. "adcs r5, r5, r7\n\t"
  43641. #elif defined(__clang__)
  43642. "adcs r5, r7\n\t"
  43643. #else
  43644. "adc r5, r7\n\t"
  43645. #endif
  43646. #ifdef WOLFSSL_KEIL
  43647. "adcs r3, r3, %[r]\n\t"
  43648. #elif defined(__clang__)
  43649. "adcs r3, %[r]\n\t"
  43650. #else
  43651. "adc r3, %[r]\n\t"
  43652. #endif
  43653. "# A[8] * B[5]\n\t"
  43654. "mov %[a], r9\n\t"
  43655. "mov %[b], r10\n\t"
  43656. "ldr %[a], [%[a], #32]\n\t"
  43657. "ldr %[b], [%[b], #20]\n\t"
  43658. "uxth r6, %[a]\n\t"
  43659. "uxth r7, %[b]\n\t"
  43660. #ifdef WOLFSSL_KEIL
  43661. "muls r7, r6, r7\n\t"
  43662. #elif defined(__clang__)
  43663. "muls r7, r6\n\t"
  43664. #else
  43665. "mul r7, r6\n\t"
  43666. #endif
  43667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43668. "adds r4, r4, r7\n\t"
  43669. #else
  43670. "add r4, r4, r7\n\t"
  43671. #endif
  43672. #ifdef WOLFSSL_KEIL
  43673. "adcs r5, r5, %[r]\n\t"
  43674. #elif defined(__clang__)
  43675. "adcs r5, %[r]\n\t"
  43676. #else
  43677. "adc r5, %[r]\n\t"
  43678. #endif
  43679. #ifdef WOLFSSL_KEIL
  43680. "adcs r3, r3, %[r]\n\t"
  43681. #elif defined(__clang__)
  43682. "adcs r3, %[r]\n\t"
  43683. #else
  43684. "adc r3, %[r]\n\t"
  43685. #endif
  43686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43687. "lsrs r7, %[b], #16\n\t"
  43688. #else
  43689. "lsr r7, %[b], #16\n\t"
  43690. #endif
  43691. #ifdef WOLFSSL_KEIL
  43692. "muls r6, r7, r6\n\t"
  43693. #elif defined(__clang__)
  43694. "muls r6, r7\n\t"
  43695. #else
  43696. "mul r6, r7\n\t"
  43697. #endif
  43698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43699. "lsrs r7, r6, #16\n\t"
  43700. #else
  43701. "lsr r7, r6, #16\n\t"
  43702. #endif
  43703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43704. "lsls r6, r6, #16\n\t"
  43705. #else
  43706. "lsl r6, r6, #16\n\t"
  43707. #endif
  43708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43709. "adds r4, r4, r6\n\t"
  43710. #else
  43711. "add r4, r4, r6\n\t"
  43712. #endif
  43713. #ifdef WOLFSSL_KEIL
  43714. "adcs r5, r5, r7\n\t"
  43715. #elif defined(__clang__)
  43716. "adcs r5, r7\n\t"
  43717. #else
  43718. "adc r5, r7\n\t"
  43719. #endif
  43720. #ifdef WOLFSSL_KEIL
  43721. "adcs r3, r3, %[r]\n\t"
  43722. #elif defined(__clang__)
  43723. "adcs r3, %[r]\n\t"
  43724. #else
  43725. "adc r3, %[r]\n\t"
  43726. #endif
  43727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43728. "lsrs r6, %[a], #16\n\t"
  43729. #else
  43730. "lsr r6, %[a], #16\n\t"
  43731. #endif
  43732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43733. "lsrs r7, %[b], #16\n\t"
  43734. #else
  43735. "lsr r7, %[b], #16\n\t"
  43736. #endif
  43737. #ifdef WOLFSSL_KEIL
  43738. "muls r7, r6, r7\n\t"
  43739. #elif defined(__clang__)
  43740. "muls r7, r6\n\t"
  43741. #else
  43742. "mul r7, r6\n\t"
  43743. #endif
  43744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43745. "adds r5, r5, r7\n\t"
  43746. #else
  43747. "add r5, r5, r7\n\t"
  43748. #endif
  43749. #ifdef WOLFSSL_KEIL
  43750. "adcs r3, r3, %[r]\n\t"
  43751. #elif defined(__clang__)
  43752. "adcs r3, %[r]\n\t"
  43753. #else
  43754. "adc r3, %[r]\n\t"
  43755. #endif
  43756. "uxth r7, %[b]\n\t"
  43757. #ifdef WOLFSSL_KEIL
  43758. "muls r6, r7, r6\n\t"
  43759. #elif defined(__clang__)
  43760. "muls r6, r7\n\t"
  43761. #else
  43762. "mul r6, r7\n\t"
  43763. #endif
  43764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43765. "lsrs r7, r6, #16\n\t"
  43766. #else
  43767. "lsr r7, r6, #16\n\t"
  43768. #endif
  43769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43770. "lsls r6, r6, #16\n\t"
  43771. #else
  43772. "lsl r6, r6, #16\n\t"
  43773. #endif
  43774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43775. "adds r4, r4, r6\n\t"
  43776. #else
  43777. "add r4, r4, r6\n\t"
  43778. #endif
  43779. #ifdef WOLFSSL_KEIL
  43780. "adcs r5, r5, r7\n\t"
  43781. #elif defined(__clang__)
  43782. "adcs r5, r7\n\t"
  43783. #else
  43784. "adc r5, r7\n\t"
  43785. #endif
  43786. #ifdef WOLFSSL_KEIL
  43787. "adcs r3, r3, %[r]\n\t"
  43788. #elif defined(__clang__)
  43789. "adcs r3, %[r]\n\t"
  43790. #else
  43791. "adc r3, %[r]\n\t"
  43792. #endif
  43793. "# A[9] * B[4]\n\t"
  43794. "mov %[a], r9\n\t"
  43795. "mov %[b], r10\n\t"
  43796. "ldr %[a], [%[a], #36]\n\t"
  43797. "ldr %[b], [%[b], #16]\n\t"
  43798. "uxth r6, %[a]\n\t"
  43799. "uxth r7, %[b]\n\t"
  43800. #ifdef WOLFSSL_KEIL
  43801. "muls r7, r6, r7\n\t"
  43802. #elif defined(__clang__)
  43803. "muls r7, r6\n\t"
  43804. #else
  43805. "mul r7, r6\n\t"
  43806. #endif
  43807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43808. "adds r4, r4, r7\n\t"
  43809. #else
  43810. "add r4, r4, r7\n\t"
  43811. #endif
  43812. #ifdef WOLFSSL_KEIL
  43813. "adcs r5, r5, %[r]\n\t"
  43814. #elif defined(__clang__)
  43815. "adcs r5, %[r]\n\t"
  43816. #else
  43817. "adc r5, %[r]\n\t"
  43818. #endif
  43819. #ifdef WOLFSSL_KEIL
  43820. "adcs r3, r3, %[r]\n\t"
  43821. #elif defined(__clang__)
  43822. "adcs r3, %[r]\n\t"
  43823. #else
  43824. "adc r3, %[r]\n\t"
  43825. #endif
  43826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43827. "lsrs r7, %[b], #16\n\t"
  43828. #else
  43829. "lsr r7, %[b], #16\n\t"
  43830. #endif
  43831. #ifdef WOLFSSL_KEIL
  43832. "muls r6, r7, r6\n\t"
  43833. #elif defined(__clang__)
  43834. "muls r6, r7\n\t"
  43835. #else
  43836. "mul r6, r7\n\t"
  43837. #endif
  43838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43839. "lsrs r7, r6, #16\n\t"
  43840. #else
  43841. "lsr r7, r6, #16\n\t"
  43842. #endif
  43843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43844. "lsls r6, r6, #16\n\t"
  43845. #else
  43846. "lsl r6, r6, #16\n\t"
  43847. #endif
  43848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43849. "adds r4, r4, r6\n\t"
  43850. #else
  43851. "add r4, r4, r6\n\t"
  43852. #endif
  43853. #ifdef WOLFSSL_KEIL
  43854. "adcs r5, r5, r7\n\t"
  43855. #elif defined(__clang__)
  43856. "adcs r5, r7\n\t"
  43857. #else
  43858. "adc r5, r7\n\t"
  43859. #endif
  43860. #ifdef WOLFSSL_KEIL
  43861. "adcs r3, r3, %[r]\n\t"
  43862. #elif defined(__clang__)
  43863. "adcs r3, %[r]\n\t"
  43864. #else
  43865. "adc r3, %[r]\n\t"
  43866. #endif
  43867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43868. "lsrs r6, %[a], #16\n\t"
  43869. #else
  43870. "lsr r6, %[a], #16\n\t"
  43871. #endif
  43872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43873. "lsrs r7, %[b], #16\n\t"
  43874. #else
  43875. "lsr r7, %[b], #16\n\t"
  43876. #endif
  43877. #ifdef WOLFSSL_KEIL
  43878. "muls r7, r6, r7\n\t"
  43879. #elif defined(__clang__)
  43880. "muls r7, r6\n\t"
  43881. #else
  43882. "mul r7, r6\n\t"
  43883. #endif
  43884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43885. "adds r5, r5, r7\n\t"
  43886. #else
  43887. "add r5, r5, r7\n\t"
  43888. #endif
  43889. #ifdef WOLFSSL_KEIL
  43890. "adcs r3, r3, %[r]\n\t"
  43891. #elif defined(__clang__)
  43892. "adcs r3, %[r]\n\t"
  43893. #else
  43894. "adc r3, %[r]\n\t"
  43895. #endif
  43896. "uxth r7, %[b]\n\t"
  43897. #ifdef WOLFSSL_KEIL
  43898. "muls r6, r7, r6\n\t"
  43899. #elif defined(__clang__)
  43900. "muls r6, r7\n\t"
  43901. #else
  43902. "mul r6, r7\n\t"
  43903. #endif
  43904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43905. "lsrs r7, r6, #16\n\t"
  43906. #else
  43907. "lsr r7, r6, #16\n\t"
  43908. #endif
  43909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43910. "lsls r6, r6, #16\n\t"
  43911. #else
  43912. "lsl r6, r6, #16\n\t"
  43913. #endif
  43914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43915. "adds r4, r4, r6\n\t"
  43916. #else
  43917. "add r4, r4, r6\n\t"
  43918. #endif
  43919. #ifdef WOLFSSL_KEIL
  43920. "adcs r5, r5, r7\n\t"
  43921. #elif defined(__clang__)
  43922. "adcs r5, r7\n\t"
  43923. #else
  43924. "adc r5, r7\n\t"
  43925. #endif
  43926. #ifdef WOLFSSL_KEIL
  43927. "adcs r3, r3, %[r]\n\t"
  43928. #elif defined(__clang__)
  43929. "adcs r3, %[r]\n\t"
  43930. #else
  43931. "adc r3, %[r]\n\t"
  43932. #endif
  43933. "# A[10] * B[3]\n\t"
  43934. "mov %[a], r9\n\t"
  43935. "mov %[b], r10\n\t"
  43936. "ldr %[a], [%[a], #40]\n\t"
  43937. "ldr %[b], [%[b], #12]\n\t"
  43938. "uxth r6, %[a]\n\t"
  43939. "uxth r7, %[b]\n\t"
  43940. #ifdef WOLFSSL_KEIL
  43941. "muls r7, r6, r7\n\t"
  43942. #elif defined(__clang__)
  43943. "muls r7, r6\n\t"
  43944. #else
  43945. "mul r7, r6\n\t"
  43946. #endif
  43947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43948. "adds r4, r4, r7\n\t"
  43949. #else
  43950. "add r4, r4, r7\n\t"
  43951. #endif
  43952. #ifdef WOLFSSL_KEIL
  43953. "adcs r5, r5, %[r]\n\t"
  43954. #elif defined(__clang__)
  43955. "adcs r5, %[r]\n\t"
  43956. #else
  43957. "adc r5, %[r]\n\t"
  43958. #endif
  43959. #ifdef WOLFSSL_KEIL
  43960. "adcs r3, r3, %[r]\n\t"
  43961. #elif defined(__clang__)
  43962. "adcs r3, %[r]\n\t"
  43963. #else
  43964. "adc r3, %[r]\n\t"
  43965. #endif
  43966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43967. "lsrs r7, %[b], #16\n\t"
  43968. #else
  43969. "lsr r7, %[b], #16\n\t"
  43970. #endif
  43971. #ifdef WOLFSSL_KEIL
  43972. "muls r6, r7, r6\n\t"
  43973. #elif defined(__clang__)
  43974. "muls r6, r7\n\t"
  43975. #else
  43976. "mul r6, r7\n\t"
  43977. #endif
  43978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43979. "lsrs r7, r6, #16\n\t"
  43980. #else
  43981. "lsr r7, r6, #16\n\t"
  43982. #endif
  43983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43984. "lsls r6, r6, #16\n\t"
  43985. #else
  43986. "lsl r6, r6, #16\n\t"
  43987. #endif
  43988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  43989. "adds r4, r4, r6\n\t"
  43990. #else
  43991. "add r4, r4, r6\n\t"
  43992. #endif
  43993. #ifdef WOLFSSL_KEIL
  43994. "adcs r5, r5, r7\n\t"
  43995. #elif defined(__clang__)
  43996. "adcs r5, r7\n\t"
  43997. #else
  43998. "adc r5, r7\n\t"
  43999. #endif
  44000. #ifdef WOLFSSL_KEIL
  44001. "adcs r3, r3, %[r]\n\t"
  44002. #elif defined(__clang__)
  44003. "adcs r3, %[r]\n\t"
  44004. #else
  44005. "adc r3, %[r]\n\t"
  44006. #endif
  44007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44008. "lsrs r6, %[a], #16\n\t"
  44009. #else
  44010. "lsr r6, %[a], #16\n\t"
  44011. #endif
  44012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44013. "lsrs r7, %[b], #16\n\t"
  44014. #else
  44015. "lsr r7, %[b], #16\n\t"
  44016. #endif
  44017. #ifdef WOLFSSL_KEIL
  44018. "muls r7, r6, r7\n\t"
  44019. #elif defined(__clang__)
  44020. "muls r7, r6\n\t"
  44021. #else
  44022. "mul r7, r6\n\t"
  44023. #endif
  44024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44025. "adds r5, r5, r7\n\t"
  44026. #else
  44027. "add r5, r5, r7\n\t"
  44028. #endif
  44029. #ifdef WOLFSSL_KEIL
  44030. "adcs r3, r3, %[r]\n\t"
  44031. #elif defined(__clang__)
  44032. "adcs r3, %[r]\n\t"
  44033. #else
  44034. "adc r3, %[r]\n\t"
  44035. #endif
  44036. "uxth r7, %[b]\n\t"
  44037. #ifdef WOLFSSL_KEIL
  44038. "muls r6, r7, r6\n\t"
  44039. #elif defined(__clang__)
  44040. "muls r6, r7\n\t"
  44041. #else
  44042. "mul r6, r7\n\t"
  44043. #endif
  44044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44045. "lsrs r7, r6, #16\n\t"
  44046. #else
  44047. "lsr r7, r6, #16\n\t"
  44048. #endif
  44049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44050. "lsls r6, r6, #16\n\t"
  44051. #else
  44052. "lsl r6, r6, #16\n\t"
  44053. #endif
  44054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44055. "adds r4, r4, r6\n\t"
  44056. #else
  44057. "add r4, r4, r6\n\t"
  44058. #endif
  44059. #ifdef WOLFSSL_KEIL
  44060. "adcs r5, r5, r7\n\t"
  44061. #elif defined(__clang__)
  44062. "adcs r5, r7\n\t"
  44063. #else
  44064. "adc r5, r7\n\t"
  44065. #endif
  44066. #ifdef WOLFSSL_KEIL
  44067. "adcs r3, r3, %[r]\n\t"
  44068. #elif defined(__clang__)
  44069. "adcs r3, %[r]\n\t"
  44070. #else
  44071. "adc r3, %[r]\n\t"
  44072. #endif
  44073. "# A[11] * B[2]\n\t"
  44074. "mov %[a], r9\n\t"
  44075. "mov %[b], r10\n\t"
  44076. "ldr %[a], [%[a], #44]\n\t"
  44077. "ldr %[b], [%[b], #8]\n\t"
  44078. "uxth r6, %[a]\n\t"
  44079. "uxth r7, %[b]\n\t"
  44080. #ifdef WOLFSSL_KEIL
  44081. "muls r7, r6, r7\n\t"
  44082. #elif defined(__clang__)
  44083. "muls r7, r6\n\t"
  44084. #else
  44085. "mul r7, r6\n\t"
  44086. #endif
  44087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44088. "adds r4, r4, r7\n\t"
  44089. #else
  44090. "add r4, r4, r7\n\t"
  44091. #endif
  44092. #ifdef WOLFSSL_KEIL
  44093. "adcs r5, r5, %[r]\n\t"
  44094. #elif defined(__clang__)
  44095. "adcs r5, %[r]\n\t"
  44096. #else
  44097. "adc r5, %[r]\n\t"
  44098. #endif
  44099. #ifdef WOLFSSL_KEIL
  44100. "adcs r3, r3, %[r]\n\t"
  44101. #elif defined(__clang__)
  44102. "adcs r3, %[r]\n\t"
  44103. #else
  44104. "adc r3, %[r]\n\t"
  44105. #endif
  44106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44107. "lsrs r7, %[b], #16\n\t"
  44108. #else
  44109. "lsr r7, %[b], #16\n\t"
  44110. #endif
  44111. #ifdef WOLFSSL_KEIL
  44112. "muls r6, r7, r6\n\t"
  44113. #elif defined(__clang__)
  44114. "muls r6, r7\n\t"
  44115. #else
  44116. "mul r6, r7\n\t"
  44117. #endif
  44118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44119. "lsrs r7, r6, #16\n\t"
  44120. #else
  44121. "lsr r7, r6, #16\n\t"
  44122. #endif
  44123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44124. "lsls r6, r6, #16\n\t"
  44125. #else
  44126. "lsl r6, r6, #16\n\t"
  44127. #endif
  44128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44129. "adds r4, r4, r6\n\t"
  44130. #else
  44131. "add r4, r4, r6\n\t"
  44132. #endif
  44133. #ifdef WOLFSSL_KEIL
  44134. "adcs r5, r5, r7\n\t"
  44135. #elif defined(__clang__)
  44136. "adcs r5, r7\n\t"
  44137. #else
  44138. "adc r5, r7\n\t"
  44139. #endif
  44140. #ifdef WOLFSSL_KEIL
  44141. "adcs r3, r3, %[r]\n\t"
  44142. #elif defined(__clang__)
  44143. "adcs r3, %[r]\n\t"
  44144. #else
  44145. "adc r3, %[r]\n\t"
  44146. #endif
  44147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44148. "lsrs r6, %[a], #16\n\t"
  44149. #else
  44150. "lsr r6, %[a], #16\n\t"
  44151. #endif
  44152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44153. "lsrs r7, %[b], #16\n\t"
  44154. #else
  44155. "lsr r7, %[b], #16\n\t"
  44156. #endif
  44157. #ifdef WOLFSSL_KEIL
  44158. "muls r7, r6, r7\n\t"
  44159. #elif defined(__clang__)
  44160. "muls r7, r6\n\t"
  44161. #else
  44162. "mul r7, r6\n\t"
  44163. #endif
  44164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44165. "adds r5, r5, r7\n\t"
  44166. #else
  44167. "add r5, r5, r7\n\t"
  44168. #endif
  44169. #ifdef WOLFSSL_KEIL
  44170. "adcs r3, r3, %[r]\n\t"
  44171. #elif defined(__clang__)
  44172. "adcs r3, %[r]\n\t"
  44173. #else
  44174. "adc r3, %[r]\n\t"
  44175. #endif
  44176. "uxth r7, %[b]\n\t"
  44177. #ifdef WOLFSSL_KEIL
  44178. "muls r6, r7, r6\n\t"
  44179. #elif defined(__clang__)
  44180. "muls r6, r7\n\t"
  44181. #else
  44182. "mul r6, r7\n\t"
  44183. #endif
  44184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44185. "lsrs r7, r6, #16\n\t"
  44186. #else
  44187. "lsr r7, r6, #16\n\t"
  44188. #endif
  44189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44190. "lsls r6, r6, #16\n\t"
  44191. #else
  44192. "lsl r6, r6, #16\n\t"
  44193. #endif
  44194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44195. "adds r4, r4, r6\n\t"
  44196. #else
  44197. "add r4, r4, r6\n\t"
  44198. #endif
  44199. #ifdef WOLFSSL_KEIL
  44200. "adcs r5, r5, r7\n\t"
  44201. #elif defined(__clang__)
  44202. "adcs r5, r7\n\t"
  44203. #else
  44204. "adc r5, r7\n\t"
  44205. #endif
  44206. #ifdef WOLFSSL_KEIL
  44207. "adcs r3, r3, %[r]\n\t"
  44208. #elif defined(__clang__)
  44209. "adcs r3, %[r]\n\t"
  44210. #else
  44211. "adc r3, %[r]\n\t"
  44212. #endif
  44213. "mov %[r], r8\n\t"
  44214. "str r4, [%[r], #52]\n\t"
  44215. "movs %[r], #0\n\t"
  44216. "# A[11] * B[3]\n\t"
  44217. "movs r4, #0\n\t"
  44218. "mov %[a], r9\n\t"
  44219. "mov %[b], r10\n\t"
  44220. "ldr %[a], [%[a], #44]\n\t"
  44221. "ldr %[b], [%[b], #12]\n\t"
  44222. "uxth r6, %[a]\n\t"
  44223. "uxth r7, %[b]\n\t"
  44224. #ifdef WOLFSSL_KEIL
  44225. "muls r7, r6, r7\n\t"
  44226. #elif defined(__clang__)
  44227. "muls r7, r6\n\t"
  44228. #else
  44229. "mul r7, r6\n\t"
  44230. #endif
  44231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44232. "adds r5, r5, r7\n\t"
  44233. #else
  44234. "add r5, r5, r7\n\t"
  44235. #endif
  44236. #ifdef WOLFSSL_KEIL
  44237. "adcs r3, r3, %[r]\n\t"
  44238. #elif defined(__clang__)
  44239. "adcs r3, %[r]\n\t"
  44240. #else
  44241. "adc r3, %[r]\n\t"
  44242. #endif
  44243. #ifdef WOLFSSL_KEIL
  44244. "adcs r4, r4, %[r]\n\t"
  44245. #elif defined(__clang__)
  44246. "adcs r4, %[r]\n\t"
  44247. #else
  44248. "adc r4, %[r]\n\t"
  44249. #endif
  44250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44251. "lsrs r7, %[b], #16\n\t"
  44252. #else
  44253. "lsr r7, %[b], #16\n\t"
  44254. #endif
  44255. #ifdef WOLFSSL_KEIL
  44256. "muls r6, r7, r6\n\t"
  44257. #elif defined(__clang__)
  44258. "muls r6, r7\n\t"
  44259. #else
  44260. "mul r6, r7\n\t"
  44261. #endif
  44262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44263. "lsrs r7, r6, #16\n\t"
  44264. #else
  44265. "lsr r7, r6, #16\n\t"
  44266. #endif
  44267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44268. "lsls r6, r6, #16\n\t"
  44269. #else
  44270. "lsl r6, r6, #16\n\t"
  44271. #endif
  44272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44273. "adds r5, r5, r6\n\t"
  44274. #else
  44275. "add r5, r5, r6\n\t"
  44276. #endif
  44277. #ifdef WOLFSSL_KEIL
  44278. "adcs r3, r3, r7\n\t"
  44279. #elif defined(__clang__)
  44280. "adcs r3, r7\n\t"
  44281. #else
  44282. "adc r3, r7\n\t"
  44283. #endif
  44284. #ifdef WOLFSSL_KEIL
  44285. "adcs r4, r4, %[r]\n\t"
  44286. #elif defined(__clang__)
  44287. "adcs r4, %[r]\n\t"
  44288. #else
  44289. "adc r4, %[r]\n\t"
  44290. #endif
  44291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44292. "lsrs r6, %[a], #16\n\t"
  44293. #else
  44294. "lsr r6, %[a], #16\n\t"
  44295. #endif
  44296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44297. "lsrs r7, %[b], #16\n\t"
  44298. #else
  44299. "lsr r7, %[b], #16\n\t"
  44300. #endif
  44301. #ifdef WOLFSSL_KEIL
  44302. "muls r7, r6, r7\n\t"
  44303. #elif defined(__clang__)
  44304. "muls r7, r6\n\t"
  44305. #else
  44306. "mul r7, r6\n\t"
  44307. #endif
  44308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44309. "adds r3, r3, r7\n\t"
  44310. #else
  44311. "add r3, r3, r7\n\t"
  44312. #endif
  44313. #ifdef WOLFSSL_KEIL
  44314. "adcs r4, r4, %[r]\n\t"
  44315. #elif defined(__clang__)
  44316. "adcs r4, %[r]\n\t"
  44317. #else
  44318. "adc r4, %[r]\n\t"
  44319. #endif
  44320. "uxth r7, %[b]\n\t"
  44321. #ifdef WOLFSSL_KEIL
  44322. "muls r6, r7, r6\n\t"
  44323. #elif defined(__clang__)
  44324. "muls r6, r7\n\t"
  44325. #else
  44326. "mul r6, r7\n\t"
  44327. #endif
  44328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44329. "lsrs r7, r6, #16\n\t"
  44330. #else
  44331. "lsr r7, r6, #16\n\t"
  44332. #endif
  44333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44334. "lsls r6, r6, #16\n\t"
  44335. #else
  44336. "lsl r6, r6, #16\n\t"
  44337. #endif
  44338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44339. "adds r5, r5, r6\n\t"
  44340. #else
  44341. "add r5, r5, r6\n\t"
  44342. #endif
  44343. #ifdef WOLFSSL_KEIL
  44344. "adcs r3, r3, r7\n\t"
  44345. #elif defined(__clang__)
  44346. "adcs r3, r7\n\t"
  44347. #else
  44348. "adc r3, r7\n\t"
  44349. #endif
  44350. #ifdef WOLFSSL_KEIL
  44351. "adcs r4, r4, %[r]\n\t"
  44352. #elif defined(__clang__)
  44353. "adcs r4, %[r]\n\t"
  44354. #else
  44355. "adc r4, %[r]\n\t"
  44356. #endif
  44357. "# A[10] * B[4]\n\t"
  44358. "mov %[a], r9\n\t"
  44359. "mov %[b], r10\n\t"
  44360. "ldr %[a], [%[a], #40]\n\t"
  44361. "ldr %[b], [%[b], #16]\n\t"
  44362. "uxth r6, %[a]\n\t"
  44363. "uxth r7, %[b]\n\t"
  44364. #ifdef WOLFSSL_KEIL
  44365. "muls r7, r6, r7\n\t"
  44366. #elif defined(__clang__)
  44367. "muls r7, r6\n\t"
  44368. #else
  44369. "mul r7, r6\n\t"
  44370. #endif
  44371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44372. "adds r5, r5, r7\n\t"
  44373. #else
  44374. "add r5, r5, r7\n\t"
  44375. #endif
  44376. #ifdef WOLFSSL_KEIL
  44377. "adcs r3, r3, %[r]\n\t"
  44378. #elif defined(__clang__)
  44379. "adcs r3, %[r]\n\t"
  44380. #else
  44381. "adc r3, %[r]\n\t"
  44382. #endif
  44383. #ifdef WOLFSSL_KEIL
  44384. "adcs r4, r4, %[r]\n\t"
  44385. #elif defined(__clang__)
  44386. "adcs r4, %[r]\n\t"
  44387. #else
  44388. "adc r4, %[r]\n\t"
  44389. #endif
  44390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44391. "lsrs r7, %[b], #16\n\t"
  44392. #else
  44393. "lsr r7, %[b], #16\n\t"
  44394. #endif
  44395. #ifdef WOLFSSL_KEIL
  44396. "muls r6, r7, r6\n\t"
  44397. #elif defined(__clang__)
  44398. "muls r6, r7\n\t"
  44399. #else
  44400. "mul r6, r7\n\t"
  44401. #endif
  44402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44403. "lsrs r7, r6, #16\n\t"
  44404. #else
  44405. "lsr r7, r6, #16\n\t"
  44406. #endif
  44407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44408. "lsls r6, r6, #16\n\t"
  44409. #else
  44410. "lsl r6, r6, #16\n\t"
  44411. #endif
  44412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44413. "adds r5, r5, r6\n\t"
  44414. #else
  44415. "add r5, r5, r6\n\t"
  44416. #endif
  44417. #ifdef WOLFSSL_KEIL
  44418. "adcs r3, r3, r7\n\t"
  44419. #elif defined(__clang__)
  44420. "adcs r3, r7\n\t"
  44421. #else
  44422. "adc r3, r7\n\t"
  44423. #endif
  44424. #ifdef WOLFSSL_KEIL
  44425. "adcs r4, r4, %[r]\n\t"
  44426. #elif defined(__clang__)
  44427. "adcs r4, %[r]\n\t"
  44428. #else
  44429. "adc r4, %[r]\n\t"
  44430. #endif
  44431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44432. "lsrs r6, %[a], #16\n\t"
  44433. #else
  44434. "lsr r6, %[a], #16\n\t"
  44435. #endif
  44436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44437. "lsrs r7, %[b], #16\n\t"
  44438. #else
  44439. "lsr r7, %[b], #16\n\t"
  44440. #endif
  44441. #ifdef WOLFSSL_KEIL
  44442. "muls r7, r6, r7\n\t"
  44443. #elif defined(__clang__)
  44444. "muls r7, r6\n\t"
  44445. #else
  44446. "mul r7, r6\n\t"
  44447. #endif
  44448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44449. "adds r3, r3, r7\n\t"
  44450. #else
  44451. "add r3, r3, r7\n\t"
  44452. #endif
  44453. #ifdef WOLFSSL_KEIL
  44454. "adcs r4, r4, %[r]\n\t"
  44455. #elif defined(__clang__)
  44456. "adcs r4, %[r]\n\t"
  44457. #else
  44458. "adc r4, %[r]\n\t"
  44459. #endif
  44460. "uxth r7, %[b]\n\t"
  44461. #ifdef WOLFSSL_KEIL
  44462. "muls r6, r7, r6\n\t"
  44463. #elif defined(__clang__)
  44464. "muls r6, r7\n\t"
  44465. #else
  44466. "mul r6, r7\n\t"
  44467. #endif
  44468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44469. "lsrs r7, r6, #16\n\t"
  44470. #else
  44471. "lsr r7, r6, #16\n\t"
  44472. #endif
  44473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44474. "lsls r6, r6, #16\n\t"
  44475. #else
  44476. "lsl r6, r6, #16\n\t"
  44477. #endif
  44478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44479. "adds r5, r5, r6\n\t"
  44480. #else
  44481. "add r5, r5, r6\n\t"
  44482. #endif
  44483. #ifdef WOLFSSL_KEIL
  44484. "adcs r3, r3, r7\n\t"
  44485. #elif defined(__clang__)
  44486. "adcs r3, r7\n\t"
  44487. #else
  44488. "adc r3, r7\n\t"
  44489. #endif
  44490. #ifdef WOLFSSL_KEIL
  44491. "adcs r4, r4, %[r]\n\t"
  44492. #elif defined(__clang__)
  44493. "adcs r4, %[r]\n\t"
  44494. #else
  44495. "adc r4, %[r]\n\t"
  44496. #endif
  44497. "# A[9] * B[5]\n\t"
  44498. "mov %[a], r9\n\t"
  44499. "mov %[b], r10\n\t"
  44500. "ldr %[a], [%[a], #36]\n\t"
  44501. "ldr %[b], [%[b], #20]\n\t"
  44502. "uxth r6, %[a]\n\t"
  44503. "uxth r7, %[b]\n\t"
  44504. #ifdef WOLFSSL_KEIL
  44505. "muls r7, r6, r7\n\t"
  44506. #elif defined(__clang__)
  44507. "muls r7, r6\n\t"
  44508. #else
  44509. "mul r7, r6\n\t"
  44510. #endif
  44511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44512. "adds r5, r5, r7\n\t"
  44513. #else
  44514. "add r5, r5, r7\n\t"
  44515. #endif
  44516. #ifdef WOLFSSL_KEIL
  44517. "adcs r3, r3, %[r]\n\t"
  44518. #elif defined(__clang__)
  44519. "adcs r3, %[r]\n\t"
  44520. #else
  44521. "adc r3, %[r]\n\t"
  44522. #endif
  44523. #ifdef WOLFSSL_KEIL
  44524. "adcs r4, r4, %[r]\n\t"
  44525. #elif defined(__clang__)
  44526. "adcs r4, %[r]\n\t"
  44527. #else
  44528. "adc r4, %[r]\n\t"
  44529. #endif
  44530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44531. "lsrs r7, %[b], #16\n\t"
  44532. #else
  44533. "lsr r7, %[b], #16\n\t"
  44534. #endif
  44535. #ifdef WOLFSSL_KEIL
  44536. "muls r6, r7, r6\n\t"
  44537. #elif defined(__clang__)
  44538. "muls r6, r7\n\t"
  44539. #else
  44540. "mul r6, r7\n\t"
  44541. #endif
  44542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44543. "lsrs r7, r6, #16\n\t"
  44544. #else
  44545. "lsr r7, r6, #16\n\t"
  44546. #endif
  44547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44548. "lsls r6, r6, #16\n\t"
  44549. #else
  44550. "lsl r6, r6, #16\n\t"
  44551. #endif
  44552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44553. "adds r5, r5, r6\n\t"
  44554. #else
  44555. "add r5, r5, r6\n\t"
  44556. #endif
  44557. #ifdef WOLFSSL_KEIL
  44558. "adcs r3, r3, r7\n\t"
  44559. #elif defined(__clang__)
  44560. "adcs r3, r7\n\t"
  44561. #else
  44562. "adc r3, r7\n\t"
  44563. #endif
  44564. #ifdef WOLFSSL_KEIL
  44565. "adcs r4, r4, %[r]\n\t"
  44566. #elif defined(__clang__)
  44567. "adcs r4, %[r]\n\t"
  44568. #else
  44569. "adc r4, %[r]\n\t"
  44570. #endif
  44571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44572. "lsrs r6, %[a], #16\n\t"
  44573. #else
  44574. "lsr r6, %[a], #16\n\t"
  44575. #endif
  44576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44577. "lsrs r7, %[b], #16\n\t"
  44578. #else
  44579. "lsr r7, %[b], #16\n\t"
  44580. #endif
  44581. #ifdef WOLFSSL_KEIL
  44582. "muls r7, r6, r7\n\t"
  44583. #elif defined(__clang__)
  44584. "muls r7, r6\n\t"
  44585. #else
  44586. "mul r7, r6\n\t"
  44587. #endif
  44588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44589. "adds r3, r3, r7\n\t"
  44590. #else
  44591. "add r3, r3, r7\n\t"
  44592. #endif
  44593. #ifdef WOLFSSL_KEIL
  44594. "adcs r4, r4, %[r]\n\t"
  44595. #elif defined(__clang__)
  44596. "adcs r4, %[r]\n\t"
  44597. #else
  44598. "adc r4, %[r]\n\t"
  44599. #endif
  44600. "uxth r7, %[b]\n\t"
  44601. #ifdef WOLFSSL_KEIL
  44602. "muls r6, r7, r6\n\t"
  44603. #elif defined(__clang__)
  44604. "muls r6, r7\n\t"
  44605. #else
  44606. "mul r6, r7\n\t"
  44607. #endif
  44608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44609. "lsrs r7, r6, #16\n\t"
  44610. #else
  44611. "lsr r7, r6, #16\n\t"
  44612. #endif
  44613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44614. "lsls r6, r6, #16\n\t"
  44615. #else
  44616. "lsl r6, r6, #16\n\t"
  44617. #endif
  44618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44619. "adds r5, r5, r6\n\t"
  44620. #else
  44621. "add r5, r5, r6\n\t"
  44622. #endif
  44623. #ifdef WOLFSSL_KEIL
  44624. "adcs r3, r3, r7\n\t"
  44625. #elif defined(__clang__)
  44626. "adcs r3, r7\n\t"
  44627. #else
  44628. "adc r3, r7\n\t"
  44629. #endif
  44630. #ifdef WOLFSSL_KEIL
  44631. "adcs r4, r4, %[r]\n\t"
  44632. #elif defined(__clang__)
  44633. "adcs r4, %[r]\n\t"
  44634. #else
  44635. "adc r4, %[r]\n\t"
  44636. #endif
  44637. "# A[8] * B[6]\n\t"
  44638. "mov %[a], r9\n\t"
  44639. "mov %[b], r10\n\t"
  44640. "ldr %[a], [%[a], #32]\n\t"
  44641. "ldr %[b], [%[b], #24]\n\t"
  44642. "uxth r6, %[a]\n\t"
  44643. "uxth r7, %[b]\n\t"
  44644. #ifdef WOLFSSL_KEIL
  44645. "muls r7, r6, r7\n\t"
  44646. #elif defined(__clang__)
  44647. "muls r7, r6\n\t"
  44648. #else
  44649. "mul r7, r6\n\t"
  44650. #endif
  44651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44652. "adds r5, r5, r7\n\t"
  44653. #else
  44654. "add r5, r5, r7\n\t"
  44655. #endif
  44656. #ifdef WOLFSSL_KEIL
  44657. "adcs r3, r3, %[r]\n\t"
  44658. #elif defined(__clang__)
  44659. "adcs r3, %[r]\n\t"
  44660. #else
  44661. "adc r3, %[r]\n\t"
  44662. #endif
  44663. #ifdef WOLFSSL_KEIL
  44664. "adcs r4, r4, %[r]\n\t"
  44665. #elif defined(__clang__)
  44666. "adcs r4, %[r]\n\t"
  44667. #else
  44668. "adc r4, %[r]\n\t"
  44669. #endif
  44670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44671. "lsrs r7, %[b], #16\n\t"
  44672. #else
  44673. "lsr r7, %[b], #16\n\t"
  44674. #endif
  44675. #ifdef WOLFSSL_KEIL
  44676. "muls r6, r7, r6\n\t"
  44677. #elif defined(__clang__)
  44678. "muls r6, r7\n\t"
  44679. #else
  44680. "mul r6, r7\n\t"
  44681. #endif
  44682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44683. "lsrs r7, r6, #16\n\t"
  44684. #else
  44685. "lsr r7, r6, #16\n\t"
  44686. #endif
  44687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44688. "lsls r6, r6, #16\n\t"
  44689. #else
  44690. "lsl r6, r6, #16\n\t"
  44691. #endif
  44692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44693. "adds r5, r5, r6\n\t"
  44694. #else
  44695. "add r5, r5, r6\n\t"
  44696. #endif
  44697. #ifdef WOLFSSL_KEIL
  44698. "adcs r3, r3, r7\n\t"
  44699. #elif defined(__clang__)
  44700. "adcs r3, r7\n\t"
  44701. #else
  44702. "adc r3, r7\n\t"
  44703. #endif
  44704. #ifdef WOLFSSL_KEIL
  44705. "adcs r4, r4, %[r]\n\t"
  44706. #elif defined(__clang__)
  44707. "adcs r4, %[r]\n\t"
  44708. #else
  44709. "adc r4, %[r]\n\t"
  44710. #endif
  44711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44712. "lsrs r6, %[a], #16\n\t"
  44713. #else
  44714. "lsr r6, %[a], #16\n\t"
  44715. #endif
  44716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44717. "lsrs r7, %[b], #16\n\t"
  44718. #else
  44719. "lsr r7, %[b], #16\n\t"
  44720. #endif
  44721. #ifdef WOLFSSL_KEIL
  44722. "muls r7, r6, r7\n\t"
  44723. #elif defined(__clang__)
  44724. "muls r7, r6\n\t"
  44725. #else
  44726. "mul r7, r6\n\t"
  44727. #endif
  44728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44729. "adds r3, r3, r7\n\t"
  44730. #else
  44731. "add r3, r3, r7\n\t"
  44732. #endif
  44733. #ifdef WOLFSSL_KEIL
  44734. "adcs r4, r4, %[r]\n\t"
  44735. #elif defined(__clang__)
  44736. "adcs r4, %[r]\n\t"
  44737. #else
  44738. "adc r4, %[r]\n\t"
  44739. #endif
  44740. "uxth r7, %[b]\n\t"
  44741. #ifdef WOLFSSL_KEIL
  44742. "muls r6, r7, r6\n\t"
  44743. #elif defined(__clang__)
  44744. "muls r6, r7\n\t"
  44745. #else
  44746. "mul r6, r7\n\t"
  44747. #endif
  44748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44749. "lsrs r7, r6, #16\n\t"
  44750. #else
  44751. "lsr r7, r6, #16\n\t"
  44752. #endif
  44753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44754. "lsls r6, r6, #16\n\t"
  44755. #else
  44756. "lsl r6, r6, #16\n\t"
  44757. #endif
  44758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44759. "adds r5, r5, r6\n\t"
  44760. #else
  44761. "add r5, r5, r6\n\t"
  44762. #endif
  44763. #ifdef WOLFSSL_KEIL
  44764. "adcs r3, r3, r7\n\t"
  44765. #elif defined(__clang__)
  44766. "adcs r3, r7\n\t"
  44767. #else
  44768. "adc r3, r7\n\t"
  44769. #endif
  44770. #ifdef WOLFSSL_KEIL
  44771. "adcs r4, r4, %[r]\n\t"
  44772. #elif defined(__clang__)
  44773. "adcs r4, %[r]\n\t"
  44774. #else
  44775. "adc r4, %[r]\n\t"
  44776. #endif
  44777. "# A[7] * B[7]\n\t"
  44778. "mov %[a], r9\n\t"
  44779. "mov %[b], r10\n\t"
  44780. "ldr %[a], [%[a], #28]\n\t"
  44781. "ldr %[b], [%[b], #28]\n\t"
  44782. "uxth r6, %[a]\n\t"
  44783. "uxth r7, %[b]\n\t"
  44784. #ifdef WOLFSSL_KEIL
  44785. "muls r7, r6, r7\n\t"
  44786. #elif defined(__clang__)
  44787. "muls r7, r6\n\t"
  44788. #else
  44789. "mul r7, r6\n\t"
  44790. #endif
  44791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44792. "adds r5, r5, r7\n\t"
  44793. #else
  44794. "add r5, r5, r7\n\t"
  44795. #endif
  44796. #ifdef WOLFSSL_KEIL
  44797. "adcs r3, r3, %[r]\n\t"
  44798. #elif defined(__clang__)
  44799. "adcs r3, %[r]\n\t"
  44800. #else
  44801. "adc r3, %[r]\n\t"
  44802. #endif
  44803. #ifdef WOLFSSL_KEIL
  44804. "adcs r4, r4, %[r]\n\t"
  44805. #elif defined(__clang__)
  44806. "adcs r4, %[r]\n\t"
  44807. #else
  44808. "adc r4, %[r]\n\t"
  44809. #endif
  44810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44811. "lsrs r7, %[b], #16\n\t"
  44812. #else
  44813. "lsr r7, %[b], #16\n\t"
  44814. #endif
  44815. #ifdef WOLFSSL_KEIL
  44816. "muls r6, r7, r6\n\t"
  44817. #elif defined(__clang__)
  44818. "muls r6, r7\n\t"
  44819. #else
  44820. "mul r6, r7\n\t"
  44821. #endif
  44822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44823. "lsrs r7, r6, #16\n\t"
  44824. #else
  44825. "lsr r7, r6, #16\n\t"
  44826. #endif
  44827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44828. "lsls r6, r6, #16\n\t"
  44829. #else
  44830. "lsl r6, r6, #16\n\t"
  44831. #endif
  44832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44833. "adds r5, r5, r6\n\t"
  44834. #else
  44835. "add r5, r5, r6\n\t"
  44836. #endif
  44837. #ifdef WOLFSSL_KEIL
  44838. "adcs r3, r3, r7\n\t"
  44839. #elif defined(__clang__)
  44840. "adcs r3, r7\n\t"
  44841. #else
  44842. "adc r3, r7\n\t"
  44843. #endif
  44844. #ifdef WOLFSSL_KEIL
  44845. "adcs r4, r4, %[r]\n\t"
  44846. #elif defined(__clang__)
  44847. "adcs r4, %[r]\n\t"
  44848. #else
  44849. "adc r4, %[r]\n\t"
  44850. #endif
  44851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44852. "lsrs r6, %[a], #16\n\t"
  44853. #else
  44854. "lsr r6, %[a], #16\n\t"
  44855. #endif
  44856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44857. "lsrs r7, %[b], #16\n\t"
  44858. #else
  44859. "lsr r7, %[b], #16\n\t"
  44860. #endif
  44861. #ifdef WOLFSSL_KEIL
  44862. "muls r7, r6, r7\n\t"
  44863. #elif defined(__clang__)
  44864. "muls r7, r6\n\t"
  44865. #else
  44866. "mul r7, r6\n\t"
  44867. #endif
  44868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44869. "adds r3, r3, r7\n\t"
  44870. #else
  44871. "add r3, r3, r7\n\t"
  44872. #endif
  44873. #ifdef WOLFSSL_KEIL
  44874. "adcs r4, r4, %[r]\n\t"
  44875. #elif defined(__clang__)
  44876. "adcs r4, %[r]\n\t"
  44877. #else
  44878. "adc r4, %[r]\n\t"
  44879. #endif
  44880. "uxth r7, %[b]\n\t"
  44881. #ifdef WOLFSSL_KEIL
  44882. "muls r6, r7, r6\n\t"
  44883. #elif defined(__clang__)
  44884. "muls r6, r7\n\t"
  44885. #else
  44886. "mul r6, r7\n\t"
  44887. #endif
  44888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44889. "lsrs r7, r6, #16\n\t"
  44890. #else
  44891. "lsr r7, r6, #16\n\t"
  44892. #endif
  44893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44894. "lsls r6, r6, #16\n\t"
  44895. #else
  44896. "lsl r6, r6, #16\n\t"
  44897. #endif
  44898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44899. "adds r5, r5, r6\n\t"
  44900. #else
  44901. "add r5, r5, r6\n\t"
  44902. #endif
  44903. #ifdef WOLFSSL_KEIL
  44904. "adcs r3, r3, r7\n\t"
  44905. #elif defined(__clang__)
  44906. "adcs r3, r7\n\t"
  44907. #else
  44908. "adc r3, r7\n\t"
  44909. #endif
  44910. #ifdef WOLFSSL_KEIL
  44911. "adcs r4, r4, %[r]\n\t"
  44912. #elif defined(__clang__)
  44913. "adcs r4, %[r]\n\t"
  44914. #else
  44915. "adc r4, %[r]\n\t"
  44916. #endif
  44917. "# A[6] * B[8]\n\t"
  44918. "mov %[a], r9\n\t"
  44919. "mov %[b], r10\n\t"
  44920. "ldr %[a], [%[a], #24]\n\t"
  44921. "ldr %[b], [%[b], #32]\n\t"
  44922. "uxth r6, %[a]\n\t"
  44923. "uxth r7, %[b]\n\t"
  44924. #ifdef WOLFSSL_KEIL
  44925. "muls r7, r6, r7\n\t"
  44926. #elif defined(__clang__)
  44927. "muls r7, r6\n\t"
  44928. #else
  44929. "mul r7, r6\n\t"
  44930. #endif
  44931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44932. "adds r5, r5, r7\n\t"
  44933. #else
  44934. "add r5, r5, r7\n\t"
  44935. #endif
  44936. #ifdef WOLFSSL_KEIL
  44937. "adcs r3, r3, %[r]\n\t"
  44938. #elif defined(__clang__)
  44939. "adcs r3, %[r]\n\t"
  44940. #else
  44941. "adc r3, %[r]\n\t"
  44942. #endif
  44943. #ifdef WOLFSSL_KEIL
  44944. "adcs r4, r4, %[r]\n\t"
  44945. #elif defined(__clang__)
  44946. "adcs r4, %[r]\n\t"
  44947. #else
  44948. "adc r4, %[r]\n\t"
  44949. #endif
  44950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44951. "lsrs r7, %[b], #16\n\t"
  44952. #else
  44953. "lsr r7, %[b], #16\n\t"
  44954. #endif
  44955. #ifdef WOLFSSL_KEIL
  44956. "muls r6, r7, r6\n\t"
  44957. #elif defined(__clang__)
  44958. "muls r6, r7\n\t"
  44959. #else
  44960. "mul r6, r7\n\t"
  44961. #endif
  44962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44963. "lsrs r7, r6, #16\n\t"
  44964. #else
  44965. "lsr r7, r6, #16\n\t"
  44966. #endif
  44967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44968. "lsls r6, r6, #16\n\t"
  44969. #else
  44970. "lsl r6, r6, #16\n\t"
  44971. #endif
  44972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44973. "adds r5, r5, r6\n\t"
  44974. #else
  44975. "add r5, r5, r6\n\t"
  44976. #endif
  44977. #ifdef WOLFSSL_KEIL
  44978. "adcs r3, r3, r7\n\t"
  44979. #elif defined(__clang__)
  44980. "adcs r3, r7\n\t"
  44981. #else
  44982. "adc r3, r7\n\t"
  44983. #endif
  44984. #ifdef WOLFSSL_KEIL
  44985. "adcs r4, r4, %[r]\n\t"
  44986. #elif defined(__clang__)
  44987. "adcs r4, %[r]\n\t"
  44988. #else
  44989. "adc r4, %[r]\n\t"
  44990. #endif
  44991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44992. "lsrs r6, %[a], #16\n\t"
  44993. #else
  44994. "lsr r6, %[a], #16\n\t"
  44995. #endif
  44996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  44997. "lsrs r7, %[b], #16\n\t"
  44998. #else
  44999. "lsr r7, %[b], #16\n\t"
  45000. #endif
  45001. #ifdef WOLFSSL_KEIL
  45002. "muls r7, r6, r7\n\t"
  45003. #elif defined(__clang__)
  45004. "muls r7, r6\n\t"
  45005. #else
  45006. "mul r7, r6\n\t"
  45007. #endif
  45008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45009. "adds r3, r3, r7\n\t"
  45010. #else
  45011. "add r3, r3, r7\n\t"
  45012. #endif
  45013. #ifdef WOLFSSL_KEIL
  45014. "adcs r4, r4, %[r]\n\t"
  45015. #elif defined(__clang__)
  45016. "adcs r4, %[r]\n\t"
  45017. #else
  45018. "adc r4, %[r]\n\t"
  45019. #endif
  45020. "uxth r7, %[b]\n\t"
  45021. #ifdef WOLFSSL_KEIL
  45022. "muls r6, r7, r6\n\t"
  45023. #elif defined(__clang__)
  45024. "muls r6, r7\n\t"
  45025. #else
  45026. "mul r6, r7\n\t"
  45027. #endif
  45028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45029. "lsrs r7, r6, #16\n\t"
  45030. #else
  45031. "lsr r7, r6, #16\n\t"
  45032. #endif
  45033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45034. "lsls r6, r6, #16\n\t"
  45035. #else
  45036. "lsl r6, r6, #16\n\t"
  45037. #endif
  45038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45039. "adds r5, r5, r6\n\t"
  45040. #else
  45041. "add r5, r5, r6\n\t"
  45042. #endif
  45043. #ifdef WOLFSSL_KEIL
  45044. "adcs r3, r3, r7\n\t"
  45045. #elif defined(__clang__)
  45046. "adcs r3, r7\n\t"
  45047. #else
  45048. "adc r3, r7\n\t"
  45049. #endif
  45050. #ifdef WOLFSSL_KEIL
  45051. "adcs r4, r4, %[r]\n\t"
  45052. #elif defined(__clang__)
  45053. "adcs r4, %[r]\n\t"
  45054. #else
  45055. "adc r4, %[r]\n\t"
  45056. #endif
  45057. "# A[5] * B[9]\n\t"
  45058. "mov %[a], r9\n\t"
  45059. "mov %[b], r10\n\t"
  45060. "ldr %[a], [%[a], #20]\n\t"
  45061. "ldr %[b], [%[b], #36]\n\t"
  45062. "uxth r6, %[a]\n\t"
  45063. "uxth r7, %[b]\n\t"
  45064. #ifdef WOLFSSL_KEIL
  45065. "muls r7, r6, r7\n\t"
  45066. #elif defined(__clang__)
  45067. "muls r7, r6\n\t"
  45068. #else
  45069. "mul r7, r6\n\t"
  45070. #endif
  45071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45072. "adds r5, r5, r7\n\t"
  45073. #else
  45074. "add r5, r5, r7\n\t"
  45075. #endif
  45076. #ifdef WOLFSSL_KEIL
  45077. "adcs r3, r3, %[r]\n\t"
  45078. #elif defined(__clang__)
  45079. "adcs r3, %[r]\n\t"
  45080. #else
  45081. "adc r3, %[r]\n\t"
  45082. #endif
  45083. #ifdef WOLFSSL_KEIL
  45084. "adcs r4, r4, %[r]\n\t"
  45085. #elif defined(__clang__)
  45086. "adcs r4, %[r]\n\t"
  45087. #else
  45088. "adc r4, %[r]\n\t"
  45089. #endif
  45090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45091. "lsrs r7, %[b], #16\n\t"
  45092. #else
  45093. "lsr r7, %[b], #16\n\t"
  45094. #endif
  45095. #ifdef WOLFSSL_KEIL
  45096. "muls r6, r7, r6\n\t"
  45097. #elif defined(__clang__)
  45098. "muls r6, r7\n\t"
  45099. #else
  45100. "mul r6, r7\n\t"
  45101. #endif
  45102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45103. "lsrs r7, r6, #16\n\t"
  45104. #else
  45105. "lsr r7, r6, #16\n\t"
  45106. #endif
  45107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45108. "lsls r6, r6, #16\n\t"
  45109. #else
  45110. "lsl r6, r6, #16\n\t"
  45111. #endif
  45112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45113. "adds r5, r5, r6\n\t"
  45114. #else
  45115. "add r5, r5, r6\n\t"
  45116. #endif
  45117. #ifdef WOLFSSL_KEIL
  45118. "adcs r3, r3, r7\n\t"
  45119. #elif defined(__clang__)
  45120. "adcs r3, r7\n\t"
  45121. #else
  45122. "adc r3, r7\n\t"
  45123. #endif
  45124. #ifdef WOLFSSL_KEIL
  45125. "adcs r4, r4, %[r]\n\t"
  45126. #elif defined(__clang__)
  45127. "adcs r4, %[r]\n\t"
  45128. #else
  45129. "adc r4, %[r]\n\t"
  45130. #endif
  45131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45132. "lsrs r6, %[a], #16\n\t"
  45133. #else
  45134. "lsr r6, %[a], #16\n\t"
  45135. #endif
  45136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45137. "lsrs r7, %[b], #16\n\t"
  45138. #else
  45139. "lsr r7, %[b], #16\n\t"
  45140. #endif
  45141. #ifdef WOLFSSL_KEIL
  45142. "muls r7, r6, r7\n\t"
  45143. #elif defined(__clang__)
  45144. "muls r7, r6\n\t"
  45145. #else
  45146. "mul r7, r6\n\t"
  45147. #endif
  45148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45149. "adds r3, r3, r7\n\t"
  45150. #else
  45151. "add r3, r3, r7\n\t"
  45152. #endif
  45153. #ifdef WOLFSSL_KEIL
  45154. "adcs r4, r4, %[r]\n\t"
  45155. #elif defined(__clang__)
  45156. "adcs r4, %[r]\n\t"
  45157. #else
  45158. "adc r4, %[r]\n\t"
  45159. #endif
  45160. "uxth r7, %[b]\n\t"
  45161. #ifdef WOLFSSL_KEIL
  45162. "muls r6, r7, r6\n\t"
  45163. #elif defined(__clang__)
  45164. "muls r6, r7\n\t"
  45165. #else
  45166. "mul r6, r7\n\t"
  45167. #endif
  45168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45169. "lsrs r7, r6, #16\n\t"
  45170. #else
  45171. "lsr r7, r6, #16\n\t"
  45172. #endif
  45173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45174. "lsls r6, r6, #16\n\t"
  45175. #else
  45176. "lsl r6, r6, #16\n\t"
  45177. #endif
  45178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45179. "adds r5, r5, r6\n\t"
  45180. #else
  45181. "add r5, r5, r6\n\t"
  45182. #endif
  45183. #ifdef WOLFSSL_KEIL
  45184. "adcs r3, r3, r7\n\t"
  45185. #elif defined(__clang__)
  45186. "adcs r3, r7\n\t"
  45187. #else
  45188. "adc r3, r7\n\t"
  45189. #endif
  45190. #ifdef WOLFSSL_KEIL
  45191. "adcs r4, r4, %[r]\n\t"
  45192. #elif defined(__clang__)
  45193. "adcs r4, %[r]\n\t"
  45194. #else
  45195. "adc r4, %[r]\n\t"
  45196. #endif
  45197. "# A[4] * B[10]\n\t"
  45198. "mov %[a], r9\n\t"
  45199. "mov %[b], r10\n\t"
  45200. "ldr %[a], [%[a], #16]\n\t"
  45201. "ldr %[b], [%[b], #40]\n\t"
  45202. "uxth r6, %[a]\n\t"
  45203. "uxth r7, %[b]\n\t"
  45204. #ifdef WOLFSSL_KEIL
  45205. "muls r7, r6, r7\n\t"
  45206. #elif defined(__clang__)
  45207. "muls r7, r6\n\t"
  45208. #else
  45209. "mul r7, r6\n\t"
  45210. #endif
  45211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45212. "adds r5, r5, r7\n\t"
  45213. #else
  45214. "add r5, r5, r7\n\t"
  45215. #endif
  45216. #ifdef WOLFSSL_KEIL
  45217. "adcs r3, r3, %[r]\n\t"
  45218. #elif defined(__clang__)
  45219. "adcs r3, %[r]\n\t"
  45220. #else
  45221. "adc r3, %[r]\n\t"
  45222. #endif
  45223. #ifdef WOLFSSL_KEIL
  45224. "adcs r4, r4, %[r]\n\t"
  45225. #elif defined(__clang__)
  45226. "adcs r4, %[r]\n\t"
  45227. #else
  45228. "adc r4, %[r]\n\t"
  45229. #endif
  45230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45231. "lsrs r7, %[b], #16\n\t"
  45232. #else
  45233. "lsr r7, %[b], #16\n\t"
  45234. #endif
  45235. #ifdef WOLFSSL_KEIL
  45236. "muls r6, r7, r6\n\t"
  45237. #elif defined(__clang__)
  45238. "muls r6, r7\n\t"
  45239. #else
  45240. "mul r6, r7\n\t"
  45241. #endif
  45242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45243. "lsrs r7, r6, #16\n\t"
  45244. #else
  45245. "lsr r7, r6, #16\n\t"
  45246. #endif
  45247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45248. "lsls r6, r6, #16\n\t"
  45249. #else
  45250. "lsl r6, r6, #16\n\t"
  45251. #endif
  45252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45253. "adds r5, r5, r6\n\t"
  45254. #else
  45255. "add r5, r5, r6\n\t"
  45256. #endif
  45257. #ifdef WOLFSSL_KEIL
  45258. "adcs r3, r3, r7\n\t"
  45259. #elif defined(__clang__)
  45260. "adcs r3, r7\n\t"
  45261. #else
  45262. "adc r3, r7\n\t"
  45263. #endif
  45264. #ifdef WOLFSSL_KEIL
  45265. "adcs r4, r4, %[r]\n\t"
  45266. #elif defined(__clang__)
  45267. "adcs r4, %[r]\n\t"
  45268. #else
  45269. "adc r4, %[r]\n\t"
  45270. #endif
  45271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45272. "lsrs r6, %[a], #16\n\t"
  45273. #else
  45274. "lsr r6, %[a], #16\n\t"
  45275. #endif
  45276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45277. "lsrs r7, %[b], #16\n\t"
  45278. #else
  45279. "lsr r7, %[b], #16\n\t"
  45280. #endif
  45281. #ifdef WOLFSSL_KEIL
  45282. "muls r7, r6, r7\n\t"
  45283. #elif defined(__clang__)
  45284. "muls r7, r6\n\t"
  45285. #else
  45286. "mul r7, r6\n\t"
  45287. #endif
  45288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45289. "adds r3, r3, r7\n\t"
  45290. #else
  45291. "add r3, r3, r7\n\t"
  45292. #endif
  45293. #ifdef WOLFSSL_KEIL
  45294. "adcs r4, r4, %[r]\n\t"
  45295. #elif defined(__clang__)
  45296. "adcs r4, %[r]\n\t"
  45297. #else
  45298. "adc r4, %[r]\n\t"
  45299. #endif
  45300. "uxth r7, %[b]\n\t"
  45301. #ifdef WOLFSSL_KEIL
  45302. "muls r6, r7, r6\n\t"
  45303. #elif defined(__clang__)
  45304. "muls r6, r7\n\t"
  45305. #else
  45306. "mul r6, r7\n\t"
  45307. #endif
  45308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45309. "lsrs r7, r6, #16\n\t"
  45310. #else
  45311. "lsr r7, r6, #16\n\t"
  45312. #endif
  45313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45314. "lsls r6, r6, #16\n\t"
  45315. #else
  45316. "lsl r6, r6, #16\n\t"
  45317. #endif
  45318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45319. "adds r5, r5, r6\n\t"
  45320. #else
  45321. "add r5, r5, r6\n\t"
  45322. #endif
  45323. #ifdef WOLFSSL_KEIL
  45324. "adcs r3, r3, r7\n\t"
  45325. #elif defined(__clang__)
  45326. "adcs r3, r7\n\t"
  45327. #else
  45328. "adc r3, r7\n\t"
  45329. #endif
  45330. #ifdef WOLFSSL_KEIL
  45331. "adcs r4, r4, %[r]\n\t"
  45332. #elif defined(__clang__)
  45333. "adcs r4, %[r]\n\t"
  45334. #else
  45335. "adc r4, %[r]\n\t"
  45336. #endif
  45337. "# A[3] * B[11]\n\t"
  45338. "mov %[a], r9\n\t"
  45339. "mov %[b], r10\n\t"
  45340. "ldr %[a], [%[a], #12]\n\t"
  45341. "ldr %[b], [%[b], #44]\n\t"
  45342. "uxth r6, %[a]\n\t"
  45343. "uxth r7, %[b]\n\t"
  45344. #ifdef WOLFSSL_KEIL
  45345. "muls r7, r6, r7\n\t"
  45346. #elif defined(__clang__)
  45347. "muls r7, r6\n\t"
  45348. #else
  45349. "mul r7, r6\n\t"
  45350. #endif
  45351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45352. "adds r5, r5, r7\n\t"
  45353. #else
  45354. "add r5, r5, r7\n\t"
  45355. #endif
  45356. #ifdef WOLFSSL_KEIL
  45357. "adcs r3, r3, %[r]\n\t"
  45358. #elif defined(__clang__)
  45359. "adcs r3, %[r]\n\t"
  45360. #else
  45361. "adc r3, %[r]\n\t"
  45362. #endif
  45363. #ifdef WOLFSSL_KEIL
  45364. "adcs r4, r4, %[r]\n\t"
  45365. #elif defined(__clang__)
  45366. "adcs r4, %[r]\n\t"
  45367. #else
  45368. "adc r4, %[r]\n\t"
  45369. #endif
  45370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45371. "lsrs r7, %[b], #16\n\t"
  45372. #else
  45373. "lsr r7, %[b], #16\n\t"
  45374. #endif
  45375. #ifdef WOLFSSL_KEIL
  45376. "muls r6, r7, r6\n\t"
  45377. #elif defined(__clang__)
  45378. "muls r6, r7\n\t"
  45379. #else
  45380. "mul r6, r7\n\t"
  45381. #endif
  45382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45383. "lsrs r7, r6, #16\n\t"
  45384. #else
  45385. "lsr r7, r6, #16\n\t"
  45386. #endif
  45387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45388. "lsls r6, r6, #16\n\t"
  45389. #else
  45390. "lsl r6, r6, #16\n\t"
  45391. #endif
  45392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45393. "adds r5, r5, r6\n\t"
  45394. #else
  45395. "add r5, r5, r6\n\t"
  45396. #endif
  45397. #ifdef WOLFSSL_KEIL
  45398. "adcs r3, r3, r7\n\t"
  45399. #elif defined(__clang__)
  45400. "adcs r3, r7\n\t"
  45401. #else
  45402. "adc r3, r7\n\t"
  45403. #endif
  45404. #ifdef WOLFSSL_KEIL
  45405. "adcs r4, r4, %[r]\n\t"
  45406. #elif defined(__clang__)
  45407. "adcs r4, %[r]\n\t"
  45408. #else
  45409. "adc r4, %[r]\n\t"
  45410. #endif
  45411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45412. "lsrs r6, %[a], #16\n\t"
  45413. #else
  45414. "lsr r6, %[a], #16\n\t"
  45415. #endif
  45416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45417. "lsrs r7, %[b], #16\n\t"
  45418. #else
  45419. "lsr r7, %[b], #16\n\t"
  45420. #endif
  45421. #ifdef WOLFSSL_KEIL
  45422. "muls r7, r6, r7\n\t"
  45423. #elif defined(__clang__)
  45424. "muls r7, r6\n\t"
  45425. #else
  45426. "mul r7, r6\n\t"
  45427. #endif
  45428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45429. "adds r3, r3, r7\n\t"
  45430. #else
  45431. "add r3, r3, r7\n\t"
  45432. #endif
  45433. #ifdef WOLFSSL_KEIL
  45434. "adcs r4, r4, %[r]\n\t"
  45435. #elif defined(__clang__)
  45436. "adcs r4, %[r]\n\t"
  45437. #else
  45438. "adc r4, %[r]\n\t"
  45439. #endif
  45440. "uxth r7, %[b]\n\t"
  45441. #ifdef WOLFSSL_KEIL
  45442. "muls r6, r7, r6\n\t"
  45443. #elif defined(__clang__)
  45444. "muls r6, r7\n\t"
  45445. #else
  45446. "mul r6, r7\n\t"
  45447. #endif
  45448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45449. "lsrs r7, r6, #16\n\t"
  45450. #else
  45451. "lsr r7, r6, #16\n\t"
  45452. #endif
  45453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45454. "lsls r6, r6, #16\n\t"
  45455. #else
  45456. "lsl r6, r6, #16\n\t"
  45457. #endif
  45458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45459. "adds r5, r5, r6\n\t"
  45460. #else
  45461. "add r5, r5, r6\n\t"
  45462. #endif
  45463. #ifdef WOLFSSL_KEIL
  45464. "adcs r3, r3, r7\n\t"
  45465. #elif defined(__clang__)
  45466. "adcs r3, r7\n\t"
  45467. #else
  45468. "adc r3, r7\n\t"
  45469. #endif
  45470. #ifdef WOLFSSL_KEIL
  45471. "adcs r4, r4, %[r]\n\t"
  45472. #elif defined(__clang__)
  45473. "adcs r4, %[r]\n\t"
  45474. #else
  45475. "adc r4, %[r]\n\t"
  45476. #endif
  45477. "mov %[r], r8\n\t"
  45478. "str r5, [%[r], #56]\n\t"
  45479. "movs %[r], #0\n\t"
  45480. "# A[4] * B[11]\n\t"
  45481. "movs r5, #0\n\t"
  45482. "mov %[a], r9\n\t"
  45483. "mov %[b], r10\n\t"
  45484. "ldr %[a], [%[a], #16]\n\t"
  45485. "ldr %[b], [%[b], #44]\n\t"
  45486. "uxth r6, %[a]\n\t"
  45487. "uxth r7, %[b]\n\t"
  45488. #ifdef WOLFSSL_KEIL
  45489. "muls r7, r6, r7\n\t"
  45490. #elif defined(__clang__)
  45491. "muls r7, r6\n\t"
  45492. #else
  45493. "mul r7, r6\n\t"
  45494. #endif
  45495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45496. "adds r3, r3, r7\n\t"
  45497. #else
  45498. "add r3, r3, r7\n\t"
  45499. #endif
  45500. #ifdef WOLFSSL_KEIL
  45501. "adcs r4, r4, %[r]\n\t"
  45502. #elif defined(__clang__)
  45503. "adcs r4, %[r]\n\t"
  45504. #else
  45505. "adc r4, %[r]\n\t"
  45506. #endif
  45507. #ifdef WOLFSSL_KEIL
  45508. "adcs r5, r5, %[r]\n\t"
  45509. #elif defined(__clang__)
  45510. "adcs r5, %[r]\n\t"
  45511. #else
  45512. "adc r5, %[r]\n\t"
  45513. #endif
  45514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45515. "lsrs r7, %[b], #16\n\t"
  45516. #else
  45517. "lsr r7, %[b], #16\n\t"
  45518. #endif
  45519. #ifdef WOLFSSL_KEIL
  45520. "muls r6, r7, r6\n\t"
  45521. #elif defined(__clang__)
  45522. "muls r6, r7\n\t"
  45523. #else
  45524. "mul r6, r7\n\t"
  45525. #endif
  45526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45527. "lsrs r7, r6, #16\n\t"
  45528. #else
  45529. "lsr r7, r6, #16\n\t"
  45530. #endif
  45531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45532. "lsls r6, r6, #16\n\t"
  45533. #else
  45534. "lsl r6, r6, #16\n\t"
  45535. #endif
  45536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45537. "adds r3, r3, r6\n\t"
  45538. #else
  45539. "add r3, r3, r6\n\t"
  45540. #endif
  45541. #ifdef WOLFSSL_KEIL
  45542. "adcs r4, r4, r7\n\t"
  45543. #elif defined(__clang__)
  45544. "adcs r4, r7\n\t"
  45545. #else
  45546. "adc r4, r7\n\t"
  45547. #endif
  45548. #ifdef WOLFSSL_KEIL
  45549. "adcs r5, r5, %[r]\n\t"
  45550. #elif defined(__clang__)
  45551. "adcs r5, %[r]\n\t"
  45552. #else
  45553. "adc r5, %[r]\n\t"
  45554. #endif
  45555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45556. "lsrs r6, %[a], #16\n\t"
  45557. #else
  45558. "lsr r6, %[a], #16\n\t"
  45559. #endif
  45560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45561. "lsrs r7, %[b], #16\n\t"
  45562. #else
  45563. "lsr r7, %[b], #16\n\t"
  45564. #endif
  45565. #ifdef WOLFSSL_KEIL
  45566. "muls r7, r6, r7\n\t"
  45567. #elif defined(__clang__)
  45568. "muls r7, r6\n\t"
  45569. #else
  45570. "mul r7, r6\n\t"
  45571. #endif
  45572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45573. "adds r4, r4, r7\n\t"
  45574. #else
  45575. "add r4, r4, r7\n\t"
  45576. #endif
  45577. #ifdef WOLFSSL_KEIL
  45578. "adcs r5, r5, %[r]\n\t"
  45579. #elif defined(__clang__)
  45580. "adcs r5, %[r]\n\t"
  45581. #else
  45582. "adc r5, %[r]\n\t"
  45583. #endif
  45584. "uxth r7, %[b]\n\t"
  45585. #ifdef WOLFSSL_KEIL
  45586. "muls r6, r7, r6\n\t"
  45587. #elif defined(__clang__)
  45588. "muls r6, r7\n\t"
  45589. #else
  45590. "mul r6, r7\n\t"
  45591. #endif
  45592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45593. "lsrs r7, r6, #16\n\t"
  45594. #else
  45595. "lsr r7, r6, #16\n\t"
  45596. #endif
  45597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45598. "lsls r6, r6, #16\n\t"
  45599. #else
  45600. "lsl r6, r6, #16\n\t"
  45601. #endif
  45602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45603. "adds r3, r3, r6\n\t"
  45604. #else
  45605. "add r3, r3, r6\n\t"
  45606. #endif
  45607. #ifdef WOLFSSL_KEIL
  45608. "adcs r4, r4, r7\n\t"
  45609. #elif defined(__clang__)
  45610. "adcs r4, r7\n\t"
  45611. #else
  45612. "adc r4, r7\n\t"
  45613. #endif
  45614. #ifdef WOLFSSL_KEIL
  45615. "adcs r5, r5, %[r]\n\t"
  45616. #elif defined(__clang__)
  45617. "adcs r5, %[r]\n\t"
  45618. #else
  45619. "adc r5, %[r]\n\t"
  45620. #endif
  45621. "# A[5] * B[10]\n\t"
  45622. "mov %[a], r9\n\t"
  45623. "mov %[b], r10\n\t"
  45624. "ldr %[a], [%[a], #20]\n\t"
  45625. "ldr %[b], [%[b], #40]\n\t"
  45626. "uxth r6, %[a]\n\t"
  45627. "uxth r7, %[b]\n\t"
  45628. #ifdef WOLFSSL_KEIL
  45629. "muls r7, r6, r7\n\t"
  45630. #elif defined(__clang__)
  45631. "muls r7, r6\n\t"
  45632. #else
  45633. "mul r7, r6\n\t"
  45634. #endif
  45635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45636. "adds r3, r3, r7\n\t"
  45637. #else
  45638. "add r3, r3, r7\n\t"
  45639. #endif
  45640. #ifdef WOLFSSL_KEIL
  45641. "adcs r4, r4, %[r]\n\t"
  45642. #elif defined(__clang__)
  45643. "adcs r4, %[r]\n\t"
  45644. #else
  45645. "adc r4, %[r]\n\t"
  45646. #endif
  45647. #ifdef WOLFSSL_KEIL
  45648. "adcs r5, r5, %[r]\n\t"
  45649. #elif defined(__clang__)
  45650. "adcs r5, %[r]\n\t"
  45651. #else
  45652. "adc r5, %[r]\n\t"
  45653. #endif
  45654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45655. "lsrs r7, %[b], #16\n\t"
  45656. #else
  45657. "lsr r7, %[b], #16\n\t"
  45658. #endif
  45659. #ifdef WOLFSSL_KEIL
  45660. "muls r6, r7, r6\n\t"
  45661. #elif defined(__clang__)
  45662. "muls r6, r7\n\t"
  45663. #else
  45664. "mul r6, r7\n\t"
  45665. #endif
  45666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45667. "lsrs r7, r6, #16\n\t"
  45668. #else
  45669. "lsr r7, r6, #16\n\t"
  45670. #endif
  45671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45672. "lsls r6, r6, #16\n\t"
  45673. #else
  45674. "lsl r6, r6, #16\n\t"
  45675. #endif
  45676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45677. "adds r3, r3, r6\n\t"
  45678. #else
  45679. "add r3, r3, r6\n\t"
  45680. #endif
  45681. #ifdef WOLFSSL_KEIL
  45682. "adcs r4, r4, r7\n\t"
  45683. #elif defined(__clang__)
  45684. "adcs r4, r7\n\t"
  45685. #else
  45686. "adc r4, r7\n\t"
  45687. #endif
  45688. #ifdef WOLFSSL_KEIL
  45689. "adcs r5, r5, %[r]\n\t"
  45690. #elif defined(__clang__)
  45691. "adcs r5, %[r]\n\t"
  45692. #else
  45693. "adc r5, %[r]\n\t"
  45694. #endif
  45695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45696. "lsrs r6, %[a], #16\n\t"
  45697. #else
  45698. "lsr r6, %[a], #16\n\t"
  45699. #endif
  45700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45701. "lsrs r7, %[b], #16\n\t"
  45702. #else
  45703. "lsr r7, %[b], #16\n\t"
  45704. #endif
  45705. #ifdef WOLFSSL_KEIL
  45706. "muls r7, r6, r7\n\t"
  45707. #elif defined(__clang__)
  45708. "muls r7, r6\n\t"
  45709. #else
  45710. "mul r7, r6\n\t"
  45711. #endif
  45712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45713. "adds r4, r4, r7\n\t"
  45714. #else
  45715. "add r4, r4, r7\n\t"
  45716. #endif
  45717. #ifdef WOLFSSL_KEIL
  45718. "adcs r5, r5, %[r]\n\t"
  45719. #elif defined(__clang__)
  45720. "adcs r5, %[r]\n\t"
  45721. #else
  45722. "adc r5, %[r]\n\t"
  45723. #endif
  45724. "uxth r7, %[b]\n\t"
  45725. #ifdef WOLFSSL_KEIL
  45726. "muls r6, r7, r6\n\t"
  45727. #elif defined(__clang__)
  45728. "muls r6, r7\n\t"
  45729. #else
  45730. "mul r6, r7\n\t"
  45731. #endif
  45732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45733. "lsrs r7, r6, #16\n\t"
  45734. #else
  45735. "lsr r7, r6, #16\n\t"
  45736. #endif
  45737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45738. "lsls r6, r6, #16\n\t"
  45739. #else
  45740. "lsl r6, r6, #16\n\t"
  45741. #endif
  45742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45743. "adds r3, r3, r6\n\t"
  45744. #else
  45745. "add r3, r3, r6\n\t"
  45746. #endif
  45747. #ifdef WOLFSSL_KEIL
  45748. "adcs r4, r4, r7\n\t"
  45749. #elif defined(__clang__)
  45750. "adcs r4, r7\n\t"
  45751. #else
  45752. "adc r4, r7\n\t"
  45753. #endif
  45754. #ifdef WOLFSSL_KEIL
  45755. "adcs r5, r5, %[r]\n\t"
  45756. #elif defined(__clang__)
  45757. "adcs r5, %[r]\n\t"
  45758. #else
  45759. "adc r5, %[r]\n\t"
  45760. #endif
  45761. "# A[6] * B[9]\n\t"
  45762. "mov %[a], r9\n\t"
  45763. "mov %[b], r10\n\t"
  45764. "ldr %[a], [%[a], #24]\n\t"
  45765. "ldr %[b], [%[b], #36]\n\t"
  45766. "uxth r6, %[a]\n\t"
  45767. "uxth r7, %[b]\n\t"
  45768. #ifdef WOLFSSL_KEIL
  45769. "muls r7, r6, r7\n\t"
  45770. #elif defined(__clang__)
  45771. "muls r7, r6\n\t"
  45772. #else
  45773. "mul r7, r6\n\t"
  45774. #endif
  45775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45776. "adds r3, r3, r7\n\t"
  45777. #else
  45778. "add r3, r3, r7\n\t"
  45779. #endif
  45780. #ifdef WOLFSSL_KEIL
  45781. "adcs r4, r4, %[r]\n\t"
  45782. #elif defined(__clang__)
  45783. "adcs r4, %[r]\n\t"
  45784. #else
  45785. "adc r4, %[r]\n\t"
  45786. #endif
  45787. #ifdef WOLFSSL_KEIL
  45788. "adcs r5, r5, %[r]\n\t"
  45789. #elif defined(__clang__)
  45790. "adcs r5, %[r]\n\t"
  45791. #else
  45792. "adc r5, %[r]\n\t"
  45793. #endif
  45794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45795. "lsrs r7, %[b], #16\n\t"
  45796. #else
  45797. "lsr r7, %[b], #16\n\t"
  45798. #endif
  45799. #ifdef WOLFSSL_KEIL
  45800. "muls r6, r7, r6\n\t"
  45801. #elif defined(__clang__)
  45802. "muls r6, r7\n\t"
  45803. #else
  45804. "mul r6, r7\n\t"
  45805. #endif
  45806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45807. "lsrs r7, r6, #16\n\t"
  45808. #else
  45809. "lsr r7, r6, #16\n\t"
  45810. #endif
  45811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45812. "lsls r6, r6, #16\n\t"
  45813. #else
  45814. "lsl r6, r6, #16\n\t"
  45815. #endif
  45816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45817. "adds r3, r3, r6\n\t"
  45818. #else
  45819. "add r3, r3, r6\n\t"
  45820. #endif
  45821. #ifdef WOLFSSL_KEIL
  45822. "adcs r4, r4, r7\n\t"
  45823. #elif defined(__clang__)
  45824. "adcs r4, r7\n\t"
  45825. #else
  45826. "adc r4, r7\n\t"
  45827. #endif
  45828. #ifdef WOLFSSL_KEIL
  45829. "adcs r5, r5, %[r]\n\t"
  45830. #elif defined(__clang__)
  45831. "adcs r5, %[r]\n\t"
  45832. #else
  45833. "adc r5, %[r]\n\t"
  45834. #endif
  45835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45836. "lsrs r6, %[a], #16\n\t"
  45837. #else
  45838. "lsr r6, %[a], #16\n\t"
  45839. #endif
  45840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45841. "lsrs r7, %[b], #16\n\t"
  45842. #else
  45843. "lsr r7, %[b], #16\n\t"
  45844. #endif
  45845. #ifdef WOLFSSL_KEIL
  45846. "muls r7, r6, r7\n\t"
  45847. #elif defined(__clang__)
  45848. "muls r7, r6\n\t"
  45849. #else
  45850. "mul r7, r6\n\t"
  45851. #endif
  45852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45853. "adds r4, r4, r7\n\t"
  45854. #else
  45855. "add r4, r4, r7\n\t"
  45856. #endif
  45857. #ifdef WOLFSSL_KEIL
  45858. "adcs r5, r5, %[r]\n\t"
  45859. #elif defined(__clang__)
  45860. "adcs r5, %[r]\n\t"
  45861. #else
  45862. "adc r5, %[r]\n\t"
  45863. #endif
  45864. "uxth r7, %[b]\n\t"
  45865. #ifdef WOLFSSL_KEIL
  45866. "muls r6, r7, r6\n\t"
  45867. #elif defined(__clang__)
  45868. "muls r6, r7\n\t"
  45869. #else
  45870. "mul r6, r7\n\t"
  45871. #endif
  45872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45873. "lsrs r7, r6, #16\n\t"
  45874. #else
  45875. "lsr r7, r6, #16\n\t"
  45876. #endif
  45877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45878. "lsls r6, r6, #16\n\t"
  45879. #else
  45880. "lsl r6, r6, #16\n\t"
  45881. #endif
  45882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45883. "adds r3, r3, r6\n\t"
  45884. #else
  45885. "add r3, r3, r6\n\t"
  45886. #endif
  45887. #ifdef WOLFSSL_KEIL
  45888. "adcs r4, r4, r7\n\t"
  45889. #elif defined(__clang__)
  45890. "adcs r4, r7\n\t"
  45891. #else
  45892. "adc r4, r7\n\t"
  45893. #endif
  45894. #ifdef WOLFSSL_KEIL
  45895. "adcs r5, r5, %[r]\n\t"
  45896. #elif defined(__clang__)
  45897. "adcs r5, %[r]\n\t"
  45898. #else
  45899. "adc r5, %[r]\n\t"
  45900. #endif
  45901. "# A[7] * B[8]\n\t"
  45902. "mov %[a], r9\n\t"
  45903. "mov %[b], r10\n\t"
  45904. "ldr %[a], [%[a], #28]\n\t"
  45905. "ldr %[b], [%[b], #32]\n\t"
  45906. "uxth r6, %[a]\n\t"
  45907. "uxth r7, %[b]\n\t"
  45908. #ifdef WOLFSSL_KEIL
  45909. "muls r7, r6, r7\n\t"
  45910. #elif defined(__clang__)
  45911. "muls r7, r6\n\t"
  45912. #else
  45913. "mul r7, r6\n\t"
  45914. #endif
  45915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45916. "adds r3, r3, r7\n\t"
  45917. #else
  45918. "add r3, r3, r7\n\t"
  45919. #endif
  45920. #ifdef WOLFSSL_KEIL
  45921. "adcs r4, r4, %[r]\n\t"
  45922. #elif defined(__clang__)
  45923. "adcs r4, %[r]\n\t"
  45924. #else
  45925. "adc r4, %[r]\n\t"
  45926. #endif
  45927. #ifdef WOLFSSL_KEIL
  45928. "adcs r5, r5, %[r]\n\t"
  45929. #elif defined(__clang__)
  45930. "adcs r5, %[r]\n\t"
  45931. #else
  45932. "adc r5, %[r]\n\t"
  45933. #endif
  45934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45935. "lsrs r7, %[b], #16\n\t"
  45936. #else
  45937. "lsr r7, %[b], #16\n\t"
  45938. #endif
  45939. #ifdef WOLFSSL_KEIL
  45940. "muls r6, r7, r6\n\t"
  45941. #elif defined(__clang__)
  45942. "muls r6, r7\n\t"
  45943. #else
  45944. "mul r6, r7\n\t"
  45945. #endif
  45946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45947. "lsrs r7, r6, #16\n\t"
  45948. #else
  45949. "lsr r7, r6, #16\n\t"
  45950. #endif
  45951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45952. "lsls r6, r6, #16\n\t"
  45953. #else
  45954. "lsl r6, r6, #16\n\t"
  45955. #endif
  45956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45957. "adds r3, r3, r6\n\t"
  45958. #else
  45959. "add r3, r3, r6\n\t"
  45960. #endif
  45961. #ifdef WOLFSSL_KEIL
  45962. "adcs r4, r4, r7\n\t"
  45963. #elif defined(__clang__)
  45964. "adcs r4, r7\n\t"
  45965. #else
  45966. "adc r4, r7\n\t"
  45967. #endif
  45968. #ifdef WOLFSSL_KEIL
  45969. "adcs r5, r5, %[r]\n\t"
  45970. #elif defined(__clang__)
  45971. "adcs r5, %[r]\n\t"
  45972. #else
  45973. "adc r5, %[r]\n\t"
  45974. #endif
  45975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45976. "lsrs r6, %[a], #16\n\t"
  45977. #else
  45978. "lsr r6, %[a], #16\n\t"
  45979. #endif
  45980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45981. "lsrs r7, %[b], #16\n\t"
  45982. #else
  45983. "lsr r7, %[b], #16\n\t"
  45984. #endif
  45985. #ifdef WOLFSSL_KEIL
  45986. "muls r7, r6, r7\n\t"
  45987. #elif defined(__clang__)
  45988. "muls r7, r6\n\t"
  45989. #else
  45990. "mul r7, r6\n\t"
  45991. #endif
  45992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  45993. "adds r4, r4, r7\n\t"
  45994. #else
  45995. "add r4, r4, r7\n\t"
  45996. #endif
  45997. #ifdef WOLFSSL_KEIL
  45998. "adcs r5, r5, %[r]\n\t"
  45999. #elif defined(__clang__)
  46000. "adcs r5, %[r]\n\t"
  46001. #else
  46002. "adc r5, %[r]\n\t"
  46003. #endif
  46004. "uxth r7, %[b]\n\t"
  46005. #ifdef WOLFSSL_KEIL
  46006. "muls r6, r7, r6\n\t"
  46007. #elif defined(__clang__)
  46008. "muls r6, r7\n\t"
  46009. #else
  46010. "mul r6, r7\n\t"
  46011. #endif
  46012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46013. "lsrs r7, r6, #16\n\t"
  46014. #else
  46015. "lsr r7, r6, #16\n\t"
  46016. #endif
  46017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46018. "lsls r6, r6, #16\n\t"
  46019. #else
  46020. "lsl r6, r6, #16\n\t"
  46021. #endif
  46022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46023. "adds r3, r3, r6\n\t"
  46024. #else
  46025. "add r3, r3, r6\n\t"
  46026. #endif
  46027. #ifdef WOLFSSL_KEIL
  46028. "adcs r4, r4, r7\n\t"
  46029. #elif defined(__clang__)
  46030. "adcs r4, r7\n\t"
  46031. #else
  46032. "adc r4, r7\n\t"
  46033. #endif
  46034. #ifdef WOLFSSL_KEIL
  46035. "adcs r5, r5, %[r]\n\t"
  46036. #elif defined(__clang__)
  46037. "adcs r5, %[r]\n\t"
  46038. #else
  46039. "adc r5, %[r]\n\t"
  46040. #endif
  46041. "# A[8] * B[7]\n\t"
  46042. "mov %[a], r9\n\t"
  46043. "mov %[b], r10\n\t"
  46044. "ldr %[a], [%[a], #32]\n\t"
  46045. "ldr %[b], [%[b], #28]\n\t"
  46046. "uxth r6, %[a]\n\t"
  46047. "uxth r7, %[b]\n\t"
  46048. #ifdef WOLFSSL_KEIL
  46049. "muls r7, r6, r7\n\t"
  46050. #elif defined(__clang__)
  46051. "muls r7, r6\n\t"
  46052. #else
  46053. "mul r7, r6\n\t"
  46054. #endif
  46055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46056. "adds r3, r3, r7\n\t"
  46057. #else
  46058. "add r3, r3, r7\n\t"
  46059. #endif
  46060. #ifdef WOLFSSL_KEIL
  46061. "adcs r4, r4, %[r]\n\t"
  46062. #elif defined(__clang__)
  46063. "adcs r4, %[r]\n\t"
  46064. #else
  46065. "adc r4, %[r]\n\t"
  46066. #endif
  46067. #ifdef WOLFSSL_KEIL
  46068. "adcs r5, r5, %[r]\n\t"
  46069. #elif defined(__clang__)
  46070. "adcs r5, %[r]\n\t"
  46071. #else
  46072. "adc r5, %[r]\n\t"
  46073. #endif
  46074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46075. "lsrs r7, %[b], #16\n\t"
  46076. #else
  46077. "lsr r7, %[b], #16\n\t"
  46078. #endif
  46079. #ifdef WOLFSSL_KEIL
  46080. "muls r6, r7, r6\n\t"
  46081. #elif defined(__clang__)
  46082. "muls r6, r7\n\t"
  46083. #else
  46084. "mul r6, r7\n\t"
  46085. #endif
  46086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46087. "lsrs r7, r6, #16\n\t"
  46088. #else
  46089. "lsr r7, r6, #16\n\t"
  46090. #endif
  46091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46092. "lsls r6, r6, #16\n\t"
  46093. #else
  46094. "lsl r6, r6, #16\n\t"
  46095. #endif
  46096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46097. "adds r3, r3, r6\n\t"
  46098. #else
  46099. "add r3, r3, r6\n\t"
  46100. #endif
  46101. #ifdef WOLFSSL_KEIL
  46102. "adcs r4, r4, r7\n\t"
  46103. #elif defined(__clang__)
  46104. "adcs r4, r7\n\t"
  46105. #else
  46106. "adc r4, r7\n\t"
  46107. #endif
  46108. #ifdef WOLFSSL_KEIL
  46109. "adcs r5, r5, %[r]\n\t"
  46110. #elif defined(__clang__)
  46111. "adcs r5, %[r]\n\t"
  46112. #else
  46113. "adc r5, %[r]\n\t"
  46114. #endif
  46115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46116. "lsrs r6, %[a], #16\n\t"
  46117. #else
  46118. "lsr r6, %[a], #16\n\t"
  46119. #endif
  46120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46121. "lsrs r7, %[b], #16\n\t"
  46122. #else
  46123. "lsr r7, %[b], #16\n\t"
  46124. #endif
  46125. #ifdef WOLFSSL_KEIL
  46126. "muls r7, r6, r7\n\t"
  46127. #elif defined(__clang__)
  46128. "muls r7, r6\n\t"
  46129. #else
  46130. "mul r7, r6\n\t"
  46131. #endif
  46132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46133. "adds r4, r4, r7\n\t"
  46134. #else
  46135. "add r4, r4, r7\n\t"
  46136. #endif
  46137. #ifdef WOLFSSL_KEIL
  46138. "adcs r5, r5, %[r]\n\t"
  46139. #elif defined(__clang__)
  46140. "adcs r5, %[r]\n\t"
  46141. #else
  46142. "adc r5, %[r]\n\t"
  46143. #endif
  46144. "uxth r7, %[b]\n\t"
  46145. #ifdef WOLFSSL_KEIL
  46146. "muls r6, r7, r6\n\t"
  46147. #elif defined(__clang__)
  46148. "muls r6, r7\n\t"
  46149. #else
  46150. "mul r6, r7\n\t"
  46151. #endif
  46152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46153. "lsrs r7, r6, #16\n\t"
  46154. #else
  46155. "lsr r7, r6, #16\n\t"
  46156. #endif
  46157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46158. "lsls r6, r6, #16\n\t"
  46159. #else
  46160. "lsl r6, r6, #16\n\t"
  46161. #endif
  46162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46163. "adds r3, r3, r6\n\t"
  46164. #else
  46165. "add r3, r3, r6\n\t"
  46166. #endif
  46167. #ifdef WOLFSSL_KEIL
  46168. "adcs r4, r4, r7\n\t"
  46169. #elif defined(__clang__)
  46170. "adcs r4, r7\n\t"
  46171. #else
  46172. "adc r4, r7\n\t"
  46173. #endif
  46174. #ifdef WOLFSSL_KEIL
  46175. "adcs r5, r5, %[r]\n\t"
  46176. #elif defined(__clang__)
  46177. "adcs r5, %[r]\n\t"
  46178. #else
  46179. "adc r5, %[r]\n\t"
  46180. #endif
  46181. "# A[9] * B[6]\n\t"
  46182. "mov %[a], r9\n\t"
  46183. "mov %[b], r10\n\t"
  46184. "ldr %[a], [%[a], #36]\n\t"
  46185. "ldr %[b], [%[b], #24]\n\t"
  46186. "uxth r6, %[a]\n\t"
  46187. "uxth r7, %[b]\n\t"
  46188. #ifdef WOLFSSL_KEIL
  46189. "muls r7, r6, r7\n\t"
  46190. #elif defined(__clang__)
  46191. "muls r7, r6\n\t"
  46192. #else
  46193. "mul r7, r6\n\t"
  46194. #endif
  46195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46196. "adds r3, r3, r7\n\t"
  46197. #else
  46198. "add r3, r3, r7\n\t"
  46199. #endif
  46200. #ifdef WOLFSSL_KEIL
  46201. "adcs r4, r4, %[r]\n\t"
  46202. #elif defined(__clang__)
  46203. "adcs r4, %[r]\n\t"
  46204. #else
  46205. "adc r4, %[r]\n\t"
  46206. #endif
  46207. #ifdef WOLFSSL_KEIL
  46208. "adcs r5, r5, %[r]\n\t"
  46209. #elif defined(__clang__)
  46210. "adcs r5, %[r]\n\t"
  46211. #else
  46212. "adc r5, %[r]\n\t"
  46213. #endif
  46214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46215. "lsrs r7, %[b], #16\n\t"
  46216. #else
  46217. "lsr r7, %[b], #16\n\t"
  46218. #endif
  46219. #ifdef WOLFSSL_KEIL
  46220. "muls r6, r7, r6\n\t"
  46221. #elif defined(__clang__)
  46222. "muls r6, r7\n\t"
  46223. #else
  46224. "mul r6, r7\n\t"
  46225. #endif
  46226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46227. "lsrs r7, r6, #16\n\t"
  46228. #else
  46229. "lsr r7, r6, #16\n\t"
  46230. #endif
  46231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46232. "lsls r6, r6, #16\n\t"
  46233. #else
  46234. "lsl r6, r6, #16\n\t"
  46235. #endif
  46236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46237. "adds r3, r3, r6\n\t"
  46238. #else
  46239. "add r3, r3, r6\n\t"
  46240. #endif
  46241. #ifdef WOLFSSL_KEIL
  46242. "adcs r4, r4, r7\n\t"
  46243. #elif defined(__clang__)
  46244. "adcs r4, r7\n\t"
  46245. #else
  46246. "adc r4, r7\n\t"
  46247. #endif
  46248. #ifdef WOLFSSL_KEIL
  46249. "adcs r5, r5, %[r]\n\t"
  46250. #elif defined(__clang__)
  46251. "adcs r5, %[r]\n\t"
  46252. #else
  46253. "adc r5, %[r]\n\t"
  46254. #endif
  46255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46256. "lsrs r6, %[a], #16\n\t"
  46257. #else
  46258. "lsr r6, %[a], #16\n\t"
  46259. #endif
  46260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46261. "lsrs r7, %[b], #16\n\t"
  46262. #else
  46263. "lsr r7, %[b], #16\n\t"
  46264. #endif
  46265. #ifdef WOLFSSL_KEIL
  46266. "muls r7, r6, r7\n\t"
  46267. #elif defined(__clang__)
  46268. "muls r7, r6\n\t"
  46269. #else
  46270. "mul r7, r6\n\t"
  46271. #endif
  46272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46273. "adds r4, r4, r7\n\t"
  46274. #else
  46275. "add r4, r4, r7\n\t"
  46276. #endif
  46277. #ifdef WOLFSSL_KEIL
  46278. "adcs r5, r5, %[r]\n\t"
  46279. #elif defined(__clang__)
  46280. "adcs r5, %[r]\n\t"
  46281. #else
  46282. "adc r5, %[r]\n\t"
  46283. #endif
  46284. "uxth r7, %[b]\n\t"
  46285. #ifdef WOLFSSL_KEIL
  46286. "muls r6, r7, r6\n\t"
  46287. #elif defined(__clang__)
  46288. "muls r6, r7\n\t"
  46289. #else
  46290. "mul r6, r7\n\t"
  46291. #endif
  46292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46293. "lsrs r7, r6, #16\n\t"
  46294. #else
  46295. "lsr r7, r6, #16\n\t"
  46296. #endif
  46297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46298. "lsls r6, r6, #16\n\t"
  46299. #else
  46300. "lsl r6, r6, #16\n\t"
  46301. #endif
  46302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46303. "adds r3, r3, r6\n\t"
  46304. #else
  46305. "add r3, r3, r6\n\t"
  46306. #endif
  46307. #ifdef WOLFSSL_KEIL
  46308. "adcs r4, r4, r7\n\t"
  46309. #elif defined(__clang__)
  46310. "adcs r4, r7\n\t"
  46311. #else
  46312. "adc r4, r7\n\t"
  46313. #endif
  46314. #ifdef WOLFSSL_KEIL
  46315. "adcs r5, r5, %[r]\n\t"
  46316. #elif defined(__clang__)
  46317. "adcs r5, %[r]\n\t"
  46318. #else
  46319. "adc r5, %[r]\n\t"
  46320. #endif
  46321. "# A[10] * B[5]\n\t"
  46322. "mov %[a], r9\n\t"
  46323. "mov %[b], r10\n\t"
  46324. "ldr %[a], [%[a], #40]\n\t"
  46325. "ldr %[b], [%[b], #20]\n\t"
  46326. "uxth r6, %[a]\n\t"
  46327. "uxth r7, %[b]\n\t"
  46328. #ifdef WOLFSSL_KEIL
  46329. "muls r7, r6, r7\n\t"
  46330. #elif defined(__clang__)
  46331. "muls r7, r6\n\t"
  46332. #else
  46333. "mul r7, r6\n\t"
  46334. #endif
  46335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46336. "adds r3, r3, r7\n\t"
  46337. #else
  46338. "add r3, r3, r7\n\t"
  46339. #endif
  46340. #ifdef WOLFSSL_KEIL
  46341. "adcs r4, r4, %[r]\n\t"
  46342. #elif defined(__clang__)
  46343. "adcs r4, %[r]\n\t"
  46344. #else
  46345. "adc r4, %[r]\n\t"
  46346. #endif
  46347. #ifdef WOLFSSL_KEIL
  46348. "adcs r5, r5, %[r]\n\t"
  46349. #elif defined(__clang__)
  46350. "adcs r5, %[r]\n\t"
  46351. #else
  46352. "adc r5, %[r]\n\t"
  46353. #endif
  46354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46355. "lsrs r7, %[b], #16\n\t"
  46356. #else
  46357. "lsr r7, %[b], #16\n\t"
  46358. #endif
  46359. #ifdef WOLFSSL_KEIL
  46360. "muls r6, r7, r6\n\t"
  46361. #elif defined(__clang__)
  46362. "muls r6, r7\n\t"
  46363. #else
  46364. "mul r6, r7\n\t"
  46365. #endif
  46366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46367. "lsrs r7, r6, #16\n\t"
  46368. #else
  46369. "lsr r7, r6, #16\n\t"
  46370. #endif
  46371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46372. "lsls r6, r6, #16\n\t"
  46373. #else
  46374. "lsl r6, r6, #16\n\t"
  46375. #endif
  46376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46377. "adds r3, r3, r6\n\t"
  46378. #else
  46379. "add r3, r3, r6\n\t"
  46380. #endif
  46381. #ifdef WOLFSSL_KEIL
  46382. "adcs r4, r4, r7\n\t"
  46383. #elif defined(__clang__)
  46384. "adcs r4, r7\n\t"
  46385. #else
  46386. "adc r4, r7\n\t"
  46387. #endif
  46388. #ifdef WOLFSSL_KEIL
  46389. "adcs r5, r5, %[r]\n\t"
  46390. #elif defined(__clang__)
  46391. "adcs r5, %[r]\n\t"
  46392. #else
  46393. "adc r5, %[r]\n\t"
  46394. #endif
  46395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46396. "lsrs r6, %[a], #16\n\t"
  46397. #else
  46398. "lsr r6, %[a], #16\n\t"
  46399. #endif
  46400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46401. "lsrs r7, %[b], #16\n\t"
  46402. #else
  46403. "lsr r7, %[b], #16\n\t"
  46404. #endif
  46405. #ifdef WOLFSSL_KEIL
  46406. "muls r7, r6, r7\n\t"
  46407. #elif defined(__clang__)
  46408. "muls r7, r6\n\t"
  46409. #else
  46410. "mul r7, r6\n\t"
  46411. #endif
  46412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46413. "adds r4, r4, r7\n\t"
  46414. #else
  46415. "add r4, r4, r7\n\t"
  46416. #endif
  46417. #ifdef WOLFSSL_KEIL
  46418. "adcs r5, r5, %[r]\n\t"
  46419. #elif defined(__clang__)
  46420. "adcs r5, %[r]\n\t"
  46421. #else
  46422. "adc r5, %[r]\n\t"
  46423. #endif
  46424. "uxth r7, %[b]\n\t"
  46425. #ifdef WOLFSSL_KEIL
  46426. "muls r6, r7, r6\n\t"
  46427. #elif defined(__clang__)
  46428. "muls r6, r7\n\t"
  46429. #else
  46430. "mul r6, r7\n\t"
  46431. #endif
  46432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46433. "lsrs r7, r6, #16\n\t"
  46434. #else
  46435. "lsr r7, r6, #16\n\t"
  46436. #endif
  46437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46438. "lsls r6, r6, #16\n\t"
  46439. #else
  46440. "lsl r6, r6, #16\n\t"
  46441. #endif
  46442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46443. "adds r3, r3, r6\n\t"
  46444. #else
  46445. "add r3, r3, r6\n\t"
  46446. #endif
  46447. #ifdef WOLFSSL_KEIL
  46448. "adcs r4, r4, r7\n\t"
  46449. #elif defined(__clang__)
  46450. "adcs r4, r7\n\t"
  46451. #else
  46452. "adc r4, r7\n\t"
  46453. #endif
  46454. #ifdef WOLFSSL_KEIL
  46455. "adcs r5, r5, %[r]\n\t"
  46456. #elif defined(__clang__)
  46457. "adcs r5, %[r]\n\t"
  46458. #else
  46459. "adc r5, %[r]\n\t"
  46460. #endif
  46461. "# A[11] * B[4]\n\t"
  46462. "mov %[a], r9\n\t"
  46463. "mov %[b], r10\n\t"
  46464. "ldr %[a], [%[a], #44]\n\t"
  46465. "ldr %[b], [%[b], #16]\n\t"
  46466. "uxth r6, %[a]\n\t"
  46467. "uxth r7, %[b]\n\t"
  46468. #ifdef WOLFSSL_KEIL
  46469. "muls r7, r6, r7\n\t"
  46470. #elif defined(__clang__)
  46471. "muls r7, r6\n\t"
  46472. #else
  46473. "mul r7, r6\n\t"
  46474. #endif
  46475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46476. "adds r3, r3, r7\n\t"
  46477. #else
  46478. "add r3, r3, r7\n\t"
  46479. #endif
  46480. #ifdef WOLFSSL_KEIL
  46481. "adcs r4, r4, %[r]\n\t"
  46482. #elif defined(__clang__)
  46483. "adcs r4, %[r]\n\t"
  46484. #else
  46485. "adc r4, %[r]\n\t"
  46486. #endif
  46487. #ifdef WOLFSSL_KEIL
  46488. "adcs r5, r5, %[r]\n\t"
  46489. #elif defined(__clang__)
  46490. "adcs r5, %[r]\n\t"
  46491. #else
  46492. "adc r5, %[r]\n\t"
  46493. #endif
  46494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46495. "lsrs r7, %[b], #16\n\t"
  46496. #else
  46497. "lsr r7, %[b], #16\n\t"
  46498. #endif
  46499. #ifdef WOLFSSL_KEIL
  46500. "muls r6, r7, r6\n\t"
  46501. #elif defined(__clang__)
  46502. "muls r6, r7\n\t"
  46503. #else
  46504. "mul r6, r7\n\t"
  46505. #endif
  46506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46507. "lsrs r7, r6, #16\n\t"
  46508. #else
  46509. "lsr r7, r6, #16\n\t"
  46510. #endif
  46511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46512. "lsls r6, r6, #16\n\t"
  46513. #else
  46514. "lsl r6, r6, #16\n\t"
  46515. #endif
  46516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46517. "adds r3, r3, r6\n\t"
  46518. #else
  46519. "add r3, r3, r6\n\t"
  46520. #endif
  46521. #ifdef WOLFSSL_KEIL
  46522. "adcs r4, r4, r7\n\t"
  46523. #elif defined(__clang__)
  46524. "adcs r4, r7\n\t"
  46525. #else
  46526. "adc r4, r7\n\t"
  46527. #endif
  46528. #ifdef WOLFSSL_KEIL
  46529. "adcs r5, r5, %[r]\n\t"
  46530. #elif defined(__clang__)
  46531. "adcs r5, %[r]\n\t"
  46532. #else
  46533. "adc r5, %[r]\n\t"
  46534. #endif
  46535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46536. "lsrs r6, %[a], #16\n\t"
  46537. #else
  46538. "lsr r6, %[a], #16\n\t"
  46539. #endif
  46540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46541. "lsrs r7, %[b], #16\n\t"
  46542. #else
  46543. "lsr r7, %[b], #16\n\t"
  46544. #endif
  46545. #ifdef WOLFSSL_KEIL
  46546. "muls r7, r6, r7\n\t"
  46547. #elif defined(__clang__)
  46548. "muls r7, r6\n\t"
  46549. #else
  46550. "mul r7, r6\n\t"
  46551. #endif
  46552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46553. "adds r4, r4, r7\n\t"
  46554. #else
  46555. "add r4, r4, r7\n\t"
  46556. #endif
  46557. #ifdef WOLFSSL_KEIL
  46558. "adcs r5, r5, %[r]\n\t"
  46559. #elif defined(__clang__)
  46560. "adcs r5, %[r]\n\t"
  46561. #else
  46562. "adc r5, %[r]\n\t"
  46563. #endif
  46564. "uxth r7, %[b]\n\t"
  46565. #ifdef WOLFSSL_KEIL
  46566. "muls r6, r7, r6\n\t"
  46567. #elif defined(__clang__)
  46568. "muls r6, r7\n\t"
  46569. #else
  46570. "mul r6, r7\n\t"
  46571. #endif
  46572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46573. "lsrs r7, r6, #16\n\t"
  46574. #else
  46575. "lsr r7, r6, #16\n\t"
  46576. #endif
  46577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46578. "lsls r6, r6, #16\n\t"
  46579. #else
  46580. "lsl r6, r6, #16\n\t"
  46581. #endif
  46582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46583. "adds r3, r3, r6\n\t"
  46584. #else
  46585. "add r3, r3, r6\n\t"
  46586. #endif
  46587. #ifdef WOLFSSL_KEIL
  46588. "adcs r4, r4, r7\n\t"
  46589. #elif defined(__clang__)
  46590. "adcs r4, r7\n\t"
  46591. #else
  46592. "adc r4, r7\n\t"
  46593. #endif
  46594. #ifdef WOLFSSL_KEIL
  46595. "adcs r5, r5, %[r]\n\t"
  46596. #elif defined(__clang__)
  46597. "adcs r5, %[r]\n\t"
  46598. #else
  46599. "adc r5, %[r]\n\t"
  46600. #endif
  46601. "mov %[r], r8\n\t"
  46602. "str r3, [%[r], #60]\n\t"
  46603. "movs %[r], #0\n\t"
  46604. "# A[11] * B[5]\n\t"
  46605. "movs r3, #0\n\t"
  46606. "mov %[a], r9\n\t"
  46607. "mov %[b], r10\n\t"
  46608. "ldr %[a], [%[a], #44]\n\t"
  46609. "ldr %[b], [%[b], #20]\n\t"
  46610. "uxth r6, %[a]\n\t"
  46611. "uxth r7, %[b]\n\t"
  46612. #ifdef WOLFSSL_KEIL
  46613. "muls r7, r6, r7\n\t"
  46614. #elif defined(__clang__)
  46615. "muls r7, r6\n\t"
  46616. #else
  46617. "mul r7, r6\n\t"
  46618. #endif
  46619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46620. "adds r4, r4, r7\n\t"
  46621. #else
  46622. "add r4, r4, r7\n\t"
  46623. #endif
  46624. #ifdef WOLFSSL_KEIL
  46625. "adcs r5, r5, %[r]\n\t"
  46626. #elif defined(__clang__)
  46627. "adcs r5, %[r]\n\t"
  46628. #else
  46629. "adc r5, %[r]\n\t"
  46630. #endif
  46631. #ifdef WOLFSSL_KEIL
  46632. "adcs r3, r3, %[r]\n\t"
  46633. #elif defined(__clang__)
  46634. "adcs r3, %[r]\n\t"
  46635. #else
  46636. "adc r3, %[r]\n\t"
  46637. #endif
  46638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46639. "lsrs r7, %[b], #16\n\t"
  46640. #else
  46641. "lsr r7, %[b], #16\n\t"
  46642. #endif
  46643. #ifdef WOLFSSL_KEIL
  46644. "muls r6, r7, r6\n\t"
  46645. #elif defined(__clang__)
  46646. "muls r6, r7\n\t"
  46647. #else
  46648. "mul r6, r7\n\t"
  46649. #endif
  46650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46651. "lsrs r7, r6, #16\n\t"
  46652. #else
  46653. "lsr r7, r6, #16\n\t"
  46654. #endif
  46655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46656. "lsls r6, r6, #16\n\t"
  46657. #else
  46658. "lsl r6, r6, #16\n\t"
  46659. #endif
  46660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46661. "adds r4, r4, r6\n\t"
  46662. #else
  46663. "add r4, r4, r6\n\t"
  46664. #endif
  46665. #ifdef WOLFSSL_KEIL
  46666. "adcs r5, r5, r7\n\t"
  46667. #elif defined(__clang__)
  46668. "adcs r5, r7\n\t"
  46669. #else
  46670. "adc r5, r7\n\t"
  46671. #endif
  46672. #ifdef WOLFSSL_KEIL
  46673. "adcs r3, r3, %[r]\n\t"
  46674. #elif defined(__clang__)
  46675. "adcs r3, %[r]\n\t"
  46676. #else
  46677. "adc r3, %[r]\n\t"
  46678. #endif
  46679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46680. "lsrs r6, %[a], #16\n\t"
  46681. #else
  46682. "lsr r6, %[a], #16\n\t"
  46683. #endif
  46684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46685. "lsrs r7, %[b], #16\n\t"
  46686. #else
  46687. "lsr r7, %[b], #16\n\t"
  46688. #endif
  46689. #ifdef WOLFSSL_KEIL
  46690. "muls r7, r6, r7\n\t"
  46691. #elif defined(__clang__)
  46692. "muls r7, r6\n\t"
  46693. #else
  46694. "mul r7, r6\n\t"
  46695. #endif
  46696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46697. "adds r5, r5, r7\n\t"
  46698. #else
  46699. "add r5, r5, r7\n\t"
  46700. #endif
  46701. #ifdef WOLFSSL_KEIL
  46702. "adcs r3, r3, %[r]\n\t"
  46703. #elif defined(__clang__)
  46704. "adcs r3, %[r]\n\t"
  46705. #else
  46706. "adc r3, %[r]\n\t"
  46707. #endif
  46708. "uxth r7, %[b]\n\t"
  46709. #ifdef WOLFSSL_KEIL
  46710. "muls r6, r7, r6\n\t"
  46711. #elif defined(__clang__)
  46712. "muls r6, r7\n\t"
  46713. #else
  46714. "mul r6, r7\n\t"
  46715. #endif
  46716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46717. "lsrs r7, r6, #16\n\t"
  46718. #else
  46719. "lsr r7, r6, #16\n\t"
  46720. #endif
  46721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46722. "lsls r6, r6, #16\n\t"
  46723. #else
  46724. "lsl r6, r6, #16\n\t"
  46725. #endif
  46726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46727. "adds r4, r4, r6\n\t"
  46728. #else
  46729. "add r4, r4, r6\n\t"
  46730. #endif
  46731. #ifdef WOLFSSL_KEIL
  46732. "adcs r5, r5, r7\n\t"
  46733. #elif defined(__clang__)
  46734. "adcs r5, r7\n\t"
  46735. #else
  46736. "adc r5, r7\n\t"
  46737. #endif
  46738. #ifdef WOLFSSL_KEIL
  46739. "adcs r3, r3, %[r]\n\t"
  46740. #elif defined(__clang__)
  46741. "adcs r3, %[r]\n\t"
  46742. #else
  46743. "adc r3, %[r]\n\t"
  46744. #endif
  46745. "# A[10] * B[6]\n\t"
  46746. "mov %[a], r9\n\t"
  46747. "mov %[b], r10\n\t"
  46748. "ldr %[a], [%[a], #40]\n\t"
  46749. "ldr %[b], [%[b], #24]\n\t"
  46750. "uxth r6, %[a]\n\t"
  46751. "uxth r7, %[b]\n\t"
  46752. #ifdef WOLFSSL_KEIL
  46753. "muls r7, r6, r7\n\t"
  46754. #elif defined(__clang__)
  46755. "muls r7, r6\n\t"
  46756. #else
  46757. "mul r7, r6\n\t"
  46758. #endif
  46759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46760. "adds r4, r4, r7\n\t"
  46761. #else
  46762. "add r4, r4, r7\n\t"
  46763. #endif
  46764. #ifdef WOLFSSL_KEIL
  46765. "adcs r5, r5, %[r]\n\t"
  46766. #elif defined(__clang__)
  46767. "adcs r5, %[r]\n\t"
  46768. #else
  46769. "adc r5, %[r]\n\t"
  46770. #endif
  46771. #ifdef WOLFSSL_KEIL
  46772. "adcs r3, r3, %[r]\n\t"
  46773. #elif defined(__clang__)
  46774. "adcs r3, %[r]\n\t"
  46775. #else
  46776. "adc r3, %[r]\n\t"
  46777. #endif
  46778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46779. "lsrs r7, %[b], #16\n\t"
  46780. #else
  46781. "lsr r7, %[b], #16\n\t"
  46782. #endif
  46783. #ifdef WOLFSSL_KEIL
  46784. "muls r6, r7, r6\n\t"
  46785. #elif defined(__clang__)
  46786. "muls r6, r7\n\t"
  46787. #else
  46788. "mul r6, r7\n\t"
  46789. #endif
  46790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46791. "lsrs r7, r6, #16\n\t"
  46792. #else
  46793. "lsr r7, r6, #16\n\t"
  46794. #endif
  46795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46796. "lsls r6, r6, #16\n\t"
  46797. #else
  46798. "lsl r6, r6, #16\n\t"
  46799. #endif
  46800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46801. "adds r4, r4, r6\n\t"
  46802. #else
  46803. "add r4, r4, r6\n\t"
  46804. #endif
  46805. #ifdef WOLFSSL_KEIL
  46806. "adcs r5, r5, r7\n\t"
  46807. #elif defined(__clang__)
  46808. "adcs r5, r7\n\t"
  46809. #else
  46810. "adc r5, r7\n\t"
  46811. #endif
  46812. #ifdef WOLFSSL_KEIL
  46813. "adcs r3, r3, %[r]\n\t"
  46814. #elif defined(__clang__)
  46815. "adcs r3, %[r]\n\t"
  46816. #else
  46817. "adc r3, %[r]\n\t"
  46818. #endif
  46819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46820. "lsrs r6, %[a], #16\n\t"
  46821. #else
  46822. "lsr r6, %[a], #16\n\t"
  46823. #endif
  46824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46825. "lsrs r7, %[b], #16\n\t"
  46826. #else
  46827. "lsr r7, %[b], #16\n\t"
  46828. #endif
  46829. #ifdef WOLFSSL_KEIL
  46830. "muls r7, r6, r7\n\t"
  46831. #elif defined(__clang__)
  46832. "muls r7, r6\n\t"
  46833. #else
  46834. "mul r7, r6\n\t"
  46835. #endif
  46836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46837. "adds r5, r5, r7\n\t"
  46838. #else
  46839. "add r5, r5, r7\n\t"
  46840. #endif
  46841. #ifdef WOLFSSL_KEIL
  46842. "adcs r3, r3, %[r]\n\t"
  46843. #elif defined(__clang__)
  46844. "adcs r3, %[r]\n\t"
  46845. #else
  46846. "adc r3, %[r]\n\t"
  46847. #endif
  46848. "uxth r7, %[b]\n\t"
  46849. #ifdef WOLFSSL_KEIL
  46850. "muls r6, r7, r6\n\t"
  46851. #elif defined(__clang__)
  46852. "muls r6, r7\n\t"
  46853. #else
  46854. "mul r6, r7\n\t"
  46855. #endif
  46856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46857. "lsrs r7, r6, #16\n\t"
  46858. #else
  46859. "lsr r7, r6, #16\n\t"
  46860. #endif
  46861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46862. "lsls r6, r6, #16\n\t"
  46863. #else
  46864. "lsl r6, r6, #16\n\t"
  46865. #endif
  46866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46867. "adds r4, r4, r6\n\t"
  46868. #else
  46869. "add r4, r4, r6\n\t"
  46870. #endif
  46871. #ifdef WOLFSSL_KEIL
  46872. "adcs r5, r5, r7\n\t"
  46873. #elif defined(__clang__)
  46874. "adcs r5, r7\n\t"
  46875. #else
  46876. "adc r5, r7\n\t"
  46877. #endif
  46878. #ifdef WOLFSSL_KEIL
  46879. "adcs r3, r3, %[r]\n\t"
  46880. #elif defined(__clang__)
  46881. "adcs r3, %[r]\n\t"
  46882. #else
  46883. "adc r3, %[r]\n\t"
  46884. #endif
  46885. "# A[9] * B[7]\n\t"
  46886. "mov %[a], r9\n\t"
  46887. "mov %[b], r10\n\t"
  46888. "ldr %[a], [%[a], #36]\n\t"
  46889. "ldr %[b], [%[b], #28]\n\t"
  46890. "uxth r6, %[a]\n\t"
  46891. "uxth r7, %[b]\n\t"
  46892. #ifdef WOLFSSL_KEIL
  46893. "muls r7, r6, r7\n\t"
  46894. #elif defined(__clang__)
  46895. "muls r7, r6\n\t"
  46896. #else
  46897. "mul r7, r6\n\t"
  46898. #endif
  46899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46900. "adds r4, r4, r7\n\t"
  46901. #else
  46902. "add r4, r4, r7\n\t"
  46903. #endif
  46904. #ifdef WOLFSSL_KEIL
  46905. "adcs r5, r5, %[r]\n\t"
  46906. #elif defined(__clang__)
  46907. "adcs r5, %[r]\n\t"
  46908. #else
  46909. "adc r5, %[r]\n\t"
  46910. #endif
  46911. #ifdef WOLFSSL_KEIL
  46912. "adcs r3, r3, %[r]\n\t"
  46913. #elif defined(__clang__)
  46914. "adcs r3, %[r]\n\t"
  46915. #else
  46916. "adc r3, %[r]\n\t"
  46917. #endif
  46918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46919. "lsrs r7, %[b], #16\n\t"
  46920. #else
  46921. "lsr r7, %[b], #16\n\t"
  46922. #endif
  46923. #ifdef WOLFSSL_KEIL
  46924. "muls r6, r7, r6\n\t"
  46925. #elif defined(__clang__)
  46926. "muls r6, r7\n\t"
  46927. #else
  46928. "mul r6, r7\n\t"
  46929. #endif
  46930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46931. "lsrs r7, r6, #16\n\t"
  46932. #else
  46933. "lsr r7, r6, #16\n\t"
  46934. #endif
  46935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46936. "lsls r6, r6, #16\n\t"
  46937. #else
  46938. "lsl r6, r6, #16\n\t"
  46939. #endif
  46940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46941. "adds r4, r4, r6\n\t"
  46942. #else
  46943. "add r4, r4, r6\n\t"
  46944. #endif
  46945. #ifdef WOLFSSL_KEIL
  46946. "adcs r5, r5, r7\n\t"
  46947. #elif defined(__clang__)
  46948. "adcs r5, r7\n\t"
  46949. #else
  46950. "adc r5, r7\n\t"
  46951. #endif
  46952. #ifdef WOLFSSL_KEIL
  46953. "adcs r3, r3, %[r]\n\t"
  46954. #elif defined(__clang__)
  46955. "adcs r3, %[r]\n\t"
  46956. #else
  46957. "adc r3, %[r]\n\t"
  46958. #endif
  46959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46960. "lsrs r6, %[a], #16\n\t"
  46961. #else
  46962. "lsr r6, %[a], #16\n\t"
  46963. #endif
  46964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46965. "lsrs r7, %[b], #16\n\t"
  46966. #else
  46967. "lsr r7, %[b], #16\n\t"
  46968. #endif
  46969. #ifdef WOLFSSL_KEIL
  46970. "muls r7, r6, r7\n\t"
  46971. #elif defined(__clang__)
  46972. "muls r7, r6\n\t"
  46973. #else
  46974. "mul r7, r6\n\t"
  46975. #endif
  46976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46977. "adds r5, r5, r7\n\t"
  46978. #else
  46979. "add r5, r5, r7\n\t"
  46980. #endif
  46981. #ifdef WOLFSSL_KEIL
  46982. "adcs r3, r3, %[r]\n\t"
  46983. #elif defined(__clang__)
  46984. "adcs r3, %[r]\n\t"
  46985. #else
  46986. "adc r3, %[r]\n\t"
  46987. #endif
  46988. "uxth r7, %[b]\n\t"
  46989. #ifdef WOLFSSL_KEIL
  46990. "muls r6, r7, r6\n\t"
  46991. #elif defined(__clang__)
  46992. "muls r6, r7\n\t"
  46993. #else
  46994. "mul r6, r7\n\t"
  46995. #endif
  46996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  46997. "lsrs r7, r6, #16\n\t"
  46998. #else
  46999. "lsr r7, r6, #16\n\t"
  47000. #endif
  47001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47002. "lsls r6, r6, #16\n\t"
  47003. #else
  47004. "lsl r6, r6, #16\n\t"
  47005. #endif
  47006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47007. "adds r4, r4, r6\n\t"
  47008. #else
  47009. "add r4, r4, r6\n\t"
  47010. #endif
  47011. #ifdef WOLFSSL_KEIL
  47012. "adcs r5, r5, r7\n\t"
  47013. #elif defined(__clang__)
  47014. "adcs r5, r7\n\t"
  47015. #else
  47016. "adc r5, r7\n\t"
  47017. #endif
  47018. #ifdef WOLFSSL_KEIL
  47019. "adcs r3, r3, %[r]\n\t"
  47020. #elif defined(__clang__)
  47021. "adcs r3, %[r]\n\t"
  47022. #else
  47023. "adc r3, %[r]\n\t"
  47024. #endif
  47025. "# A[8] * B[8]\n\t"
  47026. "mov %[a], r9\n\t"
  47027. "mov %[b], r10\n\t"
  47028. "ldr %[a], [%[a], #32]\n\t"
  47029. "ldr %[b], [%[b], #32]\n\t"
  47030. "uxth r6, %[a]\n\t"
  47031. "uxth r7, %[b]\n\t"
  47032. #ifdef WOLFSSL_KEIL
  47033. "muls r7, r6, r7\n\t"
  47034. #elif defined(__clang__)
  47035. "muls r7, r6\n\t"
  47036. #else
  47037. "mul r7, r6\n\t"
  47038. #endif
  47039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47040. "adds r4, r4, r7\n\t"
  47041. #else
  47042. "add r4, r4, r7\n\t"
  47043. #endif
  47044. #ifdef WOLFSSL_KEIL
  47045. "adcs r5, r5, %[r]\n\t"
  47046. #elif defined(__clang__)
  47047. "adcs r5, %[r]\n\t"
  47048. #else
  47049. "adc r5, %[r]\n\t"
  47050. #endif
  47051. #ifdef WOLFSSL_KEIL
  47052. "adcs r3, r3, %[r]\n\t"
  47053. #elif defined(__clang__)
  47054. "adcs r3, %[r]\n\t"
  47055. #else
  47056. "adc r3, %[r]\n\t"
  47057. #endif
  47058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47059. "lsrs r7, %[b], #16\n\t"
  47060. #else
  47061. "lsr r7, %[b], #16\n\t"
  47062. #endif
  47063. #ifdef WOLFSSL_KEIL
  47064. "muls r6, r7, r6\n\t"
  47065. #elif defined(__clang__)
  47066. "muls r6, r7\n\t"
  47067. #else
  47068. "mul r6, r7\n\t"
  47069. #endif
  47070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47071. "lsrs r7, r6, #16\n\t"
  47072. #else
  47073. "lsr r7, r6, #16\n\t"
  47074. #endif
  47075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47076. "lsls r6, r6, #16\n\t"
  47077. #else
  47078. "lsl r6, r6, #16\n\t"
  47079. #endif
  47080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47081. "adds r4, r4, r6\n\t"
  47082. #else
  47083. "add r4, r4, r6\n\t"
  47084. #endif
  47085. #ifdef WOLFSSL_KEIL
  47086. "adcs r5, r5, r7\n\t"
  47087. #elif defined(__clang__)
  47088. "adcs r5, r7\n\t"
  47089. #else
  47090. "adc r5, r7\n\t"
  47091. #endif
  47092. #ifdef WOLFSSL_KEIL
  47093. "adcs r3, r3, %[r]\n\t"
  47094. #elif defined(__clang__)
  47095. "adcs r3, %[r]\n\t"
  47096. #else
  47097. "adc r3, %[r]\n\t"
  47098. #endif
  47099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47100. "lsrs r6, %[a], #16\n\t"
  47101. #else
  47102. "lsr r6, %[a], #16\n\t"
  47103. #endif
  47104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47105. "lsrs r7, %[b], #16\n\t"
  47106. #else
  47107. "lsr r7, %[b], #16\n\t"
  47108. #endif
  47109. #ifdef WOLFSSL_KEIL
  47110. "muls r7, r6, r7\n\t"
  47111. #elif defined(__clang__)
  47112. "muls r7, r6\n\t"
  47113. #else
  47114. "mul r7, r6\n\t"
  47115. #endif
  47116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47117. "adds r5, r5, r7\n\t"
  47118. #else
  47119. "add r5, r5, r7\n\t"
  47120. #endif
  47121. #ifdef WOLFSSL_KEIL
  47122. "adcs r3, r3, %[r]\n\t"
  47123. #elif defined(__clang__)
  47124. "adcs r3, %[r]\n\t"
  47125. #else
  47126. "adc r3, %[r]\n\t"
  47127. #endif
  47128. "uxth r7, %[b]\n\t"
  47129. #ifdef WOLFSSL_KEIL
  47130. "muls r6, r7, r6\n\t"
  47131. #elif defined(__clang__)
  47132. "muls r6, r7\n\t"
  47133. #else
  47134. "mul r6, r7\n\t"
  47135. #endif
  47136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47137. "lsrs r7, r6, #16\n\t"
  47138. #else
  47139. "lsr r7, r6, #16\n\t"
  47140. #endif
  47141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47142. "lsls r6, r6, #16\n\t"
  47143. #else
  47144. "lsl r6, r6, #16\n\t"
  47145. #endif
  47146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47147. "adds r4, r4, r6\n\t"
  47148. #else
  47149. "add r4, r4, r6\n\t"
  47150. #endif
  47151. #ifdef WOLFSSL_KEIL
  47152. "adcs r5, r5, r7\n\t"
  47153. #elif defined(__clang__)
  47154. "adcs r5, r7\n\t"
  47155. #else
  47156. "adc r5, r7\n\t"
  47157. #endif
  47158. #ifdef WOLFSSL_KEIL
  47159. "adcs r3, r3, %[r]\n\t"
  47160. #elif defined(__clang__)
  47161. "adcs r3, %[r]\n\t"
  47162. #else
  47163. "adc r3, %[r]\n\t"
  47164. #endif
  47165. "# A[7] * B[9]\n\t"
  47166. "mov %[a], r9\n\t"
  47167. "mov %[b], r10\n\t"
  47168. "ldr %[a], [%[a], #28]\n\t"
  47169. "ldr %[b], [%[b], #36]\n\t"
  47170. "uxth r6, %[a]\n\t"
  47171. "uxth r7, %[b]\n\t"
  47172. #ifdef WOLFSSL_KEIL
  47173. "muls r7, r6, r7\n\t"
  47174. #elif defined(__clang__)
  47175. "muls r7, r6\n\t"
  47176. #else
  47177. "mul r7, r6\n\t"
  47178. #endif
  47179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47180. "adds r4, r4, r7\n\t"
  47181. #else
  47182. "add r4, r4, r7\n\t"
  47183. #endif
  47184. #ifdef WOLFSSL_KEIL
  47185. "adcs r5, r5, %[r]\n\t"
  47186. #elif defined(__clang__)
  47187. "adcs r5, %[r]\n\t"
  47188. #else
  47189. "adc r5, %[r]\n\t"
  47190. #endif
  47191. #ifdef WOLFSSL_KEIL
  47192. "adcs r3, r3, %[r]\n\t"
  47193. #elif defined(__clang__)
  47194. "adcs r3, %[r]\n\t"
  47195. #else
  47196. "adc r3, %[r]\n\t"
  47197. #endif
  47198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47199. "lsrs r7, %[b], #16\n\t"
  47200. #else
  47201. "lsr r7, %[b], #16\n\t"
  47202. #endif
  47203. #ifdef WOLFSSL_KEIL
  47204. "muls r6, r7, r6\n\t"
  47205. #elif defined(__clang__)
  47206. "muls r6, r7\n\t"
  47207. #else
  47208. "mul r6, r7\n\t"
  47209. #endif
  47210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47211. "lsrs r7, r6, #16\n\t"
  47212. #else
  47213. "lsr r7, r6, #16\n\t"
  47214. #endif
  47215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47216. "lsls r6, r6, #16\n\t"
  47217. #else
  47218. "lsl r6, r6, #16\n\t"
  47219. #endif
  47220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47221. "adds r4, r4, r6\n\t"
  47222. #else
  47223. "add r4, r4, r6\n\t"
  47224. #endif
  47225. #ifdef WOLFSSL_KEIL
  47226. "adcs r5, r5, r7\n\t"
  47227. #elif defined(__clang__)
  47228. "adcs r5, r7\n\t"
  47229. #else
  47230. "adc r5, r7\n\t"
  47231. #endif
  47232. #ifdef WOLFSSL_KEIL
  47233. "adcs r3, r3, %[r]\n\t"
  47234. #elif defined(__clang__)
  47235. "adcs r3, %[r]\n\t"
  47236. #else
  47237. "adc r3, %[r]\n\t"
  47238. #endif
  47239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47240. "lsrs r6, %[a], #16\n\t"
  47241. #else
  47242. "lsr r6, %[a], #16\n\t"
  47243. #endif
  47244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47245. "lsrs r7, %[b], #16\n\t"
  47246. #else
  47247. "lsr r7, %[b], #16\n\t"
  47248. #endif
  47249. #ifdef WOLFSSL_KEIL
  47250. "muls r7, r6, r7\n\t"
  47251. #elif defined(__clang__)
  47252. "muls r7, r6\n\t"
  47253. #else
  47254. "mul r7, r6\n\t"
  47255. #endif
  47256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47257. "adds r5, r5, r7\n\t"
  47258. #else
  47259. "add r5, r5, r7\n\t"
  47260. #endif
  47261. #ifdef WOLFSSL_KEIL
  47262. "adcs r3, r3, %[r]\n\t"
  47263. #elif defined(__clang__)
  47264. "adcs r3, %[r]\n\t"
  47265. #else
  47266. "adc r3, %[r]\n\t"
  47267. #endif
  47268. "uxth r7, %[b]\n\t"
  47269. #ifdef WOLFSSL_KEIL
  47270. "muls r6, r7, r6\n\t"
  47271. #elif defined(__clang__)
  47272. "muls r6, r7\n\t"
  47273. #else
  47274. "mul r6, r7\n\t"
  47275. #endif
  47276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47277. "lsrs r7, r6, #16\n\t"
  47278. #else
  47279. "lsr r7, r6, #16\n\t"
  47280. #endif
  47281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47282. "lsls r6, r6, #16\n\t"
  47283. #else
  47284. "lsl r6, r6, #16\n\t"
  47285. #endif
  47286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47287. "adds r4, r4, r6\n\t"
  47288. #else
  47289. "add r4, r4, r6\n\t"
  47290. #endif
  47291. #ifdef WOLFSSL_KEIL
  47292. "adcs r5, r5, r7\n\t"
  47293. #elif defined(__clang__)
  47294. "adcs r5, r7\n\t"
  47295. #else
  47296. "adc r5, r7\n\t"
  47297. #endif
  47298. #ifdef WOLFSSL_KEIL
  47299. "adcs r3, r3, %[r]\n\t"
  47300. #elif defined(__clang__)
  47301. "adcs r3, %[r]\n\t"
  47302. #else
  47303. "adc r3, %[r]\n\t"
  47304. #endif
  47305. "# A[6] * B[10]\n\t"
  47306. "mov %[a], r9\n\t"
  47307. "mov %[b], r10\n\t"
  47308. "ldr %[a], [%[a], #24]\n\t"
  47309. "ldr %[b], [%[b], #40]\n\t"
  47310. "uxth r6, %[a]\n\t"
  47311. "uxth r7, %[b]\n\t"
  47312. #ifdef WOLFSSL_KEIL
  47313. "muls r7, r6, r7\n\t"
  47314. #elif defined(__clang__)
  47315. "muls r7, r6\n\t"
  47316. #else
  47317. "mul r7, r6\n\t"
  47318. #endif
  47319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47320. "adds r4, r4, r7\n\t"
  47321. #else
  47322. "add r4, r4, r7\n\t"
  47323. #endif
  47324. #ifdef WOLFSSL_KEIL
  47325. "adcs r5, r5, %[r]\n\t"
  47326. #elif defined(__clang__)
  47327. "adcs r5, %[r]\n\t"
  47328. #else
  47329. "adc r5, %[r]\n\t"
  47330. #endif
  47331. #ifdef WOLFSSL_KEIL
  47332. "adcs r3, r3, %[r]\n\t"
  47333. #elif defined(__clang__)
  47334. "adcs r3, %[r]\n\t"
  47335. #else
  47336. "adc r3, %[r]\n\t"
  47337. #endif
  47338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47339. "lsrs r7, %[b], #16\n\t"
  47340. #else
  47341. "lsr r7, %[b], #16\n\t"
  47342. #endif
  47343. #ifdef WOLFSSL_KEIL
  47344. "muls r6, r7, r6\n\t"
  47345. #elif defined(__clang__)
  47346. "muls r6, r7\n\t"
  47347. #else
  47348. "mul r6, r7\n\t"
  47349. #endif
  47350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47351. "lsrs r7, r6, #16\n\t"
  47352. #else
  47353. "lsr r7, r6, #16\n\t"
  47354. #endif
  47355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47356. "lsls r6, r6, #16\n\t"
  47357. #else
  47358. "lsl r6, r6, #16\n\t"
  47359. #endif
  47360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47361. "adds r4, r4, r6\n\t"
  47362. #else
  47363. "add r4, r4, r6\n\t"
  47364. #endif
  47365. #ifdef WOLFSSL_KEIL
  47366. "adcs r5, r5, r7\n\t"
  47367. #elif defined(__clang__)
  47368. "adcs r5, r7\n\t"
  47369. #else
  47370. "adc r5, r7\n\t"
  47371. #endif
  47372. #ifdef WOLFSSL_KEIL
  47373. "adcs r3, r3, %[r]\n\t"
  47374. #elif defined(__clang__)
  47375. "adcs r3, %[r]\n\t"
  47376. #else
  47377. "adc r3, %[r]\n\t"
  47378. #endif
  47379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47380. "lsrs r6, %[a], #16\n\t"
  47381. #else
  47382. "lsr r6, %[a], #16\n\t"
  47383. #endif
  47384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47385. "lsrs r7, %[b], #16\n\t"
  47386. #else
  47387. "lsr r7, %[b], #16\n\t"
  47388. #endif
  47389. #ifdef WOLFSSL_KEIL
  47390. "muls r7, r6, r7\n\t"
  47391. #elif defined(__clang__)
  47392. "muls r7, r6\n\t"
  47393. #else
  47394. "mul r7, r6\n\t"
  47395. #endif
  47396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47397. "adds r5, r5, r7\n\t"
  47398. #else
  47399. "add r5, r5, r7\n\t"
  47400. #endif
  47401. #ifdef WOLFSSL_KEIL
  47402. "adcs r3, r3, %[r]\n\t"
  47403. #elif defined(__clang__)
  47404. "adcs r3, %[r]\n\t"
  47405. #else
  47406. "adc r3, %[r]\n\t"
  47407. #endif
  47408. "uxth r7, %[b]\n\t"
  47409. #ifdef WOLFSSL_KEIL
  47410. "muls r6, r7, r6\n\t"
  47411. #elif defined(__clang__)
  47412. "muls r6, r7\n\t"
  47413. #else
  47414. "mul r6, r7\n\t"
  47415. #endif
  47416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47417. "lsrs r7, r6, #16\n\t"
  47418. #else
  47419. "lsr r7, r6, #16\n\t"
  47420. #endif
  47421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47422. "lsls r6, r6, #16\n\t"
  47423. #else
  47424. "lsl r6, r6, #16\n\t"
  47425. #endif
  47426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47427. "adds r4, r4, r6\n\t"
  47428. #else
  47429. "add r4, r4, r6\n\t"
  47430. #endif
  47431. #ifdef WOLFSSL_KEIL
  47432. "adcs r5, r5, r7\n\t"
  47433. #elif defined(__clang__)
  47434. "adcs r5, r7\n\t"
  47435. #else
  47436. "adc r5, r7\n\t"
  47437. #endif
  47438. #ifdef WOLFSSL_KEIL
  47439. "adcs r3, r3, %[r]\n\t"
  47440. #elif defined(__clang__)
  47441. "adcs r3, %[r]\n\t"
  47442. #else
  47443. "adc r3, %[r]\n\t"
  47444. #endif
  47445. "# A[5] * B[11]\n\t"
  47446. "mov %[a], r9\n\t"
  47447. "mov %[b], r10\n\t"
  47448. "ldr %[a], [%[a], #20]\n\t"
  47449. "ldr %[b], [%[b], #44]\n\t"
  47450. "uxth r6, %[a]\n\t"
  47451. "uxth r7, %[b]\n\t"
  47452. #ifdef WOLFSSL_KEIL
  47453. "muls r7, r6, r7\n\t"
  47454. #elif defined(__clang__)
  47455. "muls r7, r6\n\t"
  47456. #else
  47457. "mul r7, r6\n\t"
  47458. #endif
  47459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47460. "adds r4, r4, r7\n\t"
  47461. #else
  47462. "add r4, r4, r7\n\t"
  47463. #endif
  47464. #ifdef WOLFSSL_KEIL
  47465. "adcs r5, r5, %[r]\n\t"
  47466. #elif defined(__clang__)
  47467. "adcs r5, %[r]\n\t"
  47468. #else
  47469. "adc r5, %[r]\n\t"
  47470. #endif
  47471. #ifdef WOLFSSL_KEIL
  47472. "adcs r3, r3, %[r]\n\t"
  47473. #elif defined(__clang__)
  47474. "adcs r3, %[r]\n\t"
  47475. #else
  47476. "adc r3, %[r]\n\t"
  47477. #endif
  47478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47479. "lsrs r7, %[b], #16\n\t"
  47480. #else
  47481. "lsr r7, %[b], #16\n\t"
  47482. #endif
  47483. #ifdef WOLFSSL_KEIL
  47484. "muls r6, r7, r6\n\t"
  47485. #elif defined(__clang__)
  47486. "muls r6, r7\n\t"
  47487. #else
  47488. "mul r6, r7\n\t"
  47489. #endif
  47490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47491. "lsrs r7, r6, #16\n\t"
  47492. #else
  47493. "lsr r7, r6, #16\n\t"
  47494. #endif
  47495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47496. "lsls r6, r6, #16\n\t"
  47497. #else
  47498. "lsl r6, r6, #16\n\t"
  47499. #endif
  47500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47501. "adds r4, r4, r6\n\t"
  47502. #else
  47503. "add r4, r4, r6\n\t"
  47504. #endif
  47505. #ifdef WOLFSSL_KEIL
  47506. "adcs r5, r5, r7\n\t"
  47507. #elif defined(__clang__)
  47508. "adcs r5, r7\n\t"
  47509. #else
  47510. "adc r5, r7\n\t"
  47511. #endif
  47512. #ifdef WOLFSSL_KEIL
  47513. "adcs r3, r3, %[r]\n\t"
  47514. #elif defined(__clang__)
  47515. "adcs r3, %[r]\n\t"
  47516. #else
  47517. "adc r3, %[r]\n\t"
  47518. #endif
  47519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47520. "lsrs r6, %[a], #16\n\t"
  47521. #else
  47522. "lsr r6, %[a], #16\n\t"
  47523. #endif
  47524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47525. "lsrs r7, %[b], #16\n\t"
  47526. #else
  47527. "lsr r7, %[b], #16\n\t"
  47528. #endif
  47529. #ifdef WOLFSSL_KEIL
  47530. "muls r7, r6, r7\n\t"
  47531. #elif defined(__clang__)
  47532. "muls r7, r6\n\t"
  47533. #else
  47534. "mul r7, r6\n\t"
  47535. #endif
  47536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47537. "adds r5, r5, r7\n\t"
  47538. #else
  47539. "add r5, r5, r7\n\t"
  47540. #endif
  47541. #ifdef WOLFSSL_KEIL
  47542. "adcs r3, r3, %[r]\n\t"
  47543. #elif defined(__clang__)
  47544. "adcs r3, %[r]\n\t"
  47545. #else
  47546. "adc r3, %[r]\n\t"
  47547. #endif
  47548. "uxth r7, %[b]\n\t"
  47549. #ifdef WOLFSSL_KEIL
  47550. "muls r6, r7, r6\n\t"
  47551. #elif defined(__clang__)
  47552. "muls r6, r7\n\t"
  47553. #else
  47554. "mul r6, r7\n\t"
  47555. #endif
  47556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47557. "lsrs r7, r6, #16\n\t"
  47558. #else
  47559. "lsr r7, r6, #16\n\t"
  47560. #endif
  47561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47562. "lsls r6, r6, #16\n\t"
  47563. #else
  47564. "lsl r6, r6, #16\n\t"
  47565. #endif
  47566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47567. "adds r4, r4, r6\n\t"
  47568. #else
  47569. "add r4, r4, r6\n\t"
  47570. #endif
  47571. #ifdef WOLFSSL_KEIL
  47572. "adcs r5, r5, r7\n\t"
  47573. #elif defined(__clang__)
  47574. "adcs r5, r7\n\t"
  47575. #else
  47576. "adc r5, r7\n\t"
  47577. #endif
  47578. #ifdef WOLFSSL_KEIL
  47579. "adcs r3, r3, %[r]\n\t"
  47580. #elif defined(__clang__)
  47581. "adcs r3, %[r]\n\t"
  47582. #else
  47583. "adc r3, %[r]\n\t"
  47584. #endif
  47585. "mov %[r], r8\n\t"
  47586. "str r4, [%[r], #64]\n\t"
  47587. "movs %[r], #0\n\t"
  47588. "# A[6] * B[11]\n\t"
  47589. "movs r4, #0\n\t"
  47590. "mov %[a], r9\n\t"
  47591. "mov %[b], r10\n\t"
  47592. "ldr %[a], [%[a], #24]\n\t"
  47593. "ldr %[b], [%[b], #44]\n\t"
  47594. "uxth r6, %[a]\n\t"
  47595. "uxth r7, %[b]\n\t"
  47596. #ifdef WOLFSSL_KEIL
  47597. "muls r7, r6, r7\n\t"
  47598. #elif defined(__clang__)
  47599. "muls r7, r6\n\t"
  47600. #else
  47601. "mul r7, r6\n\t"
  47602. #endif
  47603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47604. "adds r5, r5, r7\n\t"
  47605. #else
  47606. "add r5, r5, r7\n\t"
  47607. #endif
  47608. #ifdef WOLFSSL_KEIL
  47609. "adcs r3, r3, %[r]\n\t"
  47610. #elif defined(__clang__)
  47611. "adcs r3, %[r]\n\t"
  47612. #else
  47613. "adc r3, %[r]\n\t"
  47614. #endif
  47615. #ifdef WOLFSSL_KEIL
  47616. "adcs r4, r4, %[r]\n\t"
  47617. #elif defined(__clang__)
  47618. "adcs r4, %[r]\n\t"
  47619. #else
  47620. "adc r4, %[r]\n\t"
  47621. #endif
  47622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47623. "lsrs r7, %[b], #16\n\t"
  47624. #else
  47625. "lsr r7, %[b], #16\n\t"
  47626. #endif
  47627. #ifdef WOLFSSL_KEIL
  47628. "muls r6, r7, r6\n\t"
  47629. #elif defined(__clang__)
  47630. "muls r6, r7\n\t"
  47631. #else
  47632. "mul r6, r7\n\t"
  47633. #endif
  47634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47635. "lsrs r7, r6, #16\n\t"
  47636. #else
  47637. "lsr r7, r6, #16\n\t"
  47638. #endif
  47639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47640. "lsls r6, r6, #16\n\t"
  47641. #else
  47642. "lsl r6, r6, #16\n\t"
  47643. #endif
  47644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47645. "adds r5, r5, r6\n\t"
  47646. #else
  47647. "add r5, r5, r6\n\t"
  47648. #endif
  47649. #ifdef WOLFSSL_KEIL
  47650. "adcs r3, r3, r7\n\t"
  47651. #elif defined(__clang__)
  47652. "adcs r3, r7\n\t"
  47653. #else
  47654. "adc r3, r7\n\t"
  47655. #endif
  47656. #ifdef WOLFSSL_KEIL
  47657. "adcs r4, r4, %[r]\n\t"
  47658. #elif defined(__clang__)
  47659. "adcs r4, %[r]\n\t"
  47660. #else
  47661. "adc r4, %[r]\n\t"
  47662. #endif
  47663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47664. "lsrs r6, %[a], #16\n\t"
  47665. #else
  47666. "lsr r6, %[a], #16\n\t"
  47667. #endif
  47668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47669. "lsrs r7, %[b], #16\n\t"
  47670. #else
  47671. "lsr r7, %[b], #16\n\t"
  47672. #endif
  47673. #ifdef WOLFSSL_KEIL
  47674. "muls r7, r6, r7\n\t"
  47675. #elif defined(__clang__)
  47676. "muls r7, r6\n\t"
  47677. #else
  47678. "mul r7, r6\n\t"
  47679. #endif
  47680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47681. "adds r3, r3, r7\n\t"
  47682. #else
  47683. "add r3, r3, r7\n\t"
  47684. #endif
  47685. #ifdef WOLFSSL_KEIL
  47686. "adcs r4, r4, %[r]\n\t"
  47687. #elif defined(__clang__)
  47688. "adcs r4, %[r]\n\t"
  47689. #else
  47690. "adc r4, %[r]\n\t"
  47691. #endif
  47692. "uxth r7, %[b]\n\t"
  47693. #ifdef WOLFSSL_KEIL
  47694. "muls r6, r7, r6\n\t"
  47695. #elif defined(__clang__)
  47696. "muls r6, r7\n\t"
  47697. #else
  47698. "mul r6, r7\n\t"
  47699. #endif
  47700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47701. "lsrs r7, r6, #16\n\t"
  47702. #else
  47703. "lsr r7, r6, #16\n\t"
  47704. #endif
  47705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47706. "lsls r6, r6, #16\n\t"
  47707. #else
  47708. "lsl r6, r6, #16\n\t"
  47709. #endif
  47710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47711. "adds r5, r5, r6\n\t"
  47712. #else
  47713. "add r5, r5, r6\n\t"
  47714. #endif
  47715. #ifdef WOLFSSL_KEIL
  47716. "adcs r3, r3, r7\n\t"
  47717. #elif defined(__clang__)
  47718. "adcs r3, r7\n\t"
  47719. #else
  47720. "adc r3, r7\n\t"
  47721. #endif
  47722. #ifdef WOLFSSL_KEIL
  47723. "adcs r4, r4, %[r]\n\t"
  47724. #elif defined(__clang__)
  47725. "adcs r4, %[r]\n\t"
  47726. #else
  47727. "adc r4, %[r]\n\t"
  47728. #endif
  47729. "# A[7] * B[10]\n\t"
  47730. "mov %[a], r9\n\t"
  47731. "mov %[b], r10\n\t"
  47732. "ldr %[a], [%[a], #28]\n\t"
  47733. "ldr %[b], [%[b], #40]\n\t"
  47734. "uxth r6, %[a]\n\t"
  47735. "uxth r7, %[b]\n\t"
  47736. #ifdef WOLFSSL_KEIL
  47737. "muls r7, r6, r7\n\t"
  47738. #elif defined(__clang__)
  47739. "muls r7, r6\n\t"
  47740. #else
  47741. "mul r7, r6\n\t"
  47742. #endif
  47743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47744. "adds r5, r5, r7\n\t"
  47745. #else
  47746. "add r5, r5, r7\n\t"
  47747. #endif
  47748. #ifdef WOLFSSL_KEIL
  47749. "adcs r3, r3, %[r]\n\t"
  47750. #elif defined(__clang__)
  47751. "adcs r3, %[r]\n\t"
  47752. #else
  47753. "adc r3, %[r]\n\t"
  47754. #endif
  47755. #ifdef WOLFSSL_KEIL
  47756. "adcs r4, r4, %[r]\n\t"
  47757. #elif defined(__clang__)
  47758. "adcs r4, %[r]\n\t"
  47759. #else
  47760. "adc r4, %[r]\n\t"
  47761. #endif
  47762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47763. "lsrs r7, %[b], #16\n\t"
  47764. #else
  47765. "lsr r7, %[b], #16\n\t"
  47766. #endif
  47767. #ifdef WOLFSSL_KEIL
  47768. "muls r6, r7, r6\n\t"
  47769. #elif defined(__clang__)
  47770. "muls r6, r7\n\t"
  47771. #else
  47772. "mul r6, r7\n\t"
  47773. #endif
  47774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47775. "lsrs r7, r6, #16\n\t"
  47776. #else
  47777. "lsr r7, r6, #16\n\t"
  47778. #endif
  47779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47780. "lsls r6, r6, #16\n\t"
  47781. #else
  47782. "lsl r6, r6, #16\n\t"
  47783. #endif
  47784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47785. "adds r5, r5, r6\n\t"
  47786. #else
  47787. "add r5, r5, r6\n\t"
  47788. #endif
  47789. #ifdef WOLFSSL_KEIL
  47790. "adcs r3, r3, r7\n\t"
  47791. #elif defined(__clang__)
  47792. "adcs r3, r7\n\t"
  47793. #else
  47794. "adc r3, r7\n\t"
  47795. #endif
  47796. #ifdef WOLFSSL_KEIL
  47797. "adcs r4, r4, %[r]\n\t"
  47798. #elif defined(__clang__)
  47799. "adcs r4, %[r]\n\t"
  47800. #else
  47801. "adc r4, %[r]\n\t"
  47802. #endif
  47803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47804. "lsrs r6, %[a], #16\n\t"
  47805. #else
  47806. "lsr r6, %[a], #16\n\t"
  47807. #endif
  47808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47809. "lsrs r7, %[b], #16\n\t"
  47810. #else
  47811. "lsr r7, %[b], #16\n\t"
  47812. #endif
  47813. #ifdef WOLFSSL_KEIL
  47814. "muls r7, r6, r7\n\t"
  47815. #elif defined(__clang__)
  47816. "muls r7, r6\n\t"
  47817. #else
  47818. "mul r7, r6\n\t"
  47819. #endif
  47820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47821. "adds r3, r3, r7\n\t"
  47822. #else
  47823. "add r3, r3, r7\n\t"
  47824. #endif
  47825. #ifdef WOLFSSL_KEIL
  47826. "adcs r4, r4, %[r]\n\t"
  47827. #elif defined(__clang__)
  47828. "adcs r4, %[r]\n\t"
  47829. #else
  47830. "adc r4, %[r]\n\t"
  47831. #endif
  47832. "uxth r7, %[b]\n\t"
  47833. #ifdef WOLFSSL_KEIL
  47834. "muls r6, r7, r6\n\t"
  47835. #elif defined(__clang__)
  47836. "muls r6, r7\n\t"
  47837. #else
  47838. "mul r6, r7\n\t"
  47839. #endif
  47840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47841. "lsrs r7, r6, #16\n\t"
  47842. #else
  47843. "lsr r7, r6, #16\n\t"
  47844. #endif
  47845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47846. "lsls r6, r6, #16\n\t"
  47847. #else
  47848. "lsl r6, r6, #16\n\t"
  47849. #endif
  47850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47851. "adds r5, r5, r6\n\t"
  47852. #else
  47853. "add r5, r5, r6\n\t"
  47854. #endif
  47855. #ifdef WOLFSSL_KEIL
  47856. "adcs r3, r3, r7\n\t"
  47857. #elif defined(__clang__)
  47858. "adcs r3, r7\n\t"
  47859. #else
  47860. "adc r3, r7\n\t"
  47861. #endif
  47862. #ifdef WOLFSSL_KEIL
  47863. "adcs r4, r4, %[r]\n\t"
  47864. #elif defined(__clang__)
  47865. "adcs r4, %[r]\n\t"
  47866. #else
  47867. "adc r4, %[r]\n\t"
  47868. #endif
  47869. "# A[8] * B[9]\n\t"
  47870. "mov %[a], r9\n\t"
  47871. "mov %[b], r10\n\t"
  47872. "ldr %[a], [%[a], #32]\n\t"
  47873. "ldr %[b], [%[b], #36]\n\t"
  47874. "uxth r6, %[a]\n\t"
  47875. "uxth r7, %[b]\n\t"
  47876. #ifdef WOLFSSL_KEIL
  47877. "muls r7, r6, r7\n\t"
  47878. #elif defined(__clang__)
  47879. "muls r7, r6\n\t"
  47880. #else
  47881. "mul r7, r6\n\t"
  47882. #endif
  47883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47884. "adds r5, r5, r7\n\t"
  47885. #else
  47886. "add r5, r5, r7\n\t"
  47887. #endif
  47888. #ifdef WOLFSSL_KEIL
  47889. "adcs r3, r3, %[r]\n\t"
  47890. #elif defined(__clang__)
  47891. "adcs r3, %[r]\n\t"
  47892. #else
  47893. "adc r3, %[r]\n\t"
  47894. #endif
  47895. #ifdef WOLFSSL_KEIL
  47896. "adcs r4, r4, %[r]\n\t"
  47897. #elif defined(__clang__)
  47898. "adcs r4, %[r]\n\t"
  47899. #else
  47900. "adc r4, %[r]\n\t"
  47901. #endif
  47902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47903. "lsrs r7, %[b], #16\n\t"
  47904. #else
  47905. "lsr r7, %[b], #16\n\t"
  47906. #endif
  47907. #ifdef WOLFSSL_KEIL
  47908. "muls r6, r7, r6\n\t"
  47909. #elif defined(__clang__)
  47910. "muls r6, r7\n\t"
  47911. #else
  47912. "mul r6, r7\n\t"
  47913. #endif
  47914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47915. "lsrs r7, r6, #16\n\t"
  47916. #else
  47917. "lsr r7, r6, #16\n\t"
  47918. #endif
  47919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47920. "lsls r6, r6, #16\n\t"
  47921. #else
  47922. "lsl r6, r6, #16\n\t"
  47923. #endif
  47924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47925. "adds r5, r5, r6\n\t"
  47926. #else
  47927. "add r5, r5, r6\n\t"
  47928. #endif
  47929. #ifdef WOLFSSL_KEIL
  47930. "adcs r3, r3, r7\n\t"
  47931. #elif defined(__clang__)
  47932. "adcs r3, r7\n\t"
  47933. #else
  47934. "adc r3, r7\n\t"
  47935. #endif
  47936. #ifdef WOLFSSL_KEIL
  47937. "adcs r4, r4, %[r]\n\t"
  47938. #elif defined(__clang__)
  47939. "adcs r4, %[r]\n\t"
  47940. #else
  47941. "adc r4, %[r]\n\t"
  47942. #endif
  47943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47944. "lsrs r6, %[a], #16\n\t"
  47945. #else
  47946. "lsr r6, %[a], #16\n\t"
  47947. #endif
  47948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47949. "lsrs r7, %[b], #16\n\t"
  47950. #else
  47951. "lsr r7, %[b], #16\n\t"
  47952. #endif
  47953. #ifdef WOLFSSL_KEIL
  47954. "muls r7, r6, r7\n\t"
  47955. #elif defined(__clang__)
  47956. "muls r7, r6\n\t"
  47957. #else
  47958. "mul r7, r6\n\t"
  47959. #endif
  47960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47961. "adds r3, r3, r7\n\t"
  47962. #else
  47963. "add r3, r3, r7\n\t"
  47964. #endif
  47965. #ifdef WOLFSSL_KEIL
  47966. "adcs r4, r4, %[r]\n\t"
  47967. #elif defined(__clang__)
  47968. "adcs r4, %[r]\n\t"
  47969. #else
  47970. "adc r4, %[r]\n\t"
  47971. #endif
  47972. "uxth r7, %[b]\n\t"
  47973. #ifdef WOLFSSL_KEIL
  47974. "muls r6, r7, r6\n\t"
  47975. #elif defined(__clang__)
  47976. "muls r6, r7\n\t"
  47977. #else
  47978. "mul r6, r7\n\t"
  47979. #endif
  47980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47981. "lsrs r7, r6, #16\n\t"
  47982. #else
  47983. "lsr r7, r6, #16\n\t"
  47984. #endif
  47985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47986. "lsls r6, r6, #16\n\t"
  47987. #else
  47988. "lsl r6, r6, #16\n\t"
  47989. #endif
  47990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  47991. "adds r5, r5, r6\n\t"
  47992. #else
  47993. "add r5, r5, r6\n\t"
  47994. #endif
  47995. #ifdef WOLFSSL_KEIL
  47996. "adcs r3, r3, r7\n\t"
  47997. #elif defined(__clang__)
  47998. "adcs r3, r7\n\t"
  47999. #else
  48000. "adc r3, r7\n\t"
  48001. #endif
  48002. #ifdef WOLFSSL_KEIL
  48003. "adcs r4, r4, %[r]\n\t"
  48004. #elif defined(__clang__)
  48005. "adcs r4, %[r]\n\t"
  48006. #else
  48007. "adc r4, %[r]\n\t"
  48008. #endif
  48009. "# A[9] * B[8]\n\t"
  48010. "mov %[a], r9\n\t"
  48011. "mov %[b], r10\n\t"
  48012. "ldr %[a], [%[a], #36]\n\t"
  48013. "ldr %[b], [%[b], #32]\n\t"
  48014. "uxth r6, %[a]\n\t"
  48015. "uxth r7, %[b]\n\t"
  48016. #ifdef WOLFSSL_KEIL
  48017. "muls r7, r6, r7\n\t"
  48018. #elif defined(__clang__)
  48019. "muls r7, r6\n\t"
  48020. #else
  48021. "mul r7, r6\n\t"
  48022. #endif
  48023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48024. "adds r5, r5, r7\n\t"
  48025. #else
  48026. "add r5, r5, r7\n\t"
  48027. #endif
  48028. #ifdef WOLFSSL_KEIL
  48029. "adcs r3, r3, %[r]\n\t"
  48030. #elif defined(__clang__)
  48031. "adcs r3, %[r]\n\t"
  48032. #else
  48033. "adc r3, %[r]\n\t"
  48034. #endif
  48035. #ifdef WOLFSSL_KEIL
  48036. "adcs r4, r4, %[r]\n\t"
  48037. #elif defined(__clang__)
  48038. "adcs r4, %[r]\n\t"
  48039. #else
  48040. "adc r4, %[r]\n\t"
  48041. #endif
  48042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48043. "lsrs r7, %[b], #16\n\t"
  48044. #else
  48045. "lsr r7, %[b], #16\n\t"
  48046. #endif
  48047. #ifdef WOLFSSL_KEIL
  48048. "muls r6, r7, r6\n\t"
  48049. #elif defined(__clang__)
  48050. "muls r6, r7\n\t"
  48051. #else
  48052. "mul r6, r7\n\t"
  48053. #endif
  48054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48055. "lsrs r7, r6, #16\n\t"
  48056. #else
  48057. "lsr r7, r6, #16\n\t"
  48058. #endif
  48059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48060. "lsls r6, r6, #16\n\t"
  48061. #else
  48062. "lsl r6, r6, #16\n\t"
  48063. #endif
  48064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48065. "adds r5, r5, r6\n\t"
  48066. #else
  48067. "add r5, r5, r6\n\t"
  48068. #endif
  48069. #ifdef WOLFSSL_KEIL
  48070. "adcs r3, r3, r7\n\t"
  48071. #elif defined(__clang__)
  48072. "adcs r3, r7\n\t"
  48073. #else
  48074. "adc r3, r7\n\t"
  48075. #endif
  48076. #ifdef WOLFSSL_KEIL
  48077. "adcs r4, r4, %[r]\n\t"
  48078. #elif defined(__clang__)
  48079. "adcs r4, %[r]\n\t"
  48080. #else
  48081. "adc r4, %[r]\n\t"
  48082. #endif
  48083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48084. "lsrs r6, %[a], #16\n\t"
  48085. #else
  48086. "lsr r6, %[a], #16\n\t"
  48087. #endif
  48088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48089. "lsrs r7, %[b], #16\n\t"
  48090. #else
  48091. "lsr r7, %[b], #16\n\t"
  48092. #endif
  48093. #ifdef WOLFSSL_KEIL
  48094. "muls r7, r6, r7\n\t"
  48095. #elif defined(__clang__)
  48096. "muls r7, r6\n\t"
  48097. #else
  48098. "mul r7, r6\n\t"
  48099. #endif
  48100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48101. "adds r3, r3, r7\n\t"
  48102. #else
  48103. "add r3, r3, r7\n\t"
  48104. #endif
  48105. #ifdef WOLFSSL_KEIL
  48106. "adcs r4, r4, %[r]\n\t"
  48107. #elif defined(__clang__)
  48108. "adcs r4, %[r]\n\t"
  48109. #else
  48110. "adc r4, %[r]\n\t"
  48111. #endif
  48112. "uxth r7, %[b]\n\t"
  48113. #ifdef WOLFSSL_KEIL
  48114. "muls r6, r7, r6\n\t"
  48115. #elif defined(__clang__)
  48116. "muls r6, r7\n\t"
  48117. #else
  48118. "mul r6, r7\n\t"
  48119. #endif
  48120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48121. "lsrs r7, r6, #16\n\t"
  48122. #else
  48123. "lsr r7, r6, #16\n\t"
  48124. #endif
  48125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48126. "lsls r6, r6, #16\n\t"
  48127. #else
  48128. "lsl r6, r6, #16\n\t"
  48129. #endif
  48130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48131. "adds r5, r5, r6\n\t"
  48132. #else
  48133. "add r5, r5, r6\n\t"
  48134. #endif
  48135. #ifdef WOLFSSL_KEIL
  48136. "adcs r3, r3, r7\n\t"
  48137. #elif defined(__clang__)
  48138. "adcs r3, r7\n\t"
  48139. #else
  48140. "adc r3, r7\n\t"
  48141. #endif
  48142. #ifdef WOLFSSL_KEIL
  48143. "adcs r4, r4, %[r]\n\t"
  48144. #elif defined(__clang__)
  48145. "adcs r4, %[r]\n\t"
  48146. #else
  48147. "adc r4, %[r]\n\t"
  48148. #endif
  48149. "# A[10] * B[7]\n\t"
  48150. "mov %[a], r9\n\t"
  48151. "mov %[b], r10\n\t"
  48152. "ldr %[a], [%[a], #40]\n\t"
  48153. "ldr %[b], [%[b], #28]\n\t"
  48154. "uxth r6, %[a]\n\t"
  48155. "uxth r7, %[b]\n\t"
  48156. #ifdef WOLFSSL_KEIL
  48157. "muls r7, r6, r7\n\t"
  48158. #elif defined(__clang__)
  48159. "muls r7, r6\n\t"
  48160. #else
  48161. "mul r7, r6\n\t"
  48162. #endif
  48163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48164. "adds r5, r5, r7\n\t"
  48165. #else
  48166. "add r5, r5, r7\n\t"
  48167. #endif
  48168. #ifdef WOLFSSL_KEIL
  48169. "adcs r3, r3, %[r]\n\t"
  48170. #elif defined(__clang__)
  48171. "adcs r3, %[r]\n\t"
  48172. #else
  48173. "adc r3, %[r]\n\t"
  48174. #endif
  48175. #ifdef WOLFSSL_KEIL
  48176. "adcs r4, r4, %[r]\n\t"
  48177. #elif defined(__clang__)
  48178. "adcs r4, %[r]\n\t"
  48179. #else
  48180. "adc r4, %[r]\n\t"
  48181. #endif
  48182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48183. "lsrs r7, %[b], #16\n\t"
  48184. #else
  48185. "lsr r7, %[b], #16\n\t"
  48186. #endif
  48187. #ifdef WOLFSSL_KEIL
  48188. "muls r6, r7, r6\n\t"
  48189. #elif defined(__clang__)
  48190. "muls r6, r7\n\t"
  48191. #else
  48192. "mul r6, r7\n\t"
  48193. #endif
  48194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48195. "lsrs r7, r6, #16\n\t"
  48196. #else
  48197. "lsr r7, r6, #16\n\t"
  48198. #endif
  48199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48200. "lsls r6, r6, #16\n\t"
  48201. #else
  48202. "lsl r6, r6, #16\n\t"
  48203. #endif
  48204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48205. "adds r5, r5, r6\n\t"
  48206. #else
  48207. "add r5, r5, r6\n\t"
  48208. #endif
  48209. #ifdef WOLFSSL_KEIL
  48210. "adcs r3, r3, r7\n\t"
  48211. #elif defined(__clang__)
  48212. "adcs r3, r7\n\t"
  48213. #else
  48214. "adc r3, r7\n\t"
  48215. #endif
  48216. #ifdef WOLFSSL_KEIL
  48217. "adcs r4, r4, %[r]\n\t"
  48218. #elif defined(__clang__)
  48219. "adcs r4, %[r]\n\t"
  48220. #else
  48221. "adc r4, %[r]\n\t"
  48222. #endif
  48223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48224. "lsrs r6, %[a], #16\n\t"
  48225. #else
  48226. "lsr r6, %[a], #16\n\t"
  48227. #endif
  48228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48229. "lsrs r7, %[b], #16\n\t"
  48230. #else
  48231. "lsr r7, %[b], #16\n\t"
  48232. #endif
  48233. #ifdef WOLFSSL_KEIL
  48234. "muls r7, r6, r7\n\t"
  48235. #elif defined(__clang__)
  48236. "muls r7, r6\n\t"
  48237. #else
  48238. "mul r7, r6\n\t"
  48239. #endif
  48240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48241. "adds r3, r3, r7\n\t"
  48242. #else
  48243. "add r3, r3, r7\n\t"
  48244. #endif
  48245. #ifdef WOLFSSL_KEIL
  48246. "adcs r4, r4, %[r]\n\t"
  48247. #elif defined(__clang__)
  48248. "adcs r4, %[r]\n\t"
  48249. #else
  48250. "adc r4, %[r]\n\t"
  48251. #endif
  48252. "uxth r7, %[b]\n\t"
  48253. #ifdef WOLFSSL_KEIL
  48254. "muls r6, r7, r6\n\t"
  48255. #elif defined(__clang__)
  48256. "muls r6, r7\n\t"
  48257. #else
  48258. "mul r6, r7\n\t"
  48259. #endif
  48260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48261. "lsrs r7, r6, #16\n\t"
  48262. #else
  48263. "lsr r7, r6, #16\n\t"
  48264. #endif
  48265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48266. "lsls r6, r6, #16\n\t"
  48267. #else
  48268. "lsl r6, r6, #16\n\t"
  48269. #endif
  48270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48271. "adds r5, r5, r6\n\t"
  48272. #else
  48273. "add r5, r5, r6\n\t"
  48274. #endif
  48275. #ifdef WOLFSSL_KEIL
  48276. "adcs r3, r3, r7\n\t"
  48277. #elif defined(__clang__)
  48278. "adcs r3, r7\n\t"
  48279. #else
  48280. "adc r3, r7\n\t"
  48281. #endif
  48282. #ifdef WOLFSSL_KEIL
  48283. "adcs r4, r4, %[r]\n\t"
  48284. #elif defined(__clang__)
  48285. "adcs r4, %[r]\n\t"
  48286. #else
  48287. "adc r4, %[r]\n\t"
  48288. #endif
  48289. "# A[11] * B[6]\n\t"
  48290. "mov %[a], r9\n\t"
  48291. "mov %[b], r10\n\t"
  48292. "ldr %[a], [%[a], #44]\n\t"
  48293. "ldr %[b], [%[b], #24]\n\t"
  48294. "uxth r6, %[a]\n\t"
  48295. "uxth r7, %[b]\n\t"
  48296. #ifdef WOLFSSL_KEIL
  48297. "muls r7, r6, r7\n\t"
  48298. #elif defined(__clang__)
  48299. "muls r7, r6\n\t"
  48300. #else
  48301. "mul r7, r6\n\t"
  48302. #endif
  48303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48304. "adds r5, r5, r7\n\t"
  48305. #else
  48306. "add r5, r5, r7\n\t"
  48307. #endif
  48308. #ifdef WOLFSSL_KEIL
  48309. "adcs r3, r3, %[r]\n\t"
  48310. #elif defined(__clang__)
  48311. "adcs r3, %[r]\n\t"
  48312. #else
  48313. "adc r3, %[r]\n\t"
  48314. #endif
  48315. #ifdef WOLFSSL_KEIL
  48316. "adcs r4, r4, %[r]\n\t"
  48317. #elif defined(__clang__)
  48318. "adcs r4, %[r]\n\t"
  48319. #else
  48320. "adc r4, %[r]\n\t"
  48321. #endif
  48322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48323. "lsrs r7, %[b], #16\n\t"
  48324. #else
  48325. "lsr r7, %[b], #16\n\t"
  48326. #endif
  48327. #ifdef WOLFSSL_KEIL
  48328. "muls r6, r7, r6\n\t"
  48329. #elif defined(__clang__)
  48330. "muls r6, r7\n\t"
  48331. #else
  48332. "mul r6, r7\n\t"
  48333. #endif
  48334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48335. "lsrs r7, r6, #16\n\t"
  48336. #else
  48337. "lsr r7, r6, #16\n\t"
  48338. #endif
  48339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48340. "lsls r6, r6, #16\n\t"
  48341. #else
  48342. "lsl r6, r6, #16\n\t"
  48343. #endif
  48344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48345. "adds r5, r5, r6\n\t"
  48346. #else
  48347. "add r5, r5, r6\n\t"
  48348. #endif
  48349. #ifdef WOLFSSL_KEIL
  48350. "adcs r3, r3, r7\n\t"
  48351. #elif defined(__clang__)
  48352. "adcs r3, r7\n\t"
  48353. #else
  48354. "adc r3, r7\n\t"
  48355. #endif
  48356. #ifdef WOLFSSL_KEIL
  48357. "adcs r4, r4, %[r]\n\t"
  48358. #elif defined(__clang__)
  48359. "adcs r4, %[r]\n\t"
  48360. #else
  48361. "adc r4, %[r]\n\t"
  48362. #endif
  48363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48364. "lsrs r6, %[a], #16\n\t"
  48365. #else
  48366. "lsr r6, %[a], #16\n\t"
  48367. #endif
  48368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48369. "lsrs r7, %[b], #16\n\t"
  48370. #else
  48371. "lsr r7, %[b], #16\n\t"
  48372. #endif
  48373. #ifdef WOLFSSL_KEIL
  48374. "muls r7, r6, r7\n\t"
  48375. #elif defined(__clang__)
  48376. "muls r7, r6\n\t"
  48377. #else
  48378. "mul r7, r6\n\t"
  48379. #endif
  48380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48381. "adds r3, r3, r7\n\t"
  48382. #else
  48383. "add r3, r3, r7\n\t"
  48384. #endif
  48385. #ifdef WOLFSSL_KEIL
  48386. "adcs r4, r4, %[r]\n\t"
  48387. #elif defined(__clang__)
  48388. "adcs r4, %[r]\n\t"
  48389. #else
  48390. "adc r4, %[r]\n\t"
  48391. #endif
  48392. "uxth r7, %[b]\n\t"
  48393. #ifdef WOLFSSL_KEIL
  48394. "muls r6, r7, r6\n\t"
  48395. #elif defined(__clang__)
  48396. "muls r6, r7\n\t"
  48397. #else
  48398. "mul r6, r7\n\t"
  48399. #endif
  48400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48401. "lsrs r7, r6, #16\n\t"
  48402. #else
  48403. "lsr r7, r6, #16\n\t"
  48404. #endif
  48405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48406. "lsls r6, r6, #16\n\t"
  48407. #else
  48408. "lsl r6, r6, #16\n\t"
  48409. #endif
  48410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48411. "adds r5, r5, r6\n\t"
  48412. #else
  48413. "add r5, r5, r6\n\t"
  48414. #endif
  48415. #ifdef WOLFSSL_KEIL
  48416. "adcs r3, r3, r7\n\t"
  48417. #elif defined(__clang__)
  48418. "adcs r3, r7\n\t"
  48419. #else
  48420. "adc r3, r7\n\t"
  48421. #endif
  48422. #ifdef WOLFSSL_KEIL
  48423. "adcs r4, r4, %[r]\n\t"
  48424. #elif defined(__clang__)
  48425. "adcs r4, %[r]\n\t"
  48426. #else
  48427. "adc r4, %[r]\n\t"
  48428. #endif
  48429. "mov %[r], r8\n\t"
  48430. "str r5, [%[r], #68]\n\t"
  48431. "movs %[r], #0\n\t"
  48432. "# A[11] * B[7]\n\t"
  48433. "movs r5, #0\n\t"
  48434. "mov %[a], r9\n\t"
  48435. "mov %[b], r10\n\t"
  48436. "ldr %[a], [%[a], #44]\n\t"
  48437. "ldr %[b], [%[b], #28]\n\t"
  48438. "uxth r6, %[a]\n\t"
  48439. "uxth r7, %[b]\n\t"
  48440. #ifdef WOLFSSL_KEIL
  48441. "muls r7, r6, r7\n\t"
  48442. #elif defined(__clang__)
  48443. "muls r7, r6\n\t"
  48444. #else
  48445. "mul r7, r6\n\t"
  48446. #endif
  48447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48448. "adds r3, r3, r7\n\t"
  48449. #else
  48450. "add r3, r3, r7\n\t"
  48451. #endif
  48452. #ifdef WOLFSSL_KEIL
  48453. "adcs r4, r4, %[r]\n\t"
  48454. #elif defined(__clang__)
  48455. "adcs r4, %[r]\n\t"
  48456. #else
  48457. "adc r4, %[r]\n\t"
  48458. #endif
  48459. #ifdef WOLFSSL_KEIL
  48460. "adcs r5, r5, %[r]\n\t"
  48461. #elif defined(__clang__)
  48462. "adcs r5, %[r]\n\t"
  48463. #else
  48464. "adc r5, %[r]\n\t"
  48465. #endif
  48466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48467. "lsrs r7, %[b], #16\n\t"
  48468. #else
  48469. "lsr r7, %[b], #16\n\t"
  48470. #endif
  48471. #ifdef WOLFSSL_KEIL
  48472. "muls r6, r7, r6\n\t"
  48473. #elif defined(__clang__)
  48474. "muls r6, r7\n\t"
  48475. #else
  48476. "mul r6, r7\n\t"
  48477. #endif
  48478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48479. "lsrs r7, r6, #16\n\t"
  48480. #else
  48481. "lsr r7, r6, #16\n\t"
  48482. #endif
  48483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48484. "lsls r6, r6, #16\n\t"
  48485. #else
  48486. "lsl r6, r6, #16\n\t"
  48487. #endif
  48488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48489. "adds r3, r3, r6\n\t"
  48490. #else
  48491. "add r3, r3, r6\n\t"
  48492. #endif
  48493. #ifdef WOLFSSL_KEIL
  48494. "adcs r4, r4, r7\n\t"
  48495. #elif defined(__clang__)
  48496. "adcs r4, r7\n\t"
  48497. #else
  48498. "adc r4, r7\n\t"
  48499. #endif
  48500. #ifdef WOLFSSL_KEIL
  48501. "adcs r5, r5, %[r]\n\t"
  48502. #elif defined(__clang__)
  48503. "adcs r5, %[r]\n\t"
  48504. #else
  48505. "adc r5, %[r]\n\t"
  48506. #endif
  48507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48508. "lsrs r6, %[a], #16\n\t"
  48509. #else
  48510. "lsr r6, %[a], #16\n\t"
  48511. #endif
  48512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48513. "lsrs r7, %[b], #16\n\t"
  48514. #else
  48515. "lsr r7, %[b], #16\n\t"
  48516. #endif
  48517. #ifdef WOLFSSL_KEIL
  48518. "muls r7, r6, r7\n\t"
  48519. #elif defined(__clang__)
  48520. "muls r7, r6\n\t"
  48521. #else
  48522. "mul r7, r6\n\t"
  48523. #endif
  48524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48525. "adds r4, r4, r7\n\t"
  48526. #else
  48527. "add r4, r4, r7\n\t"
  48528. #endif
  48529. #ifdef WOLFSSL_KEIL
  48530. "adcs r5, r5, %[r]\n\t"
  48531. #elif defined(__clang__)
  48532. "adcs r5, %[r]\n\t"
  48533. #else
  48534. "adc r5, %[r]\n\t"
  48535. #endif
  48536. "uxth r7, %[b]\n\t"
  48537. #ifdef WOLFSSL_KEIL
  48538. "muls r6, r7, r6\n\t"
  48539. #elif defined(__clang__)
  48540. "muls r6, r7\n\t"
  48541. #else
  48542. "mul r6, r7\n\t"
  48543. #endif
  48544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48545. "lsrs r7, r6, #16\n\t"
  48546. #else
  48547. "lsr r7, r6, #16\n\t"
  48548. #endif
  48549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48550. "lsls r6, r6, #16\n\t"
  48551. #else
  48552. "lsl r6, r6, #16\n\t"
  48553. #endif
  48554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48555. "adds r3, r3, r6\n\t"
  48556. #else
  48557. "add r3, r3, r6\n\t"
  48558. #endif
  48559. #ifdef WOLFSSL_KEIL
  48560. "adcs r4, r4, r7\n\t"
  48561. #elif defined(__clang__)
  48562. "adcs r4, r7\n\t"
  48563. #else
  48564. "adc r4, r7\n\t"
  48565. #endif
  48566. #ifdef WOLFSSL_KEIL
  48567. "adcs r5, r5, %[r]\n\t"
  48568. #elif defined(__clang__)
  48569. "adcs r5, %[r]\n\t"
  48570. #else
  48571. "adc r5, %[r]\n\t"
  48572. #endif
  48573. "# A[10] * B[8]\n\t"
  48574. "mov %[a], r9\n\t"
  48575. "mov %[b], r10\n\t"
  48576. "ldr %[a], [%[a], #40]\n\t"
  48577. "ldr %[b], [%[b], #32]\n\t"
  48578. "uxth r6, %[a]\n\t"
  48579. "uxth r7, %[b]\n\t"
  48580. #ifdef WOLFSSL_KEIL
  48581. "muls r7, r6, r7\n\t"
  48582. #elif defined(__clang__)
  48583. "muls r7, r6\n\t"
  48584. #else
  48585. "mul r7, r6\n\t"
  48586. #endif
  48587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48588. "adds r3, r3, r7\n\t"
  48589. #else
  48590. "add r3, r3, r7\n\t"
  48591. #endif
  48592. #ifdef WOLFSSL_KEIL
  48593. "adcs r4, r4, %[r]\n\t"
  48594. #elif defined(__clang__)
  48595. "adcs r4, %[r]\n\t"
  48596. #else
  48597. "adc r4, %[r]\n\t"
  48598. #endif
  48599. #ifdef WOLFSSL_KEIL
  48600. "adcs r5, r5, %[r]\n\t"
  48601. #elif defined(__clang__)
  48602. "adcs r5, %[r]\n\t"
  48603. #else
  48604. "adc r5, %[r]\n\t"
  48605. #endif
  48606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48607. "lsrs r7, %[b], #16\n\t"
  48608. #else
  48609. "lsr r7, %[b], #16\n\t"
  48610. #endif
  48611. #ifdef WOLFSSL_KEIL
  48612. "muls r6, r7, r6\n\t"
  48613. #elif defined(__clang__)
  48614. "muls r6, r7\n\t"
  48615. #else
  48616. "mul r6, r7\n\t"
  48617. #endif
  48618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48619. "lsrs r7, r6, #16\n\t"
  48620. #else
  48621. "lsr r7, r6, #16\n\t"
  48622. #endif
  48623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48624. "lsls r6, r6, #16\n\t"
  48625. #else
  48626. "lsl r6, r6, #16\n\t"
  48627. #endif
  48628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48629. "adds r3, r3, r6\n\t"
  48630. #else
  48631. "add r3, r3, r6\n\t"
  48632. #endif
  48633. #ifdef WOLFSSL_KEIL
  48634. "adcs r4, r4, r7\n\t"
  48635. #elif defined(__clang__)
  48636. "adcs r4, r7\n\t"
  48637. #else
  48638. "adc r4, r7\n\t"
  48639. #endif
  48640. #ifdef WOLFSSL_KEIL
  48641. "adcs r5, r5, %[r]\n\t"
  48642. #elif defined(__clang__)
  48643. "adcs r5, %[r]\n\t"
  48644. #else
  48645. "adc r5, %[r]\n\t"
  48646. #endif
  48647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48648. "lsrs r6, %[a], #16\n\t"
  48649. #else
  48650. "lsr r6, %[a], #16\n\t"
  48651. #endif
  48652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48653. "lsrs r7, %[b], #16\n\t"
  48654. #else
  48655. "lsr r7, %[b], #16\n\t"
  48656. #endif
  48657. #ifdef WOLFSSL_KEIL
  48658. "muls r7, r6, r7\n\t"
  48659. #elif defined(__clang__)
  48660. "muls r7, r6\n\t"
  48661. #else
  48662. "mul r7, r6\n\t"
  48663. #endif
  48664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48665. "adds r4, r4, r7\n\t"
  48666. #else
  48667. "add r4, r4, r7\n\t"
  48668. #endif
  48669. #ifdef WOLFSSL_KEIL
  48670. "adcs r5, r5, %[r]\n\t"
  48671. #elif defined(__clang__)
  48672. "adcs r5, %[r]\n\t"
  48673. #else
  48674. "adc r5, %[r]\n\t"
  48675. #endif
  48676. "uxth r7, %[b]\n\t"
  48677. #ifdef WOLFSSL_KEIL
  48678. "muls r6, r7, r6\n\t"
  48679. #elif defined(__clang__)
  48680. "muls r6, r7\n\t"
  48681. #else
  48682. "mul r6, r7\n\t"
  48683. #endif
  48684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48685. "lsrs r7, r6, #16\n\t"
  48686. #else
  48687. "lsr r7, r6, #16\n\t"
  48688. #endif
  48689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48690. "lsls r6, r6, #16\n\t"
  48691. #else
  48692. "lsl r6, r6, #16\n\t"
  48693. #endif
  48694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48695. "adds r3, r3, r6\n\t"
  48696. #else
  48697. "add r3, r3, r6\n\t"
  48698. #endif
  48699. #ifdef WOLFSSL_KEIL
  48700. "adcs r4, r4, r7\n\t"
  48701. #elif defined(__clang__)
  48702. "adcs r4, r7\n\t"
  48703. #else
  48704. "adc r4, r7\n\t"
  48705. #endif
  48706. #ifdef WOLFSSL_KEIL
  48707. "adcs r5, r5, %[r]\n\t"
  48708. #elif defined(__clang__)
  48709. "adcs r5, %[r]\n\t"
  48710. #else
  48711. "adc r5, %[r]\n\t"
  48712. #endif
  48713. "# A[9] * B[9]\n\t"
  48714. "mov %[a], r9\n\t"
  48715. "mov %[b], r10\n\t"
  48716. "ldr %[a], [%[a], #36]\n\t"
  48717. "ldr %[b], [%[b], #36]\n\t"
  48718. "uxth r6, %[a]\n\t"
  48719. "uxth r7, %[b]\n\t"
  48720. #ifdef WOLFSSL_KEIL
  48721. "muls r7, r6, r7\n\t"
  48722. #elif defined(__clang__)
  48723. "muls r7, r6\n\t"
  48724. #else
  48725. "mul r7, r6\n\t"
  48726. #endif
  48727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48728. "adds r3, r3, r7\n\t"
  48729. #else
  48730. "add r3, r3, r7\n\t"
  48731. #endif
  48732. #ifdef WOLFSSL_KEIL
  48733. "adcs r4, r4, %[r]\n\t"
  48734. #elif defined(__clang__)
  48735. "adcs r4, %[r]\n\t"
  48736. #else
  48737. "adc r4, %[r]\n\t"
  48738. #endif
  48739. #ifdef WOLFSSL_KEIL
  48740. "adcs r5, r5, %[r]\n\t"
  48741. #elif defined(__clang__)
  48742. "adcs r5, %[r]\n\t"
  48743. #else
  48744. "adc r5, %[r]\n\t"
  48745. #endif
  48746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48747. "lsrs r7, %[b], #16\n\t"
  48748. #else
  48749. "lsr r7, %[b], #16\n\t"
  48750. #endif
  48751. #ifdef WOLFSSL_KEIL
  48752. "muls r6, r7, r6\n\t"
  48753. #elif defined(__clang__)
  48754. "muls r6, r7\n\t"
  48755. #else
  48756. "mul r6, r7\n\t"
  48757. #endif
  48758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48759. "lsrs r7, r6, #16\n\t"
  48760. #else
  48761. "lsr r7, r6, #16\n\t"
  48762. #endif
  48763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48764. "lsls r6, r6, #16\n\t"
  48765. #else
  48766. "lsl r6, r6, #16\n\t"
  48767. #endif
  48768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48769. "adds r3, r3, r6\n\t"
  48770. #else
  48771. "add r3, r3, r6\n\t"
  48772. #endif
  48773. #ifdef WOLFSSL_KEIL
  48774. "adcs r4, r4, r7\n\t"
  48775. #elif defined(__clang__)
  48776. "adcs r4, r7\n\t"
  48777. #else
  48778. "adc r4, r7\n\t"
  48779. #endif
  48780. #ifdef WOLFSSL_KEIL
  48781. "adcs r5, r5, %[r]\n\t"
  48782. #elif defined(__clang__)
  48783. "adcs r5, %[r]\n\t"
  48784. #else
  48785. "adc r5, %[r]\n\t"
  48786. #endif
  48787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48788. "lsrs r6, %[a], #16\n\t"
  48789. #else
  48790. "lsr r6, %[a], #16\n\t"
  48791. #endif
  48792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48793. "lsrs r7, %[b], #16\n\t"
  48794. #else
  48795. "lsr r7, %[b], #16\n\t"
  48796. #endif
  48797. #ifdef WOLFSSL_KEIL
  48798. "muls r7, r6, r7\n\t"
  48799. #elif defined(__clang__)
  48800. "muls r7, r6\n\t"
  48801. #else
  48802. "mul r7, r6\n\t"
  48803. #endif
  48804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48805. "adds r4, r4, r7\n\t"
  48806. #else
  48807. "add r4, r4, r7\n\t"
  48808. #endif
  48809. #ifdef WOLFSSL_KEIL
  48810. "adcs r5, r5, %[r]\n\t"
  48811. #elif defined(__clang__)
  48812. "adcs r5, %[r]\n\t"
  48813. #else
  48814. "adc r5, %[r]\n\t"
  48815. #endif
  48816. "uxth r7, %[b]\n\t"
  48817. #ifdef WOLFSSL_KEIL
  48818. "muls r6, r7, r6\n\t"
  48819. #elif defined(__clang__)
  48820. "muls r6, r7\n\t"
  48821. #else
  48822. "mul r6, r7\n\t"
  48823. #endif
  48824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48825. "lsrs r7, r6, #16\n\t"
  48826. #else
  48827. "lsr r7, r6, #16\n\t"
  48828. #endif
  48829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48830. "lsls r6, r6, #16\n\t"
  48831. #else
  48832. "lsl r6, r6, #16\n\t"
  48833. #endif
  48834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48835. "adds r3, r3, r6\n\t"
  48836. #else
  48837. "add r3, r3, r6\n\t"
  48838. #endif
  48839. #ifdef WOLFSSL_KEIL
  48840. "adcs r4, r4, r7\n\t"
  48841. #elif defined(__clang__)
  48842. "adcs r4, r7\n\t"
  48843. #else
  48844. "adc r4, r7\n\t"
  48845. #endif
  48846. #ifdef WOLFSSL_KEIL
  48847. "adcs r5, r5, %[r]\n\t"
  48848. #elif defined(__clang__)
  48849. "adcs r5, %[r]\n\t"
  48850. #else
  48851. "adc r5, %[r]\n\t"
  48852. #endif
  48853. "# A[8] * B[10]\n\t"
  48854. "mov %[a], r9\n\t"
  48855. "mov %[b], r10\n\t"
  48856. "ldr %[a], [%[a], #32]\n\t"
  48857. "ldr %[b], [%[b], #40]\n\t"
  48858. "uxth r6, %[a]\n\t"
  48859. "uxth r7, %[b]\n\t"
  48860. #ifdef WOLFSSL_KEIL
  48861. "muls r7, r6, r7\n\t"
  48862. #elif defined(__clang__)
  48863. "muls r7, r6\n\t"
  48864. #else
  48865. "mul r7, r6\n\t"
  48866. #endif
  48867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48868. "adds r3, r3, r7\n\t"
  48869. #else
  48870. "add r3, r3, r7\n\t"
  48871. #endif
  48872. #ifdef WOLFSSL_KEIL
  48873. "adcs r4, r4, %[r]\n\t"
  48874. #elif defined(__clang__)
  48875. "adcs r4, %[r]\n\t"
  48876. #else
  48877. "adc r4, %[r]\n\t"
  48878. #endif
  48879. #ifdef WOLFSSL_KEIL
  48880. "adcs r5, r5, %[r]\n\t"
  48881. #elif defined(__clang__)
  48882. "adcs r5, %[r]\n\t"
  48883. #else
  48884. "adc r5, %[r]\n\t"
  48885. #endif
  48886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48887. "lsrs r7, %[b], #16\n\t"
  48888. #else
  48889. "lsr r7, %[b], #16\n\t"
  48890. #endif
  48891. #ifdef WOLFSSL_KEIL
  48892. "muls r6, r7, r6\n\t"
  48893. #elif defined(__clang__)
  48894. "muls r6, r7\n\t"
  48895. #else
  48896. "mul r6, r7\n\t"
  48897. #endif
  48898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48899. "lsrs r7, r6, #16\n\t"
  48900. #else
  48901. "lsr r7, r6, #16\n\t"
  48902. #endif
  48903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48904. "lsls r6, r6, #16\n\t"
  48905. #else
  48906. "lsl r6, r6, #16\n\t"
  48907. #endif
  48908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48909. "adds r3, r3, r6\n\t"
  48910. #else
  48911. "add r3, r3, r6\n\t"
  48912. #endif
  48913. #ifdef WOLFSSL_KEIL
  48914. "adcs r4, r4, r7\n\t"
  48915. #elif defined(__clang__)
  48916. "adcs r4, r7\n\t"
  48917. #else
  48918. "adc r4, r7\n\t"
  48919. #endif
  48920. #ifdef WOLFSSL_KEIL
  48921. "adcs r5, r5, %[r]\n\t"
  48922. #elif defined(__clang__)
  48923. "adcs r5, %[r]\n\t"
  48924. #else
  48925. "adc r5, %[r]\n\t"
  48926. #endif
  48927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48928. "lsrs r6, %[a], #16\n\t"
  48929. #else
  48930. "lsr r6, %[a], #16\n\t"
  48931. #endif
  48932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48933. "lsrs r7, %[b], #16\n\t"
  48934. #else
  48935. "lsr r7, %[b], #16\n\t"
  48936. #endif
  48937. #ifdef WOLFSSL_KEIL
  48938. "muls r7, r6, r7\n\t"
  48939. #elif defined(__clang__)
  48940. "muls r7, r6\n\t"
  48941. #else
  48942. "mul r7, r6\n\t"
  48943. #endif
  48944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48945. "adds r4, r4, r7\n\t"
  48946. #else
  48947. "add r4, r4, r7\n\t"
  48948. #endif
  48949. #ifdef WOLFSSL_KEIL
  48950. "adcs r5, r5, %[r]\n\t"
  48951. #elif defined(__clang__)
  48952. "adcs r5, %[r]\n\t"
  48953. #else
  48954. "adc r5, %[r]\n\t"
  48955. #endif
  48956. "uxth r7, %[b]\n\t"
  48957. #ifdef WOLFSSL_KEIL
  48958. "muls r6, r7, r6\n\t"
  48959. #elif defined(__clang__)
  48960. "muls r6, r7\n\t"
  48961. #else
  48962. "mul r6, r7\n\t"
  48963. #endif
  48964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48965. "lsrs r7, r6, #16\n\t"
  48966. #else
  48967. "lsr r7, r6, #16\n\t"
  48968. #endif
  48969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48970. "lsls r6, r6, #16\n\t"
  48971. #else
  48972. "lsl r6, r6, #16\n\t"
  48973. #endif
  48974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  48975. "adds r3, r3, r6\n\t"
  48976. #else
  48977. "add r3, r3, r6\n\t"
  48978. #endif
  48979. #ifdef WOLFSSL_KEIL
  48980. "adcs r4, r4, r7\n\t"
  48981. #elif defined(__clang__)
  48982. "adcs r4, r7\n\t"
  48983. #else
  48984. "adc r4, r7\n\t"
  48985. #endif
  48986. #ifdef WOLFSSL_KEIL
  48987. "adcs r5, r5, %[r]\n\t"
  48988. #elif defined(__clang__)
  48989. "adcs r5, %[r]\n\t"
  48990. #else
  48991. "adc r5, %[r]\n\t"
  48992. #endif
  48993. "# A[7] * B[11]\n\t"
  48994. "mov %[a], r9\n\t"
  48995. "mov %[b], r10\n\t"
  48996. "ldr %[a], [%[a], #28]\n\t"
  48997. "ldr %[b], [%[b], #44]\n\t"
  48998. "uxth r6, %[a]\n\t"
  48999. "uxth r7, %[b]\n\t"
  49000. #ifdef WOLFSSL_KEIL
  49001. "muls r7, r6, r7\n\t"
  49002. #elif defined(__clang__)
  49003. "muls r7, r6\n\t"
  49004. #else
  49005. "mul r7, r6\n\t"
  49006. #endif
  49007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49008. "adds r3, r3, r7\n\t"
  49009. #else
  49010. "add r3, r3, r7\n\t"
  49011. #endif
  49012. #ifdef WOLFSSL_KEIL
  49013. "adcs r4, r4, %[r]\n\t"
  49014. #elif defined(__clang__)
  49015. "adcs r4, %[r]\n\t"
  49016. #else
  49017. "adc r4, %[r]\n\t"
  49018. #endif
  49019. #ifdef WOLFSSL_KEIL
  49020. "adcs r5, r5, %[r]\n\t"
  49021. #elif defined(__clang__)
  49022. "adcs r5, %[r]\n\t"
  49023. #else
  49024. "adc r5, %[r]\n\t"
  49025. #endif
  49026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49027. "lsrs r7, %[b], #16\n\t"
  49028. #else
  49029. "lsr r7, %[b], #16\n\t"
  49030. #endif
  49031. #ifdef WOLFSSL_KEIL
  49032. "muls r6, r7, r6\n\t"
  49033. #elif defined(__clang__)
  49034. "muls r6, r7\n\t"
  49035. #else
  49036. "mul r6, r7\n\t"
  49037. #endif
  49038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49039. "lsrs r7, r6, #16\n\t"
  49040. #else
  49041. "lsr r7, r6, #16\n\t"
  49042. #endif
  49043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49044. "lsls r6, r6, #16\n\t"
  49045. #else
  49046. "lsl r6, r6, #16\n\t"
  49047. #endif
  49048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49049. "adds r3, r3, r6\n\t"
  49050. #else
  49051. "add r3, r3, r6\n\t"
  49052. #endif
  49053. #ifdef WOLFSSL_KEIL
  49054. "adcs r4, r4, r7\n\t"
  49055. #elif defined(__clang__)
  49056. "adcs r4, r7\n\t"
  49057. #else
  49058. "adc r4, r7\n\t"
  49059. #endif
  49060. #ifdef WOLFSSL_KEIL
  49061. "adcs r5, r5, %[r]\n\t"
  49062. #elif defined(__clang__)
  49063. "adcs r5, %[r]\n\t"
  49064. #else
  49065. "adc r5, %[r]\n\t"
  49066. #endif
  49067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49068. "lsrs r6, %[a], #16\n\t"
  49069. #else
  49070. "lsr r6, %[a], #16\n\t"
  49071. #endif
  49072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49073. "lsrs r7, %[b], #16\n\t"
  49074. #else
  49075. "lsr r7, %[b], #16\n\t"
  49076. #endif
  49077. #ifdef WOLFSSL_KEIL
  49078. "muls r7, r6, r7\n\t"
  49079. #elif defined(__clang__)
  49080. "muls r7, r6\n\t"
  49081. #else
  49082. "mul r7, r6\n\t"
  49083. #endif
  49084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49085. "adds r4, r4, r7\n\t"
  49086. #else
  49087. "add r4, r4, r7\n\t"
  49088. #endif
  49089. #ifdef WOLFSSL_KEIL
  49090. "adcs r5, r5, %[r]\n\t"
  49091. #elif defined(__clang__)
  49092. "adcs r5, %[r]\n\t"
  49093. #else
  49094. "adc r5, %[r]\n\t"
  49095. #endif
  49096. "uxth r7, %[b]\n\t"
  49097. #ifdef WOLFSSL_KEIL
  49098. "muls r6, r7, r6\n\t"
  49099. #elif defined(__clang__)
  49100. "muls r6, r7\n\t"
  49101. #else
  49102. "mul r6, r7\n\t"
  49103. #endif
  49104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49105. "lsrs r7, r6, #16\n\t"
  49106. #else
  49107. "lsr r7, r6, #16\n\t"
  49108. #endif
  49109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49110. "lsls r6, r6, #16\n\t"
  49111. #else
  49112. "lsl r6, r6, #16\n\t"
  49113. #endif
  49114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49115. "adds r3, r3, r6\n\t"
  49116. #else
  49117. "add r3, r3, r6\n\t"
  49118. #endif
  49119. #ifdef WOLFSSL_KEIL
  49120. "adcs r4, r4, r7\n\t"
  49121. #elif defined(__clang__)
  49122. "adcs r4, r7\n\t"
  49123. #else
  49124. "adc r4, r7\n\t"
  49125. #endif
  49126. #ifdef WOLFSSL_KEIL
  49127. "adcs r5, r5, %[r]\n\t"
  49128. #elif defined(__clang__)
  49129. "adcs r5, %[r]\n\t"
  49130. #else
  49131. "adc r5, %[r]\n\t"
  49132. #endif
  49133. "mov %[r], r8\n\t"
  49134. "str r3, [%[r], #72]\n\t"
  49135. "movs %[r], #0\n\t"
  49136. "# A[8] * B[11]\n\t"
  49137. "movs r3, #0\n\t"
  49138. "mov %[a], r9\n\t"
  49139. "mov %[b], r10\n\t"
  49140. "ldr %[a], [%[a], #32]\n\t"
  49141. "ldr %[b], [%[b], #44]\n\t"
  49142. "uxth r6, %[a]\n\t"
  49143. "uxth r7, %[b]\n\t"
  49144. #ifdef WOLFSSL_KEIL
  49145. "muls r7, r6, r7\n\t"
  49146. #elif defined(__clang__)
  49147. "muls r7, r6\n\t"
  49148. #else
  49149. "mul r7, r6\n\t"
  49150. #endif
  49151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49152. "adds r4, r4, r7\n\t"
  49153. #else
  49154. "add r4, r4, r7\n\t"
  49155. #endif
  49156. #ifdef WOLFSSL_KEIL
  49157. "adcs r5, r5, %[r]\n\t"
  49158. #elif defined(__clang__)
  49159. "adcs r5, %[r]\n\t"
  49160. #else
  49161. "adc r5, %[r]\n\t"
  49162. #endif
  49163. #ifdef WOLFSSL_KEIL
  49164. "adcs r3, r3, %[r]\n\t"
  49165. #elif defined(__clang__)
  49166. "adcs r3, %[r]\n\t"
  49167. #else
  49168. "adc r3, %[r]\n\t"
  49169. #endif
  49170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49171. "lsrs r7, %[b], #16\n\t"
  49172. #else
  49173. "lsr r7, %[b], #16\n\t"
  49174. #endif
  49175. #ifdef WOLFSSL_KEIL
  49176. "muls r6, r7, r6\n\t"
  49177. #elif defined(__clang__)
  49178. "muls r6, r7\n\t"
  49179. #else
  49180. "mul r6, r7\n\t"
  49181. #endif
  49182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49183. "lsrs r7, r6, #16\n\t"
  49184. #else
  49185. "lsr r7, r6, #16\n\t"
  49186. #endif
  49187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49188. "lsls r6, r6, #16\n\t"
  49189. #else
  49190. "lsl r6, r6, #16\n\t"
  49191. #endif
  49192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49193. "adds r4, r4, r6\n\t"
  49194. #else
  49195. "add r4, r4, r6\n\t"
  49196. #endif
  49197. #ifdef WOLFSSL_KEIL
  49198. "adcs r5, r5, r7\n\t"
  49199. #elif defined(__clang__)
  49200. "adcs r5, r7\n\t"
  49201. #else
  49202. "adc r5, r7\n\t"
  49203. #endif
  49204. #ifdef WOLFSSL_KEIL
  49205. "adcs r3, r3, %[r]\n\t"
  49206. #elif defined(__clang__)
  49207. "adcs r3, %[r]\n\t"
  49208. #else
  49209. "adc r3, %[r]\n\t"
  49210. #endif
  49211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49212. "lsrs r6, %[a], #16\n\t"
  49213. #else
  49214. "lsr r6, %[a], #16\n\t"
  49215. #endif
  49216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49217. "lsrs r7, %[b], #16\n\t"
  49218. #else
  49219. "lsr r7, %[b], #16\n\t"
  49220. #endif
  49221. #ifdef WOLFSSL_KEIL
  49222. "muls r7, r6, r7\n\t"
  49223. #elif defined(__clang__)
  49224. "muls r7, r6\n\t"
  49225. #else
  49226. "mul r7, r6\n\t"
  49227. #endif
  49228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49229. "adds r5, r5, r7\n\t"
  49230. #else
  49231. "add r5, r5, r7\n\t"
  49232. #endif
  49233. #ifdef WOLFSSL_KEIL
  49234. "adcs r3, r3, %[r]\n\t"
  49235. #elif defined(__clang__)
  49236. "adcs r3, %[r]\n\t"
  49237. #else
  49238. "adc r3, %[r]\n\t"
  49239. #endif
  49240. "uxth r7, %[b]\n\t"
  49241. #ifdef WOLFSSL_KEIL
  49242. "muls r6, r7, r6\n\t"
  49243. #elif defined(__clang__)
  49244. "muls r6, r7\n\t"
  49245. #else
  49246. "mul r6, r7\n\t"
  49247. #endif
  49248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49249. "lsrs r7, r6, #16\n\t"
  49250. #else
  49251. "lsr r7, r6, #16\n\t"
  49252. #endif
  49253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49254. "lsls r6, r6, #16\n\t"
  49255. #else
  49256. "lsl r6, r6, #16\n\t"
  49257. #endif
  49258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49259. "adds r4, r4, r6\n\t"
  49260. #else
  49261. "add r4, r4, r6\n\t"
  49262. #endif
  49263. #ifdef WOLFSSL_KEIL
  49264. "adcs r5, r5, r7\n\t"
  49265. #elif defined(__clang__)
  49266. "adcs r5, r7\n\t"
  49267. #else
  49268. "adc r5, r7\n\t"
  49269. #endif
  49270. #ifdef WOLFSSL_KEIL
  49271. "adcs r3, r3, %[r]\n\t"
  49272. #elif defined(__clang__)
  49273. "adcs r3, %[r]\n\t"
  49274. #else
  49275. "adc r3, %[r]\n\t"
  49276. #endif
  49277. "# A[9] * B[10]\n\t"
  49278. "mov %[a], r9\n\t"
  49279. "mov %[b], r10\n\t"
  49280. "ldr %[a], [%[a], #36]\n\t"
  49281. "ldr %[b], [%[b], #40]\n\t"
  49282. "uxth r6, %[a]\n\t"
  49283. "uxth r7, %[b]\n\t"
  49284. #ifdef WOLFSSL_KEIL
  49285. "muls r7, r6, r7\n\t"
  49286. #elif defined(__clang__)
  49287. "muls r7, r6\n\t"
  49288. #else
  49289. "mul r7, r6\n\t"
  49290. #endif
  49291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49292. "adds r4, r4, r7\n\t"
  49293. #else
  49294. "add r4, r4, r7\n\t"
  49295. #endif
  49296. #ifdef WOLFSSL_KEIL
  49297. "adcs r5, r5, %[r]\n\t"
  49298. #elif defined(__clang__)
  49299. "adcs r5, %[r]\n\t"
  49300. #else
  49301. "adc r5, %[r]\n\t"
  49302. #endif
  49303. #ifdef WOLFSSL_KEIL
  49304. "adcs r3, r3, %[r]\n\t"
  49305. #elif defined(__clang__)
  49306. "adcs r3, %[r]\n\t"
  49307. #else
  49308. "adc r3, %[r]\n\t"
  49309. #endif
  49310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49311. "lsrs r7, %[b], #16\n\t"
  49312. #else
  49313. "lsr r7, %[b], #16\n\t"
  49314. #endif
  49315. #ifdef WOLFSSL_KEIL
  49316. "muls r6, r7, r6\n\t"
  49317. #elif defined(__clang__)
  49318. "muls r6, r7\n\t"
  49319. #else
  49320. "mul r6, r7\n\t"
  49321. #endif
  49322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49323. "lsrs r7, r6, #16\n\t"
  49324. #else
  49325. "lsr r7, r6, #16\n\t"
  49326. #endif
  49327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49328. "lsls r6, r6, #16\n\t"
  49329. #else
  49330. "lsl r6, r6, #16\n\t"
  49331. #endif
  49332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49333. "adds r4, r4, r6\n\t"
  49334. #else
  49335. "add r4, r4, r6\n\t"
  49336. #endif
  49337. #ifdef WOLFSSL_KEIL
  49338. "adcs r5, r5, r7\n\t"
  49339. #elif defined(__clang__)
  49340. "adcs r5, r7\n\t"
  49341. #else
  49342. "adc r5, r7\n\t"
  49343. #endif
  49344. #ifdef WOLFSSL_KEIL
  49345. "adcs r3, r3, %[r]\n\t"
  49346. #elif defined(__clang__)
  49347. "adcs r3, %[r]\n\t"
  49348. #else
  49349. "adc r3, %[r]\n\t"
  49350. #endif
  49351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49352. "lsrs r6, %[a], #16\n\t"
  49353. #else
  49354. "lsr r6, %[a], #16\n\t"
  49355. #endif
  49356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49357. "lsrs r7, %[b], #16\n\t"
  49358. #else
  49359. "lsr r7, %[b], #16\n\t"
  49360. #endif
  49361. #ifdef WOLFSSL_KEIL
  49362. "muls r7, r6, r7\n\t"
  49363. #elif defined(__clang__)
  49364. "muls r7, r6\n\t"
  49365. #else
  49366. "mul r7, r6\n\t"
  49367. #endif
  49368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49369. "adds r5, r5, r7\n\t"
  49370. #else
  49371. "add r5, r5, r7\n\t"
  49372. #endif
  49373. #ifdef WOLFSSL_KEIL
  49374. "adcs r3, r3, %[r]\n\t"
  49375. #elif defined(__clang__)
  49376. "adcs r3, %[r]\n\t"
  49377. #else
  49378. "adc r3, %[r]\n\t"
  49379. #endif
  49380. "uxth r7, %[b]\n\t"
  49381. #ifdef WOLFSSL_KEIL
  49382. "muls r6, r7, r6\n\t"
  49383. #elif defined(__clang__)
  49384. "muls r6, r7\n\t"
  49385. #else
  49386. "mul r6, r7\n\t"
  49387. #endif
  49388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49389. "lsrs r7, r6, #16\n\t"
  49390. #else
  49391. "lsr r7, r6, #16\n\t"
  49392. #endif
  49393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49394. "lsls r6, r6, #16\n\t"
  49395. #else
  49396. "lsl r6, r6, #16\n\t"
  49397. #endif
  49398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49399. "adds r4, r4, r6\n\t"
  49400. #else
  49401. "add r4, r4, r6\n\t"
  49402. #endif
  49403. #ifdef WOLFSSL_KEIL
  49404. "adcs r5, r5, r7\n\t"
  49405. #elif defined(__clang__)
  49406. "adcs r5, r7\n\t"
  49407. #else
  49408. "adc r5, r7\n\t"
  49409. #endif
  49410. #ifdef WOLFSSL_KEIL
  49411. "adcs r3, r3, %[r]\n\t"
  49412. #elif defined(__clang__)
  49413. "adcs r3, %[r]\n\t"
  49414. #else
  49415. "adc r3, %[r]\n\t"
  49416. #endif
  49417. "# A[10] * B[9]\n\t"
  49418. "mov %[a], r9\n\t"
  49419. "mov %[b], r10\n\t"
  49420. "ldr %[a], [%[a], #40]\n\t"
  49421. "ldr %[b], [%[b], #36]\n\t"
  49422. "uxth r6, %[a]\n\t"
  49423. "uxth r7, %[b]\n\t"
  49424. #ifdef WOLFSSL_KEIL
  49425. "muls r7, r6, r7\n\t"
  49426. #elif defined(__clang__)
  49427. "muls r7, r6\n\t"
  49428. #else
  49429. "mul r7, r6\n\t"
  49430. #endif
  49431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49432. "adds r4, r4, r7\n\t"
  49433. #else
  49434. "add r4, r4, r7\n\t"
  49435. #endif
  49436. #ifdef WOLFSSL_KEIL
  49437. "adcs r5, r5, %[r]\n\t"
  49438. #elif defined(__clang__)
  49439. "adcs r5, %[r]\n\t"
  49440. #else
  49441. "adc r5, %[r]\n\t"
  49442. #endif
  49443. #ifdef WOLFSSL_KEIL
  49444. "adcs r3, r3, %[r]\n\t"
  49445. #elif defined(__clang__)
  49446. "adcs r3, %[r]\n\t"
  49447. #else
  49448. "adc r3, %[r]\n\t"
  49449. #endif
  49450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49451. "lsrs r7, %[b], #16\n\t"
  49452. #else
  49453. "lsr r7, %[b], #16\n\t"
  49454. #endif
  49455. #ifdef WOLFSSL_KEIL
  49456. "muls r6, r7, r6\n\t"
  49457. #elif defined(__clang__)
  49458. "muls r6, r7\n\t"
  49459. #else
  49460. "mul r6, r7\n\t"
  49461. #endif
  49462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49463. "lsrs r7, r6, #16\n\t"
  49464. #else
  49465. "lsr r7, r6, #16\n\t"
  49466. #endif
  49467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49468. "lsls r6, r6, #16\n\t"
  49469. #else
  49470. "lsl r6, r6, #16\n\t"
  49471. #endif
  49472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49473. "adds r4, r4, r6\n\t"
  49474. #else
  49475. "add r4, r4, r6\n\t"
  49476. #endif
  49477. #ifdef WOLFSSL_KEIL
  49478. "adcs r5, r5, r7\n\t"
  49479. #elif defined(__clang__)
  49480. "adcs r5, r7\n\t"
  49481. #else
  49482. "adc r5, r7\n\t"
  49483. #endif
  49484. #ifdef WOLFSSL_KEIL
  49485. "adcs r3, r3, %[r]\n\t"
  49486. #elif defined(__clang__)
  49487. "adcs r3, %[r]\n\t"
  49488. #else
  49489. "adc r3, %[r]\n\t"
  49490. #endif
  49491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49492. "lsrs r6, %[a], #16\n\t"
  49493. #else
  49494. "lsr r6, %[a], #16\n\t"
  49495. #endif
  49496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49497. "lsrs r7, %[b], #16\n\t"
  49498. #else
  49499. "lsr r7, %[b], #16\n\t"
  49500. #endif
  49501. #ifdef WOLFSSL_KEIL
  49502. "muls r7, r6, r7\n\t"
  49503. #elif defined(__clang__)
  49504. "muls r7, r6\n\t"
  49505. #else
  49506. "mul r7, r6\n\t"
  49507. #endif
  49508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49509. "adds r5, r5, r7\n\t"
  49510. #else
  49511. "add r5, r5, r7\n\t"
  49512. #endif
  49513. #ifdef WOLFSSL_KEIL
  49514. "adcs r3, r3, %[r]\n\t"
  49515. #elif defined(__clang__)
  49516. "adcs r3, %[r]\n\t"
  49517. #else
  49518. "adc r3, %[r]\n\t"
  49519. #endif
  49520. "uxth r7, %[b]\n\t"
  49521. #ifdef WOLFSSL_KEIL
  49522. "muls r6, r7, r6\n\t"
  49523. #elif defined(__clang__)
  49524. "muls r6, r7\n\t"
  49525. #else
  49526. "mul r6, r7\n\t"
  49527. #endif
  49528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49529. "lsrs r7, r6, #16\n\t"
  49530. #else
  49531. "lsr r7, r6, #16\n\t"
  49532. #endif
  49533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49534. "lsls r6, r6, #16\n\t"
  49535. #else
  49536. "lsl r6, r6, #16\n\t"
  49537. #endif
  49538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49539. "adds r4, r4, r6\n\t"
  49540. #else
  49541. "add r4, r4, r6\n\t"
  49542. #endif
  49543. #ifdef WOLFSSL_KEIL
  49544. "adcs r5, r5, r7\n\t"
  49545. #elif defined(__clang__)
  49546. "adcs r5, r7\n\t"
  49547. #else
  49548. "adc r5, r7\n\t"
  49549. #endif
  49550. #ifdef WOLFSSL_KEIL
  49551. "adcs r3, r3, %[r]\n\t"
  49552. #elif defined(__clang__)
  49553. "adcs r3, %[r]\n\t"
  49554. #else
  49555. "adc r3, %[r]\n\t"
  49556. #endif
  49557. "# A[11] * B[8]\n\t"
  49558. "mov %[a], r9\n\t"
  49559. "mov %[b], r10\n\t"
  49560. "ldr %[a], [%[a], #44]\n\t"
  49561. "ldr %[b], [%[b], #32]\n\t"
  49562. "uxth r6, %[a]\n\t"
  49563. "uxth r7, %[b]\n\t"
  49564. #ifdef WOLFSSL_KEIL
  49565. "muls r7, r6, r7\n\t"
  49566. #elif defined(__clang__)
  49567. "muls r7, r6\n\t"
  49568. #else
  49569. "mul r7, r6\n\t"
  49570. #endif
  49571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49572. "adds r4, r4, r7\n\t"
  49573. #else
  49574. "add r4, r4, r7\n\t"
  49575. #endif
  49576. #ifdef WOLFSSL_KEIL
  49577. "adcs r5, r5, %[r]\n\t"
  49578. #elif defined(__clang__)
  49579. "adcs r5, %[r]\n\t"
  49580. #else
  49581. "adc r5, %[r]\n\t"
  49582. #endif
  49583. #ifdef WOLFSSL_KEIL
  49584. "adcs r3, r3, %[r]\n\t"
  49585. #elif defined(__clang__)
  49586. "adcs r3, %[r]\n\t"
  49587. #else
  49588. "adc r3, %[r]\n\t"
  49589. #endif
  49590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49591. "lsrs r7, %[b], #16\n\t"
  49592. #else
  49593. "lsr r7, %[b], #16\n\t"
  49594. #endif
  49595. #ifdef WOLFSSL_KEIL
  49596. "muls r6, r7, r6\n\t"
  49597. #elif defined(__clang__)
  49598. "muls r6, r7\n\t"
  49599. #else
  49600. "mul r6, r7\n\t"
  49601. #endif
  49602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49603. "lsrs r7, r6, #16\n\t"
  49604. #else
  49605. "lsr r7, r6, #16\n\t"
  49606. #endif
  49607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49608. "lsls r6, r6, #16\n\t"
  49609. #else
  49610. "lsl r6, r6, #16\n\t"
  49611. #endif
  49612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49613. "adds r4, r4, r6\n\t"
  49614. #else
  49615. "add r4, r4, r6\n\t"
  49616. #endif
  49617. #ifdef WOLFSSL_KEIL
  49618. "adcs r5, r5, r7\n\t"
  49619. #elif defined(__clang__)
  49620. "adcs r5, r7\n\t"
  49621. #else
  49622. "adc r5, r7\n\t"
  49623. #endif
  49624. #ifdef WOLFSSL_KEIL
  49625. "adcs r3, r3, %[r]\n\t"
  49626. #elif defined(__clang__)
  49627. "adcs r3, %[r]\n\t"
  49628. #else
  49629. "adc r3, %[r]\n\t"
  49630. #endif
  49631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49632. "lsrs r6, %[a], #16\n\t"
  49633. #else
  49634. "lsr r6, %[a], #16\n\t"
  49635. #endif
  49636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49637. "lsrs r7, %[b], #16\n\t"
  49638. #else
  49639. "lsr r7, %[b], #16\n\t"
  49640. #endif
  49641. #ifdef WOLFSSL_KEIL
  49642. "muls r7, r6, r7\n\t"
  49643. #elif defined(__clang__)
  49644. "muls r7, r6\n\t"
  49645. #else
  49646. "mul r7, r6\n\t"
  49647. #endif
  49648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49649. "adds r5, r5, r7\n\t"
  49650. #else
  49651. "add r5, r5, r7\n\t"
  49652. #endif
  49653. #ifdef WOLFSSL_KEIL
  49654. "adcs r3, r3, %[r]\n\t"
  49655. #elif defined(__clang__)
  49656. "adcs r3, %[r]\n\t"
  49657. #else
  49658. "adc r3, %[r]\n\t"
  49659. #endif
  49660. "uxth r7, %[b]\n\t"
  49661. #ifdef WOLFSSL_KEIL
  49662. "muls r6, r7, r6\n\t"
  49663. #elif defined(__clang__)
  49664. "muls r6, r7\n\t"
  49665. #else
  49666. "mul r6, r7\n\t"
  49667. #endif
  49668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49669. "lsrs r7, r6, #16\n\t"
  49670. #else
  49671. "lsr r7, r6, #16\n\t"
  49672. #endif
  49673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49674. "lsls r6, r6, #16\n\t"
  49675. #else
  49676. "lsl r6, r6, #16\n\t"
  49677. #endif
  49678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49679. "adds r4, r4, r6\n\t"
  49680. #else
  49681. "add r4, r4, r6\n\t"
  49682. #endif
  49683. #ifdef WOLFSSL_KEIL
  49684. "adcs r5, r5, r7\n\t"
  49685. #elif defined(__clang__)
  49686. "adcs r5, r7\n\t"
  49687. #else
  49688. "adc r5, r7\n\t"
  49689. #endif
  49690. #ifdef WOLFSSL_KEIL
  49691. "adcs r3, r3, %[r]\n\t"
  49692. #elif defined(__clang__)
  49693. "adcs r3, %[r]\n\t"
  49694. #else
  49695. "adc r3, %[r]\n\t"
  49696. #endif
  49697. "mov %[r], r8\n\t"
  49698. "str r4, [%[r], #76]\n\t"
  49699. "movs %[r], #0\n\t"
  49700. "# A[11] * B[9]\n\t"
  49701. "movs r4, #0\n\t"
  49702. "mov %[a], r9\n\t"
  49703. "mov %[b], r10\n\t"
  49704. "ldr %[a], [%[a], #44]\n\t"
  49705. "ldr %[b], [%[b], #36]\n\t"
  49706. "uxth r6, %[a]\n\t"
  49707. "uxth r7, %[b]\n\t"
  49708. #ifdef WOLFSSL_KEIL
  49709. "muls r7, r6, r7\n\t"
  49710. #elif defined(__clang__)
  49711. "muls r7, r6\n\t"
  49712. #else
  49713. "mul r7, r6\n\t"
  49714. #endif
  49715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49716. "adds r5, r5, r7\n\t"
  49717. #else
  49718. "add r5, r5, r7\n\t"
  49719. #endif
  49720. #ifdef WOLFSSL_KEIL
  49721. "adcs r3, r3, %[r]\n\t"
  49722. #elif defined(__clang__)
  49723. "adcs r3, %[r]\n\t"
  49724. #else
  49725. "adc r3, %[r]\n\t"
  49726. #endif
  49727. #ifdef WOLFSSL_KEIL
  49728. "adcs r4, r4, %[r]\n\t"
  49729. #elif defined(__clang__)
  49730. "adcs r4, %[r]\n\t"
  49731. #else
  49732. "adc r4, %[r]\n\t"
  49733. #endif
  49734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49735. "lsrs r7, %[b], #16\n\t"
  49736. #else
  49737. "lsr r7, %[b], #16\n\t"
  49738. #endif
  49739. #ifdef WOLFSSL_KEIL
  49740. "muls r6, r7, r6\n\t"
  49741. #elif defined(__clang__)
  49742. "muls r6, r7\n\t"
  49743. #else
  49744. "mul r6, r7\n\t"
  49745. #endif
  49746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49747. "lsrs r7, r6, #16\n\t"
  49748. #else
  49749. "lsr r7, r6, #16\n\t"
  49750. #endif
  49751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49752. "lsls r6, r6, #16\n\t"
  49753. #else
  49754. "lsl r6, r6, #16\n\t"
  49755. #endif
  49756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49757. "adds r5, r5, r6\n\t"
  49758. #else
  49759. "add r5, r5, r6\n\t"
  49760. #endif
  49761. #ifdef WOLFSSL_KEIL
  49762. "adcs r3, r3, r7\n\t"
  49763. #elif defined(__clang__)
  49764. "adcs r3, r7\n\t"
  49765. #else
  49766. "adc r3, r7\n\t"
  49767. #endif
  49768. #ifdef WOLFSSL_KEIL
  49769. "adcs r4, r4, %[r]\n\t"
  49770. #elif defined(__clang__)
  49771. "adcs r4, %[r]\n\t"
  49772. #else
  49773. "adc r4, %[r]\n\t"
  49774. #endif
  49775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49776. "lsrs r6, %[a], #16\n\t"
  49777. #else
  49778. "lsr r6, %[a], #16\n\t"
  49779. #endif
  49780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49781. "lsrs r7, %[b], #16\n\t"
  49782. #else
  49783. "lsr r7, %[b], #16\n\t"
  49784. #endif
  49785. #ifdef WOLFSSL_KEIL
  49786. "muls r7, r6, r7\n\t"
  49787. #elif defined(__clang__)
  49788. "muls r7, r6\n\t"
  49789. #else
  49790. "mul r7, r6\n\t"
  49791. #endif
  49792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49793. "adds r3, r3, r7\n\t"
  49794. #else
  49795. "add r3, r3, r7\n\t"
  49796. #endif
  49797. #ifdef WOLFSSL_KEIL
  49798. "adcs r4, r4, %[r]\n\t"
  49799. #elif defined(__clang__)
  49800. "adcs r4, %[r]\n\t"
  49801. #else
  49802. "adc r4, %[r]\n\t"
  49803. #endif
  49804. "uxth r7, %[b]\n\t"
  49805. #ifdef WOLFSSL_KEIL
  49806. "muls r6, r7, r6\n\t"
  49807. #elif defined(__clang__)
  49808. "muls r6, r7\n\t"
  49809. #else
  49810. "mul r6, r7\n\t"
  49811. #endif
  49812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49813. "lsrs r7, r6, #16\n\t"
  49814. #else
  49815. "lsr r7, r6, #16\n\t"
  49816. #endif
  49817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49818. "lsls r6, r6, #16\n\t"
  49819. #else
  49820. "lsl r6, r6, #16\n\t"
  49821. #endif
  49822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49823. "adds r5, r5, r6\n\t"
  49824. #else
  49825. "add r5, r5, r6\n\t"
  49826. #endif
  49827. #ifdef WOLFSSL_KEIL
  49828. "adcs r3, r3, r7\n\t"
  49829. #elif defined(__clang__)
  49830. "adcs r3, r7\n\t"
  49831. #else
  49832. "adc r3, r7\n\t"
  49833. #endif
  49834. #ifdef WOLFSSL_KEIL
  49835. "adcs r4, r4, %[r]\n\t"
  49836. #elif defined(__clang__)
  49837. "adcs r4, %[r]\n\t"
  49838. #else
  49839. "adc r4, %[r]\n\t"
  49840. #endif
  49841. "# A[10] * B[10]\n\t"
  49842. "mov %[a], r9\n\t"
  49843. "mov %[b], r10\n\t"
  49844. "ldr %[a], [%[a], #40]\n\t"
  49845. "ldr %[b], [%[b], #40]\n\t"
  49846. "uxth r6, %[a]\n\t"
  49847. "uxth r7, %[b]\n\t"
  49848. #ifdef WOLFSSL_KEIL
  49849. "muls r7, r6, r7\n\t"
  49850. #elif defined(__clang__)
  49851. "muls r7, r6\n\t"
  49852. #else
  49853. "mul r7, r6\n\t"
  49854. #endif
  49855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49856. "adds r5, r5, r7\n\t"
  49857. #else
  49858. "add r5, r5, r7\n\t"
  49859. #endif
  49860. #ifdef WOLFSSL_KEIL
  49861. "adcs r3, r3, %[r]\n\t"
  49862. #elif defined(__clang__)
  49863. "adcs r3, %[r]\n\t"
  49864. #else
  49865. "adc r3, %[r]\n\t"
  49866. #endif
  49867. #ifdef WOLFSSL_KEIL
  49868. "adcs r4, r4, %[r]\n\t"
  49869. #elif defined(__clang__)
  49870. "adcs r4, %[r]\n\t"
  49871. #else
  49872. "adc r4, %[r]\n\t"
  49873. #endif
  49874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49875. "lsrs r7, %[b], #16\n\t"
  49876. #else
  49877. "lsr r7, %[b], #16\n\t"
  49878. #endif
  49879. #ifdef WOLFSSL_KEIL
  49880. "muls r6, r7, r6\n\t"
  49881. #elif defined(__clang__)
  49882. "muls r6, r7\n\t"
  49883. #else
  49884. "mul r6, r7\n\t"
  49885. #endif
  49886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49887. "lsrs r7, r6, #16\n\t"
  49888. #else
  49889. "lsr r7, r6, #16\n\t"
  49890. #endif
  49891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49892. "lsls r6, r6, #16\n\t"
  49893. #else
  49894. "lsl r6, r6, #16\n\t"
  49895. #endif
  49896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49897. "adds r5, r5, r6\n\t"
  49898. #else
  49899. "add r5, r5, r6\n\t"
  49900. #endif
  49901. #ifdef WOLFSSL_KEIL
  49902. "adcs r3, r3, r7\n\t"
  49903. #elif defined(__clang__)
  49904. "adcs r3, r7\n\t"
  49905. #else
  49906. "adc r3, r7\n\t"
  49907. #endif
  49908. #ifdef WOLFSSL_KEIL
  49909. "adcs r4, r4, %[r]\n\t"
  49910. #elif defined(__clang__)
  49911. "adcs r4, %[r]\n\t"
  49912. #else
  49913. "adc r4, %[r]\n\t"
  49914. #endif
  49915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49916. "lsrs r6, %[a], #16\n\t"
  49917. #else
  49918. "lsr r6, %[a], #16\n\t"
  49919. #endif
  49920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49921. "lsrs r7, %[b], #16\n\t"
  49922. #else
  49923. "lsr r7, %[b], #16\n\t"
  49924. #endif
  49925. #ifdef WOLFSSL_KEIL
  49926. "muls r7, r6, r7\n\t"
  49927. #elif defined(__clang__)
  49928. "muls r7, r6\n\t"
  49929. #else
  49930. "mul r7, r6\n\t"
  49931. #endif
  49932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49933. "adds r3, r3, r7\n\t"
  49934. #else
  49935. "add r3, r3, r7\n\t"
  49936. #endif
  49937. #ifdef WOLFSSL_KEIL
  49938. "adcs r4, r4, %[r]\n\t"
  49939. #elif defined(__clang__)
  49940. "adcs r4, %[r]\n\t"
  49941. #else
  49942. "adc r4, %[r]\n\t"
  49943. #endif
  49944. "uxth r7, %[b]\n\t"
  49945. #ifdef WOLFSSL_KEIL
  49946. "muls r6, r7, r6\n\t"
  49947. #elif defined(__clang__)
  49948. "muls r6, r7\n\t"
  49949. #else
  49950. "mul r6, r7\n\t"
  49951. #endif
  49952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49953. "lsrs r7, r6, #16\n\t"
  49954. #else
  49955. "lsr r7, r6, #16\n\t"
  49956. #endif
  49957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49958. "lsls r6, r6, #16\n\t"
  49959. #else
  49960. "lsl r6, r6, #16\n\t"
  49961. #endif
  49962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49963. "adds r5, r5, r6\n\t"
  49964. #else
  49965. "add r5, r5, r6\n\t"
  49966. #endif
  49967. #ifdef WOLFSSL_KEIL
  49968. "adcs r3, r3, r7\n\t"
  49969. #elif defined(__clang__)
  49970. "adcs r3, r7\n\t"
  49971. #else
  49972. "adc r3, r7\n\t"
  49973. #endif
  49974. #ifdef WOLFSSL_KEIL
  49975. "adcs r4, r4, %[r]\n\t"
  49976. #elif defined(__clang__)
  49977. "adcs r4, %[r]\n\t"
  49978. #else
  49979. "adc r4, %[r]\n\t"
  49980. #endif
  49981. "# A[9] * B[11]\n\t"
  49982. "mov %[a], r9\n\t"
  49983. "mov %[b], r10\n\t"
  49984. "ldr %[a], [%[a], #36]\n\t"
  49985. "ldr %[b], [%[b], #44]\n\t"
  49986. "uxth r6, %[a]\n\t"
  49987. "uxth r7, %[b]\n\t"
  49988. #ifdef WOLFSSL_KEIL
  49989. "muls r7, r6, r7\n\t"
  49990. #elif defined(__clang__)
  49991. "muls r7, r6\n\t"
  49992. #else
  49993. "mul r7, r6\n\t"
  49994. #endif
  49995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  49996. "adds r5, r5, r7\n\t"
  49997. #else
  49998. "add r5, r5, r7\n\t"
  49999. #endif
  50000. #ifdef WOLFSSL_KEIL
  50001. "adcs r3, r3, %[r]\n\t"
  50002. #elif defined(__clang__)
  50003. "adcs r3, %[r]\n\t"
  50004. #else
  50005. "adc r3, %[r]\n\t"
  50006. #endif
  50007. #ifdef WOLFSSL_KEIL
  50008. "adcs r4, r4, %[r]\n\t"
  50009. #elif defined(__clang__)
  50010. "adcs r4, %[r]\n\t"
  50011. #else
  50012. "adc r4, %[r]\n\t"
  50013. #endif
  50014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50015. "lsrs r7, %[b], #16\n\t"
  50016. #else
  50017. "lsr r7, %[b], #16\n\t"
  50018. #endif
  50019. #ifdef WOLFSSL_KEIL
  50020. "muls r6, r7, r6\n\t"
  50021. #elif defined(__clang__)
  50022. "muls r6, r7\n\t"
  50023. #else
  50024. "mul r6, r7\n\t"
  50025. #endif
  50026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50027. "lsrs r7, r6, #16\n\t"
  50028. #else
  50029. "lsr r7, r6, #16\n\t"
  50030. #endif
  50031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50032. "lsls r6, r6, #16\n\t"
  50033. #else
  50034. "lsl r6, r6, #16\n\t"
  50035. #endif
  50036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50037. "adds r5, r5, r6\n\t"
  50038. #else
  50039. "add r5, r5, r6\n\t"
  50040. #endif
  50041. #ifdef WOLFSSL_KEIL
  50042. "adcs r3, r3, r7\n\t"
  50043. #elif defined(__clang__)
  50044. "adcs r3, r7\n\t"
  50045. #else
  50046. "adc r3, r7\n\t"
  50047. #endif
  50048. #ifdef WOLFSSL_KEIL
  50049. "adcs r4, r4, %[r]\n\t"
  50050. #elif defined(__clang__)
  50051. "adcs r4, %[r]\n\t"
  50052. #else
  50053. "adc r4, %[r]\n\t"
  50054. #endif
  50055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50056. "lsrs r6, %[a], #16\n\t"
  50057. #else
  50058. "lsr r6, %[a], #16\n\t"
  50059. #endif
  50060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50061. "lsrs r7, %[b], #16\n\t"
  50062. #else
  50063. "lsr r7, %[b], #16\n\t"
  50064. #endif
  50065. #ifdef WOLFSSL_KEIL
  50066. "muls r7, r6, r7\n\t"
  50067. #elif defined(__clang__)
  50068. "muls r7, r6\n\t"
  50069. #else
  50070. "mul r7, r6\n\t"
  50071. #endif
  50072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50073. "adds r3, r3, r7\n\t"
  50074. #else
  50075. "add r3, r3, r7\n\t"
  50076. #endif
  50077. #ifdef WOLFSSL_KEIL
  50078. "adcs r4, r4, %[r]\n\t"
  50079. #elif defined(__clang__)
  50080. "adcs r4, %[r]\n\t"
  50081. #else
  50082. "adc r4, %[r]\n\t"
  50083. #endif
  50084. "uxth r7, %[b]\n\t"
  50085. #ifdef WOLFSSL_KEIL
  50086. "muls r6, r7, r6\n\t"
  50087. #elif defined(__clang__)
  50088. "muls r6, r7\n\t"
  50089. #else
  50090. "mul r6, r7\n\t"
  50091. #endif
  50092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50093. "lsrs r7, r6, #16\n\t"
  50094. #else
  50095. "lsr r7, r6, #16\n\t"
  50096. #endif
  50097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50098. "lsls r6, r6, #16\n\t"
  50099. #else
  50100. "lsl r6, r6, #16\n\t"
  50101. #endif
  50102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50103. "adds r5, r5, r6\n\t"
  50104. #else
  50105. "add r5, r5, r6\n\t"
  50106. #endif
  50107. #ifdef WOLFSSL_KEIL
  50108. "adcs r3, r3, r7\n\t"
  50109. #elif defined(__clang__)
  50110. "adcs r3, r7\n\t"
  50111. #else
  50112. "adc r3, r7\n\t"
  50113. #endif
  50114. #ifdef WOLFSSL_KEIL
  50115. "adcs r4, r4, %[r]\n\t"
  50116. #elif defined(__clang__)
  50117. "adcs r4, %[r]\n\t"
  50118. #else
  50119. "adc r4, %[r]\n\t"
  50120. #endif
  50121. "mov %[r], r8\n\t"
  50122. "str r5, [%[r], #80]\n\t"
  50123. "movs %[r], #0\n\t"
  50124. "# A[10] * B[11]\n\t"
  50125. "movs r5, #0\n\t"
  50126. "mov %[a], r9\n\t"
  50127. "mov %[b], r10\n\t"
  50128. "ldr %[a], [%[a], #40]\n\t"
  50129. "ldr %[b], [%[b], #44]\n\t"
  50130. "uxth r6, %[a]\n\t"
  50131. "uxth r7, %[b]\n\t"
  50132. #ifdef WOLFSSL_KEIL
  50133. "muls r7, r6, r7\n\t"
  50134. #elif defined(__clang__)
  50135. "muls r7, r6\n\t"
  50136. #else
  50137. "mul r7, r6\n\t"
  50138. #endif
  50139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50140. "adds r3, r3, r7\n\t"
  50141. #else
  50142. "add r3, r3, r7\n\t"
  50143. #endif
  50144. #ifdef WOLFSSL_KEIL
  50145. "adcs r4, r4, %[r]\n\t"
  50146. #elif defined(__clang__)
  50147. "adcs r4, %[r]\n\t"
  50148. #else
  50149. "adc r4, %[r]\n\t"
  50150. #endif
  50151. #ifdef WOLFSSL_KEIL
  50152. "adcs r5, r5, %[r]\n\t"
  50153. #elif defined(__clang__)
  50154. "adcs r5, %[r]\n\t"
  50155. #else
  50156. "adc r5, %[r]\n\t"
  50157. #endif
  50158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50159. "lsrs r7, %[b], #16\n\t"
  50160. #else
  50161. "lsr r7, %[b], #16\n\t"
  50162. #endif
  50163. #ifdef WOLFSSL_KEIL
  50164. "muls r6, r7, r6\n\t"
  50165. #elif defined(__clang__)
  50166. "muls r6, r7\n\t"
  50167. #else
  50168. "mul r6, r7\n\t"
  50169. #endif
  50170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50171. "lsrs r7, r6, #16\n\t"
  50172. #else
  50173. "lsr r7, r6, #16\n\t"
  50174. #endif
  50175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50176. "lsls r6, r6, #16\n\t"
  50177. #else
  50178. "lsl r6, r6, #16\n\t"
  50179. #endif
  50180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50181. "adds r3, r3, r6\n\t"
  50182. #else
  50183. "add r3, r3, r6\n\t"
  50184. #endif
  50185. #ifdef WOLFSSL_KEIL
  50186. "adcs r4, r4, r7\n\t"
  50187. #elif defined(__clang__)
  50188. "adcs r4, r7\n\t"
  50189. #else
  50190. "adc r4, r7\n\t"
  50191. #endif
  50192. #ifdef WOLFSSL_KEIL
  50193. "adcs r5, r5, %[r]\n\t"
  50194. #elif defined(__clang__)
  50195. "adcs r5, %[r]\n\t"
  50196. #else
  50197. "adc r5, %[r]\n\t"
  50198. #endif
  50199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50200. "lsrs r6, %[a], #16\n\t"
  50201. #else
  50202. "lsr r6, %[a], #16\n\t"
  50203. #endif
  50204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50205. "lsrs r7, %[b], #16\n\t"
  50206. #else
  50207. "lsr r7, %[b], #16\n\t"
  50208. #endif
  50209. #ifdef WOLFSSL_KEIL
  50210. "muls r7, r6, r7\n\t"
  50211. #elif defined(__clang__)
  50212. "muls r7, r6\n\t"
  50213. #else
  50214. "mul r7, r6\n\t"
  50215. #endif
  50216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50217. "adds r4, r4, r7\n\t"
  50218. #else
  50219. "add r4, r4, r7\n\t"
  50220. #endif
  50221. #ifdef WOLFSSL_KEIL
  50222. "adcs r5, r5, %[r]\n\t"
  50223. #elif defined(__clang__)
  50224. "adcs r5, %[r]\n\t"
  50225. #else
  50226. "adc r5, %[r]\n\t"
  50227. #endif
  50228. "uxth r7, %[b]\n\t"
  50229. #ifdef WOLFSSL_KEIL
  50230. "muls r6, r7, r6\n\t"
  50231. #elif defined(__clang__)
  50232. "muls r6, r7\n\t"
  50233. #else
  50234. "mul r6, r7\n\t"
  50235. #endif
  50236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50237. "lsrs r7, r6, #16\n\t"
  50238. #else
  50239. "lsr r7, r6, #16\n\t"
  50240. #endif
  50241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50242. "lsls r6, r6, #16\n\t"
  50243. #else
  50244. "lsl r6, r6, #16\n\t"
  50245. #endif
  50246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50247. "adds r3, r3, r6\n\t"
  50248. #else
  50249. "add r3, r3, r6\n\t"
  50250. #endif
  50251. #ifdef WOLFSSL_KEIL
  50252. "adcs r4, r4, r7\n\t"
  50253. #elif defined(__clang__)
  50254. "adcs r4, r7\n\t"
  50255. #else
  50256. "adc r4, r7\n\t"
  50257. #endif
  50258. #ifdef WOLFSSL_KEIL
  50259. "adcs r5, r5, %[r]\n\t"
  50260. #elif defined(__clang__)
  50261. "adcs r5, %[r]\n\t"
  50262. #else
  50263. "adc r5, %[r]\n\t"
  50264. #endif
  50265. "# A[11] * B[10]\n\t"
  50266. "mov %[a], r9\n\t"
  50267. "mov %[b], r10\n\t"
  50268. "ldr %[a], [%[a], #44]\n\t"
  50269. "ldr %[b], [%[b], #40]\n\t"
  50270. "uxth r6, %[a]\n\t"
  50271. "uxth r7, %[b]\n\t"
  50272. #ifdef WOLFSSL_KEIL
  50273. "muls r7, r6, r7\n\t"
  50274. #elif defined(__clang__)
  50275. "muls r7, r6\n\t"
  50276. #else
  50277. "mul r7, r6\n\t"
  50278. #endif
  50279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50280. "adds r3, r3, r7\n\t"
  50281. #else
  50282. "add r3, r3, r7\n\t"
  50283. #endif
  50284. #ifdef WOLFSSL_KEIL
  50285. "adcs r4, r4, %[r]\n\t"
  50286. #elif defined(__clang__)
  50287. "adcs r4, %[r]\n\t"
  50288. #else
  50289. "adc r4, %[r]\n\t"
  50290. #endif
  50291. #ifdef WOLFSSL_KEIL
  50292. "adcs r5, r5, %[r]\n\t"
  50293. #elif defined(__clang__)
  50294. "adcs r5, %[r]\n\t"
  50295. #else
  50296. "adc r5, %[r]\n\t"
  50297. #endif
  50298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50299. "lsrs r7, %[b], #16\n\t"
  50300. #else
  50301. "lsr r7, %[b], #16\n\t"
  50302. #endif
  50303. #ifdef WOLFSSL_KEIL
  50304. "muls r6, r7, r6\n\t"
  50305. #elif defined(__clang__)
  50306. "muls r6, r7\n\t"
  50307. #else
  50308. "mul r6, r7\n\t"
  50309. #endif
  50310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50311. "lsrs r7, r6, #16\n\t"
  50312. #else
  50313. "lsr r7, r6, #16\n\t"
  50314. #endif
  50315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50316. "lsls r6, r6, #16\n\t"
  50317. #else
  50318. "lsl r6, r6, #16\n\t"
  50319. #endif
  50320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50321. "adds r3, r3, r6\n\t"
  50322. #else
  50323. "add r3, r3, r6\n\t"
  50324. #endif
  50325. #ifdef WOLFSSL_KEIL
  50326. "adcs r4, r4, r7\n\t"
  50327. #elif defined(__clang__)
  50328. "adcs r4, r7\n\t"
  50329. #else
  50330. "adc r4, r7\n\t"
  50331. #endif
  50332. #ifdef WOLFSSL_KEIL
  50333. "adcs r5, r5, %[r]\n\t"
  50334. #elif defined(__clang__)
  50335. "adcs r5, %[r]\n\t"
  50336. #else
  50337. "adc r5, %[r]\n\t"
  50338. #endif
  50339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50340. "lsrs r6, %[a], #16\n\t"
  50341. #else
  50342. "lsr r6, %[a], #16\n\t"
  50343. #endif
  50344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50345. "lsrs r7, %[b], #16\n\t"
  50346. #else
  50347. "lsr r7, %[b], #16\n\t"
  50348. #endif
  50349. #ifdef WOLFSSL_KEIL
  50350. "muls r7, r6, r7\n\t"
  50351. #elif defined(__clang__)
  50352. "muls r7, r6\n\t"
  50353. #else
  50354. "mul r7, r6\n\t"
  50355. #endif
  50356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50357. "adds r4, r4, r7\n\t"
  50358. #else
  50359. "add r4, r4, r7\n\t"
  50360. #endif
  50361. #ifdef WOLFSSL_KEIL
  50362. "adcs r5, r5, %[r]\n\t"
  50363. #elif defined(__clang__)
  50364. "adcs r5, %[r]\n\t"
  50365. #else
  50366. "adc r5, %[r]\n\t"
  50367. #endif
  50368. "uxth r7, %[b]\n\t"
  50369. #ifdef WOLFSSL_KEIL
  50370. "muls r6, r7, r6\n\t"
  50371. #elif defined(__clang__)
  50372. "muls r6, r7\n\t"
  50373. #else
  50374. "mul r6, r7\n\t"
  50375. #endif
  50376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50377. "lsrs r7, r6, #16\n\t"
  50378. #else
  50379. "lsr r7, r6, #16\n\t"
  50380. #endif
  50381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50382. "lsls r6, r6, #16\n\t"
  50383. #else
  50384. "lsl r6, r6, #16\n\t"
  50385. #endif
  50386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50387. "adds r3, r3, r6\n\t"
  50388. #else
  50389. "add r3, r3, r6\n\t"
  50390. #endif
  50391. #ifdef WOLFSSL_KEIL
  50392. "adcs r4, r4, r7\n\t"
  50393. #elif defined(__clang__)
  50394. "adcs r4, r7\n\t"
  50395. #else
  50396. "adc r4, r7\n\t"
  50397. #endif
  50398. #ifdef WOLFSSL_KEIL
  50399. "adcs r5, r5, %[r]\n\t"
  50400. #elif defined(__clang__)
  50401. "adcs r5, %[r]\n\t"
  50402. #else
  50403. "adc r5, %[r]\n\t"
  50404. #endif
  50405. "mov %[r], r8\n\t"
  50406. "str r3, [%[r], #84]\n\t"
  50407. "movs %[r], #0\n\t"
  50408. "# A[11] * B[11]\n\t"
  50409. "mov %[a], r9\n\t"
  50410. "mov %[b], r10\n\t"
  50411. "ldr %[a], [%[a], #44]\n\t"
  50412. "ldr %[b], [%[b], #44]\n\t"
  50413. "uxth r6, %[a]\n\t"
  50414. "uxth r7, %[b]\n\t"
  50415. #ifdef WOLFSSL_KEIL
  50416. "muls r7, r6, r7\n\t"
  50417. #elif defined(__clang__)
  50418. "muls r7, r6\n\t"
  50419. #else
  50420. "mul r7, r6\n\t"
  50421. #endif
  50422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50423. "adds r4, r4, r7\n\t"
  50424. #else
  50425. "add r4, r4, r7\n\t"
  50426. #endif
  50427. #ifdef WOLFSSL_KEIL
  50428. "adcs r5, r5, %[r]\n\t"
  50429. #elif defined(__clang__)
  50430. "adcs r5, %[r]\n\t"
  50431. #else
  50432. "adc r5, %[r]\n\t"
  50433. #endif
  50434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50435. "lsrs r7, %[b], #16\n\t"
  50436. #else
  50437. "lsr r7, %[b], #16\n\t"
  50438. #endif
  50439. #ifdef WOLFSSL_KEIL
  50440. "muls r6, r7, r6\n\t"
  50441. #elif defined(__clang__)
  50442. "muls r6, r7\n\t"
  50443. #else
  50444. "mul r6, r7\n\t"
  50445. #endif
  50446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50447. "lsrs r7, r6, #16\n\t"
  50448. #else
  50449. "lsr r7, r6, #16\n\t"
  50450. #endif
  50451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50452. "lsls r6, r6, #16\n\t"
  50453. #else
  50454. "lsl r6, r6, #16\n\t"
  50455. #endif
  50456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50457. "adds r4, r4, r6\n\t"
  50458. #else
  50459. "add r4, r4, r6\n\t"
  50460. #endif
  50461. #ifdef WOLFSSL_KEIL
  50462. "adcs r5, r5, r7\n\t"
  50463. #elif defined(__clang__)
  50464. "adcs r5, r7\n\t"
  50465. #else
  50466. "adc r5, r7\n\t"
  50467. #endif
  50468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50469. "lsrs r6, %[a], #16\n\t"
  50470. #else
  50471. "lsr r6, %[a], #16\n\t"
  50472. #endif
  50473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50474. "lsrs r7, %[b], #16\n\t"
  50475. #else
  50476. "lsr r7, %[b], #16\n\t"
  50477. #endif
  50478. #ifdef WOLFSSL_KEIL
  50479. "muls r7, r6, r7\n\t"
  50480. #elif defined(__clang__)
  50481. "muls r7, r6\n\t"
  50482. #else
  50483. "mul r7, r6\n\t"
  50484. #endif
  50485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50486. "adds r5, r5, r7\n\t"
  50487. #else
  50488. "add r5, r5, r7\n\t"
  50489. #endif
  50490. "uxth r7, %[b]\n\t"
  50491. #ifdef WOLFSSL_KEIL
  50492. "muls r6, r7, r6\n\t"
  50493. #elif defined(__clang__)
  50494. "muls r6, r7\n\t"
  50495. #else
  50496. "mul r6, r7\n\t"
  50497. #endif
  50498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50499. "lsrs r7, r6, #16\n\t"
  50500. #else
  50501. "lsr r7, r6, #16\n\t"
  50502. #endif
  50503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50504. "lsls r6, r6, #16\n\t"
  50505. #else
  50506. "lsl r6, r6, #16\n\t"
  50507. #endif
  50508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50509. "adds r4, r4, r6\n\t"
  50510. #else
  50511. "add r4, r4, r6\n\t"
  50512. #endif
  50513. #ifdef WOLFSSL_KEIL
  50514. "adcs r5, r5, r7\n\t"
  50515. #elif defined(__clang__)
  50516. "adcs r5, r7\n\t"
  50517. #else
  50518. "adc r5, r7\n\t"
  50519. #endif
  50520. "mov %[r], r8\n\t"
  50521. "str r4, [%[r], #88]\n\t"
  50522. "str r5, [%[r], #92]\n\t"
  50523. "pop {r3, r4, r5, r6}\n\t"
  50524. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  50525. "pop {r3, r4, r5, r6}\n\t"
  50526. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  50527. "pop {r3, r4, r5, r6}\n\t"
  50528. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  50529. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  50530. :
  50531. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  50532. );
  50533. }
  50534. #endif /* !WOLFSSL_SP_LARGE_CODE */
  50535. /* Add b to a into r. (r = a + b)
  50536. *
  50537. * r A single precision integer.
  50538. * a A single precision integer.
  50539. * b A single precision integer.
  50540. */
  50541. SP_NOINLINE static sp_digit sp_3072_add_12(sp_digit* r, const sp_digit* a,
  50542. const sp_digit* b)
  50543. {
  50544. __asm__ __volatile__ (
  50545. "ldm %[b]!, {r5, r6}\n\t"
  50546. "ldm %[a]!, {r3, r4}\n\t"
  50547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50548. "adds r3, r3, r5\n\t"
  50549. #else
  50550. "add r3, r3, r5\n\t"
  50551. #endif
  50552. #ifdef WOLFSSL_KEIL
  50553. "adcs r4, r4, r6\n\t"
  50554. #elif defined(__clang__)
  50555. "adcs r4, r6\n\t"
  50556. #else
  50557. "adc r4, r6\n\t"
  50558. #endif
  50559. "stm %[r]!, {r3, r4}\n\t"
  50560. "ldm %[b]!, {r5, r6}\n\t"
  50561. "ldm %[a]!, {r3, r4}\n\t"
  50562. #ifdef WOLFSSL_KEIL
  50563. "adcs r3, r3, r5\n\t"
  50564. #elif defined(__clang__)
  50565. "adcs r3, r5\n\t"
  50566. #else
  50567. "adc r3, r5\n\t"
  50568. #endif
  50569. #ifdef WOLFSSL_KEIL
  50570. "adcs r4, r4, r6\n\t"
  50571. #elif defined(__clang__)
  50572. "adcs r4, r6\n\t"
  50573. #else
  50574. "adc r4, r6\n\t"
  50575. #endif
  50576. "stm %[r]!, {r3, r4}\n\t"
  50577. "ldm %[b]!, {r5, r6}\n\t"
  50578. "ldm %[a]!, {r3, r4}\n\t"
  50579. #ifdef WOLFSSL_KEIL
  50580. "adcs r3, r3, r5\n\t"
  50581. #elif defined(__clang__)
  50582. "adcs r3, r5\n\t"
  50583. #else
  50584. "adc r3, r5\n\t"
  50585. #endif
  50586. #ifdef WOLFSSL_KEIL
  50587. "adcs r4, r4, r6\n\t"
  50588. #elif defined(__clang__)
  50589. "adcs r4, r6\n\t"
  50590. #else
  50591. "adc r4, r6\n\t"
  50592. #endif
  50593. "stm %[r]!, {r3, r4}\n\t"
  50594. "ldm %[b]!, {r5, r6}\n\t"
  50595. "ldm %[a]!, {r3, r4}\n\t"
  50596. #ifdef WOLFSSL_KEIL
  50597. "adcs r3, r3, r5\n\t"
  50598. #elif defined(__clang__)
  50599. "adcs r3, r5\n\t"
  50600. #else
  50601. "adc r3, r5\n\t"
  50602. #endif
  50603. #ifdef WOLFSSL_KEIL
  50604. "adcs r4, r4, r6\n\t"
  50605. #elif defined(__clang__)
  50606. "adcs r4, r6\n\t"
  50607. #else
  50608. "adc r4, r6\n\t"
  50609. #endif
  50610. "stm %[r]!, {r3, r4}\n\t"
  50611. "ldm %[b]!, {r5, r6}\n\t"
  50612. "ldm %[a]!, {r3, r4}\n\t"
  50613. #ifdef WOLFSSL_KEIL
  50614. "adcs r3, r3, r5\n\t"
  50615. #elif defined(__clang__)
  50616. "adcs r3, r5\n\t"
  50617. #else
  50618. "adc r3, r5\n\t"
  50619. #endif
  50620. #ifdef WOLFSSL_KEIL
  50621. "adcs r4, r4, r6\n\t"
  50622. #elif defined(__clang__)
  50623. "adcs r4, r6\n\t"
  50624. #else
  50625. "adc r4, r6\n\t"
  50626. #endif
  50627. "stm %[r]!, {r3, r4}\n\t"
  50628. "ldm %[b]!, {r5, r6}\n\t"
  50629. "ldm %[a]!, {r3, r4}\n\t"
  50630. #ifdef WOLFSSL_KEIL
  50631. "adcs r3, r3, r5\n\t"
  50632. #elif defined(__clang__)
  50633. "adcs r3, r5\n\t"
  50634. #else
  50635. "adc r3, r5\n\t"
  50636. #endif
  50637. #ifdef WOLFSSL_KEIL
  50638. "adcs r4, r4, r6\n\t"
  50639. #elif defined(__clang__)
  50640. "adcs r4, r6\n\t"
  50641. #else
  50642. "adc r4, r6\n\t"
  50643. #endif
  50644. "stm %[r]!, {r3, r4}\n\t"
  50645. "movs %[r], #0\n\t"
  50646. #ifdef WOLFSSL_KEIL
  50647. "adcs %[r], %[r], %[r]\n\t"
  50648. #elif defined(__clang__)
  50649. "adcs %[r], %[r]\n\t"
  50650. #else
  50651. "adc %[r], %[r]\n\t"
  50652. #endif
  50653. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  50654. :
  50655. : "memory", "r3", "r4", "r5", "r6"
  50656. );
  50657. return (uint32_t)(size_t)r;
  50658. }
  50659. /* Add b to a into r. (r = a + b)
  50660. *
  50661. * r A single precision integer.
  50662. * a A single precision integer.
  50663. * b A single precision integer.
  50664. */
  50665. SP_NOINLINE static sp_digit sp_3072_add_word_12(sp_digit* r, const sp_digit* a,
  50666. sp_digit b)
  50667. {
  50668. __asm__ __volatile__ (
  50669. "movs r5, #0\n\t"
  50670. "ldm %[a]!, {r3, r4}\n\t"
  50671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50672. "adds r3, r3, %[b]\n\t"
  50673. #else
  50674. "add r3, r3, %[b]\n\t"
  50675. #endif
  50676. #ifdef WOLFSSL_KEIL
  50677. "adcs r4, r4, r5\n\t"
  50678. #elif defined(__clang__)
  50679. "adcs r4, r5\n\t"
  50680. #else
  50681. "adc r4, r5\n\t"
  50682. #endif
  50683. "stm %[r]!, {r3, r4}\n\t"
  50684. "ldm %[a]!, {r3, r4}\n\t"
  50685. #ifdef WOLFSSL_KEIL
  50686. "adcs r3, r3, r5\n\t"
  50687. #elif defined(__clang__)
  50688. "adcs r3, r5\n\t"
  50689. #else
  50690. "adc r3, r5\n\t"
  50691. #endif
  50692. #ifdef WOLFSSL_KEIL
  50693. "adcs r4, r4, r5\n\t"
  50694. #elif defined(__clang__)
  50695. "adcs r4, r5\n\t"
  50696. #else
  50697. "adc r4, r5\n\t"
  50698. #endif
  50699. "stm %[r]!, {r3, r4}\n\t"
  50700. "ldm %[a]!, {r3, r4}\n\t"
  50701. #ifdef WOLFSSL_KEIL
  50702. "adcs r3, r3, r5\n\t"
  50703. #elif defined(__clang__)
  50704. "adcs r3, r5\n\t"
  50705. #else
  50706. "adc r3, r5\n\t"
  50707. #endif
  50708. #ifdef WOLFSSL_KEIL
  50709. "adcs r4, r4, r5\n\t"
  50710. #elif defined(__clang__)
  50711. "adcs r4, r5\n\t"
  50712. #else
  50713. "adc r4, r5\n\t"
  50714. #endif
  50715. "stm %[r]!, {r3, r4}\n\t"
  50716. "ldm %[a]!, {r3, r4}\n\t"
  50717. #ifdef WOLFSSL_KEIL
  50718. "adcs r3, r3, r5\n\t"
  50719. #elif defined(__clang__)
  50720. "adcs r3, r5\n\t"
  50721. #else
  50722. "adc r3, r5\n\t"
  50723. #endif
  50724. #ifdef WOLFSSL_KEIL
  50725. "adcs r4, r4, r5\n\t"
  50726. #elif defined(__clang__)
  50727. "adcs r4, r5\n\t"
  50728. #else
  50729. "adc r4, r5\n\t"
  50730. #endif
  50731. "stm %[r]!, {r3, r4}\n\t"
  50732. "ldm %[a]!, {r3, r4}\n\t"
  50733. #ifdef WOLFSSL_KEIL
  50734. "adcs r3, r3, r5\n\t"
  50735. #elif defined(__clang__)
  50736. "adcs r3, r5\n\t"
  50737. #else
  50738. "adc r3, r5\n\t"
  50739. #endif
  50740. #ifdef WOLFSSL_KEIL
  50741. "adcs r4, r4, r5\n\t"
  50742. #elif defined(__clang__)
  50743. "adcs r4, r5\n\t"
  50744. #else
  50745. "adc r4, r5\n\t"
  50746. #endif
  50747. "stm %[r]!, {r3, r4}\n\t"
  50748. "ldm %[a]!, {r3, r4}\n\t"
  50749. #ifdef WOLFSSL_KEIL
  50750. "adcs r3, r3, r5\n\t"
  50751. #elif defined(__clang__)
  50752. "adcs r3, r5\n\t"
  50753. #else
  50754. "adc r3, r5\n\t"
  50755. #endif
  50756. #ifdef WOLFSSL_KEIL
  50757. "adcs r4, r4, r5\n\t"
  50758. #elif defined(__clang__)
  50759. "adcs r4, r5\n\t"
  50760. #else
  50761. "adc r4, r5\n\t"
  50762. #endif
  50763. "stm %[r]!, {r3, r4}\n\t"
  50764. "movs %[r], #0\n\t"
  50765. #ifdef WOLFSSL_KEIL
  50766. "adcs %[r], %[r], %[r]\n\t"
  50767. #elif defined(__clang__)
  50768. "adcs %[r], %[r]\n\t"
  50769. #else
  50770. "adc %[r], %[r]\n\t"
  50771. #endif
  50772. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  50773. :
  50774. : "memory", "r3", "r4", "r5"
  50775. );
  50776. return (uint32_t)(size_t)r;
  50777. }
  50778. /* Sub b from a into a. (a -= b)
  50779. *
  50780. * a A single precision integer.
  50781. * b A single precision integer.
  50782. */
  50783. SP_NOINLINE static sp_digit sp_3072_sub_in_place_24(sp_digit* a,
  50784. const sp_digit* b)
  50785. {
  50786. __asm__ __volatile__ (
  50787. "ldm %[b]!, {r4, r5}\n\t"
  50788. "ldr r2, [%[a]]\n\t"
  50789. "ldr r3, [%[a], #4]\n\t"
  50790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  50791. "subs r2, r2, r4\n\t"
  50792. #else
  50793. "sub r2, r2, r4\n\t"
  50794. #endif
  50795. #ifdef WOLFSSL_KEIL
  50796. "sbcs r3, r3, r5\n\t"
  50797. #elif defined(__clang__)
  50798. "sbcs r3, r5\n\t"
  50799. #else
  50800. "sbc r3, r5\n\t"
  50801. #endif
  50802. "stm %[a]!, {r2, r3}\n\t"
  50803. "ldm %[b]!, {r4, r5}\n\t"
  50804. "ldr r2, [%[a]]\n\t"
  50805. "ldr r3, [%[a], #4]\n\t"
  50806. #ifdef WOLFSSL_KEIL
  50807. "sbcs r2, r2, r4\n\t"
  50808. #elif defined(__clang__)
  50809. "sbcs r2, r4\n\t"
  50810. #else
  50811. "sbc r2, r4\n\t"
  50812. #endif
  50813. #ifdef WOLFSSL_KEIL
  50814. "sbcs r3, r3, r5\n\t"
  50815. #elif defined(__clang__)
  50816. "sbcs r3, r5\n\t"
  50817. #else
  50818. "sbc r3, r5\n\t"
  50819. #endif
  50820. "stm %[a]!, {r2, r3}\n\t"
  50821. "ldm %[b]!, {r4, r5}\n\t"
  50822. "ldr r2, [%[a]]\n\t"
  50823. "ldr r3, [%[a], #4]\n\t"
  50824. #ifdef WOLFSSL_KEIL
  50825. "sbcs r2, r2, r4\n\t"
  50826. #elif defined(__clang__)
  50827. "sbcs r2, r4\n\t"
  50828. #else
  50829. "sbc r2, r4\n\t"
  50830. #endif
  50831. #ifdef WOLFSSL_KEIL
  50832. "sbcs r3, r3, r5\n\t"
  50833. #elif defined(__clang__)
  50834. "sbcs r3, r5\n\t"
  50835. #else
  50836. "sbc r3, r5\n\t"
  50837. #endif
  50838. "stm %[a]!, {r2, r3}\n\t"
  50839. "ldm %[b]!, {r4, r5}\n\t"
  50840. "ldr r2, [%[a]]\n\t"
  50841. "ldr r3, [%[a], #4]\n\t"
  50842. #ifdef WOLFSSL_KEIL
  50843. "sbcs r2, r2, r4\n\t"
  50844. #elif defined(__clang__)
  50845. "sbcs r2, r4\n\t"
  50846. #else
  50847. "sbc r2, r4\n\t"
  50848. #endif
  50849. #ifdef WOLFSSL_KEIL
  50850. "sbcs r3, r3, r5\n\t"
  50851. #elif defined(__clang__)
  50852. "sbcs r3, r5\n\t"
  50853. #else
  50854. "sbc r3, r5\n\t"
  50855. #endif
  50856. "stm %[a]!, {r2, r3}\n\t"
  50857. "ldm %[b]!, {r4, r5}\n\t"
  50858. "ldr r2, [%[a]]\n\t"
  50859. "ldr r3, [%[a], #4]\n\t"
  50860. #ifdef WOLFSSL_KEIL
  50861. "sbcs r2, r2, r4\n\t"
  50862. #elif defined(__clang__)
  50863. "sbcs r2, r4\n\t"
  50864. #else
  50865. "sbc r2, r4\n\t"
  50866. #endif
  50867. #ifdef WOLFSSL_KEIL
  50868. "sbcs r3, r3, r5\n\t"
  50869. #elif defined(__clang__)
  50870. "sbcs r3, r5\n\t"
  50871. #else
  50872. "sbc r3, r5\n\t"
  50873. #endif
  50874. "stm %[a]!, {r2, r3}\n\t"
  50875. "ldm %[b]!, {r4, r5}\n\t"
  50876. "ldr r2, [%[a]]\n\t"
  50877. "ldr r3, [%[a], #4]\n\t"
  50878. #ifdef WOLFSSL_KEIL
  50879. "sbcs r2, r2, r4\n\t"
  50880. #elif defined(__clang__)
  50881. "sbcs r2, r4\n\t"
  50882. #else
  50883. "sbc r2, r4\n\t"
  50884. #endif
  50885. #ifdef WOLFSSL_KEIL
  50886. "sbcs r3, r3, r5\n\t"
  50887. #elif defined(__clang__)
  50888. "sbcs r3, r5\n\t"
  50889. #else
  50890. "sbc r3, r5\n\t"
  50891. #endif
  50892. "stm %[a]!, {r2, r3}\n\t"
  50893. "ldm %[b]!, {r4, r5}\n\t"
  50894. "ldr r2, [%[a]]\n\t"
  50895. "ldr r3, [%[a], #4]\n\t"
  50896. #ifdef WOLFSSL_KEIL
  50897. "sbcs r2, r2, r4\n\t"
  50898. #elif defined(__clang__)
  50899. "sbcs r2, r4\n\t"
  50900. #else
  50901. "sbc r2, r4\n\t"
  50902. #endif
  50903. #ifdef WOLFSSL_KEIL
  50904. "sbcs r3, r3, r5\n\t"
  50905. #elif defined(__clang__)
  50906. "sbcs r3, r5\n\t"
  50907. #else
  50908. "sbc r3, r5\n\t"
  50909. #endif
  50910. "stm %[a]!, {r2, r3}\n\t"
  50911. "ldm %[b]!, {r4, r5}\n\t"
  50912. "ldr r2, [%[a]]\n\t"
  50913. "ldr r3, [%[a], #4]\n\t"
  50914. #ifdef WOLFSSL_KEIL
  50915. "sbcs r2, r2, r4\n\t"
  50916. #elif defined(__clang__)
  50917. "sbcs r2, r4\n\t"
  50918. #else
  50919. "sbc r2, r4\n\t"
  50920. #endif
  50921. #ifdef WOLFSSL_KEIL
  50922. "sbcs r3, r3, r5\n\t"
  50923. #elif defined(__clang__)
  50924. "sbcs r3, r5\n\t"
  50925. #else
  50926. "sbc r3, r5\n\t"
  50927. #endif
  50928. "stm %[a]!, {r2, r3}\n\t"
  50929. "ldm %[b]!, {r4, r5}\n\t"
  50930. "ldr r2, [%[a]]\n\t"
  50931. "ldr r3, [%[a], #4]\n\t"
  50932. #ifdef WOLFSSL_KEIL
  50933. "sbcs r2, r2, r4\n\t"
  50934. #elif defined(__clang__)
  50935. "sbcs r2, r4\n\t"
  50936. #else
  50937. "sbc r2, r4\n\t"
  50938. #endif
  50939. #ifdef WOLFSSL_KEIL
  50940. "sbcs r3, r3, r5\n\t"
  50941. #elif defined(__clang__)
  50942. "sbcs r3, r5\n\t"
  50943. #else
  50944. "sbc r3, r5\n\t"
  50945. #endif
  50946. "stm %[a]!, {r2, r3}\n\t"
  50947. "ldm %[b]!, {r4, r5}\n\t"
  50948. "ldr r2, [%[a]]\n\t"
  50949. "ldr r3, [%[a], #4]\n\t"
  50950. #ifdef WOLFSSL_KEIL
  50951. "sbcs r2, r2, r4\n\t"
  50952. #elif defined(__clang__)
  50953. "sbcs r2, r4\n\t"
  50954. #else
  50955. "sbc r2, r4\n\t"
  50956. #endif
  50957. #ifdef WOLFSSL_KEIL
  50958. "sbcs r3, r3, r5\n\t"
  50959. #elif defined(__clang__)
  50960. "sbcs r3, r5\n\t"
  50961. #else
  50962. "sbc r3, r5\n\t"
  50963. #endif
  50964. "stm %[a]!, {r2, r3}\n\t"
  50965. "ldm %[b]!, {r4, r5}\n\t"
  50966. "ldr r2, [%[a]]\n\t"
  50967. "ldr r3, [%[a], #4]\n\t"
  50968. #ifdef WOLFSSL_KEIL
  50969. "sbcs r2, r2, r4\n\t"
  50970. #elif defined(__clang__)
  50971. "sbcs r2, r4\n\t"
  50972. #else
  50973. "sbc r2, r4\n\t"
  50974. #endif
  50975. #ifdef WOLFSSL_KEIL
  50976. "sbcs r3, r3, r5\n\t"
  50977. #elif defined(__clang__)
  50978. "sbcs r3, r5\n\t"
  50979. #else
  50980. "sbc r3, r5\n\t"
  50981. #endif
  50982. "stm %[a]!, {r2, r3}\n\t"
  50983. "ldm %[b]!, {r4, r5}\n\t"
  50984. "ldr r2, [%[a]]\n\t"
  50985. "ldr r3, [%[a], #4]\n\t"
  50986. #ifdef WOLFSSL_KEIL
  50987. "sbcs r2, r2, r4\n\t"
  50988. #elif defined(__clang__)
  50989. "sbcs r2, r4\n\t"
  50990. #else
  50991. "sbc r2, r4\n\t"
  50992. #endif
  50993. #ifdef WOLFSSL_KEIL
  50994. "sbcs r3, r3, r5\n\t"
  50995. #elif defined(__clang__)
  50996. "sbcs r3, r5\n\t"
  50997. #else
  50998. "sbc r3, r5\n\t"
  50999. #endif
  51000. "stm %[a]!, {r2, r3}\n\t"
  51001. #ifdef WOLFSSL_KEIL
  51002. "sbcs %[a], %[a], %[a]\n\t"
  51003. #elif defined(__clang__)
  51004. "sbcs %[a], %[a]\n\t"
  51005. #else
  51006. "sbc %[a], %[a]\n\t"
  51007. #endif
  51008. : [a] "+l" (a), [b] "+l" (b)
  51009. :
  51010. : "memory", "r2", "r3", "r4", "r5"
  51011. );
  51012. return (uint32_t)(size_t)a;
  51013. }
  51014. /* Add b to a into r. (r = a + b)
  51015. *
  51016. * r A single precision integer.
  51017. * a A single precision integer.
  51018. * b A single precision integer.
  51019. */
  51020. SP_NOINLINE static sp_digit sp_3072_add_24(sp_digit* r, const sp_digit* a,
  51021. const sp_digit* b)
  51022. {
  51023. __asm__ __volatile__ (
  51024. "ldm %[b]!, {r5, r6}\n\t"
  51025. "ldm %[a]!, {r3, r4}\n\t"
  51026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51027. "adds r3, r3, r5\n\t"
  51028. #else
  51029. "add r3, r3, r5\n\t"
  51030. #endif
  51031. #ifdef WOLFSSL_KEIL
  51032. "adcs r4, r4, r6\n\t"
  51033. #elif defined(__clang__)
  51034. "adcs r4, r6\n\t"
  51035. #else
  51036. "adc r4, r6\n\t"
  51037. #endif
  51038. "stm %[r]!, {r3, r4}\n\t"
  51039. "ldm %[b]!, {r5, r6}\n\t"
  51040. "ldm %[a]!, {r3, r4}\n\t"
  51041. #ifdef WOLFSSL_KEIL
  51042. "adcs r3, r3, r5\n\t"
  51043. #elif defined(__clang__)
  51044. "adcs r3, r5\n\t"
  51045. #else
  51046. "adc r3, r5\n\t"
  51047. #endif
  51048. #ifdef WOLFSSL_KEIL
  51049. "adcs r4, r4, r6\n\t"
  51050. #elif defined(__clang__)
  51051. "adcs r4, r6\n\t"
  51052. #else
  51053. "adc r4, r6\n\t"
  51054. #endif
  51055. "stm %[r]!, {r3, r4}\n\t"
  51056. "ldm %[b]!, {r5, r6}\n\t"
  51057. "ldm %[a]!, {r3, r4}\n\t"
  51058. #ifdef WOLFSSL_KEIL
  51059. "adcs r3, r3, r5\n\t"
  51060. #elif defined(__clang__)
  51061. "adcs r3, r5\n\t"
  51062. #else
  51063. "adc r3, r5\n\t"
  51064. #endif
  51065. #ifdef WOLFSSL_KEIL
  51066. "adcs r4, r4, r6\n\t"
  51067. #elif defined(__clang__)
  51068. "adcs r4, r6\n\t"
  51069. #else
  51070. "adc r4, r6\n\t"
  51071. #endif
  51072. "stm %[r]!, {r3, r4}\n\t"
  51073. "ldm %[b]!, {r5, r6}\n\t"
  51074. "ldm %[a]!, {r3, r4}\n\t"
  51075. #ifdef WOLFSSL_KEIL
  51076. "adcs r3, r3, r5\n\t"
  51077. #elif defined(__clang__)
  51078. "adcs r3, r5\n\t"
  51079. #else
  51080. "adc r3, r5\n\t"
  51081. #endif
  51082. #ifdef WOLFSSL_KEIL
  51083. "adcs r4, r4, r6\n\t"
  51084. #elif defined(__clang__)
  51085. "adcs r4, r6\n\t"
  51086. #else
  51087. "adc r4, r6\n\t"
  51088. #endif
  51089. "stm %[r]!, {r3, r4}\n\t"
  51090. "ldm %[b]!, {r5, r6}\n\t"
  51091. "ldm %[a]!, {r3, r4}\n\t"
  51092. #ifdef WOLFSSL_KEIL
  51093. "adcs r3, r3, r5\n\t"
  51094. #elif defined(__clang__)
  51095. "adcs r3, r5\n\t"
  51096. #else
  51097. "adc r3, r5\n\t"
  51098. #endif
  51099. #ifdef WOLFSSL_KEIL
  51100. "adcs r4, r4, r6\n\t"
  51101. #elif defined(__clang__)
  51102. "adcs r4, r6\n\t"
  51103. #else
  51104. "adc r4, r6\n\t"
  51105. #endif
  51106. "stm %[r]!, {r3, r4}\n\t"
  51107. "ldm %[b]!, {r5, r6}\n\t"
  51108. "ldm %[a]!, {r3, r4}\n\t"
  51109. #ifdef WOLFSSL_KEIL
  51110. "adcs r3, r3, r5\n\t"
  51111. #elif defined(__clang__)
  51112. "adcs r3, r5\n\t"
  51113. #else
  51114. "adc r3, r5\n\t"
  51115. #endif
  51116. #ifdef WOLFSSL_KEIL
  51117. "adcs r4, r4, r6\n\t"
  51118. #elif defined(__clang__)
  51119. "adcs r4, r6\n\t"
  51120. #else
  51121. "adc r4, r6\n\t"
  51122. #endif
  51123. "stm %[r]!, {r3, r4}\n\t"
  51124. "ldm %[b]!, {r5, r6}\n\t"
  51125. "ldm %[a]!, {r3, r4}\n\t"
  51126. #ifdef WOLFSSL_KEIL
  51127. "adcs r3, r3, r5\n\t"
  51128. #elif defined(__clang__)
  51129. "adcs r3, r5\n\t"
  51130. #else
  51131. "adc r3, r5\n\t"
  51132. #endif
  51133. #ifdef WOLFSSL_KEIL
  51134. "adcs r4, r4, r6\n\t"
  51135. #elif defined(__clang__)
  51136. "adcs r4, r6\n\t"
  51137. #else
  51138. "adc r4, r6\n\t"
  51139. #endif
  51140. "stm %[r]!, {r3, r4}\n\t"
  51141. "ldm %[b]!, {r5, r6}\n\t"
  51142. "ldm %[a]!, {r3, r4}\n\t"
  51143. #ifdef WOLFSSL_KEIL
  51144. "adcs r3, r3, r5\n\t"
  51145. #elif defined(__clang__)
  51146. "adcs r3, r5\n\t"
  51147. #else
  51148. "adc r3, r5\n\t"
  51149. #endif
  51150. #ifdef WOLFSSL_KEIL
  51151. "adcs r4, r4, r6\n\t"
  51152. #elif defined(__clang__)
  51153. "adcs r4, r6\n\t"
  51154. #else
  51155. "adc r4, r6\n\t"
  51156. #endif
  51157. "stm %[r]!, {r3, r4}\n\t"
  51158. "ldm %[b]!, {r5, r6}\n\t"
  51159. "ldm %[a]!, {r3, r4}\n\t"
  51160. #ifdef WOLFSSL_KEIL
  51161. "adcs r3, r3, r5\n\t"
  51162. #elif defined(__clang__)
  51163. "adcs r3, r5\n\t"
  51164. #else
  51165. "adc r3, r5\n\t"
  51166. #endif
  51167. #ifdef WOLFSSL_KEIL
  51168. "adcs r4, r4, r6\n\t"
  51169. #elif defined(__clang__)
  51170. "adcs r4, r6\n\t"
  51171. #else
  51172. "adc r4, r6\n\t"
  51173. #endif
  51174. "stm %[r]!, {r3, r4}\n\t"
  51175. "ldm %[b]!, {r5, r6}\n\t"
  51176. "ldm %[a]!, {r3, r4}\n\t"
  51177. #ifdef WOLFSSL_KEIL
  51178. "adcs r3, r3, r5\n\t"
  51179. #elif defined(__clang__)
  51180. "adcs r3, r5\n\t"
  51181. #else
  51182. "adc r3, r5\n\t"
  51183. #endif
  51184. #ifdef WOLFSSL_KEIL
  51185. "adcs r4, r4, r6\n\t"
  51186. #elif defined(__clang__)
  51187. "adcs r4, r6\n\t"
  51188. #else
  51189. "adc r4, r6\n\t"
  51190. #endif
  51191. "stm %[r]!, {r3, r4}\n\t"
  51192. "ldm %[b]!, {r5, r6}\n\t"
  51193. "ldm %[a]!, {r3, r4}\n\t"
  51194. #ifdef WOLFSSL_KEIL
  51195. "adcs r3, r3, r5\n\t"
  51196. #elif defined(__clang__)
  51197. "adcs r3, r5\n\t"
  51198. #else
  51199. "adc r3, r5\n\t"
  51200. #endif
  51201. #ifdef WOLFSSL_KEIL
  51202. "adcs r4, r4, r6\n\t"
  51203. #elif defined(__clang__)
  51204. "adcs r4, r6\n\t"
  51205. #else
  51206. "adc r4, r6\n\t"
  51207. #endif
  51208. "stm %[r]!, {r3, r4}\n\t"
  51209. "ldm %[b]!, {r5, r6}\n\t"
  51210. "ldm %[a]!, {r3, r4}\n\t"
  51211. #ifdef WOLFSSL_KEIL
  51212. "adcs r3, r3, r5\n\t"
  51213. #elif defined(__clang__)
  51214. "adcs r3, r5\n\t"
  51215. #else
  51216. "adc r3, r5\n\t"
  51217. #endif
  51218. #ifdef WOLFSSL_KEIL
  51219. "adcs r4, r4, r6\n\t"
  51220. #elif defined(__clang__)
  51221. "adcs r4, r6\n\t"
  51222. #else
  51223. "adc r4, r6\n\t"
  51224. #endif
  51225. "stm %[r]!, {r3, r4}\n\t"
  51226. "movs %[r], #0\n\t"
  51227. #ifdef WOLFSSL_KEIL
  51228. "adcs %[r], %[r], %[r]\n\t"
  51229. #elif defined(__clang__)
  51230. "adcs %[r], %[r]\n\t"
  51231. #else
  51232. "adc %[r], %[r]\n\t"
  51233. #endif
  51234. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  51235. :
  51236. : "memory", "r3", "r4", "r5", "r6"
  51237. );
  51238. return (uint32_t)(size_t)r;
  51239. }
  51240. /* AND m into each word of a and store in r.
  51241. *
  51242. * r A single precision integer.
  51243. * a A single precision integer.
  51244. * m Mask to AND against each digit.
  51245. */
  51246. static void sp_3072_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  51247. {
  51248. #ifdef WOLFSSL_SP_SMALL
  51249. int i;
  51250. for (i=0; i<12; i++) {
  51251. r[i] = a[i] & m;
  51252. }
  51253. #else
  51254. r[0] = a[0] & m;
  51255. r[1] = a[1] & m;
  51256. r[2] = a[2] & m;
  51257. r[3] = a[3] & m;
  51258. r[4] = a[4] & m;
  51259. r[5] = a[5] & m;
  51260. r[6] = a[6] & m;
  51261. r[7] = a[7] & m;
  51262. r[8] = a[8] & m;
  51263. r[9] = a[9] & m;
  51264. r[10] = a[10] & m;
  51265. r[11] = a[11] & m;
  51266. #endif
  51267. }
  51268. /* Multiply a and b into r. (r = a * b)
  51269. *
  51270. * r A single precision integer.
  51271. * a A single precision integer.
  51272. * b A single precision integer.
  51273. */
  51274. SP_NOINLINE static void sp_3072_mul_24(sp_digit* r, const sp_digit* a,
  51275. const sp_digit* b)
  51276. {
  51277. sp_digit* z0 = r;
  51278. sp_digit z1[24];
  51279. sp_digit a1[12];
  51280. sp_digit b1[12];
  51281. sp_digit* z2 = r + 24;
  51282. sp_digit u;
  51283. sp_digit ca;
  51284. sp_digit cb;
  51285. ca = sp_3072_add_12(a1, a, &a[12]);
  51286. cb = sp_3072_add_12(b1, b, &b[12]);
  51287. u = ca & cb;
  51288. sp_3072_mul_12(z2, &a[12], &b[12]);
  51289. sp_3072_mul_12(z0, a, b);
  51290. sp_3072_mul_12(z1, a1, b1);
  51291. u += sp_3072_sub_in_place_24(z1, z0);
  51292. u += sp_3072_sub_in_place_24(z1, z2);
  51293. sp_3072_mask_12(a1, a1, 0 - cb);
  51294. u += sp_3072_add_12(z1 + 12, z1 + 12, a1);
  51295. sp_3072_mask_12(b1, b1, 0 - ca);
  51296. u += sp_3072_add_12(z1 + 12, z1 + 12, b1);
  51297. u += sp_3072_add_24(r + 12, r + 12, z1);
  51298. (void)sp_3072_add_word_12(r + 36, r + 36, u);
  51299. }
  51300. /* Add b to a into r. (r = a + b)
  51301. *
  51302. * r A single precision integer.
  51303. * a A single precision integer.
  51304. * b A single precision integer.
  51305. */
  51306. SP_NOINLINE static sp_digit sp_3072_add_word_24(sp_digit* r, const sp_digit* a,
  51307. sp_digit b)
  51308. {
  51309. __asm__ __volatile__ (
  51310. "movs r5, #0\n\t"
  51311. "ldm %[a]!, {r3, r4}\n\t"
  51312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51313. "adds r3, r3, %[b]\n\t"
  51314. #else
  51315. "add r3, r3, %[b]\n\t"
  51316. #endif
  51317. #ifdef WOLFSSL_KEIL
  51318. "adcs r4, r4, r5\n\t"
  51319. #elif defined(__clang__)
  51320. "adcs r4, r5\n\t"
  51321. #else
  51322. "adc r4, r5\n\t"
  51323. #endif
  51324. "stm %[r]!, {r3, r4}\n\t"
  51325. "ldm %[a]!, {r3, r4}\n\t"
  51326. #ifdef WOLFSSL_KEIL
  51327. "adcs r3, r3, r5\n\t"
  51328. #elif defined(__clang__)
  51329. "adcs r3, r5\n\t"
  51330. #else
  51331. "adc r3, r5\n\t"
  51332. #endif
  51333. #ifdef WOLFSSL_KEIL
  51334. "adcs r4, r4, r5\n\t"
  51335. #elif defined(__clang__)
  51336. "adcs r4, r5\n\t"
  51337. #else
  51338. "adc r4, r5\n\t"
  51339. #endif
  51340. "stm %[r]!, {r3, r4}\n\t"
  51341. "ldm %[a]!, {r3, r4}\n\t"
  51342. #ifdef WOLFSSL_KEIL
  51343. "adcs r3, r3, r5\n\t"
  51344. #elif defined(__clang__)
  51345. "adcs r3, r5\n\t"
  51346. #else
  51347. "adc r3, r5\n\t"
  51348. #endif
  51349. #ifdef WOLFSSL_KEIL
  51350. "adcs r4, r4, r5\n\t"
  51351. #elif defined(__clang__)
  51352. "adcs r4, r5\n\t"
  51353. #else
  51354. "adc r4, r5\n\t"
  51355. #endif
  51356. "stm %[r]!, {r3, r4}\n\t"
  51357. "ldm %[a]!, {r3, r4}\n\t"
  51358. #ifdef WOLFSSL_KEIL
  51359. "adcs r3, r3, r5\n\t"
  51360. #elif defined(__clang__)
  51361. "adcs r3, r5\n\t"
  51362. #else
  51363. "adc r3, r5\n\t"
  51364. #endif
  51365. #ifdef WOLFSSL_KEIL
  51366. "adcs r4, r4, r5\n\t"
  51367. #elif defined(__clang__)
  51368. "adcs r4, r5\n\t"
  51369. #else
  51370. "adc r4, r5\n\t"
  51371. #endif
  51372. "stm %[r]!, {r3, r4}\n\t"
  51373. "ldm %[a]!, {r3, r4}\n\t"
  51374. #ifdef WOLFSSL_KEIL
  51375. "adcs r3, r3, r5\n\t"
  51376. #elif defined(__clang__)
  51377. "adcs r3, r5\n\t"
  51378. #else
  51379. "adc r3, r5\n\t"
  51380. #endif
  51381. #ifdef WOLFSSL_KEIL
  51382. "adcs r4, r4, r5\n\t"
  51383. #elif defined(__clang__)
  51384. "adcs r4, r5\n\t"
  51385. #else
  51386. "adc r4, r5\n\t"
  51387. #endif
  51388. "stm %[r]!, {r3, r4}\n\t"
  51389. "ldm %[a]!, {r3, r4}\n\t"
  51390. #ifdef WOLFSSL_KEIL
  51391. "adcs r3, r3, r5\n\t"
  51392. #elif defined(__clang__)
  51393. "adcs r3, r5\n\t"
  51394. #else
  51395. "adc r3, r5\n\t"
  51396. #endif
  51397. #ifdef WOLFSSL_KEIL
  51398. "adcs r4, r4, r5\n\t"
  51399. #elif defined(__clang__)
  51400. "adcs r4, r5\n\t"
  51401. #else
  51402. "adc r4, r5\n\t"
  51403. #endif
  51404. "stm %[r]!, {r3, r4}\n\t"
  51405. "ldm %[a]!, {r3, r4}\n\t"
  51406. #ifdef WOLFSSL_KEIL
  51407. "adcs r3, r3, r5\n\t"
  51408. #elif defined(__clang__)
  51409. "adcs r3, r5\n\t"
  51410. #else
  51411. "adc r3, r5\n\t"
  51412. #endif
  51413. #ifdef WOLFSSL_KEIL
  51414. "adcs r4, r4, r5\n\t"
  51415. #elif defined(__clang__)
  51416. "adcs r4, r5\n\t"
  51417. #else
  51418. "adc r4, r5\n\t"
  51419. #endif
  51420. "stm %[r]!, {r3, r4}\n\t"
  51421. "ldm %[a]!, {r3, r4}\n\t"
  51422. #ifdef WOLFSSL_KEIL
  51423. "adcs r3, r3, r5\n\t"
  51424. #elif defined(__clang__)
  51425. "adcs r3, r5\n\t"
  51426. #else
  51427. "adc r3, r5\n\t"
  51428. #endif
  51429. #ifdef WOLFSSL_KEIL
  51430. "adcs r4, r4, r5\n\t"
  51431. #elif defined(__clang__)
  51432. "adcs r4, r5\n\t"
  51433. #else
  51434. "adc r4, r5\n\t"
  51435. #endif
  51436. "stm %[r]!, {r3, r4}\n\t"
  51437. "ldm %[a]!, {r3, r4}\n\t"
  51438. #ifdef WOLFSSL_KEIL
  51439. "adcs r3, r3, r5\n\t"
  51440. #elif defined(__clang__)
  51441. "adcs r3, r5\n\t"
  51442. #else
  51443. "adc r3, r5\n\t"
  51444. #endif
  51445. #ifdef WOLFSSL_KEIL
  51446. "adcs r4, r4, r5\n\t"
  51447. #elif defined(__clang__)
  51448. "adcs r4, r5\n\t"
  51449. #else
  51450. "adc r4, r5\n\t"
  51451. #endif
  51452. "stm %[r]!, {r3, r4}\n\t"
  51453. "ldm %[a]!, {r3, r4}\n\t"
  51454. #ifdef WOLFSSL_KEIL
  51455. "adcs r3, r3, r5\n\t"
  51456. #elif defined(__clang__)
  51457. "adcs r3, r5\n\t"
  51458. #else
  51459. "adc r3, r5\n\t"
  51460. #endif
  51461. #ifdef WOLFSSL_KEIL
  51462. "adcs r4, r4, r5\n\t"
  51463. #elif defined(__clang__)
  51464. "adcs r4, r5\n\t"
  51465. #else
  51466. "adc r4, r5\n\t"
  51467. #endif
  51468. "stm %[r]!, {r3, r4}\n\t"
  51469. "ldm %[a]!, {r3, r4}\n\t"
  51470. #ifdef WOLFSSL_KEIL
  51471. "adcs r3, r3, r5\n\t"
  51472. #elif defined(__clang__)
  51473. "adcs r3, r5\n\t"
  51474. #else
  51475. "adc r3, r5\n\t"
  51476. #endif
  51477. #ifdef WOLFSSL_KEIL
  51478. "adcs r4, r4, r5\n\t"
  51479. #elif defined(__clang__)
  51480. "adcs r4, r5\n\t"
  51481. #else
  51482. "adc r4, r5\n\t"
  51483. #endif
  51484. "stm %[r]!, {r3, r4}\n\t"
  51485. "ldm %[a]!, {r3, r4}\n\t"
  51486. #ifdef WOLFSSL_KEIL
  51487. "adcs r3, r3, r5\n\t"
  51488. #elif defined(__clang__)
  51489. "adcs r3, r5\n\t"
  51490. #else
  51491. "adc r3, r5\n\t"
  51492. #endif
  51493. #ifdef WOLFSSL_KEIL
  51494. "adcs r4, r4, r5\n\t"
  51495. #elif defined(__clang__)
  51496. "adcs r4, r5\n\t"
  51497. #else
  51498. "adc r4, r5\n\t"
  51499. #endif
  51500. "stm %[r]!, {r3, r4}\n\t"
  51501. "movs %[r], #0\n\t"
  51502. #ifdef WOLFSSL_KEIL
  51503. "adcs %[r], %[r], %[r]\n\t"
  51504. #elif defined(__clang__)
  51505. "adcs %[r], %[r]\n\t"
  51506. #else
  51507. "adc %[r], %[r]\n\t"
  51508. #endif
  51509. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  51510. :
  51511. : "memory", "r3", "r4", "r5"
  51512. );
  51513. return (uint32_t)(size_t)r;
  51514. }
  51515. /* Sub b from a into a. (a -= b)
  51516. *
  51517. * a A single precision integer.
  51518. * b A single precision integer.
  51519. */
  51520. SP_NOINLINE static sp_digit sp_3072_sub_in_place_48(sp_digit* a,
  51521. const sp_digit* b)
  51522. {
  51523. __asm__ __volatile__ (
  51524. "ldm %[b]!, {r4, r5}\n\t"
  51525. "ldr r2, [%[a]]\n\t"
  51526. "ldr r3, [%[a], #4]\n\t"
  51527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51528. "subs r2, r2, r4\n\t"
  51529. #else
  51530. "sub r2, r2, r4\n\t"
  51531. #endif
  51532. #ifdef WOLFSSL_KEIL
  51533. "sbcs r3, r3, r5\n\t"
  51534. #elif defined(__clang__)
  51535. "sbcs r3, r5\n\t"
  51536. #else
  51537. "sbc r3, r5\n\t"
  51538. #endif
  51539. "stm %[a]!, {r2, r3}\n\t"
  51540. "ldm %[b]!, {r4, r5}\n\t"
  51541. "ldr r2, [%[a]]\n\t"
  51542. "ldr r3, [%[a], #4]\n\t"
  51543. #ifdef WOLFSSL_KEIL
  51544. "sbcs r2, r2, r4\n\t"
  51545. #elif defined(__clang__)
  51546. "sbcs r2, r4\n\t"
  51547. #else
  51548. "sbc r2, r4\n\t"
  51549. #endif
  51550. #ifdef WOLFSSL_KEIL
  51551. "sbcs r3, r3, r5\n\t"
  51552. #elif defined(__clang__)
  51553. "sbcs r3, r5\n\t"
  51554. #else
  51555. "sbc r3, r5\n\t"
  51556. #endif
  51557. "stm %[a]!, {r2, r3}\n\t"
  51558. "ldm %[b]!, {r4, r5}\n\t"
  51559. "ldr r2, [%[a]]\n\t"
  51560. "ldr r3, [%[a], #4]\n\t"
  51561. #ifdef WOLFSSL_KEIL
  51562. "sbcs r2, r2, r4\n\t"
  51563. #elif defined(__clang__)
  51564. "sbcs r2, r4\n\t"
  51565. #else
  51566. "sbc r2, r4\n\t"
  51567. #endif
  51568. #ifdef WOLFSSL_KEIL
  51569. "sbcs r3, r3, r5\n\t"
  51570. #elif defined(__clang__)
  51571. "sbcs r3, r5\n\t"
  51572. #else
  51573. "sbc r3, r5\n\t"
  51574. #endif
  51575. "stm %[a]!, {r2, r3}\n\t"
  51576. "ldm %[b]!, {r4, r5}\n\t"
  51577. "ldr r2, [%[a]]\n\t"
  51578. "ldr r3, [%[a], #4]\n\t"
  51579. #ifdef WOLFSSL_KEIL
  51580. "sbcs r2, r2, r4\n\t"
  51581. #elif defined(__clang__)
  51582. "sbcs r2, r4\n\t"
  51583. #else
  51584. "sbc r2, r4\n\t"
  51585. #endif
  51586. #ifdef WOLFSSL_KEIL
  51587. "sbcs r3, r3, r5\n\t"
  51588. #elif defined(__clang__)
  51589. "sbcs r3, r5\n\t"
  51590. #else
  51591. "sbc r3, r5\n\t"
  51592. #endif
  51593. "stm %[a]!, {r2, r3}\n\t"
  51594. "ldm %[b]!, {r4, r5}\n\t"
  51595. "ldr r2, [%[a]]\n\t"
  51596. "ldr r3, [%[a], #4]\n\t"
  51597. #ifdef WOLFSSL_KEIL
  51598. "sbcs r2, r2, r4\n\t"
  51599. #elif defined(__clang__)
  51600. "sbcs r2, r4\n\t"
  51601. #else
  51602. "sbc r2, r4\n\t"
  51603. #endif
  51604. #ifdef WOLFSSL_KEIL
  51605. "sbcs r3, r3, r5\n\t"
  51606. #elif defined(__clang__)
  51607. "sbcs r3, r5\n\t"
  51608. #else
  51609. "sbc r3, r5\n\t"
  51610. #endif
  51611. "stm %[a]!, {r2, r3}\n\t"
  51612. "ldm %[b]!, {r4, r5}\n\t"
  51613. "ldr r2, [%[a]]\n\t"
  51614. "ldr r3, [%[a], #4]\n\t"
  51615. #ifdef WOLFSSL_KEIL
  51616. "sbcs r2, r2, r4\n\t"
  51617. #elif defined(__clang__)
  51618. "sbcs r2, r4\n\t"
  51619. #else
  51620. "sbc r2, r4\n\t"
  51621. #endif
  51622. #ifdef WOLFSSL_KEIL
  51623. "sbcs r3, r3, r5\n\t"
  51624. #elif defined(__clang__)
  51625. "sbcs r3, r5\n\t"
  51626. #else
  51627. "sbc r3, r5\n\t"
  51628. #endif
  51629. "stm %[a]!, {r2, r3}\n\t"
  51630. "ldm %[b]!, {r4, r5}\n\t"
  51631. "ldr r2, [%[a]]\n\t"
  51632. "ldr r3, [%[a], #4]\n\t"
  51633. #ifdef WOLFSSL_KEIL
  51634. "sbcs r2, r2, r4\n\t"
  51635. #elif defined(__clang__)
  51636. "sbcs r2, r4\n\t"
  51637. #else
  51638. "sbc r2, r4\n\t"
  51639. #endif
  51640. #ifdef WOLFSSL_KEIL
  51641. "sbcs r3, r3, r5\n\t"
  51642. #elif defined(__clang__)
  51643. "sbcs r3, r5\n\t"
  51644. #else
  51645. "sbc r3, r5\n\t"
  51646. #endif
  51647. "stm %[a]!, {r2, r3}\n\t"
  51648. "ldm %[b]!, {r4, r5}\n\t"
  51649. "ldr r2, [%[a]]\n\t"
  51650. "ldr r3, [%[a], #4]\n\t"
  51651. #ifdef WOLFSSL_KEIL
  51652. "sbcs r2, r2, r4\n\t"
  51653. #elif defined(__clang__)
  51654. "sbcs r2, r4\n\t"
  51655. #else
  51656. "sbc r2, r4\n\t"
  51657. #endif
  51658. #ifdef WOLFSSL_KEIL
  51659. "sbcs r3, r3, r5\n\t"
  51660. #elif defined(__clang__)
  51661. "sbcs r3, r5\n\t"
  51662. #else
  51663. "sbc r3, r5\n\t"
  51664. #endif
  51665. "stm %[a]!, {r2, r3}\n\t"
  51666. "ldm %[b]!, {r4, r5}\n\t"
  51667. "ldr r2, [%[a]]\n\t"
  51668. "ldr r3, [%[a], #4]\n\t"
  51669. #ifdef WOLFSSL_KEIL
  51670. "sbcs r2, r2, r4\n\t"
  51671. #elif defined(__clang__)
  51672. "sbcs r2, r4\n\t"
  51673. #else
  51674. "sbc r2, r4\n\t"
  51675. #endif
  51676. #ifdef WOLFSSL_KEIL
  51677. "sbcs r3, r3, r5\n\t"
  51678. #elif defined(__clang__)
  51679. "sbcs r3, r5\n\t"
  51680. #else
  51681. "sbc r3, r5\n\t"
  51682. #endif
  51683. "stm %[a]!, {r2, r3}\n\t"
  51684. "ldm %[b]!, {r4, r5}\n\t"
  51685. "ldr r2, [%[a]]\n\t"
  51686. "ldr r3, [%[a], #4]\n\t"
  51687. #ifdef WOLFSSL_KEIL
  51688. "sbcs r2, r2, r4\n\t"
  51689. #elif defined(__clang__)
  51690. "sbcs r2, r4\n\t"
  51691. #else
  51692. "sbc r2, r4\n\t"
  51693. #endif
  51694. #ifdef WOLFSSL_KEIL
  51695. "sbcs r3, r3, r5\n\t"
  51696. #elif defined(__clang__)
  51697. "sbcs r3, r5\n\t"
  51698. #else
  51699. "sbc r3, r5\n\t"
  51700. #endif
  51701. "stm %[a]!, {r2, r3}\n\t"
  51702. "ldm %[b]!, {r4, r5}\n\t"
  51703. "ldr r2, [%[a]]\n\t"
  51704. "ldr r3, [%[a], #4]\n\t"
  51705. #ifdef WOLFSSL_KEIL
  51706. "sbcs r2, r2, r4\n\t"
  51707. #elif defined(__clang__)
  51708. "sbcs r2, r4\n\t"
  51709. #else
  51710. "sbc r2, r4\n\t"
  51711. #endif
  51712. #ifdef WOLFSSL_KEIL
  51713. "sbcs r3, r3, r5\n\t"
  51714. #elif defined(__clang__)
  51715. "sbcs r3, r5\n\t"
  51716. #else
  51717. "sbc r3, r5\n\t"
  51718. #endif
  51719. "stm %[a]!, {r2, r3}\n\t"
  51720. "ldm %[b]!, {r4, r5}\n\t"
  51721. "ldr r2, [%[a]]\n\t"
  51722. "ldr r3, [%[a], #4]\n\t"
  51723. #ifdef WOLFSSL_KEIL
  51724. "sbcs r2, r2, r4\n\t"
  51725. #elif defined(__clang__)
  51726. "sbcs r2, r4\n\t"
  51727. #else
  51728. "sbc r2, r4\n\t"
  51729. #endif
  51730. #ifdef WOLFSSL_KEIL
  51731. "sbcs r3, r3, r5\n\t"
  51732. #elif defined(__clang__)
  51733. "sbcs r3, r5\n\t"
  51734. #else
  51735. "sbc r3, r5\n\t"
  51736. #endif
  51737. "stm %[a]!, {r2, r3}\n\t"
  51738. "ldm %[b]!, {r4, r5}\n\t"
  51739. "ldr r2, [%[a]]\n\t"
  51740. "ldr r3, [%[a], #4]\n\t"
  51741. #ifdef WOLFSSL_KEIL
  51742. "sbcs r2, r2, r4\n\t"
  51743. #elif defined(__clang__)
  51744. "sbcs r2, r4\n\t"
  51745. #else
  51746. "sbc r2, r4\n\t"
  51747. #endif
  51748. #ifdef WOLFSSL_KEIL
  51749. "sbcs r3, r3, r5\n\t"
  51750. #elif defined(__clang__)
  51751. "sbcs r3, r5\n\t"
  51752. #else
  51753. "sbc r3, r5\n\t"
  51754. #endif
  51755. "stm %[a]!, {r2, r3}\n\t"
  51756. "ldm %[b]!, {r4, r5}\n\t"
  51757. "ldr r2, [%[a]]\n\t"
  51758. "ldr r3, [%[a], #4]\n\t"
  51759. #ifdef WOLFSSL_KEIL
  51760. "sbcs r2, r2, r4\n\t"
  51761. #elif defined(__clang__)
  51762. "sbcs r2, r4\n\t"
  51763. #else
  51764. "sbc r2, r4\n\t"
  51765. #endif
  51766. #ifdef WOLFSSL_KEIL
  51767. "sbcs r3, r3, r5\n\t"
  51768. #elif defined(__clang__)
  51769. "sbcs r3, r5\n\t"
  51770. #else
  51771. "sbc r3, r5\n\t"
  51772. #endif
  51773. "stm %[a]!, {r2, r3}\n\t"
  51774. "ldm %[b]!, {r4, r5}\n\t"
  51775. "ldr r2, [%[a]]\n\t"
  51776. "ldr r3, [%[a], #4]\n\t"
  51777. #ifdef WOLFSSL_KEIL
  51778. "sbcs r2, r2, r4\n\t"
  51779. #elif defined(__clang__)
  51780. "sbcs r2, r4\n\t"
  51781. #else
  51782. "sbc r2, r4\n\t"
  51783. #endif
  51784. #ifdef WOLFSSL_KEIL
  51785. "sbcs r3, r3, r5\n\t"
  51786. #elif defined(__clang__)
  51787. "sbcs r3, r5\n\t"
  51788. #else
  51789. "sbc r3, r5\n\t"
  51790. #endif
  51791. "stm %[a]!, {r2, r3}\n\t"
  51792. "ldm %[b]!, {r4, r5}\n\t"
  51793. "ldr r2, [%[a]]\n\t"
  51794. "ldr r3, [%[a], #4]\n\t"
  51795. #ifdef WOLFSSL_KEIL
  51796. "sbcs r2, r2, r4\n\t"
  51797. #elif defined(__clang__)
  51798. "sbcs r2, r4\n\t"
  51799. #else
  51800. "sbc r2, r4\n\t"
  51801. #endif
  51802. #ifdef WOLFSSL_KEIL
  51803. "sbcs r3, r3, r5\n\t"
  51804. #elif defined(__clang__)
  51805. "sbcs r3, r5\n\t"
  51806. #else
  51807. "sbc r3, r5\n\t"
  51808. #endif
  51809. "stm %[a]!, {r2, r3}\n\t"
  51810. "ldm %[b]!, {r4, r5}\n\t"
  51811. "ldr r2, [%[a]]\n\t"
  51812. "ldr r3, [%[a], #4]\n\t"
  51813. #ifdef WOLFSSL_KEIL
  51814. "sbcs r2, r2, r4\n\t"
  51815. #elif defined(__clang__)
  51816. "sbcs r2, r4\n\t"
  51817. #else
  51818. "sbc r2, r4\n\t"
  51819. #endif
  51820. #ifdef WOLFSSL_KEIL
  51821. "sbcs r3, r3, r5\n\t"
  51822. #elif defined(__clang__)
  51823. "sbcs r3, r5\n\t"
  51824. #else
  51825. "sbc r3, r5\n\t"
  51826. #endif
  51827. "stm %[a]!, {r2, r3}\n\t"
  51828. "ldm %[b]!, {r4, r5}\n\t"
  51829. "ldr r2, [%[a]]\n\t"
  51830. "ldr r3, [%[a], #4]\n\t"
  51831. #ifdef WOLFSSL_KEIL
  51832. "sbcs r2, r2, r4\n\t"
  51833. #elif defined(__clang__)
  51834. "sbcs r2, r4\n\t"
  51835. #else
  51836. "sbc r2, r4\n\t"
  51837. #endif
  51838. #ifdef WOLFSSL_KEIL
  51839. "sbcs r3, r3, r5\n\t"
  51840. #elif defined(__clang__)
  51841. "sbcs r3, r5\n\t"
  51842. #else
  51843. "sbc r3, r5\n\t"
  51844. #endif
  51845. "stm %[a]!, {r2, r3}\n\t"
  51846. "ldm %[b]!, {r4, r5}\n\t"
  51847. "ldr r2, [%[a]]\n\t"
  51848. "ldr r3, [%[a], #4]\n\t"
  51849. #ifdef WOLFSSL_KEIL
  51850. "sbcs r2, r2, r4\n\t"
  51851. #elif defined(__clang__)
  51852. "sbcs r2, r4\n\t"
  51853. #else
  51854. "sbc r2, r4\n\t"
  51855. #endif
  51856. #ifdef WOLFSSL_KEIL
  51857. "sbcs r3, r3, r5\n\t"
  51858. #elif defined(__clang__)
  51859. "sbcs r3, r5\n\t"
  51860. #else
  51861. "sbc r3, r5\n\t"
  51862. #endif
  51863. "stm %[a]!, {r2, r3}\n\t"
  51864. "ldm %[b]!, {r4, r5}\n\t"
  51865. "ldr r2, [%[a]]\n\t"
  51866. "ldr r3, [%[a], #4]\n\t"
  51867. #ifdef WOLFSSL_KEIL
  51868. "sbcs r2, r2, r4\n\t"
  51869. #elif defined(__clang__)
  51870. "sbcs r2, r4\n\t"
  51871. #else
  51872. "sbc r2, r4\n\t"
  51873. #endif
  51874. #ifdef WOLFSSL_KEIL
  51875. "sbcs r3, r3, r5\n\t"
  51876. #elif defined(__clang__)
  51877. "sbcs r3, r5\n\t"
  51878. #else
  51879. "sbc r3, r5\n\t"
  51880. #endif
  51881. "stm %[a]!, {r2, r3}\n\t"
  51882. "ldm %[b]!, {r4, r5}\n\t"
  51883. "ldr r2, [%[a]]\n\t"
  51884. "ldr r3, [%[a], #4]\n\t"
  51885. #ifdef WOLFSSL_KEIL
  51886. "sbcs r2, r2, r4\n\t"
  51887. #elif defined(__clang__)
  51888. "sbcs r2, r4\n\t"
  51889. #else
  51890. "sbc r2, r4\n\t"
  51891. #endif
  51892. #ifdef WOLFSSL_KEIL
  51893. "sbcs r3, r3, r5\n\t"
  51894. #elif defined(__clang__)
  51895. "sbcs r3, r5\n\t"
  51896. #else
  51897. "sbc r3, r5\n\t"
  51898. #endif
  51899. "stm %[a]!, {r2, r3}\n\t"
  51900. "ldm %[b]!, {r4, r5}\n\t"
  51901. "ldr r2, [%[a]]\n\t"
  51902. "ldr r3, [%[a], #4]\n\t"
  51903. #ifdef WOLFSSL_KEIL
  51904. "sbcs r2, r2, r4\n\t"
  51905. #elif defined(__clang__)
  51906. "sbcs r2, r4\n\t"
  51907. #else
  51908. "sbc r2, r4\n\t"
  51909. #endif
  51910. #ifdef WOLFSSL_KEIL
  51911. "sbcs r3, r3, r5\n\t"
  51912. #elif defined(__clang__)
  51913. "sbcs r3, r5\n\t"
  51914. #else
  51915. "sbc r3, r5\n\t"
  51916. #endif
  51917. "stm %[a]!, {r2, r3}\n\t"
  51918. "ldm %[b]!, {r4, r5}\n\t"
  51919. "ldr r2, [%[a]]\n\t"
  51920. "ldr r3, [%[a], #4]\n\t"
  51921. #ifdef WOLFSSL_KEIL
  51922. "sbcs r2, r2, r4\n\t"
  51923. #elif defined(__clang__)
  51924. "sbcs r2, r4\n\t"
  51925. #else
  51926. "sbc r2, r4\n\t"
  51927. #endif
  51928. #ifdef WOLFSSL_KEIL
  51929. "sbcs r3, r3, r5\n\t"
  51930. #elif defined(__clang__)
  51931. "sbcs r3, r5\n\t"
  51932. #else
  51933. "sbc r3, r5\n\t"
  51934. #endif
  51935. "stm %[a]!, {r2, r3}\n\t"
  51936. "ldm %[b]!, {r4, r5}\n\t"
  51937. "ldr r2, [%[a]]\n\t"
  51938. "ldr r3, [%[a], #4]\n\t"
  51939. #ifdef WOLFSSL_KEIL
  51940. "sbcs r2, r2, r4\n\t"
  51941. #elif defined(__clang__)
  51942. "sbcs r2, r4\n\t"
  51943. #else
  51944. "sbc r2, r4\n\t"
  51945. #endif
  51946. #ifdef WOLFSSL_KEIL
  51947. "sbcs r3, r3, r5\n\t"
  51948. #elif defined(__clang__)
  51949. "sbcs r3, r5\n\t"
  51950. #else
  51951. "sbc r3, r5\n\t"
  51952. #endif
  51953. "stm %[a]!, {r2, r3}\n\t"
  51954. #ifdef WOLFSSL_KEIL
  51955. "sbcs %[a], %[a], %[a]\n\t"
  51956. #elif defined(__clang__)
  51957. "sbcs %[a], %[a]\n\t"
  51958. #else
  51959. "sbc %[a], %[a]\n\t"
  51960. #endif
  51961. : [a] "+l" (a), [b] "+l" (b)
  51962. :
  51963. : "memory", "r2", "r3", "r4", "r5"
  51964. );
  51965. return (uint32_t)(size_t)a;
  51966. }
  51967. /* Add b to a into r. (r = a + b)
  51968. *
  51969. * r A single precision integer.
  51970. * a A single precision integer.
  51971. * b A single precision integer.
  51972. */
  51973. SP_NOINLINE static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a,
  51974. const sp_digit* b)
  51975. {
  51976. __asm__ __volatile__ (
  51977. "ldm %[b]!, {r5, r6}\n\t"
  51978. "ldm %[a]!, {r3, r4}\n\t"
  51979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  51980. "adds r3, r3, r5\n\t"
  51981. #else
  51982. "add r3, r3, r5\n\t"
  51983. #endif
  51984. #ifdef WOLFSSL_KEIL
  51985. "adcs r4, r4, r6\n\t"
  51986. #elif defined(__clang__)
  51987. "adcs r4, r6\n\t"
  51988. #else
  51989. "adc r4, r6\n\t"
  51990. #endif
  51991. "stm %[r]!, {r3, r4}\n\t"
  51992. "ldm %[b]!, {r5, r6}\n\t"
  51993. "ldm %[a]!, {r3, r4}\n\t"
  51994. #ifdef WOLFSSL_KEIL
  51995. "adcs r3, r3, r5\n\t"
  51996. #elif defined(__clang__)
  51997. "adcs r3, r5\n\t"
  51998. #else
  51999. "adc r3, r5\n\t"
  52000. #endif
  52001. #ifdef WOLFSSL_KEIL
  52002. "adcs r4, r4, r6\n\t"
  52003. #elif defined(__clang__)
  52004. "adcs r4, r6\n\t"
  52005. #else
  52006. "adc r4, r6\n\t"
  52007. #endif
  52008. "stm %[r]!, {r3, r4}\n\t"
  52009. "ldm %[b]!, {r5, r6}\n\t"
  52010. "ldm %[a]!, {r3, r4}\n\t"
  52011. #ifdef WOLFSSL_KEIL
  52012. "adcs r3, r3, r5\n\t"
  52013. #elif defined(__clang__)
  52014. "adcs r3, r5\n\t"
  52015. #else
  52016. "adc r3, r5\n\t"
  52017. #endif
  52018. #ifdef WOLFSSL_KEIL
  52019. "adcs r4, r4, r6\n\t"
  52020. #elif defined(__clang__)
  52021. "adcs r4, r6\n\t"
  52022. #else
  52023. "adc r4, r6\n\t"
  52024. #endif
  52025. "stm %[r]!, {r3, r4}\n\t"
  52026. "ldm %[b]!, {r5, r6}\n\t"
  52027. "ldm %[a]!, {r3, r4}\n\t"
  52028. #ifdef WOLFSSL_KEIL
  52029. "adcs r3, r3, r5\n\t"
  52030. #elif defined(__clang__)
  52031. "adcs r3, r5\n\t"
  52032. #else
  52033. "adc r3, r5\n\t"
  52034. #endif
  52035. #ifdef WOLFSSL_KEIL
  52036. "adcs r4, r4, r6\n\t"
  52037. #elif defined(__clang__)
  52038. "adcs r4, r6\n\t"
  52039. #else
  52040. "adc r4, r6\n\t"
  52041. #endif
  52042. "stm %[r]!, {r3, r4}\n\t"
  52043. "ldm %[b]!, {r5, r6}\n\t"
  52044. "ldm %[a]!, {r3, r4}\n\t"
  52045. #ifdef WOLFSSL_KEIL
  52046. "adcs r3, r3, r5\n\t"
  52047. #elif defined(__clang__)
  52048. "adcs r3, r5\n\t"
  52049. #else
  52050. "adc r3, r5\n\t"
  52051. #endif
  52052. #ifdef WOLFSSL_KEIL
  52053. "adcs r4, r4, r6\n\t"
  52054. #elif defined(__clang__)
  52055. "adcs r4, r6\n\t"
  52056. #else
  52057. "adc r4, r6\n\t"
  52058. #endif
  52059. "stm %[r]!, {r3, r4}\n\t"
  52060. "ldm %[b]!, {r5, r6}\n\t"
  52061. "ldm %[a]!, {r3, r4}\n\t"
  52062. #ifdef WOLFSSL_KEIL
  52063. "adcs r3, r3, r5\n\t"
  52064. #elif defined(__clang__)
  52065. "adcs r3, r5\n\t"
  52066. #else
  52067. "adc r3, r5\n\t"
  52068. #endif
  52069. #ifdef WOLFSSL_KEIL
  52070. "adcs r4, r4, r6\n\t"
  52071. #elif defined(__clang__)
  52072. "adcs r4, r6\n\t"
  52073. #else
  52074. "adc r4, r6\n\t"
  52075. #endif
  52076. "stm %[r]!, {r3, r4}\n\t"
  52077. "ldm %[b]!, {r5, r6}\n\t"
  52078. "ldm %[a]!, {r3, r4}\n\t"
  52079. #ifdef WOLFSSL_KEIL
  52080. "adcs r3, r3, r5\n\t"
  52081. #elif defined(__clang__)
  52082. "adcs r3, r5\n\t"
  52083. #else
  52084. "adc r3, r5\n\t"
  52085. #endif
  52086. #ifdef WOLFSSL_KEIL
  52087. "adcs r4, r4, r6\n\t"
  52088. #elif defined(__clang__)
  52089. "adcs r4, r6\n\t"
  52090. #else
  52091. "adc r4, r6\n\t"
  52092. #endif
  52093. "stm %[r]!, {r3, r4}\n\t"
  52094. "ldm %[b]!, {r5, r6}\n\t"
  52095. "ldm %[a]!, {r3, r4}\n\t"
  52096. #ifdef WOLFSSL_KEIL
  52097. "adcs r3, r3, r5\n\t"
  52098. #elif defined(__clang__)
  52099. "adcs r3, r5\n\t"
  52100. #else
  52101. "adc r3, r5\n\t"
  52102. #endif
  52103. #ifdef WOLFSSL_KEIL
  52104. "adcs r4, r4, r6\n\t"
  52105. #elif defined(__clang__)
  52106. "adcs r4, r6\n\t"
  52107. #else
  52108. "adc r4, r6\n\t"
  52109. #endif
  52110. "stm %[r]!, {r3, r4}\n\t"
  52111. "ldm %[b]!, {r5, r6}\n\t"
  52112. "ldm %[a]!, {r3, r4}\n\t"
  52113. #ifdef WOLFSSL_KEIL
  52114. "adcs r3, r3, r5\n\t"
  52115. #elif defined(__clang__)
  52116. "adcs r3, r5\n\t"
  52117. #else
  52118. "adc r3, r5\n\t"
  52119. #endif
  52120. #ifdef WOLFSSL_KEIL
  52121. "adcs r4, r4, r6\n\t"
  52122. #elif defined(__clang__)
  52123. "adcs r4, r6\n\t"
  52124. #else
  52125. "adc r4, r6\n\t"
  52126. #endif
  52127. "stm %[r]!, {r3, r4}\n\t"
  52128. "ldm %[b]!, {r5, r6}\n\t"
  52129. "ldm %[a]!, {r3, r4}\n\t"
  52130. #ifdef WOLFSSL_KEIL
  52131. "adcs r3, r3, r5\n\t"
  52132. #elif defined(__clang__)
  52133. "adcs r3, r5\n\t"
  52134. #else
  52135. "adc r3, r5\n\t"
  52136. #endif
  52137. #ifdef WOLFSSL_KEIL
  52138. "adcs r4, r4, r6\n\t"
  52139. #elif defined(__clang__)
  52140. "adcs r4, r6\n\t"
  52141. #else
  52142. "adc r4, r6\n\t"
  52143. #endif
  52144. "stm %[r]!, {r3, r4}\n\t"
  52145. "ldm %[b]!, {r5, r6}\n\t"
  52146. "ldm %[a]!, {r3, r4}\n\t"
  52147. #ifdef WOLFSSL_KEIL
  52148. "adcs r3, r3, r5\n\t"
  52149. #elif defined(__clang__)
  52150. "adcs r3, r5\n\t"
  52151. #else
  52152. "adc r3, r5\n\t"
  52153. #endif
  52154. #ifdef WOLFSSL_KEIL
  52155. "adcs r4, r4, r6\n\t"
  52156. #elif defined(__clang__)
  52157. "adcs r4, r6\n\t"
  52158. #else
  52159. "adc r4, r6\n\t"
  52160. #endif
  52161. "stm %[r]!, {r3, r4}\n\t"
  52162. "ldm %[b]!, {r5, r6}\n\t"
  52163. "ldm %[a]!, {r3, r4}\n\t"
  52164. #ifdef WOLFSSL_KEIL
  52165. "adcs r3, r3, r5\n\t"
  52166. #elif defined(__clang__)
  52167. "adcs r3, r5\n\t"
  52168. #else
  52169. "adc r3, r5\n\t"
  52170. #endif
  52171. #ifdef WOLFSSL_KEIL
  52172. "adcs r4, r4, r6\n\t"
  52173. #elif defined(__clang__)
  52174. "adcs r4, r6\n\t"
  52175. #else
  52176. "adc r4, r6\n\t"
  52177. #endif
  52178. "stm %[r]!, {r3, r4}\n\t"
  52179. "ldm %[b]!, {r5, r6}\n\t"
  52180. "ldm %[a]!, {r3, r4}\n\t"
  52181. #ifdef WOLFSSL_KEIL
  52182. "adcs r3, r3, r5\n\t"
  52183. #elif defined(__clang__)
  52184. "adcs r3, r5\n\t"
  52185. #else
  52186. "adc r3, r5\n\t"
  52187. #endif
  52188. #ifdef WOLFSSL_KEIL
  52189. "adcs r4, r4, r6\n\t"
  52190. #elif defined(__clang__)
  52191. "adcs r4, r6\n\t"
  52192. #else
  52193. "adc r4, r6\n\t"
  52194. #endif
  52195. "stm %[r]!, {r3, r4}\n\t"
  52196. "ldm %[b]!, {r5, r6}\n\t"
  52197. "ldm %[a]!, {r3, r4}\n\t"
  52198. #ifdef WOLFSSL_KEIL
  52199. "adcs r3, r3, r5\n\t"
  52200. #elif defined(__clang__)
  52201. "adcs r3, r5\n\t"
  52202. #else
  52203. "adc r3, r5\n\t"
  52204. #endif
  52205. #ifdef WOLFSSL_KEIL
  52206. "adcs r4, r4, r6\n\t"
  52207. #elif defined(__clang__)
  52208. "adcs r4, r6\n\t"
  52209. #else
  52210. "adc r4, r6\n\t"
  52211. #endif
  52212. "stm %[r]!, {r3, r4}\n\t"
  52213. "ldm %[b]!, {r5, r6}\n\t"
  52214. "ldm %[a]!, {r3, r4}\n\t"
  52215. #ifdef WOLFSSL_KEIL
  52216. "adcs r3, r3, r5\n\t"
  52217. #elif defined(__clang__)
  52218. "adcs r3, r5\n\t"
  52219. #else
  52220. "adc r3, r5\n\t"
  52221. #endif
  52222. #ifdef WOLFSSL_KEIL
  52223. "adcs r4, r4, r6\n\t"
  52224. #elif defined(__clang__)
  52225. "adcs r4, r6\n\t"
  52226. #else
  52227. "adc r4, r6\n\t"
  52228. #endif
  52229. "stm %[r]!, {r3, r4}\n\t"
  52230. "ldm %[b]!, {r5, r6}\n\t"
  52231. "ldm %[a]!, {r3, r4}\n\t"
  52232. #ifdef WOLFSSL_KEIL
  52233. "adcs r3, r3, r5\n\t"
  52234. #elif defined(__clang__)
  52235. "adcs r3, r5\n\t"
  52236. #else
  52237. "adc r3, r5\n\t"
  52238. #endif
  52239. #ifdef WOLFSSL_KEIL
  52240. "adcs r4, r4, r6\n\t"
  52241. #elif defined(__clang__)
  52242. "adcs r4, r6\n\t"
  52243. #else
  52244. "adc r4, r6\n\t"
  52245. #endif
  52246. "stm %[r]!, {r3, r4}\n\t"
  52247. "ldm %[b]!, {r5, r6}\n\t"
  52248. "ldm %[a]!, {r3, r4}\n\t"
  52249. #ifdef WOLFSSL_KEIL
  52250. "adcs r3, r3, r5\n\t"
  52251. #elif defined(__clang__)
  52252. "adcs r3, r5\n\t"
  52253. #else
  52254. "adc r3, r5\n\t"
  52255. #endif
  52256. #ifdef WOLFSSL_KEIL
  52257. "adcs r4, r4, r6\n\t"
  52258. #elif defined(__clang__)
  52259. "adcs r4, r6\n\t"
  52260. #else
  52261. "adc r4, r6\n\t"
  52262. #endif
  52263. "stm %[r]!, {r3, r4}\n\t"
  52264. "ldm %[b]!, {r5, r6}\n\t"
  52265. "ldm %[a]!, {r3, r4}\n\t"
  52266. #ifdef WOLFSSL_KEIL
  52267. "adcs r3, r3, r5\n\t"
  52268. #elif defined(__clang__)
  52269. "adcs r3, r5\n\t"
  52270. #else
  52271. "adc r3, r5\n\t"
  52272. #endif
  52273. #ifdef WOLFSSL_KEIL
  52274. "adcs r4, r4, r6\n\t"
  52275. #elif defined(__clang__)
  52276. "adcs r4, r6\n\t"
  52277. #else
  52278. "adc r4, r6\n\t"
  52279. #endif
  52280. "stm %[r]!, {r3, r4}\n\t"
  52281. "ldm %[b]!, {r5, r6}\n\t"
  52282. "ldm %[a]!, {r3, r4}\n\t"
  52283. #ifdef WOLFSSL_KEIL
  52284. "adcs r3, r3, r5\n\t"
  52285. #elif defined(__clang__)
  52286. "adcs r3, r5\n\t"
  52287. #else
  52288. "adc r3, r5\n\t"
  52289. #endif
  52290. #ifdef WOLFSSL_KEIL
  52291. "adcs r4, r4, r6\n\t"
  52292. #elif defined(__clang__)
  52293. "adcs r4, r6\n\t"
  52294. #else
  52295. "adc r4, r6\n\t"
  52296. #endif
  52297. "stm %[r]!, {r3, r4}\n\t"
  52298. "ldm %[b]!, {r5, r6}\n\t"
  52299. "ldm %[a]!, {r3, r4}\n\t"
  52300. #ifdef WOLFSSL_KEIL
  52301. "adcs r3, r3, r5\n\t"
  52302. #elif defined(__clang__)
  52303. "adcs r3, r5\n\t"
  52304. #else
  52305. "adc r3, r5\n\t"
  52306. #endif
  52307. #ifdef WOLFSSL_KEIL
  52308. "adcs r4, r4, r6\n\t"
  52309. #elif defined(__clang__)
  52310. "adcs r4, r6\n\t"
  52311. #else
  52312. "adc r4, r6\n\t"
  52313. #endif
  52314. "stm %[r]!, {r3, r4}\n\t"
  52315. "ldm %[b]!, {r5, r6}\n\t"
  52316. "ldm %[a]!, {r3, r4}\n\t"
  52317. #ifdef WOLFSSL_KEIL
  52318. "adcs r3, r3, r5\n\t"
  52319. #elif defined(__clang__)
  52320. "adcs r3, r5\n\t"
  52321. #else
  52322. "adc r3, r5\n\t"
  52323. #endif
  52324. #ifdef WOLFSSL_KEIL
  52325. "adcs r4, r4, r6\n\t"
  52326. #elif defined(__clang__)
  52327. "adcs r4, r6\n\t"
  52328. #else
  52329. "adc r4, r6\n\t"
  52330. #endif
  52331. "stm %[r]!, {r3, r4}\n\t"
  52332. "ldm %[b]!, {r5, r6}\n\t"
  52333. "ldm %[a]!, {r3, r4}\n\t"
  52334. #ifdef WOLFSSL_KEIL
  52335. "adcs r3, r3, r5\n\t"
  52336. #elif defined(__clang__)
  52337. "adcs r3, r5\n\t"
  52338. #else
  52339. "adc r3, r5\n\t"
  52340. #endif
  52341. #ifdef WOLFSSL_KEIL
  52342. "adcs r4, r4, r6\n\t"
  52343. #elif defined(__clang__)
  52344. "adcs r4, r6\n\t"
  52345. #else
  52346. "adc r4, r6\n\t"
  52347. #endif
  52348. "stm %[r]!, {r3, r4}\n\t"
  52349. "ldm %[b]!, {r5, r6}\n\t"
  52350. "ldm %[a]!, {r3, r4}\n\t"
  52351. #ifdef WOLFSSL_KEIL
  52352. "adcs r3, r3, r5\n\t"
  52353. #elif defined(__clang__)
  52354. "adcs r3, r5\n\t"
  52355. #else
  52356. "adc r3, r5\n\t"
  52357. #endif
  52358. #ifdef WOLFSSL_KEIL
  52359. "adcs r4, r4, r6\n\t"
  52360. #elif defined(__clang__)
  52361. "adcs r4, r6\n\t"
  52362. #else
  52363. "adc r4, r6\n\t"
  52364. #endif
  52365. "stm %[r]!, {r3, r4}\n\t"
  52366. "ldm %[b]!, {r5, r6}\n\t"
  52367. "ldm %[a]!, {r3, r4}\n\t"
  52368. #ifdef WOLFSSL_KEIL
  52369. "adcs r3, r3, r5\n\t"
  52370. #elif defined(__clang__)
  52371. "adcs r3, r5\n\t"
  52372. #else
  52373. "adc r3, r5\n\t"
  52374. #endif
  52375. #ifdef WOLFSSL_KEIL
  52376. "adcs r4, r4, r6\n\t"
  52377. #elif defined(__clang__)
  52378. "adcs r4, r6\n\t"
  52379. #else
  52380. "adc r4, r6\n\t"
  52381. #endif
  52382. "stm %[r]!, {r3, r4}\n\t"
  52383. "movs %[r], #0\n\t"
  52384. #ifdef WOLFSSL_KEIL
  52385. "adcs %[r], %[r], %[r]\n\t"
  52386. #elif defined(__clang__)
  52387. "adcs %[r], %[r]\n\t"
  52388. #else
  52389. "adc %[r], %[r]\n\t"
  52390. #endif
  52391. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  52392. :
  52393. : "memory", "r3", "r4", "r5", "r6"
  52394. );
  52395. return (uint32_t)(size_t)r;
  52396. }
  52397. /* AND m into each word of a and store in r.
  52398. *
  52399. * r A single precision integer.
  52400. * a A single precision integer.
  52401. * m Mask to AND against each digit.
  52402. */
  52403. static void sp_3072_mask_24(sp_digit* r, const sp_digit* a, sp_digit m)
  52404. {
  52405. #ifdef WOLFSSL_SP_SMALL
  52406. int i;
  52407. for (i=0; i<24; i++) {
  52408. r[i] = a[i] & m;
  52409. }
  52410. #else
  52411. int i;
  52412. for (i = 0; i < 24; i += 8) {
  52413. r[i+0] = a[i+0] & m;
  52414. r[i+1] = a[i+1] & m;
  52415. r[i+2] = a[i+2] & m;
  52416. r[i+3] = a[i+3] & m;
  52417. r[i+4] = a[i+4] & m;
  52418. r[i+5] = a[i+5] & m;
  52419. r[i+6] = a[i+6] & m;
  52420. r[i+7] = a[i+7] & m;
  52421. }
  52422. #endif
  52423. }
  52424. /* Multiply a and b into r. (r = a * b)
  52425. *
  52426. * r A single precision integer.
  52427. * a A single precision integer.
  52428. * b A single precision integer.
  52429. */
  52430. SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
  52431. const sp_digit* b)
  52432. {
  52433. sp_digit* z0 = r;
  52434. sp_digit z1[48];
  52435. sp_digit a1[24];
  52436. sp_digit b1[24];
  52437. sp_digit* z2 = r + 48;
  52438. sp_digit u;
  52439. sp_digit ca;
  52440. sp_digit cb;
  52441. ca = sp_3072_add_24(a1, a, &a[24]);
  52442. cb = sp_3072_add_24(b1, b, &b[24]);
  52443. u = ca & cb;
  52444. sp_3072_mul_24(z2, &a[24], &b[24]);
  52445. sp_3072_mul_24(z0, a, b);
  52446. sp_3072_mul_24(z1, a1, b1);
  52447. u += sp_3072_sub_in_place_48(z1, z0);
  52448. u += sp_3072_sub_in_place_48(z1, z2);
  52449. sp_3072_mask_24(a1, a1, 0 - cb);
  52450. u += sp_3072_add_24(z1 + 24, z1 + 24, a1);
  52451. sp_3072_mask_24(b1, b1, 0 - ca);
  52452. u += sp_3072_add_24(z1 + 24, z1 + 24, b1);
  52453. u += sp_3072_add_48(r + 24, r + 24, z1);
  52454. (void)sp_3072_add_word_24(r + 72, r + 72, u);
  52455. }
  52456. /* Add b to a into r. (r = a + b)
  52457. *
  52458. * r A single precision integer.
  52459. * a A single precision integer.
  52460. * b A single precision integer.
  52461. */
  52462. SP_NOINLINE static sp_digit sp_3072_add_word_48(sp_digit* r, const sp_digit* a,
  52463. sp_digit b)
  52464. {
  52465. __asm__ __volatile__ (
  52466. "movs r5, #0\n\t"
  52467. "ldm %[a]!, {r3, r4}\n\t"
  52468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52469. "adds r3, r3, %[b]\n\t"
  52470. #else
  52471. "add r3, r3, %[b]\n\t"
  52472. #endif
  52473. #ifdef WOLFSSL_KEIL
  52474. "adcs r4, r4, r5\n\t"
  52475. #elif defined(__clang__)
  52476. "adcs r4, r5\n\t"
  52477. #else
  52478. "adc r4, r5\n\t"
  52479. #endif
  52480. "stm %[r]!, {r3, r4}\n\t"
  52481. "ldm %[a]!, {r3, r4}\n\t"
  52482. #ifdef WOLFSSL_KEIL
  52483. "adcs r3, r3, r5\n\t"
  52484. #elif defined(__clang__)
  52485. "adcs r3, r5\n\t"
  52486. #else
  52487. "adc r3, r5\n\t"
  52488. #endif
  52489. #ifdef WOLFSSL_KEIL
  52490. "adcs r4, r4, r5\n\t"
  52491. #elif defined(__clang__)
  52492. "adcs r4, r5\n\t"
  52493. #else
  52494. "adc r4, r5\n\t"
  52495. #endif
  52496. "stm %[r]!, {r3, r4}\n\t"
  52497. "ldm %[a]!, {r3, r4}\n\t"
  52498. #ifdef WOLFSSL_KEIL
  52499. "adcs r3, r3, r5\n\t"
  52500. #elif defined(__clang__)
  52501. "adcs r3, r5\n\t"
  52502. #else
  52503. "adc r3, r5\n\t"
  52504. #endif
  52505. #ifdef WOLFSSL_KEIL
  52506. "adcs r4, r4, r5\n\t"
  52507. #elif defined(__clang__)
  52508. "adcs r4, r5\n\t"
  52509. #else
  52510. "adc r4, r5\n\t"
  52511. #endif
  52512. "stm %[r]!, {r3, r4}\n\t"
  52513. "ldm %[a]!, {r3, r4}\n\t"
  52514. #ifdef WOLFSSL_KEIL
  52515. "adcs r3, r3, r5\n\t"
  52516. #elif defined(__clang__)
  52517. "adcs r3, r5\n\t"
  52518. #else
  52519. "adc r3, r5\n\t"
  52520. #endif
  52521. #ifdef WOLFSSL_KEIL
  52522. "adcs r4, r4, r5\n\t"
  52523. #elif defined(__clang__)
  52524. "adcs r4, r5\n\t"
  52525. #else
  52526. "adc r4, r5\n\t"
  52527. #endif
  52528. "stm %[r]!, {r3, r4}\n\t"
  52529. "ldm %[a]!, {r3, r4}\n\t"
  52530. #ifdef WOLFSSL_KEIL
  52531. "adcs r3, r3, r5\n\t"
  52532. #elif defined(__clang__)
  52533. "adcs r3, r5\n\t"
  52534. #else
  52535. "adc r3, r5\n\t"
  52536. #endif
  52537. #ifdef WOLFSSL_KEIL
  52538. "adcs r4, r4, r5\n\t"
  52539. #elif defined(__clang__)
  52540. "adcs r4, r5\n\t"
  52541. #else
  52542. "adc r4, r5\n\t"
  52543. #endif
  52544. "stm %[r]!, {r3, r4}\n\t"
  52545. "ldm %[a]!, {r3, r4}\n\t"
  52546. #ifdef WOLFSSL_KEIL
  52547. "adcs r3, r3, r5\n\t"
  52548. #elif defined(__clang__)
  52549. "adcs r3, r5\n\t"
  52550. #else
  52551. "adc r3, r5\n\t"
  52552. #endif
  52553. #ifdef WOLFSSL_KEIL
  52554. "adcs r4, r4, r5\n\t"
  52555. #elif defined(__clang__)
  52556. "adcs r4, r5\n\t"
  52557. #else
  52558. "adc r4, r5\n\t"
  52559. #endif
  52560. "stm %[r]!, {r3, r4}\n\t"
  52561. "ldm %[a]!, {r3, r4}\n\t"
  52562. #ifdef WOLFSSL_KEIL
  52563. "adcs r3, r3, r5\n\t"
  52564. #elif defined(__clang__)
  52565. "adcs r3, r5\n\t"
  52566. #else
  52567. "adc r3, r5\n\t"
  52568. #endif
  52569. #ifdef WOLFSSL_KEIL
  52570. "adcs r4, r4, r5\n\t"
  52571. #elif defined(__clang__)
  52572. "adcs r4, r5\n\t"
  52573. #else
  52574. "adc r4, r5\n\t"
  52575. #endif
  52576. "stm %[r]!, {r3, r4}\n\t"
  52577. "ldm %[a]!, {r3, r4}\n\t"
  52578. #ifdef WOLFSSL_KEIL
  52579. "adcs r3, r3, r5\n\t"
  52580. #elif defined(__clang__)
  52581. "adcs r3, r5\n\t"
  52582. #else
  52583. "adc r3, r5\n\t"
  52584. #endif
  52585. #ifdef WOLFSSL_KEIL
  52586. "adcs r4, r4, r5\n\t"
  52587. #elif defined(__clang__)
  52588. "adcs r4, r5\n\t"
  52589. #else
  52590. "adc r4, r5\n\t"
  52591. #endif
  52592. "stm %[r]!, {r3, r4}\n\t"
  52593. "ldm %[a]!, {r3, r4}\n\t"
  52594. #ifdef WOLFSSL_KEIL
  52595. "adcs r3, r3, r5\n\t"
  52596. #elif defined(__clang__)
  52597. "adcs r3, r5\n\t"
  52598. #else
  52599. "adc r3, r5\n\t"
  52600. #endif
  52601. #ifdef WOLFSSL_KEIL
  52602. "adcs r4, r4, r5\n\t"
  52603. #elif defined(__clang__)
  52604. "adcs r4, r5\n\t"
  52605. #else
  52606. "adc r4, r5\n\t"
  52607. #endif
  52608. "stm %[r]!, {r3, r4}\n\t"
  52609. "ldm %[a]!, {r3, r4}\n\t"
  52610. #ifdef WOLFSSL_KEIL
  52611. "adcs r3, r3, r5\n\t"
  52612. #elif defined(__clang__)
  52613. "adcs r3, r5\n\t"
  52614. #else
  52615. "adc r3, r5\n\t"
  52616. #endif
  52617. #ifdef WOLFSSL_KEIL
  52618. "adcs r4, r4, r5\n\t"
  52619. #elif defined(__clang__)
  52620. "adcs r4, r5\n\t"
  52621. #else
  52622. "adc r4, r5\n\t"
  52623. #endif
  52624. "stm %[r]!, {r3, r4}\n\t"
  52625. "ldm %[a]!, {r3, r4}\n\t"
  52626. #ifdef WOLFSSL_KEIL
  52627. "adcs r3, r3, r5\n\t"
  52628. #elif defined(__clang__)
  52629. "adcs r3, r5\n\t"
  52630. #else
  52631. "adc r3, r5\n\t"
  52632. #endif
  52633. #ifdef WOLFSSL_KEIL
  52634. "adcs r4, r4, r5\n\t"
  52635. #elif defined(__clang__)
  52636. "adcs r4, r5\n\t"
  52637. #else
  52638. "adc r4, r5\n\t"
  52639. #endif
  52640. "stm %[r]!, {r3, r4}\n\t"
  52641. "ldm %[a]!, {r3, r4}\n\t"
  52642. #ifdef WOLFSSL_KEIL
  52643. "adcs r3, r3, r5\n\t"
  52644. #elif defined(__clang__)
  52645. "adcs r3, r5\n\t"
  52646. #else
  52647. "adc r3, r5\n\t"
  52648. #endif
  52649. #ifdef WOLFSSL_KEIL
  52650. "adcs r4, r4, r5\n\t"
  52651. #elif defined(__clang__)
  52652. "adcs r4, r5\n\t"
  52653. #else
  52654. "adc r4, r5\n\t"
  52655. #endif
  52656. "stm %[r]!, {r3, r4}\n\t"
  52657. "ldm %[a]!, {r3, r4}\n\t"
  52658. #ifdef WOLFSSL_KEIL
  52659. "adcs r3, r3, r5\n\t"
  52660. #elif defined(__clang__)
  52661. "adcs r3, r5\n\t"
  52662. #else
  52663. "adc r3, r5\n\t"
  52664. #endif
  52665. #ifdef WOLFSSL_KEIL
  52666. "adcs r4, r4, r5\n\t"
  52667. #elif defined(__clang__)
  52668. "adcs r4, r5\n\t"
  52669. #else
  52670. "adc r4, r5\n\t"
  52671. #endif
  52672. "stm %[r]!, {r3, r4}\n\t"
  52673. "ldm %[a]!, {r3, r4}\n\t"
  52674. #ifdef WOLFSSL_KEIL
  52675. "adcs r3, r3, r5\n\t"
  52676. #elif defined(__clang__)
  52677. "adcs r3, r5\n\t"
  52678. #else
  52679. "adc r3, r5\n\t"
  52680. #endif
  52681. #ifdef WOLFSSL_KEIL
  52682. "adcs r4, r4, r5\n\t"
  52683. #elif defined(__clang__)
  52684. "adcs r4, r5\n\t"
  52685. #else
  52686. "adc r4, r5\n\t"
  52687. #endif
  52688. "stm %[r]!, {r3, r4}\n\t"
  52689. "ldm %[a]!, {r3, r4}\n\t"
  52690. #ifdef WOLFSSL_KEIL
  52691. "adcs r3, r3, r5\n\t"
  52692. #elif defined(__clang__)
  52693. "adcs r3, r5\n\t"
  52694. #else
  52695. "adc r3, r5\n\t"
  52696. #endif
  52697. #ifdef WOLFSSL_KEIL
  52698. "adcs r4, r4, r5\n\t"
  52699. #elif defined(__clang__)
  52700. "adcs r4, r5\n\t"
  52701. #else
  52702. "adc r4, r5\n\t"
  52703. #endif
  52704. "stm %[r]!, {r3, r4}\n\t"
  52705. "ldm %[a]!, {r3, r4}\n\t"
  52706. #ifdef WOLFSSL_KEIL
  52707. "adcs r3, r3, r5\n\t"
  52708. #elif defined(__clang__)
  52709. "adcs r3, r5\n\t"
  52710. #else
  52711. "adc r3, r5\n\t"
  52712. #endif
  52713. #ifdef WOLFSSL_KEIL
  52714. "adcs r4, r4, r5\n\t"
  52715. #elif defined(__clang__)
  52716. "adcs r4, r5\n\t"
  52717. #else
  52718. "adc r4, r5\n\t"
  52719. #endif
  52720. "stm %[r]!, {r3, r4}\n\t"
  52721. "ldm %[a]!, {r3, r4}\n\t"
  52722. #ifdef WOLFSSL_KEIL
  52723. "adcs r3, r3, r5\n\t"
  52724. #elif defined(__clang__)
  52725. "adcs r3, r5\n\t"
  52726. #else
  52727. "adc r3, r5\n\t"
  52728. #endif
  52729. #ifdef WOLFSSL_KEIL
  52730. "adcs r4, r4, r5\n\t"
  52731. #elif defined(__clang__)
  52732. "adcs r4, r5\n\t"
  52733. #else
  52734. "adc r4, r5\n\t"
  52735. #endif
  52736. "stm %[r]!, {r3, r4}\n\t"
  52737. "ldm %[a]!, {r3, r4}\n\t"
  52738. #ifdef WOLFSSL_KEIL
  52739. "adcs r3, r3, r5\n\t"
  52740. #elif defined(__clang__)
  52741. "adcs r3, r5\n\t"
  52742. #else
  52743. "adc r3, r5\n\t"
  52744. #endif
  52745. #ifdef WOLFSSL_KEIL
  52746. "adcs r4, r4, r5\n\t"
  52747. #elif defined(__clang__)
  52748. "adcs r4, r5\n\t"
  52749. #else
  52750. "adc r4, r5\n\t"
  52751. #endif
  52752. "stm %[r]!, {r3, r4}\n\t"
  52753. "ldm %[a]!, {r3, r4}\n\t"
  52754. #ifdef WOLFSSL_KEIL
  52755. "adcs r3, r3, r5\n\t"
  52756. #elif defined(__clang__)
  52757. "adcs r3, r5\n\t"
  52758. #else
  52759. "adc r3, r5\n\t"
  52760. #endif
  52761. #ifdef WOLFSSL_KEIL
  52762. "adcs r4, r4, r5\n\t"
  52763. #elif defined(__clang__)
  52764. "adcs r4, r5\n\t"
  52765. #else
  52766. "adc r4, r5\n\t"
  52767. #endif
  52768. "stm %[r]!, {r3, r4}\n\t"
  52769. "ldm %[a]!, {r3, r4}\n\t"
  52770. #ifdef WOLFSSL_KEIL
  52771. "adcs r3, r3, r5\n\t"
  52772. #elif defined(__clang__)
  52773. "adcs r3, r5\n\t"
  52774. #else
  52775. "adc r3, r5\n\t"
  52776. #endif
  52777. #ifdef WOLFSSL_KEIL
  52778. "adcs r4, r4, r5\n\t"
  52779. #elif defined(__clang__)
  52780. "adcs r4, r5\n\t"
  52781. #else
  52782. "adc r4, r5\n\t"
  52783. #endif
  52784. "stm %[r]!, {r3, r4}\n\t"
  52785. "ldm %[a]!, {r3, r4}\n\t"
  52786. #ifdef WOLFSSL_KEIL
  52787. "adcs r3, r3, r5\n\t"
  52788. #elif defined(__clang__)
  52789. "adcs r3, r5\n\t"
  52790. #else
  52791. "adc r3, r5\n\t"
  52792. #endif
  52793. #ifdef WOLFSSL_KEIL
  52794. "adcs r4, r4, r5\n\t"
  52795. #elif defined(__clang__)
  52796. "adcs r4, r5\n\t"
  52797. #else
  52798. "adc r4, r5\n\t"
  52799. #endif
  52800. "stm %[r]!, {r3, r4}\n\t"
  52801. "ldm %[a]!, {r3, r4}\n\t"
  52802. #ifdef WOLFSSL_KEIL
  52803. "adcs r3, r3, r5\n\t"
  52804. #elif defined(__clang__)
  52805. "adcs r3, r5\n\t"
  52806. #else
  52807. "adc r3, r5\n\t"
  52808. #endif
  52809. #ifdef WOLFSSL_KEIL
  52810. "adcs r4, r4, r5\n\t"
  52811. #elif defined(__clang__)
  52812. "adcs r4, r5\n\t"
  52813. #else
  52814. "adc r4, r5\n\t"
  52815. #endif
  52816. "stm %[r]!, {r3, r4}\n\t"
  52817. "ldm %[a]!, {r3, r4}\n\t"
  52818. #ifdef WOLFSSL_KEIL
  52819. "adcs r3, r3, r5\n\t"
  52820. #elif defined(__clang__)
  52821. "adcs r3, r5\n\t"
  52822. #else
  52823. "adc r3, r5\n\t"
  52824. #endif
  52825. #ifdef WOLFSSL_KEIL
  52826. "adcs r4, r4, r5\n\t"
  52827. #elif defined(__clang__)
  52828. "adcs r4, r5\n\t"
  52829. #else
  52830. "adc r4, r5\n\t"
  52831. #endif
  52832. "stm %[r]!, {r3, r4}\n\t"
  52833. "ldm %[a]!, {r3, r4}\n\t"
  52834. #ifdef WOLFSSL_KEIL
  52835. "adcs r3, r3, r5\n\t"
  52836. #elif defined(__clang__)
  52837. "adcs r3, r5\n\t"
  52838. #else
  52839. "adc r3, r5\n\t"
  52840. #endif
  52841. #ifdef WOLFSSL_KEIL
  52842. "adcs r4, r4, r5\n\t"
  52843. #elif defined(__clang__)
  52844. "adcs r4, r5\n\t"
  52845. #else
  52846. "adc r4, r5\n\t"
  52847. #endif
  52848. "stm %[r]!, {r3, r4}\n\t"
  52849. "movs %[r], #0\n\t"
  52850. #ifdef WOLFSSL_KEIL
  52851. "adcs %[r], %[r], %[r]\n\t"
  52852. #elif defined(__clang__)
  52853. "adcs %[r], %[r]\n\t"
  52854. #else
  52855. "adc %[r], %[r]\n\t"
  52856. #endif
  52857. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  52858. :
  52859. : "memory", "r3", "r4", "r5"
  52860. );
  52861. return (uint32_t)(size_t)r;
  52862. }
  52863. /* Sub b from a into a. (a -= b)
  52864. *
  52865. * a A single precision integer.
  52866. * b A single precision integer.
  52867. */
  52868. SP_NOINLINE static sp_digit sp_3072_sub_in_place_96(sp_digit* a,
  52869. const sp_digit* b)
  52870. {
  52871. __asm__ __volatile__ (
  52872. "ldm %[b]!, {r4, r5}\n\t"
  52873. "ldr r2, [%[a]]\n\t"
  52874. "ldr r3, [%[a], #4]\n\t"
  52875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  52876. "subs r2, r2, r4\n\t"
  52877. #else
  52878. "sub r2, r2, r4\n\t"
  52879. #endif
  52880. #ifdef WOLFSSL_KEIL
  52881. "sbcs r3, r3, r5\n\t"
  52882. #elif defined(__clang__)
  52883. "sbcs r3, r5\n\t"
  52884. #else
  52885. "sbc r3, r5\n\t"
  52886. #endif
  52887. "stm %[a]!, {r2, r3}\n\t"
  52888. "ldm %[b]!, {r4, r5}\n\t"
  52889. "ldr r2, [%[a]]\n\t"
  52890. "ldr r3, [%[a], #4]\n\t"
  52891. #ifdef WOLFSSL_KEIL
  52892. "sbcs r2, r2, r4\n\t"
  52893. #elif defined(__clang__)
  52894. "sbcs r2, r4\n\t"
  52895. #else
  52896. "sbc r2, r4\n\t"
  52897. #endif
  52898. #ifdef WOLFSSL_KEIL
  52899. "sbcs r3, r3, r5\n\t"
  52900. #elif defined(__clang__)
  52901. "sbcs r3, r5\n\t"
  52902. #else
  52903. "sbc r3, r5\n\t"
  52904. #endif
  52905. "stm %[a]!, {r2, r3}\n\t"
  52906. "ldm %[b]!, {r4, r5}\n\t"
  52907. "ldr r2, [%[a]]\n\t"
  52908. "ldr r3, [%[a], #4]\n\t"
  52909. #ifdef WOLFSSL_KEIL
  52910. "sbcs r2, r2, r4\n\t"
  52911. #elif defined(__clang__)
  52912. "sbcs r2, r4\n\t"
  52913. #else
  52914. "sbc r2, r4\n\t"
  52915. #endif
  52916. #ifdef WOLFSSL_KEIL
  52917. "sbcs r3, r3, r5\n\t"
  52918. #elif defined(__clang__)
  52919. "sbcs r3, r5\n\t"
  52920. #else
  52921. "sbc r3, r5\n\t"
  52922. #endif
  52923. "stm %[a]!, {r2, r3}\n\t"
  52924. "ldm %[b]!, {r4, r5}\n\t"
  52925. "ldr r2, [%[a]]\n\t"
  52926. "ldr r3, [%[a], #4]\n\t"
  52927. #ifdef WOLFSSL_KEIL
  52928. "sbcs r2, r2, r4\n\t"
  52929. #elif defined(__clang__)
  52930. "sbcs r2, r4\n\t"
  52931. #else
  52932. "sbc r2, r4\n\t"
  52933. #endif
  52934. #ifdef WOLFSSL_KEIL
  52935. "sbcs r3, r3, r5\n\t"
  52936. #elif defined(__clang__)
  52937. "sbcs r3, r5\n\t"
  52938. #else
  52939. "sbc r3, r5\n\t"
  52940. #endif
  52941. "stm %[a]!, {r2, r3}\n\t"
  52942. "ldm %[b]!, {r4, r5}\n\t"
  52943. "ldr r2, [%[a]]\n\t"
  52944. "ldr r3, [%[a], #4]\n\t"
  52945. #ifdef WOLFSSL_KEIL
  52946. "sbcs r2, r2, r4\n\t"
  52947. #elif defined(__clang__)
  52948. "sbcs r2, r4\n\t"
  52949. #else
  52950. "sbc r2, r4\n\t"
  52951. #endif
  52952. #ifdef WOLFSSL_KEIL
  52953. "sbcs r3, r3, r5\n\t"
  52954. #elif defined(__clang__)
  52955. "sbcs r3, r5\n\t"
  52956. #else
  52957. "sbc r3, r5\n\t"
  52958. #endif
  52959. "stm %[a]!, {r2, r3}\n\t"
  52960. "ldm %[b]!, {r4, r5}\n\t"
  52961. "ldr r2, [%[a]]\n\t"
  52962. "ldr r3, [%[a], #4]\n\t"
  52963. #ifdef WOLFSSL_KEIL
  52964. "sbcs r2, r2, r4\n\t"
  52965. #elif defined(__clang__)
  52966. "sbcs r2, r4\n\t"
  52967. #else
  52968. "sbc r2, r4\n\t"
  52969. #endif
  52970. #ifdef WOLFSSL_KEIL
  52971. "sbcs r3, r3, r5\n\t"
  52972. #elif defined(__clang__)
  52973. "sbcs r3, r5\n\t"
  52974. #else
  52975. "sbc r3, r5\n\t"
  52976. #endif
  52977. "stm %[a]!, {r2, r3}\n\t"
  52978. "ldm %[b]!, {r4, r5}\n\t"
  52979. "ldr r2, [%[a]]\n\t"
  52980. "ldr r3, [%[a], #4]\n\t"
  52981. #ifdef WOLFSSL_KEIL
  52982. "sbcs r2, r2, r4\n\t"
  52983. #elif defined(__clang__)
  52984. "sbcs r2, r4\n\t"
  52985. #else
  52986. "sbc r2, r4\n\t"
  52987. #endif
  52988. #ifdef WOLFSSL_KEIL
  52989. "sbcs r3, r3, r5\n\t"
  52990. #elif defined(__clang__)
  52991. "sbcs r3, r5\n\t"
  52992. #else
  52993. "sbc r3, r5\n\t"
  52994. #endif
  52995. "stm %[a]!, {r2, r3}\n\t"
  52996. "ldm %[b]!, {r4, r5}\n\t"
  52997. "ldr r2, [%[a]]\n\t"
  52998. "ldr r3, [%[a], #4]\n\t"
  52999. #ifdef WOLFSSL_KEIL
  53000. "sbcs r2, r2, r4\n\t"
  53001. #elif defined(__clang__)
  53002. "sbcs r2, r4\n\t"
  53003. #else
  53004. "sbc r2, r4\n\t"
  53005. #endif
  53006. #ifdef WOLFSSL_KEIL
  53007. "sbcs r3, r3, r5\n\t"
  53008. #elif defined(__clang__)
  53009. "sbcs r3, r5\n\t"
  53010. #else
  53011. "sbc r3, r5\n\t"
  53012. #endif
  53013. "stm %[a]!, {r2, r3}\n\t"
  53014. "ldm %[b]!, {r4, r5}\n\t"
  53015. "ldr r2, [%[a]]\n\t"
  53016. "ldr r3, [%[a], #4]\n\t"
  53017. #ifdef WOLFSSL_KEIL
  53018. "sbcs r2, r2, r4\n\t"
  53019. #elif defined(__clang__)
  53020. "sbcs r2, r4\n\t"
  53021. #else
  53022. "sbc r2, r4\n\t"
  53023. #endif
  53024. #ifdef WOLFSSL_KEIL
  53025. "sbcs r3, r3, r5\n\t"
  53026. #elif defined(__clang__)
  53027. "sbcs r3, r5\n\t"
  53028. #else
  53029. "sbc r3, r5\n\t"
  53030. #endif
  53031. "stm %[a]!, {r2, r3}\n\t"
  53032. "ldm %[b]!, {r4, r5}\n\t"
  53033. "ldr r2, [%[a]]\n\t"
  53034. "ldr r3, [%[a], #4]\n\t"
  53035. #ifdef WOLFSSL_KEIL
  53036. "sbcs r2, r2, r4\n\t"
  53037. #elif defined(__clang__)
  53038. "sbcs r2, r4\n\t"
  53039. #else
  53040. "sbc r2, r4\n\t"
  53041. #endif
  53042. #ifdef WOLFSSL_KEIL
  53043. "sbcs r3, r3, r5\n\t"
  53044. #elif defined(__clang__)
  53045. "sbcs r3, r5\n\t"
  53046. #else
  53047. "sbc r3, r5\n\t"
  53048. #endif
  53049. "stm %[a]!, {r2, r3}\n\t"
  53050. "ldm %[b]!, {r4, r5}\n\t"
  53051. "ldr r2, [%[a]]\n\t"
  53052. "ldr r3, [%[a], #4]\n\t"
  53053. #ifdef WOLFSSL_KEIL
  53054. "sbcs r2, r2, r4\n\t"
  53055. #elif defined(__clang__)
  53056. "sbcs r2, r4\n\t"
  53057. #else
  53058. "sbc r2, r4\n\t"
  53059. #endif
  53060. #ifdef WOLFSSL_KEIL
  53061. "sbcs r3, r3, r5\n\t"
  53062. #elif defined(__clang__)
  53063. "sbcs r3, r5\n\t"
  53064. #else
  53065. "sbc r3, r5\n\t"
  53066. #endif
  53067. "stm %[a]!, {r2, r3}\n\t"
  53068. "ldm %[b]!, {r4, r5}\n\t"
  53069. "ldr r2, [%[a]]\n\t"
  53070. "ldr r3, [%[a], #4]\n\t"
  53071. #ifdef WOLFSSL_KEIL
  53072. "sbcs r2, r2, r4\n\t"
  53073. #elif defined(__clang__)
  53074. "sbcs r2, r4\n\t"
  53075. #else
  53076. "sbc r2, r4\n\t"
  53077. #endif
  53078. #ifdef WOLFSSL_KEIL
  53079. "sbcs r3, r3, r5\n\t"
  53080. #elif defined(__clang__)
  53081. "sbcs r3, r5\n\t"
  53082. #else
  53083. "sbc r3, r5\n\t"
  53084. #endif
  53085. "stm %[a]!, {r2, r3}\n\t"
  53086. "ldm %[b]!, {r4, r5}\n\t"
  53087. "ldr r2, [%[a]]\n\t"
  53088. "ldr r3, [%[a], #4]\n\t"
  53089. #ifdef WOLFSSL_KEIL
  53090. "sbcs r2, r2, r4\n\t"
  53091. #elif defined(__clang__)
  53092. "sbcs r2, r4\n\t"
  53093. #else
  53094. "sbc r2, r4\n\t"
  53095. #endif
  53096. #ifdef WOLFSSL_KEIL
  53097. "sbcs r3, r3, r5\n\t"
  53098. #elif defined(__clang__)
  53099. "sbcs r3, r5\n\t"
  53100. #else
  53101. "sbc r3, r5\n\t"
  53102. #endif
  53103. "stm %[a]!, {r2, r3}\n\t"
  53104. "ldm %[b]!, {r4, r5}\n\t"
  53105. "ldr r2, [%[a]]\n\t"
  53106. "ldr r3, [%[a], #4]\n\t"
  53107. #ifdef WOLFSSL_KEIL
  53108. "sbcs r2, r2, r4\n\t"
  53109. #elif defined(__clang__)
  53110. "sbcs r2, r4\n\t"
  53111. #else
  53112. "sbc r2, r4\n\t"
  53113. #endif
  53114. #ifdef WOLFSSL_KEIL
  53115. "sbcs r3, r3, r5\n\t"
  53116. #elif defined(__clang__)
  53117. "sbcs r3, r5\n\t"
  53118. #else
  53119. "sbc r3, r5\n\t"
  53120. #endif
  53121. "stm %[a]!, {r2, r3}\n\t"
  53122. "ldm %[b]!, {r4, r5}\n\t"
  53123. "ldr r2, [%[a]]\n\t"
  53124. "ldr r3, [%[a], #4]\n\t"
  53125. #ifdef WOLFSSL_KEIL
  53126. "sbcs r2, r2, r4\n\t"
  53127. #elif defined(__clang__)
  53128. "sbcs r2, r4\n\t"
  53129. #else
  53130. "sbc r2, r4\n\t"
  53131. #endif
  53132. #ifdef WOLFSSL_KEIL
  53133. "sbcs r3, r3, r5\n\t"
  53134. #elif defined(__clang__)
  53135. "sbcs r3, r5\n\t"
  53136. #else
  53137. "sbc r3, r5\n\t"
  53138. #endif
  53139. "stm %[a]!, {r2, r3}\n\t"
  53140. "ldm %[b]!, {r4, r5}\n\t"
  53141. "ldr r2, [%[a]]\n\t"
  53142. "ldr r3, [%[a], #4]\n\t"
  53143. #ifdef WOLFSSL_KEIL
  53144. "sbcs r2, r2, r4\n\t"
  53145. #elif defined(__clang__)
  53146. "sbcs r2, r4\n\t"
  53147. #else
  53148. "sbc r2, r4\n\t"
  53149. #endif
  53150. #ifdef WOLFSSL_KEIL
  53151. "sbcs r3, r3, r5\n\t"
  53152. #elif defined(__clang__)
  53153. "sbcs r3, r5\n\t"
  53154. #else
  53155. "sbc r3, r5\n\t"
  53156. #endif
  53157. "stm %[a]!, {r2, r3}\n\t"
  53158. "ldm %[b]!, {r4, r5}\n\t"
  53159. "ldr r2, [%[a]]\n\t"
  53160. "ldr r3, [%[a], #4]\n\t"
  53161. #ifdef WOLFSSL_KEIL
  53162. "sbcs r2, r2, r4\n\t"
  53163. #elif defined(__clang__)
  53164. "sbcs r2, r4\n\t"
  53165. #else
  53166. "sbc r2, r4\n\t"
  53167. #endif
  53168. #ifdef WOLFSSL_KEIL
  53169. "sbcs r3, r3, r5\n\t"
  53170. #elif defined(__clang__)
  53171. "sbcs r3, r5\n\t"
  53172. #else
  53173. "sbc r3, r5\n\t"
  53174. #endif
  53175. "stm %[a]!, {r2, r3}\n\t"
  53176. "ldm %[b]!, {r4, r5}\n\t"
  53177. "ldr r2, [%[a]]\n\t"
  53178. "ldr r3, [%[a], #4]\n\t"
  53179. #ifdef WOLFSSL_KEIL
  53180. "sbcs r2, r2, r4\n\t"
  53181. #elif defined(__clang__)
  53182. "sbcs r2, r4\n\t"
  53183. #else
  53184. "sbc r2, r4\n\t"
  53185. #endif
  53186. #ifdef WOLFSSL_KEIL
  53187. "sbcs r3, r3, r5\n\t"
  53188. #elif defined(__clang__)
  53189. "sbcs r3, r5\n\t"
  53190. #else
  53191. "sbc r3, r5\n\t"
  53192. #endif
  53193. "stm %[a]!, {r2, r3}\n\t"
  53194. "ldm %[b]!, {r4, r5}\n\t"
  53195. "ldr r2, [%[a]]\n\t"
  53196. "ldr r3, [%[a], #4]\n\t"
  53197. #ifdef WOLFSSL_KEIL
  53198. "sbcs r2, r2, r4\n\t"
  53199. #elif defined(__clang__)
  53200. "sbcs r2, r4\n\t"
  53201. #else
  53202. "sbc r2, r4\n\t"
  53203. #endif
  53204. #ifdef WOLFSSL_KEIL
  53205. "sbcs r3, r3, r5\n\t"
  53206. #elif defined(__clang__)
  53207. "sbcs r3, r5\n\t"
  53208. #else
  53209. "sbc r3, r5\n\t"
  53210. #endif
  53211. "stm %[a]!, {r2, r3}\n\t"
  53212. "ldm %[b]!, {r4, r5}\n\t"
  53213. "ldr r2, [%[a]]\n\t"
  53214. "ldr r3, [%[a], #4]\n\t"
  53215. #ifdef WOLFSSL_KEIL
  53216. "sbcs r2, r2, r4\n\t"
  53217. #elif defined(__clang__)
  53218. "sbcs r2, r4\n\t"
  53219. #else
  53220. "sbc r2, r4\n\t"
  53221. #endif
  53222. #ifdef WOLFSSL_KEIL
  53223. "sbcs r3, r3, r5\n\t"
  53224. #elif defined(__clang__)
  53225. "sbcs r3, r5\n\t"
  53226. #else
  53227. "sbc r3, r5\n\t"
  53228. #endif
  53229. "stm %[a]!, {r2, r3}\n\t"
  53230. "ldm %[b]!, {r4, r5}\n\t"
  53231. "ldr r2, [%[a]]\n\t"
  53232. "ldr r3, [%[a], #4]\n\t"
  53233. #ifdef WOLFSSL_KEIL
  53234. "sbcs r2, r2, r4\n\t"
  53235. #elif defined(__clang__)
  53236. "sbcs r2, r4\n\t"
  53237. #else
  53238. "sbc r2, r4\n\t"
  53239. #endif
  53240. #ifdef WOLFSSL_KEIL
  53241. "sbcs r3, r3, r5\n\t"
  53242. #elif defined(__clang__)
  53243. "sbcs r3, r5\n\t"
  53244. #else
  53245. "sbc r3, r5\n\t"
  53246. #endif
  53247. "stm %[a]!, {r2, r3}\n\t"
  53248. "ldm %[b]!, {r4, r5}\n\t"
  53249. "ldr r2, [%[a]]\n\t"
  53250. "ldr r3, [%[a], #4]\n\t"
  53251. #ifdef WOLFSSL_KEIL
  53252. "sbcs r2, r2, r4\n\t"
  53253. #elif defined(__clang__)
  53254. "sbcs r2, r4\n\t"
  53255. #else
  53256. "sbc r2, r4\n\t"
  53257. #endif
  53258. #ifdef WOLFSSL_KEIL
  53259. "sbcs r3, r3, r5\n\t"
  53260. #elif defined(__clang__)
  53261. "sbcs r3, r5\n\t"
  53262. #else
  53263. "sbc r3, r5\n\t"
  53264. #endif
  53265. "stm %[a]!, {r2, r3}\n\t"
  53266. "ldm %[b]!, {r4, r5}\n\t"
  53267. "ldr r2, [%[a]]\n\t"
  53268. "ldr r3, [%[a], #4]\n\t"
  53269. #ifdef WOLFSSL_KEIL
  53270. "sbcs r2, r2, r4\n\t"
  53271. #elif defined(__clang__)
  53272. "sbcs r2, r4\n\t"
  53273. #else
  53274. "sbc r2, r4\n\t"
  53275. #endif
  53276. #ifdef WOLFSSL_KEIL
  53277. "sbcs r3, r3, r5\n\t"
  53278. #elif defined(__clang__)
  53279. "sbcs r3, r5\n\t"
  53280. #else
  53281. "sbc r3, r5\n\t"
  53282. #endif
  53283. "stm %[a]!, {r2, r3}\n\t"
  53284. "ldm %[b]!, {r4, r5}\n\t"
  53285. "ldr r2, [%[a]]\n\t"
  53286. "ldr r3, [%[a], #4]\n\t"
  53287. #ifdef WOLFSSL_KEIL
  53288. "sbcs r2, r2, r4\n\t"
  53289. #elif defined(__clang__)
  53290. "sbcs r2, r4\n\t"
  53291. #else
  53292. "sbc r2, r4\n\t"
  53293. #endif
  53294. #ifdef WOLFSSL_KEIL
  53295. "sbcs r3, r3, r5\n\t"
  53296. #elif defined(__clang__)
  53297. "sbcs r3, r5\n\t"
  53298. #else
  53299. "sbc r3, r5\n\t"
  53300. #endif
  53301. "stm %[a]!, {r2, r3}\n\t"
  53302. "ldm %[b]!, {r4, r5}\n\t"
  53303. "ldr r2, [%[a]]\n\t"
  53304. "ldr r3, [%[a], #4]\n\t"
  53305. #ifdef WOLFSSL_KEIL
  53306. "sbcs r2, r2, r4\n\t"
  53307. #elif defined(__clang__)
  53308. "sbcs r2, r4\n\t"
  53309. #else
  53310. "sbc r2, r4\n\t"
  53311. #endif
  53312. #ifdef WOLFSSL_KEIL
  53313. "sbcs r3, r3, r5\n\t"
  53314. #elif defined(__clang__)
  53315. "sbcs r3, r5\n\t"
  53316. #else
  53317. "sbc r3, r5\n\t"
  53318. #endif
  53319. "stm %[a]!, {r2, r3}\n\t"
  53320. "ldm %[b]!, {r4, r5}\n\t"
  53321. "ldr r2, [%[a]]\n\t"
  53322. "ldr r3, [%[a], #4]\n\t"
  53323. #ifdef WOLFSSL_KEIL
  53324. "sbcs r2, r2, r4\n\t"
  53325. #elif defined(__clang__)
  53326. "sbcs r2, r4\n\t"
  53327. #else
  53328. "sbc r2, r4\n\t"
  53329. #endif
  53330. #ifdef WOLFSSL_KEIL
  53331. "sbcs r3, r3, r5\n\t"
  53332. #elif defined(__clang__)
  53333. "sbcs r3, r5\n\t"
  53334. #else
  53335. "sbc r3, r5\n\t"
  53336. #endif
  53337. "stm %[a]!, {r2, r3}\n\t"
  53338. "ldm %[b]!, {r4, r5}\n\t"
  53339. "ldr r2, [%[a]]\n\t"
  53340. "ldr r3, [%[a], #4]\n\t"
  53341. #ifdef WOLFSSL_KEIL
  53342. "sbcs r2, r2, r4\n\t"
  53343. #elif defined(__clang__)
  53344. "sbcs r2, r4\n\t"
  53345. #else
  53346. "sbc r2, r4\n\t"
  53347. #endif
  53348. #ifdef WOLFSSL_KEIL
  53349. "sbcs r3, r3, r5\n\t"
  53350. #elif defined(__clang__)
  53351. "sbcs r3, r5\n\t"
  53352. #else
  53353. "sbc r3, r5\n\t"
  53354. #endif
  53355. "stm %[a]!, {r2, r3}\n\t"
  53356. "ldm %[b]!, {r4, r5}\n\t"
  53357. "ldr r2, [%[a]]\n\t"
  53358. "ldr r3, [%[a], #4]\n\t"
  53359. #ifdef WOLFSSL_KEIL
  53360. "sbcs r2, r2, r4\n\t"
  53361. #elif defined(__clang__)
  53362. "sbcs r2, r4\n\t"
  53363. #else
  53364. "sbc r2, r4\n\t"
  53365. #endif
  53366. #ifdef WOLFSSL_KEIL
  53367. "sbcs r3, r3, r5\n\t"
  53368. #elif defined(__clang__)
  53369. "sbcs r3, r5\n\t"
  53370. #else
  53371. "sbc r3, r5\n\t"
  53372. #endif
  53373. "stm %[a]!, {r2, r3}\n\t"
  53374. "ldm %[b]!, {r4, r5}\n\t"
  53375. "ldr r2, [%[a]]\n\t"
  53376. "ldr r3, [%[a], #4]\n\t"
  53377. #ifdef WOLFSSL_KEIL
  53378. "sbcs r2, r2, r4\n\t"
  53379. #elif defined(__clang__)
  53380. "sbcs r2, r4\n\t"
  53381. #else
  53382. "sbc r2, r4\n\t"
  53383. #endif
  53384. #ifdef WOLFSSL_KEIL
  53385. "sbcs r3, r3, r5\n\t"
  53386. #elif defined(__clang__)
  53387. "sbcs r3, r5\n\t"
  53388. #else
  53389. "sbc r3, r5\n\t"
  53390. #endif
  53391. "stm %[a]!, {r2, r3}\n\t"
  53392. "ldm %[b]!, {r4, r5}\n\t"
  53393. "ldr r2, [%[a]]\n\t"
  53394. "ldr r3, [%[a], #4]\n\t"
  53395. #ifdef WOLFSSL_KEIL
  53396. "sbcs r2, r2, r4\n\t"
  53397. #elif defined(__clang__)
  53398. "sbcs r2, r4\n\t"
  53399. #else
  53400. "sbc r2, r4\n\t"
  53401. #endif
  53402. #ifdef WOLFSSL_KEIL
  53403. "sbcs r3, r3, r5\n\t"
  53404. #elif defined(__clang__)
  53405. "sbcs r3, r5\n\t"
  53406. #else
  53407. "sbc r3, r5\n\t"
  53408. #endif
  53409. "stm %[a]!, {r2, r3}\n\t"
  53410. "ldm %[b]!, {r4, r5}\n\t"
  53411. "ldr r2, [%[a]]\n\t"
  53412. "ldr r3, [%[a], #4]\n\t"
  53413. #ifdef WOLFSSL_KEIL
  53414. "sbcs r2, r2, r4\n\t"
  53415. #elif defined(__clang__)
  53416. "sbcs r2, r4\n\t"
  53417. #else
  53418. "sbc r2, r4\n\t"
  53419. #endif
  53420. #ifdef WOLFSSL_KEIL
  53421. "sbcs r3, r3, r5\n\t"
  53422. #elif defined(__clang__)
  53423. "sbcs r3, r5\n\t"
  53424. #else
  53425. "sbc r3, r5\n\t"
  53426. #endif
  53427. "stm %[a]!, {r2, r3}\n\t"
  53428. "ldm %[b]!, {r4, r5}\n\t"
  53429. "ldr r2, [%[a]]\n\t"
  53430. "ldr r3, [%[a], #4]\n\t"
  53431. #ifdef WOLFSSL_KEIL
  53432. "sbcs r2, r2, r4\n\t"
  53433. #elif defined(__clang__)
  53434. "sbcs r2, r4\n\t"
  53435. #else
  53436. "sbc r2, r4\n\t"
  53437. #endif
  53438. #ifdef WOLFSSL_KEIL
  53439. "sbcs r3, r3, r5\n\t"
  53440. #elif defined(__clang__)
  53441. "sbcs r3, r5\n\t"
  53442. #else
  53443. "sbc r3, r5\n\t"
  53444. #endif
  53445. "stm %[a]!, {r2, r3}\n\t"
  53446. "ldm %[b]!, {r4, r5}\n\t"
  53447. "ldr r2, [%[a]]\n\t"
  53448. "ldr r3, [%[a], #4]\n\t"
  53449. #ifdef WOLFSSL_KEIL
  53450. "sbcs r2, r2, r4\n\t"
  53451. #elif defined(__clang__)
  53452. "sbcs r2, r4\n\t"
  53453. #else
  53454. "sbc r2, r4\n\t"
  53455. #endif
  53456. #ifdef WOLFSSL_KEIL
  53457. "sbcs r3, r3, r5\n\t"
  53458. #elif defined(__clang__)
  53459. "sbcs r3, r5\n\t"
  53460. #else
  53461. "sbc r3, r5\n\t"
  53462. #endif
  53463. "stm %[a]!, {r2, r3}\n\t"
  53464. "ldm %[b]!, {r4, r5}\n\t"
  53465. "ldr r2, [%[a]]\n\t"
  53466. "ldr r3, [%[a], #4]\n\t"
  53467. #ifdef WOLFSSL_KEIL
  53468. "sbcs r2, r2, r4\n\t"
  53469. #elif defined(__clang__)
  53470. "sbcs r2, r4\n\t"
  53471. #else
  53472. "sbc r2, r4\n\t"
  53473. #endif
  53474. #ifdef WOLFSSL_KEIL
  53475. "sbcs r3, r3, r5\n\t"
  53476. #elif defined(__clang__)
  53477. "sbcs r3, r5\n\t"
  53478. #else
  53479. "sbc r3, r5\n\t"
  53480. #endif
  53481. "stm %[a]!, {r2, r3}\n\t"
  53482. "ldm %[b]!, {r4, r5}\n\t"
  53483. "ldr r2, [%[a]]\n\t"
  53484. "ldr r3, [%[a], #4]\n\t"
  53485. #ifdef WOLFSSL_KEIL
  53486. "sbcs r2, r2, r4\n\t"
  53487. #elif defined(__clang__)
  53488. "sbcs r2, r4\n\t"
  53489. #else
  53490. "sbc r2, r4\n\t"
  53491. #endif
  53492. #ifdef WOLFSSL_KEIL
  53493. "sbcs r3, r3, r5\n\t"
  53494. #elif defined(__clang__)
  53495. "sbcs r3, r5\n\t"
  53496. #else
  53497. "sbc r3, r5\n\t"
  53498. #endif
  53499. "stm %[a]!, {r2, r3}\n\t"
  53500. "ldm %[b]!, {r4, r5}\n\t"
  53501. "ldr r2, [%[a]]\n\t"
  53502. "ldr r3, [%[a], #4]\n\t"
  53503. #ifdef WOLFSSL_KEIL
  53504. "sbcs r2, r2, r4\n\t"
  53505. #elif defined(__clang__)
  53506. "sbcs r2, r4\n\t"
  53507. #else
  53508. "sbc r2, r4\n\t"
  53509. #endif
  53510. #ifdef WOLFSSL_KEIL
  53511. "sbcs r3, r3, r5\n\t"
  53512. #elif defined(__clang__)
  53513. "sbcs r3, r5\n\t"
  53514. #else
  53515. "sbc r3, r5\n\t"
  53516. #endif
  53517. "stm %[a]!, {r2, r3}\n\t"
  53518. "ldm %[b]!, {r4, r5}\n\t"
  53519. "ldr r2, [%[a]]\n\t"
  53520. "ldr r3, [%[a], #4]\n\t"
  53521. #ifdef WOLFSSL_KEIL
  53522. "sbcs r2, r2, r4\n\t"
  53523. #elif defined(__clang__)
  53524. "sbcs r2, r4\n\t"
  53525. #else
  53526. "sbc r2, r4\n\t"
  53527. #endif
  53528. #ifdef WOLFSSL_KEIL
  53529. "sbcs r3, r3, r5\n\t"
  53530. #elif defined(__clang__)
  53531. "sbcs r3, r5\n\t"
  53532. #else
  53533. "sbc r3, r5\n\t"
  53534. #endif
  53535. "stm %[a]!, {r2, r3}\n\t"
  53536. "ldm %[b]!, {r4, r5}\n\t"
  53537. "ldr r2, [%[a]]\n\t"
  53538. "ldr r3, [%[a], #4]\n\t"
  53539. #ifdef WOLFSSL_KEIL
  53540. "sbcs r2, r2, r4\n\t"
  53541. #elif defined(__clang__)
  53542. "sbcs r2, r4\n\t"
  53543. #else
  53544. "sbc r2, r4\n\t"
  53545. #endif
  53546. #ifdef WOLFSSL_KEIL
  53547. "sbcs r3, r3, r5\n\t"
  53548. #elif defined(__clang__)
  53549. "sbcs r3, r5\n\t"
  53550. #else
  53551. "sbc r3, r5\n\t"
  53552. #endif
  53553. "stm %[a]!, {r2, r3}\n\t"
  53554. "ldm %[b]!, {r4, r5}\n\t"
  53555. "ldr r2, [%[a]]\n\t"
  53556. "ldr r3, [%[a], #4]\n\t"
  53557. #ifdef WOLFSSL_KEIL
  53558. "sbcs r2, r2, r4\n\t"
  53559. #elif defined(__clang__)
  53560. "sbcs r2, r4\n\t"
  53561. #else
  53562. "sbc r2, r4\n\t"
  53563. #endif
  53564. #ifdef WOLFSSL_KEIL
  53565. "sbcs r3, r3, r5\n\t"
  53566. #elif defined(__clang__)
  53567. "sbcs r3, r5\n\t"
  53568. #else
  53569. "sbc r3, r5\n\t"
  53570. #endif
  53571. "stm %[a]!, {r2, r3}\n\t"
  53572. "ldm %[b]!, {r4, r5}\n\t"
  53573. "ldr r2, [%[a]]\n\t"
  53574. "ldr r3, [%[a], #4]\n\t"
  53575. #ifdef WOLFSSL_KEIL
  53576. "sbcs r2, r2, r4\n\t"
  53577. #elif defined(__clang__)
  53578. "sbcs r2, r4\n\t"
  53579. #else
  53580. "sbc r2, r4\n\t"
  53581. #endif
  53582. #ifdef WOLFSSL_KEIL
  53583. "sbcs r3, r3, r5\n\t"
  53584. #elif defined(__clang__)
  53585. "sbcs r3, r5\n\t"
  53586. #else
  53587. "sbc r3, r5\n\t"
  53588. #endif
  53589. "stm %[a]!, {r2, r3}\n\t"
  53590. "ldm %[b]!, {r4, r5}\n\t"
  53591. "ldr r2, [%[a]]\n\t"
  53592. "ldr r3, [%[a], #4]\n\t"
  53593. #ifdef WOLFSSL_KEIL
  53594. "sbcs r2, r2, r4\n\t"
  53595. #elif defined(__clang__)
  53596. "sbcs r2, r4\n\t"
  53597. #else
  53598. "sbc r2, r4\n\t"
  53599. #endif
  53600. #ifdef WOLFSSL_KEIL
  53601. "sbcs r3, r3, r5\n\t"
  53602. #elif defined(__clang__)
  53603. "sbcs r3, r5\n\t"
  53604. #else
  53605. "sbc r3, r5\n\t"
  53606. #endif
  53607. "stm %[a]!, {r2, r3}\n\t"
  53608. "ldm %[b]!, {r4, r5}\n\t"
  53609. "ldr r2, [%[a]]\n\t"
  53610. "ldr r3, [%[a], #4]\n\t"
  53611. #ifdef WOLFSSL_KEIL
  53612. "sbcs r2, r2, r4\n\t"
  53613. #elif defined(__clang__)
  53614. "sbcs r2, r4\n\t"
  53615. #else
  53616. "sbc r2, r4\n\t"
  53617. #endif
  53618. #ifdef WOLFSSL_KEIL
  53619. "sbcs r3, r3, r5\n\t"
  53620. #elif defined(__clang__)
  53621. "sbcs r3, r5\n\t"
  53622. #else
  53623. "sbc r3, r5\n\t"
  53624. #endif
  53625. "stm %[a]!, {r2, r3}\n\t"
  53626. "ldm %[b]!, {r4, r5}\n\t"
  53627. "ldr r2, [%[a]]\n\t"
  53628. "ldr r3, [%[a], #4]\n\t"
  53629. #ifdef WOLFSSL_KEIL
  53630. "sbcs r2, r2, r4\n\t"
  53631. #elif defined(__clang__)
  53632. "sbcs r2, r4\n\t"
  53633. #else
  53634. "sbc r2, r4\n\t"
  53635. #endif
  53636. #ifdef WOLFSSL_KEIL
  53637. "sbcs r3, r3, r5\n\t"
  53638. #elif defined(__clang__)
  53639. "sbcs r3, r5\n\t"
  53640. #else
  53641. "sbc r3, r5\n\t"
  53642. #endif
  53643. "stm %[a]!, {r2, r3}\n\t"
  53644. "ldm %[b]!, {r4, r5}\n\t"
  53645. "ldr r2, [%[a]]\n\t"
  53646. "ldr r3, [%[a], #4]\n\t"
  53647. #ifdef WOLFSSL_KEIL
  53648. "sbcs r2, r2, r4\n\t"
  53649. #elif defined(__clang__)
  53650. "sbcs r2, r4\n\t"
  53651. #else
  53652. "sbc r2, r4\n\t"
  53653. #endif
  53654. #ifdef WOLFSSL_KEIL
  53655. "sbcs r3, r3, r5\n\t"
  53656. #elif defined(__clang__)
  53657. "sbcs r3, r5\n\t"
  53658. #else
  53659. "sbc r3, r5\n\t"
  53660. #endif
  53661. "stm %[a]!, {r2, r3}\n\t"
  53662. "ldm %[b]!, {r4, r5}\n\t"
  53663. "ldr r2, [%[a]]\n\t"
  53664. "ldr r3, [%[a], #4]\n\t"
  53665. #ifdef WOLFSSL_KEIL
  53666. "sbcs r2, r2, r4\n\t"
  53667. #elif defined(__clang__)
  53668. "sbcs r2, r4\n\t"
  53669. #else
  53670. "sbc r2, r4\n\t"
  53671. #endif
  53672. #ifdef WOLFSSL_KEIL
  53673. "sbcs r3, r3, r5\n\t"
  53674. #elif defined(__clang__)
  53675. "sbcs r3, r5\n\t"
  53676. #else
  53677. "sbc r3, r5\n\t"
  53678. #endif
  53679. "stm %[a]!, {r2, r3}\n\t"
  53680. "ldm %[b]!, {r4, r5}\n\t"
  53681. "ldr r2, [%[a]]\n\t"
  53682. "ldr r3, [%[a], #4]\n\t"
  53683. #ifdef WOLFSSL_KEIL
  53684. "sbcs r2, r2, r4\n\t"
  53685. #elif defined(__clang__)
  53686. "sbcs r2, r4\n\t"
  53687. #else
  53688. "sbc r2, r4\n\t"
  53689. #endif
  53690. #ifdef WOLFSSL_KEIL
  53691. "sbcs r3, r3, r5\n\t"
  53692. #elif defined(__clang__)
  53693. "sbcs r3, r5\n\t"
  53694. #else
  53695. "sbc r3, r5\n\t"
  53696. #endif
  53697. "stm %[a]!, {r2, r3}\n\t"
  53698. "ldm %[b]!, {r4, r5}\n\t"
  53699. "ldr r2, [%[a]]\n\t"
  53700. "ldr r3, [%[a], #4]\n\t"
  53701. #ifdef WOLFSSL_KEIL
  53702. "sbcs r2, r2, r4\n\t"
  53703. #elif defined(__clang__)
  53704. "sbcs r2, r4\n\t"
  53705. #else
  53706. "sbc r2, r4\n\t"
  53707. #endif
  53708. #ifdef WOLFSSL_KEIL
  53709. "sbcs r3, r3, r5\n\t"
  53710. #elif defined(__clang__)
  53711. "sbcs r3, r5\n\t"
  53712. #else
  53713. "sbc r3, r5\n\t"
  53714. #endif
  53715. "stm %[a]!, {r2, r3}\n\t"
  53716. "ldm %[b]!, {r4, r5}\n\t"
  53717. "ldr r2, [%[a]]\n\t"
  53718. "ldr r3, [%[a], #4]\n\t"
  53719. #ifdef WOLFSSL_KEIL
  53720. "sbcs r2, r2, r4\n\t"
  53721. #elif defined(__clang__)
  53722. "sbcs r2, r4\n\t"
  53723. #else
  53724. "sbc r2, r4\n\t"
  53725. #endif
  53726. #ifdef WOLFSSL_KEIL
  53727. "sbcs r3, r3, r5\n\t"
  53728. #elif defined(__clang__)
  53729. "sbcs r3, r5\n\t"
  53730. #else
  53731. "sbc r3, r5\n\t"
  53732. #endif
  53733. "stm %[a]!, {r2, r3}\n\t"
  53734. #ifdef WOLFSSL_KEIL
  53735. "sbcs %[a], %[a], %[a]\n\t"
  53736. #elif defined(__clang__)
  53737. "sbcs %[a], %[a]\n\t"
  53738. #else
  53739. "sbc %[a], %[a]\n\t"
  53740. #endif
  53741. : [a] "+l" (a), [b] "+l" (b)
  53742. :
  53743. : "memory", "r2", "r3", "r4", "r5"
  53744. );
  53745. return (uint32_t)(size_t)a;
  53746. }
  53747. /* Add b to a into r. (r = a + b)
  53748. *
  53749. * r A single precision integer.
  53750. * a A single precision integer.
  53751. * b A single precision integer.
  53752. */
  53753. SP_NOINLINE static sp_digit sp_3072_add_96(sp_digit* r, const sp_digit* a,
  53754. const sp_digit* b)
  53755. {
  53756. __asm__ __volatile__ (
  53757. "ldm %[b]!, {r5, r6}\n\t"
  53758. "ldm %[a]!, {r3, r4}\n\t"
  53759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  53760. "adds r3, r3, r5\n\t"
  53761. #else
  53762. "add r3, r3, r5\n\t"
  53763. #endif
  53764. #ifdef WOLFSSL_KEIL
  53765. "adcs r4, r4, r6\n\t"
  53766. #elif defined(__clang__)
  53767. "adcs r4, r6\n\t"
  53768. #else
  53769. "adc r4, r6\n\t"
  53770. #endif
  53771. "stm %[r]!, {r3, r4}\n\t"
  53772. "ldm %[b]!, {r5, r6}\n\t"
  53773. "ldm %[a]!, {r3, r4}\n\t"
  53774. #ifdef WOLFSSL_KEIL
  53775. "adcs r3, r3, r5\n\t"
  53776. #elif defined(__clang__)
  53777. "adcs r3, r5\n\t"
  53778. #else
  53779. "adc r3, r5\n\t"
  53780. #endif
  53781. #ifdef WOLFSSL_KEIL
  53782. "adcs r4, r4, r6\n\t"
  53783. #elif defined(__clang__)
  53784. "adcs r4, r6\n\t"
  53785. #else
  53786. "adc r4, r6\n\t"
  53787. #endif
  53788. "stm %[r]!, {r3, r4}\n\t"
  53789. "ldm %[b]!, {r5, r6}\n\t"
  53790. "ldm %[a]!, {r3, r4}\n\t"
  53791. #ifdef WOLFSSL_KEIL
  53792. "adcs r3, r3, r5\n\t"
  53793. #elif defined(__clang__)
  53794. "adcs r3, r5\n\t"
  53795. #else
  53796. "adc r3, r5\n\t"
  53797. #endif
  53798. #ifdef WOLFSSL_KEIL
  53799. "adcs r4, r4, r6\n\t"
  53800. #elif defined(__clang__)
  53801. "adcs r4, r6\n\t"
  53802. #else
  53803. "adc r4, r6\n\t"
  53804. #endif
  53805. "stm %[r]!, {r3, r4}\n\t"
  53806. "ldm %[b]!, {r5, r6}\n\t"
  53807. "ldm %[a]!, {r3, r4}\n\t"
  53808. #ifdef WOLFSSL_KEIL
  53809. "adcs r3, r3, r5\n\t"
  53810. #elif defined(__clang__)
  53811. "adcs r3, r5\n\t"
  53812. #else
  53813. "adc r3, r5\n\t"
  53814. #endif
  53815. #ifdef WOLFSSL_KEIL
  53816. "adcs r4, r4, r6\n\t"
  53817. #elif defined(__clang__)
  53818. "adcs r4, r6\n\t"
  53819. #else
  53820. "adc r4, r6\n\t"
  53821. #endif
  53822. "stm %[r]!, {r3, r4}\n\t"
  53823. "ldm %[b]!, {r5, r6}\n\t"
  53824. "ldm %[a]!, {r3, r4}\n\t"
  53825. #ifdef WOLFSSL_KEIL
  53826. "adcs r3, r3, r5\n\t"
  53827. #elif defined(__clang__)
  53828. "adcs r3, r5\n\t"
  53829. #else
  53830. "adc r3, r5\n\t"
  53831. #endif
  53832. #ifdef WOLFSSL_KEIL
  53833. "adcs r4, r4, r6\n\t"
  53834. #elif defined(__clang__)
  53835. "adcs r4, r6\n\t"
  53836. #else
  53837. "adc r4, r6\n\t"
  53838. #endif
  53839. "stm %[r]!, {r3, r4}\n\t"
  53840. "ldm %[b]!, {r5, r6}\n\t"
  53841. "ldm %[a]!, {r3, r4}\n\t"
  53842. #ifdef WOLFSSL_KEIL
  53843. "adcs r3, r3, r5\n\t"
  53844. #elif defined(__clang__)
  53845. "adcs r3, r5\n\t"
  53846. #else
  53847. "adc r3, r5\n\t"
  53848. #endif
  53849. #ifdef WOLFSSL_KEIL
  53850. "adcs r4, r4, r6\n\t"
  53851. #elif defined(__clang__)
  53852. "adcs r4, r6\n\t"
  53853. #else
  53854. "adc r4, r6\n\t"
  53855. #endif
  53856. "stm %[r]!, {r3, r4}\n\t"
  53857. "ldm %[b]!, {r5, r6}\n\t"
  53858. "ldm %[a]!, {r3, r4}\n\t"
  53859. #ifdef WOLFSSL_KEIL
  53860. "adcs r3, r3, r5\n\t"
  53861. #elif defined(__clang__)
  53862. "adcs r3, r5\n\t"
  53863. #else
  53864. "adc r3, r5\n\t"
  53865. #endif
  53866. #ifdef WOLFSSL_KEIL
  53867. "adcs r4, r4, r6\n\t"
  53868. #elif defined(__clang__)
  53869. "adcs r4, r6\n\t"
  53870. #else
  53871. "adc r4, r6\n\t"
  53872. #endif
  53873. "stm %[r]!, {r3, r4}\n\t"
  53874. "ldm %[b]!, {r5, r6}\n\t"
  53875. "ldm %[a]!, {r3, r4}\n\t"
  53876. #ifdef WOLFSSL_KEIL
  53877. "adcs r3, r3, r5\n\t"
  53878. #elif defined(__clang__)
  53879. "adcs r3, r5\n\t"
  53880. #else
  53881. "adc r3, r5\n\t"
  53882. #endif
  53883. #ifdef WOLFSSL_KEIL
  53884. "adcs r4, r4, r6\n\t"
  53885. #elif defined(__clang__)
  53886. "adcs r4, r6\n\t"
  53887. #else
  53888. "adc r4, r6\n\t"
  53889. #endif
  53890. "stm %[r]!, {r3, r4}\n\t"
  53891. "ldm %[b]!, {r5, r6}\n\t"
  53892. "ldm %[a]!, {r3, r4}\n\t"
  53893. #ifdef WOLFSSL_KEIL
  53894. "adcs r3, r3, r5\n\t"
  53895. #elif defined(__clang__)
  53896. "adcs r3, r5\n\t"
  53897. #else
  53898. "adc r3, r5\n\t"
  53899. #endif
  53900. #ifdef WOLFSSL_KEIL
  53901. "adcs r4, r4, r6\n\t"
  53902. #elif defined(__clang__)
  53903. "adcs r4, r6\n\t"
  53904. #else
  53905. "adc r4, r6\n\t"
  53906. #endif
  53907. "stm %[r]!, {r3, r4}\n\t"
  53908. "ldm %[b]!, {r5, r6}\n\t"
  53909. "ldm %[a]!, {r3, r4}\n\t"
  53910. #ifdef WOLFSSL_KEIL
  53911. "adcs r3, r3, r5\n\t"
  53912. #elif defined(__clang__)
  53913. "adcs r3, r5\n\t"
  53914. #else
  53915. "adc r3, r5\n\t"
  53916. #endif
  53917. #ifdef WOLFSSL_KEIL
  53918. "adcs r4, r4, r6\n\t"
  53919. #elif defined(__clang__)
  53920. "adcs r4, r6\n\t"
  53921. #else
  53922. "adc r4, r6\n\t"
  53923. #endif
  53924. "stm %[r]!, {r3, r4}\n\t"
  53925. "ldm %[b]!, {r5, r6}\n\t"
  53926. "ldm %[a]!, {r3, r4}\n\t"
  53927. #ifdef WOLFSSL_KEIL
  53928. "adcs r3, r3, r5\n\t"
  53929. #elif defined(__clang__)
  53930. "adcs r3, r5\n\t"
  53931. #else
  53932. "adc r3, r5\n\t"
  53933. #endif
  53934. #ifdef WOLFSSL_KEIL
  53935. "adcs r4, r4, r6\n\t"
  53936. #elif defined(__clang__)
  53937. "adcs r4, r6\n\t"
  53938. #else
  53939. "adc r4, r6\n\t"
  53940. #endif
  53941. "stm %[r]!, {r3, r4}\n\t"
  53942. "ldm %[b]!, {r5, r6}\n\t"
  53943. "ldm %[a]!, {r3, r4}\n\t"
  53944. #ifdef WOLFSSL_KEIL
  53945. "adcs r3, r3, r5\n\t"
  53946. #elif defined(__clang__)
  53947. "adcs r3, r5\n\t"
  53948. #else
  53949. "adc r3, r5\n\t"
  53950. #endif
  53951. #ifdef WOLFSSL_KEIL
  53952. "adcs r4, r4, r6\n\t"
  53953. #elif defined(__clang__)
  53954. "adcs r4, r6\n\t"
  53955. #else
  53956. "adc r4, r6\n\t"
  53957. #endif
  53958. "stm %[r]!, {r3, r4}\n\t"
  53959. "ldm %[b]!, {r5, r6}\n\t"
  53960. "ldm %[a]!, {r3, r4}\n\t"
  53961. #ifdef WOLFSSL_KEIL
  53962. "adcs r3, r3, r5\n\t"
  53963. #elif defined(__clang__)
  53964. "adcs r3, r5\n\t"
  53965. #else
  53966. "adc r3, r5\n\t"
  53967. #endif
  53968. #ifdef WOLFSSL_KEIL
  53969. "adcs r4, r4, r6\n\t"
  53970. #elif defined(__clang__)
  53971. "adcs r4, r6\n\t"
  53972. #else
  53973. "adc r4, r6\n\t"
  53974. #endif
  53975. "stm %[r]!, {r3, r4}\n\t"
  53976. "ldm %[b]!, {r5, r6}\n\t"
  53977. "ldm %[a]!, {r3, r4}\n\t"
  53978. #ifdef WOLFSSL_KEIL
  53979. "adcs r3, r3, r5\n\t"
  53980. #elif defined(__clang__)
  53981. "adcs r3, r5\n\t"
  53982. #else
  53983. "adc r3, r5\n\t"
  53984. #endif
  53985. #ifdef WOLFSSL_KEIL
  53986. "adcs r4, r4, r6\n\t"
  53987. #elif defined(__clang__)
  53988. "adcs r4, r6\n\t"
  53989. #else
  53990. "adc r4, r6\n\t"
  53991. #endif
  53992. "stm %[r]!, {r3, r4}\n\t"
  53993. "ldm %[b]!, {r5, r6}\n\t"
  53994. "ldm %[a]!, {r3, r4}\n\t"
  53995. #ifdef WOLFSSL_KEIL
  53996. "adcs r3, r3, r5\n\t"
  53997. #elif defined(__clang__)
  53998. "adcs r3, r5\n\t"
  53999. #else
  54000. "adc r3, r5\n\t"
  54001. #endif
  54002. #ifdef WOLFSSL_KEIL
  54003. "adcs r4, r4, r6\n\t"
  54004. #elif defined(__clang__)
  54005. "adcs r4, r6\n\t"
  54006. #else
  54007. "adc r4, r6\n\t"
  54008. #endif
  54009. "stm %[r]!, {r3, r4}\n\t"
  54010. "ldm %[b]!, {r5, r6}\n\t"
  54011. "ldm %[a]!, {r3, r4}\n\t"
  54012. #ifdef WOLFSSL_KEIL
  54013. "adcs r3, r3, r5\n\t"
  54014. #elif defined(__clang__)
  54015. "adcs r3, r5\n\t"
  54016. #else
  54017. "adc r3, r5\n\t"
  54018. #endif
  54019. #ifdef WOLFSSL_KEIL
  54020. "adcs r4, r4, r6\n\t"
  54021. #elif defined(__clang__)
  54022. "adcs r4, r6\n\t"
  54023. #else
  54024. "adc r4, r6\n\t"
  54025. #endif
  54026. "stm %[r]!, {r3, r4}\n\t"
  54027. "ldm %[b]!, {r5, r6}\n\t"
  54028. "ldm %[a]!, {r3, r4}\n\t"
  54029. #ifdef WOLFSSL_KEIL
  54030. "adcs r3, r3, r5\n\t"
  54031. #elif defined(__clang__)
  54032. "adcs r3, r5\n\t"
  54033. #else
  54034. "adc r3, r5\n\t"
  54035. #endif
  54036. #ifdef WOLFSSL_KEIL
  54037. "adcs r4, r4, r6\n\t"
  54038. #elif defined(__clang__)
  54039. "adcs r4, r6\n\t"
  54040. #else
  54041. "adc r4, r6\n\t"
  54042. #endif
  54043. "stm %[r]!, {r3, r4}\n\t"
  54044. "ldm %[b]!, {r5, r6}\n\t"
  54045. "ldm %[a]!, {r3, r4}\n\t"
  54046. #ifdef WOLFSSL_KEIL
  54047. "adcs r3, r3, r5\n\t"
  54048. #elif defined(__clang__)
  54049. "adcs r3, r5\n\t"
  54050. #else
  54051. "adc r3, r5\n\t"
  54052. #endif
  54053. #ifdef WOLFSSL_KEIL
  54054. "adcs r4, r4, r6\n\t"
  54055. #elif defined(__clang__)
  54056. "adcs r4, r6\n\t"
  54057. #else
  54058. "adc r4, r6\n\t"
  54059. #endif
  54060. "stm %[r]!, {r3, r4}\n\t"
  54061. "ldm %[b]!, {r5, r6}\n\t"
  54062. "ldm %[a]!, {r3, r4}\n\t"
  54063. #ifdef WOLFSSL_KEIL
  54064. "adcs r3, r3, r5\n\t"
  54065. #elif defined(__clang__)
  54066. "adcs r3, r5\n\t"
  54067. #else
  54068. "adc r3, r5\n\t"
  54069. #endif
  54070. #ifdef WOLFSSL_KEIL
  54071. "adcs r4, r4, r6\n\t"
  54072. #elif defined(__clang__)
  54073. "adcs r4, r6\n\t"
  54074. #else
  54075. "adc r4, r6\n\t"
  54076. #endif
  54077. "stm %[r]!, {r3, r4}\n\t"
  54078. "ldm %[b]!, {r5, r6}\n\t"
  54079. "ldm %[a]!, {r3, r4}\n\t"
  54080. #ifdef WOLFSSL_KEIL
  54081. "adcs r3, r3, r5\n\t"
  54082. #elif defined(__clang__)
  54083. "adcs r3, r5\n\t"
  54084. #else
  54085. "adc r3, r5\n\t"
  54086. #endif
  54087. #ifdef WOLFSSL_KEIL
  54088. "adcs r4, r4, r6\n\t"
  54089. #elif defined(__clang__)
  54090. "adcs r4, r6\n\t"
  54091. #else
  54092. "adc r4, r6\n\t"
  54093. #endif
  54094. "stm %[r]!, {r3, r4}\n\t"
  54095. "ldm %[b]!, {r5, r6}\n\t"
  54096. "ldm %[a]!, {r3, r4}\n\t"
  54097. #ifdef WOLFSSL_KEIL
  54098. "adcs r3, r3, r5\n\t"
  54099. #elif defined(__clang__)
  54100. "adcs r3, r5\n\t"
  54101. #else
  54102. "adc r3, r5\n\t"
  54103. #endif
  54104. #ifdef WOLFSSL_KEIL
  54105. "adcs r4, r4, r6\n\t"
  54106. #elif defined(__clang__)
  54107. "adcs r4, r6\n\t"
  54108. #else
  54109. "adc r4, r6\n\t"
  54110. #endif
  54111. "stm %[r]!, {r3, r4}\n\t"
  54112. "ldm %[b]!, {r5, r6}\n\t"
  54113. "ldm %[a]!, {r3, r4}\n\t"
  54114. #ifdef WOLFSSL_KEIL
  54115. "adcs r3, r3, r5\n\t"
  54116. #elif defined(__clang__)
  54117. "adcs r3, r5\n\t"
  54118. #else
  54119. "adc r3, r5\n\t"
  54120. #endif
  54121. #ifdef WOLFSSL_KEIL
  54122. "adcs r4, r4, r6\n\t"
  54123. #elif defined(__clang__)
  54124. "adcs r4, r6\n\t"
  54125. #else
  54126. "adc r4, r6\n\t"
  54127. #endif
  54128. "stm %[r]!, {r3, r4}\n\t"
  54129. "ldm %[b]!, {r5, r6}\n\t"
  54130. "ldm %[a]!, {r3, r4}\n\t"
  54131. #ifdef WOLFSSL_KEIL
  54132. "adcs r3, r3, r5\n\t"
  54133. #elif defined(__clang__)
  54134. "adcs r3, r5\n\t"
  54135. #else
  54136. "adc r3, r5\n\t"
  54137. #endif
  54138. #ifdef WOLFSSL_KEIL
  54139. "adcs r4, r4, r6\n\t"
  54140. #elif defined(__clang__)
  54141. "adcs r4, r6\n\t"
  54142. #else
  54143. "adc r4, r6\n\t"
  54144. #endif
  54145. "stm %[r]!, {r3, r4}\n\t"
  54146. "ldm %[b]!, {r5, r6}\n\t"
  54147. "ldm %[a]!, {r3, r4}\n\t"
  54148. #ifdef WOLFSSL_KEIL
  54149. "adcs r3, r3, r5\n\t"
  54150. #elif defined(__clang__)
  54151. "adcs r3, r5\n\t"
  54152. #else
  54153. "adc r3, r5\n\t"
  54154. #endif
  54155. #ifdef WOLFSSL_KEIL
  54156. "adcs r4, r4, r6\n\t"
  54157. #elif defined(__clang__)
  54158. "adcs r4, r6\n\t"
  54159. #else
  54160. "adc r4, r6\n\t"
  54161. #endif
  54162. "stm %[r]!, {r3, r4}\n\t"
  54163. "ldm %[b]!, {r5, r6}\n\t"
  54164. "ldm %[a]!, {r3, r4}\n\t"
  54165. #ifdef WOLFSSL_KEIL
  54166. "adcs r3, r3, r5\n\t"
  54167. #elif defined(__clang__)
  54168. "adcs r3, r5\n\t"
  54169. #else
  54170. "adc r3, r5\n\t"
  54171. #endif
  54172. #ifdef WOLFSSL_KEIL
  54173. "adcs r4, r4, r6\n\t"
  54174. #elif defined(__clang__)
  54175. "adcs r4, r6\n\t"
  54176. #else
  54177. "adc r4, r6\n\t"
  54178. #endif
  54179. "stm %[r]!, {r3, r4}\n\t"
  54180. "ldm %[b]!, {r5, r6}\n\t"
  54181. "ldm %[a]!, {r3, r4}\n\t"
  54182. #ifdef WOLFSSL_KEIL
  54183. "adcs r3, r3, r5\n\t"
  54184. #elif defined(__clang__)
  54185. "adcs r3, r5\n\t"
  54186. #else
  54187. "adc r3, r5\n\t"
  54188. #endif
  54189. #ifdef WOLFSSL_KEIL
  54190. "adcs r4, r4, r6\n\t"
  54191. #elif defined(__clang__)
  54192. "adcs r4, r6\n\t"
  54193. #else
  54194. "adc r4, r6\n\t"
  54195. #endif
  54196. "stm %[r]!, {r3, r4}\n\t"
  54197. "ldm %[b]!, {r5, r6}\n\t"
  54198. "ldm %[a]!, {r3, r4}\n\t"
  54199. #ifdef WOLFSSL_KEIL
  54200. "adcs r3, r3, r5\n\t"
  54201. #elif defined(__clang__)
  54202. "adcs r3, r5\n\t"
  54203. #else
  54204. "adc r3, r5\n\t"
  54205. #endif
  54206. #ifdef WOLFSSL_KEIL
  54207. "adcs r4, r4, r6\n\t"
  54208. #elif defined(__clang__)
  54209. "adcs r4, r6\n\t"
  54210. #else
  54211. "adc r4, r6\n\t"
  54212. #endif
  54213. "stm %[r]!, {r3, r4}\n\t"
  54214. "ldm %[b]!, {r5, r6}\n\t"
  54215. "ldm %[a]!, {r3, r4}\n\t"
  54216. #ifdef WOLFSSL_KEIL
  54217. "adcs r3, r3, r5\n\t"
  54218. #elif defined(__clang__)
  54219. "adcs r3, r5\n\t"
  54220. #else
  54221. "adc r3, r5\n\t"
  54222. #endif
  54223. #ifdef WOLFSSL_KEIL
  54224. "adcs r4, r4, r6\n\t"
  54225. #elif defined(__clang__)
  54226. "adcs r4, r6\n\t"
  54227. #else
  54228. "adc r4, r6\n\t"
  54229. #endif
  54230. "stm %[r]!, {r3, r4}\n\t"
  54231. "ldm %[b]!, {r5, r6}\n\t"
  54232. "ldm %[a]!, {r3, r4}\n\t"
  54233. #ifdef WOLFSSL_KEIL
  54234. "adcs r3, r3, r5\n\t"
  54235. #elif defined(__clang__)
  54236. "adcs r3, r5\n\t"
  54237. #else
  54238. "adc r3, r5\n\t"
  54239. #endif
  54240. #ifdef WOLFSSL_KEIL
  54241. "adcs r4, r4, r6\n\t"
  54242. #elif defined(__clang__)
  54243. "adcs r4, r6\n\t"
  54244. #else
  54245. "adc r4, r6\n\t"
  54246. #endif
  54247. "stm %[r]!, {r3, r4}\n\t"
  54248. "ldm %[b]!, {r5, r6}\n\t"
  54249. "ldm %[a]!, {r3, r4}\n\t"
  54250. #ifdef WOLFSSL_KEIL
  54251. "adcs r3, r3, r5\n\t"
  54252. #elif defined(__clang__)
  54253. "adcs r3, r5\n\t"
  54254. #else
  54255. "adc r3, r5\n\t"
  54256. #endif
  54257. #ifdef WOLFSSL_KEIL
  54258. "adcs r4, r4, r6\n\t"
  54259. #elif defined(__clang__)
  54260. "adcs r4, r6\n\t"
  54261. #else
  54262. "adc r4, r6\n\t"
  54263. #endif
  54264. "stm %[r]!, {r3, r4}\n\t"
  54265. "ldm %[b]!, {r5, r6}\n\t"
  54266. "ldm %[a]!, {r3, r4}\n\t"
  54267. #ifdef WOLFSSL_KEIL
  54268. "adcs r3, r3, r5\n\t"
  54269. #elif defined(__clang__)
  54270. "adcs r3, r5\n\t"
  54271. #else
  54272. "adc r3, r5\n\t"
  54273. #endif
  54274. #ifdef WOLFSSL_KEIL
  54275. "adcs r4, r4, r6\n\t"
  54276. #elif defined(__clang__)
  54277. "adcs r4, r6\n\t"
  54278. #else
  54279. "adc r4, r6\n\t"
  54280. #endif
  54281. "stm %[r]!, {r3, r4}\n\t"
  54282. "ldm %[b]!, {r5, r6}\n\t"
  54283. "ldm %[a]!, {r3, r4}\n\t"
  54284. #ifdef WOLFSSL_KEIL
  54285. "adcs r3, r3, r5\n\t"
  54286. #elif defined(__clang__)
  54287. "adcs r3, r5\n\t"
  54288. #else
  54289. "adc r3, r5\n\t"
  54290. #endif
  54291. #ifdef WOLFSSL_KEIL
  54292. "adcs r4, r4, r6\n\t"
  54293. #elif defined(__clang__)
  54294. "adcs r4, r6\n\t"
  54295. #else
  54296. "adc r4, r6\n\t"
  54297. #endif
  54298. "stm %[r]!, {r3, r4}\n\t"
  54299. "ldm %[b]!, {r5, r6}\n\t"
  54300. "ldm %[a]!, {r3, r4}\n\t"
  54301. #ifdef WOLFSSL_KEIL
  54302. "adcs r3, r3, r5\n\t"
  54303. #elif defined(__clang__)
  54304. "adcs r3, r5\n\t"
  54305. #else
  54306. "adc r3, r5\n\t"
  54307. #endif
  54308. #ifdef WOLFSSL_KEIL
  54309. "adcs r4, r4, r6\n\t"
  54310. #elif defined(__clang__)
  54311. "adcs r4, r6\n\t"
  54312. #else
  54313. "adc r4, r6\n\t"
  54314. #endif
  54315. "stm %[r]!, {r3, r4}\n\t"
  54316. "ldm %[b]!, {r5, r6}\n\t"
  54317. "ldm %[a]!, {r3, r4}\n\t"
  54318. #ifdef WOLFSSL_KEIL
  54319. "adcs r3, r3, r5\n\t"
  54320. #elif defined(__clang__)
  54321. "adcs r3, r5\n\t"
  54322. #else
  54323. "adc r3, r5\n\t"
  54324. #endif
  54325. #ifdef WOLFSSL_KEIL
  54326. "adcs r4, r4, r6\n\t"
  54327. #elif defined(__clang__)
  54328. "adcs r4, r6\n\t"
  54329. #else
  54330. "adc r4, r6\n\t"
  54331. #endif
  54332. "stm %[r]!, {r3, r4}\n\t"
  54333. "ldm %[b]!, {r5, r6}\n\t"
  54334. "ldm %[a]!, {r3, r4}\n\t"
  54335. #ifdef WOLFSSL_KEIL
  54336. "adcs r3, r3, r5\n\t"
  54337. #elif defined(__clang__)
  54338. "adcs r3, r5\n\t"
  54339. #else
  54340. "adc r3, r5\n\t"
  54341. #endif
  54342. #ifdef WOLFSSL_KEIL
  54343. "adcs r4, r4, r6\n\t"
  54344. #elif defined(__clang__)
  54345. "adcs r4, r6\n\t"
  54346. #else
  54347. "adc r4, r6\n\t"
  54348. #endif
  54349. "stm %[r]!, {r3, r4}\n\t"
  54350. "ldm %[b]!, {r5, r6}\n\t"
  54351. "ldm %[a]!, {r3, r4}\n\t"
  54352. #ifdef WOLFSSL_KEIL
  54353. "adcs r3, r3, r5\n\t"
  54354. #elif defined(__clang__)
  54355. "adcs r3, r5\n\t"
  54356. #else
  54357. "adc r3, r5\n\t"
  54358. #endif
  54359. #ifdef WOLFSSL_KEIL
  54360. "adcs r4, r4, r6\n\t"
  54361. #elif defined(__clang__)
  54362. "adcs r4, r6\n\t"
  54363. #else
  54364. "adc r4, r6\n\t"
  54365. #endif
  54366. "stm %[r]!, {r3, r4}\n\t"
  54367. "ldm %[b]!, {r5, r6}\n\t"
  54368. "ldm %[a]!, {r3, r4}\n\t"
  54369. #ifdef WOLFSSL_KEIL
  54370. "adcs r3, r3, r5\n\t"
  54371. #elif defined(__clang__)
  54372. "adcs r3, r5\n\t"
  54373. #else
  54374. "adc r3, r5\n\t"
  54375. #endif
  54376. #ifdef WOLFSSL_KEIL
  54377. "adcs r4, r4, r6\n\t"
  54378. #elif defined(__clang__)
  54379. "adcs r4, r6\n\t"
  54380. #else
  54381. "adc r4, r6\n\t"
  54382. #endif
  54383. "stm %[r]!, {r3, r4}\n\t"
  54384. "ldm %[b]!, {r5, r6}\n\t"
  54385. "ldm %[a]!, {r3, r4}\n\t"
  54386. #ifdef WOLFSSL_KEIL
  54387. "adcs r3, r3, r5\n\t"
  54388. #elif defined(__clang__)
  54389. "adcs r3, r5\n\t"
  54390. #else
  54391. "adc r3, r5\n\t"
  54392. #endif
  54393. #ifdef WOLFSSL_KEIL
  54394. "adcs r4, r4, r6\n\t"
  54395. #elif defined(__clang__)
  54396. "adcs r4, r6\n\t"
  54397. #else
  54398. "adc r4, r6\n\t"
  54399. #endif
  54400. "stm %[r]!, {r3, r4}\n\t"
  54401. "ldm %[b]!, {r5, r6}\n\t"
  54402. "ldm %[a]!, {r3, r4}\n\t"
  54403. #ifdef WOLFSSL_KEIL
  54404. "adcs r3, r3, r5\n\t"
  54405. #elif defined(__clang__)
  54406. "adcs r3, r5\n\t"
  54407. #else
  54408. "adc r3, r5\n\t"
  54409. #endif
  54410. #ifdef WOLFSSL_KEIL
  54411. "adcs r4, r4, r6\n\t"
  54412. #elif defined(__clang__)
  54413. "adcs r4, r6\n\t"
  54414. #else
  54415. "adc r4, r6\n\t"
  54416. #endif
  54417. "stm %[r]!, {r3, r4}\n\t"
  54418. "ldm %[b]!, {r5, r6}\n\t"
  54419. "ldm %[a]!, {r3, r4}\n\t"
  54420. #ifdef WOLFSSL_KEIL
  54421. "adcs r3, r3, r5\n\t"
  54422. #elif defined(__clang__)
  54423. "adcs r3, r5\n\t"
  54424. #else
  54425. "adc r3, r5\n\t"
  54426. #endif
  54427. #ifdef WOLFSSL_KEIL
  54428. "adcs r4, r4, r6\n\t"
  54429. #elif defined(__clang__)
  54430. "adcs r4, r6\n\t"
  54431. #else
  54432. "adc r4, r6\n\t"
  54433. #endif
  54434. "stm %[r]!, {r3, r4}\n\t"
  54435. "ldm %[b]!, {r5, r6}\n\t"
  54436. "ldm %[a]!, {r3, r4}\n\t"
  54437. #ifdef WOLFSSL_KEIL
  54438. "adcs r3, r3, r5\n\t"
  54439. #elif defined(__clang__)
  54440. "adcs r3, r5\n\t"
  54441. #else
  54442. "adc r3, r5\n\t"
  54443. #endif
  54444. #ifdef WOLFSSL_KEIL
  54445. "adcs r4, r4, r6\n\t"
  54446. #elif defined(__clang__)
  54447. "adcs r4, r6\n\t"
  54448. #else
  54449. "adc r4, r6\n\t"
  54450. #endif
  54451. "stm %[r]!, {r3, r4}\n\t"
  54452. "ldm %[b]!, {r5, r6}\n\t"
  54453. "ldm %[a]!, {r3, r4}\n\t"
  54454. #ifdef WOLFSSL_KEIL
  54455. "adcs r3, r3, r5\n\t"
  54456. #elif defined(__clang__)
  54457. "adcs r3, r5\n\t"
  54458. #else
  54459. "adc r3, r5\n\t"
  54460. #endif
  54461. #ifdef WOLFSSL_KEIL
  54462. "adcs r4, r4, r6\n\t"
  54463. #elif defined(__clang__)
  54464. "adcs r4, r6\n\t"
  54465. #else
  54466. "adc r4, r6\n\t"
  54467. #endif
  54468. "stm %[r]!, {r3, r4}\n\t"
  54469. "ldm %[b]!, {r5, r6}\n\t"
  54470. "ldm %[a]!, {r3, r4}\n\t"
  54471. #ifdef WOLFSSL_KEIL
  54472. "adcs r3, r3, r5\n\t"
  54473. #elif defined(__clang__)
  54474. "adcs r3, r5\n\t"
  54475. #else
  54476. "adc r3, r5\n\t"
  54477. #endif
  54478. #ifdef WOLFSSL_KEIL
  54479. "adcs r4, r4, r6\n\t"
  54480. #elif defined(__clang__)
  54481. "adcs r4, r6\n\t"
  54482. #else
  54483. "adc r4, r6\n\t"
  54484. #endif
  54485. "stm %[r]!, {r3, r4}\n\t"
  54486. "ldm %[b]!, {r5, r6}\n\t"
  54487. "ldm %[a]!, {r3, r4}\n\t"
  54488. #ifdef WOLFSSL_KEIL
  54489. "adcs r3, r3, r5\n\t"
  54490. #elif defined(__clang__)
  54491. "adcs r3, r5\n\t"
  54492. #else
  54493. "adc r3, r5\n\t"
  54494. #endif
  54495. #ifdef WOLFSSL_KEIL
  54496. "adcs r4, r4, r6\n\t"
  54497. #elif defined(__clang__)
  54498. "adcs r4, r6\n\t"
  54499. #else
  54500. "adc r4, r6\n\t"
  54501. #endif
  54502. "stm %[r]!, {r3, r4}\n\t"
  54503. "ldm %[b]!, {r5, r6}\n\t"
  54504. "ldm %[a]!, {r3, r4}\n\t"
  54505. #ifdef WOLFSSL_KEIL
  54506. "adcs r3, r3, r5\n\t"
  54507. #elif defined(__clang__)
  54508. "adcs r3, r5\n\t"
  54509. #else
  54510. "adc r3, r5\n\t"
  54511. #endif
  54512. #ifdef WOLFSSL_KEIL
  54513. "adcs r4, r4, r6\n\t"
  54514. #elif defined(__clang__)
  54515. "adcs r4, r6\n\t"
  54516. #else
  54517. "adc r4, r6\n\t"
  54518. #endif
  54519. "stm %[r]!, {r3, r4}\n\t"
  54520. "ldm %[b]!, {r5, r6}\n\t"
  54521. "ldm %[a]!, {r3, r4}\n\t"
  54522. #ifdef WOLFSSL_KEIL
  54523. "adcs r3, r3, r5\n\t"
  54524. #elif defined(__clang__)
  54525. "adcs r3, r5\n\t"
  54526. #else
  54527. "adc r3, r5\n\t"
  54528. #endif
  54529. #ifdef WOLFSSL_KEIL
  54530. "adcs r4, r4, r6\n\t"
  54531. #elif defined(__clang__)
  54532. "adcs r4, r6\n\t"
  54533. #else
  54534. "adc r4, r6\n\t"
  54535. #endif
  54536. "stm %[r]!, {r3, r4}\n\t"
  54537. "ldm %[b]!, {r5, r6}\n\t"
  54538. "ldm %[a]!, {r3, r4}\n\t"
  54539. #ifdef WOLFSSL_KEIL
  54540. "adcs r3, r3, r5\n\t"
  54541. #elif defined(__clang__)
  54542. "adcs r3, r5\n\t"
  54543. #else
  54544. "adc r3, r5\n\t"
  54545. #endif
  54546. #ifdef WOLFSSL_KEIL
  54547. "adcs r4, r4, r6\n\t"
  54548. #elif defined(__clang__)
  54549. "adcs r4, r6\n\t"
  54550. #else
  54551. "adc r4, r6\n\t"
  54552. #endif
  54553. "stm %[r]!, {r3, r4}\n\t"
  54554. "ldm %[b]!, {r5, r6}\n\t"
  54555. "ldm %[a]!, {r3, r4}\n\t"
  54556. #ifdef WOLFSSL_KEIL
  54557. "adcs r3, r3, r5\n\t"
  54558. #elif defined(__clang__)
  54559. "adcs r3, r5\n\t"
  54560. #else
  54561. "adc r3, r5\n\t"
  54562. #endif
  54563. #ifdef WOLFSSL_KEIL
  54564. "adcs r4, r4, r6\n\t"
  54565. #elif defined(__clang__)
  54566. "adcs r4, r6\n\t"
  54567. #else
  54568. "adc r4, r6\n\t"
  54569. #endif
  54570. "stm %[r]!, {r3, r4}\n\t"
  54571. "movs %[r], #0\n\t"
  54572. #ifdef WOLFSSL_KEIL
  54573. "adcs %[r], %[r], %[r]\n\t"
  54574. #elif defined(__clang__)
  54575. "adcs %[r], %[r]\n\t"
  54576. #else
  54577. "adc %[r], %[r]\n\t"
  54578. #endif
  54579. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  54580. :
  54581. : "memory", "r3", "r4", "r5", "r6"
  54582. );
  54583. return (uint32_t)(size_t)r;
  54584. }
  54585. /* AND m into each word of a and store in r.
  54586. *
  54587. * r A single precision integer.
  54588. * a A single precision integer.
  54589. * m Mask to AND against each digit.
  54590. */
  54591. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  54592. {
  54593. #ifdef WOLFSSL_SP_SMALL
  54594. int i;
  54595. for (i=0; i<48; i++) {
  54596. r[i] = a[i] & m;
  54597. }
  54598. #else
  54599. int i;
  54600. for (i = 0; i < 48; i += 8) {
  54601. r[i+0] = a[i+0] & m;
  54602. r[i+1] = a[i+1] & m;
  54603. r[i+2] = a[i+2] & m;
  54604. r[i+3] = a[i+3] & m;
  54605. r[i+4] = a[i+4] & m;
  54606. r[i+5] = a[i+5] & m;
  54607. r[i+6] = a[i+6] & m;
  54608. r[i+7] = a[i+7] & m;
  54609. }
  54610. #endif
  54611. }
  54612. /* Multiply a and b into r. (r = a * b)
  54613. *
  54614. * r A single precision integer.
  54615. * a A single precision integer.
  54616. * b A single precision integer.
  54617. */
  54618. SP_NOINLINE static void sp_3072_mul_96(sp_digit* r, const sp_digit* a,
  54619. const sp_digit* b)
  54620. {
  54621. sp_digit* z0 = r;
  54622. sp_digit z1[96];
  54623. sp_digit a1[48];
  54624. sp_digit b1[48];
  54625. sp_digit* z2 = r + 96;
  54626. sp_digit u;
  54627. sp_digit ca;
  54628. sp_digit cb;
  54629. ca = sp_3072_add_48(a1, a, &a[48]);
  54630. cb = sp_3072_add_48(b1, b, &b[48]);
  54631. u = ca & cb;
  54632. sp_3072_mul_48(z2, &a[48], &b[48]);
  54633. sp_3072_mul_48(z0, a, b);
  54634. sp_3072_mul_48(z1, a1, b1);
  54635. u += sp_3072_sub_in_place_96(z1, z0);
  54636. u += sp_3072_sub_in_place_96(z1, z2);
  54637. sp_3072_mask_48(a1, a1, 0 - cb);
  54638. u += sp_3072_add_48(z1 + 48, z1 + 48, a1);
  54639. sp_3072_mask_48(b1, b1, 0 - ca);
  54640. u += sp_3072_add_48(z1 + 48, z1 + 48, b1);
  54641. u += sp_3072_add_96(r + 48, r + 48, z1);
  54642. (void)sp_3072_add_word_48(r + 144, r + 144, u);
  54643. }
  54644. #ifndef WOLFSSL_SP_LARGE_CODE
  54645. /* Square a and put result in r. (r = a * a)
  54646. *
  54647. * r A single precision integer.
  54648. * a A single precision integer.
  54649. */
  54650. SP_NOINLINE static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a)
  54651. {
  54652. __asm__ __volatile__ (
  54653. "movs r3, #0\n\t"
  54654. "movs r4, #0\n\t"
  54655. "movs r5, #0\n\t"
  54656. "mov r8, r3\n\t"
  54657. "mov r11, %[r]\n\t"
  54658. "movs r6, #0x60\n\t"
  54659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54660. "negs r6, r6\n\t"
  54661. #else
  54662. "neg r6, r6\n\t"
  54663. #endif
  54664. "add sp, sp, r6\n\t"
  54665. "mov r10, sp\n\t"
  54666. "mov r9, %[a]\n\t"
  54667. "\n"
  54668. "L_sp_3072_sqr_12_words_%=:\n\t"
  54669. "movs %[r], #0\n\t"
  54670. "movs r6, #44\n\t"
  54671. "mov %[a], r8\n\t"
  54672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54673. "subs %[a], %[a], r6\n\t"
  54674. #else
  54675. "sub %[a], %[a], r6\n\t"
  54676. #endif
  54677. #ifdef WOLFSSL_KEIL
  54678. "sbcs r6, r6, r6\n\t"
  54679. #elif defined(__clang__)
  54680. "sbcs r6, r6\n\t"
  54681. #else
  54682. "sbc r6, r6\n\t"
  54683. #endif
  54684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54685. "mvns r6, r6\n\t"
  54686. #else
  54687. "mvn r6, r6\n\t"
  54688. #endif
  54689. #ifdef WOLFSSL_KEIL
  54690. "ands %[a], %[a], r6\n\t"
  54691. #elif defined(__clang__)
  54692. "ands %[a], r6\n\t"
  54693. #else
  54694. "and %[a], r6\n\t"
  54695. #endif
  54696. "mov r2, r8\n\t"
  54697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54698. "subs r2, r2, %[a]\n\t"
  54699. #else
  54700. "sub r2, r2, %[a]\n\t"
  54701. #endif
  54702. "add %[a], %[a], r9\n\t"
  54703. "add r2, r2, r9\n\t"
  54704. "\n"
  54705. "L_sp_3072_sqr_12_mul_%=:\n\t"
  54706. "cmp r2, %[a]\n\t"
  54707. "beq L_sp_3072_sqr_12_sqr_%=\n\t"
  54708. "# Multiply * 2: Start\n\t"
  54709. "ldrh r6, [%[a]]\n\t"
  54710. "ldrh r7, [r2]\n\t"
  54711. #ifdef WOLFSSL_KEIL
  54712. "muls r7, r6, r7\n\t"
  54713. #elif defined(__clang__)
  54714. "muls r7, r6\n\t"
  54715. #else
  54716. "mul r7, r6\n\t"
  54717. #endif
  54718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54719. "adds r3, r3, r7\n\t"
  54720. #else
  54721. "add r3, r3, r7\n\t"
  54722. #endif
  54723. #ifdef WOLFSSL_KEIL
  54724. "adcs r4, r4, %[r]\n\t"
  54725. #elif defined(__clang__)
  54726. "adcs r4, %[r]\n\t"
  54727. #else
  54728. "adc r4, %[r]\n\t"
  54729. #endif
  54730. #ifdef WOLFSSL_KEIL
  54731. "adcs r5, r5, %[r]\n\t"
  54732. #elif defined(__clang__)
  54733. "adcs r5, %[r]\n\t"
  54734. #else
  54735. "adc r5, %[r]\n\t"
  54736. #endif
  54737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54738. "adds r3, r3, r7\n\t"
  54739. #else
  54740. "add r3, r3, r7\n\t"
  54741. #endif
  54742. #ifdef WOLFSSL_KEIL
  54743. "adcs r4, r4, %[r]\n\t"
  54744. #elif defined(__clang__)
  54745. "adcs r4, %[r]\n\t"
  54746. #else
  54747. "adc r4, %[r]\n\t"
  54748. #endif
  54749. #ifdef WOLFSSL_KEIL
  54750. "adcs r5, r5, %[r]\n\t"
  54751. #elif defined(__clang__)
  54752. "adcs r5, %[r]\n\t"
  54753. #else
  54754. "adc r5, %[r]\n\t"
  54755. #endif
  54756. "ldr r7, [r2]\n\t"
  54757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54758. "lsrs r7, r7, #16\n\t"
  54759. #else
  54760. "lsr r7, r7, #16\n\t"
  54761. #endif
  54762. #ifdef WOLFSSL_KEIL
  54763. "muls r6, r7, r6\n\t"
  54764. #elif defined(__clang__)
  54765. "muls r6, r7\n\t"
  54766. #else
  54767. "mul r6, r7\n\t"
  54768. #endif
  54769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54770. "lsrs r7, r6, #16\n\t"
  54771. #else
  54772. "lsr r7, r6, #16\n\t"
  54773. #endif
  54774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54775. "lsls r6, r6, #16\n\t"
  54776. #else
  54777. "lsl r6, r6, #16\n\t"
  54778. #endif
  54779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54780. "adds r3, r3, r6\n\t"
  54781. #else
  54782. "add r3, r3, r6\n\t"
  54783. #endif
  54784. #ifdef WOLFSSL_KEIL
  54785. "adcs r4, r4, r7\n\t"
  54786. #elif defined(__clang__)
  54787. "adcs r4, r7\n\t"
  54788. #else
  54789. "adc r4, r7\n\t"
  54790. #endif
  54791. #ifdef WOLFSSL_KEIL
  54792. "adcs r5, r5, %[r]\n\t"
  54793. #elif defined(__clang__)
  54794. "adcs r5, %[r]\n\t"
  54795. #else
  54796. "adc r5, %[r]\n\t"
  54797. #endif
  54798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54799. "adds r3, r3, r6\n\t"
  54800. #else
  54801. "add r3, r3, r6\n\t"
  54802. #endif
  54803. #ifdef WOLFSSL_KEIL
  54804. "adcs r4, r4, r7\n\t"
  54805. #elif defined(__clang__)
  54806. "adcs r4, r7\n\t"
  54807. #else
  54808. "adc r4, r7\n\t"
  54809. #endif
  54810. #ifdef WOLFSSL_KEIL
  54811. "adcs r5, r5, %[r]\n\t"
  54812. #elif defined(__clang__)
  54813. "adcs r5, %[r]\n\t"
  54814. #else
  54815. "adc r5, %[r]\n\t"
  54816. #endif
  54817. "ldr r6, [%[a]]\n\t"
  54818. "ldr r7, [r2]\n\t"
  54819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54820. "lsrs r6, r6, #16\n\t"
  54821. #else
  54822. "lsr r6, r6, #16\n\t"
  54823. #endif
  54824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54825. "lsrs r7, r7, #16\n\t"
  54826. #else
  54827. "lsr r7, r7, #16\n\t"
  54828. #endif
  54829. #ifdef WOLFSSL_KEIL
  54830. "muls r7, r6, r7\n\t"
  54831. #elif defined(__clang__)
  54832. "muls r7, r6\n\t"
  54833. #else
  54834. "mul r7, r6\n\t"
  54835. #endif
  54836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54837. "adds r4, r4, r7\n\t"
  54838. #else
  54839. "add r4, r4, r7\n\t"
  54840. #endif
  54841. #ifdef WOLFSSL_KEIL
  54842. "adcs r5, r5, %[r]\n\t"
  54843. #elif defined(__clang__)
  54844. "adcs r5, %[r]\n\t"
  54845. #else
  54846. "adc r5, %[r]\n\t"
  54847. #endif
  54848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54849. "adds r4, r4, r7\n\t"
  54850. #else
  54851. "add r4, r4, r7\n\t"
  54852. #endif
  54853. #ifdef WOLFSSL_KEIL
  54854. "adcs r5, r5, %[r]\n\t"
  54855. #elif defined(__clang__)
  54856. "adcs r5, %[r]\n\t"
  54857. #else
  54858. "adc r5, %[r]\n\t"
  54859. #endif
  54860. "ldrh r7, [r2]\n\t"
  54861. #ifdef WOLFSSL_KEIL
  54862. "muls r6, r7, r6\n\t"
  54863. #elif defined(__clang__)
  54864. "muls r6, r7\n\t"
  54865. #else
  54866. "mul r6, r7\n\t"
  54867. #endif
  54868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54869. "lsrs r7, r6, #16\n\t"
  54870. #else
  54871. "lsr r7, r6, #16\n\t"
  54872. #endif
  54873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54874. "lsls r6, r6, #16\n\t"
  54875. #else
  54876. "lsl r6, r6, #16\n\t"
  54877. #endif
  54878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54879. "adds r3, r3, r6\n\t"
  54880. #else
  54881. "add r3, r3, r6\n\t"
  54882. #endif
  54883. #ifdef WOLFSSL_KEIL
  54884. "adcs r4, r4, r7\n\t"
  54885. #elif defined(__clang__)
  54886. "adcs r4, r7\n\t"
  54887. #else
  54888. "adc r4, r7\n\t"
  54889. #endif
  54890. #ifdef WOLFSSL_KEIL
  54891. "adcs r5, r5, %[r]\n\t"
  54892. #elif defined(__clang__)
  54893. "adcs r5, %[r]\n\t"
  54894. #else
  54895. "adc r5, %[r]\n\t"
  54896. #endif
  54897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54898. "adds r3, r3, r6\n\t"
  54899. #else
  54900. "add r3, r3, r6\n\t"
  54901. #endif
  54902. #ifdef WOLFSSL_KEIL
  54903. "adcs r4, r4, r7\n\t"
  54904. #elif defined(__clang__)
  54905. "adcs r4, r7\n\t"
  54906. #else
  54907. "adc r4, r7\n\t"
  54908. #endif
  54909. #ifdef WOLFSSL_KEIL
  54910. "adcs r5, r5, %[r]\n\t"
  54911. #elif defined(__clang__)
  54912. "adcs r5, %[r]\n\t"
  54913. #else
  54914. "adc r5, %[r]\n\t"
  54915. #endif
  54916. "# Multiply * 2: Done\n\t"
  54917. "bal L_sp_3072_sqr_12_done_sqr_%=\n\t"
  54918. "\n"
  54919. "L_sp_3072_sqr_12_sqr_%=:\n\t"
  54920. "mov r12, r2\n\t"
  54921. "ldr r2, [%[a]]\n\t"
  54922. "# Square: Start\n\t"
  54923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54924. "lsrs r7, r2, #16\n\t"
  54925. #else
  54926. "lsr r7, r2, #16\n\t"
  54927. #endif
  54928. "uxth r6, r2\n\t"
  54929. #ifdef WOLFSSL_KEIL
  54930. "muls r6, r6, r6\n\t"
  54931. #elif defined(__clang__)
  54932. "muls r6, r6\n\t"
  54933. #else
  54934. "mul r6, r6\n\t"
  54935. #endif
  54936. #ifdef WOLFSSL_KEIL
  54937. "muls r7, r7, r7\n\t"
  54938. #elif defined(__clang__)
  54939. "muls r7, r7\n\t"
  54940. #else
  54941. "mul r7, r7\n\t"
  54942. #endif
  54943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54944. "adds r3, r3, r6\n\t"
  54945. #else
  54946. "add r3, r3, r6\n\t"
  54947. #endif
  54948. #ifdef WOLFSSL_KEIL
  54949. "adcs r4, r4, r7\n\t"
  54950. #elif defined(__clang__)
  54951. "adcs r4, r7\n\t"
  54952. #else
  54953. "adc r4, r7\n\t"
  54954. #endif
  54955. #ifdef WOLFSSL_KEIL
  54956. "adcs r5, r5, %[r]\n\t"
  54957. #elif defined(__clang__)
  54958. "adcs r5, %[r]\n\t"
  54959. #else
  54960. "adc r5, %[r]\n\t"
  54961. #endif
  54962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54963. "lsrs r7, r2, #16\n\t"
  54964. #else
  54965. "lsr r7, r2, #16\n\t"
  54966. #endif
  54967. "uxth r6, r2\n\t"
  54968. #ifdef WOLFSSL_KEIL
  54969. "muls r6, r7, r6\n\t"
  54970. #elif defined(__clang__)
  54971. "muls r6, r7\n\t"
  54972. #else
  54973. "mul r6, r7\n\t"
  54974. #endif
  54975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54976. "lsrs r7, r6, #15\n\t"
  54977. #else
  54978. "lsr r7, r6, #15\n\t"
  54979. #endif
  54980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54981. "lsls r6, r6, #17\n\t"
  54982. #else
  54983. "lsl r6, r6, #17\n\t"
  54984. #endif
  54985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  54986. "adds r3, r3, r6\n\t"
  54987. #else
  54988. "add r3, r3, r6\n\t"
  54989. #endif
  54990. #ifdef WOLFSSL_KEIL
  54991. "adcs r4, r4, r7\n\t"
  54992. #elif defined(__clang__)
  54993. "adcs r4, r7\n\t"
  54994. #else
  54995. "adc r4, r7\n\t"
  54996. #endif
  54997. #ifdef WOLFSSL_KEIL
  54998. "adcs r5, r5, %[r]\n\t"
  54999. #elif defined(__clang__)
  55000. "adcs r5, %[r]\n\t"
  55001. #else
  55002. "adc r5, %[r]\n\t"
  55003. #endif
  55004. "# Square: Done\n\t"
  55005. "mov r2, r12\n\t"
  55006. "\n"
  55007. "L_sp_3072_sqr_12_done_sqr_%=:\n\t"
  55008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55009. "adds %[a], %[a], #4\n\t"
  55010. #else
  55011. "add %[a], %[a], #4\n\t"
  55012. #endif
  55013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55014. "subs r2, r2, #4\n\t"
  55015. #else
  55016. "sub r2, r2, #4\n\t"
  55017. #endif
  55018. "movs r6, #48\n\t"
  55019. "add r6, r6, r9\n\t"
  55020. "cmp %[a], r6\n\t"
  55021. "beq L_sp_3072_sqr_12_done_mul_%=\n\t"
  55022. "cmp %[a], r2\n\t"
  55023. "bgt L_sp_3072_sqr_12_done_mul_%=\n\t"
  55024. "mov r7, r8\n\t"
  55025. "add r7, r7, r9\n\t"
  55026. "cmp %[a], r7\n\t"
  55027. "ble L_sp_3072_sqr_12_mul_%=\n\t"
  55028. "\n"
  55029. "L_sp_3072_sqr_12_done_mul_%=:\n\t"
  55030. "mov %[r], r10\n\t"
  55031. "mov r7, r8\n\t"
  55032. "str r3, [%[r], r7]\n\t"
  55033. "movs r3, r4\n\t"
  55034. "movs r4, r5\n\t"
  55035. "movs r5, #0\n\t"
  55036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55037. "adds r7, r7, #4\n\t"
  55038. #else
  55039. "add r7, r7, #4\n\t"
  55040. #endif
  55041. "mov r8, r7\n\t"
  55042. "movs r6, #0x58\n\t"
  55043. "cmp r7, r6\n\t"
  55044. "ble L_sp_3072_sqr_12_words_%=\n\t"
  55045. "mov %[a], r9\n\t"
  55046. "str r3, [%[r], r7]\n\t"
  55047. "mov %[r], r11\n\t"
  55048. "mov %[a], r10\n\t"
  55049. "movs r3, #0x5c\n\t"
  55050. "\n"
  55051. "L_sp_3072_sqr_12_store_%=:\n\t"
  55052. "ldr r6, [%[a], r3]\n\t"
  55053. "str r6, [%[r], r3]\n\t"
  55054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55055. "subs r3, r3, #4\n\t"
  55056. #else
  55057. "sub r3, r3, #4\n\t"
  55058. #endif
  55059. "bge L_sp_3072_sqr_12_store_%=\n\t"
  55060. "movs r6, #0x60\n\t"
  55061. "add sp, sp, r6\n\t"
  55062. : [r] "+l" (r), [a] "+l" (a)
  55063. :
  55064. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  55065. );
  55066. }
  55067. #else
  55068. /* Square a and put result in r. (r = a * a)
  55069. *
  55070. * r A single precision integer.
  55071. * a A single precision integer.
  55072. */
  55073. SP_NOINLINE static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a)
  55074. {
  55075. __asm__ __volatile__ (
  55076. "sub sp, sp, #48\n\t"
  55077. "mov r8, %[r]\n\t"
  55078. "mov r9, %[a]\n\t"
  55079. "movs %[r], #0\n\t"
  55080. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  55081. "mov r10, r2\n\t"
  55082. "mov r11, r3\n\t"
  55083. "mov r12, r4\n\t"
  55084. "mov lr, r5\n\t"
  55085. "mov %[a], r9\n\t"
  55086. "# A[0] * A[0]\n\t"
  55087. "movs r4, #0\n\t"
  55088. "mov r7, r10\n\t"
  55089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55090. "lsrs r6, r7, #16\n\t"
  55091. #else
  55092. "lsr r6, r7, #16\n\t"
  55093. #endif
  55094. "uxth r5, r7\n\t"
  55095. "movs r2, r5\n\t"
  55096. "movs r3, r6\n\t"
  55097. #ifdef WOLFSSL_KEIL
  55098. "muls r2, r2, r2\n\t"
  55099. #elif defined(__clang__)
  55100. "muls r2, r2\n\t"
  55101. #else
  55102. "mul r2, r2\n\t"
  55103. #endif
  55104. #ifdef WOLFSSL_KEIL
  55105. "muls r3, r3, r3\n\t"
  55106. #elif defined(__clang__)
  55107. "muls r3, r3\n\t"
  55108. #else
  55109. "mul r3, r3\n\t"
  55110. #endif
  55111. #ifdef WOLFSSL_KEIL
  55112. "muls r5, r6, r5\n\t"
  55113. #elif defined(__clang__)
  55114. "muls r5, r6\n\t"
  55115. #else
  55116. "mul r5, r6\n\t"
  55117. #endif
  55118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55119. "lsrs r6, r5, #15\n\t"
  55120. #else
  55121. "lsr r6, r5, #15\n\t"
  55122. #endif
  55123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55124. "lsls r5, r5, #17\n\t"
  55125. #else
  55126. "lsl r5, r5, #17\n\t"
  55127. #endif
  55128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55129. "adds r2, r2, r5\n\t"
  55130. #else
  55131. "add r2, r2, r5\n\t"
  55132. #endif
  55133. #ifdef WOLFSSL_KEIL
  55134. "adcs r3, r3, r6\n\t"
  55135. #elif defined(__clang__)
  55136. "adcs r3, r6\n\t"
  55137. #else
  55138. "adc r3, r6\n\t"
  55139. #endif
  55140. "str r2, [sp]\n\t"
  55141. "# A[1] * A[0]\n\t"
  55142. "movs r2, #0\n\t"
  55143. "mov %[a], r11\n\t"
  55144. "uxth r5, %[a]\n\t"
  55145. "uxth r6, r7\n\t"
  55146. #ifdef WOLFSSL_KEIL
  55147. "muls r6, r5, r6\n\t"
  55148. #elif defined(__clang__)
  55149. "muls r6, r5\n\t"
  55150. #else
  55151. "mul r6, r5\n\t"
  55152. #endif
  55153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55154. "adds r3, r3, r6\n\t"
  55155. #else
  55156. "add r3, r3, r6\n\t"
  55157. #endif
  55158. #ifdef WOLFSSL_KEIL
  55159. "adcs r4, r4, %[r]\n\t"
  55160. #elif defined(__clang__)
  55161. "adcs r4, %[r]\n\t"
  55162. #else
  55163. "adc r4, %[r]\n\t"
  55164. #endif
  55165. #ifdef WOLFSSL_KEIL
  55166. "adcs r2, r2, %[r]\n\t"
  55167. #elif defined(__clang__)
  55168. "adcs r2, %[r]\n\t"
  55169. #else
  55170. "adc r2, %[r]\n\t"
  55171. #endif
  55172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55173. "adds r3, r3, r6\n\t"
  55174. #else
  55175. "add r3, r3, r6\n\t"
  55176. #endif
  55177. #ifdef WOLFSSL_KEIL
  55178. "adcs r4, r4, %[r]\n\t"
  55179. #elif defined(__clang__)
  55180. "adcs r4, %[r]\n\t"
  55181. #else
  55182. "adc r4, %[r]\n\t"
  55183. #endif
  55184. #ifdef WOLFSSL_KEIL
  55185. "adcs r2, r2, %[r]\n\t"
  55186. #elif defined(__clang__)
  55187. "adcs r2, %[r]\n\t"
  55188. #else
  55189. "adc r2, %[r]\n\t"
  55190. #endif
  55191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55192. "lsrs r6, r7, #16\n\t"
  55193. #else
  55194. "lsr r6, r7, #16\n\t"
  55195. #endif
  55196. #ifdef WOLFSSL_KEIL
  55197. "muls r5, r6, r5\n\t"
  55198. #elif defined(__clang__)
  55199. "muls r5, r6\n\t"
  55200. #else
  55201. "mul r5, r6\n\t"
  55202. #endif
  55203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55204. "lsrs r6, r5, #16\n\t"
  55205. #else
  55206. "lsr r6, r5, #16\n\t"
  55207. #endif
  55208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55209. "lsls r5, r5, #16\n\t"
  55210. #else
  55211. "lsl r5, r5, #16\n\t"
  55212. #endif
  55213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55214. "adds r3, r3, r5\n\t"
  55215. #else
  55216. "add r3, r3, r5\n\t"
  55217. #endif
  55218. #ifdef WOLFSSL_KEIL
  55219. "adcs r4, r4, r6\n\t"
  55220. #elif defined(__clang__)
  55221. "adcs r4, r6\n\t"
  55222. #else
  55223. "adc r4, r6\n\t"
  55224. #endif
  55225. #ifdef WOLFSSL_KEIL
  55226. "adcs r2, r2, %[r]\n\t"
  55227. #elif defined(__clang__)
  55228. "adcs r2, %[r]\n\t"
  55229. #else
  55230. "adc r2, %[r]\n\t"
  55231. #endif
  55232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55233. "adds r3, r3, r5\n\t"
  55234. #else
  55235. "add r3, r3, r5\n\t"
  55236. #endif
  55237. #ifdef WOLFSSL_KEIL
  55238. "adcs r4, r4, r6\n\t"
  55239. #elif defined(__clang__)
  55240. "adcs r4, r6\n\t"
  55241. #else
  55242. "adc r4, r6\n\t"
  55243. #endif
  55244. #ifdef WOLFSSL_KEIL
  55245. "adcs r2, r2, %[r]\n\t"
  55246. #elif defined(__clang__)
  55247. "adcs r2, %[r]\n\t"
  55248. #else
  55249. "adc r2, %[r]\n\t"
  55250. #endif
  55251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55252. "lsrs r5, %[a], #16\n\t"
  55253. #else
  55254. "lsr r5, %[a], #16\n\t"
  55255. #endif
  55256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55257. "lsrs r6, r7, #16\n\t"
  55258. #else
  55259. "lsr r6, r7, #16\n\t"
  55260. #endif
  55261. #ifdef WOLFSSL_KEIL
  55262. "muls r6, r5, r6\n\t"
  55263. #elif defined(__clang__)
  55264. "muls r6, r5\n\t"
  55265. #else
  55266. "mul r6, r5\n\t"
  55267. #endif
  55268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55269. "adds r4, r4, r6\n\t"
  55270. #else
  55271. "add r4, r4, r6\n\t"
  55272. #endif
  55273. #ifdef WOLFSSL_KEIL
  55274. "adcs r2, r2, %[r]\n\t"
  55275. #elif defined(__clang__)
  55276. "adcs r2, %[r]\n\t"
  55277. #else
  55278. "adc r2, %[r]\n\t"
  55279. #endif
  55280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55281. "adds r4, r4, r6\n\t"
  55282. #else
  55283. "add r4, r4, r6\n\t"
  55284. #endif
  55285. #ifdef WOLFSSL_KEIL
  55286. "adcs r2, r2, %[r]\n\t"
  55287. #elif defined(__clang__)
  55288. "adcs r2, %[r]\n\t"
  55289. #else
  55290. "adc r2, %[r]\n\t"
  55291. #endif
  55292. "uxth r6, r7\n\t"
  55293. #ifdef WOLFSSL_KEIL
  55294. "muls r5, r6, r5\n\t"
  55295. #elif defined(__clang__)
  55296. "muls r5, r6\n\t"
  55297. #else
  55298. "mul r5, r6\n\t"
  55299. #endif
  55300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55301. "lsrs r6, r5, #16\n\t"
  55302. #else
  55303. "lsr r6, r5, #16\n\t"
  55304. #endif
  55305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55306. "lsls r5, r5, #16\n\t"
  55307. #else
  55308. "lsl r5, r5, #16\n\t"
  55309. #endif
  55310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55311. "adds r3, r3, r5\n\t"
  55312. #else
  55313. "add r3, r3, r5\n\t"
  55314. #endif
  55315. #ifdef WOLFSSL_KEIL
  55316. "adcs r4, r4, r6\n\t"
  55317. #elif defined(__clang__)
  55318. "adcs r4, r6\n\t"
  55319. #else
  55320. "adc r4, r6\n\t"
  55321. #endif
  55322. #ifdef WOLFSSL_KEIL
  55323. "adcs r2, r2, %[r]\n\t"
  55324. #elif defined(__clang__)
  55325. "adcs r2, %[r]\n\t"
  55326. #else
  55327. "adc r2, %[r]\n\t"
  55328. #endif
  55329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55330. "adds r3, r3, r5\n\t"
  55331. #else
  55332. "add r3, r3, r5\n\t"
  55333. #endif
  55334. #ifdef WOLFSSL_KEIL
  55335. "adcs r4, r4, r6\n\t"
  55336. #elif defined(__clang__)
  55337. "adcs r4, r6\n\t"
  55338. #else
  55339. "adc r4, r6\n\t"
  55340. #endif
  55341. #ifdef WOLFSSL_KEIL
  55342. "adcs r2, r2, %[r]\n\t"
  55343. #elif defined(__clang__)
  55344. "adcs r2, %[r]\n\t"
  55345. #else
  55346. "adc r2, %[r]\n\t"
  55347. #endif
  55348. "str r3, [sp, #4]\n\t"
  55349. "# A[2] * A[0]\n\t"
  55350. "movs r3, #0\n\t"
  55351. "mov %[a], r9\n\t"
  55352. "mov %[a], r12\n\t"
  55353. "uxth r5, %[a]\n\t"
  55354. "uxth r6, r7\n\t"
  55355. #ifdef WOLFSSL_KEIL
  55356. "muls r6, r5, r6\n\t"
  55357. #elif defined(__clang__)
  55358. "muls r6, r5\n\t"
  55359. #else
  55360. "mul r6, r5\n\t"
  55361. #endif
  55362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55363. "adds r4, r4, r6\n\t"
  55364. #else
  55365. "add r4, r4, r6\n\t"
  55366. #endif
  55367. #ifdef WOLFSSL_KEIL
  55368. "adcs r2, r2, %[r]\n\t"
  55369. #elif defined(__clang__)
  55370. "adcs r2, %[r]\n\t"
  55371. #else
  55372. "adc r2, %[r]\n\t"
  55373. #endif
  55374. #ifdef WOLFSSL_KEIL
  55375. "adcs r3, r3, %[r]\n\t"
  55376. #elif defined(__clang__)
  55377. "adcs r3, %[r]\n\t"
  55378. #else
  55379. "adc r3, %[r]\n\t"
  55380. #endif
  55381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55382. "adds r4, r4, r6\n\t"
  55383. #else
  55384. "add r4, r4, r6\n\t"
  55385. #endif
  55386. #ifdef WOLFSSL_KEIL
  55387. "adcs r2, r2, %[r]\n\t"
  55388. #elif defined(__clang__)
  55389. "adcs r2, %[r]\n\t"
  55390. #else
  55391. "adc r2, %[r]\n\t"
  55392. #endif
  55393. #ifdef WOLFSSL_KEIL
  55394. "adcs r3, r3, %[r]\n\t"
  55395. #elif defined(__clang__)
  55396. "adcs r3, %[r]\n\t"
  55397. #else
  55398. "adc r3, %[r]\n\t"
  55399. #endif
  55400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55401. "lsrs r6, r7, #16\n\t"
  55402. #else
  55403. "lsr r6, r7, #16\n\t"
  55404. #endif
  55405. #ifdef WOLFSSL_KEIL
  55406. "muls r5, r6, r5\n\t"
  55407. #elif defined(__clang__)
  55408. "muls r5, r6\n\t"
  55409. #else
  55410. "mul r5, r6\n\t"
  55411. #endif
  55412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55413. "lsrs r6, r5, #16\n\t"
  55414. #else
  55415. "lsr r6, r5, #16\n\t"
  55416. #endif
  55417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55418. "lsls r5, r5, #16\n\t"
  55419. #else
  55420. "lsl r5, r5, #16\n\t"
  55421. #endif
  55422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55423. "adds r4, r4, r5\n\t"
  55424. #else
  55425. "add r4, r4, r5\n\t"
  55426. #endif
  55427. #ifdef WOLFSSL_KEIL
  55428. "adcs r2, r2, r6\n\t"
  55429. #elif defined(__clang__)
  55430. "adcs r2, r6\n\t"
  55431. #else
  55432. "adc r2, r6\n\t"
  55433. #endif
  55434. #ifdef WOLFSSL_KEIL
  55435. "adcs r3, r3, %[r]\n\t"
  55436. #elif defined(__clang__)
  55437. "adcs r3, %[r]\n\t"
  55438. #else
  55439. "adc r3, %[r]\n\t"
  55440. #endif
  55441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55442. "adds r4, r4, r5\n\t"
  55443. #else
  55444. "add r4, r4, r5\n\t"
  55445. #endif
  55446. #ifdef WOLFSSL_KEIL
  55447. "adcs r2, r2, r6\n\t"
  55448. #elif defined(__clang__)
  55449. "adcs r2, r6\n\t"
  55450. #else
  55451. "adc r2, r6\n\t"
  55452. #endif
  55453. #ifdef WOLFSSL_KEIL
  55454. "adcs r3, r3, %[r]\n\t"
  55455. #elif defined(__clang__)
  55456. "adcs r3, %[r]\n\t"
  55457. #else
  55458. "adc r3, %[r]\n\t"
  55459. #endif
  55460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55461. "lsrs r5, %[a], #16\n\t"
  55462. #else
  55463. "lsr r5, %[a], #16\n\t"
  55464. #endif
  55465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55466. "lsrs r6, r7, #16\n\t"
  55467. #else
  55468. "lsr r6, r7, #16\n\t"
  55469. #endif
  55470. #ifdef WOLFSSL_KEIL
  55471. "muls r6, r5, r6\n\t"
  55472. #elif defined(__clang__)
  55473. "muls r6, r5\n\t"
  55474. #else
  55475. "mul r6, r5\n\t"
  55476. #endif
  55477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55478. "adds r2, r2, r6\n\t"
  55479. #else
  55480. "add r2, r2, r6\n\t"
  55481. #endif
  55482. #ifdef WOLFSSL_KEIL
  55483. "adcs r3, r3, %[r]\n\t"
  55484. #elif defined(__clang__)
  55485. "adcs r3, %[r]\n\t"
  55486. #else
  55487. "adc r3, %[r]\n\t"
  55488. #endif
  55489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55490. "adds r2, r2, r6\n\t"
  55491. #else
  55492. "add r2, r2, r6\n\t"
  55493. #endif
  55494. #ifdef WOLFSSL_KEIL
  55495. "adcs r3, r3, %[r]\n\t"
  55496. #elif defined(__clang__)
  55497. "adcs r3, %[r]\n\t"
  55498. #else
  55499. "adc r3, %[r]\n\t"
  55500. #endif
  55501. "uxth r6, r7\n\t"
  55502. #ifdef WOLFSSL_KEIL
  55503. "muls r5, r6, r5\n\t"
  55504. #elif defined(__clang__)
  55505. "muls r5, r6\n\t"
  55506. #else
  55507. "mul r5, r6\n\t"
  55508. #endif
  55509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55510. "lsrs r6, r5, #16\n\t"
  55511. #else
  55512. "lsr r6, r5, #16\n\t"
  55513. #endif
  55514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55515. "lsls r5, r5, #16\n\t"
  55516. #else
  55517. "lsl r5, r5, #16\n\t"
  55518. #endif
  55519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55520. "adds r4, r4, r5\n\t"
  55521. #else
  55522. "add r4, r4, r5\n\t"
  55523. #endif
  55524. #ifdef WOLFSSL_KEIL
  55525. "adcs r2, r2, r6\n\t"
  55526. #elif defined(__clang__)
  55527. "adcs r2, r6\n\t"
  55528. #else
  55529. "adc r2, r6\n\t"
  55530. #endif
  55531. #ifdef WOLFSSL_KEIL
  55532. "adcs r3, r3, %[r]\n\t"
  55533. #elif defined(__clang__)
  55534. "adcs r3, %[r]\n\t"
  55535. #else
  55536. "adc r3, %[r]\n\t"
  55537. #endif
  55538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55539. "adds r4, r4, r5\n\t"
  55540. #else
  55541. "add r4, r4, r5\n\t"
  55542. #endif
  55543. #ifdef WOLFSSL_KEIL
  55544. "adcs r2, r2, r6\n\t"
  55545. #elif defined(__clang__)
  55546. "adcs r2, r6\n\t"
  55547. #else
  55548. "adc r2, r6\n\t"
  55549. #endif
  55550. #ifdef WOLFSSL_KEIL
  55551. "adcs r3, r3, %[r]\n\t"
  55552. #elif defined(__clang__)
  55553. "adcs r3, %[r]\n\t"
  55554. #else
  55555. "adc r3, %[r]\n\t"
  55556. #endif
  55557. "# A[1] * A[1]\n\t"
  55558. "mov r7, r11\n\t"
  55559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55560. "lsrs r6, r7, #16\n\t"
  55561. #else
  55562. "lsr r6, r7, #16\n\t"
  55563. #endif
  55564. "uxth r5, r7\n\t"
  55565. #ifdef WOLFSSL_KEIL
  55566. "muls r5, r5, r5\n\t"
  55567. #elif defined(__clang__)
  55568. "muls r5, r5\n\t"
  55569. #else
  55570. "mul r5, r5\n\t"
  55571. #endif
  55572. #ifdef WOLFSSL_KEIL
  55573. "muls r6, r6, r6\n\t"
  55574. #elif defined(__clang__)
  55575. "muls r6, r6\n\t"
  55576. #else
  55577. "mul r6, r6\n\t"
  55578. #endif
  55579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55580. "adds r4, r4, r5\n\t"
  55581. #else
  55582. "add r4, r4, r5\n\t"
  55583. #endif
  55584. #ifdef WOLFSSL_KEIL
  55585. "adcs r2, r2, r6\n\t"
  55586. #elif defined(__clang__)
  55587. "adcs r2, r6\n\t"
  55588. #else
  55589. "adc r2, r6\n\t"
  55590. #endif
  55591. #ifdef WOLFSSL_KEIL
  55592. "adcs r3, r3, %[r]\n\t"
  55593. #elif defined(__clang__)
  55594. "adcs r3, %[r]\n\t"
  55595. #else
  55596. "adc r3, %[r]\n\t"
  55597. #endif
  55598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55599. "lsrs r6, r7, #16\n\t"
  55600. #else
  55601. "lsr r6, r7, #16\n\t"
  55602. #endif
  55603. "uxth r5, r7\n\t"
  55604. #ifdef WOLFSSL_KEIL
  55605. "muls r5, r6, r5\n\t"
  55606. #elif defined(__clang__)
  55607. "muls r5, r6\n\t"
  55608. #else
  55609. "mul r5, r6\n\t"
  55610. #endif
  55611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55612. "lsrs r6, r5, #15\n\t"
  55613. #else
  55614. "lsr r6, r5, #15\n\t"
  55615. #endif
  55616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55617. "lsls r5, r5, #17\n\t"
  55618. #else
  55619. "lsl r5, r5, #17\n\t"
  55620. #endif
  55621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55622. "adds r4, r4, r5\n\t"
  55623. #else
  55624. "add r4, r4, r5\n\t"
  55625. #endif
  55626. #ifdef WOLFSSL_KEIL
  55627. "adcs r2, r2, r6\n\t"
  55628. #elif defined(__clang__)
  55629. "adcs r2, r6\n\t"
  55630. #else
  55631. "adc r2, r6\n\t"
  55632. #endif
  55633. #ifdef WOLFSSL_KEIL
  55634. "adcs r3, r3, %[r]\n\t"
  55635. #elif defined(__clang__)
  55636. "adcs r3, %[r]\n\t"
  55637. #else
  55638. "adc r3, %[r]\n\t"
  55639. #endif
  55640. "str r4, [sp, #8]\n\t"
  55641. "# A[2] * A[1]\n\t"
  55642. "movs r4, #0\n\t"
  55643. "mov %[a], r9\n\t"
  55644. "mov %[a], r12\n\t"
  55645. "uxth r5, %[a]\n\t"
  55646. "uxth r6, r7\n\t"
  55647. #ifdef WOLFSSL_KEIL
  55648. "muls r6, r5, r6\n\t"
  55649. #elif defined(__clang__)
  55650. "muls r6, r5\n\t"
  55651. #else
  55652. "mul r6, r5\n\t"
  55653. #endif
  55654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55655. "adds r2, r2, r6\n\t"
  55656. #else
  55657. "add r2, r2, r6\n\t"
  55658. #endif
  55659. #ifdef WOLFSSL_KEIL
  55660. "adcs r3, r3, %[r]\n\t"
  55661. #elif defined(__clang__)
  55662. "adcs r3, %[r]\n\t"
  55663. #else
  55664. "adc r3, %[r]\n\t"
  55665. #endif
  55666. #ifdef WOLFSSL_KEIL
  55667. "adcs r4, r4, %[r]\n\t"
  55668. #elif defined(__clang__)
  55669. "adcs r4, %[r]\n\t"
  55670. #else
  55671. "adc r4, %[r]\n\t"
  55672. #endif
  55673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55674. "adds r2, r2, r6\n\t"
  55675. #else
  55676. "add r2, r2, r6\n\t"
  55677. #endif
  55678. #ifdef WOLFSSL_KEIL
  55679. "adcs r3, r3, %[r]\n\t"
  55680. #elif defined(__clang__)
  55681. "adcs r3, %[r]\n\t"
  55682. #else
  55683. "adc r3, %[r]\n\t"
  55684. #endif
  55685. #ifdef WOLFSSL_KEIL
  55686. "adcs r4, r4, %[r]\n\t"
  55687. #elif defined(__clang__)
  55688. "adcs r4, %[r]\n\t"
  55689. #else
  55690. "adc r4, %[r]\n\t"
  55691. #endif
  55692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55693. "lsrs r6, r7, #16\n\t"
  55694. #else
  55695. "lsr r6, r7, #16\n\t"
  55696. #endif
  55697. #ifdef WOLFSSL_KEIL
  55698. "muls r5, r6, r5\n\t"
  55699. #elif defined(__clang__)
  55700. "muls r5, r6\n\t"
  55701. #else
  55702. "mul r5, r6\n\t"
  55703. #endif
  55704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55705. "lsrs r6, r5, #16\n\t"
  55706. #else
  55707. "lsr r6, r5, #16\n\t"
  55708. #endif
  55709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55710. "lsls r5, r5, #16\n\t"
  55711. #else
  55712. "lsl r5, r5, #16\n\t"
  55713. #endif
  55714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55715. "adds r2, r2, r5\n\t"
  55716. #else
  55717. "add r2, r2, r5\n\t"
  55718. #endif
  55719. #ifdef WOLFSSL_KEIL
  55720. "adcs r3, r3, r6\n\t"
  55721. #elif defined(__clang__)
  55722. "adcs r3, r6\n\t"
  55723. #else
  55724. "adc r3, r6\n\t"
  55725. #endif
  55726. #ifdef WOLFSSL_KEIL
  55727. "adcs r4, r4, %[r]\n\t"
  55728. #elif defined(__clang__)
  55729. "adcs r4, %[r]\n\t"
  55730. #else
  55731. "adc r4, %[r]\n\t"
  55732. #endif
  55733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55734. "adds r2, r2, r5\n\t"
  55735. #else
  55736. "add r2, r2, r5\n\t"
  55737. #endif
  55738. #ifdef WOLFSSL_KEIL
  55739. "adcs r3, r3, r6\n\t"
  55740. #elif defined(__clang__)
  55741. "adcs r3, r6\n\t"
  55742. #else
  55743. "adc r3, r6\n\t"
  55744. #endif
  55745. #ifdef WOLFSSL_KEIL
  55746. "adcs r4, r4, %[r]\n\t"
  55747. #elif defined(__clang__)
  55748. "adcs r4, %[r]\n\t"
  55749. #else
  55750. "adc r4, %[r]\n\t"
  55751. #endif
  55752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55753. "lsrs r5, %[a], #16\n\t"
  55754. #else
  55755. "lsr r5, %[a], #16\n\t"
  55756. #endif
  55757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55758. "lsrs r6, r7, #16\n\t"
  55759. #else
  55760. "lsr r6, r7, #16\n\t"
  55761. #endif
  55762. #ifdef WOLFSSL_KEIL
  55763. "muls r6, r5, r6\n\t"
  55764. #elif defined(__clang__)
  55765. "muls r6, r5\n\t"
  55766. #else
  55767. "mul r6, r5\n\t"
  55768. #endif
  55769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55770. "adds r3, r3, r6\n\t"
  55771. #else
  55772. "add r3, r3, r6\n\t"
  55773. #endif
  55774. #ifdef WOLFSSL_KEIL
  55775. "adcs r4, r4, %[r]\n\t"
  55776. #elif defined(__clang__)
  55777. "adcs r4, %[r]\n\t"
  55778. #else
  55779. "adc r4, %[r]\n\t"
  55780. #endif
  55781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55782. "adds r3, r3, r6\n\t"
  55783. #else
  55784. "add r3, r3, r6\n\t"
  55785. #endif
  55786. #ifdef WOLFSSL_KEIL
  55787. "adcs r4, r4, %[r]\n\t"
  55788. #elif defined(__clang__)
  55789. "adcs r4, %[r]\n\t"
  55790. #else
  55791. "adc r4, %[r]\n\t"
  55792. #endif
  55793. "uxth r6, r7\n\t"
  55794. #ifdef WOLFSSL_KEIL
  55795. "muls r5, r6, r5\n\t"
  55796. #elif defined(__clang__)
  55797. "muls r5, r6\n\t"
  55798. #else
  55799. "mul r5, r6\n\t"
  55800. #endif
  55801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55802. "lsrs r6, r5, #16\n\t"
  55803. #else
  55804. "lsr r6, r5, #16\n\t"
  55805. #endif
  55806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55807. "lsls r5, r5, #16\n\t"
  55808. #else
  55809. "lsl r5, r5, #16\n\t"
  55810. #endif
  55811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55812. "adds r2, r2, r5\n\t"
  55813. #else
  55814. "add r2, r2, r5\n\t"
  55815. #endif
  55816. #ifdef WOLFSSL_KEIL
  55817. "adcs r3, r3, r6\n\t"
  55818. #elif defined(__clang__)
  55819. "adcs r3, r6\n\t"
  55820. #else
  55821. "adc r3, r6\n\t"
  55822. #endif
  55823. #ifdef WOLFSSL_KEIL
  55824. "adcs r4, r4, %[r]\n\t"
  55825. #elif defined(__clang__)
  55826. "adcs r4, %[r]\n\t"
  55827. #else
  55828. "adc r4, %[r]\n\t"
  55829. #endif
  55830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55831. "adds r2, r2, r5\n\t"
  55832. #else
  55833. "add r2, r2, r5\n\t"
  55834. #endif
  55835. #ifdef WOLFSSL_KEIL
  55836. "adcs r3, r3, r6\n\t"
  55837. #elif defined(__clang__)
  55838. "adcs r3, r6\n\t"
  55839. #else
  55840. "adc r3, r6\n\t"
  55841. #endif
  55842. #ifdef WOLFSSL_KEIL
  55843. "adcs r4, r4, %[r]\n\t"
  55844. #elif defined(__clang__)
  55845. "adcs r4, %[r]\n\t"
  55846. #else
  55847. "adc r4, %[r]\n\t"
  55848. #endif
  55849. "# A[3] * A[0]\n\t"
  55850. "mov %[a], r9\n\t"
  55851. "mov r7, r10\n\t"
  55852. "mov %[a], lr\n\t"
  55853. "uxth r5, %[a]\n\t"
  55854. "uxth r6, r7\n\t"
  55855. #ifdef WOLFSSL_KEIL
  55856. "muls r6, r5, r6\n\t"
  55857. #elif defined(__clang__)
  55858. "muls r6, r5\n\t"
  55859. #else
  55860. "mul r6, r5\n\t"
  55861. #endif
  55862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55863. "adds r2, r2, r6\n\t"
  55864. #else
  55865. "add r2, r2, r6\n\t"
  55866. #endif
  55867. #ifdef WOLFSSL_KEIL
  55868. "adcs r3, r3, %[r]\n\t"
  55869. #elif defined(__clang__)
  55870. "adcs r3, %[r]\n\t"
  55871. #else
  55872. "adc r3, %[r]\n\t"
  55873. #endif
  55874. #ifdef WOLFSSL_KEIL
  55875. "adcs r4, r4, %[r]\n\t"
  55876. #elif defined(__clang__)
  55877. "adcs r4, %[r]\n\t"
  55878. #else
  55879. "adc r4, %[r]\n\t"
  55880. #endif
  55881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55882. "adds r2, r2, r6\n\t"
  55883. #else
  55884. "add r2, r2, r6\n\t"
  55885. #endif
  55886. #ifdef WOLFSSL_KEIL
  55887. "adcs r3, r3, %[r]\n\t"
  55888. #elif defined(__clang__)
  55889. "adcs r3, %[r]\n\t"
  55890. #else
  55891. "adc r3, %[r]\n\t"
  55892. #endif
  55893. #ifdef WOLFSSL_KEIL
  55894. "adcs r4, r4, %[r]\n\t"
  55895. #elif defined(__clang__)
  55896. "adcs r4, %[r]\n\t"
  55897. #else
  55898. "adc r4, %[r]\n\t"
  55899. #endif
  55900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55901. "lsrs r6, r7, #16\n\t"
  55902. #else
  55903. "lsr r6, r7, #16\n\t"
  55904. #endif
  55905. #ifdef WOLFSSL_KEIL
  55906. "muls r5, r6, r5\n\t"
  55907. #elif defined(__clang__)
  55908. "muls r5, r6\n\t"
  55909. #else
  55910. "mul r5, r6\n\t"
  55911. #endif
  55912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55913. "lsrs r6, r5, #16\n\t"
  55914. #else
  55915. "lsr r6, r5, #16\n\t"
  55916. #endif
  55917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55918. "lsls r5, r5, #16\n\t"
  55919. #else
  55920. "lsl r5, r5, #16\n\t"
  55921. #endif
  55922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55923. "adds r2, r2, r5\n\t"
  55924. #else
  55925. "add r2, r2, r5\n\t"
  55926. #endif
  55927. #ifdef WOLFSSL_KEIL
  55928. "adcs r3, r3, r6\n\t"
  55929. #elif defined(__clang__)
  55930. "adcs r3, r6\n\t"
  55931. #else
  55932. "adc r3, r6\n\t"
  55933. #endif
  55934. #ifdef WOLFSSL_KEIL
  55935. "adcs r4, r4, %[r]\n\t"
  55936. #elif defined(__clang__)
  55937. "adcs r4, %[r]\n\t"
  55938. #else
  55939. "adc r4, %[r]\n\t"
  55940. #endif
  55941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55942. "adds r2, r2, r5\n\t"
  55943. #else
  55944. "add r2, r2, r5\n\t"
  55945. #endif
  55946. #ifdef WOLFSSL_KEIL
  55947. "adcs r3, r3, r6\n\t"
  55948. #elif defined(__clang__)
  55949. "adcs r3, r6\n\t"
  55950. #else
  55951. "adc r3, r6\n\t"
  55952. #endif
  55953. #ifdef WOLFSSL_KEIL
  55954. "adcs r4, r4, %[r]\n\t"
  55955. #elif defined(__clang__)
  55956. "adcs r4, %[r]\n\t"
  55957. #else
  55958. "adc r4, %[r]\n\t"
  55959. #endif
  55960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55961. "lsrs r5, %[a], #16\n\t"
  55962. #else
  55963. "lsr r5, %[a], #16\n\t"
  55964. #endif
  55965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55966. "lsrs r6, r7, #16\n\t"
  55967. #else
  55968. "lsr r6, r7, #16\n\t"
  55969. #endif
  55970. #ifdef WOLFSSL_KEIL
  55971. "muls r6, r5, r6\n\t"
  55972. #elif defined(__clang__)
  55973. "muls r6, r5\n\t"
  55974. #else
  55975. "mul r6, r5\n\t"
  55976. #endif
  55977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55978. "adds r3, r3, r6\n\t"
  55979. #else
  55980. "add r3, r3, r6\n\t"
  55981. #endif
  55982. #ifdef WOLFSSL_KEIL
  55983. "adcs r4, r4, %[r]\n\t"
  55984. #elif defined(__clang__)
  55985. "adcs r4, %[r]\n\t"
  55986. #else
  55987. "adc r4, %[r]\n\t"
  55988. #endif
  55989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  55990. "adds r3, r3, r6\n\t"
  55991. #else
  55992. "add r3, r3, r6\n\t"
  55993. #endif
  55994. #ifdef WOLFSSL_KEIL
  55995. "adcs r4, r4, %[r]\n\t"
  55996. #elif defined(__clang__)
  55997. "adcs r4, %[r]\n\t"
  55998. #else
  55999. "adc r4, %[r]\n\t"
  56000. #endif
  56001. "uxth r6, r7\n\t"
  56002. #ifdef WOLFSSL_KEIL
  56003. "muls r5, r6, r5\n\t"
  56004. #elif defined(__clang__)
  56005. "muls r5, r6\n\t"
  56006. #else
  56007. "mul r5, r6\n\t"
  56008. #endif
  56009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56010. "lsrs r6, r5, #16\n\t"
  56011. #else
  56012. "lsr r6, r5, #16\n\t"
  56013. #endif
  56014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56015. "lsls r5, r5, #16\n\t"
  56016. #else
  56017. "lsl r5, r5, #16\n\t"
  56018. #endif
  56019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56020. "adds r2, r2, r5\n\t"
  56021. #else
  56022. "add r2, r2, r5\n\t"
  56023. #endif
  56024. #ifdef WOLFSSL_KEIL
  56025. "adcs r3, r3, r6\n\t"
  56026. #elif defined(__clang__)
  56027. "adcs r3, r6\n\t"
  56028. #else
  56029. "adc r3, r6\n\t"
  56030. #endif
  56031. #ifdef WOLFSSL_KEIL
  56032. "adcs r4, r4, %[r]\n\t"
  56033. #elif defined(__clang__)
  56034. "adcs r4, %[r]\n\t"
  56035. #else
  56036. "adc r4, %[r]\n\t"
  56037. #endif
  56038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56039. "adds r2, r2, r5\n\t"
  56040. #else
  56041. "add r2, r2, r5\n\t"
  56042. #endif
  56043. #ifdef WOLFSSL_KEIL
  56044. "adcs r3, r3, r6\n\t"
  56045. #elif defined(__clang__)
  56046. "adcs r3, r6\n\t"
  56047. #else
  56048. "adc r3, r6\n\t"
  56049. #endif
  56050. #ifdef WOLFSSL_KEIL
  56051. "adcs r4, r4, %[r]\n\t"
  56052. #elif defined(__clang__)
  56053. "adcs r4, %[r]\n\t"
  56054. #else
  56055. "adc r4, %[r]\n\t"
  56056. #endif
  56057. "str r2, [sp, #12]\n\t"
  56058. "# A[4] * A[0]\n\t"
  56059. "movs r2, #0\n\t"
  56060. "mov %[a], r9\n\t"
  56061. "ldr %[a], [%[a], #16]\n\t"
  56062. "uxth r5, %[a]\n\t"
  56063. "uxth r6, r7\n\t"
  56064. #ifdef WOLFSSL_KEIL
  56065. "muls r6, r5, r6\n\t"
  56066. #elif defined(__clang__)
  56067. "muls r6, r5\n\t"
  56068. #else
  56069. "mul r6, r5\n\t"
  56070. #endif
  56071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56072. "adds r3, r3, r6\n\t"
  56073. #else
  56074. "add r3, r3, r6\n\t"
  56075. #endif
  56076. #ifdef WOLFSSL_KEIL
  56077. "adcs r4, r4, %[r]\n\t"
  56078. #elif defined(__clang__)
  56079. "adcs r4, %[r]\n\t"
  56080. #else
  56081. "adc r4, %[r]\n\t"
  56082. #endif
  56083. #ifdef WOLFSSL_KEIL
  56084. "adcs r2, r2, %[r]\n\t"
  56085. #elif defined(__clang__)
  56086. "adcs r2, %[r]\n\t"
  56087. #else
  56088. "adc r2, %[r]\n\t"
  56089. #endif
  56090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56091. "adds r3, r3, r6\n\t"
  56092. #else
  56093. "add r3, r3, r6\n\t"
  56094. #endif
  56095. #ifdef WOLFSSL_KEIL
  56096. "adcs r4, r4, %[r]\n\t"
  56097. #elif defined(__clang__)
  56098. "adcs r4, %[r]\n\t"
  56099. #else
  56100. "adc r4, %[r]\n\t"
  56101. #endif
  56102. #ifdef WOLFSSL_KEIL
  56103. "adcs r2, r2, %[r]\n\t"
  56104. #elif defined(__clang__)
  56105. "adcs r2, %[r]\n\t"
  56106. #else
  56107. "adc r2, %[r]\n\t"
  56108. #endif
  56109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56110. "lsrs r6, r7, #16\n\t"
  56111. #else
  56112. "lsr r6, r7, #16\n\t"
  56113. #endif
  56114. #ifdef WOLFSSL_KEIL
  56115. "muls r5, r6, r5\n\t"
  56116. #elif defined(__clang__)
  56117. "muls r5, r6\n\t"
  56118. #else
  56119. "mul r5, r6\n\t"
  56120. #endif
  56121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56122. "lsrs r6, r5, #16\n\t"
  56123. #else
  56124. "lsr r6, r5, #16\n\t"
  56125. #endif
  56126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56127. "lsls r5, r5, #16\n\t"
  56128. #else
  56129. "lsl r5, r5, #16\n\t"
  56130. #endif
  56131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56132. "adds r3, r3, r5\n\t"
  56133. #else
  56134. "add r3, r3, r5\n\t"
  56135. #endif
  56136. #ifdef WOLFSSL_KEIL
  56137. "adcs r4, r4, r6\n\t"
  56138. #elif defined(__clang__)
  56139. "adcs r4, r6\n\t"
  56140. #else
  56141. "adc r4, r6\n\t"
  56142. #endif
  56143. #ifdef WOLFSSL_KEIL
  56144. "adcs r2, r2, %[r]\n\t"
  56145. #elif defined(__clang__)
  56146. "adcs r2, %[r]\n\t"
  56147. #else
  56148. "adc r2, %[r]\n\t"
  56149. #endif
  56150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56151. "adds r3, r3, r5\n\t"
  56152. #else
  56153. "add r3, r3, r5\n\t"
  56154. #endif
  56155. #ifdef WOLFSSL_KEIL
  56156. "adcs r4, r4, r6\n\t"
  56157. #elif defined(__clang__)
  56158. "adcs r4, r6\n\t"
  56159. #else
  56160. "adc r4, r6\n\t"
  56161. #endif
  56162. #ifdef WOLFSSL_KEIL
  56163. "adcs r2, r2, %[r]\n\t"
  56164. #elif defined(__clang__)
  56165. "adcs r2, %[r]\n\t"
  56166. #else
  56167. "adc r2, %[r]\n\t"
  56168. #endif
  56169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56170. "lsrs r5, %[a], #16\n\t"
  56171. #else
  56172. "lsr r5, %[a], #16\n\t"
  56173. #endif
  56174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56175. "lsrs r6, r7, #16\n\t"
  56176. #else
  56177. "lsr r6, r7, #16\n\t"
  56178. #endif
  56179. #ifdef WOLFSSL_KEIL
  56180. "muls r6, r5, r6\n\t"
  56181. #elif defined(__clang__)
  56182. "muls r6, r5\n\t"
  56183. #else
  56184. "mul r6, r5\n\t"
  56185. #endif
  56186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56187. "adds r4, r4, r6\n\t"
  56188. #else
  56189. "add r4, r4, r6\n\t"
  56190. #endif
  56191. #ifdef WOLFSSL_KEIL
  56192. "adcs r2, r2, %[r]\n\t"
  56193. #elif defined(__clang__)
  56194. "adcs r2, %[r]\n\t"
  56195. #else
  56196. "adc r2, %[r]\n\t"
  56197. #endif
  56198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56199. "adds r4, r4, r6\n\t"
  56200. #else
  56201. "add r4, r4, r6\n\t"
  56202. #endif
  56203. #ifdef WOLFSSL_KEIL
  56204. "adcs r2, r2, %[r]\n\t"
  56205. #elif defined(__clang__)
  56206. "adcs r2, %[r]\n\t"
  56207. #else
  56208. "adc r2, %[r]\n\t"
  56209. #endif
  56210. "uxth r6, r7\n\t"
  56211. #ifdef WOLFSSL_KEIL
  56212. "muls r5, r6, r5\n\t"
  56213. #elif defined(__clang__)
  56214. "muls r5, r6\n\t"
  56215. #else
  56216. "mul r5, r6\n\t"
  56217. #endif
  56218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56219. "lsrs r6, r5, #16\n\t"
  56220. #else
  56221. "lsr r6, r5, #16\n\t"
  56222. #endif
  56223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56224. "lsls r5, r5, #16\n\t"
  56225. #else
  56226. "lsl r5, r5, #16\n\t"
  56227. #endif
  56228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56229. "adds r3, r3, r5\n\t"
  56230. #else
  56231. "add r3, r3, r5\n\t"
  56232. #endif
  56233. #ifdef WOLFSSL_KEIL
  56234. "adcs r4, r4, r6\n\t"
  56235. #elif defined(__clang__)
  56236. "adcs r4, r6\n\t"
  56237. #else
  56238. "adc r4, r6\n\t"
  56239. #endif
  56240. #ifdef WOLFSSL_KEIL
  56241. "adcs r2, r2, %[r]\n\t"
  56242. #elif defined(__clang__)
  56243. "adcs r2, %[r]\n\t"
  56244. #else
  56245. "adc r2, %[r]\n\t"
  56246. #endif
  56247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56248. "adds r3, r3, r5\n\t"
  56249. #else
  56250. "add r3, r3, r5\n\t"
  56251. #endif
  56252. #ifdef WOLFSSL_KEIL
  56253. "adcs r4, r4, r6\n\t"
  56254. #elif defined(__clang__)
  56255. "adcs r4, r6\n\t"
  56256. #else
  56257. "adc r4, r6\n\t"
  56258. #endif
  56259. #ifdef WOLFSSL_KEIL
  56260. "adcs r2, r2, %[r]\n\t"
  56261. #elif defined(__clang__)
  56262. "adcs r2, %[r]\n\t"
  56263. #else
  56264. "adc r2, %[r]\n\t"
  56265. #endif
  56266. "# A[3] * A[1]\n\t"
  56267. "mov %[a], r9\n\t"
  56268. "mov r7, r11\n\t"
  56269. "mov %[a], lr\n\t"
  56270. "uxth r5, %[a]\n\t"
  56271. "uxth r6, r7\n\t"
  56272. #ifdef WOLFSSL_KEIL
  56273. "muls r6, r5, r6\n\t"
  56274. #elif defined(__clang__)
  56275. "muls r6, r5\n\t"
  56276. #else
  56277. "mul r6, r5\n\t"
  56278. #endif
  56279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56280. "adds r3, r3, r6\n\t"
  56281. #else
  56282. "add r3, r3, r6\n\t"
  56283. #endif
  56284. #ifdef WOLFSSL_KEIL
  56285. "adcs r4, r4, %[r]\n\t"
  56286. #elif defined(__clang__)
  56287. "adcs r4, %[r]\n\t"
  56288. #else
  56289. "adc r4, %[r]\n\t"
  56290. #endif
  56291. #ifdef WOLFSSL_KEIL
  56292. "adcs r2, r2, %[r]\n\t"
  56293. #elif defined(__clang__)
  56294. "adcs r2, %[r]\n\t"
  56295. #else
  56296. "adc r2, %[r]\n\t"
  56297. #endif
  56298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56299. "adds r3, r3, r6\n\t"
  56300. #else
  56301. "add r3, r3, r6\n\t"
  56302. #endif
  56303. #ifdef WOLFSSL_KEIL
  56304. "adcs r4, r4, %[r]\n\t"
  56305. #elif defined(__clang__)
  56306. "adcs r4, %[r]\n\t"
  56307. #else
  56308. "adc r4, %[r]\n\t"
  56309. #endif
  56310. #ifdef WOLFSSL_KEIL
  56311. "adcs r2, r2, %[r]\n\t"
  56312. #elif defined(__clang__)
  56313. "adcs r2, %[r]\n\t"
  56314. #else
  56315. "adc r2, %[r]\n\t"
  56316. #endif
  56317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56318. "lsrs r6, r7, #16\n\t"
  56319. #else
  56320. "lsr r6, r7, #16\n\t"
  56321. #endif
  56322. #ifdef WOLFSSL_KEIL
  56323. "muls r5, r6, r5\n\t"
  56324. #elif defined(__clang__)
  56325. "muls r5, r6\n\t"
  56326. #else
  56327. "mul r5, r6\n\t"
  56328. #endif
  56329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56330. "lsrs r6, r5, #16\n\t"
  56331. #else
  56332. "lsr r6, r5, #16\n\t"
  56333. #endif
  56334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56335. "lsls r5, r5, #16\n\t"
  56336. #else
  56337. "lsl r5, r5, #16\n\t"
  56338. #endif
  56339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56340. "adds r3, r3, r5\n\t"
  56341. #else
  56342. "add r3, r3, r5\n\t"
  56343. #endif
  56344. #ifdef WOLFSSL_KEIL
  56345. "adcs r4, r4, r6\n\t"
  56346. #elif defined(__clang__)
  56347. "adcs r4, r6\n\t"
  56348. #else
  56349. "adc r4, r6\n\t"
  56350. #endif
  56351. #ifdef WOLFSSL_KEIL
  56352. "adcs r2, r2, %[r]\n\t"
  56353. #elif defined(__clang__)
  56354. "adcs r2, %[r]\n\t"
  56355. #else
  56356. "adc r2, %[r]\n\t"
  56357. #endif
  56358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56359. "adds r3, r3, r5\n\t"
  56360. #else
  56361. "add r3, r3, r5\n\t"
  56362. #endif
  56363. #ifdef WOLFSSL_KEIL
  56364. "adcs r4, r4, r6\n\t"
  56365. #elif defined(__clang__)
  56366. "adcs r4, r6\n\t"
  56367. #else
  56368. "adc r4, r6\n\t"
  56369. #endif
  56370. #ifdef WOLFSSL_KEIL
  56371. "adcs r2, r2, %[r]\n\t"
  56372. #elif defined(__clang__)
  56373. "adcs r2, %[r]\n\t"
  56374. #else
  56375. "adc r2, %[r]\n\t"
  56376. #endif
  56377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56378. "lsrs r5, %[a], #16\n\t"
  56379. #else
  56380. "lsr r5, %[a], #16\n\t"
  56381. #endif
  56382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56383. "lsrs r6, r7, #16\n\t"
  56384. #else
  56385. "lsr r6, r7, #16\n\t"
  56386. #endif
  56387. #ifdef WOLFSSL_KEIL
  56388. "muls r6, r5, r6\n\t"
  56389. #elif defined(__clang__)
  56390. "muls r6, r5\n\t"
  56391. #else
  56392. "mul r6, r5\n\t"
  56393. #endif
  56394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56395. "adds r4, r4, r6\n\t"
  56396. #else
  56397. "add r4, r4, r6\n\t"
  56398. #endif
  56399. #ifdef WOLFSSL_KEIL
  56400. "adcs r2, r2, %[r]\n\t"
  56401. #elif defined(__clang__)
  56402. "adcs r2, %[r]\n\t"
  56403. #else
  56404. "adc r2, %[r]\n\t"
  56405. #endif
  56406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56407. "adds r4, r4, r6\n\t"
  56408. #else
  56409. "add r4, r4, r6\n\t"
  56410. #endif
  56411. #ifdef WOLFSSL_KEIL
  56412. "adcs r2, r2, %[r]\n\t"
  56413. #elif defined(__clang__)
  56414. "adcs r2, %[r]\n\t"
  56415. #else
  56416. "adc r2, %[r]\n\t"
  56417. #endif
  56418. "uxth r6, r7\n\t"
  56419. #ifdef WOLFSSL_KEIL
  56420. "muls r5, r6, r5\n\t"
  56421. #elif defined(__clang__)
  56422. "muls r5, r6\n\t"
  56423. #else
  56424. "mul r5, r6\n\t"
  56425. #endif
  56426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56427. "lsrs r6, r5, #16\n\t"
  56428. #else
  56429. "lsr r6, r5, #16\n\t"
  56430. #endif
  56431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56432. "lsls r5, r5, #16\n\t"
  56433. #else
  56434. "lsl r5, r5, #16\n\t"
  56435. #endif
  56436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56437. "adds r3, r3, r5\n\t"
  56438. #else
  56439. "add r3, r3, r5\n\t"
  56440. #endif
  56441. #ifdef WOLFSSL_KEIL
  56442. "adcs r4, r4, r6\n\t"
  56443. #elif defined(__clang__)
  56444. "adcs r4, r6\n\t"
  56445. #else
  56446. "adc r4, r6\n\t"
  56447. #endif
  56448. #ifdef WOLFSSL_KEIL
  56449. "adcs r2, r2, %[r]\n\t"
  56450. #elif defined(__clang__)
  56451. "adcs r2, %[r]\n\t"
  56452. #else
  56453. "adc r2, %[r]\n\t"
  56454. #endif
  56455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56456. "adds r3, r3, r5\n\t"
  56457. #else
  56458. "add r3, r3, r5\n\t"
  56459. #endif
  56460. #ifdef WOLFSSL_KEIL
  56461. "adcs r4, r4, r6\n\t"
  56462. #elif defined(__clang__)
  56463. "adcs r4, r6\n\t"
  56464. #else
  56465. "adc r4, r6\n\t"
  56466. #endif
  56467. #ifdef WOLFSSL_KEIL
  56468. "adcs r2, r2, %[r]\n\t"
  56469. #elif defined(__clang__)
  56470. "adcs r2, %[r]\n\t"
  56471. #else
  56472. "adc r2, %[r]\n\t"
  56473. #endif
  56474. "# A[2] * A[2]\n\t"
  56475. "mov r7, r12\n\t"
  56476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56477. "lsrs r6, r7, #16\n\t"
  56478. #else
  56479. "lsr r6, r7, #16\n\t"
  56480. #endif
  56481. "uxth r5, r7\n\t"
  56482. #ifdef WOLFSSL_KEIL
  56483. "muls r5, r5, r5\n\t"
  56484. #elif defined(__clang__)
  56485. "muls r5, r5\n\t"
  56486. #else
  56487. "mul r5, r5\n\t"
  56488. #endif
  56489. #ifdef WOLFSSL_KEIL
  56490. "muls r6, r6, r6\n\t"
  56491. #elif defined(__clang__)
  56492. "muls r6, r6\n\t"
  56493. #else
  56494. "mul r6, r6\n\t"
  56495. #endif
  56496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56497. "adds r3, r3, r5\n\t"
  56498. #else
  56499. "add r3, r3, r5\n\t"
  56500. #endif
  56501. #ifdef WOLFSSL_KEIL
  56502. "adcs r4, r4, r6\n\t"
  56503. #elif defined(__clang__)
  56504. "adcs r4, r6\n\t"
  56505. #else
  56506. "adc r4, r6\n\t"
  56507. #endif
  56508. #ifdef WOLFSSL_KEIL
  56509. "adcs r2, r2, %[r]\n\t"
  56510. #elif defined(__clang__)
  56511. "adcs r2, %[r]\n\t"
  56512. #else
  56513. "adc r2, %[r]\n\t"
  56514. #endif
  56515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56516. "lsrs r6, r7, #16\n\t"
  56517. #else
  56518. "lsr r6, r7, #16\n\t"
  56519. #endif
  56520. "uxth r5, r7\n\t"
  56521. #ifdef WOLFSSL_KEIL
  56522. "muls r5, r6, r5\n\t"
  56523. #elif defined(__clang__)
  56524. "muls r5, r6\n\t"
  56525. #else
  56526. "mul r5, r6\n\t"
  56527. #endif
  56528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56529. "lsrs r6, r5, #15\n\t"
  56530. #else
  56531. "lsr r6, r5, #15\n\t"
  56532. #endif
  56533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56534. "lsls r5, r5, #17\n\t"
  56535. #else
  56536. "lsl r5, r5, #17\n\t"
  56537. #endif
  56538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56539. "adds r3, r3, r5\n\t"
  56540. #else
  56541. "add r3, r3, r5\n\t"
  56542. #endif
  56543. #ifdef WOLFSSL_KEIL
  56544. "adcs r4, r4, r6\n\t"
  56545. #elif defined(__clang__)
  56546. "adcs r4, r6\n\t"
  56547. #else
  56548. "adc r4, r6\n\t"
  56549. #endif
  56550. #ifdef WOLFSSL_KEIL
  56551. "adcs r2, r2, %[r]\n\t"
  56552. #elif defined(__clang__)
  56553. "adcs r2, %[r]\n\t"
  56554. #else
  56555. "adc r2, %[r]\n\t"
  56556. #endif
  56557. "str r3, [sp, #16]\n\t"
  56558. "# A[3] * A[2]\n\t"
  56559. "movs r3, #0\n\t"
  56560. "mov %[a], r9\n\t"
  56561. "mov %[a], lr\n\t"
  56562. "uxth r5, %[a]\n\t"
  56563. "uxth r6, r7\n\t"
  56564. #ifdef WOLFSSL_KEIL
  56565. "muls r6, r5, r6\n\t"
  56566. #elif defined(__clang__)
  56567. "muls r6, r5\n\t"
  56568. #else
  56569. "mul r6, r5\n\t"
  56570. #endif
  56571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56572. "adds r4, r4, r6\n\t"
  56573. #else
  56574. "add r4, r4, r6\n\t"
  56575. #endif
  56576. #ifdef WOLFSSL_KEIL
  56577. "adcs r2, r2, %[r]\n\t"
  56578. #elif defined(__clang__)
  56579. "adcs r2, %[r]\n\t"
  56580. #else
  56581. "adc r2, %[r]\n\t"
  56582. #endif
  56583. #ifdef WOLFSSL_KEIL
  56584. "adcs r3, r3, %[r]\n\t"
  56585. #elif defined(__clang__)
  56586. "adcs r3, %[r]\n\t"
  56587. #else
  56588. "adc r3, %[r]\n\t"
  56589. #endif
  56590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56591. "adds r4, r4, r6\n\t"
  56592. #else
  56593. "add r4, r4, r6\n\t"
  56594. #endif
  56595. #ifdef WOLFSSL_KEIL
  56596. "adcs r2, r2, %[r]\n\t"
  56597. #elif defined(__clang__)
  56598. "adcs r2, %[r]\n\t"
  56599. #else
  56600. "adc r2, %[r]\n\t"
  56601. #endif
  56602. #ifdef WOLFSSL_KEIL
  56603. "adcs r3, r3, %[r]\n\t"
  56604. #elif defined(__clang__)
  56605. "adcs r3, %[r]\n\t"
  56606. #else
  56607. "adc r3, %[r]\n\t"
  56608. #endif
  56609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56610. "lsrs r6, r7, #16\n\t"
  56611. #else
  56612. "lsr r6, r7, #16\n\t"
  56613. #endif
  56614. #ifdef WOLFSSL_KEIL
  56615. "muls r5, r6, r5\n\t"
  56616. #elif defined(__clang__)
  56617. "muls r5, r6\n\t"
  56618. #else
  56619. "mul r5, r6\n\t"
  56620. #endif
  56621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56622. "lsrs r6, r5, #16\n\t"
  56623. #else
  56624. "lsr r6, r5, #16\n\t"
  56625. #endif
  56626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56627. "lsls r5, r5, #16\n\t"
  56628. #else
  56629. "lsl r5, r5, #16\n\t"
  56630. #endif
  56631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56632. "adds r4, r4, r5\n\t"
  56633. #else
  56634. "add r4, r4, r5\n\t"
  56635. #endif
  56636. #ifdef WOLFSSL_KEIL
  56637. "adcs r2, r2, r6\n\t"
  56638. #elif defined(__clang__)
  56639. "adcs r2, r6\n\t"
  56640. #else
  56641. "adc r2, r6\n\t"
  56642. #endif
  56643. #ifdef WOLFSSL_KEIL
  56644. "adcs r3, r3, %[r]\n\t"
  56645. #elif defined(__clang__)
  56646. "adcs r3, %[r]\n\t"
  56647. #else
  56648. "adc r3, %[r]\n\t"
  56649. #endif
  56650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56651. "adds r4, r4, r5\n\t"
  56652. #else
  56653. "add r4, r4, r5\n\t"
  56654. #endif
  56655. #ifdef WOLFSSL_KEIL
  56656. "adcs r2, r2, r6\n\t"
  56657. #elif defined(__clang__)
  56658. "adcs r2, r6\n\t"
  56659. #else
  56660. "adc r2, r6\n\t"
  56661. #endif
  56662. #ifdef WOLFSSL_KEIL
  56663. "adcs r3, r3, %[r]\n\t"
  56664. #elif defined(__clang__)
  56665. "adcs r3, %[r]\n\t"
  56666. #else
  56667. "adc r3, %[r]\n\t"
  56668. #endif
  56669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56670. "lsrs r5, %[a], #16\n\t"
  56671. #else
  56672. "lsr r5, %[a], #16\n\t"
  56673. #endif
  56674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56675. "lsrs r6, r7, #16\n\t"
  56676. #else
  56677. "lsr r6, r7, #16\n\t"
  56678. #endif
  56679. #ifdef WOLFSSL_KEIL
  56680. "muls r6, r5, r6\n\t"
  56681. #elif defined(__clang__)
  56682. "muls r6, r5\n\t"
  56683. #else
  56684. "mul r6, r5\n\t"
  56685. #endif
  56686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56687. "adds r2, r2, r6\n\t"
  56688. #else
  56689. "add r2, r2, r6\n\t"
  56690. #endif
  56691. #ifdef WOLFSSL_KEIL
  56692. "adcs r3, r3, %[r]\n\t"
  56693. #elif defined(__clang__)
  56694. "adcs r3, %[r]\n\t"
  56695. #else
  56696. "adc r3, %[r]\n\t"
  56697. #endif
  56698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56699. "adds r2, r2, r6\n\t"
  56700. #else
  56701. "add r2, r2, r6\n\t"
  56702. #endif
  56703. #ifdef WOLFSSL_KEIL
  56704. "adcs r3, r3, %[r]\n\t"
  56705. #elif defined(__clang__)
  56706. "adcs r3, %[r]\n\t"
  56707. #else
  56708. "adc r3, %[r]\n\t"
  56709. #endif
  56710. "uxth r6, r7\n\t"
  56711. #ifdef WOLFSSL_KEIL
  56712. "muls r5, r6, r5\n\t"
  56713. #elif defined(__clang__)
  56714. "muls r5, r6\n\t"
  56715. #else
  56716. "mul r5, r6\n\t"
  56717. #endif
  56718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56719. "lsrs r6, r5, #16\n\t"
  56720. #else
  56721. "lsr r6, r5, #16\n\t"
  56722. #endif
  56723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56724. "lsls r5, r5, #16\n\t"
  56725. #else
  56726. "lsl r5, r5, #16\n\t"
  56727. #endif
  56728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56729. "adds r4, r4, r5\n\t"
  56730. #else
  56731. "add r4, r4, r5\n\t"
  56732. #endif
  56733. #ifdef WOLFSSL_KEIL
  56734. "adcs r2, r2, r6\n\t"
  56735. #elif defined(__clang__)
  56736. "adcs r2, r6\n\t"
  56737. #else
  56738. "adc r2, r6\n\t"
  56739. #endif
  56740. #ifdef WOLFSSL_KEIL
  56741. "adcs r3, r3, %[r]\n\t"
  56742. #elif defined(__clang__)
  56743. "adcs r3, %[r]\n\t"
  56744. #else
  56745. "adc r3, %[r]\n\t"
  56746. #endif
  56747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56748. "adds r4, r4, r5\n\t"
  56749. #else
  56750. "add r4, r4, r5\n\t"
  56751. #endif
  56752. #ifdef WOLFSSL_KEIL
  56753. "adcs r2, r2, r6\n\t"
  56754. #elif defined(__clang__)
  56755. "adcs r2, r6\n\t"
  56756. #else
  56757. "adc r2, r6\n\t"
  56758. #endif
  56759. #ifdef WOLFSSL_KEIL
  56760. "adcs r3, r3, %[r]\n\t"
  56761. #elif defined(__clang__)
  56762. "adcs r3, %[r]\n\t"
  56763. #else
  56764. "adc r3, %[r]\n\t"
  56765. #endif
  56766. "# A[4] * A[1]\n\t"
  56767. "mov %[a], r9\n\t"
  56768. "mov r7, r11\n\t"
  56769. "ldr %[a], [%[a], #16]\n\t"
  56770. "uxth r5, %[a]\n\t"
  56771. "uxth r6, r7\n\t"
  56772. #ifdef WOLFSSL_KEIL
  56773. "muls r6, r5, r6\n\t"
  56774. #elif defined(__clang__)
  56775. "muls r6, r5\n\t"
  56776. #else
  56777. "mul r6, r5\n\t"
  56778. #endif
  56779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56780. "adds r4, r4, r6\n\t"
  56781. #else
  56782. "add r4, r4, r6\n\t"
  56783. #endif
  56784. #ifdef WOLFSSL_KEIL
  56785. "adcs r2, r2, %[r]\n\t"
  56786. #elif defined(__clang__)
  56787. "adcs r2, %[r]\n\t"
  56788. #else
  56789. "adc r2, %[r]\n\t"
  56790. #endif
  56791. #ifdef WOLFSSL_KEIL
  56792. "adcs r3, r3, %[r]\n\t"
  56793. #elif defined(__clang__)
  56794. "adcs r3, %[r]\n\t"
  56795. #else
  56796. "adc r3, %[r]\n\t"
  56797. #endif
  56798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56799. "adds r4, r4, r6\n\t"
  56800. #else
  56801. "add r4, r4, r6\n\t"
  56802. #endif
  56803. #ifdef WOLFSSL_KEIL
  56804. "adcs r2, r2, %[r]\n\t"
  56805. #elif defined(__clang__)
  56806. "adcs r2, %[r]\n\t"
  56807. #else
  56808. "adc r2, %[r]\n\t"
  56809. #endif
  56810. #ifdef WOLFSSL_KEIL
  56811. "adcs r3, r3, %[r]\n\t"
  56812. #elif defined(__clang__)
  56813. "adcs r3, %[r]\n\t"
  56814. #else
  56815. "adc r3, %[r]\n\t"
  56816. #endif
  56817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56818. "lsrs r6, r7, #16\n\t"
  56819. #else
  56820. "lsr r6, r7, #16\n\t"
  56821. #endif
  56822. #ifdef WOLFSSL_KEIL
  56823. "muls r5, r6, r5\n\t"
  56824. #elif defined(__clang__)
  56825. "muls r5, r6\n\t"
  56826. #else
  56827. "mul r5, r6\n\t"
  56828. #endif
  56829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56830. "lsrs r6, r5, #16\n\t"
  56831. #else
  56832. "lsr r6, r5, #16\n\t"
  56833. #endif
  56834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56835. "lsls r5, r5, #16\n\t"
  56836. #else
  56837. "lsl r5, r5, #16\n\t"
  56838. #endif
  56839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56840. "adds r4, r4, r5\n\t"
  56841. #else
  56842. "add r4, r4, r5\n\t"
  56843. #endif
  56844. #ifdef WOLFSSL_KEIL
  56845. "adcs r2, r2, r6\n\t"
  56846. #elif defined(__clang__)
  56847. "adcs r2, r6\n\t"
  56848. #else
  56849. "adc r2, r6\n\t"
  56850. #endif
  56851. #ifdef WOLFSSL_KEIL
  56852. "adcs r3, r3, %[r]\n\t"
  56853. #elif defined(__clang__)
  56854. "adcs r3, %[r]\n\t"
  56855. #else
  56856. "adc r3, %[r]\n\t"
  56857. #endif
  56858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56859. "adds r4, r4, r5\n\t"
  56860. #else
  56861. "add r4, r4, r5\n\t"
  56862. #endif
  56863. #ifdef WOLFSSL_KEIL
  56864. "adcs r2, r2, r6\n\t"
  56865. #elif defined(__clang__)
  56866. "adcs r2, r6\n\t"
  56867. #else
  56868. "adc r2, r6\n\t"
  56869. #endif
  56870. #ifdef WOLFSSL_KEIL
  56871. "adcs r3, r3, %[r]\n\t"
  56872. #elif defined(__clang__)
  56873. "adcs r3, %[r]\n\t"
  56874. #else
  56875. "adc r3, %[r]\n\t"
  56876. #endif
  56877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56878. "lsrs r5, %[a], #16\n\t"
  56879. #else
  56880. "lsr r5, %[a], #16\n\t"
  56881. #endif
  56882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56883. "lsrs r6, r7, #16\n\t"
  56884. #else
  56885. "lsr r6, r7, #16\n\t"
  56886. #endif
  56887. #ifdef WOLFSSL_KEIL
  56888. "muls r6, r5, r6\n\t"
  56889. #elif defined(__clang__)
  56890. "muls r6, r5\n\t"
  56891. #else
  56892. "mul r6, r5\n\t"
  56893. #endif
  56894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56895. "adds r2, r2, r6\n\t"
  56896. #else
  56897. "add r2, r2, r6\n\t"
  56898. #endif
  56899. #ifdef WOLFSSL_KEIL
  56900. "adcs r3, r3, %[r]\n\t"
  56901. #elif defined(__clang__)
  56902. "adcs r3, %[r]\n\t"
  56903. #else
  56904. "adc r3, %[r]\n\t"
  56905. #endif
  56906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56907. "adds r2, r2, r6\n\t"
  56908. #else
  56909. "add r2, r2, r6\n\t"
  56910. #endif
  56911. #ifdef WOLFSSL_KEIL
  56912. "adcs r3, r3, %[r]\n\t"
  56913. #elif defined(__clang__)
  56914. "adcs r3, %[r]\n\t"
  56915. #else
  56916. "adc r3, %[r]\n\t"
  56917. #endif
  56918. "uxth r6, r7\n\t"
  56919. #ifdef WOLFSSL_KEIL
  56920. "muls r5, r6, r5\n\t"
  56921. #elif defined(__clang__)
  56922. "muls r5, r6\n\t"
  56923. #else
  56924. "mul r5, r6\n\t"
  56925. #endif
  56926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56927. "lsrs r6, r5, #16\n\t"
  56928. #else
  56929. "lsr r6, r5, #16\n\t"
  56930. #endif
  56931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56932. "lsls r5, r5, #16\n\t"
  56933. #else
  56934. "lsl r5, r5, #16\n\t"
  56935. #endif
  56936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56937. "adds r4, r4, r5\n\t"
  56938. #else
  56939. "add r4, r4, r5\n\t"
  56940. #endif
  56941. #ifdef WOLFSSL_KEIL
  56942. "adcs r2, r2, r6\n\t"
  56943. #elif defined(__clang__)
  56944. "adcs r2, r6\n\t"
  56945. #else
  56946. "adc r2, r6\n\t"
  56947. #endif
  56948. #ifdef WOLFSSL_KEIL
  56949. "adcs r3, r3, %[r]\n\t"
  56950. #elif defined(__clang__)
  56951. "adcs r3, %[r]\n\t"
  56952. #else
  56953. "adc r3, %[r]\n\t"
  56954. #endif
  56955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56956. "adds r4, r4, r5\n\t"
  56957. #else
  56958. "add r4, r4, r5\n\t"
  56959. #endif
  56960. #ifdef WOLFSSL_KEIL
  56961. "adcs r2, r2, r6\n\t"
  56962. #elif defined(__clang__)
  56963. "adcs r2, r6\n\t"
  56964. #else
  56965. "adc r2, r6\n\t"
  56966. #endif
  56967. #ifdef WOLFSSL_KEIL
  56968. "adcs r3, r3, %[r]\n\t"
  56969. #elif defined(__clang__)
  56970. "adcs r3, %[r]\n\t"
  56971. #else
  56972. "adc r3, %[r]\n\t"
  56973. #endif
  56974. "# A[5] * A[0]\n\t"
  56975. "mov %[a], r9\n\t"
  56976. "mov r7, r10\n\t"
  56977. "ldr %[a], [%[a], #20]\n\t"
  56978. "uxth r5, %[a]\n\t"
  56979. "uxth r6, r7\n\t"
  56980. #ifdef WOLFSSL_KEIL
  56981. "muls r6, r5, r6\n\t"
  56982. #elif defined(__clang__)
  56983. "muls r6, r5\n\t"
  56984. #else
  56985. "mul r6, r5\n\t"
  56986. #endif
  56987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  56988. "adds r4, r4, r6\n\t"
  56989. #else
  56990. "add r4, r4, r6\n\t"
  56991. #endif
  56992. #ifdef WOLFSSL_KEIL
  56993. "adcs r2, r2, %[r]\n\t"
  56994. #elif defined(__clang__)
  56995. "adcs r2, %[r]\n\t"
  56996. #else
  56997. "adc r2, %[r]\n\t"
  56998. #endif
  56999. #ifdef WOLFSSL_KEIL
  57000. "adcs r3, r3, %[r]\n\t"
  57001. #elif defined(__clang__)
  57002. "adcs r3, %[r]\n\t"
  57003. #else
  57004. "adc r3, %[r]\n\t"
  57005. #endif
  57006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57007. "adds r4, r4, r6\n\t"
  57008. #else
  57009. "add r4, r4, r6\n\t"
  57010. #endif
  57011. #ifdef WOLFSSL_KEIL
  57012. "adcs r2, r2, %[r]\n\t"
  57013. #elif defined(__clang__)
  57014. "adcs r2, %[r]\n\t"
  57015. #else
  57016. "adc r2, %[r]\n\t"
  57017. #endif
  57018. #ifdef WOLFSSL_KEIL
  57019. "adcs r3, r3, %[r]\n\t"
  57020. #elif defined(__clang__)
  57021. "adcs r3, %[r]\n\t"
  57022. #else
  57023. "adc r3, %[r]\n\t"
  57024. #endif
  57025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57026. "lsrs r6, r7, #16\n\t"
  57027. #else
  57028. "lsr r6, r7, #16\n\t"
  57029. #endif
  57030. #ifdef WOLFSSL_KEIL
  57031. "muls r5, r6, r5\n\t"
  57032. #elif defined(__clang__)
  57033. "muls r5, r6\n\t"
  57034. #else
  57035. "mul r5, r6\n\t"
  57036. #endif
  57037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57038. "lsrs r6, r5, #16\n\t"
  57039. #else
  57040. "lsr r6, r5, #16\n\t"
  57041. #endif
  57042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57043. "lsls r5, r5, #16\n\t"
  57044. #else
  57045. "lsl r5, r5, #16\n\t"
  57046. #endif
  57047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57048. "adds r4, r4, r5\n\t"
  57049. #else
  57050. "add r4, r4, r5\n\t"
  57051. #endif
  57052. #ifdef WOLFSSL_KEIL
  57053. "adcs r2, r2, r6\n\t"
  57054. #elif defined(__clang__)
  57055. "adcs r2, r6\n\t"
  57056. #else
  57057. "adc r2, r6\n\t"
  57058. #endif
  57059. #ifdef WOLFSSL_KEIL
  57060. "adcs r3, r3, %[r]\n\t"
  57061. #elif defined(__clang__)
  57062. "adcs r3, %[r]\n\t"
  57063. #else
  57064. "adc r3, %[r]\n\t"
  57065. #endif
  57066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57067. "adds r4, r4, r5\n\t"
  57068. #else
  57069. "add r4, r4, r5\n\t"
  57070. #endif
  57071. #ifdef WOLFSSL_KEIL
  57072. "adcs r2, r2, r6\n\t"
  57073. #elif defined(__clang__)
  57074. "adcs r2, r6\n\t"
  57075. #else
  57076. "adc r2, r6\n\t"
  57077. #endif
  57078. #ifdef WOLFSSL_KEIL
  57079. "adcs r3, r3, %[r]\n\t"
  57080. #elif defined(__clang__)
  57081. "adcs r3, %[r]\n\t"
  57082. #else
  57083. "adc r3, %[r]\n\t"
  57084. #endif
  57085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57086. "lsrs r5, %[a], #16\n\t"
  57087. #else
  57088. "lsr r5, %[a], #16\n\t"
  57089. #endif
  57090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57091. "lsrs r6, r7, #16\n\t"
  57092. #else
  57093. "lsr r6, r7, #16\n\t"
  57094. #endif
  57095. #ifdef WOLFSSL_KEIL
  57096. "muls r6, r5, r6\n\t"
  57097. #elif defined(__clang__)
  57098. "muls r6, r5\n\t"
  57099. #else
  57100. "mul r6, r5\n\t"
  57101. #endif
  57102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57103. "adds r2, r2, r6\n\t"
  57104. #else
  57105. "add r2, r2, r6\n\t"
  57106. #endif
  57107. #ifdef WOLFSSL_KEIL
  57108. "adcs r3, r3, %[r]\n\t"
  57109. #elif defined(__clang__)
  57110. "adcs r3, %[r]\n\t"
  57111. #else
  57112. "adc r3, %[r]\n\t"
  57113. #endif
  57114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57115. "adds r2, r2, r6\n\t"
  57116. #else
  57117. "add r2, r2, r6\n\t"
  57118. #endif
  57119. #ifdef WOLFSSL_KEIL
  57120. "adcs r3, r3, %[r]\n\t"
  57121. #elif defined(__clang__)
  57122. "adcs r3, %[r]\n\t"
  57123. #else
  57124. "adc r3, %[r]\n\t"
  57125. #endif
  57126. "uxth r6, r7\n\t"
  57127. #ifdef WOLFSSL_KEIL
  57128. "muls r5, r6, r5\n\t"
  57129. #elif defined(__clang__)
  57130. "muls r5, r6\n\t"
  57131. #else
  57132. "mul r5, r6\n\t"
  57133. #endif
  57134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57135. "lsrs r6, r5, #16\n\t"
  57136. #else
  57137. "lsr r6, r5, #16\n\t"
  57138. #endif
  57139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57140. "lsls r5, r5, #16\n\t"
  57141. #else
  57142. "lsl r5, r5, #16\n\t"
  57143. #endif
  57144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57145. "adds r4, r4, r5\n\t"
  57146. #else
  57147. "add r4, r4, r5\n\t"
  57148. #endif
  57149. #ifdef WOLFSSL_KEIL
  57150. "adcs r2, r2, r6\n\t"
  57151. #elif defined(__clang__)
  57152. "adcs r2, r6\n\t"
  57153. #else
  57154. "adc r2, r6\n\t"
  57155. #endif
  57156. #ifdef WOLFSSL_KEIL
  57157. "adcs r3, r3, %[r]\n\t"
  57158. #elif defined(__clang__)
  57159. "adcs r3, %[r]\n\t"
  57160. #else
  57161. "adc r3, %[r]\n\t"
  57162. #endif
  57163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57164. "adds r4, r4, r5\n\t"
  57165. #else
  57166. "add r4, r4, r5\n\t"
  57167. #endif
  57168. #ifdef WOLFSSL_KEIL
  57169. "adcs r2, r2, r6\n\t"
  57170. #elif defined(__clang__)
  57171. "adcs r2, r6\n\t"
  57172. #else
  57173. "adc r2, r6\n\t"
  57174. #endif
  57175. #ifdef WOLFSSL_KEIL
  57176. "adcs r3, r3, %[r]\n\t"
  57177. #elif defined(__clang__)
  57178. "adcs r3, %[r]\n\t"
  57179. #else
  57180. "adc r3, %[r]\n\t"
  57181. #endif
  57182. "str r4, [sp, #20]\n\t"
  57183. "# A[6] * A[0]\n\t"
  57184. "movs r4, #0\n\t"
  57185. "mov %[a], r9\n\t"
  57186. "ldr %[a], [%[a], #24]\n\t"
  57187. "uxth r5, %[a]\n\t"
  57188. "uxth r6, r7\n\t"
  57189. #ifdef WOLFSSL_KEIL
  57190. "muls r6, r5, r6\n\t"
  57191. #elif defined(__clang__)
  57192. "muls r6, r5\n\t"
  57193. #else
  57194. "mul r6, r5\n\t"
  57195. #endif
  57196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57197. "adds r2, r2, r6\n\t"
  57198. #else
  57199. "add r2, r2, r6\n\t"
  57200. #endif
  57201. #ifdef WOLFSSL_KEIL
  57202. "adcs r3, r3, %[r]\n\t"
  57203. #elif defined(__clang__)
  57204. "adcs r3, %[r]\n\t"
  57205. #else
  57206. "adc r3, %[r]\n\t"
  57207. #endif
  57208. #ifdef WOLFSSL_KEIL
  57209. "adcs r4, r4, %[r]\n\t"
  57210. #elif defined(__clang__)
  57211. "adcs r4, %[r]\n\t"
  57212. #else
  57213. "adc r4, %[r]\n\t"
  57214. #endif
  57215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57216. "adds r2, r2, r6\n\t"
  57217. #else
  57218. "add r2, r2, r6\n\t"
  57219. #endif
  57220. #ifdef WOLFSSL_KEIL
  57221. "adcs r3, r3, %[r]\n\t"
  57222. #elif defined(__clang__)
  57223. "adcs r3, %[r]\n\t"
  57224. #else
  57225. "adc r3, %[r]\n\t"
  57226. #endif
  57227. #ifdef WOLFSSL_KEIL
  57228. "adcs r4, r4, %[r]\n\t"
  57229. #elif defined(__clang__)
  57230. "adcs r4, %[r]\n\t"
  57231. #else
  57232. "adc r4, %[r]\n\t"
  57233. #endif
  57234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57235. "lsrs r6, r7, #16\n\t"
  57236. #else
  57237. "lsr r6, r7, #16\n\t"
  57238. #endif
  57239. #ifdef WOLFSSL_KEIL
  57240. "muls r5, r6, r5\n\t"
  57241. #elif defined(__clang__)
  57242. "muls r5, r6\n\t"
  57243. #else
  57244. "mul r5, r6\n\t"
  57245. #endif
  57246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57247. "lsrs r6, r5, #16\n\t"
  57248. #else
  57249. "lsr r6, r5, #16\n\t"
  57250. #endif
  57251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57252. "lsls r5, r5, #16\n\t"
  57253. #else
  57254. "lsl r5, r5, #16\n\t"
  57255. #endif
  57256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57257. "adds r2, r2, r5\n\t"
  57258. #else
  57259. "add r2, r2, r5\n\t"
  57260. #endif
  57261. #ifdef WOLFSSL_KEIL
  57262. "adcs r3, r3, r6\n\t"
  57263. #elif defined(__clang__)
  57264. "adcs r3, r6\n\t"
  57265. #else
  57266. "adc r3, r6\n\t"
  57267. #endif
  57268. #ifdef WOLFSSL_KEIL
  57269. "adcs r4, r4, %[r]\n\t"
  57270. #elif defined(__clang__)
  57271. "adcs r4, %[r]\n\t"
  57272. #else
  57273. "adc r4, %[r]\n\t"
  57274. #endif
  57275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57276. "adds r2, r2, r5\n\t"
  57277. #else
  57278. "add r2, r2, r5\n\t"
  57279. #endif
  57280. #ifdef WOLFSSL_KEIL
  57281. "adcs r3, r3, r6\n\t"
  57282. #elif defined(__clang__)
  57283. "adcs r3, r6\n\t"
  57284. #else
  57285. "adc r3, r6\n\t"
  57286. #endif
  57287. #ifdef WOLFSSL_KEIL
  57288. "adcs r4, r4, %[r]\n\t"
  57289. #elif defined(__clang__)
  57290. "adcs r4, %[r]\n\t"
  57291. #else
  57292. "adc r4, %[r]\n\t"
  57293. #endif
  57294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57295. "lsrs r5, %[a], #16\n\t"
  57296. #else
  57297. "lsr r5, %[a], #16\n\t"
  57298. #endif
  57299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57300. "lsrs r6, r7, #16\n\t"
  57301. #else
  57302. "lsr r6, r7, #16\n\t"
  57303. #endif
  57304. #ifdef WOLFSSL_KEIL
  57305. "muls r6, r5, r6\n\t"
  57306. #elif defined(__clang__)
  57307. "muls r6, r5\n\t"
  57308. #else
  57309. "mul r6, r5\n\t"
  57310. #endif
  57311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57312. "adds r3, r3, r6\n\t"
  57313. #else
  57314. "add r3, r3, r6\n\t"
  57315. #endif
  57316. #ifdef WOLFSSL_KEIL
  57317. "adcs r4, r4, %[r]\n\t"
  57318. #elif defined(__clang__)
  57319. "adcs r4, %[r]\n\t"
  57320. #else
  57321. "adc r4, %[r]\n\t"
  57322. #endif
  57323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57324. "adds r3, r3, r6\n\t"
  57325. #else
  57326. "add r3, r3, r6\n\t"
  57327. #endif
  57328. #ifdef WOLFSSL_KEIL
  57329. "adcs r4, r4, %[r]\n\t"
  57330. #elif defined(__clang__)
  57331. "adcs r4, %[r]\n\t"
  57332. #else
  57333. "adc r4, %[r]\n\t"
  57334. #endif
  57335. "uxth r6, r7\n\t"
  57336. #ifdef WOLFSSL_KEIL
  57337. "muls r5, r6, r5\n\t"
  57338. #elif defined(__clang__)
  57339. "muls r5, r6\n\t"
  57340. #else
  57341. "mul r5, r6\n\t"
  57342. #endif
  57343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57344. "lsrs r6, r5, #16\n\t"
  57345. #else
  57346. "lsr r6, r5, #16\n\t"
  57347. #endif
  57348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57349. "lsls r5, r5, #16\n\t"
  57350. #else
  57351. "lsl r5, r5, #16\n\t"
  57352. #endif
  57353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57354. "adds r2, r2, r5\n\t"
  57355. #else
  57356. "add r2, r2, r5\n\t"
  57357. #endif
  57358. #ifdef WOLFSSL_KEIL
  57359. "adcs r3, r3, r6\n\t"
  57360. #elif defined(__clang__)
  57361. "adcs r3, r6\n\t"
  57362. #else
  57363. "adc r3, r6\n\t"
  57364. #endif
  57365. #ifdef WOLFSSL_KEIL
  57366. "adcs r4, r4, %[r]\n\t"
  57367. #elif defined(__clang__)
  57368. "adcs r4, %[r]\n\t"
  57369. #else
  57370. "adc r4, %[r]\n\t"
  57371. #endif
  57372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57373. "adds r2, r2, r5\n\t"
  57374. #else
  57375. "add r2, r2, r5\n\t"
  57376. #endif
  57377. #ifdef WOLFSSL_KEIL
  57378. "adcs r3, r3, r6\n\t"
  57379. #elif defined(__clang__)
  57380. "adcs r3, r6\n\t"
  57381. #else
  57382. "adc r3, r6\n\t"
  57383. #endif
  57384. #ifdef WOLFSSL_KEIL
  57385. "adcs r4, r4, %[r]\n\t"
  57386. #elif defined(__clang__)
  57387. "adcs r4, %[r]\n\t"
  57388. #else
  57389. "adc r4, %[r]\n\t"
  57390. #endif
  57391. "# A[5] * A[1]\n\t"
  57392. "mov %[a], r9\n\t"
  57393. "mov r7, r11\n\t"
  57394. "ldr %[a], [%[a], #20]\n\t"
  57395. "uxth r5, %[a]\n\t"
  57396. "uxth r6, r7\n\t"
  57397. #ifdef WOLFSSL_KEIL
  57398. "muls r6, r5, r6\n\t"
  57399. #elif defined(__clang__)
  57400. "muls r6, r5\n\t"
  57401. #else
  57402. "mul r6, r5\n\t"
  57403. #endif
  57404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57405. "adds r2, r2, r6\n\t"
  57406. #else
  57407. "add r2, r2, r6\n\t"
  57408. #endif
  57409. #ifdef WOLFSSL_KEIL
  57410. "adcs r3, r3, %[r]\n\t"
  57411. #elif defined(__clang__)
  57412. "adcs r3, %[r]\n\t"
  57413. #else
  57414. "adc r3, %[r]\n\t"
  57415. #endif
  57416. #ifdef WOLFSSL_KEIL
  57417. "adcs r4, r4, %[r]\n\t"
  57418. #elif defined(__clang__)
  57419. "adcs r4, %[r]\n\t"
  57420. #else
  57421. "adc r4, %[r]\n\t"
  57422. #endif
  57423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57424. "adds r2, r2, r6\n\t"
  57425. #else
  57426. "add r2, r2, r6\n\t"
  57427. #endif
  57428. #ifdef WOLFSSL_KEIL
  57429. "adcs r3, r3, %[r]\n\t"
  57430. #elif defined(__clang__)
  57431. "adcs r3, %[r]\n\t"
  57432. #else
  57433. "adc r3, %[r]\n\t"
  57434. #endif
  57435. #ifdef WOLFSSL_KEIL
  57436. "adcs r4, r4, %[r]\n\t"
  57437. #elif defined(__clang__)
  57438. "adcs r4, %[r]\n\t"
  57439. #else
  57440. "adc r4, %[r]\n\t"
  57441. #endif
  57442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57443. "lsrs r6, r7, #16\n\t"
  57444. #else
  57445. "lsr r6, r7, #16\n\t"
  57446. #endif
  57447. #ifdef WOLFSSL_KEIL
  57448. "muls r5, r6, r5\n\t"
  57449. #elif defined(__clang__)
  57450. "muls r5, r6\n\t"
  57451. #else
  57452. "mul r5, r6\n\t"
  57453. #endif
  57454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57455. "lsrs r6, r5, #16\n\t"
  57456. #else
  57457. "lsr r6, r5, #16\n\t"
  57458. #endif
  57459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57460. "lsls r5, r5, #16\n\t"
  57461. #else
  57462. "lsl r5, r5, #16\n\t"
  57463. #endif
  57464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57465. "adds r2, r2, r5\n\t"
  57466. #else
  57467. "add r2, r2, r5\n\t"
  57468. #endif
  57469. #ifdef WOLFSSL_KEIL
  57470. "adcs r3, r3, r6\n\t"
  57471. #elif defined(__clang__)
  57472. "adcs r3, r6\n\t"
  57473. #else
  57474. "adc r3, r6\n\t"
  57475. #endif
  57476. #ifdef WOLFSSL_KEIL
  57477. "adcs r4, r4, %[r]\n\t"
  57478. #elif defined(__clang__)
  57479. "adcs r4, %[r]\n\t"
  57480. #else
  57481. "adc r4, %[r]\n\t"
  57482. #endif
  57483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57484. "adds r2, r2, r5\n\t"
  57485. #else
  57486. "add r2, r2, r5\n\t"
  57487. #endif
  57488. #ifdef WOLFSSL_KEIL
  57489. "adcs r3, r3, r6\n\t"
  57490. #elif defined(__clang__)
  57491. "adcs r3, r6\n\t"
  57492. #else
  57493. "adc r3, r6\n\t"
  57494. #endif
  57495. #ifdef WOLFSSL_KEIL
  57496. "adcs r4, r4, %[r]\n\t"
  57497. #elif defined(__clang__)
  57498. "adcs r4, %[r]\n\t"
  57499. #else
  57500. "adc r4, %[r]\n\t"
  57501. #endif
  57502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57503. "lsrs r5, %[a], #16\n\t"
  57504. #else
  57505. "lsr r5, %[a], #16\n\t"
  57506. #endif
  57507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57508. "lsrs r6, r7, #16\n\t"
  57509. #else
  57510. "lsr r6, r7, #16\n\t"
  57511. #endif
  57512. #ifdef WOLFSSL_KEIL
  57513. "muls r6, r5, r6\n\t"
  57514. #elif defined(__clang__)
  57515. "muls r6, r5\n\t"
  57516. #else
  57517. "mul r6, r5\n\t"
  57518. #endif
  57519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57520. "adds r3, r3, r6\n\t"
  57521. #else
  57522. "add r3, r3, r6\n\t"
  57523. #endif
  57524. #ifdef WOLFSSL_KEIL
  57525. "adcs r4, r4, %[r]\n\t"
  57526. #elif defined(__clang__)
  57527. "adcs r4, %[r]\n\t"
  57528. #else
  57529. "adc r4, %[r]\n\t"
  57530. #endif
  57531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57532. "adds r3, r3, r6\n\t"
  57533. #else
  57534. "add r3, r3, r6\n\t"
  57535. #endif
  57536. #ifdef WOLFSSL_KEIL
  57537. "adcs r4, r4, %[r]\n\t"
  57538. #elif defined(__clang__)
  57539. "adcs r4, %[r]\n\t"
  57540. #else
  57541. "adc r4, %[r]\n\t"
  57542. #endif
  57543. "uxth r6, r7\n\t"
  57544. #ifdef WOLFSSL_KEIL
  57545. "muls r5, r6, r5\n\t"
  57546. #elif defined(__clang__)
  57547. "muls r5, r6\n\t"
  57548. #else
  57549. "mul r5, r6\n\t"
  57550. #endif
  57551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57552. "lsrs r6, r5, #16\n\t"
  57553. #else
  57554. "lsr r6, r5, #16\n\t"
  57555. #endif
  57556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57557. "lsls r5, r5, #16\n\t"
  57558. #else
  57559. "lsl r5, r5, #16\n\t"
  57560. #endif
  57561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57562. "adds r2, r2, r5\n\t"
  57563. #else
  57564. "add r2, r2, r5\n\t"
  57565. #endif
  57566. #ifdef WOLFSSL_KEIL
  57567. "adcs r3, r3, r6\n\t"
  57568. #elif defined(__clang__)
  57569. "adcs r3, r6\n\t"
  57570. #else
  57571. "adc r3, r6\n\t"
  57572. #endif
  57573. #ifdef WOLFSSL_KEIL
  57574. "adcs r4, r4, %[r]\n\t"
  57575. #elif defined(__clang__)
  57576. "adcs r4, %[r]\n\t"
  57577. #else
  57578. "adc r4, %[r]\n\t"
  57579. #endif
  57580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57581. "adds r2, r2, r5\n\t"
  57582. #else
  57583. "add r2, r2, r5\n\t"
  57584. #endif
  57585. #ifdef WOLFSSL_KEIL
  57586. "adcs r3, r3, r6\n\t"
  57587. #elif defined(__clang__)
  57588. "adcs r3, r6\n\t"
  57589. #else
  57590. "adc r3, r6\n\t"
  57591. #endif
  57592. #ifdef WOLFSSL_KEIL
  57593. "adcs r4, r4, %[r]\n\t"
  57594. #elif defined(__clang__)
  57595. "adcs r4, %[r]\n\t"
  57596. #else
  57597. "adc r4, %[r]\n\t"
  57598. #endif
  57599. "# A[4] * A[2]\n\t"
  57600. "mov %[a], r9\n\t"
  57601. "mov r7, r12\n\t"
  57602. "ldr %[a], [%[a], #16]\n\t"
  57603. "uxth r5, %[a]\n\t"
  57604. "uxth r6, r7\n\t"
  57605. #ifdef WOLFSSL_KEIL
  57606. "muls r6, r5, r6\n\t"
  57607. #elif defined(__clang__)
  57608. "muls r6, r5\n\t"
  57609. #else
  57610. "mul r6, r5\n\t"
  57611. #endif
  57612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57613. "adds r2, r2, r6\n\t"
  57614. #else
  57615. "add r2, r2, r6\n\t"
  57616. #endif
  57617. #ifdef WOLFSSL_KEIL
  57618. "adcs r3, r3, %[r]\n\t"
  57619. #elif defined(__clang__)
  57620. "adcs r3, %[r]\n\t"
  57621. #else
  57622. "adc r3, %[r]\n\t"
  57623. #endif
  57624. #ifdef WOLFSSL_KEIL
  57625. "adcs r4, r4, %[r]\n\t"
  57626. #elif defined(__clang__)
  57627. "adcs r4, %[r]\n\t"
  57628. #else
  57629. "adc r4, %[r]\n\t"
  57630. #endif
  57631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57632. "adds r2, r2, r6\n\t"
  57633. #else
  57634. "add r2, r2, r6\n\t"
  57635. #endif
  57636. #ifdef WOLFSSL_KEIL
  57637. "adcs r3, r3, %[r]\n\t"
  57638. #elif defined(__clang__)
  57639. "adcs r3, %[r]\n\t"
  57640. #else
  57641. "adc r3, %[r]\n\t"
  57642. #endif
  57643. #ifdef WOLFSSL_KEIL
  57644. "adcs r4, r4, %[r]\n\t"
  57645. #elif defined(__clang__)
  57646. "adcs r4, %[r]\n\t"
  57647. #else
  57648. "adc r4, %[r]\n\t"
  57649. #endif
  57650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57651. "lsrs r6, r7, #16\n\t"
  57652. #else
  57653. "lsr r6, r7, #16\n\t"
  57654. #endif
  57655. #ifdef WOLFSSL_KEIL
  57656. "muls r5, r6, r5\n\t"
  57657. #elif defined(__clang__)
  57658. "muls r5, r6\n\t"
  57659. #else
  57660. "mul r5, r6\n\t"
  57661. #endif
  57662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57663. "lsrs r6, r5, #16\n\t"
  57664. #else
  57665. "lsr r6, r5, #16\n\t"
  57666. #endif
  57667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57668. "lsls r5, r5, #16\n\t"
  57669. #else
  57670. "lsl r5, r5, #16\n\t"
  57671. #endif
  57672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57673. "adds r2, r2, r5\n\t"
  57674. #else
  57675. "add r2, r2, r5\n\t"
  57676. #endif
  57677. #ifdef WOLFSSL_KEIL
  57678. "adcs r3, r3, r6\n\t"
  57679. #elif defined(__clang__)
  57680. "adcs r3, r6\n\t"
  57681. #else
  57682. "adc r3, r6\n\t"
  57683. #endif
  57684. #ifdef WOLFSSL_KEIL
  57685. "adcs r4, r4, %[r]\n\t"
  57686. #elif defined(__clang__)
  57687. "adcs r4, %[r]\n\t"
  57688. #else
  57689. "adc r4, %[r]\n\t"
  57690. #endif
  57691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57692. "adds r2, r2, r5\n\t"
  57693. #else
  57694. "add r2, r2, r5\n\t"
  57695. #endif
  57696. #ifdef WOLFSSL_KEIL
  57697. "adcs r3, r3, r6\n\t"
  57698. #elif defined(__clang__)
  57699. "adcs r3, r6\n\t"
  57700. #else
  57701. "adc r3, r6\n\t"
  57702. #endif
  57703. #ifdef WOLFSSL_KEIL
  57704. "adcs r4, r4, %[r]\n\t"
  57705. #elif defined(__clang__)
  57706. "adcs r4, %[r]\n\t"
  57707. #else
  57708. "adc r4, %[r]\n\t"
  57709. #endif
  57710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57711. "lsrs r5, %[a], #16\n\t"
  57712. #else
  57713. "lsr r5, %[a], #16\n\t"
  57714. #endif
  57715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57716. "lsrs r6, r7, #16\n\t"
  57717. #else
  57718. "lsr r6, r7, #16\n\t"
  57719. #endif
  57720. #ifdef WOLFSSL_KEIL
  57721. "muls r6, r5, r6\n\t"
  57722. #elif defined(__clang__)
  57723. "muls r6, r5\n\t"
  57724. #else
  57725. "mul r6, r5\n\t"
  57726. #endif
  57727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57728. "adds r3, r3, r6\n\t"
  57729. #else
  57730. "add r3, r3, r6\n\t"
  57731. #endif
  57732. #ifdef WOLFSSL_KEIL
  57733. "adcs r4, r4, %[r]\n\t"
  57734. #elif defined(__clang__)
  57735. "adcs r4, %[r]\n\t"
  57736. #else
  57737. "adc r4, %[r]\n\t"
  57738. #endif
  57739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57740. "adds r3, r3, r6\n\t"
  57741. #else
  57742. "add r3, r3, r6\n\t"
  57743. #endif
  57744. #ifdef WOLFSSL_KEIL
  57745. "adcs r4, r4, %[r]\n\t"
  57746. #elif defined(__clang__)
  57747. "adcs r4, %[r]\n\t"
  57748. #else
  57749. "adc r4, %[r]\n\t"
  57750. #endif
  57751. "uxth r6, r7\n\t"
  57752. #ifdef WOLFSSL_KEIL
  57753. "muls r5, r6, r5\n\t"
  57754. #elif defined(__clang__)
  57755. "muls r5, r6\n\t"
  57756. #else
  57757. "mul r5, r6\n\t"
  57758. #endif
  57759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57760. "lsrs r6, r5, #16\n\t"
  57761. #else
  57762. "lsr r6, r5, #16\n\t"
  57763. #endif
  57764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57765. "lsls r5, r5, #16\n\t"
  57766. #else
  57767. "lsl r5, r5, #16\n\t"
  57768. #endif
  57769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57770. "adds r2, r2, r5\n\t"
  57771. #else
  57772. "add r2, r2, r5\n\t"
  57773. #endif
  57774. #ifdef WOLFSSL_KEIL
  57775. "adcs r3, r3, r6\n\t"
  57776. #elif defined(__clang__)
  57777. "adcs r3, r6\n\t"
  57778. #else
  57779. "adc r3, r6\n\t"
  57780. #endif
  57781. #ifdef WOLFSSL_KEIL
  57782. "adcs r4, r4, %[r]\n\t"
  57783. #elif defined(__clang__)
  57784. "adcs r4, %[r]\n\t"
  57785. #else
  57786. "adc r4, %[r]\n\t"
  57787. #endif
  57788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57789. "adds r2, r2, r5\n\t"
  57790. #else
  57791. "add r2, r2, r5\n\t"
  57792. #endif
  57793. #ifdef WOLFSSL_KEIL
  57794. "adcs r3, r3, r6\n\t"
  57795. #elif defined(__clang__)
  57796. "adcs r3, r6\n\t"
  57797. #else
  57798. "adc r3, r6\n\t"
  57799. #endif
  57800. #ifdef WOLFSSL_KEIL
  57801. "adcs r4, r4, %[r]\n\t"
  57802. #elif defined(__clang__)
  57803. "adcs r4, %[r]\n\t"
  57804. #else
  57805. "adc r4, %[r]\n\t"
  57806. #endif
  57807. "# A[3] * A[3]\n\t"
  57808. "mov r7, lr\n\t"
  57809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57810. "lsrs r6, r7, #16\n\t"
  57811. #else
  57812. "lsr r6, r7, #16\n\t"
  57813. #endif
  57814. "uxth r5, r7\n\t"
  57815. #ifdef WOLFSSL_KEIL
  57816. "muls r5, r5, r5\n\t"
  57817. #elif defined(__clang__)
  57818. "muls r5, r5\n\t"
  57819. #else
  57820. "mul r5, r5\n\t"
  57821. #endif
  57822. #ifdef WOLFSSL_KEIL
  57823. "muls r6, r6, r6\n\t"
  57824. #elif defined(__clang__)
  57825. "muls r6, r6\n\t"
  57826. #else
  57827. "mul r6, r6\n\t"
  57828. #endif
  57829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57830. "adds r2, r2, r5\n\t"
  57831. #else
  57832. "add r2, r2, r5\n\t"
  57833. #endif
  57834. #ifdef WOLFSSL_KEIL
  57835. "adcs r3, r3, r6\n\t"
  57836. #elif defined(__clang__)
  57837. "adcs r3, r6\n\t"
  57838. #else
  57839. "adc r3, r6\n\t"
  57840. #endif
  57841. #ifdef WOLFSSL_KEIL
  57842. "adcs r4, r4, %[r]\n\t"
  57843. #elif defined(__clang__)
  57844. "adcs r4, %[r]\n\t"
  57845. #else
  57846. "adc r4, %[r]\n\t"
  57847. #endif
  57848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57849. "lsrs r6, r7, #16\n\t"
  57850. #else
  57851. "lsr r6, r7, #16\n\t"
  57852. #endif
  57853. "uxth r5, r7\n\t"
  57854. #ifdef WOLFSSL_KEIL
  57855. "muls r5, r6, r5\n\t"
  57856. #elif defined(__clang__)
  57857. "muls r5, r6\n\t"
  57858. #else
  57859. "mul r5, r6\n\t"
  57860. #endif
  57861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57862. "lsrs r6, r5, #15\n\t"
  57863. #else
  57864. "lsr r6, r5, #15\n\t"
  57865. #endif
  57866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57867. "lsls r5, r5, #17\n\t"
  57868. #else
  57869. "lsl r5, r5, #17\n\t"
  57870. #endif
  57871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57872. "adds r2, r2, r5\n\t"
  57873. #else
  57874. "add r2, r2, r5\n\t"
  57875. #endif
  57876. #ifdef WOLFSSL_KEIL
  57877. "adcs r3, r3, r6\n\t"
  57878. #elif defined(__clang__)
  57879. "adcs r3, r6\n\t"
  57880. #else
  57881. "adc r3, r6\n\t"
  57882. #endif
  57883. #ifdef WOLFSSL_KEIL
  57884. "adcs r4, r4, %[r]\n\t"
  57885. #elif defined(__clang__)
  57886. "adcs r4, %[r]\n\t"
  57887. #else
  57888. "adc r4, %[r]\n\t"
  57889. #endif
  57890. "str r2, [sp, #24]\n\t"
  57891. "# A[4] * A[3]\n\t"
  57892. "movs r2, #0\n\t"
  57893. "mov %[a], r9\n\t"
  57894. "ldr %[a], [%[a], #16]\n\t"
  57895. "uxth r5, %[a]\n\t"
  57896. "uxth r6, r7\n\t"
  57897. #ifdef WOLFSSL_KEIL
  57898. "muls r6, r5, r6\n\t"
  57899. #elif defined(__clang__)
  57900. "muls r6, r5\n\t"
  57901. #else
  57902. "mul r6, r5\n\t"
  57903. #endif
  57904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57905. "adds r3, r3, r6\n\t"
  57906. #else
  57907. "add r3, r3, r6\n\t"
  57908. #endif
  57909. #ifdef WOLFSSL_KEIL
  57910. "adcs r4, r4, %[r]\n\t"
  57911. #elif defined(__clang__)
  57912. "adcs r4, %[r]\n\t"
  57913. #else
  57914. "adc r4, %[r]\n\t"
  57915. #endif
  57916. #ifdef WOLFSSL_KEIL
  57917. "adcs r2, r2, %[r]\n\t"
  57918. #elif defined(__clang__)
  57919. "adcs r2, %[r]\n\t"
  57920. #else
  57921. "adc r2, %[r]\n\t"
  57922. #endif
  57923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57924. "adds r3, r3, r6\n\t"
  57925. #else
  57926. "add r3, r3, r6\n\t"
  57927. #endif
  57928. #ifdef WOLFSSL_KEIL
  57929. "adcs r4, r4, %[r]\n\t"
  57930. #elif defined(__clang__)
  57931. "adcs r4, %[r]\n\t"
  57932. #else
  57933. "adc r4, %[r]\n\t"
  57934. #endif
  57935. #ifdef WOLFSSL_KEIL
  57936. "adcs r2, r2, %[r]\n\t"
  57937. #elif defined(__clang__)
  57938. "adcs r2, %[r]\n\t"
  57939. #else
  57940. "adc r2, %[r]\n\t"
  57941. #endif
  57942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57943. "lsrs r6, r7, #16\n\t"
  57944. #else
  57945. "lsr r6, r7, #16\n\t"
  57946. #endif
  57947. #ifdef WOLFSSL_KEIL
  57948. "muls r5, r6, r5\n\t"
  57949. #elif defined(__clang__)
  57950. "muls r5, r6\n\t"
  57951. #else
  57952. "mul r5, r6\n\t"
  57953. #endif
  57954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57955. "lsrs r6, r5, #16\n\t"
  57956. #else
  57957. "lsr r6, r5, #16\n\t"
  57958. #endif
  57959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57960. "lsls r5, r5, #16\n\t"
  57961. #else
  57962. "lsl r5, r5, #16\n\t"
  57963. #endif
  57964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57965. "adds r3, r3, r5\n\t"
  57966. #else
  57967. "add r3, r3, r5\n\t"
  57968. #endif
  57969. #ifdef WOLFSSL_KEIL
  57970. "adcs r4, r4, r6\n\t"
  57971. #elif defined(__clang__)
  57972. "adcs r4, r6\n\t"
  57973. #else
  57974. "adc r4, r6\n\t"
  57975. #endif
  57976. #ifdef WOLFSSL_KEIL
  57977. "adcs r2, r2, %[r]\n\t"
  57978. #elif defined(__clang__)
  57979. "adcs r2, %[r]\n\t"
  57980. #else
  57981. "adc r2, %[r]\n\t"
  57982. #endif
  57983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  57984. "adds r3, r3, r5\n\t"
  57985. #else
  57986. "add r3, r3, r5\n\t"
  57987. #endif
  57988. #ifdef WOLFSSL_KEIL
  57989. "adcs r4, r4, r6\n\t"
  57990. #elif defined(__clang__)
  57991. "adcs r4, r6\n\t"
  57992. #else
  57993. "adc r4, r6\n\t"
  57994. #endif
  57995. #ifdef WOLFSSL_KEIL
  57996. "adcs r2, r2, %[r]\n\t"
  57997. #elif defined(__clang__)
  57998. "adcs r2, %[r]\n\t"
  57999. #else
  58000. "adc r2, %[r]\n\t"
  58001. #endif
  58002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58003. "lsrs r5, %[a], #16\n\t"
  58004. #else
  58005. "lsr r5, %[a], #16\n\t"
  58006. #endif
  58007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58008. "lsrs r6, r7, #16\n\t"
  58009. #else
  58010. "lsr r6, r7, #16\n\t"
  58011. #endif
  58012. #ifdef WOLFSSL_KEIL
  58013. "muls r6, r5, r6\n\t"
  58014. #elif defined(__clang__)
  58015. "muls r6, r5\n\t"
  58016. #else
  58017. "mul r6, r5\n\t"
  58018. #endif
  58019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58020. "adds r4, r4, r6\n\t"
  58021. #else
  58022. "add r4, r4, r6\n\t"
  58023. #endif
  58024. #ifdef WOLFSSL_KEIL
  58025. "adcs r2, r2, %[r]\n\t"
  58026. #elif defined(__clang__)
  58027. "adcs r2, %[r]\n\t"
  58028. #else
  58029. "adc r2, %[r]\n\t"
  58030. #endif
  58031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58032. "adds r4, r4, r6\n\t"
  58033. #else
  58034. "add r4, r4, r6\n\t"
  58035. #endif
  58036. #ifdef WOLFSSL_KEIL
  58037. "adcs r2, r2, %[r]\n\t"
  58038. #elif defined(__clang__)
  58039. "adcs r2, %[r]\n\t"
  58040. #else
  58041. "adc r2, %[r]\n\t"
  58042. #endif
  58043. "uxth r6, r7\n\t"
  58044. #ifdef WOLFSSL_KEIL
  58045. "muls r5, r6, r5\n\t"
  58046. #elif defined(__clang__)
  58047. "muls r5, r6\n\t"
  58048. #else
  58049. "mul r5, r6\n\t"
  58050. #endif
  58051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58052. "lsrs r6, r5, #16\n\t"
  58053. #else
  58054. "lsr r6, r5, #16\n\t"
  58055. #endif
  58056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58057. "lsls r5, r5, #16\n\t"
  58058. #else
  58059. "lsl r5, r5, #16\n\t"
  58060. #endif
  58061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58062. "adds r3, r3, r5\n\t"
  58063. #else
  58064. "add r3, r3, r5\n\t"
  58065. #endif
  58066. #ifdef WOLFSSL_KEIL
  58067. "adcs r4, r4, r6\n\t"
  58068. #elif defined(__clang__)
  58069. "adcs r4, r6\n\t"
  58070. #else
  58071. "adc r4, r6\n\t"
  58072. #endif
  58073. #ifdef WOLFSSL_KEIL
  58074. "adcs r2, r2, %[r]\n\t"
  58075. #elif defined(__clang__)
  58076. "adcs r2, %[r]\n\t"
  58077. #else
  58078. "adc r2, %[r]\n\t"
  58079. #endif
  58080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58081. "adds r3, r3, r5\n\t"
  58082. #else
  58083. "add r3, r3, r5\n\t"
  58084. #endif
  58085. #ifdef WOLFSSL_KEIL
  58086. "adcs r4, r4, r6\n\t"
  58087. #elif defined(__clang__)
  58088. "adcs r4, r6\n\t"
  58089. #else
  58090. "adc r4, r6\n\t"
  58091. #endif
  58092. #ifdef WOLFSSL_KEIL
  58093. "adcs r2, r2, %[r]\n\t"
  58094. #elif defined(__clang__)
  58095. "adcs r2, %[r]\n\t"
  58096. #else
  58097. "adc r2, %[r]\n\t"
  58098. #endif
  58099. "# A[5] * A[2]\n\t"
  58100. "mov %[a], r9\n\t"
  58101. "mov r7, r12\n\t"
  58102. "ldr %[a], [%[a], #20]\n\t"
  58103. "uxth r5, %[a]\n\t"
  58104. "uxth r6, r7\n\t"
  58105. #ifdef WOLFSSL_KEIL
  58106. "muls r6, r5, r6\n\t"
  58107. #elif defined(__clang__)
  58108. "muls r6, r5\n\t"
  58109. #else
  58110. "mul r6, r5\n\t"
  58111. #endif
  58112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58113. "adds r3, r3, r6\n\t"
  58114. #else
  58115. "add r3, r3, r6\n\t"
  58116. #endif
  58117. #ifdef WOLFSSL_KEIL
  58118. "adcs r4, r4, %[r]\n\t"
  58119. #elif defined(__clang__)
  58120. "adcs r4, %[r]\n\t"
  58121. #else
  58122. "adc r4, %[r]\n\t"
  58123. #endif
  58124. #ifdef WOLFSSL_KEIL
  58125. "adcs r2, r2, %[r]\n\t"
  58126. #elif defined(__clang__)
  58127. "adcs r2, %[r]\n\t"
  58128. #else
  58129. "adc r2, %[r]\n\t"
  58130. #endif
  58131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58132. "adds r3, r3, r6\n\t"
  58133. #else
  58134. "add r3, r3, r6\n\t"
  58135. #endif
  58136. #ifdef WOLFSSL_KEIL
  58137. "adcs r4, r4, %[r]\n\t"
  58138. #elif defined(__clang__)
  58139. "adcs r4, %[r]\n\t"
  58140. #else
  58141. "adc r4, %[r]\n\t"
  58142. #endif
  58143. #ifdef WOLFSSL_KEIL
  58144. "adcs r2, r2, %[r]\n\t"
  58145. #elif defined(__clang__)
  58146. "adcs r2, %[r]\n\t"
  58147. #else
  58148. "adc r2, %[r]\n\t"
  58149. #endif
  58150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58151. "lsrs r6, r7, #16\n\t"
  58152. #else
  58153. "lsr r6, r7, #16\n\t"
  58154. #endif
  58155. #ifdef WOLFSSL_KEIL
  58156. "muls r5, r6, r5\n\t"
  58157. #elif defined(__clang__)
  58158. "muls r5, r6\n\t"
  58159. #else
  58160. "mul r5, r6\n\t"
  58161. #endif
  58162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58163. "lsrs r6, r5, #16\n\t"
  58164. #else
  58165. "lsr r6, r5, #16\n\t"
  58166. #endif
  58167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58168. "lsls r5, r5, #16\n\t"
  58169. #else
  58170. "lsl r5, r5, #16\n\t"
  58171. #endif
  58172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58173. "adds r3, r3, r5\n\t"
  58174. #else
  58175. "add r3, r3, r5\n\t"
  58176. #endif
  58177. #ifdef WOLFSSL_KEIL
  58178. "adcs r4, r4, r6\n\t"
  58179. #elif defined(__clang__)
  58180. "adcs r4, r6\n\t"
  58181. #else
  58182. "adc r4, r6\n\t"
  58183. #endif
  58184. #ifdef WOLFSSL_KEIL
  58185. "adcs r2, r2, %[r]\n\t"
  58186. #elif defined(__clang__)
  58187. "adcs r2, %[r]\n\t"
  58188. #else
  58189. "adc r2, %[r]\n\t"
  58190. #endif
  58191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58192. "adds r3, r3, r5\n\t"
  58193. #else
  58194. "add r3, r3, r5\n\t"
  58195. #endif
  58196. #ifdef WOLFSSL_KEIL
  58197. "adcs r4, r4, r6\n\t"
  58198. #elif defined(__clang__)
  58199. "adcs r4, r6\n\t"
  58200. #else
  58201. "adc r4, r6\n\t"
  58202. #endif
  58203. #ifdef WOLFSSL_KEIL
  58204. "adcs r2, r2, %[r]\n\t"
  58205. #elif defined(__clang__)
  58206. "adcs r2, %[r]\n\t"
  58207. #else
  58208. "adc r2, %[r]\n\t"
  58209. #endif
  58210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58211. "lsrs r5, %[a], #16\n\t"
  58212. #else
  58213. "lsr r5, %[a], #16\n\t"
  58214. #endif
  58215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58216. "lsrs r6, r7, #16\n\t"
  58217. #else
  58218. "lsr r6, r7, #16\n\t"
  58219. #endif
  58220. #ifdef WOLFSSL_KEIL
  58221. "muls r6, r5, r6\n\t"
  58222. #elif defined(__clang__)
  58223. "muls r6, r5\n\t"
  58224. #else
  58225. "mul r6, r5\n\t"
  58226. #endif
  58227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58228. "adds r4, r4, r6\n\t"
  58229. #else
  58230. "add r4, r4, r6\n\t"
  58231. #endif
  58232. #ifdef WOLFSSL_KEIL
  58233. "adcs r2, r2, %[r]\n\t"
  58234. #elif defined(__clang__)
  58235. "adcs r2, %[r]\n\t"
  58236. #else
  58237. "adc r2, %[r]\n\t"
  58238. #endif
  58239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58240. "adds r4, r4, r6\n\t"
  58241. #else
  58242. "add r4, r4, r6\n\t"
  58243. #endif
  58244. #ifdef WOLFSSL_KEIL
  58245. "adcs r2, r2, %[r]\n\t"
  58246. #elif defined(__clang__)
  58247. "adcs r2, %[r]\n\t"
  58248. #else
  58249. "adc r2, %[r]\n\t"
  58250. #endif
  58251. "uxth r6, r7\n\t"
  58252. #ifdef WOLFSSL_KEIL
  58253. "muls r5, r6, r5\n\t"
  58254. #elif defined(__clang__)
  58255. "muls r5, r6\n\t"
  58256. #else
  58257. "mul r5, r6\n\t"
  58258. #endif
  58259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58260. "lsrs r6, r5, #16\n\t"
  58261. #else
  58262. "lsr r6, r5, #16\n\t"
  58263. #endif
  58264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58265. "lsls r5, r5, #16\n\t"
  58266. #else
  58267. "lsl r5, r5, #16\n\t"
  58268. #endif
  58269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58270. "adds r3, r3, r5\n\t"
  58271. #else
  58272. "add r3, r3, r5\n\t"
  58273. #endif
  58274. #ifdef WOLFSSL_KEIL
  58275. "adcs r4, r4, r6\n\t"
  58276. #elif defined(__clang__)
  58277. "adcs r4, r6\n\t"
  58278. #else
  58279. "adc r4, r6\n\t"
  58280. #endif
  58281. #ifdef WOLFSSL_KEIL
  58282. "adcs r2, r2, %[r]\n\t"
  58283. #elif defined(__clang__)
  58284. "adcs r2, %[r]\n\t"
  58285. #else
  58286. "adc r2, %[r]\n\t"
  58287. #endif
  58288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58289. "adds r3, r3, r5\n\t"
  58290. #else
  58291. "add r3, r3, r5\n\t"
  58292. #endif
  58293. #ifdef WOLFSSL_KEIL
  58294. "adcs r4, r4, r6\n\t"
  58295. #elif defined(__clang__)
  58296. "adcs r4, r6\n\t"
  58297. #else
  58298. "adc r4, r6\n\t"
  58299. #endif
  58300. #ifdef WOLFSSL_KEIL
  58301. "adcs r2, r2, %[r]\n\t"
  58302. #elif defined(__clang__)
  58303. "adcs r2, %[r]\n\t"
  58304. #else
  58305. "adc r2, %[r]\n\t"
  58306. #endif
  58307. "# A[6] * A[1]\n\t"
  58308. "mov %[a], r9\n\t"
  58309. "mov r7, r11\n\t"
  58310. "ldr %[a], [%[a], #24]\n\t"
  58311. "uxth r5, %[a]\n\t"
  58312. "uxth r6, r7\n\t"
  58313. #ifdef WOLFSSL_KEIL
  58314. "muls r6, r5, r6\n\t"
  58315. #elif defined(__clang__)
  58316. "muls r6, r5\n\t"
  58317. #else
  58318. "mul r6, r5\n\t"
  58319. #endif
  58320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58321. "adds r3, r3, r6\n\t"
  58322. #else
  58323. "add r3, r3, r6\n\t"
  58324. #endif
  58325. #ifdef WOLFSSL_KEIL
  58326. "adcs r4, r4, %[r]\n\t"
  58327. #elif defined(__clang__)
  58328. "adcs r4, %[r]\n\t"
  58329. #else
  58330. "adc r4, %[r]\n\t"
  58331. #endif
  58332. #ifdef WOLFSSL_KEIL
  58333. "adcs r2, r2, %[r]\n\t"
  58334. #elif defined(__clang__)
  58335. "adcs r2, %[r]\n\t"
  58336. #else
  58337. "adc r2, %[r]\n\t"
  58338. #endif
  58339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58340. "adds r3, r3, r6\n\t"
  58341. #else
  58342. "add r3, r3, r6\n\t"
  58343. #endif
  58344. #ifdef WOLFSSL_KEIL
  58345. "adcs r4, r4, %[r]\n\t"
  58346. #elif defined(__clang__)
  58347. "adcs r4, %[r]\n\t"
  58348. #else
  58349. "adc r4, %[r]\n\t"
  58350. #endif
  58351. #ifdef WOLFSSL_KEIL
  58352. "adcs r2, r2, %[r]\n\t"
  58353. #elif defined(__clang__)
  58354. "adcs r2, %[r]\n\t"
  58355. #else
  58356. "adc r2, %[r]\n\t"
  58357. #endif
  58358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58359. "lsrs r6, r7, #16\n\t"
  58360. #else
  58361. "lsr r6, r7, #16\n\t"
  58362. #endif
  58363. #ifdef WOLFSSL_KEIL
  58364. "muls r5, r6, r5\n\t"
  58365. #elif defined(__clang__)
  58366. "muls r5, r6\n\t"
  58367. #else
  58368. "mul r5, r6\n\t"
  58369. #endif
  58370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58371. "lsrs r6, r5, #16\n\t"
  58372. #else
  58373. "lsr r6, r5, #16\n\t"
  58374. #endif
  58375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58376. "lsls r5, r5, #16\n\t"
  58377. #else
  58378. "lsl r5, r5, #16\n\t"
  58379. #endif
  58380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58381. "adds r3, r3, r5\n\t"
  58382. #else
  58383. "add r3, r3, r5\n\t"
  58384. #endif
  58385. #ifdef WOLFSSL_KEIL
  58386. "adcs r4, r4, r6\n\t"
  58387. #elif defined(__clang__)
  58388. "adcs r4, r6\n\t"
  58389. #else
  58390. "adc r4, r6\n\t"
  58391. #endif
  58392. #ifdef WOLFSSL_KEIL
  58393. "adcs r2, r2, %[r]\n\t"
  58394. #elif defined(__clang__)
  58395. "adcs r2, %[r]\n\t"
  58396. #else
  58397. "adc r2, %[r]\n\t"
  58398. #endif
  58399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58400. "adds r3, r3, r5\n\t"
  58401. #else
  58402. "add r3, r3, r5\n\t"
  58403. #endif
  58404. #ifdef WOLFSSL_KEIL
  58405. "adcs r4, r4, r6\n\t"
  58406. #elif defined(__clang__)
  58407. "adcs r4, r6\n\t"
  58408. #else
  58409. "adc r4, r6\n\t"
  58410. #endif
  58411. #ifdef WOLFSSL_KEIL
  58412. "adcs r2, r2, %[r]\n\t"
  58413. #elif defined(__clang__)
  58414. "adcs r2, %[r]\n\t"
  58415. #else
  58416. "adc r2, %[r]\n\t"
  58417. #endif
  58418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58419. "lsrs r5, %[a], #16\n\t"
  58420. #else
  58421. "lsr r5, %[a], #16\n\t"
  58422. #endif
  58423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58424. "lsrs r6, r7, #16\n\t"
  58425. #else
  58426. "lsr r6, r7, #16\n\t"
  58427. #endif
  58428. #ifdef WOLFSSL_KEIL
  58429. "muls r6, r5, r6\n\t"
  58430. #elif defined(__clang__)
  58431. "muls r6, r5\n\t"
  58432. #else
  58433. "mul r6, r5\n\t"
  58434. #endif
  58435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58436. "adds r4, r4, r6\n\t"
  58437. #else
  58438. "add r4, r4, r6\n\t"
  58439. #endif
  58440. #ifdef WOLFSSL_KEIL
  58441. "adcs r2, r2, %[r]\n\t"
  58442. #elif defined(__clang__)
  58443. "adcs r2, %[r]\n\t"
  58444. #else
  58445. "adc r2, %[r]\n\t"
  58446. #endif
  58447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58448. "adds r4, r4, r6\n\t"
  58449. #else
  58450. "add r4, r4, r6\n\t"
  58451. #endif
  58452. #ifdef WOLFSSL_KEIL
  58453. "adcs r2, r2, %[r]\n\t"
  58454. #elif defined(__clang__)
  58455. "adcs r2, %[r]\n\t"
  58456. #else
  58457. "adc r2, %[r]\n\t"
  58458. #endif
  58459. "uxth r6, r7\n\t"
  58460. #ifdef WOLFSSL_KEIL
  58461. "muls r5, r6, r5\n\t"
  58462. #elif defined(__clang__)
  58463. "muls r5, r6\n\t"
  58464. #else
  58465. "mul r5, r6\n\t"
  58466. #endif
  58467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58468. "lsrs r6, r5, #16\n\t"
  58469. #else
  58470. "lsr r6, r5, #16\n\t"
  58471. #endif
  58472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58473. "lsls r5, r5, #16\n\t"
  58474. #else
  58475. "lsl r5, r5, #16\n\t"
  58476. #endif
  58477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58478. "adds r3, r3, r5\n\t"
  58479. #else
  58480. "add r3, r3, r5\n\t"
  58481. #endif
  58482. #ifdef WOLFSSL_KEIL
  58483. "adcs r4, r4, r6\n\t"
  58484. #elif defined(__clang__)
  58485. "adcs r4, r6\n\t"
  58486. #else
  58487. "adc r4, r6\n\t"
  58488. #endif
  58489. #ifdef WOLFSSL_KEIL
  58490. "adcs r2, r2, %[r]\n\t"
  58491. #elif defined(__clang__)
  58492. "adcs r2, %[r]\n\t"
  58493. #else
  58494. "adc r2, %[r]\n\t"
  58495. #endif
  58496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58497. "adds r3, r3, r5\n\t"
  58498. #else
  58499. "add r3, r3, r5\n\t"
  58500. #endif
  58501. #ifdef WOLFSSL_KEIL
  58502. "adcs r4, r4, r6\n\t"
  58503. #elif defined(__clang__)
  58504. "adcs r4, r6\n\t"
  58505. #else
  58506. "adc r4, r6\n\t"
  58507. #endif
  58508. #ifdef WOLFSSL_KEIL
  58509. "adcs r2, r2, %[r]\n\t"
  58510. #elif defined(__clang__)
  58511. "adcs r2, %[r]\n\t"
  58512. #else
  58513. "adc r2, %[r]\n\t"
  58514. #endif
  58515. "# A[7] * A[0]\n\t"
  58516. "mov %[a], r9\n\t"
  58517. "mov r7, r10\n\t"
  58518. "ldr %[a], [%[a], #28]\n\t"
  58519. "uxth r5, %[a]\n\t"
  58520. "uxth r6, r7\n\t"
  58521. #ifdef WOLFSSL_KEIL
  58522. "muls r6, r5, r6\n\t"
  58523. #elif defined(__clang__)
  58524. "muls r6, r5\n\t"
  58525. #else
  58526. "mul r6, r5\n\t"
  58527. #endif
  58528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58529. "adds r3, r3, r6\n\t"
  58530. #else
  58531. "add r3, r3, r6\n\t"
  58532. #endif
  58533. #ifdef WOLFSSL_KEIL
  58534. "adcs r4, r4, %[r]\n\t"
  58535. #elif defined(__clang__)
  58536. "adcs r4, %[r]\n\t"
  58537. #else
  58538. "adc r4, %[r]\n\t"
  58539. #endif
  58540. #ifdef WOLFSSL_KEIL
  58541. "adcs r2, r2, %[r]\n\t"
  58542. #elif defined(__clang__)
  58543. "adcs r2, %[r]\n\t"
  58544. #else
  58545. "adc r2, %[r]\n\t"
  58546. #endif
  58547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58548. "adds r3, r3, r6\n\t"
  58549. #else
  58550. "add r3, r3, r6\n\t"
  58551. #endif
  58552. #ifdef WOLFSSL_KEIL
  58553. "adcs r4, r4, %[r]\n\t"
  58554. #elif defined(__clang__)
  58555. "adcs r4, %[r]\n\t"
  58556. #else
  58557. "adc r4, %[r]\n\t"
  58558. #endif
  58559. #ifdef WOLFSSL_KEIL
  58560. "adcs r2, r2, %[r]\n\t"
  58561. #elif defined(__clang__)
  58562. "adcs r2, %[r]\n\t"
  58563. #else
  58564. "adc r2, %[r]\n\t"
  58565. #endif
  58566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58567. "lsrs r6, r7, #16\n\t"
  58568. #else
  58569. "lsr r6, r7, #16\n\t"
  58570. #endif
  58571. #ifdef WOLFSSL_KEIL
  58572. "muls r5, r6, r5\n\t"
  58573. #elif defined(__clang__)
  58574. "muls r5, r6\n\t"
  58575. #else
  58576. "mul r5, r6\n\t"
  58577. #endif
  58578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58579. "lsrs r6, r5, #16\n\t"
  58580. #else
  58581. "lsr r6, r5, #16\n\t"
  58582. #endif
  58583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58584. "lsls r5, r5, #16\n\t"
  58585. #else
  58586. "lsl r5, r5, #16\n\t"
  58587. #endif
  58588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58589. "adds r3, r3, r5\n\t"
  58590. #else
  58591. "add r3, r3, r5\n\t"
  58592. #endif
  58593. #ifdef WOLFSSL_KEIL
  58594. "adcs r4, r4, r6\n\t"
  58595. #elif defined(__clang__)
  58596. "adcs r4, r6\n\t"
  58597. #else
  58598. "adc r4, r6\n\t"
  58599. #endif
  58600. #ifdef WOLFSSL_KEIL
  58601. "adcs r2, r2, %[r]\n\t"
  58602. #elif defined(__clang__)
  58603. "adcs r2, %[r]\n\t"
  58604. #else
  58605. "adc r2, %[r]\n\t"
  58606. #endif
  58607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58608. "adds r3, r3, r5\n\t"
  58609. #else
  58610. "add r3, r3, r5\n\t"
  58611. #endif
  58612. #ifdef WOLFSSL_KEIL
  58613. "adcs r4, r4, r6\n\t"
  58614. #elif defined(__clang__)
  58615. "adcs r4, r6\n\t"
  58616. #else
  58617. "adc r4, r6\n\t"
  58618. #endif
  58619. #ifdef WOLFSSL_KEIL
  58620. "adcs r2, r2, %[r]\n\t"
  58621. #elif defined(__clang__)
  58622. "adcs r2, %[r]\n\t"
  58623. #else
  58624. "adc r2, %[r]\n\t"
  58625. #endif
  58626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58627. "lsrs r5, %[a], #16\n\t"
  58628. #else
  58629. "lsr r5, %[a], #16\n\t"
  58630. #endif
  58631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58632. "lsrs r6, r7, #16\n\t"
  58633. #else
  58634. "lsr r6, r7, #16\n\t"
  58635. #endif
  58636. #ifdef WOLFSSL_KEIL
  58637. "muls r6, r5, r6\n\t"
  58638. #elif defined(__clang__)
  58639. "muls r6, r5\n\t"
  58640. #else
  58641. "mul r6, r5\n\t"
  58642. #endif
  58643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58644. "adds r4, r4, r6\n\t"
  58645. #else
  58646. "add r4, r4, r6\n\t"
  58647. #endif
  58648. #ifdef WOLFSSL_KEIL
  58649. "adcs r2, r2, %[r]\n\t"
  58650. #elif defined(__clang__)
  58651. "adcs r2, %[r]\n\t"
  58652. #else
  58653. "adc r2, %[r]\n\t"
  58654. #endif
  58655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58656. "adds r4, r4, r6\n\t"
  58657. #else
  58658. "add r4, r4, r6\n\t"
  58659. #endif
  58660. #ifdef WOLFSSL_KEIL
  58661. "adcs r2, r2, %[r]\n\t"
  58662. #elif defined(__clang__)
  58663. "adcs r2, %[r]\n\t"
  58664. #else
  58665. "adc r2, %[r]\n\t"
  58666. #endif
  58667. "uxth r6, r7\n\t"
  58668. #ifdef WOLFSSL_KEIL
  58669. "muls r5, r6, r5\n\t"
  58670. #elif defined(__clang__)
  58671. "muls r5, r6\n\t"
  58672. #else
  58673. "mul r5, r6\n\t"
  58674. #endif
  58675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58676. "lsrs r6, r5, #16\n\t"
  58677. #else
  58678. "lsr r6, r5, #16\n\t"
  58679. #endif
  58680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58681. "lsls r5, r5, #16\n\t"
  58682. #else
  58683. "lsl r5, r5, #16\n\t"
  58684. #endif
  58685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58686. "adds r3, r3, r5\n\t"
  58687. #else
  58688. "add r3, r3, r5\n\t"
  58689. #endif
  58690. #ifdef WOLFSSL_KEIL
  58691. "adcs r4, r4, r6\n\t"
  58692. #elif defined(__clang__)
  58693. "adcs r4, r6\n\t"
  58694. #else
  58695. "adc r4, r6\n\t"
  58696. #endif
  58697. #ifdef WOLFSSL_KEIL
  58698. "adcs r2, r2, %[r]\n\t"
  58699. #elif defined(__clang__)
  58700. "adcs r2, %[r]\n\t"
  58701. #else
  58702. "adc r2, %[r]\n\t"
  58703. #endif
  58704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58705. "adds r3, r3, r5\n\t"
  58706. #else
  58707. "add r3, r3, r5\n\t"
  58708. #endif
  58709. #ifdef WOLFSSL_KEIL
  58710. "adcs r4, r4, r6\n\t"
  58711. #elif defined(__clang__)
  58712. "adcs r4, r6\n\t"
  58713. #else
  58714. "adc r4, r6\n\t"
  58715. #endif
  58716. #ifdef WOLFSSL_KEIL
  58717. "adcs r2, r2, %[r]\n\t"
  58718. #elif defined(__clang__)
  58719. "adcs r2, %[r]\n\t"
  58720. #else
  58721. "adc r2, %[r]\n\t"
  58722. #endif
  58723. "str r3, [sp, #28]\n\t"
  58724. "# A[8] * A[0]\n\t"
  58725. "movs r3, #0\n\t"
  58726. "mov %[a], r9\n\t"
  58727. "ldr %[a], [%[a], #32]\n\t"
  58728. "uxth r5, %[a]\n\t"
  58729. "uxth r6, r7\n\t"
  58730. #ifdef WOLFSSL_KEIL
  58731. "muls r6, r5, r6\n\t"
  58732. #elif defined(__clang__)
  58733. "muls r6, r5\n\t"
  58734. #else
  58735. "mul r6, r5\n\t"
  58736. #endif
  58737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58738. "adds r4, r4, r6\n\t"
  58739. #else
  58740. "add r4, r4, r6\n\t"
  58741. #endif
  58742. #ifdef WOLFSSL_KEIL
  58743. "adcs r2, r2, %[r]\n\t"
  58744. #elif defined(__clang__)
  58745. "adcs r2, %[r]\n\t"
  58746. #else
  58747. "adc r2, %[r]\n\t"
  58748. #endif
  58749. #ifdef WOLFSSL_KEIL
  58750. "adcs r3, r3, %[r]\n\t"
  58751. #elif defined(__clang__)
  58752. "adcs r3, %[r]\n\t"
  58753. #else
  58754. "adc r3, %[r]\n\t"
  58755. #endif
  58756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58757. "adds r4, r4, r6\n\t"
  58758. #else
  58759. "add r4, r4, r6\n\t"
  58760. #endif
  58761. #ifdef WOLFSSL_KEIL
  58762. "adcs r2, r2, %[r]\n\t"
  58763. #elif defined(__clang__)
  58764. "adcs r2, %[r]\n\t"
  58765. #else
  58766. "adc r2, %[r]\n\t"
  58767. #endif
  58768. #ifdef WOLFSSL_KEIL
  58769. "adcs r3, r3, %[r]\n\t"
  58770. #elif defined(__clang__)
  58771. "adcs r3, %[r]\n\t"
  58772. #else
  58773. "adc r3, %[r]\n\t"
  58774. #endif
  58775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58776. "lsrs r6, r7, #16\n\t"
  58777. #else
  58778. "lsr r6, r7, #16\n\t"
  58779. #endif
  58780. #ifdef WOLFSSL_KEIL
  58781. "muls r5, r6, r5\n\t"
  58782. #elif defined(__clang__)
  58783. "muls r5, r6\n\t"
  58784. #else
  58785. "mul r5, r6\n\t"
  58786. #endif
  58787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58788. "lsrs r6, r5, #16\n\t"
  58789. #else
  58790. "lsr r6, r5, #16\n\t"
  58791. #endif
  58792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58793. "lsls r5, r5, #16\n\t"
  58794. #else
  58795. "lsl r5, r5, #16\n\t"
  58796. #endif
  58797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58798. "adds r4, r4, r5\n\t"
  58799. #else
  58800. "add r4, r4, r5\n\t"
  58801. #endif
  58802. #ifdef WOLFSSL_KEIL
  58803. "adcs r2, r2, r6\n\t"
  58804. #elif defined(__clang__)
  58805. "adcs r2, r6\n\t"
  58806. #else
  58807. "adc r2, r6\n\t"
  58808. #endif
  58809. #ifdef WOLFSSL_KEIL
  58810. "adcs r3, r3, %[r]\n\t"
  58811. #elif defined(__clang__)
  58812. "adcs r3, %[r]\n\t"
  58813. #else
  58814. "adc r3, %[r]\n\t"
  58815. #endif
  58816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58817. "adds r4, r4, r5\n\t"
  58818. #else
  58819. "add r4, r4, r5\n\t"
  58820. #endif
  58821. #ifdef WOLFSSL_KEIL
  58822. "adcs r2, r2, r6\n\t"
  58823. #elif defined(__clang__)
  58824. "adcs r2, r6\n\t"
  58825. #else
  58826. "adc r2, r6\n\t"
  58827. #endif
  58828. #ifdef WOLFSSL_KEIL
  58829. "adcs r3, r3, %[r]\n\t"
  58830. #elif defined(__clang__)
  58831. "adcs r3, %[r]\n\t"
  58832. #else
  58833. "adc r3, %[r]\n\t"
  58834. #endif
  58835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58836. "lsrs r5, %[a], #16\n\t"
  58837. #else
  58838. "lsr r5, %[a], #16\n\t"
  58839. #endif
  58840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58841. "lsrs r6, r7, #16\n\t"
  58842. #else
  58843. "lsr r6, r7, #16\n\t"
  58844. #endif
  58845. #ifdef WOLFSSL_KEIL
  58846. "muls r6, r5, r6\n\t"
  58847. #elif defined(__clang__)
  58848. "muls r6, r5\n\t"
  58849. #else
  58850. "mul r6, r5\n\t"
  58851. #endif
  58852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58853. "adds r2, r2, r6\n\t"
  58854. #else
  58855. "add r2, r2, r6\n\t"
  58856. #endif
  58857. #ifdef WOLFSSL_KEIL
  58858. "adcs r3, r3, %[r]\n\t"
  58859. #elif defined(__clang__)
  58860. "adcs r3, %[r]\n\t"
  58861. #else
  58862. "adc r3, %[r]\n\t"
  58863. #endif
  58864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58865. "adds r2, r2, r6\n\t"
  58866. #else
  58867. "add r2, r2, r6\n\t"
  58868. #endif
  58869. #ifdef WOLFSSL_KEIL
  58870. "adcs r3, r3, %[r]\n\t"
  58871. #elif defined(__clang__)
  58872. "adcs r3, %[r]\n\t"
  58873. #else
  58874. "adc r3, %[r]\n\t"
  58875. #endif
  58876. "uxth r6, r7\n\t"
  58877. #ifdef WOLFSSL_KEIL
  58878. "muls r5, r6, r5\n\t"
  58879. #elif defined(__clang__)
  58880. "muls r5, r6\n\t"
  58881. #else
  58882. "mul r5, r6\n\t"
  58883. #endif
  58884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58885. "lsrs r6, r5, #16\n\t"
  58886. #else
  58887. "lsr r6, r5, #16\n\t"
  58888. #endif
  58889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58890. "lsls r5, r5, #16\n\t"
  58891. #else
  58892. "lsl r5, r5, #16\n\t"
  58893. #endif
  58894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58895. "adds r4, r4, r5\n\t"
  58896. #else
  58897. "add r4, r4, r5\n\t"
  58898. #endif
  58899. #ifdef WOLFSSL_KEIL
  58900. "adcs r2, r2, r6\n\t"
  58901. #elif defined(__clang__)
  58902. "adcs r2, r6\n\t"
  58903. #else
  58904. "adc r2, r6\n\t"
  58905. #endif
  58906. #ifdef WOLFSSL_KEIL
  58907. "adcs r3, r3, %[r]\n\t"
  58908. #elif defined(__clang__)
  58909. "adcs r3, %[r]\n\t"
  58910. #else
  58911. "adc r3, %[r]\n\t"
  58912. #endif
  58913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58914. "adds r4, r4, r5\n\t"
  58915. #else
  58916. "add r4, r4, r5\n\t"
  58917. #endif
  58918. #ifdef WOLFSSL_KEIL
  58919. "adcs r2, r2, r6\n\t"
  58920. #elif defined(__clang__)
  58921. "adcs r2, r6\n\t"
  58922. #else
  58923. "adc r2, r6\n\t"
  58924. #endif
  58925. #ifdef WOLFSSL_KEIL
  58926. "adcs r3, r3, %[r]\n\t"
  58927. #elif defined(__clang__)
  58928. "adcs r3, %[r]\n\t"
  58929. #else
  58930. "adc r3, %[r]\n\t"
  58931. #endif
  58932. "# A[7] * A[1]\n\t"
  58933. "mov %[a], r9\n\t"
  58934. "mov r7, r11\n\t"
  58935. "ldr %[a], [%[a], #28]\n\t"
  58936. "uxth r5, %[a]\n\t"
  58937. "uxth r6, r7\n\t"
  58938. #ifdef WOLFSSL_KEIL
  58939. "muls r6, r5, r6\n\t"
  58940. #elif defined(__clang__)
  58941. "muls r6, r5\n\t"
  58942. #else
  58943. "mul r6, r5\n\t"
  58944. #endif
  58945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58946. "adds r4, r4, r6\n\t"
  58947. #else
  58948. "add r4, r4, r6\n\t"
  58949. #endif
  58950. #ifdef WOLFSSL_KEIL
  58951. "adcs r2, r2, %[r]\n\t"
  58952. #elif defined(__clang__)
  58953. "adcs r2, %[r]\n\t"
  58954. #else
  58955. "adc r2, %[r]\n\t"
  58956. #endif
  58957. #ifdef WOLFSSL_KEIL
  58958. "adcs r3, r3, %[r]\n\t"
  58959. #elif defined(__clang__)
  58960. "adcs r3, %[r]\n\t"
  58961. #else
  58962. "adc r3, %[r]\n\t"
  58963. #endif
  58964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58965. "adds r4, r4, r6\n\t"
  58966. #else
  58967. "add r4, r4, r6\n\t"
  58968. #endif
  58969. #ifdef WOLFSSL_KEIL
  58970. "adcs r2, r2, %[r]\n\t"
  58971. #elif defined(__clang__)
  58972. "adcs r2, %[r]\n\t"
  58973. #else
  58974. "adc r2, %[r]\n\t"
  58975. #endif
  58976. #ifdef WOLFSSL_KEIL
  58977. "adcs r3, r3, %[r]\n\t"
  58978. #elif defined(__clang__)
  58979. "adcs r3, %[r]\n\t"
  58980. #else
  58981. "adc r3, %[r]\n\t"
  58982. #endif
  58983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58984. "lsrs r6, r7, #16\n\t"
  58985. #else
  58986. "lsr r6, r7, #16\n\t"
  58987. #endif
  58988. #ifdef WOLFSSL_KEIL
  58989. "muls r5, r6, r5\n\t"
  58990. #elif defined(__clang__)
  58991. "muls r5, r6\n\t"
  58992. #else
  58993. "mul r5, r6\n\t"
  58994. #endif
  58995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  58996. "lsrs r6, r5, #16\n\t"
  58997. #else
  58998. "lsr r6, r5, #16\n\t"
  58999. #endif
  59000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59001. "lsls r5, r5, #16\n\t"
  59002. #else
  59003. "lsl r5, r5, #16\n\t"
  59004. #endif
  59005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59006. "adds r4, r4, r5\n\t"
  59007. #else
  59008. "add r4, r4, r5\n\t"
  59009. #endif
  59010. #ifdef WOLFSSL_KEIL
  59011. "adcs r2, r2, r6\n\t"
  59012. #elif defined(__clang__)
  59013. "adcs r2, r6\n\t"
  59014. #else
  59015. "adc r2, r6\n\t"
  59016. #endif
  59017. #ifdef WOLFSSL_KEIL
  59018. "adcs r3, r3, %[r]\n\t"
  59019. #elif defined(__clang__)
  59020. "adcs r3, %[r]\n\t"
  59021. #else
  59022. "adc r3, %[r]\n\t"
  59023. #endif
  59024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59025. "adds r4, r4, r5\n\t"
  59026. #else
  59027. "add r4, r4, r5\n\t"
  59028. #endif
  59029. #ifdef WOLFSSL_KEIL
  59030. "adcs r2, r2, r6\n\t"
  59031. #elif defined(__clang__)
  59032. "adcs r2, r6\n\t"
  59033. #else
  59034. "adc r2, r6\n\t"
  59035. #endif
  59036. #ifdef WOLFSSL_KEIL
  59037. "adcs r3, r3, %[r]\n\t"
  59038. #elif defined(__clang__)
  59039. "adcs r3, %[r]\n\t"
  59040. #else
  59041. "adc r3, %[r]\n\t"
  59042. #endif
  59043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59044. "lsrs r5, %[a], #16\n\t"
  59045. #else
  59046. "lsr r5, %[a], #16\n\t"
  59047. #endif
  59048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59049. "lsrs r6, r7, #16\n\t"
  59050. #else
  59051. "lsr r6, r7, #16\n\t"
  59052. #endif
  59053. #ifdef WOLFSSL_KEIL
  59054. "muls r6, r5, r6\n\t"
  59055. #elif defined(__clang__)
  59056. "muls r6, r5\n\t"
  59057. #else
  59058. "mul r6, r5\n\t"
  59059. #endif
  59060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59061. "adds r2, r2, r6\n\t"
  59062. #else
  59063. "add r2, r2, r6\n\t"
  59064. #endif
  59065. #ifdef WOLFSSL_KEIL
  59066. "adcs r3, r3, %[r]\n\t"
  59067. #elif defined(__clang__)
  59068. "adcs r3, %[r]\n\t"
  59069. #else
  59070. "adc r3, %[r]\n\t"
  59071. #endif
  59072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59073. "adds r2, r2, r6\n\t"
  59074. #else
  59075. "add r2, r2, r6\n\t"
  59076. #endif
  59077. #ifdef WOLFSSL_KEIL
  59078. "adcs r3, r3, %[r]\n\t"
  59079. #elif defined(__clang__)
  59080. "adcs r3, %[r]\n\t"
  59081. #else
  59082. "adc r3, %[r]\n\t"
  59083. #endif
  59084. "uxth r6, r7\n\t"
  59085. #ifdef WOLFSSL_KEIL
  59086. "muls r5, r6, r5\n\t"
  59087. #elif defined(__clang__)
  59088. "muls r5, r6\n\t"
  59089. #else
  59090. "mul r5, r6\n\t"
  59091. #endif
  59092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59093. "lsrs r6, r5, #16\n\t"
  59094. #else
  59095. "lsr r6, r5, #16\n\t"
  59096. #endif
  59097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59098. "lsls r5, r5, #16\n\t"
  59099. #else
  59100. "lsl r5, r5, #16\n\t"
  59101. #endif
  59102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59103. "adds r4, r4, r5\n\t"
  59104. #else
  59105. "add r4, r4, r5\n\t"
  59106. #endif
  59107. #ifdef WOLFSSL_KEIL
  59108. "adcs r2, r2, r6\n\t"
  59109. #elif defined(__clang__)
  59110. "adcs r2, r6\n\t"
  59111. #else
  59112. "adc r2, r6\n\t"
  59113. #endif
  59114. #ifdef WOLFSSL_KEIL
  59115. "adcs r3, r3, %[r]\n\t"
  59116. #elif defined(__clang__)
  59117. "adcs r3, %[r]\n\t"
  59118. #else
  59119. "adc r3, %[r]\n\t"
  59120. #endif
  59121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59122. "adds r4, r4, r5\n\t"
  59123. #else
  59124. "add r4, r4, r5\n\t"
  59125. #endif
  59126. #ifdef WOLFSSL_KEIL
  59127. "adcs r2, r2, r6\n\t"
  59128. #elif defined(__clang__)
  59129. "adcs r2, r6\n\t"
  59130. #else
  59131. "adc r2, r6\n\t"
  59132. #endif
  59133. #ifdef WOLFSSL_KEIL
  59134. "adcs r3, r3, %[r]\n\t"
  59135. #elif defined(__clang__)
  59136. "adcs r3, %[r]\n\t"
  59137. #else
  59138. "adc r3, %[r]\n\t"
  59139. #endif
  59140. "# A[6] * A[2]\n\t"
  59141. "mov %[a], r9\n\t"
  59142. "mov r7, r12\n\t"
  59143. "ldr %[a], [%[a], #24]\n\t"
  59144. "uxth r5, %[a]\n\t"
  59145. "uxth r6, r7\n\t"
  59146. #ifdef WOLFSSL_KEIL
  59147. "muls r6, r5, r6\n\t"
  59148. #elif defined(__clang__)
  59149. "muls r6, r5\n\t"
  59150. #else
  59151. "mul r6, r5\n\t"
  59152. #endif
  59153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59154. "adds r4, r4, r6\n\t"
  59155. #else
  59156. "add r4, r4, r6\n\t"
  59157. #endif
  59158. #ifdef WOLFSSL_KEIL
  59159. "adcs r2, r2, %[r]\n\t"
  59160. #elif defined(__clang__)
  59161. "adcs r2, %[r]\n\t"
  59162. #else
  59163. "adc r2, %[r]\n\t"
  59164. #endif
  59165. #ifdef WOLFSSL_KEIL
  59166. "adcs r3, r3, %[r]\n\t"
  59167. #elif defined(__clang__)
  59168. "adcs r3, %[r]\n\t"
  59169. #else
  59170. "adc r3, %[r]\n\t"
  59171. #endif
  59172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59173. "adds r4, r4, r6\n\t"
  59174. #else
  59175. "add r4, r4, r6\n\t"
  59176. #endif
  59177. #ifdef WOLFSSL_KEIL
  59178. "adcs r2, r2, %[r]\n\t"
  59179. #elif defined(__clang__)
  59180. "adcs r2, %[r]\n\t"
  59181. #else
  59182. "adc r2, %[r]\n\t"
  59183. #endif
  59184. #ifdef WOLFSSL_KEIL
  59185. "adcs r3, r3, %[r]\n\t"
  59186. #elif defined(__clang__)
  59187. "adcs r3, %[r]\n\t"
  59188. #else
  59189. "adc r3, %[r]\n\t"
  59190. #endif
  59191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59192. "lsrs r6, r7, #16\n\t"
  59193. #else
  59194. "lsr r6, r7, #16\n\t"
  59195. #endif
  59196. #ifdef WOLFSSL_KEIL
  59197. "muls r5, r6, r5\n\t"
  59198. #elif defined(__clang__)
  59199. "muls r5, r6\n\t"
  59200. #else
  59201. "mul r5, r6\n\t"
  59202. #endif
  59203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59204. "lsrs r6, r5, #16\n\t"
  59205. #else
  59206. "lsr r6, r5, #16\n\t"
  59207. #endif
  59208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59209. "lsls r5, r5, #16\n\t"
  59210. #else
  59211. "lsl r5, r5, #16\n\t"
  59212. #endif
  59213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59214. "adds r4, r4, r5\n\t"
  59215. #else
  59216. "add r4, r4, r5\n\t"
  59217. #endif
  59218. #ifdef WOLFSSL_KEIL
  59219. "adcs r2, r2, r6\n\t"
  59220. #elif defined(__clang__)
  59221. "adcs r2, r6\n\t"
  59222. #else
  59223. "adc r2, r6\n\t"
  59224. #endif
  59225. #ifdef WOLFSSL_KEIL
  59226. "adcs r3, r3, %[r]\n\t"
  59227. #elif defined(__clang__)
  59228. "adcs r3, %[r]\n\t"
  59229. #else
  59230. "adc r3, %[r]\n\t"
  59231. #endif
  59232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59233. "adds r4, r4, r5\n\t"
  59234. #else
  59235. "add r4, r4, r5\n\t"
  59236. #endif
  59237. #ifdef WOLFSSL_KEIL
  59238. "adcs r2, r2, r6\n\t"
  59239. #elif defined(__clang__)
  59240. "adcs r2, r6\n\t"
  59241. #else
  59242. "adc r2, r6\n\t"
  59243. #endif
  59244. #ifdef WOLFSSL_KEIL
  59245. "adcs r3, r3, %[r]\n\t"
  59246. #elif defined(__clang__)
  59247. "adcs r3, %[r]\n\t"
  59248. #else
  59249. "adc r3, %[r]\n\t"
  59250. #endif
  59251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59252. "lsrs r5, %[a], #16\n\t"
  59253. #else
  59254. "lsr r5, %[a], #16\n\t"
  59255. #endif
  59256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59257. "lsrs r6, r7, #16\n\t"
  59258. #else
  59259. "lsr r6, r7, #16\n\t"
  59260. #endif
  59261. #ifdef WOLFSSL_KEIL
  59262. "muls r6, r5, r6\n\t"
  59263. #elif defined(__clang__)
  59264. "muls r6, r5\n\t"
  59265. #else
  59266. "mul r6, r5\n\t"
  59267. #endif
  59268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59269. "adds r2, r2, r6\n\t"
  59270. #else
  59271. "add r2, r2, r6\n\t"
  59272. #endif
  59273. #ifdef WOLFSSL_KEIL
  59274. "adcs r3, r3, %[r]\n\t"
  59275. #elif defined(__clang__)
  59276. "adcs r3, %[r]\n\t"
  59277. #else
  59278. "adc r3, %[r]\n\t"
  59279. #endif
  59280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59281. "adds r2, r2, r6\n\t"
  59282. #else
  59283. "add r2, r2, r6\n\t"
  59284. #endif
  59285. #ifdef WOLFSSL_KEIL
  59286. "adcs r3, r3, %[r]\n\t"
  59287. #elif defined(__clang__)
  59288. "adcs r3, %[r]\n\t"
  59289. #else
  59290. "adc r3, %[r]\n\t"
  59291. #endif
  59292. "uxth r6, r7\n\t"
  59293. #ifdef WOLFSSL_KEIL
  59294. "muls r5, r6, r5\n\t"
  59295. #elif defined(__clang__)
  59296. "muls r5, r6\n\t"
  59297. #else
  59298. "mul r5, r6\n\t"
  59299. #endif
  59300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59301. "lsrs r6, r5, #16\n\t"
  59302. #else
  59303. "lsr r6, r5, #16\n\t"
  59304. #endif
  59305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59306. "lsls r5, r5, #16\n\t"
  59307. #else
  59308. "lsl r5, r5, #16\n\t"
  59309. #endif
  59310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59311. "adds r4, r4, r5\n\t"
  59312. #else
  59313. "add r4, r4, r5\n\t"
  59314. #endif
  59315. #ifdef WOLFSSL_KEIL
  59316. "adcs r2, r2, r6\n\t"
  59317. #elif defined(__clang__)
  59318. "adcs r2, r6\n\t"
  59319. #else
  59320. "adc r2, r6\n\t"
  59321. #endif
  59322. #ifdef WOLFSSL_KEIL
  59323. "adcs r3, r3, %[r]\n\t"
  59324. #elif defined(__clang__)
  59325. "adcs r3, %[r]\n\t"
  59326. #else
  59327. "adc r3, %[r]\n\t"
  59328. #endif
  59329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59330. "adds r4, r4, r5\n\t"
  59331. #else
  59332. "add r4, r4, r5\n\t"
  59333. #endif
  59334. #ifdef WOLFSSL_KEIL
  59335. "adcs r2, r2, r6\n\t"
  59336. #elif defined(__clang__)
  59337. "adcs r2, r6\n\t"
  59338. #else
  59339. "adc r2, r6\n\t"
  59340. #endif
  59341. #ifdef WOLFSSL_KEIL
  59342. "adcs r3, r3, %[r]\n\t"
  59343. #elif defined(__clang__)
  59344. "adcs r3, %[r]\n\t"
  59345. #else
  59346. "adc r3, %[r]\n\t"
  59347. #endif
  59348. "# A[5] * A[3]\n\t"
  59349. "mov %[a], r9\n\t"
  59350. "mov r7, lr\n\t"
  59351. "ldr %[a], [%[a], #20]\n\t"
  59352. "uxth r5, %[a]\n\t"
  59353. "uxth r6, r7\n\t"
  59354. #ifdef WOLFSSL_KEIL
  59355. "muls r6, r5, r6\n\t"
  59356. #elif defined(__clang__)
  59357. "muls r6, r5\n\t"
  59358. #else
  59359. "mul r6, r5\n\t"
  59360. #endif
  59361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59362. "adds r4, r4, r6\n\t"
  59363. #else
  59364. "add r4, r4, r6\n\t"
  59365. #endif
  59366. #ifdef WOLFSSL_KEIL
  59367. "adcs r2, r2, %[r]\n\t"
  59368. #elif defined(__clang__)
  59369. "adcs r2, %[r]\n\t"
  59370. #else
  59371. "adc r2, %[r]\n\t"
  59372. #endif
  59373. #ifdef WOLFSSL_KEIL
  59374. "adcs r3, r3, %[r]\n\t"
  59375. #elif defined(__clang__)
  59376. "adcs r3, %[r]\n\t"
  59377. #else
  59378. "adc r3, %[r]\n\t"
  59379. #endif
  59380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59381. "adds r4, r4, r6\n\t"
  59382. #else
  59383. "add r4, r4, r6\n\t"
  59384. #endif
  59385. #ifdef WOLFSSL_KEIL
  59386. "adcs r2, r2, %[r]\n\t"
  59387. #elif defined(__clang__)
  59388. "adcs r2, %[r]\n\t"
  59389. #else
  59390. "adc r2, %[r]\n\t"
  59391. #endif
  59392. #ifdef WOLFSSL_KEIL
  59393. "adcs r3, r3, %[r]\n\t"
  59394. #elif defined(__clang__)
  59395. "adcs r3, %[r]\n\t"
  59396. #else
  59397. "adc r3, %[r]\n\t"
  59398. #endif
  59399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59400. "lsrs r6, r7, #16\n\t"
  59401. #else
  59402. "lsr r6, r7, #16\n\t"
  59403. #endif
  59404. #ifdef WOLFSSL_KEIL
  59405. "muls r5, r6, r5\n\t"
  59406. #elif defined(__clang__)
  59407. "muls r5, r6\n\t"
  59408. #else
  59409. "mul r5, r6\n\t"
  59410. #endif
  59411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59412. "lsrs r6, r5, #16\n\t"
  59413. #else
  59414. "lsr r6, r5, #16\n\t"
  59415. #endif
  59416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59417. "lsls r5, r5, #16\n\t"
  59418. #else
  59419. "lsl r5, r5, #16\n\t"
  59420. #endif
  59421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59422. "adds r4, r4, r5\n\t"
  59423. #else
  59424. "add r4, r4, r5\n\t"
  59425. #endif
  59426. #ifdef WOLFSSL_KEIL
  59427. "adcs r2, r2, r6\n\t"
  59428. #elif defined(__clang__)
  59429. "adcs r2, r6\n\t"
  59430. #else
  59431. "adc r2, r6\n\t"
  59432. #endif
  59433. #ifdef WOLFSSL_KEIL
  59434. "adcs r3, r3, %[r]\n\t"
  59435. #elif defined(__clang__)
  59436. "adcs r3, %[r]\n\t"
  59437. #else
  59438. "adc r3, %[r]\n\t"
  59439. #endif
  59440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59441. "adds r4, r4, r5\n\t"
  59442. #else
  59443. "add r4, r4, r5\n\t"
  59444. #endif
  59445. #ifdef WOLFSSL_KEIL
  59446. "adcs r2, r2, r6\n\t"
  59447. #elif defined(__clang__)
  59448. "adcs r2, r6\n\t"
  59449. #else
  59450. "adc r2, r6\n\t"
  59451. #endif
  59452. #ifdef WOLFSSL_KEIL
  59453. "adcs r3, r3, %[r]\n\t"
  59454. #elif defined(__clang__)
  59455. "adcs r3, %[r]\n\t"
  59456. #else
  59457. "adc r3, %[r]\n\t"
  59458. #endif
  59459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59460. "lsrs r5, %[a], #16\n\t"
  59461. #else
  59462. "lsr r5, %[a], #16\n\t"
  59463. #endif
  59464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59465. "lsrs r6, r7, #16\n\t"
  59466. #else
  59467. "lsr r6, r7, #16\n\t"
  59468. #endif
  59469. #ifdef WOLFSSL_KEIL
  59470. "muls r6, r5, r6\n\t"
  59471. #elif defined(__clang__)
  59472. "muls r6, r5\n\t"
  59473. #else
  59474. "mul r6, r5\n\t"
  59475. #endif
  59476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59477. "adds r2, r2, r6\n\t"
  59478. #else
  59479. "add r2, r2, r6\n\t"
  59480. #endif
  59481. #ifdef WOLFSSL_KEIL
  59482. "adcs r3, r3, %[r]\n\t"
  59483. #elif defined(__clang__)
  59484. "adcs r3, %[r]\n\t"
  59485. #else
  59486. "adc r3, %[r]\n\t"
  59487. #endif
  59488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59489. "adds r2, r2, r6\n\t"
  59490. #else
  59491. "add r2, r2, r6\n\t"
  59492. #endif
  59493. #ifdef WOLFSSL_KEIL
  59494. "adcs r3, r3, %[r]\n\t"
  59495. #elif defined(__clang__)
  59496. "adcs r3, %[r]\n\t"
  59497. #else
  59498. "adc r3, %[r]\n\t"
  59499. #endif
  59500. "uxth r6, r7\n\t"
  59501. #ifdef WOLFSSL_KEIL
  59502. "muls r5, r6, r5\n\t"
  59503. #elif defined(__clang__)
  59504. "muls r5, r6\n\t"
  59505. #else
  59506. "mul r5, r6\n\t"
  59507. #endif
  59508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59509. "lsrs r6, r5, #16\n\t"
  59510. #else
  59511. "lsr r6, r5, #16\n\t"
  59512. #endif
  59513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59514. "lsls r5, r5, #16\n\t"
  59515. #else
  59516. "lsl r5, r5, #16\n\t"
  59517. #endif
  59518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59519. "adds r4, r4, r5\n\t"
  59520. #else
  59521. "add r4, r4, r5\n\t"
  59522. #endif
  59523. #ifdef WOLFSSL_KEIL
  59524. "adcs r2, r2, r6\n\t"
  59525. #elif defined(__clang__)
  59526. "adcs r2, r6\n\t"
  59527. #else
  59528. "adc r2, r6\n\t"
  59529. #endif
  59530. #ifdef WOLFSSL_KEIL
  59531. "adcs r3, r3, %[r]\n\t"
  59532. #elif defined(__clang__)
  59533. "adcs r3, %[r]\n\t"
  59534. #else
  59535. "adc r3, %[r]\n\t"
  59536. #endif
  59537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59538. "adds r4, r4, r5\n\t"
  59539. #else
  59540. "add r4, r4, r5\n\t"
  59541. #endif
  59542. #ifdef WOLFSSL_KEIL
  59543. "adcs r2, r2, r6\n\t"
  59544. #elif defined(__clang__)
  59545. "adcs r2, r6\n\t"
  59546. #else
  59547. "adc r2, r6\n\t"
  59548. #endif
  59549. #ifdef WOLFSSL_KEIL
  59550. "adcs r3, r3, %[r]\n\t"
  59551. #elif defined(__clang__)
  59552. "adcs r3, %[r]\n\t"
  59553. #else
  59554. "adc r3, %[r]\n\t"
  59555. #endif
  59556. "# A[4] * A[4]\n\t"
  59557. "mov %[a], r9\n\t"
  59558. "ldr r7, [%[a], #16]\n\t"
  59559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59560. "lsrs r6, r7, #16\n\t"
  59561. #else
  59562. "lsr r6, r7, #16\n\t"
  59563. #endif
  59564. "uxth r5, r7\n\t"
  59565. #ifdef WOLFSSL_KEIL
  59566. "muls r5, r5, r5\n\t"
  59567. #elif defined(__clang__)
  59568. "muls r5, r5\n\t"
  59569. #else
  59570. "mul r5, r5\n\t"
  59571. #endif
  59572. #ifdef WOLFSSL_KEIL
  59573. "muls r6, r6, r6\n\t"
  59574. #elif defined(__clang__)
  59575. "muls r6, r6\n\t"
  59576. #else
  59577. "mul r6, r6\n\t"
  59578. #endif
  59579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59580. "adds r4, r4, r5\n\t"
  59581. #else
  59582. "add r4, r4, r5\n\t"
  59583. #endif
  59584. #ifdef WOLFSSL_KEIL
  59585. "adcs r2, r2, r6\n\t"
  59586. #elif defined(__clang__)
  59587. "adcs r2, r6\n\t"
  59588. #else
  59589. "adc r2, r6\n\t"
  59590. #endif
  59591. #ifdef WOLFSSL_KEIL
  59592. "adcs r3, r3, %[r]\n\t"
  59593. #elif defined(__clang__)
  59594. "adcs r3, %[r]\n\t"
  59595. #else
  59596. "adc r3, %[r]\n\t"
  59597. #endif
  59598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59599. "lsrs r6, r7, #16\n\t"
  59600. #else
  59601. "lsr r6, r7, #16\n\t"
  59602. #endif
  59603. "uxth r5, r7\n\t"
  59604. #ifdef WOLFSSL_KEIL
  59605. "muls r5, r6, r5\n\t"
  59606. #elif defined(__clang__)
  59607. "muls r5, r6\n\t"
  59608. #else
  59609. "mul r5, r6\n\t"
  59610. #endif
  59611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59612. "lsrs r6, r5, #15\n\t"
  59613. #else
  59614. "lsr r6, r5, #15\n\t"
  59615. #endif
  59616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59617. "lsls r5, r5, #17\n\t"
  59618. #else
  59619. "lsl r5, r5, #17\n\t"
  59620. #endif
  59621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59622. "adds r4, r4, r5\n\t"
  59623. #else
  59624. "add r4, r4, r5\n\t"
  59625. #endif
  59626. #ifdef WOLFSSL_KEIL
  59627. "adcs r2, r2, r6\n\t"
  59628. #elif defined(__clang__)
  59629. "adcs r2, r6\n\t"
  59630. #else
  59631. "adc r2, r6\n\t"
  59632. #endif
  59633. #ifdef WOLFSSL_KEIL
  59634. "adcs r3, r3, %[r]\n\t"
  59635. #elif defined(__clang__)
  59636. "adcs r3, %[r]\n\t"
  59637. #else
  59638. "adc r3, %[r]\n\t"
  59639. #endif
  59640. "str r4, [sp, #32]\n\t"
  59641. "# A[5] * A[4]\n\t"
  59642. "movs r4, #0\n\t"
  59643. "ldr %[a], [%[a], #20]\n\t"
  59644. "uxth r5, %[a]\n\t"
  59645. "uxth r6, r7\n\t"
  59646. #ifdef WOLFSSL_KEIL
  59647. "muls r6, r5, r6\n\t"
  59648. #elif defined(__clang__)
  59649. "muls r6, r5\n\t"
  59650. #else
  59651. "mul r6, r5\n\t"
  59652. #endif
  59653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59654. "adds r2, r2, r6\n\t"
  59655. #else
  59656. "add r2, r2, r6\n\t"
  59657. #endif
  59658. #ifdef WOLFSSL_KEIL
  59659. "adcs r3, r3, %[r]\n\t"
  59660. #elif defined(__clang__)
  59661. "adcs r3, %[r]\n\t"
  59662. #else
  59663. "adc r3, %[r]\n\t"
  59664. #endif
  59665. #ifdef WOLFSSL_KEIL
  59666. "adcs r4, r4, %[r]\n\t"
  59667. #elif defined(__clang__)
  59668. "adcs r4, %[r]\n\t"
  59669. #else
  59670. "adc r4, %[r]\n\t"
  59671. #endif
  59672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59673. "adds r2, r2, r6\n\t"
  59674. #else
  59675. "add r2, r2, r6\n\t"
  59676. #endif
  59677. #ifdef WOLFSSL_KEIL
  59678. "adcs r3, r3, %[r]\n\t"
  59679. #elif defined(__clang__)
  59680. "adcs r3, %[r]\n\t"
  59681. #else
  59682. "adc r3, %[r]\n\t"
  59683. #endif
  59684. #ifdef WOLFSSL_KEIL
  59685. "adcs r4, r4, %[r]\n\t"
  59686. #elif defined(__clang__)
  59687. "adcs r4, %[r]\n\t"
  59688. #else
  59689. "adc r4, %[r]\n\t"
  59690. #endif
  59691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59692. "lsrs r6, r7, #16\n\t"
  59693. #else
  59694. "lsr r6, r7, #16\n\t"
  59695. #endif
  59696. #ifdef WOLFSSL_KEIL
  59697. "muls r5, r6, r5\n\t"
  59698. #elif defined(__clang__)
  59699. "muls r5, r6\n\t"
  59700. #else
  59701. "mul r5, r6\n\t"
  59702. #endif
  59703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59704. "lsrs r6, r5, #16\n\t"
  59705. #else
  59706. "lsr r6, r5, #16\n\t"
  59707. #endif
  59708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59709. "lsls r5, r5, #16\n\t"
  59710. #else
  59711. "lsl r5, r5, #16\n\t"
  59712. #endif
  59713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59714. "adds r2, r2, r5\n\t"
  59715. #else
  59716. "add r2, r2, r5\n\t"
  59717. #endif
  59718. #ifdef WOLFSSL_KEIL
  59719. "adcs r3, r3, r6\n\t"
  59720. #elif defined(__clang__)
  59721. "adcs r3, r6\n\t"
  59722. #else
  59723. "adc r3, r6\n\t"
  59724. #endif
  59725. #ifdef WOLFSSL_KEIL
  59726. "adcs r4, r4, %[r]\n\t"
  59727. #elif defined(__clang__)
  59728. "adcs r4, %[r]\n\t"
  59729. #else
  59730. "adc r4, %[r]\n\t"
  59731. #endif
  59732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59733. "adds r2, r2, r5\n\t"
  59734. #else
  59735. "add r2, r2, r5\n\t"
  59736. #endif
  59737. #ifdef WOLFSSL_KEIL
  59738. "adcs r3, r3, r6\n\t"
  59739. #elif defined(__clang__)
  59740. "adcs r3, r6\n\t"
  59741. #else
  59742. "adc r3, r6\n\t"
  59743. #endif
  59744. #ifdef WOLFSSL_KEIL
  59745. "adcs r4, r4, %[r]\n\t"
  59746. #elif defined(__clang__)
  59747. "adcs r4, %[r]\n\t"
  59748. #else
  59749. "adc r4, %[r]\n\t"
  59750. #endif
  59751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59752. "lsrs r5, %[a], #16\n\t"
  59753. #else
  59754. "lsr r5, %[a], #16\n\t"
  59755. #endif
  59756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59757. "lsrs r6, r7, #16\n\t"
  59758. #else
  59759. "lsr r6, r7, #16\n\t"
  59760. #endif
  59761. #ifdef WOLFSSL_KEIL
  59762. "muls r6, r5, r6\n\t"
  59763. #elif defined(__clang__)
  59764. "muls r6, r5\n\t"
  59765. #else
  59766. "mul r6, r5\n\t"
  59767. #endif
  59768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59769. "adds r3, r3, r6\n\t"
  59770. #else
  59771. "add r3, r3, r6\n\t"
  59772. #endif
  59773. #ifdef WOLFSSL_KEIL
  59774. "adcs r4, r4, %[r]\n\t"
  59775. #elif defined(__clang__)
  59776. "adcs r4, %[r]\n\t"
  59777. #else
  59778. "adc r4, %[r]\n\t"
  59779. #endif
  59780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59781. "adds r3, r3, r6\n\t"
  59782. #else
  59783. "add r3, r3, r6\n\t"
  59784. #endif
  59785. #ifdef WOLFSSL_KEIL
  59786. "adcs r4, r4, %[r]\n\t"
  59787. #elif defined(__clang__)
  59788. "adcs r4, %[r]\n\t"
  59789. #else
  59790. "adc r4, %[r]\n\t"
  59791. #endif
  59792. "uxth r6, r7\n\t"
  59793. #ifdef WOLFSSL_KEIL
  59794. "muls r5, r6, r5\n\t"
  59795. #elif defined(__clang__)
  59796. "muls r5, r6\n\t"
  59797. #else
  59798. "mul r5, r6\n\t"
  59799. #endif
  59800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59801. "lsrs r6, r5, #16\n\t"
  59802. #else
  59803. "lsr r6, r5, #16\n\t"
  59804. #endif
  59805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59806. "lsls r5, r5, #16\n\t"
  59807. #else
  59808. "lsl r5, r5, #16\n\t"
  59809. #endif
  59810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59811. "adds r2, r2, r5\n\t"
  59812. #else
  59813. "add r2, r2, r5\n\t"
  59814. #endif
  59815. #ifdef WOLFSSL_KEIL
  59816. "adcs r3, r3, r6\n\t"
  59817. #elif defined(__clang__)
  59818. "adcs r3, r6\n\t"
  59819. #else
  59820. "adc r3, r6\n\t"
  59821. #endif
  59822. #ifdef WOLFSSL_KEIL
  59823. "adcs r4, r4, %[r]\n\t"
  59824. #elif defined(__clang__)
  59825. "adcs r4, %[r]\n\t"
  59826. #else
  59827. "adc r4, %[r]\n\t"
  59828. #endif
  59829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59830. "adds r2, r2, r5\n\t"
  59831. #else
  59832. "add r2, r2, r5\n\t"
  59833. #endif
  59834. #ifdef WOLFSSL_KEIL
  59835. "adcs r3, r3, r6\n\t"
  59836. #elif defined(__clang__)
  59837. "adcs r3, r6\n\t"
  59838. #else
  59839. "adc r3, r6\n\t"
  59840. #endif
  59841. #ifdef WOLFSSL_KEIL
  59842. "adcs r4, r4, %[r]\n\t"
  59843. #elif defined(__clang__)
  59844. "adcs r4, %[r]\n\t"
  59845. #else
  59846. "adc r4, %[r]\n\t"
  59847. #endif
  59848. "# A[6] * A[3]\n\t"
  59849. "mov %[a], r9\n\t"
  59850. "mov r7, lr\n\t"
  59851. "ldr %[a], [%[a], #24]\n\t"
  59852. "uxth r5, %[a]\n\t"
  59853. "uxth r6, r7\n\t"
  59854. #ifdef WOLFSSL_KEIL
  59855. "muls r6, r5, r6\n\t"
  59856. #elif defined(__clang__)
  59857. "muls r6, r5\n\t"
  59858. #else
  59859. "mul r6, r5\n\t"
  59860. #endif
  59861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59862. "adds r2, r2, r6\n\t"
  59863. #else
  59864. "add r2, r2, r6\n\t"
  59865. #endif
  59866. #ifdef WOLFSSL_KEIL
  59867. "adcs r3, r3, %[r]\n\t"
  59868. #elif defined(__clang__)
  59869. "adcs r3, %[r]\n\t"
  59870. #else
  59871. "adc r3, %[r]\n\t"
  59872. #endif
  59873. #ifdef WOLFSSL_KEIL
  59874. "adcs r4, r4, %[r]\n\t"
  59875. #elif defined(__clang__)
  59876. "adcs r4, %[r]\n\t"
  59877. #else
  59878. "adc r4, %[r]\n\t"
  59879. #endif
  59880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59881. "adds r2, r2, r6\n\t"
  59882. #else
  59883. "add r2, r2, r6\n\t"
  59884. #endif
  59885. #ifdef WOLFSSL_KEIL
  59886. "adcs r3, r3, %[r]\n\t"
  59887. #elif defined(__clang__)
  59888. "adcs r3, %[r]\n\t"
  59889. #else
  59890. "adc r3, %[r]\n\t"
  59891. #endif
  59892. #ifdef WOLFSSL_KEIL
  59893. "adcs r4, r4, %[r]\n\t"
  59894. #elif defined(__clang__)
  59895. "adcs r4, %[r]\n\t"
  59896. #else
  59897. "adc r4, %[r]\n\t"
  59898. #endif
  59899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59900. "lsrs r6, r7, #16\n\t"
  59901. #else
  59902. "lsr r6, r7, #16\n\t"
  59903. #endif
  59904. #ifdef WOLFSSL_KEIL
  59905. "muls r5, r6, r5\n\t"
  59906. #elif defined(__clang__)
  59907. "muls r5, r6\n\t"
  59908. #else
  59909. "mul r5, r6\n\t"
  59910. #endif
  59911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59912. "lsrs r6, r5, #16\n\t"
  59913. #else
  59914. "lsr r6, r5, #16\n\t"
  59915. #endif
  59916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59917. "lsls r5, r5, #16\n\t"
  59918. #else
  59919. "lsl r5, r5, #16\n\t"
  59920. #endif
  59921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59922. "adds r2, r2, r5\n\t"
  59923. #else
  59924. "add r2, r2, r5\n\t"
  59925. #endif
  59926. #ifdef WOLFSSL_KEIL
  59927. "adcs r3, r3, r6\n\t"
  59928. #elif defined(__clang__)
  59929. "adcs r3, r6\n\t"
  59930. #else
  59931. "adc r3, r6\n\t"
  59932. #endif
  59933. #ifdef WOLFSSL_KEIL
  59934. "adcs r4, r4, %[r]\n\t"
  59935. #elif defined(__clang__)
  59936. "adcs r4, %[r]\n\t"
  59937. #else
  59938. "adc r4, %[r]\n\t"
  59939. #endif
  59940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59941. "adds r2, r2, r5\n\t"
  59942. #else
  59943. "add r2, r2, r5\n\t"
  59944. #endif
  59945. #ifdef WOLFSSL_KEIL
  59946. "adcs r3, r3, r6\n\t"
  59947. #elif defined(__clang__)
  59948. "adcs r3, r6\n\t"
  59949. #else
  59950. "adc r3, r6\n\t"
  59951. #endif
  59952. #ifdef WOLFSSL_KEIL
  59953. "adcs r4, r4, %[r]\n\t"
  59954. #elif defined(__clang__)
  59955. "adcs r4, %[r]\n\t"
  59956. #else
  59957. "adc r4, %[r]\n\t"
  59958. #endif
  59959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59960. "lsrs r5, %[a], #16\n\t"
  59961. #else
  59962. "lsr r5, %[a], #16\n\t"
  59963. #endif
  59964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59965. "lsrs r6, r7, #16\n\t"
  59966. #else
  59967. "lsr r6, r7, #16\n\t"
  59968. #endif
  59969. #ifdef WOLFSSL_KEIL
  59970. "muls r6, r5, r6\n\t"
  59971. #elif defined(__clang__)
  59972. "muls r6, r5\n\t"
  59973. #else
  59974. "mul r6, r5\n\t"
  59975. #endif
  59976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59977. "adds r3, r3, r6\n\t"
  59978. #else
  59979. "add r3, r3, r6\n\t"
  59980. #endif
  59981. #ifdef WOLFSSL_KEIL
  59982. "adcs r4, r4, %[r]\n\t"
  59983. #elif defined(__clang__)
  59984. "adcs r4, %[r]\n\t"
  59985. #else
  59986. "adc r4, %[r]\n\t"
  59987. #endif
  59988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  59989. "adds r3, r3, r6\n\t"
  59990. #else
  59991. "add r3, r3, r6\n\t"
  59992. #endif
  59993. #ifdef WOLFSSL_KEIL
  59994. "adcs r4, r4, %[r]\n\t"
  59995. #elif defined(__clang__)
  59996. "adcs r4, %[r]\n\t"
  59997. #else
  59998. "adc r4, %[r]\n\t"
  59999. #endif
  60000. "uxth r6, r7\n\t"
  60001. #ifdef WOLFSSL_KEIL
  60002. "muls r5, r6, r5\n\t"
  60003. #elif defined(__clang__)
  60004. "muls r5, r6\n\t"
  60005. #else
  60006. "mul r5, r6\n\t"
  60007. #endif
  60008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60009. "lsrs r6, r5, #16\n\t"
  60010. #else
  60011. "lsr r6, r5, #16\n\t"
  60012. #endif
  60013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60014. "lsls r5, r5, #16\n\t"
  60015. #else
  60016. "lsl r5, r5, #16\n\t"
  60017. #endif
  60018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60019. "adds r2, r2, r5\n\t"
  60020. #else
  60021. "add r2, r2, r5\n\t"
  60022. #endif
  60023. #ifdef WOLFSSL_KEIL
  60024. "adcs r3, r3, r6\n\t"
  60025. #elif defined(__clang__)
  60026. "adcs r3, r6\n\t"
  60027. #else
  60028. "adc r3, r6\n\t"
  60029. #endif
  60030. #ifdef WOLFSSL_KEIL
  60031. "adcs r4, r4, %[r]\n\t"
  60032. #elif defined(__clang__)
  60033. "adcs r4, %[r]\n\t"
  60034. #else
  60035. "adc r4, %[r]\n\t"
  60036. #endif
  60037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60038. "adds r2, r2, r5\n\t"
  60039. #else
  60040. "add r2, r2, r5\n\t"
  60041. #endif
  60042. #ifdef WOLFSSL_KEIL
  60043. "adcs r3, r3, r6\n\t"
  60044. #elif defined(__clang__)
  60045. "adcs r3, r6\n\t"
  60046. #else
  60047. "adc r3, r6\n\t"
  60048. #endif
  60049. #ifdef WOLFSSL_KEIL
  60050. "adcs r4, r4, %[r]\n\t"
  60051. #elif defined(__clang__)
  60052. "adcs r4, %[r]\n\t"
  60053. #else
  60054. "adc r4, %[r]\n\t"
  60055. #endif
  60056. "# A[7] * A[2]\n\t"
  60057. "mov %[a], r9\n\t"
  60058. "mov r7, r12\n\t"
  60059. "ldr %[a], [%[a], #28]\n\t"
  60060. "uxth r5, %[a]\n\t"
  60061. "uxth r6, r7\n\t"
  60062. #ifdef WOLFSSL_KEIL
  60063. "muls r6, r5, r6\n\t"
  60064. #elif defined(__clang__)
  60065. "muls r6, r5\n\t"
  60066. #else
  60067. "mul r6, r5\n\t"
  60068. #endif
  60069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60070. "adds r2, r2, r6\n\t"
  60071. #else
  60072. "add r2, r2, r6\n\t"
  60073. #endif
  60074. #ifdef WOLFSSL_KEIL
  60075. "adcs r3, r3, %[r]\n\t"
  60076. #elif defined(__clang__)
  60077. "adcs r3, %[r]\n\t"
  60078. #else
  60079. "adc r3, %[r]\n\t"
  60080. #endif
  60081. #ifdef WOLFSSL_KEIL
  60082. "adcs r4, r4, %[r]\n\t"
  60083. #elif defined(__clang__)
  60084. "adcs r4, %[r]\n\t"
  60085. #else
  60086. "adc r4, %[r]\n\t"
  60087. #endif
  60088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60089. "adds r2, r2, r6\n\t"
  60090. #else
  60091. "add r2, r2, r6\n\t"
  60092. #endif
  60093. #ifdef WOLFSSL_KEIL
  60094. "adcs r3, r3, %[r]\n\t"
  60095. #elif defined(__clang__)
  60096. "adcs r3, %[r]\n\t"
  60097. #else
  60098. "adc r3, %[r]\n\t"
  60099. #endif
  60100. #ifdef WOLFSSL_KEIL
  60101. "adcs r4, r4, %[r]\n\t"
  60102. #elif defined(__clang__)
  60103. "adcs r4, %[r]\n\t"
  60104. #else
  60105. "adc r4, %[r]\n\t"
  60106. #endif
  60107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60108. "lsrs r6, r7, #16\n\t"
  60109. #else
  60110. "lsr r6, r7, #16\n\t"
  60111. #endif
  60112. #ifdef WOLFSSL_KEIL
  60113. "muls r5, r6, r5\n\t"
  60114. #elif defined(__clang__)
  60115. "muls r5, r6\n\t"
  60116. #else
  60117. "mul r5, r6\n\t"
  60118. #endif
  60119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60120. "lsrs r6, r5, #16\n\t"
  60121. #else
  60122. "lsr r6, r5, #16\n\t"
  60123. #endif
  60124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60125. "lsls r5, r5, #16\n\t"
  60126. #else
  60127. "lsl r5, r5, #16\n\t"
  60128. #endif
  60129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60130. "adds r2, r2, r5\n\t"
  60131. #else
  60132. "add r2, r2, r5\n\t"
  60133. #endif
  60134. #ifdef WOLFSSL_KEIL
  60135. "adcs r3, r3, r6\n\t"
  60136. #elif defined(__clang__)
  60137. "adcs r3, r6\n\t"
  60138. #else
  60139. "adc r3, r6\n\t"
  60140. #endif
  60141. #ifdef WOLFSSL_KEIL
  60142. "adcs r4, r4, %[r]\n\t"
  60143. #elif defined(__clang__)
  60144. "adcs r4, %[r]\n\t"
  60145. #else
  60146. "adc r4, %[r]\n\t"
  60147. #endif
  60148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60149. "adds r2, r2, r5\n\t"
  60150. #else
  60151. "add r2, r2, r5\n\t"
  60152. #endif
  60153. #ifdef WOLFSSL_KEIL
  60154. "adcs r3, r3, r6\n\t"
  60155. #elif defined(__clang__)
  60156. "adcs r3, r6\n\t"
  60157. #else
  60158. "adc r3, r6\n\t"
  60159. #endif
  60160. #ifdef WOLFSSL_KEIL
  60161. "adcs r4, r4, %[r]\n\t"
  60162. #elif defined(__clang__)
  60163. "adcs r4, %[r]\n\t"
  60164. #else
  60165. "adc r4, %[r]\n\t"
  60166. #endif
  60167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60168. "lsrs r5, %[a], #16\n\t"
  60169. #else
  60170. "lsr r5, %[a], #16\n\t"
  60171. #endif
  60172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60173. "lsrs r6, r7, #16\n\t"
  60174. #else
  60175. "lsr r6, r7, #16\n\t"
  60176. #endif
  60177. #ifdef WOLFSSL_KEIL
  60178. "muls r6, r5, r6\n\t"
  60179. #elif defined(__clang__)
  60180. "muls r6, r5\n\t"
  60181. #else
  60182. "mul r6, r5\n\t"
  60183. #endif
  60184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60185. "adds r3, r3, r6\n\t"
  60186. #else
  60187. "add r3, r3, r6\n\t"
  60188. #endif
  60189. #ifdef WOLFSSL_KEIL
  60190. "adcs r4, r4, %[r]\n\t"
  60191. #elif defined(__clang__)
  60192. "adcs r4, %[r]\n\t"
  60193. #else
  60194. "adc r4, %[r]\n\t"
  60195. #endif
  60196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60197. "adds r3, r3, r6\n\t"
  60198. #else
  60199. "add r3, r3, r6\n\t"
  60200. #endif
  60201. #ifdef WOLFSSL_KEIL
  60202. "adcs r4, r4, %[r]\n\t"
  60203. #elif defined(__clang__)
  60204. "adcs r4, %[r]\n\t"
  60205. #else
  60206. "adc r4, %[r]\n\t"
  60207. #endif
  60208. "uxth r6, r7\n\t"
  60209. #ifdef WOLFSSL_KEIL
  60210. "muls r5, r6, r5\n\t"
  60211. #elif defined(__clang__)
  60212. "muls r5, r6\n\t"
  60213. #else
  60214. "mul r5, r6\n\t"
  60215. #endif
  60216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60217. "lsrs r6, r5, #16\n\t"
  60218. #else
  60219. "lsr r6, r5, #16\n\t"
  60220. #endif
  60221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60222. "lsls r5, r5, #16\n\t"
  60223. #else
  60224. "lsl r5, r5, #16\n\t"
  60225. #endif
  60226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60227. "adds r2, r2, r5\n\t"
  60228. #else
  60229. "add r2, r2, r5\n\t"
  60230. #endif
  60231. #ifdef WOLFSSL_KEIL
  60232. "adcs r3, r3, r6\n\t"
  60233. #elif defined(__clang__)
  60234. "adcs r3, r6\n\t"
  60235. #else
  60236. "adc r3, r6\n\t"
  60237. #endif
  60238. #ifdef WOLFSSL_KEIL
  60239. "adcs r4, r4, %[r]\n\t"
  60240. #elif defined(__clang__)
  60241. "adcs r4, %[r]\n\t"
  60242. #else
  60243. "adc r4, %[r]\n\t"
  60244. #endif
  60245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60246. "adds r2, r2, r5\n\t"
  60247. #else
  60248. "add r2, r2, r5\n\t"
  60249. #endif
  60250. #ifdef WOLFSSL_KEIL
  60251. "adcs r3, r3, r6\n\t"
  60252. #elif defined(__clang__)
  60253. "adcs r3, r6\n\t"
  60254. #else
  60255. "adc r3, r6\n\t"
  60256. #endif
  60257. #ifdef WOLFSSL_KEIL
  60258. "adcs r4, r4, %[r]\n\t"
  60259. #elif defined(__clang__)
  60260. "adcs r4, %[r]\n\t"
  60261. #else
  60262. "adc r4, %[r]\n\t"
  60263. #endif
  60264. "# A[8] * A[1]\n\t"
  60265. "mov %[a], r9\n\t"
  60266. "mov r7, r11\n\t"
  60267. "ldr %[a], [%[a], #32]\n\t"
  60268. "uxth r5, %[a]\n\t"
  60269. "uxth r6, r7\n\t"
  60270. #ifdef WOLFSSL_KEIL
  60271. "muls r6, r5, r6\n\t"
  60272. #elif defined(__clang__)
  60273. "muls r6, r5\n\t"
  60274. #else
  60275. "mul r6, r5\n\t"
  60276. #endif
  60277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60278. "adds r2, r2, r6\n\t"
  60279. #else
  60280. "add r2, r2, r6\n\t"
  60281. #endif
  60282. #ifdef WOLFSSL_KEIL
  60283. "adcs r3, r3, %[r]\n\t"
  60284. #elif defined(__clang__)
  60285. "adcs r3, %[r]\n\t"
  60286. #else
  60287. "adc r3, %[r]\n\t"
  60288. #endif
  60289. #ifdef WOLFSSL_KEIL
  60290. "adcs r4, r4, %[r]\n\t"
  60291. #elif defined(__clang__)
  60292. "adcs r4, %[r]\n\t"
  60293. #else
  60294. "adc r4, %[r]\n\t"
  60295. #endif
  60296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60297. "adds r2, r2, r6\n\t"
  60298. #else
  60299. "add r2, r2, r6\n\t"
  60300. #endif
  60301. #ifdef WOLFSSL_KEIL
  60302. "adcs r3, r3, %[r]\n\t"
  60303. #elif defined(__clang__)
  60304. "adcs r3, %[r]\n\t"
  60305. #else
  60306. "adc r3, %[r]\n\t"
  60307. #endif
  60308. #ifdef WOLFSSL_KEIL
  60309. "adcs r4, r4, %[r]\n\t"
  60310. #elif defined(__clang__)
  60311. "adcs r4, %[r]\n\t"
  60312. #else
  60313. "adc r4, %[r]\n\t"
  60314. #endif
  60315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60316. "lsrs r6, r7, #16\n\t"
  60317. #else
  60318. "lsr r6, r7, #16\n\t"
  60319. #endif
  60320. #ifdef WOLFSSL_KEIL
  60321. "muls r5, r6, r5\n\t"
  60322. #elif defined(__clang__)
  60323. "muls r5, r6\n\t"
  60324. #else
  60325. "mul r5, r6\n\t"
  60326. #endif
  60327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60328. "lsrs r6, r5, #16\n\t"
  60329. #else
  60330. "lsr r6, r5, #16\n\t"
  60331. #endif
  60332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60333. "lsls r5, r5, #16\n\t"
  60334. #else
  60335. "lsl r5, r5, #16\n\t"
  60336. #endif
  60337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60338. "adds r2, r2, r5\n\t"
  60339. #else
  60340. "add r2, r2, r5\n\t"
  60341. #endif
  60342. #ifdef WOLFSSL_KEIL
  60343. "adcs r3, r3, r6\n\t"
  60344. #elif defined(__clang__)
  60345. "adcs r3, r6\n\t"
  60346. #else
  60347. "adc r3, r6\n\t"
  60348. #endif
  60349. #ifdef WOLFSSL_KEIL
  60350. "adcs r4, r4, %[r]\n\t"
  60351. #elif defined(__clang__)
  60352. "adcs r4, %[r]\n\t"
  60353. #else
  60354. "adc r4, %[r]\n\t"
  60355. #endif
  60356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60357. "adds r2, r2, r5\n\t"
  60358. #else
  60359. "add r2, r2, r5\n\t"
  60360. #endif
  60361. #ifdef WOLFSSL_KEIL
  60362. "adcs r3, r3, r6\n\t"
  60363. #elif defined(__clang__)
  60364. "adcs r3, r6\n\t"
  60365. #else
  60366. "adc r3, r6\n\t"
  60367. #endif
  60368. #ifdef WOLFSSL_KEIL
  60369. "adcs r4, r4, %[r]\n\t"
  60370. #elif defined(__clang__)
  60371. "adcs r4, %[r]\n\t"
  60372. #else
  60373. "adc r4, %[r]\n\t"
  60374. #endif
  60375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60376. "lsrs r5, %[a], #16\n\t"
  60377. #else
  60378. "lsr r5, %[a], #16\n\t"
  60379. #endif
  60380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60381. "lsrs r6, r7, #16\n\t"
  60382. #else
  60383. "lsr r6, r7, #16\n\t"
  60384. #endif
  60385. #ifdef WOLFSSL_KEIL
  60386. "muls r6, r5, r6\n\t"
  60387. #elif defined(__clang__)
  60388. "muls r6, r5\n\t"
  60389. #else
  60390. "mul r6, r5\n\t"
  60391. #endif
  60392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60393. "adds r3, r3, r6\n\t"
  60394. #else
  60395. "add r3, r3, r6\n\t"
  60396. #endif
  60397. #ifdef WOLFSSL_KEIL
  60398. "adcs r4, r4, %[r]\n\t"
  60399. #elif defined(__clang__)
  60400. "adcs r4, %[r]\n\t"
  60401. #else
  60402. "adc r4, %[r]\n\t"
  60403. #endif
  60404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60405. "adds r3, r3, r6\n\t"
  60406. #else
  60407. "add r3, r3, r6\n\t"
  60408. #endif
  60409. #ifdef WOLFSSL_KEIL
  60410. "adcs r4, r4, %[r]\n\t"
  60411. #elif defined(__clang__)
  60412. "adcs r4, %[r]\n\t"
  60413. #else
  60414. "adc r4, %[r]\n\t"
  60415. #endif
  60416. "uxth r6, r7\n\t"
  60417. #ifdef WOLFSSL_KEIL
  60418. "muls r5, r6, r5\n\t"
  60419. #elif defined(__clang__)
  60420. "muls r5, r6\n\t"
  60421. #else
  60422. "mul r5, r6\n\t"
  60423. #endif
  60424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60425. "lsrs r6, r5, #16\n\t"
  60426. #else
  60427. "lsr r6, r5, #16\n\t"
  60428. #endif
  60429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60430. "lsls r5, r5, #16\n\t"
  60431. #else
  60432. "lsl r5, r5, #16\n\t"
  60433. #endif
  60434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60435. "adds r2, r2, r5\n\t"
  60436. #else
  60437. "add r2, r2, r5\n\t"
  60438. #endif
  60439. #ifdef WOLFSSL_KEIL
  60440. "adcs r3, r3, r6\n\t"
  60441. #elif defined(__clang__)
  60442. "adcs r3, r6\n\t"
  60443. #else
  60444. "adc r3, r6\n\t"
  60445. #endif
  60446. #ifdef WOLFSSL_KEIL
  60447. "adcs r4, r4, %[r]\n\t"
  60448. #elif defined(__clang__)
  60449. "adcs r4, %[r]\n\t"
  60450. #else
  60451. "adc r4, %[r]\n\t"
  60452. #endif
  60453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60454. "adds r2, r2, r5\n\t"
  60455. #else
  60456. "add r2, r2, r5\n\t"
  60457. #endif
  60458. #ifdef WOLFSSL_KEIL
  60459. "adcs r3, r3, r6\n\t"
  60460. #elif defined(__clang__)
  60461. "adcs r3, r6\n\t"
  60462. #else
  60463. "adc r3, r6\n\t"
  60464. #endif
  60465. #ifdef WOLFSSL_KEIL
  60466. "adcs r4, r4, %[r]\n\t"
  60467. #elif defined(__clang__)
  60468. "adcs r4, %[r]\n\t"
  60469. #else
  60470. "adc r4, %[r]\n\t"
  60471. #endif
  60472. "# A[9] * A[0]\n\t"
  60473. "mov %[a], r9\n\t"
  60474. "mov r7, r10\n\t"
  60475. "ldr %[a], [%[a], #36]\n\t"
  60476. "uxth r5, %[a]\n\t"
  60477. "uxth r6, r7\n\t"
  60478. #ifdef WOLFSSL_KEIL
  60479. "muls r6, r5, r6\n\t"
  60480. #elif defined(__clang__)
  60481. "muls r6, r5\n\t"
  60482. #else
  60483. "mul r6, r5\n\t"
  60484. #endif
  60485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60486. "adds r2, r2, r6\n\t"
  60487. #else
  60488. "add r2, r2, r6\n\t"
  60489. #endif
  60490. #ifdef WOLFSSL_KEIL
  60491. "adcs r3, r3, %[r]\n\t"
  60492. #elif defined(__clang__)
  60493. "adcs r3, %[r]\n\t"
  60494. #else
  60495. "adc r3, %[r]\n\t"
  60496. #endif
  60497. #ifdef WOLFSSL_KEIL
  60498. "adcs r4, r4, %[r]\n\t"
  60499. #elif defined(__clang__)
  60500. "adcs r4, %[r]\n\t"
  60501. #else
  60502. "adc r4, %[r]\n\t"
  60503. #endif
  60504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60505. "adds r2, r2, r6\n\t"
  60506. #else
  60507. "add r2, r2, r6\n\t"
  60508. #endif
  60509. #ifdef WOLFSSL_KEIL
  60510. "adcs r3, r3, %[r]\n\t"
  60511. #elif defined(__clang__)
  60512. "adcs r3, %[r]\n\t"
  60513. #else
  60514. "adc r3, %[r]\n\t"
  60515. #endif
  60516. #ifdef WOLFSSL_KEIL
  60517. "adcs r4, r4, %[r]\n\t"
  60518. #elif defined(__clang__)
  60519. "adcs r4, %[r]\n\t"
  60520. #else
  60521. "adc r4, %[r]\n\t"
  60522. #endif
  60523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60524. "lsrs r6, r7, #16\n\t"
  60525. #else
  60526. "lsr r6, r7, #16\n\t"
  60527. #endif
  60528. #ifdef WOLFSSL_KEIL
  60529. "muls r5, r6, r5\n\t"
  60530. #elif defined(__clang__)
  60531. "muls r5, r6\n\t"
  60532. #else
  60533. "mul r5, r6\n\t"
  60534. #endif
  60535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60536. "lsrs r6, r5, #16\n\t"
  60537. #else
  60538. "lsr r6, r5, #16\n\t"
  60539. #endif
  60540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60541. "lsls r5, r5, #16\n\t"
  60542. #else
  60543. "lsl r5, r5, #16\n\t"
  60544. #endif
  60545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60546. "adds r2, r2, r5\n\t"
  60547. #else
  60548. "add r2, r2, r5\n\t"
  60549. #endif
  60550. #ifdef WOLFSSL_KEIL
  60551. "adcs r3, r3, r6\n\t"
  60552. #elif defined(__clang__)
  60553. "adcs r3, r6\n\t"
  60554. #else
  60555. "adc r3, r6\n\t"
  60556. #endif
  60557. #ifdef WOLFSSL_KEIL
  60558. "adcs r4, r4, %[r]\n\t"
  60559. #elif defined(__clang__)
  60560. "adcs r4, %[r]\n\t"
  60561. #else
  60562. "adc r4, %[r]\n\t"
  60563. #endif
  60564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60565. "adds r2, r2, r5\n\t"
  60566. #else
  60567. "add r2, r2, r5\n\t"
  60568. #endif
  60569. #ifdef WOLFSSL_KEIL
  60570. "adcs r3, r3, r6\n\t"
  60571. #elif defined(__clang__)
  60572. "adcs r3, r6\n\t"
  60573. #else
  60574. "adc r3, r6\n\t"
  60575. #endif
  60576. #ifdef WOLFSSL_KEIL
  60577. "adcs r4, r4, %[r]\n\t"
  60578. #elif defined(__clang__)
  60579. "adcs r4, %[r]\n\t"
  60580. #else
  60581. "adc r4, %[r]\n\t"
  60582. #endif
  60583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60584. "lsrs r5, %[a], #16\n\t"
  60585. #else
  60586. "lsr r5, %[a], #16\n\t"
  60587. #endif
  60588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60589. "lsrs r6, r7, #16\n\t"
  60590. #else
  60591. "lsr r6, r7, #16\n\t"
  60592. #endif
  60593. #ifdef WOLFSSL_KEIL
  60594. "muls r6, r5, r6\n\t"
  60595. #elif defined(__clang__)
  60596. "muls r6, r5\n\t"
  60597. #else
  60598. "mul r6, r5\n\t"
  60599. #endif
  60600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60601. "adds r3, r3, r6\n\t"
  60602. #else
  60603. "add r3, r3, r6\n\t"
  60604. #endif
  60605. #ifdef WOLFSSL_KEIL
  60606. "adcs r4, r4, %[r]\n\t"
  60607. #elif defined(__clang__)
  60608. "adcs r4, %[r]\n\t"
  60609. #else
  60610. "adc r4, %[r]\n\t"
  60611. #endif
  60612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60613. "adds r3, r3, r6\n\t"
  60614. #else
  60615. "add r3, r3, r6\n\t"
  60616. #endif
  60617. #ifdef WOLFSSL_KEIL
  60618. "adcs r4, r4, %[r]\n\t"
  60619. #elif defined(__clang__)
  60620. "adcs r4, %[r]\n\t"
  60621. #else
  60622. "adc r4, %[r]\n\t"
  60623. #endif
  60624. "uxth r6, r7\n\t"
  60625. #ifdef WOLFSSL_KEIL
  60626. "muls r5, r6, r5\n\t"
  60627. #elif defined(__clang__)
  60628. "muls r5, r6\n\t"
  60629. #else
  60630. "mul r5, r6\n\t"
  60631. #endif
  60632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60633. "lsrs r6, r5, #16\n\t"
  60634. #else
  60635. "lsr r6, r5, #16\n\t"
  60636. #endif
  60637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60638. "lsls r5, r5, #16\n\t"
  60639. #else
  60640. "lsl r5, r5, #16\n\t"
  60641. #endif
  60642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60643. "adds r2, r2, r5\n\t"
  60644. #else
  60645. "add r2, r2, r5\n\t"
  60646. #endif
  60647. #ifdef WOLFSSL_KEIL
  60648. "adcs r3, r3, r6\n\t"
  60649. #elif defined(__clang__)
  60650. "adcs r3, r6\n\t"
  60651. #else
  60652. "adc r3, r6\n\t"
  60653. #endif
  60654. #ifdef WOLFSSL_KEIL
  60655. "adcs r4, r4, %[r]\n\t"
  60656. #elif defined(__clang__)
  60657. "adcs r4, %[r]\n\t"
  60658. #else
  60659. "adc r4, %[r]\n\t"
  60660. #endif
  60661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60662. "adds r2, r2, r5\n\t"
  60663. #else
  60664. "add r2, r2, r5\n\t"
  60665. #endif
  60666. #ifdef WOLFSSL_KEIL
  60667. "adcs r3, r3, r6\n\t"
  60668. #elif defined(__clang__)
  60669. "adcs r3, r6\n\t"
  60670. #else
  60671. "adc r3, r6\n\t"
  60672. #endif
  60673. #ifdef WOLFSSL_KEIL
  60674. "adcs r4, r4, %[r]\n\t"
  60675. #elif defined(__clang__)
  60676. "adcs r4, %[r]\n\t"
  60677. #else
  60678. "adc r4, %[r]\n\t"
  60679. #endif
  60680. "str r2, [sp, #36]\n\t"
  60681. "# A[10] * A[0]\n\t"
  60682. "movs r2, #0\n\t"
  60683. "mov %[a], r9\n\t"
  60684. "ldr %[a], [%[a], #40]\n\t"
  60685. "uxth r5, %[a]\n\t"
  60686. "uxth r6, r7\n\t"
  60687. #ifdef WOLFSSL_KEIL
  60688. "muls r6, r5, r6\n\t"
  60689. #elif defined(__clang__)
  60690. "muls r6, r5\n\t"
  60691. #else
  60692. "mul r6, r5\n\t"
  60693. #endif
  60694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60695. "adds r3, r3, r6\n\t"
  60696. #else
  60697. "add r3, r3, r6\n\t"
  60698. #endif
  60699. #ifdef WOLFSSL_KEIL
  60700. "adcs r4, r4, %[r]\n\t"
  60701. #elif defined(__clang__)
  60702. "adcs r4, %[r]\n\t"
  60703. #else
  60704. "adc r4, %[r]\n\t"
  60705. #endif
  60706. #ifdef WOLFSSL_KEIL
  60707. "adcs r2, r2, %[r]\n\t"
  60708. #elif defined(__clang__)
  60709. "adcs r2, %[r]\n\t"
  60710. #else
  60711. "adc r2, %[r]\n\t"
  60712. #endif
  60713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60714. "adds r3, r3, r6\n\t"
  60715. #else
  60716. "add r3, r3, r6\n\t"
  60717. #endif
  60718. #ifdef WOLFSSL_KEIL
  60719. "adcs r4, r4, %[r]\n\t"
  60720. #elif defined(__clang__)
  60721. "adcs r4, %[r]\n\t"
  60722. #else
  60723. "adc r4, %[r]\n\t"
  60724. #endif
  60725. #ifdef WOLFSSL_KEIL
  60726. "adcs r2, r2, %[r]\n\t"
  60727. #elif defined(__clang__)
  60728. "adcs r2, %[r]\n\t"
  60729. #else
  60730. "adc r2, %[r]\n\t"
  60731. #endif
  60732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60733. "lsrs r6, r7, #16\n\t"
  60734. #else
  60735. "lsr r6, r7, #16\n\t"
  60736. #endif
  60737. #ifdef WOLFSSL_KEIL
  60738. "muls r5, r6, r5\n\t"
  60739. #elif defined(__clang__)
  60740. "muls r5, r6\n\t"
  60741. #else
  60742. "mul r5, r6\n\t"
  60743. #endif
  60744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60745. "lsrs r6, r5, #16\n\t"
  60746. #else
  60747. "lsr r6, r5, #16\n\t"
  60748. #endif
  60749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60750. "lsls r5, r5, #16\n\t"
  60751. #else
  60752. "lsl r5, r5, #16\n\t"
  60753. #endif
  60754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60755. "adds r3, r3, r5\n\t"
  60756. #else
  60757. "add r3, r3, r5\n\t"
  60758. #endif
  60759. #ifdef WOLFSSL_KEIL
  60760. "adcs r4, r4, r6\n\t"
  60761. #elif defined(__clang__)
  60762. "adcs r4, r6\n\t"
  60763. #else
  60764. "adc r4, r6\n\t"
  60765. #endif
  60766. #ifdef WOLFSSL_KEIL
  60767. "adcs r2, r2, %[r]\n\t"
  60768. #elif defined(__clang__)
  60769. "adcs r2, %[r]\n\t"
  60770. #else
  60771. "adc r2, %[r]\n\t"
  60772. #endif
  60773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60774. "adds r3, r3, r5\n\t"
  60775. #else
  60776. "add r3, r3, r5\n\t"
  60777. #endif
  60778. #ifdef WOLFSSL_KEIL
  60779. "adcs r4, r4, r6\n\t"
  60780. #elif defined(__clang__)
  60781. "adcs r4, r6\n\t"
  60782. #else
  60783. "adc r4, r6\n\t"
  60784. #endif
  60785. #ifdef WOLFSSL_KEIL
  60786. "adcs r2, r2, %[r]\n\t"
  60787. #elif defined(__clang__)
  60788. "adcs r2, %[r]\n\t"
  60789. #else
  60790. "adc r2, %[r]\n\t"
  60791. #endif
  60792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60793. "lsrs r5, %[a], #16\n\t"
  60794. #else
  60795. "lsr r5, %[a], #16\n\t"
  60796. #endif
  60797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60798. "lsrs r6, r7, #16\n\t"
  60799. #else
  60800. "lsr r6, r7, #16\n\t"
  60801. #endif
  60802. #ifdef WOLFSSL_KEIL
  60803. "muls r6, r5, r6\n\t"
  60804. #elif defined(__clang__)
  60805. "muls r6, r5\n\t"
  60806. #else
  60807. "mul r6, r5\n\t"
  60808. #endif
  60809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60810. "adds r4, r4, r6\n\t"
  60811. #else
  60812. "add r4, r4, r6\n\t"
  60813. #endif
  60814. #ifdef WOLFSSL_KEIL
  60815. "adcs r2, r2, %[r]\n\t"
  60816. #elif defined(__clang__)
  60817. "adcs r2, %[r]\n\t"
  60818. #else
  60819. "adc r2, %[r]\n\t"
  60820. #endif
  60821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60822. "adds r4, r4, r6\n\t"
  60823. #else
  60824. "add r4, r4, r6\n\t"
  60825. #endif
  60826. #ifdef WOLFSSL_KEIL
  60827. "adcs r2, r2, %[r]\n\t"
  60828. #elif defined(__clang__)
  60829. "adcs r2, %[r]\n\t"
  60830. #else
  60831. "adc r2, %[r]\n\t"
  60832. #endif
  60833. "uxth r6, r7\n\t"
  60834. #ifdef WOLFSSL_KEIL
  60835. "muls r5, r6, r5\n\t"
  60836. #elif defined(__clang__)
  60837. "muls r5, r6\n\t"
  60838. #else
  60839. "mul r5, r6\n\t"
  60840. #endif
  60841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60842. "lsrs r6, r5, #16\n\t"
  60843. #else
  60844. "lsr r6, r5, #16\n\t"
  60845. #endif
  60846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60847. "lsls r5, r5, #16\n\t"
  60848. #else
  60849. "lsl r5, r5, #16\n\t"
  60850. #endif
  60851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60852. "adds r3, r3, r5\n\t"
  60853. #else
  60854. "add r3, r3, r5\n\t"
  60855. #endif
  60856. #ifdef WOLFSSL_KEIL
  60857. "adcs r4, r4, r6\n\t"
  60858. #elif defined(__clang__)
  60859. "adcs r4, r6\n\t"
  60860. #else
  60861. "adc r4, r6\n\t"
  60862. #endif
  60863. #ifdef WOLFSSL_KEIL
  60864. "adcs r2, r2, %[r]\n\t"
  60865. #elif defined(__clang__)
  60866. "adcs r2, %[r]\n\t"
  60867. #else
  60868. "adc r2, %[r]\n\t"
  60869. #endif
  60870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60871. "adds r3, r3, r5\n\t"
  60872. #else
  60873. "add r3, r3, r5\n\t"
  60874. #endif
  60875. #ifdef WOLFSSL_KEIL
  60876. "adcs r4, r4, r6\n\t"
  60877. #elif defined(__clang__)
  60878. "adcs r4, r6\n\t"
  60879. #else
  60880. "adc r4, r6\n\t"
  60881. #endif
  60882. #ifdef WOLFSSL_KEIL
  60883. "adcs r2, r2, %[r]\n\t"
  60884. #elif defined(__clang__)
  60885. "adcs r2, %[r]\n\t"
  60886. #else
  60887. "adc r2, %[r]\n\t"
  60888. #endif
  60889. "# A[9] * A[1]\n\t"
  60890. "mov %[a], r9\n\t"
  60891. "mov r7, r11\n\t"
  60892. "ldr %[a], [%[a], #36]\n\t"
  60893. "uxth r5, %[a]\n\t"
  60894. "uxth r6, r7\n\t"
  60895. #ifdef WOLFSSL_KEIL
  60896. "muls r6, r5, r6\n\t"
  60897. #elif defined(__clang__)
  60898. "muls r6, r5\n\t"
  60899. #else
  60900. "mul r6, r5\n\t"
  60901. #endif
  60902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60903. "adds r3, r3, r6\n\t"
  60904. #else
  60905. "add r3, r3, r6\n\t"
  60906. #endif
  60907. #ifdef WOLFSSL_KEIL
  60908. "adcs r4, r4, %[r]\n\t"
  60909. #elif defined(__clang__)
  60910. "adcs r4, %[r]\n\t"
  60911. #else
  60912. "adc r4, %[r]\n\t"
  60913. #endif
  60914. #ifdef WOLFSSL_KEIL
  60915. "adcs r2, r2, %[r]\n\t"
  60916. #elif defined(__clang__)
  60917. "adcs r2, %[r]\n\t"
  60918. #else
  60919. "adc r2, %[r]\n\t"
  60920. #endif
  60921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60922. "adds r3, r3, r6\n\t"
  60923. #else
  60924. "add r3, r3, r6\n\t"
  60925. #endif
  60926. #ifdef WOLFSSL_KEIL
  60927. "adcs r4, r4, %[r]\n\t"
  60928. #elif defined(__clang__)
  60929. "adcs r4, %[r]\n\t"
  60930. #else
  60931. "adc r4, %[r]\n\t"
  60932. #endif
  60933. #ifdef WOLFSSL_KEIL
  60934. "adcs r2, r2, %[r]\n\t"
  60935. #elif defined(__clang__)
  60936. "adcs r2, %[r]\n\t"
  60937. #else
  60938. "adc r2, %[r]\n\t"
  60939. #endif
  60940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60941. "lsrs r6, r7, #16\n\t"
  60942. #else
  60943. "lsr r6, r7, #16\n\t"
  60944. #endif
  60945. #ifdef WOLFSSL_KEIL
  60946. "muls r5, r6, r5\n\t"
  60947. #elif defined(__clang__)
  60948. "muls r5, r6\n\t"
  60949. #else
  60950. "mul r5, r6\n\t"
  60951. #endif
  60952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60953. "lsrs r6, r5, #16\n\t"
  60954. #else
  60955. "lsr r6, r5, #16\n\t"
  60956. #endif
  60957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60958. "lsls r5, r5, #16\n\t"
  60959. #else
  60960. "lsl r5, r5, #16\n\t"
  60961. #endif
  60962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60963. "adds r3, r3, r5\n\t"
  60964. #else
  60965. "add r3, r3, r5\n\t"
  60966. #endif
  60967. #ifdef WOLFSSL_KEIL
  60968. "adcs r4, r4, r6\n\t"
  60969. #elif defined(__clang__)
  60970. "adcs r4, r6\n\t"
  60971. #else
  60972. "adc r4, r6\n\t"
  60973. #endif
  60974. #ifdef WOLFSSL_KEIL
  60975. "adcs r2, r2, %[r]\n\t"
  60976. #elif defined(__clang__)
  60977. "adcs r2, %[r]\n\t"
  60978. #else
  60979. "adc r2, %[r]\n\t"
  60980. #endif
  60981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  60982. "adds r3, r3, r5\n\t"
  60983. #else
  60984. "add r3, r3, r5\n\t"
  60985. #endif
  60986. #ifdef WOLFSSL_KEIL
  60987. "adcs r4, r4, r6\n\t"
  60988. #elif defined(__clang__)
  60989. "adcs r4, r6\n\t"
  60990. #else
  60991. "adc r4, r6\n\t"
  60992. #endif
  60993. #ifdef WOLFSSL_KEIL
  60994. "adcs r2, r2, %[r]\n\t"
  60995. #elif defined(__clang__)
  60996. "adcs r2, %[r]\n\t"
  60997. #else
  60998. "adc r2, %[r]\n\t"
  60999. #endif
  61000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61001. "lsrs r5, %[a], #16\n\t"
  61002. #else
  61003. "lsr r5, %[a], #16\n\t"
  61004. #endif
  61005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61006. "lsrs r6, r7, #16\n\t"
  61007. #else
  61008. "lsr r6, r7, #16\n\t"
  61009. #endif
  61010. #ifdef WOLFSSL_KEIL
  61011. "muls r6, r5, r6\n\t"
  61012. #elif defined(__clang__)
  61013. "muls r6, r5\n\t"
  61014. #else
  61015. "mul r6, r5\n\t"
  61016. #endif
  61017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61018. "adds r4, r4, r6\n\t"
  61019. #else
  61020. "add r4, r4, r6\n\t"
  61021. #endif
  61022. #ifdef WOLFSSL_KEIL
  61023. "adcs r2, r2, %[r]\n\t"
  61024. #elif defined(__clang__)
  61025. "adcs r2, %[r]\n\t"
  61026. #else
  61027. "adc r2, %[r]\n\t"
  61028. #endif
  61029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61030. "adds r4, r4, r6\n\t"
  61031. #else
  61032. "add r4, r4, r6\n\t"
  61033. #endif
  61034. #ifdef WOLFSSL_KEIL
  61035. "adcs r2, r2, %[r]\n\t"
  61036. #elif defined(__clang__)
  61037. "adcs r2, %[r]\n\t"
  61038. #else
  61039. "adc r2, %[r]\n\t"
  61040. #endif
  61041. "uxth r6, r7\n\t"
  61042. #ifdef WOLFSSL_KEIL
  61043. "muls r5, r6, r5\n\t"
  61044. #elif defined(__clang__)
  61045. "muls r5, r6\n\t"
  61046. #else
  61047. "mul r5, r6\n\t"
  61048. #endif
  61049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61050. "lsrs r6, r5, #16\n\t"
  61051. #else
  61052. "lsr r6, r5, #16\n\t"
  61053. #endif
  61054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61055. "lsls r5, r5, #16\n\t"
  61056. #else
  61057. "lsl r5, r5, #16\n\t"
  61058. #endif
  61059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61060. "adds r3, r3, r5\n\t"
  61061. #else
  61062. "add r3, r3, r5\n\t"
  61063. #endif
  61064. #ifdef WOLFSSL_KEIL
  61065. "adcs r4, r4, r6\n\t"
  61066. #elif defined(__clang__)
  61067. "adcs r4, r6\n\t"
  61068. #else
  61069. "adc r4, r6\n\t"
  61070. #endif
  61071. #ifdef WOLFSSL_KEIL
  61072. "adcs r2, r2, %[r]\n\t"
  61073. #elif defined(__clang__)
  61074. "adcs r2, %[r]\n\t"
  61075. #else
  61076. "adc r2, %[r]\n\t"
  61077. #endif
  61078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61079. "adds r3, r3, r5\n\t"
  61080. #else
  61081. "add r3, r3, r5\n\t"
  61082. #endif
  61083. #ifdef WOLFSSL_KEIL
  61084. "adcs r4, r4, r6\n\t"
  61085. #elif defined(__clang__)
  61086. "adcs r4, r6\n\t"
  61087. #else
  61088. "adc r4, r6\n\t"
  61089. #endif
  61090. #ifdef WOLFSSL_KEIL
  61091. "adcs r2, r2, %[r]\n\t"
  61092. #elif defined(__clang__)
  61093. "adcs r2, %[r]\n\t"
  61094. #else
  61095. "adc r2, %[r]\n\t"
  61096. #endif
  61097. "# A[8] * A[2]\n\t"
  61098. "mov %[a], r9\n\t"
  61099. "mov r7, r12\n\t"
  61100. "ldr %[a], [%[a], #32]\n\t"
  61101. "uxth r5, %[a]\n\t"
  61102. "uxth r6, r7\n\t"
  61103. #ifdef WOLFSSL_KEIL
  61104. "muls r6, r5, r6\n\t"
  61105. #elif defined(__clang__)
  61106. "muls r6, r5\n\t"
  61107. #else
  61108. "mul r6, r5\n\t"
  61109. #endif
  61110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61111. "adds r3, r3, r6\n\t"
  61112. #else
  61113. "add r3, r3, r6\n\t"
  61114. #endif
  61115. #ifdef WOLFSSL_KEIL
  61116. "adcs r4, r4, %[r]\n\t"
  61117. #elif defined(__clang__)
  61118. "adcs r4, %[r]\n\t"
  61119. #else
  61120. "adc r4, %[r]\n\t"
  61121. #endif
  61122. #ifdef WOLFSSL_KEIL
  61123. "adcs r2, r2, %[r]\n\t"
  61124. #elif defined(__clang__)
  61125. "adcs r2, %[r]\n\t"
  61126. #else
  61127. "adc r2, %[r]\n\t"
  61128. #endif
  61129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61130. "adds r3, r3, r6\n\t"
  61131. #else
  61132. "add r3, r3, r6\n\t"
  61133. #endif
  61134. #ifdef WOLFSSL_KEIL
  61135. "adcs r4, r4, %[r]\n\t"
  61136. #elif defined(__clang__)
  61137. "adcs r4, %[r]\n\t"
  61138. #else
  61139. "adc r4, %[r]\n\t"
  61140. #endif
  61141. #ifdef WOLFSSL_KEIL
  61142. "adcs r2, r2, %[r]\n\t"
  61143. #elif defined(__clang__)
  61144. "adcs r2, %[r]\n\t"
  61145. #else
  61146. "adc r2, %[r]\n\t"
  61147. #endif
  61148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61149. "lsrs r6, r7, #16\n\t"
  61150. #else
  61151. "lsr r6, r7, #16\n\t"
  61152. #endif
  61153. #ifdef WOLFSSL_KEIL
  61154. "muls r5, r6, r5\n\t"
  61155. #elif defined(__clang__)
  61156. "muls r5, r6\n\t"
  61157. #else
  61158. "mul r5, r6\n\t"
  61159. #endif
  61160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61161. "lsrs r6, r5, #16\n\t"
  61162. #else
  61163. "lsr r6, r5, #16\n\t"
  61164. #endif
  61165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61166. "lsls r5, r5, #16\n\t"
  61167. #else
  61168. "lsl r5, r5, #16\n\t"
  61169. #endif
  61170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61171. "adds r3, r3, r5\n\t"
  61172. #else
  61173. "add r3, r3, r5\n\t"
  61174. #endif
  61175. #ifdef WOLFSSL_KEIL
  61176. "adcs r4, r4, r6\n\t"
  61177. #elif defined(__clang__)
  61178. "adcs r4, r6\n\t"
  61179. #else
  61180. "adc r4, r6\n\t"
  61181. #endif
  61182. #ifdef WOLFSSL_KEIL
  61183. "adcs r2, r2, %[r]\n\t"
  61184. #elif defined(__clang__)
  61185. "adcs r2, %[r]\n\t"
  61186. #else
  61187. "adc r2, %[r]\n\t"
  61188. #endif
  61189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61190. "adds r3, r3, r5\n\t"
  61191. #else
  61192. "add r3, r3, r5\n\t"
  61193. #endif
  61194. #ifdef WOLFSSL_KEIL
  61195. "adcs r4, r4, r6\n\t"
  61196. #elif defined(__clang__)
  61197. "adcs r4, r6\n\t"
  61198. #else
  61199. "adc r4, r6\n\t"
  61200. #endif
  61201. #ifdef WOLFSSL_KEIL
  61202. "adcs r2, r2, %[r]\n\t"
  61203. #elif defined(__clang__)
  61204. "adcs r2, %[r]\n\t"
  61205. #else
  61206. "adc r2, %[r]\n\t"
  61207. #endif
  61208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61209. "lsrs r5, %[a], #16\n\t"
  61210. #else
  61211. "lsr r5, %[a], #16\n\t"
  61212. #endif
  61213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61214. "lsrs r6, r7, #16\n\t"
  61215. #else
  61216. "lsr r6, r7, #16\n\t"
  61217. #endif
  61218. #ifdef WOLFSSL_KEIL
  61219. "muls r6, r5, r6\n\t"
  61220. #elif defined(__clang__)
  61221. "muls r6, r5\n\t"
  61222. #else
  61223. "mul r6, r5\n\t"
  61224. #endif
  61225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61226. "adds r4, r4, r6\n\t"
  61227. #else
  61228. "add r4, r4, r6\n\t"
  61229. #endif
  61230. #ifdef WOLFSSL_KEIL
  61231. "adcs r2, r2, %[r]\n\t"
  61232. #elif defined(__clang__)
  61233. "adcs r2, %[r]\n\t"
  61234. #else
  61235. "adc r2, %[r]\n\t"
  61236. #endif
  61237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61238. "adds r4, r4, r6\n\t"
  61239. #else
  61240. "add r4, r4, r6\n\t"
  61241. #endif
  61242. #ifdef WOLFSSL_KEIL
  61243. "adcs r2, r2, %[r]\n\t"
  61244. #elif defined(__clang__)
  61245. "adcs r2, %[r]\n\t"
  61246. #else
  61247. "adc r2, %[r]\n\t"
  61248. #endif
  61249. "uxth r6, r7\n\t"
  61250. #ifdef WOLFSSL_KEIL
  61251. "muls r5, r6, r5\n\t"
  61252. #elif defined(__clang__)
  61253. "muls r5, r6\n\t"
  61254. #else
  61255. "mul r5, r6\n\t"
  61256. #endif
  61257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61258. "lsrs r6, r5, #16\n\t"
  61259. #else
  61260. "lsr r6, r5, #16\n\t"
  61261. #endif
  61262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61263. "lsls r5, r5, #16\n\t"
  61264. #else
  61265. "lsl r5, r5, #16\n\t"
  61266. #endif
  61267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61268. "adds r3, r3, r5\n\t"
  61269. #else
  61270. "add r3, r3, r5\n\t"
  61271. #endif
  61272. #ifdef WOLFSSL_KEIL
  61273. "adcs r4, r4, r6\n\t"
  61274. #elif defined(__clang__)
  61275. "adcs r4, r6\n\t"
  61276. #else
  61277. "adc r4, r6\n\t"
  61278. #endif
  61279. #ifdef WOLFSSL_KEIL
  61280. "adcs r2, r2, %[r]\n\t"
  61281. #elif defined(__clang__)
  61282. "adcs r2, %[r]\n\t"
  61283. #else
  61284. "adc r2, %[r]\n\t"
  61285. #endif
  61286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61287. "adds r3, r3, r5\n\t"
  61288. #else
  61289. "add r3, r3, r5\n\t"
  61290. #endif
  61291. #ifdef WOLFSSL_KEIL
  61292. "adcs r4, r4, r6\n\t"
  61293. #elif defined(__clang__)
  61294. "adcs r4, r6\n\t"
  61295. #else
  61296. "adc r4, r6\n\t"
  61297. #endif
  61298. #ifdef WOLFSSL_KEIL
  61299. "adcs r2, r2, %[r]\n\t"
  61300. #elif defined(__clang__)
  61301. "adcs r2, %[r]\n\t"
  61302. #else
  61303. "adc r2, %[r]\n\t"
  61304. #endif
  61305. "# A[7] * A[3]\n\t"
  61306. "mov %[a], r9\n\t"
  61307. "mov r7, lr\n\t"
  61308. "ldr %[a], [%[a], #28]\n\t"
  61309. "uxth r5, %[a]\n\t"
  61310. "uxth r6, r7\n\t"
  61311. #ifdef WOLFSSL_KEIL
  61312. "muls r6, r5, r6\n\t"
  61313. #elif defined(__clang__)
  61314. "muls r6, r5\n\t"
  61315. #else
  61316. "mul r6, r5\n\t"
  61317. #endif
  61318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61319. "adds r3, r3, r6\n\t"
  61320. #else
  61321. "add r3, r3, r6\n\t"
  61322. #endif
  61323. #ifdef WOLFSSL_KEIL
  61324. "adcs r4, r4, %[r]\n\t"
  61325. #elif defined(__clang__)
  61326. "adcs r4, %[r]\n\t"
  61327. #else
  61328. "adc r4, %[r]\n\t"
  61329. #endif
  61330. #ifdef WOLFSSL_KEIL
  61331. "adcs r2, r2, %[r]\n\t"
  61332. #elif defined(__clang__)
  61333. "adcs r2, %[r]\n\t"
  61334. #else
  61335. "adc r2, %[r]\n\t"
  61336. #endif
  61337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61338. "adds r3, r3, r6\n\t"
  61339. #else
  61340. "add r3, r3, r6\n\t"
  61341. #endif
  61342. #ifdef WOLFSSL_KEIL
  61343. "adcs r4, r4, %[r]\n\t"
  61344. #elif defined(__clang__)
  61345. "adcs r4, %[r]\n\t"
  61346. #else
  61347. "adc r4, %[r]\n\t"
  61348. #endif
  61349. #ifdef WOLFSSL_KEIL
  61350. "adcs r2, r2, %[r]\n\t"
  61351. #elif defined(__clang__)
  61352. "adcs r2, %[r]\n\t"
  61353. #else
  61354. "adc r2, %[r]\n\t"
  61355. #endif
  61356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61357. "lsrs r6, r7, #16\n\t"
  61358. #else
  61359. "lsr r6, r7, #16\n\t"
  61360. #endif
  61361. #ifdef WOLFSSL_KEIL
  61362. "muls r5, r6, r5\n\t"
  61363. #elif defined(__clang__)
  61364. "muls r5, r6\n\t"
  61365. #else
  61366. "mul r5, r6\n\t"
  61367. #endif
  61368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61369. "lsrs r6, r5, #16\n\t"
  61370. #else
  61371. "lsr r6, r5, #16\n\t"
  61372. #endif
  61373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61374. "lsls r5, r5, #16\n\t"
  61375. #else
  61376. "lsl r5, r5, #16\n\t"
  61377. #endif
  61378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61379. "adds r3, r3, r5\n\t"
  61380. #else
  61381. "add r3, r3, r5\n\t"
  61382. #endif
  61383. #ifdef WOLFSSL_KEIL
  61384. "adcs r4, r4, r6\n\t"
  61385. #elif defined(__clang__)
  61386. "adcs r4, r6\n\t"
  61387. #else
  61388. "adc r4, r6\n\t"
  61389. #endif
  61390. #ifdef WOLFSSL_KEIL
  61391. "adcs r2, r2, %[r]\n\t"
  61392. #elif defined(__clang__)
  61393. "adcs r2, %[r]\n\t"
  61394. #else
  61395. "adc r2, %[r]\n\t"
  61396. #endif
  61397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61398. "adds r3, r3, r5\n\t"
  61399. #else
  61400. "add r3, r3, r5\n\t"
  61401. #endif
  61402. #ifdef WOLFSSL_KEIL
  61403. "adcs r4, r4, r6\n\t"
  61404. #elif defined(__clang__)
  61405. "adcs r4, r6\n\t"
  61406. #else
  61407. "adc r4, r6\n\t"
  61408. #endif
  61409. #ifdef WOLFSSL_KEIL
  61410. "adcs r2, r2, %[r]\n\t"
  61411. #elif defined(__clang__)
  61412. "adcs r2, %[r]\n\t"
  61413. #else
  61414. "adc r2, %[r]\n\t"
  61415. #endif
  61416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61417. "lsrs r5, %[a], #16\n\t"
  61418. #else
  61419. "lsr r5, %[a], #16\n\t"
  61420. #endif
  61421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61422. "lsrs r6, r7, #16\n\t"
  61423. #else
  61424. "lsr r6, r7, #16\n\t"
  61425. #endif
  61426. #ifdef WOLFSSL_KEIL
  61427. "muls r6, r5, r6\n\t"
  61428. #elif defined(__clang__)
  61429. "muls r6, r5\n\t"
  61430. #else
  61431. "mul r6, r5\n\t"
  61432. #endif
  61433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61434. "adds r4, r4, r6\n\t"
  61435. #else
  61436. "add r4, r4, r6\n\t"
  61437. #endif
  61438. #ifdef WOLFSSL_KEIL
  61439. "adcs r2, r2, %[r]\n\t"
  61440. #elif defined(__clang__)
  61441. "adcs r2, %[r]\n\t"
  61442. #else
  61443. "adc r2, %[r]\n\t"
  61444. #endif
  61445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61446. "adds r4, r4, r6\n\t"
  61447. #else
  61448. "add r4, r4, r6\n\t"
  61449. #endif
  61450. #ifdef WOLFSSL_KEIL
  61451. "adcs r2, r2, %[r]\n\t"
  61452. #elif defined(__clang__)
  61453. "adcs r2, %[r]\n\t"
  61454. #else
  61455. "adc r2, %[r]\n\t"
  61456. #endif
  61457. "uxth r6, r7\n\t"
  61458. #ifdef WOLFSSL_KEIL
  61459. "muls r5, r6, r5\n\t"
  61460. #elif defined(__clang__)
  61461. "muls r5, r6\n\t"
  61462. #else
  61463. "mul r5, r6\n\t"
  61464. #endif
  61465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61466. "lsrs r6, r5, #16\n\t"
  61467. #else
  61468. "lsr r6, r5, #16\n\t"
  61469. #endif
  61470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61471. "lsls r5, r5, #16\n\t"
  61472. #else
  61473. "lsl r5, r5, #16\n\t"
  61474. #endif
  61475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61476. "adds r3, r3, r5\n\t"
  61477. #else
  61478. "add r3, r3, r5\n\t"
  61479. #endif
  61480. #ifdef WOLFSSL_KEIL
  61481. "adcs r4, r4, r6\n\t"
  61482. #elif defined(__clang__)
  61483. "adcs r4, r6\n\t"
  61484. #else
  61485. "adc r4, r6\n\t"
  61486. #endif
  61487. #ifdef WOLFSSL_KEIL
  61488. "adcs r2, r2, %[r]\n\t"
  61489. #elif defined(__clang__)
  61490. "adcs r2, %[r]\n\t"
  61491. #else
  61492. "adc r2, %[r]\n\t"
  61493. #endif
  61494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61495. "adds r3, r3, r5\n\t"
  61496. #else
  61497. "add r3, r3, r5\n\t"
  61498. #endif
  61499. #ifdef WOLFSSL_KEIL
  61500. "adcs r4, r4, r6\n\t"
  61501. #elif defined(__clang__)
  61502. "adcs r4, r6\n\t"
  61503. #else
  61504. "adc r4, r6\n\t"
  61505. #endif
  61506. #ifdef WOLFSSL_KEIL
  61507. "adcs r2, r2, %[r]\n\t"
  61508. #elif defined(__clang__)
  61509. "adcs r2, %[r]\n\t"
  61510. #else
  61511. "adc r2, %[r]\n\t"
  61512. #endif
  61513. "# A[6] * A[4]\n\t"
  61514. "mov %[a], r9\n\t"
  61515. "ldr r7, [%[a], #16]\n\t"
  61516. "ldr %[a], [%[a], #24]\n\t"
  61517. "uxth r5, %[a]\n\t"
  61518. "uxth r6, r7\n\t"
  61519. #ifdef WOLFSSL_KEIL
  61520. "muls r6, r5, r6\n\t"
  61521. #elif defined(__clang__)
  61522. "muls r6, r5\n\t"
  61523. #else
  61524. "mul r6, r5\n\t"
  61525. #endif
  61526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61527. "adds r3, r3, r6\n\t"
  61528. #else
  61529. "add r3, r3, r6\n\t"
  61530. #endif
  61531. #ifdef WOLFSSL_KEIL
  61532. "adcs r4, r4, %[r]\n\t"
  61533. #elif defined(__clang__)
  61534. "adcs r4, %[r]\n\t"
  61535. #else
  61536. "adc r4, %[r]\n\t"
  61537. #endif
  61538. #ifdef WOLFSSL_KEIL
  61539. "adcs r2, r2, %[r]\n\t"
  61540. #elif defined(__clang__)
  61541. "adcs r2, %[r]\n\t"
  61542. #else
  61543. "adc r2, %[r]\n\t"
  61544. #endif
  61545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61546. "adds r3, r3, r6\n\t"
  61547. #else
  61548. "add r3, r3, r6\n\t"
  61549. #endif
  61550. #ifdef WOLFSSL_KEIL
  61551. "adcs r4, r4, %[r]\n\t"
  61552. #elif defined(__clang__)
  61553. "adcs r4, %[r]\n\t"
  61554. #else
  61555. "adc r4, %[r]\n\t"
  61556. #endif
  61557. #ifdef WOLFSSL_KEIL
  61558. "adcs r2, r2, %[r]\n\t"
  61559. #elif defined(__clang__)
  61560. "adcs r2, %[r]\n\t"
  61561. #else
  61562. "adc r2, %[r]\n\t"
  61563. #endif
  61564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61565. "lsrs r6, r7, #16\n\t"
  61566. #else
  61567. "lsr r6, r7, #16\n\t"
  61568. #endif
  61569. #ifdef WOLFSSL_KEIL
  61570. "muls r5, r6, r5\n\t"
  61571. #elif defined(__clang__)
  61572. "muls r5, r6\n\t"
  61573. #else
  61574. "mul r5, r6\n\t"
  61575. #endif
  61576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61577. "lsrs r6, r5, #16\n\t"
  61578. #else
  61579. "lsr r6, r5, #16\n\t"
  61580. #endif
  61581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61582. "lsls r5, r5, #16\n\t"
  61583. #else
  61584. "lsl r5, r5, #16\n\t"
  61585. #endif
  61586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61587. "adds r3, r3, r5\n\t"
  61588. #else
  61589. "add r3, r3, r5\n\t"
  61590. #endif
  61591. #ifdef WOLFSSL_KEIL
  61592. "adcs r4, r4, r6\n\t"
  61593. #elif defined(__clang__)
  61594. "adcs r4, r6\n\t"
  61595. #else
  61596. "adc r4, r6\n\t"
  61597. #endif
  61598. #ifdef WOLFSSL_KEIL
  61599. "adcs r2, r2, %[r]\n\t"
  61600. #elif defined(__clang__)
  61601. "adcs r2, %[r]\n\t"
  61602. #else
  61603. "adc r2, %[r]\n\t"
  61604. #endif
  61605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61606. "adds r3, r3, r5\n\t"
  61607. #else
  61608. "add r3, r3, r5\n\t"
  61609. #endif
  61610. #ifdef WOLFSSL_KEIL
  61611. "adcs r4, r4, r6\n\t"
  61612. #elif defined(__clang__)
  61613. "adcs r4, r6\n\t"
  61614. #else
  61615. "adc r4, r6\n\t"
  61616. #endif
  61617. #ifdef WOLFSSL_KEIL
  61618. "adcs r2, r2, %[r]\n\t"
  61619. #elif defined(__clang__)
  61620. "adcs r2, %[r]\n\t"
  61621. #else
  61622. "adc r2, %[r]\n\t"
  61623. #endif
  61624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61625. "lsrs r5, %[a], #16\n\t"
  61626. #else
  61627. "lsr r5, %[a], #16\n\t"
  61628. #endif
  61629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61630. "lsrs r6, r7, #16\n\t"
  61631. #else
  61632. "lsr r6, r7, #16\n\t"
  61633. #endif
  61634. #ifdef WOLFSSL_KEIL
  61635. "muls r6, r5, r6\n\t"
  61636. #elif defined(__clang__)
  61637. "muls r6, r5\n\t"
  61638. #else
  61639. "mul r6, r5\n\t"
  61640. #endif
  61641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61642. "adds r4, r4, r6\n\t"
  61643. #else
  61644. "add r4, r4, r6\n\t"
  61645. #endif
  61646. #ifdef WOLFSSL_KEIL
  61647. "adcs r2, r2, %[r]\n\t"
  61648. #elif defined(__clang__)
  61649. "adcs r2, %[r]\n\t"
  61650. #else
  61651. "adc r2, %[r]\n\t"
  61652. #endif
  61653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61654. "adds r4, r4, r6\n\t"
  61655. #else
  61656. "add r4, r4, r6\n\t"
  61657. #endif
  61658. #ifdef WOLFSSL_KEIL
  61659. "adcs r2, r2, %[r]\n\t"
  61660. #elif defined(__clang__)
  61661. "adcs r2, %[r]\n\t"
  61662. #else
  61663. "adc r2, %[r]\n\t"
  61664. #endif
  61665. "uxth r6, r7\n\t"
  61666. #ifdef WOLFSSL_KEIL
  61667. "muls r5, r6, r5\n\t"
  61668. #elif defined(__clang__)
  61669. "muls r5, r6\n\t"
  61670. #else
  61671. "mul r5, r6\n\t"
  61672. #endif
  61673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61674. "lsrs r6, r5, #16\n\t"
  61675. #else
  61676. "lsr r6, r5, #16\n\t"
  61677. #endif
  61678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61679. "lsls r5, r5, #16\n\t"
  61680. #else
  61681. "lsl r5, r5, #16\n\t"
  61682. #endif
  61683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61684. "adds r3, r3, r5\n\t"
  61685. #else
  61686. "add r3, r3, r5\n\t"
  61687. #endif
  61688. #ifdef WOLFSSL_KEIL
  61689. "adcs r4, r4, r6\n\t"
  61690. #elif defined(__clang__)
  61691. "adcs r4, r6\n\t"
  61692. #else
  61693. "adc r4, r6\n\t"
  61694. #endif
  61695. #ifdef WOLFSSL_KEIL
  61696. "adcs r2, r2, %[r]\n\t"
  61697. #elif defined(__clang__)
  61698. "adcs r2, %[r]\n\t"
  61699. #else
  61700. "adc r2, %[r]\n\t"
  61701. #endif
  61702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61703. "adds r3, r3, r5\n\t"
  61704. #else
  61705. "add r3, r3, r5\n\t"
  61706. #endif
  61707. #ifdef WOLFSSL_KEIL
  61708. "adcs r4, r4, r6\n\t"
  61709. #elif defined(__clang__)
  61710. "adcs r4, r6\n\t"
  61711. #else
  61712. "adc r4, r6\n\t"
  61713. #endif
  61714. #ifdef WOLFSSL_KEIL
  61715. "adcs r2, r2, %[r]\n\t"
  61716. #elif defined(__clang__)
  61717. "adcs r2, %[r]\n\t"
  61718. #else
  61719. "adc r2, %[r]\n\t"
  61720. #endif
  61721. "# A[5] * A[5]\n\t"
  61722. "mov %[a], r9\n\t"
  61723. "ldr r7, [%[a], #20]\n\t"
  61724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61725. "lsrs r6, r7, #16\n\t"
  61726. #else
  61727. "lsr r6, r7, #16\n\t"
  61728. #endif
  61729. "uxth r5, r7\n\t"
  61730. #ifdef WOLFSSL_KEIL
  61731. "muls r5, r5, r5\n\t"
  61732. #elif defined(__clang__)
  61733. "muls r5, r5\n\t"
  61734. #else
  61735. "mul r5, r5\n\t"
  61736. #endif
  61737. #ifdef WOLFSSL_KEIL
  61738. "muls r6, r6, r6\n\t"
  61739. #elif defined(__clang__)
  61740. "muls r6, r6\n\t"
  61741. #else
  61742. "mul r6, r6\n\t"
  61743. #endif
  61744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61745. "adds r3, r3, r5\n\t"
  61746. #else
  61747. "add r3, r3, r5\n\t"
  61748. #endif
  61749. #ifdef WOLFSSL_KEIL
  61750. "adcs r4, r4, r6\n\t"
  61751. #elif defined(__clang__)
  61752. "adcs r4, r6\n\t"
  61753. #else
  61754. "adc r4, r6\n\t"
  61755. #endif
  61756. #ifdef WOLFSSL_KEIL
  61757. "adcs r2, r2, %[r]\n\t"
  61758. #elif defined(__clang__)
  61759. "adcs r2, %[r]\n\t"
  61760. #else
  61761. "adc r2, %[r]\n\t"
  61762. #endif
  61763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61764. "lsrs r6, r7, #16\n\t"
  61765. #else
  61766. "lsr r6, r7, #16\n\t"
  61767. #endif
  61768. "uxth r5, r7\n\t"
  61769. #ifdef WOLFSSL_KEIL
  61770. "muls r5, r6, r5\n\t"
  61771. #elif defined(__clang__)
  61772. "muls r5, r6\n\t"
  61773. #else
  61774. "mul r5, r6\n\t"
  61775. #endif
  61776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61777. "lsrs r6, r5, #15\n\t"
  61778. #else
  61779. "lsr r6, r5, #15\n\t"
  61780. #endif
  61781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61782. "lsls r5, r5, #17\n\t"
  61783. #else
  61784. "lsl r5, r5, #17\n\t"
  61785. #endif
  61786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61787. "adds r3, r3, r5\n\t"
  61788. #else
  61789. "add r3, r3, r5\n\t"
  61790. #endif
  61791. #ifdef WOLFSSL_KEIL
  61792. "adcs r4, r4, r6\n\t"
  61793. #elif defined(__clang__)
  61794. "adcs r4, r6\n\t"
  61795. #else
  61796. "adc r4, r6\n\t"
  61797. #endif
  61798. #ifdef WOLFSSL_KEIL
  61799. "adcs r2, r2, %[r]\n\t"
  61800. #elif defined(__clang__)
  61801. "adcs r2, %[r]\n\t"
  61802. #else
  61803. "adc r2, %[r]\n\t"
  61804. #endif
  61805. "str r3, [sp, #40]\n\t"
  61806. "# A[6] * A[5]\n\t"
  61807. "movs r3, #0\n\t"
  61808. "ldr %[a], [%[a], #24]\n\t"
  61809. "uxth r5, %[a]\n\t"
  61810. "uxth r6, r7\n\t"
  61811. #ifdef WOLFSSL_KEIL
  61812. "muls r6, r5, r6\n\t"
  61813. #elif defined(__clang__)
  61814. "muls r6, r5\n\t"
  61815. #else
  61816. "mul r6, r5\n\t"
  61817. #endif
  61818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61819. "adds r4, r4, r6\n\t"
  61820. #else
  61821. "add r4, r4, r6\n\t"
  61822. #endif
  61823. #ifdef WOLFSSL_KEIL
  61824. "adcs r2, r2, %[r]\n\t"
  61825. #elif defined(__clang__)
  61826. "adcs r2, %[r]\n\t"
  61827. #else
  61828. "adc r2, %[r]\n\t"
  61829. #endif
  61830. #ifdef WOLFSSL_KEIL
  61831. "adcs r3, r3, %[r]\n\t"
  61832. #elif defined(__clang__)
  61833. "adcs r3, %[r]\n\t"
  61834. #else
  61835. "adc r3, %[r]\n\t"
  61836. #endif
  61837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61838. "adds r4, r4, r6\n\t"
  61839. #else
  61840. "add r4, r4, r6\n\t"
  61841. #endif
  61842. #ifdef WOLFSSL_KEIL
  61843. "adcs r2, r2, %[r]\n\t"
  61844. #elif defined(__clang__)
  61845. "adcs r2, %[r]\n\t"
  61846. #else
  61847. "adc r2, %[r]\n\t"
  61848. #endif
  61849. #ifdef WOLFSSL_KEIL
  61850. "adcs r3, r3, %[r]\n\t"
  61851. #elif defined(__clang__)
  61852. "adcs r3, %[r]\n\t"
  61853. #else
  61854. "adc r3, %[r]\n\t"
  61855. #endif
  61856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61857. "lsrs r6, r7, #16\n\t"
  61858. #else
  61859. "lsr r6, r7, #16\n\t"
  61860. #endif
  61861. #ifdef WOLFSSL_KEIL
  61862. "muls r5, r6, r5\n\t"
  61863. #elif defined(__clang__)
  61864. "muls r5, r6\n\t"
  61865. #else
  61866. "mul r5, r6\n\t"
  61867. #endif
  61868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61869. "lsrs r6, r5, #16\n\t"
  61870. #else
  61871. "lsr r6, r5, #16\n\t"
  61872. #endif
  61873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61874. "lsls r5, r5, #16\n\t"
  61875. #else
  61876. "lsl r5, r5, #16\n\t"
  61877. #endif
  61878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61879. "adds r4, r4, r5\n\t"
  61880. #else
  61881. "add r4, r4, r5\n\t"
  61882. #endif
  61883. #ifdef WOLFSSL_KEIL
  61884. "adcs r2, r2, r6\n\t"
  61885. #elif defined(__clang__)
  61886. "adcs r2, r6\n\t"
  61887. #else
  61888. "adc r2, r6\n\t"
  61889. #endif
  61890. #ifdef WOLFSSL_KEIL
  61891. "adcs r3, r3, %[r]\n\t"
  61892. #elif defined(__clang__)
  61893. "adcs r3, %[r]\n\t"
  61894. #else
  61895. "adc r3, %[r]\n\t"
  61896. #endif
  61897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61898. "adds r4, r4, r5\n\t"
  61899. #else
  61900. "add r4, r4, r5\n\t"
  61901. #endif
  61902. #ifdef WOLFSSL_KEIL
  61903. "adcs r2, r2, r6\n\t"
  61904. #elif defined(__clang__)
  61905. "adcs r2, r6\n\t"
  61906. #else
  61907. "adc r2, r6\n\t"
  61908. #endif
  61909. #ifdef WOLFSSL_KEIL
  61910. "adcs r3, r3, %[r]\n\t"
  61911. #elif defined(__clang__)
  61912. "adcs r3, %[r]\n\t"
  61913. #else
  61914. "adc r3, %[r]\n\t"
  61915. #endif
  61916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61917. "lsrs r5, %[a], #16\n\t"
  61918. #else
  61919. "lsr r5, %[a], #16\n\t"
  61920. #endif
  61921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61922. "lsrs r6, r7, #16\n\t"
  61923. #else
  61924. "lsr r6, r7, #16\n\t"
  61925. #endif
  61926. #ifdef WOLFSSL_KEIL
  61927. "muls r6, r5, r6\n\t"
  61928. #elif defined(__clang__)
  61929. "muls r6, r5\n\t"
  61930. #else
  61931. "mul r6, r5\n\t"
  61932. #endif
  61933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61934. "adds r2, r2, r6\n\t"
  61935. #else
  61936. "add r2, r2, r6\n\t"
  61937. #endif
  61938. #ifdef WOLFSSL_KEIL
  61939. "adcs r3, r3, %[r]\n\t"
  61940. #elif defined(__clang__)
  61941. "adcs r3, %[r]\n\t"
  61942. #else
  61943. "adc r3, %[r]\n\t"
  61944. #endif
  61945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61946. "adds r2, r2, r6\n\t"
  61947. #else
  61948. "add r2, r2, r6\n\t"
  61949. #endif
  61950. #ifdef WOLFSSL_KEIL
  61951. "adcs r3, r3, %[r]\n\t"
  61952. #elif defined(__clang__)
  61953. "adcs r3, %[r]\n\t"
  61954. #else
  61955. "adc r3, %[r]\n\t"
  61956. #endif
  61957. "uxth r6, r7\n\t"
  61958. #ifdef WOLFSSL_KEIL
  61959. "muls r5, r6, r5\n\t"
  61960. #elif defined(__clang__)
  61961. "muls r5, r6\n\t"
  61962. #else
  61963. "mul r5, r6\n\t"
  61964. #endif
  61965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61966. "lsrs r6, r5, #16\n\t"
  61967. #else
  61968. "lsr r6, r5, #16\n\t"
  61969. #endif
  61970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61971. "lsls r5, r5, #16\n\t"
  61972. #else
  61973. "lsl r5, r5, #16\n\t"
  61974. #endif
  61975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61976. "adds r4, r4, r5\n\t"
  61977. #else
  61978. "add r4, r4, r5\n\t"
  61979. #endif
  61980. #ifdef WOLFSSL_KEIL
  61981. "adcs r2, r2, r6\n\t"
  61982. #elif defined(__clang__)
  61983. "adcs r2, r6\n\t"
  61984. #else
  61985. "adc r2, r6\n\t"
  61986. #endif
  61987. #ifdef WOLFSSL_KEIL
  61988. "adcs r3, r3, %[r]\n\t"
  61989. #elif defined(__clang__)
  61990. "adcs r3, %[r]\n\t"
  61991. #else
  61992. "adc r3, %[r]\n\t"
  61993. #endif
  61994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  61995. "adds r4, r4, r5\n\t"
  61996. #else
  61997. "add r4, r4, r5\n\t"
  61998. #endif
  61999. #ifdef WOLFSSL_KEIL
  62000. "adcs r2, r2, r6\n\t"
  62001. #elif defined(__clang__)
  62002. "adcs r2, r6\n\t"
  62003. #else
  62004. "adc r2, r6\n\t"
  62005. #endif
  62006. #ifdef WOLFSSL_KEIL
  62007. "adcs r3, r3, %[r]\n\t"
  62008. #elif defined(__clang__)
  62009. "adcs r3, %[r]\n\t"
  62010. #else
  62011. "adc r3, %[r]\n\t"
  62012. #endif
  62013. "# A[7] * A[4]\n\t"
  62014. "mov %[a], r9\n\t"
  62015. "ldr r7, [%[a], #16]\n\t"
  62016. "ldr %[a], [%[a], #28]\n\t"
  62017. "uxth r5, %[a]\n\t"
  62018. "uxth r6, r7\n\t"
  62019. #ifdef WOLFSSL_KEIL
  62020. "muls r6, r5, r6\n\t"
  62021. #elif defined(__clang__)
  62022. "muls r6, r5\n\t"
  62023. #else
  62024. "mul r6, r5\n\t"
  62025. #endif
  62026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62027. "adds r4, r4, r6\n\t"
  62028. #else
  62029. "add r4, r4, r6\n\t"
  62030. #endif
  62031. #ifdef WOLFSSL_KEIL
  62032. "adcs r2, r2, %[r]\n\t"
  62033. #elif defined(__clang__)
  62034. "adcs r2, %[r]\n\t"
  62035. #else
  62036. "adc r2, %[r]\n\t"
  62037. #endif
  62038. #ifdef WOLFSSL_KEIL
  62039. "adcs r3, r3, %[r]\n\t"
  62040. #elif defined(__clang__)
  62041. "adcs r3, %[r]\n\t"
  62042. #else
  62043. "adc r3, %[r]\n\t"
  62044. #endif
  62045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62046. "adds r4, r4, r6\n\t"
  62047. #else
  62048. "add r4, r4, r6\n\t"
  62049. #endif
  62050. #ifdef WOLFSSL_KEIL
  62051. "adcs r2, r2, %[r]\n\t"
  62052. #elif defined(__clang__)
  62053. "adcs r2, %[r]\n\t"
  62054. #else
  62055. "adc r2, %[r]\n\t"
  62056. #endif
  62057. #ifdef WOLFSSL_KEIL
  62058. "adcs r3, r3, %[r]\n\t"
  62059. #elif defined(__clang__)
  62060. "adcs r3, %[r]\n\t"
  62061. #else
  62062. "adc r3, %[r]\n\t"
  62063. #endif
  62064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62065. "lsrs r6, r7, #16\n\t"
  62066. #else
  62067. "lsr r6, r7, #16\n\t"
  62068. #endif
  62069. #ifdef WOLFSSL_KEIL
  62070. "muls r5, r6, r5\n\t"
  62071. #elif defined(__clang__)
  62072. "muls r5, r6\n\t"
  62073. #else
  62074. "mul r5, r6\n\t"
  62075. #endif
  62076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62077. "lsrs r6, r5, #16\n\t"
  62078. #else
  62079. "lsr r6, r5, #16\n\t"
  62080. #endif
  62081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62082. "lsls r5, r5, #16\n\t"
  62083. #else
  62084. "lsl r5, r5, #16\n\t"
  62085. #endif
  62086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62087. "adds r4, r4, r5\n\t"
  62088. #else
  62089. "add r4, r4, r5\n\t"
  62090. #endif
  62091. #ifdef WOLFSSL_KEIL
  62092. "adcs r2, r2, r6\n\t"
  62093. #elif defined(__clang__)
  62094. "adcs r2, r6\n\t"
  62095. #else
  62096. "adc r2, r6\n\t"
  62097. #endif
  62098. #ifdef WOLFSSL_KEIL
  62099. "adcs r3, r3, %[r]\n\t"
  62100. #elif defined(__clang__)
  62101. "adcs r3, %[r]\n\t"
  62102. #else
  62103. "adc r3, %[r]\n\t"
  62104. #endif
  62105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62106. "adds r4, r4, r5\n\t"
  62107. #else
  62108. "add r4, r4, r5\n\t"
  62109. #endif
  62110. #ifdef WOLFSSL_KEIL
  62111. "adcs r2, r2, r6\n\t"
  62112. #elif defined(__clang__)
  62113. "adcs r2, r6\n\t"
  62114. #else
  62115. "adc r2, r6\n\t"
  62116. #endif
  62117. #ifdef WOLFSSL_KEIL
  62118. "adcs r3, r3, %[r]\n\t"
  62119. #elif defined(__clang__)
  62120. "adcs r3, %[r]\n\t"
  62121. #else
  62122. "adc r3, %[r]\n\t"
  62123. #endif
  62124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62125. "lsrs r5, %[a], #16\n\t"
  62126. #else
  62127. "lsr r5, %[a], #16\n\t"
  62128. #endif
  62129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62130. "lsrs r6, r7, #16\n\t"
  62131. #else
  62132. "lsr r6, r7, #16\n\t"
  62133. #endif
  62134. #ifdef WOLFSSL_KEIL
  62135. "muls r6, r5, r6\n\t"
  62136. #elif defined(__clang__)
  62137. "muls r6, r5\n\t"
  62138. #else
  62139. "mul r6, r5\n\t"
  62140. #endif
  62141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62142. "adds r2, r2, r6\n\t"
  62143. #else
  62144. "add r2, r2, r6\n\t"
  62145. #endif
  62146. #ifdef WOLFSSL_KEIL
  62147. "adcs r3, r3, %[r]\n\t"
  62148. #elif defined(__clang__)
  62149. "adcs r3, %[r]\n\t"
  62150. #else
  62151. "adc r3, %[r]\n\t"
  62152. #endif
  62153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62154. "adds r2, r2, r6\n\t"
  62155. #else
  62156. "add r2, r2, r6\n\t"
  62157. #endif
  62158. #ifdef WOLFSSL_KEIL
  62159. "adcs r3, r3, %[r]\n\t"
  62160. #elif defined(__clang__)
  62161. "adcs r3, %[r]\n\t"
  62162. #else
  62163. "adc r3, %[r]\n\t"
  62164. #endif
  62165. "uxth r6, r7\n\t"
  62166. #ifdef WOLFSSL_KEIL
  62167. "muls r5, r6, r5\n\t"
  62168. #elif defined(__clang__)
  62169. "muls r5, r6\n\t"
  62170. #else
  62171. "mul r5, r6\n\t"
  62172. #endif
  62173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62174. "lsrs r6, r5, #16\n\t"
  62175. #else
  62176. "lsr r6, r5, #16\n\t"
  62177. #endif
  62178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62179. "lsls r5, r5, #16\n\t"
  62180. #else
  62181. "lsl r5, r5, #16\n\t"
  62182. #endif
  62183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62184. "adds r4, r4, r5\n\t"
  62185. #else
  62186. "add r4, r4, r5\n\t"
  62187. #endif
  62188. #ifdef WOLFSSL_KEIL
  62189. "adcs r2, r2, r6\n\t"
  62190. #elif defined(__clang__)
  62191. "adcs r2, r6\n\t"
  62192. #else
  62193. "adc r2, r6\n\t"
  62194. #endif
  62195. #ifdef WOLFSSL_KEIL
  62196. "adcs r3, r3, %[r]\n\t"
  62197. #elif defined(__clang__)
  62198. "adcs r3, %[r]\n\t"
  62199. #else
  62200. "adc r3, %[r]\n\t"
  62201. #endif
  62202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62203. "adds r4, r4, r5\n\t"
  62204. #else
  62205. "add r4, r4, r5\n\t"
  62206. #endif
  62207. #ifdef WOLFSSL_KEIL
  62208. "adcs r2, r2, r6\n\t"
  62209. #elif defined(__clang__)
  62210. "adcs r2, r6\n\t"
  62211. #else
  62212. "adc r2, r6\n\t"
  62213. #endif
  62214. #ifdef WOLFSSL_KEIL
  62215. "adcs r3, r3, %[r]\n\t"
  62216. #elif defined(__clang__)
  62217. "adcs r3, %[r]\n\t"
  62218. #else
  62219. "adc r3, %[r]\n\t"
  62220. #endif
  62221. "# A[8] * A[3]\n\t"
  62222. "mov %[a], r9\n\t"
  62223. "mov r7, lr\n\t"
  62224. "ldr %[a], [%[a], #32]\n\t"
  62225. "uxth r5, %[a]\n\t"
  62226. "uxth r6, r7\n\t"
  62227. #ifdef WOLFSSL_KEIL
  62228. "muls r6, r5, r6\n\t"
  62229. #elif defined(__clang__)
  62230. "muls r6, r5\n\t"
  62231. #else
  62232. "mul r6, r5\n\t"
  62233. #endif
  62234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62235. "adds r4, r4, r6\n\t"
  62236. #else
  62237. "add r4, r4, r6\n\t"
  62238. #endif
  62239. #ifdef WOLFSSL_KEIL
  62240. "adcs r2, r2, %[r]\n\t"
  62241. #elif defined(__clang__)
  62242. "adcs r2, %[r]\n\t"
  62243. #else
  62244. "adc r2, %[r]\n\t"
  62245. #endif
  62246. #ifdef WOLFSSL_KEIL
  62247. "adcs r3, r3, %[r]\n\t"
  62248. #elif defined(__clang__)
  62249. "adcs r3, %[r]\n\t"
  62250. #else
  62251. "adc r3, %[r]\n\t"
  62252. #endif
  62253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62254. "adds r4, r4, r6\n\t"
  62255. #else
  62256. "add r4, r4, r6\n\t"
  62257. #endif
  62258. #ifdef WOLFSSL_KEIL
  62259. "adcs r2, r2, %[r]\n\t"
  62260. #elif defined(__clang__)
  62261. "adcs r2, %[r]\n\t"
  62262. #else
  62263. "adc r2, %[r]\n\t"
  62264. #endif
  62265. #ifdef WOLFSSL_KEIL
  62266. "adcs r3, r3, %[r]\n\t"
  62267. #elif defined(__clang__)
  62268. "adcs r3, %[r]\n\t"
  62269. #else
  62270. "adc r3, %[r]\n\t"
  62271. #endif
  62272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62273. "lsrs r6, r7, #16\n\t"
  62274. #else
  62275. "lsr r6, r7, #16\n\t"
  62276. #endif
  62277. #ifdef WOLFSSL_KEIL
  62278. "muls r5, r6, r5\n\t"
  62279. #elif defined(__clang__)
  62280. "muls r5, r6\n\t"
  62281. #else
  62282. "mul r5, r6\n\t"
  62283. #endif
  62284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62285. "lsrs r6, r5, #16\n\t"
  62286. #else
  62287. "lsr r6, r5, #16\n\t"
  62288. #endif
  62289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62290. "lsls r5, r5, #16\n\t"
  62291. #else
  62292. "lsl r5, r5, #16\n\t"
  62293. #endif
  62294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62295. "adds r4, r4, r5\n\t"
  62296. #else
  62297. "add r4, r4, r5\n\t"
  62298. #endif
  62299. #ifdef WOLFSSL_KEIL
  62300. "adcs r2, r2, r6\n\t"
  62301. #elif defined(__clang__)
  62302. "adcs r2, r6\n\t"
  62303. #else
  62304. "adc r2, r6\n\t"
  62305. #endif
  62306. #ifdef WOLFSSL_KEIL
  62307. "adcs r3, r3, %[r]\n\t"
  62308. #elif defined(__clang__)
  62309. "adcs r3, %[r]\n\t"
  62310. #else
  62311. "adc r3, %[r]\n\t"
  62312. #endif
  62313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62314. "adds r4, r4, r5\n\t"
  62315. #else
  62316. "add r4, r4, r5\n\t"
  62317. #endif
  62318. #ifdef WOLFSSL_KEIL
  62319. "adcs r2, r2, r6\n\t"
  62320. #elif defined(__clang__)
  62321. "adcs r2, r6\n\t"
  62322. #else
  62323. "adc r2, r6\n\t"
  62324. #endif
  62325. #ifdef WOLFSSL_KEIL
  62326. "adcs r3, r3, %[r]\n\t"
  62327. #elif defined(__clang__)
  62328. "adcs r3, %[r]\n\t"
  62329. #else
  62330. "adc r3, %[r]\n\t"
  62331. #endif
  62332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62333. "lsrs r5, %[a], #16\n\t"
  62334. #else
  62335. "lsr r5, %[a], #16\n\t"
  62336. #endif
  62337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62338. "lsrs r6, r7, #16\n\t"
  62339. #else
  62340. "lsr r6, r7, #16\n\t"
  62341. #endif
  62342. #ifdef WOLFSSL_KEIL
  62343. "muls r6, r5, r6\n\t"
  62344. #elif defined(__clang__)
  62345. "muls r6, r5\n\t"
  62346. #else
  62347. "mul r6, r5\n\t"
  62348. #endif
  62349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62350. "adds r2, r2, r6\n\t"
  62351. #else
  62352. "add r2, r2, r6\n\t"
  62353. #endif
  62354. #ifdef WOLFSSL_KEIL
  62355. "adcs r3, r3, %[r]\n\t"
  62356. #elif defined(__clang__)
  62357. "adcs r3, %[r]\n\t"
  62358. #else
  62359. "adc r3, %[r]\n\t"
  62360. #endif
  62361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62362. "adds r2, r2, r6\n\t"
  62363. #else
  62364. "add r2, r2, r6\n\t"
  62365. #endif
  62366. #ifdef WOLFSSL_KEIL
  62367. "adcs r3, r3, %[r]\n\t"
  62368. #elif defined(__clang__)
  62369. "adcs r3, %[r]\n\t"
  62370. #else
  62371. "adc r3, %[r]\n\t"
  62372. #endif
  62373. "uxth r6, r7\n\t"
  62374. #ifdef WOLFSSL_KEIL
  62375. "muls r5, r6, r5\n\t"
  62376. #elif defined(__clang__)
  62377. "muls r5, r6\n\t"
  62378. #else
  62379. "mul r5, r6\n\t"
  62380. #endif
  62381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62382. "lsrs r6, r5, #16\n\t"
  62383. #else
  62384. "lsr r6, r5, #16\n\t"
  62385. #endif
  62386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62387. "lsls r5, r5, #16\n\t"
  62388. #else
  62389. "lsl r5, r5, #16\n\t"
  62390. #endif
  62391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62392. "adds r4, r4, r5\n\t"
  62393. #else
  62394. "add r4, r4, r5\n\t"
  62395. #endif
  62396. #ifdef WOLFSSL_KEIL
  62397. "adcs r2, r2, r6\n\t"
  62398. #elif defined(__clang__)
  62399. "adcs r2, r6\n\t"
  62400. #else
  62401. "adc r2, r6\n\t"
  62402. #endif
  62403. #ifdef WOLFSSL_KEIL
  62404. "adcs r3, r3, %[r]\n\t"
  62405. #elif defined(__clang__)
  62406. "adcs r3, %[r]\n\t"
  62407. #else
  62408. "adc r3, %[r]\n\t"
  62409. #endif
  62410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62411. "adds r4, r4, r5\n\t"
  62412. #else
  62413. "add r4, r4, r5\n\t"
  62414. #endif
  62415. #ifdef WOLFSSL_KEIL
  62416. "adcs r2, r2, r6\n\t"
  62417. #elif defined(__clang__)
  62418. "adcs r2, r6\n\t"
  62419. #else
  62420. "adc r2, r6\n\t"
  62421. #endif
  62422. #ifdef WOLFSSL_KEIL
  62423. "adcs r3, r3, %[r]\n\t"
  62424. #elif defined(__clang__)
  62425. "adcs r3, %[r]\n\t"
  62426. #else
  62427. "adc r3, %[r]\n\t"
  62428. #endif
  62429. "# A[9] * A[2]\n\t"
  62430. "mov %[a], r9\n\t"
  62431. "mov r7, r12\n\t"
  62432. "ldr %[a], [%[a], #36]\n\t"
  62433. "uxth r5, %[a]\n\t"
  62434. "uxth r6, r7\n\t"
  62435. #ifdef WOLFSSL_KEIL
  62436. "muls r6, r5, r6\n\t"
  62437. #elif defined(__clang__)
  62438. "muls r6, r5\n\t"
  62439. #else
  62440. "mul r6, r5\n\t"
  62441. #endif
  62442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62443. "adds r4, r4, r6\n\t"
  62444. #else
  62445. "add r4, r4, r6\n\t"
  62446. #endif
  62447. #ifdef WOLFSSL_KEIL
  62448. "adcs r2, r2, %[r]\n\t"
  62449. #elif defined(__clang__)
  62450. "adcs r2, %[r]\n\t"
  62451. #else
  62452. "adc r2, %[r]\n\t"
  62453. #endif
  62454. #ifdef WOLFSSL_KEIL
  62455. "adcs r3, r3, %[r]\n\t"
  62456. #elif defined(__clang__)
  62457. "adcs r3, %[r]\n\t"
  62458. #else
  62459. "adc r3, %[r]\n\t"
  62460. #endif
  62461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62462. "adds r4, r4, r6\n\t"
  62463. #else
  62464. "add r4, r4, r6\n\t"
  62465. #endif
  62466. #ifdef WOLFSSL_KEIL
  62467. "adcs r2, r2, %[r]\n\t"
  62468. #elif defined(__clang__)
  62469. "adcs r2, %[r]\n\t"
  62470. #else
  62471. "adc r2, %[r]\n\t"
  62472. #endif
  62473. #ifdef WOLFSSL_KEIL
  62474. "adcs r3, r3, %[r]\n\t"
  62475. #elif defined(__clang__)
  62476. "adcs r3, %[r]\n\t"
  62477. #else
  62478. "adc r3, %[r]\n\t"
  62479. #endif
  62480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62481. "lsrs r6, r7, #16\n\t"
  62482. #else
  62483. "lsr r6, r7, #16\n\t"
  62484. #endif
  62485. #ifdef WOLFSSL_KEIL
  62486. "muls r5, r6, r5\n\t"
  62487. #elif defined(__clang__)
  62488. "muls r5, r6\n\t"
  62489. #else
  62490. "mul r5, r6\n\t"
  62491. #endif
  62492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62493. "lsrs r6, r5, #16\n\t"
  62494. #else
  62495. "lsr r6, r5, #16\n\t"
  62496. #endif
  62497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62498. "lsls r5, r5, #16\n\t"
  62499. #else
  62500. "lsl r5, r5, #16\n\t"
  62501. #endif
  62502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62503. "adds r4, r4, r5\n\t"
  62504. #else
  62505. "add r4, r4, r5\n\t"
  62506. #endif
  62507. #ifdef WOLFSSL_KEIL
  62508. "adcs r2, r2, r6\n\t"
  62509. #elif defined(__clang__)
  62510. "adcs r2, r6\n\t"
  62511. #else
  62512. "adc r2, r6\n\t"
  62513. #endif
  62514. #ifdef WOLFSSL_KEIL
  62515. "adcs r3, r3, %[r]\n\t"
  62516. #elif defined(__clang__)
  62517. "adcs r3, %[r]\n\t"
  62518. #else
  62519. "adc r3, %[r]\n\t"
  62520. #endif
  62521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62522. "adds r4, r4, r5\n\t"
  62523. #else
  62524. "add r4, r4, r5\n\t"
  62525. #endif
  62526. #ifdef WOLFSSL_KEIL
  62527. "adcs r2, r2, r6\n\t"
  62528. #elif defined(__clang__)
  62529. "adcs r2, r6\n\t"
  62530. #else
  62531. "adc r2, r6\n\t"
  62532. #endif
  62533. #ifdef WOLFSSL_KEIL
  62534. "adcs r3, r3, %[r]\n\t"
  62535. #elif defined(__clang__)
  62536. "adcs r3, %[r]\n\t"
  62537. #else
  62538. "adc r3, %[r]\n\t"
  62539. #endif
  62540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62541. "lsrs r5, %[a], #16\n\t"
  62542. #else
  62543. "lsr r5, %[a], #16\n\t"
  62544. #endif
  62545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62546. "lsrs r6, r7, #16\n\t"
  62547. #else
  62548. "lsr r6, r7, #16\n\t"
  62549. #endif
  62550. #ifdef WOLFSSL_KEIL
  62551. "muls r6, r5, r6\n\t"
  62552. #elif defined(__clang__)
  62553. "muls r6, r5\n\t"
  62554. #else
  62555. "mul r6, r5\n\t"
  62556. #endif
  62557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62558. "adds r2, r2, r6\n\t"
  62559. #else
  62560. "add r2, r2, r6\n\t"
  62561. #endif
  62562. #ifdef WOLFSSL_KEIL
  62563. "adcs r3, r3, %[r]\n\t"
  62564. #elif defined(__clang__)
  62565. "adcs r3, %[r]\n\t"
  62566. #else
  62567. "adc r3, %[r]\n\t"
  62568. #endif
  62569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62570. "adds r2, r2, r6\n\t"
  62571. #else
  62572. "add r2, r2, r6\n\t"
  62573. #endif
  62574. #ifdef WOLFSSL_KEIL
  62575. "adcs r3, r3, %[r]\n\t"
  62576. #elif defined(__clang__)
  62577. "adcs r3, %[r]\n\t"
  62578. #else
  62579. "adc r3, %[r]\n\t"
  62580. #endif
  62581. "uxth r6, r7\n\t"
  62582. #ifdef WOLFSSL_KEIL
  62583. "muls r5, r6, r5\n\t"
  62584. #elif defined(__clang__)
  62585. "muls r5, r6\n\t"
  62586. #else
  62587. "mul r5, r6\n\t"
  62588. #endif
  62589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62590. "lsrs r6, r5, #16\n\t"
  62591. #else
  62592. "lsr r6, r5, #16\n\t"
  62593. #endif
  62594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62595. "lsls r5, r5, #16\n\t"
  62596. #else
  62597. "lsl r5, r5, #16\n\t"
  62598. #endif
  62599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62600. "adds r4, r4, r5\n\t"
  62601. #else
  62602. "add r4, r4, r5\n\t"
  62603. #endif
  62604. #ifdef WOLFSSL_KEIL
  62605. "adcs r2, r2, r6\n\t"
  62606. #elif defined(__clang__)
  62607. "adcs r2, r6\n\t"
  62608. #else
  62609. "adc r2, r6\n\t"
  62610. #endif
  62611. #ifdef WOLFSSL_KEIL
  62612. "adcs r3, r3, %[r]\n\t"
  62613. #elif defined(__clang__)
  62614. "adcs r3, %[r]\n\t"
  62615. #else
  62616. "adc r3, %[r]\n\t"
  62617. #endif
  62618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62619. "adds r4, r4, r5\n\t"
  62620. #else
  62621. "add r4, r4, r5\n\t"
  62622. #endif
  62623. #ifdef WOLFSSL_KEIL
  62624. "adcs r2, r2, r6\n\t"
  62625. #elif defined(__clang__)
  62626. "adcs r2, r6\n\t"
  62627. #else
  62628. "adc r2, r6\n\t"
  62629. #endif
  62630. #ifdef WOLFSSL_KEIL
  62631. "adcs r3, r3, %[r]\n\t"
  62632. #elif defined(__clang__)
  62633. "adcs r3, %[r]\n\t"
  62634. #else
  62635. "adc r3, %[r]\n\t"
  62636. #endif
  62637. "# A[10] * A[1]\n\t"
  62638. "mov %[a], r9\n\t"
  62639. "mov r7, r11\n\t"
  62640. "ldr %[a], [%[a], #40]\n\t"
  62641. "uxth r5, %[a]\n\t"
  62642. "uxth r6, r7\n\t"
  62643. #ifdef WOLFSSL_KEIL
  62644. "muls r6, r5, r6\n\t"
  62645. #elif defined(__clang__)
  62646. "muls r6, r5\n\t"
  62647. #else
  62648. "mul r6, r5\n\t"
  62649. #endif
  62650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62651. "adds r4, r4, r6\n\t"
  62652. #else
  62653. "add r4, r4, r6\n\t"
  62654. #endif
  62655. #ifdef WOLFSSL_KEIL
  62656. "adcs r2, r2, %[r]\n\t"
  62657. #elif defined(__clang__)
  62658. "adcs r2, %[r]\n\t"
  62659. #else
  62660. "adc r2, %[r]\n\t"
  62661. #endif
  62662. #ifdef WOLFSSL_KEIL
  62663. "adcs r3, r3, %[r]\n\t"
  62664. #elif defined(__clang__)
  62665. "adcs r3, %[r]\n\t"
  62666. #else
  62667. "adc r3, %[r]\n\t"
  62668. #endif
  62669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62670. "adds r4, r4, r6\n\t"
  62671. #else
  62672. "add r4, r4, r6\n\t"
  62673. #endif
  62674. #ifdef WOLFSSL_KEIL
  62675. "adcs r2, r2, %[r]\n\t"
  62676. #elif defined(__clang__)
  62677. "adcs r2, %[r]\n\t"
  62678. #else
  62679. "adc r2, %[r]\n\t"
  62680. #endif
  62681. #ifdef WOLFSSL_KEIL
  62682. "adcs r3, r3, %[r]\n\t"
  62683. #elif defined(__clang__)
  62684. "adcs r3, %[r]\n\t"
  62685. #else
  62686. "adc r3, %[r]\n\t"
  62687. #endif
  62688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62689. "lsrs r6, r7, #16\n\t"
  62690. #else
  62691. "lsr r6, r7, #16\n\t"
  62692. #endif
  62693. #ifdef WOLFSSL_KEIL
  62694. "muls r5, r6, r5\n\t"
  62695. #elif defined(__clang__)
  62696. "muls r5, r6\n\t"
  62697. #else
  62698. "mul r5, r6\n\t"
  62699. #endif
  62700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62701. "lsrs r6, r5, #16\n\t"
  62702. #else
  62703. "lsr r6, r5, #16\n\t"
  62704. #endif
  62705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62706. "lsls r5, r5, #16\n\t"
  62707. #else
  62708. "lsl r5, r5, #16\n\t"
  62709. #endif
  62710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62711. "adds r4, r4, r5\n\t"
  62712. #else
  62713. "add r4, r4, r5\n\t"
  62714. #endif
  62715. #ifdef WOLFSSL_KEIL
  62716. "adcs r2, r2, r6\n\t"
  62717. #elif defined(__clang__)
  62718. "adcs r2, r6\n\t"
  62719. #else
  62720. "adc r2, r6\n\t"
  62721. #endif
  62722. #ifdef WOLFSSL_KEIL
  62723. "adcs r3, r3, %[r]\n\t"
  62724. #elif defined(__clang__)
  62725. "adcs r3, %[r]\n\t"
  62726. #else
  62727. "adc r3, %[r]\n\t"
  62728. #endif
  62729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62730. "adds r4, r4, r5\n\t"
  62731. #else
  62732. "add r4, r4, r5\n\t"
  62733. #endif
  62734. #ifdef WOLFSSL_KEIL
  62735. "adcs r2, r2, r6\n\t"
  62736. #elif defined(__clang__)
  62737. "adcs r2, r6\n\t"
  62738. #else
  62739. "adc r2, r6\n\t"
  62740. #endif
  62741. #ifdef WOLFSSL_KEIL
  62742. "adcs r3, r3, %[r]\n\t"
  62743. #elif defined(__clang__)
  62744. "adcs r3, %[r]\n\t"
  62745. #else
  62746. "adc r3, %[r]\n\t"
  62747. #endif
  62748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62749. "lsrs r5, %[a], #16\n\t"
  62750. #else
  62751. "lsr r5, %[a], #16\n\t"
  62752. #endif
  62753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62754. "lsrs r6, r7, #16\n\t"
  62755. #else
  62756. "lsr r6, r7, #16\n\t"
  62757. #endif
  62758. #ifdef WOLFSSL_KEIL
  62759. "muls r6, r5, r6\n\t"
  62760. #elif defined(__clang__)
  62761. "muls r6, r5\n\t"
  62762. #else
  62763. "mul r6, r5\n\t"
  62764. #endif
  62765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62766. "adds r2, r2, r6\n\t"
  62767. #else
  62768. "add r2, r2, r6\n\t"
  62769. #endif
  62770. #ifdef WOLFSSL_KEIL
  62771. "adcs r3, r3, %[r]\n\t"
  62772. #elif defined(__clang__)
  62773. "adcs r3, %[r]\n\t"
  62774. #else
  62775. "adc r3, %[r]\n\t"
  62776. #endif
  62777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62778. "adds r2, r2, r6\n\t"
  62779. #else
  62780. "add r2, r2, r6\n\t"
  62781. #endif
  62782. #ifdef WOLFSSL_KEIL
  62783. "adcs r3, r3, %[r]\n\t"
  62784. #elif defined(__clang__)
  62785. "adcs r3, %[r]\n\t"
  62786. #else
  62787. "adc r3, %[r]\n\t"
  62788. #endif
  62789. "uxth r6, r7\n\t"
  62790. #ifdef WOLFSSL_KEIL
  62791. "muls r5, r6, r5\n\t"
  62792. #elif defined(__clang__)
  62793. "muls r5, r6\n\t"
  62794. #else
  62795. "mul r5, r6\n\t"
  62796. #endif
  62797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62798. "lsrs r6, r5, #16\n\t"
  62799. #else
  62800. "lsr r6, r5, #16\n\t"
  62801. #endif
  62802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62803. "lsls r5, r5, #16\n\t"
  62804. #else
  62805. "lsl r5, r5, #16\n\t"
  62806. #endif
  62807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62808. "adds r4, r4, r5\n\t"
  62809. #else
  62810. "add r4, r4, r5\n\t"
  62811. #endif
  62812. #ifdef WOLFSSL_KEIL
  62813. "adcs r2, r2, r6\n\t"
  62814. #elif defined(__clang__)
  62815. "adcs r2, r6\n\t"
  62816. #else
  62817. "adc r2, r6\n\t"
  62818. #endif
  62819. #ifdef WOLFSSL_KEIL
  62820. "adcs r3, r3, %[r]\n\t"
  62821. #elif defined(__clang__)
  62822. "adcs r3, %[r]\n\t"
  62823. #else
  62824. "adc r3, %[r]\n\t"
  62825. #endif
  62826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62827. "adds r4, r4, r5\n\t"
  62828. #else
  62829. "add r4, r4, r5\n\t"
  62830. #endif
  62831. #ifdef WOLFSSL_KEIL
  62832. "adcs r2, r2, r6\n\t"
  62833. #elif defined(__clang__)
  62834. "adcs r2, r6\n\t"
  62835. #else
  62836. "adc r2, r6\n\t"
  62837. #endif
  62838. #ifdef WOLFSSL_KEIL
  62839. "adcs r3, r3, %[r]\n\t"
  62840. #elif defined(__clang__)
  62841. "adcs r3, %[r]\n\t"
  62842. #else
  62843. "adc r3, %[r]\n\t"
  62844. #endif
  62845. "# A[11] * A[0]\n\t"
  62846. "mov %[a], r9\n\t"
  62847. "mov r7, r10\n\t"
  62848. "ldr %[a], [%[a], #44]\n\t"
  62849. "uxth r5, %[a]\n\t"
  62850. "uxth r6, r7\n\t"
  62851. #ifdef WOLFSSL_KEIL
  62852. "muls r6, r5, r6\n\t"
  62853. #elif defined(__clang__)
  62854. "muls r6, r5\n\t"
  62855. #else
  62856. "mul r6, r5\n\t"
  62857. #endif
  62858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62859. "adds r4, r4, r6\n\t"
  62860. #else
  62861. "add r4, r4, r6\n\t"
  62862. #endif
  62863. #ifdef WOLFSSL_KEIL
  62864. "adcs r2, r2, %[r]\n\t"
  62865. #elif defined(__clang__)
  62866. "adcs r2, %[r]\n\t"
  62867. #else
  62868. "adc r2, %[r]\n\t"
  62869. #endif
  62870. #ifdef WOLFSSL_KEIL
  62871. "adcs r3, r3, %[r]\n\t"
  62872. #elif defined(__clang__)
  62873. "adcs r3, %[r]\n\t"
  62874. #else
  62875. "adc r3, %[r]\n\t"
  62876. #endif
  62877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62878. "adds r4, r4, r6\n\t"
  62879. #else
  62880. "add r4, r4, r6\n\t"
  62881. #endif
  62882. #ifdef WOLFSSL_KEIL
  62883. "adcs r2, r2, %[r]\n\t"
  62884. #elif defined(__clang__)
  62885. "adcs r2, %[r]\n\t"
  62886. #else
  62887. "adc r2, %[r]\n\t"
  62888. #endif
  62889. #ifdef WOLFSSL_KEIL
  62890. "adcs r3, r3, %[r]\n\t"
  62891. #elif defined(__clang__)
  62892. "adcs r3, %[r]\n\t"
  62893. #else
  62894. "adc r3, %[r]\n\t"
  62895. #endif
  62896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62897. "lsrs r6, r7, #16\n\t"
  62898. #else
  62899. "lsr r6, r7, #16\n\t"
  62900. #endif
  62901. #ifdef WOLFSSL_KEIL
  62902. "muls r5, r6, r5\n\t"
  62903. #elif defined(__clang__)
  62904. "muls r5, r6\n\t"
  62905. #else
  62906. "mul r5, r6\n\t"
  62907. #endif
  62908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62909. "lsrs r6, r5, #16\n\t"
  62910. #else
  62911. "lsr r6, r5, #16\n\t"
  62912. #endif
  62913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62914. "lsls r5, r5, #16\n\t"
  62915. #else
  62916. "lsl r5, r5, #16\n\t"
  62917. #endif
  62918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62919. "adds r4, r4, r5\n\t"
  62920. #else
  62921. "add r4, r4, r5\n\t"
  62922. #endif
  62923. #ifdef WOLFSSL_KEIL
  62924. "adcs r2, r2, r6\n\t"
  62925. #elif defined(__clang__)
  62926. "adcs r2, r6\n\t"
  62927. #else
  62928. "adc r2, r6\n\t"
  62929. #endif
  62930. #ifdef WOLFSSL_KEIL
  62931. "adcs r3, r3, %[r]\n\t"
  62932. #elif defined(__clang__)
  62933. "adcs r3, %[r]\n\t"
  62934. #else
  62935. "adc r3, %[r]\n\t"
  62936. #endif
  62937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62938. "adds r4, r4, r5\n\t"
  62939. #else
  62940. "add r4, r4, r5\n\t"
  62941. #endif
  62942. #ifdef WOLFSSL_KEIL
  62943. "adcs r2, r2, r6\n\t"
  62944. #elif defined(__clang__)
  62945. "adcs r2, r6\n\t"
  62946. #else
  62947. "adc r2, r6\n\t"
  62948. #endif
  62949. #ifdef WOLFSSL_KEIL
  62950. "adcs r3, r3, %[r]\n\t"
  62951. #elif defined(__clang__)
  62952. "adcs r3, %[r]\n\t"
  62953. #else
  62954. "adc r3, %[r]\n\t"
  62955. #endif
  62956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62957. "lsrs r5, %[a], #16\n\t"
  62958. #else
  62959. "lsr r5, %[a], #16\n\t"
  62960. #endif
  62961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62962. "lsrs r6, r7, #16\n\t"
  62963. #else
  62964. "lsr r6, r7, #16\n\t"
  62965. #endif
  62966. #ifdef WOLFSSL_KEIL
  62967. "muls r6, r5, r6\n\t"
  62968. #elif defined(__clang__)
  62969. "muls r6, r5\n\t"
  62970. #else
  62971. "mul r6, r5\n\t"
  62972. #endif
  62973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62974. "adds r2, r2, r6\n\t"
  62975. #else
  62976. "add r2, r2, r6\n\t"
  62977. #endif
  62978. #ifdef WOLFSSL_KEIL
  62979. "adcs r3, r3, %[r]\n\t"
  62980. #elif defined(__clang__)
  62981. "adcs r3, %[r]\n\t"
  62982. #else
  62983. "adc r3, %[r]\n\t"
  62984. #endif
  62985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  62986. "adds r2, r2, r6\n\t"
  62987. #else
  62988. "add r2, r2, r6\n\t"
  62989. #endif
  62990. #ifdef WOLFSSL_KEIL
  62991. "adcs r3, r3, %[r]\n\t"
  62992. #elif defined(__clang__)
  62993. "adcs r3, %[r]\n\t"
  62994. #else
  62995. "adc r3, %[r]\n\t"
  62996. #endif
  62997. "uxth r6, r7\n\t"
  62998. #ifdef WOLFSSL_KEIL
  62999. "muls r5, r6, r5\n\t"
  63000. #elif defined(__clang__)
  63001. "muls r5, r6\n\t"
  63002. #else
  63003. "mul r5, r6\n\t"
  63004. #endif
  63005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63006. "lsrs r6, r5, #16\n\t"
  63007. #else
  63008. "lsr r6, r5, #16\n\t"
  63009. #endif
  63010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63011. "lsls r5, r5, #16\n\t"
  63012. #else
  63013. "lsl r5, r5, #16\n\t"
  63014. #endif
  63015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63016. "adds r4, r4, r5\n\t"
  63017. #else
  63018. "add r4, r4, r5\n\t"
  63019. #endif
  63020. #ifdef WOLFSSL_KEIL
  63021. "adcs r2, r2, r6\n\t"
  63022. #elif defined(__clang__)
  63023. "adcs r2, r6\n\t"
  63024. #else
  63025. "adc r2, r6\n\t"
  63026. #endif
  63027. #ifdef WOLFSSL_KEIL
  63028. "adcs r3, r3, %[r]\n\t"
  63029. #elif defined(__clang__)
  63030. "adcs r3, %[r]\n\t"
  63031. #else
  63032. "adc r3, %[r]\n\t"
  63033. #endif
  63034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63035. "adds r4, r4, r5\n\t"
  63036. #else
  63037. "add r4, r4, r5\n\t"
  63038. #endif
  63039. #ifdef WOLFSSL_KEIL
  63040. "adcs r2, r2, r6\n\t"
  63041. #elif defined(__clang__)
  63042. "adcs r2, r6\n\t"
  63043. #else
  63044. "adc r2, r6\n\t"
  63045. #endif
  63046. #ifdef WOLFSSL_KEIL
  63047. "adcs r3, r3, %[r]\n\t"
  63048. #elif defined(__clang__)
  63049. "adcs r3, %[r]\n\t"
  63050. #else
  63051. "adc r3, %[r]\n\t"
  63052. #endif
  63053. "str r4, [sp, #44]\n\t"
  63054. "# A[11] * A[1]\n\t"
  63055. "movs r4, #0\n\t"
  63056. "mov %[a], r9\n\t"
  63057. "mov r7, r11\n\t"
  63058. "ldr %[a], [%[a], #44]\n\t"
  63059. "uxth r5, %[a]\n\t"
  63060. "uxth r6, r7\n\t"
  63061. #ifdef WOLFSSL_KEIL
  63062. "muls r6, r5, r6\n\t"
  63063. #elif defined(__clang__)
  63064. "muls r6, r5\n\t"
  63065. #else
  63066. "mul r6, r5\n\t"
  63067. #endif
  63068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63069. "adds r2, r2, r6\n\t"
  63070. #else
  63071. "add r2, r2, r6\n\t"
  63072. #endif
  63073. #ifdef WOLFSSL_KEIL
  63074. "adcs r3, r3, %[r]\n\t"
  63075. #elif defined(__clang__)
  63076. "adcs r3, %[r]\n\t"
  63077. #else
  63078. "adc r3, %[r]\n\t"
  63079. #endif
  63080. #ifdef WOLFSSL_KEIL
  63081. "adcs r4, r4, %[r]\n\t"
  63082. #elif defined(__clang__)
  63083. "adcs r4, %[r]\n\t"
  63084. #else
  63085. "adc r4, %[r]\n\t"
  63086. #endif
  63087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63088. "adds r2, r2, r6\n\t"
  63089. #else
  63090. "add r2, r2, r6\n\t"
  63091. #endif
  63092. #ifdef WOLFSSL_KEIL
  63093. "adcs r3, r3, %[r]\n\t"
  63094. #elif defined(__clang__)
  63095. "adcs r3, %[r]\n\t"
  63096. #else
  63097. "adc r3, %[r]\n\t"
  63098. #endif
  63099. #ifdef WOLFSSL_KEIL
  63100. "adcs r4, r4, %[r]\n\t"
  63101. #elif defined(__clang__)
  63102. "adcs r4, %[r]\n\t"
  63103. #else
  63104. "adc r4, %[r]\n\t"
  63105. #endif
  63106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63107. "lsrs r6, r7, #16\n\t"
  63108. #else
  63109. "lsr r6, r7, #16\n\t"
  63110. #endif
  63111. #ifdef WOLFSSL_KEIL
  63112. "muls r5, r6, r5\n\t"
  63113. #elif defined(__clang__)
  63114. "muls r5, r6\n\t"
  63115. #else
  63116. "mul r5, r6\n\t"
  63117. #endif
  63118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63119. "lsrs r6, r5, #16\n\t"
  63120. #else
  63121. "lsr r6, r5, #16\n\t"
  63122. #endif
  63123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63124. "lsls r5, r5, #16\n\t"
  63125. #else
  63126. "lsl r5, r5, #16\n\t"
  63127. #endif
  63128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63129. "adds r2, r2, r5\n\t"
  63130. #else
  63131. "add r2, r2, r5\n\t"
  63132. #endif
  63133. #ifdef WOLFSSL_KEIL
  63134. "adcs r3, r3, r6\n\t"
  63135. #elif defined(__clang__)
  63136. "adcs r3, r6\n\t"
  63137. #else
  63138. "adc r3, r6\n\t"
  63139. #endif
  63140. #ifdef WOLFSSL_KEIL
  63141. "adcs r4, r4, %[r]\n\t"
  63142. #elif defined(__clang__)
  63143. "adcs r4, %[r]\n\t"
  63144. #else
  63145. "adc r4, %[r]\n\t"
  63146. #endif
  63147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63148. "adds r2, r2, r5\n\t"
  63149. #else
  63150. "add r2, r2, r5\n\t"
  63151. #endif
  63152. #ifdef WOLFSSL_KEIL
  63153. "adcs r3, r3, r6\n\t"
  63154. #elif defined(__clang__)
  63155. "adcs r3, r6\n\t"
  63156. #else
  63157. "adc r3, r6\n\t"
  63158. #endif
  63159. #ifdef WOLFSSL_KEIL
  63160. "adcs r4, r4, %[r]\n\t"
  63161. #elif defined(__clang__)
  63162. "adcs r4, %[r]\n\t"
  63163. #else
  63164. "adc r4, %[r]\n\t"
  63165. #endif
  63166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63167. "lsrs r5, %[a], #16\n\t"
  63168. #else
  63169. "lsr r5, %[a], #16\n\t"
  63170. #endif
  63171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63172. "lsrs r6, r7, #16\n\t"
  63173. #else
  63174. "lsr r6, r7, #16\n\t"
  63175. #endif
  63176. #ifdef WOLFSSL_KEIL
  63177. "muls r6, r5, r6\n\t"
  63178. #elif defined(__clang__)
  63179. "muls r6, r5\n\t"
  63180. #else
  63181. "mul r6, r5\n\t"
  63182. #endif
  63183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63184. "adds r3, r3, r6\n\t"
  63185. #else
  63186. "add r3, r3, r6\n\t"
  63187. #endif
  63188. #ifdef WOLFSSL_KEIL
  63189. "adcs r4, r4, %[r]\n\t"
  63190. #elif defined(__clang__)
  63191. "adcs r4, %[r]\n\t"
  63192. #else
  63193. "adc r4, %[r]\n\t"
  63194. #endif
  63195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63196. "adds r3, r3, r6\n\t"
  63197. #else
  63198. "add r3, r3, r6\n\t"
  63199. #endif
  63200. #ifdef WOLFSSL_KEIL
  63201. "adcs r4, r4, %[r]\n\t"
  63202. #elif defined(__clang__)
  63203. "adcs r4, %[r]\n\t"
  63204. #else
  63205. "adc r4, %[r]\n\t"
  63206. #endif
  63207. "uxth r6, r7\n\t"
  63208. #ifdef WOLFSSL_KEIL
  63209. "muls r5, r6, r5\n\t"
  63210. #elif defined(__clang__)
  63211. "muls r5, r6\n\t"
  63212. #else
  63213. "mul r5, r6\n\t"
  63214. #endif
  63215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63216. "lsrs r6, r5, #16\n\t"
  63217. #else
  63218. "lsr r6, r5, #16\n\t"
  63219. #endif
  63220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63221. "lsls r5, r5, #16\n\t"
  63222. #else
  63223. "lsl r5, r5, #16\n\t"
  63224. #endif
  63225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63226. "adds r2, r2, r5\n\t"
  63227. #else
  63228. "add r2, r2, r5\n\t"
  63229. #endif
  63230. #ifdef WOLFSSL_KEIL
  63231. "adcs r3, r3, r6\n\t"
  63232. #elif defined(__clang__)
  63233. "adcs r3, r6\n\t"
  63234. #else
  63235. "adc r3, r6\n\t"
  63236. #endif
  63237. #ifdef WOLFSSL_KEIL
  63238. "adcs r4, r4, %[r]\n\t"
  63239. #elif defined(__clang__)
  63240. "adcs r4, %[r]\n\t"
  63241. #else
  63242. "adc r4, %[r]\n\t"
  63243. #endif
  63244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63245. "adds r2, r2, r5\n\t"
  63246. #else
  63247. "add r2, r2, r5\n\t"
  63248. #endif
  63249. #ifdef WOLFSSL_KEIL
  63250. "adcs r3, r3, r6\n\t"
  63251. #elif defined(__clang__)
  63252. "adcs r3, r6\n\t"
  63253. #else
  63254. "adc r3, r6\n\t"
  63255. #endif
  63256. #ifdef WOLFSSL_KEIL
  63257. "adcs r4, r4, %[r]\n\t"
  63258. #elif defined(__clang__)
  63259. "adcs r4, %[r]\n\t"
  63260. #else
  63261. "adc r4, %[r]\n\t"
  63262. #endif
  63263. "# A[10] * A[2]\n\t"
  63264. "mov %[a], r9\n\t"
  63265. "mov r7, r12\n\t"
  63266. "ldr %[a], [%[a], #40]\n\t"
  63267. "uxth r5, %[a]\n\t"
  63268. "uxth r6, r7\n\t"
  63269. #ifdef WOLFSSL_KEIL
  63270. "muls r6, r5, r6\n\t"
  63271. #elif defined(__clang__)
  63272. "muls r6, r5\n\t"
  63273. #else
  63274. "mul r6, r5\n\t"
  63275. #endif
  63276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63277. "adds r2, r2, r6\n\t"
  63278. #else
  63279. "add r2, r2, r6\n\t"
  63280. #endif
  63281. #ifdef WOLFSSL_KEIL
  63282. "adcs r3, r3, %[r]\n\t"
  63283. #elif defined(__clang__)
  63284. "adcs r3, %[r]\n\t"
  63285. #else
  63286. "adc r3, %[r]\n\t"
  63287. #endif
  63288. #ifdef WOLFSSL_KEIL
  63289. "adcs r4, r4, %[r]\n\t"
  63290. #elif defined(__clang__)
  63291. "adcs r4, %[r]\n\t"
  63292. #else
  63293. "adc r4, %[r]\n\t"
  63294. #endif
  63295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63296. "adds r2, r2, r6\n\t"
  63297. #else
  63298. "add r2, r2, r6\n\t"
  63299. #endif
  63300. #ifdef WOLFSSL_KEIL
  63301. "adcs r3, r3, %[r]\n\t"
  63302. #elif defined(__clang__)
  63303. "adcs r3, %[r]\n\t"
  63304. #else
  63305. "adc r3, %[r]\n\t"
  63306. #endif
  63307. #ifdef WOLFSSL_KEIL
  63308. "adcs r4, r4, %[r]\n\t"
  63309. #elif defined(__clang__)
  63310. "adcs r4, %[r]\n\t"
  63311. #else
  63312. "adc r4, %[r]\n\t"
  63313. #endif
  63314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63315. "lsrs r6, r7, #16\n\t"
  63316. #else
  63317. "lsr r6, r7, #16\n\t"
  63318. #endif
  63319. #ifdef WOLFSSL_KEIL
  63320. "muls r5, r6, r5\n\t"
  63321. #elif defined(__clang__)
  63322. "muls r5, r6\n\t"
  63323. #else
  63324. "mul r5, r6\n\t"
  63325. #endif
  63326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63327. "lsrs r6, r5, #16\n\t"
  63328. #else
  63329. "lsr r6, r5, #16\n\t"
  63330. #endif
  63331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63332. "lsls r5, r5, #16\n\t"
  63333. #else
  63334. "lsl r5, r5, #16\n\t"
  63335. #endif
  63336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63337. "adds r2, r2, r5\n\t"
  63338. #else
  63339. "add r2, r2, r5\n\t"
  63340. #endif
  63341. #ifdef WOLFSSL_KEIL
  63342. "adcs r3, r3, r6\n\t"
  63343. #elif defined(__clang__)
  63344. "adcs r3, r6\n\t"
  63345. #else
  63346. "adc r3, r6\n\t"
  63347. #endif
  63348. #ifdef WOLFSSL_KEIL
  63349. "adcs r4, r4, %[r]\n\t"
  63350. #elif defined(__clang__)
  63351. "adcs r4, %[r]\n\t"
  63352. #else
  63353. "adc r4, %[r]\n\t"
  63354. #endif
  63355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63356. "adds r2, r2, r5\n\t"
  63357. #else
  63358. "add r2, r2, r5\n\t"
  63359. #endif
  63360. #ifdef WOLFSSL_KEIL
  63361. "adcs r3, r3, r6\n\t"
  63362. #elif defined(__clang__)
  63363. "adcs r3, r6\n\t"
  63364. #else
  63365. "adc r3, r6\n\t"
  63366. #endif
  63367. #ifdef WOLFSSL_KEIL
  63368. "adcs r4, r4, %[r]\n\t"
  63369. #elif defined(__clang__)
  63370. "adcs r4, %[r]\n\t"
  63371. #else
  63372. "adc r4, %[r]\n\t"
  63373. #endif
  63374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63375. "lsrs r5, %[a], #16\n\t"
  63376. #else
  63377. "lsr r5, %[a], #16\n\t"
  63378. #endif
  63379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63380. "lsrs r6, r7, #16\n\t"
  63381. #else
  63382. "lsr r6, r7, #16\n\t"
  63383. #endif
  63384. #ifdef WOLFSSL_KEIL
  63385. "muls r6, r5, r6\n\t"
  63386. #elif defined(__clang__)
  63387. "muls r6, r5\n\t"
  63388. #else
  63389. "mul r6, r5\n\t"
  63390. #endif
  63391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63392. "adds r3, r3, r6\n\t"
  63393. #else
  63394. "add r3, r3, r6\n\t"
  63395. #endif
  63396. #ifdef WOLFSSL_KEIL
  63397. "adcs r4, r4, %[r]\n\t"
  63398. #elif defined(__clang__)
  63399. "adcs r4, %[r]\n\t"
  63400. #else
  63401. "adc r4, %[r]\n\t"
  63402. #endif
  63403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63404. "adds r3, r3, r6\n\t"
  63405. #else
  63406. "add r3, r3, r6\n\t"
  63407. #endif
  63408. #ifdef WOLFSSL_KEIL
  63409. "adcs r4, r4, %[r]\n\t"
  63410. #elif defined(__clang__)
  63411. "adcs r4, %[r]\n\t"
  63412. #else
  63413. "adc r4, %[r]\n\t"
  63414. #endif
  63415. "uxth r6, r7\n\t"
  63416. #ifdef WOLFSSL_KEIL
  63417. "muls r5, r6, r5\n\t"
  63418. #elif defined(__clang__)
  63419. "muls r5, r6\n\t"
  63420. #else
  63421. "mul r5, r6\n\t"
  63422. #endif
  63423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63424. "lsrs r6, r5, #16\n\t"
  63425. #else
  63426. "lsr r6, r5, #16\n\t"
  63427. #endif
  63428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63429. "lsls r5, r5, #16\n\t"
  63430. #else
  63431. "lsl r5, r5, #16\n\t"
  63432. #endif
  63433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63434. "adds r2, r2, r5\n\t"
  63435. #else
  63436. "add r2, r2, r5\n\t"
  63437. #endif
  63438. #ifdef WOLFSSL_KEIL
  63439. "adcs r3, r3, r6\n\t"
  63440. #elif defined(__clang__)
  63441. "adcs r3, r6\n\t"
  63442. #else
  63443. "adc r3, r6\n\t"
  63444. #endif
  63445. #ifdef WOLFSSL_KEIL
  63446. "adcs r4, r4, %[r]\n\t"
  63447. #elif defined(__clang__)
  63448. "adcs r4, %[r]\n\t"
  63449. #else
  63450. "adc r4, %[r]\n\t"
  63451. #endif
  63452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63453. "adds r2, r2, r5\n\t"
  63454. #else
  63455. "add r2, r2, r5\n\t"
  63456. #endif
  63457. #ifdef WOLFSSL_KEIL
  63458. "adcs r3, r3, r6\n\t"
  63459. #elif defined(__clang__)
  63460. "adcs r3, r6\n\t"
  63461. #else
  63462. "adc r3, r6\n\t"
  63463. #endif
  63464. #ifdef WOLFSSL_KEIL
  63465. "adcs r4, r4, %[r]\n\t"
  63466. #elif defined(__clang__)
  63467. "adcs r4, %[r]\n\t"
  63468. #else
  63469. "adc r4, %[r]\n\t"
  63470. #endif
  63471. "# A[9] * A[3]\n\t"
  63472. "mov %[a], r9\n\t"
  63473. "mov r7, lr\n\t"
  63474. "ldr %[a], [%[a], #36]\n\t"
  63475. "uxth r5, %[a]\n\t"
  63476. "uxth r6, r7\n\t"
  63477. #ifdef WOLFSSL_KEIL
  63478. "muls r6, r5, r6\n\t"
  63479. #elif defined(__clang__)
  63480. "muls r6, r5\n\t"
  63481. #else
  63482. "mul r6, r5\n\t"
  63483. #endif
  63484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63485. "adds r2, r2, r6\n\t"
  63486. #else
  63487. "add r2, r2, r6\n\t"
  63488. #endif
  63489. #ifdef WOLFSSL_KEIL
  63490. "adcs r3, r3, %[r]\n\t"
  63491. #elif defined(__clang__)
  63492. "adcs r3, %[r]\n\t"
  63493. #else
  63494. "adc r3, %[r]\n\t"
  63495. #endif
  63496. #ifdef WOLFSSL_KEIL
  63497. "adcs r4, r4, %[r]\n\t"
  63498. #elif defined(__clang__)
  63499. "adcs r4, %[r]\n\t"
  63500. #else
  63501. "adc r4, %[r]\n\t"
  63502. #endif
  63503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63504. "adds r2, r2, r6\n\t"
  63505. #else
  63506. "add r2, r2, r6\n\t"
  63507. #endif
  63508. #ifdef WOLFSSL_KEIL
  63509. "adcs r3, r3, %[r]\n\t"
  63510. #elif defined(__clang__)
  63511. "adcs r3, %[r]\n\t"
  63512. #else
  63513. "adc r3, %[r]\n\t"
  63514. #endif
  63515. #ifdef WOLFSSL_KEIL
  63516. "adcs r4, r4, %[r]\n\t"
  63517. #elif defined(__clang__)
  63518. "adcs r4, %[r]\n\t"
  63519. #else
  63520. "adc r4, %[r]\n\t"
  63521. #endif
  63522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63523. "lsrs r6, r7, #16\n\t"
  63524. #else
  63525. "lsr r6, r7, #16\n\t"
  63526. #endif
  63527. #ifdef WOLFSSL_KEIL
  63528. "muls r5, r6, r5\n\t"
  63529. #elif defined(__clang__)
  63530. "muls r5, r6\n\t"
  63531. #else
  63532. "mul r5, r6\n\t"
  63533. #endif
  63534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63535. "lsrs r6, r5, #16\n\t"
  63536. #else
  63537. "lsr r6, r5, #16\n\t"
  63538. #endif
  63539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63540. "lsls r5, r5, #16\n\t"
  63541. #else
  63542. "lsl r5, r5, #16\n\t"
  63543. #endif
  63544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63545. "adds r2, r2, r5\n\t"
  63546. #else
  63547. "add r2, r2, r5\n\t"
  63548. #endif
  63549. #ifdef WOLFSSL_KEIL
  63550. "adcs r3, r3, r6\n\t"
  63551. #elif defined(__clang__)
  63552. "adcs r3, r6\n\t"
  63553. #else
  63554. "adc r3, r6\n\t"
  63555. #endif
  63556. #ifdef WOLFSSL_KEIL
  63557. "adcs r4, r4, %[r]\n\t"
  63558. #elif defined(__clang__)
  63559. "adcs r4, %[r]\n\t"
  63560. #else
  63561. "adc r4, %[r]\n\t"
  63562. #endif
  63563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63564. "adds r2, r2, r5\n\t"
  63565. #else
  63566. "add r2, r2, r5\n\t"
  63567. #endif
  63568. #ifdef WOLFSSL_KEIL
  63569. "adcs r3, r3, r6\n\t"
  63570. #elif defined(__clang__)
  63571. "adcs r3, r6\n\t"
  63572. #else
  63573. "adc r3, r6\n\t"
  63574. #endif
  63575. #ifdef WOLFSSL_KEIL
  63576. "adcs r4, r4, %[r]\n\t"
  63577. #elif defined(__clang__)
  63578. "adcs r4, %[r]\n\t"
  63579. #else
  63580. "adc r4, %[r]\n\t"
  63581. #endif
  63582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63583. "lsrs r5, %[a], #16\n\t"
  63584. #else
  63585. "lsr r5, %[a], #16\n\t"
  63586. #endif
  63587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63588. "lsrs r6, r7, #16\n\t"
  63589. #else
  63590. "lsr r6, r7, #16\n\t"
  63591. #endif
  63592. #ifdef WOLFSSL_KEIL
  63593. "muls r6, r5, r6\n\t"
  63594. #elif defined(__clang__)
  63595. "muls r6, r5\n\t"
  63596. #else
  63597. "mul r6, r5\n\t"
  63598. #endif
  63599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63600. "adds r3, r3, r6\n\t"
  63601. #else
  63602. "add r3, r3, r6\n\t"
  63603. #endif
  63604. #ifdef WOLFSSL_KEIL
  63605. "adcs r4, r4, %[r]\n\t"
  63606. #elif defined(__clang__)
  63607. "adcs r4, %[r]\n\t"
  63608. #else
  63609. "adc r4, %[r]\n\t"
  63610. #endif
  63611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63612. "adds r3, r3, r6\n\t"
  63613. #else
  63614. "add r3, r3, r6\n\t"
  63615. #endif
  63616. #ifdef WOLFSSL_KEIL
  63617. "adcs r4, r4, %[r]\n\t"
  63618. #elif defined(__clang__)
  63619. "adcs r4, %[r]\n\t"
  63620. #else
  63621. "adc r4, %[r]\n\t"
  63622. #endif
  63623. "uxth r6, r7\n\t"
  63624. #ifdef WOLFSSL_KEIL
  63625. "muls r5, r6, r5\n\t"
  63626. #elif defined(__clang__)
  63627. "muls r5, r6\n\t"
  63628. #else
  63629. "mul r5, r6\n\t"
  63630. #endif
  63631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63632. "lsrs r6, r5, #16\n\t"
  63633. #else
  63634. "lsr r6, r5, #16\n\t"
  63635. #endif
  63636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63637. "lsls r5, r5, #16\n\t"
  63638. #else
  63639. "lsl r5, r5, #16\n\t"
  63640. #endif
  63641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63642. "adds r2, r2, r5\n\t"
  63643. #else
  63644. "add r2, r2, r5\n\t"
  63645. #endif
  63646. #ifdef WOLFSSL_KEIL
  63647. "adcs r3, r3, r6\n\t"
  63648. #elif defined(__clang__)
  63649. "adcs r3, r6\n\t"
  63650. #else
  63651. "adc r3, r6\n\t"
  63652. #endif
  63653. #ifdef WOLFSSL_KEIL
  63654. "adcs r4, r4, %[r]\n\t"
  63655. #elif defined(__clang__)
  63656. "adcs r4, %[r]\n\t"
  63657. #else
  63658. "adc r4, %[r]\n\t"
  63659. #endif
  63660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63661. "adds r2, r2, r5\n\t"
  63662. #else
  63663. "add r2, r2, r5\n\t"
  63664. #endif
  63665. #ifdef WOLFSSL_KEIL
  63666. "adcs r3, r3, r6\n\t"
  63667. #elif defined(__clang__)
  63668. "adcs r3, r6\n\t"
  63669. #else
  63670. "adc r3, r6\n\t"
  63671. #endif
  63672. #ifdef WOLFSSL_KEIL
  63673. "adcs r4, r4, %[r]\n\t"
  63674. #elif defined(__clang__)
  63675. "adcs r4, %[r]\n\t"
  63676. #else
  63677. "adc r4, %[r]\n\t"
  63678. #endif
  63679. "# A[8] * A[4]\n\t"
  63680. "mov %[a], r9\n\t"
  63681. "ldr r7, [%[a], #16]\n\t"
  63682. "ldr %[a], [%[a], #32]\n\t"
  63683. "uxth r5, %[a]\n\t"
  63684. "uxth r6, r7\n\t"
  63685. #ifdef WOLFSSL_KEIL
  63686. "muls r6, r5, r6\n\t"
  63687. #elif defined(__clang__)
  63688. "muls r6, r5\n\t"
  63689. #else
  63690. "mul r6, r5\n\t"
  63691. #endif
  63692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63693. "adds r2, r2, r6\n\t"
  63694. #else
  63695. "add r2, r2, r6\n\t"
  63696. #endif
  63697. #ifdef WOLFSSL_KEIL
  63698. "adcs r3, r3, %[r]\n\t"
  63699. #elif defined(__clang__)
  63700. "adcs r3, %[r]\n\t"
  63701. #else
  63702. "adc r3, %[r]\n\t"
  63703. #endif
  63704. #ifdef WOLFSSL_KEIL
  63705. "adcs r4, r4, %[r]\n\t"
  63706. #elif defined(__clang__)
  63707. "adcs r4, %[r]\n\t"
  63708. #else
  63709. "adc r4, %[r]\n\t"
  63710. #endif
  63711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63712. "adds r2, r2, r6\n\t"
  63713. #else
  63714. "add r2, r2, r6\n\t"
  63715. #endif
  63716. #ifdef WOLFSSL_KEIL
  63717. "adcs r3, r3, %[r]\n\t"
  63718. #elif defined(__clang__)
  63719. "adcs r3, %[r]\n\t"
  63720. #else
  63721. "adc r3, %[r]\n\t"
  63722. #endif
  63723. #ifdef WOLFSSL_KEIL
  63724. "adcs r4, r4, %[r]\n\t"
  63725. #elif defined(__clang__)
  63726. "adcs r4, %[r]\n\t"
  63727. #else
  63728. "adc r4, %[r]\n\t"
  63729. #endif
  63730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63731. "lsrs r6, r7, #16\n\t"
  63732. #else
  63733. "lsr r6, r7, #16\n\t"
  63734. #endif
  63735. #ifdef WOLFSSL_KEIL
  63736. "muls r5, r6, r5\n\t"
  63737. #elif defined(__clang__)
  63738. "muls r5, r6\n\t"
  63739. #else
  63740. "mul r5, r6\n\t"
  63741. #endif
  63742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63743. "lsrs r6, r5, #16\n\t"
  63744. #else
  63745. "lsr r6, r5, #16\n\t"
  63746. #endif
  63747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63748. "lsls r5, r5, #16\n\t"
  63749. #else
  63750. "lsl r5, r5, #16\n\t"
  63751. #endif
  63752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63753. "adds r2, r2, r5\n\t"
  63754. #else
  63755. "add r2, r2, r5\n\t"
  63756. #endif
  63757. #ifdef WOLFSSL_KEIL
  63758. "adcs r3, r3, r6\n\t"
  63759. #elif defined(__clang__)
  63760. "adcs r3, r6\n\t"
  63761. #else
  63762. "adc r3, r6\n\t"
  63763. #endif
  63764. #ifdef WOLFSSL_KEIL
  63765. "adcs r4, r4, %[r]\n\t"
  63766. #elif defined(__clang__)
  63767. "adcs r4, %[r]\n\t"
  63768. #else
  63769. "adc r4, %[r]\n\t"
  63770. #endif
  63771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63772. "adds r2, r2, r5\n\t"
  63773. #else
  63774. "add r2, r2, r5\n\t"
  63775. #endif
  63776. #ifdef WOLFSSL_KEIL
  63777. "adcs r3, r3, r6\n\t"
  63778. #elif defined(__clang__)
  63779. "adcs r3, r6\n\t"
  63780. #else
  63781. "adc r3, r6\n\t"
  63782. #endif
  63783. #ifdef WOLFSSL_KEIL
  63784. "adcs r4, r4, %[r]\n\t"
  63785. #elif defined(__clang__)
  63786. "adcs r4, %[r]\n\t"
  63787. #else
  63788. "adc r4, %[r]\n\t"
  63789. #endif
  63790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63791. "lsrs r5, %[a], #16\n\t"
  63792. #else
  63793. "lsr r5, %[a], #16\n\t"
  63794. #endif
  63795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63796. "lsrs r6, r7, #16\n\t"
  63797. #else
  63798. "lsr r6, r7, #16\n\t"
  63799. #endif
  63800. #ifdef WOLFSSL_KEIL
  63801. "muls r6, r5, r6\n\t"
  63802. #elif defined(__clang__)
  63803. "muls r6, r5\n\t"
  63804. #else
  63805. "mul r6, r5\n\t"
  63806. #endif
  63807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63808. "adds r3, r3, r6\n\t"
  63809. #else
  63810. "add r3, r3, r6\n\t"
  63811. #endif
  63812. #ifdef WOLFSSL_KEIL
  63813. "adcs r4, r4, %[r]\n\t"
  63814. #elif defined(__clang__)
  63815. "adcs r4, %[r]\n\t"
  63816. #else
  63817. "adc r4, %[r]\n\t"
  63818. #endif
  63819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63820. "adds r3, r3, r6\n\t"
  63821. #else
  63822. "add r3, r3, r6\n\t"
  63823. #endif
  63824. #ifdef WOLFSSL_KEIL
  63825. "adcs r4, r4, %[r]\n\t"
  63826. #elif defined(__clang__)
  63827. "adcs r4, %[r]\n\t"
  63828. #else
  63829. "adc r4, %[r]\n\t"
  63830. #endif
  63831. "uxth r6, r7\n\t"
  63832. #ifdef WOLFSSL_KEIL
  63833. "muls r5, r6, r5\n\t"
  63834. #elif defined(__clang__)
  63835. "muls r5, r6\n\t"
  63836. #else
  63837. "mul r5, r6\n\t"
  63838. #endif
  63839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63840. "lsrs r6, r5, #16\n\t"
  63841. #else
  63842. "lsr r6, r5, #16\n\t"
  63843. #endif
  63844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63845. "lsls r5, r5, #16\n\t"
  63846. #else
  63847. "lsl r5, r5, #16\n\t"
  63848. #endif
  63849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63850. "adds r2, r2, r5\n\t"
  63851. #else
  63852. "add r2, r2, r5\n\t"
  63853. #endif
  63854. #ifdef WOLFSSL_KEIL
  63855. "adcs r3, r3, r6\n\t"
  63856. #elif defined(__clang__)
  63857. "adcs r3, r6\n\t"
  63858. #else
  63859. "adc r3, r6\n\t"
  63860. #endif
  63861. #ifdef WOLFSSL_KEIL
  63862. "adcs r4, r4, %[r]\n\t"
  63863. #elif defined(__clang__)
  63864. "adcs r4, %[r]\n\t"
  63865. #else
  63866. "adc r4, %[r]\n\t"
  63867. #endif
  63868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63869. "adds r2, r2, r5\n\t"
  63870. #else
  63871. "add r2, r2, r5\n\t"
  63872. #endif
  63873. #ifdef WOLFSSL_KEIL
  63874. "adcs r3, r3, r6\n\t"
  63875. #elif defined(__clang__)
  63876. "adcs r3, r6\n\t"
  63877. #else
  63878. "adc r3, r6\n\t"
  63879. #endif
  63880. #ifdef WOLFSSL_KEIL
  63881. "adcs r4, r4, %[r]\n\t"
  63882. #elif defined(__clang__)
  63883. "adcs r4, %[r]\n\t"
  63884. #else
  63885. "adc r4, %[r]\n\t"
  63886. #endif
  63887. "# A[7] * A[5]\n\t"
  63888. "mov %[a], r9\n\t"
  63889. "ldr r7, [%[a], #20]\n\t"
  63890. "ldr %[a], [%[a], #28]\n\t"
  63891. "uxth r5, %[a]\n\t"
  63892. "uxth r6, r7\n\t"
  63893. #ifdef WOLFSSL_KEIL
  63894. "muls r6, r5, r6\n\t"
  63895. #elif defined(__clang__)
  63896. "muls r6, r5\n\t"
  63897. #else
  63898. "mul r6, r5\n\t"
  63899. #endif
  63900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63901. "adds r2, r2, r6\n\t"
  63902. #else
  63903. "add r2, r2, r6\n\t"
  63904. #endif
  63905. #ifdef WOLFSSL_KEIL
  63906. "adcs r3, r3, %[r]\n\t"
  63907. #elif defined(__clang__)
  63908. "adcs r3, %[r]\n\t"
  63909. #else
  63910. "adc r3, %[r]\n\t"
  63911. #endif
  63912. #ifdef WOLFSSL_KEIL
  63913. "adcs r4, r4, %[r]\n\t"
  63914. #elif defined(__clang__)
  63915. "adcs r4, %[r]\n\t"
  63916. #else
  63917. "adc r4, %[r]\n\t"
  63918. #endif
  63919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63920. "adds r2, r2, r6\n\t"
  63921. #else
  63922. "add r2, r2, r6\n\t"
  63923. #endif
  63924. #ifdef WOLFSSL_KEIL
  63925. "adcs r3, r3, %[r]\n\t"
  63926. #elif defined(__clang__)
  63927. "adcs r3, %[r]\n\t"
  63928. #else
  63929. "adc r3, %[r]\n\t"
  63930. #endif
  63931. #ifdef WOLFSSL_KEIL
  63932. "adcs r4, r4, %[r]\n\t"
  63933. #elif defined(__clang__)
  63934. "adcs r4, %[r]\n\t"
  63935. #else
  63936. "adc r4, %[r]\n\t"
  63937. #endif
  63938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63939. "lsrs r6, r7, #16\n\t"
  63940. #else
  63941. "lsr r6, r7, #16\n\t"
  63942. #endif
  63943. #ifdef WOLFSSL_KEIL
  63944. "muls r5, r6, r5\n\t"
  63945. #elif defined(__clang__)
  63946. "muls r5, r6\n\t"
  63947. #else
  63948. "mul r5, r6\n\t"
  63949. #endif
  63950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63951. "lsrs r6, r5, #16\n\t"
  63952. #else
  63953. "lsr r6, r5, #16\n\t"
  63954. #endif
  63955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63956. "lsls r5, r5, #16\n\t"
  63957. #else
  63958. "lsl r5, r5, #16\n\t"
  63959. #endif
  63960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63961. "adds r2, r2, r5\n\t"
  63962. #else
  63963. "add r2, r2, r5\n\t"
  63964. #endif
  63965. #ifdef WOLFSSL_KEIL
  63966. "adcs r3, r3, r6\n\t"
  63967. #elif defined(__clang__)
  63968. "adcs r3, r6\n\t"
  63969. #else
  63970. "adc r3, r6\n\t"
  63971. #endif
  63972. #ifdef WOLFSSL_KEIL
  63973. "adcs r4, r4, %[r]\n\t"
  63974. #elif defined(__clang__)
  63975. "adcs r4, %[r]\n\t"
  63976. #else
  63977. "adc r4, %[r]\n\t"
  63978. #endif
  63979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63980. "adds r2, r2, r5\n\t"
  63981. #else
  63982. "add r2, r2, r5\n\t"
  63983. #endif
  63984. #ifdef WOLFSSL_KEIL
  63985. "adcs r3, r3, r6\n\t"
  63986. #elif defined(__clang__)
  63987. "adcs r3, r6\n\t"
  63988. #else
  63989. "adc r3, r6\n\t"
  63990. #endif
  63991. #ifdef WOLFSSL_KEIL
  63992. "adcs r4, r4, %[r]\n\t"
  63993. #elif defined(__clang__)
  63994. "adcs r4, %[r]\n\t"
  63995. #else
  63996. "adc r4, %[r]\n\t"
  63997. #endif
  63998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  63999. "lsrs r5, %[a], #16\n\t"
  64000. #else
  64001. "lsr r5, %[a], #16\n\t"
  64002. #endif
  64003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64004. "lsrs r6, r7, #16\n\t"
  64005. #else
  64006. "lsr r6, r7, #16\n\t"
  64007. #endif
  64008. #ifdef WOLFSSL_KEIL
  64009. "muls r6, r5, r6\n\t"
  64010. #elif defined(__clang__)
  64011. "muls r6, r5\n\t"
  64012. #else
  64013. "mul r6, r5\n\t"
  64014. #endif
  64015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64016. "adds r3, r3, r6\n\t"
  64017. #else
  64018. "add r3, r3, r6\n\t"
  64019. #endif
  64020. #ifdef WOLFSSL_KEIL
  64021. "adcs r4, r4, %[r]\n\t"
  64022. #elif defined(__clang__)
  64023. "adcs r4, %[r]\n\t"
  64024. #else
  64025. "adc r4, %[r]\n\t"
  64026. #endif
  64027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64028. "adds r3, r3, r6\n\t"
  64029. #else
  64030. "add r3, r3, r6\n\t"
  64031. #endif
  64032. #ifdef WOLFSSL_KEIL
  64033. "adcs r4, r4, %[r]\n\t"
  64034. #elif defined(__clang__)
  64035. "adcs r4, %[r]\n\t"
  64036. #else
  64037. "adc r4, %[r]\n\t"
  64038. #endif
  64039. "uxth r6, r7\n\t"
  64040. #ifdef WOLFSSL_KEIL
  64041. "muls r5, r6, r5\n\t"
  64042. #elif defined(__clang__)
  64043. "muls r5, r6\n\t"
  64044. #else
  64045. "mul r5, r6\n\t"
  64046. #endif
  64047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64048. "lsrs r6, r5, #16\n\t"
  64049. #else
  64050. "lsr r6, r5, #16\n\t"
  64051. #endif
  64052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64053. "lsls r5, r5, #16\n\t"
  64054. #else
  64055. "lsl r5, r5, #16\n\t"
  64056. #endif
  64057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64058. "adds r2, r2, r5\n\t"
  64059. #else
  64060. "add r2, r2, r5\n\t"
  64061. #endif
  64062. #ifdef WOLFSSL_KEIL
  64063. "adcs r3, r3, r6\n\t"
  64064. #elif defined(__clang__)
  64065. "adcs r3, r6\n\t"
  64066. #else
  64067. "adc r3, r6\n\t"
  64068. #endif
  64069. #ifdef WOLFSSL_KEIL
  64070. "adcs r4, r4, %[r]\n\t"
  64071. #elif defined(__clang__)
  64072. "adcs r4, %[r]\n\t"
  64073. #else
  64074. "adc r4, %[r]\n\t"
  64075. #endif
  64076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64077. "adds r2, r2, r5\n\t"
  64078. #else
  64079. "add r2, r2, r5\n\t"
  64080. #endif
  64081. #ifdef WOLFSSL_KEIL
  64082. "adcs r3, r3, r6\n\t"
  64083. #elif defined(__clang__)
  64084. "adcs r3, r6\n\t"
  64085. #else
  64086. "adc r3, r6\n\t"
  64087. #endif
  64088. #ifdef WOLFSSL_KEIL
  64089. "adcs r4, r4, %[r]\n\t"
  64090. #elif defined(__clang__)
  64091. "adcs r4, %[r]\n\t"
  64092. #else
  64093. "adc r4, %[r]\n\t"
  64094. #endif
  64095. "# A[6] * A[6]\n\t"
  64096. "mov %[a], r9\n\t"
  64097. "ldr r7, [%[a], #24]\n\t"
  64098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64099. "lsrs r6, r7, #16\n\t"
  64100. #else
  64101. "lsr r6, r7, #16\n\t"
  64102. #endif
  64103. "uxth r5, r7\n\t"
  64104. #ifdef WOLFSSL_KEIL
  64105. "muls r5, r5, r5\n\t"
  64106. #elif defined(__clang__)
  64107. "muls r5, r5\n\t"
  64108. #else
  64109. "mul r5, r5\n\t"
  64110. #endif
  64111. #ifdef WOLFSSL_KEIL
  64112. "muls r6, r6, r6\n\t"
  64113. #elif defined(__clang__)
  64114. "muls r6, r6\n\t"
  64115. #else
  64116. "mul r6, r6\n\t"
  64117. #endif
  64118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64119. "adds r2, r2, r5\n\t"
  64120. #else
  64121. "add r2, r2, r5\n\t"
  64122. #endif
  64123. #ifdef WOLFSSL_KEIL
  64124. "adcs r3, r3, r6\n\t"
  64125. #elif defined(__clang__)
  64126. "adcs r3, r6\n\t"
  64127. #else
  64128. "adc r3, r6\n\t"
  64129. #endif
  64130. #ifdef WOLFSSL_KEIL
  64131. "adcs r4, r4, %[r]\n\t"
  64132. #elif defined(__clang__)
  64133. "adcs r4, %[r]\n\t"
  64134. #else
  64135. "adc r4, %[r]\n\t"
  64136. #endif
  64137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64138. "lsrs r6, r7, #16\n\t"
  64139. #else
  64140. "lsr r6, r7, #16\n\t"
  64141. #endif
  64142. "uxth r5, r7\n\t"
  64143. #ifdef WOLFSSL_KEIL
  64144. "muls r5, r6, r5\n\t"
  64145. #elif defined(__clang__)
  64146. "muls r5, r6\n\t"
  64147. #else
  64148. "mul r5, r6\n\t"
  64149. #endif
  64150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64151. "lsrs r6, r5, #15\n\t"
  64152. #else
  64153. "lsr r6, r5, #15\n\t"
  64154. #endif
  64155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64156. "lsls r5, r5, #17\n\t"
  64157. #else
  64158. "lsl r5, r5, #17\n\t"
  64159. #endif
  64160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64161. "adds r2, r2, r5\n\t"
  64162. #else
  64163. "add r2, r2, r5\n\t"
  64164. #endif
  64165. #ifdef WOLFSSL_KEIL
  64166. "adcs r3, r3, r6\n\t"
  64167. #elif defined(__clang__)
  64168. "adcs r3, r6\n\t"
  64169. #else
  64170. "adc r3, r6\n\t"
  64171. #endif
  64172. #ifdef WOLFSSL_KEIL
  64173. "adcs r4, r4, %[r]\n\t"
  64174. #elif defined(__clang__)
  64175. "adcs r4, %[r]\n\t"
  64176. #else
  64177. "adc r4, %[r]\n\t"
  64178. #endif
  64179. "mov %[r], r8\n\t"
  64180. "str r2, [%[r], #48]\n\t"
  64181. "movs %[r], #0\n\t"
  64182. "movs %[a], #32\n\t"
  64183. "add %[a], %[a], r9\n\t"
  64184. "ldm %[a]!, {r5, r6}\n\t"
  64185. "mov r10, r5\n\t"
  64186. "mov r11, r6\n\t"
  64187. "ldm %[a]!, {r5, r6}\n\t"
  64188. "mov r12, r5\n\t"
  64189. "mov lr, r6\n\t"
  64190. "mov %[a], r9\n\t"
  64191. "# A[7] * A[6]\n\t"
  64192. "movs r2, #0\n\t"
  64193. "ldr %[a], [%[a], #28]\n\t"
  64194. "uxth r5, %[a]\n\t"
  64195. "uxth r6, r7\n\t"
  64196. #ifdef WOLFSSL_KEIL
  64197. "muls r6, r5, r6\n\t"
  64198. #elif defined(__clang__)
  64199. "muls r6, r5\n\t"
  64200. #else
  64201. "mul r6, r5\n\t"
  64202. #endif
  64203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64204. "adds r3, r3, r6\n\t"
  64205. #else
  64206. "add r3, r3, r6\n\t"
  64207. #endif
  64208. #ifdef WOLFSSL_KEIL
  64209. "adcs r4, r4, %[r]\n\t"
  64210. #elif defined(__clang__)
  64211. "adcs r4, %[r]\n\t"
  64212. #else
  64213. "adc r4, %[r]\n\t"
  64214. #endif
  64215. #ifdef WOLFSSL_KEIL
  64216. "adcs r2, r2, %[r]\n\t"
  64217. #elif defined(__clang__)
  64218. "adcs r2, %[r]\n\t"
  64219. #else
  64220. "adc r2, %[r]\n\t"
  64221. #endif
  64222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64223. "adds r3, r3, r6\n\t"
  64224. #else
  64225. "add r3, r3, r6\n\t"
  64226. #endif
  64227. #ifdef WOLFSSL_KEIL
  64228. "adcs r4, r4, %[r]\n\t"
  64229. #elif defined(__clang__)
  64230. "adcs r4, %[r]\n\t"
  64231. #else
  64232. "adc r4, %[r]\n\t"
  64233. #endif
  64234. #ifdef WOLFSSL_KEIL
  64235. "adcs r2, r2, %[r]\n\t"
  64236. #elif defined(__clang__)
  64237. "adcs r2, %[r]\n\t"
  64238. #else
  64239. "adc r2, %[r]\n\t"
  64240. #endif
  64241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64242. "lsrs r6, r7, #16\n\t"
  64243. #else
  64244. "lsr r6, r7, #16\n\t"
  64245. #endif
  64246. #ifdef WOLFSSL_KEIL
  64247. "muls r5, r6, r5\n\t"
  64248. #elif defined(__clang__)
  64249. "muls r5, r6\n\t"
  64250. #else
  64251. "mul r5, r6\n\t"
  64252. #endif
  64253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64254. "lsrs r6, r5, #16\n\t"
  64255. #else
  64256. "lsr r6, r5, #16\n\t"
  64257. #endif
  64258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64259. "lsls r5, r5, #16\n\t"
  64260. #else
  64261. "lsl r5, r5, #16\n\t"
  64262. #endif
  64263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64264. "adds r3, r3, r5\n\t"
  64265. #else
  64266. "add r3, r3, r5\n\t"
  64267. #endif
  64268. #ifdef WOLFSSL_KEIL
  64269. "adcs r4, r4, r6\n\t"
  64270. #elif defined(__clang__)
  64271. "adcs r4, r6\n\t"
  64272. #else
  64273. "adc r4, r6\n\t"
  64274. #endif
  64275. #ifdef WOLFSSL_KEIL
  64276. "adcs r2, r2, %[r]\n\t"
  64277. #elif defined(__clang__)
  64278. "adcs r2, %[r]\n\t"
  64279. #else
  64280. "adc r2, %[r]\n\t"
  64281. #endif
  64282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64283. "adds r3, r3, r5\n\t"
  64284. #else
  64285. "add r3, r3, r5\n\t"
  64286. #endif
  64287. #ifdef WOLFSSL_KEIL
  64288. "adcs r4, r4, r6\n\t"
  64289. #elif defined(__clang__)
  64290. "adcs r4, r6\n\t"
  64291. #else
  64292. "adc r4, r6\n\t"
  64293. #endif
  64294. #ifdef WOLFSSL_KEIL
  64295. "adcs r2, r2, %[r]\n\t"
  64296. #elif defined(__clang__)
  64297. "adcs r2, %[r]\n\t"
  64298. #else
  64299. "adc r2, %[r]\n\t"
  64300. #endif
  64301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64302. "lsrs r5, %[a], #16\n\t"
  64303. #else
  64304. "lsr r5, %[a], #16\n\t"
  64305. #endif
  64306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64307. "lsrs r6, r7, #16\n\t"
  64308. #else
  64309. "lsr r6, r7, #16\n\t"
  64310. #endif
  64311. #ifdef WOLFSSL_KEIL
  64312. "muls r6, r5, r6\n\t"
  64313. #elif defined(__clang__)
  64314. "muls r6, r5\n\t"
  64315. #else
  64316. "mul r6, r5\n\t"
  64317. #endif
  64318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64319. "adds r4, r4, r6\n\t"
  64320. #else
  64321. "add r4, r4, r6\n\t"
  64322. #endif
  64323. #ifdef WOLFSSL_KEIL
  64324. "adcs r2, r2, %[r]\n\t"
  64325. #elif defined(__clang__)
  64326. "adcs r2, %[r]\n\t"
  64327. #else
  64328. "adc r2, %[r]\n\t"
  64329. #endif
  64330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64331. "adds r4, r4, r6\n\t"
  64332. #else
  64333. "add r4, r4, r6\n\t"
  64334. #endif
  64335. #ifdef WOLFSSL_KEIL
  64336. "adcs r2, r2, %[r]\n\t"
  64337. #elif defined(__clang__)
  64338. "adcs r2, %[r]\n\t"
  64339. #else
  64340. "adc r2, %[r]\n\t"
  64341. #endif
  64342. "uxth r6, r7\n\t"
  64343. #ifdef WOLFSSL_KEIL
  64344. "muls r5, r6, r5\n\t"
  64345. #elif defined(__clang__)
  64346. "muls r5, r6\n\t"
  64347. #else
  64348. "mul r5, r6\n\t"
  64349. #endif
  64350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64351. "lsrs r6, r5, #16\n\t"
  64352. #else
  64353. "lsr r6, r5, #16\n\t"
  64354. #endif
  64355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64356. "lsls r5, r5, #16\n\t"
  64357. #else
  64358. "lsl r5, r5, #16\n\t"
  64359. #endif
  64360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64361. "adds r3, r3, r5\n\t"
  64362. #else
  64363. "add r3, r3, r5\n\t"
  64364. #endif
  64365. #ifdef WOLFSSL_KEIL
  64366. "adcs r4, r4, r6\n\t"
  64367. #elif defined(__clang__)
  64368. "adcs r4, r6\n\t"
  64369. #else
  64370. "adc r4, r6\n\t"
  64371. #endif
  64372. #ifdef WOLFSSL_KEIL
  64373. "adcs r2, r2, %[r]\n\t"
  64374. #elif defined(__clang__)
  64375. "adcs r2, %[r]\n\t"
  64376. #else
  64377. "adc r2, %[r]\n\t"
  64378. #endif
  64379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64380. "adds r3, r3, r5\n\t"
  64381. #else
  64382. "add r3, r3, r5\n\t"
  64383. #endif
  64384. #ifdef WOLFSSL_KEIL
  64385. "adcs r4, r4, r6\n\t"
  64386. #elif defined(__clang__)
  64387. "adcs r4, r6\n\t"
  64388. #else
  64389. "adc r4, r6\n\t"
  64390. #endif
  64391. #ifdef WOLFSSL_KEIL
  64392. "adcs r2, r2, %[r]\n\t"
  64393. #elif defined(__clang__)
  64394. "adcs r2, %[r]\n\t"
  64395. #else
  64396. "adc r2, %[r]\n\t"
  64397. #endif
  64398. "# A[8] * A[5]\n\t"
  64399. "mov %[a], r9\n\t"
  64400. "ldr r7, [%[a], #20]\n\t"
  64401. "mov %[a], r10\n\t"
  64402. "uxth r5, %[a]\n\t"
  64403. "uxth r6, r7\n\t"
  64404. #ifdef WOLFSSL_KEIL
  64405. "muls r6, r5, r6\n\t"
  64406. #elif defined(__clang__)
  64407. "muls r6, r5\n\t"
  64408. #else
  64409. "mul r6, r5\n\t"
  64410. #endif
  64411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64412. "adds r3, r3, r6\n\t"
  64413. #else
  64414. "add r3, r3, r6\n\t"
  64415. #endif
  64416. #ifdef WOLFSSL_KEIL
  64417. "adcs r4, r4, %[r]\n\t"
  64418. #elif defined(__clang__)
  64419. "adcs r4, %[r]\n\t"
  64420. #else
  64421. "adc r4, %[r]\n\t"
  64422. #endif
  64423. #ifdef WOLFSSL_KEIL
  64424. "adcs r2, r2, %[r]\n\t"
  64425. #elif defined(__clang__)
  64426. "adcs r2, %[r]\n\t"
  64427. #else
  64428. "adc r2, %[r]\n\t"
  64429. #endif
  64430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64431. "adds r3, r3, r6\n\t"
  64432. #else
  64433. "add r3, r3, r6\n\t"
  64434. #endif
  64435. #ifdef WOLFSSL_KEIL
  64436. "adcs r4, r4, %[r]\n\t"
  64437. #elif defined(__clang__)
  64438. "adcs r4, %[r]\n\t"
  64439. #else
  64440. "adc r4, %[r]\n\t"
  64441. #endif
  64442. #ifdef WOLFSSL_KEIL
  64443. "adcs r2, r2, %[r]\n\t"
  64444. #elif defined(__clang__)
  64445. "adcs r2, %[r]\n\t"
  64446. #else
  64447. "adc r2, %[r]\n\t"
  64448. #endif
  64449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64450. "lsrs r6, r7, #16\n\t"
  64451. #else
  64452. "lsr r6, r7, #16\n\t"
  64453. #endif
  64454. #ifdef WOLFSSL_KEIL
  64455. "muls r5, r6, r5\n\t"
  64456. #elif defined(__clang__)
  64457. "muls r5, r6\n\t"
  64458. #else
  64459. "mul r5, r6\n\t"
  64460. #endif
  64461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64462. "lsrs r6, r5, #16\n\t"
  64463. #else
  64464. "lsr r6, r5, #16\n\t"
  64465. #endif
  64466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64467. "lsls r5, r5, #16\n\t"
  64468. #else
  64469. "lsl r5, r5, #16\n\t"
  64470. #endif
  64471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64472. "adds r3, r3, r5\n\t"
  64473. #else
  64474. "add r3, r3, r5\n\t"
  64475. #endif
  64476. #ifdef WOLFSSL_KEIL
  64477. "adcs r4, r4, r6\n\t"
  64478. #elif defined(__clang__)
  64479. "adcs r4, r6\n\t"
  64480. #else
  64481. "adc r4, r6\n\t"
  64482. #endif
  64483. #ifdef WOLFSSL_KEIL
  64484. "adcs r2, r2, %[r]\n\t"
  64485. #elif defined(__clang__)
  64486. "adcs r2, %[r]\n\t"
  64487. #else
  64488. "adc r2, %[r]\n\t"
  64489. #endif
  64490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64491. "adds r3, r3, r5\n\t"
  64492. #else
  64493. "add r3, r3, r5\n\t"
  64494. #endif
  64495. #ifdef WOLFSSL_KEIL
  64496. "adcs r4, r4, r6\n\t"
  64497. #elif defined(__clang__)
  64498. "adcs r4, r6\n\t"
  64499. #else
  64500. "adc r4, r6\n\t"
  64501. #endif
  64502. #ifdef WOLFSSL_KEIL
  64503. "adcs r2, r2, %[r]\n\t"
  64504. #elif defined(__clang__)
  64505. "adcs r2, %[r]\n\t"
  64506. #else
  64507. "adc r2, %[r]\n\t"
  64508. #endif
  64509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64510. "lsrs r5, %[a], #16\n\t"
  64511. #else
  64512. "lsr r5, %[a], #16\n\t"
  64513. #endif
  64514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64515. "lsrs r6, r7, #16\n\t"
  64516. #else
  64517. "lsr r6, r7, #16\n\t"
  64518. #endif
  64519. #ifdef WOLFSSL_KEIL
  64520. "muls r6, r5, r6\n\t"
  64521. #elif defined(__clang__)
  64522. "muls r6, r5\n\t"
  64523. #else
  64524. "mul r6, r5\n\t"
  64525. #endif
  64526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64527. "adds r4, r4, r6\n\t"
  64528. #else
  64529. "add r4, r4, r6\n\t"
  64530. #endif
  64531. #ifdef WOLFSSL_KEIL
  64532. "adcs r2, r2, %[r]\n\t"
  64533. #elif defined(__clang__)
  64534. "adcs r2, %[r]\n\t"
  64535. #else
  64536. "adc r2, %[r]\n\t"
  64537. #endif
  64538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64539. "adds r4, r4, r6\n\t"
  64540. #else
  64541. "add r4, r4, r6\n\t"
  64542. #endif
  64543. #ifdef WOLFSSL_KEIL
  64544. "adcs r2, r2, %[r]\n\t"
  64545. #elif defined(__clang__)
  64546. "adcs r2, %[r]\n\t"
  64547. #else
  64548. "adc r2, %[r]\n\t"
  64549. #endif
  64550. "uxth r6, r7\n\t"
  64551. #ifdef WOLFSSL_KEIL
  64552. "muls r5, r6, r5\n\t"
  64553. #elif defined(__clang__)
  64554. "muls r5, r6\n\t"
  64555. #else
  64556. "mul r5, r6\n\t"
  64557. #endif
  64558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64559. "lsrs r6, r5, #16\n\t"
  64560. #else
  64561. "lsr r6, r5, #16\n\t"
  64562. #endif
  64563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64564. "lsls r5, r5, #16\n\t"
  64565. #else
  64566. "lsl r5, r5, #16\n\t"
  64567. #endif
  64568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64569. "adds r3, r3, r5\n\t"
  64570. #else
  64571. "add r3, r3, r5\n\t"
  64572. #endif
  64573. #ifdef WOLFSSL_KEIL
  64574. "adcs r4, r4, r6\n\t"
  64575. #elif defined(__clang__)
  64576. "adcs r4, r6\n\t"
  64577. #else
  64578. "adc r4, r6\n\t"
  64579. #endif
  64580. #ifdef WOLFSSL_KEIL
  64581. "adcs r2, r2, %[r]\n\t"
  64582. #elif defined(__clang__)
  64583. "adcs r2, %[r]\n\t"
  64584. #else
  64585. "adc r2, %[r]\n\t"
  64586. #endif
  64587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64588. "adds r3, r3, r5\n\t"
  64589. #else
  64590. "add r3, r3, r5\n\t"
  64591. #endif
  64592. #ifdef WOLFSSL_KEIL
  64593. "adcs r4, r4, r6\n\t"
  64594. #elif defined(__clang__)
  64595. "adcs r4, r6\n\t"
  64596. #else
  64597. "adc r4, r6\n\t"
  64598. #endif
  64599. #ifdef WOLFSSL_KEIL
  64600. "adcs r2, r2, %[r]\n\t"
  64601. #elif defined(__clang__)
  64602. "adcs r2, %[r]\n\t"
  64603. #else
  64604. "adc r2, %[r]\n\t"
  64605. #endif
  64606. "# A[9] * A[4]\n\t"
  64607. "mov %[a], r9\n\t"
  64608. "ldr r7, [%[a], #16]\n\t"
  64609. "mov %[a], r11\n\t"
  64610. "uxth r5, %[a]\n\t"
  64611. "uxth r6, r7\n\t"
  64612. #ifdef WOLFSSL_KEIL
  64613. "muls r6, r5, r6\n\t"
  64614. #elif defined(__clang__)
  64615. "muls r6, r5\n\t"
  64616. #else
  64617. "mul r6, r5\n\t"
  64618. #endif
  64619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64620. "adds r3, r3, r6\n\t"
  64621. #else
  64622. "add r3, r3, r6\n\t"
  64623. #endif
  64624. #ifdef WOLFSSL_KEIL
  64625. "adcs r4, r4, %[r]\n\t"
  64626. #elif defined(__clang__)
  64627. "adcs r4, %[r]\n\t"
  64628. #else
  64629. "adc r4, %[r]\n\t"
  64630. #endif
  64631. #ifdef WOLFSSL_KEIL
  64632. "adcs r2, r2, %[r]\n\t"
  64633. #elif defined(__clang__)
  64634. "adcs r2, %[r]\n\t"
  64635. #else
  64636. "adc r2, %[r]\n\t"
  64637. #endif
  64638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64639. "adds r3, r3, r6\n\t"
  64640. #else
  64641. "add r3, r3, r6\n\t"
  64642. #endif
  64643. #ifdef WOLFSSL_KEIL
  64644. "adcs r4, r4, %[r]\n\t"
  64645. #elif defined(__clang__)
  64646. "adcs r4, %[r]\n\t"
  64647. #else
  64648. "adc r4, %[r]\n\t"
  64649. #endif
  64650. #ifdef WOLFSSL_KEIL
  64651. "adcs r2, r2, %[r]\n\t"
  64652. #elif defined(__clang__)
  64653. "adcs r2, %[r]\n\t"
  64654. #else
  64655. "adc r2, %[r]\n\t"
  64656. #endif
  64657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64658. "lsrs r6, r7, #16\n\t"
  64659. #else
  64660. "lsr r6, r7, #16\n\t"
  64661. #endif
  64662. #ifdef WOLFSSL_KEIL
  64663. "muls r5, r6, r5\n\t"
  64664. #elif defined(__clang__)
  64665. "muls r5, r6\n\t"
  64666. #else
  64667. "mul r5, r6\n\t"
  64668. #endif
  64669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64670. "lsrs r6, r5, #16\n\t"
  64671. #else
  64672. "lsr r6, r5, #16\n\t"
  64673. #endif
  64674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64675. "lsls r5, r5, #16\n\t"
  64676. #else
  64677. "lsl r5, r5, #16\n\t"
  64678. #endif
  64679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64680. "adds r3, r3, r5\n\t"
  64681. #else
  64682. "add r3, r3, r5\n\t"
  64683. #endif
  64684. #ifdef WOLFSSL_KEIL
  64685. "adcs r4, r4, r6\n\t"
  64686. #elif defined(__clang__)
  64687. "adcs r4, r6\n\t"
  64688. #else
  64689. "adc r4, r6\n\t"
  64690. #endif
  64691. #ifdef WOLFSSL_KEIL
  64692. "adcs r2, r2, %[r]\n\t"
  64693. #elif defined(__clang__)
  64694. "adcs r2, %[r]\n\t"
  64695. #else
  64696. "adc r2, %[r]\n\t"
  64697. #endif
  64698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64699. "adds r3, r3, r5\n\t"
  64700. #else
  64701. "add r3, r3, r5\n\t"
  64702. #endif
  64703. #ifdef WOLFSSL_KEIL
  64704. "adcs r4, r4, r6\n\t"
  64705. #elif defined(__clang__)
  64706. "adcs r4, r6\n\t"
  64707. #else
  64708. "adc r4, r6\n\t"
  64709. #endif
  64710. #ifdef WOLFSSL_KEIL
  64711. "adcs r2, r2, %[r]\n\t"
  64712. #elif defined(__clang__)
  64713. "adcs r2, %[r]\n\t"
  64714. #else
  64715. "adc r2, %[r]\n\t"
  64716. #endif
  64717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64718. "lsrs r5, %[a], #16\n\t"
  64719. #else
  64720. "lsr r5, %[a], #16\n\t"
  64721. #endif
  64722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64723. "lsrs r6, r7, #16\n\t"
  64724. #else
  64725. "lsr r6, r7, #16\n\t"
  64726. #endif
  64727. #ifdef WOLFSSL_KEIL
  64728. "muls r6, r5, r6\n\t"
  64729. #elif defined(__clang__)
  64730. "muls r6, r5\n\t"
  64731. #else
  64732. "mul r6, r5\n\t"
  64733. #endif
  64734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64735. "adds r4, r4, r6\n\t"
  64736. #else
  64737. "add r4, r4, r6\n\t"
  64738. #endif
  64739. #ifdef WOLFSSL_KEIL
  64740. "adcs r2, r2, %[r]\n\t"
  64741. #elif defined(__clang__)
  64742. "adcs r2, %[r]\n\t"
  64743. #else
  64744. "adc r2, %[r]\n\t"
  64745. #endif
  64746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64747. "adds r4, r4, r6\n\t"
  64748. #else
  64749. "add r4, r4, r6\n\t"
  64750. #endif
  64751. #ifdef WOLFSSL_KEIL
  64752. "adcs r2, r2, %[r]\n\t"
  64753. #elif defined(__clang__)
  64754. "adcs r2, %[r]\n\t"
  64755. #else
  64756. "adc r2, %[r]\n\t"
  64757. #endif
  64758. "uxth r6, r7\n\t"
  64759. #ifdef WOLFSSL_KEIL
  64760. "muls r5, r6, r5\n\t"
  64761. #elif defined(__clang__)
  64762. "muls r5, r6\n\t"
  64763. #else
  64764. "mul r5, r6\n\t"
  64765. #endif
  64766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64767. "lsrs r6, r5, #16\n\t"
  64768. #else
  64769. "lsr r6, r5, #16\n\t"
  64770. #endif
  64771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64772. "lsls r5, r5, #16\n\t"
  64773. #else
  64774. "lsl r5, r5, #16\n\t"
  64775. #endif
  64776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64777. "adds r3, r3, r5\n\t"
  64778. #else
  64779. "add r3, r3, r5\n\t"
  64780. #endif
  64781. #ifdef WOLFSSL_KEIL
  64782. "adcs r4, r4, r6\n\t"
  64783. #elif defined(__clang__)
  64784. "adcs r4, r6\n\t"
  64785. #else
  64786. "adc r4, r6\n\t"
  64787. #endif
  64788. #ifdef WOLFSSL_KEIL
  64789. "adcs r2, r2, %[r]\n\t"
  64790. #elif defined(__clang__)
  64791. "adcs r2, %[r]\n\t"
  64792. #else
  64793. "adc r2, %[r]\n\t"
  64794. #endif
  64795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64796. "adds r3, r3, r5\n\t"
  64797. #else
  64798. "add r3, r3, r5\n\t"
  64799. #endif
  64800. #ifdef WOLFSSL_KEIL
  64801. "adcs r4, r4, r6\n\t"
  64802. #elif defined(__clang__)
  64803. "adcs r4, r6\n\t"
  64804. #else
  64805. "adc r4, r6\n\t"
  64806. #endif
  64807. #ifdef WOLFSSL_KEIL
  64808. "adcs r2, r2, %[r]\n\t"
  64809. #elif defined(__clang__)
  64810. "adcs r2, %[r]\n\t"
  64811. #else
  64812. "adc r2, %[r]\n\t"
  64813. #endif
  64814. "# A[10] * A[3]\n\t"
  64815. "mov %[a], r9\n\t"
  64816. "ldr r7, [%[a], #12]\n\t"
  64817. "mov %[a], r12\n\t"
  64818. "uxth r5, %[a]\n\t"
  64819. "uxth r6, r7\n\t"
  64820. #ifdef WOLFSSL_KEIL
  64821. "muls r6, r5, r6\n\t"
  64822. #elif defined(__clang__)
  64823. "muls r6, r5\n\t"
  64824. #else
  64825. "mul r6, r5\n\t"
  64826. #endif
  64827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64828. "adds r3, r3, r6\n\t"
  64829. #else
  64830. "add r3, r3, r6\n\t"
  64831. #endif
  64832. #ifdef WOLFSSL_KEIL
  64833. "adcs r4, r4, %[r]\n\t"
  64834. #elif defined(__clang__)
  64835. "adcs r4, %[r]\n\t"
  64836. #else
  64837. "adc r4, %[r]\n\t"
  64838. #endif
  64839. #ifdef WOLFSSL_KEIL
  64840. "adcs r2, r2, %[r]\n\t"
  64841. #elif defined(__clang__)
  64842. "adcs r2, %[r]\n\t"
  64843. #else
  64844. "adc r2, %[r]\n\t"
  64845. #endif
  64846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64847. "adds r3, r3, r6\n\t"
  64848. #else
  64849. "add r3, r3, r6\n\t"
  64850. #endif
  64851. #ifdef WOLFSSL_KEIL
  64852. "adcs r4, r4, %[r]\n\t"
  64853. #elif defined(__clang__)
  64854. "adcs r4, %[r]\n\t"
  64855. #else
  64856. "adc r4, %[r]\n\t"
  64857. #endif
  64858. #ifdef WOLFSSL_KEIL
  64859. "adcs r2, r2, %[r]\n\t"
  64860. #elif defined(__clang__)
  64861. "adcs r2, %[r]\n\t"
  64862. #else
  64863. "adc r2, %[r]\n\t"
  64864. #endif
  64865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64866. "lsrs r6, r7, #16\n\t"
  64867. #else
  64868. "lsr r6, r7, #16\n\t"
  64869. #endif
  64870. #ifdef WOLFSSL_KEIL
  64871. "muls r5, r6, r5\n\t"
  64872. #elif defined(__clang__)
  64873. "muls r5, r6\n\t"
  64874. #else
  64875. "mul r5, r6\n\t"
  64876. #endif
  64877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64878. "lsrs r6, r5, #16\n\t"
  64879. #else
  64880. "lsr r6, r5, #16\n\t"
  64881. #endif
  64882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64883. "lsls r5, r5, #16\n\t"
  64884. #else
  64885. "lsl r5, r5, #16\n\t"
  64886. #endif
  64887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64888. "adds r3, r3, r5\n\t"
  64889. #else
  64890. "add r3, r3, r5\n\t"
  64891. #endif
  64892. #ifdef WOLFSSL_KEIL
  64893. "adcs r4, r4, r6\n\t"
  64894. #elif defined(__clang__)
  64895. "adcs r4, r6\n\t"
  64896. #else
  64897. "adc r4, r6\n\t"
  64898. #endif
  64899. #ifdef WOLFSSL_KEIL
  64900. "adcs r2, r2, %[r]\n\t"
  64901. #elif defined(__clang__)
  64902. "adcs r2, %[r]\n\t"
  64903. #else
  64904. "adc r2, %[r]\n\t"
  64905. #endif
  64906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64907. "adds r3, r3, r5\n\t"
  64908. #else
  64909. "add r3, r3, r5\n\t"
  64910. #endif
  64911. #ifdef WOLFSSL_KEIL
  64912. "adcs r4, r4, r6\n\t"
  64913. #elif defined(__clang__)
  64914. "adcs r4, r6\n\t"
  64915. #else
  64916. "adc r4, r6\n\t"
  64917. #endif
  64918. #ifdef WOLFSSL_KEIL
  64919. "adcs r2, r2, %[r]\n\t"
  64920. #elif defined(__clang__)
  64921. "adcs r2, %[r]\n\t"
  64922. #else
  64923. "adc r2, %[r]\n\t"
  64924. #endif
  64925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64926. "lsrs r5, %[a], #16\n\t"
  64927. #else
  64928. "lsr r5, %[a], #16\n\t"
  64929. #endif
  64930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64931. "lsrs r6, r7, #16\n\t"
  64932. #else
  64933. "lsr r6, r7, #16\n\t"
  64934. #endif
  64935. #ifdef WOLFSSL_KEIL
  64936. "muls r6, r5, r6\n\t"
  64937. #elif defined(__clang__)
  64938. "muls r6, r5\n\t"
  64939. #else
  64940. "mul r6, r5\n\t"
  64941. #endif
  64942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64943. "adds r4, r4, r6\n\t"
  64944. #else
  64945. "add r4, r4, r6\n\t"
  64946. #endif
  64947. #ifdef WOLFSSL_KEIL
  64948. "adcs r2, r2, %[r]\n\t"
  64949. #elif defined(__clang__)
  64950. "adcs r2, %[r]\n\t"
  64951. #else
  64952. "adc r2, %[r]\n\t"
  64953. #endif
  64954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64955. "adds r4, r4, r6\n\t"
  64956. #else
  64957. "add r4, r4, r6\n\t"
  64958. #endif
  64959. #ifdef WOLFSSL_KEIL
  64960. "adcs r2, r2, %[r]\n\t"
  64961. #elif defined(__clang__)
  64962. "adcs r2, %[r]\n\t"
  64963. #else
  64964. "adc r2, %[r]\n\t"
  64965. #endif
  64966. "uxth r6, r7\n\t"
  64967. #ifdef WOLFSSL_KEIL
  64968. "muls r5, r6, r5\n\t"
  64969. #elif defined(__clang__)
  64970. "muls r5, r6\n\t"
  64971. #else
  64972. "mul r5, r6\n\t"
  64973. #endif
  64974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64975. "lsrs r6, r5, #16\n\t"
  64976. #else
  64977. "lsr r6, r5, #16\n\t"
  64978. #endif
  64979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64980. "lsls r5, r5, #16\n\t"
  64981. #else
  64982. "lsl r5, r5, #16\n\t"
  64983. #endif
  64984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  64985. "adds r3, r3, r5\n\t"
  64986. #else
  64987. "add r3, r3, r5\n\t"
  64988. #endif
  64989. #ifdef WOLFSSL_KEIL
  64990. "adcs r4, r4, r6\n\t"
  64991. #elif defined(__clang__)
  64992. "adcs r4, r6\n\t"
  64993. #else
  64994. "adc r4, r6\n\t"
  64995. #endif
  64996. #ifdef WOLFSSL_KEIL
  64997. "adcs r2, r2, %[r]\n\t"
  64998. #elif defined(__clang__)
  64999. "adcs r2, %[r]\n\t"
  65000. #else
  65001. "adc r2, %[r]\n\t"
  65002. #endif
  65003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65004. "adds r3, r3, r5\n\t"
  65005. #else
  65006. "add r3, r3, r5\n\t"
  65007. #endif
  65008. #ifdef WOLFSSL_KEIL
  65009. "adcs r4, r4, r6\n\t"
  65010. #elif defined(__clang__)
  65011. "adcs r4, r6\n\t"
  65012. #else
  65013. "adc r4, r6\n\t"
  65014. #endif
  65015. #ifdef WOLFSSL_KEIL
  65016. "adcs r2, r2, %[r]\n\t"
  65017. #elif defined(__clang__)
  65018. "adcs r2, %[r]\n\t"
  65019. #else
  65020. "adc r2, %[r]\n\t"
  65021. #endif
  65022. "# A[11] * A[2]\n\t"
  65023. "mov %[a], r9\n\t"
  65024. "ldr r7, [%[a], #8]\n\t"
  65025. "mov %[a], lr\n\t"
  65026. "uxth r5, %[a]\n\t"
  65027. "uxth r6, r7\n\t"
  65028. #ifdef WOLFSSL_KEIL
  65029. "muls r6, r5, r6\n\t"
  65030. #elif defined(__clang__)
  65031. "muls r6, r5\n\t"
  65032. #else
  65033. "mul r6, r5\n\t"
  65034. #endif
  65035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65036. "adds r3, r3, r6\n\t"
  65037. #else
  65038. "add r3, r3, r6\n\t"
  65039. #endif
  65040. #ifdef WOLFSSL_KEIL
  65041. "adcs r4, r4, %[r]\n\t"
  65042. #elif defined(__clang__)
  65043. "adcs r4, %[r]\n\t"
  65044. #else
  65045. "adc r4, %[r]\n\t"
  65046. #endif
  65047. #ifdef WOLFSSL_KEIL
  65048. "adcs r2, r2, %[r]\n\t"
  65049. #elif defined(__clang__)
  65050. "adcs r2, %[r]\n\t"
  65051. #else
  65052. "adc r2, %[r]\n\t"
  65053. #endif
  65054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65055. "adds r3, r3, r6\n\t"
  65056. #else
  65057. "add r3, r3, r6\n\t"
  65058. #endif
  65059. #ifdef WOLFSSL_KEIL
  65060. "adcs r4, r4, %[r]\n\t"
  65061. #elif defined(__clang__)
  65062. "adcs r4, %[r]\n\t"
  65063. #else
  65064. "adc r4, %[r]\n\t"
  65065. #endif
  65066. #ifdef WOLFSSL_KEIL
  65067. "adcs r2, r2, %[r]\n\t"
  65068. #elif defined(__clang__)
  65069. "adcs r2, %[r]\n\t"
  65070. #else
  65071. "adc r2, %[r]\n\t"
  65072. #endif
  65073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65074. "lsrs r6, r7, #16\n\t"
  65075. #else
  65076. "lsr r6, r7, #16\n\t"
  65077. #endif
  65078. #ifdef WOLFSSL_KEIL
  65079. "muls r5, r6, r5\n\t"
  65080. #elif defined(__clang__)
  65081. "muls r5, r6\n\t"
  65082. #else
  65083. "mul r5, r6\n\t"
  65084. #endif
  65085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65086. "lsrs r6, r5, #16\n\t"
  65087. #else
  65088. "lsr r6, r5, #16\n\t"
  65089. #endif
  65090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65091. "lsls r5, r5, #16\n\t"
  65092. #else
  65093. "lsl r5, r5, #16\n\t"
  65094. #endif
  65095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65096. "adds r3, r3, r5\n\t"
  65097. #else
  65098. "add r3, r3, r5\n\t"
  65099. #endif
  65100. #ifdef WOLFSSL_KEIL
  65101. "adcs r4, r4, r6\n\t"
  65102. #elif defined(__clang__)
  65103. "adcs r4, r6\n\t"
  65104. #else
  65105. "adc r4, r6\n\t"
  65106. #endif
  65107. #ifdef WOLFSSL_KEIL
  65108. "adcs r2, r2, %[r]\n\t"
  65109. #elif defined(__clang__)
  65110. "adcs r2, %[r]\n\t"
  65111. #else
  65112. "adc r2, %[r]\n\t"
  65113. #endif
  65114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65115. "adds r3, r3, r5\n\t"
  65116. #else
  65117. "add r3, r3, r5\n\t"
  65118. #endif
  65119. #ifdef WOLFSSL_KEIL
  65120. "adcs r4, r4, r6\n\t"
  65121. #elif defined(__clang__)
  65122. "adcs r4, r6\n\t"
  65123. #else
  65124. "adc r4, r6\n\t"
  65125. #endif
  65126. #ifdef WOLFSSL_KEIL
  65127. "adcs r2, r2, %[r]\n\t"
  65128. #elif defined(__clang__)
  65129. "adcs r2, %[r]\n\t"
  65130. #else
  65131. "adc r2, %[r]\n\t"
  65132. #endif
  65133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65134. "lsrs r5, %[a], #16\n\t"
  65135. #else
  65136. "lsr r5, %[a], #16\n\t"
  65137. #endif
  65138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65139. "lsrs r6, r7, #16\n\t"
  65140. #else
  65141. "lsr r6, r7, #16\n\t"
  65142. #endif
  65143. #ifdef WOLFSSL_KEIL
  65144. "muls r6, r5, r6\n\t"
  65145. #elif defined(__clang__)
  65146. "muls r6, r5\n\t"
  65147. #else
  65148. "mul r6, r5\n\t"
  65149. #endif
  65150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65151. "adds r4, r4, r6\n\t"
  65152. #else
  65153. "add r4, r4, r6\n\t"
  65154. #endif
  65155. #ifdef WOLFSSL_KEIL
  65156. "adcs r2, r2, %[r]\n\t"
  65157. #elif defined(__clang__)
  65158. "adcs r2, %[r]\n\t"
  65159. #else
  65160. "adc r2, %[r]\n\t"
  65161. #endif
  65162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65163. "adds r4, r4, r6\n\t"
  65164. #else
  65165. "add r4, r4, r6\n\t"
  65166. #endif
  65167. #ifdef WOLFSSL_KEIL
  65168. "adcs r2, r2, %[r]\n\t"
  65169. #elif defined(__clang__)
  65170. "adcs r2, %[r]\n\t"
  65171. #else
  65172. "adc r2, %[r]\n\t"
  65173. #endif
  65174. "uxth r6, r7\n\t"
  65175. #ifdef WOLFSSL_KEIL
  65176. "muls r5, r6, r5\n\t"
  65177. #elif defined(__clang__)
  65178. "muls r5, r6\n\t"
  65179. #else
  65180. "mul r5, r6\n\t"
  65181. #endif
  65182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65183. "lsrs r6, r5, #16\n\t"
  65184. #else
  65185. "lsr r6, r5, #16\n\t"
  65186. #endif
  65187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65188. "lsls r5, r5, #16\n\t"
  65189. #else
  65190. "lsl r5, r5, #16\n\t"
  65191. #endif
  65192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65193. "adds r3, r3, r5\n\t"
  65194. #else
  65195. "add r3, r3, r5\n\t"
  65196. #endif
  65197. #ifdef WOLFSSL_KEIL
  65198. "adcs r4, r4, r6\n\t"
  65199. #elif defined(__clang__)
  65200. "adcs r4, r6\n\t"
  65201. #else
  65202. "adc r4, r6\n\t"
  65203. #endif
  65204. #ifdef WOLFSSL_KEIL
  65205. "adcs r2, r2, %[r]\n\t"
  65206. #elif defined(__clang__)
  65207. "adcs r2, %[r]\n\t"
  65208. #else
  65209. "adc r2, %[r]\n\t"
  65210. #endif
  65211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65212. "adds r3, r3, r5\n\t"
  65213. #else
  65214. "add r3, r3, r5\n\t"
  65215. #endif
  65216. #ifdef WOLFSSL_KEIL
  65217. "adcs r4, r4, r6\n\t"
  65218. #elif defined(__clang__)
  65219. "adcs r4, r6\n\t"
  65220. #else
  65221. "adc r4, r6\n\t"
  65222. #endif
  65223. #ifdef WOLFSSL_KEIL
  65224. "adcs r2, r2, %[r]\n\t"
  65225. #elif defined(__clang__)
  65226. "adcs r2, %[r]\n\t"
  65227. #else
  65228. "adc r2, %[r]\n\t"
  65229. #endif
  65230. "mov %[r], r8\n\t"
  65231. "str r3, [%[r], #52]\n\t"
  65232. "movs %[r], #0\n\t"
  65233. "# A[11] * A[3]\n\t"
  65234. "movs r3, #0\n\t"
  65235. "mov %[a], r9\n\t"
  65236. "ldr r7, [%[a], #12]\n\t"
  65237. "mov %[a], lr\n\t"
  65238. "uxth r5, %[a]\n\t"
  65239. "uxth r6, r7\n\t"
  65240. #ifdef WOLFSSL_KEIL
  65241. "muls r6, r5, r6\n\t"
  65242. #elif defined(__clang__)
  65243. "muls r6, r5\n\t"
  65244. #else
  65245. "mul r6, r5\n\t"
  65246. #endif
  65247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65248. "adds r4, r4, r6\n\t"
  65249. #else
  65250. "add r4, r4, r6\n\t"
  65251. #endif
  65252. #ifdef WOLFSSL_KEIL
  65253. "adcs r2, r2, %[r]\n\t"
  65254. #elif defined(__clang__)
  65255. "adcs r2, %[r]\n\t"
  65256. #else
  65257. "adc r2, %[r]\n\t"
  65258. #endif
  65259. #ifdef WOLFSSL_KEIL
  65260. "adcs r3, r3, %[r]\n\t"
  65261. #elif defined(__clang__)
  65262. "adcs r3, %[r]\n\t"
  65263. #else
  65264. "adc r3, %[r]\n\t"
  65265. #endif
  65266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65267. "adds r4, r4, r6\n\t"
  65268. #else
  65269. "add r4, r4, r6\n\t"
  65270. #endif
  65271. #ifdef WOLFSSL_KEIL
  65272. "adcs r2, r2, %[r]\n\t"
  65273. #elif defined(__clang__)
  65274. "adcs r2, %[r]\n\t"
  65275. #else
  65276. "adc r2, %[r]\n\t"
  65277. #endif
  65278. #ifdef WOLFSSL_KEIL
  65279. "adcs r3, r3, %[r]\n\t"
  65280. #elif defined(__clang__)
  65281. "adcs r3, %[r]\n\t"
  65282. #else
  65283. "adc r3, %[r]\n\t"
  65284. #endif
  65285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65286. "lsrs r6, r7, #16\n\t"
  65287. #else
  65288. "lsr r6, r7, #16\n\t"
  65289. #endif
  65290. #ifdef WOLFSSL_KEIL
  65291. "muls r5, r6, r5\n\t"
  65292. #elif defined(__clang__)
  65293. "muls r5, r6\n\t"
  65294. #else
  65295. "mul r5, r6\n\t"
  65296. #endif
  65297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65298. "lsrs r6, r5, #16\n\t"
  65299. #else
  65300. "lsr r6, r5, #16\n\t"
  65301. #endif
  65302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65303. "lsls r5, r5, #16\n\t"
  65304. #else
  65305. "lsl r5, r5, #16\n\t"
  65306. #endif
  65307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65308. "adds r4, r4, r5\n\t"
  65309. #else
  65310. "add r4, r4, r5\n\t"
  65311. #endif
  65312. #ifdef WOLFSSL_KEIL
  65313. "adcs r2, r2, r6\n\t"
  65314. #elif defined(__clang__)
  65315. "adcs r2, r6\n\t"
  65316. #else
  65317. "adc r2, r6\n\t"
  65318. #endif
  65319. #ifdef WOLFSSL_KEIL
  65320. "adcs r3, r3, %[r]\n\t"
  65321. #elif defined(__clang__)
  65322. "adcs r3, %[r]\n\t"
  65323. #else
  65324. "adc r3, %[r]\n\t"
  65325. #endif
  65326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65327. "adds r4, r4, r5\n\t"
  65328. #else
  65329. "add r4, r4, r5\n\t"
  65330. #endif
  65331. #ifdef WOLFSSL_KEIL
  65332. "adcs r2, r2, r6\n\t"
  65333. #elif defined(__clang__)
  65334. "adcs r2, r6\n\t"
  65335. #else
  65336. "adc r2, r6\n\t"
  65337. #endif
  65338. #ifdef WOLFSSL_KEIL
  65339. "adcs r3, r3, %[r]\n\t"
  65340. #elif defined(__clang__)
  65341. "adcs r3, %[r]\n\t"
  65342. #else
  65343. "adc r3, %[r]\n\t"
  65344. #endif
  65345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65346. "lsrs r5, %[a], #16\n\t"
  65347. #else
  65348. "lsr r5, %[a], #16\n\t"
  65349. #endif
  65350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65351. "lsrs r6, r7, #16\n\t"
  65352. #else
  65353. "lsr r6, r7, #16\n\t"
  65354. #endif
  65355. #ifdef WOLFSSL_KEIL
  65356. "muls r6, r5, r6\n\t"
  65357. #elif defined(__clang__)
  65358. "muls r6, r5\n\t"
  65359. #else
  65360. "mul r6, r5\n\t"
  65361. #endif
  65362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65363. "adds r2, r2, r6\n\t"
  65364. #else
  65365. "add r2, r2, r6\n\t"
  65366. #endif
  65367. #ifdef WOLFSSL_KEIL
  65368. "adcs r3, r3, %[r]\n\t"
  65369. #elif defined(__clang__)
  65370. "adcs r3, %[r]\n\t"
  65371. #else
  65372. "adc r3, %[r]\n\t"
  65373. #endif
  65374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65375. "adds r2, r2, r6\n\t"
  65376. #else
  65377. "add r2, r2, r6\n\t"
  65378. #endif
  65379. #ifdef WOLFSSL_KEIL
  65380. "adcs r3, r3, %[r]\n\t"
  65381. #elif defined(__clang__)
  65382. "adcs r3, %[r]\n\t"
  65383. #else
  65384. "adc r3, %[r]\n\t"
  65385. #endif
  65386. "uxth r6, r7\n\t"
  65387. #ifdef WOLFSSL_KEIL
  65388. "muls r5, r6, r5\n\t"
  65389. #elif defined(__clang__)
  65390. "muls r5, r6\n\t"
  65391. #else
  65392. "mul r5, r6\n\t"
  65393. #endif
  65394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65395. "lsrs r6, r5, #16\n\t"
  65396. #else
  65397. "lsr r6, r5, #16\n\t"
  65398. #endif
  65399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65400. "lsls r5, r5, #16\n\t"
  65401. #else
  65402. "lsl r5, r5, #16\n\t"
  65403. #endif
  65404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65405. "adds r4, r4, r5\n\t"
  65406. #else
  65407. "add r4, r4, r5\n\t"
  65408. #endif
  65409. #ifdef WOLFSSL_KEIL
  65410. "adcs r2, r2, r6\n\t"
  65411. #elif defined(__clang__)
  65412. "adcs r2, r6\n\t"
  65413. #else
  65414. "adc r2, r6\n\t"
  65415. #endif
  65416. #ifdef WOLFSSL_KEIL
  65417. "adcs r3, r3, %[r]\n\t"
  65418. #elif defined(__clang__)
  65419. "adcs r3, %[r]\n\t"
  65420. #else
  65421. "adc r3, %[r]\n\t"
  65422. #endif
  65423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65424. "adds r4, r4, r5\n\t"
  65425. #else
  65426. "add r4, r4, r5\n\t"
  65427. #endif
  65428. #ifdef WOLFSSL_KEIL
  65429. "adcs r2, r2, r6\n\t"
  65430. #elif defined(__clang__)
  65431. "adcs r2, r6\n\t"
  65432. #else
  65433. "adc r2, r6\n\t"
  65434. #endif
  65435. #ifdef WOLFSSL_KEIL
  65436. "adcs r3, r3, %[r]\n\t"
  65437. #elif defined(__clang__)
  65438. "adcs r3, %[r]\n\t"
  65439. #else
  65440. "adc r3, %[r]\n\t"
  65441. #endif
  65442. "# A[10] * A[4]\n\t"
  65443. "mov %[a], r9\n\t"
  65444. "ldr r7, [%[a], #16]\n\t"
  65445. "mov %[a], r12\n\t"
  65446. "uxth r5, %[a]\n\t"
  65447. "uxth r6, r7\n\t"
  65448. #ifdef WOLFSSL_KEIL
  65449. "muls r6, r5, r6\n\t"
  65450. #elif defined(__clang__)
  65451. "muls r6, r5\n\t"
  65452. #else
  65453. "mul r6, r5\n\t"
  65454. #endif
  65455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65456. "adds r4, r4, r6\n\t"
  65457. #else
  65458. "add r4, r4, r6\n\t"
  65459. #endif
  65460. #ifdef WOLFSSL_KEIL
  65461. "adcs r2, r2, %[r]\n\t"
  65462. #elif defined(__clang__)
  65463. "adcs r2, %[r]\n\t"
  65464. #else
  65465. "adc r2, %[r]\n\t"
  65466. #endif
  65467. #ifdef WOLFSSL_KEIL
  65468. "adcs r3, r3, %[r]\n\t"
  65469. #elif defined(__clang__)
  65470. "adcs r3, %[r]\n\t"
  65471. #else
  65472. "adc r3, %[r]\n\t"
  65473. #endif
  65474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65475. "adds r4, r4, r6\n\t"
  65476. #else
  65477. "add r4, r4, r6\n\t"
  65478. #endif
  65479. #ifdef WOLFSSL_KEIL
  65480. "adcs r2, r2, %[r]\n\t"
  65481. #elif defined(__clang__)
  65482. "adcs r2, %[r]\n\t"
  65483. #else
  65484. "adc r2, %[r]\n\t"
  65485. #endif
  65486. #ifdef WOLFSSL_KEIL
  65487. "adcs r3, r3, %[r]\n\t"
  65488. #elif defined(__clang__)
  65489. "adcs r3, %[r]\n\t"
  65490. #else
  65491. "adc r3, %[r]\n\t"
  65492. #endif
  65493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65494. "lsrs r6, r7, #16\n\t"
  65495. #else
  65496. "lsr r6, r7, #16\n\t"
  65497. #endif
  65498. #ifdef WOLFSSL_KEIL
  65499. "muls r5, r6, r5\n\t"
  65500. #elif defined(__clang__)
  65501. "muls r5, r6\n\t"
  65502. #else
  65503. "mul r5, r6\n\t"
  65504. #endif
  65505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65506. "lsrs r6, r5, #16\n\t"
  65507. #else
  65508. "lsr r6, r5, #16\n\t"
  65509. #endif
  65510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65511. "lsls r5, r5, #16\n\t"
  65512. #else
  65513. "lsl r5, r5, #16\n\t"
  65514. #endif
  65515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65516. "adds r4, r4, r5\n\t"
  65517. #else
  65518. "add r4, r4, r5\n\t"
  65519. #endif
  65520. #ifdef WOLFSSL_KEIL
  65521. "adcs r2, r2, r6\n\t"
  65522. #elif defined(__clang__)
  65523. "adcs r2, r6\n\t"
  65524. #else
  65525. "adc r2, r6\n\t"
  65526. #endif
  65527. #ifdef WOLFSSL_KEIL
  65528. "adcs r3, r3, %[r]\n\t"
  65529. #elif defined(__clang__)
  65530. "adcs r3, %[r]\n\t"
  65531. #else
  65532. "adc r3, %[r]\n\t"
  65533. #endif
  65534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65535. "adds r4, r4, r5\n\t"
  65536. #else
  65537. "add r4, r4, r5\n\t"
  65538. #endif
  65539. #ifdef WOLFSSL_KEIL
  65540. "adcs r2, r2, r6\n\t"
  65541. #elif defined(__clang__)
  65542. "adcs r2, r6\n\t"
  65543. #else
  65544. "adc r2, r6\n\t"
  65545. #endif
  65546. #ifdef WOLFSSL_KEIL
  65547. "adcs r3, r3, %[r]\n\t"
  65548. #elif defined(__clang__)
  65549. "adcs r3, %[r]\n\t"
  65550. #else
  65551. "adc r3, %[r]\n\t"
  65552. #endif
  65553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65554. "lsrs r5, %[a], #16\n\t"
  65555. #else
  65556. "lsr r5, %[a], #16\n\t"
  65557. #endif
  65558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65559. "lsrs r6, r7, #16\n\t"
  65560. #else
  65561. "lsr r6, r7, #16\n\t"
  65562. #endif
  65563. #ifdef WOLFSSL_KEIL
  65564. "muls r6, r5, r6\n\t"
  65565. #elif defined(__clang__)
  65566. "muls r6, r5\n\t"
  65567. #else
  65568. "mul r6, r5\n\t"
  65569. #endif
  65570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65571. "adds r2, r2, r6\n\t"
  65572. #else
  65573. "add r2, r2, r6\n\t"
  65574. #endif
  65575. #ifdef WOLFSSL_KEIL
  65576. "adcs r3, r3, %[r]\n\t"
  65577. #elif defined(__clang__)
  65578. "adcs r3, %[r]\n\t"
  65579. #else
  65580. "adc r3, %[r]\n\t"
  65581. #endif
  65582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65583. "adds r2, r2, r6\n\t"
  65584. #else
  65585. "add r2, r2, r6\n\t"
  65586. #endif
  65587. #ifdef WOLFSSL_KEIL
  65588. "adcs r3, r3, %[r]\n\t"
  65589. #elif defined(__clang__)
  65590. "adcs r3, %[r]\n\t"
  65591. #else
  65592. "adc r3, %[r]\n\t"
  65593. #endif
  65594. "uxth r6, r7\n\t"
  65595. #ifdef WOLFSSL_KEIL
  65596. "muls r5, r6, r5\n\t"
  65597. #elif defined(__clang__)
  65598. "muls r5, r6\n\t"
  65599. #else
  65600. "mul r5, r6\n\t"
  65601. #endif
  65602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65603. "lsrs r6, r5, #16\n\t"
  65604. #else
  65605. "lsr r6, r5, #16\n\t"
  65606. #endif
  65607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65608. "lsls r5, r5, #16\n\t"
  65609. #else
  65610. "lsl r5, r5, #16\n\t"
  65611. #endif
  65612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65613. "adds r4, r4, r5\n\t"
  65614. #else
  65615. "add r4, r4, r5\n\t"
  65616. #endif
  65617. #ifdef WOLFSSL_KEIL
  65618. "adcs r2, r2, r6\n\t"
  65619. #elif defined(__clang__)
  65620. "adcs r2, r6\n\t"
  65621. #else
  65622. "adc r2, r6\n\t"
  65623. #endif
  65624. #ifdef WOLFSSL_KEIL
  65625. "adcs r3, r3, %[r]\n\t"
  65626. #elif defined(__clang__)
  65627. "adcs r3, %[r]\n\t"
  65628. #else
  65629. "adc r3, %[r]\n\t"
  65630. #endif
  65631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65632. "adds r4, r4, r5\n\t"
  65633. #else
  65634. "add r4, r4, r5\n\t"
  65635. #endif
  65636. #ifdef WOLFSSL_KEIL
  65637. "adcs r2, r2, r6\n\t"
  65638. #elif defined(__clang__)
  65639. "adcs r2, r6\n\t"
  65640. #else
  65641. "adc r2, r6\n\t"
  65642. #endif
  65643. #ifdef WOLFSSL_KEIL
  65644. "adcs r3, r3, %[r]\n\t"
  65645. #elif defined(__clang__)
  65646. "adcs r3, %[r]\n\t"
  65647. #else
  65648. "adc r3, %[r]\n\t"
  65649. #endif
  65650. "# A[9] * A[5]\n\t"
  65651. "mov %[a], r9\n\t"
  65652. "ldr r7, [%[a], #20]\n\t"
  65653. "mov %[a], r11\n\t"
  65654. "uxth r5, %[a]\n\t"
  65655. "uxth r6, r7\n\t"
  65656. #ifdef WOLFSSL_KEIL
  65657. "muls r6, r5, r6\n\t"
  65658. #elif defined(__clang__)
  65659. "muls r6, r5\n\t"
  65660. #else
  65661. "mul r6, r5\n\t"
  65662. #endif
  65663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65664. "adds r4, r4, r6\n\t"
  65665. #else
  65666. "add r4, r4, r6\n\t"
  65667. #endif
  65668. #ifdef WOLFSSL_KEIL
  65669. "adcs r2, r2, %[r]\n\t"
  65670. #elif defined(__clang__)
  65671. "adcs r2, %[r]\n\t"
  65672. #else
  65673. "adc r2, %[r]\n\t"
  65674. #endif
  65675. #ifdef WOLFSSL_KEIL
  65676. "adcs r3, r3, %[r]\n\t"
  65677. #elif defined(__clang__)
  65678. "adcs r3, %[r]\n\t"
  65679. #else
  65680. "adc r3, %[r]\n\t"
  65681. #endif
  65682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65683. "adds r4, r4, r6\n\t"
  65684. #else
  65685. "add r4, r4, r6\n\t"
  65686. #endif
  65687. #ifdef WOLFSSL_KEIL
  65688. "adcs r2, r2, %[r]\n\t"
  65689. #elif defined(__clang__)
  65690. "adcs r2, %[r]\n\t"
  65691. #else
  65692. "adc r2, %[r]\n\t"
  65693. #endif
  65694. #ifdef WOLFSSL_KEIL
  65695. "adcs r3, r3, %[r]\n\t"
  65696. #elif defined(__clang__)
  65697. "adcs r3, %[r]\n\t"
  65698. #else
  65699. "adc r3, %[r]\n\t"
  65700. #endif
  65701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65702. "lsrs r6, r7, #16\n\t"
  65703. #else
  65704. "lsr r6, r7, #16\n\t"
  65705. #endif
  65706. #ifdef WOLFSSL_KEIL
  65707. "muls r5, r6, r5\n\t"
  65708. #elif defined(__clang__)
  65709. "muls r5, r6\n\t"
  65710. #else
  65711. "mul r5, r6\n\t"
  65712. #endif
  65713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65714. "lsrs r6, r5, #16\n\t"
  65715. #else
  65716. "lsr r6, r5, #16\n\t"
  65717. #endif
  65718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65719. "lsls r5, r5, #16\n\t"
  65720. #else
  65721. "lsl r5, r5, #16\n\t"
  65722. #endif
  65723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65724. "adds r4, r4, r5\n\t"
  65725. #else
  65726. "add r4, r4, r5\n\t"
  65727. #endif
  65728. #ifdef WOLFSSL_KEIL
  65729. "adcs r2, r2, r6\n\t"
  65730. #elif defined(__clang__)
  65731. "adcs r2, r6\n\t"
  65732. #else
  65733. "adc r2, r6\n\t"
  65734. #endif
  65735. #ifdef WOLFSSL_KEIL
  65736. "adcs r3, r3, %[r]\n\t"
  65737. #elif defined(__clang__)
  65738. "adcs r3, %[r]\n\t"
  65739. #else
  65740. "adc r3, %[r]\n\t"
  65741. #endif
  65742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65743. "adds r4, r4, r5\n\t"
  65744. #else
  65745. "add r4, r4, r5\n\t"
  65746. #endif
  65747. #ifdef WOLFSSL_KEIL
  65748. "adcs r2, r2, r6\n\t"
  65749. #elif defined(__clang__)
  65750. "adcs r2, r6\n\t"
  65751. #else
  65752. "adc r2, r6\n\t"
  65753. #endif
  65754. #ifdef WOLFSSL_KEIL
  65755. "adcs r3, r3, %[r]\n\t"
  65756. #elif defined(__clang__)
  65757. "adcs r3, %[r]\n\t"
  65758. #else
  65759. "adc r3, %[r]\n\t"
  65760. #endif
  65761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65762. "lsrs r5, %[a], #16\n\t"
  65763. #else
  65764. "lsr r5, %[a], #16\n\t"
  65765. #endif
  65766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65767. "lsrs r6, r7, #16\n\t"
  65768. #else
  65769. "lsr r6, r7, #16\n\t"
  65770. #endif
  65771. #ifdef WOLFSSL_KEIL
  65772. "muls r6, r5, r6\n\t"
  65773. #elif defined(__clang__)
  65774. "muls r6, r5\n\t"
  65775. #else
  65776. "mul r6, r5\n\t"
  65777. #endif
  65778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65779. "adds r2, r2, r6\n\t"
  65780. #else
  65781. "add r2, r2, r6\n\t"
  65782. #endif
  65783. #ifdef WOLFSSL_KEIL
  65784. "adcs r3, r3, %[r]\n\t"
  65785. #elif defined(__clang__)
  65786. "adcs r3, %[r]\n\t"
  65787. #else
  65788. "adc r3, %[r]\n\t"
  65789. #endif
  65790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65791. "adds r2, r2, r6\n\t"
  65792. #else
  65793. "add r2, r2, r6\n\t"
  65794. #endif
  65795. #ifdef WOLFSSL_KEIL
  65796. "adcs r3, r3, %[r]\n\t"
  65797. #elif defined(__clang__)
  65798. "adcs r3, %[r]\n\t"
  65799. #else
  65800. "adc r3, %[r]\n\t"
  65801. #endif
  65802. "uxth r6, r7\n\t"
  65803. #ifdef WOLFSSL_KEIL
  65804. "muls r5, r6, r5\n\t"
  65805. #elif defined(__clang__)
  65806. "muls r5, r6\n\t"
  65807. #else
  65808. "mul r5, r6\n\t"
  65809. #endif
  65810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65811. "lsrs r6, r5, #16\n\t"
  65812. #else
  65813. "lsr r6, r5, #16\n\t"
  65814. #endif
  65815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65816. "lsls r5, r5, #16\n\t"
  65817. #else
  65818. "lsl r5, r5, #16\n\t"
  65819. #endif
  65820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65821. "adds r4, r4, r5\n\t"
  65822. #else
  65823. "add r4, r4, r5\n\t"
  65824. #endif
  65825. #ifdef WOLFSSL_KEIL
  65826. "adcs r2, r2, r6\n\t"
  65827. #elif defined(__clang__)
  65828. "adcs r2, r6\n\t"
  65829. #else
  65830. "adc r2, r6\n\t"
  65831. #endif
  65832. #ifdef WOLFSSL_KEIL
  65833. "adcs r3, r3, %[r]\n\t"
  65834. #elif defined(__clang__)
  65835. "adcs r3, %[r]\n\t"
  65836. #else
  65837. "adc r3, %[r]\n\t"
  65838. #endif
  65839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65840. "adds r4, r4, r5\n\t"
  65841. #else
  65842. "add r4, r4, r5\n\t"
  65843. #endif
  65844. #ifdef WOLFSSL_KEIL
  65845. "adcs r2, r2, r6\n\t"
  65846. #elif defined(__clang__)
  65847. "adcs r2, r6\n\t"
  65848. #else
  65849. "adc r2, r6\n\t"
  65850. #endif
  65851. #ifdef WOLFSSL_KEIL
  65852. "adcs r3, r3, %[r]\n\t"
  65853. #elif defined(__clang__)
  65854. "adcs r3, %[r]\n\t"
  65855. #else
  65856. "adc r3, %[r]\n\t"
  65857. #endif
  65858. "# A[8] * A[6]\n\t"
  65859. "mov %[a], r9\n\t"
  65860. "ldr r7, [%[a], #24]\n\t"
  65861. "mov %[a], r10\n\t"
  65862. "uxth r5, %[a]\n\t"
  65863. "uxth r6, r7\n\t"
  65864. #ifdef WOLFSSL_KEIL
  65865. "muls r6, r5, r6\n\t"
  65866. #elif defined(__clang__)
  65867. "muls r6, r5\n\t"
  65868. #else
  65869. "mul r6, r5\n\t"
  65870. #endif
  65871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65872. "adds r4, r4, r6\n\t"
  65873. #else
  65874. "add r4, r4, r6\n\t"
  65875. #endif
  65876. #ifdef WOLFSSL_KEIL
  65877. "adcs r2, r2, %[r]\n\t"
  65878. #elif defined(__clang__)
  65879. "adcs r2, %[r]\n\t"
  65880. #else
  65881. "adc r2, %[r]\n\t"
  65882. #endif
  65883. #ifdef WOLFSSL_KEIL
  65884. "adcs r3, r3, %[r]\n\t"
  65885. #elif defined(__clang__)
  65886. "adcs r3, %[r]\n\t"
  65887. #else
  65888. "adc r3, %[r]\n\t"
  65889. #endif
  65890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65891. "adds r4, r4, r6\n\t"
  65892. #else
  65893. "add r4, r4, r6\n\t"
  65894. #endif
  65895. #ifdef WOLFSSL_KEIL
  65896. "adcs r2, r2, %[r]\n\t"
  65897. #elif defined(__clang__)
  65898. "adcs r2, %[r]\n\t"
  65899. #else
  65900. "adc r2, %[r]\n\t"
  65901. #endif
  65902. #ifdef WOLFSSL_KEIL
  65903. "adcs r3, r3, %[r]\n\t"
  65904. #elif defined(__clang__)
  65905. "adcs r3, %[r]\n\t"
  65906. #else
  65907. "adc r3, %[r]\n\t"
  65908. #endif
  65909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65910. "lsrs r6, r7, #16\n\t"
  65911. #else
  65912. "lsr r6, r7, #16\n\t"
  65913. #endif
  65914. #ifdef WOLFSSL_KEIL
  65915. "muls r5, r6, r5\n\t"
  65916. #elif defined(__clang__)
  65917. "muls r5, r6\n\t"
  65918. #else
  65919. "mul r5, r6\n\t"
  65920. #endif
  65921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65922. "lsrs r6, r5, #16\n\t"
  65923. #else
  65924. "lsr r6, r5, #16\n\t"
  65925. #endif
  65926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65927. "lsls r5, r5, #16\n\t"
  65928. #else
  65929. "lsl r5, r5, #16\n\t"
  65930. #endif
  65931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65932. "adds r4, r4, r5\n\t"
  65933. #else
  65934. "add r4, r4, r5\n\t"
  65935. #endif
  65936. #ifdef WOLFSSL_KEIL
  65937. "adcs r2, r2, r6\n\t"
  65938. #elif defined(__clang__)
  65939. "adcs r2, r6\n\t"
  65940. #else
  65941. "adc r2, r6\n\t"
  65942. #endif
  65943. #ifdef WOLFSSL_KEIL
  65944. "adcs r3, r3, %[r]\n\t"
  65945. #elif defined(__clang__)
  65946. "adcs r3, %[r]\n\t"
  65947. #else
  65948. "adc r3, %[r]\n\t"
  65949. #endif
  65950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65951. "adds r4, r4, r5\n\t"
  65952. #else
  65953. "add r4, r4, r5\n\t"
  65954. #endif
  65955. #ifdef WOLFSSL_KEIL
  65956. "adcs r2, r2, r6\n\t"
  65957. #elif defined(__clang__)
  65958. "adcs r2, r6\n\t"
  65959. #else
  65960. "adc r2, r6\n\t"
  65961. #endif
  65962. #ifdef WOLFSSL_KEIL
  65963. "adcs r3, r3, %[r]\n\t"
  65964. #elif defined(__clang__)
  65965. "adcs r3, %[r]\n\t"
  65966. #else
  65967. "adc r3, %[r]\n\t"
  65968. #endif
  65969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65970. "lsrs r5, %[a], #16\n\t"
  65971. #else
  65972. "lsr r5, %[a], #16\n\t"
  65973. #endif
  65974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65975. "lsrs r6, r7, #16\n\t"
  65976. #else
  65977. "lsr r6, r7, #16\n\t"
  65978. #endif
  65979. #ifdef WOLFSSL_KEIL
  65980. "muls r6, r5, r6\n\t"
  65981. #elif defined(__clang__)
  65982. "muls r6, r5\n\t"
  65983. #else
  65984. "mul r6, r5\n\t"
  65985. #endif
  65986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65987. "adds r2, r2, r6\n\t"
  65988. #else
  65989. "add r2, r2, r6\n\t"
  65990. #endif
  65991. #ifdef WOLFSSL_KEIL
  65992. "adcs r3, r3, %[r]\n\t"
  65993. #elif defined(__clang__)
  65994. "adcs r3, %[r]\n\t"
  65995. #else
  65996. "adc r3, %[r]\n\t"
  65997. #endif
  65998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  65999. "adds r2, r2, r6\n\t"
  66000. #else
  66001. "add r2, r2, r6\n\t"
  66002. #endif
  66003. #ifdef WOLFSSL_KEIL
  66004. "adcs r3, r3, %[r]\n\t"
  66005. #elif defined(__clang__)
  66006. "adcs r3, %[r]\n\t"
  66007. #else
  66008. "adc r3, %[r]\n\t"
  66009. #endif
  66010. "uxth r6, r7\n\t"
  66011. #ifdef WOLFSSL_KEIL
  66012. "muls r5, r6, r5\n\t"
  66013. #elif defined(__clang__)
  66014. "muls r5, r6\n\t"
  66015. #else
  66016. "mul r5, r6\n\t"
  66017. #endif
  66018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66019. "lsrs r6, r5, #16\n\t"
  66020. #else
  66021. "lsr r6, r5, #16\n\t"
  66022. #endif
  66023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66024. "lsls r5, r5, #16\n\t"
  66025. #else
  66026. "lsl r5, r5, #16\n\t"
  66027. #endif
  66028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66029. "adds r4, r4, r5\n\t"
  66030. #else
  66031. "add r4, r4, r5\n\t"
  66032. #endif
  66033. #ifdef WOLFSSL_KEIL
  66034. "adcs r2, r2, r6\n\t"
  66035. #elif defined(__clang__)
  66036. "adcs r2, r6\n\t"
  66037. #else
  66038. "adc r2, r6\n\t"
  66039. #endif
  66040. #ifdef WOLFSSL_KEIL
  66041. "adcs r3, r3, %[r]\n\t"
  66042. #elif defined(__clang__)
  66043. "adcs r3, %[r]\n\t"
  66044. #else
  66045. "adc r3, %[r]\n\t"
  66046. #endif
  66047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66048. "adds r4, r4, r5\n\t"
  66049. #else
  66050. "add r4, r4, r5\n\t"
  66051. #endif
  66052. #ifdef WOLFSSL_KEIL
  66053. "adcs r2, r2, r6\n\t"
  66054. #elif defined(__clang__)
  66055. "adcs r2, r6\n\t"
  66056. #else
  66057. "adc r2, r6\n\t"
  66058. #endif
  66059. #ifdef WOLFSSL_KEIL
  66060. "adcs r3, r3, %[r]\n\t"
  66061. #elif defined(__clang__)
  66062. "adcs r3, %[r]\n\t"
  66063. #else
  66064. "adc r3, %[r]\n\t"
  66065. #endif
  66066. "# A[7] * A[7]\n\t"
  66067. "mov %[a], r9\n\t"
  66068. "ldr r7, [%[a], #28]\n\t"
  66069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66070. "lsrs r6, r7, #16\n\t"
  66071. #else
  66072. "lsr r6, r7, #16\n\t"
  66073. #endif
  66074. "uxth r5, r7\n\t"
  66075. #ifdef WOLFSSL_KEIL
  66076. "muls r5, r5, r5\n\t"
  66077. #elif defined(__clang__)
  66078. "muls r5, r5\n\t"
  66079. #else
  66080. "mul r5, r5\n\t"
  66081. #endif
  66082. #ifdef WOLFSSL_KEIL
  66083. "muls r6, r6, r6\n\t"
  66084. #elif defined(__clang__)
  66085. "muls r6, r6\n\t"
  66086. #else
  66087. "mul r6, r6\n\t"
  66088. #endif
  66089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66090. "adds r4, r4, r5\n\t"
  66091. #else
  66092. "add r4, r4, r5\n\t"
  66093. #endif
  66094. #ifdef WOLFSSL_KEIL
  66095. "adcs r2, r2, r6\n\t"
  66096. #elif defined(__clang__)
  66097. "adcs r2, r6\n\t"
  66098. #else
  66099. "adc r2, r6\n\t"
  66100. #endif
  66101. #ifdef WOLFSSL_KEIL
  66102. "adcs r3, r3, %[r]\n\t"
  66103. #elif defined(__clang__)
  66104. "adcs r3, %[r]\n\t"
  66105. #else
  66106. "adc r3, %[r]\n\t"
  66107. #endif
  66108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66109. "lsrs r6, r7, #16\n\t"
  66110. #else
  66111. "lsr r6, r7, #16\n\t"
  66112. #endif
  66113. "uxth r5, r7\n\t"
  66114. #ifdef WOLFSSL_KEIL
  66115. "muls r5, r6, r5\n\t"
  66116. #elif defined(__clang__)
  66117. "muls r5, r6\n\t"
  66118. #else
  66119. "mul r5, r6\n\t"
  66120. #endif
  66121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66122. "lsrs r6, r5, #15\n\t"
  66123. #else
  66124. "lsr r6, r5, #15\n\t"
  66125. #endif
  66126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66127. "lsls r5, r5, #17\n\t"
  66128. #else
  66129. "lsl r5, r5, #17\n\t"
  66130. #endif
  66131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66132. "adds r4, r4, r5\n\t"
  66133. #else
  66134. "add r4, r4, r5\n\t"
  66135. #endif
  66136. #ifdef WOLFSSL_KEIL
  66137. "adcs r2, r2, r6\n\t"
  66138. #elif defined(__clang__)
  66139. "adcs r2, r6\n\t"
  66140. #else
  66141. "adc r2, r6\n\t"
  66142. #endif
  66143. #ifdef WOLFSSL_KEIL
  66144. "adcs r3, r3, %[r]\n\t"
  66145. #elif defined(__clang__)
  66146. "adcs r3, %[r]\n\t"
  66147. #else
  66148. "adc r3, %[r]\n\t"
  66149. #endif
  66150. "mov %[r], r8\n\t"
  66151. "str r4, [%[r], #56]\n\t"
  66152. "movs %[r], #0\n\t"
  66153. "# A[8] * A[7]\n\t"
  66154. "movs r4, #0\n\t"
  66155. "mov %[a], r10\n\t"
  66156. "uxth r5, %[a]\n\t"
  66157. "uxth r6, r7\n\t"
  66158. #ifdef WOLFSSL_KEIL
  66159. "muls r6, r5, r6\n\t"
  66160. #elif defined(__clang__)
  66161. "muls r6, r5\n\t"
  66162. #else
  66163. "mul r6, r5\n\t"
  66164. #endif
  66165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66166. "adds r2, r2, r6\n\t"
  66167. #else
  66168. "add r2, r2, r6\n\t"
  66169. #endif
  66170. #ifdef WOLFSSL_KEIL
  66171. "adcs r3, r3, %[r]\n\t"
  66172. #elif defined(__clang__)
  66173. "adcs r3, %[r]\n\t"
  66174. #else
  66175. "adc r3, %[r]\n\t"
  66176. #endif
  66177. #ifdef WOLFSSL_KEIL
  66178. "adcs r4, r4, %[r]\n\t"
  66179. #elif defined(__clang__)
  66180. "adcs r4, %[r]\n\t"
  66181. #else
  66182. "adc r4, %[r]\n\t"
  66183. #endif
  66184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66185. "adds r2, r2, r6\n\t"
  66186. #else
  66187. "add r2, r2, r6\n\t"
  66188. #endif
  66189. #ifdef WOLFSSL_KEIL
  66190. "adcs r3, r3, %[r]\n\t"
  66191. #elif defined(__clang__)
  66192. "adcs r3, %[r]\n\t"
  66193. #else
  66194. "adc r3, %[r]\n\t"
  66195. #endif
  66196. #ifdef WOLFSSL_KEIL
  66197. "adcs r4, r4, %[r]\n\t"
  66198. #elif defined(__clang__)
  66199. "adcs r4, %[r]\n\t"
  66200. #else
  66201. "adc r4, %[r]\n\t"
  66202. #endif
  66203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66204. "lsrs r6, r7, #16\n\t"
  66205. #else
  66206. "lsr r6, r7, #16\n\t"
  66207. #endif
  66208. #ifdef WOLFSSL_KEIL
  66209. "muls r5, r6, r5\n\t"
  66210. #elif defined(__clang__)
  66211. "muls r5, r6\n\t"
  66212. #else
  66213. "mul r5, r6\n\t"
  66214. #endif
  66215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66216. "lsrs r6, r5, #16\n\t"
  66217. #else
  66218. "lsr r6, r5, #16\n\t"
  66219. #endif
  66220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66221. "lsls r5, r5, #16\n\t"
  66222. #else
  66223. "lsl r5, r5, #16\n\t"
  66224. #endif
  66225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66226. "adds r2, r2, r5\n\t"
  66227. #else
  66228. "add r2, r2, r5\n\t"
  66229. #endif
  66230. #ifdef WOLFSSL_KEIL
  66231. "adcs r3, r3, r6\n\t"
  66232. #elif defined(__clang__)
  66233. "adcs r3, r6\n\t"
  66234. #else
  66235. "adc r3, r6\n\t"
  66236. #endif
  66237. #ifdef WOLFSSL_KEIL
  66238. "adcs r4, r4, %[r]\n\t"
  66239. #elif defined(__clang__)
  66240. "adcs r4, %[r]\n\t"
  66241. #else
  66242. "adc r4, %[r]\n\t"
  66243. #endif
  66244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66245. "adds r2, r2, r5\n\t"
  66246. #else
  66247. "add r2, r2, r5\n\t"
  66248. #endif
  66249. #ifdef WOLFSSL_KEIL
  66250. "adcs r3, r3, r6\n\t"
  66251. #elif defined(__clang__)
  66252. "adcs r3, r6\n\t"
  66253. #else
  66254. "adc r3, r6\n\t"
  66255. #endif
  66256. #ifdef WOLFSSL_KEIL
  66257. "adcs r4, r4, %[r]\n\t"
  66258. #elif defined(__clang__)
  66259. "adcs r4, %[r]\n\t"
  66260. #else
  66261. "adc r4, %[r]\n\t"
  66262. #endif
  66263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66264. "lsrs r5, %[a], #16\n\t"
  66265. #else
  66266. "lsr r5, %[a], #16\n\t"
  66267. #endif
  66268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66269. "lsrs r6, r7, #16\n\t"
  66270. #else
  66271. "lsr r6, r7, #16\n\t"
  66272. #endif
  66273. #ifdef WOLFSSL_KEIL
  66274. "muls r6, r5, r6\n\t"
  66275. #elif defined(__clang__)
  66276. "muls r6, r5\n\t"
  66277. #else
  66278. "mul r6, r5\n\t"
  66279. #endif
  66280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66281. "adds r3, r3, r6\n\t"
  66282. #else
  66283. "add r3, r3, r6\n\t"
  66284. #endif
  66285. #ifdef WOLFSSL_KEIL
  66286. "adcs r4, r4, %[r]\n\t"
  66287. #elif defined(__clang__)
  66288. "adcs r4, %[r]\n\t"
  66289. #else
  66290. "adc r4, %[r]\n\t"
  66291. #endif
  66292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66293. "adds r3, r3, r6\n\t"
  66294. #else
  66295. "add r3, r3, r6\n\t"
  66296. #endif
  66297. #ifdef WOLFSSL_KEIL
  66298. "adcs r4, r4, %[r]\n\t"
  66299. #elif defined(__clang__)
  66300. "adcs r4, %[r]\n\t"
  66301. #else
  66302. "adc r4, %[r]\n\t"
  66303. #endif
  66304. "uxth r6, r7\n\t"
  66305. #ifdef WOLFSSL_KEIL
  66306. "muls r5, r6, r5\n\t"
  66307. #elif defined(__clang__)
  66308. "muls r5, r6\n\t"
  66309. #else
  66310. "mul r5, r6\n\t"
  66311. #endif
  66312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66313. "lsrs r6, r5, #16\n\t"
  66314. #else
  66315. "lsr r6, r5, #16\n\t"
  66316. #endif
  66317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66318. "lsls r5, r5, #16\n\t"
  66319. #else
  66320. "lsl r5, r5, #16\n\t"
  66321. #endif
  66322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66323. "adds r2, r2, r5\n\t"
  66324. #else
  66325. "add r2, r2, r5\n\t"
  66326. #endif
  66327. #ifdef WOLFSSL_KEIL
  66328. "adcs r3, r3, r6\n\t"
  66329. #elif defined(__clang__)
  66330. "adcs r3, r6\n\t"
  66331. #else
  66332. "adc r3, r6\n\t"
  66333. #endif
  66334. #ifdef WOLFSSL_KEIL
  66335. "adcs r4, r4, %[r]\n\t"
  66336. #elif defined(__clang__)
  66337. "adcs r4, %[r]\n\t"
  66338. #else
  66339. "adc r4, %[r]\n\t"
  66340. #endif
  66341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66342. "adds r2, r2, r5\n\t"
  66343. #else
  66344. "add r2, r2, r5\n\t"
  66345. #endif
  66346. #ifdef WOLFSSL_KEIL
  66347. "adcs r3, r3, r6\n\t"
  66348. #elif defined(__clang__)
  66349. "adcs r3, r6\n\t"
  66350. #else
  66351. "adc r3, r6\n\t"
  66352. #endif
  66353. #ifdef WOLFSSL_KEIL
  66354. "adcs r4, r4, %[r]\n\t"
  66355. #elif defined(__clang__)
  66356. "adcs r4, %[r]\n\t"
  66357. #else
  66358. "adc r4, %[r]\n\t"
  66359. #endif
  66360. "# A[9] * A[6]\n\t"
  66361. "mov %[a], r9\n\t"
  66362. "ldr r7, [%[a], #24]\n\t"
  66363. "mov %[a], r11\n\t"
  66364. "uxth r5, %[a]\n\t"
  66365. "uxth r6, r7\n\t"
  66366. #ifdef WOLFSSL_KEIL
  66367. "muls r6, r5, r6\n\t"
  66368. #elif defined(__clang__)
  66369. "muls r6, r5\n\t"
  66370. #else
  66371. "mul r6, r5\n\t"
  66372. #endif
  66373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66374. "adds r2, r2, r6\n\t"
  66375. #else
  66376. "add r2, r2, r6\n\t"
  66377. #endif
  66378. #ifdef WOLFSSL_KEIL
  66379. "adcs r3, r3, %[r]\n\t"
  66380. #elif defined(__clang__)
  66381. "adcs r3, %[r]\n\t"
  66382. #else
  66383. "adc r3, %[r]\n\t"
  66384. #endif
  66385. #ifdef WOLFSSL_KEIL
  66386. "adcs r4, r4, %[r]\n\t"
  66387. #elif defined(__clang__)
  66388. "adcs r4, %[r]\n\t"
  66389. #else
  66390. "adc r4, %[r]\n\t"
  66391. #endif
  66392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66393. "adds r2, r2, r6\n\t"
  66394. #else
  66395. "add r2, r2, r6\n\t"
  66396. #endif
  66397. #ifdef WOLFSSL_KEIL
  66398. "adcs r3, r3, %[r]\n\t"
  66399. #elif defined(__clang__)
  66400. "adcs r3, %[r]\n\t"
  66401. #else
  66402. "adc r3, %[r]\n\t"
  66403. #endif
  66404. #ifdef WOLFSSL_KEIL
  66405. "adcs r4, r4, %[r]\n\t"
  66406. #elif defined(__clang__)
  66407. "adcs r4, %[r]\n\t"
  66408. #else
  66409. "adc r4, %[r]\n\t"
  66410. #endif
  66411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66412. "lsrs r6, r7, #16\n\t"
  66413. #else
  66414. "lsr r6, r7, #16\n\t"
  66415. #endif
  66416. #ifdef WOLFSSL_KEIL
  66417. "muls r5, r6, r5\n\t"
  66418. #elif defined(__clang__)
  66419. "muls r5, r6\n\t"
  66420. #else
  66421. "mul r5, r6\n\t"
  66422. #endif
  66423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66424. "lsrs r6, r5, #16\n\t"
  66425. #else
  66426. "lsr r6, r5, #16\n\t"
  66427. #endif
  66428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66429. "lsls r5, r5, #16\n\t"
  66430. #else
  66431. "lsl r5, r5, #16\n\t"
  66432. #endif
  66433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66434. "adds r2, r2, r5\n\t"
  66435. #else
  66436. "add r2, r2, r5\n\t"
  66437. #endif
  66438. #ifdef WOLFSSL_KEIL
  66439. "adcs r3, r3, r6\n\t"
  66440. #elif defined(__clang__)
  66441. "adcs r3, r6\n\t"
  66442. #else
  66443. "adc r3, r6\n\t"
  66444. #endif
  66445. #ifdef WOLFSSL_KEIL
  66446. "adcs r4, r4, %[r]\n\t"
  66447. #elif defined(__clang__)
  66448. "adcs r4, %[r]\n\t"
  66449. #else
  66450. "adc r4, %[r]\n\t"
  66451. #endif
  66452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66453. "adds r2, r2, r5\n\t"
  66454. #else
  66455. "add r2, r2, r5\n\t"
  66456. #endif
  66457. #ifdef WOLFSSL_KEIL
  66458. "adcs r3, r3, r6\n\t"
  66459. #elif defined(__clang__)
  66460. "adcs r3, r6\n\t"
  66461. #else
  66462. "adc r3, r6\n\t"
  66463. #endif
  66464. #ifdef WOLFSSL_KEIL
  66465. "adcs r4, r4, %[r]\n\t"
  66466. #elif defined(__clang__)
  66467. "adcs r4, %[r]\n\t"
  66468. #else
  66469. "adc r4, %[r]\n\t"
  66470. #endif
  66471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66472. "lsrs r5, %[a], #16\n\t"
  66473. #else
  66474. "lsr r5, %[a], #16\n\t"
  66475. #endif
  66476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66477. "lsrs r6, r7, #16\n\t"
  66478. #else
  66479. "lsr r6, r7, #16\n\t"
  66480. #endif
  66481. #ifdef WOLFSSL_KEIL
  66482. "muls r6, r5, r6\n\t"
  66483. #elif defined(__clang__)
  66484. "muls r6, r5\n\t"
  66485. #else
  66486. "mul r6, r5\n\t"
  66487. #endif
  66488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66489. "adds r3, r3, r6\n\t"
  66490. #else
  66491. "add r3, r3, r6\n\t"
  66492. #endif
  66493. #ifdef WOLFSSL_KEIL
  66494. "adcs r4, r4, %[r]\n\t"
  66495. #elif defined(__clang__)
  66496. "adcs r4, %[r]\n\t"
  66497. #else
  66498. "adc r4, %[r]\n\t"
  66499. #endif
  66500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66501. "adds r3, r3, r6\n\t"
  66502. #else
  66503. "add r3, r3, r6\n\t"
  66504. #endif
  66505. #ifdef WOLFSSL_KEIL
  66506. "adcs r4, r4, %[r]\n\t"
  66507. #elif defined(__clang__)
  66508. "adcs r4, %[r]\n\t"
  66509. #else
  66510. "adc r4, %[r]\n\t"
  66511. #endif
  66512. "uxth r6, r7\n\t"
  66513. #ifdef WOLFSSL_KEIL
  66514. "muls r5, r6, r5\n\t"
  66515. #elif defined(__clang__)
  66516. "muls r5, r6\n\t"
  66517. #else
  66518. "mul r5, r6\n\t"
  66519. #endif
  66520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66521. "lsrs r6, r5, #16\n\t"
  66522. #else
  66523. "lsr r6, r5, #16\n\t"
  66524. #endif
  66525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66526. "lsls r5, r5, #16\n\t"
  66527. #else
  66528. "lsl r5, r5, #16\n\t"
  66529. #endif
  66530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66531. "adds r2, r2, r5\n\t"
  66532. #else
  66533. "add r2, r2, r5\n\t"
  66534. #endif
  66535. #ifdef WOLFSSL_KEIL
  66536. "adcs r3, r3, r6\n\t"
  66537. #elif defined(__clang__)
  66538. "adcs r3, r6\n\t"
  66539. #else
  66540. "adc r3, r6\n\t"
  66541. #endif
  66542. #ifdef WOLFSSL_KEIL
  66543. "adcs r4, r4, %[r]\n\t"
  66544. #elif defined(__clang__)
  66545. "adcs r4, %[r]\n\t"
  66546. #else
  66547. "adc r4, %[r]\n\t"
  66548. #endif
  66549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66550. "adds r2, r2, r5\n\t"
  66551. #else
  66552. "add r2, r2, r5\n\t"
  66553. #endif
  66554. #ifdef WOLFSSL_KEIL
  66555. "adcs r3, r3, r6\n\t"
  66556. #elif defined(__clang__)
  66557. "adcs r3, r6\n\t"
  66558. #else
  66559. "adc r3, r6\n\t"
  66560. #endif
  66561. #ifdef WOLFSSL_KEIL
  66562. "adcs r4, r4, %[r]\n\t"
  66563. #elif defined(__clang__)
  66564. "adcs r4, %[r]\n\t"
  66565. #else
  66566. "adc r4, %[r]\n\t"
  66567. #endif
  66568. "# A[10] * A[5]\n\t"
  66569. "mov %[a], r9\n\t"
  66570. "ldr r7, [%[a], #20]\n\t"
  66571. "mov %[a], r12\n\t"
  66572. "uxth r5, %[a]\n\t"
  66573. "uxth r6, r7\n\t"
  66574. #ifdef WOLFSSL_KEIL
  66575. "muls r6, r5, r6\n\t"
  66576. #elif defined(__clang__)
  66577. "muls r6, r5\n\t"
  66578. #else
  66579. "mul r6, r5\n\t"
  66580. #endif
  66581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66582. "adds r2, r2, r6\n\t"
  66583. #else
  66584. "add r2, r2, r6\n\t"
  66585. #endif
  66586. #ifdef WOLFSSL_KEIL
  66587. "adcs r3, r3, %[r]\n\t"
  66588. #elif defined(__clang__)
  66589. "adcs r3, %[r]\n\t"
  66590. #else
  66591. "adc r3, %[r]\n\t"
  66592. #endif
  66593. #ifdef WOLFSSL_KEIL
  66594. "adcs r4, r4, %[r]\n\t"
  66595. #elif defined(__clang__)
  66596. "adcs r4, %[r]\n\t"
  66597. #else
  66598. "adc r4, %[r]\n\t"
  66599. #endif
  66600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66601. "adds r2, r2, r6\n\t"
  66602. #else
  66603. "add r2, r2, r6\n\t"
  66604. #endif
  66605. #ifdef WOLFSSL_KEIL
  66606. "adcs r3, r3, %[r]\n\t"
  66607. #elif defined(__clang__)
  66608. "adcs r3, %[r]\n\t"
  66609. #else
  66610. "adc r3, %[r]\n\t"
  66611. #endif
  66612. #ifdef WOLFSSL_KEIL
  66613. "adcs r4, r4, %[r]\n\t"
  66614. #elif defined(__clang__)
  66615. "adcs r4, %[r]\n\t"
  66616. #else
  66617. "adc r4, %[r]\n\t"
  66618. #endif
  66619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66620. "lsrs r6, r7, #16\n\t"
  66621. #else
  66622. "lsr r6, r7, #16\n\t"
  66623. #endif
  66624. #ifdef WOLFSSL_KEIL
  66625. "muls r5, r6, r5\n\t"
  66626. #elif defined(__clang__)
  66627. "muls r5, r6\n\t"
  66628. #else
  66629. "mul r5, r6\n\t"
  66630. #endif
  66631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66632. "lsrs r6, r5, #16\n\t"
  66633. #else
  66634. "lsr r6, r5, #16\n\t"
  66635. #endif
  66636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66637. "lsls r5, r5, #16\n\t"
  66638. #else
  66639. "lsl r5, r5, #16\n\t"
  66640. #endif
  66641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66642. "adds r2, r2, r5\n\t"
  66643. #else
  66644. "add r2, r2, r5\n\t"
  66645. #endif
  66646. #ifdef WOLFSSL_KEIL
  66647. "adcs r3, r3, r6\n\t"
  66648. #elif defined(__clang__)
  66649. "adcs r3, r6\n\t"
  66650. #else
  66651. "adc r3, r6\n\t"
  66652. #endif
  66653. #ifdef WOLFSSL_KEIL
  66654. "adcs r4, r4, %[r]\n\t"
  66655. #elif defined(__clang__)
  66656. "adcs r4, %[r]\n\t"
  66657. #else
  66658. "adc r4, %[r]\n\t"
  66659. #endif
  66660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66661. "adds r2, r2, r5\n\t"
  66662. #else
  66663. "add r2, r2, r5\n\t"
  66664. #endif
  66665. #ifdef WOLFSSL_KEIL
  66666. "adcs r3, r3, r6\n\t"
  66667. #elif defined(__clang__)
  66668. "adcs r3, r6\n\t"
  66669. #else
  66670. "adc r3, r6\n\t"
  66671. #endif
  66672. #ifdef WOLFSSL_KEIL
  66673. "adcs r4, r4, %[r]\n\t"
  66674. #elif defined(__clang__)
  66675. "adcs r4, %[r]\n\t"
  66676. #else
  66677. "adc r4, %[r]\n\t"
  66678. #endif
  66679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66680. "lsrs r5, %[a], #16\n\t"
  66681. #else
  66682. "lsr r5, %[a], #16\n\t"
  66683. #endif
  66684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66685. "lsrs r6, r7, #16\n\t"
  66686. #else
  66687. "lsr r6, r7, #16\n\t"
  66688. #endif
  66689. #ifdef WOLFSSL_KEIL
  66690. "muls r6, r5, r6\n\t"
  66691. #elif defined(__clang__)
  66692. "muls r6, r5\n\t"
  66693. #else
  66694. "mul r6, r5\n\t"
  66695. #endif
  66696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66697. "adds r3, r3, r6\n\t"
  66698. #else
  66699. "add r3, r3, r6\n\t"
  66700. #endif
  66701. #ifdef WOLFSSL_KEIL
  66702. "adcs r4, r4, %[r]\n\t"
  66703. #elif defined(__clang__)
  66704. "adcs r4, %[r]\n\t"
  66705. #else
  66706. "adc r4, %[r]\n\t"
  66707. #endif
  66708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66709. "adds r3, r3, r6\n\t"
  66710. #else
  66711. "add r3, r3, r6\n\t"
  66712. #endif
  66713. #ifdef WOLFSSL_KEIL
  66714. "adcs r4, r4, %[r]\n\t"
  66715. #elif defined(__clang__)
  66716. "adcs r4, %[r]\n\t"
  66717. #else
  66718. "adc r4, %[r]\n\t"
  66719. #endif
  66720. "uxth r6, r7\n\t"
  66721. #ifdef WOLFSSL_KEIL
  66722. "muls r5, r6, r5\n\t"
  66723. #elif defined(__clang__)
  66724. "muls r5, r6\n\t"
  66725. #else
  66726. "mul r5, r6\n\t"
  66727. #endif
  66728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66729. "lsrs r6, r5, #16\n\t"
  66730. #else
  66731. "lsr r6, r5, #16\n\t"
  66732. #endif
  66733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66734. "lsls r5, r5, #16\n\t"
  66735. #else
  66736. "lsl r5, r5, #16\n\t"
  66737. #endif
  66738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66739. "adds r2, r2, r5\n\t"
  66740. #else
  66741. "add r2, r2, r5\n\t"
  66742. #endif
  66743. #ifdef WOLFSSL_KEIL
  66744. "adcs r3, r3, r6\n\t"
  66745. #elif defined(__clang__)
  66746. "adcs r3, r6\n\t"
  66747. #else
  66748. "adc r3, r6\n\t"
  66749. #endif
  66750. #ifdef WOLFSSL_KEIL
  66751. "adcs r4, r4, %[r]\n\t"
  66752. #elif defined(__clang__)
  66753. "adcs r4, %[r]\n\t"
  66754. #else
  66755. "adc r4, %[r]\n\t"
  66756. #endif
  66757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66758. "adds r2, r2, r5\n\t"
  66759. #else
  66760. "add r2, r2, r5\n\t"
  66761. #endif
  66762. #ifdef WOLFSSL_KEIL
  66763. "adcs r3, r3, r6\n\t"
  66764. #elif defined(__clang__)
  66765. "adcs r3, r6\n\t"
  66766. #else
  66767. "adc r3, r6\n\t"
  66768. #endif
  66769. #ifdef WOLFSSL_KEIL
  66770. "adcs r4, r4, %[r]\n\t"
  66771. #elif defined(__clang__)
  66772. "adcs r4, %[r]\n\t"
  66773. #else
  66774. "adc r4, %[r]\n\t"
  66775. #endif
  66776. "# A[11] * A[4]\n\t"
  66777. "mov %[a], r9\n\t"
  66778. "ldr r7, [%[a], #16]\n\t"
  66779. "mov %[a], lr\n\t"
  66780. "uxth r5, %[a]\n\t"
  66781. "uxth r6, r7\n\t"
  66782. #ifdef WOLFSSL_KEIL
  66783. "muls r6, r5, r6\n\t"
  66784. #elif defined(__clang__)
  66785. "muls r6, r5\n\t"
  66786. #else
  66787. "mul r6, r5\n\t"
  66788. #endif
  66789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66790. "adds r2, r2, r6\n\t"
  66791. #else
  66792. "add r2, r2, r6\n\t"
  66793. #endif
  66794. #ifdef WOLFSSL_KEIL
  66795. "adcs r3, r3, %[r]\n\t"
  66796. #elif defined(__clang__)
  66797. "adcs r3, %[r]\n\t"
  66798. #else
  66799. "adc r3, %[r]\n\t"
  66800. #endif
  66801. #ifdef WOLFSSL_KEIL
  66802. "adcs r4, r4, %[r]\n\t"
  66803. #elif defined(__clang__)
  66804. "adcs r4, %[r]\n\t"
  66805. #else
  66806. "adc r4, %[r]\n\t"
  66807. #endif
  66808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66809. "adds r2, r2, r6\n\t"
  66810. #else
  66811. "add r2, r2, r6\n\t"
  66812. #endif
  66813. #ifdef WOLFSSL_KEIL
  66814. "adcs r3, r3, %[r]\n\t"
  66815. #elif defined(__clang__)
  66816. "adcs r3, %[r]\n\t"
  66817. #else
  66818. "adc r3, %[r]\n\t"
  66819. #endif
  66820. #ifdef WOLFSSL_KEIL
  66821. "adcs r4, r4, %[r]\n\t"
  66822. #elif defined(__clang__)
  66823. "adcs r4, %[r]\n\t"
  66824. #else
  66825. "adc r4, %[r]\n\t"
  66826. #endif
  66827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66828. "lsrs r6, r7, #16\n\t"
  66829. #else
  66830. "lsr r6, r7, #16\n\t"
  66831. #endif
  66832. #ifdef WOLFSSL_KEIL
  66833. "muls r5, r6, r5\n\t"
  66834. #elif defined(__clang__)
  66835. "muls r5, r6\n\t"
  66836. #else
  66837. "mul r5, r6\n\t"
  66838. #endif
  66839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66840. "lsrs r6, r5, #16\n\t"
  66841. #else
  66842. "lsr r6, r5, #16\n\t"
  66843. #endif
  66844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66845. "lsls r5, r5, #16\n\t"
  66846. #else
  66847. "lsl r5, r5, #16\n\t"
  66848. #endif
  66849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66850. "adds r2, r2, r5\n\t"
  66851. #else
  66852. "add r2, r2, r5\n\t"
  66853. #endif
  66854. #ifdef WOLFSSL_KEIL
  66855. "adcs r3, r3, r6\n\t"
  66856. #elif defined(__clang__)
  66857. "adcs r3, r6\n\t"
  66858. #else
  66859. "adc r3, r6\n\t"
  66860. #endif
  66861. #ifdef WOLFSSL_KEIL
  66862. "adcs r4, r4, %[r]\n\t"
  66863. #elif defined(__clang__)
  66864. "adcs r4, %[r]\n\t"
  66865. #else
  66866. "adc r4, %[r]\n\t"
  66867. #endif
  66868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66869. "adds r2, r2, r5\n\t"
  66870. #else
  66871. "add r2, r2, r5\n\t"
  66872. #endif
  66873. #ifdef WOLFSSL_KEIL
  66874. "adcs r3, r3, r6\n\t"
  66875. #elif defined(__clang__)
  66876. "adcs r3, r6\n\t"
  66877. #else
  66878. "adc r3, r6\n\t"
  66879. #endif
  66880. #ifdef WOLFSSL_KEIL
  66881. "adcs r4, r4, %[r]\n\t"
  66882. #elif defined(__clang__)
  66883. "adcs r4, %[r]\n\t"
  66884. #else
  66885. "adc r4, %[r]\n\t"
  66886. #endif
  66887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66888. "lsrs r5, %[a], #16\n\t"
  66889. #else
  66890. "lsr r5, %[a], #16\n\t"
  66891. #endif
  66892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66893. "lsrs r6, r7, #16\n\t"
  66894. #else
  66895. "lsr r6, r7, #16\n\t"
  66896. #endif
  66897. #ifdef WOLFSSL_KEIL
  66898. "muls r6, r5, r6\n\t"
  66899. #elif defined(__clang__)
  66900. "muls r6, r5\n\t"
  66901. #else
  66902. "mul r6, r5\n\t"
  66903. #endif
  66904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66905. "adds r3, r3, r6\n\t"
  66906. #else
  66907. "add r3, r3, r6\n\t"
  66908. #endif
  66909. #ifdef WOLFSSL_KEIL
  66910. "adcs r4, r4, %[r]\n\t"
  66911. #elif defined(__clang__)
  66912. "adcs r4, %[r]\n\t"
  66913. #else
  66914. "adc r4, %[r]\n\t"
  66915. #endif
  66916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66917. "adds r3, r3, r6\n\t"
  66918. #else
  66919. "add r3, r3, r6\n\t"
  66920. #endif
  66921. #ifdef WOLFSSL_KEIL
  66922. "adcs r4, r4, %[r]\n\t"
  66923. #elif defined(__clang__)
  66924. "adcs r4, %[r]\n\t"
  66925. #else
  66926. "adc r4, %[r]\n\t"
  66927. #endif
  66928. "uxth r6, r7\n\t"
  66929. #ifdef WOLFSSL_KEIL
  66930. "muls r5, r6, r5\n\t"
  66931. #elif defined(__clang__)
  66932. "muls r5, r6\n\t"
  66933. #else
  66934. "mul r5, r6\n\t"
  66935. #endif
  66936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66937. "lsrs r6, r5, #16\n\t"
  66938. #else
  66939. "lsr r6, r5, #16\n\t"
  66940. #endif
  66941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66942. "lsls r5, r5, #16\n\t"
  66943. #else
  66944. "lsl r5, r5, #16\n\t"
  66945. #endif
  66946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66947. "adds r2, r2, r5\n\t"
  66948. #else
  66949. "add r2, r2, r5\n\t"
  66950. #endif
  66951. #ifdef WOLFSSL_KEIL
  66952. "adcs r3, r3, r6\n\t"
  66953. #elif defined(__clang__)
  66954. "adcs r3, r6\n\t"
  66955. #else
  66956. "adc r3, r6\n\t"
  66957. #endif
  66958. #ifdef WOLFSSL_KEIL
  66959. "adcs r4, r4, %[r]\n\t"
  66960. #elif defined(__clang__)
  66961. "adcs r4, %[r]\n\t"
  66962. #else
  66963. "adc r4, %[r]\n\t"
  66964. #endif
  66965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  66966. "adds r2, r2, r5\n\t"
  66967. #else
  66968. "add r2, r2, r5\n\t"
  66969. #endif
  66970. #ifdef WOLFSSL_KEIL
  66971. "adcs r3, r3, r6\n\t"
  66972. #elif defined(__clang__)
  66973. "adcs r3, r6\n\t"
  66974. #else
  66975. "adc r3, r6\n\t"
  66976. #endif
  66977. #ifdef WOLFSSL_KEIL
  66978. "adcs r4, r4, %[r]\n\t"
  66979. #elif defined(__clang__)
  66980. "adcs r4, %[r]\n\t"
  66981. #else
  66982. "adc r4, %[r]\n\t"
  66983. #endif
  66984. "mov %[r], r8\n\t"
  66985. "str r2, [%[r], #60]\n\t"
  66986. "movs %[r], #0\n\t"
  66987. "# A[11] * A[5]\n\t"
  66988. "movs r2, #0\n\t"
  66989. "mov %[a], r9\n\t"
  66990. "ldr r7, [%[a], #20]\n\t"
  66991. "mov %[a], lr\n\t"
  66992. "uxth r5, %[a]\n\t"
  66993. "uxth r6, r7\n\t"
  66994. #ifdef WOLFSSL_KEIL
  66995. "muls r6, r5, r6\n\t"
  66996. #elif defined(__clang__)
  66997. "muls r6, r5\n\t"
  66998. #else
  66999. "mul r6, r5\n\t"
  67000. #endif
  67001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67002. "adds r3, r3, r6\n\t"
  67003. #else
  67004. "add r3, r3, r6\n\t"
  67005. #endif
  67006. #ifdef WOLFSSL_KEIL
  67007. "adcs r4, r4, %[r]\n\t"
  67008. #elif defined(__clang__)
  67009. "adcs r4, %[r]\n\t"
  67010. #else
  67011. "adc r4, %[r]\n\t"
  67012. #endif
  67013. #ifdef WOLFSSL_KEIL
  67014. "adcs r2, r2, %[r]\n\t"
  67015. #elif defined(__clang__)
  67016. "adcs r2, %[r]\n\t"
  67017. #else
  67018. "adc r2, %[r]\n\t"
  67019. #endif
  67020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67021. "adds r3, r3, r6\n\t"
  67022. #else
  67023. "add r3, r3, r6\n\t"
  67024. #endif
  67025. #ifdef WOLFSSL_KEIL
  67026. "adcs r4, r4, %[r]\n\t"
  67027. #elif defined(__clang__)
  67028. "adcs r4, %[r]\n\t"
  67029. #else
  67030. "adc r4, %[r]\n\t"
  67031. #endif
  67032. #ifdef WOLFSSL_KEIL
  67033. "adcs r2, r2, %[r]\n\t"
  67034. #elif defined(__clang__)
  67035. "adcs r2, %[r]\n\t"
  67036. #else
  67037. "adc r2, %[r]\n\t"
  67038. #endif
  67039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67040. "lsrs r6, r7, #16\n\t"
  67041. #else
  67042. "lsr r6, r7, #16\n\t"
  67043. #endif
  67044. #ifdef WOLFSSL_KEIL
  67045. "muls r5, r6, r5\n\t"
  67046. #elif defined(__clang__)
  67047. "muls r5, r6\n\t"
  67048. #else
  67049. "mul r5, r6\n\t"
  67050. #endif
  67051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67052. "lsrs r6, r5, #16\n\t"
  67053. #else
  67054. "lsr r6, r5, #16\n\t"
  67055. #endif
  67056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67057. "lsls r5, r5, #16\n\t"
  67058. #else
  67059. "lsl r5, r5, #16\n\t"
  67060. #endif
  67061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67062. "adds r3, r3, r5\n\t"
  67063. #else
  67064. "add r3, r3, r5\n\t"
  67065. #endif
  67066. #ifdef WOLFSSL_KEIL
  67067. "adcs r4, r4, r6\n\t"
  67068. #elif defined(__clang__)
  67069. "adcs r4, r6\n\t"
  67070. #else
  67071. "adc r4, r6\n\t"
  67072. #endif
  67073. #ifdef WOLFSSL_KEIL
  67074. "adcs r2, r2, %[r]\n\t"
  67075. #elif defined(__clang__)
  67076. "adcs r2, %[r]\n\t"
  67077. #else
  67078. "adc r2, %[r]\n\t"
  67079. #endif
  67080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67081. "adds r3, r3, r5\n\t"
  67082. #else
  67083. "add r3, r3, r5\n\t"
  67084. #endif
  67085. #ifdef WOLFSSL_KEIL
  67086. "adcs r4, r4, r6\n\t"
  67087. #elif defined(__clang__)
  67088. "adcs r4, r6\n\t"
  67089. #else
  67090. "adc r4, r6\n\t"
  67091. #endif
  67092. #ifdef WOLFSSL_KEIL
  67093. "adcs r2, r2, %[r]\n\t"
  67094. #elif defined(__clang__)
  67095. "adcs r2, %[r]\n\t"
  67096. #else
  67097. "adc r2, %[r]\n\t"
  67098. #endif
  67099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67100. "lsrs r5, %[a], #16\n\t"
  67101. #else
  67102. "lsr r5, %[a], #16\n\t"
  67103. #endif
  67104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67105. "lsrs r6, r7, #16\n\t"
  67106. #else
  67107. "lsr r6, r7, #16\n\t"
  67108. #endif
  67109. #ifdef WOLFSSL_KEIL
  67110. "muls r6, r5, r6\n\t"
  67111. #elif defined(__clang__)
  67112. "muls r6, r5\n\t"
  67113. #else
  67114. "mul r6, r5\n\t"
  67115. #endif
  67116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67117. "adds r4, r4, r6\n\t"
  67118. #else
  67119. "add r4, r4, r6\n\t"
  67120. #endif
  67121. #ifdef WOLFSSL_KEIL
  67122. "adcs r2, r2, %[r]\n\t"
  67123. #elif defined(__clang__)
  67124. "adcs r2, %[r]\n\t"
  67125. #else
  67126. "adc r2, %[r]\n\t"
  67127. #endif
  67128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67129. "adds r4, r4, r6\n\t"
  67130. #else
  67131. "add r4, r4, r6\n\t"
  67132. #endif
  67133. #ifdef WOLFSSL_KEIL
  67134. "adcs r2, r2, %[r]\n\t"
  67135. #elif defined(__clang__)
  67136. "adcs r2, %[r]\n\t"
  67137. #else
  67138. "adc r2, %[r]\n\t"
  67139. #endif
  67140. "uxth r6, r7\n\t"
  67141. #ifdef WOLFSSL_KEIL
  67142. "muls r5, r6, r5\n\t"
  67143. #elif defined(__clang__)
  67144. "muls r5, r6\n\t"
  67145. #else
  67146. "mul r5, r6\n\t"
  67147. #endif
  67148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67149. "lsrs r6, r5, #16\n\t"
  67150. #else
  67151. "lsr r6, r5, #16\n\t"
  67152. #endif
  67153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67154. "lsls r5, r5, #16\n\t"
  67155. #else
  67156. "lsl r5, r5, #16\n\t"
  67157. #endif
  67158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67159. "adds r3, r3, r5\n\t"
  67160. #else
  67161. "add r3, r3, r5\n\t"
  67162. #endif
  67163. #ifdef WOLFSSL_KEIL
  67164. "adcs r4, r4, r6\n\t"
  67165. #elif defined(__clang__)
  67166. "adcs r4, r6\n\t"
  67167. #else
  67168. "adc r4, r6\n\t"
  67169. #endif
  67170. #ifdef WOLFSSL_KEIL
  67171. "adcs r2, r2, %[r]\n\t"
  67172. #elif defined(__clang__)
  67173. "adcs r2, %[r]\n\t"
  67174. #else
  67175. "adc r2, %[r]\n\t"
  67176. #endif
  67177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67178. "adds r3, r3, r5\n\t"
  67179. #else
  67180. "add r3, r3, r5\n\t"
  67181. #endif
  67182. #ifdef WOLFSSL_KEIL
  67183. "adcs r4, r4, r6\n\t"
  67184. #elif defined(__clang__)
  67185. "adcs r4, r6\n\t"
  67186. #else
  67187. "adc r4, r6\n\t"
  67188. #endif
  67189. #ifdef WOLFSSL_KEIL
  67190. "adcs r2, r2, %[r]\n\t"
  67191. #elif defined(__clang__)
  67192. "adcs r2, %[r]\n\t"
  67193. #else
  67194. "adc r2, %[r]\n\t"
  67195. #endif
  67196. "# A[10] * A[6]\n\t"
  67197. "mov %[a], r9\n\t"
  67198. "ldr r7, [%[a], #24]\n\t"
  67199. "mov %[a], r12\n\t"
  67200. "uxth r5, %[a]\n\t"
  67201. "uxth r6, r7\n\t"
  67202. #ifdef WOLFSSL_KEIL
  67203. "muls r6, r5, r6\n\t"
  67204. #elif defined(__clang__)
  67205. "muls r6, r5\n\t"
  67206. #else
  67207. "mul r6, r5\n\t"
  67208. #endif
  67209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67210. "adds r3, r3, r6\n\t"
  67211. #else
  67212. "add r3, r3, r6\n\t"
  67213. #endif
  67214. #ifdef WOLFSSL_KEIL
  67215. "adcs r4, r4, %[r]\n\t"
  67216. #elif defined(__clang__)
  67217. "adcs r4, %[r]\n\t"
  67218. #else
  67219. "adc r4, %[r]\n\t"
  67220. #endif
  67221. #ifdef WOLFSSL_KEIL
  67222. "adcs r2, r2, %[r]\n\t"
  67223. #elif defined(__clang__)
  67224. "adcs r2, %[r]\n\t"
  67225. #else
  67226. "adc r2, %[r]\n\t"
  67227. #endif
  67228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67229. "adds r3, r3, r6\n\t"
  67230. #else
  67231. "add r3, r3, r6\n\t"
  67232. #endif
  67233. #ifdef WOLFSSL_KEIL
  67234. "adcs r4, r4, %[r]\n\t"
  67235. #elif defined(__clang__)
  67236. "adcs r4, %[r]\n\t"
  67237. #else
  67238. "adc r4, %[r]\n\t"
  67239. #endif
  67240. #ifdef WOLFSSL_KEIL
  67241. "adcs r2, r2, %[r]\n\t"
  67242. #elif defined(__clang__)
  67243. "adcs r2, %[r]\n\t"
  67244. #else
  67245. "adc r2, %[r]\n\t"
  67246. #endif
  67247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67248. "lsrs r6, r7, #16\n\t"
  67249. #else
  67250. "lsr r6, r7, #16\n\t"
  67251. #endif
  67252. #ifdef WOLFSSL_KEIL
  67253. "muls r5, r6, r5\n\t"
  67254. #elif defined(__clang__)
  67255. "muls r5, r6\n\t"
  67256. #else
  67257. "mul r5, r6\n\t"
  67258. #endif
  67259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67260. "lsrs r6, r5, #16\n\t"
  67261. #else
  67262. "lsr r6, r5, #16\n\t"
  67263. #endif
  67264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67265. "lsls r5, r5, #16\n\t"
  67266. #else
  67267. "lsl r5, r5, #16\n\t"
  67268. #endif
  67269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67270. "adds r3, r3, r5\n\t"
  67271. #else
  67272. "add r3, r3, r5\n\t"
  67273. #endif
  67274. #ifdef WOLFSSL_KEIL
  67275. "adcs r4, r4, r6\n\t"
  67276. #elif defined(__clang__)
  67277. "adcs r4, r6\n\t"
  67278. #else
  67279. "adc r4, r6\n\t"
  67280. #endif
  67281. #ifdef WOLFSSL_KEIL
  67282. "adcs r2, r2, %[r]\n\t"
  67283. #elif defined(__clang__)
  67284. "adcs r2, %[r]\n\t"
  67285. #else
  67286. "adc r2, %[r]\n\t"
  67287. #endif
  67288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67289. "adds r3, r3, r5\n\t"
  67290. #else
  67291. "add r3, r3, r5\n\t"
  67292. #endif
  67293. #ifdef WOLFSSL_KEIL
  67294. "adcs r4, r4, r6\n\t"
  67295. #elif defined(__clang__)
  67296. "adcs r4, r6\n\t"
  67297. #else
  67298. "adc r4, r6\n\t"
  67299. #endif
  67300. #ifdef WOLFSSL_KEIL
  67301. "adcs r2, r2, %[r]\n\t"
  67302. #elif defined(__clang__)
  67303. "adcs r2, %[r]\n\t"
  67304. #else
  67305. "adc r2, %[r]\n\t"
  67306. #endif
  67307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67308. "lsrs r5, %[a], #16\n\t"
  67309. #else
  67310. "lsr r5, %[a], #16\n\t"
  67311. #endif
  67312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67313. "lsrs r6, r7, #16\n\t"
  67314. #else
  67315. "lsr r6, r7, #16\n\t"
  67316. #endif
  67317. #ifdef WOLFSSL_KEIL
  67318. "muls r6, r5, r6\n\t"
  67319. #elif defined(__clang__)
  67320. "muls r6, r5\n\t"
  67321. #else
  67322. "mul r6, r5\n\t"
  67323. #endif
  67324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67325. "adds r4, r4, r6\n\t"
  67326. #else
  67327. "add r4, r4, r6\n\t"
  67328. #endif
  67329. #ifdef WOLFSSL_KEIL
  67330. "adcs r2, r2, %[r]\n\t"
  67331. #elif defined(__clang__)
  67332. "adcs r2, %[r]\n\t"
  67333. #else
  67334. "adc r2, %[r]\n\t"
  67335. #endif
  67336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67337. "adds r4, r4, r6\n\t"
  67338. #else
  67339. "add r4, r4, r6\n\t"
  67340. #endif
  67341. #ifdef WOLFSSL_KEIL
  67342. "adcs r2, r2, %[r]\n\t"
  67343. #elif defined(__clang__)
  67344. "adcs r2, %[r]\n\t"
  67345. #else
  67346. "adc r2, %[r]\n\t"
  67347. #endif
  67348. "uxth r6, r7\n\t"
  67349. #ifdef WOLFSSL_KEIL
  67350. "muls r5, r6, r5\n\t"
  67351. #elif defined(__clang__)
  67352. "muls r5, r6\n\t"
  67353. #else
  67354. "mul r5, r6\n\t"
  67355. #endif
  67356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67357. "lsrs r6, r5, #16\n\t"
  67358. #else
  67359. "lsr r6, r5, #16\n\t"
  67360. #endif
  67361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67362. "lsls r5, r5, #16\n\t"
  67363. #else
  67364. "lsl r5, r5, #16\n\t"
  67365. #endif
  67366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67367. "adds r3, r3, r5\n\t"
  67368. #else
  67369. "add r3, r3, r5\n\t"
  67370. #endif
  67371. #ifdef WOLFSSL_KEIL
  67372. "adcs r4, r4, r6\n\t"
  67373. #elif defined(__clang__)
  67374. "adcs r4, r6\n\t"
  67375. #else
  67376. "adc r4, r6\n\t"
  67377. #endif
  67378. #ifdef WOLFSSL_KEIL
  67379. "adcs r2, r2, %[r]\n\t"
  67380. #elif defined(__clang__)
  67381. "adcs r2, %[r]\n\t"
  67382. #else
  67383. "adc r2, %[r]\n\t"
  67384. #endif
  67385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67386. "adds r3, r3, r5\n\t"
  67387. #else
  67388. "add r3, r3, r5\n\t"
  67389. #endif
  67390. #ifdef WOLFSSL_KEIL
  67391. "adcs r4, r4, r6\n\t"
  67392. #elif defined(__clang__)
  67393. "adcs r4, r6\n\t"
  67394. #else
  67395. "adc r4, r6\n\t"
  67396. #endif
  67397. #ifdef WOLFSSL_KEIL
  67398. "adcs r2, r2, %[r]\n\t"
  67399. #elif defined(__clang__)
  67400. "adcs r2, %[r]\n\t"
  67401. #else
  67402. "adc r2, %[r]\n\t"
  67403. #endif
  67404. "# A[9] * A[7]\n\t"
  67405. "mov %[a], r9\n\t"
  67406. "ldr r7, [%[a], #28]\n\t"
  67407. "mov %[a], r11\n\t"
  67408. "uxth r5, %[a]\n\t"
  67409. "uxth r6, r7\n\t"
  67410. #ifdef WOLFSSL_KEIL
  67411. "muls r6, r5, r6\n\t"
  67412. #elif defined(__clang__)
  67413. "muls r6, r5\n\t"
  67414. #else
  67415. "mul r6, r5\n\t"
  67416. #endif
  67417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67418. "adds r3, r3, r6\n\t"
  67419. #else
  67420. "add r3, r3, r6\n\t"
  67421. #endif
  67422. #ifdef WOLFSSL_KEIL
  67423. "adcs r4, r4, %[r]\n\t"
  67424. #elif defined(__clang__)
  67425. "adcs r4, %[r]\n\t"
  67426. #else
  67427. "adc r4, %[r]\n\t"
  67428. #endif
  67429. #ifdef WOLFSSL_KEIL
  67430. "adcs r2, r2, %[r]\n\t"
  67431. #elif defined(__clang__)
  67432. "adcs r2, %[r]\n\t"
  67433. #else
  67434. "adc r2, %[r]\n\t"
  67435. #endif
  67436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67437. "adds r3, r3, r6\n\t"
  67438. #else
  67439. "add r3, r3, r6\n\t"
  67440. #endif
  67441. #ifdef WOLFSSL_KEIL
  67442. "adcs r4, r4, %[r]\n\t"
  67443. #elif defined(__clang__)
  67444. "adcs r4, %[r]\n\t"
  67445. #else
  67446. "adc r4, %[r]\n\t"
  67447. #endif
  67448. #ifdef WOLFSSL_KEIL
  67449. "adcs r2, r2, %[r]\n\t"
  67450. #elif defined(__clang__)
  67451. "adcs r2, %[r]\n\t"
  67452. #else
  67453. "adc r2, %[r]\n\t"
  67454. #endif
  67455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67456. "lsrs r6, r7, #16\n\t"
  67457. #else
  67458. "lsr r6, r7, #16\n\t"
  67459. #endif
  67460. #ifdef WOLFSSL_KEIL
  67461. "muls r5, r6, r5\n\t"
  67462. #elif defined(__clang__)
  67463. "muls r5, r6\n\t"
  67464. #else
  67465. "mul r5, r6\n\t"
  67466. #endif
  67467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67468. "lsrs r6, r5, #16\n\t"
  67469. #else
  67470. "lsr r6, r5, #16\n\t"
  67471. #endif
  67472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67473. "lsls r5, r5, #16\n\t"
  67474. #else
  67475. "lsl r5, r5, #16\n\t"
  67476. #endif
  67477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67478. "adds r3, r3, r5\n\t"
  67479. #else
  67480. "add r3, r3, r5\n\t"
  67481. #endif
  67482. #ifdef WOLFSSL_KEIL
  67483. "adcs r4, r4, r6\n\t"
  67484. #elif defined(__clang__)
  67485. "adcs r4, r6\n\t"
  67486. #else
  67487. "adc r4, r6\n\t"
  67488. #endif
  67489. #ifdef WOLFSSL_KEIL
  67490. "adcs r2, r2, %[r]\n\t"
  67491. #elif defined(__clang__)
  67492. "adcs r2, %[r]\n\t"
  67493. #else
  67494. "adc r2, %[r]\n\t"
  67495. #endif
  67496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67497. "adds r3, r3, r5\n\t"
  67498. #else
  67499. "add r3, r3, r5\n\t"
  67500. #endif
  67501. #ifdef WOLFSSL_KEIL
  67502. "adcs r4, r4, r6\n\t"
  67503. #elif defined(__clang__)
  67504. "adcs r4, r6\n\t"
  67505. #else
  67506. "adc r4, r6\n\t"
  67507. #endif
  67508. #ifdef WOLFSSL_KEIL
  67509. "adcs r2, r2, %[r]\n\t"
  67510. #elif defined(__clang__)
  67511. "adcs r2, %[r]\n\t"
  67512. #else
  67513. "adc r2, %[r]\n\t"
  67514. #endif
  67515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67516. "lsrs r5, %[a], #16\n\t"
  67517. #else
  67518. "lsr r5, %[a], #16\n\t"
  67519. #endif
  67520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67521. "lsrs r6, r7, #16\n\t"
  67522. #else
  67523. "lsr r6, r7, #16\n\t"
  67524. #endif
  67525. #ifdef WOLFSSL_KEIL
  67526. "muls r6, r5, r6\n\t"
  67527. #elif defined(__clang__)
  67528. "muls r6, r5\n\t"
  67529. #else
  67530. "mul r6, r5\n\t"
  67531. #endif
  67532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67533. "adds r4, r4, r6\n\t"
  67534. #else
  67535. "add r4, r4, r6\n\t"
  67536. #endif
  67537. #ifdef WOLFSSL_KEIL
  67538. "adcs r2, r2, %[r]\n\t"
  67539. #elif defined(__clang__)
  67540. "adcs r2, %[r]\n\t"
  67541. #else
  67542. "adc r2, %[r]\n\t"
  67543. #endif
  67544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67545. "adds r4, r4, r6\n\t"
  67546. #else
  67547. "add r4, r4, r6\n\t"
  67548. #endif
  67549. #ifdef WOLFSSL_KEIL
  67550. "adcs r2, r2, %[r]\n\t"
  67551. #elif defined(__clang__)
  67552. "adcs r2, %[r]\n\t"
  67553. #else
  67554. "adc r2, %[r]\n\t"
  67555. #endif
  67556. "uxth r6, r7\n\t"
  67557. #ifdef WOLFSSL_KEIL
  67558. "muls r5, r6, r5\n\t"
  67559. #elif defined(__clang__)
  67560. "muls r5, r6\n\t"
  67561. #else
  67562. "mul r5, r6\n\t"
  67563. #endif
  67564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67565. "lsrs r6, r5, #16\n\t"
  67566. #else
  67567. "lsr r6, r5, #16\n\t"
  67568. #endif
  67569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67570. "lsls r5, r5, #16\n\t"
  67571. #else
  67572. "lsl r5, r5, #16\n\t"
  67573. #endif
  67574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67575. "adds r3, r3, r5\n\t"
  67576. #else
  67577. "add r3, r3, r5\n\t"
  67578. #endif
  67579. #ifdef WOLFSSL_KEIL
  67580. "adcs r4, r4, r6\n\t"
  67581. #elif defined(__clang__)
  67582. "adcs r4, r6\n\t"
  67583. #else
  67584. "adc r4, r6\n\t"
  67585. #endif
  67586. #ifdef WOLFSSL_KEIL
  67587. "adcs r2, r2, %[r]\n\t"
  67588. #elif defined(__clang__)
  67589. "adcs r2, %[r]\n\t"
  67590. #else
  67591. "adc r2, %[r]\n\t"
  67592. #endif
  67593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67594. "adds r3, r3, r5\n\t"
  67595. #else
  67596. "add r3, r3, r5\n\t"
  67597. #endif
  67598. #ifdef WOLFSSL_KEIL
  67599. "adcs r4, r4, r6\n\t"
  67600. #elif defined(__clang__)
  67601. "adcs r4, r6\n\t"
  67602. #else
  67603. "adc r4, r6\n\t"
  67604. #endif
  67605. #ifdef WOLFSSL_KEIL
  67606. "adcs r2, r2, %[r]\n\t"
  67607. #elif defined(__clang__)
  67608. "adcs r2, %[r]\n\t"
  67609. #else
  67610. "adc r2, %[r]\n\t"
  67611. #endif
  67612. "# A[8] * A[8]\n\t"
  67613. "mov r7, r10\n\t"
  67614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67615. "lsrs r6, r7, #16\n\t"
  67616. #else
  67617. "lsr r6, r7, #16\n\t"
  67618. #endif
  67619. "uxth r5, r7\n\t"
  67620. #ifdef WOLFSSL_KEIL
  67621. "muls r5, r5, r5\n\t"
  67622. #elif defined(__clang__)
  67623. "muls r5, r5\n\t"
  67624. #else
  67625. "mul r5, r5\n\t"
  67626. #endif
  67627. #ifdef WOLFSSL_KEIL
  67628. "muls r6, r6, r6\n\t"
  67629. #elif defined(__clang__)
  67630. "muls r6, r6\n\t"
  67631. #else
  67632. "mul r6, r6\n\t"
  67633. #endif
  67634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67635. "adds r3, r3, r5\n\t"
  67636. #else
  67637. "add r3, r3, r5\n\t"
  67638. #endif
  67639. #ifdef WOLFSSL_KEIL
  67640. "adcs r4, r4, r6\n\t"
  67641. #elif defined(__clang__)
  67642. "adcs r4, r6\n\t"
  67643. #else
  67644. "adc r4, r6\n\t"
  67645. #endif
  67646. #ifdef WOLFSSL_KEIL
  67647. "adcs r2, r2, %[r]\n\t"
  67648. #elif defined(__clang__)
  67649. "adcs r2, %[r]\n\t"
  67650. #else
  67651. "adc r2, %[r]\n\t"
  67652. #endif
  67653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67654. "lsrs r6, r7, #16\n\t"
  67655. #else
  67656. "lsr r6, r7, #16\n\t"
  67657. #endif
  67658. "uxth r5, r7\n\t"
  67659. #ifdef WOLFSSL_KEIL
  67660. "muls r5, r6, r5\n\t"
  67661. #elif defined(__clang__)
  67662. "muls r5, r6\n\t"
  67663. #else
  67664. "mul r5, r6\n\t"
  67665. #endif
  67666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67667. "lsrs r6, r5, #15\n\t"
  67668. #else
  67669. "lsr r6, r5, #15\n\t"
  67670. #endif
  67671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67672. "lsls r5, r5, #17\n\t"
  67673. #else
  67674. "lsl r5, r5, #17\n\t"
  67675. #endif
  67676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67677. "adds r3, r3, r5\n\t"
  67678. #else
  67679. "add r3, r3, r5\n\t"
  67680. #endif
  67681. #ifdef WOLFSSL_KEIL
  67682. "adcs r4, r4, r6\n\t"
  67683. #elif defined(__clang__)
  67684. "adcs r4, r6\n\t"
  67685. #else
  67686. "adc r4, r6\n\t"
  67687. #endif
  67688. #ifdef WOLFSSL_KEIL
  67689. "adcs r2, r2, %[r]\n\t"
  67690. #elif defined(__clang__)
  67691. "adcs r2, %[r]\n\t"
  67692. #else
  67693. "adc r2, %[r]\n\t"
  67694. #endif
  67695. "mov %[r], r8\n\t"
  67696. "str r3, [%[r], #64]\n\t"
  67697. "movs %[r], #0\n\t"
  67698. "# A[9] * A[8]\n\t"
  67699. "movs r3, #0\n\t"
  67700. "mov %[a], r9\n\t"
  67701. "mov %[a], r11\n\t"
  67702. "uxth r5, %[a]\n\t"
  67703. "uxth r6, r7\n\t"
  67704. #ifdef WOLFSSL_KEIL
  67705. "muls r6, r5, r6\n\t"
  67706. #elif defined(__clang__)
  67707. "muls r6, r5\n\t"
  67708. #else
  67709. "mul r6, r5\n\t"
  67710. #endif
  67711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67712. "adds r4, r4, r6\n\t"
  67713. #else
  67714. "add r4, r4, r6\n\t"
  67715. #endif
  67716. #ifdef WOLFSSL_KEIL
  67717. "adcs r2, r2, %[r]\n\t"
  67718. #elif defined(__clang__)
  67719. "adcs r2, %[r]\n\t"
  67720. #else
  67721. "adc r2, %[r]\n\t"
  67722. #endif
  67723. #ifdef WOLFSSL_KEIL
  67724. "adcs r3, r3, %[r]\n\t"
  67725. #elif defined(__clang__)
  67726. "adcs r3, %[r]\n\t"
  67727. #else
  67728. "adc r3, %[r]\n\t"
  67729. #endif
  67730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67731. "adds r4, r4, r6\n\t"
  67732. #else
  67733. "add r4, r4, r6\n\t"
  67734. #endif
  67735. #ifdef WOLFSSL_KEIL
  67736. "adcs r2, r2, %[r]\n\t"
  67737. #elif defined(__clang__)
  67738. "adcs r2, %[r]\n\t"
  67739. #else
  67740. "adc r2, %[r]\n\t"
  67741. #endif
  67742. #ifdef WOLFSSL_KEIL
  67743. "adcs r3, r3, %[r]\n\t"
  67744. #elif defined(__clang__)
  67745. "adcs r3, %[r]\n\t"
  67746. #else
  67747. "adc r3, %[r]\n\t"
  67748. #endif
  67749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67750. "lsrs r6, r7, #16\n\t"
  67751. #else
  67752. "lsr r6, r7, #16\n\t"
  67753. #endif
  67754. #ifdef WOLFSSL_KEIL
  67755. "muls r5, r6, r5\n\t"
  67756. #elif defined(__clang__)
  67757. "muls r5, r6\n\t"
  67758. #else
  67759. "mul r5, r6\n\t"
  67760. #endif
  67761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67762. "lsrs r6, r5, #16\n\t"
  67763. #else
  67764. "lsr r6, r5, #16\n\t"
  67765. #endif
  67766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67767. "lsls r5, r5, #16\n\t"
  67768. #else
  67769. "lsl r5, r5, #16\n\t"
  67770. #endif
  67771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67772. "adds r4, r4, r5\n\t"
  67773. #else
  67774. "add r4, r4, r5\n\t"
  67775. #endif
  67776. #ifdef WOLFSSL_KEIL
  67777. "adcs r2, r2, r6\n\t"
  67778. #elif defined(__clang__)
  67779. "adcs r2, r6\n\t"
  67780. #else
  67781. "adc r2, r6\n\t"
  67782. #endif
  67783. #ifdef WOLFSSL_KEIL
  67784. "adcs r3, r3, %[r]\n\t"
  67785. #elif defined(__clang__)
  67786. "adcs r3, %[r]\n\t"
  67787. #else
  67788. "adc r3, %[r]\n\t"
  67789. #endif
  67790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67791. "adds r4, r4, r5\n\t"
  67792. #else
  67793. "add r4, r4, r5\n\t"
  67794. #endif
  67795. #ifdef WOLFSSL_KEIL
  67796. "adcs r2, r2, r6\n\t"
  67797. #elif defined(__clang__)
  67798. "adcs r2, r6\n\t"
  67799. #else
  67800. "adc r2, r6\n\t"
  67801. #endif
  67802. #ifdef WOLFSSL_KEIL
  67803. "adcs r3, r3, %[r]\n\t"
  67804. #elif defined(__clang__)
  67805. "adcs r3, %[r]\n\t"
  67806. #else
  67807. "adc r3, %[r]\n\t"
  67808. #endif
  67809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67810. "lsrs r5, %[a], #16\n\t"
  67811. #else
  67812. "lsr r5, %[a], #16\n\t"
  67813. #endif
  67814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67815. "lsrs r6, r7, #16\n\t"
  67816. #else
  67817. "lsr r6, r7, #16\n\t"
  67818. #endif
  67819. #ifdef WOLFSSL_KEIL
  67820. "muls r6, r5, r6\n\t"
  67821. #elif defined(__clang__)
  67822. "muls r6, r5\n\t"
  67823. #else
  67824. "mul r6, r5\n\t"
  67825. #endif
  67826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67827. "adds r2, r2, r6\n\t"
  67828. #else
  67829. "add r2, r2, r6\n\t"
  67830. #endif
  67831. #ifdef WOLFSSL_KEIL
  67832. "adcs r3, r3, %[r]\n\t"
  67833. #elif defined(__clang__)
  67834. "adcs r3, %[r]\n\t"
  67835. #else
  67836. "adc r3, %[r]\n\t"
  67837. #endif
  67838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67839. "adds r2, r2, r6\n\t"
  67840. #else
  67841. "add r2, r2, r6\n\t"
  67842. #endif
  67843. #ifdef WOLFSSL_KEIL
  67844. "adcs r3, r3, %[r]\n\t"
  67845. #elif defined(__clang__)
  67846. "adcs r3, %[r]\n\t"
  67847. #else
  67848. "adc r3, %[r]\n\t"
  67849. #endif
  67850. "uxth r6, r7\n\t"
  67851. #ifdef WOLFSSL_KEIL
  67852. "muls r5, r6, r5\n\t"
  67853. #elif defined(__clang__)
  67854. "muls r5, r6\n\t"
  67855. #else
  67856. "mul r5, r6\n\t"
  67857. #endif
  67858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67859. "lsrs r6, r5, #16\n\t"
  67860. #else
  67861. "lsr r6, r5, #16\n\t"
  67862. #endif
  67863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67864. "lsls r5, r5, #16\n\t"
  67865. #else
  67866. "lsl r5, r5, #16\n\t"
  67867. #endif
  67868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67869. "adds r4, r4, r5\n\t"
  67870. #else
  67871. "add r4, r4, r5\n\t"
  67872. #endif
  67873. #ifdef WOLFSSL_KEIL
  67874. "adcs r2, r2, r6\n\t"
  67875. #elif defined(__clang__)
  67876. "adcs r2, r6\n\t"
  67877. #else
  67878. "adc r2, r6\n\t"
  67879. #endif
  67880. #ifdef WOLFSSL_KEIL
  67881. "adcs r3, r3, %[r]\n\t"
  67882. #elif defined(__clang__)
  67883. "adcs r3, %[r]\n\t"
  67884. #else
  67885. "adc r3, %[r]\n\t"
  67886. #endif
  67887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67888. "adds r4, r4, r5\n\t"
  67889. #else
  67890. "add r4, r4, r5\n\t"
  67891. #endif
  67892. #ifdef WOLFSSL_KEIL
  67893. "adcs r2, r2, r6\n\t"
  67894. #elif defined(__clang__)
  67895. "adcs r2, r6\n\t"
  67896. #else
  67897. "adc r2, r6\n\t"
  67898. #endif
  67899. #ifdef WOLFSSL_KEIL
  67900. "adcs r3, r3, %[r]\n\t"
  67901. #elif defined(__clang__)
  67902. "adcs r3, %[r]\n\t"
  67903. #else
  67904. "adc r3, %[r]\n\t"
  67905. #endif
  67906. "# A[10] * A[7]\n\t"
  67907. "mov %[a], r9\n\t"
  67908. "ldr r7, [%[a], #28]\n\t"
  67909. "mov %[a], r12\n\t"
  67910. "uxth r5, %[a]\n\t"
  67911. "uxth r6, r7\n\t"
  67912. #ifdef WOLFSSL_KEIL
  67913. "muls r6, r5, r6\n\t"
  67914. #elif defined(__clang__)
  67915. "muls r6, r5\n\t"
  67916. #else
  67917. "mul r6, r5\n\t"
  67918. #endif
  67919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67920. "adds r4, r4, r6\n\t"
  67921. #else
  67922. "add r4, r4, r6\n\t"
  67923. #endif
  67924. #ifdef WOLFSSL_KEIL
  67925. "adcs r2, r2, %[r]\n\t"
  67926. #elif defined(__clang__)
  67927. "adcs r2, %[r]\n\t"
  67928. #else
  67929. "adc r2, %[r]\n\t"
  67930. #endif
  67931. #ifdef WOLFSSL_KEIL
  67932. "adcs r3, r3, %[r]\n\t"
  67933. #elif defined(__clang__)
  67934. "adcs r3, %[r]\n\t"
  67935. #else
  67936. "adc r3, %[r]\n\t"
  67937. #endif
  67938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67939. "adds r4, r4, r6\n\t"
  67940. #else
  67941. "add r4, r4, r6\n\t"
  67942. #endif
  67943. #ifdef WOLFSSL_KEIL
  67944. "adcs r2, r2, %[r]\n\t"
  67945. #elif defined(__clang__)
  67946. "adcs r2, %[r]\n\t"
  67947. #else
  67948. "adc r2, %[r]\n\t"
  67949. #endif
  67950. #ifdef WOLFSSL_KEIL
  67951. "adcs r3, r3, %[r]\n\t"
  67952. #elif defined(__clang__)
  67953. "adcs r3, %[r]\n\t"
  67954. #else
  67955. "adc r3, %[r]\n\t"
  67956. #endif
  67957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67958. "lsrs r6, r7, #16\n\t"
  67959. #else
  67960. "lsr r6, r7, #16\n\t"
  67961. #endif
  67962. #ifdef WOLFSSL_KEIL
  67963. "muls r5, r6, r5\n\t"
  67964. #elif defined(__clang__)
  67965. "muls r5, r6\n\t"
  67966. #else
  67967. "mul r5, r6\n\t"
  67968. #endif
  67969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67970. "lsrs r6, r5, #16\n\t"
  67971. #else
  67972. "lsr r6, r5, #16\n\t"
  67973. #endif
  67974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67975. "lsls r5, r5, #16\n\t"
  67976. #else
  67977. "lsl r5, r5, #16\n\t"
  67978. #endif
  67979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67980. "adds r4, r4, r5\n\t"
  67981. #else
  67982. "add r4, r4, r5\n\t"
  67983. #endif
  67984. #ifdef WOLFSSL_KEIL
  67985. "adcs r2, r2, r6\n\t"
  67986. #elif defined(__clang__)
  67987. "adcs r2, r6\n\t"
  67988. #else
  67989. "adc r2, r6\n\t"
  67990. #endif
  67991. #ifdef WOLFSSL_KEIL
  67992. "adcs r3, r3, %[r]\n\t"
  67993. #elif defined(__clang__)
  67994. "adcs r3, %[r]\n\t"
  67995. #else
  67996. "adc r3, %[r]\n\t"
  67997. #endif
  67998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  67999. "adds r4, r4, r5\n\t"
  68000. #else
  68001. "add r4, r4, r5\n\t"
  68002. #endif
  68003. #ifdef WOLFSSL_KEIL
  68004. "adcs r2, r2, r6\n\t"
  68005. #elif defined(__clang__)
  68006. "adcs r2, r6\n\t"
  68007. #else
  68008. "adc r2, r6\n\t"
  68009. #endif
  68010. #ifdef WOLFSSL_KEIL
  68011. "adcs r3, r3, %[r]\n\t"
  68012. #elif defined(__clang__)
  68013. "adcs r3, %[r]\n\t"
  68014. #else
  68015. "adc r3, %[r]\n\t"
  68016. #endif
  68017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68018. "lsrs r5, %[a], #16\n\t"
  68019. #else
  68020. "lsr r5, %[a], #16\n\t"
  68021. #endif
  68022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68023. "lsrs r6, r7, #16\n\t"
  68024. #else
  68025. "lsr r6, r7, #16\n\t"
  68026. #endif
  68027. #ifdef WOLFSSL_KEIL
  68028. "muls r6, r5, r6\n\t"
  68029. #elif defined(__clang__)
  68030. "muls r6, r5\n\t"
  68031. #else
  68032. "mul r6, r5\n\t"
  68033. #endif
  68034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68035. "adds r2, r2, r6\n\t"
  68036. #else
  68037. "add r2, r2, r6\n\t"
  68038. #endif
  68039. #ifdef WOLFSSL_KEIL
  68040. "adcs r3, r3, %[r]\n\t"
  68041. #elif defined(__clang__)
  68042. "adcs r3, %[r]\n\t"
  68043. #else
  68044. "adc r3, %[r]\n\t"
  68045. #endif
  68046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68047. "adds r2, r2, r6\n\t"
  68048. #else
  68049. "add r2, r2, r6\n\t"
  68050. #endif
  68051. #ifdef WOLFSSL_KEIL
  68052. "adcs r3, r3, %[r]\n\t"
  68053. #elif defined(__clang__)
  68054. "adcs r3, %[r]\n\t"
  68055. #else
  68056. "adc r3, %[r]\n\t"
  68057. #endif
  68058. "uxth r6, r7\n\t"
  68059. #ifdef WOLFSSL_KEIL
  68060. "muls r5, r6, r5\n\t"
  68061. #elif defined(__clang__)
  68062. "muls r5, r6\n\t"
  68063. #else
  68064. "mul r5, r6\n\t"
  68065. #endif
  68066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68067. "lsrs r6, r5, #16\n\t"
  68068. #else
  68069. "lsr r6, r5, #16\n\t"
  68070. #endif
  68071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68072. "lsls r5, r5, #16\n\t"
  68073. #else
  68074. "lsl r5, r5, #16\n\t"
  68075. #endif
  68076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68077. "adds r4, r4, r5\n\t"
  68078. #else
  68079. "add r4, r4, r5\n\t"
  68080. #endif
  68081. #ifdef WOLFSSL_KEIL
  68082. "adcs r2, r2, r6\n\t"
  68083. #elif defined(__clang__)
  68084. "adcs r2, r6\n\t"
  68085. #else
  68086. "adc r2, r6\n\t"
  68087. #endif
  68088. #ifdef WOLFSSL_KEIL
  68089. "adcs r3, r3, %[r]\n\t"
  68090. #elif defined(__clang__)
  68091. "adcs r3, %[r]\n\t"
  68092. #else
  68093. "adc r3, %[r]\n\t"
  68094. #endif
  68095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68096. "adds r4, r4, r5\n\t"
  68097. #else
  68098. "add r4, r4, r5\n\t"
  68099. #endif
  68100. #ifdef WOLFSSL_KEIL
  68101. "adcs r2, r2, r6\n\t"
  68102. #elif defined(__clang__)
  68103. "adcs r2, r6\n\t"
  68104. #else
  68105. "adc r2, r6\n\t"
  68106. #endif
  68107. #ifdef WOLFSSL_KEIL
  68108. "adcs r3, r3, %[r]\n\t"
  68109. #elif defined(__clang__)
  68110. "adcs r3, %[r]\n\t"
  68111. #else
  68112. "adc r3, %[r]\n\t"
  68113. #endif
  68114. "# A[11] * A[6]\n\t"
  68115. "mov %[a], r9\n\t"
  68116. "ldr r7, [%[a], #24]\n\t"
  68117. "mov %[a], lr\n\t"
  68118. "uxth r5, %[a]\n\t"
  68119. "uxth r6, r7\n\t"
  68120. #ifdef WOLFSSL_KEIL
  68121. "muls r6, r5, r6\n\t"
  68122. #elif defined(__clang__)
  68123. "muls r6, r5\n\t"
  68124. #else
  68125. "mul r6, r5\n\t"
  68126. #endif
  68127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68128. "adds r4, r4, r6\n\t"
  68129. #else
  68130. "add r4, r4, r6\n\t"
  68131. #endif
  68132. #ifdef WOLFSSL_KEIL
  68133. "adcs r2, r2, %[r]\n\t"
  68134. #elif defined(__clang__)
  68135. "adcs r2, %[r]\n\t"
  68136. #else
  68137. "adc r2, %[r]\n\t"
  68138. #endif
  68139. #ifdef WOLFSSL_KEIL
  68140. "adcs r3, r3, %[r]\n\t"
  68141. #elif defined(__clang__)
  68142. "adcs r3, %[r]\n\t"
  68143. #else
  68144. "adc r3, %[r]\n\t"
  68145. #endif
  68146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68147. "adds r4, r4, r6\n\t"
  68148. #else
  68149. "add r4, r4, r6\n\t"
  68150. #endif
  68151. #ifdef WOLFSSL_KEIL
  68152. "adcs r2, r2, %[r]\n\t"
  68153. #elif defined(__clang__)
  68154. "adcs r2, %[r]\n\t"
  68155. #else
  68156. "adc r2, %[r]\n\t"
  68157. #endif
  68158. #ifdef WOLFSSL_KEIL
  68159. "adcs r3, r3, %[r]\n\t"
  68160. #elif defined(__clang__)
  68161. "adcs r3, %[r]\n\t"
  68162. #else
  68163. "adc r3, %[r]\n\t"
  68164. #endif
  68165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68166. "lsrs r6, r7, #16\n\t"
  68167. #else
  68168. "lsr r6, r7, #16\n\t"
  68169. #endif
  68170. #ifdef WOLFSSL_KEIL
  68171. "muls r5, r6, r5\n\t"
  68172. #elif defined(__clang__)
  68173. "muls r5, r6\n\t"
  68174. #else
  68175. "mul r5, r6\n\t"
  68176. #endif
  68177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68178. "lsrs r6, r5, #16\n\t"
  68179. #else
  68180. "lsr r6, r5, #16\n\t"
  68181. #endif
  68182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68183. "lsls r5, r5, #16\n\t"
  68184. #else
  68185. "lsl r5, r5, #16\n\t"
  68186. #endif
  68187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68188. "adds r4, r4, r5\n\t"
  68189. #else
  68190. "add r4, r4, r5\n\t"
  68191. #endif
  68192. #ifdef WOLFSSL_KEIL
  68193. "adcs r2, r2, r6\n\t"
  68194. #elif defined(__clang__)
  68195. "adcs r2, r6\n\t"
  68196. #else
  68197. "adc r2, r6\n\t"
  68198. #endif
  68199. #ifdef WOLFSSL_KEIL
  68200. "adcs r3, r3, %[r]\n\t"
  68201. #elif defined(__clang__)
  68202. "adcs r3, %[r]\n\t"
  68203. #else
  68204. "adc r3, %[r]\n\t"
  68205. #endif
  68206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68207. "adds r4, r4, r5\n\t"
  68208. #else
  68209. "add r4, r4, r5\n\t"
  68210. #endif
  68211. #ifdef WOLFSSL_KEIL
  68212. "adcs r2, r2, r6\n\t"
  68213. #elif defined(__clang__)
  68214. "adcs r2, r6\n\t"
  68215. #else
  68216. "adc r2, r6\n\t"
  68217. #endif
  68218. #ifdef WOLFSSL_KEIL
  68219. "adcs r3, r3, %[r]\n\t"
  68220. #elif defined(__clang__)
  68221. "adcs r3, %[r]\n\t"
  68222. #else
  68223. "adc r3, %[r]\n\t"
  68224. #endif
  68225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68226. "lsrs r5, %[a], #16\n\t"
  68227. #else
  68228. "lsr r5, %[a], #16\n\t"
  68229. #endif
  68230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68231. "lsrs r6, r7, #16\n\t"
  68232. #else
  68233. "lsr r6, r7, #16\n\t"
  68234. #endif
  68235. #ifdef WOLFSSL_KEIL
  68236. "muls r6, r5, r6\n\t"
  68237. #elif defined(__clang__)
  68238. "muls r6, r5\n\t"
  68239. #else
  68240. "mul r6, r5\n\t"
  68241. #endif
  68242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68243. "adds r2, r2, r6\n\t"
  68244. #else
  68245. "add r2, r2, r6\n\t"
  68246. #endif
  68247. #ifdef WOLFSSL_KEIL
  68248. "adcs r3, r3, %[r]\n\t"
  68249. #elif defined(__clang__)
  68250. "adcs r3, %[r]\n\t"
  68251. #else
  68252. "adc r3, %[r]\n\t"
  68253. #endif
  68254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68255. "adds r2, r2, r6\n\t"
  68256. #else
  68257. "add r2, r2, r6\n\t"
  68258. #endif
  68259. #ifdef WOLFSSL_KEIL
  68260. "adcs r3, r3, %[r]\n\t"
  68261. #elif defined(__clang__)
  68262. "adcs r3, %[r]\n\t"
  68263. #else
  68264. "adc r3, %[r]\n\t"
  68265. #endif
  68266. "uxth r6, r7\n\t"
  68267. #ifdef WOLFSSL_KEIL
  68268. "muls r5, r6, r5\n\t"
  68269. #elif defined(__clang__)
  68270. "muls r5, r6\n\t"
  68271. #else
  68272. "mul r5, r6\n\t"
  68273. #endif
  68274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68275. "lsrs r6, r5, #16\n\t"
  68276. #else
  68277. "lsr r6, r5, #16\n\t"
  68278. #endif
  68279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68280. "lsls r5, r5, #16\n\t"
  68281. #else
  68282. "lsl r5, r5, #16\n\t"
  68283. #endif
  68284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68285. "adds r4, r4, r5\n\t"
  68286. #else
  68287. "add r4, r4, r5\n\t"
  68288. #endif
  68289. #ifdef WOLFSSL_KEIL
  68290. "adcs r2, r2, r6\n\t"
  68291. #elif defined(__clang__)
  68292. "adcs r2, r6\n\t"
  68293. #else
  68294. "adc r2, r6\n\t"
  68295. #endif
  68296. #ifdef WOLFSSL_KEIL
  68297. "adcs r3, r3, %[r]\n\t"
  68298. #elif defined(__clang__)
  68299. "adcs r3, %[r]\n\t"
  68300. #else
  68301. "adc r3, %[r]\n\t"
  68302. #endif
  68303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68304. "adds r4, r4, r5\n\t"
  68305. #else
  68306. "add r4, r4, r5\n\t"
  68307. #endif
  68308. #ifdef WOLFSSL_KEIL
  68309. "adcs r2, r2, r6\n\t"
  68310. #elif defined(__clang__)
  68311. "adcs r2, r6\n\t"
  68312. #else
  68313. "adc r2, r6\n\t"
  68314. #endif
  68315. #ifdef WOLFSSL_KEIL
  68316. "adcs r3, r3, %[r]\n\t"
  68317. #elif defined(__clang__)
  68318. "adcs r3, %[r]\n\t"
  68319. #else
  68320. "adc r3, %[r]\n\t"
  68321. #endif
  68322. "mov %[r], r8\n\t"
  68323. "str r4, [%[r], #68]\n\t"
  68324. "movs %[r], #0\n\t"
  68325. "# A[11] * A[7]\n\t"
  68326. "movs r4, #0\n\t"
  68327. "mov %[a], r9\n\t"
  68328. "ldr r7, [%[a], #28]\n\t"
  68329. "mov %[a], lr\n\t"
  68330. "uxth r5, %[a]\n\t"
  68331. "uxth r6, r7\n\t"
  68332. #ifdef WOLFSSL_KEIL
  68333. "muls r6, r5, r6\n\t"
  68334. #elif defined(__clang__)
  68335. "muls r6, r5\n\t"
  68336. #else
  68337. "mul r6, r5\n\t"
  68338. #endif
  68339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68340. "adds r2, r2, r6\n\t"
  68341. #else
  68342. "add r2, r2, r6\n\t"
  68343. #endif
  68344. #ifdef WOLFSSL_KEIL
  68345. "adcs r3, r3, %[r]\n\t"
  68346. #elif defined(__clang__)
  68347. "adcs r3, %[r]\n\t"
  68348. #else
  68349. "adc r3, %[r]\n\t"
  68350. #endif
  68351. #ifdef WOLFSSL_KEIL
  68352. "adcs r4, r4, %[r]\n\t"
  68353. #elif defined(__clang__)
  68354. "adcs r4, %[r]\n\t"
  68355. #else
  68356. "adc r4, %[r]\n\t"
  68357. #endif
  68358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68359. "adds r2, r2, r6\n\t"
  68360. #else
  68361. "add r2, r2, r6\n\t"
  68362. #endif
  68363. #ifdef WOLFSSL_KEIL
  68364. "adcs r3, r3, %[r]\n\t"
  68365. #elif defined(__clang__)
  68366. "adcs r3, %[r]\n\t"
  68367. #else
  68368. "adc r3, %[r]\n\t"
  68369. #endif
  68370. #ifdef WOLFSSL_KEIL
  68371. "adcs r4, r4, %[r]\n\t"
  68372. #elif defined(__clang__)
  68373. "adcs r4, %[r]\n\t"
  68374. #else
  68375. "adc r4, %[r]\n\t"
  68376. #endif
  68377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68378. "lsrs r6, r7, #16\n\t"
  68379. #else
  68380. "lsr r6, r7, #16\n\t"
  68381. #endif
  68382. #ifdef WOLFSSL_KEIL
  68383. "muls r5, r6, r5\n\t"
  68384. #elif defined(__clang__)
  68385. "muls r5, r6\n\t"
  68386. #else
  68387. "mul r5, r6\n\t"
  68388. #endif
  68389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68390. "lsrs r6, r5, #16\n\t"
  68391. #else
  68392. "lsr r6, r5, #16\n\t"
  68393. #endif
  68394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68395. "lsls r5, r5, #16\n\t"
  68396. #else
  68397. "lsl r5, r5, #16\n\t"
  68398. #endif
  68399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68400. "adds r2, r2, r5\n\t"
  68401. #else
  68402. "add r2, r2, r5\n\t"
  68403. #endif
  68404. #ifdef WOLFSSL_KEIL
  68405. "adcs r3, r3, r6\n\t"
  68406. #elif defined(__clang__)
  68407. "adcs r3, r6\n\t"
  68408. #else
  68409. "adc r3, r6\n\t"
  68410. #endif
  68411. #ifdef WOLFSSL_KEIL
  68412. "adcs r4, r4, %[r]\n\t"
  68413. #elif defined(__clang__)
  68414. "adcs r4, %[r]\n\t"
  68415. #else
  68416. "adc r4, %[r]\n\t"
  68417. #endif
  68418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68419. "adds r2, r2, r5\n\t"
  68420. #else
  68421. "add r2, r2, r5\n\t"
  68422. #endif
  68423. #ifdef WOLFSSL_KEIL
  68424. "adcs r3, r3, r6\n\t"
  68425. #elif defined(__clang__)
  68426. "adcs r3, r6\n\t"
  68427. #else
  68428. "adc r3, r6\n\t"
  68429. #endif
  68430. #ifdef WOLFSSL_KEIL
  68431. "adcs r4, r4, %[r]\n\t"
  68432. #elif defined(__clang__)
  68433. "adcs r4, %[r]\n\t"
  68434. #else
  68435. "adc r4, %[r]\n\t"
  68436. #endif
  68437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68438. "lsrs r5, %[a], #16\n\t"
  68439. #else
  68440. "lsr r5, %[a], #16\n\t"
  68441. #endif
  68442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68443. "lsrs r6, r7, #16\n\t"
  68444. #else
  68445. "lsr r6, r7, #16\n\t"
  68446. #endif
  68447. #ifdef WOLFSSL_KEIL
  68448. "muls r6, r5, r6\n\t"
  68449. #elif defined(__clang__)
  68450. "muls r6, r5\n\t"
  68451. #else
  68452. "mul r6, r5\n\t"
  68453. #endif
  68454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68455. "adds r3, r3, r6\n\t"
  68456. #else
  68457. "add r3, r3, r6\n\t"
  68458. #endif
  68459. #ifdef WOLFSSL_KEIL
  68460. "adcs r4, r4, %[r]\n\t"
  68461. #elif defined(__clang__)
  68462. "adcs r4, %[r]\n\t"
  68463. #else
  68464. "adc r4, %[r]\n\t"
  68465. #endif
  68466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68467. "adds r3, r3, r6\n\t"
  68468. #else
  68469. "add r3, r3, r6\n\t"
  68470. #endif
  68471. #ifdef WOLFSSL_KEIL
  68472. "adcs r4, r4, %[r]\n\t"
  68473. #elif defined(__clang__)
  68474. "adcs r4, %[r]\n\t"
  68475. #else
  68476. "adc r4, %[r]\n\t"
  68477. #endif
  68478. "uxth r6, r7\n\t"
  68479. #ifdef WOLFSSL_KEIL
  68480. "muls r5, r6, r5\n\t"
  68481. #elif defined(__clang__)
  68482. "muls r5, r6\n\t"
  68483. #else
  68484. "mul r5, r6\n\t"
  68485. #endif
  68486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68487. "lsrs r6, r5, #16\n\t"
  68488. #else
  68489. "lsr r6, r5, #16\n\t"
  68490. #endif
  68491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68492. "lsls r5, r5, #16\n\t"
  68493. #else
  68494. "lsl r5, r5, #16\n\t"
  68495. #endif
  68496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68497. "adds r2, r2, r5\n\t"
  68498. #else
  68499. "add r2, r2, r5\n\t"
  68500. #endif
  68501. #ifdef WOLFSSL_KEIL
  68502. "adcs r3, r3, r6\n\t"
  68503. #elif defined(__clang__)
  68504. "adcs r3, r6\n\t"
  68505. #else
  68506. "adc r3, r6\n\t"
  68507. #endif
  68508. #ifdef WOLFSSL_KEIL
  68509. "adcs r4, r4, %[r]\n\t"
  68510. #elif defined(__clang__)
  68511. "adcs r4, %[r]\n\t"
  68512. #else
  68513. "adc r4, %[r]\n\t"
  68514. #endif
  68515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68516. "adds r2, r2, r5\n\t"
  68517. #else
  68518. "add r2, r2, r5\n\t"
  68519. #endif
  68520. #ifdef WOLFSSL_KEIL
  68521. "adcs r3, r3, r6\n\t"
  68522. #elif defined(__clang__)
  68523. "adcs r3, r6\n\t"
  68524. #else
  68525. "adc r3, r6\n\t"
  68526. #endif
  68527. #ifdef WOLFSSL_KEIL
  68528. "adcs r4, r4, %[r]\n\t"
  68529. #elif defined(__clang__)
  68530. "adcs r4, %[r]\n\t"
  68531. #else
  68532. "adc r4, %[r]\n\t"
  68533. #endif
  68534. "# A[10] * A[8]\n\t"
  68535. "mov %[a], r9\n\t"
  68536. "mov r7, r10\n\t"
  68537. "mov %[a], r12\n\t"
  68538. "uxth r5, %[a]\n\t"
  68539. "uxth r6, r7\n\t"
  68540. #ifdef WOLFSSL_KEIL
  68541. "muls r6, r5, r6\n\t"
  68542. #elif defined(__clang__)
  68543. "muls r6, r5\n\t"
  68544. #else
  68545. "mul r6, r5\n\t"
  68546. #endif
  68547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68548. "adds r2, r2, r6\n\t"
  68549. #else
  68550. "add r2, r2, r6\n\t"
  68551. #endif
  68552. #ifdef WOLFSSL_KEIL
  68553. "adcs r3, r3, %[r]\n\t"
  68554. #elif defined(__clang__)
  68555. "adcs r3, %[r]\n\t"
  68556. #else
  68557. "adc r3, %[r]\n\t"
  68558. #endif
  68559. #ifdef WOLFSSL_KEIL
  68560. "adcs r4, r4, %[r]\n\t"
  68561. #elif defined(__clang__)
  68562. "adcs r4, %[r]\n\t"
  68563. #else
  68564. "adc r4, %[r]\n\t"
  68565. #endif
  68566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68567. "adds r2, r2, r6\n\t"
  68568. #else
  68569. "add r2, r2, r6\n\t"
  68570. #endif
  68571. #ifdef WOLFSSL_KEIL
  68572. "adcs r3, r3, %[r]\n\t"
  68573. #elif defined(__clang__)
  68574. "adcs r3, %[r]\n\t"
  68575. #else
  68576. "adc r3, %[r]\n\t"
  68577. #endif
  68578. #ifdef WOLFSSL_KEIL
  68579. "adcs r4, r4, %[r]\n\t"
  68580. #elif defined(__clang__)
  68581. "adcs r4, %[r]\n\t"
  68582. #else
  68583. "adc r4, %[r]\n\t"
  68584. #endif
  68585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68586. "lsrs r6, r7, #16\n\t"
  68587. #else
  68588. "lsr r6, r7, #16\n\t"
  68589. #endif
  68590. #ifdef WOLFSSL_KEIL
  68591. "muls r5, r6, r5\n\t"
  68592. #elif defined(__clang__)
  68593. "muls r5, r6\n\t"
  68594. #else
  68595. "mul r5, r6\n\t"
  68596. #endif
  68597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68598. "lsrs r6, r5, #16\n\t"
  68599. #else
  68600. "lsr r6, r5, #16\n\t"
  68601. #endif
  68602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68603. "lsls r5, r5, #16\n\t"
  68604. #else
  68605. "lsl r5, r5, #16\n\t"
  68606. #endif
  68607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68608. "adds r2, r2, r5\n\t"
  68609. #else
  68610. "add r2, r2, r5\n\t"
  68611. #endif
  68612. #ifdef WOLFSSL_KEIL
  68613. "adcs r3, r3, r6\n\t"
  68614. #elif defined(__clang__)
  68615. "adcs r3, r6\n\t"
  68616. #else
  68617. "adc r3, r6\n\t"
  68618. #endif
  68619. #ifdef WOLFSSL_KEIL
  68620. "adcs r4, r4, %[r]\n\t"
  68621. #elif defined(__clang__)
  68622. "adcs r4, %[r]\n\t"
  68623. #else
  68624. "adc r4, %[r]\n\t"
  68625. #endif
  68626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68627. "adds r2, r2, r5\n\t"
  68628. #else
  68629. "add r2, r2, r5\n\t"
  68630. #endif
  68631. #ifdef WOLFSSL_KEIL
  68632. "adcs r3, r3, r6\n\t"
  68633. #elif defined(__clang__)
  68634. "adcs r3, r6\n\t"
  68635. #else
  68636. "adc r3, r6\n\t"
  68637. #endif
  68638. #ifdef WOLFSSL_KEIL
  68639. "adcs r4, r4, %[r]\n\t"
  68640. #elif defined(__clang__)
  68641. "adcs r4, %[r]\n\t"
  68642. #else
  68643. "adc r4, %[r]\n\t"
  68644. #endif
  68645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68646. "lsrs r5, %[a], #16\n\t"
  68647. #else
  68648. "lsr r5, %[a], #16\n\t"
  68649. #endif
  68650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68651. "lsrs r6, r7, #16\n\t"
  68652. #else
  68653. "lsr r6, r7, #16\n\t"
  68654. #endif
  68655. #ifdef WOLFSSL_KEIL
  68656. "muls r6, r5, r6\n\t"
  68657. #elif defined(__clang__)
  68658. "muls r6, r5\n\t"
  68659. #else
  68660. "mul r6, r5\n\t"
  68661. #endif
  68662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68663. "adds r3, r3, r6\n\t"
  68664. #else
  68665. "add r3, r3, r6\n\t"
  68666. #endif
  68667. #ifdef WOLFSSL_KEIL
  68668. "adcs r4, r4, %[r]\n\t"
  68669. #elif defined(__clang__)
  68670. "adcs r4, %[r]\n\t"
  68671. #else
  68672. "adc r4, %[r]\n\t"
  68673. #endif
  68674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68675. "adds r3, r3, r6\n\t"
  68676. #else
  68677. "add r3, r3, r6\n\t"
  68678. #endif
  68679. #ifdef WOLFSSL_KEIL
  68680. "adcs r4, r4, %[r]\n\t"
  68681. #elif defined(__clang__)
  68682. "adcs r4, %[r]\n\t"
  68683. #else
  68684. "adc r4, %[r]\n\t"
  68685. #endif
  68686. "uxth r6, r7\n\t"
  68687. #ifdef WOLFSSL_KEIL
  68688. "muls r5, r6, r5\n\t"
  68689. #elif defined(__clang__)
  68690. "muls r5, r6\n\t"
  68691. #else
  68692. "mul r5, r6\n\t"
  68693. #endif
  68694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68695. "lsrs r6, r5, #16\n\t"
  68696. #else
  68697. "lsr r6, r5, #16\n\t"
  68698. #endif
  68699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68700. "lsls r5, r5, #16\n\t"
  68701. #else
  68702. "lsl r5, r5, #16\n\t"
  68703. #endif
  68704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68705. "adds r2, r2, r5\n\t"
  68706. #else
  68707. "add r2, r2, r5\n\t"
  68708. #endif
  68709. #ifdef WOLFSSL_KEIL
  68710. "adcs r3, r3, r6\n\t"
  68711. #elif defined(__clang__)
  68712. "adcs r3, r6\n\t"
  68713. #else
  68714. "adc r3, r6\n\t"
  68715. #endif
  68716. #ifdef WOLFSSL_KEIL
  68717. "adcs r4, r4, %[r]\n\t"
  68718. #elif defined(__clang__)
  68719. "adcs r4, %[r]\n\t"
  68720. #else
  68721. "adc r4, %[r]\n\t"
  68722. #endif
  68723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68724. "adds r2, r2, r5\n\t"
  68725. #else
  68726. "add r2, r2, r5\n\t"
  68727. #endif
  68728. #ifdef WOLFSSL_KEIL
  68729. "adcs r3, r3, r6\n\t"
  68730. #elif defined(__clang__)
  68731. "adcs r3, r6\n\t"
  68732. #else
  68733. "adc r3, r6\n\t"
  68734. #endif
  68735. #ifdef WOLFSSL_KEIL
  68736. "adcs r4, r4, %[r]\n\t"
  68737. #elif defined(__clang__)
  68738. "adcs r4, %[r]\n\t"
  68739. #else
  68740. "adc r4, %[r]\n\t"
  68741. #endif
  68742. "# A[9] * A[9]\n\t"
  68743. "mov r7, r11\n\t"
  68744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68745. "lsrs r6, r7, #16\n\t"
  68746. #else
  68747. "lsr r6, r7, #16\n\t"
  68748. #endif
  68749. "uxth r5, r7\n\t"
  68750. #ifdef WOLFSSL_KEIL
  68751. "muls r5, r5, r5\n\t"
  68752. #elif defined(__clang__)
  68753. "muls r5, r5\n\t"
  68754. #else
  68755. "mul r5, r5\n\t"
  68756. #endif
  68757. #ifdef WOLFSSL_KEIL
  68758. "muls r6, r6, r6\n\t"
  68759. #elif defined(__clang__)
  68760. "muls r6, r6\n\t"
  68761. #else
  68762. "mul r6, r6\n\t"
  68763. #endif
  68764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68765. "adds r2, r2, r5\n\t"
  68766. #else
  68767. "add r2, r2, r5\n\t"
  68768. #endif
  68769. #ifdef WOLFSSL_KEIL
  68770. "adcs r3, r3, r6\n\t"
  68771. #elif defined(__clang__)
  68772. "adcs r3, r6\n\t"
  68773. #else
  68774. "adc r3, r6\n\t"
  68775. #endif
  68776. #ifdef WOLFSSL_KEIL
  68777. "adcs r4, r4, %[r]\n\t"
  68778. #elif defined(__clang__)
  68779. "adcs r4, %[r]\n\t"
  68780. #else
  68781. "adc r4, %[r]\n\t"
  68782. #endif
  68783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68784. "lsrs r6, r7, #16\n\t"
  68785. #else
  68786. "lsr r6, r7, #16\n\t"
  68787. #endif
  68788. "uxth r5, r7\n\t"
  68789. #ifdef WOLFSSL_KEIL
  68790. "muls r5, r6, r5\n\t"
  68791. #elif defined(__clang__)
  68792. "muls r5, r6\n\t"
  68793. #else
  68794. "mul r5, r6\n\t"
  68795. #endif
  68796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68797. "lsrs r6, r5, #15\n\t"
  68798. #else
  68799. "lsr r6, r5, #15\n\t"
  68800. #endif
  68801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68802. "lsls r5, r5, #17\n\t"
  68803. #else
  68804. "lsl r5, r5, #17\n\t"
  68805. #endif
  68806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68807. "adds r2, r2, r5\n\t"
  68808. #else
  68809. "add r2, r2, r5\n\t"
  68810. #endif
  68811. #ifdef WOLFSSL_KEIL
  68812. "adcs r3, r3, r6\n\t"
  68813. #elif defined(__clang__)
  68814. "adcs r3, r6\n\t"
  68815. #else
  68816. "adc r3, r6\n\t"
  68817. #endif
  68818. #ifdef WOLFSSL_KEIL
  68819. "adcs r4, r4, %[r]\n\t"
  68820. #elif defined(__clang__)
  68821. "adcs r4, %[r]\n\t"
  68822. #else
  68823. "adc r4, %[r]\n\t"
  68824. #endif
  68825. "mov %[r], r8\n\t"
  68826. "str r2, [%[r], #72]\n\t"
  68827. "movs %[r], #0\n\t"
  68828. "# A[10] * A[9]\n\t"
  68829. "movs r2, #0\n\t"
  68830. "mov %[a], r9\n\t"
  68831. "mov %[a], r12\n\t"
  68832. "uxth r5, %[a]\n\t"
  68833. "uxth r6, r7\n\t"
  68834. #ifdef WOLFSSL_KEIL
  68835. "muls r6, r5, r6\n\t"
  68836. #elif defined(__clang__)
  68837. "muls r6, r5\n\t"
  68838. #else
  68839. "mul r6, r5\n\t"
  68840. #endif
  68841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68842. "adds r3, r3, r6\n\t"
  68843. #else
  68844. "add r3, r3, r6\n\t"
  68845. #endif
  68846. #ifdef WOLFSSL_KEIL
  68847. "adcs r4, r4, %[r]\n\t"
  68848. #elif defined(__clang__)
  68849. "adcs r4, %[r]\n\t"
  68850. #else
  68851. "adc r4, %[r]\n\t"
  68852. #endif
  68853. #ifdef WOLFSSL_KEIL
  68854. "adcs r2, r2, %[r]\n\t"
  68855. #elif defined(__clang__)
  68856. "adcs r2, %[r]\n\t"
  68857. #else
  68858. "adc r2, %[r]\n\t"
  68859. #endif
  68860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68861. "adds r3, r3, r6\n\t"
  68862. #else
  68863. "add r3, r3, r6\n\t"
  68864. #endif
  68865. #ifdef WOLFSSL_KEIL
  68866. "adcs r4, r4, %[r]\n\t"
  68867. #elif defined(__clang__)
  68868. "adcs r4, %[r]\n\t"
  68869. #else
  68870. "adc r4, %[r]\n\t"
  68871. #endif
  68872. #ifdef WOLFSSL_KEIL
  68873. "adcs r2, r2, %[r]\n\t"
  68874. #elif defined(__clang__)
  68875. "adcs r2, %[r]\n\t"
  68876. #else
  68877. "adc r2, %[r]\n\t"
  68878. #endif
  68879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68880. "lsrs r6, r7, #16\n\t"
  68881. #else
  68882. "lsr r6, r7, #16\n\t"
  68883. #endif
  68884. #ifdef WOLFSSL_KEIL
  68885. "muls r5, r6, r5\n\t"
  68886. #elif defined(__clang__)
  68887. "muls r5, r6\n\t"
  68888. #else
  68889. "mul r5, r6\n\t"
  68890. #endif
  68891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68892. "lsrs r6, r5, #16\n\t"
  68893. #else
  68894. "lsr r6, r5, #16\n\t"
  68895. #endif
  68896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68897. "lsls r5, r5, #16\n\t"
  68898. #else
  68899. "lsl r5, r5, #16\n\t"
  68900. #endif
  68901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68902. "adds r3, r3, r5\n\t"
  68903. #else
  68904. "add r3, r3, r5\n\t"
  68905. #endif
  68906. #ifdef WOLFSSL_KEIL
  68907. "adcs r4, r4, r6\n\t"
  68908. #elif defined(__clang__)
  68909. "adcs r4, r6\n\t"
  68910. #else
  68911. "adc r4, r6\n\t"
  68912. #endif
  68913. #ifdef WOLFSSL_KEIL
  68914. "adcs r2, r2, %[r]\n\t"
  68915. #elif defined(__clang__)
  68916. "adcs r2, %[r]\n\t"
  68917. #else
  68918. "adc r2, %[r]\n\t"
  68919. #endif
  68920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68921. "adds r3, r3, r5\n\t"
  68922. #else
  68923. "add r3, r3, r5\n\t"
  68924. #endif
  68925. #ifdef WOLFSSL_KEIL
  68926. "adcs r4, r4, r6\n\t"
  68927. #elif defined(__clang__)
  68928. "adcs r4, r6\n\t"
  68929. #else
  68930. "adc r4, r6\n\t"
  68931. #endif
  68932. #ifdef WOLFSSL_KEIL
  68933. "adcs r2, r2, %[r]\n\t"
  68934. #elif defined(__clang__)
  68935. "adcs r2, %[r]\n\t"
  68936. #else
  68937. "adc r2, %[r]\n\t"
  68938. #endif
  68939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68940. "lsrs r5, %[a], #16\n\t"
  68941. #else
  68942. "lsr r5, %[a], #16\n\t"
  68943. #endif
  68944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68945. "lsrs r6, r7, #16\n\t"
  68946. #else
  68947. "lsr r6, r7, #16\n\t"
  68948. #endif
  68949. #ifdef WOLFSSL_KEIL
  68950. "muls r6, r5, r6\n\t"
  68951. #elif defined(__clang__)
  68952. "muls r6, r5\n\t"
  68953. #else
  68954. "mul r6, r5\n\t"
  68955. #endif
  68956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68957. "adds r4, r4, r6\n\t"
  68958. #else
  68959. "add r4, r4, r6\n\t"
  68960. #endif
  68961. #ifdef WOLFSSL_KEIL
  68962. "adcs r2, r2, %[r]\n\t"
  68963. #elif defined(__clang__)
  68964. "adcs r2, %[r]\n\t"
  68965. #else
  68966. "adc r2, %[r]\n\t"
  68967. #endif
  68968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68969. "adds r4, r4, r6\n\t"
  68970. #else
  68971. "add r4, r4, r6\n\t"
  68972. #endif
  68973. #ifdef WOLFSSL_KEIL
  68974. "adcs r2, r2, %[r]\n\t"
  68975. #elif defined(__clang__)
  68976. "adcs r2, %[r]\n\t"
  68977. #else
  68978. "adc r2, %[r]\n\t"
  68979. #endif
  68980. "uxth r6, r7\n\t"
  68981. #ifdef WOLFSSL_KEIL
  68982. "muls r5, r6, r5\n\t"
  68983. #elif defined(__clang__)
  68984. "muls r5, r6\n\t"
  68985. #else
  68986. "mul r5, r6\n\t"
  68987. #endif
  68988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68989. "lsrs r6, r5, #16\n\t"
  68990. #else
  68991. "lsr r6, r5, #16\n\t"
  68992. #endif
  68993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68994. "lsls r5, r5, #16\n\t"
  68995. #else
  68996. "lsl r5, r5, #16\n\t"
  68997. #endif
  68998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  68999. "adds r3, r3, r5\n\t"
  69000. #else
  69001. "add r3, r3, r5\n\t"
  69002. #endif
  69003. #ifdef WOLFSSL_KEIL
  69004. "adcs r4, r4, r6\n\t"
  69005. #elif defined(__clang__)
  69006. "adcs r4, r6\n\t"
  69007. #else
  69008. "adc r4, r6\n\t"
  69009. #endif
  69010. #ifdef WOLFSSL_KEIL
  69011. "adcs r2, r2, %[r]\n\t"
  69012. #elif defined(__clang__)
  69013. "adcs r2, %[r]\n\t"
  69014. #else
  69015. "adc r2, %[r]\n\t"
  69016. #endif
  69017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69018. "adds r3, r3, r5\n\t"
  69019. #else
  69020. "add r3, r3, r5\n\t"
  69021. #endif
  69022. #ifdef WOLFSSL_KEIL
  69023. "adcs r4, r4, r6\n\t"
  69024. #elif defined(__clang__)
  69025. "adcs r4, r6\n\t"
  69026. #else
  69027. "adc r4, r6\n\t"
  69028. #endif
  69029. #ifdef WOLFSSL_KEIL
  69030. "adcs r2, r2, %[r]\n\t"
  69031. #elif defined(__clang__)
  69032. "adcs r2, %[r]\n\t"
  69033. #else
  69034. "adc r2, %[r]\n\t"
  69035. #endif
  69036. "# A[11] * A[8]\n\t"
  69037. "mov %[a], r9\n\t"
  69038. "mov r7, r10\n\t"
  69039. "mov %[a], lr\n\t"
  69040. "uxth r5, %[a]\n\t"
  69041. "uxth r6, r7\n\t"
  69042. #ifdef WOLFSSL_KEIL
  69043. "muls r6, r5, r6\n\t"
  69044. #elif defined(__clang__)
  69045. "muls r6, r5\n\t"
  69046. #else
  69047. "mul r6, r5\n\t"
  69048. #endif
  69049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69050. "adds r3, r3, r6\n\t"
  69051. #else
  69052. "add r3, r3, r6\n\t"
  69053. #endif
  69054. #ifdef WOLFSSL_KEIL
  69055. "adcs r4, r4, %[r]\n\t"
  69056. #elif defined(__clang__)
  69057. "adcs r4, %[r]\n\t"
  69058. #else
  69059. "adc r4, %[r]\n\t"
  69060. #endif
  69061. #ifdef WOLFSSL_KEIL
  69062. "adcs r2, r2, %[r]\n\t"
  69063. #elif defined(__clang__)
  69064. "adcs r2, %[r]\n\t"
  69065. #else
  69066. "adc r2, %[r]\n\t"
  69067. #endif
  69068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69069. "adds r3, r3, r6\n\t"
  69070. #else
  69071. "add r3, r3, r6\n\t"
  69072. #endif
  69073. #ifdef WOLFSSL_KEIL
  69074. "adcs r4, r4, %[r]\n\t"
  69075. #elif defined(__clang__)
  69076. "adcs r4, %[r]\n\t"
  69077. #else
  69078. "adc r4, %[r]\n\t"
  69079. #endif
  69080. #ifdef WOLFSSL_KEIL
  69081. "adcs r2, r2, %[r]\n\t"
  69082. #elif defined(__clang__)
  69083. "adcs r2, %[r]\n\t"
  69084. #else
  69085. "adc r2, %[r]\n\t"
  69086. #endif
  69087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69088. "lsrs r6, r7, #16\n\t"
  69089. #else
  69090. "lsr r6, r7, #16\n\t"
  69091. #endif
  69092. #ifdef WOLFSSL_KEIL
  69093. "muls r5, r6, r5\n\t"
  69094. #elif defined(__clang__)
  69095. "muls r5, r6\n\t"
  69096. #else
  69097. "mul r5, r6\n\t"
  69098. #endif
  69099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69100. "lsrs r6, r5, #16\n\t"
  69101. #else
  69102. "lsr r6, r5, #16\n\t"
  69103. #endif
  69104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69105. "lsls r5, r5, #16\n\t"
  69106. #else
  69107. "lsl r5, r5, #16\n\t"
  69108. #endif
  69109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69110. "adds r3, r3, r5\n\t"
  69111. #else
  69112. "add r3, r3, r5\n\t"
  69113. #endif
  69114. #ifdef WOLFSSL_KEIL
  69115. "adcs r4, r4, r6\n\t"
  69116. #elif defined(__clang__)
  69117. "adcs r4, r6\n\t"
  69118. #else
  69119. "adc r4, r6\n\t"
  69120. #endif
  69121. #ifdef WOLFSSL_KEIL
  69122. "adcs r2, r2, %[r]\n\t"
  69123. #elif defined(__clang__)
  69124. "adcs r2, %[r]\n\t"
  69125. #else
  69126. "adc r2, %[r]\n\t"
  69127. #endif
  69128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69129. "adds r3, r3, r5\n\t"
  69130. #else
  69131. "add r3, r3, r5\n\t"
  69132. #endif
  69133. #ifdef WOLFSSL_KEIL
  69134. "adcs r4, r4, r6\n\t"
  69135. #elif defined(__clang__)
  69136. "adcs r4, r6\n\t"
  69137. #else
  69138. "adc r4, r6\n\t"
  69139. #endif
  69140. #ifdef WOLFSSL_KEIL
  69141. "adcs r2, r2, %[r]\n\t"
  69142. #elif defined(__clang__)
  69143. "adcs r2, %[r]\n\t"
  69144. #else
  69145. "adc r2, %[r]\n\t"
  69146. #endif
  69147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69148. "lsrs r5, %[a], #16\n\t"
  69149. #else
  69150. "lsr r5, %[a], #16\n\t"
  69151. #endif
  69152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69153. "lsrs r6, r7, #16\n\t"
  69154. #else
  69155. "lsr r6, r7, #16\n\t"
  69156. #endif
  69157. #ifdef WOLFSSL_KEIL
  69158. "muls r6, r5, r6\n\t"
  69159. #elif defined(__clang__)
  69160. "muls r6, r5\n\t"
  69161. #else
  69162. "mul r6, r5\n\t"
  69163. #endif
  69164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69165. "adds r4, r4, r6\n\t"
  69166. #else
  69167. "add r4, r4, r6\n\t"
  69168. #endif
  69169. #ifdef WOLFSSL_KEIL
  69170. "adcs r2, r2, %[r]\n\t"
  69171. #elif defined(__clang__)
  69172. "adcs r2, %[r]\n\t"
  69173. #else
  69174. "adc r2, %[r]\n\t"
  69175. #endif
  69176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69177. "adds r4, r4, r6\n\t"
  69178. #else
  69179. "add r4, r4, r6\n\t"
  69180. #endif
  69181. #ifdef WOLFSSL_KEIL
  69182. "adcs r2, r2, %[r]\n\t"
  69183. #elif defined(__clang__)
  69184. "adcs r2, %[r]\n\t"
  69185. #else
  69186. "adc r2, %[r]\n\t"
  69187. #endif
  69188. "uxth r6, r7\n\t"
  69189. #ifdef WOLFSSL_KEIL
  69190. "muls r5, r6, r5\n\t"
  69191. #elif defined(__clang__)
  69192. "muls r5, r6\n\t"
  69193. #else
  69194. "mul r5, r6\n\t"
  69195. #endif
  69196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69197. "lsrs r6, r5, #16\n\t"
  69198. #else
  69199. "lsr r6, r5, #16\n\t"
  69200. #endif
  69201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69202. "lsls r5, r5, #16\n\t"
  69203. #else
  69204. "lsl r5, r5, #16\n\t"
  69205. #endif
  69206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69207. "adds r3, r3, r5\n\t"
  69208. #else
  69209. "add r3, r3, r5\n\t"
  69210. #endif
  69211. #ifdef WOLFSSL_KEIL
  69212. "adcs r4, r4, r6\n\t"
  69213. #elif defined(__clang__)
  69214. "adcs r4, r6\n\t"
  69215. #else
  69216. "adc r4, r6\n\t"
  69217. #endif
  69218. #ifdef WOLFSSL_KEIL
  69219. "adcs r2, r2, %[r]\n\t"
  69220. #elif defined(__clang__)
  69221. "adcs r2, %[r]\n\t"
  69222. #else
  69223. "adc r2, %[r]\n\t"
  69224. #endif
  69225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69226. "adds r3, r3, r5\n\t"
  69227. #else
  69228. "add r3, r3, r5\n\t"
  69229. #endif
  69230. #ifdef WOLFSSL_KEIL
  69231. "adcs r4, r4, r6\n\t"
  69232. #elif defined(__clang__)
  69233. "adcs r4, r6\n\t"
  69234. #else
  69235. "adc r4, r6\n\t"
  69236. #endif
  69237. #ifdef WOLFSSL_KEIL
  69238. "adcs r2, r2, %[r]\n\t"
  69239. #elif defined(__clang__)
  69240. "adcs r2, %[r]\n\t"
  69241. #else
  69242. "adc r2, %[r]\n\t"
  69243. #endif
  69244. "mov %[r], r8\n\t"
  69245. "str r3, [%[r], #76]\n\t"
  69246. "movs %[r], #0\n\t"
  69247. "# A[11] * A[9]\n\t"
  69248. "movs r3, #0\n\t"
  69249. "mov %[a], r9\n\t"
  69250. "mov r7, r11\n\t"
  69251. "mov %[a], lr\n\t"
  69252. "uxth r5, %[a]\n\t"
  69253. "uxth r6, r7\n\t"
  69254. #ifdef WOLFSSL_KEIL
  69255. "muls r6, r5, r6\n\t"
  69256. #elif defined(__clang__)
  69257. "muls r6, r5\n\t"
  69258. #else
  69259. "mul r6, r5\n\t"
  69260. #endif
  69261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69262. "adds r4, r4, r6\n\t"
  69263. #else
  69264. "add r4, r4, r6\n\t"
  69265. #endif
  69266. #ifdef WOLFSSL_KEIL
  69267. "adcs r2, r2, %[r]\n\t"
  69268. #elif defined(__clang__)
  69269. "adcs r2, %[r]\n\t"
  69270. #else
  69271. "adc r2, %[r]\n\t"
  69272. #endif
  69273. #ifdef WOLFSSL_KEIL
  69274. "adcs r3, r3, %[r]\n\t"
  69275. #elif defined(__clang__)
  69276. "adcs r3, %[r]\n\t"
  69277. #else
  69278. "adc r3, %[r]\n\t"
  69279. #endif
  69280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69281. "adds r4, r4, r6\n\t"
  69282. #else
  69283. "add r4, r4, r6\n\t"
  69284. #endif
  69285. #ifdef WOLFSSL_KEIL
  69286. "adcs r2, r2, %[r]\n\t"
  69287. #elif defined(__clang__)
  69288. "adcs r2, %[r]\n\t"
  69289. #else
  69290. "adc r2, %[r]\n\t"
  69291. #endif
  69292. #ifdef WOLFSSL_KEIL
  69293. "adcs r3, r3, %[r]\n\t"
  69294. #elif defined(__clang__)
  69295. "adcs r3, %[r]\n\t"
  69296. #else
  69297. "adc r3, %[r]\n\t"
  69298. #endif
  69299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69300. "lsrs r6, r7, #16\n\t"
  69301. #else
  69302. "lsr r6, r7, #16\n\t"
  69303. #endif
  69304. #ifdef WOLFSSL_KEIL
  69305. "muls r5, r6, r5\n\t"
  69306. #elif defined(__clang__)
  69307. "muls r5, r6\n\t"
  69308. #else
  69309. "mul r5, r6\n\t"
  69310. #endif
  69311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69312. "lsrs r6, r5, #16\n\t"
  69313. #else
  69314. "lsr r6, r5, #16\n\t"
  69315. #endif
  69316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69317. "lsls r5, r5, #16\n\t"
  69318. #else
  69319. "lsl r5, r5, #16\n\t"
  69320. #endif
  69321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69322. "adds r4, r4, r5\n\t"
  69323. #else
  69324. "add r4, r4, r5\n\t"
  69325. #endif
  69326. #ifdef WOLFSSL_KEIL
  69327. "adcs r2, r2, r6\n\t"
  69328. #elif defined(__clang__)
  69329. "adcs r2, r6\n\t"
  69330. #else
  69331. "adc r2, r6\n\t"
  69332. #endif
  69333. #ifdef WOLFSSL_KEIL
  69334. "adcs r3, r3, %[r]\n\t"
  69335. #elif defined(__clang__)
  69336. "adcs r3, %[r]\n\t"
  69337. #else
  69338. "adc r3, %[r]\n\t"
  69339. #endif
  69340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69341. "adds r4, r4, r5\n\t"
  69342. #else
  69343. "add r4, r4, r5\n\t"
  69344. #endif
  69345. #ifdef WOLFSSL_KEIL
  69346. "adcs r2, r2, r6\n\t"
  69347. #elif defined(__clang__)
  69348. "adcs r2, r6\n\t"
  69349. #else
  69350. "adc r2, r6\n\t"
  69351. #endif
  69352. #ifdef WOLFSSL_KEIL
  69353. "adcs r3, r3, %[r]\n\t"
  69354. #elif defined(__clang__)
  69355. "adcs r3, %[r]\n\t"
  69356. #else
  69357. "adc r3, %[r]\n\t"
  69358. #endif
  69359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69360. "lsrs r5, %[a], #16\n\t"
  69361. #else
  69362. "lsr r5, %[a], #16\n\t"
  69363. #endif
  69364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69365. "lsrs r6, r7, #16\n\t"
  69366. #else
  69367. "lsr r6, r7, #16\n\t"
  69368. #endif
  69369. #ifdef WOLFSSL_KEIL
  69370. "muls r6, r5, r6\n\t"
  69371. #elif defined(__clang__)
  69372. "muls r6, r5\n\t"
  69373. #else
  69374. "mul r6, r5\n\t"
  69375. #endif
  69376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69377. "adds r2, r2, r6\n\t"
  69378. #else
  69379. "add r2, r2, r6\n\t"
  69380. #endif
  69381. #ifdef WOLFSSL_KEIL
  69382. "adcs r3, r3, %[r]\n\t"
  69383. #elif defined(__clang__)
  69384. "adcs r3, %[r]\n\t"
  69385. #else
  69386. "adc r3, %[r]\n\t"
  69387. #endif
  69388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69389. "adds r2, r2, r6\n\t"
  69390. #else
  69391. "add r2, r2, r6\n\t"
  69392. #endif
  69393. #ifdef WOLFSSL_KEIL
  69394. "adcs r3, r3, %[r]\n\t"
  69395. #elif defined(__clang__)
  69396. "adcs r3, %[r]\n\t"
  69397. #else
  69398. "adc r3, %[r]\n\t"
  69399. #endif
  69400. "uxth r6, r7\n\t"
  69401. #ifdef WOLFSSL_KEIL
  69402. "muls r5, r6, r5\n\t"
  69403. #elif defined(__clang__)
  69404. "muls r5, r6\n\t"
  69405. #else
  69406. "mul r5, r6\n\t"
  69407. #endif
  69408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69409. "lsrs r6, r5, #16\n\t"
  69410. #else
  69411. "lsr r6, r5, #16\n\t"
  69412. #endif
  69413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69414. "lsls r5, r5, #16\n\t"
  69415. #else
  69416. "lsl r5, r5, #16\n\t"
  69417. #endif
  69418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69419. "adds r4, r4, r5\n\t"
  69420. #else
  69421. "add r4, r4, r5\n\t"
  69422. #endif
  69423. #ifdef WOLFSSL_KEIL
  69424. "adcs r2, r2, r6\n\t"
  69425. #elif defined(__clang__)
  69426. "adcs r2, r6\n\t"
  69427. #else
  69428. "adc r2, r6\n\t"
  69429. #endif
  69430. #ifdef WOLFSSL_KEIL
  69431. "adcs r3, r3, %[r]\n\t"
  69432. #elif defined(__clang__)
  69433. "adcs r3, %[r]\n\t"
  69434. #else
  69435. "adc r3, %[r]\n\t"
  69436. #endif
  69437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69438. "adds r4, r4, r5\n\t"
  69439. #else
  69440. "add r4, r4, r5\n\t"
  69441. #endif
  69442. #ifdef WOLFSSL_KEIL
  69443. "adcs r2, r2, r6\n\t"
  69444. #elif defined(__clang__)
  69445. "adcs r2, r6\n\t"
  69446. #else
  69447. "adc r2, r6\n\t"
  69448. #endif
  69449. #ifdef WOLFSSL_KEIL
  69450. "adcs r3, r3, %[r]\n\t"
  69451. #elif defined(__clang__)
  69452. "adcs r3, %[r]\n\t"
  69453. #else
  69454. "adc r3, %[r]\n\t"
  69455. #endif
  69456. "# A[10] * A[10]\n\t"
  69457. "mov r7, r12\n\t"
  69458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69459. "lsrs r6, r7, #16\n\t"
  69460. #else
  69461. "lsr r6, r7, #16\n\t"
  69462. #endif
  69463. "uxth r5, r7\n\t"
  69464. #ifdef WOLFSSL_KEIL
  69465. "muls r5, r5, r5\n\t"
  69466. #elif defined(__clang__)
  69467. "muls r5, r5\n\t"
  69468. #else
  69469. "mul r5, r5\n\t"
  69470. #endif
  69471. #ifdef WOLFSSL_KEIL
  69472. "muls r6, r6, r6\n\t"
  69473. #elif defined(__clang__)
  69474. "muls r6, r6\n\t"
  69475. #else
  69476. "mul r6, r6\n\t"
  69477. #endif
  69478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69479. "adds r4, r4, r5\n\t"
  69480. #else
  69481. "add r4, r4, r5\n\t"
  69482. #endif
  69483. #ifdef WOLFSSL_KEIL
  69484. "adcs r2, r2, r6\n\t"
  69485. #elif defined(__clang__)
  69486. "adcs r2, r6\n\t"
  69487. #else
  69488. "adc r2, r6\n\t"
  69489. #endif
  69490. #ifdef WOLFSSL_KEIL
  69491. "adcs r3, r3, %[r]\n\t"
  69492. #elif defined(__clang__)
  69493. "adcs r3, %[r]\n\t"
  69494. #else
  69495. "adc r3, %[r]\n\t"
  69496. #endif
  69497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69498. "lsrs r6, r7, #16\n\t"
  69499. #else
  69500. "lsr r6, r7, #16\n\t"
  69501. #endif
  69502. "uxth r5, r7\n\t"
  69503. #ifdef WOLFSSL_KEIL
  69504. "muls r5, r6, r5\n\t"
  69505. #elif defined(__clang__)
  69506. "muls r5, r6\n\t"
  69507. #else
  69508. "mul r5, r6\n\t"
  69509. #endif
  69510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69511. "lsrs r6, r5, #15\n\t"
  69512. #else
  69513. "lsr r6, r5, #15\n\t"
  69514. #endif
  69515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69516. "lsls r5, r5, #17\n\t"
  69517. #else
  69518. "lsl r5, r5, #17\n\t"
  69519. #endif
  69520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69521. "adds r4, r4, r5\n\t"
  69522. #else
  69523. "add r4, r4, r5\n\t"
  69524. #endif
  69525. #ifdef WOLFSSL_KEIL
  69526. "adcs r2, r2, r6\n\t"
  69527. #elif defined(__clang__)
  69528. "adcs r2, r6\n\t"
  69529. #else
  69530. "adc r2, r6\n\t"
  69531. #endif
  69532. #ifdef WOLFSSL_KEIL
  69533. "adcs r3, r3, %[r]\n\t"
  69534. #elif defined(__clang__)
  69535. "adcs r3, %[r]\n\t"
  69536. #else
  69537. "adc r3, %[r]\n\t"
  69538. #endif
  69539. "mov %[r], r8\n\t"
  69540. "str r4, [%[r], #80]\n\t"
  69541. "movs %[r], #0\n\t"
  69542. "# A[11] * A[10]\n\t"
  69543. "movs r4, #0\n\t"
  69544. "mov %[a], r9\n\t"
  69545. "mov %[a], lr\n\t"
  69546. "uxth r5, %[a]\n\t"
  69547. "uxth r6, r7\n\t"
  69548. #ifdef WOLFSSL_KEIL
  69549. "muls r6, r5, r6\n\t"
  69550. #elif defined(__clang__)
  69551. "muls r6, r5\n\t"
  69552. #else
  69553. "mul r6, r5\n\t"
  69554. #endif
  69555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69556. "adds r2, r2, r6\n\t"
  69557. #else
  69558. "add r2, r2, r6\n\t"
  69559. #endif
  69560. #ifdef WOLFSSL_KEIL
  69561. "adcs r3, r3, %[r]\n\t"
  69562. #elif defined(__clang__)
  69563. "adcs r3, %[r]\n\t"
  69564. #else
  69565. "adc r3, %[r]\n\t"
  69566. #endif
  69567. #ifdef WOLFSSL_KEIL
  69568. "adcs r4, r4, %[r]\n\t"
  69569. #elif defined(__clang__)
  69570. "adcs r4, %[r]\n\t"
  69571. #else
  69572. "adc r4, %[r]\n\t"
  69573. #endif
  69574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69575. "adds r2, r2, r6\n\t"
  69576. #else
  69577. "add r2, r2, r6\n\t"
  69578. #endif
  69579. #ifdef WOLFSSL_KEIL
  69580. "adcs r3, r3, %[r]\n\t"
  69581. #elif defined(__clang__)
  69582. "adcs r3, %[r]\n\t"
  69583. #else
  69584. "adc r3, %[r]\n\t"
  69585. #endif
  69586. #ifdef WOLFSSL_KEIL
  69587. "adcs r4, r4, %[r]\n\t"
  69588. #elif defined(__clang__)
  69589. "adcs r4, %[r]\n\t"
  69590. #else
  69591. "adc r4, %[r]\n\t"
  69592. #endif
  69593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69594. "lsrs r6, r7, #16\n\t"
  69595. #else
  69596. "lsr r6, r7, #16\n\t"
  69597. #endif
  69598. #ifdef WOLFSSL_KEIL
  69599. "muls r5, r6, r5\n\t"
  69600. #elif defined(__clang__)
  69601. "muls r5, r6\n\t"
  69602. #else
  69603. "mul r5, r6\n\t"
  69604. #endif
  69605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69606. "lsrs r6, r5, #16\n\t"
  69607. #else
  69608. "lsr r6, r5, #16\n\t"
  69609. #endif
  69610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69611. "lsls r5, r5, #16\n\t"
  69612. #else
  69613. "lsl r5, r5, #16\n\t"
  69614. #endif
  69615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69616. "adds r2, r2, r5\n\t"
  69617. #else
  69618. "add r2, r2, r5\n\t"
  69619. #endif
  69620. #ifdef WOLFSSL_KEIL
  69621. "adcs r3, r3, r6\n\t"
  69622. #elif defined(__clang__)
  69623. "adcs r3, r6\n\t"
  69624. #else
  69625. "adc r3, r6\n\t"
  69626. #endif
  69627. #ifdef WOLFSSL_KEIL
  69628. "adcs r4, r4, %[r]\n\t"
  69629. #elif defined(__clang__)
  69630. "adcs r4, %[r]\n\t"
  69631. #else
  69632. "adc r4, %[r]\n\t"
  69633. #endif
  69634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69635. "adds r2, r2, r5\n\t"
  69636. #else
  69637. "add r2, r2, r5\n\t"
  69638. #endif
  69639. #ifdef WOLFSSL_KEIL
  69640. "adcs r3, r3, r6\n\t"
  69641. #elif defined(__clang__)
  69642. "adcs r3, r6\n\t"
  69643. #else
  69644. "adc r3, r6\n\t"
  69645. #endif
  69646. #ifdef WOLFSSL_KEIL
  69647. "adcs r4, r4, %[r]\n\t"
  69648. #elif defined(__clang__)
  69649. "adcs r4, %[r]\n\t"
  69650. #else
  69651. "adc r4, %[r]\n\t"
  69652. #endif
  69653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69654. "lsrs r5, %[a], #16\n\t"
  69655. #else
  69656. "lsr r5, %[a], #16\n\t"
  69657. #endif
  69658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69659. "lsrs r6, r7, #16\n\t"
  69660. #else
  69661. "lsr r6, r7, #16\n\t"
  69662. #endif
  69663. #ifdef WOLFSSL_KEIL
  69664. "muls r6, r5, r6\n\t"
  69665. #elif defined(__clang__)
  69666. "muls r6, r5\n\t"
  69667. #else
  69668. "mul r6, r5\n\t"
  69669. #endif
  69670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69671. "adds r3, r3, r6\n\t"
  69672. #else
  69673. "add r3, r3, r6\n\t"
  69674. #endif
  69675. #ifdef WOLFSSL_KEIL
  69676. "adcs r4, r4, %[r]\n\t"
  69677. #elif defined(__clang__)
  69678. "adcs r4, %[r]\n\t"
  69679. #else
  69680. "adc r4, %[r]\n\t"
  69681. #endif
  69682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69683. "adds r3, r3, r6\n\t"
  69684. #else
  69685. "add r3, r3, r6\n\t"
  69686. #endif
  69687. #ifdef WOLFSSL_KEIL
  69688. "adcs r4, r4, %[r]\n\t"
  69689. #elif defined(__clang__)
  69690. "adcs r4, %[r]\n\t"
  69691. #else
  69692. "adc r4, %[r]\n\t"
  69693. #endif
  69694. "uxth r6, r7\n\t"
  69695. #ifdef WOLFSSL_KEIL
  69696. "muls r5, r6, r5\n\t"
  69697. #elif defined(__clang__)
  69698. "muls r5, r6\n\t"
  69699. #else
  69700. "mul r5, r6\n\t"
  69701. #endif
  69702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69703. "lsrs r6, r5, #16\n\t"
  69704. #else
  69705. "lsr r6, r5, #16\n\t"
  69706. #endif
  69707. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69708. "lsls r5, r5, #16\n\t"
  69709. #else
  69710. "lsl r5, r5, #16\n\t"
  69711. #endif
  69712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69713. "adds r2, r2, r5\n\t"
  69714. #else
  69715. "add r2, r2, r5\n\t"
  69716. #endif
  69717. #ifdef WOLFSSL_KEIL
  69718. "adcs r3, r3, r6\n\t"
  69719. #elif defined(__clang__)
  69720. "adcs r3, r6\n\t"
  69721. #else
  69722. "adc r3, r6\n\t"
  69723. #endif
  69724. #ifdef WOLFSSL_KEIL
  69725. "adcs r4, r4, %[r]\n\t"
  69726. #elif defined(__clang__)
  69727. "adcs r4, %[r]\n\t"
  69728. #else
  69729. "adc r4, %[r]\n\t"
  69730. #endif
  69731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69732. "adds r2, r2, r5\n\t"
  69733. #else
  69734. "add r2, r2, r5\n\t"
  69735. #endif
  69736. #ifdef WOLFSSL_KEIL
  69737. "adcs r3, r3, r6\n\t"
  69738. #elif defined(__clang__)
  69739. "adcs r3, r6\n\t"
  69740. #else
  69741. "adc r3, r6\n\t"
  69742. #endif
  69743. #ifdef WOLFSSL_KEIL
  69744. "adcs r4, r4, %[r]\n\t"
  69745. #elif defined(__clang__)
  69746. "adcs r4, %[r]\n\t"
  69747. #else
  69748. "adc r4, %[r]\n\t"
  69749. #endif
  69750. "mov %[r], r8\n\t"
  69751. "str r2, [%[r], #84]\n\t"
  69752. "movs %[r], #0\n\t"
  69753. "# A[11] * A[11]\n\t"
  69754. "mov %[a], r9\n\t"
  69755. "mov r7, lr\n\t"
  69756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69757. "lsrs r6, r7, #16\n\t"
  69758. #else
  69759. "lsr r6, r7, #16\n\t"
  69760. #endif
  69761. "uxth r5, r7\n\t"
  69762. #ifdef WOLFSSL_KEIL
  69763. "muls r5, r5, r5\n\t"
  69764. #elif defined(__clang__)
  69765. "muls r5, r5\n\t"
  69766. #else
  69767. "mul r5, r5\n\t"
  69768. #endif
  69769. #ifdef WOLFSSL_KEIL
  69770. "muls r6, r6, r6\n\t"
  69771. #elif defined(__clang__)
  69772. "muls r6, r6\n\t"
  69773. #else
  69774. "mul r6, r6\n\t"
  69775. #endif
  69776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69777. "adds r3, r3, r5\n\t"
  69778. #else
  69779. "add r3, r3, r5\n\t"
  69780. #endif
  69781. #ifdef WOLFSSL_KEIL
  69782. "adcs r4, r4, r6\n\t"
  69783. #elif defined(__clang__)
  69784. "adcs r4, r6\n\t"
  69785. #else
  69786. "adc r4, r6\n\t"
  69787. #endif
  69788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69789. "lsrs r6, r7, #16\n\t"
  69790. #else
  69791. "lsr r6, r7, #16\n\t"
  69792. #endif
  69793. "uxth r5, r7\n\t"
  69794. #ifdef WOLFSSL_KEIL
  69795. "muls r5, r6, r5\n\t"
  69796. #elif defined(__clang__)
  69797. "muls r5, r6\n\t"
  69798. #else
  69799. "mul r5, r6\n\t"
  69800. #endif
  69801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69802. "lsrs r6, r5, #15\n\t"
  69803. #else
  69804. "lsr r6, r5, #15\n\t"
  69805. #endif
  69806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69807. "lsls r5, r5, #17\n\t"
  69808. #else
  69809. "lsl r5, r5, #17\n\t"
  69810. #endif
  69811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69812. "adds r3, r3, r5\n\t"
  69813. #else
  69814. "add r3, r3, r5\n\t"
  69815. #endif
  69816. #ifdef WOLFSSL_KEIL
  69817. "adcs r4, r4, r6\n\t"
  69818. #elif defined(__clang__)
  69819. "adcs r4, r6\n\t"
  69820. #else
  69821. "adc r4, r6\n\t"
  69822. #endif
  69823. "mov %[r], r8\n\t"
  69824. "str r3, [%[r], #88]\n\t"
  69825. "str r4, [%[r], #92]\n\t"
  69826. "pop {r2, r3, r4, r5}\n\t"
  69827. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69828. "pop {r2, r3, r4, r5}\n\t"
  69829. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69830. "pop {r2, r3, r4, r5}\n\t"
  69831. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  69832. : [r] "+l" (r), [a] "+l" (a)
  69833. :
  69834. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  69835. );
  69836. }
  69837. #endif /* !WOLFSSL_SP_LARGE_CODE */
  69838. /* Sub b from a into r. (r = a - b)
  69839. *
  69840. * r A single precision integer.
  69841. * a A single precision integer.
  69842. * b A single precision integer.
  69843. */
  69844. SP_NOINLINE static sp_digit sp_3072_sub_12(sp_digit* r, const sp_digit* a,
  69845. const sp_digit* b)
  69846. {
  69847. __asm__ __volatile__ (
  69848. "ldm %[b]!, {r5, r6}\n\t"
  69849. "ldm %[a]!, {r3, r4}\n\t"
  69850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  69851. "subs r3, r3, r5\n\t"
  69852. #else
  69853. "sub r3, r3, r5\n\t"
  69854. #endif
  69855. #ifdef WOLFSSL_KEIL
  69856. "sbcs r4, r4, r6\n\t"
  69857. #elif defined(__clang__)
  69858. "sbcs r4, r6\n\t"
  69859. #else
  69860. "sbc r4, r6\n\t"
  69861. #endif
  69862. "stm %[r]!, {r3, r4}\n\t"
  69863. "ldm %[b]!, {r5, r6}\n\t"
  69864. "ldm %[a]!, {r3, r4}\n\t"
  69865. #ifdef WOLFSSL_KEIL
  69866. "sbcs r3, r3, r5\n\t"
  69867. #elif defined(__clang__)
  69868. "sbcs r3, r5\n\t"
  69869. #else
  69870. "sbc r3, r5\n\t"
  69871. #endif
  69872. #ifdef WOLFSSL_KEIL
  69873. "sbcs r4, r4, r6\n\t"
  69874. #elif defined(__clang__)
  69875. "sbcs r4, r6\n\t"
  69876. #else
  69877. "sbc r4, r6\n\t"
  69878. #endif
  69879. "stm %[r]!, {r3, r4}\n\t"
  69880. "ldm %[b]!, {r5, r6}\n\t"
  69881. "ldm %[a]!, {r3, r4}\n\t"
  69882. #ifdef WOLFSSL_KEIL
  69883. "sbcs r3, r3, r5\n\t"
  69884. #elif defined(__clang__)
  69885. "sbcs r3, r5\n\t"
  69886. #else
  69887. "sbc r3, r5\n\t"
  69888. #endif
  69889. #ifdef WOLFSSL_KEIL
  69890. "sbcs r4, r4, r6\n\t"
  69891. #elif defined(__clang__)
  69892. "sbcs r4, r6\n\t"
  69893. #else
  69894. "sbc r4, r6\n\t"
  69895. #endif
  69896. "stm %[r]!, {r3, r4}\n\t"
  69897. "ldm %[b]!, {r5, r6}\n\t"
  69898. "ldm %[a]!, {r3, r4}\n\t"
  69899. #ifdef WOLFSSL_KEIL
  69900. "sbcs r3, r3, r5\n\t"
  69901. #elif defined(__clang__)
  69902. "sbcs r3, r5\n\t"
  69903. #else
  69904. "sbc r3, r5\n\t"
  69905. #endif
  69906. #ifdef WOLFSSL_KEIL
  69907. "sbcs r4, r4, r6\n\t"
  69908. #elif defined(__clang__)
  69909. "sbcs r4, r6\n\t"
  69910. #else
  69911. "sbc r4, r6\n\t"
  69912. #endif
  69913. "stm %[r]!, {r3, r4}\n\t"
  69914. "ldm %[b]!, {r5, r6}\n\t"
  69915. "ldm %[a]!, {r3, r4}\n\t"
  69916. #ifdef WOLFSSL_KEIL
  69917. "sbcs r3, r3, r5\n\t"
  69918. #elif defined(__clang__)
  69919. "sbcs r3, r5\n\t"
  69920. #else
  69921. "sbc r3, r5\n\t"
  69922. #endif
  69923. #ifdef WOLFSSL_KEIL
  69924. "sbcs r4, r4, r6\n\t"
  69925. #elif defined(__clang__)
  69926. "sbcs r4, r6\n\t"
  69927. #else
  69928. "sbc r4, r6\n\t"
  69929. #endif
  69930. "stm %[r]!, {r3, r4}\n\t"
  69931. "ldm %[b]!, {r5, r6}\n\t"
  69932. "ldm %[a]!, {r3, r4}\n\t"
  69933. #ifdef WOLFSSL_KEIL
  69934. "sbcs r3, r3, r5\n\t"
  69935. #elif defined(__clang__)
  69936. "sbcs r3, r5\n\t"
  69937. #else
  69938. "sbc r3, r5\n\t"
  69939. #endif
  69940. #ifdef WOLFSSL_KEIL
  69941. "sbcs r4, r4, r6\n\t"
  69942. #elif defined(__clang__)
  69943. "sbcs r4, r6\n\t"
  69944. #else
  69945. "sbc r4, r6\n\t"
  69946. #endif
  69947. "stm %[r]!, {r3, r4}\n\t"
  69948. #ifdef WOLFSSL_KEIL
  69949. "sbcs %[r], %[r], %[r]\n\t"
  69950. #elif defined(__clang__)
  69951. "sbcs %[r], %[r]\n\t"
  69952. #else
  69953. "sbc %[r], %[r]\n\t"
  69954. #endif
  69955. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  69956. :
  69957. : "memory", "r3", "r4", "r5", "r6"
  69958. );
  69959. return (uint32_t)(size_t)r;
  69960. }
  69961. /* Square a and put result in r. (r = a * a)
  69962. *
  69963. * r A single precision integer.
  69964. * a A single precision integer.
  69965. */
  69966. SP_NOINLINE static void sp_3072_sqr_24(sp_digit* r, const sp_digit* a)
  69967. {
  69968. sp_digit* z0 = r;
  69969. sp_digit* z2 = r + 24;
  69970. sp_digit z1[24];
  69971. sp_digit* a1 = z1;
  69972. sp_digit* zero = z1 + 12;
  69973. sp_digit u;
  69974. sp_digit mask;
  69975. sp_digit* p1;
  69976. sp_digit* p2;
  69977. XMEMSET(zero, 0, sizeof(sp_digit) * 12);
  69978. mask = sp_3072_sub_12(a1, a, &a[12]);
  69979. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  69980. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  69981. (void)sp_3072_sub_12(a1, p1, p2);
  69982. sp_3072_sqr_12(z2, &a[12]);
  69983. sp_3072_sqr_12(z0, a);
  69984. sp_3072_sqr_12(z1, a1);
  69985. u = 0;
  69986. u -= sp_3072_sub_in_place_24(z1, z2);
  69987. u -= sp_3072_sub_in_place_24(z1, z0);
  69988. u += sp_3072_sub_in_place_24(r + 12, z1);
  69989. sp_3072_add_word_12(r + 36, r + 36, u);
  69990. }
  69991. /* Sub b from a into r. (r = a - b)
  69992. *
  69993. * r A single precision integer.
  69994. * a A single precision integer.
  69995. * b A single precision integer.
  69996. */
  69997. SP_NOINLINE static sp_digit sp_3072_sub_24(sp_digit* r, const sp_digit* a,
  69998. const sp_digit* b)
  69999. {
  70000. __asm__ __volatile__ (
  70001. "ldm %[b]!, {r5, r6}\n\t"
  70002. "ldm %[a]!, {r3, r4}\n\t"
  70003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70004. "subs r3, r3, r5\n\t"
  70005. #else
  70006. "sub r3, r3, r5\n\t"
  70007. #endif
  70008. #ifdef WOLFSSL_KEIL
  70009. "sbcs r4, r4, r6\n\t"
  70010. #elif defined(__clang__)
  70011. "sbcs r4, r6\n\t"
  70012. #else
  70013. "sbc r4, r6\n\t"
  70014. #endif
  70015. "stm %[r]!, {r3, r4}\n\t"
  70016. "ldm %[b]!, {r5, r6}\n\t"
  70017. "ldm %[a]!, {r3, r4}\n\t"
  70018. #ifdef WOLFSSL_KEIL
  70019. "sbcs r3, r3, r5\n\t"
  70020. #elif defined(__clang__)
  70021. "sbcs r3, r5\n\t"
  70022. #else
  70023. "sbc r3, r5\n\t"
  70024. #endif
  70025. #ifdef WOLFSSL_KEIL
  70026. "sbcs r4, r4, r6\n\t"
  70027. #elif defined(__clang__)
  70028. "sbcs r4, r6\n\t"
  70029. #else
  70030. "sbc r4, r6\n\t"
  70031. #endif
  70032. "stm %[r]!, {r3, r4}\n\t"
  70033. "ldm %[b]!, {r5, r6}\n\t"
  70034. "ldm %[a]!, {r3, r4}\n\t"
  70035. #ifdef WOLFSSL_KEIL
  70036. "sbcs r3, r3, r5\n\t"
  70037. #elif defined(__clang__)
  70038. "sbcs r3, r5\n\t"
  70039. #else
  70040. "sbc r3, r5\n\t"
  70041. #endif
  70042. #ifdef WOLFSSL_KEIL
  70043. "sbcs r4, r4, r6\n\t"
  70044. #elif defined(__clang__)
  70045. "sbcs r4, r6\n\t"
  70046. #else
  70047. "sbc r4, r6\n\t"
  70048. #endif
  70049. "stm %[r]!, {r3, r4}\n\t"
  70050. "ldm %[b]!, {r5, r6}\n\t"
  70051. "ldm %[a]!, {r3, r4}\n\t"
  70052. #ifdef WOLFSSL_KEIL
  70053. "sbcs r3, r3, r5\n\t"
  70054. #elif defined(__clang__)
  70055. "sbcs r3, r5\n\t"
  70056. #else
  70057. "sbc r3, r5\n\t"
  70058. #endif
  70059. #ifdef WOLFSSL_KEIL
  70060. "sbcs r4, r4, r6\n\t"
  70061. #elif defined(__clang__)
  70062. "sbcs r4, r6\n\t"
  70063. #else
  70064. "sbc r4, r6\n\t"
  70065. #endif
  70066. "stm %[r]!, {r3, r4}\n\t"
  70067. "ldm %[b]!, {r5, r6}\n\t"
  70068. "ldm %[a]!, {r3, r4}\n\t"
  70069. #ifdef WOLFSSL_KEIL
  70070. "sbcs r3, r3, r5\n\t"
  70071. #elif defined(__clang__)
  70072. "sbcs r3, r5\n\t"
  70073. #else
  70074. "sbc r3, r5\n\t"
  70075. #endif
  70076. #ifdef WOLFSSL_KEIL
  70077. "sbcs r4, r4, r6\n\t"
  70078. #elif defined(__clang__)
  70079. "sbcs r4, r6\n\t"
  70080. #else
  70081. "sbc r4, r6\n\t"
  70082. #endif
  70083. "stm %[r]!, {r3, r4}\n\t"
  70084. "ldm %[b]!, {r5, r6}\n\t"
  70085. "ldm %[a]!, {r3, r4}\n\t"
  70086. #ifdef WOLFSSL_KEIL
  70087. "sbcs r3, r3, r5\n\t"
  70088. #elif defined(__clang__)
  70089. "sbcs r3, r5\n\t"
  70090. #else
  70091. "sbc r3, r5\n\t"
  70092. #endif
  70093. #ifdef WOLFSSL_KEIL
  70094. "sbcs r4, r4, r6\n\t"
  70095. #elif defined(__clang__)
  70096. "sbcs r4, r6\n\t"
  70097. #else
  70098. "sbc r4, r6\n\t"
  70099. #endif
  70100. "stm %[r]!, {r3, r4}\n\t"
  70101. "ldm %[b]!, {r5, r6}\n\t"
  70102. "ldm %[a]!, {r3, r4}\n\t"
  70103. #ifdef WOLFSSL_KEIL
  70104. "sbcs r3, r3, r5\n\t"
  70105. #elif defined(__clang__)
  70106. "sbcs r3, r5\n\t"
  70107. #else
  70108. "sbc r3, r5\n\t"
  70109. #endif
  70110. #ifdef WOLFSSL_KEIL
  70111. "sbcs r4, r4, r6\n\t"
  70112. #elif defined(__clang__)
  70113. "sbcs r4, r6\n\t"
  70114. #else
  70115. "sbc r4, r6\n\t"
  70116. #endif
  70117. "stm %[r]!, {r3, r4}\n\t"
  70118. "ldm %[b]!, {r5, r6}\n\t"
  70119. "ldm %[a]!, {r3, r4}\n\t"
  70120. #ifdef WOLFSSL_KEIL
  70121. "sbcs r3, r3, r5\n\t"
  70122. #elif defined(__clang__)
  70123. "sbcs r3, r5\n\t"
  70124. #else
  70125. "sbc r3, r5\n\t"
  70126. #endif
  70127. #ifdef WOLFSSL_KEIL
  70128. "sbcs r4, r4, r6\n\t"
  70129. #elif defined(__clang__)
  70130. "sbcs r4, r6\n\t"
  70131. #else
  70132. "sbc r4, r6\n\t"
  70133. #endif
  70134. "stm %[r]!, {r3, r4}\n\t"
  70135. "ldm %[b]!, {r5, r6}\n\t"
  70136. "ldm %[a]!, {r3, r4}\n\t"
  70137. #ifdef WOLFSSL_KEIL
  70138. "sbcs r3, r3, r5\n\t"
  70139. #elif defined(__clang__)
  70140. "sbcs r3, r5\n\t"
  70141. #else
  70142. "sbc r3, r5\n\t"
  70143. #endif
  70144. #ifdef WOLFSSL_KEIL
  70145. "sbcs r4, r4, r6\n\t"
  70146. #elif defined(__clang__)
  70147. "sbcs r4, r6\n\t"
  70148. #else
  70149. "sbc r4, r6\n\t"
  70150. #endif
  70151. "stm %[r]!, {r3, r4}\n\t"
  70152. "ldm %[b]!, {r5, r6}\n\t"
  70153. "ldm %[a]!, {r3, r4}\n\t"
  70154. #ifdef WOLFSSL_KEIL
  70155. "sbcs r3, r3, r5\n\t"
  70156. #elif defined(__clang__)
  70157. "sbcs r3, r5\n\t"
  70158. #else
  70159. "sbc r3, r5\n\t"
  70160. #endif
  70161. #ifdef WOLFSSL_KEIL
  70162. "sbcs r4, r4, r6\n\t"
  70163. #elif defined(__clang__)
  70164. "sbcs r4, r6\n\t"
  70165. #else
  70166. "sbc r4, r6\n\t"
  70167. #endif
  70168. "stm %[r]!, {r3, r4}\n\t"
  70169. "ldm %[b]!, {r5, r6}\n\t"
  70170. "ldm %[a]!, {r3, r4}\n\t"
  70171. #ifdef WOLFSSL_KEIL
  70172. "sbcs r3, r3, r5\n\t"
  70173. #elif defined(__clang__)
  70174. "sbcs r3, r5\n\t"
  70175. #else
  70176. "sbc r3, r5\n\t"
  70177. #endif
  70178. #ifdef WOLFSSL_KEIL
  70179. "sbcs r4, r4, r6\n\t"
  70180. #elif defined(__clang__)
  70181. "sbcs r4, r6\n\t"
  70182. #else
  70183. "sbc r4, r6\n\t"
  70184. #endif
  70185. "stm %[r]!, {r3, r4}\n\t"
  70186. "ldm %[b]!, {r5, r6}\n\t"
  70187. "ldm %[a]!, {r3, r4}\n\t"
  70188. #ifdef WOLFSSL_KEIL
  70189. "sbcs r3, r3, r5\n\t"
  70190. #elif defined(__clang__)
  70191. "sbcs r3, r5\n\t"
  70192. #else
  70193. "sbc r3, r5\n\t"
  70194. #endif
  70195. #ifdef WOLFSSL_KEIL
  70196. "sbcs r4, r4, r6\n\t"
  70197. #elif defined(__clang__)
  70198. "sbcs r4, r6\n\t"
  70199. #else
  70200. "sbc r4, r6\n\t"
  70201. #endif
  70202. "stm %[r]!, {r3, r4}\n\t"
  70203. #ifdef WOLFSSL_KEIL
  70204. "sbcs %[r], %[r], %[r]\n\t"
  70205. #elif defined(__clang__)
  70206. "sbcs %[r], %[r]\n\t"
  70207. #else
  70208. "sbc %[r], %[r]\n\t"
  70209. #endif
  70210. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  70211. :
  70212. : "memory", "r3", "r4", "r5", "r6"
  70213. );
  70214. return (uint32_t)(size_t)r;
  70215. }
  70216. /* Square a and put result in r. (r = a * a)
  70217. *
  70218. * r A single precision integer.
  70219. * a A single precision integer.
  70220. */
  70221. SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
  70222. {
  70223. sp_digit* z0 = r;
  70224. sp_digit* z2 = r + 48;
  70225. sp_digit z1[48];
  70226. sp_digit* a1 = z1;
  70227. sp_digit* zero = z1 + 24;
  70228. sp_digit u;
  70229. sp_digit mask;
  70230. sp_digit* p1;
  70231. sp_digit* p2;
  70232. XMEMSET(zero, 0, sizeof(sp_digit) * 24);
  70233. mask = sp_3072_sub_24(a1, a, &a[24]);
  70234. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  70235. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  70236. (void)sp_3072_sub_24(a1, p1, p2);
  70237. sp_3072_sqr_24(z2, &a[24]);
  70238. sp_3072_sqr_24(z0, a);
  70239. sp_3072_sqr_24(z1, a1);
  70240. u = 0;
  70241. u -= sp_3072_sub_in_place_48(z1, z2);
  70242. u -= sp_3072_sub_in_place_48(z1, z0);
  70243. u += sp_3072_sub_in_place_48(r + 24, z1);
  70244. sp_3072_add_word_24(r + 72, r + 72, u);
  70245. }
  70246. /* Sub b from a into r. (r = a - b)
  70247. *
  70248. * r A single precision integer.
  70249. * a A single precision integer.
  70250. * b A single precision integer.
  70251. */
  70252. SP_NOINLINE static sp_digit sp_3072_sub_48(sp_digit* r, const sp_digit* a,
  70253. const sp_digit* b)
  70254. {
  70255. __asm__ __volatile__ (
  70256. "ldm %[b]!, {r5, r6}\n\t"
  70257. "ldm %[a]!, {r3, r4}\n\t"
  70258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70259. "subs r3, r3, r5\n\t"
  70260. #else
  70261. "sub r3, r3, r5\n\t"
  70262. #endif
  70263. #ifdef WOLFSSL_KEIL
  70264. "sbcs r4, r4, r6\n\t"
  70265. #elif defined(__clang__)
  70266. "sbcs r4, r6\n\t"
  70267. #else
  70268. "sbc r4, r6\n\t"
  70269. #endif
  70270. "stm %[r]!, {r3, r4}\n\t"
  70271. "ldm %[b]!, {r5, r6}\n\t"
  70272. "ldm %[a]!, {r3, r4}\n\t"
  70273. #ifdef WOLFSSL_KEIL
  70274. "sbcs r3, r3, r5\n\t"
  70275. #elif defined(__clang__)
  70276. "sbcs r3, r5\n\t"
  70277. #else
  70278. "sbc r3, r5\n\t"
  70279. #endif
  70280. #ifdef WOLFSSL_KEIL
  70281. "sbcs r4, r4, r6\n\t"
  70282. #elif defined(__clang__)
  70283. "sbcs r4, r6\n\t"
  70284. #else
  70285. "sbc r4, r6\n\t"
  70286. #endif
  70287. "stm %[r]!, {r3, r4}\n\t"
  70288. "ldm %[b]!, {r5, r6}\n\t"
  70289. "ldm %[a]!, {r3, r4}\n\t"
  70290. #ifdef WOLFSSL_KEIL
  70291. "sbcs r3, r3, r5\n\t"
  70292. #elif defined(__clang__)
  70293. "sbcs r3, r5\n\t"
  70294. #else
  70295. "sbc r3, r5\n\t"
  70296. #endif
  70297. #ifdef WOLFSSL_KEIL
  70298. "sbcs r4, r4, r6\n\t"
  70299. #elif defined(__clang__)
  70300. "sbcs r4, r6\n\t"
  70301. #else
  70302. "sbc r4, r6\n\t"
  70303. #endif
  70304. "stm %[r]!, {r3, r4}\n\t"
  70305. "ldm %[b]!, {r5, r6}\n\t"
  70306. "ldm %[a]!, {r3, r4}\n\t"
  70307. #ifdef WOLFSSL_KEIL
  70308. "sbcs r3, r3, r5\n\t"
  70309. #elif defined(__clang__)
  70310. "sbcs r3, r5\n\t"
  70311. #else
  70312. "sbc r3, r5\n\t"
  70313. #endif
  70314. #ifdef WOLFSSL_KEIL
  70315. "sbcs r4, r4, r6\n\t"
  70316. #elif defined(__clang__)
  70317. "sbcs r4, r6\n\t"
  70318. #else
  70319. "sbc r4, r6\n\t"
  70320. #endif
  70321. "stm %[r]!, {r3, r4}\n\t"
  70322. "ldm %[b]!, {r5, r6}\n\t"
  70323. "ldm %[a]!, {r3, r4}\n\t"
  70324. #ifdef WOLFSSL_KEIL
  70325. "sbcs r3, r3, r5\n\t"
  70326. #elif defined(__clang__)
  70327. "sbcs r3, r5\n\t"
  70328. #else
  70329. "sbc r3, r5\n\t"
  70330. #endif
  70331. #ifdef WOLFSSL_KEIL
  70332. "sbcs r4, r4, r6\n\t"
  70333. #elif defined(__clang__)
  70334. "sbcs r4, r6\n\t"
  70335. #else
  70336. "sbc r4, r6\n\t"
  70337. #endif
  70338. "stm %[r]!, {r3, r4}\n\t"
  70339. "ldm %[b]!, {r5, r6}\n\t"
  70340. "ldm %[a]!, {r3, r4}\n\t"
  70341. #ifdef WOLFSSL_KEIL
  70342. "sbcs r3, r3, r5\n\t"
  70343. #elif defined(__clang__)
  70344. "sbcs r3, r5\n\t"
  70345. #else
  70346. "sbc r3, r5\n\t"
  70347. #endif
  70348. #ifdef WOLFSSL_KEIL
  70349. "sbcs r4, r4, r6\n\t"
  70350. #elif defined(__clang__)
  70351. "sbcs r4, r6\n\t"
  70352. #else
  70353. "sbc r4, r6\n\t"
  70354. #endif
  70355. "stm %[r]!, {r3, r4}\n\t"
  70356. "ldm %[b]!, {r5, r6}\n\t"
  70357. "ldm %[a]!, {r3, r4}\n\t"
  70358. #ifdef WOLFSSL_KEIL
  70359. "sbcs r3, r3, r5\n\t"
  70360. #elif defined(__clang__)
  70361. "sbcs r3, r5\n\t"
  70362. #else
  70363. "sbc r3, r5\n\t"
  70364. #endif
  70365. #ifdef WOLFSSL_KEIL
  70366. "sbcs r4, r4, r6\n\t"
  70367. #elif defined(__clang__)
  70368. "sbcs r4, r6\n\t"
  70369. #else
  70370. "sbc r4, r6\n\t"
  70371. #endif
  70372. "stm %[r]!, {r3, r4}\n\t"
  70373. "ldm %[b]!, {r5, r6}\n\t"
  70374. "ldm %[a]!, {r3, r4}\n\t"
  70375. #ifdef WOLFSSL_KEIL
  70376. "sbcs r3, r3, r5\n\t"
  70377. #elif defined(__clang__)
  70378. "sbcs r3, r5\n\t"
  70379. #else
  70380. "sbc r3, r5\n\t"
  70381. #endif
  70382. #ifdef WOLFSSL_KEIL
  70383. "sbcs r4, r4, r6\n\t"
  70384. #elif defined(__clang__)
  70385. "sbcs r4, r6\n\t"
  70386. #else
  70387. "sbc r4, r6\n\t"
  70388. #endif
  70389. "stm %[r]!, {r3, r4}\n\t"
  70390. "ldm %[b]!, {r5, r6}\n\t"
  70391. "ldm %[a]!, {r3, r4}\n\t"
  70392. #ifdef WOLFSSL_KEIL
  70393. "sbcs r3, r3, r5\n\t"
  70394. #elif defined(__clang__)
  70395. "sbcs r3, r5\n\t"
  70396. #else
  70397. "sbc r3, r5\n\t"
  70398. #endif
  70399. #ifdef WOLFSSL_KEIL
  70400. "sbcs r4, r4, r6\n\t"
  70401. #elif defined(__clang__)
  70402. "sbcs r4, r6\n\t"
  70403. #else
  70404. "sbc r4, r6\n\t"
  70405. #endif
  70406. "stm %[r]!, {r3, r4}\n\t"
  70407. "ldm %[b]!, {r5, r6}\n\t"
  70408. "ldm %[a]!, {r3, r4}\n\t"
  70409. #ifdef WOLFSSL_KEIL
  70410. "sbcs r3, r3, r5\n\t"
  70411. #elif defined(__clang__)
  70412. "sbcs r3, r5\n\t"
  70413. #else
  70414. "sbc r3, r5\n\t"
  70415. #endif
  70416. #ifdef WOLFSSL_KEIL
  70417. "sbcs r4, r4, r6\n\t"
  70418. #elif defined(__clang__)
  70419. "sbcs r4, r6\n\t"
  70420. #else
  70421. "sbc r4, r6\n\t"
  70422. #endif
  70423. "stm %[r]!, {r3, r4}\n\t"
  70424. "ldm %[b]!, {r5, r6}\n\t"
  70425. "ldm %[a]!, {r3, r4}\n\t"
  70426. #ifdef WOLFSSL_KEIL
  70427. "sbcs r3, r3, r5\n\t"
  70428. #elif defined(__clang__)
  70429. "sbcs r3, r5\n\t"
  70430. #else
  70431. "sbc r3, r5\n\t"
  70432. #endif
  70433. #ifdef WOLFSSL_KEIL
  70434. "sbcs r4, r4, r6\n\t"
  70435. #elif defined(__clang__)
  70436. "sbcs r4, r6\n\t"
  70437. #else
  70438. "sbc r4, r6\n\t"
  70439. #endif
  70440. "stm %[r]!, {r3, r4}\n\t"
  70441. "ldm %[b]!, {r5, r6}\n\t"
  70442. "ldm %[a]!, {r3, r4}\n\t"
  70443. #ifdef WOLFSSL_KEIL
  70444. "sbcs r3, r3, r5\n\t"
  70445. #elif defined(__clang__)
  70446. "sbcs r3, r5\n\t"
  70447. #else
  70448. "sbc r3, r5\n\t"
  70449. #endif
  70450. #ifdef WOLFSSL_KEIL
  70451. "sbcs r4, r4, r6\n\t"
  70452. #elif defined(__clang__)
  70453. "sbcs r4, r6\n\t"
  70454. #else
  70455. "sbc r4, r6\n\t"
  70456. #endif
  70457. "stm %[r]!, {r3, r4}\n\t"
  70458. "ldm %[b]!, {r5, r6}\n\t"
  70459. "ldm %[a]!, {r3, r4}\n\t"
  70460. #ifdef WOLFSSL_KEIL
  70461. "sbcs r3, r3, r5\n\t"
  70462. #elif defined(__clang__)
  70463. "sbcs r3, r5\n\t"
  70464. #else
  70465. "sbc r3, r5\n\t"
  70466. #endif
  70467. #ifdef WOLFSSL_KEIL
  70468. "sbcs r4, r4, r6\n\t"
  70469. #elif defined(__clang__)
  70470. "sbcs r4, r6\n\t"
  70471. #else
  70472. "sbc r4, r6\n\t"
  70473. #endif
  70474. "stm %[r]!, {r3, r4}\n\t"
  70475. "ldm %[b]!, {r5, r6}\n\t"
  70476. "ldm %[a]!, {r3, r4}\n\t"
  70477. #ifdef WOLFSSL_KEIL
  70478. "sbcs r3, r3, r5\n\t"
  70479. #elif defined(__clang__)
  70480. "sbcs r3, r5\n\t"
  70481. #else
  70482. "sbc r3, r5\n\t"
  70483. #endif
  70484. #ifdef WOLFSSL_KEIL
  70485. "sbcs r4, r4, r6\n\t"
  70486. #elif defined(__clang__)
  70487. "sbcs r4, r6\n\t"
  70488. #else
  70489. "sbc r4, r6\n\t"
  70490. #endif
  70491. "stm %[r]!, {r3, r4}\n\t"
  70492. "ldm %[b]!, {r5, r6}\n\t"
  70493. "ldm %[a]!, {r3, r4}\n\t"
  70494. #ifdef WOLFSSL_KEIL
  70495. "sbcs r3, r3, r5\n\t"
  70496. #elif defined(__clang__)
  70497. "sbcs r3, r5\n\t"
  70498. #else
  70499. "sbc r3, r5\n\t"
  70500. #endif
  70501. #ifdef WOLFSSL_KEIL
  70502. "sbcs r4, r4, r6\n\t"
  70503. #elif defined(__clang__)
  70504. "sbcs r4, r6\n\t"
  70505. #else
  70506. "sbc r4, r6\n\t"
  70507. #endif
  70508. "stm %[r]!, {r3, r4}\n\t"
  70509. "ldm %[b]!, {r5, r6}\n\t"
  70510. "ldm %[a]!, {r3, r4}\n\t"
  70511. #ifdef WOLFSSL_KEIL
  70512. "sbcs r3, r3, r5\n\t"
  70513. #elif defined(__clang__)
  70514. "sbcs r3, r5\n\t"
  70515. #else
  70516. "sbc r3, r5\n\t"
  70517. #endif
  70518. #ifdef WOLFSSL_KEIL
  70519. "sbcs r4, r4, r6\n\t"
  70520. #elif defined(__clang__)
  70521. "sbcs r4, r6\n\t"
  70522. #else
  70523. "sbc r4, r6\n\t"
  70524. #endif
  70525. "stm %[r]!, {r3, r4}\n\t"
  70526. "ldm %[b]!, {r5, r6}\n\t"
  70527. "ldm %[a]!, {r3, r4}\n\t"
  70528. #ifdef WOLFSSL_KEIL
  70529. "sbcs r3, r3, r5\n\t"
  70530. #elif defined(__clang__)
  70531. "sbcs r3, r5\n\t"
  70532. #else
  70533. "sbc r3, r5\n\t"
  70534. #endif
  70535. #ifdef WOLFSSL_KEIL
  70536. "sbcs r4, r4, r6\n\t"
  70537. #elif defined(__clang__)
  70538. "sbcs r4, r6\n\t"
  70539. #else
  70540. "sbc r4, r6\n\t"
  70541. #endif
  70542. "stm %[r]!, {r3, r4}\n\t"
  70543. "ldm %[b]!, {r5, r6}\n\t"
  70544. "ldm %[a]!, {r3, r4}\n\t"
  70545. #ifdef WOLFSSL_KEIL
  70546. "sbcs r3, r3, r5\n\t"
  70547. #elif defined(__clang__)
  70548. "sbcs r3, r5\n\t"
  70549. #else
  70550. "sbc r3, r5\n\t"
  70551. #endif
  70552. #ifdef WOLFSSL_KEIL
  70553. "sbcs r4, r4, r6\n\t"
  70554. #elif defined(__clang__)
  70555. "sbcs r4, r6\n\t"
  70556. #else
  70557. "sbc r4, r6\n\t"
  70558. #endif
  70559. "stm %[r]!, {r3, r4}\n\t"
  70560. "ldm %[b]!, {r5, r6}\n\t"
  70561. "ldm %[a]!, {r3, r4}\n\t"
  70562. #ifdef WOLFSSL_KEIL
  70563. "sbcs r3, r3, r5\n\t"
  70564. #elif defined(__clang__)
  70565. "sbcs r3, r5\n\t"
  70566. #else
  70567. "sbc r3, r5\n\t"
  70568. #endif
  70569. #ifdef WOLFSSL_KEIL
  70570. "sbcs r4, r4, r6\n\t"
  70571. #elif defined(__clang__)
  70572. "sbcs r4, r6\n\t"
  70573. #else
  70574. "sbc r4, r6\n\t"
  70575. #endif
  70576. "stm %[r]!, {r3, r4}\n\t"
  70577. "ldm %[b]!, {r5, r6}\n\t"
  70578. "ldm %[a]!, {r3, r4}\n\t"
  70579. #ifdef WOLFSSL_KEIL
  70580. "sbcs r3, r3, r5\n\t"
  70581. #elif defined(__clang__)
  70582. "sbcs r3, r5\n\t"
  70583. #else
  70584. "sbc r3, r5\n\t"
  70585. #endif
  70586. #ifdef WOLFSSL_KEIL
  70587. "sbcs r4, r4, r6\n\t"
  70588. #elif defined(__clang__)
  70589. "sbcs r4, r6\n\t"
  70590. #else
  70591. "sbc r4, r6\n\t"
  70592. #endif
  70593. "stm %[r]!, {r3, r4}\n\t"
  70594. "ldm %[b]!, {r5, r6}\n\t"
  70595. "ldm %[a]!, {r3, r4}\n\t"
  70596. #ifdef WOLFSSL_KEIL
  70597. "sbcs r3, r3, r5\n\t"
  70598. #elif defined(__clang__)
  70599. "sbcs r3, r5\n\t"
  70600. #else
  70601. "sbc r3, r5\n\t"
  70602. #endif
  70603. #ifdef WOLFSSL_KEIL
  70604. "sbcs r4, r4, r6\n\t"
  70605. #elif defined(__clang__)
  70606. "sbcs r4, r6\n\t"
  70607. #else
  70608. "sbc r4, r6\n\t"
  70609. #endif
  70610. "stm %[r]!, {r3, r4}\n\t"
  70611. "ldm %[b]!, {r5, r6}\n\t"
  70612. "ldm %[a]!, {r3, r4}\n\t"
  70613. #ifdef WOLFSSL_KEIL
  70614. "sbcs r3, r3, r5\n\t"
  70615. #elif defined(__clang__)
  70616. "sbcs r3, r5\n\t"
  70617. #else
  70618. "sbc r3, r5\n\t"
  70619. #endif
  70620. #ifdef WOLFSSL_KEIL
  70621. "sbcs r4, r4, r6\n\t"
  70622. #elif defined(__clang__)
  70623. "sbcs r4, r6\n\t"
  70624. #else
  70625. "sbc r4, r6\n\t"
  70626. #endif
  70627. "stm %[r]!, {r3, r4}\n\t"
  70628. "ldm %[b]!, {r5, r6}\n\t"
  70629. "ldm %[a]!, {r3, r4}\n\t"
  70630. #ifdef WOLFSSL_KEIL
  70631. "sbcs r3, r3, r5\n\t"
  70632. #elif defined(__clang__)
  70633. "sbcs r3, r5\n\t"
  70634. #else
  70635. "sbc r3, r5\n\t"
  70636. #endif
  70637. #ifdef WOLFSSL_KEIL
  70638. "sbcs r4, r4, r6\n\t"
  70639. #elif defined(__clang__)
  70640. "sbcs r4, r6\n\t"
  70641. #else
  70642. "sbc r4, r6\n\t"
  70643. #endif
  70644. "stm %[r]!, {r3, r4}\n\t"
  70645. "ldm %[b]!, {r5, r6}\n\t"
  70646. "ldm %[a]!, {r3, r4}\n\t"
  70647. #ifdef WOLFSSL_KEIL
  70648. "sbcs r3, r3, r5\n\t"
  70649. #elif defined(__clang__)
  70650. "sbcs r3, r5\n\t"
  70651. #else
  70652. "sbc r3, r5\n\t"
  70653. #endif
  70654. #ifdef WOLFSSL_KEIL
  70655. "sbcs r4, r4, r6\n\t"
  70656. #elif defined(__clang__)
  70657. "sbcs r4, r6\n\t"
  70658. #else
  70659. "sbc r4, r6\n\t"
  70660. #endif
  70661. "stm %[r]!, {r3, r4}\n\t"
  70662. #ifdef WOLFSSL_KEIL
  70663. "sbcs %[r], %[r], %[r]\n\t"
  70664. #elif defined(__clang__)
  70665. "sbcs %[r], %[r]\n\t"
  70666. #else
  70667. "sbc %[r], %[r]\n\t"
  70668. #endif
  70669. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  70670. :
  70671. : "memory", "r3", "r4", "r5", "r6"
  70672. );
  70673. return (uint32_t)(size_t)r;
  70674. }
  70675. /* Square a and put result in r. (r = a * a)
  70676. *
  70677. * r A single precision integer.
  70678. * a A single precision integer.
  70679. */
  70680. SP_NOINLINE static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a)
  70681. {
  70682. sp_digit* z0 = r;
  70683. sp_digit* z2 = r + 96;
  70684. sp_digit z1[96];
  70685. sp_digit* a1 = z1;
  70686. sp_digit* zero = z1 + 48;
  70687. sp_digit u;
  70688. sp_digit mask;
  70689. sp_digit* p1;
  70690. sp_digit* p2;
  70691. XMEMSET(zero, 0, sizeof(sp_digit) * 48);
  70692. mask = sp_3072_sub_48(a1, a, &a[48]);
  70693. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  70694. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  70695. (void)sp_3072_sub_48(a1, p1, p2);
  70696. sp_3072_sqr_48(z2, &a[48]);
  70697. sp_3072_sqr_48(z0, a);
  70698. sp_3072_sqr_48(z1, a1);
  70699. u = 0;
  70700. u -= sp_3072_sub_in_place_96(z1, z2);
  70701. u -= sp_3072_sub_in_place_96(z1, z0);
  70702. u += sp_3072_sub_in_place_96(r + 48, z1);
  70703. sp_3072_add_word_48(r + 144, r + 144, u);
  70704. }
  70705. #endif /* !WOLFSSL_SP_SMALL */
  70706. #ifdef WOLFSSL_SP_SMALL
  70707. /* Add b to a into r. (r = a + b)
  70708. *
  70709. * r A single precision integer.
  70710. * a A single precision integer.
  70711. * b A single precision integer.
  70712. */
  70713. SP_NOINLINE static sp_digit sp_3072_add_96(sp_digit* r, const sp_digit* a,
  70714. const sp_digit* b)
  70715. {
  70716. __asm__ __volatile__ (
  70717. "movs r6, %[a]\n\t"
  70718. "movs r7, #0\n\t"
  70719. "movs r3, #0\n\t"
  70720. "movs r4, #0xff\n\t"
  70721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70722. "adds r4, r4, #0x81\n\t"
  70723. #else
  70724. "add r4, r4, #0x81\n\t"
  70725. #endif
  70726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70727. "subs r7, r7, #1\n\t"
  70728. #else
  70729. "sub r7, r7, #1\n\t"
  70730. #endif
  70731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70732. "adds r6, r6, r4\n\t"
  70733. #else
  70734. "add r6, r6, r4\n\t"
  70735. #endif
  70736. "\n"
  70737. "L_sp_3072_add_96_word_%=:\n\t"
  70738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70739. "adds r3, r3, r7\n\t"
  70740. #else
  70741. "add r3, r3, r7\n\t"
  70742. #endif
  70743. "ldr r4, [%[a]]\n\t"
  70744. "ldr r5, [%[b]]\n\t"
  70745. #ifdef WOLFSSL_KEIL
  70746. "adcs r4, r4, r5\n\t"
  70747. #elif defined(__clang__)
  70748. "adcs r4, r5\n\t"
  70749. #else
  70750. "adc r4, r5\n\t"
  70751. #endif
  70752. "str r4, [%[r]]\n\t"
  70753. "movs r3, #0\n\t"
  70754. #ifdef WOLFSSL_KEIL
  70755. "adcs r3, r3, r3\n\t"
  70756. #elif defined(__clang__)
  70757. "adcs r3, r3\n\t"
  70758. #else
  70759. "adc r3, r3\n\t"
  70760. #endif
  70761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70762. "adds %[a], %[a], #4\n\t"
  70763. #else
  70764. "add %[a], %[a], #4\n\t"
  70765. #endif
  70766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70767. "adds %[b], %[b], #4\n\t"
  70768. #else
  70769. "add %[b], %[b], #4\n\t"
  70770. #endif
  70771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70772. "adds %[r], %[r], #4\n\t"
  70773. #else
  70774. "add %[r], %[r], #4\n\t"
  70775. #endif
  70776. "cmp %[a], r6\n\t"
  70777. "bne L_sp_3072_add_96_word_%=\n\t"
  70778. "movs %[r], r3\n\t"
  70779. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  70780. :
  70781. : "memory", "r3", "r4", "r5", "r6", "r7"
  70782. );
  70783. return (uint32_t)(size_t)r;
  70784. }
  70785. #endif /* WOLFSSL_SP_SMALL */
  70786. #ifdef WOLFSSL_SP_SMALL
  70787. /* Sub b from a into a. (a -= b)
  70788. *
  70789. * a A single precision integer.
  70790. * b A single precision integer.
  70791. */
  70792. SP_NOINLINE static sp_digit sp_3072_sub_in_place_96(sp_digit* a,
  70793. const sp_digit* b)
  70794. {
  70795. __asm__ __volatile__ (
  70796. "movs r7, %[a]\n\t"
  70797. "movs r2, #0\n\t"
  70798. "movs r5, #0xff\n\t"
  70799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70800. "adds r5, r5, #0x81\n\t"
  70801. #else
  70802. "add r5, r5, #0x81\n\t"
  70803. #endif
  70804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70805. "adds r7, r7, r5\n\t"
  70806. #else
  70807. "add r7, r7, r5\n\t"
  70808. #endif
  70809. "\n"
  70810. "L_sp_3072_sub_in_place_96_words_%=:\n\t"
  70811. "movs r5, #0\n\t"
  70812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70813. "subs r5, r5, r2\n\t"
  70814. #else
  70815. "sub r5, r5, r2\n\t"
  70816. #endif
  70817. "ldr r3, [%[a]]\n\t"
  70818. "ldr r4, [%[a], #4]\n\t"
  70819. "ldr r5, [%[b]]\n\t"
  70820. "ldr r6, [%[b], #4]\n\t"
  70821. #ifdef WOLFSSL_KEIL
  70822. "sbcs r3, r3, r5\n\t"
  70823. #elif defined(__clang__)
  70824. "sbcs r3, r5\n\t"
  70825. #else
  70826. "sbc r3, r5\n\t"
  70827. #endif
  70828. #ifdef WOLFSSL_KEIL
  70829. "sbcs r4, r4, r6\n\t"
  70830. #elif defined(__clang__)
  70831. "sbcs r4, r6\n\t"
  70832. #else
  70833. "sbc r4, r6\n\t"
  70834. #endif
  70835. "str r3, [%[a]]\n\t"
  70836. "str r4, [%[a], #4]\n\t"
  70837. #ifdef WOLFSSL_KEIL
  70838. "sbcs r2, r2, r2\n\t"
  70839. #elif defined(__clang__)
  70840. "sbcs r2, r2\n\t"
  70841. #else
  70842. "sbc r2, r2\n\t"
  70843. #endif
  70844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70845. "adds %[a], %[a], #8\n\t"
  70846. #else
  70847. "add %[a], %[a], #8\n\t"
  70848. #endif
  70849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70850. "adds %[b], %[b], #8\n\t"
  70851. #else
  70852. "add %[b], %[b], #8\n\t"
  70853. #endif
  70854. "cmp %[a], r7\n\t"
  70855. "bne L_sp_3072_sub_in_place_96_words_%=\n\t"
  70856. "movs %[a], r2\n\t"
  70857. : [a] "+l" (a), [b] "+l" (b)
  70858. :
  70859. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  70860. );
  70861. return (uint32_t)(size_t)a;
  70862. }
  70863. #endif /* WOLFSSL_SP_SMALL */
  70864. #ifdef WOLFSSL_SP_SMALL
  70865. /* Multiply a and b into r. (r = a * b)
  70866. *
  70867. * r A single precision integer.
  70868. * a A single precision integer.
  70869. * b A single precision integer.
  70870. */
  70871. SP_NOINLINE static void sp_3072_mul_96(sp_digit* r, const sp_digit* a,
  70872. const sp_digit* b)
  70873. {
  70874. sp_digit t[96 * 2];
  70875. sp_digit* tmp = t;
  70876. __asm__ __volatile__ (
  70877. "movs r3, #0\n\t"
  70878. "movs r4, #0\n\t"
  70879. "mov r8, r3\n\t"
  70880. "mov r11, %[tmp]\n\t"
  70881. "mov r9, %[a]\n\t"
  70882. "mov r10, %[b]\n\t"
  70883. "movs r6, #0xff\n\t"
  70884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70885. "adds r6, r6, #0x81\n\t"
  70886. #else
  70887. "add r6, r6, #0x81\n\t"
  70888. #endif
  70889. "add r6, r6, r9\n\t"
  70890. "mov r12, r6\n\t"
  70891. "\n"
  70892. "L_sp_3072_mul_96_words_%=:\n\t"
  70893. "movs %[tmp], #0\n\t"
  70894. "movs r5, #0\n\t"
  70895. "movs r6, #0xff\n\t"
  70896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70897. "adds r6, r6, #0x7d\n\t"
  70898. #else
  70899. "add r6, r6, #0x7d\n\t"
  70900. #endif
  70901. "mov %[a], r8\n\t"
  70902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70903. "subs %[a], %[a], r6\n\t"
  70904. #else
  70905. "sub %[a], %[a], r6\n\t"
  70906. #endif
  70907. #ifdef WOLFSSL_KEIL
  70908. "sbcs r6, r6, r6\n\t"
  70909. #elif defined(__clang__)
  70910. "sbcs r6, r6\n\t"
  70911. #else
  70912. "sbc r6, r6\n\t"
  70913. #endif
  70914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70915. "mvns r6, r6\n\t"
  70916. #else
  70917. "mvn r6, r6\n\t"
  70918. #endif
  70919. #ifdef WOLFSSL_KEIL
  70920. "ands %[a], %[a], r6\n\t"
  70921. #elif defined(__clang__)
  70922. "ands %[a], r6\n\t"
  70923. #else
  70924. "and %[a], r6\n\t"
  70925. #endif
  70926. "mov %[b], r8\n\t"
  70927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70928. "subs %[b], %[b], %[a]\n\t"
  70929. #else
  70930. "sub %[b], %[b], %[a]\n\t"
  70931. #endif
  70932. "add %[a], %[a], r9\n\t"
  70933. "add %[b], %[b], r10\n\t"
  70934. "\n"
  70935. "L_sp_3072_mul_96_mul_%=:\n\t"
  70936. "# Multiply Start\n\t"
  70937. "ldrh r6, [%[a]]\n\t"
  70938. "ldrh r7, [%[b]]\n\t"
  70939. #ifdef WOLFSSL_KEIL
  70940. "muls r7, r6, r7\n\t"
  70941. #elif defined(__clang__)
  70942. "muls r7, r6\n\t"
  70943. #else
  70944. "mul r7, r6\n\t"
  70945. #endif
  70946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70947. "adds r3, r3, r7\n\t"
  70948. #else
  70949. "add r3, r3, r7\n\t"
  70950. #endif
  70951. #ifdef WOLFSSL_KEIL
  70952. "adcs r4, r4, %[tmp]\n\t"
  70953. #elif defined(__clang__)
  70954. "adcs r4, %[tmp]\n\t"
  70955. #else
  70956. "adc r4, %[tmp]\n\t"
  70957. #endif
  70958. #ifdef WOLFSSL_KEIL
  70959. "adcs r5, r5, %[tmp]\n\t"
  70960. #elif defined(__clang__)
  70961. "adcs r5, %[tmp]\n\t"
  70962. #else
  70963. "adc r5, %[tmp]\n\t"
  70964. #endif
  70965. "ldr r7, [%[b]]\n\t"
  70966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70967. "lsrs r7, r7, #16\n\t"
  70968. #else
  70969. "lsr r7, r7, #16\n\t"
  70970. #endif
  70971. #ifdef WOLFSSL_KEIL
  70972. "muls r6, r7, r6\n\t"
  70973. #elif defined(__clang__)
  70974. "muls r6, r7\n\t"
  70975. #else
  70976. "mul r6, r7\n\t"
  70977. #endif
  70978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70979. "lsrs r7, r6, #16\n\t"
  70980. #else
  70981. "lsr r7, r6, #16\n\t"
  70982. #endif
  70983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70984. "lsls r6, r6, #16\n\t"
  70985. #else
  70986. "lsl r6, r6, #16\n\t"
  70987. #endif
  70988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  70989. "adds r3, r3, r6\n\t"
  70990. #else
  70991. "add r3, r3, r6\n\t"
  70992. #endif
  70993. #ifdef WOLFSSL_KEIL
  70994. "adcs r4, r4, r7\n\t"
  70995. #elif defined(__clang__)
  70996. "adcs r4, r7\n\t"
  70997. #else
  70998. "adc r4, r7\n\t"
  70999. #endif
  71000. #ifdef WOLFSSL_KEIL
  71001. "adcs r5, r5, %[tmp]\n\t"
  71002. #elif defined(__clang__)
  71003. "adcs r5, %[tmp]\n\t"
  71004. #else
  71005. "adc r5, %[tmp]\n\t"
  71006. #endif
  71007. "ldr r6, [%[a]]\n\t"
  71008. "ldr r7, [%[b]]\n\t"
  71009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71010. "lsrs r6, r6, #16\n\t"
  71011. #else
  71012. "lsr r6, r6, #16\n\t"
  71013. #endif
  71014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71015. "lsrs r7, r7, #16\n\t"
  71016. #else
  71017. "lsr r7, r7, #16\n\t"
  71018. #endif
  71019. #ifdef WOLFSSL_KEIL
  71020. "muls r7, r6, r7\n\t"
  71021. #elif defined(__clang__)
  71022. "muls r7, r6\n\t"
  71023. #else
  71024. "mul r7, r6\n\t"
  71025. #endif
  71026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71027. "adds r4, r4, r7\n\t"
  71028. #else
  71029. "add r4, r4, r7\n\t"
  71030. #endif
  71031. #ifdef WOLFSSL_KEIL
  71032. "adcs r5, r5, %[tmp]\n\t"
  71033. #elif defined(__clang__)
  71034. "adcs r5, %[tmp]\n\t"
  71035. #else
  71036. "adc r5, %[tmp]\n\t"
  71037. #endif
  71038. "ldrh r7, [%[b]]\n\t"
  71039. #ifdef WOLFSSL_KEIL
  71040. "muls r6, r7, r6\n\t"
  71041. #elif defined(__clang__)
  71042. "muls r6, r7\n\t"
  71043. #else
  71044. "mul r6, r7\n\t"
  71045. #endif
  71046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71047. "lsrs r7, r6, #16\n\t"
  71048. #else
  71049. "lsr r7, r6, #16\n\t"
  71050. #endif
  71051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71052. "lsls r6, r6, #16\n\t"
  71053. #else
  71054. "lsl r6, r6, #16\n\t"
  71055. #endif
  71056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71057. "adds r3, r3, r6\n\t"
  71058. #else
  71059. "add r3, r3, r6\n\t"
  71060. #endif
  71061. #ifdef WOLFSSL_KEIL
  71062. "adcs r4, r4, r7\n\t"
  71063. #elif defined(__clang__)
  71064. "adcs r4, r7\n\t"
  71065. #else
  71066. "adc r4, r7\n\t"
  71067. #endif
  71068. #ifdef WOLFSSL_KEIL
  71069. "adcs r5, r5, %[tmp]\n\t"
  71070. #elif defined(__clang__)
  71071. "adcs r5, %[tmp]\n\t"
  71072. #else
  71073. "adc r5, %[tmp]\n\t"
  71074. #endif
  71075. "# Multiply Done\n\t"
  71076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71077. "adds %[a], %[a], #4\n\t"
  71078. #else
  71079. "add %[a], %[a], #4\n\t"
  71080. #endif
  71081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71082. "subs %[b], %[b], #4\n\t"
  71083. #else
  71084. "sub %[b], %[b], #4\n\t"
  71085. #endif
  71086. "cmp %[a], r12\n\t"
  71087. "beq L_sp_3072_mul_96_done_mul_%=\n\t"
  71088. "mov r6, r8\n\t"
  71089. "add r6, r6, r9\n\t"
  71090. "cmp %[a], r6\n\t"
  71091. "ble L_sp_3072_mul_96_mul_%=\n\t"
  71092. "\n"
  71093. "L_sp_3072_mul_96_done_mul_%=:\n\t"
  71094. "mov %[tmp], r11\n\t"
  71095. "mov r7, r8\n\t"
  71096. "str r3, [%[tmp], r7]\n\t"
  71097. "movs r3, r4\n\t"
  71098. "movs r4, r5\n\t"
  71099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71100. "adds r7, r7, #4\n\t"
  71101. #else
  71102. "add r7, r7, #4\n\t"
  71103. #endif
  71104. "mov r8, r7\n\t"
  71105. "movs r6, #2\n\t"
  71106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71107. "lsls r6, r6, #8\n\t"
  71108. #else
  71109. "lsl r6, r6, #8\n\t"
  71110. #endif
  71111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71112. "adds r6, r6, #0xf8\n\t"
  71113. #else
  71114. "add r6, r6, #0xf8\n\t"
  71115. #endif
  71116. "cmp r7, r6\n\t"
  71117. "ble L_sp_3072_mul_96_words_%=\n\t"
  71118. "str r3, [%[tmp], r7]\n\t"
  71119. "mov %[a], r9\n\t"
  71120. "mov %[b], r10\n\t"
  71121. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  71122. :
  71123. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  71124. );
  71125. XMEMCPY(r, t, sizeof(t));
  71126. }
  71127. /* Square a and put result in r. (r = a * a)
  71128. *
  71129. * r A single precision integer.
  71130. * a A single precision integer.
  71131. */
  71132. SP_NOINLINE static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a)
  71133. {
  71134. __asm__ __volatile__ (
  71135. "movs r3, #0\n\t"
  71136. "movs r4, #0\n\t"
  71137. "movs r5, #0\n\t"
  71138. "mov r8, r3\n\t"
  71139. "mov r11, %[r]\n\t"
  71140. "movs r6, #3\n\t"
  71141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71142. "lsls r6, r6, #8\n\t"
  71143. #else
  71144. "lsl r6, r6, #8\n\t"
  71145. #endif
  71146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71147. "negs r6, r6\n\t"
  71148. #else
  71149. "neg r6, r6\n\t"
  71150. #endif
  71151. "add sp, sp, r6\n\t"
  71152. "mov r10, sp\n\t"
  71153. "mov r9, %[a]\n\t"
  71154. "\n"
  71155. "L_sp_3072_sqr_96_words_%=:\n\t"
  71156. "movs %[r], #0\n\t"
  71157. "movs r6, #0xff\n\t"
  71158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71159. "adds r6, r6, #0x7d\n\t"
  71160. #else
  71161. "add r6, r6, #0x7d\n\t"
  71162. #endif
  71163. "mov %[a], r8\n\t"
  71164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71165. "subs %[a], %[a], r6\n\t"
  71166. #else
  71167. "sub %[a], %[a], r6\n\t"
  71168. #endif
  71169. #ifdef WOLFSSL_KEIL
  71170. "sbcs r6, r6, r6\n\t"
  71171. #elif defined(__clang__)
  71172. "sbcs r6, r6\n\t"
  71173. #else
  71174. "sbc r6, r6\n\t"
  71175. #endif
  71176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71177. "mvns r6, r6\n\t"
  71178. #else
  71179. "mvn r6, r6\n\t"
  71180. #endif
  71181. #ifdef WOLFSSL_KEIL
  71182. "ands %[a], %[a], r6\n\t"
  71183. #elif defined(__clang__)
  71184. "ands %[a], r6\n\t"
  71185. #else
  71186. "and %[a], r6\n\t"
  71187. #endif
  71188. "mov r2, r8\n\t"
  71189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71190. "subs r2, r2, %[a]\n\t"
  71191. #else
  71192. "sub r2, r2, %[a]\n\t"
  71193. #endif
  71194. "add %[a], %[a], r9\n\t"
  71195. "add r2, r2, r9\n\t"
  71196. "\n"
  71197. "L_sp_3072_sqr_96_mul_%=:\n\t"
  71198. "cmp r2, %[a]\n\t"
  71199. "beq L_sp_3072_sqr_96_sqr_%=\n\t"
  71200. "# Multiply * 2: Start\n\t"
  71201. "ldrh r6, [%[a]]\n\t"
  71202. "ldrh r7, [r2]\n\t"
  71203. #ifdef WOLFSSL_KEIL
  71204. "muls r7, r6, r7\n\t"
  71205. #elif defined(__clang__)
  71206. "muls r7, r6\n\t"
  71207. #else
  71208. "mul r7, r6\n\t"
  71209. #endif
  71210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71211. "adds r3, r3, r7\n\t"
  71212. #else
  71213. "add r3, r3, r7\n\t"
  71214. #endif
  71215. #ifdef WOLFSSL_KEIL
  71216. "adcs r4, r4, %[r]\n\t"
  71217. #elif defined(__clang__)
  71218. "adcs r4, %[r]\n\t"
  71219. #else
  71220. "adc r4, %[r]\n\t"
  71221. #endif
  71222. #ifdef WOLFSSL_KEIL
  71223. "adcs r5, r5, %[r]\n\t"
  71224. #elif defined(__clang__)
  71225. "adcs r5, %[r]\n\t"
  71226. #else
  71227. "adc r5, %[r]\n\t"
  71228. #endif
  71229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71230. "adds r3, r3, r7\n\t"
  71231. #else
  71232. "add r3, r3, r7\n\t"
  71233. #endif
  71234. #ifdef WOLFSSL_KEIL
  71235. "adcs r4, r4, %[r]\n\t"
  71236. #elif defined(__clang__)
  71237. "adcs r4, %[r]\n\t"
  71238. #else
  71239. "adc r4, %[r]\n\t"
  71240. #endif
  71241. #ifdef WOLFSSL_KEIL
  71242. "adcs r5, r5, %[r]\n\t"
  71243. #elif defined(__clang__)
  71244. "adcs r5, %[r]\n\t"
  71245. #else
  71246. "adc r5, %[r]\n\t"
  71247. #endif
  71248. "ldr r7, [r2]\n\t"
  71249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71250. "lsrs r7, r7, #16\n\t"
  71251. #else
  71252. "lsr r7, r7, #16\n\t"
  71253. #endif
  71254. #ifdef WOLFSSL_KEIL
  71255. "muls r6, r7, r6\n\t"
  71256. #elif defined(__clang__)
  71257. "muls r6, r7\n\t"
  71258. #else
  71259. "mul r6, r7\n\t"
  71260. #endif
  71261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71262. "lsrs r7, r6, #16\n\t"
  71263. #else
  71264. "lsr r7, r6, #16\n\t"
  71265. #endif
  71266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71267. "lsls r6, r6, #16\n\t"
  71268. #else
  71269. "lsl r6, r6, #16\n\t"
  71270. #endif
  71271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71272. "adds r3, r3, r6\n\t"
  71273. #else
  71274. "add r3, r3, r6\n\t"
  71275. #endif
  71276. #ifdef WOLFSSL_KEIL
  71277. "adcs r4, r4, r7\n\t"
  71278. #elif defined(__clang__)
  71279. "adcs r4, r7\n\t"
  71280. #else
  71281. "adc r4, r7\n\t"
  71282. #endif
  71283. #ifdef WOLFSSL_KEIL
  71284. "adcs r5, r5, %[r]\n\t"
  71285. #elif defined(__clang__)
  71286. "adcs r5, %[r]\n\t"
  71287. #else
  71288. "adc r5, %[r]\n\t"
  71289. #endif
  71290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71291. "adds r3, r3, r6\n\t"
  71292. #else
  71293. "add r3, r3, r6\n\t"
  71294. #endif
  71295. #ifdef WOLFSSL_KEIL
  71296. "adcs r4, r4, r7\n\t"
  71297. #elif defined(__clang__)
  71298. "adcs r4, r7\n\t"
  71299. #else
  71300. "adc r4, r7\n\t"
  71301. #endif
  71302. #ifdef WOLFSSL_KEIL
  71303. "adcs r5, r5, %[r]\n\t"
  71304. #elif defined(__clang__)
  71305. "adcs r5, %[r]\n\t"
  71306. #else
  71307. "adc r5, %[r]\n\t"
  71308. #endif
  71309. "ldr r6, [%[a]]\n\t"
  71310. "ldr r7, [r2]\n\t"
  71311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71312. "lsrs r6, r6, #16\n\t"
  71313. #else
  71314. "lsr r6, r6, #16\n\t"
  71315. #endif
  71316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71317. "lsrs r7, r7, #16\n\t"
  71318. #else
  71319. "lsr r7, r7, #16\n\t"
  71320. #endif
  71321. #ifdef WOLFSSL_KEIL
  71322. "muls r7, r6, r7\n\t"
  71323. #elif defined(__clang__)
  71324. "muls r7, r6\n\t"
  71325. #else
  71326. "mul r7, r6\n\t"
  71327. #endif
  71328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71329. "adds r4, r4, r7\n\t"
  71330. #else
  71331. "add r4, r4, r7\n\t"
  71332. #endif
  71333. #ifdef WOLFSSL_KEIL
  71334. "adcs r5, r5, %[r]\n\t"
  71335. #elif defined(__clang__)
  71336. "adcs r5, %[r]\n\t"
  71337. #else
  71338. "adc r5, %[r]\n\t"
  71339. #endif
  71340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71341. "adds r4, r4, r7\n\t"
  71342. #else
  71343. "add r4, r4, r7\n\t"
  71344. #endif
  71345. #ifdef WOLFSSL_KEIL
  71346. "adcs r5, r5, %[r]\n\t"
  71347. #elif defined(__clang__)
  71348. "adcs r5, %[r]\n\t"
  71349. #else
  71350. "adc r5, %[r]\n\t"
  71351. #endif
  71352. "ldrh r7, [r2]\n\t"
  71353. #ifdef WOLFSSL_KEIL
  71354. "muls r6, r7, r6\n\t"
  71355. #elif defined(__clang__)
  71356. "muls r6, r7\n\t"
  71357. #else
  71358. "mul r6, r7\n\t"
  71359. #endif
  71360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71361. "lsrs r7, r6, #16\n\t"
  71362. #else
  71363. "lsr r7, r6, #16\n\t"
  71364. #endif
  71365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71366. "lsls r6, r6, #16\n\t"
  71367. #else
  71368. "lsl r6, r6, #16\n\t"
  71369. #endif
  71370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71371. "adds r3, r3, r6\n\t"
  71372. #else
  71373. "add r3, r3, r6\n\t"
  71374. #endif
  71375. #ifdef WOLFSSL_KEIL
  71376. "adcs r4, r4, r7\n\t"
  71377. #elif defined(__clang__)
  71378. "adcs r4, r7\n\t"
  71379. #else
  71380. "adc r4, r7\n\t"
  71381. #endif
  71382. #ifdef WOLFSSL_KEIL
  71383. "adcs r5, r5, %[r]\n\t"
  71384. #elif defined(__clang__)
  71385. "adcs r5, %[r]\n\t"
  71386. #else
  71387. "adc r5, %[r]\n\t"
  71388. #endif
  71389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71390. "adds r3, r3, r6\n\t"
  71391. #else
  71392. "add r3, r3, r6\n\t"
  71393. #endif
  71394. #ifdef WOLFSSL_KEIL
  71395. "adcs r4, r4, r7\n\t"
  71396. #elif defined(__clang__)
  71397. "adcs r4, r7\n\t"
  71398. #else
  71399. "adc r4, r7\n\t"
  71400. #endif
  71401. #ifdef WOLFSSL_KEIL
  71402. "adcs r5, r5, %[r]\n\t"
  71403. #elif defined(__clang__)
  71404. "adcs r5, %[r]\n\t"
  71405. #else
  71406. "adc r5, %[r]\n\t"
  71407. #endif
  71408. "# Multiply * 2: Done\n\t"
  71409. "bal L_sp_3072_sqr_96_done_sqr_%=\n\t"
  71410. "\n"
  71411. "L_sp_3072_sqr_96_sqr_%=:\n\t"
  71412. "mov r12, r2\n\t"
  71413. "ldr r2, [%[a]]\n\t"
  71414. "# Square: Start\n\t"
  71415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71416. "lsrs r7, r2, #16\n\t"
  71417. #else
  71418. "lsr r7, r2, #16\n\t"
  71419. #endif
  71420. "uxth r6, r2\n\t"
  71421. #ifdef WOLFSSL_KEIL
  71422. "muls r6, r6, r6\n\t"
  71423. #elif defined(__clang__)
  71424. "muls r6, r6\n\t"
  71425. #else
  71426. "mul r6, r6\n\t"
  71427. #endif
  71428. #ifdef WOLFSSL_KEIL
  71429. "muls r7, r7, r7\n\t"
  71430. #elif defined(__clang__)
  71431. "muls r7, r7\n\t"
  71432. #else
  71433. "mul r7, r7\n\t"
  71434. #endif
  71435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71436. "adds r3, r3, r6\n\t"
  71437. #else
  71438. "add r3, r3, r6\n\t"
  71439. #endif
  71440. #ifdef WOLFSSL_KEIL
  71441. "adcs r4, r4, r7\n\t"
  71442. #elif defined(__clang__)
  71443. "adcs r4, r7\n\t"
  71444. #else
  71445. "adc r4, r7\n\t"
  71446. #endif
  71447. #ifdef WOLFSSL_KEIL
  71448. "adcs r5, r5, %[r]\n\t"
  71449. #elif defined(__clang__)
  71450. "adcs r5, %[r]\n\t"
  71451. #else
  71452. "adc r5, %[r]\n\t"
  71453. #endif
  71454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71455. "lsrs r7, r2, #16\n\t"
  71456. #else
  71457. "lsr r7, r2, #16\n\t"
  71458. #endif
  71459. "uxth r6, r2\n\t"
  71460. #ifdef WOLFSSL_KEIL
  71461. "muls r6, r7, r6\n\t"
  71462. #elif defined(__clang__)
  71463. "muls r6, r7\n\t"
  71464. #else
  71465. "mul r6, r7\n\t"
  71466. #endif
  71467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71468. "lsrs r7, r6, #15\n\t"
  71469. #else
  71470. "lsr r7, r6, #15\n\t"
  71471. #endif
  71472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71473. "lsls r6, r6, #17\n\t"
  71474. #else
  71475. "lsl r6, r6, #17\n\t"
  71476. #endif
  71477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71478. "adds r3, r3, r6\n\t"
  71479. #else
  71480. "add r3, r3, r6\n\t"
  71481. #endif
  71482. #ifdef WOLFSSL_KEIL
  71483. "adcs r4, r4, r7\n\t"
  71484. #elif defined(__clang__)
  71485. "adcs r4, r7\n\t"
  71486. #else
  71487. "adc r4, r7\n\t"
  71488. #endif
  71489. #ifdef WOLFSSL_KEIL
  71490. "adcs r5, r5, %[r]\n\t"
  71491. #elif defined(__clang__)
  71492. "adcs r5, %[r]\n\t"
  71493. #else
  71494. "adc r5, %[r]\n\t"
  71495. #endif
  71496. "# Square: Done\n\t"
  71497. "mov r2, r12\n\t"
  71498. "\n"
  71499. "L_sp_3072_sqr_96_done_sqr_%=:\n\t"
  71500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71501. "adds %[a], %[a], #4\n\t"
  71502. #else
  71503. "add %[a], %[a], #4\n\t"
  71504. #endif
  71505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71506. "subs r2, r2, #4\n\t"
  71507. #else
  71508. "sub r2, r2, #4\n\t"
  71509. #endif
  71510. "movs r6, #0xff\n\t"
  71511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71512. "adds r6, r6, #0x81\n\t"
  71513. #else
  71514. "add r6, r6, #0x81\n\t"
  71515. #endif
  71516. "add r6, r6, r9\n\t"
  71517. "cmp %[a], r6\n\t"
  71518. "beq L_sp_3072_sqr_96_done_mul_%=\n\t"
  71519. "cmp %[a], r2\n\t"
  71520. "bgt L_sp_3072_sqr_96_done_mul_%=\n\t"
  71521. "mov r7, r8\n\t"
  71522. "add r7, r7, r9\n\t"
  71523. "cmp %[a], r7\n\t"
  71524. "ble L_sp_3072_sqr_96_mul_%=\n\t"
  71525. "\n"
  71526. "L_sp_3072_sqr_96_done_mul_%=:\n\t"
  71527. "mov %[r], r10\n\t"
  71528. "mov r7, r8\n\t"
  71529. "str r3, [%[r], r7]\n\t"
  71530. "movs r3, r4\n\t"
  71531. "movs r4, r5\n\t"
  71532. "movs r5, #0\n\t"
  71533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71534. "adds r7, r7, #4\n\t"
  71535. #else
  71536. "add r7, r7, #4\n\t"
  71537. #endif
  71538. "mov r8, r7\n\t"
  71539. "movs r6, #2\n\t"
  71540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71541. "lsls r6, r6, #8\n\t"
  71542. #else
  71543. "lsl r6, r6, #8\n\t"
  71544. #endif
  71545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71546. "adds r6, r6, #0xf8\n\t"
  71547. #else
  71548. "add r6, r6, #0xf8\n\t"
  71549. #endif
  71550. "cmp r7, r6\n\t"
  71551. "ble L_sp_3072_sqr_96_words_%=\n\t"
  71552. "mov %[a], r9\n\t"
  71553. "str r3, [%[r], r7]\n\t"
  71554. "mov %[r], r11\n\t"
  71555. "mov %[a], r10\n\t"
  71556. "movs r3, #2\n\t"
  71557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71558. "lsls r3, r3, #8\n\t"
  71559. #else
  71560. "lsl r3, r3, #8\n\t"
  71561. #endif
  71562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71563. "adds r3, r3, #0xfc\n\t"
  71564. #else
  71565. "add r3, r3, #0xfc\n\t"
  71566. #endif
  71567. "\n"
  71568. "L_sp_3072_sqr_96_store_%=:\n\t"
  71569. "ldr r6, [%[a], r3]\n\t"
  71570. "str r6, [%[r], r3]\n\t"
  71571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71572. "subs r3, r3, #4\n\t"
  71573. #else
  71574. "sub r3, r3, #4\n\t"
  71575. #endif
  71576. "bge L_sp_3072_sqr_96_store_%=\n\t"
  71577. "movs r6, #3\n\t"
  71578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71579. "lsls r6, r6, #8\n\t"
  71580. #else
  71581. "lsl r6, r6, #8\n\t"
  71582. #endif
  71583. "add sp, sp, r6\n\t"
  71584. : [r] "+l" (r), [a] "+l" (a)
  71585. :
  71586. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  71587. );
  71588. }
  71589. #endif /* WOLFSSL_SP_SMALL */
  71590. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  71591. #ifdef WOLFSSL_SP_SMALL
  71592. /* AND m into each word of a and store in r.
  71593. *
  71594. * r A single precision integer.
  71595. * a A single precision integer.
  71596. * m Mask to AND against each digit.
  71597. */
  71598. static void sp_3072_mask_48(sp_digit* r, const sp_digit* a, sp_digit m)
  71599. {
  71600. int i;
  71601. for (i=0; i<48; i++) {
  71602. r[i] = a[i] & m;
  71603. }
  71604. }
  71605. #endif /* WOLFSSL_SP_SMALL */
  71606. #ifdef WOLFSSL_SP_SMALL
  71607. /* Add b to a into r. (r = a + b)
  71608. *
  71609. * r A single precision integer.
  71610. * a A single precision integer.
  71611. * b A single precision integer.
  71612. */
  71613. SP_NOINLINE static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a,
  71614. const sp_digit* b)
  71615. {
  71616. __asm__ __volatile__ (
  71617. "movs r6, %[a]\n\t"
  71618. "movs r7, #0\n\t"
  71619. "movs r3, #0\n\t"
  71620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71621. "adds r6, r6, #0xc0\n\t"
  71622. #else
  71623. "add r6, r6, #0xc0\n\t"
  71624. #endif
  71625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71626. "subs r7, r7, #1\n\t"
  71627. #else
  71628. "sub r7, r7, #1\n\t"
  71629. #endif
  71630. "\n"
  71631. "L_sp_3072_add_48_word_%=:\n\t"
  71632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71633. "adds r3, r3, r7\n\t"
  71634. #else
  71635. "add r3, r3, r7\n\t"
  71636. #endif
  71637. "ldr r4, [%[a]]\n\t"
  71638. "ldr r5, [%[b]]\n\t"
  71639. #ifdef WOLFSSL_KEIL
  71640. "adcs r4, r4, r5\n\t"
  71641. #elif defined(__clang__)
  71642. "adcs r4, r5\n\t"
  71643. #else
  71644. "adc r4, r5\n\t"
  71645. #endif
  71646. "str r4, [%[r]]\n\t"
  71647. "movs r3, #0\n\t"
  71648. #ifdef WOLFSSL_KEIL
  71649. "adcs r3, r3, r3\n\t"
  71650. #elif defined(__clang__)
  71651. "adcs r3, r3\n\t"
  71652. #else
  71653. "adc r3, r3\n\t"
  71654. #endif
  71655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71656. "adds %[a], %[a], #4\n\t"
  71657. #else
  71658. "add %[a], %[a], #4\n\t"
  71659. #endif
  71660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71661. "adds %[b], %[b], #4\n\t"
  71662. #else
  71663. "add %[b], %[b], #4\n\t"
  71664. #endif
  71665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71666. "adds %[r], %[r], #4\n\t"
  71667. #else
  71668. "add %[r], %[r], #4\n\t"
  71669. #endif
  71670. "cmp %[a], r6\n\t"
  71671. "bne L_sp_3072_add_48_word_%=\n\t"
  71672. "movs %[r], r3\n\t"
  71673. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  71674. :
  71675. : "memory", "r3", "r4", "r5", "r6", "r7"
  71676. );
  71677. return (uint32_t)(size_t)r;
  71678. }
  71679. #endif /* WOLFSSL_SP_SMALL */
  71680. #ifdef WOLFSSL_SP_SMALL
  71681. /* Sub b from a into a. (a -= b)
  71682. *
  71683. * a A single precision integer.
  71684. * b A single precision integer.
  71685. */
  71686. SP_NOINLINE static sp_digit sp_3072_sub_in_place_48(sp_digit* a,
  71687. const sp_digit* b)
  71688. {
  71689. __asm__ __volatile__ (
  71690. "movs r7, %[a]\n\t"
  71691. "movs r2, #0\n\t"
  71692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71693. "adds r7, r7, #0xc0\n\t"
  71694. #else
  71695. "add r7, r7, #0xc0\n\t"
  71696. #endif
  71697. "\n"
  71698. "L_sp_3072_sub_in_place_48_words_%=:\n\t"
  71699. "movs r5, #0\n\t"
  71700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71701. "subs r5, r5, r2\n\t"
  71702. #else
  71703. "sub r5, r5, r2\n\t"
  71704. #endif
  71705. "ldr r3, [%[a]]\n\t"
  71706. "ldr r4, [%[a], #4]\n\t"
  71707. "ldr r5, [%[b]]\n\t"
  71708. "ldr r6, [%[b], #4]\n\t"
  71709. #ifdef WOLFSSL_KEIL
  71710. "sbcs r3, r3, r5\n\t"
  71711. #elif defined(__clang__)
  71712. "sbcs r3, r5\n\t"
  71713. #else
  71714. "sbc r3, r5\n\t"
  71715. #endif
  71716. #ifdef WOLFSSL_KEIL
  71717. "sbcs r4, r4, r6\n\t"
  71718. #elif defined(__clang__)
  71719. "sbcs r4, r6\n\t"
  71720. #else
  71721. "sbc r4, r6\n\t"
  71722. #endif
  71723. "str r3, [%[a]]\n\t"
  71724. "str r4, [%[a], #4]\n\t"
  71725. #ifdef WOLFSSL_KEIL
  71726. "sbcs r2, r2, r2\n\t"
  71727. #elif defined(__clang__)
  71728. "sbcs r2, r2\n\t"
  71729. #else
  71730. "sbc r2, r2\n\t"
  71731. #endif
  71732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71733. "adds %[a], %[a], #8\n\t"
  71734. #else
  71735. "add %[a], %[a], #8\n\t"
  71736. #endif
  71737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71738. "adds %[b], %[b], #8\n\t"
  71739. #else
  71740. "add %[b], %[b], #8\n\t"
  71741. #endif
  71742. "cmp %[a], r7\n\t"
  71743. "bne L_sp_3072_sub_in_place_48_words_%=\n\t"
  71744. "movs %[a], r2\n\t"
  71745. : [a] "+l" (a), [b] "+l" (b)
  71746. :
  71747. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  71748. );
  71749. return (uint32_t)(size_t)a;
  71750. }
  71751. #endif /* WOLFSSL_SP_SMALL */
  71752. #ifdef WOLFSSL_SP_SMALL
  71753. /* Multiply a and b into r. (r = a * b)
  71754. *
  71755. * r A single precision integer.
  71756. * a A single precision integer.
  71757. * b A single precision integer.
  71758. */
  71759. SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a,
  71760. const sp_digit* b)
  71761. {
  71762. sp_digit t[48 * 2];
  71763. sp_digit* tmp = t;
  71764. __asm__ __volatile__ (
  71765. "movs r3, #0\n\t"
  71766. "movs r4, #0\n\t"
  71767. "mov r8, r3\n\t"
  71768. "mov r11, %[tmp]\n\t"
  71769. "mov r9, %[a]\n\t"
  71770. "mov r10, %[b]\n\t"
  71771. "movs r6, #0xc0\n\t"
  71772. "add r6, r6, r9\n\t"
  71773. "mov r12, r6\n\t"
  71774. "\n"
  71775. "L_sp_3072_mul_48_words_%=:\n\t"
  71776. "movs %[tmp], #0\n\t"
  71777. "movs r5, #0\n\t"
  71778. "movs r6, #0xbc\n\t"
  71779. "mov %[a], r8\n\t"
  71780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71781. "subs %[a], %[a], r6\n\t"
  71782. #else
  71783. "sub %[a], %[a], r6\n\t"
  71784. #endif
  71785. #ifdef WOLFSSL_KEIL
  71786. "sbcs r6, r6, r6\n\t"
  71787. #elif defined(__clang__)
  71788. "sbcs r6, r6\n\t"
  71789. #else
  71790. "sbc r6, r6\n\t"
  71791. #endif
  71792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71793. "mvns r6, r6\n\t"
  71794. #else
  71795. "mvn r6, r6\n\t"
  71796. #endif
  71797. #ifdef WOLFSSL_KEIL
  71798. "ands %[a], %[a], r6\n\t"
  71799. #elif defined(__clang__)
  71800. "ands %[a], r6\n\t"
  71801. #else
  71802. "and %[a], r6\n\t"
  71803. #endif
  71804. "mov %[b], r8\n\t"
  71805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71806. "subs %[b], %[b], %[a]\n\t"
  71807. #else
  71808. "sub %[b], %[b], %[a]\n\t"
  71809. #endif
  71810. "add %[a], %[a], r9\n\t"
  71811. "add %[b], %[b], r10\n\t"
  71812. "\n"
  71813. "L_sp_3072_mul_48_mul_%=:\n\t"
  71814. "# Multiply Start\n\t"
  71815. "ldrh r6, [%[a]]\n\t"
  71816. "ldrh r7, [%[b]]\n\t"
  71817. #ifdef WOLFSSL_KEIL
  71818. "muls r7, r6, r7\n\t"
  71819. #elif defined(__clang__)
  71820. "muls r7, r6\n\t"
  71821. #else
  71822. "mul r7, r6\n\t"
  71823. #endif
  71824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71825. "adds r3, r3, r7\n\t"
  71826. #else
  71827. "add r3, r3, r7\n\t"
  71828. #endif
  71829. #ifdef WOLFSSL_KEIL
  71830. "adcs r4, r4, %[tmp]\n\t"
  71831. #elif defined(__clang__)
  71832. "adcs r4, %[tmp]\n\t"
  71833. #else
  71834. "adc r4, %[tmp]\n\t"
  71835. #endif
  71836. #ifdef WOLFSSL_KEIL
  71837. "adcs r5, r5, %[tmp]\n\t"
  71838. #elif defined(__clang__)
  71839. "adcs r5, %[tmp]\n\t"
  71840. #else
  71841. "adc r5, %[tmp]\n\t"
  71842. #endif
  71843. "ldr r7, [%[b]]\n\t"
  71844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71845. "lsrs r7, r7, #16\n\t"
  71846. #else
  71847. "lsr r7, r7, #16\n\t"
  71848. #endif
  71849. #ifdef WOLFSSL_KEIL
  71850. "muls r6, r7, r6\n\t"
  71851. #elif defined(__clang__)
  71852. "muls r6, r7\n\t"
  71853. #else
  71854. "mul r6, r7\n\t"
  71855. #endif
  71856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71857. "lsrs r7, r6, #16\n\t"
  71858. #else
  71859. "lsr r7, r6, #16\n\t"
  71860. #endif
  71861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71862. "lsls r6, r6, #16\n\t"
  71863. #else
  71864. "lsl r6, r6, #16\n\t"
  71865. #endif
  71866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71867. "adds r3, r3, r6\n\t"
  71868. #else
  71869. "add r3, r3, r6\n\t"
  71870. #endif
  71871. #ifdef WOLFSSL_KEIL
  71872. "adcs r4, r4, r7\n\t"
  71873. #elif defined(__clang__)
  71874. "adcs r4, r7\n\t"
  71875. #else
  71876. "adc r4, r7\n\t"
  71877. #endif
  71878. #ifdef WOLFSSL_KEIL
  71879. "adcs r5, r5, %[tmp]\n\t"
  71880. #elif defined(__clang__)
  71881. "adcs r5, %[tmp]\n\t"
  71882. #else
  71883. "adc r5, %[tmp]\n\t"
  71884. #endif
  71885. "ldr r6, [%[a]]\n\t"
  71886. "ldr r7, [%[b]]\n\t"
  71887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71888. "lsrs r6, r6, #16\n\t"
  71889. #else
  71890. "lsr r6, r6, #16\n\t"
  71891. #endif
  71892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71893. "lsrs r7, r7, #16\n\t"
  71894. #else
  71895. "lsr r7, r7, #16\n\t"
  71896. #endif
  71897. #ifdef WOLFSSL_KEIL
  71898. "muls r7, r6, r7\n\t"
  71899. #elif defined(__clang__)
  71900. "muls r7, r6\n\t"
  71901. #else
  71902. "mul r7, r6\n\t"
  71903. #endif
  71904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71905. "adds r4, r4, r7\n\t"
  71906. #else
  71907. "add r4, r4, r7\n\t"
  71908. #endif
  71909. #ifdef WOLFSSL_KEIL
  71910. "adcs r5, r5, %[tmp]\n\t"
  71911. #elif defined(__clang__)
  71912. "adcs r5, %[tmp]\n\t"
  71913. #else
  71914. "adc r5, %[tmp]\n\t"
  71915. #endif
  71916. "ldrh r7, [%[b]]\n\t"
  71917. #ifdef WOLFSSL_KEIL
  71918. "muls r6, r7, r6\n\t"
  71919. #elif defined(__clang__)
  71920. "muls r6, r7\n\t"
  71921. #else
  71922. "mul r6, r7\n\t"
  71923. #endif
  71924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71925. "lsrs r7, r6, #16\n\t"
  71926. #else
  71927. "lsr r7, r6, #16\n\t"
  71928. #endif
  71929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71930. "lsls r6, r6, #16\n\t"
  71931. #else
  71932. "lsl r6, r6, #16\n\t"
  71933. #endif
  71934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71935. "adds r3, r3, r6\n\t"
  71936. #else
  71937. "add r3, r3, r6\n\t"
  71938. #endif
  71939. #ifdef WOLFSSL_KEIL
  71940. "adcs r4, r4, r7\n\t"
  71941. #elif defined(__clang__)
  71942. "adcs r4, r7\n\t"
  71943. #else
  71944. "adc r4, r7\n\t"
  71945. #endif
  71946. #ifdef WOLFSSL_KEIL
  71947. "adcs r5, r5, %[tmp]\n\t"
  71948. #elif defined(__clang__)
  71949. "adcs r5, %[tmp]\n\t"
  71950. #else
  71951. "adc r5, %[tmp]\n\t"
  71952. #endif
  71953. "# Multiply Done\n\t"
  71954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71955. "adds %[a], %[a], #4\n\t"
  71956. #else
  71957. "add %[a], %[a], #4\n\t"
  71958. #endif
  71959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71960. "subs %[b], %[b], #4\n\t"
  71961. #else
  71962. "sub %[b], %[b], #4\n\t"
  71963. #endif
  71964. "cmp %[a], r12\n\t"
  71965. "beq L_sp_3072_mul_48_done_mul_%=\n\t"
  71966. "mov r6, r8\n\t"
  71967. "add r6, r6, r9\n\t"
  71968. "cmp %[a], r6\n\t"
  71969. "ble L_sp_3072_mul_48_mul_%=\n\t"
  71970. "\n"
  71971. "L_sp_3072_mul_48_done_mul_%=:\n\t"
  71972. "mov %[tmp], r11\n\t"
  71973. "mov r7, r8\n\t"
  71974. "str r3, [%[tmp], r7]\n\t"
  71975. "movs r3, r4\n\t"
  71976. "movs r4, r5\n\t"
  71977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71978. "adds r7, r7, #4\n\t"
  71979. #else
  71980. "add r7, r7, #4\n\t"
  71981. #endif
  71982. "mov r8, r7\n\t"
  71983. "movs r6, #0xff\n\t"
  71984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  71985. "adds r6, r6, #0x79\n\t"
  71986. #else
  71987. "add r6, r6, #0x79\n\t"
  71988. #endif
  71989. "cmp r7, r6\n\t"
  71990. "ble L_sp_3072_mul_48_words_%=\n\t"
  71991. "str r3, [%[tmp], r7]\n\t"
  71992. "mov %[a], r9\n\t"
  71993. "mov %[b], r10\n\t"
  71994. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  71995. :
  71996. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  71997. );
  71998. XMEMCPY(r, t, sizeof(t));
  71999. }
  72000. /* Square a and put result in r. (r = a * a)
  72001. *
  72002. * r A single precision integer.
  72003. * a A single precision integer.
  72004. */
  72005. SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a)
  72006. {
  72007. __asm__ __volatile__ (
  72008. "movs r3, #0\n\t"
  72009. "movs r4, #0\n\t"
  72010. "movs r5, #0\n\t"
  72011. "mov r8, r3\n\t"
  72012. "mov r11, %[r]\n\t"
  72013. "movs r6, #0xff\n\t"
  72014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72015. "adds r6, r6, #0x81\n\t"
  72016. #else
  72017. "add r6, r6, #0x81\n\t"
  72018. #endif
  72019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72020. "negs r6, r6\n\t"
  72021. #else
  72022. "neg r6, r6\n\t"
  72023. #endif
  72024. "add sp, sp, r6\n\t"
  72025. "mov r10, sp\n\t"
  72026. "mov r9, %[a]\n\t"
  72027. "\n"
  72028. "L_sp_3072_sqr_48_words_%=:\n\t"
  72029. "movs %[r], #0\n\t"
  72030. "movs r6, #0xbc\n\t"
  72031. "mov %[a], r8\n\t"
  72032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72033. "subs %[a], %[a], r6\n\t"
  72034. #else
  72035. "sub %[a], %[a], r6\n\t"
  72036. #endif
  72037. #ifdef WOLFSSL_KEIL
  72038. "sbcs r6, r6, r6\n\t"
  72039. #elif defined(__clang__)
  72040. "sbcs r6, r6\n\t"
  72041. #else
  72042. "sbc r6, r6\n\t"
  72043. #endif
  72044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72045. "mvns r6, r6\n\t"
  72046. #else
  72047. "mvn r6, r6\n\t"
  72048. #endif
  72049. #ifdef WOLFSSL_KEIL
  72050. "ands %[a], %[a], r6\n\t"
  72051. #elif defined(__clang__)
  72052. "ands %[a], r6\n\t"
  72053. #else
  72054. "and %[a], r6\n\t"
  72055. #endif
  72056. "mov r2, r8\n\t"
  72057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72058. "subs r2, r2, %[a]\n\t"
  72059. #else
  72060. "sub r2, r2, %[a]\n\t"
  72061. #endif
  72062. "add %[a], %[a], r9\n\t"
  72063. "add r2, r2, r9\n\t"
  72064. "\n"
  72065. "L_sp_3072_sqr_48_mul_%=:\n\t"
  72066. "cmp r2, %[a]\n\t"
  72067. "beq L_sp_3072_sqr_48_sqr_%=\n\t"
  72068. "# Multiply * 2: Start\n\t"
  72069. "ldrh r6, [%[a]]\n\t"
  72070. "ldrh r7, [r2]\n\t"
  72071. #ifdef WOLFSSL_KEIL
  72072. "muls r7, r6, r7\n\t"
  72073. #elif defined(__clang__)
  72074. "muls r7, r6\n\t"
  72075. #else
  72076. "mul r7, r6\n\t"
  72077. #endif
  72078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72079. "adds r3, r3, r7\n\t"
  72080. #else
  72081. "add r3, r3, r7\n\t"
  72082. #endif
  72083. #ifdef WOLFSSL_KEIL
  72084. "adcs r4, r4, %[r]\n\t"
  72085. #elif defined(__clang__)
  72086. "adcs r4, %[r]\n\t"
  72087. #else
  72088. "adc r4, %[r]\n\t"
  72089. #endif
  72090. #ifdef WOLFSSL_KEIL
  72091. "adcs r5, r5, %[r]\n\t"
  72092. #elif defined(__clang__)
  72093. "adcs r5, %[r]\n\t"
  72094. #else
  72095. "adc r5, %[r]\n\t"
  72096. #endif
  72097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72098. "adds r3, r3, r7\n\t"
  72099. #else
  72100. "add r3, r3, r7\n\t"
  72101. #endif
  72102. #ifdef WOLFSSL_KEIL
  72103. "adcs r4, r4, %[r]\n\t"
  72104. #elif defined(__clang__)
  72105. "adcs r4, %[r]\n\t"
  72106. #else
  72107. "adc r4, %[r]\n\t"
  72108. #endif
  72109. #ifdef WOLFSSL_KEIL
  72110. "adcs r5, r5, %[r]\n\t"
  72111. #elif defined(__clang__)
  72112. "adcs r5, %[r]\n\t"
  72113. #else
  72114. "adc r5, %[r]\n\t"
  72115. #endif
  72116. "ldr r7, [r2]\n\t"
  72117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72118. "lsrs r7, r7, #16\n\t"
  72119. #else
  72120. "lsr r7, r7, #16\n\t"
  72121. #endif
  72122. #ifdef WOLFSSL_KEIL
  72123. "muls r6, r7, r6\n\t"
  72124. #elif defined(__clang__)
  72125. "muls r6, r7\n\t"
  72126. #else
  72127. "mul r6, r7\n\t"
  72128. #endif
  72129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72130. "lsrs r7, r6, #16\n\t"
  72131. #else
  72132. "lsr r7, r6, #16\n\t"
  72133. #endif
  72134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72135. "lsls r6, r6, #16\n\t"
  72136. #else
  72137. "lsl r6, r6, #16\n\t"
  72138. #endif
  72139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72140. "adds r3, r3, r6\n\t"
  72141. #else
  72142. "add r3, r3, r6\n\t"
  72143. #endif
  72144. #ifdef WOLFSSL_KEIL
  72145. "adcs r4, r4, r7\n\t"
  72146. #elif defined(__clang__)
  72147. "adcs r4, r7\n\t"
  72148. #else
  72149. "adc r4, r7\n\t"
  72150. #endif
  72151. #ifdef WOLFSSL_KEIL
  72152. "adcs r5, r5, %[r]\n\t"
  72153. #elif defined(__clang__)
  72154. "adcs r5, %[r]\n\t"
  72155. #else
  72156. "adc r5, %[r]\n\t"
  72157. #endif
  72158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72159. "adds r3, r3, r6\n\t"
  72160. #else
  72161. "add r3, r3, r6\n\t"
  72162. #endif
  72163. #ifdef WOLFSSL_KEIL
  72164. "adcs r4, r4, r7\n\t"
  72165. #elif defined(__clang__)
  72166. "adcs r4, r7\n\t"
  72167. #else
  72168. "adc r4, r7\n\t"
  72169. #endif
  72170. #ifdef WOLFSSL_KEIL
  72171. "adcs r5, r5, %[r]\n\t"
  72172. #elif defined(__clang__)
  72173. "adcs r5, %[r]\n\t"
  72174. #else
  72175. "adc r5, %[r]\n\t"
  72176. #endif
  72177. "ldr r6, [%[a]]\n\t"
  72178. "ldr r7, [r2]\n\t"
  72179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72180. "lsrs r6, r6, #16\n\t"
  72181. #else
  72182. "lsr r6, r6, #16\n\t"
  72183. #endif
  72184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72185. "lsrs r7, r7, #16\n\t"
  72186. #else
  72187. "lsr r7, r7, #16\n\t"
  72188. #endif
  72189. #ifdef WOLFSSL_KEIL
  72190. "muls r7, r6, r7\n\t"
  72191. #elif defined(__clang__)
  72192. "muls r7, r6\n\t"
  72193. #else
  72194. "mul r7, r6\n\t"
  72195. #endif
  72196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72197. "adds r4, r4, r7\n\t"
  72198. #else
  72199. "add r4, r4, r7\n\t"
  72200. #endif
  72201. #ifdef WOLFSSL_KEIL
  72202. "adcs r5, r5, %[r]\n\t"
  72203. #elif defined(__clang__)
  72204. "adcs r5, %[r]\n\t"
  72205. #else
  72206. "adc r5, %[r]\n\t"
  72207. #endif
  72208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72209. "adds r4, r4, r7\n\t"
  72210. #else
  72211. "add r4, r4, r7\n\t"
  72212. #endif
  72213. #ifdef WOLFSSL_KEIL
  72214. "adcs r5, r5, %[r]\n\t"
  72215. #elif defined(__clang__)
  72216. "adcs r5, %[r]\n\t"
  72217. #else
  72218. "adc r5, %[r]\n\t"
  72219. #endif
  72220. "ldrh r7, [r2]\n\t"
  72221. #ifdef WOLFSSL_KEIL
  72222. "muls r6, r7, r6\n\t"
  72223. #elif defined(__clang__)
  72224. "muls r6, r7\n\t"
  72225. #else
  72226. "mul r6, r7\n\t"
  72227. #endif
  72228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72229. "lsrs r7, r6, #16\n\t"
  72230. #else
  72231. "lsr r7, r6, #16\n\t"
  72232. #endif
  72233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72234. "lsls r6, r6, #16\n\t"
  72235. #else
  72236. "lsl r6, r6, #16\n\t"
  72237. #endif
  72238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72239. "adds r3, r3, r6\n\t"
  72240. #else
  72241. "add r3, r3, r6\n\t"
  72242. #endif
  72243. #ifdef WOLFSSL_KEIL
  72244. "adcs r4, r4, r7\n\t"
  72245. #elif defined(__clang__)
  72246. "adcs r4, r7\n\t"
  72247. #else
  72248. "adc r4, r7\n\t"
  72249. #endif
  72250. #ifdef WOLFSSL_KEIL
  72251. "adcs r5, r5, %[r]\n\t"
  72252. #elif defined(__clang__)
  72253. "adcs r5, %[r]\n\t"
  72254. #else
  72255. "adc r5, %[r]\n\t"
  72256. #endif
  72257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72258. "adds r3, r3, r6\n\t"
  72259. #else
  72260. "add r3, r3, r6\n\t"
  72261. #endif
  72262. #ifdef WOLFSSL_KEIL
  72263. "adcs r4, r4, r7\n\t"
  72264. #elif defined(__clang__)
  72265. "adcs r4, r7\n\t"
  72266. #else
  72267. "adc r4, r7\n\t"
  72268. #endif
  72269. #ifdef WOLFSSL_KEIL
  72270. "adcs r5, r5, %[r]\n\t"
  72271. #elif defined(__clang__)
  72272. "adcs r5, %[r]\n\t"
  72273. #else
  72274. "adc r5, %[r]\n\t"
  72275. #endif
  72276. "# Multiply * 2: Done\n\t"
  72277. "bal L_sp_3072_sqr_48_done_sqr_%=\n\t"
  72278. "\n"
  72279. "L_sp_3072_sqr_48_sqr_%=:\n\t"
  72280. "mov r12, r2\n\t"
  72281. "ldr r2, [%[a]]\n\t"
  72282. "# Square: Start\n\t"
  72283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72284. "lsrs r7, r2, #16\n\t"
  72285. #else
  72286. "lsr r7, r2, #16\n\t"
  72287. #endif
  72288. "uxth r6, r2\n\t"
  72289. #ifdef WOLFSSL_KEIL
  72290. "muls r6, r6, r6\n\t"
  72291. #elif defined(__clang__)
  72292. "muls r6, r6\n\t"
  72293. #else
  72294. "mul r6, r6\n\t"
  72295. #endif
  72296. #ifdef WOLFSSL_KEIL
  72297. "muls r7, r7, r7\n\t"
  72298. #elif defined(__clang__)
  72299. "muls r7, r7\n\t"
  72300. #else
  72301. "mul r7, r7\n\t"
  72302. #endif
  72303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72304. "adds r3, r3, r6\n\t"
  72305. #else
  72306. "add r3, r3, r6\n\t"
  72307. #endif
  72308. #ifdef WOLFSSL_KEIL
  72309. "adcs r4, r4, r7\n\t"
  72310. #elif defined(__clang__)
  72311. "adcs r4, r7\n\t"
  72312. #else
  72313. "adc r4, r7\n\t"
  72314. #endif
  72315. #ifdef WOLFSSL_KEIL
  72316. "adcs r5, r5, %[r]\n\t"
  72317. #elif defined(__clang__)
  72318. "adcs r5, %[r]\n\t"
  72319. #else
  72320. "adc r5, %[r]\n\t"
  72321. #endif
  72322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72323. "lsrs r7, r2, #16\n\t"
  72324. #else
  72325. "lsr r7, r2, #16\n\t"
  72326. #endif
  72327. "uxth r6, r2\n\t"
  72328. #ifdef WOLFSSL_KEIL
  72329. "muls r6, r7, r6\n\t"
  72330. #elif defined(__clang__)
  72331. "muls r6, r7\n\t"
  72332. #else
  72333. "mul r6, r7\n\t"
  72334. #endif
  72335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72336. "lsrs r7, r6, #15\n\t"
  72337. #else
  72338. "lsr r7, r6, #15\n\t"
  72339. #endif
  72340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72341. "lsls r6, r6, #17\n\t"
  72342. #else
  72343. "lsl r6, r6, #17\n\t"
  72344. #endif
  72345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72346. "adds r3, r3, r6\n\t"
  72347. #else
  72348. "add r3, r3, r6\n\t"
  72349. #endif
  72350. #ifdef WOLFSSL_KEIL
  72351. "adcs r4, r4, r7\n\t"
  72352. #elif defined(__clang__)
  72353. "adcs r4, r7\n\t"
  72354. #else
  72355. "adc r4, r7\n\t"
  72356. #endif
  72357. #ifdef WOLFSSL_KEIL
  72358. "adcs r5, r5, %[r]\n\t"
  72359. #elif defined(__clang__)
  72360. "adcs r5, %[r]\n\t"
  72361. #else
  72362. "adc r5, %[r]\n\t"
  72363. #endif
  72364. "# Square: Done\n\t"
  72365. "mov r2, r12\n\t"
  72366. "\n"
  72367. "L_sp_3072_sqr_48_done_sqr_%=:\n\t"
  72368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72369. "adds %[a], %[a], #4\n\t"
  72370. #else
  72371. "add %[a], %[a], #4\n\t"
  72372. #endif
  72373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72374. "subs r2, r2, #4\n\t"
  72375. #else
  72376. "sub r2, r2, #4\n\t"
  72377. #endif
  72378. "movs r6, #0xc0\n\t"
  72379. "add r6, r6, r9\n\t"
  72380. "cmp %[a], r6\n\t"
  72381. "beq L_sp_3072_sqr_48_done_mul_%=\n\t"
  72382. "cmp %[a], r2\n\t"
  72383. "bgt L_sp_3072_sqr_48_done_mul_%=\n\t"
  72384. "mov r7, r8\n\t"
  72385. "add r7, r7, r9\n\t"
  72386. "cmp %[a], r7\n\t"
  72387. "ble L_sp_3072_sqr_48_mul_%=\n\t"
  72388. "\n"
  72389. "L_sp_3072_sqr_48_done_mul_%=:\n\t"
  72390. "mov %[r], r10\n\t"
  72391. "mov r7, r8\n\t"
  72392. "str r3, [%[r], r7]\n\t"
  72393. "movs r3, r4\n\t"
  72394. "movs r4, r5\n\t"
  72395. "movs r5, #0\n\t"
  72396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72397. "adds r7, r7, #4\n\t"
  72398. #else
  72399. "add r7, r7, #4\n\t"
  72400. #endif
  72401. "mov r8, r7\n\t"
  72402. "movs r6, #0xff\n\t"
  72403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72404. "adds r6, r6, #0x79\n\t"
  72405. #else
  72406. "add r6, r6, #0x79\n\t"
  72407. #endif
  72408. "cmp r7, r6\n\t"
  72409. "ble L_sp_3072_sqr_48_words_%=\n\t"
  72410. "mov %[a], r9\n\t"
  72411. "str r3, [%[r], r7]\n\t"
  72412. "mov %[r], r11\n\t"
  72413. "mov %[a], r10\n\t"
  72414. "movs r3, #0xff\n\t"
  72415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72416. "adds r3, r3, #0x7d\n\t"
  72417. #else
  72418. "add r3, r3, #0x7d\n\t"
  72419. #endif
  72420. "\n"
  72421. "L_sp_3072_sqr_48_store_%=:\n\t"
  72422. "ldr r6, [%[a], r3]\n\t"
  72423. "str r6, [%[r], r3]\n\t"
  72424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72425. "subs r3, r3, #4\n\t"
  72426. #else
  72427. "sub r3, r3, #4\n\t"
  72428. #endif
  72429. "bge L_sp_3072_sqr_48_store_%=\n\t"
  72430. "movs r6, #0xff\n\t"
  72431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72432. "adds r6, r6, #0x81\n\t"
  72433. #else
  72434. "add r6, r6, #0x81\n\t"
  72435. #endif
  72436. "add sp, sp, r6\n\t"
  72437. : [r] "+l" (r), [a] "+l" (a)
  72438. :
  72439. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  72440. );
  72441. }
  72442. #endif /* WOLFSSL_SP_SMALL */
  72443. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  72444. /* Caclulate the bottom digit of -1/a mod 2^n.
  72445. *
  72446. * a A single precision number.
  72447. * rho Bottom word of inverse.
  72448. */
  72449. static void sp_3072_mont_setup(const sp_digit* a, sp_digit* rho)
  72450. {
  72451. sp_digit x;
  72452. sp_digit b;
  72453. b = a[0];
  72454. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  72455. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  72456. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  72457. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  72458. /* rho = -1/m mod b */
  72459. *rho = (sp_digit)0 - x;
  72460. }
  72461. /* Mul a by digit b into r. (r = a * b)
  72462. *
  72463. * r A single precision integer.
  72464. * a A single precision integer.
  72465. * b A single precision digit.
  72466. */
  72467. SP_NOINLINE static void sp_3072_mul_d_96(sp_digit* r, const sp_digit* a,
  72468. sp_digit b)
  72469. {
  72470. __asm__ __volatile__ (
  72471. "movs r6, #0xff\n\t"
  72472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72473. "adds r6, r6, #0x81\n\t"
  72474. #else
  72475. "add r6, r6, #0x81\n\t"
  72476. #endif
  72477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72478. "adds r6, r6, %[a]\n\t"
  72479. #else
  72480. "add r6, r6, %[a]\n\t"
  72481. #endif
  72482. "mov r8, %[r]\n\t"
  72483. "mov r9, r6\n\t"
  72484. "movs r3, #0\n\t"
  72485. "movs r4, #0\n\t"
  72486. "\n"
  72487. "L_sp_3072_mul_d_96_%=:\n\t"
  72488. "movs %[r], #0\n\t"
  72489. "movs r5, #0\n\t"
  72490. "# A[] * B\n\t"
  72491. "ldrh r6, [%[a]]\n\t"
  72492. "uxth r7, %[b]\n\t"
  72493. #ifdef WOLFSSL_KEIL
  72494. "muls r7, r6, r7\n\t"
  72495. #elif defined(__clang__)
  72496. "muls r7, r6\n\t"
  72497. #else
  72498. "mul r7, r6\n\t"
  72499. #endif
  72500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72501. "adds r3, r3, r7\n\t"
  72502. #else
  72503. "add r3, r3, r7\n\t"
  72504. #endif
  72505. #ifdef WOLFSSL_KEIL
  72506. "adcs r4, r4, %[r]\n\t"
  72507. #elif defined(__clang__)
  72508. "adcs r4, %[r]\n\t"
  72509. #else
  72510. "adc r4, %[r]\n\t"
  72511. #endif
  72512. #ifdef WOLFSSL_KEIL
  72513. "adcs r5, r5, %[r]\n\t"
  72514. #elif defined(__clang__)
  72515. "adcs r5, %[r]\n\t"
  72516. #else
  72517. "adc r5, %[r]\n\t"
  72518. #endif
  72519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72520. "lsrs r7, %[b], #16\n\t"
  72521. #else
  72522. "lsr r7, %[b], #16\n\t"
  72523. #endif
  72524. #ifdef WOLFSSL_KEIL
  72525. "muls r6, r7, r6\n\t"
  72526. #elif defined(__clang__)
  72527. "muls r6, r7\n\t"
  72528. #else
  72529. "mul r6, r7\n\t"
  72530. #endif
  72531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72532. "lsrs r7, r6, #16\n\t"
  72533. #else
  72534. "lsr r7, r6, #16\n\t"
  72535. #endif
  72536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72537. "lsls r6, r6, #16\n\t"
  72538. #else
  72539. "lsl r6, r6, #16\n\t"
  72540. #endif
  72541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72542. "adds r3, r3, r6\n\t"
  72543. #else
  72544. "add r3, r3, r6\n\t"
  72545. #endif
  72546. #ifdef WOLFSSL_KEIL
  72547. "adcs r4, r4, r7\n\t"
  72548. #elif defined(__clang__)
  72549. "adcs r4, r7\n\t"
  72550. #else
  72551. "adc r4, r7\n\t"
  72552. #endif
  72553. #ifdef WOLFSSL_KEIL
  72554. "adcs r5, r5, %[r]\n\t"
  72555. #elif defined(__clang__)
  72556. "adcs r5, %[r]\n\t"
  72557. #else
  72558. "adc r5, %[r]\n\t"
  72559. #endif
  72560. "ldr r6, [%[a]]\n\t"
  72561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72562. "lsrs r6, r6, #16\n\t"
  72563. #else
  72564. "lsr r6, r6, #16\n\t"
  72565. #endif
  72566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72567. "lsrs r7, %[b], #16\n\t"
  72568. #else
  72569. "lsr r7, %[b], #16\n\t"
  72570. #endif
  72571. #ifdef WOLFSSL_KEIL
  72572. "muls r7, r6, r7\n\t"
  72573. #elif defined(__clang__)
  72574. "muls r7, r6\n\t"
  72575. #else
  72576. "mul r7, r6\n\t"
  72577. #endif
  72578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72579. "adds r4, r4, r7\n\t"
  72580. #else
  72581. "add r4, r4, r7\n\t"
  72582. #endif
  72583. #ifdef WOLFSSL_KEIL
  72584. "adcs r5, r5, %[r]\n\t"
  72585. #elif defined(__clang__)
  72586. "adcs r5, %[r]\n\t"
  72587. #else
  72588. "adc r5, %[r]\n\t"
  72589. #endif
  72590. "uxth r7, %[b]\n\t"
  72591. #ifdef WOLFSSL_KEIL
  72592. "muls r6, r7, r6\n\t"
  72593. #elif defined(__clang__)
  72594. "muls r6, r7\n\t"
  72595. #else
  72596. "mul r6, r7\n\t"
  72597. #endif
  72598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72599. "lsrs r7, r6, #16\n\t"
  72600. #else
  72601. "lsr r7, r6, #16\n\t"
  72602. #endif
  72603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72604. "lsls r6, r6, #16\n\t"
  72605. #else
  72606. "lsl r6, r6, #16\n\t"
  72607. #endif
  72608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72609. "adds r3, r3, r6\n\t"
  72610. #else
  72611. "add r3, r3, r6\n\t"
  72612. #endif
  72613. #ifdef WOLFSSL_KEIL
  72614. "adcs r4, r4, r7\n\t"
  72615. #elif defined(__clang__)
  72616. "adcs r4, r7\n\t"
  72617. #else
  72618. "adc r4, r7\n\t"
  72619. #endif
  72620. #ifdef WOLFSSL_KEIL
  72621. "adcs r5, r5, %[r]\n\t"
  72622. #elif defined(__clang__)
  72623. "adcs r5, %[r]\n\t"
  72624. #else
  72625. "adc r5, %[r]\n\t"
  72626. #endif
  72627. "# A[] * B - Done\n\t"
  72628. "mov %[r], r8\n\t"
  72629. "str r3, [%[r]]\n\t"
  72630. "movs r3, r4\n\t"
  72631. "movs r4, r5\n\t"
  72632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72633. "adds %[r], %[r], #4\n\t"
  72634. #else
  72635. "add %[r], %[r], #4\n\t"
  72636. #endif
  72637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72638. "adds %[a], %[a], #4\n\t"
  72639. #else
  72640. "add %[a], %[a], #4\n\t"
  72641. #endif
  72642. "mov r8, %[r]\n\t"
  72643. "cmp %[a], r9\n\t"
  72644. "blt L_sp_3072_mul_d_96_%=\n\t"
  72645. "str r3, [%[r]]\n\t"
  72646. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  72647. :
  72648. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  72649. );
  72650. }
  72651. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  72652. /* r = 2^n mod m where n is the number of bits to reduce by.
  72653. * Given m must be 3072 bits, just need to subtract.
  72654. *
  72655. * r A single precision number.
  72656. * m A single precision number.
  72657. */
  72658. static void sp_3072_mont_norm_48(sp_digit* r, const sp_digit* m)
  72659. {
  72660. XMEMSET(r, 0, sizeof(sp_digit) * 48);
  72661. /* r = 2^n mod m */
  72662. sp_3072_sub_in_place_48(r, m);
  72663. }
  72664. /* Conditionally subtract b from a using the mask m.
  72665. * m is -1 to subtract and 0 when not copying.
  72666. *
  72667. * r A single precision number representing condition subtract result.
  72668. * a A single precision number to subtract from.
  72669. * b A single precision number to subtract.
  72670. * m Mask value to apply.
  72671. */
  72672. SP_NOINLINE static sp_digit sp_3072_cond_sub_48(sp_digit* r, const sp_digit* a,
  72673. const sp_digit* b, sp_digit m)
  72674. {
  72675. __asm__ __volatile__ (
  72676. "movs r4, #0\n\t"
  72677. "movs r5, #0xc0\n\t"
  72678. "mov r8, r5\n\t"
  72679. "movs r7, #0\n\t"
  72680. "\n"
  72681. "L_sp_3072_cond_sub_48_words_%=:\n\t"
  72682. "ldr r6, [%[b], r7]\n\t"
  72683. #ifdef WOLFSSL_KEIL
  72684. "ands r6, r6, %[m]\n\t"
  72685. #elif defined(__clang__)
  72686. "ands r6, %[m]\n\t"
  72687. #else
  72688. "and r6, %[m]\n\t"
  72689. #endif
  72690. "movs r5, #0\n\t"
  72691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72692. "subs r5, r5, r4\n\t"
  72693. #else
  72694. "sub r5, r5, r4\n\t"
  72695. #endif
  72696. "ldr r5, [%[a], r7]\n\t"
  72697. #ifdef WOLFSSL_KEIL
  72698. "sbcs r5, r5, r6\n\t"
  72699. #elif defined(__clang__)
  72700. "sbcs r5, r6\n\t"
  72701. #else
  72702. "sbc r5, r6\n\t"
  72703. #endif
  72704. #ifdef WOLFSSL_KEIL
  72705. "sbcs r4, r4, r4\n\t"
  72706. #elif defined(__clang__)
  72707. "sbcs r4, r4\n\t"
  72708. #else
  72709. "sbc r4, r4\n\t"
  72710. #endif
  72711. "str r5, [%[r], r7]\n\t"
  72712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72713. "adds r7, r7, #4\n\t"
  72714. #else
  72715. "add r7, r7, #4\n\t"
  72716. #endif
  72717. "cmp r7, r8\n\t"
  72718. "blt L_sp_3072_cond_sub_48_words_%=\n\t"
  72719. "movs %[r], r4\n\t"
  72720. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  72721. :
  72722. : "memory", "r4", "r5", "r6", "r7", "r8"
  72723. );
  72724. return (uint32_t)(size_t)r;
  72725. }
  72726. /* Reduce the number back to 3072 bits using Montgomery reduction.
  72727. *
  72728. * a A single precision number to reduce in place.
  72729. * m The single precision number representing the modulus.
  72730. * mp The digit representing the negative inverse of m mod 2^n.
  72731. */
  72732. SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a, const sp_digit* m,
  72733. sp_digit mp)
  72734. {
  72735. __asm__ __volatile__ (
  72736. "movs r7, #0\n\t"
  72737. "mov r8, %[mp]\n\t"
  72738. "mov r12, r7\n\t"
  72739. "mov lr, %[m]\n\t"
  72740. "mov r9, %[a]\n\t"
  72741. "mov r11, %[a]\n\t"
  72742. "movs r5, #0xbc\n\t"
  72743. "movs r6, #0xc0\n\t"
  72744. "add r9, r9, r5\n\t"
  72745. "add r11, r11, r6\n\t"
  72746. "\n"
  72747. "L_sp_3072_mont_reduce_48_mod_%=:\n\t"
  72748. "movs r7, #0\n\t"
  72749. "movs r4, #0\n\t"
  72750. "# a[i] += m[0] * mu\n\t"
  72751. "ldm %[m]!, {%[mp]}\n\t"
  72752. "ldm %[a]!, {r3}\n\t"
  72753. "# mu = a[i] * mp\n\t"
  72754. "mov r5, r8\n\t"
  72755. #ifdef WOLFSSL_KEIL
  72756. "muls r5, r3, r5\n\t"
  72757. #elif defined(__clang__)
  72758. "muls r5, r3\n\t"
  72759. #else
  72760. "mul r5, r3\n\t"
  72761. #endif
  72762. "mov r10, r5\n\t"
  72763. "# Multiply m[0] and mu - Start\n\t"
  72764. "mov r5, r10\n\t"
  72765. "uxth r6, %[mp]\n\t"
  72766. "uxth r5, r5\n\t"
  72767. #ifdef WOLFSSL_KEIL
  72768. "muls r6, r5, r6\n\t"
  72769. #elif defined(__clang__)
  72770. "muls r6, r5\n\t"
  72771. #else
  72772. "mul r6, r5\n\t"
  72773. #endif
  72774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72775. "adds r3, r3, r6\n\t"
  72776. #else
  72777. "add r3, r3, r6\n\t"
  72778. #endif
  72779. #ifdef WOLFSSL_KEIL
  72780. "adcs r4, r4, r7\n\t"
  72781. #elif defined(__clang__)
  72782. "adcs r4, r7\n\t"
  72783. #else
  72784. "adc r4, r7\n\t"
  72785. #endif
  72786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72787. "lsrs r6, %[mp], #16\n\t"
  72788. #else
  72789. "lsr r6, %[mp], #16\n\t"
  72790. #endif
  72791. #ifdef WOLFSSL_KEIL
  72792. "muls r5, r6, r5\n\t"
  72793. #elif defined(__clang__)
  72794. "muls r5, r6\n\t"
  72795. #else
  72796. "mul r5, r6\n\t"
  72797. #endif
  72798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72799. "lsrs r6, r5, #16\n\t"
  72800. #else
  72801. "lsr r6, r5, #16\n\t"
  72802. #endif
  72803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72804. "lsls r5, r5, #16\n\t"
  72805. #else
  72806. "lsl r5, r5, #16\n\t"
  72807. #endif
  72808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72809. "adds r3, r3, r5\n\t"
  72810. #else
  72811. "add r3, r3, r5\n\t"
  72812. #endif
  72813. #ifdef WOLFSSL_KEIL
  72814. "adcs r4, r4, r6\n\t"
  72815. #elif defined(__clang__)
  72816. "adcs r4, r6\n\t"
  72817. #else
  72818. "adc r4, r6\n\t"
  72819. #endif
  72820. "mov r5, r10\n\t"
  72821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72822. "lsrs r6, %[mp], #16\n\t"
  72823. #else
  72824. "lsr r6, %[mp], #16\n\t"
  72825. #endif
  72826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72827. "lsrs r5, r5, #16\n\t"
  72828. #else
  72829. "lsr r5, r5, #16\n\t"
  72830. #endif
  72831. #ifdef WOLFSSL_KEIL
  72832. "muls r6, r5, r6\n\t"
  72833. #elif defined(__clang__)
  72834. "muls r6, r5\n\t"
  72835. #else
  72836. "mul r6, r5\n\t"
  72837. #endif
  72838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72839. "adds r4, r4, r6\n\t"
  72840. #else
  72841. "add r4, r4, r6\n\t"
  72842. #endif
  72843. "uxth r6, %[mp]\n\t"
  72844. #ifdef WOLFSSL_KEIL
  72845. "muls r5, r6, r5\n\t"
  72846. #elif defined(__clang__)
  72847. "muls r5, r6\n\t"
  72848. #else
  72849. "mul r5, r6\n\t"
  72850. #endif
  72851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72852. "lsrs r6, r5, #16\n\t"
  72853. #else
  72854. "lsr r6, r5, #16\n\t"
  72855. #endif
  72856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72857. "lsls r5, r5, #16\n\t"
  72858. #else
  72859. "lsl r5, r5, #16\n\t"
  72860. #endif
  72861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72862. "adds r3, r3, r5\n\t"
  72863. #else
  72864. "add r3, r3, r5\n\t"
  72865. #endif
  72866. #ifdef WOLFSSL_KEIL
  72867. "adcs r4, r4, r6\n\t"
  72868. #elif defined(__clang__)
  72869. "adcs r4, r6\n\t"
  72870. #else
  72871. "adc r4, r6\n\t"
  72872. #endif
  72873. "# Multiply m[0] and mu - Done\n\t"
  72874. "\n"
  72875. "L_sp_3072_mont_reduce_48_word_%=:\n\t"
  72876. "# a[i+j] += m[j] * mu\n\t"
  72877. "ldr r3, [%[a]]\n\t"
  72878. "ldm %[m]!, {%[mp]}\n\t"
  72879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72880. "adds r3, r3, r4\n\t"
  72881. #else
  72882. "add r3, r3, r4\n\t"
  72883. #endif
  72884. "movs r4, #0\n\t"
  72885. #ifdef WOLFSSL_KEIL
  72886. "adcs r4, r4, r7\n\t"
  72887. #elif defined(__clang__)
  72888. "adcs r4, r7\n\t"
  72889. #else
  72890. "adc r4, r7\n\t"
  72891. #endif
  72892. "# Multiply m[j] and mu - Start\n\t"
  72893. "mov r5, r10\n\t"
  72894. "uxth r6, %[mp]\n\t"
  72895. "uxth r5, r5\n\t"
  72896. #ifdef WOLFSSL_KEIL
  72897. "muls r6, r5, r6\n\t"
  72898. #elif defined(__clang__)
  72899. "muls r6, r5\n\t"
  72900. #else
  72901. "mul r6, r5\n\t"
  72902. #endif
  72903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72904. "adds r3, r3, r6\n\t"
  72905. #else
  72906. "add r3, r3, r6\n\t"
  72907. #endif
  72908. #ifdef WOLFSSL_KEIL
  72909. "adcs r4, r4, r7\n\t"
  72910. #elif defined(__clang__)
  72911. "adcs r4, r7\n\t"
  72912. #else
  72913. "adc r4, r7\n\t"
  72914. #endif
  72915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72916. "lsrs r6, %[mp], #16\n\t"
  72917. #else
  72918. "lsr r6, %[mp], #16\n\t"
  72919. #endif
  72920. #ifdef WOLFSSL_KEIL
  72921. "muls r5, r6, r5\n\t"
  72922. #elif defined(__clang__)
  72923. "muls r5, r6\n\t"
  72924. #else
  72925. "mul r5, r6\n\t"
  72926. #endif
  72927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72928. "lsrs r6, r5, #16\n\t"
  72929. #else
  72930. "lsr r6, r5, #16\n\t"
  72931. #endif
  72932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72933. "lsls r5, r5, #16\n\t"
  72934. #else
  72935. "lsl r5, r5, #16\n\t"
  72936. #endif
  72937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72938. "adds r3, r3, r5\n\t"
  72939. #else
  72940. "add r3, r3, r5\n\t"
  72941. #endif
  72942. #ifdef WOLFSSL_KEIL
  72943. "adcs r4, r4, r6\n\t"
  72944. #elif defined(__clang__)
  72945. "adcs r4, r6\n\t"
  72946. #else
  72947. "adc r4, r6\n\t"
  72948. #endif
  72949. "mov r5, r10\n\t"
  72950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72951. "lsrs r6, %[mp], #16\n\t"
  72952. #else
  72953. "lsr r6, %[mp], #16\n\t"
  72954. #endif
  72955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72956. "lsrs r5, r5, #16\n\t"
  72957. #else
  72958. "lsr r5, r5, #16\n\t"
  72959. #endif
  72960. #ifdef WOLFSSL_KEIL
  72961. "muls r6, r5, r6\n\t"
  72962. #elif defined(__clang__)
  72963. "muls r6, r5\n\t"
  72964. #else
  72965. "mul r6, r5\n\t"
  72966. #endif
  72967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72968. "adds r4, r4, r6\n\t"
  72969. #else
  72970. "add r4, r4, r6\n\t"
  72971. #endif
  72972. "uxth r6, %[mp]\n\t"
  72973. #ifdef WOLFSSL_KEIL
  72974. "muls r5, r6, r5\n\t"
  72975. #elif defined(__clang__)
  72976. "muls r5, r6\n\t"
  72977. #else
  72978. "mul r5, r6\n\t"
  72979. #endif
  72980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72981. "lsrs r6, r5, #16\n\t"
  72982. #else
  72983. "lsr r6, r5, #16\n\t"
  72984. #endif
  72985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72986. "lsls r5, r5, #16\n\t"
  72987. #else
  72988. "lsl r5, r5, #16\n\t"
  72989. #endif
  72990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  72991. "adds r3, r3, r5\n\t"
  72992. #else
  72993. "add r3, r3, r5\n\t"
  72994. #endif
  72995. #ifdef WOLFSSL_KEIL
  72996. "adcs r4, r4, r6\n\t"
  72997. #elif defined(__clang__)
  72998. "adcs r4, r6\n\t"
  72999. #else
  73000. "adc r4, r6\n\t"
  73001. #endif
  73002. "# Multiply m[j] and mu - Done\n\t"
  73003. "stm %[a]!, {r3}\n\t"
  73004. "cmp %[a], r9\n\t"
  73005. "blt L_sp_3072_mont_reduce_48_word_%=\n\t"
  73006. "# a[i+47] += m[47] * mu\n\t"
  73007. "ldr %[mp], [%[m]]\n\t"
  73008. "mov r3, r12\n\t"
  73009. "# Multiply m[47] and mu - Start\n\t"
  73010. "mov r5, r10\n\t"
  73011. "uxth r6, %[mp]\n\t"
  73012. "uxth r5, r5\n\t"
  73013. #ifdef WOLFSSL_KEIL
  73014. "muls r6, r5, r6\n\t"
  73015. #elif defined(__clang__)
  73016. "muls r6, r5\n\t"
  73017. #else
  73018. "mul r6, r5\n\t"
  73019. #endif
  73020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73021. "adds r4, r4, r6\n\t"
  73022. #else
  73023. "add r4, r4, r6\n\t"
  73024. #endif
  73025. #ifdef WOLFSSL_KEIL
  73026. "adcs r3, r3, r7\n\t"
  73027. #elif defined(__clang__)
  73028. "adcs r3, r7\n\t"
  73029. #else
  73030. "adc r3, r7\n\t"
  73031. #endif
  73032. #ifdef WOLFSSL_KEIL
  73033. "adcs r7, r7, r7\n\t"
  73034. #elif defined(__clang__)
  73035. "adcs r7, r7\n\t"
  73036. #else
  73037. "adc r7, r7\n\t"
  73038. #endif
  73039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73040. "lsrs r6, %[mp], #16\n\t"
  73041. #else
  73042. "lsr r6, %[mp], #16\n\t"
  73043. #endif
  73044. #ifdef WOLFSSL_KEIL
  73045. "muls r5, r6, r5\n\t"
  73046. #elif defined(__clang__)
  73047. "muls r5, r6\n\t"
  73048. #else
  73049. "mul r5, r6\n\t"
  73050. #endif
  73051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73052. "lsrs r6, r5, #16\n\t"
  73053. #else
  73054. "lsr r6, r5, #16\n\t"
  73055. #endif
  73056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73057. "lsls r5, r5, #16\n\t"
  73058. #else
  73059. "lsl r5, r5, #16\n\t"
  73060. #endif
  73061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73062. "adds r4, r4, r5\n\t"
  73063. #else
  73064. "add r4, r4, r5\n\t"
  73065. #endif
  73066. #ifdef WOLFSSL_KEIL
  73067. "adcs r3, r3, r6\n\t"
  73068. #elif defined(__clang__)
  73069. "adcs r3, r6\n\t"
  73070. #else
  73071. "adc r3, r6\n\t"
  73072. #endif
  73073. #ifdef WOLFSSL_KEIL
  73074. "adcs r7, r7, r7\n\t"
  73075. #elif defined(__clang__)
  73076. "adcs r7, r7\n\t"
  73077. #else
  73078. "adc r7, r7\n\t"
  73079. #endif
  73080. "mov r5, r10\n\t"
  73081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73082. "lsrs r6, %[mp], #16\n\t"
  73083. #else
  73084. "lsr r6, %[mp], #16\n\t"
  73085. #endif
  73086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73087. "lsrs r5, r5, #16\n\t"
  73088. #else
  73089. "lsr r5, r5, #16\n\t"
  73090. #endif
  73091. #ifdef WOLFSSL_KEIL
  73092. "muls r6, r5, r6\n\t"
  73093. #elif defined(__clang__)
  73094. "muls r6, r5\n\t"
  73095. #else
  73096. "mul r6, r5\n\t"
  73097. #endif
  73098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73099. "adds r3, r3, r6\n\t"
  73100. #else
  73101. "add r3, r3, r6\n\t"
  73102. #endif
  73103. #ifdef WOLFSSL_KEIL
  73104. "adcs r7, r7, r7\n\t"
  73105. #elif defined(__clang__)
  73106. "adcs r7, r7\n\t"
  73107. #else
  73108. "adc r7, r7\n\t"
  73109. #endif
  73110. "uxth r6, %[mp]\n\t"
  73111. #ifdef WOLFSSL_KEIL
  73112. "muls r5, r6, r5\n\t"
  73113. #elif defined(__clang__)
  73114. "muls r5, r6\n\t"
  73115. #else
  73116. "mul r5, r6\n\t"
  73117. #endif
  73118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73119. "lsrs r6, r5, #16\n\t"
  73120. #else
  73121. "lsr r6, r5, #16\n\t"
  73122. #endif
  73123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73124. "lsls r5, r5, #16\n\t"
  73125. #else
  73126. "lsl r5, r5, #16\n\t"
  73127. #endif
  73128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73129. "adds r4, r4, r5\n\t"
  73130. #else
  73131. "add r4, r4, r5\n\t"
  73132. #endif
  73133. #ifdef WOLFSSL_KEIL
  73134. "adcs r3, r3, r6\n\t"
  73135. #elif defined(__clang__)
  73136. "adcs r3, r6\n\t"
  73137. #else
  73138. "adc r3, r6\n\t"
  73139. #endif
  73140. #ifdef WOLFSSL_KEIL
  73141. "adcs r7, r7, r7\n\t"
  73142. #elif defined(__clang__)
  73143. "adcs r7, r7\n\t"
  73144. #else
  73145. "adc r7, r7\n\t"
  73146. #endif
  73147. "# Multiply m[47] and mu - Done\n\t"
  73148. "ldr r5, [%[a]]\n\t"
  73149. "ldr r6, [%[a], #4]\n\t"
  73150. "movs %[mp], #0\n\t"
  73151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73152. "adds r5, r5, r4\n\t"
  73153. #else
  73154. "add r5, r5, r4\n\t"
  73155. #endif
  73156. #ifdef WOLFSSL_KEIL
  73157. "adcs r6, r6, r3\n\t"
  73158. #elif defined(__clang__)
  73159. "adcs r6, r3\n\t"
  73160. #else
  73161. "adc r6, r3\n\t"
  73162. #endif
  73163. #ifdef WOLFSSL_KEIL
  73164. "adcs r7, r7, %[mp]\n\t"
  73165. #elif defined(__clang__)
  73166. "adcs r7, %[mp]\n\t"
  73167. #else
  73168. "adc r7, %[mp]\n\t"
  73169. #endif
  73170. "stm %[a]!, {r5, r6}\n\t"
  73171. "# i += 1\n\t"
  73172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73173. "subs %[a], %[a], #4\n\t"
  73174. #else
  73175. "sub %[a], %[a], #4\n\t"
  73176. #endif
  73177. "movs r3, #0xbc\n\t"
  73178. "mov r9, %[a]\n\t"
  73179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73180. "subs %[a], %[a], r3\n\t"
  73181. #else
  73182. "sub %[a], %[a], r3\n\t"
  73183. #endif
  73184. "mov r12, r7\n\t"
  73185. "mov %[m], lr\n\t"
  73186. "cmp r11, %[a]\n\t"
  73187. "bgt L_sp_3072_mont_reduce_48_mod_%=\n\t"
  73188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73189. "negs r7, r7\n\t"
  73190. #else
  73191. "neg r7, r7\n\t"
  73192. #endif
  73193. "# Subtract masked modulus\n\t"
  73194. "movs r4, #0xc0\n\t"
  73195. "movs %[mp], #0\n\t"
  73196. "movs r3, #0\n\t"
  73197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73198. "subs %[a], %[a], r4\n\t"
  73199. #else
  73200. "sub %[a], %[a], r4\n\t"
  73201. #endif
  73202. #ifndef WOLFSSL_SP_LARGE_CODE
  73203. "\n"
  73204. "L_sp_3072_mont_reduce_48_sub_mask_%=:\n\t"
  73205. "ldm %[m]!, {r6}\n\t"
  73206. "movs r5, #0\n\t"
  73207. #ifdef WOLFSSL_KEIL
  73208. "ands r6, r6, r7\n\t"
  73209. #elif defined(__clang__)
  73210. "ands r6, r7\n\t"
  73211. #else
  73212. "and r6, r7\n\t"
  73213. #endif
  73214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73215. "subs r5, r5, %[mp]\n\t"
  73216. #else
  73217. "sub r5, r5, %[mp]\n\t"
  73218. #endif
  73219. "ldr r5, [%[a], r4]\n\t"
  73220. #ifdef WOLFSSL_KEIL
  73221. "sbcs r5, r5, r6\n\t"
  73222. #elif defined(__clang__)
  73223. "sbcs r5, r6\n\t"
  73224. #else
  73225. "sbc r5, r6\n\t"
  73226. #endif
  73227. #ifdef WOLFSSL_KEIL
  73228. "sbcs %[mp], %[mp], %[mp]\n\t"
  73229. #elif defined(__clang__)
  73230. "sbcs %[mp], %[mp]\n\t"
  73231. #else
  73232. "sbc %[mp], %[mp]\n\t"
  73233. #endif
  73234. "stm %[a]!, {r5}\n\t"
  73235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73236. "adds r3, r3, #4\n\t"
  73237. #else
  73238. "add r3, r3, #4\n\t"
  73239. #endif
  73240. "cmp r3, r4\n\t"
  73241. "blt L_sp_3072_mont_reduce_48_sub_mask_%=\n\t"
  73242. #else /* WOLFSSL_SP_LARGE_CODE */
  73243. "ldm %[m]!, {r6}\n\t"
  73244. #ifdef WOLFSSL_KEIL
  73245. "ands r6, r6, r7\n\t"
  73246. #elif defined(__clang__)
  73247. "ands r6, r7\n\t"
  73248. #else
  73249. "and r6, r7\n\t"
  73250. #endif
  73251. "ldr r5, [%[a], r4]\n\t"
  73252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  73253. "subs r5, r5, r6\n\t"
  73254. #else
  73255. "sub r5, r5, r6\n\t"
  73256. #endif
  73257. "stm %[a]!, {r5}\n\t"
  73258. "ldm %[m]!, {r6}\n\t"
  73259. #ifdef WOLFSSL_KEIL
  73260. "ands r6, r6, r7\n\t"
  73261. #elif defined(__clang__)
  73262. "ands r6, r7\n\t"
  73263. #else
  73264. "and r6, r7\n\t"
  73265. #endif
  73266. "ldr r5, [%[a], r4]\n\t"
  73267. #ifdef WOLFSSL_KEIL
  73268. "sbcs r5, r5, r6\n\t"
  73269. #elif defined(__clang__)
  73270. "sbcs r5, r6\n\t"
  73271. #else
  73272. "sbc r5, r6\n\t"
  73273. #endif
  73274. "stm %[a]!, {r5}\n\t"
  73275. "ldm %[m]!, {r6}\n\t"
  73276. #ifdef WOLFSSL_KEIL
  73277. "ands r6, r6, r7\n\t"
  73278. #elif defined(__clang__)
  73279. "ands r6, r7\n\t"
  73280. #else
  73281. "and r6, r7\n\t"
  73282. #endif
  73283. "ldr r5, [%[a], r4]\n\t"
  73284. #ifdef WOLFSSL_KEIL
  73285. "sbcs r5, r5, r6\n\t"
  73286. #elif defined(__clang__)
  73287. "sbcs r5, r6\n\t"
  73288. #else
  73289. "sbc r5, r6\n\t"
  73290. #endif
  73291. "stm %[a]!, {r5}\n\t"
  73292. "ldm %[m]!, {r6}\n\t"
  73293. #ifdef WOLFSSL_KEIL
  73294. "ands r6, r6, r7\n\t"
  73295. #elif defined(__clang__)
  73296. "ands r6, r7\n\t"
  73297. #else
  73298. "and r6, r7\n\t"
  73299. #endif
  73300. "ldr r5, [%[a], r4]\n\t"
  73301. #ifdef WOLFSSL_KEIL
  73302. "sbcs r5, r5, r6\n\t"
  73303. #elif defined(__clang__)
  73304. "sbcs r5, r6\n\t"
  73305. #else
  73306. "sbc r5, r6\n\t"
  73307. #endif
  73308. "stm %[a]!, {r5}\n\t"
  73309. "ldm %[m]!, {r6}\n\t"
  73310. #ifdef WOLFSSL_KEIL
  73311. "ands r6, r6, r7\n\t"
  73312. #elif defined(__clang__)
  73313. "ands r6, r7\n\t"
  73314. #else
  73315. "and r6, r7\n\t"
  73316. #endif
  73317. "ldr r5, [%[a], r4]\n\t"
  73318. #ifdef WOLFSSL_KEIL
  73319. "sbcs r5, r5, r6\n\t"
  73320. #elif defined(__clang__)
  73321. "sbcs r5, r6\n\t"
  73322. #else
  73323. "sbc r5, r6\n\t"
  73324. #endif
  73325. "stm %[a]!, {r5}\n\t"
  73326. "ldm %[m]!, {r6}\n\t"
  73327. #ifdef WOLFSSL_KEIL
  73328. "ands r6, r6, r7\n\t"
  73329. #elif defined(__clang__)
  73330. "ands r6, r7\n\t"
  73331. #else
  73332. "and r6, r7\n\t"
  73333. #endif
  73334. "ldr r5, [%[a], r4]\n\t"
  73335. #ifdef WOLFSSL_KEIL
  73336. "sbcs r5, r5, r6\n\t"
  73337. #elif defined(__clang__)
  73338. "sbcs r5, r6\n\t"
  73339. #else
  73340. "sbc r5, r6\n\t"
  73341. #endif
  73342. "stm %[a]!, {r5}\n\t"
  73343. "ldm %[m]!, {r6}\n\t"
  73344. #ifdef WOLFSSL_KEIL
  73345. "ands r6, r6, r7\n\t"
  73346. #elif defined(__clang__)
  73347. "ands r6, r7\n\t"
  73348. #else
  73349. "and r6, r7\n\t"
  73350. #endif
  73351. "ldr r5, [%[a], r4]\n\t"
  73352. #ifdef WOLFSSL_KEIL
  73353. "sbcs r5, r5, r6\n\t"
  73354. #elif defined(__clang__)
  73355. "sbcs r5, r6\n\t"
  73356. #else
  73357. "sbc r5, r6\n\t"
  73358. #endif
  73359. "stm %[a]!, {r5}\n\t"
  73360. "ldm %[m]!, {r6}\n\t"
  73361. #ifdef WOLFSSL_KEIL
  73362. "ands r6, r6, r7\n\t"
  73363. #elif defined(__clang__)
  73364. "ands r6, r7\n\t"
  73365. #else
  73366. "and r6, r7\n\t"
  73367. #endif
  73368. "ldr r5, [%[a], r4]\n\t"
  73369. #ifdef WOLFSSL_KEIL
  73370. "sbcs r5, r5, r6\n\t"
  73371. #elif defined(__clang__)
  73372. "sbcs r5, r6\n\t"
  73373. #else
  73374. "sbc r5, r6\n\t"
  73375. #endif
  73376. "stm %[a]!, {r5}\n\t"
  73377. "ldm %[m]!, {r6}\n\t"
  73378. #ifdef WOLFSSL_KEIL
  73379. "ands r6, r6, r7\n\t"
  73380. #elif defined(__clang__)
  73381. "ands r6, r7\n\t"
  73382. #else
  73383. "and r6, r7\n\t"
  73384. #endif
  73385. "ldr r5, [%[a], r4]\n\t"
  73386. #ifdef WOLFSSL_KEIL
  73387. "sbcs r5, r5, r6\n\t"
  73388. #elif defined(__clang__)
  73389. "sbcs r5, r6\n\t"
  73390. #else
  73391. "sbc r5, r6\n\t"
  73392. #endif
  73393. "stm %[a]!, {r5}\n\t"
  73394. "ldm %[m]!, {r6}\n\t"
  73395. #ifdef WOLFSSL_KEIL
  73396. "ands r6, r6, r7\n\t"
  73397. #elif defined(__clang__)
  73398. "ands r6, r7\n\t"
  73399. #else
  73400. "and r6, r7\n\t"
  73401. #endif
  73402. "ldr r5, [%[a], r4]\n\t"
  73403. #ifdef WOLFSSL_KEIL
  73404. "sbcs r5, r5, r6\n\t"
  73405. #elif defined(__clang__)
  73406. "sbcs r5, r6\n\t"
  73407. #else
  73408. "sbc r5, r6\n\t"
  73409. #endif
  73410. "stm %[a]!, {r5}\n\t"
  73411. "ldm %[m]!, {r6}\n\t"
  73412. #ifdef WOLFSSL_KEIL
  73413. "ands r6, r6, r7\n\t"
  73414. #elif defined(__clang__)
  73415. "ands r6, r7\n\t"
  73416. #else
  73417. "and r6, r7\n\t"
  73418. #endif
  73419. "ldr r5, [%[a], r4]\n\t"
  73420. #ifdef WOLFSSL_KEIL
  73421. "sbcs r5, r5, r6\n\t"
  73422. #elif defined(__clang__)
  73423. "sbcs r5, r6\n\t"
  73424. #else
  73425. "sbc r5, r6\n\t"
  73426. #endif
  73427. "stm %[a]!, {r5}\n\t"
  73428. "ldm %[m]!, {r6}\n\t"
  73429. #ifdef WOLFSSL_KEIL
  73430. "ands r6, r6, r7\n\t"
  73431. #elif defined(__clang__)
  73432. "ands r6, r7\n\t"
  73433. #else
  73434. "and r6, r7\n\t"
  73435. #endif
  73436. "ldr r5, [%[a], r4]\n\t"
  73437. #ifdef WOLFSSL_KEIL
  73438. "sbcs r5, r5, r6\n\t"
  73439. #elif defined(__clang__)
  73440. "sbcs r5, r6\n\t"
  73441. #else
  73442. "sbc r5, r6\n\t"
  73443. #endif
  73444. "stm %[a]!, {r5}\n\t"
  73445. "ldm %[m]!, {r6}\n\t"
  73446. #ifdef WOLFSSL_KEIL
  73447. "ands r6, r6, r7\n\t"
  73448. #elif defined(__clang__)
  73449. "ands r6, r7\n\t"
  73450. #else
  73451. "and r6, r7\n\t"
  73452. #endif
  73453. "ldr r5, [%[a], r4]\n\t"
  73454. #ifdef WOLFSSL_KEIL
  73455. "sbcs r5, r5, r6\n\t"
  73456. #elif defined(__clang__)
  73457. "sbcs r5, r6\n\t"
  73458. #else
  73459. "sbc r5, r6\n\t"
  73460. #endif
  73461. "stm %[a]!, {r5}\n\t"
  73462. "ldm %[m]!, {r6}\n\t"
  73463. #ifdef WOLFSSL_KEIL
  73464. "ands r6, r6, r7\n\t"
  73465. #elif defined(__clang__)
  73466. "ands r6, r7\n\t"
  73467. #else
  73468. "and r6, r7\n\t"
  73469. #endif
  73470. "ldr r5, [%[a], r4]\n\t"
  73471. #ifdef WOLFSSL_KEIL
  73472. "sbcs r5, r5, r6\n\t"
  73473. #elif defined(__clang__)
  73474. "sbcs r5, r6\n\t"
  73475. #else
  73476. "sbc r5, r6\n\t"
  73477. #endif
  73478. "stm %[a]!, {r5}\n\t"
  73479. "ldm %[m]!, {r6}\n\t"
  73480. #ifdef WOLFSSL_KEIL
  73481. "ands r6, r6, r7\n\t"
  73482. #elif defined(__clang__)
  73483. "ands r6, r7\n\t"
  73484. #else
  73485. "and r6, r7\n\t"
  73486. #endif
  73487. "ldr r5, [%[a], r4]\n\t"
  73488. #ifdef WOLFSSL_KEIL
  73489. "sbcs r5, r5, r6\n\t"
  73490. #elif defined(__clang__)
  73491. "sbcs r5, r6\n\t"
  73492. #else
  73493. "sbc r5, r6\n\t"
  73494. #endif
  73495. "stm %[a]!, {r5}\n\t"
  73496. "ldm %[m]!, {r6}\n\t"
  73497. #ifdef WOLFSSL_KEIL
  73498. "ands r6, r6, r7\n\t"
  73499. #elif defined(__clang__)
  73500. "ands r6, r7\n\t"
  73501. #else
  73502. "and r6, r7\n\t"
  73503. #endif
  73504. "ldr r5, [%[a], r4]\n\t"
  73505. #ifdef WOLFSSL_KEIL
  73506. "sbcs r5, r5, r6\n\t"
  73507. #elif defined(__clang__)
  73508. "sbcs r5, r6\n\t"
  73509. #else
  73510. "sbc r5, r6\n\t"
  73511. #endif
  73512. "stm %[a]!, {r5}\n\t"
  73513. "ldm %[m]!, {r6}\n\t"
  73514. #ifdef WOLFSSL_KEIL
  73515. "ands r6, r6, r7\n\t"
  73516. #elif defined(__clang__)
  73517. "ands r6, r7\n\t"
  73518. #else
  73519. "and r6, r7\n\t"
  73520. #endif
  73521. "ldr r5, [%[a], r4]\n\t"
  73522. #ifdef WOLFSSL_KEIL
  73523. "sbcs r5, r5, r6\n\t"
  73524. #elif defined(__clang__)
  73525. "sbcs r5, r6\n\t"
  73526. #else
  73527. "sbc r5, r6\n\t"
  73528. #endif
  73529. "stm %[a]!, {r5}\n\t"
  73530. "ldm %[m]!, {r6}\n\t"
  73531. #ifdef WOLFSSL_KEIL
  73532. "ands r6, r6, r7\n\t"
  73533. #elif defined(__clang__)
  73534. "ands r6, r7\n\t"
  73535. #else
  73536. "and r6, r7\n\t"
  73537. #endif
  73538. "ldr r5, [%[a], r4]\n\t"
  73539. #ifdef WOLFSSL_KEIL
  73540. "sbcs r5, r5, r6\n\t"
  73541. #elif defined(__clang__)
  73542. "sbcs r5, r6\n\t"
  73543. #else
  73544. "sbc r5, r6\n\t"
  73545. #endif
  73546. "stm %[a]!, {r5}\n\t"
  73547. "ldm %[m]!, {r6}\n\t"
  73548. #ifdef WOLFSSL_KEIL
  73549. "ands r6, r6, r7\n\t"
  73550. #elif defined(__clang__)
  73551. "ands r6, r7\n\t"
  73552. #else
  73553. "and r6, r7\n\t"
  73554. #endif
  73555. "ldr r5, [%[a], r4]\n\t"
  73556. #ifdef WOLFSSL_KEIL
  73557. "sbcs r5, r5, r6\n\t"
  73558. #elif defined(__clang__)
  73559. "sbcs r5, r6\n\t"
  73560. #else
  73561. "sbc r5, r6\n\t"
  73562. #endif
  73563. "stm %[a]!, {r5}\n\t"
  73564. "ldm %[m]!, {r6}\n\t"
  73565. #ifdef WOLFSSL_KEIL
  73566. "ands r6, r6, r7\n\t"
  73567. #elif defined(__clang__)
  73568. "ands r6, r7\n\t"
  73569. #else
  73570. "and r6, r7\n\t"
  73571. #endif
  73572. "ldr r5, [%[a], r4]\n\t"
  73573. #ifdef WOLFSSL_KEIL
  73574. "sbcs r5, r5, r6\n\t"
  73575. #elif defined(__clang__)
  73576. "sbcs r5, r6\n\t"
  73577. #else
  73578. "sbc r5, r6\n\t"
  73579. #endif
  73580. "stm %[a]!, {r5}\n\t"
  73581. "ldm %[m]!, {r6}\n\t"
  73582. #ifdef WOLFSSL_KEIL
  73583. "ands r6, r6, r7\n\t"
  73584. #elif defined(__clang__)
  73585. "ands r6, r7\n\t"
  73586. #else
  73587. "and r6, r7\n\t"
  73588. #endif
  73589. "ldr r5, [%[a], r4]\n\t"
  73590. #ifdef WOLFSSL_KEIL
  73591. "sbcs r5, r5, r6\n\t"
  73592. #elif defined(__clang__)
  73593. "sbcs r5, r6\n\t"
  73594. #else
  73595. "sbc r5, r6\n\t"
  73596. #endif
  73597. "stm %[a]!, {r5}\n\t"
  73598. "ldm %[m]!, {r6}\n\t"
  73599. #ifdef WOLFSSL_KEIL
  73600. "ands r6, r6, r7\n\t"
  73601. #elif defined(__clang__)
  73602. "ands r6, r7\n\t"
  73603. #else
  73604. "and r6, r7\n\t"
  73605. #endif
  73606. "ldr r5, [%[a], r4]\n\t"
  73607. #ifdef WOLFSSL_KEIL
  73608. "sbcs r5, r5, r6\n\t"
  73609. #elif defined(__clang__)
  73610. "sbcs r5, r6\n\t"
  73611. #else
  73612. "sbc r5, r6\n\t"
  73613. #endif
  73614. "stm %[a]!, {r5}\n\t"
  73615. "ldm %[m]!, {r6}\n\t"
  73616. #ifdef WOLFSSL_KEIL
  73617. "ands r6, r6, r7\n\t"
  73618. #elif defined(__clang__)
  73619. "ands r6, r7\n\t"
  73620. #else
  73621. "and r6, r7\n\t"
  73622. #endif
  73623. "ldr r5, [%[a], r4]\n\t"
  73624. #ifdef WOLFSSL_KEIL
  73625. "sbcs r5, r5, r6\n\t"
  73626. #elif defined(__clang__)
  73627. "sbcs r5, r6\n\t"
  73628. #else
  73629. "sbc r5, r6\n\t"
  73630. #endif
  73631. "stm %[a]!, {r5}\n\t"
  73632. "ldm %[m]!, {r6}\n\t"
  73633. #ifdef WOLFSSL_KEIL
  73634. "ands r6, r6, r7\n\t"
  73635. #elif defined(__clang__)
  73636. "ands r6, r7\n\t"
  73637. #else
  73638. "and r6, r7\n\t"
  73639. #endif
  73640. "ldr r5, [%[a], r4]\n\t"
  73641. #ifdef WOLFSSL_KEIL
  73642. "sbcs r5, r5, r6\n\t"
  73643. #elif defined(__clang__)
  73644. "sbcs r5, r6\n\t"
  73645. #else
  73646. "sbc r5, r6\n\t"
  73647. #endif
  73648. "stm %[a]!, {r5}\n\t"
  73649. "ldm %[m]!, {r6}\n\t"
  73650. #ifdef WOLFSSL_KEIL
  73651. "ands r6, r6, r7\n\t"
  73652. #elif defined(__clang__)
  73653. "ands r6, r7\n\t"
  73654. #else
  73655. "and r6, r7\n\t"
  73656. #endif
  73657. "ldr r5, [%[a], r4]\n\t"
  73658. #ifdef WOLFSSL_KEIL
  73659. "sbcs r5, r5, r6\n\t"
  73660. #elif defined(__clang__)
  73661. "sbcs r5, r6\n\t"
  73662. #else
  73663. "sbc r5, r6\n\t"
  73664. #endif
  73665. "stm %[a]!, {r5}\n\t"
  73666. "ldm %[m]!, {r6}\n\t"
  73667. #ifdef WOLFSSL_KEIL
  73668. "ands r6, r6, r7\n\t"
  73669. #elif defined(__clang__)
  73670. "ands r6, r7\n\t"
  73671. #else
  73672. "and r6, r7\n\t"
  73673. #endif
  73674. "ldr r5, [%[a], r4]\n\t"
  73675. #ifdef WOLFSSL_KEIL
  73676. "sbcs r5, r5, r6\n\t"
  73677. #elif defined(__clang__)
  73678. "sbcs r5, r6\n\t"
  73679. #else
  73680. "sbc r5, r6\n\t"
  73681. #endif
  73682. "stm %[a]!, {r5}\n\t"
  73683. "ldm %[m]!, {r6}\n\t"
  73684. #ifdef WOLFSSL_KEIL
  73685. "ands r6, r6, r7\n\t"
  73686. #elif defined(__clang__)
  73687. "ands r6, r7\n\t"
  73688. #else
  73689. "and r6, r7\n\t"
  73690. #endif
  73691. "ldr r5, [%[a], r4]\n\t"
  73692. #ifdef WOLFSSL_KEIL
  73693. "sbcs r5, r5, r6\n\t"
  73694. #elif defined(__clang__)
  73695. "sbcs r5, r6\n\t"
  73696. #else
  73697. "sbc r5, r6\n\t"
  73698. #endif
  73699. "stm %[a]!, {r5}\n\t"
  73700. "ldm %[m]!, {r6}\n\t"
  73701. #ifdef WOLFSSL_KEIL
  73702. "ands r6, r6, r7\n\t"
  73703. #elif defined(__clang__)
  73704. "ands r6, r7\n\t"
  73705. #else
  73706. "and r6, r7\n\t"
  73707. #endif
  73708. "ldr r5, [%[a], r4]\n\t"
  73709. #ifdef WOLFSSL_KEIL
  73710. "sbcs r5, r5, r6\n\t"
  73711. #elif defined(__clang__)
  73712. "sbcs r5, r6\n\t"
  73713. #else
  73714. "sbc r5, r6\n\t"
  73715. #endif
  73716. "stm %[a]!, {r5}\n\t"
  73717. "ldm %[m]!, {r6}\n\t"
  73718. #ifdef WOLFSSL_KEIL
  73719. "ands r6, r6, r7\n\t"
  73720. #elif defined(__clang__)
  73721. "ands r6, r7\n\t"
  73722. #else
  73723. "and r6, r7\n\t"
  73724. #endif
  73725. "ldr r5, [%[a], r4]\n\t"
  73726. #ifdef WOLFSSL_KEIL
  73727. "sbcs r5, r5, r6\n\t"
  73728. #elif defined(__clang__)
  73729. "sbcs r5, r6\n\t"
  73730. #else
  73731. "sbc r5, r6\n\t"
  73732. #endif
  73733. "stm %[a]!, {r5}\n\t"
  73734. "ldm %[m]!, {r6}\n\t"
  73735. #ifdef WOLFSSL_KEIL
  73736. "ands r6, r6, r7\n\t"
  73737. #elif defined(__clang__)
  73738. "ands r6, r7\n\t"
  73739. #else
  73740. "and r6, r7\n\t"
  73741. #endif
  73742. "ldr r5, [%[a], r4]\n\t"
  73743. #ifdef WOLFSSL_KEIL
  73744. "sbcs r5, r5, r6\n\t"
  73745. #elif defined(__clang__)
  73746. "sbcs r5, r6\n\t"
  73747. #else
  73748. "sbc r5, r6\n\t"
  73749. #endif
  73750. "stm %[a]!, {r5}\n\t"
  73751. "ldm %[m]!, {r6}\n\t"
  73752. #ifdef WOLFSSL_KEIL
  73753. "ands r6, r6, r7\n\t"
  73754. #elif defined(__clang__)
  73755. "ands r6, r7\n\t"
  73756. #else
  73757. "and r6, r7\n\t"
  73758. #endif
  73759. "ldr r5, [%[a], r4]\n\t"
  73760. #ifdef WOLFSSL_KEIL
  73761. "sbcs r5, r5, r6\n\t"
  73762. #elif defined(__clang__)
  73763. "sbcs r5, r6\n\t"
  73764. #else
  73765. "sbc r5, r6\n\t"
  73766. #endif
  73767. "stm %[a]!, {r5}\n\t"
  73768. "ldm %[m]!, {r6}\n\t"
  73769. #ifdef WOLFSSL_KEIL
  73770. "ands r6, r6, r7\n\t"
  73771. #elif defined(__clang__)
  73772. "ands r6, r7\n\t"
  73773. #else
  73774. "and r6, r7\n\t"
  73775. #endif
  73776. "ldr r5, [%[a], r4]\n\t"
  73777. #ifdef WOLFSSL_KEIL
  73778. "sbcs r5, r5, r6\n\t"
  73779. #elif defined(__clang__)
  73780. "sbcs r5, r6\n\t"
  73781. #else
  73782. "sbc r5, r6\n\t"
  73783. #endif
  73784. "stm %[a]!, {r5}\n\t"
  73785. "ldm %[m]!, {r6}\n\t"
  73786. #ifdef WOLFSSL_KEIL
  73787. "ands r6, r6, r7\n\t"
  73788. #elif defined(__clang__)
  73789. "ands r6, r7\n\t"
  73790. #else
  73791. "and r6, r7\n\t"
  73792. #endif
  73793. "ldr r5, [%[a], r4]\n\t"
  73794. #ifdef WOLFSSL_KEIL
  73795. "sbcs r5, r5, r6\n\t"
  73796. #elif defined(__clang__)
  73797. "sbcs r5, r6\n\t"
  73798. #else
  73799. "sbc r5, r6\n\t"
  73800. #endif
  73801. "stm %[a]!, {r5}\n\t"
  73802. "ldm %[m]!, {r6}\n\t"
  73803. #ifdef WOLFSSL_KEIL
  73804. "ands r6, r6, r7\n\t"
  73805. #elif defined(__clang__)
  73806. "ands r6, r7\n\t"
  73807. #else
  73808. "and r6, r7\n\t"
  73809. #endif
  73810. "ldr r5, [%[a], r4]\n\t"
  73811. #ifdef WOLFSSL_KEIL
  73812. "sbcs r5, r5, r6\n\t"
  73813. #elif defined(__clang__)
  73814. "sbcs r5, r6\n\t"
  73815. #else
  73816. "sbc r5, r6\n\t"
  73817. #endif
  73818. "stm %[a]!, {r5}\n\t"
  73819. "ldm %[m]!, {r6}\n\t"
  73820. #ifdef WOLFSSL_KEIL
  73821. "ands r6, r6, r7\n\t"
  73822. #elif defined(__clang__)
  73823. "ands r6, r7\n\t"
  73824. #else
  73825. "and r6, r7\n\t"
  73826. #endif
  73827. "ldr r5, [%[a], r4]\n\t"
  73828. #ifdef WOLFSSL_KEIL
  73829. "sbcs r5, r5, r6\n\t"
  73830. #elif defined(__clang__)
  73831. "sbcs r5, r6\n\t"
  73832. #else
  73833. "sbc r5, r6\n\t"
  73834. #endif
  73835. "stm %[a]!, {r5}\n\t"
  73836. "ldm %[m]!, {r6}\n\t"
  73837. #ifdef WOLFSSL_KEIL
  73838. "ands r6, r6, r7\n\t"
  73839. #elif defined(__clang__)
  73840. "ands r6, r7\n\t"
  73841. #else
  73842. "and r6, r7\n\t"
  73843. #endif
  73844. "ldr r5, [%[a], r4]\n\t"
  73845. #ifdef WOLFSSL_KEIL
  73846. "sbcs r5, r5, r6\n\t"
  73847. #elif defined(__clang__)
  73848. "sbcs r5, r6\n\t"
  73849. #else
  73850. "sbc r5, r6\n\t"
  73851. #endif
  73852. "stm %[a]!, {r5}\n\t"
  73853. "ldm %[m]!, {r6}\n\t"
  73854. #ifdef WOLFSSL_KEIL
  73855. "ands r6, r6, r7\n\t"
  73856. #elif defined(__clang__)
  73857. "ands r6, r7\n\t"
  73858. #else
  73859. "and r6, r7\n\t"
  73860. #endif
  73861. "ldr r5, [%[a], r4]\n\t"
  73862. #ifdef WOLFSSL_KEIL
  73863. "sbcs r5, r5, r6\n\t"
  73864. #elif defined(__clang__)
  73865. "sbcs r5, r6\n\t"
  73866. #else
  73867. "sbc r5, r6\n\t"
  73868. #endif
  73869. "stm %[a]!, {r5}\n\t"
  73870. "ldm %[m]!, {r6}\n\t"
  73871. #ifdef WOLFSSL_KEIL
  73872. "ands r6, r6, r7\n\t"
  73873. #elif defined(__clang__)
  73874. "ands r6, r7\n\t"
  73875. #else
  73876. "and r6, r7\n\t"
  73877. #endif
  73878. "ldr r5, [%[a], r4]\n\t"
  73879. #ifdef WOLFSSL_KEIL
  73880. "sbcs r5, r5, r6\n\t"
  73881. #elif defined(__clang__)
  73882. "sbcs r5, r6\n\t"
  73883. #else
  73884. "sbc r5, r6\n\t"
  73885. #endif
  73886. "stm %[a]!, {r5}\n\t"
  73887. "ldm %[m]!, {r6}\n\t"
  73888. #ifdef WOLFSSL_KEIL
  73889. "ands r6, r6, r7\n\t"
  73890. #elif defined(__clang__)
  73891. "ands r6, r7\n\t"
  73892. #else
  73893. "and r6, r7\n\t"
  73894. #endif
  73895. "ldr r5, [%[a], r4]\n\t"
  73896. #ifdef WOLFSSL_KEIL
  73897. "sbcs r5, r5, r6\n\t"
  73898. #elif defined(__clang__)
  73899. "sbcs r5, r6\n\t"
  73900. #else
  73901. "sbc r5, r6\n\t"
  73902. #endif
  73903. "stm %[a]!, {r5}\n\t"
  73904. "ldm %[m]!, {r6}\n\t"
  73905. #ifdef WOLFSSL_KEIL
  73906. "ands r6, r6, r7\n\t"
  73907. #elif defined(__clang__)
  73908. "ands r6, r7\n\t"
  73909. #else
  73910. "and r6, r7\n\t"
  73911. #endif
  73912. "ldr r5, [%[a], r4]\n\t"
  73913. #ifdef WOLFSSL_KEIL
  73914. "sbcs r5, r5, r6\n\t"
  73915. #elif defined(__clang__)
  73916. "sbcs r5, r6\n\t"
  73917. #else
  73918. "sbc r5, r6\n\t"
  73919. #endif
  73920. "stm %[a]!, {r5}\n\t"
  73921. "ldm %[m]!, {r6}\n\t"
  73922. #ifdef WOLFSSL_KEIL
  73923. "ands r6, r6, r7\n\t"
  73924. #elif defined(__clang__)
  73925. "ands r6, r7\n\t"
  73926. #else
  73927. "and r6, r7\n\t"
  73928. #endif
  73929. "ldr r5, [%[a], r4]\n\t"
  73930. #ifdef WOLFSSL_KEIL
  73931. "sbcs r5, r5, r6\n\t"
  73932. #elif defined(__clang__)
  73933. "sbcs r5, r6\n\t"
  73934. #else
  73935. "sbc r5, r6\n\t"
  73936. #endif
  73937. "stm %[a]!, {r5}\n\t"
  73938. "ldm %[m]!, {r6}\n\t"
  73939. #ifdef WOLFSSL_KEIL
  73940. "ands r6, r6, r7\n\t"
  73941. #elif defined(__clang__)
  73942. "ands r6, r7\n\t"
  73943. #else
  73944. "and r6, r7\n\t"
  73945. #endif
  73946. "ldr r5, [%[a], r4]\n\t"
  73947. #ifdef WOLFSSL_KEIL
  73948. "sbcs r5, r5, r6\n\t"
  73949. #elif defined(__clang__)
  73950. "sbcs r5, r6\n\t"
  73951. #else
  73952. "sbc r5, r6\n\t"
  73953. #endif
  73954. "stm %[a]!, {r5}\n\t"
  73955. "ldm %[m]!, {r6}\n\t"
  73956. #ifdef WOLFSSL_KEIL
  73957. "ands r6, r6, r7\n\t"
  73958. #elif defined(__clang__)
  73959. "ands r6, r7\n\t"
  73960. #else
  73961. "and r6, r7\n\t"
  73962. #endif
  73963. "ldr r5, [%[a], r4]\n\t"
  73964. #ifdef WOLFSSL_KEIL
  73965. "sbcs r5, r5, r6\n\t"
  73966. #elif defined(__clang__)
  73967. "sbcs r5, r6\n\t"
  73968. #else
  73969. "sbc r5, r6\n\t"
  73970. #endif
  73971. "stm %[a]!, {r5}\n\t"
  73972. "ldm %[m]!, {r6}\n\t"
  73973. #ifdef WOLFSSL_KEIL
  73974. "ands r6, r6, r7\n\t"
  73975. #elif defined(__clang__)
  73976. "ands r6, r7\n\t"
  73977. #else
  73978. "and r6, r7\n\t"
  73979. #endif
  73980. "ldr r5, [%[a], r4]\n\t"
  73981. #ifdef WOLFSSL_KEIL
  73982. "sbcs r5, r5, r6\n\t"
  73983. #elif defined(__clang__)
  73984. "sbcs r5, r6\n\t"
  73985. #else
  73986. "sbc r5, r6\n\t"
  73987. #endif
  73988. "stm %[a]!, {r5}\n\t"
  73989. "ldm %[m]!, {r6}\n\t"
  73990. #ifdef WOLFSSL_KEIL
  73991. "ands r6, r6, r7\n\t"
  73992. #elif defined(__clang__)
  73993. "ands r6, r7\n\t"
  73994. #else
  73995. "and r6, r7\n\t"
  73996. #endif
  73997. "ldr r5, [%[a], r4]\n\t"
  73998. #ifdef WOLFSSL_KEIL
  73999. "sbcs r5, r5, r6\n\t"
  74000. #elif defined(__clang__)
  74001. "sbcs r5, r6\n\t"
  74002. #else
  74003. "sbc r5, r6\n\t"
  74004. #endif
  74005. "stm %[a]!, {r5}\n\t"
  74006. "ldm %[m]!, {r6}\n\t"
  74007. #ifdef WOLFSSL_KEIL
  74008. "ands r6, r6, r7\n\t"
  74009. #elif defined(__clang__)
  74010. "ands r6, r7\n\t"
  74011. #else
  74012. "and r6, r7\n\t"
  74013. #endif
  74014. "ldr r5, [%[a], r4]\n\t"
  74015. #ifdef WOLFSSL_KEIL
  74016. "sbcs r5, r5, r6\n\t"
  74017. #elif defined(__clang__)
  74018. "sbcs r5, r6\n\t"
  74019. #else
  74020. "sbc r5, r6\n\t"
  74021. #endif
  74022. "stm %[a]!, {r5}\n\t"
  74023. "ldm %[m]!, {r6}\n\t"
  74024. #ifdef WOLFSSL_KEIL
  74025. "ands r6, r6, r7\n\t"
  74026. #elif defined(__clang__)
  74027. "ands r6, r7\n\t"
  74028. #else
  74029. "and r6, r7\n\t"
  74030. #endif
  74031. "ldr r5, [%[a], r4]\n\t"
  74032. #ifdef WOLFSSL_KEIL
  74033. "sbcs r5, r5, r6\n\t"
  74034. #elif defined(__clang__)
  74035. "sbcs r5, r6\n\t"
  74036. #else
  74037. "sbc r5, r6\n\t"
  74038. #endif
  74039. "stm %[a]!, {r5}\n\t"
  74040. "ldm %[m]!, {r6}\n\t"
  74041. #ifdef WOLFSSL_KEIL
  74042. "ands r6, r6, r7\n\t"
  74043. #elif defined(__clang__)
  74044. "ands r6, r7\n\t"
  74045. #else
  74046. "and r6, r7\n\t"
  74047. #endif
  74048. "ldr r5, [%[a], r4]\n\t"
  74049. #ifdef WOLFSSL_KEIL
  74050. "sbcs r5, r5, r6\n\t"
  74051. #elif defined(__clang__)
  74052. "sbcs r5, r6\n\t"
  74053. #else
  74054. "sbc r5, r6\n\t"
  74055. #endif
  74056. "stm %[a]!, {r5}\n\t"
  74057. #endif /* WOLFSSL_SP_LARGE_CODE */
  74058. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  74059. :
  74060. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  74061. );
  74062. }
  74063. /* Multiply two Montgomery form numbers mod the modulus (prime).
  74064. * (r = a * b mod m)
  74065. *
  74066. * r Result of multiplication.
  74067. * a First number to multiply in Montgomery form.
  74068. * b Second number to multiply in Montgomery form.
  74069. * m Modulus (prime).
  74070. * mp Montgomery mulitplier.
  74071. */
  74072. SP_NOINLINE static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a,
  74073. const sp_digit* b, const sp_digit* m, sp_digit mp)
  74074. {
  74075. sp_3072_mul_48(r, a, b);
  74076. sp_3072_mont_reduce_48(r, m, mp);
  74077. }
  74078. /* Square the Montgomery form number. (r = a * a mod m)
  74079. *
  74080. * r Result of squaring.
  74081. * a Number to square in Montgomery form.
  74082. * m Modulus (prime).
  74083. * mp Montgomery mulitplier.
  74084. */
  74085. SP_NOINLINE static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a,
  74086. const sp_digit* m, sp_digit mp)
  74087. {
  74088. sp_3072_sqr_48(r, a);
  74089. sp_3072_mont_reduce_48(r, m, mp);
  74090. }
  74091. /* Mul a by digit b into r. (r = a * b)
  74092. *
  74093. * r A single precision integer.
  74094. * a A single precision integer.
  74095. * b A single precision digit.
  74096. */
  74097. SP_NOINLINE static void sp_3072_mul_d_48(sp_digit* r, const sp_digit* a,
  74098. sp_digit b)
  74099. {
  74100. __asm__ __volatile__ (
  74101. "movs r6, #0xc0\n\t"
  74102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74103. "adds r6, r6, %[a]\n\t"
  74104. #else
  74105. "add r6, r6, %[a]\n\t"
  74106. #endif
  74107. "mov r8, %[r]\n\t"
  74108. "mov r9, r6\n\t"
  74109. "movs r3, #0\n\t"
  74110. "movs r4, #0\n\t"
  74111. "\n"
  74112. "L_sp_3072_mul_d_48_%=:\n\t"
  74113. "movs %[r], #0\n\t"
  74114. "movs r5, #0\n\t"
  74115. "# A[] * B\n\t"
  74116. "ldrh r6, [%[a]]\n\t"
  74117. "uxth r7, %[b]\n\t"
  74118. #ifdef WOLFSSL_KEIL
  74119. "muls r7, r6, r7\n\t"
  74120. #elif defined(__clang__)
  74121. "muls r7, r6\n\t"
  74122. #else
  74123. "mul r7, r6\n\t"
  74124. #endif
  74125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74126. "adds r3, r3, r7\n\t"
  74127. #else
  74128. "add r3, r3, r7\n\t"
  74129. #endif
  74130. #ifdef WOLFSSL_KEIL
  74131. "adcs r4, r4, %[r]\n\t"
  74132. #elif defined(__clang__)
  74133. "adcs r4, %[r]\n\t"
  74134. #else
  74135. "adc r4, %[r]\n\t"
  74136. #endif
  74137. #ifdef WOLFSSL_KEIL
  74138. "adcs r5, r5, %[r]\n\t"
  74139. #elif defined(__clang__)
  74140. "adcs r5, %[r]\n\t"
  74141. #else
  74142. "adc r5, %[r]\n\t"
  74143. #endif
  74144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74145. "lsrs r7, %[b], #16\n\t"
  74146. #else
  74147. "lsr r7, %[b], #16\n\t"
  74148. #endif
  74149. #ifdef WOLFSSL_KEIL
  74150. "muls r6, r7, r6\n\t"
  74151. #elif defined(__clang__)
  74152. "muls r6, r7\n\t"
  74153. #else
  74154. "mul r6, r7\n\t"
  74155. #endif
  74156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74157. "lsrs r7, r6, #16\n\t"
  74158. #else
  74159. "lsr r7, r6, #16\n\t"
  74160. #endif
  74161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74162. "lsls r6, r6, #16\n\t"
  74163. #else
  74164. "lsl r6, r6, #16\n\t"
  74165. #endif
  74166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74167. "adds r3, r3, r6\n\t"
  74168. #else
  74169. "add r3, r3, r6\n\t"
  74170. #endif
  74171. #ifdef WOLFSSL_KEIL
  74172. "adcs r4, r4, r7\n\t"
  74173. #elif defined(__clang__)
  74174. "adcs r4, r7\n\t"
  74175. #else
  74176. "adc r4, r7\n\t"
  74177. #endif
  74178. #ifdef WOLFSSL_KEIL
  74179. "adcs r5, r5, %[r]\n\t"
  74180. #elif defined(__clang__)
  74181. "adcs r5, %[r]\n\t"
  74182. #else
  74183. "adc r5, %[r]\n\t"
  74184. #endif
  74185. "ldr r6, [%[a]]\n\t"
  74186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74187. "lsrs r6, r6, #16\n\t"
  74188. #else
  74189. "lsr r6, r6, #16\n\t"
  74190. #endif
  74191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74192. "lsrs r7, %[b], #16\n\t"
  74193. #else
  74194. "lsr r7, %[b], #16\n\t"
  74195. #endif
  74196. #ifdef WOLFSSL_KEIL
  74197. "muls r7, r6, r7\n\t"
  74198. #elif defined(__clang__)
  74199. "muls r7, r6\n\t"
  74200. #else
  74201. "mul r7, r6\n\t"
  74202. #endif
  74203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74204. "adds r4, r4, r7\n\t"
  74205. #else
  74206. "add r4, r4, r7\n\t"
  74207. #endif
  74208. #ifdef WOLFSSL_KEIL
  74209. "adcs r5, r5, %[r]\n\t"
  74210. #elif defined(__clang__)
  74211. "adcs r5, %[r]\n\t"
  74212. #else
  74213. "adc r5, %[r]\n\t"
  74214. #endif
  74215. "uxth r7, %[b]\n\t"
  74216. #ifdef WOLFSSL_KEIL
  74217. "muls r6, r7, r6\n\t"
  74218. #elif defined(__clang__)
  74219. "muls r6, r7\n\t"
  74220. #else
  74221. "mul r6, r7\n\t"
  74222. #endif
  74223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74224. "lsrs r7, r6, #16\n\t"
  74225. #else
  74226. "lsr r7, r6, #16\n\t"
  74227. #endif
  74228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74229. "lsls r6, r6, #16\n\t"
  74230. #else
  74231. "lsl r6, r6, #16\n\t"
  74232. #endif
  74233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74234. "adds r3, r3, r6\n\t"
  74235. #else
  74236. "add r3, r3, r6\n\t"
  74237. #endif
  74238. #ifdef WOLFSSL_KEIL
  74239. "adcs r4, r4, r7\n\t"
  74240. #elif defined(__clang__)
  74241. "adcs r4, r7\n\t"
  74242. #else
  74243. "adc r4, r7\n\t"
  74244. #endif
  74245. #ifdef WOLFSSL_KEIL
  74246. "adcs r5, r5, %[r]\n\t"
  74247. #elif defined(__clang__)
  74248. "adcs r5, %[r]\n\t"
  74249. #else
  74250. "adc r5, %[r]\n\t"
  74251. #endif
  74252. "# A[] * B - Done\n\t"
  74253. "mov %[r], r8\n\t"
  74254. "str r3, [%[r]]\n\t"
  74255. "movs r3, r4\n\t"
  74256. "movs r4, r5\n\t"
  74257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74258. "adds %[r], %[r], #4\n\t"
  74259. #else
  74260. "add %[r], %[r], #4\n\t"
  74261. #endif
  74262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74263. "adds %[a], %[a], #4\n\t"
  74264. #else
  74265. "add %[a], %[a], #4\n\t"
  74266. #endif
  74267. "mov r8, %[r]\n\t"
  74268. "cmp %[a], r9\n\t"
  74269. "blt L_sp_3072_mul_d_48_%=\n\t"
  74270. "str r3, [%[r]]\n\t"
  74271. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  74272. :
  74273. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  74274. );
  74275. }
  74276. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  74277. *
  74278. * d1 The high order half of the number to divide.
  74279. * d0 The low order half of the number to divide.
  74280. * div The divisor.
  74281. * returns the result of the division.
  74282. *
  74283. * Note that this is an approximate div. It may give an answer 1 larger.
  74284. */
  74285. SP_NOINLINE static sp_digit div_3072_word_48(sp_digit d1, sp_digit d0,
  74286. sp_digit div)
  74287. {
  74288. __asm__ __volatile__ (
  74289. "movs r3, #0\n\t"
  74290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74291. "lsrs r5, %[div], #1\n\t"
  74292. #else
  74293. "lsr r5, %[div], #1\n\t"
  74294. #endif
  74295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74296. "adds r5, r5, #1\n\t"
  74297. #else
  74298. "add r5, r5, #1\n\t"
  74299. #endif
  74300. "mov r8, %[d0]\n\t"
  74301. "mov r9, %[d1]\n\t"
  74302. "# Do top 32\n\t"
  74303. "movs r6, r5\n\t"
  74304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74305. "subs r6, r6, %[d1]\n\t"
  74306. #else
  74307. "sub r6, r6, %[d1]\n\t"
  74308. #endif
  74309. #ifdef WOLFSSL_KEIL
  74310. "sbcs r6, r6, r6\n\t"
  74311. #elif defined(__clang__)
  74312. "sbcs r6, r6\n\t"
  74313. #else
  74314. "sbc r6, r6\n\t"
  74315. #endif
  74316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74317. "adds r3, r3, r3\n\t"
  74318. #else
  74319. "add r3, r3, r3\n\t"
  74320. #endif
  74321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74322. "subs r3, r3, r6\n\t"
  74323. #else
  74324. "sub r3, r3, r6\n\t"
  74325. #endif
  74326. #ifdef WOLFSSL_KEIL
  74327. "ands r6, r6, r5\n\t"
  74328. #elif defined(__clang__)
  74329. "ands r6, r5\n\t"
  74330. #else
  74331. "and r6, r5\n\t"
  74332. #endif
  74333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74334. "subs %[d1], %[d1], r6\n\t"
  74335. #else
  74336. "sub %[d1], %[d1], r6\n\t"
  74337. #endif
  74338. "movs r4, #29\n\t"
  74339. "\n"
  74340. "L_div_3072_word_48_loop_%=:\n\t"
  74341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74342. "lsls %[d0], %[d0], #1\n\t"
  74343. #else
  74344. "lsl %[d0], %[d0], #1\n\t"
  74345. #endif
  74346. #ifdef WOLFSSL_KEIL
  74347. "adcs %[d1], %[d1], %[d1]\n\t"
  74348. #elif defined(__clang__)
  74349. "adcs %[d1], %[d1]\n\t"
  74350. #else
  74351. "adc %[d1], %[d1]\n\t"
  74352. #endif
  74353. "movs r6, r5\n\t"
  74354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74355. "subs r6, r6, %[d1]\n\t"
  74356. #else
  74357. "sub r6, r6, %[d1]\n\t"
  74358. #endif
  74359. #ifdef WOLFSSL_KEIL
  74360. "sbcs r6, r6, r6\n\t"
  74361. #elif defined(__clang__)
  74362. "sbcs r6, r6\n\t"
  74363. #else
  74364. "sbc r6, r6\n\t"
  74365. #endif
  74366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74367. "adds r3, r3, r3\n\t"
  74368. #else
  74369. "add r3, r3, r3\n\t"
  74370. #endif
  74371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74372. "subs r3, r3, r6\n\t"
  74373. #else
  74374. "sub r3, r3, r6\n\t"
  74375. #endif
  74376. #ifdef WOLFSSL_KEIL
  74377. "ands r6, r6, r5\n\t"
  74378. #elif defined(__clang__)
  74379. "ands r6, r5\n\t"
  74380. #else
  74381. "and r6, r5\n\t"
  74382. #endif
  74383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74384. "subs %[d1], %[d1], r6\n\t"
  74385. #else
  74386. "sub %[d1], %[d1], r6\n\t"
  74387. #endif
  74388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74389. "subs r4, r4, #1\n\t"
  74390. #else
  74391. "sub r4, r4, #1\n\t"
  74392. #endif
  74393. "bpl L_div_3072_word_48_loop_%=\n\t"
  74394. "movs r7, #0\n\t"
  74395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74396. "adds r3, r3, r3\n\t"
  74397. #else
  74398. "add r3, r3, r3\n\t"
  74399. #endif
  74400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74401. "adds r3, r3, #1\n\t"
  74402. #else
  74403. "add r3, r3, #1\n\t"
  74404. #endif
  74405. "# r * div - Start\n\t"
  74406. "uxth %[d1], r3\n\t"
  74407. "uxth r4, %[div]\n\t"
  74408. #ifdef WOLFSSL_KEIL
  74409. "muls r4, %[d1], r4\n\t"
  74410. #elif defined(__clang__)
  74411. "muls r4, %[d1]\n\t"
  74412. #else
  74413. "mul r4, %[d1]\n\t"
  74414. #endif
  74415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74416. "lsrs r6, %[div], #16\n\t"
  74417. #else
  74418. "lsr r6, %[div], #16\n\t"
  74419. #endif
  74420. #ifdef WOLFSSL_KEIL
  74421. "muls %[d1], r6, %[d1]\n\t"
  74422. #elif defined(__clang__)
  74423. "muls %[d1], r6\n\t"
  74424. #else
  74425. "mul %[d1], r6\n\t"
  74426. #endif
  74427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74428. "lsrs r5, %[d1], #16\n\t"
  74429. #else
  74430. "lsr r5, %[d1], #16\n\t"
  74431. #endif
  74432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74433. "lsls %[d1], %[d1], #16\n\t"
  74434. #else
  74435. "lsl %[d1], %[d1], #16\n\t"
  74436. #endif
  74437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74438. "adds r4, r4, %[d1]\n\t"
  74439. #else
  74440. "add r4, r4, %[d1]\n\t"
  74441. #endif
  74442. #ifdef WOLFSSL_KEIL
  74443. "adcs r5, r5, r7\n\t"
  74444. #elif defined(__clang__)
  74445. "adcs r5, r7\n\t"
  74446. #else
  74447. "adc r5, r7\n\t"
  74448. #endif
  74449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74450. "lsrs %[d1], r3, #16\n\t"
  74451. #else
  74452. "lsr %[d1], r3, #16\n\t"
  74453. #endif
  74454. #ifdef WOLFSSL_KEIL
  74455. "muls r6, %[d1], r6\n\t"
  74456. #elif defined(__clang__)
  74457. "muls r6, %[d1]\n\t"
  74458. #else
  74459. "mul r6, %[d1]\n\t"
  74460. #endif
  74461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74462. "adds r5, r5, r6\n\t"
  74463. #else
  74464. "add r5, r5, r6\n\t"
  74465. #endif
  74466. "uxth r6, %[div]\n\t"
  74467. #ifdef WOLFSSL_KEIL
  74468. "muls %[d1], r6, %[d1]\n\t"
  74469. #elif defined(__clang__)
  74470. "muls %[d1], r6\n\t"
  74471. #else
  74472. "mul %[d1], r6\n\t"
  74473. #endif
  74474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74475. "lsrs r6, %[d1], #16\n\t"
  74476. #else
  74477. "lsr r6, %[d1], #16\n\t"
  74478. #endif
  74479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74480. "lsls %[d1], %[d1], #16\n\t"
  74481. #else
  74482. "lsl %[d1], %[d1], #16\n\t"
  74483. #endif
  74484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74485. "adds r4, r4, %[d1]\n\t"
  74486. #else
  74487. "add r4, r4, %[d1]\n\t"
  74488. #endif
  74489. #ifdef WOLFSSL_KEIL
  74490. "adcs r5, r5, r6\n\t"
  74491. #elif defined(__clang__)
  74492. "adcs r5, r6\n\t"
  74493. #else
  74494. "adc r5, r6\n\t"
  74495. #endif
  74496. "# r * div - Done\n\t"
  74497. "mov %[d1], r8\n\t"
  74498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74499. "subs %[d1], %[d1], r4\n\t"
  74500. #else
  74501. "sub %[d1], %[d1], r4\n\t"
  74502. #endif
  74503. "movs r4, %[d1]\n\t"
  74504. "mov %[d1], r9\n\t"
  74505. #ifdef WOLFSSL_KEIL
  74506. "sbcs %[d1], %[d1], r5\n\t"
  74507. #elif defined(__clang__)
  74508. "sbcs %[d1], r5\n\t"
  74509. #else
  74510. "sbc %[d1], r5\n\t"
  74511. #endif
  74512. "movs r5, %[d1]\n\t"
  74513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74514. "adds r3, r3, r5\n\t"
  74515. #else
  74516. "add r3, r3, r5\n\t"
  74517. #endif
  74518. "# r * div - Start\n\t"
  74519. "uxth %[d1], r3\n\t"
  74520. "uxth r4, %[div]\n\t"
  74521. #ifdef WOLFSSL_KEIL
  74522. "muls r4, %[d1], r4\n\t"
  74523. #elif defined(__clang__)
  74524. "muls r4, %[d1]\n\t"
  74525. #else
  74526. "mul r4, %[d1]\n\t"
  74527. #endif
  74528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74529. "lsrs r6, %[div], #16\n\t"
  74530. #else
  74531. "lsr r6, %[div], #16\n\t"
  74532. #endif
  74533. #ifdef WOLFSSL_KEIL
  74534. "muls %[d1], r6, %[d1]\n\t"
  74535. #elif defined(__clang__)
  74536. "muls %[d1], r6\n\t"
  74537. #else
  74538. "mul %[d1], r6\n\t"
  74539. #endif
  74540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74541. "lsrs r5, %[d1], #16\n\t"
  74542. #else
  74543. "lsr r5, %[d1], #16\n\t"
  74544. #endif
  74545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74546. "lsls %[d1], %[d1], #16\n\t"
  74547. #else
  74548. "lsl %[d1], %[d1], #16\n\t"
  74549. #endif
  74550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74551. "adds r4, r4, %[d1]\n\t"
  74552. #else
  74553. "add r4, r4, %[d1]\n\t"
  74554. #endif
  74555. #ifdef WOLFSSL_KEIL
  74556. "adcs r5, r5, r7\n\t"
  74557. #elif defined(__clang__)
  74558. "adcs r5, r7\n\t"
  74559. #else
  74560. "adc r5, r7\n\t"
  74561. #endif
  74562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74563. "lsrs %[d1], r3, #16\n\t"
  74564. #else
  74565. "lsr %[d1], r3, #16\n\t"
  74566. #endif
  74567. #ifdef WOLFSSL_KEIL
  74568. "muls r6, %[d1], r6\n\t"
  74569. #elif defined(__clang__)
  74570. "muls r6, %[d1]\n\t"
  74571. #else
  74572. "mul r6, %[d1]\n\t"
  74573. #endif
  74574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74575. "adds r5, r5, r6\n\t"
  74576. #else
  74577. "add r5, r5, r6\n\t"
  74578. #endif
  74579. "uxth r6, %[div]\n\t"
  74580. #ifdef WOLFSSL_KEIL
  74581. "muls %[d1], r6, %[d1]\n\t"
  74582. #elif defined(__clang__)
  74583. "muls %[d1], r6\n\t"
  74584. #else
  74585. "mul %[d1], r6\n\t"
  74586. #endif
  74587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74588. "lsrs r6, %[d1], #16\n\t"
  74589. #else
  74590. "lsr r6, %[d1], #16\n\t"
  74591. #endif
  74592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74593. "lsls %[d1], %[d1], #16\n\t"
  74594. #else
  74595. "lsl %[d1], %[d1], #16\n\t"
  74596. #endif
  74597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74598. "adds r4, r4, %[d1]\n\t"
  74599. #else
  74600. "add r4, r4, %[d1]\n\t"
  74601. #endif
  74602. #ifdef WOLFSSL_KEIL
  74603. "adcs r5, r5, r6\n\t"
  74604. #elif defined(__clang__)
  74605. "adcs r5, r6\n\t"
  74606. #else
  74607. "adc r5, r6\n\t"
  74608. #endif
  74609. "# r * div - Done\n\t"
  74610. "mov %[d1], r8\n\t"
  74611. "mov r6, r9\n\t"
  74612. #ifdef WOLFSSL_KEIL
  74613. "subs r4, %[d1], r4\n\t"
  74614. #else
  74615. #ifdef __clang__
  74616. "subs r4, %[d1], r4\n\t"
  74617. #else
  74618. "sub r4, %[d1], r4\n\t"
  74619. #endif
  74620. #endif
  74621. #ifdef WOLFSSL_KEIL
  74622. "sbcs r6, r6, r5\n\t"
  74623. #elif defined(__clang__)
  74624. "sbcs r6, r5\n\t"
  74625. #else
  74626. "sbc r6, r5\n\t"
  74627. #endif
  74628. "movs r5, r6\n\t"
  74629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74630. "adds r3, r3, r5\n\t"
  74631. #else
  74632. "add r3, r3, r5\n\t"
  74633. #endif
  74634. "# r * div - Start\n\t"
  74635. "uxth %[d1], r3\n\t"
  74636. "uxth r4, %[div]\n\t"
  74637. #ifdef WOLFSSL_KEIL
  74638. "muls r4, %[d1], r4\n\t"
  74639. #elif defined(__clang__)
  74640. "muls r4, %[d1]\n\t"
  74641. #else
  74642. "mul r4, %[d1]\n\t"
  74643. #endif
  74644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74645. "lsrs r6, %[div], #16\n\t"
  74646. #else
  74647. "lsr r6, %[div], #16\n\t"
  74648. #endif
  74649. #ifdef WOLFSSL_KEIL
  74650. "muls %[d1], r6, %[d1]\n\t"
  74651. #elif defined(__clang__)
  74652. "muls %[d1], r6\n\t"
  74653. #else
  74654. "mul %[d1], r6\n\t"
  74655. #endif
  74656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74657. "lsrs r5, %[d1], #16\n\t"
  74658. #else
  74659. "lsr r5, %[d1], #16\n\t"
  74660. #endif
  74661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74662. "lsls %[d1], %[d1], #16\n\t"
  74663. #else
  74664. "lsl %[d1], %[d1], #16\n\t"
  74665. #endif
  74666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74667. "adds r4, r4, %[d1]\n\t"
  74668. #else
  74669. "add r4, r4, %[d1]\n\t"
  74670. #endif
  74671. #ifdef WOLFSSL_KEIL
  74672. "adcs r5, r5, r7\n\t"
  74673. #elif defined(__clang__)
  74674. "adcs r5, r7\n\t"
  74675. #else
  74676. "adc r5, r7\n\t"
  74677. #endif
  74678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74679. "lsrs %[d1], r3, #16\n\t"
  74680. #else
  74681. "lsr %[d1], r3, #16\n\t"
  74682. #endif
  74683. #ifdef WOLFSSL_KEIL
  74684. "muls r6, %[d1], r6\n\t"
  74685. #elif defined(__clang__)
  74686. "muls r6, %[d1]\n\t"
  74687. #else
  74688. "mul r6, %[d1]\n\t"
  74689. #endif
  74690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74691. "adds r5, r5, r6\n\t"
  74692. #else
  74693. "add r5, r5, r6\n\t"
  74694. #endif
  74695. "uxth r6, %[div]\n\t"
  74696. #ifdef WOLFSSL_KEIL
  74697. "muls %[d1], r6, %[d1]\n\t"
  74698. #elif defined(__clang__)
  74699. "muls %[d1], r6\n\t"
  74700. #else
  74701. "mul %[d1], r6\n\t"
  74702. #endif
  74703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74704. "lsrs r6, %[d1], #16\n\t"
  74705. #else
  74706. "lsr r6, %[d1], #16\n\t"
  74707. #endif
  74708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74709. "lsls %[d1], %[d1], #16\n\t"
  74710. #else
  74711. "lsl %[d1], %[d1], #16\n\t"
  74712. #endif
  74713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74714. "adds r4, r4, %[d1]\n\t"
  74715. #else
  74716. "add r4, r4, %[d1]\n\t"
  74717. #endif
  74718. #ifdef WOLFSSL_KEIL
  74719. "adcs r5, r5, r6\n\t"
  74720. #elif defined(__clang__)
  74721. "adcs r5, r6\n\t"
  74722. #else
  74723. "adc r5, r6\n\t"
  74724. #endif
  74725. "# r * div - Done\n\t"
  74726. "mov %[d1], r8\n\t"
  74727. "mov r6, r9\n\t"
  74728. #ifdef WOLFSSL_KEIL
  74729. "subs r4, %[d1], r4\n\t"
  74730. #else
  74731. #ifdef __clang__
  74732. "subs r4, %[d1], r4\n\t"
  74733. #else
  74734. "sub r4, %[d1], r4\n\t"
  74735. #endif
  74736. #endif
  74737. #ifdef WOLFSSL_KEIL
  74738. "sbcs r6, r6, r5\n\t"
  74739. #elif defined(__clang__)
  74740. "sbcs r6, r5\n\t"
  74741. #else
  74742. "sbc r6, r5\n\t"
  74743. #endif
  74744. "movs r5, r6\n\t"
  74745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74746. "adds r3, r3, r5\n\t"
  74747. #else
  74748. "add r3, r3, r5\n\t"
  74749. #endif
  74750. "# r * div - Start\n\t"
  74751. "uxth %[d1], r3\n\t"
  74752. "uxth r4, %[div]\n\t"
  74753. #ifdef WOLFSSL_KEIL
  74754. "muls r4, %[d1], r4\n\t"
  74755. #elif defined(__clang__)
  74756. "muls r4, %[d1]\n\t"
  74757. #else
  74758. "mul r4, %[d1]\n\t"
  74759. #endif
  74760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74761. "lsrs r6, %[div], #16\n\t"
  74762. #else
  74763. "lsr r6, %[div], #16\n\t"
  74764. #endif
  74765. #ifdef WOLFSSL_KEIL
  74766. "muls %[d1], r6, %[d1]\n\t"
  74767. #elif defined(__clang__)
  74768. "muls %[d1], r6\n\t"
  74769. #else
  74770. "mul %[d1], r6\n\t"
  74771. #endif
  74772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74773. "lsrs r5, %[d1], #16\n\t"
  74774. #else
  74775. "lsr r5, %[d1], #16\n\t"
  74776. #endif
  74777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74778. "lsls %[d1], %[d1], #16\n\t"
  74779. #else
  74780. "lsl %[d1], %[d1], #16\n\t"
  74781. #endif
  74782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74783. "adds r4, r4, %[d1]\n\t"
  74784. #else
  74785. "add r4, r4, %[d1]\n\t"
  74786. #endif
  74787. #ifdef WOLFSSL_KEIL
  74788. "adcs r5, r5, r7\n\t"
  74789. #elif defined(__clang__)
  74790. "adcs r5, r7\n\t"
  74791. #else
  74792. "adc r5, r7\n\t"
  74793. #endif
  74794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74795. "lsrs %[d1], r3, #16\n\t"
  74796. #else
  74797. "lsr %[d1], r3, #16\n\t"
  74798. #endif
  74799. #ifdef WOLFSSL_KEIL
  74800. "muls r6, %[d1], r6\n\t"
  74801. #elif defined(__clang__)
  74802. "muls r6, %[d1]\n\t"
  74803. #else
  74804. "mul r6, %[d1]\n\t"
  74805. #endif
  74806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74807. "adds r5, r5, r6\n\t"
  74808. #else
  74809. "add r5, r5, r6\n\t"
  74810. #endif
  74811. "uxth r6, %[div]\n\t"
  74812. #ifdef WOLFSSL_KEIL
  74813. "muls %[d1], r6, %[d1]\n\t"
  74814. #elif defined(__clang__)
  74815. "muls %[d1], r6\n\t"
  74816. #else
  74817. "mul %[d1], r6\n\t"
  74818. #endif
  74819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74820. "lsrs r6, %[d1], #16\n\t"
  74821. #else
  74822. "lsr r6, %[d1], #16\n\t"
  74823. #endif
  74824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74825. "lsls %[d1], %[d1], #16\n\t"
  74826. #else
  74827. "lsl %[d1], %[d1], #16\n\t"
  74828. #endif
  74829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74830. "adds r4, r4, %[d1]\n\t"
  74831. #else
  74832. "add r4, r4, %[d1]\n\t"
  74833. #endif
  74834. #ifdef WOLFSSL_KEIL
  74835. "adcs r5, r5, r6\n\t"
  74836. #elif defined(__clang__)
  74837. "adcs r5, r6\n\t"
  74838. #else
  74839. "adc r5, r6\n\t"
  74840. #endif
  74841. "# r * div - Done\n\t"
  74842. "mov %[d1], r8\n\t"
  74843. "mov r6, r9\n\t"
  74844. #ifdef WOLFSSL_KEIL
  74845. "subs r4, %[d1], r4\n\t"
  74846. #else
  74847. #ifdef __clang__
  74848. "subs r4, %[d1], r4\n\t"
  74849. #else
  74850. "sub r4, %[d1], r4\n\t"
  74851. #endif
  74852. #endif
  74853. #ifdef WOLFSSL_KEIL
  74854. "sbcs r6, r6, r5\n\t"
  74855. #elif defined(__clang__)
  74856. "sbcs r6, r5\n\t"
  74857. #else
  74858. "sbc r6, r5\n\t"
  74859. #endif
  74860. "movs r5, r6\n\t"
  74861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74862. "adds r3, r3, r5\n\t"
  74863. #else
  74864. "add r3, r3, r5\n\t"
  74865. #endif
  74866. "movs r6, %[div]\n\t"
  74867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74868. "subs r6, r6, r4\n\t"
  74869. #else
  74870. "sub r6, r6, r4\n\t"
  74871. #endif
  74872. #ifdef WOLFSSL_KEIL
  74873. "sbcs r6, r6, r6\n\t"
  74874. #elif defined(__clang__)
  74875. "sbcs r6, r6\n\t"
  74876. #else
  74877. "sbc r6, r6\n\t"
  74878. #endif
  74879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74880. "subs r3, r3, r6\n\t"
  74881. #else
  74882. "sub r3, r3, r6\n\t"
  74883. #endif
  74884. "movs %[d1], r3\n\t"
  74885. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  74886. :
  74887. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  74888. );
  74889. return (uint32_t)(size_t)d1;
  74890. }
  74891. /* Compare a with b in constant time.
  74892. *
  74893. * a A single precision integer.
  74894. * b A single precision integer.
  74895. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  74896. * respectively.
  74897. */
  74898. SP_NOINLINE static sp_int32 sp_3072_cmp_48(const sp_digit* a, const sp_digit* b)
  74899. {
  74900. __asm__ __volatile__ (
  74901. "movs r2, #0\n\t"
  74902. "movs r3, #0\n\t"
  74903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74904. "mvns r3, r3\n\t"
  74905. #else
  74906. "mvn r3, r3\n\t"
  74907. #endif
  74908. "movs r6, #0xbc\n\t"
  74909. "\n"
  74910. "L_sp_3072_cmp_48_words_%=:\n\t"
  74911. "ldr r7, [%[a], r6]\n\t"
  74912. "ldr r5, [%[b], r6]\n\t"
  74913. #ifdef WOLFSSL_KEIL
  74914. "ands r7, r7, r3\n\t"
  74915. #elif defined(__clang__)
  74916. "ands r7, r3\n\t"
  74917. #else
  74918. "and r7, r3\n\t"
  74919. #endif
  74920. #ifdef WOLFSSL_KEIL
  74921. "ands r5, r5, r3\n\t"
  74922. #elif defined(__clang__)
  74923. "ands r5, r3\n\t"
  74924. #else
  74925. "and r5, r3\n\t"
  74926. #endif
  74927. "movs r4, r7\n\t"
  74928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74929. "subs r7, r7, r5\n\t"
  74930. #else
  74931. "sub r7, r7, r5\n\t"
  74932. #endif
  74933. #ifdef WOLFSSL_KEIL
  74934. "sbcs r7, r7, r7\n\t"
  74935. #elif defined(__clang__)
  74936. "sbcs r7, r7\n\t"
  74937. #else
  74938. "sbc r7, r7\n\t"
  74939. #endif
  74940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74941. "adds r2, r2, r7\n\t"
  74942. #else
  74943. "add r2, r2, r7\n\t"
  74944. #endif
  74945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74946. "mvns r7, r7\n\t"
  74947. #else
  74948. "mvn r7, r7\n\t"
  74949. #endif
  74950. #ifdef WOLFSSL_KEIL
  74951. "ands r3, r3, r7\n\t"
  74952. #elif defined(__clang__)
  74953. "ands r3, r7\n\t"
  74954. #else
  74955. "and r3, r7\n\t"
  74956. #endif
  74957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74958. "subs r5, r5, r4\n\t"
  74959. #else
  74960. "sub r5, r5, r4\n\t"
  74961. #endif
  74962. #ifdef WOLFSSL_KEIL
  74963. "sbcs r7, r7, r7\n\t"
  74964. #elif defined(__clang__)
  74965. "sbcs r7, r7\n\t"
  74966. #else
  74967. "sbc r7, r7\n\t"
  74968. #endif
  74969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74970. "subs r2, r2, r7\n\t"
  74971. #else
  74972. "sub r2, r2, r7\n\t"
  74973. #endif
  74974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74975. "mvns r7, r7\n\t"
  74976. #else
  74977. "mvn r7, r7\n\t"
  74978. #endif
  74979. #ifdef WOLFSSL_KEIL
  74980. "ands r3, r3, r7\n\t"
  74981. #elif defined(__clang__)
  74982. "ands r3, r7\n\t"
  74983. #else
  74984. "and r3, r7\n\t"
  74985. #endif
  74986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  74987. "subs r6, r6, #4\n\t"
  74988. #else
  74989. "sub r6, r6, #4\n\t"
  74990. #endif
  74991. "bge L_sp_3072_cmp_48_words_%=\n\t"
  74992. "movs %[a], r2\n\t"
  74993. : [a] "+l" (a), [b] "+l" (b)
  74994. :
  74995. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  74996. );
  74997. return (uint32_t)(size_t)a;
  74998. }
  74999. /* Divide d in a and put remainder into r (m*d + r = a)
  75000. * m is not calculated as it is not needed at this time.
  75001. *
  75002. * a Number to be divided.
  75003. * d Number to divide with.
  75004. * m Multiplier result.
  75005. * r Remainder from the division.
  75006. * returns MP_OKAY indicating success.
  75007. */
  75008. static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, sp_digit* m,
  75009. sp_digit* r)
  75010. {
  75011. sp_digit t1[96], t2[49];
  75012. sp_digit div, r1;
  75013. int i;
  75014. (void)m;
  75015. div = d[47];
  75016. XMEMCPY(t1, a, sizeof(*t1) * 2 * 48);
  75017. r1 = sp_3072_cmp_48(&t1[48], d) >= 0;
  75018. sp_3072_cond_sub_48(&t1[48], &t1[48], d, (sp_digit)0 - r1);
  75019. for (i = 47; i >= 0; i--) {
  75020. sp_digit mask = 0 - (t1[48 + i] == div);
  75021. sp_digit hi = t1[48 + i] + mask;
  75022. r1 = div_3072_word_48(hi, t1[48 + i - 1], div);
  75023. r1 |= mask;
  75024. sp_3072_mul_d_48(t2, d, r1);
  75025. t1[48 + i] += sp_3072_sub_in_place_48(&t1[i], t2);
  75026. t1[48 + i] -= t2[48];
  75027. sp_3072_mask_48(t2, d, t1[48 + i]);
  75028. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  75029. sp_3072_mask_48(t2, d, t1[48 + i]);
  75030. t1[48 + i] += sp_3072_add_48(&t1[i], &t1[i], t2);
  75031. }
  75032. r1 = sp_3072_cmp_48(t1, d) >= 0;
  75033. sp_3072_cond_sub_48(r, t1, d, (sp_digit)0 - r1);
  75034. return MP_OKAY;
  75035. }
  75036. /* Reduce a modulo m into r. (r = a mod m)
  75037. *
  75038. * r A single precision number that is the reduced result.
  75039. * a A single precision number that is to be reduced.
  75040. * m A single precision number that is the modulus to reduce with.
  75041. * returns MP_OKAY indicating success.
  75042. */
  75043. static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a, const sp_digit* m)
  75044. {
  75045. int ret;
  75046. ret = sp_3072_div_48(a, m, NULL, r);
  75047. return ret;
  75048. }
  75049. #ifdef WOLFSSL_SP_SMALL
  75050. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  75051. *
  75052. * r A single precision number that is the result of the operation.
  75053. * a A single precision number being exponentiated.
  75054. * e A single precision number that is the exponent.
  75055. * bits The number of bits in the exponent.
  75056. * m A single precision number that is the modulus.
  75057. * returns 0 on success.
  75058. * returns MEMORY_E on dynamic memory allocation failure.
  75059. * returns MP_VAL when base is even or exponent is 0.
  75060. */
  75061. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  75062. int bits, const sp_digit* m, int reduceA)
  75063. {
  75064. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75065. sp_digit* td = NULL;
  75066. #else
  75067. sp_digit td[16 * 96];
  75068. #endif
  75069. sp_digit* t[16];
  75070. sp_digit* norm = NULL;
  75071. sp_digit mp = 1;
  75072. sp_digit n;
  75073. sp_digit mask;
  75074. int i;
  75075. int c;
  75076. byte y;
  75077. int err = MP_OKAY;
  75078. if (bits == 0) {
  75079. err = MP_VAL;
  75080. }
  75081. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75082. if (err == MP_OKAY) {
  75083. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 96), NULL,
  75084. DYNAMIC_TYPE_TMP_BUFFER);
  75085. if (td == NULL)
  75086. err = MEMORY_E;
  75087. }
  75088. #endif
  75089. if (err == MP_OKAY) {
  75090. norm = td;
  75091. for (i=0; i<16; i++) {
  75092. t[i] = td + i * 96;
  75093. }
  75094. sp_3072_mont_setup(m, &mp);
  75095. sp_3072_mont_norm_48(norm, m);
  75096. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  75097. if (reduceA != 0) {
  75098. err = sp_3072_mod_48(t[1] + 48, a, m);
  75099. if (err == MP_OKAY) {
  75100. err = sp_3072_mod_48(t[1], t[1], m);
  75101. }
  75102. }
  75103. else {
  75104. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  75105. err = sp_3072_mod_48(t[1], t[1], m);
  75106. }
  75107. }
  75108. if (err == MP_OKAY) {
  75109. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  75110. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  75111. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  75112. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  75113. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  75114. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  75115. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  75116. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  75117. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  75118. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  75119. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  75120. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  75121. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  75122. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  75123. i = (bits - 1) / 32;
  75124. n = e[i--];
  75125. c = bits & 31;
  75126. if (c == 0) {
  75127. c = 32;
  75128. }
  75129. c -= bits % 4;
  75130. if (c == 32) {
  75131. c = 28;
  75132. }
  75133. if (c < 0) {
  75134. /* Number of bits in top word is less than number needed. */
  75135. c = -c;
  75136. y = (byte)(n << c);
  75137. n = e[i--];
  75138. y |= (byte)(n >> (64 - c));
  75139. n <<= c;
  75140. c = 64 - c;
  75141. }
  75142. else if (c == 0) {
  75143. /* All bits in top word used. */
  75144. y = (byte)n;
  75145. }
  75146. else {
  75147. y = (byte)(n >> c);
  75148. n <<= 32 - c;
  75149. }
  75150. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  75151. for (; i>=0 || c>=4; ) {
  75152. if (c == 0) {
  75153. n = e[i--];
  75154. y = (byte)(n >> 28);
  75155. n <<= 4;
  75156. c = 28;
  75157. }
  75158. else if (c < 4) {
  75159. y = (byte)(n >> 28);
  75160. n = e[i--];
  75161. c = 4 - c;
  75162. y |= (byte)(n >> (32 - c));
  75163. n <<= c;
  75164. c = 32 - c;
  75165. }
  75166. else {
  75167. y = (byte)((n >> 28) & 0xf);
  75168. n <<= 4;
  75169. c -= 4;
  75170. }
  75171. sp_3072_mont_sqr_48(r, r, m, mp);
  75172. sp_3072_mont_sqr_48(r, r, m, mp);
  75173. sp_3072_mont_sqr_48(r, r, m, mp);
  75174. sp_3072_mont_sqr_48(r, r, m, mp);
  75175. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  75176. }
  75177. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  75178. sp_3072_mont_reduce_48(r, m, mp);
  75179. mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
  75180. sp_3072_cond_sub_48(r, r, m, mask);
  75181. }
  75182. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75183. if (td != NULL)
  75184. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  75185. #endif
  75186. return err;
  75187. }
  75188. #else
  75189. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  75190. *
  75191. * r A single precision number that is the result of the operation.
  75192. * a A single precision number being exponentiated.
  75193. * e A single precision number that is the exponent.
  75194. * bits The number of bits in the exponent.
  75195. * m A single precision number that is the modulus.
  75196. * returns 0 on success.
  75197. * returns MEMORY_E on dynamic memory allocation failure.
  75198. * returns MP_VAL when base is even or exponent is 0.
  75199. */
  75200. static int sp_3072_mod_exp_48(sp_digit* r, const sp_digit* a, const sp_digit* e,
  75201. int bits, const sp_digit* m, int reduceA)
  75202. {
  75203. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75204. sp_digit* td = NULL;
  75205. #else
  75206. sp_digit td[32 * 96];
  75207. #endif
  75208. sp_digit* t[32];
  75209. sp_digit* norm = NULL;
  75210. sp_digit mp = 1;
  75211. sp_digit n;
  75212. sp_digit mask;
  75213. int i;
  75214. int c;
  75215. byte y;
  75216. int err = MP_OKAY;
  75217. if (bits == 0) {
  75218. err = MP_VAL;
  75219. }
  75220. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75221. if (err == MP_OKAY) {
  75222. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (32 * 96), NULL,
  75223. DYNAMIC_TYPE_TMP_BUFFER);
  75224. if (td == NULL)
  75225. err = MEMORY_E;
  75226. }
  75227. #endif
  75228. if (err == MP_OKAY) {
  75229. norm = td;
  75230. for (i=0; i<32; i++) {
  75231. t[i] = td + i * 96;
  75232. }
  75233. sp_3072_mont_setup(m, &mp);
  75234. sp_3072_mont_norm_48(norm, m);
  75235. XMEMSET(t[1], 0, sizeof(sp_digit) * 48U);
  75236. if (reduceA != 0) {
  75237. err = sp_3072_mod_48(t[1] + 48, a, m);
  75238. if (err == MP_OKAY) {
  75239. err = sp_3072_mod_48(t[1], t[1], m);
  75240. }
  75241. }
  75242. else {
  75243. XMEMCPY(t[1] + 48, a, sizeof(sp_digit) * 48);
  75244. err = sp_3072_mod_48(t[1], t[1], m);
  75245. }
  75246. }
  75247. if (err == MP_OKAY) {
  75248. sp_3072_mont_sqr_48(t[ 2], t[ 1], m, mp);
  75249. sp_3072_mont_mul_48(t[ 3], t[ 2], t[ 1], m, mp);
  75250. sp_3072_mont_sqr_48(t[ 4], t[ 2], m, mp);
  75251. sp_3072_mont_mul_48(t[ 5], t[ 3], t[ 2], m, mp);
  75252. sp_3072_mont_sqr_48(t[ 6], t[ 3], m, mp);
  75253. sp_3072_mont_mul_48(t[ 7], t[ 4], t[ 3], m, mp);
  75254. sp_3072_mont_sqr_48(t[ 8], t[ 4], m, mp);
  75255. sp_3072_mont_mul_48(t[ 9], t[ 5], t[ 4], m, mp);
  75256. sp_3072_mont_sqr_48(t[10], t[ 5], m, mp);
  75257. sp_3072_mont_mul_48(t[11], t[ 6], t[ 5], m, mp);
  75258. sp_3072_mont_sqr_48(t[12], t[ 6], m, mp);
  75259. sp_3072_mont_mul_48(t[13], t[ 7], t[ 6], m, mp);
  75260. sp_3072_mont_sqr_48(t[14], t[ 7], m, mp);
  75261. sp_3072_mont_mul_48(t[15], t[ 8], t[ 7], m, mp);
  75262. sp_3072_mont_sqr_48(t[16], t[ 8], m, mp);
  75263. sp_3072_mont_mul_48(t[17], t[ 9], t[ 8], m, mp);
  75264. sp_3072_mont_sqr_48(t[18], t[ 9], m, mp);
  75265. sp_3072_mont_mul_48(t[19], t[10], t[ 9], m, mp);
  75266. sp_3072_mont_sqr_48(t[20], t[10], m, mp);
  75267. sp_3072_mont_mul_48(t[21], t[11], t[10], m, mp);
  75268. sp_3072_mont_sqr_48(t[22], t[11], m, mp);
  75269. sp_3072_mont_mul_48(t[23], t[12], t[11], m, mp);
  75270. sp_3072_mont_sqr_48(t[24], t[12], m, mp);
  75271. sp_3072_mont_mul_48(t[25], t[13], t[12], m, mp);
  75272. sp_3072_mont_sqr_48(t[26], t[13], m, mp);
  75273. sp_3072_mont_mul_48(t[27], t[14], t[13], m, mp);
  75274. sp_3072_mont_sqr_48(t[28], t[14], m, mp);
  75275. sp_3072_mont_mul_48(t[29], t[15], t[14], m, mp);
  75276. sp_3072_mont_sqr_48(t[30], t[15], m, mp);
  75277. sp_3072_mont_mul_48(t[31], t[16], t[15], m, mp);
  75278. i = (bits - 1) / 32;
  75279. n = e[i--];
  75280. c = bits & 31;
  75281. if (c == 0) {
  75282. c = 32;
  75283. }
  75284. c -= bits % 5;
  75285. if (c == 32) {
  75286. c = 27;
  75287. }
  75288. if (c < 0) {
  75289. /* Number of bits in top word is less than number needed. */
  75290. c = -c;
  75291. y = (byte)(n << c);
  75292. n = e[i--];
  75293. y |= (byte)(n >> (64 - c));
  75294. n <<= c;
  75295. c = 64 - c;
  75296. }
  75297. else if (c == 0) {
  75298. /* All bits in top word used. */
  75299. y = (byte)n;
  75300. }
  75301. else {
  75302. y = (byte)(n >> c);
  75303. n <<= 32 - c;
  75304. }
  75305. XMEMCPY(r, t[y], sizeof(sp_digit) * 48);
  75306. for (; i>=0 || c>=5; ) {
  75307. if (c == 0) {
  75308. n = e[i--];
  75309. y = (byte)(n >> 27);
  75310. n <<= 5;
  75311. c = 27;
  75312. }
  75313. else if (c < 5) {
  75314. y = (byte)(n >> 27);
  75315. n = e[i--];
  75316. c = 5 - c;
  75317. y |= (byte)(n >> (32 - c));
  75318. n <<= c;
  75319. c = 32 - c;
  75320. }
  75321. else {
  75322. y = (byte)((n >> 27) & 0x1f);
  75323. n <<= 5;
  75324. c -= 5;
  75325. }
  75326. sp_3072_mont_sqr_48(r, r, m, mp);
  75327. sp_3072_mont_sqr_48(r, r, m, mp);
  75328. sp_3072_mont_sqr_48(r, r, m, mp);
  75329. sp_3072_mont_sqr_48(r, r, m, mp);
  75330. sp_3072_mont_sqr_48(r, r, m, mp);
  75331. sp_3072_mont_mul_48(r, r, t[y], m, mp);
  75332. }
  75333. XMEMSET(&r[48], 0, sizeof(sp_digit) * 48U);
  75334. sp_3072_mont_reduce_48(r, m, mp);
  75335. mask = 0 - (sp_3072_cmp_48(r, m) >= 0);
  75336. sp_3072_cond_sub_48(r, r, m, mask);
  75337. }
  75338. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  75339. if (td != NULL)
  75340. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  75341. #endif
  75342. return err;
  75343. }
  75344. #endif /* WOLFSSL_SP_SMALL */
  75345. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  75346. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  75347. /* r = 2^n mod m where n is the number of bits to reduce by.
  75348. * Given m must be 3072 bits, just need to subtract.
  75349. *
  75350. * r A single precision number.
  75351. * m A single precision number.
  75352. */
  75353. static void sp_3072_mont_norm_96(sp_digit* r, const sp_digit* m)
  75354. {
  75355. XMEMSET(r, 0, sizeof(sp_digit) * 96);
  75356. /* r = 2^n mod m */
  75357. sp_3072_sub_in_place_96(r, m);
  75358. }
  75359. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  75360. /* Conditionally subtract b from a using the mask m.
  75361. * m is -1 to subtract and 0 when not copying.
  75362. *
  75363. * r A single precision number representing condition subtract result.
  75364. * a A single precision number to subtract from.
  75365. * b A single precision number to subtract.
  75366. * m Mask value to apply.
  75367. */
  75368. SP_NOINLINE static sp_digit sp_3072_cond_sub_96(sp_digit* r, const sp_digit* a,
  75369. const sp_digit* b, sp_digit m)
  75370. {
  75371. __asm__ __volatile__ (
  75372. "movs r4, #0\n\t"
  75373. "movs r5, #0xff\n\t"
  75374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75375. "adds r5, r5, #0x81\n\t"
  75376. #else
  75377. "add r5, r5, #0x81\n\t"
  75378. #endif
  75379. "mov r8, r5\n\t"
  75380. "movs r7, #0\n\t"
  75381. "\n"
  75382. "L_sp_3072_cond_sub_96_words_%=:\n\t"
  75383. "ldr r6, [%[b], r7]\n\t"
  75384. #ifdef WOLFSSL_KEIL
  75385. "ands r6, r6, %[m]\n\t"
  75386. #elif defined(__clang__)
  75387. "ands r6, %[m]\n\t"
  75388. #else
  75389. "and r6, %[m]\n\t"
  75390. #endif
  75391. "movs r5, #0\n\t"
  75392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75393. "subs r5, r5, r4\n\t"
  75394. #else
  75395. "sub r5, r5, r4\n\t"
  75396. #endif
  75397. "ldr r5, [%[a], r7]\n\t"
  75398. #ifdef WOLFSSL_KEIL
  75399. "sbcs r5, r5, r6\n\t"
  75400. #elif defined(__clang__)
  75401. "sbcs r5, r6\n\t"
  75402. #else
  75403. "sbc r5, r6\n\t"
  75404. #endif
  75405. #ifdef WOLFSSL_KEIL
  75406. "sbcs r4, r4, r4\n\t"
  75407. #elif defined(__clang__)
  75408. "sbcs r4, r4\n\t"
  75409. #else
  75410. "sbc r4, r4\n\t"
  75411. #endif
  75412. "str r5, [%[r], r7]\n\t"
  75413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75414. "adds r7, r7, #4\n\t"
  75415. #else
  75416. "add r7, r7, #4\n\t"
  75417. #endif
  75418. "cmp r7, r8\n\t"
  75419. "blt L_sp_3072_cond_sub_96_words_%=\n\t"
  75420. "movs %[r], r4\n\t"
  75421. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  75422. :
  75423. : "memory", "r4", "r5", "r6", "r7", "r8"
  75424. );
  75425. return (uint32_t)(size_t)r;
  75426. }
  75427. /* Reduce the number back to 3072 bits using Montgomery reduction.
  75428. *
  75429. * a A single precision number to reduce in place.
  75430. * m The single precision number representing the modulus.
  75431. * mp The digit representing the negative inverse of m mod 2^n.
  75432. */
  75433. SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a, const sp_digit* m,
  75434. sp_digit mp)
  75435. {
  75436. __asm__ __volatile__ (
  75437. "movs r7, #0\n\t"
  75438. "mov r8, %[mp]\n\t"
  75439. "mov r12, r7\n\t"
  75440. "mov lr, %[m]\n\t"
  75441. "mov r9, %[a]\n\t"
  75442. "mov r11, %[a]\n\t"
  75443. "movs r5, #0xff\n\t"
  75444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75445. "adds r5, r5, #0x7d\n\t"
  75446. #else
  75447. "add r5, r5, #0x7d\n\t"
  75448. #endif
  75449. "movs r6, #0xff\n\t"
  75450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75451. "adds r6, r6, #0x81\n\t"
  75452. #else
  75453. "add r6, r6, #0x81\n\t"
  75454. #endif
  75455. "add r9, r9, r5\n\t"
  75456. "add r11, r11, r6\n\t"
  75457. "\n"
  75458. "L_sp_3072_mont_reduce_96_mod_%=:\n\t"
  75459. "movs r7, #0\n\t"
  75460. "movs r4, #0\n\t"
  75461. "# a[i] += m[0] * mu\n\t"
  75462. "ldm %[m]!, {%[mp]}\n\t"
  75463. "ldm %[a]!, {r3}\n\t"
  75464. "# mu = a[i] * mp\n\t"
  75465. "mov r5, r8\n\t"
  75466. #ifdef WOLFSSL_KEIL
  75467. "muls r5, r3, r5\n\t"
  75468. #elif defined(__clang__)
  75469. "muls r5, r3\n\t"
  75470. #else
  75471. "mul r5, r3\n\t"
  75472. #endif
  75473. "mov r10, r5\n\t"
  75474. "# Multiply m[0] and mu - Start\n\t"
  75475. "mov r5, r10\n\t"
  75476. "uxth r6, %[mp]\n\t"
  75477. "uxth r5, r5\n\t"
  75478. #ifdef WOLFSSL_KEIL
  75479. "muls r6, r5, r6\n\t"
  75480. #elif defined(__clang__)
  75481. "muls r6, r5\n\t"
  75482. #else
  75483. "mul r6, r5\n\t"
  75484. #endif
  75485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75486. "adds r3, r3, r6\n\t"
  75487. #else
  75488. "add r3, r3, r6\n\t"
  75489. #endif
  75490. #ifdef WOLFSSL_KEIL
  75491. "adcs r4, r4, r7\n\t"
  75492. #elif defined(__clang__)
  75493. "adcs r4, r7\n\t"
  75494. #else
  75495. "adc r4, r7\n\t"
  75496. #endif
  75497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75498. "lsrs r6, %[mp], #16\n\t"
  75499. #else
  75500. "lsr r6, %[mp], #16\n\t"
  75501. #endif
  75502. #ifdef WOLFSSL_KEIL
  75503. "muls r5, r6, r5\n\t"
  75504. #elif defined(__clang__)
  75505. "muls r5, r6\n\t"
  75506. #else
  75507. "mul r5, r6\n\t"
  75508. #endif
  75509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75510. "lsrs r6, r5, #16\n\t"
  75511. #else
  75512. "lsr r6, r5, #16\n\t"
  75513. #endif
  75514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75515. "lsls r5, r5, #16\n\t"
  75516. #else
  75517. "lsl r5, r5, #16\n\t"
  75518. #endif
  75519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75520. "adds r3, r3, r5\n\t"
  75521. #else
  75522. "add r3, r3, r5\n\t"
  75523. #endif
  75524. #ifdef WOLFSSL_KEIL
  75525. "adcs r4, r4, r6\n\t"
  75526. #elif defined(__clang__)
  75527. "adcs r4, r6\n\t"
  75528. #else
  75529. "adc r4, r6\n\t"
  75530. #endif
  75531. "mov r5, r10\n\t"
  75532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75533. "lsrs r6, %[mp], #16\n\t"
  75534. #else
  75535. "lsr r6, %[mp], #16\n\t"
  75536. #endif
  75537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75538. "lsrs r5, r5, #16\n\t"
  75539. #else
  75540. "lsr r5, r5, #16\n\t"
  75541. #endif
  75542. #ifdef WOLFSSL_KEIL
  75543. "muls r6, r5, r6\n\t"
  75544. #elif defined(__clang__)
  75545. "muls r6, r5\n\t"
  75546. #else
  75547. "mul r6, r5\n\t"
  75548. #endif
  75549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75550. "adds r4, r4, r6\n\t"
  75551. #else
  75552. "add r4, r4, r6\n\t"
  75553. #endif
  75554. "uxth r6, %[mp]\n\t"
  75555. #ifdef WOLFSSL_KEIL
  75556. "muls r5, r6, r5\n\t"
  75557. #elif defined(__clang__)
  75558. "muls r5, r6\n\t"
  75559. #else
  75560. "mul r5, r6\n\t"
  75561. #endif
  75562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75563. "lsrs r6, r5, #16\n\t"
  75564. #else
  75565. "lsr r6, r5, #16\n\t"
  75566. #endif
  75567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75568. "lsls r5, r5, #16\n\t"
  75569. #else
  75570. "lsl r5, r5, #16\n\t"
  75571. #endif
  75572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75573. "adds r3, r3, r5\n\t"
  75574. #else
  75575. "add r3, r3, r5\n\t"
  75576. #endif
  75577. #ifdef WOLFSSL_KEIL
  75578. "adcs r4, r4, r6\n\t"
  75579. #elif defined(__clang__)
  75580. "adcs r4, r6\n\t"
  75581. #else
  75582. "adc r4, r6\n\t"
  75583. #endif
  75584. "# Multiply m[0] and mu - Done\n\t"
  75585. "\n"
  75586. "L_sp_3072_mont_reduce_96_word_%=:\n\t"
  75587. "# a[i+j] += m[j] * mu\n\t"
  75588. "ldr r3, [%[a]]\n\t"
  75589. "ldm %[m]!, {%[mp]}\n\t"
  75590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75591. "adds r3, r3, r4\n\t"
  75592. #else
  75593. "add r3, r3, r4\n\t"
  75594. #endif
  75595. "movs r4, #0\n\t"
  75596. #ifdef WOLFSSL_KEIL
  75597. "adcs r4, r4, r7\n\t"
  75598. #elif defined(__clang__)
  75599. "adcs r4, r7\n\t"
  75600. #else
  75601. "adc r4, r7\n\t"
  75602. #endif
  75603. "# Multiply m[j] and mu - Start\n\t"
  75604. "mov r5, r10\n\t"
  75605. "uxth r6, %[mp]\n\t"
  75606. "uxth r5, r5\n\t"
  75607. #ifdef WOLFSSL_KEIL
  75608. "muls r6, r5, r6\n\t"
  75609. #elif defined(__clang__)
  75610. "muls r6, r5\n\t"
  75611. #else
  75612. "mul r6, r5\n\t"
  75613. #endif
  75614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75615. "adds r3, r3, r6\n\t"
  75616. #else
  75617. "add r3, r3, r6\n\t"
  75618. #endif
  75619. #ifdef WOLFSSL_KEIL
  75620. "adcs r4, r4, r7\n\t"
  75621. #elif defined(__clang__)
  75622. "adcs r4, r7\n\t"
  75623. #else
  75624. "adc r4, r7\n\t"
  75625. #endif
  75626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75627. "lsrs r6, %[mp], #16\n\t"
  75628. #else
  75629. "lsr r6, %[mp], #16\n\t"
  75630. #endif
  75631. #ifdef WOLFSSL_KEIL
  75632. "muls r5, r6, r5\n\t"
  75633. #elif defined(__clang__)
  75634. "muls r5, r6\n\t"
  75635. #else
  75636. "mul r5, r6\n\t"
  75637. #endif
  75638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75639. "lsrs r6, r5, #16\n\t"
  75640. #else
  75641. "lsr r6, r5, #16\n\t"
  75642. #endif
  75643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75644. "lsls r5, r5, #16\n\t"
  75645. #else
  75646. "lsl r5, r5, #16\n\t"
  75647. #endif
  75648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75649. "adds r3, r3, r5\n\t"
  75650. #else
  75651. "add r3, r3, r5\n\t"
  75652. #endif
  75653. #ifdef WOLFSSL_KEIL
  75654. "adcs r4, r4, r6\n\t"
  75655. #elif defined(__clang__)
  75656. "adcs r4, r6\n\t"
  75657. #else
  75658. "adc r4, r6\n\t"
  75659. #endif
  75660. "mov r5, r10\n\t"
  75661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75662. "lsrs r6, %[mp], #16\n\t"
  75663. #else
  75664. "lsr r6, %[mp], #16\n\t"
  75665. #endif
  75666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75667. "lsrs r5, r5, #16\n\t"
  75668. #else
  75669. "lsr r5, r5, #16\n\t"
  75670. #endif
  75671. #ifdef WOLFSSL_KEIL
  75672. "muls r6, r5, r6\n\t"
  75673. #elif defined(__clang__)
  75674. "muls r6, r5\n\t"
  75675. #else
  75676. "mul r6, r5\n\t"
  75677. #endif
  75678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75679. "adds r4, r4, r6\n\t"
  75680. #else
  75681. "add r4, r4, r6\n\t"
  75682. #endif
  75683. "uxth r6, %[mp]\n\t"
  75684. #ifdef WOLFSSL_KEIL
  75685. "muls r5, r6, r5\n\t"
  75686. #elif defined(__clang__)
  75687. "muls r5, r6\n\t"
  75688. #else
  75689. "mul r5, r6\n\t"
  75690. #endif
  75691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75692. "lsrs r6, r5, #16\n\t"
  75693. #else
  75694. "lsr r6, r5, #16\n\t"
  75695. #endif
  75696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75697. "lsls r5, r5, #16\n\t"
  75698. #else
  75699. "lsl r5, r5, #16\n\t"
  75700. #endif
  75701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75702. "adds r3, r3, r5\n\t"
  75703. #else
  75704. "add r3, r3, r5\n\t"
  75705. #endif
  75706. #ifdef WOLFSSL_KEIL
  75707. "adcs r4, r4, r6\n\t"
  75708. #elif defined(__clang__)
  75709. "adcs r4, r6\n\t"
  75710. #else
  75711. "adc r4, r6\n\t"
  75712. #endif
  75713. "# Multiply m[j] and mu - Done\n\t"
  75714. "stm %[a]!, {r3}\n\t"
  75715. "cmp %[a], r9\n\t"
  75716. "blt L_sp_3072_mont_reduce_96_word_%=\n\t"
  75717. "# a[i+95] += m[95] * mu\n\t"
  75718. "ldr %[mp], [%[m]]\n\t"
  75719. "mov r3, r12\n\t"
  75720. "# Multiply m[95] and mu - Start\n\t"
  75721. "mov r5, r10\n\t"
  75722. "uxth r6, %[mp]\n\t"
  75723. "uxth r5, r5\n\t"
  75724. #ifdef WOLFSSL_KEIL
  75725. "muls r6, r5, r6\n\t"
  75726. #elif defined(__clang__)
  75727. "muls r6, r5\n\t"
  75728. #else
  75729. "mul r6, r5\n\t"
  75730. #endif
  75731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75732. "adds r4, r4, r6\n\t"
  75733. #else
  75734. "add r4, r4, r6\n\t"
  75735. #endif
  75736. #ifdef WOLFSSL_KEIL
  75737. "adcs r3, r3, r7\n\t"
  75738. #elif defined(__clang__)
  75739. "adcs r3, r7\n\t"
  75740. #else
  75741. "adc r3, r7\n\t"
  75742. #endif
  75743. #ifdef WOLFSSL_KEIL
  75744. "adcs r7, r7, r7\n\t"
  75745. #elif defined(__clang__)
  75746. "adcs r7, r7\n\t"
  75747. #else
  75748. "adc r7, r7\n\t"
  75749. #endif
  75750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75751. "lsrs r6, %[mp], #16\n\t"
  75752. #else
  75753. "lsr r6, %[mp], #16\n\t"
  75754. #endif
  75755. #ifdef WOLFSSL_KEIL
  75756. "muls r5, r6, r5\n\t"
  75757. #elif defined(__clang__)
  75758. "muls r5, r6\n\t"
  75759. #else
  75760. "mul r5, r6\n\t"
  75761. #endif
  75762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75763. "lsrs r6, r5, #16\n\t"
  75764. #else
  75765. "lsr r6, r5, #16\n\t"
  75766. #endif
  75767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75768. "lsls r5, r5, #16\n\t"
  75769. #else
  75770. "lsl r5, r5, #16\n\t"
  75771. #endif
  75772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75773. "adds r4, r4, r5\n\t"
  75774. #else
  75775. "add r4, r4, r5\n\t"
  75776. #endif
  75777. #ifdef WOLFSSL_KEIL
  75778. "adcs r3, r3, r6\n\t"
  75779. #elif defined(__clang__)
  75780. "adcs r3, r6\n\t"
  75781. #else
  75782. "adc r3, r6\n\t"
  75783. #endif
  75784. #ifdef WOLFSSL_KEIL
  75785. "adcs r7, r7, r7\n\t"
  75786. #elif defined(__clang__)
  75787. "adcs r7, r7\n\t"
  75788. #else
  75789. "adc r7, r7\n\t"
  75790. #endif
  75791. "mov r5, r10\n\t"
  75792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75793. "lsrs r6, %[mp], #16\n\t"
  75794. #else
  75795. "lsr r6, %[mp], #16\n\t"
  75796. #endif
  75797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75798. "lsrs r5, r5, #16\n\t"
  75799. #else
  75800. "lsr r5, r5, #16\n\t"
  75801. #endif
  75802. #ifdef WOLFSSL_KEIL
  75803. "muls r6, r5, r6\n\t"
  75804. #elif defined(__clang__)
  75805. "muls r6, r5\n\t"
  75806. #else
  75807. "mul r6, r5\n\t"
  75808. #endif
  75809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75810. "adds r3, r3, r6\n\t"
  75811. #else
  75812. "add r3, r3, r6\n\t"
  75813. #endif
  75814. #ifdef WOLFSSL_KEIL
  75815. "adcs r7, r7, r7\n\t"
  75816. #elif defined(__clang__)
  75817. "adcs r7, r7\n\t"
  75818. #else
  75819. "adc r7, r7\n\t"
  75820. #endif
  75821. "uxth r6, %[mp]\n\t"
  75822. #ifdef WOLFSSL_KEIL
  75823. "muls r5, r6, r5\n\t"
  75824. #elif defined(__clang__)
  75825. "muls r5, r6\n\t"
  75826. #else
  75827. "mul r5, r6\n\t"
  75828. #endif
  75829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75830. "lsrs r6, r5, #16\n\t"
  75831. #else
  75832. "lsr r6, r5, #16\n\t"
  75833. #endif
  75834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75835. "lsls r5, r5, #16\n\t"
  75836. #else
  75837. "lsl r5, r5, #16\n\t"
  75838. #endif
  75839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75840. "adds r4, r4, r5\n\t"
  75841. #else
  75842. "add r4, r4, r5\n\t"
  75843. #endif
  75844. #ifdef WOLFSSL_KEIL
  75845. "adcs r3, r3, r6\n\t"
  75846. #elif defined(__clang__)
  75847. "adcs r3, r6\n\t"
  75848. #else
  75849. "adc r3, r6\n\t"
  75850. #endif
  75851. #ifdef WOLFSSL_KEIL
  75852. "adcs r7, r7, r7\n\t"
  75853. #elif defined(__clang__)
  75854. "adcs r7, r7\n\t"
  75855. #else
  75856. "adc r7, r7\n\t"
  75857. #endif
  75858. "# Multiply m[95] and mu - Done\n\t"
  75859. "ldr r5, [%[a]]\n\t"
  75860. "ldr r6, [%[a], #4]\n\t"
  75861. "movs %[mp], #0\n\t"
  75862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75863. "adds r5, r5, r4\n\t"
  75864. #else
  75865. "add r5, r5, r4\n\t"
  75866. #endif
  75867. #ifdef WOLFSSL_KEIL
  75868. "adcs r6, r6, r3\n\t"
  75869. #elif defined(__clang__)
  75870. "adcs r6, r3\n\t"
  75871. #else
  75872. "adc r6, r3\n\t"
  75873. #endif
  75874. #ifdef WOLFSSL_KEIL
  75875. "adcs r7, r7, %[mp]\n\t"
  75876. #elif defined(__clang__)
  75877. "adcs r7, %[mp]\n\t"
  75878. #else
  75879. "adc r7, %[mp]\n\t"
  75880. #endif
  75881. "stm %[a]!, {r5, r6}\n\t"
  75882. "# i += 1\n\t"
  75883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75884. "subs %[a], %[a], #4\n\t"
  75885. #else
  75886. "sub %[a], %[a], #4\n\t"
  75887. #endif
  75888. "movs r3, #0xff\n\t"
  75889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75890. "adds r3, r3, #0x7d\n\t"
  75891. #else
  75892. "add r3, r3, #0x7d\n\t"
  75893. #endif
  75894. "mov r9, %[a]\n\t"
  75895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75896. "subs %[a], %[a], r3\n\t"
  75897. #else
  75898. "sub %[a], %[a], r3\n\t"
  75899. #endif
  75900. "mov r12, r7\n\t"
  75901. "mov %[m], lr\n\t"
  75902. "cmp r11, %[a]\n\t"
  75903. "bgt L_sp_3072_mont_reduce_96_mod_%=\n\t"
  75904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75905. "negs r7, r7\n\t"
  75906. #else
  75907. "neg r7, r7\n\t"
  75908. #endif
  75909. "# Subtract masked modulus\n\t"
  75910. "movs r4, #0xff\n\t"
  75911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75912. "adds r4, r4, #0x81\n\t"
  75913. #else
  75914. "add r4, r4, #0x81\n\t"
  75915. #endif
  75916. "movs %[mp], #0\n\t"
  75917. "movs r3, #0\n\t"
  75918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75919. "subs %[a], %[a], r4\n\t"
  75920. #else
  75921. "sub %[a], %[a], r4\n\t"
  75922. #endif
  75923. #ifndef WOLFSSL_SP_LARGE_CODE
  75924. "\n"
  75925. "L_sp_3072_mont_reduce_96_sub_mask_%=:\n\t"
  75926. "ldm %[m]!, {r6}\n\t"
  75927. "movs r5, #0\n\t"
  75928. #ifdef WOLFSSL_KEIL
  75929. "ands r6, r6, r7\n\t"
  75930. #elif defined(__clang__)
  75931. "ands r6, r7\n\t"
  75932. #else
  75933. "and r6, r7\n\t"
  75934. #endif
  75935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75936. "subs r5, r5, %[mp]\n\t"
  75937. #else
  75938. "sub r5, r5, %[mp]\n\t"
  75939. #endif
  75940. "ldr r5, [%[a], r4]\n\t"
  75941. #ifdef WOLFSSL_KEIL
  75942. "sbcs r5, r5, r6\n\t"
  75943. #elif defined(__clang__)
  75944. "sbcs r5, r6\n\t"
  75945. #else
  75946. "sbc r5, r6\n\t"
  75947. #endif
  75948. #ifdef WOLFSSL_KEIL
  75949. "sbcs %[mp], %[mp], %[mp]\n\t"
  75950. #elif defined(__clang__)
  75951. "sbcs %[mp], %[mp]\n\t"
  75952. #else
  75953. "sbc %[mp], %[mp]\n\t"
  75954. #endif
  75955. "stm %[a]!, {r5}\n\t"
  75956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75957. "adds r3, r3, #4\n\t"
  75958. #else
  75959. "add r3, r3, #4\n\t"
  75960. #endif
  75961. "cmp r3, r4\n\t"
  75962. "blt L_sp_3072_mont_reduce_96_sub_mask_%=\n\t"
  75963. #else /* WOLFSSL_SP_LARGE_CODE */
  75964. "ldm %[m]!, {r6}\n\t"
  75965. #ifdef WOLFSSL_KEIL
  75966. "ands r6, r6, r7\n\t"
  75967. #elif defined(__clang__)
  75968. "ands r6, r7\n\t"
  75969. #else
  75970. "and r6, r7\n\t"
  75971. #endif
  75972. "ldr r5, [%[a], r4]\n\t"
  75973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  75974. "subs r5, r5, r6\n\t"
  75975. #else
  75976. "sub r5, r5, r6\n\t"
  75977. #endif
  75978. "stm %[a]!, {r5}\n\t"
  75979. "ldm %[m]!, {r6}\n\t"
  75980. #ifdef WOLFSSL_KEIL
  75981. "ands r6, r6, r7\n\t"
  75982. #elif defined(__clang__)
  75983. "ands r6, r7\n\t"
  75984. #else
  75985. "and r6, r7\n\t"
  75986. #endif
  75987. "ldr r5, [%[a], r4]\n\t"
  75988. #ifdef WOLFSSL_KEIL
  75989. "sbcs r5, r5, r6\n\t"
  75990. #elif defined(__clang__)
  75991. "sbcs r5, r6\n\t"
  75992. #else
  75993. "sbc r5, r6\n\t"
  75994. #endif
  75995. "stm %[a]!, {r5}\n\t"
  75996. "ldm %[m]!, {r6}\n\t"
  75997. #ifdef WOLFSSL_KEIL
  75998. "ands r6, r6, r7\n\t"
  75999. #elif defined(__clang__)
  76000. "ands r6, r7\n\t"
  76001. #else
  76002. "and r6, r7\n\t"
  76003. #endif
  76004. "ldr r5, [%[a], r4]\n\t"
  76005. #ifdef WOLFSSL_KEIL
  76006. "sbcs r5, r5, r6\n\t"
  76007. #elif defined(__clang__)
  76008. "sbcs r5, r6\n\t"
  76009. #else
  76010. "sbc r5, r6\n\t"
  76011. #endif
  76012. "stm %[a]!, {r5}\n\t"
  76013. "ldm %[m]!, {r6}\n\t"
  76014. #ifdef WOLFSSL_KEIL
  76015. "ands r6, r6, r7\n\t"
  76016. #elif defined(__clang__)
  76017. "ands r6, r7\n\t"
  76018. #else
  76019. "and r6, r7\n\t"
  76020. #endif
  76021. "ldr r5, [%[a], r4]\n\t"
  76022. #ifdef WOLFSSL_KEIL
  76023. "sbcs r5, r5, r6\n\t"
  76024. #elif defined(__clang__)
  76025. "sbcs r5, r6\n\t"
  76026. #else
  76027. "sbc r5, r6\n\t"
  76028. #endif
  76029. "stm %[a]!, {r5}\n\t"
  76030. "ldm %[m]!, {r6}\n\t"
  76031. #ifdef WOLFSSL_KEIL
  76032. "ands r6, r6, r7\n\t"
  76033. #elif defined(__clang__)
  76034. "ands r6, r7\n\t"
  76035. #else
  76036. "and r6, r7\n\t"
  76037. #endif
  76038. "ldr r5, [%[a], r4]\n\t"
  76039. #ifdef WOLFSSL_KEIL
  76040. "sbcs r5, r5, r6\n\t"
  76041. #elif defined(__clang__)
  76042. "sbcs r5, r6\n\t"
  76043. #else
  76044. "sbc r5, r6\n\t"
  76045. #endif
  76046. "stm %[a]!, {r5}\n\t"
  76047. "ldm %[m]!, {r6}\n\t"
  76048. #ifdef WOLFSSL_KEIL
  76049. "ands r6, r6, r7\n\t"
  76050. #elif defined(__clang__)
  76051. "ands r6, r7\n\t"
  76052. #else
  76053. "and r6, r7\n\t"
  76054. #endif
  76055. "ldr r5, [%[a], r4]\n\t"
  76056. #ifdef WOLFSSL_KEIL
  76057. "sbcs r5, r5, r6\n\t"
  76058. #elif defined(__clang__)
  76059. "sbcs r5, r6\n\t"
  76060. #else
  76061. "sbc r5, r6\n\t"
  76062. #endif
  76063. "stm %[a]!, {r5}\n\t"
  76064. "ldm %[m]!, {r6}\n\t"
  76065. #ifdef WOLFSSL_KEIL
  76066. "ands r6, r6, r7\n\t"
  76067. #elif defined(__clang__)
  76068. "ands r6, r7\n\t"
  76069. #else
  76070. "and r6, r7\n\t"
  76071. #endif
  76072. "ldr r5, [%[a], r4]\n\t"
  76073. #ifdef WOLFSSL_KEIL
  76074. "sbcs r5, r5, r6\n\t"
  76075. #elif defined(__clang__)
  76076. "sbcs r5, r6\n\t"
  76077. #else
  76078. "sbc r5, r6\n\t"
  76079. #endif
  76080. "stm %[a]!, {r5}\n\t"
  76081. "ldm %[m]!, {r6}\n\t"
  76082. #ifdef WOLFSSL_KEIL
  76083. "ands r6, r6, r7\n\t"
  76084. #elif defined(__clang__)
  76085. "ands r6, r7\n\t"
  76086. #else
  76087. "and r6, r7\n\t"
  76088. #endif
  76089. "ldr r5, [%[a], r4]\n\t"
  76090. #ifdef WOLFSSL_KEIL
  76091. "sbcs r5, r5, r6\n\t"
  76092. #elif defined(__clang__)
  76093. "sbcs r5, r6\n\t"
  76094. #else
  76095. "sbc r5, r6\n\t"
  76096. #endif
  76097. "stm %[a]!, {r5}\n\t"
  76098. "ldm %[m]!, {r6}\n\t"
  76099. #ifdef WOLFSSL_KEIL
  76100. "ands r6, r6, r7\n\t"
  76101. #elif defined(__clang__)
  76102. "ands r6, r7\n\t"
  76103. #else
  76104. "and r6, r7\n\t"
  76105. #endif
  76106. "ldr r5, [%[a], r4]\n\t"
  76107. #ifdef WOLFSSL_KEIL
  76108. "sbcs r5, r5, r6\n\t"
  76109. #elif defined(__clang__)
  76110. "sbcs r5, r6\n\t"
  76111. #else
  76112. "sbc r5, r6\n\t"
  76113. #endif
  76114. "stm %[a]!, {r5}\n\t"
  76115. "ldm %[m]!, {r6}\n\t"
  76116. #ifdef WOLFSSL_KEIL
  76117. "ands r6, r6, r7\n\t"
  76118. #elif defined(__clang__)
  76119. "ands r6, r7\n\t"
  76120. #else
  76121. "and r6, r7\n\t"
  76122. #endif
  76123. "ldr r5, [%[a], r4]\n\t"
  76124. #ifdef WOLFSSL_KEIL
  76125. "sbcs r5, r5, r6\n\t"
  76126. #elif defined(__clang__)
  76127. "sbcs r5, r6\n\t"
  76128. #else
  76129. "sbc r5, r6\n\t"
  76130. #endif
  76131. "stm %[a]!, {r5}\n\t"
  76132. "ldm %[m]!, {r6}\n\t"
  76133. #ifdef WOLFSSL_KEIL
  76134. "ands r6, r6, r7\n\t"
  76135. #elif defined(__clang__)
  76136. "ands r6, r7\n\t"
  76137. #else
  76138. "and r6, r7\n\t"
  76139. #endif
  76140. "ldr r5, [%[a], r4]\n\t"
  76141. #ifdef WOLFSSL_KEIL
  76142. "sbcs r5, r5, r6\n\t"
  76143. #elif defined(__clang__)
  76144. "sbcs r5, r6\n\t"
  76145. #else
  76146. "sbc r5, r6\n\t"
  76147. #endif
  76148. "stm %[a]!, {r5}\n\t"
  76149. "ldm %[m]!, {r6}\n\t"
  76150. #ifdef WOLFSSL_KEIL
  76151. "ands r6, r6, r7\n\t"
  76152. #elif defined(__clang__)
  76153. "ands r6, r7\n\t"
  76154. #else
  76155. "and r6, r7\n\t"
  76156. #endif
  76157. "ldr r5, [%[a], r4]\n\t"
  76158. #ifdef WOLFSSL_KEIL
  76159. "sbcs r5, r5, r6\n\t"
  76160. #elif defined(__clang__)
  76161. "sbcs r5, r6\n\t"
  76162. #else
  76163. "sbc r5, r6\n\t"
  76164. #endif
  76165. "stm %[a]!, {r5}\n\t"
  76166. "ldm %[m]!, {r6}\n\t"
  76167. #ifdef WOLFSSL_KEIL
  76168. "ands r6, r6, r7\n\t"
  76169. #elif defined(__clang__)
  76170. "ands r6, r7\n\t"
  76171. #else
  76172. "and r6, r7\n\t"
  76173. #endif
  76174. "ldr r5, [%[a], r4]\n\t"
  76175. #ifdef WOLFSSL_KEIL
  76176. "sbcs r5, r5, r6\n\t"
  76177. #elif defined(__clang__)
  76178. "sbcs r5, r6\n\t"
  76179. #else
  76180. "sbc r5, r6\n\t"
  76181. #endif
  76182. "stm %[a]!, {r5}\n\t"
  76183. "ldm %[m]!, {r6}\n\t"
  76184. #ifdef WOLFSSL_KEIL
  76185. "ands r6, r6, r7\n\t"
  76186. #elif defined(__clang__)
  76187. "ands r6, r7\n\t"
  76188. #else
  76189. "and r6, r7\n\t"
  76190. #endif
  76191. "ldr r5, [%[a], r4]\n\t"
  76192. #ifdef WOLFSSL_KEIL
  76193. "sbcs r5, r5, r6\n\t"
  76194. #elif defined(__clang__)
  76195. "sbcs r5, r6\n\t"
  76196. #else
  76197. "sbc r5, r6\n\t"
  76198. #endif
  76199. "stm %[a]!, {r5}\n\t"
  76200. "ldm %[m]!, {r6}\n\t"
  76201. #ifdef WOLFSSL_KEIL
  76202. "ands r6, r6, r7\n\t"
  76203. #elif defined(__clang__)
  76204. "ands r6, r7\n\t"
  76205. #else
  76206. "and r6, r7\n\t"
  76207. #endif
  76208. "ldr r5, [%[a], r4]\n\t"
  76209. #ifdef WOLFSSL_KEIL
  76210. "sbcs r5, r5, r6\n\t"
  76211. #elif defined(__clang__)
  76212. "sbcs r5, r6\n\t"
  76213. #else
  76214. "sbc r5, r6\n\t"
  76215. #endif
  76216. "stm %[a]!, {r5}\n\t"
  76217. "ldm %[m]!, {r6}\n\t"
  76218. #ifdef WOLFSSL_KEIL
  76219. "ands r6, r6, r7\n\t"
  76220. #elif defined(__clang__)
  76221. "ands r6, r7\n\t"
  76222. #else
  76223. "and r6, r7\n\t"
  76224. #endif
  76225. "ldr r5, [%[a], r4]\n\t"
  76226. #ifdef WOLFSSL_KEIL
  76227. "sbcs r5, r5, r6\n\t"
  76228. #elif defined(__clang__)
  76229. "sbcs r5, r6\n\t"
  76230. #else
  76231. "sbc r5, r6\n\t"
  76232. #endif
  76233. "stm %[a]!, {r5}\n\t"
  76234. "ldm %[m]!, {r6}\n\t"
  76235. #ifdef WOLFSSL_KEIL
  76236. "ands r6, r6, r7\n\t"
  76237. #elif defined(__clang__)
  76238. "ands r6, r7\n\t"
  76239. #else
  76240. "and r6, r7\n\t"
  76241. #endif
  76242. "ldr r5, [%[a], r4]\n\t"
  76243. #ifdef WOLFSSL_KEIL
  76244. "sbcs r5, r5, r6\n\t"
  76245. #elif defined(__clang__)
  76246. "sbcs r5, r6\n\t"
  76247. #else
  76248. "sbc r5, r6\n\t"
  76249. #endif
  76250. "stm %[a]!, {r5}\n\t"
  76251. "ldm %[m]!, {r6}\n\t"
  76252. #ifdef WOLFSSL_KEIL
  76253. "ands r6, r6, r7\n\t"
  76254. #elif defined(__clang__)
  76255. "ands r6, r7\n\t"
  76256. #else
  76257. "and r6, r7\n\t"
  76258. #endif
  76259. "ldr r5, [%[a], r4]\n\t"
  76260. #ifdef WOLFSSL_KEIL
  76261. "sbcs r5, r5, r6\n\t"
  76262. #elif defined(__clang__)
  76263. "sbcs r5, r6\n\t"
  76264. #else
  76265. "sbc r5, r6\n\t"
  76266. #endif
  76267. "stm %[a]!, {r5}\n\t"
  76268. "ldm %[m]!, {r6}\n\t"
  76269. #ifdef WOLFSSL_KEIL
  76270. "ands r6, r6, r7\n\t"
  76271. #elif defined(__clang__)
  76272. "ands r6, r7\n\t"
  76273. #else
  76274. "and r6, r7\n\t"
  76275. #endif
  76276. "ldr r5, [%[a], r4]\n\t"
  76277. #ifdef WOLFSSL_KEIL
  76278. "sbcs r5, r5, r6\n\t"
  76279. #elif defined(__clang__)
  76280. "sbcs r5, r6\n\t"
  76281. #else
  76282. "sbc r5, r6\n\t"
  76283. #endif
  76284. "stm %[a]!, {r5}\n\t"
  76285. "ldm %[m]!, {r6}\n\t"
  76286. #ifdef WOLFSSL_KEIL
  76287. "ands r6, r6, r7\n\t"
  76288. #elif defined(__clang__)
  76289. "ands r6, r7\n\t"
  76290. #else
  76291. "and r6, r7\n\t"
  76292. #endif
  76293. "ldr r5, [%[a], r4]\n\t"
  76294. #ifdef WOLFSSL_KEIL
  76295. "sbcs r5, r5, r6\n\t"
  76296. #elif defined(__clang__)
  76297. "sbcs r5, r6\n\t"
  76298. #else
  76299. "sbc r5, r6\n\t"
  76300. #endif
  76301. "stm %[a]!, {r5}\n\t"
  76302. "ldm %[m]!, {r6}\n\t"
  76303. #ifdef WOLFSSL_KEIL
  76304. "ands r6, r6, r7\n\t"
  76305. #elif defined(__clang__)
  76306. "ands r6, r7\n\t"
  76307. #else
  76308. "and r6, r7\n\t"
  76309. #endif
  76310. "ldr r5, [%[a], r4]\n\t"
  76311. #ifdef WOLFSSL_KEIL
  76312. "sbcs r5, r5, r6\n\t"
  76313. #elif defined(__clang__)
  76314. "sbcs r5, r6\n\t"
  76315. #else
  76316. "sbc r5, r6\n\t"
  76317. #endif
  76318. "stm %[a]!, {r5}\n\t"
  76319. "ldm %[m]!, {r6}\n\t"
  76320. #ifdef WOLFSSL_KEIL
  76321. "ands r6, r6, r7\n\t"
  76322. #elif defined(__clang__)
  76323. "ands r6, r7\n\t"
  76324. #else
  76325. "and r6, r7\n\t"
  76326. #endif
  76327. "ldr r5, [%[a], r4]\n\t"
  76328. #ifdef WOLFSSL_KEIL
  76329. "sbcs r5, r5, r6\n\t"
  76330. #elif defined(__clang__)
  76331. "sbcs r5, r6\n\t"
  76332. #else
  76333. "sbc r5, r6\n\t"
  76334. #endif
  76335. "stm %[a]!, {r5}\n\t"
  76336. "ldm %[m]!, {r6}\n\t"
  76337. #ifdef WOLFSSL_KEIL
  76338. "ands r6, r6, r7\n\t"
  76339. #elif defined(__clang__)
  76340. "ands r6, r7\n\t"
  76341. #else
  76342. "and r6, r7\n\t"
  76343. #endif
  76344. "ldr r5, [%[a], r4]\n\t"
  76345. #ifdef WOLFSSL_KEIL
  76346. "sbcs r5, r5, r6\n\t"
  76347. #elif defined(__clang__)
  76348. "sbcs r5, r6\n\t"
  76349. #else
  76350. "sbc r5, r6\n\t"
  76351. #endif
  76352. "stm %[a]!, {r5}\n\t"
  76353. "ldm %[m]!, {r6}\n\t"
  76354. #ifdef WOLFSSL_KEIL
  76355. "ands r6, r6, r7\n\t"
  76356. #elif defined(__clang__)
  76357. "ands r6, r7\n\t"
  76358. #else
  76359. "and r6, r7\n\t"
  76360. #endif
  76361. "ldr r5, [%[a], r4]\n\t"
  76362. #ifdef WOLFSSL_KEIL
  76363. "sbcs r5, r5, r6\n\t"
  76364. #elif defined(__clang__)
  76365. "sbcs r5, r6\n\t"
  76366. #else
  76367. "sbc r5, r6\n\t"
  76368. #endif
  76369. "stm %[a]!, {r5}\n\t"
  76370. "ldm %[m]!, {r6}\n\t"
  76371. #ifdef WOLFSSL_KEIL
  76372. "ands r6, r6, r7\n\t"
  76373. #elif defined(__clang__)
  76374. "ands r6, r7\n\t"
  76375. #else
  76376. "and r6, r7\n\t"
  76377. #endif
  76378. "ldr r5, [%[a], r4]\n\t"
  76379. #ifdef WOLFSSL_KEIL
  76380. "sbcs r5, r5, r6\n\t"
  76381. #elif defined(__clang__)
  76382. "sbcs r5, r6\n\t"
  76383. #else
  76384. "sbc r5, r6\n\t"
  76385. #endif
  76386. "stm %[a]!, {r5}\n\t"
  76387. "ldm %[m]!, {r6}\n\t"
  76388. #ifdef WOLFSSL_KEIL
  76389. "ands r6, r6, r7\n\t"
  76390. #elif defined(__clang__)
  76391. "ands r6, r7\n\t"
  76392. #else
  76393. "and r6, r7\n\t"
  76394. #endif
  76395. "ldr r5, [%[a], r4]\n\t"
  76396. #ifdef WOLFSSL_KEIL
  76397. "sbcs r5, r5, r6\n\t"
  76398. #elif defined(__clang__)
  76399. "sbcs r5, r6\n\t"
  76400. #else
  76401. "sbc r5, r6\n\t"
  76402. #endif
  76403. "stm %[a]!, {r5}\n\t"
  76404. "ldm %[m]!, {r6}\n\t"
  76405. #ifdef WOLFSSL_KEIL
  76406. "ands r6, r6, r7\n\t"
  76407. #elif defined(__clang__)
  76408. "ands r6, r7\n\t"
  76409. #else
  76410. "and r6, r7\n\t"
  76411. #endif
  76412. "ldr r5, [%[a], r4]\n\t"
  76413. #ifdef WOLFSSL_KEIL
  76414. "sbcs r5, r5, r6\n\t"
  76415. #elif defined(__clang__)
  76416. "sbcs r5, r6\n\t"
  76417. #else
  76418. "sbc r5, r6\n\t"
  76419. #endif
  76420. "stm %[a]!, {r5}\n\t"
  76421. "ldm %[m]!, {r6}\n\t"
  76422. #ifdef WOLFSSL_KEIL
  76423. "ands r6, r6, r7\n\t"
  76424. #elif defined(__clang__)
  76425. "ands r6, r7\n\t"
  76426. #else
  76427. "and r6, r7\n\t"
  76428. #endif
  76429. "ldr r5, [%[a], r4]\n\t"
  76430. #ifdef WOLFSSL_KEIL
  76431. "sbcs r5, r5, r6\n\t"
  76432. #elif defined(__clang__)
  76433. "sbcs r5, r6\n\t"
  76434. #else
  76435. "sbc r5, r6\n\t"
  76436. #endif
  76437. "stm %[a]!, {r5}\n\t"
  76438. "ldm %[m]!, {r6}\n\t"
  76439. #ifdef WOLFSSL_KEIL
  76440. "ands r6, r6, r7\n\t"
  76441. #elif defined(__clang__)
  76442. "ands r6, r7\n\t"
  76443. #else
  76444. "and r6, r7\n\t"
  76445. #endif
  76446. "ldr r5, [%[a], r4]\n\t"
  76447. #ifdef WOLFSSL_KEIL
  76448. "sbcs r5, r5, r6\n\t"
  76449. #elif defined(__clang__)
  76450. "sbcs r5, r6\n\t"
  76451. #else
  76452. "sbc r5, r6\n\t"
  76453. #endif
  76454. "stm %[a]!, {r5}\n\t"
  76455. "ldm %[m]!, {r6}\n\t"
  76456. #ifdef WOLFSSL_KEIL
  76457. "ands r6, r6, r7\n\t"
  76458. #elif defined(__clang__)
  76459. "ands r6, r7\n\t"
  76460. #else
  76461. "and r6, r7\n\t"
  76462. #endif
  76463. "ldr r5, [%[a], r4]\n\t"
  76464. #ifdef WOLFSSL_KEIL
  76465. "sbcs r5, r5, r6\n\t"
  76466. #elif defined(__clang__)
  76467. "sbcs r5, r6\n\t"
  76468. #else
  76469. "sbc r5, r6\n\t"
  76470. #endif
  76471. "stm %[a]!, {r5}\n\t"
  76472. "ldm %[m]!, {r6}\n\t"
  76473. #ifdef WOLFSSL_KEIL
  76474. "ands r6, r6, r7\n\t"
  76475. #elif defined(__clang__)
  76476. "ands r6, r7\n\t"
  76477. #else
  76478. "and r6, r7\n\t"
  76479. #endif
  76480. "ldr r5, [%[a], r4]\n\t"
  76481. #ifdef WOLFSSL_KEIL
  76482. "sbcs r5, r5, r6\n\t"
  76483. #elif defined(__clang__)
  76484. "sbcs r5, r6\n\t"
  76485. #else
  76486. "sbc r5, r6\n\t"
  76487. #endif
  76488. "stm %[a]!, {r5}\n\t"
  76489. "ldm %[m]!, {r6}\n\t"
  76490. #ifdef WOLFSSL_KEIL
  76491. "ands r6, r6, r7\n\t"
  76492. #elif defined(__clang__)
  76493. "ands r6, r7\n\t"
  76494. #else
  76495. "and r6, r7\n\t"
  76496. #endif
  76497. "ldr r5, [%[a], r4]\n\t"
  76498. #ifdef WOLFSSL_KEIL
  76499. "sbcs r5, r5, r6\n\t"
  76500. #elif defined(__clang__)
  76501. "sbcs r5, r6\n\t"
  76502. #else
  76503. "sbc r5, r6\n\t"
  76504. #endif
  76505. "stm %[a]!, {r5}\n\t"
  76506. "ldm %[m]!, {r6}\n\t"
  76507. #ifdef WOLFSSL_KEIL
  76508. "ands r6, r6, r7\n\t"
  76509. #elif defined(__clang__)
  76510. "ands r6, r7\n\t"
  76511. #else
  76512. "and r6, r7\n\t"
  76513. #endif
  76514. "ldr r5, [%[a], r4]\n\t"
  76515. #ifdef WOLFSSL_KEIL
  76516. "sbcs r5, r5, r6\n\t"
  76517. #elif defined(__clang__)
  76518. "sbcs r5, r6\n\t"
  76519. #else
  76520. "sbc r5, r6\n\t"
  76521. #endif
  76522. "stm %[a]!, {r5}\n\t"
  76523. "ldm %[m]!, {r6}\n\t"
  76524. #ifdef WOLFSSL_KEIL
  76525. "ands r6, r6, r7\n\t"
  76526. #elif defined(__clang__)
  76527. "ands r6, r7\n\t"
  76528. #else
  76529. "and r6, r7\n\t"
  76530. #endif
  76531. "ldr r5, [%[a], r4]\n\t"
  76532. #ifdef WOLFSSL_KEIL
  76533. "sbcs r5, r5, r6\n\t"
  76534. #elif defined(__clang__)
  76535. "sbcs r5, r6\n\t"
  76536. #else
  76537. "sbc r5, r6\n\t"
  76538. #endif
  76539. "stm %[a]!, {r5}\n\t"
  76540. "ldm %[m]!, {r6}\n\t"
  76541. #ifdef WOLFSSL_KEIL
  76542. "ands r6, r6, r7\n\t"
  76543. #elif defined(__clang__)
  76544. "ands r6, r7\n\t"
  76545. #else
  76546. "and r6, r7\n\t"
  76547. #endif
  76548. "ldr r5, [%[a], r4]\n\t"
  76549. #ifdef WOLFSSL_KEIL
  76550. "sbcs r5, r5, r6\n\t"
  76551. #elif defined(__clang__)
  76552. "sbcs r5, r6\n\t"
  76553. #else
  76554. "sbc r5, r6\n\t"
  76555. #endif
  76556. "stm %[a]!, {r5}\n\t"
  76557. "ldm %[m]!, {r6}\n\t"
  76558. #ifdef WOLFSSL_KEIL
  76559. "ands r6, r6, r7\n\t"
  76560. #elif defined(__clang__)
  76561. "ands r6, r7\n\t"
  76562. #else
  76563. "and r6, r7\n\t"
  76564. #endif
  76565. "ldr r5, [%[a], r4]\n\t"
  76566. #ifdef WOLFSSL_KEIL
  76567. "sbcs r5, r5, r6\n\t"
  76568. #elif defined(__clang__)
  76569. "sbcs r5, r6\n\t"
  76570. #else
  76571. "sbc r5, r6\n\t"
  76572. #endif
  76573. "stm %[a]!, {r5}\n\t"
  76574. "ldm %[m]!, {r6}\n\t"
  76575. #ifdef WOLFSSL_KEIL
  76576. "ands r6, r6, r7\n\t"
  76577. #elif defined(__clang__)
  76578. "ands r6, r7\n\t"
  76579. #else
  76580. "and r6, r7\n\t"
  76581. #endif
  76582. "ldr r5, [%[a], r4]\n\t"
  76583. #ifdef WOLFSSL_KEIL
  76584. "sbcs r5, r5, r6\n\t"
  76585. #elif defined(__clang__)
  76586. "sbcs r5, r6\n\t"
  76587. #else
  76588. "sbc r5, r6\n\t"
  76589. #endif
  76590. "stm %[a]!, {r5}\n\t"
  76591. "ldm %[m]!, {r6}\n\t"
  76592. #ifdef WOLFSSL_KEIL
  76593. "ands r6, r6, r7\n\t"
  76594. #elif defined(__clang__)
  76595. "ands r6, r7\n\t"
  76596. #else
  76597. "and r6, r7\n\t"
  76598. #endif
  76599. "ldr r5, [%[a], r4]\n\t"
  76600. #ifdef WOLFSSL_KEIL
  76601. "sbcs r5, r5, r6\n\t"
  76602. #elif defined(__clang__)
  76603. "sbcs r5, r6\n\t"
  76604. #else
  76605. "sbc r5, r6\n\t"
  76606. #endif
  76607. "stm %[a]!, {r5}\n\t"
  76608. "ldm %[m]!, {r6}\n\t"
  76609. #ifdef WOLFSSL_KEIL
  76610. "ands r6, r6, r7\n\t"
  76611. #elif defined(__clang__)
  76612. "ands r6, r7\n\t"
  76613. #else
  76614. "and r6, r7\n\t"
  76615. #endif
  76616. "ldr r5, [%[a], r4]\n\t"
  76617. #ifdef WOLFSSL_KEIL
  76618. "sbcs r5, r5, r6\n\t"
  76619. #elif defined(__clang__)
  76620. "sbcs r5, r6\n\t"
  76621. #else
  76622. "sbc r5, r6\n\t"
  76623. #endif
  76624. "stm %[a]!, {r5}\n\t"
  76625. "ldm %[m]!, {r6}\n\t"
  76626. #ifdef WOLFSSL_KEIL
  76627. "ands r6, r6, r7\n\t"
  76628. #elif defined(__clang__)
  76629. "ands r6, r7\n\t"
  76630. #else
  76631. "and r6, r7\n\t"
  76632. #endif
  76633. "ldr r5, [%[a], r4]\n\t"
  76634. #ifdef WOLFSSL_KEIL
  76635. "sbcs r5, r5, r6\n\t"
  76636. #elif defined(__clang__)
  76637. "sbcs r5, r6\n\t"
  76638. #else
  76639. "sbc r5, r6\n\t"
  76640. #endif
  76641. "stm %[a]!, {r5}\n\t"
  76642. "ldm %[m]!, {r6}\n\t"
  76643. #ifdef WOLFSSL_KEIL
  76644. "ands r6, r6, r7\n\t"
  76645. #elif defined(__clang__)
  76646. "ands r6, r7\n\t"
  76647. #else
  76648. "and r6, r7\n\t"
  76649. #endif
  76650. "ldr r5, [%[a], r4]\n\t"
  76651. #ifdef WOLFSSL_KEIL
  76652. "sbcs r5, r5, r6\n\t"
  76653. #elif defined(__clang__)
  76654. "sbcs r5, r6\n\t"
  76655. #else
  76656. "sbc r5, r6\n\t"
  76657. #endif
  76658. "stm %[a]!, {r5}\n\t"
  76659. "ldm %[m]!, {r6}\n\t"
  76660. #ifdef WOLFSSL_KEIL
  76661. "ands r6, r6, r7\n\t"
  76662. #elif defined(__clang__)
  76663. "ands r6, r7\n\t"
  76664. #else
  76665. "and r6, r7\n\t"
  76666. #endif
  76667. "ldr r5, [%[a], r4]\n\t"
  76668. #ifdef WOLFSSL_KEIL
  76669. "sbcs r5, r5, r6\n\t"
  76670. #elif defined(__clang__)
  76671. "sbcs r5, r6\n\t"
  76672. #else
  76673. "sbc r5, r6\n\t"
  76674. #endif
  76675. "stm %[a]!, {r5}\n\t"
  76676. "ldm %[m]!, {r6}\n\t"
  76677. #ifdef WOLFSSL_KEIL
  76678. "ands r6, r6, r7\n\t"
  76679. #elif defined(__clang__)
  76680. "ands r6, r7\n\t"
  76681. #else
  76682. "and r6, r7\n\t"
  76683. #endif
  76684. "ldr r5, [%[a], r4]\n\t"
  76685. #ifdef WOLFSSL_KEIL
  76686. "sbcs r5, r5, r6\n\t"
  76687. #elif defined(__clang__)
  76688. "sbcs r5, r6\n\t"
  76689. #else
  76690. "sbc r5, r6\n\t"
  76691. #endif
  76692. "stm %[a]!, {r5}\n\t"
  76693. "ldm %[m]!, {r6}\n\t"
  76694. #ifdef WOLFSSL_KEIL
  76695. "ands r6, r6, r7\n\t"
  76696. #elif defined(__clang__)
  76697. "ands r6, r7\n\t"
  76698. #else
  76699. "and r6, r7\n\t"
  76700. #endif
  76701. "ldr r5, [%[a], r4]\n\t"
  76702. #ifdef WOLFSSL_KEIL
  76703. "sbcs r5, r5, r6\n\t"
  76704. #elif defined(__clang__)
  76705. "sbcs r5, r6\n\t"
  76706. #else
  76707. "sbc r5, r6\n\t"
  76708. #endif
  76709. "stm %[a]!, {r5}\n\t"
  76710. "ldm %[m]!, {r6}\n\t"
  76711. #ifdef WOLFSSL_KEIL
  76712. "ands r6, r6, r7\n\t"
  76713. #elif defined(__clang__)
  76714. "ands r6, r7\n\t"
  76715. #else
  76716. "and r6, r7\n\t"
  76717. #endif
  76718. "ldr r5, [%[a], r4]\n\t"
  76719. #ifdef WOLFSSL_KEIL
  76720. "sbcs r5, r5, r6\n\t"
  76721. #elif defined(__clang__)
  76722. "sbcs r5, r6\n\t"
  76723. #else
  76724. "sbc r5, r6\n\t"
  76725. #endif
  76726. "stm %[a]!, {r5}\n\t"
  76727. "ldm %[m]!, {r6}\n\t"
  76728. #ifdef WOLFSSL_KEIL
  76729. "ands r6, r6, r7\n\t"
  76730. #elif defined(__clang__)
  76731. "ands r6, r7\n\t"
  76732. #else
  76733. "and r6, r7\n\t"
  76734. #endif
  76735. "ldr r5, [%[a], r4]\n\t"
  76736. #ifdef WOLFSSL_KEIL
  76737. "sbcs r5, r5, r6\n\t"
  76738. #elif defined(__clang__)
  76739. "sbcs r5, r6\n\t"
  76740. #else
  76741. "sbc r5, r6\n\t"
  76742. #endif
  76743. "stm %[a]!, {r5}\n\t"
  76744. "ldm %[m]!, {r6}\n\t"
  76745. #ifdef WOLFSSL_KEIL
  76746. "ands r6, r6, r7\n\t"
  76747. #elif defined(__clang__)
  76748. "ands r6, r7\n\t"
  76749. #else
  76750. "and r6, r7\n\t"
  76751. #endif
  76752. "ldr r5, [%[a], r4]\n\t"
  76753. #ifdef WOLFSSL_KEIL
  76754. "sbcs r5, r5, r6\n\t"
  76755. #elif defined(__clang__)
  76756. "sbcs r5, r6\n\t"
  76757. #else
  76758. "sbc r5, r6\n\t"
  76759. #endif
  76760. "stm %[a]!, {r5}\n\t"
  76761. "ldm %[m]!, {r6}\n\t"
  76762. #ifdef WOLFSSL_KEIL
  76763. "ands r6, r6, r7\n\t"
  76764. #elif defined(__clang__)
  76765. "ands r6, r7\n\t"
  76766. #else
  76767. "and r6, r7\n\t"
  76768. #endif
  76769. "ldr r5, [%[a], r4]\n\t"
  76770. #ifdef WOLFSSL_KEIL
  76771. "sbcs r5, r5, r6\n\t"
  76772. #elif defined(__clang__)
  76773. "sbcs r5, r6\n\t"
  76774. #else
  76775. "sbc r5, r6\n\t"
  76776. #endif
  76777. "stm %[a]!, {r5}\n\t"
  76778. "ldm %[m]!, {r6}\n\t"
  76779. #ifdef WOLFSSL_KEIL
  76780. "ands r6, r6, r7\n\t"
  76781. #elif defined(__clang__)
  76782. "ands r6, r7\n\t"
  76783. #else
  76784. "and r6, r7\n\t"
  76785. #endif
  76786. "ldr r5, [%[a], r4]\n\t"
  76787. #ifdef WOLFSSL_KEIL
  76788. "sbcs r5, r5, r6\n\t"
  76789. #elif defined(__clang__)
  76790. "sbcs r5, r6\n\t"
  76791. #else
  76792. "sbc r5, r6\n\t"
  76793. #endif
  76794. "stm %[a]!, {r5}\n\t"
  76795. "ldm %[m]!, {r6}\n\t"
  76796. #ifdef WOLFSSL_KEIL
  76797. "ands r6, r6, r7\n\t"
  76798. #elif defined(__clang__)
  76799. "ands r6, r7\n\t"
  76800. #else
  76801. "and r6, r7\n\t"
  76802. #endif
  76803. "ldr r5, [%[a], r4]\n\t"
  76804. #ifdef WOLFSSL_KEIL
  76805. "sbcs r5, r5, r6\n\t"
  76806. #elif defined(__clang__)
  76807. "sbcs r5, r6\n\t"
  76808. #else
  76809. "sbc r5, r6\n\t"
  76810. #endif
  76811. "stm %[a]!, {r5}\n\t"
  76812. "ldm %[m]!, {r6}\n\t"
  76813. #ifdef WOLFSSL_KEIL
  76814. "ands r6, r6, r7\n\t"
  76815. #elif defined(__clang__)
  76816. "ands r6, r7\n\t"
  76817. #else
  76818. "and r6, r7\n\t"
  76819. #endif
  76820. "ldr r5, [%[a], r4]\n\t"
  76821. #ifdef WOLFSSL_KEIL
  76822. "sbcs r5, r5, r6\n\t"
  76823. #elif defined(__clang__)
  76824. "sbcs r5, r6\n\t"
  76825. #else
  76826. "sbc r5, r6\n\t"
  76827. #endif
  76828. "stm %[a]!, {r5}\n\t"
  76829. "ldm %[m]!, {r6}\n\t"
  76830. #ifdef WOLFSSL_KEIL
  76831. "ands r6, r6, r7\n\t"
  76832. #elif defined(__clang__)
  76833. "ands r6, r7\n\t"
  76834. #else
  76835. "and r6, r7\n\t"
  76836. #endif
  76837. "ldr r5, [%[a], r4]\n\t"
  76838. #ifdef WOLFSSL_KEIL
  76839. "sbcs r5, r5, r6\n\t"
  76840. #elif defined(__clang__)
  76841. "sbcs r5, r6\n\t"
  76842. #else
  76843. "sbc r5, r6\n\t"
  76844. #endif
  76845. "stm %[a]!, {r5}\n\t"
  76846. "ldm %[m]!, {r6}\n\t"
  76847. #ifdef WOLFSSL_KEIL
  76848. "ands r6, r6, r7\n\t"
  76849. #elif defined(__clang__)
  76850. "ands r6, r7\n\t"
  76851. #else
  76852. "and r6, r7\n\t"
  76853. #endif
  76854. "ldr r5, [%[a], r4]\n\t"
  76855. #ifdef WOLFSSL_KEIL
  76856. "sbcs r5, r5, r6\n\t"
  76857. #elif defined(__clang__)
  76858. "sbcs r5, r6\n\t"
  76859. #else
  76860. "sbc r5, r6\n\t"
  76861. #endif
  76862. "stm %[a]!, {r5}\n\t"
  76863. "ldm %[m]!, {r6}\n\t"
  76864. #ifdef WOLFSSL_KEIL
  76865. "ands r6, r6, r7\n\t"
  76866. #elif defined(__clang__)
  76867. "ands r6, r7\n\t"
  76868. #else
  76869. "and r6, r7\n\t"
  76870. #endif
  76871. "ldr r5, [%[a], r4]\n\t"
  76872. #ifdef WOLFSSL_KEIL
  76873. "sbcs r5, r5, r6\n\t"
  76874. #elif defined(__clang__)
  76875. "sbcs r5, r6\n\t"
  76876. #else
  76877. "sbc r5, r6\n\t"
  76878. #endif
  76879. "stm %[a]!, {r5}\n\t"
  76880. "ldm %[m]!, {r6}\n\t"
  76881. #ifdef WOLFSSL_KEIL
  76882. "ands r6, r6, r7\n\t"
  76883. #elif defined(__clang__)
  76884. "ands r6, r7\n\t"
  76885. #else
  76886. "and r6, r7\n\t"
  76887. #endif
  76888. "ldr r5, [%[a], r4]\n\t"
  76889. #ifdef WOLFSSL_KEIL
  76890. "sbcs r5, r5, r6\n\t"
  76891. #elif defined(__clang__)
  76892. "sbcs r5, r6\n\t"
  76893. #else
  76894. "sbc r5, r6\n\t"
  76895. #endif
  76896. "stm %[a]!, {r5}\n\t"
  76897. "ldm %[m]!, {r6}\n\t"
  76898. #ifdef WOLFSSL_KEIL
  76899. "ands r6, r6, r7\n\t"
  76900. #elif defined(__clang__)
  76901. "ands r6, r7\n\t"
  76902. #else
  76903. "and r6, r7\n\t"
  76904. #endif
  76905. "ldr r5, [%[a], r4]\n\t"
  76906. #ifdef WOLFSSL_KEIL
  76907. "sbcs r5, r5, r6\n\t"
  76908. #elif defined(__clang__)
  76909. "sbcs r5, r6\n\t"
  76910. #else
  76911. "sbc r5, r6\n\t"
  76912. #endif
  76913. "stm %[a]!, {r5}\n\t"
  76914. "ldm %[m]!, {r6}\n\t"
  76915. #ifdef WOLFSSL_KEIL
  76916. "ands r6, r6, r7\n\t"
  76917. #elif defined(__clang__)
  76918. "ands r6, r7\n\t"
  76919. #else
  76920. "and r6, r7\n\t"
  76921. #endif
  76922. "ldr r5, [%[a], r4]\n\t"
  76923. #ifdef WOLFSSL_KEIL
  76924. "sbcs r5, r5, r6\n\t"
  76925. #elif defined(__clang__)
  76926. "sbcs r5, r6\n\t"
  76927. #else
  76928. "sbc r5, r6\n\t"
  76929. #endif
  76930. "stm %[a]!, {r5}\n\t"
  76931. "ldm %[m]!, {r6}\n\t"
  76932. #ifdef WOLFSSL_KEIL
  76933. "ands r6, r6, r7\n\t"
  76934. #elif defined(__clang__)
  76935. "ands r6, r7\n\t"
  76936. #else
  76937. "and r6, r7\n\t"
  76938. #endif
  76939. "ldr r5, [%[a], r4]\n\t"
  76940. #ifdef WOLFSSL_KEIL
  76941. "sbcs r5, r5, r6\n\t"
  76942. #elif defined(__clang__)
  76943. "sbcs r5, r6\n\t"
  76944. #else
  76945. "sbc r5, r6\n\t"
  76946. #endif
  76947. "stm %[a]!, {r5}\n\t"
  76948. "ldm %[m]!, {r6}\n\t"
  76949. #ifdef WOLFSSL_KEIL
  76950. "ands r6, r6, r7\n\t"
  76951. #elif defined(__clang__)
  76952. "ands r6, r7\n\t"
  76953. #else
  76954. "and r6, r7\n\t"
  76955. #endif
  76956. "ldr r5, [%[a], r4]\n\t"
  76957. #ifdef WOLFSSL_KEIL
  76958. "sbcs r5, r5, r6\n\t"
  76959. #elif defined(__clang__)
  76960. "sbcs r5, r6\n\t"
  76961. #else
  76962. "sbc r5, r6\n\t"
  76963. #endif
  76964. "stm %[a]!, {r5}\n\t"
  76965. "ldm %[m]!, {r6}\n\t"
  76966. #ifdef WOLFSSL_KEIL
  76967. "ands r6, r6, r7\n\t"
  76968. #elif defined(__clang__)
  76969. "ands r6, r7\n\t"
  76970. #else
  76971. "and r6, r7\n\t"
  76972. #endif
  76973. "ldr r5, [%[a], r4]\n\t"
  76974. #ifdef WOLFSSL_KEIL
  76975. "sbcs r5, r5, r6\n\t"
  76976. #elif defined(__clang__)
  76977. "sbcs r5, r6\n\t"
  76978. #else
  76979. "sbc r5, r6\n\t"
  76980. #endif
  76981. "stm %[a]!, {r5}\n\t"
  76982. "ldm %[m]!, {r6}\n\t"
  76983. #ifdef WOLFSSL_KEIL
  76984. "ands r6, r6, r7\n\t"
  76985. #elif defined(__clang__)
  76986. "ands r6, r7\n\t"
  76987. #else
  76988. "and r6, r7\n\t"
  76989. #endif
  76990. "ldr r5, [%[a], r4]\n\t"
  76991. #ifdef WOLFSSL_KEIL
  76992. "sbcs r5, r5, r6\n\t"
  76993. #elif defined(__clang__)
  76994. "sbcs r5, r6\n\t"
  76995. #else
  76996. "sbc r5, r6\n\t"
  76997. #endif
  76998. "stm %[a]!, {r5}\n\t"
  76999. "ldm %[m]!, {r6}\n\t"
  77000. #ifdef WOLFSSL_KEIL
  77001. "ands r6, r6, r7\n\t"
  77002. #elif defined(__clang__)
  77003. "ands r6, r7\n\t"
  77004. #else
  77005. "and r6, r7\n\t"
  77006. #endif
  77007. "ldr r5, [%[a], r4]\n\t"
  77008. #ifdef WOLFSSL_KEIL
  77009. "sbcs r5, r5, r6\n\t"
  77010. #elif defined(__clang__)
  77011. "sbcs r5, r6\n\t"
  77012. #else
  77013. "sbc r5, r6\n\t"
  77014. #endif
  77015. "stm %[a]!, {r5}\n\t"
  77016. "ldm %[m]!, {r6}\n\t"
  77017. #ifdef WOLFSSL_KEIL
  77018. "ands r6, r6, r7\n\t"
  77019. #elif defined(__clang__)
  77020. "ands r6, r7\n\t"
  77021. #else
  77022. "and r6, r7\n\t"
  77023. #endif
  77024. "ldr r5, [%[a], r4]\n\t"
  77025. #ifdef WOLFSSL_KEIL
  77026. "sbcs r5, r5, r6\n\t"
  77027. #elif defined(__clang__)
  77028. "sbcs r5, r6\n\t"
  77029. #else
  77030. "sbc r5, r6\n\t"
  77031. #endif
  77032. "stm %[a]!, {r5}\n\t"
  77033. "ldm %[m]!, {r6}\n\t"
  77034. #ifdef WOLFSSL_KEIL
  77035. "ands r6, r6, r7\n\t"
  77036. #elif defined(__clang__)
  77037. "ands r6, r7\n\t"
  77038. #else
  77039. "and r6, r7\n\t"
  77040. #endif
  77041. "ldr r5, [%[a], r4]\n\t"
  77042. #ifdef WOLFSSL_KEIL
  77043. "sbcs r5, r5, r6\n\t"
  77044. #elif defined(__clang__)
  77045. "sbcs r5, r6\n\t"
  77046. #else
  77047. "sbc r5, r6\n\t"
  77048. #endif
  77049. "stm %[a]!, {r5}\n\t"
  77050. "ldm %[m]!, {r6}\n\t"
  77051. #ifdef WOLFSSL_KEIL
  77052. "ands r6, r6, r7\n\t"
  77053. #elif defined(__clang__)
  77054. "ands r6, r7\n\t"
  77055. #else
  77056. "and r6, r7\n\t"
  77057. #endif
  77058. "ldr r5, [%[a], r4]\n\t"
  77059. #ifdef WOLFSSL_KEIL
  77060. "sbcs r5, r5, r6\n\t"
  77061. #elif defined(__clang__)
  77062. "sbcs r5, r6\n\t"
  77063. #else
  77064. "sbc r5, r6\n\t"
  77065. #endif
  77066. "stm %[a]!, {r5}\n\t"
  77067. "ldm %[m]!, {r6}\n\t"
  77068. #ifdef WOLFSSL_KEIL
  77069. "ands r6, r6, r7\n\t"
  77070. #elif defined(__clang__)
  77071. "ands r6, r7\n\t"
  77072. #else
  77073. "and r6, r7\n\t"
  77074. #endif
  77075. "ldr r5, [%[a], r4]\n\t"
  77076. #ifdef WOLFSSL_KEIL
  77077. "sbcs r5, r5, r6\n\t"
  77078. #elif defined(__clang__)
  77079. "sbcs r5, r6\n\t"
  77080. #else
  77081. "sbc r5, r6\n\t"
  77082. #endif
  77083. "stm %[a]!, {r5}\n\t"
  77084. "ldm %[m]!, {r6}\n\t"
  77085. #ifdef WOLFSSL_KEIL
  77086. "ands r6, r6, r7\n\t"
  77087. #elif defined(__clang__)
  77088. "ands r6, r7\n\t"
  77089. #else
  77090. "and r6, r7\n\t"
  77091. #endif
  77092. "ldr r5, [%[a], r4]\n\t"
  77093. #ifdef WOLFSSL_KEIL
  77094. "sbcs r5, r5, r6\n\t"
  77095. #elif defined(__clang__)
  77096. "sbcs r5, r6\n\t"
  77097. #else
  77098. "sbc r5, r6\n\t"
  77099. #endif
  77100. "stm %[a]!, {r5}\n\t"
  77101. "ldm %[m]!, {r6}\n\t"
  77102. #ifdef WOLFSSL_KEIL
  77103. "ands r6, r6, r7\n\t"
  77104. #elif defined(__clang__)
  77105. "ands r6, r7\n\t"
  77106. #else
  77107. "and r6, r7\n\t"
  77108. #endif
  77109. "ldr r5, [%[a], r4]\n\t"
  77110. #ifdef WOLFSSL_KEIL
  77111. "sbcs r5, r5, r6\n\t"
  77112. #elif defined(__clang__)
  77113. "sbcs r5, r6\n\t"
  77114. #else
  77115. "sbc r5, r6\n\t"
  77116. #endif
  77117. "stm %[a]!, {r5}\n\t"
  77118. "ldm %[m]!, {r6}\n\t"
  77119. #ifdef WOLFSSL_KEIL
  77120. "ands r6, r6, r7\n\t"
  77121. #elif defined(__clang__)
  77122. "ands r6, r7\n\t"
  77123. #else
  77124. "and r6, r7\n\t"
  77125. #endif
  77126. "ldr r5, [%[a], r4]\n\t"
  77127. #ifdef WOLFSSL_KEIL
  77128. "sbcs r5, r5, r6\n\t"
  77129. #elif defined(__clang__)
  77130. "sbcs r5, r6\n\t"
  77131. #else
  77132. "sbc r5, r6\n\t"
  77133. #endif
  77134. "stm %[a]!, {r5}\n\t"
  77135. "ldm %[m]!, {r6}\n\t"
  77136. #ifdef WOLFSSL_KEIL
  77137. "ands r6, r6, r7\n\t"
  77138. #elif defined(__clang__)
  77139. "ands r6, r7\n\t"
  77140. #else
  77141. "and r6, r7\n\t"
  77142. #endif
  77143. "ldr r5, [%[a], r4]\n\t"
  77144. #ifdef WOLFSSL_KEIL
  77145. "sbcs r5, r5, r6\n\t"
  77146. #elif defined(__clang__)
  77147. "sbcs r5, r6\n\t"
  77148. #else
  77149. "sbc r5, r6\n\t"
  77150. #endif
  77151. "stm %[a]!, {r5}\n\t"
  77152. "ldm %[m]!, {r6}\n\t"
  77153. #ifdef WOLFSSL_KEIL
  77154. "ands r6, r6, r7\n\t"
  77155. #elif defined(__clang__)
  77156. "ands r6, r7\n\t"
  77157. #else
  77158. "and r6, r7\n\t"
  77159. #endif
  77160. "ldr r5, [%[a], r4]\n\t"
  77161. #ifdef WOLFSSL_KEIL
  77162. "sbcs r5, r5, r6\n\t"
  77163. #elif defined(__clang__)
  77164. "sbcs r5, r6\n\t"
  77165. #else
  77166. "sbc r5, r6\n\t"
  77167. #endif
  77168. "stm %[a]!, {r5}\n\t"
  77169. "ldm %[m]!, {r6}\n\t"
  77170. #ifdef WOLFSSL_KEIL
  77171. "ands r6, r6, r7\n\t"
  77172. #elif defined(__clang__)
  77173. "ands r6, r7\n\t"
  77174. #else
  77175. "and r6, r7\n\t"
  77176. #endif
  77177. "ldr r5, [%[a], r4]\n\t"
  77178. #ifdef WOLFSSL_KEIL
  77179. "sbcs r5, r5, r6\n\t"
  77180. #elif defined(__clang__)
  77181. "sbcs r5, r6\n\t"
  77182. #else
  77183. "sbc r5, r6\n\t"
  77184. #endif
  77185. "stm %[a]!, {r5}\n\t"
  77186. "ldm %[m]!, {r6}\n\t"
  77187. #ifdef WOLFSSL_KEIL
  77188. "ands r6, r6, r7\n\t"
  77189. #elif defined(__clang__)
  77190. "ands r6, r7\n\t"
  77191. #else
  77192. "and r6, r7\n\t"
  77193. #endif
  77194. "ldr r5, [%[a], r4]\n\t"
  77195. #ifdef WOLFSSL_KEIL
  77196. "sbcs r5, r5, r6\n\t"
  77197. #elif defined(__clang__)
  77198. "sbcs r5, r6\n\t"
  77199. #else
  77200. "sbc r5, r6\n\t"
  77201. #endif
  77202. "stm %[a]!, {r5}\n\t"
  77203. "ldm %[m]!, {r6}\n\t"
  77204. #ifdef WOLFSSL_KEIL
  77205. "ands r6, r6, r7\n\t"
  77206. #elif defined(__clang__)
  77207. "ands r6, r7\n\t"
  77208. #else
  77209. "and r6, r7\n\t"
  77210. #endif
  77211. "ldr r5, [%[a], r4]\n\t"
  77212. #ifdef WOLFSSL_KEIL
  77213. "sbcs r5, r5, r6\n\t"
  77214. #elif defined(__clang__)
  77215. "sbcs r5, r6\n\t"
  77216. #else
  77217. "sbc r5, r6\n\t"
  77218. #endif
  77219. "stm %[a]!, {r5}\n\t"
  77220. "ldm %[m]!, {r6}\n\t"
  77221. #ifdef WOLFSSL_KEIL
  77222. "ands r6, r6, r7\n\t"
  77223. #elif defined(__clang__)
  77224. "ands r6, r7\n\t"
  77225. #else
  77226. "and r6, r7\n\t"
  77227. #endif
  77228. "ldr r5, [%[a], r4]\n\t"
  77229. #ifdef WOLFSSL_KEIL
  77230. "sbcs r5, r5, r6\n\t"
  77231. #elif defined(__clang__)
  77232. "sbcs r5, r6\n\t"
  77233. #else
  77234. "sbc r5, r6\n\t"
  77235. #endif
  77236. "stm %[a]!, {r5}\n\t"
  77237. "ldm %[m]!, {r6}\n\t"
  77238. #ifdef WOLFSSL_KEIL
  77239. "ands r6, r6, r7\n\t"
  77240. #elif defined(__clang__)
  77241. "ands r6, r7\n\t"
  77242. #else
  77243. "and r6, r7\n\t"
  77244. #endif
  77245. "ldr r5, [%[a], r4]\n\t"
  77246. #ifdef WOLFSSL_KEIL
  77247. "sbcs r5, r5, r6\n\t"
  77248. #elif defined(__clang__)
  77249. "sbcs r5, r6\n\t"
  77250. #else
  77251. "sbc r5, r6\n\t"
  77252. #endif
  77253. "stm %[a]!, {r5}\n\t"
  77254. "ldm %[m]!, {r6}\n\t"
  77255. #ifdef WOLFSSL_KEIL
  77256. "ands r6, r6, r7\n\t"
  77257. #elif defined(__clang__)
  77258. "ands r6, r7\n\t"
  77259. #else
  77260. "and r6, r7\n\t"
  77261. #endif
  77262. "ldr r5, [%[a], r4]\n\t"
  77263. #ifdef WOLFSSL_KEIL
  77264. "sbcs r5, r5, r6\n\t"
  77265. #elif defined(__clang__)
  77266. "sbcs r5, r6\n\t"
  77267. #else
  77268. "sbc r5, r6\n\t"
  77269. #endif
  77270. "stm %[a]!, {r5}\n\t"
  77271. "ldm %[m]!, {r6}\n\t"
  77272. #ifdef WOLFSSL_KEIL
  77273. "ands r6, r6, r7\n\t"
  77274. #elif defined(__clang__)
  77275. "ands r6, r7\n\t"
  77276. #else
  77277. "and r6, r7\n\t"
  77278. #endif
  77279. "ldr r5, [%[a], r4]\n\t"
  77280. #ifdef WOLFSSL_KEIL
  77281. "sbcs r5, r5, r6\n\t"
  77282. #elif defined(__clang__)
  77283. "sbcs r5, r6\n\t"
  77284. #else
  77285. "sbc r5, r6\n\t"
  77286. #endif
  77287. "stm %[a]!, {r5}\n\t"
  77288. "ldm %[m]!, {r6}\n\t"
  77289. #ifdef WOLFSSL_KEIL
  77290. "ands r6, r6, r7\n\t"
  77291. #elif defined(__clang__)
  77292. "ands r6, r7\n\t"
  77293. #else
  77294. "and r6, r7\n\t"
  77295. #endif
  77296. "ldr r5, [%[a], r4]\n\t"
  77297. #ifdef WOLFSSL_KEIL
  77298. "sbcs r5, r5, r6\n\t"
  77299. #elif defined(__clang__)
  77300. "sbcs r5, r6\n\t"
  77301. #else
  77302. "sbc r5, r6\n\t"
  77303. #endif
  77304. "stm %[a]!, {r5}\n\t"
  77305. "ldm %[m]!, {r6}\n\t"
  77306. #ifdef WOLFSSL_KEIL
  77307. "ands r6, r6, r7\n\t"
  77308. #elif defined(__clang__)
  77309. "ands r6, r7\n\t"
  77310. #else
  77311. "and r6, r7\n\t"
  77312. #endif
  77313. "ldr r5, [%[a], r4]\n\t"
  77314. #ifdef WOLFSSL_KEIL
  77315. "sbcs r5, r5, r6\n\t"
  77316. #elif defined(__clang__)
  77317. "sbcs r5, r6\n\t"
  77318. #else
  77319. "sbc r5, r6\n\t"
  77320. #endif
  77321. "stm %[a]!, {r5}\n\t"
  77322. "ldm %[m]!, {r6}\n\t"
  77323. #ifdef WOLFSSL_KEIL
  77324. "ands r6, r6, r7\n\t"
  77325. #elif defined(__clang__)
  77326. "ands r6, r7\n\t"
  77327. #else
  77328. "and r6, r7\n\t"
  77329. #endif
  77330. "ldr r5, [%[a], r4]\n\t"
  77331. #ifdef WOLFSSL_KEIL
  77332. "sbcs r5, r5, r6\n\t"
  77333. #elif defined(__clang__)
  77334. "sbcs r5, r6\n\t"
  77335. #else
  77336. "sbc r5, r6\n\t"
  77337. #endif
  77338. "stm %[a]!, {r5}\n\t"
  77339. "ldm %[m]!, {r6}\n\t"
  77340. #ifdef WOLFSSL_KEIL
  77341. "ands r6, r6, r7\n\t"
  77342. #elif defined(__clang__)
  77343. "ands r6, r7\n\t"
  77344. #else
  77345. "and r6, r7\n\t"
  77346. #endif
  77347. "ldr r5, [%[a], r4]\n\t"
  77348. #ifdef WOLFSSL_KEIL
  77349. "sbcs r5, r5, r6\n\t"
  77350. #elif defined(__clang__)
  77351. "sbcs r5, r6\n\t"
  77352. #else
  77353. "sbc r5, r6\n\t"
  77354. #endif
  77355. "stm %[a]!, {r5}\n\t"
  77356. "ldm %[m]!, {r6}\n\t"
  77357. #ifdef WOLFSSL_KEIL
  77358. "ands r6, r6, r7\n\t"
  77359. #elif defined(__clang__)
  77360. "ands r6, r7\n\t"
  77361. #else
  77362. "and r6, r7\n\t"
  77363. #endif
  77364. "ldr r5, [%[a], r4]\n\t"
  77365. #ifdef WOLFSSL_KEIL
  77366. "sbcs r5, r5, r6\n\t"
  77367. #elif defined(__clang__)
  77368. "sbcs r5, r6\n\t"
  77369. #else
  77370. "sbc r5, r6\n\t"
  77371. #endif
  77372. "stm %[a]!, {r5}\n\t"
  77373. "ldm %[m]!, {r6}\n\t"
  77374. #ifdef WOLFSSL_KEIL
  77375. "ands r6, r6, r7\n\t"
  77376. #elif defined(__clang__)
  77377. "ands r6, r7\n\t"
  77378. #else
  77379. "and r6, r7\n\t"
  77380. #endif
  77381. "ldr r5, [%[a], r4]\n\t"
  77382. #ifdef WOLFSSL_KEIL
  77383. "sbcs r5, r5, r6\n\t"
  77384. #elif defined(__clang__)
  77385. "sbcs r5, r6\n\t"
  77386. #else
  77387. "sbc r5, r6\n\t"
  77388. #endif
  77389. "stm %[a]!, {r5}\n\t"
  77390. "ldm %[m]!, {r6}\n\t"
  77391. #ifdef WOLFSSL_KEIL
  77392. "ands r6, r6, r7\n\t"
  77393. #elif defined(__clang__)
  77394. "ands r6, r7\n\t"
  77395. #else
  77396. "and r6, r7\n\t"
  77397. #endif
  77398. "ldr r5, [%[a], r4]\n\t"
  77399. #ifdef WOLFSSL_KEIL
  77400. "sbcs r5, r5, r6\n\t"
  77401. #elif defined(__clang__)
  77402. "sbcs r5, r6\n\t"
  77403. #else
  77404. "sbc r5, r6\n\t"
  77405. #endif
  77406. "stm %[a]!, {r5}\n\t"
  77407. "ldm %[m]!, {r6}\n\t"
  77408. #ifdef WOLFSSL_KEIL
  77409. "ands r6, r6, r7\n\t"
  77410. #elif defined(__clang__)
  77411. "ands r6, r7\n\t"
  77412. #else
  77413. "and r6, r7\n\t"
  77414. #endif
  77415. "ldr r5, [%[a], r4]\n\t"
  77416. #ifdef WOLFSSL_KEIL
  77417. "sbcs r5, r5, r6\n\t"
  77418. #elif defined(__clang__)
  77419. "sbcs r5, r6\n\t"
  77420. #else
  77421. "sbc r5, r6\n\t"
  77422. #endif
  77423. "stm %[a]!, {r5}\n\t"
  77424. "ldm %[m]!, {r6}\n\t"
  77425. #ifdef WOLFSSL_KEIL
  77426. "ands r6, r6, r7\n\t"
  77427. #elif defined(__clang__)
  77428. "ands r6, r7\n\t"
  77429. #else
  77430. "and r6, r7\n\t"
  77431. #endif
  77432. "ldr r5, [%[a], r4]\n\t"
  77433. #ifdef WOLFSSL_KEIL
  77434. "sbcs r5, r5, r6\n\t"
  77435. #elif defined(__clang__)
  77436. "sbcs r5, r6\n\t"
  77437. #else
  77438. "sbc r5, r6\n\t"
  77439. #endif
  77440. "stm %[a]!, {r5}\n\t"
  77441. "ldm %[m]!, {r6}\n\t"
  77442. #ifdef WOLFSSL_KEIL
  77443. "ands r6, r6, r7\n\t"
  77444. #elif defined(__clang__)
  77445. "ands r6, r7\n\t"
  77446. #else
  77447. "and r6, r7\n\t"
  77448. #endif
  77449. "ldr r5, [%[a], r4]\n\t"
  77450. #ifdef WOLFSSL_KEIL
  77451. "sbcs r5, r5, r6\n\t"
  77452. #elif defined(__clang__)
  77453. "sbcs r5, r6\n\t"
  77454. #else
  77455. "sbc r5, r6\n\t"
  77456. #endif
  77457. "stm %[a]!, {r5}\n\t"
  77458. "ldm %[m]!, {r6}\n\t"
  77459. #ifdef WOLFSSL_KEIL
  77460. "ands r6, r6, r7\n\t"
  77461. #elif defined(__clang__)
  77462. "ands r6, r7\n\t"
  77463. #else
  77464. "and r6, r7\n\t"
  77465. #endif
  77466. "ldr r5, [%[a], r4]\n\t"
  77467. #ifdef WOLFSSL_KEIL
  77468. "sbcs r5, r5, r6\n\t"
  77469. #elif defined(__clang__)
  77470. "sbcs r5, r6\n\t"
  77471. #else
  77472. "sbc r5, r6\n\t"
  77473. #endif
  77474. "stm %[a]!, {r5}\n\t"
  77475. "ldm %[m]!, {r6}\n\t"
  77476. #ifdef WOLFSSL_KEIL
  77477. "ands r6, r6, r7\n\t"
  77478. #elif defined(__clang__)
  77479. "ands r6, r7\n\t"
  77480. #else
  77481. "and r6, r7\n\t"
  77482. #endif
  77483. "ldr r5, [%[a], r4]\n\t"
  77484. #ifdef WOLFSSL_KEIL
  77485. "sbcs r5, r5, r6\n\t"
  77486. #elif defined(__clang__)
  77487. "sbcs r5, r6\n\t"
  77488. #else
  77489. "sbc r5, r6\n\t"
  77490. #endif
  77491. "stm %[a]!, {r5}\n\t"
  77492. "ldm %[m]!, {r6}\n\t"
  77493. #ifdef WOLFSSL_KEIL
  77494. "ands r6, r6, r7\n\t"
  77495. #elif defined(__clang__)
  77496. "ands r6, r7\n\t"
  77497. #else
  77498. "and r6, r7\n\t"
  77499. #endif
  77500. "ldr r5, [%[a], r4]\n\t"
  77501. #ifdef WOLFSSL_KEIL
  77502. "sbcs r5, r5, r6\n\t"
  77503. #elif defined(__clang__)
  77504. "sbcs r5, r6\n\t"
  77505. #else
  77506. "sbc r5, r6\n\t"
  77507. #endif
  77508. "stm %[a]!, {r5}\n\t"
  77509. "ldm %[m]!, {r6}\n\t"
  77510. #ifdef WOLFSSL_KEIL
  77511. "ands r6, r6, r7\n\t"
  77512. #elif defined(__clang__)
  77513. "ands r6, r7\n\t"
  77514. #else
  77515. "and r6, r7\n\t"
  77516. #endif
  77517. "ldr r5, [%[a], r4]\n\t"
  77518. #ifdef WOLFSSL_KEIL
  77519. "sbcs r5, r5, r6\n\t"
  77520. #elif defined(__clang__)
  77521. "sbcs r5, r6\n\t"
  77522. #else
  77523. "sbc r5, r6\n\t"
  77524. #endif
  77525. "stm %[a]!, {r5}\n\t"
  77526. "ldm %[m]!, {r6}\n\t"
  77527. #ifdef WOLFSSL_KEIL
  77528. "ands r6, r6, r7\n\t"
  77529. #elif defined(__clang__)
  77530. "ands r6, r7\n\t"
  77531. #else
  77532. "and r6, r7\n\t"
  77533. #endif
  77534. "ldr r5, [%[a], r4]\n\t"
  77535. #ifdef WOLFSSL_KEIL
  77536. "sbcs r5, r5, r6\n\t"
  77537. #elif defined(__clang__)
  77538. "sbcs r5, r6\n\t"
  77539. #else
  77540. "sbc r5, r6\n\t"
  77541. #endif
  77542. "stm %[a]!, {r5}\n\t"
  77543. "ldm %[m]!, {r6}\n\t"
  77544. #ifdef WOLFSSL_KEIL
  77545. "ands r6, r6, r7\n\t"
  77546. #elif defined(__clang__)
  77547. "ands r6, r7\n\t"
  77548. #else
  77549. "and r6, r7\n\t"
  77550. #endif
  77551. "ldr r5, [%[a], r4]\n\t"
  77552. #ifdef WOLFSSL_KEIL
  77553. "sbcs r5, r5, r6\n\t"
  77554. #elif defined(__clang__)
  77555. "sbcs r5, r6\n\t"
  77556. #else
  77557. "sbc r5, r6\n\t"
  77558. #endif
  77559. "stm %[a]!, {r5}\n\t"
  77560. "ldm %[m]!, {r6}\n\t"
  77561. #ifdef WOLFSSL_KEIL
  77562. "ands r6, r6, r7\n\t"
  77563. #elif defined(__clang__)
  77564. "ands r6, r7\n\t"
  77565. #else
  77566. "and r6, r7\n\t"
  77567. #endif
  77568. "ldr r5, [%[a], r4]\n\t"
  77569. #ifdef WOLFSSL_KEIL
  77570. "sbcs r5, r5, r6\n\t"
  77571. #elif defined(__clang__)
  77572. "sbcs r5, r6\n\t"
  77573. #else
  77574. "sbc r5, r6\n\t"
  77575. #endif
  77576. "stm %[a]!, {r5}\n\t"
  77577. "ldm %[m]!, {r6}\n\t"
  77578. #ifdef WOLFSSL_KEIL
  77579. "ands r6, r6, r7\n\t"
  77580. #elif defined(__clang__)
  77581. "ands r6, r7\n\t"
  77582. #else
  77583. "and r6, r7\n\t"
  77584. #endif
  77585. "ldr r5, [%[a], r4]\n\t"
  77586. #ifdef WOLFSSL_KEIL
  77587. "sbcs r5, r5, r6\n\t"
  77588. #elif defined(__clang__)
  77589. "sbcs r5, r6\n\t"
  77590. #else
  77591. "sbc r5, r6\n\t"
  77592. #endif
  77593. "stm %[a]!, {r5}\n\t"
  77594. #endif /* WOLFSSL_SP_LARGE_CODE */
  77595. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  77596. :
  77597. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  77598. );
  77599. }
  77600. /* Multiply two Montgomery form numbers mod the modulus (prime).
  77601. * (r = a * b mod m)
  77602. *
  77603. * r Result of multiplication.
  77604. * a First number to multiply in Montgomery form.
  77605. * b Second number to multiply in Montgomery form.
  77606. * m Modulus (prime).
  77607. * mp Montgomery mulitplier.
  77608. */
  77609. SP_NOINLINE static void sp_3072_mont_mul_96(sp_digit* r, const sp_digit* a,
  77610. const sp_digit* b, const sp_digit* m, sp_digit mp)
  77611. {
  77612. sp_3072_mul_96(r, a, b);
  77613. sp_3072_mont_reduce_96(r, m, mp);
  77614. }
  77615. /* Square the Montgomery form number. (r = a * a mod m)
  77616. *
  77617. * r Result of squaring.
  77618. * a Number to square in Montgomery form.
  77619. * m Modulus (prime).
  77620. * mp Montgomery mulitplier.
  77621. */
  77622. SP_NOINLINE static void sp_3072_mont_sqr_96(sp_digit* r, const sp_digit* a,
  77623. const sp_digit* m, sp_digit mp)
  77624. {
  77625. sp_3072_sqr_96(r, a);
  77626. sp_3072_mont_reduce_96(r, m, mp);
  77627. }
  77628. #ifdef WOLFSSL_SP_SMALL
  77629. /* Sub b from a into r. (r = a - b)
  77630. *
  77631. * r A single precision integer.
  77632. * a A single precision integer.
  77633. * b A single precision integer.
  77634. */
  77635. SP_NOINLINE static sp_digit sp_3072_sub_96(sp_digit* r, const sp_digit* a,
  77636. const sp_digit* b)
  77637. {
  77638. __asm__ __volatile__ (
  77639. "movs r6, %[a]\n\t"
  77640. "movs r3, #0\n\t"
  77641. "movs r5, #0xff\n\t"
  77642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77643. "adds r5, r5, #0x81\n\t"
  77644. #else
  77645. "add r5, r5, #0x81\n\t"
  77646. #endif
  77647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77648. "adds r6, r6, r5\n\t"
  77649. #else
  77650. "add r6, r6, r5\n\t"
  77651. #endif
  77652. "\n"
  77653. "L_sp_3072_sub_96_word_%=:\n\t"
  77654. "movs r5, #0\n\t"
  77655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77656. "subs r5, r5, r3\n\t"
  77657. #else
  77658. "sub r5, r5, r3\n\t"
  77659. #endif
  77660. "ldr r4, [%[a]]\n\t"
  77661. "ldr r5, [%[b]]\n\t"
  77662. #ifdef WOLFSSL_KEIL
  77663. "sbcs r4, r4, r5\n\t"
  77664. #elif defined(__clang__)
  77665. "sbcs r4, r5\n\t"
  77666. #else
  77667. "sbc r4, r5\n\t"
  77668. #endif
  77669. "str r4, [%[r]]\n\t"
  77670. #ifdef WOLFSSL_KEIL
  77671. "sbcs r3, r3, r3\n\t"
  77672. #elif defined(__clang__)
  77673. "sbcs r3, r3\n\t"
  77674. #else
  77675. "sbc r3, r3\n\t"
  77676. #endif
  77677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77678. "adds %[a], %[a], #4\n\t"
  77679. #else
  77680. "add %[a], %[a], #4\n\t"
  77681. #endif
  77682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77683. "adds %[b], %[b], #4\n\t"
  77684. #else
  77685. "add %[b], %[b], #4\n\t"
  77686. #endif
  77687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77688. "adds %[r], %[r], #4\n\t"
  77689. #else
  77690. "add %[r], %[r], #4\n\t"
  77691. #endif
  77692. "cmp %[a], r6\n\t"
  77693. "bne L_sp_3072_sub_96_word_%=\n\t"
  77694. "movs %[r], r3\n\t"
  77695. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  77696. :
  77697. : "memory", "r3", "r4", "r5", "r6"
  77698. );
  77699. return (uint32_t)(size_t)r;
  77700. }
  77701. #else
  77702. /* Sub b from a into r. (r = a - b)
  77703. *
  77704. * r A single precision integer.
  77705. * a A single precision integer.
  77706. * b A single precision integer.
  77707. */
  77708. SP_NOINLINE static sp_digit sp_3072_sub_96(sp_digit* r, const sp_digit* a,
  77709. const sp_digit* b)
  77710. {
  77711. __asm__ __volatile__ (
  77712. "ldm %[b]!, {r5, r6}\n\t"
  77713. "ldm %[a]!, {r3, r4}\n\t"
  77714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  77715. "subs r3, r3, r5\n\t"
  77716. #else
  77717. "sub r3, r3, r5\n\t"
  77718. #endif
  77719. #ifdef WOLFSSL_KEIL
  77720. "sbcs r4, r4, r6\n\t"
  77721. #elif defined(__clang__)
  77722. "sbcs r4, r6\n\t"
  77723. #else
  77724. "sbc r4, r6\n\t"
  77725. #endif
  77726. "stm %[r]!, {r3, r4}\n\t"
  77727. "ldm %[b]!, {r5, r6}\n\t"
  77728. "ldm %[a]!, {r3, r4}\n\t"
  77729. #ifdef WOLFSSL_KEIL
  77730. "sbcs r3, r3, r5\n\t"
  77731. #elif defined(__clang__)
  77732. "sbcs r3, r5\n\t"
  77733. #else
  77734. "sbc r3, r5\n\t"
  77735. #endif
  77736. #ifdef WOLFSSL_KEIL
  77737. "sbcs r4, r4, r6\n\t"
  77738. #elif defined(__clang__)
  77739. "sbcs r4, r6\n\t"
  77740. #else
  77741. "sbc r4, r6\n\t"
  77742. #endif
  77743. "stm %[r]!, {r3, r4}\n\t"
  77744. "ldm %[b]!, {r5, r6}\n\t"
  77745. "ldm %[a]!, {r3, r4}\n\t"
  77746. #ifdef WOLFSSL_KEIL
  77747. "sbcs r3, r3, r5\n\t"
  77748. #elif defined(__clang__)
  77749. "sbcs r3, r5\n\t"
  77750. #else
  77751. "sbc r3, r5\n\t"
  77752. #endif
  77753. #ifdef WOLFSSL_KEIL
  77754. "sbcs r4, r4, r6\n\t"
  77755. #elif defined(__clang__)
  77756. "sbcs r4, r6\n\t"
  77757. #else
  77758. "sbc r4, r6\n\t"
  77759. #endif
  77760. "stm %[r]!, {r3, r4}\n\t"
  77761. "ldm %[b]!, {r5, r6}\n\t"
  77762. "ldm %[a]!, {r3, r4}\n\t"
  77763. #ifdef WOLFSSL_KEIL
  77764. "sbcs r3, r3, r5\n\t"
  77765. #elif defined(__clang__)
  77766. "sbcs r3, r5\n\t"
  77767. #else
  77768. "sbc r3, r5\n\t"
  77769. #endif
  77770. #ifdef WOLFSSL_KEIL
  77771. "sbcs r4, r4, r6\n\t"
  77772. #elif defined(__clang__)
  77773. "sbcs r4, r6\n\t"
  77774. #else
  77775. "sbc r4, r6\n\t"
  77776. #endif
  77777. "stm %[r]!, {r3, r4}\n\t"
  77778. "ldm %[b]!, {r5, r6}\n\t"
  77779. "ldm %[a]!, {r3, r4}\n\t"
  77780. #ifdef WOLFSSL_KEIL
  77781. "sbcs r3, r3, r5\n\t"
  77782. #elif defined(__clang__)
  77783. "sbcs r3, r5\n\t"
  77784. #else
  77785. "sbc r3, r5\n\t"
  77786. #endif
  77787. #ifdef WOLFSSL_KEIL
  77788. "sbcs r4, r4, r6\n\t"
  77789. #elif defined(__clang__)
  77790. "sbcs r4, r6\n\t"
  77791. #else
  77792. "sbc r4, r6\n\t"
  77793. #endif
  77794. "stm %[r]!, {r3, r4}\n\t"
  77795. "ldm %[b]!, {r5, r6}\n\t"
  77796. "ldm %[a]!, {r3, r4}\n\t"
  77797. #ifdef WOLFSSL_KEIL
  77798. "sbcs r3, r3, r5\n\t"
  77799. #elif defined(__clang__)
  77800. "sbcs r3, r5\n\t"
  77801. #else
  77802. "sbc r3, r5\n\t"
  77803. #endif
  77804. #ifdef WOLFSSL_KEIL
  77805. "sbcs r4, r4, r6\n\t"
  77806. #elif defined(__clang__)
  77807. "sbcs r4, r6\n\t"
  77808. #else
  77809. "sbc r4, r6\n\t"
  77810. #endif
  77811. "stm %[r]!, {r3, r4}\n\t"
  77812. "ldm %[b]!, {r5, r6}\n\t"
  77813. "ldm %[a]!, {r3, r4}\n\t"
  77814. #ifdef WOLFSSL_KEIL
  77815. "sbcs r3, r3, r5\n\t"
  77816. #elif defined(__clang__)
  77817. "sbcs r3, r5\n\t"
  77818. #else
  77819. "sbc r3, r5\n\t"
  77820. #endif
  77821. #ifdef WOLFSSL_KEIL
  77822. "sbcs r4, r4, r6\n\t"
  77823. #elif defined(__clang__)
  77824. "sbcs r4, r6\n\t"
  77825. #else
  77826. "sbc r4, r6\n\t"
  77827. #endif
  77828. "stm %[r]!, {r3, r4}\n\t"
  77829. "ldm %[b]!, {r5, r6}\n\t"
  77830. "ldm %[a]!, {r3, r4}\n\t"
  77831. #ifdef WOLFSSL_KEIL
  77832. "sbcs r3, r3, r5\n\t"
  77833. #elif defined(__clang__)
  77834. "sbcs r3, r5\n\t"
  77835. #else
  77836. "sbc r3, r5\n\t"
  77837. #endif
  77838. #ifdef WOLFSSL_KEIL
  77839. "sbcs r4, r4, r6\n\t"
  77840. #elif defined(__clang__)
  77841. "sbcs r4, r6\n\t"
  77842. #else
  77843. "sbc r4, r6\n\t"
  77844. #endif
  77845. "stm %[r]!, {r3, r4}\n\t"
  77846. "ldm %[b]!, {r5, r6}\n\t"
  77847. "ldm %[a]!, {r3, r4}\n\t"
  77848. #ifdef WOLFSSL_KEIL
  77849. "sbcs r3, r3, r5\n\t"
  77850. #elif defined(__clang__)
  77851. "sbcs r3, r5\n\t"
  77852. #else
  77853. "sbc r3, r5\n\t"
  77854. #endif
  77855. #ifdef WOLFSSL_KEIL
  77856. "sbcs r4, r4, r6\n\t"
  77857. #elif defined(__clang__)
  77858. "sbcs r4, r6\n\t"
  77859. #else
  77860. "sbc r4, r6\n\t"
  77861. #endif
  77862. "stm %[r]!, {r3, r4}\n\t"
  77863. "ldm %[b]!, {r5, r6}\n\t"
  77864. "ldm %[a]!, {r3, r4}\n\t"
  77865. #ifdef WOLFSSL_KEIL
  77866. "sbcs r3, r3, r5\n\t"
  77867. #elif defined(__clang__)
  77868. "sbcs r3, r5\n\t"
  77869. #else
  77870. "sbc r3, r5\n\t"
  77871. #endif
  77872. #ifdef WOLFSSL_KEIL
  77873. "sbcs r4, r4, r6\n\t"
  77874. #elif defined(__clang__)
  77875. "sbcs r4, r6\n\t"
  77876. #else
  77877. "sbc r4, r6\n\t"
  77878. #endif
  77879. "stm %[r]!, {r3, r4}\n\t"
  77880. "ldm %[b]!, {r5, r6}\n\t"
  77881. "ldm %[a]!, {r3, r4}\n\t"
  77882. #ifdef WOLFSSL_KEIL
  77883. "sbcs r3, r3, r5\n\t"
  77884. #elif defined(__clang__)
  77885. "sbcs r3, r5\n\t"
  77886. #else
  77887. "sbc r3, r5\n\t"
  77888. #endif
  77889. #ifdef WOLFSSL_KEIL
  77890. "sbcs r4, r4, r6\n\t"
  77891. #elif defined(__clang__)
  77892. "sbcs r4, r6\n\t"
  77893. #else
  77894. "sbc r4, r6\n\t"
  77895. #endif
  77896. "stm %[r]!, {r3, r4}\n\t"
  77897. "ldm %[b]!, {r5, r6}\n\t"
  77898. "ldm %[a]!, {r3, r4}\n\t"
  77899. #ifdef WOLFSSL_KEIL
  77900. "sbcs r3, r3, r5\n\t"
  77901. #elif defined(__clang__)
  77902. "sbcs r3, r5\n\t"
  77903. #else
  77904. "sbc r3, r5\n\t"
  77905. #endif
  77906. #ifdef WOLFSSL_KEIL
  77907. "sbcs r4, r4, r6\n\t"
  77908. #elif defined(__clang__)
  77909. "sbcs r4, r6\n\t"
  77910. #else
  77911. "sbc r4, r6\n\t"
  77912. #endif
  77913. "stm %[r]!, {r3, r4}\n\t"
  77914. "ldm %[b]!, {r5, r6}\n\t"
  77915. "ldm %[a]!, {r3, r4}\n\t"
  77916. #ifdef WOLFSSL_KEIL
  77917. "sbcs r3, r3, r5\n\t"
  77918. #elif defined(__clang__)
  77919. "sbcs r3, r5\n\t"
  77920. #else
  77921. "sbc r3, r5\n\t"
  77922. #endif
  77923. #ifdef WOLFSSL_KEIL
  77924. "sbcs r4, r4, r6\n\t"
  77925. #elif defined(__clang__)
  77926. "sbcs r4, r6\n\t"
  77927. #else
  77928. "sbc r4, r6\n\t"
  77929. #endif
  77930. "stm %[r]!, {r3, r4}\n\t"
  77931. "ldm %[b]!, {r5, r6}\n\t"
  77932. "ldm %[a]!, {r3, r4}\n\t"
  77933. #ifdef WOLFSSL_KEIL
  77934. "sbcs r3, r3, r5\n\t"
  77935. #elif defined(__clang__)
  77936. "sbcs r3, r5\n\t"
  77937. #else
  77938. "sbc r3, r5\n\t"
  77939. #endif
  77940. #ifdef WOLFSSL_KEIL
  77941. "sbcs r4, r4, r6\n\t"
  77942. #elif defined(__clang__)
  77943. "sbcs r4, r6\n\t"
  77944. #else
  77945. "sbc r4, r6\n\t"
  77946. #endif
  77947. "stm %[r]!, {r3, r4}\n\t"
  77948. "ldm %[b]!, {r5, r6}\n\t"
  77949. "ldm %[a]!, {r3, r4}\n\t"
  77950. #ifdef WOLFSSL_KEIL
  77951. "sbcs r3, r3, r5\n\t"
  77952. #elif defined(__clang__)
  77953. "sbcs r3, r5\n\t"
  77954. #else
  77955. "sbc r3, r5\n\t"
  77956. #endif
  77957. #ifdef WOLFSSL_KEIL
  77958. "sbcs r4, r4, r6\n\t"
  77959. #elif defined(__clang__)
  77960. "sbcs r4, r6\n\t"
  77961. #else
  77962. "sbc r4, r6\n\t"
  77963. #endif
  77964. "stm %[r]!, {r3, r4}\n\t"
  77965. "ldm %[b]!, {r5, r6}\n\t"
  77966. "ldm %[a]!, {r3, r4}\n\t"
  77967. #ifdef WOLFSSL_KEIL
  77968. "sbcs r3, r3, r5\n\t"
  77969. #elif defined(__clang__)
  77970. "sbcs r3, r5\n\t"
  77971. #else
  77972. "sbc r3, r5\n\t"
  77973. #endif
  77974. #ifdef WOLFSSL_KEIL
  77975. "sbcs r4, r4, r6\n\t"
  77976. #elif defined(__clang__)
  77977. "sbcs r4, r6\n\t"
  77978. #else
  77979. "sbc r4, r6\n\t"
  77980. #endif
  77981. "stm %[r]!, {r3, r4}\n\t"
  77982. "ldm %[b]!, {r5, r6}\n\t"
  77983. "ldm %[a]!, {r3, r4}\n\t"
  77984. #ifdef WOLFSSL_KEIL
  77985. "sbcs r3, r3, r5\n\t"
  77986. #elif defined(__clang__)
  77987. "sbcs r3, r5\n\t"
  77988. #else
  77989. "sbc r3, r5\n\t"
  77990. #endif
  77991. #ifdef WOLFSSL_KEIL
  77992. "sbcs r4, r4, r6\n\t"
  77993. #elif defined(__clang__)
  77994. "sbcs r4, r6\n\t"
  77995. #else
  77996. "sbc r4, r6\n\t"
  77997. #endif
  77998. "stm %[r]!, {r3, r4}\n\t"
  77999. "ldm %[b]!, {r5, r6}\n\t"
  78000. "ldm %[a]!, {r3, r4}\n\t"
  78001. #ifdef WOLFSSL_KEIL
  78002. "sbcs r3, r3, r5\n\t"
  78003. #elif defined(__clang__)
  78004. "sbcs r3, r5\n\t"
  78005. #else
  78006. "sbc r3, r5\n\t"
  78007. #endif
  78008. #ifdef WOLFSSL_KEIL
  78009. "sbcs r4, r4, r6\n\t"
  78010. #elif defined(__clang__)
  78011. "sbcs r4, r6\n\t"
  78012. #else
  78013. "sbc r4, r6\n\t"
  78014. #endif
  78015. "stm %[r]!, {r3, r4}\n\t"
  78016. "ldm %[b]!, {r5, r6}\n\t"
  78017. "ldm %[a]!, {r3, r4}\n\t"
  78018. #ifdef WOLFSSL_KEIL
  78019. "sbcs r3, r3, r5\n\t"
  78020. #elif defined(__clang__)
  78021. "sbcs r3, r5\n\t"
  78022. #else
  78023. "sbc r3, r5\n\t"
  78024. #endif
  78025. #ifdef WOLFSSL_KEIL
  78026. "sbcs r4, r4, r6\n\t"
  78027. #elif defined(__clang__)
  78028. "sbcs r4, r6\n\t"
  78029. #else
  78030. "sbc r4, r6\n\t"
  78031. #endif
  78032. "stm %[r]!, {r3, r4}\n\t"
  78033. "ldm %[b]!, {r5, r6}\n\t"
  78034. "ldm %[a]!, {r3, r4}\n\t"
  78035. #ifdef WOLFSSL_KEIL
  78036. "sbcs r3, r3, r5\n\t"
  78037. #elif defined(__clang__)
  78038. "sbcs r3, r5\n\t"
  78039. #else
  78040. "sbc r3, r5\n\t"
  78041. #endif
  78042. #ifdef WOLFSSL_KEIL
  78043. "sbcs r4, r4, r6\n\t"
  78044. #elif defined(__clang__)
  78045. "sbcs r4, r6\n\t"
  78046. #else
  78047. "sbc r4, r6\n\t"
  78048. #endif
  78049. "stm %[r]!, {r3, r4}\n\t"
  78050. "ldm %[b]!, {r5, r6}\n\t"
  78051. "ldm %[a]!, {r3, r4}\n\t"
  78052. #ifdef WOLFSSL_KEIL
  78053. "sbcs r3, r3, r5\n\t"
  78054. #elif defined(__clang__)
  78055. "sbcs r3, r5\n\t"
  78056. #else
  78057. "sbc r3, r5\n\t"
  78058. #endif
  78059. #ifdef WOLFSSL_KEIL
  78060. "sbcs r4, r4, r6\n\t"
  78061. #elif defined(__clang__)
  78062. "sbcs r4, r6\n\t"
  78063. #else
  78064. "sbc r4, r6\n\t"
  78065. #endif
  78066. "stm %[r]!, {r3, r4}\n\t"
  78067. "ldm %[b]!, {r5, r6}\n\t"
  78068. "ldm %[a]!, {r3, r4}\n\t"
  78069. #ifdef WOLFSSL_KEIL
  78070. "sbcs r3, r3, r5\n\t"
  78071. #elif defined(__clang__)
  78072. "sbcs r3, r5\n\t"
  78073. #else
  78074. "sbc r3, r5\n\t"
  78075. #endif
  78076. #ifdef WOLFSSL_KEIL
  78077. "sbcs r4, r4, r6\n\t"
  78078. #elif defined(__clang__)
  78079. "sbcs r4, r6\n\t"
  78080. #else
  78081. "sbc r4, r6\n\t"
  78082. #endif
  78083. "stm %[r]!, {r3, r4}\n\t"
  78084. "ldm %[b]!, {r5, r6}\n\t"
  78085. "ldm %[a]!, {r3, r4}\n\t"
  78086. #ifdef WOLFSSL_KEIL
  78087. "sbcs r3, r3, r5\n\t"
  78088. #elif defined(__clang__)
  78089. "sbcs r3, r5\n\t"
  78090. #else
  78091. "sbc r3, r5\n\t"
  78092. #endif
  78093. #ifdef WOLFSSL_KEIL
  78094. "sbcs r4, r4, r6\n\t"
  78095. #elif defined(__clang__)
  78096. "sbcs r4, r6\n\t"
  78097. #else
  78098. "sbc r4, r6\n\t"
  78099. #endif
  78100. "stm %[r]!, {r3, r4}\n\t"
  78101. "ldm %[b]!, {r5, r6}\n\t"
  78102. "ldm %[a]!, {r3, r4}\n\t"
  78103. #ifdef WOLFSSL_KEIL
  78104. "sbcs r3, r3, r5\n\t"
  78105. #elif defined(__clang__)
  78106. "sbcs r3, r5\n\t"
  78107. #else
  78108. "sbc r3, r5\n\t"
  78109. #endif
  78110. #ifdef WOLFSSL_KEIL
  78111. "sbcs r4, r4, r6\n\t"
  78112. #elif defined(__clang__)
  78113. "sbcs r4, r6\n\t"
  78114. #else
  78115. "sbc r4, r6\n\t"
  78116. #endif
  78117. "stm %[r]!, {r3, r4}\n\t"
  78118. "ldm %[b]!, {r5, r6}\n\t"
  78119. "ldm %[a]!, {r3, r4}\n\t"
  78120. #ifdef WOLFSSL_KEIL
  78121. "sbcs r3, r3, r5\n\t"
  78122. #elif defined(__clang__)
  78123. "sbcs r3, r5\n\t"
  78124. #else
  78125. "sbc r3, r5\n\t"
  78126. #endif
  78127. #ifdef WOLFSSL_KEIL
  78128. "sbcs r4, r4, r6\n\t"
  78129. #elif defined(__clang__)
  78130. "sbcs r4, r6\n\t"
  78131. #else
  78132. "sbc r4, r6\n\t"
  78133. #endif
  78134. "stm %[r]!, {r3, r4}\n\t"
  78135. "ldm %[b]!, {r5, r6}\n\t"
  78136. "ldm %[a]!, {r3, r4}\n\t"
  78137. #ifdef WOLFSSL_KEIL
  78138. "sbcs r3, r3, r5\n\t"
  78139. #elif defined(__clang__)
  78140. "sbcs r3, r5\n\t"
  78141. #else
  78142. "sbc r3, r5\n\t"
  78143. #endif
  78144. #ifdef WOLFSSL_KEIL
  78145. "sbcs r4, r4, r6\n\t"
  78146. #elif defined(__clang__)
  78147. "sbcs r4, r6\n\t"
  78148. #else
  78149. "sbc r4, r6\n\t"
  78150. #endif
  78151. "stm %[r]!, {r3, r4}\n\t"
  78152. "ldm %[b]!, {r5, r6}\n\t"
  78153. "ldm %[a]!, {r3, r4}\n\t"
  78154. #ifdef WOLFSSL_KEIL
  78155. "sbcs r3, r3, r5\n\t"
  78156. #elif defined(__clang__)
  78157. "sbcs r3, r5\n\t"
  78158. #else
  78159. "sbc r3, r5\n\t"
  78160. #endif
  78161. #ifdef WOLFSSL_KEIL
  78162. "sbcs r4, r4, r6\n\t"
  78163. #elif defined(__clang__)
  78164. "sbcs r4, r6\n\t"
  78165. #else
  78166. "sbc r4, r6\n\t"
  78167. #endif
  78168. "stm %[r]!, {r3, r4}\n\t"
  78169. "ldm %[b]!, {r5, r6}\n\t"
  78170. "ldm %[a]!, {r3, r4}\n\t"
  78171. #ifdef WOLFSSL_KEIL
  78172. "sbcs r3, r3, r5\n\t"
  78173. #elif defined(__clang__)
  78174. "sbcs r3, r5\n\t"
  78175. #else
  78176. "sbc r3, r5\n\t"
  78177. #endif
  78178. #ifdef WOLFSSL_KEIL
  78179. "sbcs r4, r4, r6\n\t"
  78180. #elif defined(__clang__)
  78181. "sbcs r4, r6\n\t"
  78182. #else
  78183. "sbc r4, r6\n\t"
  78184. #endif
  78185. "stm %[r]!, {r3, r4}\n\t"
  78186. "ldm %[b]!, {r5, r6}\n\t"
  78187. "ldm %[a]!, {r3, r4}\n\t"
  78188. #ifdef WOLFSSL_KEIL
  78189. "sbcs r3, r3, r5\n\t"
  78190. #elif defined(__clang__)
  78191. "sbcs r3, r5\n\t"
  78192. #else
  78193. "sbc r3, r5\n\t"
  78194. #endif
  78195. #ifdef WOLFSSL_KEIL
  78196. "sbcs r4, r4, r6\n\t"
  78197. #elif defined(__clang__)
  78198. "sbcs r4, r6\n\t"
  78199. #else
  78200. "sbc r4, r6\n\t"
  78201. #endif
  78202. "stm %[r]!, {r3, r4}\n\t"
  78203. "ldm %[b]!, {r5, r6}\n\t"
  78204. "ldm %[a]!, {r3, r4}\n\t"
  78205. #ifdef WOLFSSL_KEIL
  78206. "sbcs r3, r3, r5\n\t"
  78207. #elif defined(__clang__)
  78208. "sbcs r3, r5\n\t"
  78209. #else
  78210. "sbc r3, r5\n\t"
  78211. #endif
  78212. #ifdef WOLFSSL_KEIL
  78213. "sbcs r4, r4, r6\n\t"
  78214. #elif defined(__clang__)
  78215. "sbcs r4, r6\n\t"
  78216. #else
  78217. "sbc r4, r6\n\t"
  78218. #endif
  78219. "stm %[r]!, {r3, r4}\n\t"
  78220. "ldm %[b]!, {r5, r6}\n\t"
  78221. "ldm %[a]!, {r3, r4}\n\t"
  78222. #ifdef WOLFSSL_KEIL
  78223. "sbcs r3, r3, r5\n\t"
  78224. #elif defined(__clang__)
  78225. "sbcs r3, r5\n\t"
  78226. #else
  78227. "sbc r3, r5\n\t"
  78228. #endif
  78229. #ifdef WOLFSSL_KEIL
  78230. "sbcs r4, r4, r6\n\t"
  78231. #elif defined(__clang__)
  78232. "sbcs r4, r6\n\t"
  78233. #else
  78234. "sbc r4, r6\n\t"
  78235. #endif
  78236. "stm %[r]!, {r3, r4}\n\t"
  78237. "ldm %[b]!, {r5, r6}\n\t"
  78238. "ldm %[a]!, {r3, r4}\n\t"
  78239. #ifdef WOLFSSL_KEIL
  78240. "sbcs r3, r3, r5\n\t"
  78241. #elif defined(__clang__)
  78242. "sbcs r3, r5\n\t"
  78243. #else
  78244. "sbc r3, r5\n\t"
  78245. #endif
  78246. #ifdef WOLFSSL_KEIL
  78247. "sbcs r4, r4, r6\n\t"
  78248. #elif defined(__clang__)
  78249. "sbcs r4, r6\n\t"
  78250. #else
  78251. "sbc r4, r6\n\t"
  78252. #endif
  78253. "stm %[r]!, {r3, r4}\n\t"
  78254. "ldm %[b]!, {r5, r6}\n\t"
  78255. "ldm %[a]!, {r3, r4}\n\t"
  78256. #ifdef WOLFSSL_KEIL
  78257. "sbcs r3, r3, r5\n\t"
  78258. #elif defined(__clang__)
  78259. "sbcs r3, r5\n\t"
  78260. #else
  78261. "sbc r3, r5\n\t"
  78262. #endif
  78263. #ifdef WOLFSSL_KEIL
  78264. "sbcs r4, r4, r6\n\t"
  78265. #elif defined(__clang__)
  78266. "sbcs r4, r6\n\t"
  78267. #else
  78268. "sbc r4, r6\n\t"
  78269. #endif
  78270. "stm %[r]!, {r3, r4}\n\t"
  78271. "ldm %[b]!, {r5, r6}\n\t"
  78272. "ldm %[a]!, {r3, r4}\n\t"
  78273. #ifdef WOLFSSL_KEIL
  78274. "sbcs r3, r3, r5\n\t"
  78275. #elif defined(__clang__)
  78276. "sbcs r3, r5\n\t"
  78277. #else
  78278. "sbc r3, r5\n\t"
  78279. #endif
  78280. #ifdef WOLFSSL_KEIL
  78281. "sbcs r4, r4, r6\n\t"
  78282. #elif defined(__clang__)
  78283. "sbcs r4, r6\n\t"
  78284. #else
  78285. "sbc r4, r6\n\t"
  78286. #endif
  78287. "stm %[r]!, {r3, r4}\n\t"
  78288. "ldm %[b]!, {r5, r6}\n\t"
  78289. "ldm %[a]!, {r3, r4}\n\t"
  78290. #ifdef WOLFSSL_KEIL
  78291. "sbcs r3, r3, r5\n\t"
  78292. #elif defined(__clang__)
  78293. "sbcs r3, r5\n\t"
  78294. #else
  78295. "sbc r3, r5\n\t"
  78296. #endif
  78297. #ifdef WOLFSSL_KEIL
  78298. "sbcs r4, r4, r6\n\t"
  78299. #elif defined(__clang__)
  78300. "sbcs r4, r6\n\t"
  78301. #else
  78302. "sbc r4, r6\n\t"
  78303. #endif
  78304. "stm %[r]!, {r3, r4}\n\t"
  78305. "ldm %[b]!, {r5, r6}\n\t"
  78306. "ldm %[a]!, {r3, r4}\n\t"
  78307. #ifdef WOLFSSL_KEIL
  78308. "sbcs r3, r3, r5\n\t"
  78309. #elif defined(__clang__)
  78310. "sbcs r3, r5\n\t"
  78311. #else
  78312. "sbc r3, r5\n\t"
  78313. #endif
  78314. #ifdef WOLFSSL_KEIL
  78315. "sbcs r4, r4, r6\n\t"
  78316. #elif defined(__clang__)
  78317. "sbcs r4, r6\n\t"
  78318. #else
  78319. "sbc r4, r6\n\t"
  78320. #endif
  78321. "stm %[r]!, {r3, r4}\n\t"
  78322. "ldm %[b]!, {r5, r6}\n\t"
  78323. "ldm %[a]!, {r3, r4}\n\t"
  78324. #ifdef WOLFSSL_KEIL
  78325. "sbcs r3, r3, r5\n\t"
  78326. #elif defined(__clang__)
  78327. "sbcs r3, r5\n\t"
  78328. #else
  78329. "sbc r3, r5\n\t"
  78330. #endif
  78331. #ifdef WOLFSSL_KEIL
  78332. "sbcs r4, r4, r6\n\t"
  78333. #elif defined(__clang__)
  78334. "sbcs r4, r6\n\t"
  78335. #else
  78336. "sbc r4, r6\n\t"
  78337. #endif
  78338. "stm %[r]!, {r3, r4}\n\t"
  78339. "ldm %[b]!, {r5, r6}\n\t"
  78340. "ldm %[a]!, {r3, r4}\n\t"
  78341. #ifdef WOLFSSL_KEIL
  78342. "sbcs r3, r3, r5\n\t"
  78343. #elif defined(__clang__)
  78344. "sbcs r3, r5\n\t"
  78345. #else
  78346. "sbc r3, r5\n\t"
  78347. #endif
  78348. #ifdef WOLFSSL_KEIL
  78349. "sbcs r4, r4, r6\n\t"
  78350. #elif defined(__clang__)
  78351. "sbcs r4, r6\n\t"
  78352. #else
  78353. "sbc r4, r6\n\t"
  78354. #endif
  78355. "stm %[r]!, {r3, r4}\n\t"
  78356. "ldm %[b]!, {r5, r6}\n\t"
  78357. "ldm %[a]!, {r3, r4}\n\t"
  78358. #ifdef WOLFSSL_KEIL
  78359. "sbcs r3, r3, r5\n\t"
  78360. #elif defined(__clang__)
  78361. "sbcs r3, r5\n\t"
  78362. #else
  78363. "sbc r3, r5\n\t"
  78364. #endif
  78365. #ifdef WOLFSSL_KEIL
  78366. "sbcs r4, r4, r6\n\t"
  78367. #elif defined(__clang__)
  78368. "sbcs r4, r6\n\t"
  78369. #else
  78370. "sbc r4, r6\n\t"
  78371. #endif
  78372. "stm %[r]!, {r3, r4}\n\t"
  78373. "ldm %[b]!, {r5, r6}\n\t"
  78374. "ldm %[a]!, {r3, r4}\n\t"
  78375. #ifdef WOLFSSL_KEIL
  78376. "sbcs r3, r3, r5\n\t"
  78377. #elif defined(__clang__)
  78378. "sbcs r3, r5\n\t"
  78379. #else
  78380. "sbc r3, r5\n\t"
  78381. #endif
  78382. #ifdef WOLFSSL_KEIL
  78383. "sbcs r4, r4, r6\n\t"
  78384. #elif defined(__clang__)
  78385. "sbcs r4, r6\n\t"
  78386. #else
  78387. "sbc r4, r6\n\t"
  78388. #endif
  78389. "stm %[r]!, {r3, r4}\n\t"
  78390. "ldm %[b]!, {r5, r6}\n\t"
  78391. "ldm %[a]!, {r3, r4}\n\t"
  78392. #ifdef WOLFSSL_KEIL
  78393. "sbcs r3, r3, r5\n\t"
  78394. #elif defined(__clang__)
  78395. "sbcs r3, r5\n\t"
  78396. #else
  78397. "sbc r3, r5\n\t"
  78398. #endif
  78399. #ifdef WOLFSSL_KEIL
  78400. "sbcs r4, r4, r6\n\t"
  78401. #elif defined(__clang__)
  78402. "sbcs r4, r6\n\t"
  78403. #else
  78404. "sbc r4, r6\n\t"
  78405. #endif
  78406. "stm %[r]!, {r3, r4}\n\t"
  78407. "ldm %[b]!, {r5, r6}\n\t"
  78408. "ldm %[a]!, {r3, r4}\n\t"
  78409. #ifdef WOLFSSL_KEIL
  78410. "sbcs r3, r3, r5\n\t"
  78411. #elif defined(__clang__)
  78412. "sbcs r3, r5\n\t"
  78413. #else
  78414. "sbc r3, r5\n\t"
  78415. #endif
  78416. #ifdef WOLFSSL_KEIL
  78417. "sbcs r4, r4, r6\n\t"
  78418. #elif defined(__clang__)
  78419. "sbcs r4, r6\n\t"
  78420. #else
  78421. "sbc r4, r6\n\t"
  78422. #endif
  78423. "stm %[r]!, {r3, r4}\n\t"
  78424. "ldm %[b]!, {r5, r6}\n\t"
  78425. "ldm %[a]!, {r3, r4}\n\t"
  78426. #ifdef WOLFSSL_KEIL
  78427. "sbcs r3, r3, r5\n\t"
  78428. #elif defined(__clang__)
  78429. "sbcs r3, r5\n\t"
  78430. #else
  78431. "sbc r3, r5\n\t"
  78432. #endif
  78433. #ifdef WOLFSSL_KEIL
  78434. "sbcs r4, r4, r6\n\t"
  78435. #elif defined(__clang__)
  78436. "sbcs r4, r6\n\t"
  78437. #else
  78438. "sbc r4, r6\n\t"
  78439. #endif
  78440. "stm %[r]!, {r3, r4}\n\t"
  78441. "ldm %[b]!, {r5, r6}\n\t"
  78442. "ldm %[a]!, {r3, r4}\n\t"
  78443. #ifdef WOLFSSL_KEIL
  78444. "sbcs r3, r3, r5\n\t"
  78445. #elif defined(__clang__)
  78446. "sbcs r3, r5\n\t"
  78447. #else
  78448. "sbc r3, r5\n\t"
  78449. #endif
  78450. #ifdef WOLFSSL_KEIL
  78451. "sbcs r4, r4, r6\n\t"
  78452. #elif defined(__clang__)
  78453. "sbcs r4, r6\n\t"
  78454. #else
  78455. "sbc r4, r6\n\t"
  78456. #endif
  78457. "stm %[r]!, {r3, r4}\n\t"
  78458. "ldm %[b]!, {r5, r6}\n\t"
  78459. "ldm %[a]!, {r3, r4}\n\t"
  78460. #ifdef WOLFSSL_KEIL
  78461. "sbcs r3, r3, r5\n\t"
  78462. #elif defined(__clang__)
  78463. "sbcs r3, r5\n\t"
  78464. #else
  78465. "sbc r3, r5\n\t"
  78466. #endif
  78467. #ifdef WOLFSSL_KEIL
  78468. "sbcs r4, r4, r6\n\t"
  78469. #elif defined(__clang__)
  78470. "sbcs r4, r6\n\t"
  78471. #else
  78472. "sbc r4, r6\n\t"
  78473. #endif
  78474. "stm %[r]!, {r3, r4}\n\t"
  78475. "ldm %[b]!, {r5, r6}\n\t"
  78476. "ldm %[a]!, {r3, r4}\n\t"
  78477. #ifdef WOLFSSL_KEIL
  78478. "sbcs r3, r3, r5\n\t"
  78479. #elif defined(__clang__)
  78480. "sbcs r3, r5\n\t"
  78481. #else
  78482. "sbc r3, r5\n\t"
  78483. #endif
  78484. #ifdef WOLFSSL_KEIL
  78485. "sbcs r4, r4, r6\n\t"
  78486. #elif defined(__clang__)
  78487. "sbcs r4, r6\n\t"
  78488. #else
  78489. "sbc r4, r6\n\t"
  78490. #endif
  78491. "stm %[r]!, {r3, r4}\n\t"
  78492. "ldm %[b]!, {r5, r6}\n\t"
  78493. "ldm %[a]!, {r3, r4}\n\t"
  78494. #ifdef WOLFSSL_KEIL
  78495. "sbcs r3, r3, r5\n\t"
  78496. #elif defined(__clang__)
  78497. "sbcs r3, r5\n\t"
  78498. #else
  78499. "sbc r3, r5\n\t"
  78500. #endif
  78501. #ifdef WOLFSSL_KEIL
  78502. "sbcs r4, r4, r6\n\t"
  78503. #elif defined(__clang__)
  78504. "sbcs r4, r6\n\t"
  78505. #else
  78506. "sbc r4, r6\n\t"
  78507. #endif
  78508. "stm %[r]!, {r3, r4}\n\t"
  78509. "ldm %[b]!, {r5, r6}\n\t"
  78510. "ldm %[a]!, {r3, r4}\n\t"
  78511. #ifdef WOLFSSL_KEIL
  78512. "sbcs r3, r3, r5\n\t"
  78513. #elif defined(__clang__)
  78514. "sbcs r3, r5\n\t"
  78515. #else
  78516. "sbc r3, r5\n\t"
  78517. #endif
  78518. #ifdef WOLFSSL_KEIL
  78519. "sbcs r4, r4, r6\n\t"
  78520. #elif defined(__clang__)
  78521. "sbcs r4, r6\n\t"
  78522. #else
  78523. "sbc r4, r6\n\t"
  78524. #endif
  78525. "stm %[r]!, {r3, r4}\n\t"
  78526. #ifdef WOLFSSL_KEIL
  78527. "sbcs %[r], %[r], %[r]\n\t"
  78528. #elif defined(__clang__)
  78529. "sbcs %[r], %[r]\n\t"
  78530. #else
  78531. "sbc %[r], %[r]\n\t"
  78532. #endif
  78533. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  78534. :
  78535. : "memory", "r3", "r4", "r5", "r6"
  78536. );
  78537. return (uint32_t)(size_t)r;
  78538. }
  78539. #endif /* WOLFSSL_SP_SMALL */
  78540. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  78541. *
  78542. * d1 The high order half of the number to divide.
  78543. * d0 The low order half of the number to divide.
  78544. * div The divisor.
  78545. * returns the result of the division.
  78546. *
  78547. * Note that this is an approximate div. It may give an answer 1 larger.
  78548. */
  78549. SP_NOINLINE static sp_digit div_3072_word_96(sp_digit d1, sp_digit d0,
  78550. sp_digit div)
  78551. {
  78552. __asm__ __volatile__ (
  78553. "movs r3, #0\n\t"
  78554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78555. "lsrs r5, %[div], #1\n\t"
  78556. #else
  78557. "lsr r5, %[div], #1\n\t"
  78558. #endif
  78559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78560. "adds r5, r5, #1\n\t"
  78561. #else
  78562. "add r5, r5, #1\n\t"
  78563. #endif
  78564. "mov r8, %[d0]\n\t"
  78565. "mov r9, %[d1]\n\t"
  78566. "# Do top 32\n\t"
  78567. "movs r6, r5\n\t"
  78568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78569. "subs r6, r6, %[d1]\n\t"
  78570. #else
  78571. "sub r6, r6, %[d1]\n\t"
  78572. #endif
  78573. #ifdef WOLFSSL_KEIL
  78574. "sbcs r6, r6, r6\n\t"
  78575. #elif defined(__clang__)
  78576. "sbcs r6, r6\n\t"
  78577. #else
  78578. "sbc r6, r6\n\t"
  78579. #endif
  78580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78581. "adds r3, r3, r3\n\t"
  78582. #else
  78583. "add r3, r3, r3\n\t"
  78584. #endif
  78585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78586. "subs r3, r3, r6\n\t"
  78587. #else
  78588. "sub r3, r3, r6\n\t"
  78589. #endif
  78590. #ifdef WOLFSSL_KEIL
  78591. "ands r6, r6, r5\n\t"
  78592. #elif defined(__clang__)
  78593. "ands r6, r5\n\t"
  78594. #else
  78595. "and r6, r5\n\t"
  78596. #endif
  78597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78598. "subs %[d1], %[d1], r6\n\t"
  78599. #else
  78600. "sub %[d1], %[d1], r6\n\t"
  78601. #endif
  78602. "movs r4, #29\n\t"
  78603. "\n"
  78604. "L_div_3072_word_96_loop_%=:\n\t"
  78605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78606. "lsls %[d0], %[d0], #1\n\t"
  78607. #else
  78608. "lsl %[d0], %[d0], #1\n\t"
  78609. #endif
  78610. #ifdef WOLFSSL_KEIL
  78611. "adcs %[d1], %[d1], %[d1]\n\t"
  78612. #elif defined(__clang__)
  78613. "adcs %[d1], %[d1]\n\t"
  78614. #else
  78615. "adc %[d1], %[d1]\n\t"
  78616. #endif
  78617. "movs r6, r5\n\t"
  78618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78619. "subs r6, r6, %[d1]\n\t"
  78620. #else
  78621. "sub r6, r6, %[d1]\n\t"
  78622. #endif
  78623. #ifdef WOLFSSL_KEIL
  78624. "sbcs r6, r6, r6\n\t"
  78625. #elif defined(__clang__)
  78626. "sbcs r6, r6\n\t"
  78627. #else
  78628. "sbc r6, r6\n\t"
  78629. #endif
  78630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78631. "adds r3, r3, r3\n\t"
  78632. #else
  78633. "add r3, r3, r3\n\t"
  78634. #endif
  78635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78636. "subs r3, r3, r6\n\t"
  78637. #else
  78638. "sub r3, r3, r6\n\t"
  78639. #endif
  78640. #ifdef WOLFSSL_KEIL
  78641. "ands r6, r6, r5\n\t"
  78642. #elif defined(__clang__)
  78643. "ands r6, r5\n\t"
  78644. #else
  78645. "and r6, r5\n\t"
  78646. #endif
  78647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78648. "subs %[d1], %[d1], r6\n\t"
  78649. #else
  78650. "sub %[d1], %[d1], r6\n\t"
  78651. #endif
  78652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78653. "subs r4, r4, #1\n\t"
  78654. #else
  78655. "sub r4, r4, #1\n\t"
  78656. #endif
  78657. "bpl L_div_3072_word_96_loop_%=\n\t"
  78658. "movs r7, #0\n\t"
  78659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78660. "adds r3, r3, r3\n\t"
  78661. #else
  78662. "add r3, r3, r3\n\t"
  78663. #endif
  78664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78665. "adds r3, r3, #1\n\t"
  78666. #else
  78667. "add r3, r3, #1\n\t"
  78668. #endif
  78669. "# r * div - Start\n\t"
  78670. "uxth %[d1], r3\n\t"
  78671. "uxth r4, %[div]\n\t"
  78672. #ifdef WOLFSSL_KEIL
  78673. "muls r4, %[d1], r4\n\t"
  78674. #elif defined(__clang__)
  78675. "muls r4, %[d1]\n\t"
  78676. #else
  78677. "mul r4, %[d1]\n\t"
  78678. #endif
  78679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78680. "lsrs r6, %[div], #16\n\t"
  78681. #else
  78682. "lsr r6, %[div], #16\n\t"
  78683. #endif
  78684. #ifdef WOLFSSL_KEIL
  78685. "muls %[d1], r6, %[d1]\n\t"
  78686. #elif defined(__clang__)
  78687. "muls %[d1], r6\n\t"
  78688. #else
  78689. "mul %[d1], r6\n\t"
  78690. #endif
  78691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78692. "lsrs r5, %[d1], #16\n\t"
  78693. #else
  78694. "lsr r5, %[d1], #16\n\t"
  78695. #endif
  78696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78697. "lsls %[d1], %[d1], #16\n\t"
  78698. #else
  78699. "lsl %[d1], %[d1], #16\n\t"
  78700. #endif
  78701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78702. "adds r4, r4, %[d1]\n\t"
  78703. #else
  78704. "add r4, r4, %[d1]\n\t"
  78705. #endif
  78706. #ifdef WOLFSSL_KEIL
  78707. "adcs r5, r5, r7\n\t"
  78708. #elif defined(__clang__)
  78709. "adcs r5, r7\n\t"
  78710. #else
  78711. "adc r5, r7\n\t"
  78712. #endif
  78713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78714. "lsrs %[d1], r3, #16\n\t"
  78715. #else
  78716. "lsr %[d1], r3, #16\n\t"
  78717. #endif
  78718. #ifdef WOLFSSL_KEIL
  78719. "muls r6, %[d1], r6\n\t"
  78720. #elif defined(__clang__)
  78721. "muls r6, %[d1]\n\t"
  78722. #else
  78723. "mul r6, %[d1]\n\t"
  78724. #endif
  78725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78726. "adds r5, r5, r6\n\t"
  78727. #else
  78728. "add r5, r5, r6\n\t"
  78729. #endif
  78730. "uxth r6, %[div]\n\t"
  78731. #ifdef WOLFSSL_KEIL
  78732. "muls %[d1], r6, %[d1]\n\t"
  78733. #elif defined(__clang__)
  78734. "muls %[d1], r6\n\t"
  78735. #else
  78736. "mul %[d1], r6\n\t"
  78737. #endif
  78738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78739. "lsrs r6, %[d1], #16\n\t"
  78740. #else
  78741. "lsr r6, %[d1], #16\n\t"
  78742. #endif
  78743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78744. "lsls %[d1], %[d1], #16\n\t"
  78745. #else
  78746. "lsl %[d1], %[d1], #16\n\t"
  78747. #endif
  78748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78749. "adds r4, r4, %[d1]\n\t"
  78750. #else
  78751. "add r4, r4, %[d1]\n\t"
  78752. #endif
  78753. #ifdef WOLFSSL_KEIL
  78754. "adcs r5, r5, r6\n\t"
  78755. #elif defined(__clang__)
  78756. "adcs r5, r6\n\t"
  78757. #else
  78758. "adc r5, r6\n\t"
  78759. #endif
  78760. "# r * div - Done\n\t"
  78761. "mov %[d1], r8\n\t"
  78762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78763. "subs %[d1], %[d1], r4\n\t"
  78764. #else
  78765. "sub %[d1], %[d1], r4\n\t"
  78766. #endif
  78767. "movs r4, %[d1]\n\t"
  78768. "mov %[d1], r9\n\t"
  78769. #ifdef WOLFSSL_KEIL
  78770. "sbcs %[d1], %[d1], r5\n\t"
  78771. #elif defined(__clang__)
  78772. "sbcs %[d1], r5\n\t"
  78773. #else
  78774. "sbc %[d1], r5\n\t"
  78775. #endif
  78776. "movs r5, %[d1]\n\t"
  78777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78778. "adds r3, r3, r5\n\t"
  78779. #else
  78780. "add r3, r3, r5\n\t"
  78781. #endif
  78782. "# r * div - Start\n\t"
  78783. "uxth %[d1], r3\n\t"
  78784. "uxth r4, %[div]\n\t"
  78785. #ifdef WOLFSSL_KEIL
  78786. "muls r4, %[d1], r4\n\t"
  78787. #elif defined(__clang__)
  78788. "muls r4, %[d1]\n\t"
  78789. #else
  78790. "mul r4, %[d1]\n\t"
  78791. #endif
  78792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78793. "lsrs r6, %[div], #16\n\t"
  78794. #else
  78795. "lsr r6, %[div], #16\n\t"
  78796. #endif
  78797. #ifdef WOLFSSL_KEIL
  78798. "muls %[d1], r6, %[d1]\n\t"
  78799. #elif defined(__clang__)
  78800. "muls %[d1], r6\n\t"
  78801. #else
  78802. "mul %[d1], r6\n\t"
  78803. #endif
  78804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78805. "lsrs r5, %[d1], #16\n\t"
  78806. #else
  78807. "lsr r5, %[d1], #16\n\t"
  78808. #endif
  78809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78810. "lsls %[d1], %[d1], #16\n\t"
  78811. #else
  78812. "lsl %[d1], %[d1], #16\n\t"
  78813. #endif
  78814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78815. "adds r4, r4, %[d1]\n\t"
  78816. #else
  78817. "add r4, r4, %[d1]\n\t"
  78818. #endif
  78819. #ifdef WOLFSSL_KEIL
  78820. "adcs r5, r5, r7\n\t"
  78821. #elif defined(__clang__)
  78822. "adcs r5, r7\n\t"
  78823. #else
  78824. "adc r5, r7\n\t"
  78825. #endif
  78826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78827. "lsrs %[d1], r3, #16\n\t"
  78828. #else
  78829. "lsr %[d1], r3, #16\n\t"
  78830. #endif
  78831. #ifdef WOLFSSL_KEIL
  78832. "muls r6, %[d1], r6\n\t"
  78833. #elif defined(__clang__)
  78834. "muls r6, %[d1]\n\t"
  78835. #else
  78836. "mul r6, %[d1]\n\t"
  78837. #endif
  78838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78839. "adds r5, r5, r6\n\t"
  78840. #else
  78841. "add r5, r5, r6\n\t"
  78842. #endif
  78843. "uxth r6, %[div]\n\t"
  78844. #ifdef WOLFSSL_KEIL
  78845. "muls %[d1], r6, %[d1]\n\t"
  78846. #elif defined(__clang__)
  78847. "muls %[d1], r6\n\t"
  78848. #else
  78849. "mul %[d1], r6\n\t"
  78850. #endif
  78851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78852. "lsrs r6, %[d1], #16\n\t"
  78853. #else
  78854. "lsr r6, %[d1], #16\n\t"
  78855. #endif
  78856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78857. "lsls %[d1], %[d1], #16\n\t"
  78858. #else
  78859. "lsl %[d1], %[d1], #16\n\t"
  78860. #endif
  78861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78862. "adds r4, r4, %[d1]\n\t"
  78863. #else
  78864. "add r4, r4, %[d1]\n\t"
  78865. #endif
  78866. #ifdef WOLFSSL_KEIL
  78867. "adcs r5, r5, r6\n\t"
  78868. #elif defined(__clang__)
  78869. "adcs r5, r6\n\t"
  78870. #else
  78871. "adc r5, r6\n\t"
  78872. #endif
  78873. "# r * div - Done\n\t"
  78874. "mov %[d1], r8\n\t"
  78875. "mov r6, r9\n\t"
  78876. #ifdef WOLFSSL_KEIL
  78877. "subs r4, %[d1], r4\n\t"
  78878. #else
  78879. #ifdef __clang__
  78880. "subs r4, %[d1], r4\n\t"
  78881. #else
  78882. "sub r4, %[d1], r4\n\t"
  78883. #endif
  78884. #endif
  78885. #ifdef WOLFSSL_KEIL
  78886. "sbcs r6, r6, r5\n\t"
  78887. #elif defined(__clang__)
  78888. "sbcs r6, r5\n\t"
  78889. #else
  78890. "sbc r6, r5\n\t"
  78891. #endif
  78892. "movs r5, r6\n\t"
  78893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78894. "adds r3, r3, r5\n\t"
  78895. #else
  78896. "add r3, r3, r5\n\t"
  78897. #endif
  78898. "# r * div - Start\n\t"
  78899. "uxth %[d1], r3\n\t"
  78900. "uxth r4, %[div]\n\t"
  78901. #ifdef WOLFSSL_KEIL
  78902. "muls r4, %[d1], r4\n\t"
  78903. #elif defined(__clang__)
  78904. "muls r4, %[d1]\n\t"
  78905. #else
  78906. "mul r4, %[d1]\n\t"
  78907. #endif
  78908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78909. "lsrs r6, %[div], #16\n\t"
  78910. #else
  78911. "lsr r6, %[div], #16\n\t"
  78912. #endif
  78913. #ifdef WOLFSSL_KEIL
  78914. "muls %[d1], r6, %[d1]\n\t"
  78915. #elif defined(__clang__)
  78916. "muls %[d1], r6\n\t"
  78917. #else
  78918. "mul %[d1], r6\n\t"
  78919. #endif
  78920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78921. "lsrs r5, %[d1], #16\n\t"
  78922. #else
  78923. "lsr r5, %[d1], #16\n\t"
  78924. #endif
  78925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78926. "lsls %[d1], %[d1], #16\n\t"
  78927. #else
  78928. "lsl %[d1], %[d1], #16\n\t"
  78929. #endif
  78930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78931. "adds r4, r4, %[d1]\n\t"
  78932. #else
  78933. "add r4, r4, %[d1]\n\t"
  78934. #endif
  78935. #ifdef WOLFSSL_KEIL
  78936. "adcs r5, r5, r7\n\t"
  78937. #elif defined(__clang__)
  78938. "adcs r5, r7\n\t"
  78939. #else
  78940. "adc r5, r7\n\t"
  78941. #endif
  78942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78943. "lsrs %[d1], r3, #16\n\t"
  78944. #else
  78945. "lsr %[d1], r3, #16\n\t"
  78946. #endif
  78947. #ifdef WOLFSSL_KEIL
  78948. "muls r6, %[d1], r6\n\t"
  78949. #elif defined(__clang__)
  78950. "muls r6, %[d1]\n\t"
  78951. #else
  78952. "mul r6, %[d1]\n\t"
  78953. #endif
  78954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78955. "adds r5, r5, r6\n\t"
  78956. #else
  78957. "add r5, r5, r6\n\t"
  78958. #endif
  78959. "uxth r6, %[div]\n\t"
  78960. #ifdef WOLFSSL_KEIL
  78961. "muls %[d1], r6, %[d1]\n\t"
  78962. #elif defined(__clang__)
  78963. "muls %[d1], r6\n\t"
  78964. #else
  78965. "mul %[d1], r6\n\t"
  78966. #endif
  78967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78968. "lsrs r6, %[d1], #16\n\t"
  78969. #else
  78970. "lsr r6, %[d1], #16\n\t"
  78971. #endif
  78972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78973. "lsls %[d1], %[d1], #16\n\t"
  78974. #else
  78975. "lsl %[d1], %[d1], #16\n\t"
  78976. #endif
  78977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  78978. "adds r4, r4, %[d1]\n\t"
  78979. #else
  78980. "add r4, r4, %[d1]\n\t"
  78981. #endif
  78982. #ifdef WOLFSSL_KEIL
  78983. "adcs r5, r5, r6\n\t"
  78984. #elif defined(__clang__)
  78985. "adcs r5, r6\n\t"
  78986. #else
  78987. "adc r5, r6\n\t"
  78988. #endif
  78989. "# r * div - Done\n\t"
  78990. "mov %[d1], r8\n\t"
  78991. "mov r6, r9\n\t"
  78992. #ifdef WOLFSSL_KEIL
  78993. "subs r4, %[d1], r4\n\t"
  78994. #else
  78995. #ifdef __clang__
  78996. "subs r4, %[d1], r4\n\t"
  78997. #else
  78998. "sub r4, %[d1], r4\n\t"
  78999. #endif
  79000. #endif
  79001. #ifdef WOLFSSL_KEIL
  79002. "sbcs r6, r6, r5\n\t"
  79003. #elif defined(__clang__)
  79004. "sbcs r6, r5\n\t"
  79005. #else
  79006. "sbc r6, r5\n\t"
  79007. #endif
  79008. "movs r5, r6\n\t"
  79009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79010. "adds r3, r3, r5\n\t"
  79011. #else
  79012. "add r3, r3, r5\n\t"
  79013. #endif
  79014. "# r * div - Start\n\t"
  79015. "uxth %[d1], r3\n\t"
  79016. "uxth r4, %[div]\n\t"
  79017. #ifdef WOLFSSL_KEIL
  79018. "muls r4, %[d1], r4\n\t"
  79019. #elif defined(__clang__)
  79020. "muls r4, %[d1]\n\t"
  79021. #else
  79022. "mul r4, %[d1]\n\t"
  79023. #endif
  79024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79025. "lsrs r6, %[div], #16\n\t"
  79026. #else
  79027. "lsr r6, %[div], #16\n\t"
  79028. #endif
  79029. #ifdef WOLFSSL_KEIL
  79030. "muls %[d1], r6, %[d1]\n\t"
  79031. #elif defined(__clang__)
  79032. "muls %[d1], r6\n\t"
  79033. #else
  79034. "mul %[d1], r6\n\t"
  79035. #endif
  79036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79037. "lsrs r5, %[d1], #16\n\t"
  79038. #else
  79039. "lsr r5, %[d1], #16\n\t"
  79040. #endif
  79041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79042. "lsls %[d1], %[d1], #16\n\t"
  79043. #else
  79044. "lsl %[d1], %[d1], #16\n\t"
  79045. #endif
  79046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79047. "adds r4, r4, %[d1]\n\t"
  79048. #else
  79049. "add r4, r4, %[d1]\n\t"
  79050. #endif
  79051. #ifdef WOLFSSL_KEIL
  79052. "adcs r5, r5, r7\n\t"
  79053. #elif defined(__clang__)
  79054. "adcs r5, r7\n\t"
  79055. #else
  79056. "adc r5, r7\n\t"
  79057. #endif
  79058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79059. "lsrs %[d1], r3, #16\n\t"
  79060. #else
  79061. "lsr %[d1], r3, #16\n\t"
  79062. #endif
  79063. #ifdef WOLFSSL_KEIL
  79064. "muls r6, %[d1], r6\n\t"
  79065. #elif defined(__clang__)
  79066. "muls r6, %[d1]\n\t"
  79067. #else
  79068. "mul r6, %[d1]\n\t"
  79069. #endif
  79070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79071. "adds r5, r5, r6\n\t"
  79072. #else
  79073. "add r5, r5, r6\n\t"
  79074. #endif
  79075. "uxth r6, %[div]\n\t"
  79076. #ifdef WOLFSSL_KEIL
  79077. "muls %[d1], r6, %[d1]\n\t"
  79078. #elif defined(__clang__)
  79079. "muls %[d1], r6\n\t"
  79080. #else
  79081. "mul %[d1], r6\n\t"
  79082. #endif
  79083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79084. "lsrs r6, %[d1], #16\n\t"
  79085. #else
  79086. "lsr r6, %[d1], #16\n\t"
  79087. #endif
  79088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79089. "lsls %[d1], %[d1], #16\n\t"
  79090. #else
  79091. "lsl %[d1], %[d1], #16\n\t"
  79092. #endif
  79093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79094. "adds r4, r4, %[d1]\n\t"
  79095. #else
  79096. "add r4, r4, %[d1]\n\t"
  79097. #endif
  79098. #ifdef WOLFSSL_KEIL
  79099. "adcs r5, r5, r6\n\t"
  79100. #elif defined(__clang__)
  79101. "adcs r5, r6\n\t"
  79102. #else
  79103. "adc r5, r6\n\t"
  79104. #endif
  79105. "# r * div - Done\n\t"
  79106. "mov %[d1], r8\n\t"
  79107. "mov r6, r9\n\t"
  79108. #ifdef WOLFSSL_KEIL
  79109. "subs r4, %[d1], r4\n\t"
  79110. #else
  79111. #ifdef __clang__
  79112. "subs r4, %[d1], r4\n\t"
  79113. #else
  79114. "sub r4, %[d1], r4\n\t"
  79115. #endif
  79116. #endif
  79117. #ifdef WOLFSSL_KEIL
  79118. "sbcs r6, r6, r5\n\t"
  79119. #elif defined(__clang__)
  79120. "sbcs r6, r5\n\t"
  79121. #else
  79122. "sbc r6, r5\n\t"
  79123. #endif
  79124. "movs r5, r6\n\t"
  79125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79126. "adds r3, r3, r5\n\t"
  79127. #else
  79128. "add r3, r3, r5\n\t"
  79129. #endif
  79130. "movs r6, %[div]\n\t"
  79131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79132. "subs r6, r6, r4\n\t"
  79133. #else
  79134. "sub r6, r6, r4\n\t"
  79135. #endif
  79136. #ifdef WOLFSSL_KEIL
  79137. "sbcs r6, r6, r6\n\t"
  79138. #elif defined(__clang__)
  79139. "sbcs r6, r6\n\t"
  79140. #else
  79141. "sbc r6, r6\n\t"
  79142. #endif
  79143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79144. "subs r3, r3, r6\n\t"
  79145. #else
  79146. "sub r3, r3, r6\n\t"
  79147. #endif
  79148. "movs %[d1], r3\n\t"
  79149. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  79150. :
  79151. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  79152. );
  79153. return (uint32_t)(size_t)d1;
  79154. }
  79155. /* Divide d in a and put remainder into r (m*d + r = a)
  79156. * m is not calculated as it is not needed at this time.
  79157. *
  79158. * a Number to be divided.
  79159. * d Number to divide with.
  79160. * m Multiplier result.
  79161. * r Remainder from the division.
  79162. * returns MP_OKAY indicating success.
  79163. */
  79164. static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
  79165. sp_digit* r)
  79166. {
  79167. sp_digit t1[192], t2[97];
  79168. sp_digit div, r1;
  79169. int i;
  79170. (void)m;
  79171. div = d[95];
  79172. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  79173. for (i = 95; i > 0; i--) {
  79174. if (t1[i + 96] != d[i])
  79175. break;
  79176. }
  79177. if (t1[i + 96] >= d[i]) {
  79178. sp_3072_sub_in_place_96(&t1[96], d);
  79179. }
  79180. for (i = 95; i >= 0; i--) {
  79181. if (t1[96 + i] == div) {
  79182. r1 = SP_DIGIT_MAX;
  79183. }
  79184. else {
  79185. r1 = div_3072_word_96(t1[96 + i], t1[96 + i - 1], div);
  79186. }
  79187. sp_3072_mul_d_96(t2, d, r1);
  79188. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  79189. t1[96 + i] -= t2[96];
  79190. if (t1[96 + i] != 0) {
  79191. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  79192. if (t1[96 + i] != 0)
  79193. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], d);
  79194. }
  79195. }
  79196. for (i = 95; i > 0; i--) {
  79197. if (t1[i] != d[i])
  79198. break;
  79199. }
  79200. if (t1[i] >= d[i]) {
  79201. sp_3072_sub_96(r, t1, d);
  79202. }
  79203. else {
  79204. XMEMCPY(r, t1, sizeof(*t1) * 96);
  79205. }
  79206. return MP_OKAY;
  79207. }
  79208. /* Reduce a modulo m into r. (r = a mod m)
  79209. *
  79210. * r A single precision number that is the reduced result.
  79211. * a A single precision number that is to be reduced.
  79212. * m A single precision number that is the modulus to reduce with.
  79213. * returns MP_OKAY indicating success.
  79214. */
  79215. static WC_INLINE int sp_3072_mod_96_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  79216. {
  79217. int ret;
  79218. ret = sp_3072_div_96_cond(a, m, NULL, r);
  79219. return ret;
  79220. }
  79221. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  79222. /* AND m into each word of a and store in r.
  79223. *
  79224. * r A single precision integer.
  79225. * a A single precision integer.
  79226. * m Mask to AND against each digit.
  79227. */
  79228. static void sp_3072_mask_96(sp_digit* r, const sp_digit* a, sp_digit m)
  79229. {
  79230. #ifdef WOLFSSL_SP_SMALL
  79231. int i;
  79232. for (i=0; i<96; i++) {
  79233. r[i] = a[i] & m;
  79234. }
  79235. #else
  79236. int i;
  79237. for (i = 0; i < 96; i += 8) {
  79238. r[i+0] = a[i+0] & m;
  79239. r[i+1] = a[i+1] & m;
  79240. r[i+2] = a[i+2] & m;
  79241. r[i+3] = a[i+3] & m;
  79242. r[i+4] = a[i+4] & m;
  79243. r[i+5] = a[i+5] & m;
  79244. r[i+6] = a[i+6] & m;
  79245. r[i+7] = a[i+7] & m;
  79246. }
  79247. #endif
  79248. }
  79249. /* Compare a with b in constant time.
  79250. *
  79251. * a A single precision integer.
  79252. * b A single precision integer.
  79253. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  79254. * respectively.
  79255. */
  79256. SP_NOINLINE static sp_int32 sp_3072_cmp_96(const sp_digit* a, const sp_digit* b)
  79257. {
  79258. __asm__ __volatile__ (
  79259. "movs r2, #0\n\t"
  79260. "movs r3, #0\n\t"
  79261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79262. "mvns r3, r3\n\t"
  79263. #else
  79264. "mvn r3, r3\n\t"
  79265. #endif
  79266. "movs r6, #0xff\n\t"
  79267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79268. "adds r6, r6, #0x7d\n\t"
  79269. #else
  79270. "add r6, r6, #0x7d\n\t"
  79271. #endif
  79272. "\n"
  79273. "L_sp_3072_cmp_96_words_%=:\n\t"
  79274. "ldr r7, [%[a], r6]\n\t"
  79275. "ldr r5, [%[b], r6]\n\t"
  79276. #ifdef WOLFSSL_KEIL
  79277. "ands r7, r7, r3\n\t"
  79278. #elif defined(__clang__)
  79279. "ands r7, r3\n\t"
  79280. #else
  79281. "and r7, r3\n\t"
  79282. #endif
  79283. #ifdef WOLFSSL_KEIL
  79284. "ands r5, r5, r3\n\t"
  79285. #elif defined(__clang__)
  79286. "ands r5, r3\n\t"
  79287. #else
  79288. "and r5, r3\n\t"
  79289. #endif
  79290. "movs r4, r7\n\t"
  79291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79292. "subs r7, r7, r5\n\t"
  79293. #else
  79294. "sub r7, r7, r5\n\t"
  79295. #endif
  79296. #ifdef WOLFSSL_KEIL
  79297. "sbcs r7, r7, r7\n\t"
  79298. #elif defined(__clang__)
  79299. "sbcs r7, r7\n\t"
  79300. #else
  79301. "sbc r7, r7\n\t"
  79302. #endif
  79303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79304. "adds r2, r2, r7\n\t"
  79305. #else
  79306. "add r2, r2, r7\n\t"
  79307. #endif
  79308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79309. "mvns r7, r7\n\t"
  79310. #else
  79311. "mvn r7, r7\n\t"
  79312. #endif
  79313. #ifdef WOLFSSL_KEIL
  79314. "ands r3, r3, r7\n\t"
  79315. #elif defined(__clang__)
  79316. "ands r3, r7\n\t"
  79317. #else
  79318. "and r3, r7\n\t"
  79319. #endif
  79320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79321. "subs r5, r5, r4\n\t"
  79322. #else
  79323. "sub r5, r5, r4\n\t"
  79324. #endif
  79325. #ifdef WOLFSSL_KEIL
  79326. "sbcs r7, r7, r7\n\t"
  79327. #elif defined(__clang__)
  79328. "sbcs r7, r7\n\t"
  79329. #else
  79330. "sbc r7, r7\n\t"
  79331. #endif
  79332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79333. "subs r2, r2, r7\n\t"
  79334. #else
  79335. "sub r2, r2, r7\n\t"
  79336. #endif
  79337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79338. "mvns r7, r7\n\t"
  79339. #else
  79340. "mvn r7, r7\n\t"
  79341. #endif
  79342. #ifdef WOLFSSL_KEIL
  79343. "ands r3, r3, r7\n\t"
  79344. #elif defined(__clang__)
  79345. "ands r3, r7\n\t"
  79346. #else
  79347. "and r3, r7\n\t"
  79348. #endif
  79349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79350. "subs r6, r6, #4\n\t"
  79351. #else
  79352. "sub r6, r6, #4\n\t"
  79353. #endif
  79354. "bge L_sp_3072_cmp_96_words_%=\n\t"
  79355. "movs %[a], r2\n\t"
  79356. : [a] "+l" (a), [b] "+l" (b)
  79357. :
  79358. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  79359. );
  79360. return (uint32_t)(size_t)a;
  79361. }
  79362. /* Divide d in a and put remainder into r (m*d + r = a)
  79363. * m is not calculated as it is not needed at this time.
  79364. *
  79365. * a Number to be divided.
  79366. * d Number to divide with.
  79367. * m Multiplier result.
  79368. * r Remainder from the division.
  79369. * returns MP_OKAY indicating success.
  79370. */
  79371. static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d, sp_digit* m,
  79372. sp_digit* r)
  79373. {
  79374. sp_digit t1[192], t2[97];
  79375. sp_digit div, r1;
  79376. int i;
  79377. (void)m;
  79378. div = d[95];
  79379. XMEMCPY(t1, a, sizeof(*t1) * 2 * 96);
  79380. r1 = sp_3072_cmp_96(&t1[96], d) >= 0;
  79381. sp_3072_cond_sub_96(&t1[96], &t1[96], d, (sp_digit)0 - r1);
  79382. for (i = 95; i >= 0; i--) {
  79383. sp_digit mask = 0 - (t1[96 + i] == div);
  79384. sp_digit hi = t1[96 + i] + mask;
  79385. r1 = div_3072_word_96(hi, t1[96 + i - 1], div);
  79386. r1 |= mask;
  79387. sp_3072_mul_d_96(t2, d, r1);
  79388. t1[96 + i] += sp_3072_sub_in_place_96(&t1[i], t2);
  79389. t1[96 + i] -= t2[96];
  79390. sp_3072_mask_96(t2, d, t1[96 + i]);
  79391. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  79392. sp_3072_mask_96(t2, d, t1[96 + i]);
  79393. t1[96 + i] += sp_3072_add_96(&t1[i], &t1[i], t2);
  79394. }
  79395. r1 = sp_3072_cmp_96(t1, d) >= 0;
  79396. sp_3072_cond_sub_96(r, t1, d, (sp_digit)0 - r1);
  79397. return MP_OKAY;
  79398. }
  79399. /* Reduce a modulo m into r. (r = a mod m)
  79400. *
  79401. * r A single precision number that is the reduced result.
  79402. * a A single precision number that is to be reduced.
  79403. * m A single precision number that is the modulus to reduce with.
  79404. * returns MP_OKAY indicating success.
  79405. */
  79406. static WC_INLINE int sp_3072_mod_96(sp_digit* r, const sp_digit* a, const sp_digit* m)
  79407. {
  79408. int ret;
  79409. ret = sp_3072_div_96(a, m, NULL, r);
  79410. return ret;
  79411. }
  79412. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  79413. defined(WOLFSSL_HAVE_SP_DH)
  79414. #ifdef WOLFSSL_SP_SMALL
  79415. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  79416. *
  79417. * r A single precision number that is the result of the operation.
  79418. * a A single precision number being exponentiated.
  79419. * e A single precision number that is the exponent.
  79420. * bits The number of bits in the exponent.
  79421. * m A single precision number that is the modulus.
  79422. * returns 0 on success.
  79423. * returns MEMORY_E on dynamic memory allocation failure.
  79424. * returns MP_VAL when base is even or exponent is 0.
  79425. */
  79426. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  79427. int bits, const sp_digit* m, int reduceA)
  79428. {
  79429. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79430. sp_digit* td = NULL;
  79431. #else
  79432. sp_digit td[8 * 192];
  79433. #endif
  79434. sp_digit* t[8];
  79435. sp_digit* norm = NULL;
  79436. sp_digit mp = 1;
  79437. sp_digit n;
  79438. sp_digit mask;
  79439. int i;
  79440. int c;
  79441. byte y;
  79442. int err = MP_OKAY;
  79443. if (bits == 0) {
  79444. err = MP_VAL;
  79445. }
  79446. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79447. if (err == MP_OKAY) {
  79448. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 192), NULL,
  79449. DYNAMIC_TYPE_TMP_BUFFER);
  79450. if (td == NULL)
  79451. err = MEMORY_E;
  79452. }
  79453. #endif
  79454. if (err == MP_OKAY) {
  79455. norm = td;
  79456. for (i=0; i<8; i++) {
  79457. t[i] = td + i * 192;
  79458. }
  79459. sp_3072_mont_setup(m, &mp);
  79460. sp_3072_mont_norm_96(norm, m);
  79461. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  79462. if (reduceA != 0) {
  79463. err = sp_3072_mod_96(t[1] + 96, a, m);
  79464. if (err == MP_OKAY) {
  79465. err = sp_3072_mod_96(t[1], t[1], m);
  79466. }
  79467. }
  79468. else {
  79469. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  79470. err = sp_3072_mod_96(t[1], t[1], m);
  79471. }
  79472. }
  79473. if (err == MP_OKAY) {
  79474. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  79475. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  79476. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  79477. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  79478. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  79479. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  79480. i = (bits - 1) / 32;
  79481. n = e[i--];
  79482. c = bits & 31;
  79483. if (c == 0) {
  79484. c = 32;
  79485. }
  79486. c -= bits % 3;
  79487. if (c == 32) {
  79488. c = 29;
  79489. }
  79490. if (c < 0) {
  79491. /* Number of bits in top word is less than number needed. */
  79492. c = -c;
  79493. y = (byte)(n << c);
  79494. n = e[i--];
  79495. y |= (byte)(n >> (64 - c));
  79496. n <<= c;
  79497. c = 64 - c;
  79498. }
  79499. else if (c == 0) {
  79500. /* All bits in top word used. */
  79501. y = (byte)n;
  79502. }
  79503. else {
  79504. y = (byte)(n >> c);
  79505. n <<= 32 - c;
  79506. }
  79507. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  79508. for (; i>=0 || c>=3; ) {
  79509. if (c == 0) {
  79510. n = e[i--];
  79511. y = (byte)(n >> 29);
  79512. n <<= 3;
  79513. c = 29;
  79514. }
  79515. else if (c < 3) {
  79516. y = (byte)(n >> 29);
  79517. n = e[i--];
  79518. c = 3 - c;
  79519. y |= (byte)(n >> (32 - c));
  79520. n <<= c;
  79521. c = 32 - c;
  79522. }
  79523. else {
  79524. y = (byte)((n >> 29) & 0x7);
  79525. n <<= 3;
  79526. c -= 3;
  79527. }
  79528. sp_3072_mont_sqr_96(r, r, m, mp);
  79529. sp_3072_mont_sqr_96(r, r, m, mp);
  79530. sp_3072_mont_sqr_96(r, r, m, mp);
  79531. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  79532. }
  79533. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  79534. sp_3072_mont_reduce_96(r, m, mp);
  79535. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  79536. sp_3072_cond_sub_96(r, r, m, mask);
  79537. }
  79538. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79539. if (td != NULL)
  79540. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  79541. #endif
  79542. return err;
  79543. }
  79544. #else
  79545. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  79546. *
  79547. * r A single precision number that is the result of the operation.
  79548. * a A single precision number being exponentiated.
  79549. * e A single precision number that is the exponent.
  79550. * bits The number of bits in the exponent.
  79551. * m A single precision number that is the modulus.
  79552. * returns 0 on success.
  79553. * returns MEMORY_E on dynamic memory allocation failure.
  79554. * returns MP_VAL when base is even or exponent is 0.
  79555. */
  79556. static int sp_3072_mod_exp_96(sp_digit* r, const sp_digit* a, const sp_digit* e,
  79557. int bits, const sp_digit* m, int reduceA)
  79558. {
  79559. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79560. sp_digit* td = NULL;
  79561. #else
  79562. sp_digit td[16 * 192];
  79563. #endif
  79564. sp_digit* t[16];
  79565. sp_digit* norm = NULL;
  79566. sp_digit mp = 1;
  79567. sp_digit n;
  79568. sp_digit mask;
  79569. int i;
  79570. int c;
  79571. byte y;
  79572. int err = MP_OKAY;
  79573. if (bits == 0) {
  79574. err = MP_VAL;
  79575. }
  79576. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79577. if (err == MP_OKAY) {
  79578. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 192), NULL,
  79579. DYNAMIC_TYPE_TMP_BUFFER);
  79580. if (td == NULL)
  79581. err = MEMORY_E;
  79582. }
  79583. #endif
  79584. if (err == MP_OKAY) {
  79585. norm = td;
  79586. for (i=0; i<16; i++) {
  79587. t[i] = td + i * 192;
  79588. }
  79589. sp_3072_mont_setup(m, &mp);
  79590. sp_3072_mont_norm_96(norm, m);
  79591. XMEMSET(t[1], 0, sizeof(sp_digit) * 96U);
  79592. if (reduceA != 0) {
  79593. err = sp_3072_mod_96(t[1] + 96, a, m);
  79594. if (err == MP_OKAY) {
  79595. err = sp_3072_mod_96(t[1], t[1], m);
  79596. }
  79597. }
  79598. else {
  79599. XMEMCPY(t[1] + 96, a, sizeof(sp_digit) * 96);
  79600. err = sp_3072_mod_96(t[1], t[1], m);
  79601. }
  79602. }
  79603. if (err == MP_OKAY) {
  79604. sp_3072_mont_sqr_96(t[ 2], t[ 1], m, mp);
  79605. sp_3072_mont_mul_96(t[ 3], t[ 2], t[ 1], m, mp);
  79606. sp_3072_mont_sqr_96(t[ 4], t[ 2], m, mp);
  79607. sp_3072_mont_mul_96(t[ 5], t[ 3], t[ 2], m, mp);
  79608. sp_3072_mont_sqr_96(t[ 6], t[ 3], m, mp);
  79609. sp_3072_mont_mul_96(t[ 7], t[ 4], t[ 3], m, mp);
  79610. sp_3072_mont_sqr_96(t[ 8], t[ 4], m, mp);
  79611. sp_3072_mont_mul_96(t[ 9], t[ 5], t[ 4], m, mp);
  79612. sp_3072_mont_sqr_96(t[10], t[ 5], m, mp);
  79613. sp_3072_mont_mul_96(t[11], t[ 6], t[ 5], m, mp);
  79614. sp_3072_mont_sqr_96(t[12], t[ 6], m, mp);
  79615. sp_3072_mont_mul_96(t[13], t[ 7], t[ 6], m, mp);
  79616. sp_3072_mont_sqr_96(t[14], t[ 7], m, mp);
  79617. sp_3072_mont_mul_96(t[15], t[ 8], t[ 7], m, mp);
  79618. i = (bits - 1) / 32;
  79619. n = e[i--];
  79620. c = bits & 31;
  79621. if (c == 0) {
  79622. c = 32;
  79623. }
  79624. c -= bits % 4;
  79625. if (c == 32) {
  79626. c = 28;
  79627. }
  79628. if (c < 0) {
  79629. /* Number of bits in top word is less than number needed. */
  79630. c = -c;
  79631. y = (byte)(n << c);
  79632. n = e[i--];
  79633. y |= (byte)(n >> (64 - c));
  79634. n <<= c;
  79635. c = 64 - c;
  79636. }
  79637. else if (c == 0) {
  79638. /* All bits in top word used. */
  79639. y = (byte)n;
  79640. }
  79641. else {
  79642. y = (byte)(n >> c);
  79643. n <<= 32 - c;
  79644. }
  79645. XMEMCPY(r, t[y], sizeof(sp_digit) * 96);
  79646. for (; i>=0 || c>=4; ) {
  79647. if (c == 0) {
  79648. n = e[i--];
  79649. y = (byte)(n >> 28);
  79650. n <<= 4;
  79651. c = 28;
  79652. }
  79653. else if (c < 4) {
  79654. y = (byte)(n >> 28);
  79655. n = e[i--];
  79656. c = 4 - c;
  79657. y |= (byte)(n >> (32 - c));
  79658. n <<= c;
  79659. c = 32 - c;
  79660. }
  79661. else {
  79662. y = (byte)((n >> 28) & 0xf);
  79663. n <<= 4;
  79664. c -= 4;
  79665. }
  79666. sp_3072_mont_sqr_96(r, r, m, mp);
  79667. sp_3072_mont_sqr_96(r, r, m, mp);
  79668. sp_3072_mont_sqr_96(r, r, m, mp);
  79669. sp_3072_mont_sqr_96(r, r, m, mp);
  79670. sp_3072_mont_mul_96(r, r, t[y], m, mp);
  79671. }
  79672. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  79673. sp_3072_mont_reduce_96(r, m, mp);
  79674. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  79675. sp_3072_cond_sub_96(r, r, m, mask);
  79676. }
  79677. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79678. if (td != NULL)
  79679. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  79680. #endif
  79681. return err;
  79682. }
  79683. #endif /* WOLFSSL_SP_SMALL */
  79684. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  79685. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  79686. #ifdef WOLFSSL_HAVE_SP_RSA
  79687. /* RSA public key operation.
  79688. *
  79689. * in Array of bytes representing the number to exponentiate, base.
  79690. * inLen Number of bytes in base.
  79691. * em Public exponent.
  79692. * mm Modulus.
  79693. * out Buffer to hold big-endian bytes of exponentiation result.
  79694. * Must be at least 384 bytes long.
  79695. * outLen Number of bytes in result.
  79696. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  79697. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  79698. */
  79699. int sp_RsaPublic_3072(const byte* in, word32 inLen, const mp_int* em,
  79700. const mp_int* mm, byte* out, word32* outLen)
  79701. {
  79702. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79703. sp_digit* a = NULL;
  79704. #else
  79705. sp_digit a[96 * 5];
  79706. #endif
  79707. sp_digit* m = NULL;
  79708. sp_digit* r = NULL;
  79709. sp_digit *ah = NULL;
  79710. sp_digit e[1] = {0};
  79711. int err = MP_OKAY;
  79712. if (*outLen < 384) {
  79713. err = MP_TO_E;
  79714. }
  79715. else if (mp_count_bits(em) > 32 || inLen > 384 ||
  79716. mp_count_bits(mm) != 3072) {
  79717. err = MP_READ_E;
  79718. }
  79719. else if (mp_iseven(mm)) {
  79720. err = MP_VAL;
  79721. }
  79722. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79723. if (err == MP_OKAY) {
  79724. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 5, NULL,
  79725. DYNAMIC_TYPE_RSA);
  79726. if (a == NULL)
  79727. err = MEMORY_E;
  79728. }
  79729. #endif
  79730. if (err == MP_OKAY) {
  79731. ah = a + 96;
  79732. r = a + 96 * 2;
  79733. m = r + 96 * 2;
  79734. sp_3072_from_bin(ah, 96, in, inLen);
  79735. #if DIGIT_BIT >= 32
  79736. e[0] = em->dp[0];
  79737. #else
  79738. e[0] = em->dp[0];
  79739. if (em->used > 1) {
  79740. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  79741. }
  79742. #endif
  79743. if (e[0] == 0) {
  79744. err = MP_EXPTMOD_E;
  79745. }
  79746. }
  79747. if (err == MP_OKAY) {
  79748. sp_3072_from_mp(m, 96, mm);
  79749. if (e[0] == 0x10001) {
  79750. int i;
  79751. sp_digit mp;
  79752. sp_3072_mont_setup(m, &mp);
  79753. /* Convert to Montgomery form. */
  79754. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  79755. err = sp_3072_mod_96_cond(r, a, m);
  79756. /* Montgomery form: r = a.R mod m */
  79757. if (err == MP_OKAY) {
  79758. /* r = a ^ 0x10000 => r = a squared 16 times */
  79759. for (i = 15; i >= 0; i--) {
  79760. sp_3072_mont_sqr_96(r, r, m, mp);
  79761. }
  79762. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  79763. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  79764. */
  79765. sp_3072_mont_mul_96(r, r, ah, m, mp);
  79766. for (i = 95; i > 0; i--) {
  79767. if (r[i] != m[i]) {
  79768. break;
  79769. }
  79770. }
  79771. if (r[i] >= m[i]) {
  79772. sp_3072_sub_in_place_96(r, m);
  79773. }
  79774. }
  79775. }
  79776. else if (e[0] == 0x3) {
  79777. if (err == MP_OKAY) {
  79778. sp_3072_sqr_96(r, ah);
  79779. err = sp_3072_mod_96_cond(r, r, m);
  79780. }
  79781. if (err == MP_OKAY) {
  79782. sp_3072_mul_96(r, ah, r);
  79783. err = sp_3072_mod_96_cond(r, r, m);
  79784. }
  79785. }
  79786. else {
  79787. int i;
  79788. sp_digit mp;
  79789. sp_3072_mont_setup(m, &mp);
  79790. /* Convert to Montgomery form. */
  79791. XMEMSET(a, 0, sizeof(sp_digit) * 96);
  79792. err = sp_3072_mod_96_cond(a, a, m);
  79793. if (err == MP_OKAY) {
  79794. for (i = 31; i >= 0; i--) {
  79795. if (e[0] >> i) {
  79796. break;
  79797. }
  79798. }
  79799. XMEMCPY(r, a, sizeof(sp_digit) * 96);
  79800. for (i--; i >= 0; i--) {
  79801. sp_3072_mont_sqr_96(r, r, m, mp);
  79802. if (((e[0] >> i) & 1) == 1) {
  79803. sp_3072_mont_mul_96(r, r, a, m, mp);
  79804. }
  79805. }
  79806. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96);
  79807. sp_3072_mont_reduce_96(r, m, mp);
  79808. for (i = 95; i > 0; i--) {
  79809. if (r[i] != m[i]) {
  79810. break;
  79811. }
  79812. }
  79813. if (r[i] >= m[i]) {
  79814. sp_3072_sub_in_place_96(r, m);
  79815. }
  79816. }
  79817. }
  79818. }
  79819. if (err == MP_OKAY) {
  79820. sp_3072_to_bin_96(r, out);
  79821. *outLen = 384;
  79822. }
  79823. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79824. if (a != NULL)
  79825. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  79826. #endif
  79827. return err;
  79828. }
  79829. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  79830. /* Conditionally add a and b using the mask m.
  79831. * m is -1 to add and 0 when not.
  79832. *
  79833. * r A single precision number representing conditional add result.
  79834. * a A single precision number to add with.
  79835. * b A single precision number to add.
  79836. * m Mask value to apply.
  79837. */
  79838. SP_NOINLINE static sp_digit sp_3072_cond_add_48(sp_digit* r, const sp_digit* a,
  79839. const sp_digit* b, sp_digit m)
  79840. {
  79841. __asm__ __volatile__ (
  79842. "movs r4, #0\n\t"
  79843. "movs r5, #0xc0\n\t"
  79844. "mov r8, r5\n\t"
  79845. "movs r7, #0\n\t"
  79846. "\n"
  79847. "L_sp_3072_cond_add_48_words_%=:\n\t"
  79848. "ldr r6, [%[b], r7]\n\t"
  79849. #ifdef WOLFSSL_KEIL
  79850. "ands r6, r6, %[m]\n\t"
  79851. #elif defined(__clang__)
  79852. "ands r6, %[m]\n\t"
  79853. #else
  79854. "and r6, %[m]\n\t"
  79855. #endif
  79856. "movs r5, #0\n\t"
  79857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79858. "subs r5, r5, #1\n\t"
  79859. #else
  79860. "sub r5, r5, #1\n\t"
  79861. #endif
  79862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79863. "adds r5, r5, r4\n\t"
  79864. #else
  79865. "add r5, r5, r4\n\t"
  79866. #endif
  79867. "ldr r5, [%[a], r7]\n\t"
  79868. #ifdef WOLFSSL_KEIL
  79869. "adcs r5, r5, r6\n\t"
  79870. #elif defined(__clang__)
  79871. "adcs r5, r6\n\t"
  79872. #else
  79873. "adc r5, r6\n\t"
  79874. #endif
  79875. "movs r4, #0\n\t"
  79876. #ifdef WOLFSSL_KEIL
  79877. "adcs r4, r4, r4\n\t"
  79878. #elif defined(__clang__)
  79879. "adcs r4, r4\n\t"
  79880. #else
  79881. "adc r4, r4\n\t"
  79882. #endif
  79883. "str r5, [%[r], r7]\n\t"
  79884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  79885. "adds r7, r7, #4\n\t"
  79886. #else
  79887. "add r7, r7, #4\n\t"
  79888. #endif
  79889. "cmp r7, r8\n\t"
  79890. "blt L_sp_3072_cond_add_48_words_%=\n\t"
  79891. "movs %[r], r4\n\t"
  79892. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  79893. :
  79894. : "memory", "r4", "r5", "r6", "r7", "r8"
  79895. );
  79896. return (uint32_t)(size_t)r;
  79897. }
  79898. /* RSA private key operation.
  79899. *
  79900. * in Array of bytes representing the number to exponentiate, base.
  79901. * inLen Number of bytes in base.
  79902. * dm Private exponent.
  79903. * pm First prime.
  79904. * qm Second prime.
  79905. * dpm First prime's CRT exponent.
  79906. * dqm Second prime's CRT exponent.
  79907. * qim Inverse of second prime mod p.
  79908. * mm Modulus.
  79909. * out Buffer to hold big-endian bytes of exponentiation result.
  79910. * Must be at least 384 bytes long.
  79911. * outLen Number of bytes in result.
  79912. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  79913. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  79914. */
  79915. int sp_RsaPrivate_3072(const byte* in, word32 inLen, const mp_int* dm,
  79916. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  79917. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  79918. {
  79919. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  79920. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79921. sp_digit* d = NULL;
  79922. #else
  79923. sp_digit d[96 * 4];
  79924. #endif
  79925. sp_digit* a = NULL;
  79926. sp_digit* m = NULL;
  79927. sp_digit* r = NULL;
  79928. int err = MP_OKAY;
  79929. (void)pm;
  79930. (void)qm;
  79931. (void)dpm;
  79932. (void)dqm;
  79933. (void)qim;
  79934. if (*outLen < 384U) {
  79935. err = MP_TO_E;
  79936. }
  79937. if (err == MP_OKAY) {
  79938. if (mp_count_bits(dm) > 3072) {
  79939. err = MP_READ_E;
  79940. }
  79941. else if (inLen > 384) {
  79942. err = MP_READ_E;
  79943. }
  79944. else if (mp_count_bits(mm) != 3072) {
  79945. err = MP_READ_E;
  79946. }
  79947. else if (mp_iseven(mm)) {
  79948. err = MP_VAL;
  79949. }
  79950. }
  79951. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79952. if (err == MP_OKAY) {
  79953. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 96 * 4, NULL,
  79954. DYNAMIC_TYPE_RSA);
  79955. if (d == NULL)
  79956. err = MEMORY_E;
  79957. }
  79958. #endif
  79959. if (err == MP_OKAY) {
  79960. a = d + 96;
  79961. m = a + 192;
  79962. r = a;
  79963. sp_3072_from_bin(a, 96, in, inLen);
  79964. sp_3072_from_mp(d, 96, dm);
  79965. sp_3072_from_mp(m, 96, mm);
  79966. err = sp_3072_mod_exp_96(r, a, d, 3072, m, 0);
  79967. }
  79968. if (err == MP_OKAY) {
  79969. sp_3072_to_bin_96(r, out);
  79970. *outLen = 384;
  79971. }
  79972. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79973. if (d != NULL)
  79974. #endif
  79975. {
  79976. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  79977. if (a != NULL)
  79978. ForceZero(a, sizeof(sp_digit) * 96);
  79979. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79980. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  79981. #endif
  79982. }
  79983. return err;
  79984. #else
  79985. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  79986. sp_digit* a = NULL;
  79987. #else
  79988. sp_digit a[48 * 11];
  79989. #endif
  79990. sp_digit* p = NULL;
  79991. sp_digit* q = NULL;
  79992. sp_digit* dp = NULL;
  79993. sp_digit* tmpa = NULL;
  79994. sp_digit* tmpb = NULL;
  79995. sp_digit* r = NULL;
  79996. sp_digit* qi = NULL;
  79997. sp_digit* dq = NULL;
  79998. sp_digit c;
  79999. int err = MP_OKAY;
  80000. (void)dm;
  80001. (void)mm;
  80002. if (*outLen < 384) {
  80003. err = MP_TO_E;
  80004. }
  80005. else if (inLen > 384 || mp_count_bits(mm) != 3072) {
  80006. err = MP_READ_E;
  80007. }
  80008. else if (mp_iseven(mm)) {
  80009. err = MP_VAL;
  80010. }
  80011. else if (mp_iseven(pm)) {
  80012. err = MP_VAL;
  80013. }
  80014. else if (mp_iseven(qm)) {
  80015. err = MP_VAL;
  80016. }
  80017. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  80018. if (err == MP_OKAY) {
  80019. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 48 * 11, NULL,
  80020. DYNAMIC_TYPE_RSA);
  80021. if (a == NULL)
  80022. err = MEMORY_E;
  80023. }
  80024. #endif
  80025. if (err == MP_OKAY) {
  80026. p = a + 96 * 2;
  80027. q = p + 48;
  80028. qi = dq = dp = q + 48;
  80029. tmpa = qi + 48;
  80030. tmpb = tmpa + 96;
  80031. r = a;
  80032. sp_3072_from_bin(a, 96, in, inLen);
  80033. sp_3072_from_mp(p, 48, pm);
  80034. sp_3072_from_mp(q, 48, qm);
  80035. sp_3072_from_mp(dp, 48, dpm);
  80036. err = sp_3072_mod_exp_48(tmpa, a, dp, 1536, p, 1);
  80037. }
  80038. if (err == MP_OKAY) {
  80039. sp_3072_from_mp(dq, 48, dqm);
  80040. err = sp_3072_mod_exp_48(tmpb, a, dq, 1536, q, 1);
  80041. }
  80042. if (err == MP_OKAY) {
  80043. c = sp_3072_sub_in_place_48(tmpa, tmpb);
  80044. c += sp_3072_cond_add_48(tmpa, tmpa, p, c);
  80045. sp_3072_cond_add_48(tmpa, tmpa, p, c);
  80046. sp_3072_from_mp(qi, 48, qim);
  80047. sp_3072_mul_48(tmpa, tmpa, qi);
  80048. err = sp_3072_mod_48(tmpa, tmpa, p);
  80049. }
  80050. if (err == MP_OKAY) {
  80051. sp_3072_mul_48(tmpa, q, tmpa);
  80052. XMEMSET(&tmpb[48], 0, sizeof(sp_digit) * 48);
  80053. sp_3072_add_96(r, tmpb, tmpa);
  80054. sp_3072_to_bin_96(r, out);
  80055. *outLen = 384;
  80056. }
  80057. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  80058. if (a != NULL)
  80059. #endif
  80060. {
  80061. ForceZero(a, sizeof(sp_digit) * 48 * 11);
  80062. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  80063. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  80064. #endif
  80065. }
  80066. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  80067. return err;
  80068. }
  80069. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  80070. #endif /* WOLFSSL_HAVE_SP_RSA */
  80071. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  80072. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  80073. /* Convert an array of sp_digit to an mp_int.
  80074. *
  80075. * a A single precision integer.
  80076. * r A multi-precision integer.
  80077. */
  80078. static int sp_3072_to_mp(const sp_digit* a, mp_int* r)
  80079. {
  80080. int err;
  80081. err = mp_grow(r, (3072 + DIGIT_BIT - 1) / DIGIT_BIT);
  80082. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  80083. #if DIGIT_BIT == 32
  80084. XMEMCPY(r->dp, a, sizeof(sp_digit) * 96);
  80085. r->used = 96;
  80086. mp_clamp(r);
  80087. #elif DIGIT_BIT < 32
  80088. int i;
  80089. int j = 0;
  80090. int s = 0;
  80091. r->dp[0] = 0;
  80092. for (i = 0; i < 96; i++) {
  80093. r->dp[j] |= (mp_digit)(a[i] << s);
  80094. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  80095. s = DIGIT_BIT - s;
  80096. r->dp[++j] = (mp_digit)(a[i] >> s);
  80097. while (s + DIGIT_BIT <= 32) {
  80098. s += DIGIT_BIT;
  80099. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  80100. if (s == SP_WORD_SIZE) {
  80101. r->dp[j] = 0;
  80102. }
  80103. else {
  80104. r->dp[j] = (mp_digit)(a[i] >> s);
  80105. }
  80106. }
  80107. s = 32 - s;
  80108. }
  80109. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  80110. mp_clamp(r);
  80111. #else
  80112. int i;
  80113. int j = 0;
  80114. int s = 0;
  80115. r->dp[0] = 0;
  80116. for (i = 0; i < 96; i++) {
  80117. r->dp[j] |= ((mp_digit)a[i]) << s;
  80118. if (s + 32 >= DIGIT_BIT) {
  80119. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  80120. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  80121. #endif
  80122. s = DIGIT_BIT - s;
  80123. r->dp[++j] = a[i] >> s;
  80124. s = 32 - s;
  80125. }
  80126. else {
  80127. s += 32;
  80128. }
  80129. }
  80130. r->used = (3072 + DIGIT_BIT - 1) / DIGIT_BIT;
  80131. mp_clamp(r);
  80132. #endif
  80133. }
  80134. return err;
  80135. }
  80136. /* Perform the modular exponentiation for Diffie-Hellman.
  80137. *
  80138. * base Base. MP integer.
  80139. * exp Exponent. MP integer.
  80140. * mod Modulus. MP integer.
  80141. * res Result. MP integer.
  80142. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  80143. * and MEMORY_E if memory allocation fails.
  80144. */
  80145. int sp_ModExp_3072(const mp_int* base, const mp_int* exp, const mp_int* mod,
  80146. mp_int* res)
  80147. {
  80148. int err = MP_OKAY;
  80149. sp_digit b[192];
  80150. sp_digit e[96];
  80151. sp_digit m[96];
  80152. sp_digit* r = b;
  80153. int expBits = mp_count_bits(exp);
  80154. if (mp_count_bits(base) > 3072) {
  80155. err = MP_READ_E;
  80156. }
  80157. else if (expBits > 3072) {
  80158. err = MP_READ_E;
  80159. }
  80160. else if (mp_count_bits(mod) != 3072) {
  80161. err = MP_READ_E;
  80162. }
  80163. else if (mp_iseven(mod)) {
  80164. err = MP_VAL;
  80165. }
  80166. if (err == MP_OKAY) {
  80167. sp_3072_from_mp(b, 96, base);
  80168. sp_3072_from_mp(e, 96, exp);
  80169. sp_3072_from_mp(m, 96, mod);
  80170. err = sp_3072_mod_exp_96(r, b, e, expBits, m, 0);
  80171. }
  80172. if (err == MP_OKAY) {
  80173. err = sp_3072_to_mp(r, res);
  80174. }
  80175. XMEMSET(e, 0, sizeof(e));
  80176. return err;
  80177. }
  80178. #ifdef WOLFSSL_HAVE_SP_DH
  80179. #ifdef HAVE_FFDHE_3072
  80180. /* Lefy shift a by n bits into r. (r = a << n)
  80181. *
  80182. * r A single precision integer.
  80183. * a A single precision integer.
  80184. * n Integer representing number of bits to shift.
  80185. */
  80186. static void sp_3072_lshift_96(sp_digit* r, const sp_digit* a, byte n)
  80187. {
  80188. __asm__ __volatile__ (
  80189. "movs r7, #31\n\t"
  80190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80191. "subs r7, r7, %[n]\n\t"
  80192. #else
  80193. "sub r7, r7, %[n]\n\t"
  80194. #endif
  80195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80196. "adds %[a], %[a], #0xff\n\t"
  80197. #else
  80198. "add %[a], %[a], #0xff\n\t"
  80199. #endif
  80200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80201. "adds %[r], %[r], #0xff\n\t"
  80202. #else
  80203. "add %[r], %[r], #0xff\n\t"
  80204. #endif
  80205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80206. "adds %[a], %[a], #0x41\n\t"
  80207. #else
  80208. "add %[a], %[a], #0x41\n\t"
  80209. #endif
  80210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80211. "adds %[r], %[r], #0x41\n\t"
  80212. #else
  80213. "add %[r], %[r], #0x41\n\t"
  80214. #endif
  80215. "ldr r4, [%[a], #60]\n\t"
  80216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80217. "lsrs r5, r4, #1\n\t"
  80218. #else
  80219. "lsr r5, r4, #1\n\t"
  80220. #endif
  80221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80222. "lsls r4, r4, %[n]\n\t"
  80223. #else
  80224. "lsl r4, r4, %[n]\n\t"
  80225. #endif
  80226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80227. "lsrs r5, r5, r7\n\t"
  80228. #else
  80229. "lsr r5, r5, r7\n\t"
  80230. #endif
  80231. "ldr r3, [%[a], #56]\n\t"
  80232. "str r5, [%[r], #64]\n\t"
  80233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80234. "lsrs r6, r3, #1\n\t"
  80235. #else
  80236. "lsr r6, r3, #1\n\t"
  80237. #endif
  80238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80239. "lsls r3, r3, %[n]\n\t"
  80240. #else
  80241. "lsl r3, r3, %[n]\n\t"
  80242. #endif
  80243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80244. "lsrs r6, r6, r7\n\t"
  80245. #else
  80246. "lsr r6, r6, r7\n\t"
  80247. #endif
  80248. #ifdef WOLFSSL_KEIL
  80249. "orrs r4, r4, r6\n\t"
  80250. #elif defined(__clang__)
  80251. "orrs r4, r6\n\t"
  80252. #else
  80253. "orr r4, r6\n\t"
  80254. #endif
  80255. "ldr r5, [%[a], #52]\n\t"
  80256. "str r4, [%[r], #60]\n\t"
  80257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80258. "lsrs r6, r5, #1\n\t"
  80259. #else
  80260. "lsr r6, r5, #1\n\t"
  80261. #endif
  80262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80263. "lsls r5, r5, %[n]\n\t"
  80264. #else
  80265. "lsl r5, r5, %[n]\n\t"
  80266. #endif
  80267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80268. "lsrs r6, r6, r7\n\t"
  80269. #else
  80270. "lsr r6, r6, r7\n\t"
  80271. #endif
  80272. #ifdef WOLFSSL_KEIL
  80273. "orrs r3, r3, r6\n\t"
  80274. #elif defined(__clang__)
  80275. "orrs r3, r6\n\t"
  80276. #else
  80277. "orr r3, r6\n\t"
  80278. #endif
  80279. "ldr r4, [%[a], #48]\n\t"
  80280. "str r3, [%[r], #56]\n\t"
  80281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80282. "lsrs r6, r4, #1\n\t"
  80283. #else
  80284. "lsr r6, r4, #1\n\t"
  80285. #endif
  80286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80287. "lsls r4, r4, %[n]\n\t"
  80288. #else
  80289. "lsl r4, r4, %[n]\n\t"
  80290. #endif
  80291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80292. "lsrs r6, r6, r7\n\t"
  80293. #else
  80294. "lsr r6, r6, r7\n\t"
  80295. #endif
  80296. #ifdef WOLFSSL_KEIL
  80297. "orrs r5, r5, r6\n\t"
  80298. #elif defined(__clang__)
  80299. "orrs r5, r6\n\t"
  80300. #else
  80301. "orr r5, r6\n\t"
  80302. #endif
  80303. "ldr r3, [%[a], #44]\n\t"
  80304. "str r5, [%[r], #52]\n\t"
  80305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80306. "lsrs r6, r3, #1\n\t"
  80307. #else
  80308. "lsr r6, r3, #1\n\t"
  80309. #endif
  80310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80311. "lsls r3, r3, %[n]\n\t"
  80312. #else
  80313. "lsl r3, r3, %[n]\n\t"
  80314. #endif
  80315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80316. "lsrs r6, r6, r7\n\t"
  80317. #else
  80318. "lsr r6, r6, r7\n\t"
  80319. #endif
  80320. #ifdef WOLFSSL_KEIL
  80321. "orrs r4, r4, r6\n\t"
  80322. #elif defined(__clang__)
  80323. "orrs r4, r6\n\t"
  80324. #else
  80325. "orr r4, r6\n\t"
  80326. #endif
  80327. "ldr r5, [%[a], #40]\n\t"
  80328. "str r4, [%[r], #48]\n\t"
  80329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80330. "lsrs r6, r5, #1\n\t"
  80331. #else
  80332. "lsr r6, r5, #1\n\t"
  80333. #endif
  80334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80335. "lsls r5, r5, %[n]\n\t"
  80336. #else
  80337. "lsl r5, r5, %[n]\n\t"
  80338. #endif
  80339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80340. "lsrs r6, r6, r7\n\t"
  80341. #else
  80342. "lsr r6, r6, r7\n\t"
  80343. #endif
  80344. #ifdef WOLFSSL_KEIL
  80345. "orrs r3, r3, r6\n\t"
  80346. #elif defined(__clang__)
  80347. "orrs r3, r6\n\t"
  80348. #else
  80349. "orr r3, r6\n\t"
  80350. #endif
  80351. "ldr r4, [%[a], #36]\n\t"
  80352. "str r3, [%[r], #44]\n\t"
  80353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80354. "lsrs r6, r4, #1\n\t"
  80355. #else
  80356. "lsr r6, r4, #1\n\t"
  80357. #endif
  80358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80359. "lsls r4, r4, %[n]\n\t"
  80360. #else
  80361. "lsl r4, r4, %[n]\n\t"
  80362. #endif
  80363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80364. "lsrs r6, r6, r7\n\t"
  80365. #else
  80366. "lsr r6, r6, r7\n\t"
  80367. #endif
  80368. #ifdef WOLFSSL_KEIL
  80369. "orrs r5, r5, r6\n\t"
  80370. #elif defined(__clang__)
  80371. "orrs r5, r6\n\t"
  80372. #else
  80373. "orr r5, r6\n\t"
  80374. #endif
  80375. "ldr r3, [%[a], #32]\n\t"
  80376. "str r5, [%[r], #40]\n\t"
  80377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80378. "lsrs r6, r3, #1\n\t"
  80379. #else
  80380. "lsr r6, r3, #1\n\t"
  80381. #endif
  80382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80383. "lsls r3, r3, %[n]\n\t"
  80384. #else
  80385. "lsl r3, r3, %[n]\n\t"
  80386. #endif
  80387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80388. "lsrs r6, r6, r7\n\t"
  80389. #else
  80390. "lsr r6, r6, r7\n\t"
  80391. #endif
  80392. #ifdef WOLFSSL_KEIL
  80393. "orrs r4, r4, r6\n\t"
  80394. #elif defined(__clang__)
  80395. "orrs r4, r6\n\t"
  80396. #else
  80397. "orr r4, r6\n\t"
  80398. #endif
  80399. "ldr r5, [%[a], #28]\n\t"
  80400. "str r4, [%[r], #36]\n\t"
  80401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80402. "lsrs r6, r5, #1\n\t"
  80403. #else
  80404. "lsr r6, r5, #1\n\t"
  80405. #endif
  80406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80407. "lsls r5, r5, %[n]\n\t"
  80408. #else
  80409. "lsl r5, r5, %[n]\n\t"
  80410. #endif
  80411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80412. "lsrs r6, r6, r7\n\t"
  80413. #else
  80414. "lsr r6, r6, r7\n\t"
  80415. #endif
  80416. #ifdef WOLFSSL_KEIL
  80417. "orrs r3, r3, r6\n\t"
  80418. #elif defined(__clang__)
  80419. "orrs r3, r6\n\t"
  80420. #else
  80421. "orr r3, r6\n\t"
  80422. #endif
  80423. "ldr r4, [%[a], #24]\n\t"
  80424. "str r3, [%[r], #32]\n\t"
  80425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80426. "lsrs r6, r4, #1\n\t"
  80427. #else
  80428. "lsr r6, r4, #1\n\t"
  80429. #endif
  80430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80431. "lsls r4, r4, %[n]\n\t"
  80432. #else
  80433. "lsl r4, r4, %[n]\n\t"
  80434. #endif
  80435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80436. "lsrs r6, r6, r7\n\t"
  80437. #else
  80438. "lsr r6, r6, r7\n\t"
  80439. #endif
  80440. #ifdef WOLFSSL_KEIL
  80441. "orrs r5, r5, r6\n\t"
  80442. #elif defined(__clang__)
  80443. "orrs r5, r6\n\t"
  80444. #else
  80445. "orr r5, r6\n\t"
  80446. #endif
  80447. "ldr r3, [%[a], #20]\n\t"
  80448. "str r5, [%[r], #28]\n\t"
  80449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80450. "lsrs r6, r3, #1\n\t"
  80451. #else
  80452. "lsr r6, r3, #1\n\t"
  80453. #endif
  80454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80455. "lsls r3, r3, %[n]\n\t"
  80456. #else
  80457. "lsl r3, r3, %[n]\n\t"
  80458. #endif
  80459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80460. "lsrs r6, r6, r7\n\t"
  80461. #else
  80462. "lsr r6, r6, r7\n\t"
  80463. #endif
  80464. #ifdef WOLFSSL_KEIL
  80465. "orrs r4, r4, r6\n\t"
  80466. #elif defined(__clang__)
  80467. "orrs r4, r6\n\t"
  80468. #else
  80469. "orr r4, r6\n\t"
  80470. #endif
  80471. "ldr r5, [%[a], #16]\n\t"
  80472. "str r4, [%[r], #24]\n\t"
  80473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80474. "lsrs r6, r5, #1\n\t"
  80475. #else
  80476. "lsr r6, r5, #1\n\t"
  80477. #endif
  80478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80479. "lsls r5, r5, %[n]\n\t"
  80480. #else
  80481. "lsl r5, r5, %[n]\n\t"
  80482. #endif
  80483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80484. "lsrs r6, r6, r7\n\t"
  80485. #else
  80486. "lsr r6, r6, r7\n\t"
  80487. #endif
  80488. #ifdef WOLFSSL_KEIL
  80489. "orrs r3, r3, r6\n\t"
  80490. #elif defined(__clang__)
  80491. "orrs r3, r6\n\t"
  80492. #else
  80493. "orr r3, r6\n\t"
  80494. #endif
  80495. "ldr r4, [%[a], #12]\n\t"
  80496. "str r3, [%[r], #20]\n\t"
  80497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80498. "lsrs r6, r4, #1\n\t"
  80499. #else
  80500. "lsr r6, r4, #1\n\t"
  80501. #endif
  80502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80503. "lsls r4, r4, %[n]\n\t"
  80504. #else
  80505. "lsl r4, r4, %[n]\n\t"
  80506. #endif
  80507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80508. "lsrs r6, r6, r7\n\t"
  80509. #else
  80510. "lsr r6, r6, r7\n\t"
  80511. #endif
  80512. #ifdef WOLFSSL_KEIL
  80513. "orrs r5, r5, r6\n\t"
  80514. #elif defined(__clang__)
  80515. "orrs r5, r6\n\t"
  80516. #else
  80517. "orr r5, r6\n\t"
  80518. #endif
  80519. "ldr r3, [%[a], #8]\n\t"
  80520. "str r5, [%[r], #16]\n\t"
  80521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80522. "lsrs r6, r3, #1\n\t"
  80523. #else
  80524. "lsr r6, r3, #1\n\t"
  80525. #endif
  80526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80527. "lsls r3, r3, %[n]\n\t"
  80528. #else
  80529. "lsl r3, r3, %[n]\n\t"
  80530. #endif
  80531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80532. "lsrs r6, r6, r7\n\t"
  80533. #else
  80534. "lsr r6, r6, r7\n\t"
  80535. #endif
  80536. #ifdef WOLFSSL_KEIL
  80537. "orrs r4, r4, r6\n\t"
  80538. #elif defined(__clang__)
  80539. "orrs r4, r6\n\t"
  80540. #else
  80541. "orr r4, r6\n\t"
  80542. #endif
  80543. "ldr r5, [%[a], #4]\n\t"
  80544. "str r4, [%[r], #12]\n\t"
  80545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80546. "lsrs r6, r5, #1\n\t"
  80547. #else
  80548. "lsr r6, r5, #1\n\t"
  80549. #endif
  80550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80551. "lsls r5, r5, %[n]\n\t"
  80552. #else
  80553. "lsl r5, r5, %[n]\n\t"
  80554. #endif
  80555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80556. "lsrs r6, r6, r7\n\t"
  80557. #else
  80558. "lsr r6, r6, r7\n\t"
  80559. #endif
  80560. #ifdef WOLFSSL_KEIL
  80561. "orrs r3, r3, r6\n\t"
  80562. #elif defined(__clang__)
  80563. "orrs r3, r6\n\t"
  80564. #else
  80565. "orr r3, r6\n\t"
  80566. #endif
  80567. "ldr r4, [%[a]]\n\t"
  80568. "str r3, [%[r], #8]\n\t"
  80569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80570. "lsrs r6, r4, #1\n\t"
  80571. #else
  80572. "lsr r6, r4, #1\n\t"
  80573. #endif
  80574. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80575. "lsls r4, r4, %[n]\n\t"
  80576. #else
  80577. "lsl r4, r4, %[n]\n\t"
  80578. #endif
  80579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80580. "lsrs r6, r6, r7\n\t"
  80581. #else
  80582. "lsr r6, r6, r7\n\t"
  80583. #endif
  80584. #ifdef WOLFSSL_KEIL
  80585. "orrs r5, r5, r6\n\t"
  80586. #elif defined(__clang__)
  80587. "orrs r5, r6\n\t"
  80588. #else
  80589. "orr r5, r6\n\t"
  80590. #endif
  80591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80592. "subs %[a], %[a], #0x40\n\t"
  80593. #else
  80594. "sub %[a], %[a], #0x40\n\t"
  80595. #endif
  80596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80597. "subs %[r], %[r], #0x40\n\t"
  80598. #else
  80599. "sub %[r], %[r], #0x40\n\t"
  80600. #endif
  80601. "ldr r3, [%[a], #60]\n\t"
  80602. "str r5, [%[r], #68]\n\t"
  80603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80604. "lsrs r6, r3, #1\n\t"
  80605. #else
  80606. "lsr r6, r3, #1\n\t"
  80607. #endif
  80608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80609. "lsls r3, r3, %[n]\n\t"
  80610. #else
  80611. "lsl r3, r3, %[n]\n\t"
  80612. #endif
  80613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80614. "lsrs r6, r6, r7\n\t"
  80615. #else
  80616. "lsr r6, r6, r7\n\t"
  80617. #endif
  80618. #ifdef WOLFSSL_KEIL
  80619. "orrs r4, r4, r6\n\t"
  80620. #elif defined(__clang__)
  80621. "orrs r4, r6\n\t"
  80622. #else
  80623. "orr r4, r6\n\t"
  80624. #endif
  80625. "ldr r5, [%[a], #56]\n\t"
  80626. "str r4, [%[r], #64]\n\t"
  80627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80628. "lsrs r6, r5, #1\n\t"
  80629. #else
  80630. "lsr r6, r5, #1\n\t"
  80631. #endif
  80632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80633. "lsls r5, r5, %[n]\n\t"
  80634. #else
  80635. "lsl r5, r5, %[n]\n\t"
  80636. #endif
  80637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80638. "lsrs r6, r6, r7\n\t"
  80639. #else
  80640. "lsr r6, r6, r7\n\t"
  80641. #endif
  80642. #ifdef WOLFSSL_KEIL
  80643. "orrs r3, r3, r6\n\t"
  80644. #elif defined(__clang__)
  80645. "orrs r3, r6\n\t"
  80646. #else
  80647. "orr r3, r6\n\t"
  80648. #endif
  80649. "ldr r4, [%[a], #52]\n\t"
  80650. "str r3, [%[r], #60]\n\t"
  80651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80652. "lsrs r6, r4, #1\n\t"
  80653. #else
  80654. "lsr r6, r4, #1\n\t"
  80655. #endif
  80656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80657. "lsls r4, r4, %[n]\n\t"
  80658. #else
  80659. "lsl r4, r4, %[n]\n\t"
  80660. #endif
  80661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80662. "lsrs r6, r6, r7\n\t"
  80663. #else
  80664. "lsr r6, r6, r7\n\t"
  80665. #endif
  80666. #ifdef WOLFSSL_KEIL
  80667. "orrs r5, r5, r6\n\t"
  80668. #elif defined(__clang__)
  80669. "orrs r5, r6\n\t"
  80670. #else
  80671. "orr r5, r6\n\t"
  80672. #endif
  80673. "ldr r3, [%[a], #48]\n\t"
  80674. "str r5, [%[r], #56]\n\t"
  80675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80676. "lsrs r6, r3, #1\n\t"
  80677. #else
  80678. "lsr r6, r3, #1\n\t"
  80679. #endif
  80680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80681. "lsls r3, r3, %[n]\n\t"
  80682. #else
  80683. "lsl r3, r3, %[n]\n\t"
  80684. #endif
  80685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80686. "lsrs r6, r6, r7\n\t"
  80687. #else
  80688. "lsr r6, r6, r7\n\t"
  80689. #endif
  80690. #ifdef WOLFSSL_KEIL
  80691. "orrs r4, r4, r6\n\t"
  80692. #elif defined(__clang__)
  80693. "orrs r4, r6\n\t"
  80694. #else
  80695. "orr r4, r6\n\t"
  80696. #endif
  80697. "ldr r5, [%[a], #44]\n\t"
  80698. "str r4, [%[r], #52]\n\t"
  80699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80700. "lsrs r6, r5, #1\n\t"
  80701. #else
  80702. "lsr r6, r5, #1\n\t"
  80703. #endif
  80704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80705. "lsls r5, r5, %[n]\n\t"
  80706. #else
  80707. "lsl r5, r5, %[n]\n\t"
  80708. #endif
  80709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80710. "lsrs r6, r6, r7\n\t"
  80711. #else
  80712. "lsr r6, r6, r7\n\t"
  80713. #endif
  80714. #ifdef WOLFSSL_KEIL
  80715. "orrs r3, r3, r6\n\t"
  80716. #elif defined(__clang__)
  80717. "orrs r3, r6\n\t"
  80718. #else
  80719. "orr r3, r6\n\t"
  80720. #endif
  80721. "ldr r4, [%[a], #40]\n\t"
  80722. "str r3, [%[r], #48]\n\t"
  80723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80724. "lsrs r6, r4, #1\n\t"
  80725. #else
  80726. "lsr r6, r4, #1\n\t"
  80727. #endif
  80728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80729. "lsls r4, r4, %[n]\n\t"
  80730. #else
  80731. "lsl r4, r4, %[n]\n\t"
  80732. #endif
  80733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80734. "lsrs r6, r6, r7\n\t"
  80735. #else
  80736. "lsr r6, r6, r7\n\t"
  80737. #endif
  80738. #ifdef WOLFSSL_KEIL
  80739. "orrs r5, r5, r6\n\t"
  80740. #elif defined(__clang__)
  80741. "orrs r5, r6\n\t"
  80742. #else
  80743. "orr r5, r6\n\t"
  80744. #endif
  80745. "ldr r3, [%[a], #36]\n\t"
  80746. "str r5, [%[r], #44]\n\t"
  80747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80748. "lsrs r6, r3, #1\n\t"
  80749. #else
  80750. "lsr r6, r3, #1\n\t"
  80751. #endif
  80752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80753. "lsls r3, r3, %[n]\n\t"
  80754. #else
  80755. "lsl r3, r3, %[n]\n\t"
  80756. #endif
  80757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80758. "lsrs r6, r6, r7\n\t"
  80759. #else
  80760. "lsr r6, r6, r7\n\t"
  80761. #endif
  80762. #ifdef WOLFSSL_KEIL
  80763. "orrs r4, r4, r6\n\t"
  80764. #elif defined(__clang__)
  80765. "orrs r4, r6\n\t"
  80766. #else
  80767. "orr r4, r6\n\t"
  80768. #endif
  80769. "ldr r5, [%[a], #32]\n\t"
  80770. "str r4, [%[r], #40]\n\t"
  80771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80772. "lsrs r6, r5, #1\n\t"
  80773. #else
  80774. "lsr r6, r5, #1\n\t"
  80775. #endif
  80776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80777. "lsls r5, r5, %[n]\n\t"
  80778. #else
  80779. "lsl r5, r5, %[n]\n\t"
  80780. #endif
  80781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80782. "lsrs r6, r6, r7\n\t"
  80783. #else
  80784. "lsr r6, r6, r7\n\t"
  80785. #endif
  80786. #ifdef WOLFSSL_KEIL
  80787. "orrs r3, r3, r6\n\t"
  80788. #elif defined(__clang__)
  80789. "orrs r3, r6\n\t"
  80790. #else
  80791. "orr r3, r6\n\t"
  80792. #endif
  80793. "ldr r4, [%[a], #28]\n\t"
  80794. "str r3, [%[r], #36]\n\t"
  80795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80796. "lsrs r6, r4, #1\n\t"
  80797. #else
  80798. "lsr r6, r4, #1\n\t"
  80799. #endif
  80800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80801. "lsls r4, r4, %[n]\n\t"
  80802. #else
  80803. "lsl r4, r4, %[n]\n\t"
  80804. #endif
  80805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80806. "lsrs r6, r6, r7\n\t"
  80807. #else
  80808. "lsr r6, r6, r7\n\t"
  80809. #endif
  80810. #ifdef WOLFSSL_KEIL
  80811. "orrs r5, r5, r6\n\t"
  80812. #elif defined(__clang__)
  80813. "orrs r5, r6\n\t"
  80814. #else
  80815. "orr r5, r6\n\t"
  80816. #endif
  80817. "ldr r3, [%[a], #24]\n\t"
  80818. "str r5, [%[r], #32]\n\t"
  80819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80820. "lsrs r6, r3, #1\n\t"
  80821. #else
  80822. "lsr r6, r3, #1\n\t"
  80823. #endif
  80824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80825. "lsls r3, r3, %[n]\n\t"
  80826. #else
  80827. "lsl r3, r3, %[n]\n\t"
  80828. #endif
  80829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80830. "lsrs r6, r6, r7\n\t"
  80831. #else
  80832. "lsr r6, r6, r7\n\t"
  80833. #endif
  80834. #ifdef WOLFSSL_KEIL
  80835. "orrs r4, r4, r6\n\t"
  80836. #elif defined(__clang__)
  80837. "orrs r4, r6\n\t"
  80838. #else
  80839. "orr r4, r6\n\t"
  80840. #endif
  80841. "ldr r5, [%[a], #20]\n\t"
  80842. "str r4, [%[r], #28]\n\t"
  80843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80844. "lsrs r6, r5, #1\n\t"
  80845. #else
  80846. "lsr r6, r5, #1\n\t"
  80847. #endif
  80848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80849. "lsls r5, r5, %[n]\n\t"
  80850. #else
  80851. "lsl r5, r5, %[n]\n\t"
  80852. #endif
  80853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80854. "lsrs r6, r6, r7\n\t"
  80855. #else
  80856. "lsr r6, r6, r7\n\t"
  80857. #endif
  80858. #ifdef WOLFSSL_KEIL
  80859. "orrs r3, r3, r6\n\t"
  80860. #elif defined(__clang__)
  80861. "orrs r3, r6\n\t"
  80862. #else
  80863. "orr r3, r6\n\t"
  80864. #endif
  80865. "ldr r4, [%[a], #16]\n\t"
  80866. "str r3, [%[r], #24]\n\t"
  80867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80868. "lsrs r6, r4, #1\n\t"
  80869. #else
  80870. "lsr r6, r4, #1\n\t"
  80871. #endif
  80872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80873. "lsls r4, r4, %[n]\n\t"
  80874. #else
  80875. "lsl r4, r4, %[n]\n\t"
  80876. #endif
  80877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80878. "lsrs r6, r6, r7\n\t"
  80879. #else
  80880. "lsr r6, r6, r7\n\t"
  80881. #endif
  80882. #ifdef WOLFSSL_KEIL
  80883. "orrs r5, r5, r6\n\t"
  80884. #elif defined(__clang__)
  80885. "orrs r5, r6\n\t"
  80886. #else
  80887. "orr r5, r6\n\t"
  80888. #endif
  80889. "ldr r3, [%[a], #12]\n\t"
  80890. "str r5, [%[r], #20]\n\t"
  80891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80892. "lsrs r6, r3, #1\n\t"
  80893. #else
  80894. "lsr r6, r3, #1\n\t"
  80895. #endif
  80896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80897. "lsls r3, r3, %[n]\n\t"
  80898. #else
  80899. "lsl r3, r3, %[n]\n\t"
  80900. #endif
  80901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80902. "lsrs r6, r6, r7\n\t"
  80903. #else
  80904. "lsr r6, r6, r7\n\t"
  80905. #endif
  80906. #ifdef WOLFSSL_KEIL
  80907. "orrs r4, r4, r6\n\t"
  80908. #elif defined(__clang__)
  80909. "orrs r4, r6\n\t"
  80910. #else
  80911. "orr r4, r6\n\t"
  80912. #endif
  80913. "ldr r5, [%[a], #8]\n\t"
  80914. "str r4, [%[r], #16]\n\t"
  80915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80916. "lsrs r6, r5, #1\n\t"
  80917. #else
  80918. "lsr r6, r5, #1\n\t"
  80919. #endif
  80920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80921. "lsls r5, r5, %[n]\n\t"
  80922. #else
  80923. "lsl r5, r5, %[n]\n\t"
  80924. #endif
  80925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80926. "lsrs r6, r6, r7\n\t"
  80927. #else
  80928. "lsr r6, r6, r7\n\t"
  80929. #endif
  80930. #ifdef WOLFSSL_KEIL
  80931. "orrs r3, r3, r6\n\t"
  80932. #elif defined(__clang__)
  80933. "orrs r3, r6\n\t"
  80934. #else
  80935. "orr r3, r6\n\t"
  80936. #endif
  80937. "ldr r4, [%[a], #4]\n\t"
  80938. "str r3, [%[r], #12]\n\t"
  80939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80940. "lsrs r6, r4, #1\n\t"
  80941. #else
  80942. "lsr r6, r4, #1\n\t"
  80943. #endif
  80944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80945. "lsls r4, r4, %[n]\n\t"
  80946. #else
  80947. "lsl r4, r4, %[n]\n\t"
  80948. #endif
  80949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80950. "lsrs r6, r6, r7\n\t"
  80951. #else
  80952. "lsr r6, r6, r7\n\t"
  80953. #endif
  80954. #ifdef WOLFSSL_KEIL
  80955. "orrs r5, r5, r6\n\t"
  80956. #elif defined(__clang__)
  80957. "orrs r5, r6\n\t"
  80958. #else
  80959. "orr r5, r6\n\t"
  80960. #endif
  80961. "ldr r3, [%[a]]\n\t"
  80962. "str r5, [%[r], #8]\n\t"
  80963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80964. "lsrs r6, r3, #1\n\t"
  80965. #else
  80966. "lsr r6, r3, #1\n\t"
  80967. #endif
  80968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80969. "lsls r3, r3, %[n]\n\t"
  80970. #else
  80971. "lsl r3, r3, %[n]\n\t"
  80972. #endif
  80973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80974. "lsrs r6, r6, r7\n\t"
  80975. #else
  80976. "lsr r6, r6, r7\n\t"
  80977. #endif
  80978. #ifdef WOLFSSL_KEIL
  80979. "orrs r4, r4, r6\n\t"
  80980. #elif defined(__clang__)
  80981. "orrs r4, r6\n\t"
  80982. #else
  80983. "orr r4, r6\n\t"
  80984. #endif
  80985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80986. "subs %[a], %[a], #0x40\n\t"
  80987. #else
  80988. "sub %[a], %[a], #0x40\n\t"
  80989. #endif
  80990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80991. "subs %[r], %[r], #0x40\n\t"
  80992. #else
  80993. "sub %[r], %[r], #0x40\n\t"
  80994. #endif
  80995. "ldr r5, [%[a], #60]\n\t"
  80996. "str r4, [%[r], #68]\n\t"
  80997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  80998. "lsrs r6, r5, #1\n\t"
  80999. #else
  81000. "lsr r6, r5, #1\n\t"
  81001. #endif
  81002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81003. "lsls r5, r5, %[n]\n\t"
  81004. #else
  81005. "lsl r5, r5, %[n]\n\t"
  81006. #endif
  81007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81008. "lsrs r6, r6, r7\n\t"
  81009. #else
  81010. "lsr r6, r6, r7\n\t"
  81011. #endif
  81012. #ifdef WOLFSSL_KEIL
  81013. "orrs r3, r3, r6\n\t"
  81014. #elif defined(__clang__)
  81015. "orrs r3, r6\n\t"
  81016. #else
  81017. "orr r3, r6\n\t"
  81018. #endif
  81019. "ldr r4, [%[a], #56]\n\t"
  81020. "str r3, [%[r], #64]\n\t"
  81021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81022. "lsrs r6, r4, #1\n\t"
  81023. #else
  81024. "lsr r6, r4, #1\n\t"
  81025. #endif
  81026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81027. "lsls r4, r4, %[n]\n\t"
  81028. #else
  81029. "lsl r4, r4, %[n]\n\t"
  81030. #endif
  81031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81032. "lsrs r6, r6, r7\n\t"
  81033. #else
  81034. "lsr r6, r6, r7\n\t"
  81035. #endif
  81036. #ifdef WOLFSSL_KEIL
  81037. "orrs r5, r5, r6\n\t"
  81038. #elif defined(__clang__)
  81039. "orrs r5, r6\n\t"
  81040. #else
  81041. "orr r5, r6\n\t"
  81042. #endif
  81043. "ldr r3, [%[a], #52]\n\t"
  81044. "str r5, [%[r], #60]\n\t"
  81045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81046. "lsrs r6, r3, #1\n\t"
  81047. #else
  81048. "lsr r6, r3, #1\n\t"
  81049. #endif
  81050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81051. "lsls r3, r3, %[n]\n\t"
  81052. #else
  81053. "lsl r3, r3, %[n]\n\t"
  81054. #endif
  81055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81056. "lsrs r6, r6, r7\n\t"
  81057. #else
  81058. "lsr r6, r6, r7\n\t"
  81059. #endif
  81060. #ifdef WOLFSSL_KEIL
  81061. "orrs r4, r4, r6\n\t"
  81062. #elif defined(__clang__)
  81063. "orrs r4, r6\n\t"
  81064. #else
  81065. "orr r4, r6\n\t"
  81066. #endif
  81067. "ldr r5, [%[a], #48]\n\t"
  81068. "str r4, [%[r], #56]\n\t"
  81069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81070. "lsrs r6, r5, #1\n\t"
  81071. #else
  81072. "lsr r6, r5, #1\n\t"
  81073. #endif
  81074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81075. "lsls r5, r5, %[n]\n\t"
  81076. #else
  81077. "lsl r5, r5, %[n]\n\t"
  81078. #endif
  81079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81080. "lsrs r6, r6, r7\n\t"
  81081. #else
  81082. "lsr r6, r6, r7\n\t"
  81083. #endif
  81084. #ifdef WOLFSSL_KEIL
  81085. "orrs r3, r3, r6\n\t"
  81086. #elif defined(__clang__)
  81087. "orrs r3, r6\n\t"
  81088. #else
  81089. "orr r3, r6\n\t"
  81090. #endif
  81091. "ldr r4, [%[a], #44]\n\t"
  81092. "str r3, [%[r], #52]\n\t"
  81093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81094. "lsrs r6, r4, #1\n\t"
  81095. #else
  81096. "lsr r6, r4, #1\n\t"
  81097. #endif
  81098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81099. "lsls r4, r4, %[n]\n\t"
  81100. #else
  81101. "lsl r4, r4, %[n]\n\t"
  81102. #endif
  81103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81104. "lsrs r6, r6, r7\n\t"
  81105. #else
  81106. "lsr r6, r6, r7\n\t"
  81107. #endif
  81108. #ifdef WOLFSSL_KEIL
  81109. "orrs r5, r5, r6\n\t"
  81110. #elif defined(__clang__)
  81111. "orrs r5, r6\n\t"
  81112. #else
  81113. "orr r5, r6\n\t"
  81114. #endif
  81115. "ldr r3, [%[a], #40]\n\t"
  81116. "str r5, [%[r], #48]\n\t"
  81117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81118. "lsrs r6, r3, #1\n\t"
  81119. #else
  81120. "lsr r6, r3, #1\n\t"
  81121. #endif
  81122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81123. "lsls r3, r3, %[n]\n\t"
  81124. #else
  81125. "lsl r3, r3, %[n]\n\t"
  81126. #endif
  81127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81128. "lsrs r6, r6, r7\n\t"
  81129. #else
  81130. "lsr r6, r6, r7\n\t"
  81131. #endif
  81132. #ifdef WOLFSSL_KEIL
  81133. "orrs r4, r4, r6\n\t"
  81134. #elif defined(__clang__)
  81135. "orrs r4, r6\n\t"
  81136. #else
  81137. "orr r4, r6\n\t"
  81138. #endif
  81139. "ldr r5, [%[a], #36]\n\t"
  81140. "str r4, [%[r], #44]\n\t"
  81141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81142. "lsrs r6, r5, #1\n\t"
  81143. #else
  81144. "lsr r6, r5, #1\n\t"
  81145. #endif
  81146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81147. "lsls r5, r5, %[n]\n\t"
  81148. #else
  81149. "lsl r5, r5, %[n]\n\t"
  81150. #endif
  81151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81152. "lsrs r6, r6, r7\n\t"
  81153. #else
  81154. "lsr r6, r6, r7\n\t"
  81155. #endif
  81156. #ifdef WOLFSSL_KEIL
  81157. "orrs r3, r3, r6\n\t"
  81158. #elif defined(__clang__)
  81159. "orrs r3, r6\n\t"
  81160. #else
  81161. "orr r3, r6\n\t"
  81162. #endif
  81163. "ldr r4, [%[a], #32]\n\t"
  81164. "str r3, [%[r], #40]\n\t"
  81165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81166. "lsrs r6, r4, #1\n\t"
  81167. #else
  81168. "lsr r6, r4, #1\n\t"
  81169. #endif
  81170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81171. "lsls r4, r4, %[n]\n\t"
  81172. #else
  81173. "lsl r4, r4, %[n]\n\t"
  81174. #endif
  81175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81176. "lsrs r6, r6, r7\n\t"
  81177. #else
  81178. "lsr r6, r6, r7\n\t"
  81179. #endif
  81180. #ifdef WOLFSSL_KEIL
  81181. "orrs r5, r5, r6\n\t"
  81182. #elif defined(__clang__)
  81183. "orrs r5, r6\n\t"
  81184. #else
  81185. "orr r5, r6\n\t"
  81186. #endif
  81187. "ldr r3, [%[a], #28]\n\t"
  81188. "str r5, [%[r], #36]\n\t"
  81189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81190. "lsrs r6, r3, #1\n\t"
  81191. #else
  81192. "lsr r6, r3, #1\n\t"
  81193. #endif
  81194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81195. "lsls r3, r3, %[n]\n\t"
  81196. #else
  81197. "lsl r3, r3, %[n]\n\t"
  81198. #endif
  81199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81200. "lsrs r6, r6, r7\n\t"
  81201. #else
  81202. "lsr r6, r6, r7\n\t"
  81203. #endif
  81204. #ifdef WOLFSSL_KEIL
  81205. "orrs r4, r4, r6\n\t"
  81206. #elif defined(__clang__)
  81207. "orrs r4, r6\n\t"
  81208. #else
  81209. "orr r4, r6\n\t"
  81210. #endif
  81211. "ldr r5, [%[a], #24]\n\t"
  81212. "str r4, [%[r], #32]\n\t"
  81213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81214. "lsrs r6, r5, #1\n\t"
  81215. #else
  81216. "lsr r6, r5, #1\n\t"
  81217. #endif
  81218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81219. "lsls r5, r5, %[n]\n\t"
  81220. #else
  81221. "lsl r5, r5, %[n]\n\t"
  81222. #endif
  81223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81224. "lsrs r6, r6, r7\n\t"
  81225. #else
  81226. "lsr r6, r6, r7\n\t"
  81227. #endif
  81228. #ifdef WOLFSSL_KEIL
  81229. "orrs r3, r3, r6\n\t"
  81230. #elif defined(__clang__)
  81231. "orrs r3, r6\n\t"
  81232. #else
  81233. "orr r3, r6\n\t"
  81234. #endif
  81235. "ldr r4, [%[a], #20]\n\t"
  81236. "str r3, [%[r], #28]\n\t"
  81237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81238. "lsrs r6, r4, #1\n\t"
  81239. #else
  81240. "lsr r6, r4, #1\n\t"
  81241. #endif
  81242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81243. "lsls r4, r4, %[n]\n\t"
  81244. #else
  81245. "lsl r4, r4, %[n]\n\t"
  81246. #endif
  81247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81248. "lsrs r6, r6, r7\n\t"
  81249. #else
  81250. "lsr r6, r6, r7\n\t"
  81251. #endif
  81252. #ifdef WOLFSSL_KEIL
  81253. "orrs r5, r5, r6\n\t"
  81254. #elif defined(__clang__)
  81255. "orrs r5, r6\n\t"
  81256. #else
  81257. "orr r5, r6\n\t"
  81258. #endif
  81259. "ldr r3, [%[a], #16]\n\t"
  81260. "str r5, [%[r], #24]\n\t"
  81261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81262. "lsrs r6, r3, #1\n\t"
  81263. #else
  81264. "lsr r6, r3, #1\n\t"
  81265. #endif
  81266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81267. "lsls r3, r3, %[n]\n\t"
  81268. #else
  81269. "lsl r3, r3, %[n]\n\t"
  81270. #endif
  81271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81272. "lsrs r6, r6, r7\n\t"
  81273. #else
  81274. "lsr r6, r6, r7\n\t"
  81275. #endif
  81276. #ifdef WOLFSSL_KEIL
  81277. "orrs r4, r4, r6\n\t"
  81278. #elif defined(__clang__)
  81279. "orrs r4, r6\n\t"
  81280. #else
  81281. "orr r4, r6\n\t"
  81282. #endif
  81283. "ldr r5, [%[a], #12]\n\t"
  81284. "str r4, [%[r], #20]\n\t"
  81285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81286. "lsrs r6, r5, #1\n\t"
  81287. #else
  81288. "lsr r6, r5, #1\n\t"
  81289. #endif
  81290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81291. "lsls r5, r5, %[n]\n\t"
  81292. #else
  81293. "lsl r5, r5, %[n]\n\t"
  81294. #endif
  81295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81296. "lsrs r6, r6, r7\n\t"
  81297. #else
  81298. "lsr r6, r6, r7\n\t"
  81299. #endif
  81300. #ifdef WOLFSSL_KEIL
  81301. "orrs r3, r3, r6\n\t"
  81302. #elif defined(__clang__)
  81303. "orrs r3, r6\n\t"
  81304. #else
  81305. "orr r3, r6\n\t"
  81306. #endif
  81307. "ldr r4, [%[a], #8]\n\t"
  81308. "str r3, [%[r], #16]\n\t"
  81309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81310. "lsrs r6, r4, #1\n\t"
  81311. #else
  81312. "lsr r6, r4, #1\n\t"
  81313. #endif
  81314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81315. "lsls r4, r4, %[n]\n\t"
  81316. #else
  81317. "lsl r4, r4, %[n]\n\t"
  81318. #endif
  81319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81320. "lsrs r6, r6, r7\n\t"
  81321. #else
  81322. "lsr r6, r6, r7\n\t"
  81323. #endif
  81324. #ifdef WOLFSSL_KEIL
  81325. "orrs r5, r5, r6\n\t"
  81326. #elif defined(__clang__)
  81327. "orrs r5, r6\n\t"
  81328. #else
  81329. "orr r5, r6\n\t"
  81330. #endif
  81331. "ldr r3, [%[a], #4]\n\t"
  81332. "str r5, [%[r], #12]\n\t"
  81333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81334. "lsrs r6, r3, #1\n\t"
  81335. #else
  81336. "lsr r6, r3, #1\n\t"
  81337. #endif
  81338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81339. "lsls r3, r3, %[n]\n\t"
  81340. #else
  81341. "lsl r3, r3, %[n]\n\t"
  81342. #endif
  81343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81344. "lsrs r6, r6, r7\n\t"
  81345. #else
  81346. "lsr r6, r6, r7\n\t"
  81347. #endif
  81348. #ifdef WOLFSSL_KEIL
  81349. "orrs r4, r4, r6\n\t"
  81350. #elif defined(__clang__)
  81351. "orrs r4, r6\n\t"
  81352. #else
  81353. "orr r4, r6\n\t"
  81354. #endif
  81355. "ldr r5, [%[a]]\n\t"
  81356. "str r4, [%[r], #8]\n\t"
  81357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81358. "lsrs r6, r5, #1\n\t"
  81359. #else
  81360. "lsr r6, r5, #1\n\t"
  81361. #endif
  81362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81363. "lsls r5, r5, %[n]\n\t"
  81364. #else
  81365. "lsl r5, r5, %[n]\n\t"
  81366. #endif
  81367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81368. "lsrs r6, r6, r7\n\t"
  81369. #else
  81370. "lsr r6, r6, r7\n\t"
  81371. #endif
  81372. #ifdef WOLFSSL_KEIL
  81373. "orrs r3, r3, r6\n\t"
  81374. #elif defined(__clang__)
  81375. "orrs r3, r6\n\t"
  81376. #else
  81377. "orr r3, r6\n\t"
  81378. #endif
  81379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81380. "subs %[a], %[a], #0x40\n\t"
  81381. #else
  81382. "sub %[a], %[a], #0x40\n\t"
  81383. #endif
  81384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81385. "subs %[r], %[r], #0x40\n\t"
  81386. #else
  81387. "sub %[r], %[r], #0x40\n\t"
  81388. #endif
  81389. "ldr r4, [%[a], #60]\n\t"
  81390. "str r3, [%[r], #68]\n\t"
  81391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81392. "lsrs r6, r4, #1\n\t"
  81393. #else
  81394. "lsr r6, r4, #1\n\t"
  81395. #endif
  81396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81397. "lsls r4, r4, %[n]\n\t"
  81398. #else
  81399. "lsl r4, r4, %[n]\n\t"
  81400. #endif
  81401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81402. "lsrs r6, r6, r7\n\t"
  81403. #else
  81404. "lsr r6, r6, r7\n\t"
  81405. #endif
  81406. #ifdef WOLFSSL_KEIL
  81407. "orrs r5, r5, r6\n\t"
  81408. #elif defined(__clang__)
  81409. "orrs r5, r6\n\t"
  81410. #else
  81411. "orr r5, r6\n\t"
  81412. #endif
  81413. "ldr r3, [%[a], #56]\n\t"
  81414. "str r5, [%[r], #64]\n\t"
  81415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81416. "lsrs r6, r3, #1\n\t"
  81417. #else
  81418. "lsr r6, r3, #1\n\t"
  81419. #endif
  81420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81421. "lsls r3, r3, %[n]\n\t"
  81422. #else
  81423. "lsl r3, r3, %[n]\n\t"
  81424. #endif
  81425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81426. "lsrs r6, r6, r7\n\t"
  81427. #else
  81428. "lsr r6, r6, r7\n\t"
  81429. #endif
  81430. #ifdef WOLFSSL_KEIL
  81431. "orrs r4, r4, r6\n\t"
  81432. #elif defined(__clang__)
  81433. "orrs r4, r6\n\t"
  81434. #else
  81435. "orr r4, r6\n\t"
  81436. #endif
  81437. "ldr r5, [%[a], #52]\n\t"
  81438. "str r4, [%[r], #60]\n\t"
  81439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81440. "lsrs r6, r5, #1\n\t"
  81441. #else
  81442. "lsr r6, r5, #1\n\t"
  81443. #endif
  81444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81445. "lsls r5, r5, %[n]\n\t"
  81446. #else
  81447. "lsl r5, r5, %[n]\n\t"
  81448. #endif
  81449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81450. "lsrs r6, r6, r7\n\t"
  81451. #else
  81452. "lsr r6, r6, r7\n\t"
  81453. #endif
  81454. #ifdef WOLFSSL_KEIL
  81455. "orrs r3, r3, r6\n\t"
  81456. #elif defined(__clang__)
  81457. "orrs r3, r6\n\t"
  81458. #else
  81459. "orr r3, r6\n\t"
  81460. #endif
  81461. "ldr r4, [%[a], #48]\n\t"
  81462. "str r3, [%[r], #56]\n\t"
  81463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81464. "lsrs r6, r4, #1\n\t"
  81465. #else
  81466. "lsr r6, r4, #1\n\t"
  81467. #endif
  81468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81469. "lsls r4, r4, %[n]\n\t"
  81470. #else
  81471. "lsl r4, r4, %[n]\n\t"
  81472. #endif
  81473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81474. "lsrs r6, r6, r7\n\t"
  81475. #else
  81476. "lsr r6, r6, r7\n\t"
  81477. #endif
  81478. #ifdef WOLFSSL_KEIL
  81479. "orrs r5, r5, r6\n\t"
  81480. #elif defined(__clang__)
  81481. "orrs r5, r6\n\t"
  81482. #else
  81483. "orr r5, r6\n\t"
  81484. #endif
  81485. "ldr r3, [%[a], #44]\n\t"
  81486. "str r5, [%[r], #52]\n\t"
  81487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81488. "lsrs r6, r3, #1\n\t"
  81489. #else
  81490. "lsr r6, r3, #1\n\t"
  81491. #endif
  81492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81493. "lsls r3, r3, %[n]\n\t"
  81494. #else
  81495. "lsl r3, r3, %[n]\n\t"
  81496. #endif
  81497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81498. "lsrs r6, r6, r7\n\t"
  81499. #else
  81500. "lsr r6, r6, r7\n\t"
  81501. #endif
  81502. #ifdef WOLFSSL_KEIL
  81503. "orrs r4, r4, r6\n\t"
  81504. #elif defined(__clang__)
  81505. "orrs r4, r6\n\t"
  81506. #else
  81507. "orr r4, r6\n\t"
  81508. #endif
  81509. "ldr r5, [%[a], #40]\n\t"
  81510. "str r4, [%[r], #48]\n\t"
  81511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81512. "lsrs r6, r5, #1\n\t"
  81513. #else
  81514. "lsr r6, r5, #1\n\t"
  81515. #endif
  81516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81517. "lsls r5, r5, %[n]\n\t"
  81518. #else
  81519. "lsl r5, r5, %[n]\n\t"
  81520. #endif
  81521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81522. "lsrs r6, r6, r7\n\t"
  81523. #else
  81524. "lsr r6, r6, r7\n\t"
  81525. #endif
  81526. #ifdef WOLFSSL_KEIL
  81527. "orrs r3, r3, r6\n\t"
  81528. #elif defined(__clang__)
  81529. "orrs r3, r6\n\t"
  81530. #else
  81531. "orr r3, r6\n\t"
  81532. #endif
  81533. "ldr r4, [%[a], #36]\n\t"
  81534. "str r3, [%[r], #44]\n\t"
  81535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81536. "lsrs r6, r4, #1\n\t"
  81537. #else
  81538. "lsr r6, r4, #1\n\t"
  81539. #endif
  81540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81541. "lsls r4, r4, %[n]\n\t"
  81542. #else
  81543. "lsl r4, r4, %[n]\n\t"
  81544. #endif
  81545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81546. "lsrs r6, r6, r7\n\t"
  81547. #else
  81548. "lsr r6, r6, r7\n\t"
  81549. #endif
  81550. #ifdef WOLFSSL_KEIL
  81551. "orrs r5, r5, r6\n\t"
  81552. #elif defined(__clang__)
  81553. "orrs r5, r6\n\t"
  81554. #else
  81555. "orr r5, r6\n\t"
  81556. #endif
  81557. "ldr r3, [%[a], #32]\n\t"
  81558. "str r5, [%[r], #40]\n\t"
  81559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81560. "lsrs r6, r3, #1\n\t"
  81561. #else
  81562. "lsr r6, r3, #1\n\t"
  81563. #endif
  81564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81565. "lsls r3, r3, %[n]\n\t"
  81566. #else
  81567. "lsl r3, r3, %[n]\n\t"
  81568. #endif
  81569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81570. "lsrs r6, r6, r7\n\t"
  81571. #else
  81572. "lsr r6, r6, r7\n\t"
  81573. #endif
  81574. #ifdef WOLFSSL_KEIL
  81575. "orrs r4, r4, r6\n\t"
  81576. #elif defined(__clang__)
  81577. "orrs r4, r6\n\t"
  81578. #else
  81579. "orr r4, r6\n\t"
  81580. #endif
  81581. "ldr r5, [%[a], #28]\n\t"
  81582. "str r4, [%[r], #36]\n\t"
  81583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81584. "lsrs r6, r5, #1\n\t"
  81585. #else
  81586. "lsr r6, r5, #1\n\t"
  81587. #endif
  81588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81589. "lsls r5, r5, %[n]\n\t"
  81590. #else
  81591. "lsl r5, r5, %[n]\n\t"
  81592. #endif
  81593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81594. "lsrs r6, r6, r7\n\t"
  81595. #else
  81596. "lsr r6, r6, r7\n\t"
  81597. #endif
  81598. #ifdef WOLFSSL_KEIL
  81599. "orrs r3, r3, r6\n\t"
  81600. #elif defined(__clang__)
  81601. "orrs r3, r6\n\t"
  81602. #else
  81603. "orr r3, r6\n\t"
  81604. #endif
  81605. "ldr r4, [%[a], #24]\n\t"
  81606. "str r3, [%[r], #32]\n\t"
  81607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81608. "lsrs r6, r4, #1\n\t"
  81609. #else
  81610. "lsr r6, r4, #1\n\t"
  81611. #endif
  81612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81613. "lsls r4, r4, %[n]\n\t"
  81614. #else
  81615. "lsl r4, r4, %[n]\n\t"
  81616. #endif
  81617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81618. "lsrs r6, r6, r7\n\t"
  81619. #else
  81620. "lsr r6, r6, r7\n\t"
  81621. #endif
  81622. #ifdef WOLFSSL_KEIL
  81623. "orrs r5, r5, r6\n\t"
  81624. #elif defined(__clang__)
  81625. "orrs r5, r6\n\t"
  81626. #else
  81627. "orr r5, r6\n\t"
  81628. #endif
  81629. "ldr r3, [%[a], #20]\n\t"
  81630. "str r5, [%[r], #28]\n\t"
  81631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81632. "lsrs r6, r3, #1\n\t"
  81633. #else
  81634. "lsr r6, r3, #1\n\t"
  81635. #endif
  81636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81637. "lsls r3, r3, %[n]\n\t"
  81638. #else
  81639. "lsl r3, r3, %[n]\n\t"
  81640. #endif
  81641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81642. "lsrs r6, r6, r7\n\t"
  81643. #else
  81644. "lsr r6, r6, r7\n\t"
  81645. #endif
  81646. #ifdef WOLFSSL_KEIL
  81647. "orrs r4, r4, r6\n\t"
  81648. #elif defined(__clang__)
  81649. "orrs r4, r6\n\t"
  81650. #else
  81651. "orr r4, r6\n\t"
  81652. #endif
  81653. "ldr r5, [%[a], #16]\n\t"
  81654. "str r4, [%[r], #24]\n\t"
  81655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81656. "lsrs r6, r5, #1\n\t"
  81657. #else
  81658. "lsr r6, r5, #1\n\t"
  81659. #endif
  81660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81661. "lsls r5, r5, %[n]\n\t"
  81662. #else
  81663. "lsl r5, r5, %[n]\n\t"
  81664. #endif
  81665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81666. "lsrs r6, r6, r7\n\t"
  81667. #else
  81668. "lsr r6, r6, r7\n\t"
  81669. #endif
  81670. #ifdef WOLFSSL_KEIL
  81671. "orrs r3, r3, r6\n\t"
  81672. #elif defined(__clang__)
  81673. "orrs r3, r6\n\t"
  81674. #else
  81675. "orr r3, r6\n\t"
  81676. #endif
  81677. "ldr r4, [%[a], #12]\n\t"
  81678. "str r3, [%[r], #20]\n\t"
  81679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81680. "lsrs r6, r4, #1\n\t"
  81681. #else
  81682. "lsr r6, r4, #1\n\t"
  81683. #endif
  81684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81685. "lsls r4, r4, %[n]\n\t"
  81686. #else
  81687. "lsl r4, r4, %[n]\n\t"
  81688. #endif
  81689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81690. "lsrs r6, r6, r7\n\t"
  81691. #else
  81692. "lsr r6, r6, r7\n\t"
  81693. #endif
  81694. #ifdef WOLFSSL_KEIL
  81695. "orrs r5, r5, r6\n\t"
  81696. #elif defined(__clang__)
  81697. "orrs r5, r6\n\t"
  81698. #else
  81699. "orr r5, r6\n\t"
  81700. #endif
  81701. "ldr r3, [%[a], #8]\n\t"
  81702. "str r5, [%[r], #16]\n\t"
  81703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81704. "lsrs r6, r3, #1\n\t"
  81705. #else
  81706. "lsr r6, r3, #1\n\t"
  81707. #endif
  81708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81709. "lsls r3, r3, %[n]\n\t"
  81710. #else
  81711. "lsl r3, r3, %[n]\n\t"
  81712. #endif
  81713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81714. "lsrs r6, r6, r7\n\t"
  81715. #else
  81716. "lsr r6, r6, r7\n\t"
  81717. #endif
  81718. #ifdef WOLFSSL_KEIL
  81719. "orrs r4, r4, r6\n\t"
  81720. #elif defined(__clang__)
  81721. "orrs r4, r6\n\t"
  81722. #else
  81723. "orr r4, r6\n\t"
  81724. #endif
  81725. "ldr r5, [%[a], #4]\n\t"
  81726. "str r4, [%[r], #12]\n\t"
  81727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81728. "lsrs r6, r5, #1\n\t"
  81729. #else
  81730. "lsr r6, r5, #1\n\t"
  81731. #endif
  81732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81733. "lsls r5, r5, %[n]\n\t"
  81734. #else
  81735. "lsl r5, r5, %[n]\n\t"
  81736. #endif
  81737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81738. "lsrs r6, r6, r7\n\t"
  81739. #else
  81740. "lsr r6, r6, r7\n\t"
  81741. #endif
  81742. #ifdef WOLFSSL_KEIL
  81743. "orrs r3, r3, r6\n\t"
  81744. #elif defined(__clang__)
  81745. "orrs r3, r6\n\t"
  81746. #else
  81747. "orr r3, r6\n\t"
  81748. #endif
  81749. "ldr r4, [%[a]]\n\t"
  81750. "str r3, [%[r], #8]\n\t"
  81751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81752. "lsrs r6, r4, #1\n\t"
  81753. #else
  81754. "lsr r6, r4, #1\n\t"
  81755. #endif
  81756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81757. "lsls r4, r4, %[n]\n\t"
  81758. #else
  81759. "lsl r4, r4, %[n]\n\t"
  81760. #endif
  81761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81762. "lsrs r6, r6, r7\n\t"
  81763. #else
  81764. "lsr r6, r6, r7\n\t"
  81765. #endif
  81766. #ifdef WOLFSSL_KEIL
  81767. "orrs r5, r5, r6\n\t"
  81768. #elif defined(__clang__)
  81769. "orrs r5, r6\n\t"
  81770. #else
  81771. "orr r5, r6\n\t"
  81772. #endif
  81773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81774. "subs %[a], %[a], #0x40\n\t"
  81775. #else
  81776. "sub %[a], %[a], #0x40\n\t"
  81777. #endif
  81778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81779. "subs %[r], %[r], #0x40\n\t"
  81780. #else
  81781. "sub %[r], %[r], #0x40\n\t"
  81782. #endif
  81783. "ldr r3, [%[a], #60]\n\t"
  81784. "str r5, [%[r], #68]\n\t"
  81785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81786. "lsrs r6, r3, #1\n\t"
  81787. #else
  81788. "lsr r6, r3, #1\n\t"
  81789. #endif
  81790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81791. "lsls r3, r3, %[n]\n\t"
  81792. #else
  81793. "lsl r3, r3, %[n]\n\t"
  81794. #endif
  81795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81796. "lsrs r6, r6, r7\n\t"
  81797. #else
  81798. "lsr r6, r6, r7\n\t"
  81799. #endif
  81800. #ifdef WOLFSSL_KEIL
  81801. "orrs r4, r4, r6\n\t"
  81802. #elif defined(__clang__)
  81803. "orrs r4, r6\n\t"
  81804. #else
  81805. "orr r4, r6\n\t"
  81806. #endif
  81807. "ldr r5, [%[a], #56]\n\t"
  81808. "str r4, [%[r], #64]\n\t"
  81809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81810. "lsrs r6, r5, #1\n\t"
  81811. #else
  81812. "lsr r6, r5, #1\n\t"
  81813. #endif
  81814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81815. "lsls r5, r5, %[n]\n\t"
  81816. #else
  81817. "lsl r5, r5, %[n]\n\t"
  81818. #endif
  81819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81820. "lsrs r6, r6, r7\n\t"
  81821. #else
  81822. "lsr r6, r6, r7\n\t"
  81823. #endif
  81824. #ifdef WOLFSSL_KEIL
  81825. "orrs r3, r3, r6\n\t"
  81826. #elif defined(__clang__)
  81827. "orrs r3, r6\n\t"
  81828. #else
  81829. "orr r3, r6\n\t"
  81830. #endif
  81831. "ldr r4, [%[a], #52]\n\t"
  81832. "str r3, [%[r], #60]\n\t"
  81833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81834. "lsrs r6, r4, #1\n\t"
  81835. #else
  81836. "lsr r6, r4, #1\n\t"
  81837. #endif
  81838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81839. "lsls r4, r4, %[n]\n\t"
  81840. #else
  81841. "lsl r4, r4, %[n]\n\t"
  81842. #endif
  81843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81844. "lsrs r6, r6, r7\n\t"
  81845. #else
  81846. "lsr r6, r6, r7\n\t"
  81847. #endif
  81848. #ifdef WOLFSSL_KEIL
  81849. "orrs r5, r5, r6\n\t"
  81850. #elif defined(__clang__)
  81851. "orrs r5, r6\n\t"
  81852. #else
  81853. "orr r5, r6\n\t"
  81854. #endif
  81855. "ldr r3, [%[a], #48]\n\t"
  81856. "str r5, [%[r], #56]\n\t"
  81857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81858. "lsrs r6, r3, #1\n\t"
  81859. #else
  81860. "lsr r6, r3, #1\n\t"
  81861. #endif
  81862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81863. "lsls r3, r3, %[n]\n\t"
  81864. #else
  81865. "lsl r3, r3, %[n]\n\t"
  81866. #endif
  81867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81868. "lsrs r6, r6, r7\n\t"
  81869. #else
  81870. "lsr r6, r6, r7\n\t"
  81871. #endif
  81872. #ifdef WOLFSSL_KEIL
  81873. "orrs r4, r4, r6\n\t"
  81874. #elif defined(__clang__)
  81875. "orrs r4, r6\n\t"
  81876. #else
  81877. "orr r4, r6\n\t"
  81878. #endif
  81879. "ldr r5, [%[a], #44]\n\t"
  81880. "str r4, [%[r], #52]\n\t"
  81881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81882. "lsrs r6, r5, #1\n\t"
  81883. #else
  81884. "lsr r6, r5, #1\n\t"
  81885. #endif
  81886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81887. "lsls r5, r5, %[n]\n\t"
  81888. #else
  81889. "lsl r5, r5, %[n]\n\t"
  81890. #endif
  81891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81892. "lsrs r6, r6, r7\n\t"
  81893. #else
  81894. "lsr r6, r6, r7\n\t"
  81895. #endif
  81896. #ifdef WOLFSSL_KEIL
  81897. "orrs r3, r3, r6\n\t"
  81898. #elif defined(__clang__)
  81899. "orrs r3, r6\n\t"
  81900. #else
  81901. "orr r3, r6\n\t"
  81902. #endif
  81903. "ldr r4, [%[a], #40]\n\t"
  81904. "str r3, [%[r], #48]\n\t"
  81905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81906. "lsrs r6, r4, #1\n\t"
  81907. #else
  81908. "lsr r6, r4, #1\n\t"
  81909. #endif
  81910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81911. "lsls r4, r4, %[n]\n\t"
  81912. #else
  81913. "lsl r4, r4, %[n]\n\t"
  81914. #endif
  81915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81916. "lsrs r6, r6, r7\n\t"
  81917. #else
  81918. "lsr r6, r6, r7\n\t"
  81919. #endif
  81920. #ifdef WOLFSSL_KEIL
  81921. "orrs r5, r5, r6\n\t"
  81922. #elif defined(__clang__)
  81923. "orrs r5, r6\n\t"
  81924. #else
  81925. "orr r5, r6\n\t"
  81926. #endif
  81927. "ldr r3, [%[a], #36]\n\t"
  81928. "str r5, [%[r], #44]\n\t"
  81929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81930. "lsrs r6, r3, #1\n\t"
  81931. #else
  81932. "lsr r6, r3, #1\n\t"
  81933. #endif
  81934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81935. "lsls r3, r3, %[n]\n\t"
  81936. #else
  81937. "lsl r3, r3, %[n]\n\t"
  81938. #endif
  81939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81940. "lsrs r6, r6, r7\n\t"
  81941. #else
  81942. "lsr r6, r6, r7\n\t"
  81943. #endif
  81944. #ifdef WOLFSSL_KEIL
  81945. "orrs r4, r4, r6\n\t"
  81946. #elif defined(__clang__)
  81947. "orrs r4, r6\n\t"
  81948. #else
  81949. "orr r4, r6\n\t"
  81950. #endif
  81951. "ldr r5, [%[a], #32]\n\t"
  81952. "str r4, [%[r], #40]\n\t"
  81953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81954. "lsrs r6, r5, #1\n\t"
  81955. #else
  81956. "lsr r6, r5, #1\n\t"
  81957. #endif
  81958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81959. "lsls r5, r5, %[n]\n\t"
  81960. #else
  81961. "lsl r5, r5, %[n]\n\t"
  81962. #endif
  81963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81964. "lsrs r6, r6, r7\n\t"
  81965. #else
  81966. "lsr r6, r6, r7\n\t"
  81967. #endif
  81968. #ifdef WOLFSSL_KEIL
  81969. "orrs r3, r3, r6\n\t"
  81970. #elif defined(__clang__)
  81971. "orrs r3, r6\n\t"
  81972. #else
  81973. "orr r3, r6\n\t"
  81974. #endif
  81975. "ldr r4, [%[a], #28]\n\t"
  81976. "str r3, [%[r], #36]\n\t"
  81977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81978. "lsrs r6, r4, #1\n\t"
  81979. #else
  81980. "lsr r6, r4, #1\n\t"
  81981. #endif
  81982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81983. "lsls r4, r4, %[n]\n\t"
  81984. #else
  81985. "lsl r4, r4, %[n]\n\t"
  81986. #endif
  81987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  81988. "lsrs r6, r6, r7\n\t"
  81989. #else
  81990. "lsr r6, r6, r7\n\t"
  81991. #endif
  81992. #ifdef WOLFSSL_KEIL
  81993. "orrs r5, r5, r6\n\t"
  81994. #elif defined(__clang__)
  81995. "orrs r5, r6\n\t"
  81996. #else
  81997. "orr r5, r6\n\t"
  81998. #endif
  81999. "ldr r3, [%[a], #24]\n\t"
  82000. "str r5, [%[r], #32]\n\t"
  82001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82002. "lsrs r6, r3, #1\n\t"
  82003. #else
  82004. "lsr r6, r3, #1\n\t"
  82005. #endif
  82006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82007. "lsls r3, r3, %[n]\n\t"
  82008. #else
  82009. "lsl r3, r3, %[n]\n\t"
  82010. #endif
  82011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82012. "lsrs r6, r6, r7\n\t"
  82013. #else
  82014. "lsr r6, r6, r7\n\t"
  82015. #endif
  82016. #ifdef WOLFSSL_KEIL
  82017. "orrs r4, r4, r6\n\t"
  82018. #elif defined(__clang__)
  82019. "orrs r4, r6\n\t"
  82020. #else
  82021. "orr r4, r6\n\t"
  82022. #endif
  82023. "ldr r5, [%[a], #20]\n\t"
  82024. "str r4, [%[r], #28]\n\t"
  82025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82026. "lsrs r6, r5, #1\n\t"
  82027. #else
  82028. "lsr r6, r5, #1\n\t"
  82029. #endif
  82030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82031. "lsls r5, r5, %[n]\n\t"
  82032. #else
  82033. "lsl r5, r5, %[n]\n\t"
  82034. #endif
  82035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82036. "lsrs r6, r6, r7\n\t"
  82037. #else
  82038. "lsr r6, r6, r7\n\t"
  82039. #endif
  82040. #ifdef WOLFSSL_KEIL
  82041. "orrs r3, r3, r6\n\t"
  82042. #elif defined(__clang__)
  82043. "orrs r3, r6\n\t"
  82044. #else
  82045. "orr r3, r6\n\t"
  82046. #endif
  82047. "ldr r4, [%[a], #16]\n\t"
  82048. "str r3, [%[r], #24]\n\t"
  82049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82050. "lsrs r6, r4, #1\n\t"
  82051. #else
  82052. "lsr r6, r4, #1\n\t"
  82053. #endif
  82054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82055. "lsls r4, r4, %[n]\n\t"
  82056. #else
  82057. "lsl r4, r4, %[n]\n\t"
  82058. #endif
  82059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82060. "lsrs r6, r6, r7\n\t"
  82061. #else
  82062. "lsr r6, r6, r7\n\t"
  82063. #endif
  82064. #ifdef WOLFSSL_KEIL
  82065. "orrs r5, r5, r6\n\t"
  82066. #elif defined(__clang__)
  82067. "orrs r5, r6\n\t"
  82068. #else
  82069. "orr r5, r6\n\t"
  82070. #endif
  82071. "ldr r3, [%[a], #12]\n\t"
  82072. "str r5, [%[r], #20]\n\t"
  82073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82074. "lsrs r6, r3, #1\n\t"
  82075. #else
  82076. "lsr r6, r3, #1\n\t"
  82077. #endif
  82078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82079. "lsls r3, r3, %[n]\n\t"
  82080. #else
  82081. "lsl r3, r3, %[n]\n\t"
  82082. #endif
  82083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82084. "lsrs r6, r6, r7\n\t"
  82085. #else
  82086. "lsr r6, r6, r7\n\t"
  82087. #endif
  82088. #ifdef WOLFSSL_KEIL
  82089. "orrs r4, r4, r6\n\t"
  82090. #elif defined(__clang__)
  82091. "orrs r4, r6\n\t"
  82092. #else
  82093. "orr r4, r6\n\t"
  82094. #endif
  82095. "ldr r5, [%[a], #8]\n\t"
  82096. "str r4, [%[r], #16]\n\t"
  82097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82098. "lsrs r6, r5, #1\n\t"
  82099. #else
  82100. "lsr r6, r5, #1\n\t"
  82101. #endif
  82102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82103. "lsls r5, r5, %[n]\n\t"
  82104. #else
  82105. "lsl r5, r5, %[n]\n\t"
  82106. #endif
  82107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82108. "lsrs r6, r6, r7\n\t"
  82109. #else
  82110. "lsr r6, r6, r7\n\t"
  82111. #endif
  82112. #ifdef WOLFSSL_KEIL
  82113. "orrs r3, r3, r6\n\t"
  82114. #elif defined(__clang__)
  82115. "orrs r3, r6\n\t"
  82116. #else
  82117. "orr r3, r6\n\t"
  82118. #endif
  82119. "ldr r4, [%[a], #4]\n\t"
  82120. "str r3, [%[r], #12]\n\t"
  82121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82122. "lsrs r6, r4, #1\n\t"
  82123. #else
  82124. "lsr r6, r4, #1\n\t"
  82125. #endif
  82126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82127. "lsls r4, r4, %[n]\n\t"
  82128. #else
  82129. "lsl r4, r4, %[n]\n\t"
  82130. #endif
  82131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82132. "lsrs r6, r6, r7\n\t"
  82133. #else
  82134. "lsr r6, r6, r7\n\t"
  82135. #endif
  82136. #ifdef WOLFSSL_KEIL
  82137. "orrs r5, r5, r6\n\t"
  82138. #elif defined(__clang__)
  82139. "orrs r5, r6\n\t"
  82140. #else
  82141. "orr r5, r6\n\t"
  82142. #endif
  82143. "ldr r3, [%[a]]\n\t"
  82144. "str r5, [%[r], #8]\n\t"
  82145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82146. "lsrs r6, r3, #1\n\t"
  82147. #else
  82148. "lsr r6, r3, #1\n\t"
  82149. #endif
  82150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82151. "lsls r3, r3, %[n]\n\t"
  82152. #else
  82153. "lsl r3, r3, %[n]\n\t"
  82154. #endif
  82155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82156. "lsrs r6, r6, r7\n\t"
  82157. #else
  82158. "lsr r6, r6, r7\n\t"
  82159. #endif
  82160. #ifdef WOLFSSL_KEIL
  82161. "orrs r4, r4, r6\n\t"
  82162. #elif defined(__clang__)
  82163. "orrs r4, r6\n\t"
  82164. #else
  82165. "orr r4, r6\n\t"
  82166. #endif
  82167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82168. "subs %[a], %[a], #0x40\n\t"
  82169. #else
  82170. "sub %[a], %[a], #0x40\n\t"
  82171. #endif
  82172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82173. "subs %[r], %[r], #0x40\n\t"
  82174. #else
  82175. "sub %[r], %[r], #0x40\n\t"
  82176. #endif
  82177. "ldr r5, [%[a], #60]\n\t"
  82178. "str r4, [%[r], #68]\n\t"
  82179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82180. "lsrs r6, r5, #1\n\t"
  82181. #else
  82182. "lsr r6, r5, #1\n\t"
  82183. #endif
  82184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82185. "lsls r5, r5, %[n]\n\t"
  82186. #else
  82187. "lsl r5, r5, %[n]\n\t"
  82188. #endif
  82189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82190. "lsrs r6, r6, r7\n\t"
  82191. #else
  82192. "lsr r6, r6, r7\n\t"
  82193. #endif
  82194. #ifdef WOLFSSL_KEIL
  82195. "orrs r3, r3, r6\n\t"
  82196. #elif defined(__clang__)
  82197. "orrs r3, r6\n\t"
  82198. #else
  82199. "orr r3, r6\n\t"
  82200. #endif
  82201. "ldr r4, [%[a], #56]\n\t"
  82202. "str r3, [%[r], #64]\n\t"
  82203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82204. "lsrs r6, r4, #1\n\t"
  82205. #else
  82206. "lsr r6, r4, #1\n\t"
  82207. #endif
  82208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82209. "lsls r4, r4, %[n]\n\t"
  82210. #else
  82211. "lsl r4, r4, %[n]\n\t"
  82212. #endif
  82213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82214. "lsrs r6, r6, r7\n\t"
  82215. #else
  82216. "lsr r6, r6, r7\n\t"
  82217. #endif
  82218. #ifdef WOLFSSL_KEIL
  82219. "orrs r5, r5, r6\n\t"
  82220. #elif defined(__clang__)
  82221. "orrs r5, r6\n\t"
  82222. #else
  82223. "orr r5, r6\n\t"
  82224. #endif
  82225. "ldr r3, [%[a], #52]\n\t"
  82226. "str r5, [%[r], #60]\n\t"
  82227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82228. "lsrs r6, r3, #1\n\t"
  82229. #else
  82230. "lsr r6, r3, #1\n\t"
  82231. #endif
  82232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82233. "lsls r3, r3, %[n]\n\t"
  82234. #else
  82235. "lsl r3, r3, %[n]\n\t"
  82236. #endif
  82237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82238. "lsrs r6, r6, r7\n\t"
  82239. #else
  82240. "lsr r6, r6, r7\n\t"
  82241. #endif
  82242. #ifdef WOLFSSL_KEIL
  82243. "orrs r4, r4, r6\n\t"
  82244. #elif defined(__clang__)
  82245. "orrs r4, r6\n\t"
  82246. #else
  82247. "orr r4, r6\n\t"
  82248. #endif
  82249. "ldr r5, [%[a], #48]\n\t"
  82250. "str r4, [%[r], #56]\n\t"
  82251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82252. "lsrs r6, r5, #1\n\t"
  82253. #else
  82254. "lsr r6, r5, #1\n\t"
  82255. #endif
  82256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82257. "lsls r5, r5, %[n]\n\t"
  82258. #else
  82259. "lsl r5, r5, %[n]\n\t"
  82260. #endif
  82261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82262. "lsrs r6, r6, r7\n\t"
  82263. #else
  82264. "lsr r6, r6, r7\n\t"
  82265. #endif
  82266. #ifdef WOLFSSL_KEIL
  82267. "orrs r3, r3, r6\n\t"
  82268. #elif defined(__clang__)
  82269. "orrs r3, r6\n\t"
  82270. #else
  82271. "orr r3, r6\n\t"
  82272. #endif
  82273. "ldr r4, [%[a], #44]\n\t"
  82274. "str r3, [%[r], #52]\n\t"
  82275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82276. "lsrs r6, r4, #1\n\t"
  82277. #else
  82278. "lsr r6, r4, #1\n\t"
  82279. #endif
  82280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82281. "lsls r4, r4, %[n]\n\t"
  82282. #else
  82283. "lsl r4, r4, %[n]\n\t"
  82284. #endif
  82285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82286. "lsrs r6, r6, r7\n\t"
  82287. #else
  82288. "lsr r6, r6, r7\n\t"
  82289. #endif
  82290. #ifdef WOLFSSL_KEIL
  82291. "orrs r5, r5, r6\n\t"
  82292. #elif defined(__clang__)
  82293. "orrs r5, r6\n\t"
  82294. #else
  82295. "orr r5, r6\n\t"
  82296. #endif
  82297. "ldr r3, [%[a], #40]\n\t"
  82298. "str r5, [%[r], #48]\n\t"
  82299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82300. "lsrs r6, r3, #1\n\t"
  82301. #else
  82302. "lsr r6, r3, #1\n\t"
  82303. #endif
  82304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82305. "lsls r3, r3, %[n]\n\t"
  82306. #else
  82307. "lsl r3, r3, %[n]\n\t"
  82308. #endif
  82309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82310. "lsrs r6, r6, r7\n\t"
  82311. #else
  82312. "lsr r6, r6, r7\n\t"
  82313. #endif
  82314. #ifdef WOLFSSL_KEIL
  82315. "orrs r4, r4, r6\n\t"
  82316. #elif defined(__clang__)
  82317. "orrs r4, r6\n\t"
  82318. #else
  82319. "orr r4, r6\n\t"
  82320. #endif
  82321. "ldr r5, [%[a], #36]\n\t"
  82322. "str r4, [%[r], #44]\n\t"
  82323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82324. "lsrs r6, r5, #1\n\t"
  82325. #else
  82326. "lsr r6, r5, #1\n\t"
  82327. #endif
  82328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82329. "lsls r5, r5, %[n]\n\t"
  82330. #else
  82331. "lsl r5, r5, %[n]\n\t"
  82332. #endif
  82333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82334. "lsrs r6, r6, r7\n\t"
  82335. #else
  82336. "lsr r6, r6, r7\n\t"
  82337. #endif
  82338. #ifdef WOLFSSL_KEIL
  82339. "orrs r3, r3, r6\n\t"
  82340. #elif defined(__clang__)
  82341. "orrs r3, r6\n\t"
  82342. #else
  82343. "orr r3, r6\n\t"
  82344. #endif
  82345. "ldr r4, [%[a], #32]\n\t"
  82346. "str r3, [%[r], #40]\n\t"
  82347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82348. "lsrs r6, r4, #1\n\t"
  82349. #else
  82350. "lsr r6, r4, #1\n\t"
  82351. #endif
  82352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82353. "lsls r4, r4, %[n]\n\t"
  82354. #else
  82355. "lsl r4, r4, %[n]\n\t"
  82356. #endif
  82357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82358. "lsrs r6, r6, r7\n\t"
  82359. #else
  82360. "lsr r6, r6, r7\n\t"
  82361. #endif
  82362. #ifdef WOLFSSL_KEIL
  82363. "orrs r5, r5, r6\n\t"
  82364. #elif defined(__clang__)
  82365. "orrs r5, r6\n\t"
  82366. #else
  82367. "orr r5, r6\n\t"
  82368. #endif
  82369. "ldr r3, [%[a], #28]\n\t"
  82370. "str r5, [%[r], #36]\n\t"
  82371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82372. "lsrs r6, r3, #1\n\t"
  82373. #else
  82374. "lsr r6, r3, #1\n\t"
  82375. #endif
  82376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82377. "lsls r3, r3, %[n]\n\t"
  82378. #else
  82379. "lsl r3, r3, %[n]\n\t"
  82380. #endif
  82381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82382. "lsrs r6, r6, r7\n\t"
  82383. #else
  82384. "lsr r6, r6, r7\n\t"
  82385. #endif
  82386. #ifdef WOLFSSL_KEIL
  82387. "orrs r4, r4, r6\n\t"
  82388. #elif defined(__clang__)
  82389. "orrs r4, r6\n\t"
  82390. #else
  82391. "orr r4, r6\n\t"
  82392. #endif
  82393. "ldr r5, [%[a], #24]\n\t"
  82394. "str r4, [%[r], #32]\n\t"
  82395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82396. "lsrs r6, r5, #1\n\t"
  82397. #else
  82398. "lsr r6, r5, #1\n\t"
  82399. #endif
  82400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82401. "lsls r5, r5, %[n]\n\t"
  82402. #else
  82403. "lsl r5, r5, %[n]\n\t"
  82404. #endif
  82405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82406. "lsrs r6, r6, r7\n\t"
  82407. #else
  82408. "lsr r6, r6, r7\n\t"
  82409. #endif
  82410. #ifdef WOLFSSL_KEIL
  82411. "orrs r3, r3, r6\n\t"
  82412. #elif defined(__clang__)
  82413. "orrs r3, r6\n\t"
  82414. #else
  82415. "orr r3, r6\n\t"
  82416. #endif
  82417. "ldr r4, [%[a], #20]\n\t"
  82418. "str r3, [%[r], #28]\n\t"
  82419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82420. "lsrs r6, r4, #1\n\t"
  82421. #else
  82422. "lsr r6, r4, #1\n\t"
  82423. #endif
  82424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82425. "lsls r4, r4, %[n]\n\t"
  82426. #else
  82427. "lsl r4, r4, %[n]\n\t"
  82428. #endif
  82429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82430. "lsrs r6, r6, r7\n\t"
  82431. #else
  82432. "lsr r6, r6, r7\n\t"
  82433. #endif
  82434. #ifdef WOLFSSL_KEIL
  82435. "orrs r5, r5, r6\n\t"
  82436. #elif defined(__clang__)
  82437. "orrs r5, r6\n\t"
  82438. #else
  82439. "orr r5, r6\n\t"
  82440. #endif
  82441. "ldr r3, [%[a], #16]\n\t"
  82442. "str r5, [%[r], #24]\n\t"
  82443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82444. "lsrs r6, r3, #1\n\t"
  82445. #else
  82446. "lsr r6, r3, #1\n\t"
  82447. #endif
  82448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82449. "lsls r3, r3, %[n]\n\t"
  82450. #else
  82451. "lsl r3, r3, %[n]\n\t"
  82452. #endif
  82453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82454. "lsrs r6, r6, r7\n\t"
  82455. #else
  82456. "lsr r6, r6, r7\n\t"
  82457. #endif
  82458. #ifdef WOLFSSL_KEIL
  82459. "orrs r4, r4, r6\n\t"
  82460. #elif defined(__clang__)
  82461. "orrs r4, r6\n\t"
  82462. #else
  82463. "orr r4, r6\n\t"
  82464. #endif
  82465. "ldr r5, [%[a], #12]\n\t"
  82466. "str r4, [%[r], #20]\n\t"
  82467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82468. "lsrs r6, r5, #1\n\t"
  82469. #else
  82470. "lsr r6, r5, #1\n\t"
  82471. #endif
  82472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82473. "lsls r5, r5, %[n]\n\t"
  82474. #else
  82475. "lsl r5, r5, %[n]\n\t"
  82476. #endif
  82477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82478. "lsrs r6, r6, r7\n\t"
  82479. #else
  82480. "lsr r6, r6, r7\n\t"
  82481. #endif
  82482. #ifdef WOLFSSL_KEIL
  82483. "orrs r3, r3, r6\n\t"
  82484. #elif defined(__clang__)
  82485. "orrs r3, r6\n\t"
  82486. #else
  82487. "orr r3, r6\n\t"
  82488. #endif
  82489. "ldr r4, [%[a], #8]\n\t"
  82490. "str r3, [%[r], #16]\n\t"
  82491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82492. "lsrs r6, r4, #1\n\t"
  82493. #else
  82494. "lsr r6, r4, #1\n\t"
  82495. #endif
  82496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82497. "lsls r4, r4, %[n]\n\t"
  82498. #else
  82499. "lsl r4, r4, %[n]\n\t"
  82500. #endif
  82501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82502. "lsrs r6, r6, r7\n\t"
  82503. #else
  82504. "lsr r6, r6, r7\n\t"
  82505. #endif
  82506. #ifdef WOLFSSL_KEIL
  82507. "orrs r5, r5, r6\n\t"
  82508. #elif defined(__clang__)
  82509. "orrs r5, r6\n\t"
  82510. #else
  82511. "orr r5, r6\n\t"
  82512. #endif
  82513. "ldr r3, [%[a], #4]\n\t"
  82514. "str r5, [%[r], #12]\n\t"
  82515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82516. "lsrs r6, r3, #1\n\t"
  82517. #else
  82518. "lsr r6, r3, #1\n\t"
  82519. #endif
  82520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82521. "lsls r3, r3, %[n]\n\t"
  82522. #else
  82523. "lsl r3, r3, %[n]\n\t"
  82524. #endif
  82525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82526. "lsrs r6, r6, r7\n\t"
  82527. #else
  82528. "lsr r6, r6, r7\n\t"
  82529. #endif
  82530. #ifdef WOLFSSL_KEIL
  82531. "orrs r4, r4, r6\n\t"
  82532. #elif defined(__clang__)
  82533. "orrs r4, r6\n\t"
  82534. #else
  82535. "orr r4, r6\n\t"
  82536. #endif
  82537. "ldr r5, [%[a]]\n\t"
  82538. "str r4, [%[r], #8]\n\t"
  82539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82540. "lsrs r6, r5, #1\n\t"
  82541. #else
  82542. "lsr r6, r5, #1\n\t"
  82543. #endif
  82544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82545. "lsls r5, r5, %[n]\n\t"
  82546. #else
  82547. "lsl r5, r5, %[n]\n\t"
  82548. #endif
  82549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82550. "lsrs r6, r6, r7\n\t"
  82551. #else
  82552. "lsr r6, r6, r7\n\t"
  82553. #endif
  82554. #ifdef WOLFSSL_KEIL
  82555. "orrs r3, r3, r6\n\t"
  82556. #elif defined(__clang__)
  82557. "orrs r3, r6\n\t"
  82558. #else
  82559. "orr r3, r6\n\t"
  82560. #endif
  82561. "str r5, [%[r]]\n\t"
  82562. "str r3, [%[r], #4]\n\t"
  82563. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  82564. :
  82565. : "memory", "r3", "r4", "r5", "r6", "r7"
  82566. );
  82567. }
  82568. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  82569. *
  82570. * r A single precision number that is the result of the operation.
  82571. * e A single precision number that is the exponent.
  82572. * bits The number of bits in the exponent.
  82573. * m A single precision number that is the modulus.
  82574. * returns 0 on success.
  82575. * returns MEMORY_E on dynamic memory allocation failure.
  82576. * returns MP_VAL when base is even.
  82577. */
  82578. static int sp_3072_mod_exp_2_96(sp_digit* r, const sp_digit* e, int bits,
  82579. const sp_digit* m)
  82580. {
  82581. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  82582. sp_digit* td = NULL;
  82583. #else
  82584. sp_digit td[289];
  82585. #endif
  82586. sp_digit* norm = NULL;
  82587. sp_digit* tmp = NULL;
  82588. sp_digit mp = 1;
  82589. sp_digit n;
  82590. sp_digit o;
  82591. sp_digit mask;
  82592. int i;
  82593. int c;
  82594. byte y;
  82595. int err = MP_OKAY;
  82596. if (bits == 0) {
  82597. err = MP_VAL;
  82598. }
  82599. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  82600. if (err == MP_OKAY) {
  82601. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 289, NULL,
  82602. DYNAMIC_TYPE_TMP_BUFFER);
  82603. if (td == NULL)
  82604. err = MEMORY_E;
  82605. }
  82606. #endif
  82607. if (err == MP_OKAY) {
  82608. norm = td;
  82609. tmp = td + 192;
  82610. sp_3072_mont_setup(m, &mp);
  82611. sp_3072_mont_norm_96(norm, m);
  82612. i = (bits - 1) / 32;
  82613. n = e[i--];
  82614. c = bits & 31;
  82615. if (c == 0) {
  82616. c = 32;
  82617. }
  82618. c -= bits % 5;
  82619. if (c == 32) {
  82620. c = 27;
  82621. }
  82622. if (c < 0) {
  82623. /* Number of bits in top word is less than number needed. */
  82624. c = -c;
  82625. y = (byte)(n << c);
  82626. n = e[i--];
  82627. y |= (byte)(n >> (64 - c));
  82628. n <<= c;
  82629. c = 64 - c;
  82630. }
  82631. else if (c == 0) {
  82632. /* All bits in top word used. */
  82633. y = (byte)n;
  82634. }
  82635. else {
  82636. y = (byte)(n >> c);
  82637. n <<= 32 - c;
  82638. }
  82639. sp_3072_lshift_96(r, norm, y);
  82640. for (; i>=0 || c>=5; ) {
  82641. if (c == 0) {
  82642. n = e[i--];
  82643. y = (byte)(n >> 27);
  82644. n <<= 5;
  82645. c = 27;
  82646. }
  82647. else if (c < 5) {
  82648. y = (byte)(n >> 27);
  82649. n = e[i--];
  82650. c = 5 - c;
  82651. y |= (byte)(n >> (32 - c));
  82652. n <<= c;
  82653. c = 32 - c;
  82654. }
  82655. else {
  82656. y = (byte)((n >> 27) & 0x1f);
  82657. n <<= 5;
  82658. c -= 5;
  82659. }
  82660. sp_3072_mont_sqr_96(r, r, m, mp);
  82661. sp_3072_mont_sqr_96(r, r, m, mp);
  82662. sp_3072_mont_sqr_96(r, r, m, mp);
  82663. sp_3072_mont_sqr_96(r, r, m, mp);
  82664. sp_3072_mont_sqr_96(r, r, m, mp);
  82665. sp_3072_lshift_96(r, r, y);
  82666. sp_3072_mul_d_96(tmp, norm, r[96]);
  82667. r[96] = 0;
  82668. o = sp_3072_add_96(r, r, tmp);
  82669. sp_3072_cond_sub_96(r, r, m, (sp_digit)0 - o);
  82670. }
  82671. XMEMSET(&r[96], 0, sizeof(sp_digit) * 96U);
  82672. sp_3072_mont_reduce_96(r, m, mp);
  82673. mask = 0 - (sp_3072_cmp_96(r, m) >= 0);
  82674. sp_3072_cond_sub_96(r, r, m, mask);
  82675. }
  82676. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  82677. if (td != NULL)
  82678. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  82679. #endif
  82680. return err;
  82681. }
  82682. #endif /* HAVE_FFDHE_3072 */
  82683. /* Perform the modular exponentiation for Diffie-Hellman.
  82684. *
  82685. * base Base.
  82686. * exp Array of bytes that is the exponent.
  82687. * expLen Length of data, in bytes, in exponent.
  82688. * mod Modulus.
  82689. * out Buffer to hold big-endian bytes of exponentiation result.
  82690. * Must be at least 384 bytes long.
  82691. * outLen Length, in bytes, of exponentiation result.
  82692. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  82693. * and MEMORY_E if memory allocation fails.
  82694. */
  82695. int sp_DhExp_3072(const mp_int* base, const byte* exp, word32 expLen,
  82696. const mp_int* mod, byte* out, word32* outLen)
  82697. {
  82698. int err = MP_OKAY;
  82699. sp_digit b[192];
  82700. sp_digit e[96];
  82701. sp_digit m[96];
  82702. sp_digit* r = b;
  82703. word32 i;
  82704. if (mp_count_bits(base) > 3072) {
  82705. err = MP_READ_E;
  82706. }
  82707. else if (expLen > 384) {
  82708. err = MP_READ_E;
  82709. }
  82710. else if (mp_count_bits(mod) != 3072) {
  82711. err = MP_READ_E;
  82712. }
  82713. else if (mp_iseven(mod)) {
  82714. err = MP_VAL;
  82715. }
  82716. if (err == MP_OKAY) {
  82717. sp_3072_from_mp(b, 96, base);
  82718. sp_3072_from_bin(e, 96, exp, expLen);
  82719. sp_3072_from_mp(m, 96, mod);
  82720. #ifdef HAVE_FFDHE_3072
  82721. if (base->used == 1 && base->dp[0] == 2 && m[95] == (sp_digit)-1)
  82722. err = sp_3072_mod_exp_2_96(r, e, expLen * 8, m);
  82723. else
  82724. #endif
  82725. err = sp_3072_mod_exp_96(r, b, e, expLen * 8, m, 0);
  82726. }
  82727. if (err == MP_OKAY) {
  82728. sp_3072_to_bin_96(r, out);
  82729. *outLen = 384;
  82730. for (i=0; i<384 && out[i] == 0; i++) {
  82731. /* Search for first non-zero. */
  82732. }
  82733. *outLen -= i;
  82734. XMEMMOVE(out, out + i, *outLen);
  82735. }
  82736. XMEMSET(e, 0, sizeof(e));
  82737. return err;
  82738. }
  82739. #endif /* WOLFSSL_HAVE_SP_DH */
  82740. /* Perform the modular exponentiation for Diffie-Hellman.
  82741. *
  82742. * base Base. MP integer.
  82743. * exp Exponent. MP integer.
  82744. * mod Modulus. MP integer.
  82745. * res Result. MP integer.
  82746. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  82747. * and MEMORY_E if memory allocation fails.
  82748. */
  82749. int sp_ModExp_1536(const mp_int* base, const mp_int* exp, const mp_int* mod,
  82750. mp_int* res)
  82751. {
  82752. int err = MP_OKAY;
  82753. sp_digit b[96];
  82754. sp_digit e[48];
  82755. sp_digit m[48];
  82756. sp_digit* r = b;
  82757. int expBits = mp_count_bits(exp);
  82758. if (mp_count_bits(base) > 1536) {
  82759. err = MP_READ_E;
  82760. }
  82761. else if (expBits > 1536) {
  82762. err = MP_READ_E;
  82763. }
  82764. else if (mp_count_bits(mod) != 1536) {
  82765. err = MP_READ_E;
  82766. }
  82767. else if (mp_iseven(mod)) {
  82768. err = MP_VAL;
  82769. }
  82770. if (err == MP_OKAY) {
  82771. sp_3072_from_mp(b, 48, base);
  82772. sp_3072_from_mp(e, 48, exp);
  82773. sp_3072_from_mp(m, 48, mod);
  82774. err = sp_3072_mod_exp_48(r, b, e, expBits, m, 0);
  82775. }
  82776. if (err == MP_OKAY) {
  82777. XMEMSET(r + 48, 0, sizeof(*r) * 48U);
  82778. err = sp_3072_to_mp(r, res);
  82779. res->used = mod->used;
  82780. mp_clamp(res);
  82781. }
  82782. XMEMSET(e, 0, sizeof(e));
  82783. return err;
  82784. }
  82785. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  82786. #endif /* !WOLFSSL_SP_NO_3072 */
  82787. #ifdef WOLFSSL_SP_4096
  82788. /* Read big endian unsigned byte array into r.
  82789. *
  82790. * r A single precision integer.
  82791. * size Maximum number of bytes to convert
  82792. * a Byte array.
  82793. * n Number of bytes in array to read.
  82794. */
  82795. static void sp_4096_from_bin(sp_digit* r, int size, const byte* a, int n)
  82796. {
  82797. int i;
  82798. int j;
  82799. byte* d;
  82800. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  82801. r[j] = ((sp_digit)a[i - 0] << 0) |
  82802. ((sp_digit)a[i - 1] << 8) |
  82803. ((sp_digit)a[i - 2] << 16) |
  82804. ((sp_digit)a[i - 3] << 24);
  82805. j++;
  82806. }
  82807. if (i >= 0) {
  82808. r[j] = 0;
  82809. d = (byte*)r;
  82810. switch (i) {
  82811. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  82812. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  82813. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  82814. }
  82815. j++;
  82816. }
  82817. for (; j < size; j++) {
  82818. r[j] = 0;
  82819. }
  82820. }
  82821. /* Convert an mp_int to an array of sp_digit.
  82822. *
  82823. * r A single precision integer.
  82824. * size Maximum number of bytes to convert
  82825. * a A multi-precision integer.
  82826. */
  82827. static void sp_4096_from_mp(sp_digit* r, int size, const mp_int* a)
  82828. {
  82829. #if DIGIT_BIT == 32
  82830. int j;
  82831. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  82832. for (j = a->used; j < size; j++) {
  82833. r[j] = 0;
  82834. }
  82835. #elif DIGIT_BIT > 32
  82836. int i;
  82837. int j = 0;
  82838. word32 s = 0;
  82839. r[0] = 0;
  82840. for (i = 0; i < a->used && j < size; i++) {
  82841. r[j] |= ((sp_digit)a->dp[i] << s);
  82842. r[j] &= 0xffffffff;
  82843. s = 32U - s;
  82844. if (j + 1 >= size) {
  82845. break;
  82846. }
  82847. /* lint allow cast of mismatch word32 and mp_digit */
  82848. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  82849. while ((s + 32U) <= (word32)DIGIT_BIT) {
  82850. s += 32U;
  82851. r[j] &= 0xffffffff;
  82852. if (j + 1 >= size) {
  82853. break;
  82854. }
  82855. if (s < (word32)DIGIT_BIT) {
  82856. /* lint allow cast of mismatch word32 and mp_digit */
  82857. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  82858. }
  82859. else {
  82860. r[++j] = (sp_digit)0;
  82861. }
  82862. }
  82863. s = (word32)DIGIT_BIT - s;
  82864. }
  82865. for (j++; j < size; j++) {
  82866. r[j] = 0;
  82867. }
  82868. #else
  82869. int i;
  82870. int j = 0;
  82871. int s = 0;
  82872. r[0] = 0;
  82873. for (i = 0; i < a->used && j < size; i++) {
  82874. r[j] |= ((sp_digit)a->dp[i]) << s;
  82875. if (s + DIGIT_BIT >= 32) {
  82876. r[j] &= 0xffffffff;
  82877. if (j + 1 >= size) {
  82878. break;
  82879. }
  82880. s = 32 - s;
  82881. if (s == DIGIT_BIT) {
  82882. r[++j] = 0;
  82883. s = 0;
  82884. }
  82885. else {
  82886. r[++j] = a->dp[i] >> s;
  82887. s = DIGIT_BIT - s;
  82888. }
  82889. }
  82890. else {
  82891. s += DIGIT_BIT;
  82892. }
  82893. }
  82894. for (j++; j < size; j++) {
  82895. r[j] = 0;
  82896. }
  82897. #endif
  82898. }
  82899. /* Write r as big endian to byte array.
  82900. * Fixed length number of bytes written: 512
  82901. *
  82902. * r A single precision integer.
  82903. * a Byte array.
  82904. */
  82905. static void sp_4096_to_bin_128(sp_digit* r, byte* a)
  82906. {
  82907. int i;
  82908. int j = 0;
  82909. for (i = 127; i >= 0; i--) {
  82910. a[j++] = r[i] >> 24;
  82911. a[j++] = r[i] >> 16;
  82912. a[j++] = r[i] >> 8;
  82913. a[j++] = r[i] >> 0;
  82914. }
  82915. }
  82916. #if (defined(WOLFSSL_HAVE_SP_RSA) && (!defined(WOLFSSL_RSA_PUBLIC_ONLY) || !defined(WOLFSSL_SP_SMALL))) || defined(WOLFSSL_HAVE_SP_DH)
  82917. /* Normalize the values in each word to 32.
  82918. *
  82919. * a Array of sp_digit to normalize.
  82920. */
  82921. #define sp_4096_norm_128(a)
  82922. #endif /* (WOLFSSL_HAVE_SP_RSA && (!WOLFSSL_RSA_PUBLIC_ONLY || !WOLFSSL_SP_SMALL)) || WOLFSSL_HAVE_SP_DH */
  82923. /* Normalize the values in each word to 32.
  82924. *
  82925. * a Array of sp_digit to normalize.
  82926. */
  82927. #define sp_4096_norm_128(a)
  82928. #ifndef WOLFSSL_SP_SMALL
  82929. /* Add b to a into r. (r = a + b)
  82930. *
  82931. * r A single precision integer.
  82932. * a A single precision integer.
  82933. * b A single precision integer.
  82934. */
  82935. SP_NOINLINE static sp_digit sp_4096_add_word_64(sp_digit* r, const sp_digit* a,
  82936. sp_digit b)
  82937. {
  82938. __asm__ __volatile__ (
  82939. "movs r5, #0\n\t"
  82940. "ldm %[a]!, {r3, r4}\n\t"
  82941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  82942. "adds r3, r3, %[b]\n\t"
  82943. #else
  82944. "add r3, r3, %[b]\n\t"
  82945. #endif
  82946. #ifdef WOLFSSL_KEIL
  82947. "adcs r4, r4, r5\n\t"
  82948. #elif defined(__clang__)
  82949. "adcs r4, r5\n\t"
  82950. #else
  82951. "adc r4, r5\n\t"
  82952. #endif
  82953. "stm %[r]!, {r3, r4}\n\t"
  82954. "ldm %[a]!, {r3, r4}\n\t"
  82955. #ifdef WOLFSSL_KEIL
  82956. "adcs r3, r3, r5\n\t"
  82957. #elif defined(__clang__)
  82958. "adcs r3, r5\n\t"
  82959. #else
  82960. "adc r3, r5\n\t"
  82961. #endif
  82962. #ifdef WOLFSSL_KEIL
  82963. "adcs r4, r4, r5\n\t"
  82964. #elif defined(__clang__)
  82965. "adcs r4, r5\n\t"
  82966. #else
  82967. "adc r4, r5\n\t"
  82968. #endif
  82969. "stm %[r]!, {r3, r4}\n\t"
  82970. "ldm %[a]!, {r3, r4}\n\t"
  82971. #ifdef WOLFSSL_KEIL
  82972. "adcs r3, r3, r5\n\t"
  82973. #elif defined(__clang__)
  82974. "adcs r3, r5\n\t"
  82975. #else
  82976. "adc r3, r5\n\t"
  82977. #endif
  82978. #ifdef WOLFSSL_KEIL
  82979. "adcs r4, r4, r5\n\t"
  82980. #elif defined(__clang__)
  82981. "adcs r4, r5\n\t"
  82982. #else
  82983. "adc r4, r5\n\t"
  82984. #endif
  82985. "stm %[r]!, {r3, r4}\n\t"
  82986. "ldm %[a]!, {r3, r4}\n\t"
  82987. #ifdef WOLFSSL_KEIL
  82988. "adcs r3, r3, r5\n\t"
  82989. #elif defined(__clang__)
  82990. "adcs r3, r5\n\t"
  82991. #else
  82992. "adc r3, r5\n\t"
  82993. #endif
  82994. #ifdef WOLFSSL_KEIL
  82995. "adcs r4, r4, r5\n\t"
  82996. #elif defined(__clang__)
  82997. "adcs r4, r5\n\t"
  82998. #else
  82999. "adc r4, r5\n\t"
  83000. #endif
  83001. "stm %[r]!, {r3, r4}\n\t"
  83002. "ldm %[a]!, {r3, r4}\n\t"
  83003. #ifdef WOLFSSL_KEIL
  83004. "adcs r3, r3, r5\n\t"
  83005. #elif defined(__clang__)
  83006. "adcs r3, r5\n\t"
  83007. #else
  83008. "adc r3, r5\n\t"
  83009. #endif
  83010. #ifdef WOLFSSL_KEIL
  83011. "adcs r4, r4, r5\n\t"
  83012. #elif defined(__clang__)
  83013. "adcs r4, r5\n\t"
  83014. #else
  83015. "adc r4, r5\n\t"
  83016. #endif
  83017. "stm %[r]!, {r3, r4}\n\t"
  83018. "ldm %[a]!, {r3, r4}\n\t"
  83019. #ifdef WOLFSSL_KEIL
  83020. "adcs r3, r3, r5\n\t"
  83021. #elif defined(__clang__)
  83022. "adcs r3, r5\n\t"
  83023. #else
  83024. "adc r3, r5\n\t"
  83025. #endif
  83026. #ifdef WOLFSSL_KEIL
  83027. "adcs r4, r4, r5\n\t"
  83028. #elif defined(__clang__)
  83029. "adcs r4, r5\n\t"
  83030. #else
  83031. "adc r4, r5\n\t"
  83032. #endif
  83033. "stm %[r]!, {r3, r4}\n\t"
  83034. "ldm %[a]!, {r3, r4}\n\t"
  83035. #ifdef WOLFSSL_KEIL
  83036. "adcs r3, r3, r5\n\t"
  83037. #elif defined(__clang__)
  83038. "adcs r3, r5\n\t"
  83039. #else
  83040. "adc r3, r5\n\t"
  83041. #endif
  83042. #ifdef WOLFSSL_KEIL
  83043. "adcs r4, r4, r5\n\t"
  83044. #elif defined(__clang__)
  83045. "adcs r4, r5\n\t"
  83046. #else
  83047. "adc r4, r5\n\t"
  83048. #endif
  83049. "stm %[r]!, {r3, r4}\n\t"
  83050. "ldm %[a]!, {r3, r4}\n\t"
  83051. #ifdef WOLFSSL_KEIL
  83052. "adcs r3, r3, r5\n\t"
  83053. #elif defined(__clang__)
  83054. "adcs r3, r5\n\t"
  83055. #else
  83056. "adc r3, r5\n\t"
  83057. #endif
  83058. #ifdef WOLFSSL_KEIL
  83059. "adcs r4, r4, r5\n\t"
  83060. #elif defined(__clang__)
  83061. "adcs r4, r5\n\t"
  83062. #else
  83063. "adc r4, r5\n\t"
  83064. #endif
  83065. "stm %[r]!, {r3, r4}\n\t"
  83066. "ldm %[a]!, {r3, r4}\n\t"
  83067. #ifdef WOLFSSL_KEIL
  83068. "adcs r3, r3, r5\n\t"
  83069. #elif defined(__clang__)
  83070. "adcs r3, r5\n\t"
  83071. #else
  83072. "adc r3, r5\n\t"
  83073. #endif
  83074. #ifdef WOLFSSL_KEIL
  83075. "adcs r4, r4, r5\n\t"
  83076. #elif defined(__clang__)
  83077. "adcs r4, r5\n\t"
  83078. #else
  83079. "adc r4, r5\n\t"
  83080. #endif
  83081. "stm %[r]!, {r3, r4}\n\t"
  83082. "ldm %[a]!, {r3, r4}\n\t"
  83083. #ifdef WOLFSSL_KEIL
  83084. "adcs r3, r3, r5\n\t"
  83085. #elif defined(__clang__)
  83086. "adcs r3, r5\n\t"
  83087. #else
  83088. "adc r3, r5\n\t"
  83089. #endif
  83090. #ifdef WOLFSSL_KEIL
  83091. "adcs r4, r4, r5\n\t"
  83092. #elif defined(__clang__)
  83093. "adcs r4, r5\n\t"
  83094. #else
  83095. "adc r4, r5\n\t"
  83096. #endif
  83097. "stm %[r]!, {r3, r4}\n\t"
  83098. "ldm %[a]!, {r3, r4}\n\t"
  83099. #ifdef WOLFSSL_KEIL
  83100. "adcs r3, r3, r5\n\t"
  83101. #elif defined(__clang__)
  83102. "adcs r3, r5\n\t"
  83103. #else
  83104. "adc r3, r5\n\t"
  83105. #endif
  83106. #ifdef WOLFSSL_KEIL
  83107. "adcs r4, r4, r5\n\t"
  83108. #elif defined(__clang__)
  83109. "adcs r4, r5\n\t"
  83110. #else
  83111. "adc r4, r5\n\t"
  83112. #endif
  83113. "stm %[r]!, {r3, r4}\n\t"
  83114. "ldm %[a]!, {r3, r4}\n\t"
  83115. #ifdef WOLFSSL_KEIL
  83116. "adcs r3, r3, r5\n\t"
  83117. #elif defined(__clang__)
  83118. "adcs r3, r5\n\t"
  83119. #else
  83120. "adc r3, r5\n\t"
  83121. #endif
  83122. #ifdef WOLFSSL_KEIL
  83123. "adcs r4, r4, r5\n\t"
  83124. #elif defined(__clang__)
  83125. "adcs r4, r5\n\t"
  83126. #else
  83127. "adc r4, r5\n\t"
  83128. #endif
  83129. "stm %[r]!, {r3, r4}\n\t"
  83130. "ldm %[a]!, {r3, r4}\n\t"
  83131. #ifdef WOLFSSL_KEIL
  83132. "adcs r3, r3, r5\n\t"
  83133. #elif defined(__clang__)
  83134. "adcs r3, r5\n\t"
  83135. #else
  83136. "adc r3, r5\n\t"
  83137. #endif
  83138. #ifdef WOLFSSL_KEIL
  83139. "adcs r4, r4, r5\n\t"
  83140. #elif defined(__clang__)
  83141. "adcs r4, r5\n\t"
  83142. #else
  83143. "adc r4, r5\n\t"
  83144. #endif
  83145. "stm %[r]!, {r3, r4}\n\t"
  83146. "ldm %[a]!, {r3, r4}\n\t"
  83147. #ifdef WOLFSSL_KEIL
  83148. "adcs r3, r3, r5\n\t"
  83149. #elif defined(__clang__)
  83150. "adcs r3, r5\n\t"
  83151. #else
  83152. "adc r3, r5\n\t"
  83153. #endif
  83154. #ifdef WOLFSSL_KEIL
  83155. "adcs r4, r4, r5\n\t"
  83156. #elif defined(__clang__)
  83157. "adcs r4, r5\n\t"
  83158. #else
  83159. "adc r4, r5\n\t"
  83160. #endif
  83161. "stm %[r]!, {r3, r4}\n\t"
  83162. "ldm %[a]!, {r3, r4}\n\t"
  83163. #ifdef WOLFSSL_KEIL
  83164. "adcs r3, r3, r5\n\t"
  83165. #elif defined(__clang__)
  83166. "adcs r3, r5\n\t"
  83167. #else
  83168. "adc r3, r5\n\t"
  83169. #endif
  83170. #ifdef WOLFSSL_KEIL
  83171. "adcs r4, r4, r5\n\t"
  83172. #elif defined(__clang__)
  83173. "adcs r4, r5\n\t"
  83174. #else
  83175. "adc r4, r5\n\t"
  83176. #endif
  83177. "stm %[r]!, {r3, r4}\n\t"
  83178. "ldm %[a]!, {r3, r4}\n\t"
  83179. #ifdef WOLFSSL_KEIL
  83180. "adcs r3, r3, r5\n\t"
  83181. #elif defined(__clang__)
  83182. "adcs r3, r5\n\t"
  83183. #else
  83184. "adc r3, r5\n\t"
  83185. #endif
  83186. #ifdef WOLFSSL_KEIL
  83187. "adcs r4, r4, r5\n\t"
  83188. #elif defined(__clang__)
  83189. "adcs r4, r5\n\t"
  83190. #else
  83191. "adc r4, r5\n\t"
  83192. #endif
  83193. "stm %[r]!, {r3, r4}\n\t"
  83194. "ldm %[a]!, {r3, r4}\n\t"
  83195. #ifdef WOLFSSL_KEIL
  83196. "adcs r3, r3, r5\n\t"
  83197. #elif defined(__clang__)
  83198. "adcs r3, r5\n\t"
  83199. #else
  83200. "adc r3, r5\n\t"
  83201. #endif
  83202. #ifdef WOLFSSL_KEIL
  83203. "adcs r4, r4, r5\n\t"
  83204. #elif defined(__clang__)
  83205. "adcs r4, r5\n\t"
  83206. #else
  83207. "adc r4, r5\n\t"
  83208. #endif
  83209. "stm %[r]!, {r3, r4}\n\t"
  83210. "ldm %[a]!, {r3, r4}\n\t"
  83211. #ifdef WOLFSSL_KEIL
  83212. "adcs r3, r3, r5\n\t"
  83213. #elif defined(__clang__)
  83214. "adcs r3, r5\n\t"
  83215. #else
  83216. "adc r3, r5\n\t"
  83217. #endif
  83218. #ifdef WOLFSSL_KEIL
  83219. "adcs r4, r4, r5\n\t"
  83220. #elif defined(__clang__)
  83221. "adcs r4, r5\n\t"
  83222. #else
  83223. "adc r4, r5\n\t"
  83224. #endif
  83225. "stm %[r]!, {r3, r4}\n\t"
  83226. "ldm %[a]!, {r3, r4}\n\t"
  83227. #ifdef WOLFSSL_KEIL
  83228. "adcs r3, r3, r5\n\t"
  83229. #elif defined(__clang__)
  83230. "adcs r3, r5\n\t"
  83231. #else
  83232. "adc r3, r5\n\t"
  83233. #endif
  83234. #ifdef WOLFSSL_KEIL
  83235. "adcs r4, r4, r5\n\t"
  83236. #elif defined(__clang__)
  83237. "adcs r4, r5\n\t"
  83238. #else
  83239. "adc r4, r5\n\t"
  83240. #endif
  83241. "stm %[r]!, {r3, r4}\n\t"
  83242. "ldm %[a]!, {r3, r4}\n\t"
  83243. #ifdef WOLFSSL_KEIL
  83244. "adcs r3, r3, r5\n\t"
  83245. #elif defined(__clang__)
  83246. "adcs r3, r5\n\t"
  83247. #else
  83248. "adc r3, r5\n\t"
  83249. #endif
  83250. #ifdef WOLFSSL_KEIL
  83251. "adcs r4, r4, r5\n\t"
  83252. #elif defined(__clang__)
  83253. "adcs r4, r5\n\t"
  83254. #else
  83255. "adc r4, r5\n\t"
  83256. #endif
  83257. "stm %[r]!, {r3, r4}\n\t"
  83258. "ldm %[a]!, {r3, r4}\n\t"
  83259. #ifdef WOLFSSL_KEIL
  83260. "adcs r3, r3, r5\n\t"
  83261. #elif defined(__clang__)
  83262. "adcs r3, r5\n\t"
  83263. #else
  83264. "adc r3, r5\n\t"
  83265. #endif
  83266. #ifdef WOLFSSL_KEIL
  83267. "adcs r4, r4, r5\n\t"
  83268. #elif defined(__clang__)
  83269. "adcs r4, r5\n\t"
  83270. #else
  83271. "adc r4, r5\n\t"
  83272. #endif
  83273. "stm %[r]!, {r3, r4}\n\t"
  83274. "ldm %[a]!, {r3, r4}\n\t"
  83275. #ifdef WOLFSSL_KEIL
  83276. "adcs r3, r3, r5\n\t"
  83277. #elif defined(__clang__)
  83278. "adcs r3, r5\n\t"
  83279. #else
  83280. "adc r3, r5\n\t"
  83281. #endif
  83282. #ifdef WOLFSSL_KEIL
  83283. "adcs r4, r4, r5\n\t"
  83284. #elif defined(__clang__)
  83285. "adcs r4, r5\n\t"
  83286. #else
  83287. "adc r4, r5\n\t"
  83288. #endif
  83289. "stm %[r]!, {r3, r4}\n\t"
  83290. "ldm %[a]!, {r3, r4}\n\t"
  83291. #ifdef WOLFSSL_KEIL
  83292. "adcs r3, r3, r5\n\t"
  83293. #elif defined(__clang__)
  83294. "adcs r3, r5\n\t"
  83295. #else
  83296. "adc r3, r5\n\t"
  83297. #endif
  83298. #ifdef WOLFSSL_KEIL
  83299. "adcs r4, r4, r5\n\t"
  83300. #elif defined(__clang__)
  83301. "adcs r4, r5\n\t"
  83302. #else
  83303. "adc r4, r5\n\t"
  83304. #endif
  83305. "stm %[r]!, {r3, r4}\n\t"
  83306. "ldm %[a]!, {r3, r4}\n\t"
  83307. #ifdef WOLFSSL_KEIL
  83308. "adcs r3, r3, r5\n\t"
  83309. #elif defined(__clang__)
  83310. "adcs r3, r5\n\t"
  83311. #else
  83312. "adc r3, r5\n\t"
  83313. #endif
  83314. #ifdef WOLFSSL_KEIL
  83315. "adcs r4, r4, r5\n\t"
  83316. #elif defined(__clang__)
  83317. "adcs r4, r5\n\t"
  83318. #else
  83319. "adc r4, r5\n\t"
  83320. #endif
  83321. "stm %[r]!, {r3, r4}\n\t"
  83322. "ldm %[a]!, {r3, r4}\n\t"
  83323. #ifdef WOLFSSL_KEIL
  83324. "adcs r3, r3, r5\n\t"
  83325. #elif defined(__clang__)
  83326. "adcs r3, r5\n\t"
  83327. #else
  83328. "adc r3, r5\n\t"
  83329. #endif
  83330. #ifdef WOLFSSL_KEIL
  83331. "adcs r4, r4, r5\n\t"
  83332. #elif defined(__clang__)
  83333. "adcs r4, r5\n\t"
  83334. #else
  83335. "adc r4, r5\n\t"
  83336. #endif
  83337. "stm %[r]!, {r3, r4}\n\t"
  83338. "ldm %[a]!, {r3, r4}\n\t"
  83339. #ifdef WOLFSSL_KEIL
  83340. "adcs r3, r3, r5\n\t"
  83341. #elif defined(__clang__)
  83342. "adcs r3, r5\n\t"
  83343. #else
  83344. "adc r3, r5\n\t"
  83345. #endif
  83346. #ifdef WOLFSSL_KEIL
  83347. "adcs r4, r4, r5\n\t"
  83348. #elif defined(__clang__)
  83349. "adcs r4, r5\n\t"
  83350. #else
  83351. "adc r4, r5\n\t"
  83352. #endif
  83353. "stm %[r]!, {r3, r4}\n\t"
  83354. "ldm %[a]!, {r3, r4}\n\t"
  83355. #ifdef WOLFSSL_KEIL
  83356. "adcs r3, r3, r5\n\t"
  83357. #elif defined(__clang__)
  83358. "adcs r3, r5\n\t"
  83359. #else
  83360. "adc r3, r5\n\t"
  83361. #endif
  83362. #ifdef WOLFSSL_KEIL
  83363. "adcs r4, r4, r5\n\t"
  83364. #elif defined(__clang__)
  83365. "adcs r4, r5\n\t"
  83366. #else
  83367. "adc r4, r5\n\t"
  83368. #endif
  83369. "stm %[r]!, {r3, r4}\n\t"
  83370. "ldm %[a]!, {r3, r4}\n\t"
  83371. #ifdef WOLFSSL_KEIL
  83372. "adcs r3, r3, r5\n\t"
  83373. #elif defined(__clang__)
  83374. "adcs r3, r5\n\t"
  83375. #else
  83376. "adc r3, r5\n\t"
  83377. #endif
  83378. #ifdef WOLFSSL_KEIL
  83379. "adcs r4, r4, r5\n\t"
  83380. #elif defined(__clang__)
  83381. "adcs r4, r5\n\t"
  83382. #else
  83383. "adc r4, r5\n\t"
  83384. #endif
  83385. "stm %[r]!, {r3, r4}\n\t"
  83386. "ldm %[a]!, {r3, r4}\n\t"
  83387. #ifdef WOLFSSL_KEIL
  83388. "adcs r3, r3, r5\n\t"
  83389. #elif defined(__clang__)
  83390. "adcs r3, r5\n\t"
  83391. #else
  83392. "adc r3, r5\n\t"
  83393. #endif
  83394. #ifdef WOLFSSL_KEIL
  83395. "adcs r4, r4, r5\n\t"
  83396. #elif defined(__clang__)
  83397. "adcs r4, r5\n\t"
  83398. #else
  83399. "adc r4, r5\n\t"
  83400. #endif
  83401. "stm %[r]!, {r3, r4}\n\t"
  83402. "ldm %[a]!, {r3, r4}\n\t"
  83403. #ifdef WOLFSSL_KEIL
  83404. "adcs r3, r3, r5\n\t"
  83405. #elif defined(__clang__)
  83406. "adcs r3, r5\n\t"
  83407. #else
  83408. "adc r3, r5\n\t"
  83409. #endif
  83410. #ifdef WOLFSSL_KEIL
  83411. "adcs r4, r4, r5\n\t"
  83412. #elif defined(__clang__)
  83413. "adcs r4, r5\n\t"
  83414. #else
  83415. "adc r4, r5\n\t"
  83416. #endif
  83417. "stm %[r]!, {r3, r4}\n\t"
  83418. "ldm %[a]!, {r3, r4}\n\t"
  83419. #ifdef WOLFSSL_KEIL
  83420. "adcs r3, r3, r5\n\t"
  83421. #elif defined(__clang__)
  83422. "adcs r3, r5\n\t"
  83423. #else
  83424. "adc r3, r5\n\t"
  83425. #endif
  83426. #ifdef WOLFSSL_KEIL
  83427. "adcs r4, r4, r5\n\t"
  83428. #elif defined(__clang__)
  83429. "adcs r4, r5\n\t"
  83430. #else
  83431. "adc r4, r5\n\t"
  83432. #endif
  83433. "stm %[r]!, {r3, r4}\n\t"
  83434. "ldm %[a]!, {r3, r4}\n\t"
  83435. #ifdef WOLFSSL_KEIL
  83436. "adcs r3, r3, r5\n\t"
  83437. #elif defined(__clang__)
  83438. "adcs r3, r5\n\t"
  83439. #else
  83440. "adc r3, r5\n\t"
  83441. #endif
  83442. #ifdef WOLFSSL_KEIL
  83443. "adcs r4, r4, r5\n\t"
  83444. #elif defined(__clang__)
  83445. "adcs r4, r5\n\t"
  83446. #else
  83447. "adc r4, r5\n\t"
  83448. #endif
  83449. "stm %[r]!, {r3, r4}\n\t"
  83450. "movs %[r], #0\n\t"
  83451. #ifdef WOLFSSL_KEIL
  83452. "adcs %[r], %[r], %[r]\n\t"
  83453. #elif defined(__clang__)
  83454. "adcs %[r], %[r]\n\t"
  83455. #else
  83456. "adc %[r], %[r]\n\t"
  83457. #endif
  83458. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  83459. :
  83460. : "memory", "r3", "r4", "r5"
  83461. );
  83462. return (uint32_t)(size_t)r;
  83463. }
  83464. /* Sub b from a into a. (a -= b)
  83465. *
  83466. * a A single precision integer.
  83467. * b A single precision integer.
  83468. */
  83469. SP_NOINLINE static sp_digit sp_4096_sub_in_place_128(sp_digit* a,
  83470. const sp_digit* b)
  83471. {
  83472. __asm__ __volatile__ (
  83473. "ldm %[b]!, {r4, r5}\n\t"
  83474. "ldr r2, [%[a]]\n\t"
  83475. "ldr r3, [%[a], #4]\n\t"
  83476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  83477. "subs r2, r2, r4\n\t"
  83478. #else
  83479. "sub r2, r2, r4\n\t"
  83480. #endif
  83481. #ifdef WOLFSSL_KEIL
  83482. "sbcs r3, r3, r5\n\t"
  83483. #elif defined(__clang__)
  83484. "sbcs r3, r5\n\t"
  83485. #else
  83486. "sbc r3, r5\n\t"
  83487. #endif
  83488. "stm %[a]!, {r2, r3}\n\t"
  83489. "ldm %[b]!, {r4, r5}\n\t"
  83490. "ldr r2, [%[a]]\n\t"
  83491. "ldr r3, [%[a], #4]\n\t"
  83492. #ifdef WOLFSSL_KEIL
  83493. "sbcs r2, r2, r4\n\t"
  83494. #elif defined(__clang__)
  83495. "sbcs r2, r4\n\t"
  83496. #else
  83497. "sbc r2, r4\n\t"
  83498. #endif
  83499. #ifdef WOLFSSL_KEIL
  83500. "sbcs r3, r3, r5\n\t"
  83501. #elif defined(__clang__)
  83502. "sbcs r3, r5\n\t"
  83503. #else
  83504. "sbc r3, r5\n\t"
  83505. #endif
  83506. "stm %[a]!, {r2, r3}\n\t"
  83507. "ldm %[b]!, {r4, r5}\n\t"
  83508. "ldr r2, [%[a]]\n\t"
  83509. "ldr r3, [%[a], #4]\n\t"
  83510. #ifdef WOLFSSL_KEIL
  83511. "sbcs r2, r2, r4\n\t"
  83512. #elif defined(__clang__)
  83513. "sbcs r2, r4\n\t"
  83514. #else
  83515. "sbc r2, r4\n\t"
  83516. #endif
  83517. #ifdef WOLFSSL_KEIL
  83518. "sbcs r3, r3, r5\n\t"
  83519. #elif defined(__clang__)
  83520. "sbcs r3, r5\n\t"
  83521. #else
  83522. "sbc r3, r5\n\t"
  83523. #endif
  83524. "stm %[a]!, {r2, r3}\n\t"
  83525. "ldm %[b]!, {r4, r5}\n\t"
  83526. "ldr r2, [%[a]]\n\t"
  83527. "ldr r3, [%[a], #4]\n\t"
  83528. #ifdef WOLFSSL_KEIL
  83529. "sbcs r2, r2, r4\n\t"
  83530. #elif defined(__clang__)
  83531. "sbcs r2, r4\n\t"
  83532. #else
  83533. "sbc r2, r4\n\t"
  83534. #endif
  83535. #ifdef WOLFSSL_KEIL
  83536. "sbcs r3, r3, r5\n\t"
  83537. #elif defined(__clang__)
  83538. "sbcs r3, r5\n\t"
  83539. #else
  83540. "sbc r3, r5\n\t"
  83541. #endif
  83542. "stm %[a]!, {r2, r3}\n\t"
  83543. "ldm %[b]!, {r4, r5}\n\t"
  83544. "ldr r2, [%[a]]\n\t"
  83545. "ldr r3, [%[a], #4]\n\t"
  83546. #ifdef WOLFSSL_KEIL
  83547. "sbcs r2, r2, r4\n\t"
  83548. #elif defined(__clang__)
  83549. "sbcs r2, r4\n\t"
  83550. #else
  83551. "sbc r2, r4\n\t"
  83552. #endif
  83553. #ifdef WOLFSSL_KEIL
  83554. "sbcs r3, r3, r5\n\t"
  83555. #elif defined(__clang__)
  83556. "sbcs r3, r5\n\t"
  83557. #else
  83558. "sbc r3, r5\n\t"
  83559. #endif
  83560. "stm %[a]!, {r2, r3}\n\t"
  83561. "ldm %[b]!, {r4, r5}\n\t"
  83562. "ldr r2, [%[a]]\n\t"
  83563. "ldr r3, [%[a], #4]\n\t"
  83564. #ifdef WOLFSSL_KEIL
  83565. "sbcs r2, r2, r4\n\t"
  83566. #elif defined(__clang__)
  83567. "sbcs r2, r4\n\t"
  83568. #else
  83569. "sbc r2, r4\n\t"
  83570. #endif
  83571. #ifdef WOLFSSL_KEIL
  83572. "sbcs r3, r3, r5\n\t"
  83573. #elif defined(__clang__)
  83574. "sbcs r3, r5\n\t"
  83575. #else
  83576. "sbc r3, r5\n\t"
  83577. #endif
  83578. "stm %[a]!, {r2, r3}\n\t"
  83579. "ldm %[b]!, {r4, r5}\n\t"
  83580. "ldr r2, [%[a]]\n\t"
  83581. "ldr r3, [%[a], #4]\n\t"
  83582. #ifdef WOLFSSL_KEIL
  83583. "sbcs r2, r2, r4\n\t"
  83584. #elif defined(__clang__)
  83585. "sbcs r2, r4\n\t"
  83586. #else
  83587. "sbc r2, r4\n\t"
  83588. #endif
  83589. #ifdef WOLFSSL_KEIL
  83590. "sbcs r3, r3, r5\n\t"
  83591. #elif defined(__clang__)
  83592. "sbcs r3, r5\n\t"
  83593. #else
  83594. "sbc r3, r5\n\t"
  83595. #endif
  83596. "stm %[a]!, {r2, r3}\n\t"
  83597. "ldm %[b]!, {r4, r5}\n\t"
  83598. "ldr r2, [%[a]]\n\t"
  83599. "ldr r3, [%[a], #4]\n\t"
  83600. #ifdef WOLFSSL_KEIL
  83601. "sbcs r2, r2, r4\n\t"
  83602. #elif defined(__clang__)
  83603. "sbcs r2, r4\n\t"
  83604. #else
  83605. "sbc r2, r4\n\t"
  83606. #endif
  83607. #ifdef WOLFSSL_KEIL
  83608. "sbcs r3, r3, r5\n\t"
  83609. #elif defined(__clang__)
  83610. "sbcs r3, r5\n\t"
  83611. #else
  83612. "sbc r3, r5\n\t"
  83613. #endif
  83614. "stm %[a]!, {r2, r3}\n\t"
  83615. "ldm %[b]!, {r4, r5}\n\t"
  83616. "ldr r2, [%[a]]\n\t"
  83617. "ldr r3, [%[a], #4]\n\t"
  83618. #ifdef WOLFSSL_KEIL
  83619. "sbcs r2, r2, r4\n\t"
  83620. #elif defined(__clang__)
  83621. "sbcs r2, r4\n\t"
  83622. #else
  83623. "sbc r2, r4\n\t"
  83624. #endif
  83625. #ifdef WOLFSSL_KEIL
  83626. "sbcs r3, r3, r5\n\t"
  83627. #elif defined(__clang__)
  83628. "sbcs r3, r5\n\t"
  83629. #else
  83630. "sbc r3, r5\n\t"
  83631. #endif
  83632. "stm %[a]!, {r2, r3}\n\t"
  83633. "ldm %[b]!, {r4, r5}\n\t"
  83634. "ldr r2, [%[a]]\n\t"
  83635. "ldr r3, [%[a], #4]\n\t"
  83636. #ifdef WOLFSSL_KEIL
  83637. "sbcs r2, r2, r4\n\t"
  83638. #elif defined(__clang__)
  83639. "sbcs r2, r4\n\t"
  83640. #else
  83641. "sbc r2, r4\n\t"
  83642. #endif
  83643. #ifdef WOLFSSL_KEIL
  83644. "sbcs r3, r3, r5\n\t"
  83645. #elif defined(__clang__)
  83646. "sbcs r3, r5\n\t"
  83647. #else
  83648. "sbc r3, r5\n\t"
  83649. #endif
  83650. "stm %[a]!, {r2, r3}\n\t"
  83651. "ldm %[b]!, {r4, r5}\n\t"
  83652. "ldr r2, [%[a]]\n\t"
  83653. "ldr r3, [%[a], #4]\n\t"
  83654. #ifdef WOLFSSL_KEIL
  83655. "sbcs r2, r2, r4\n\t"
  83656. #elif defined(__clang__)
  83657. "sbcs r2, r4\n\t"
  83658. #else
  83659. "sbc r2, r4\n\t"
  83660. #endif
  83661. #ifdef WOLFSSL_KEIL
  83662. "sbcs r3, r3, r5\n\t"
  83663. #elif defined(__clang__)
  83664. "sbcs r3, r5\n\t"
  83665. #else
  83666. "sbc r3, r5\n\t"
  83667. #endif
  83668. "stm %[a]!, {r2, r3}\n\t"
  83669. "ldm %[b]!, {r4, r5}\n\t"
  83670. "ldr r2, [%[a]]\n\t"
  83671. "ldr r3, [%[a], #4]\n\t"
  83672. #ifdef WOLFSSL_KEIL
  83673. "sbcs r2, r2, r4\n\t"
  83674. #elif defined(__clang__)
  83675. "sbcs r2, r4\n\t"
  83676. #else
  83677. "sbc r2, r4\n\t"
  83678. #endif
  83679. #ifdef WOLFSSL_KEIL
  83680. "sbcs r3, r3, r5\n\t"
  83681. #elif defined(__clang__)
  83682. "sbcs r3, r5\n\t"
  83683. #else
  83684. "sbc r3, r5\n\t"
  83685. #endif
  83686. "stm %[a]!, {r2, r3}\n\t"
  83687. "ldm %[b]!, {r4, r5}\n\t"
  83688. "ldr r2, [%[a]]\n\t"
  83689. "ldr r3, [%[a], #4]\n\t"
  83690. #ifdef WOLFSSL_KEIL
  83691. "sbcs r2, r2, r4\n\t"
  83692. #elif defined(__clang__)
  83693. "sbcs r2, r4\n\t"
  83694. #else
  83695. "sbc r2, r4\n\t"
  83696. #endif
  83697. #ifdef WOLFSSL_KEIL
  83698. "sbcs r3, r3, r5\n\t"
  83699. #elif defined(__clang__)
  83700. "sbcs r3, r5\n\t"
  83701. #else
  83702. "sbc r3, r5\n\t"
  83703. #endif
  83704. "stm %[a]!, {r2, r3}\n\t"
  83705. "ldm %[b]!, {r4, r5}\n\t"
  83706. "ldr r2, [%[a]]\n\t"
  83707. "ldr r3, [%[a], #4]\n\t"
  83708. #ifdef WOLFSSL_KEIL
  83709. "sbcs r2, r2, r4\n\t"
  83710. #elif defined(__clang__)
  83711. "sbcs r2, r4\n\t"
  83712. #else
  83713. "sbc r2, r4\n\t"
  83714. #endif
  83715. #ifdef WOLFSSL_KEIL
  83716. "sbcs r3, r3, r5\n\t"
  83717. #elif defined(__clang__)
  83718. "sbcs r3, r5\n\t"
  83719. #else
  83720. "sbc r3, r5\n\t"
  83721. #endif
  83722. "stm %[a]!, {r2, r3}\n\t"
  83723. "ldm %[b]!, {r4, r5}\n\t"
  83724. "ldr r2, [%[a]]\n\t"
  83725. "ldr r3, [%[a], #4]\n\t"
  83726. #ifdef WOLFSSL_KEIL
  83727. "sbcs r2, r2, r4\n\t"
  83728. #elif defined(__clang__)
  83729. "sbcs r2, r4\n\t"
  83730. #else
  83731. "sbc r2, r4\n\t"
  83732. #endif
  83733. #ifdef WOLFSSL_KEIL
  83734. "sbcs r3, r3, r5\n\t"
  83735. #elif defined(__clang__)
  83736. "sbcs r3, r5\n\t"
  83737. #else
  83738. "sbc r3, r5\n\t"
  83739. #endif
  83740. "stm %[a]!, {r2, r3}\n\t"
  83741. "ldm %[b]!, {r4, r5}\n\t"
  83742. "ldr r2, [%[a]]\n\t"
  83743. "ldr r3, [%[a], #4]\n\t"
  83744. #ifdef WOLFSSL_KEIL
  83745. "sbcs r2, r2, r4\n\t"
  83746. #elif defined(__clang__)
  83747. "sbcs r2, r4\n\t"
  83748. #else
  83749. "sbc r2, r4\n\t"
  83750. #endif
  83751. #ifdef WOLFSSL_KEIL
  83752. "sbcs r3, r3, r5\n\t"
  83753. #elif defined(__clang__)
  83754. "sbcs r3, r5\n\t"
  83755. #else
  83756. "sbc r3, r5\n\t"
  83757. #endif
  83758. "stm %[a]!, {r2, r3}\n\t"
  83759. "ldm %[b]!, {r4, r5}\n\t"
  83760. "ldr r2, [%[a]]\n\t"
  83761. "ldr r3, [%[a], #4]\n\t"
  83762. #ifdef WOLFSSL_KEIL
  83763. "sbcs r2, r2, r4\n\t"
  83764. #elif defined(__clang__)
  83765. "sbcs r2, r4\n\t"
  83766. #else
  83767. "sbc r2, r4\n\t"
  83768. #endif
  83769. #ifdef WOLFSSL_KEIL
  83770. "sbcs r3, r3, r5\n\t"
  83771. #elif defined(__clang__)
  83772. "sbcs r3, r5\n\t"
  83773. #else
  83774. "sbc r3, r5\n\t"
  83775. #endif
  83776. "stm %[a]!, {r2, r3}\n\t"
  83777. "ldm %[b]!, {r4, r5}\n\t"
  83778. "ldr r2, [%[a]]\n\t"
  83779. "ldr r3, [%[a], #4]\n\t"
  83780. #ifdef WOLFSSL_KEIL
  83781. "sbcs r2, r2, r4\n\t"
  83782. #elif defined(__clang__)
  83783. "sbcs r2, r4\n\t"
  83784. #else
  83785. "sbc r2, r4\n\t"
  83786. #endif
  83787. #ifdef WOLFSSL_KEIL
  83788. "sbcs r3, r3, r5\n\t"
  83789. #elif defined(__clang__)
  83790. "sbcs r3, r5\n\t"
  83791. #else
  83792. "sbc r3, r5\n\t"
  83793. #endif
  83794. "stm %[a]!, {r2, r3}\n\t"
  83795. "ldm %[b]!, {r4, r5}\n\t"
  83796. "ldr r2, [%[a]]\n\t"
  83797. "ldr r3, [%[a], #4]\n\t"
  83798. #ifdef WOLFSSL_KEIL
  83799. "sbcs r2, r2, r4\n\t"
  83800. #elif defined(__clang__)
  83801. "sbcs r2, r4\n\t"
  83802. #else
  83803. "sbc r2, r4\n\t"
  83804. #endif
  83805. #ifdef WOLFSSL_KEIL
  83806. "sbcs r3, r3, r5\n\t"
  83807. #elif defined(__clang__)
  83808. "sbcs r3, r5\n\t"
  83809. #else
  83810. "sbc r3, r5\n\t"
  83811. #endif
  83812. "stm %[a]!, {r2, r3}\n\t"
  83813. "ldm %[b]!, {r4, r5}\n\t"
  83814. "ldr r2, [%[a]]\n\t"
  83815. "ldr r3, [%[a], #4]\n\t"
  83816. #ifdef WOLFSSL_KEIL
  83817. "sbcs r2, r2, r4\n\t"
  83818. #elif defined(__clang__)
  83819. "sbcs r2, r4\n\t"
  83820. #else
  83821. "sbc r2, r4\n\t"
  83822. #endif
  83823. #ifdef WOLFSSL_KEIL
  83824. "sbcs r3, r3, r5\n\t"
  83825. #elif defined(__clang__)
  83826. "sbcs r3, r5\n\t"
  83827. #else
  83828. "sbc r3, r5\n\t"
  83829. #endif
  83830. "stm %[a]!, {r2, r3}\n\t"
  83831. "ldm %[b]!, {r4, r5}\n\t"
  83832. "ldr r2, [%[a]]\n\t"
  83833. "ldr r3, [%[a], #4]\n\t"
  83834. #ifdef WOLFSSL_KEIL
  83835. "sbcs r2, r2, r4\n\t"
  83836. #elif defined(__clang__)
  83837. "sbcs r2, r4\n\t"
  83838. #else
  83839. "sbc r2, r4\n\t"
  83840. #endif
  83841. #ifdef WOLFSSL_KEIL
  83842. "sbcs r3, r3, r5\n\t"
  83843. #elif defined(__clang__)
  83844. "sbcs r3, r5\n\t"
  83845. #else
  83846. "sbc r3, r5\n\t"
  83847. #endif
  83848. "stm %[a]!, {r2, r3}\n\t"
  83849. "ldm %[b]!, {r4, r5}\n\t"
  83850. "ldr r2, [%[a]]\n\t"
  83851. "ldr r3, [%[a], #4]\n\t"
  83852. #ifdef WOLFSSL_KEIL
  83853. "sbcs r2, r2, r4\n\t"
  83854. #elif defined(__clang__)
  83855. "sbcs r2, r4\n\t"
  83856. #else
  83857. "sbc r2, r4\n\t"
  83858. #endif
  83859. #ifdef WOLFSSL_KEIL
  83860. "sbcs r3, r3, r5\n\t"
  83861. #elif defined(__clang__)
  83862. "sbcs r3, r5\n\t"
  83863. #else
  83864. "sbc r3, r5\n\t"
  83865. #endif
  83866. "stm %[a]!, {r2, r3}\n\t"
  83867. "ldm %[b]!, {r4, r5}\n\t"
  83868. "ldr r2, [%[a]]\n\t"
  83869. "ldr r3, [%[a], #4]\n\t"
  83870. #ifdef WOLFSSL_KEIL
  83871. "sbcs r2, r2, r4\n\t"
  83872. #elif defined(__clang__)
  83873. "sbcs r2, r4\n\t"
  83874. #else
  83875. "sbc r2, r4\n\t"
  83876. #endif
  83877. #ifdef WOLFSSL_KEIL
  83878. "sbcs r3, r3, r5\n\t"
  83879. #elif defined(__clang__)
  83880. "sbcs r3, r5\n\t"
  83881. #else
  83882. "sbc r3, r5\n\t"
  83883. #endif
  83884. "stm %[a]!, {r2, r3}\n\t"
  83885. "ldm %[b]!, {r4, r5}\n\t"
  83886. "ldr r2, [%[a]]\n\t"
  83887. "ldr r3, [%[a], #4]\n\t"
  83888. #ifdef WOLFSSL_KEIL
  83889. "sbcs r2, r2, r4\n\t"
  83890. #elif defined(__clang__)
  83891. "sbcs r2, r4\n\t"
  83892. #else
  83893. "sbc r2, r4\n\t"
  83894. #endif
  83895. #ifdef WOLFSSL_KEIL
  83896. "sbcs r3, r3, r5\n\t"
  83897. #elif defined(__clang__)
  83898. "sbcs r3, r5\n\t"
  83899. #else
  83900. "sbc r3, r5\n\t"
  83901. #endif
  83902. "stm %[a]!, {r2, r3}\n\t"
  83903. "ldm %[b]!, {r4, r5}\n\t"
  83904. "ldr r2, [%[a]]\n\t"
  83905. "ldr r3, [%[a], #4]\n\t"
  83906. #ifdef WOLFSSL_KEIL
  83907. "sbcs r2, r2, r4\n\t"
  83908. #elif defined(__clang__)
  83909. "sbcs r2, r4\n\t"
  83910. #else
  83911. "sbc r2, r4\n\t"
  83912. #endif
  83913. #ifdef WOLFSSL_KEIL
  83914. "sbcs r3, r3, r5\n\t"
  83915. #elif defined(__clang__)
  83916. "sbcs r3, r5\n\t"
  83917. #else
  83918. "sbc r3, r5\n\t"
  83919. #endif
  83920. "stm %[a]!, {r2, r3}\n\t"
  83921. "ldm %[b]!, {r4, r5}\n\t"
  83922. "ldr r2, [%[a]]\n\t"
  83923. "ldr r3, [%[a], #4]\n\t"
  83924. #ifdef WOLFSSL_KEIL
  83925. "sbcs r2, r2, r4\n\t"
  83926. #elif defined(__clang__)
  83927. "sbcs r2, r4\n\t"
  83928. #else
  83929. "sbc r2, r4\n\t"
  83930. #endif
  83931. #ifdef WOLFSSL_KEIL
  83932. "sbcs r3, r3, r5\n\t"
  83933. #elif defined(__clang__)
  83934. "sbcs r3, r5\n\t"
  83935. #else
  83936. "sbc r3, r5\n\t"
  83937. #endif
  83938. "stm %[a]!, {r2, r3}\n\t"
  83939. "ldm %[b]!, {r4, r5}\n\t"
  83940. "ldr r2, [%[a]]\n\t"
  83941. "ldr r3, [%[a], #4]\n\t"
  83942. #ifdef WOLFSSL_KEIL
  83943. "sbcs r2, r2, r4\n\t"
  83944. #elif defined(__clang__)
  83945. "sbcs r2, r4\n\t"
  83946. #else
  83947. "sbc r2, r4\n\t"
  83948. #endif
  83949. #ifdef WOLFSSL_KEIL
  83950. "sbcs r3, r3, r5\n\t"
  83951. #elif defined(__clang__)
  83952. "sbcs r3, r5\n\t"
  83953. #else
  83954. "sbc r3, r5\n\t"
  83955. #endif
  83956. "stm %[a]!, {r2, r3}\n\t"
  83957. "ldm %[b]!, {r4, r5}\n\t"
  83958. "ldr r2, [%[a]]\n\t"
  83959. "ldr r3, [%[a], #4]\n\t"
  83960. #ifdef WOLFSSL_KEIL
  83961. "sbcs r2, r2, r4\n\t"
  83962. #elif defined(__clang__)
  83963. "sbcs r2, r4\n\t"
  83964. #else
  83965. "sbc r2, r4\n\t"
  83966. #endif
  83967. #ifdef WOLFSSL_KEIL
  83968. "sbcs r3, r3, r5\n\t"
  83969. #elif defined(__clang__)
  83970. "sbcs r3, r5\n\t"
  83971. #else
  83972. "sbc r3, r5\n\t"
  83973. #endif
  83974. "stm %[a]!, {r2, r3}\n\t"
  83975. "ldm %[b]!, {r4, r5}\n\t"
  83976. "ldr r2, [%[a]]\n\t"
  83977. "ldr r3, [%[a], #4]\n\t"
  83978. #ifdef WOLFSSL_KEIL
  83979. "sbcs r2, r2, r4\n\t"
  83980. #elif defined(__clang__)
  83981. "sbcs r2, r4\n\t"
  83982. #else
  83983. "sbc r2, r4\n\t"
  83984. #endif
  83985. #ifdef WOLFSSL_KEIL
  83986. "sbcs r3, r3, r5\n\t"
  83987. #elif defined(__clang__)
  83988. "sbcs r3, r5\n\t"
  83989. #else
  83990. "sbc r3, r5\n\t"
  83991. #endif
  83992. "stm %[a]!, {r2, r3}\n\t"
  83993. "ldm %[b]!, {r4, r5}\n\t"
  83994. "ldr r2, [%[a]]\n\t"
  83995. "ldr r3, [%[a], #4]\n\t"
  83996. #ifdef WOLFSSL_KEIL
  83997. "sbcs r2, r2, r4\n\t"
  83998. #elif defined(__clang__)
  83999. "sbcs r2, r4\n\t"
  84000. #else
  84001. "sbc r2, r4\n\t"
  84002. #endif
  84003. #ifdef WOLFSSL_KEIL
  84004. "sbcs r3, r3, r5\n\t"
  84005. #elif defined(__clang__)
  84006. "sbcs r3, r5\n\t"
  84007. #else
  84008. "sbc r3, r5\n\t"
  84009. #endif
  84010. "stm %[a]!, {r2, r3}\n\t"
  84011. "ldm %[b]!, {r4, r5}\n\t"
  84012. "ldr r2, [%[a]]\n\t"
  84013. "ldr r3, [%[a], #4]\n\t"
  84014. #ifdef WOLFSSL_KEIL
  84015. "sbcs r2, r2, r4\n\t"
  84016. #elif defined(__clang__)
  84017. "sbcs r2, r4\n\t"
  84018. #else
  84019. "sbc r2, r4\n\t"
  84020. #endif
  84021. #ifdef WOLFSSL_KEIL
  84022. "sbcs r3, r3, r5\n\t"
  84023. #elif defined(__clang__)
  84024. "sbcs r3, r5\n\t"
  84025. #else
  84026. "sbc r3, r5\n\t"
  84027. #endif
  84028. "stm %[a]!, {r2, r3}\n\t"
  84029. "ldm %[b]!, {r4, r5}\n\t"
  84030. "ldr r2, [%[a]]\n\t"
  84031. "ldr r3, [%[a], #4]\n\t"
  84032. #ifdef WOLFSSL_KEIL
  84033. "sbcs r2, r2, r4\n\t"
  84034. #elif defined(__clang__)
  84035. "sbcs r2, r4\n\t"
  84036. #else
  84037. "sbc r2, r4\n\t"
  84038. #endif
  84039. #ifdef WOLFSSL_KEIL
  84040. "sbcs r3, r3, r5\n\t"
  84041. #elif defined(__clang__)
  84042. "sbcs r3, r5\n\t"
  84043. #else
  84044. "sbc r3, r5\n\t"
  84045. #endif
  84046. "stm %[a]!, {r2, r3}\n\t"
  84047. "ldm %[b]!, {r4, r5}\n\t"
  84048. "ldr r2, [%[a]]\n\t"
  84049. "ldr r3, [%[a], #4]\n\t"
  84050. #ifdef WOLFSSL_KEIL
  84051. "sbcs r2, r2, r4\n\t"
  84052. #elif defined(__clang__)
  84053. "sbcs r2, r4\n\t"
  84054. #else
  84055. "sbc r2, r4\n\t"
  84056. #endif
  84057. #ifdef WOLFSSL_KEIL
  84058. "sbcs r3, r3, r5\n\t"
  84059. #elif defined(__clang__)
  84060. "sbcs r3, r5\n\t"
  84061. #else
  84062. "sbc r3, r5\n\t"
  84063. #endif
  84064. "stm %[a]!, {r2, r3}\n\t"
  84065. "ldm %[b]!, {r4, r5}\n\t"
  84066. "ldr r2, [%[a]]\n\t"
  84067. "ldr r3, [%[a], #4]\n\t"
  84068. #ifdef WOLFSSL_KEIL
  84069. "sbcs r2, r2, r4\n\t"
  84070. #elif defined(__clang__)
  84071. "sbcs r2, r4\n\t"
  84072. #else
  84073. "sbc r2, r4\n\t"
  84074. #endif
  84075. #ifdef WOLFSSL_KEIL
  84076. "sbcs r3, r3, r5\n\t"
  84077. #elif defined(__clang__)
  84078. "sbcs r3, r5\n\t"
  84079. #else
  84080. "sbc r3, r5\n\t"
  84081. #endif
  84082. "stm %[a]!, {r2, r3}\n\t"
  84083. "ldm %[b]!, {r4, r5}\n\t"
  84084. "ldr r2, [%[a]]\n\t"
  84085. "ldr r3, [%[a], #4]\n\t"
  84086. #ifdef WOLFSSL_KEIL
  84087. "sbcs r2, r2, r4\n\t"
  84088. #elif defined(__clang__)
  84089. "sbcs r2, r4\n\t"
  84090. #else
  84091. "sbc r2, r4\n\t"
  84092. #endif
  84093. #ifdef WOLFSSL_KEIL
  84094. "sbcs r3, r3, r5\n\t"
  84095. #elif defined(__clang__)
  84096. "sbcs r3, r5\n\t"
  84097. #else
  84098. "sbc r3, r5\n\t"
  84099. #endif
  84100. "stm %[a]!, {r2, r3}\n\t"
  84101. "ldm %[b]!, {r4, r5}\n\t"
  84102. "ldr r2, [%[a]]\n\t"
  84103. "ldr r3, [%[a], #4]\n\t"
  84104. #ifdef WOLFSSL_KEIL
  84105. "sbcs r2, r2, r4\n\t"
  84106. #elif defined(__clang__)
  84107. "sbcs r2, r4\n\t"
  84108. #else
  84109. "sbc r2, r4\n\t"
  84110. #endif
  84111. #ifdef WOLFSSL_KEIL
  84112. "sbcs r3, r3, r5\n\t"
  84113. #elif defined(__clang__)
  84114. "sbcs r3, r5\n\t"
  84115. #else
  84116. "sbc r3, r5\n\t"
  84117. #endif
  84118. "stm %[a]!, {r2, r3}\n\t"
  84119. "ldm %[b]!, {r4, r5}\n\t"
  84120. "ldr r2, [%[a]]\n\t"
  84121. "ldr r3, [%[a], #4]\n\t"
  84122. #ifdef WOLFSSL_KEIL
  84123. "sbcs r2, r2, r4\n\t"
  84124. #elif defined(__clang__)
  84125. "sbcs r2, r4\n\t"
  84126. #else
  84127. "sbc r2, r4\n\t"
  84128. #endif
  84129. #ifdef WOLFSSL_KEIL
  84130. "sbcs r3, r3, r5\n\t"
  84131. #elif defined(__clang__)
  84132. "sbcs r3, r5\n\t"
  84133. #else
  84134. "sbc r3, r5\n\t"
  84135. #endif
  84136. "stm %[a]!, {r2, r3}\n\t"
  84137. "ldm %[b]!, {r4, r5}\n\t"
  84138. "ldr r2, [%[a]]\n\t"
  84139. "ldr r3, [%[a], #4]\n\t"
  84140. #ifdef WOLFSSL_KEIL
  84141. "sbcs r2, r2, r4\n\t"
  84142. #elif defined(__clang__)
  84143. "sbcs r2, r4\n\t"
  84144. #else
  84145. "sbc r2, r4\n\t"
  84146. #endif
  84147. #ifdef WOLFSSL_KEIL
  84148. "sbcs r3, r3, r5\n\t"
  84149. #elif defined(__clang__)
  84150. "sbcs r3, r5\n\t"
  84151. #else
  84152. "sbc r3, r5\n\t"
  84153. #endif
  84154. "stm %[a]!, {r2, r3}\n\t"
  84155. "ldm %[b]!, {r4, r5}\n\t"
  84156. "ldr r2, [%[a]]\n\t"
  84157. "ldr r3, [%[a], #4]\n\t"
  84158. #ifdef WOLFSSL_KEIL
  84159. "sbcs r2, r2, r4\n\t"
  84160. #elif defined(__clang__)
  84161. "sbcs r2, r4\n\t"
  84162. #else
  84163. "sbc r2, r4\n\t"
  84164. #endif
  84165. #ifdef WOLFSSL_KEIL
  84166. "sbcs r3, r3, r5\n\t"
  84167. #elif defined(__clang__)
  84168. "sbcs r3, r5\n\t"
  84169. #else
  84170. "sbc r3, r5\n\t"
  84171. #endif
  84172. "stm %[a]!, {r2, r3}\n\t"
  84173. "ldm %[b]!, {r4, r5}\n\t"
  84174. "ldr r2, [%[a]]\n\t"
  84175. "ldr r3, [%[a], #4]\n\t"
  84176. #ifdef WOLFSSL_KEIL
  84177. "sbcs r2, r2, r4\n\t"
  84178. #elif defined(__clang__)
  84179. "sbcs r2, r4\n\t"
  84180. #else
  84181. "sbc r2, r4\n\t"
  84182. #endif
  84183. #ifdef WOLFSSL_KEIL
  84184. "sbcs r3, r3, r5\n\t"
  84185. #elif defined(__clang__)
  84186. "sbcs r3, r5\n\t"
  84187. #else
  84188. "sbc r3, r5\n\t"
  84189. #endif
  84190. "stm %[a]!, {r2, r3}\n\t"
  84191. "ldm %[b]!, {r4, r5}\n\t"
  84192. "ldr r2, [%[a]]\n\t"
  84193. "ldr r3, [%[a], #4]\n\t"
  84194. #ifdef WOLFSSL_KEIL
  84195. "sbcs r2, r2, r4\n\t"
  84196. #elif defined(__clang__)
  84197. "sbcs r2, r4\n\t"
  84198. #else
  84199. "sbc r2, r4\n\t"
  84200. #endif
  84201. #ifdef WOLFSSL_KEIL
  84202. "sbcs r3, r3, r5\n\t"
  84203. #elif defined(__clang__)
  84204. "sbcs r3, r5\n\t"
  84205. #else
  84206. "sbc r3, r5\n\t"
  84207. #endif
  84208. "stm %[a]!, {r2, r3}\n\t"
  84209. "ldm %[b]!, {r4, r5}\n\t"
  84210. "ldr r2, [%[a]]\n\t"
  84211. "ldr r3, [%[a], #4]\n\t"
  84212. #ifdef WOLFSSL_KEIL
  84213. "sbcs r2, r2, r4\n\t"
  84214. #elif defined(__clang__)
  84215. "sbcs r2, r4\n\t"
  84216. #else
  84217. "sbc r2, r4\n\t"
  84218. #endif
  84219. #ifdef WOLFSSL_KEIL
  84220. "sbcs r3, r3, r5\n\t"
  84221. #elif defined(__clang__)
  84222. "sbcs r3, r5\n\t"
  84223. #else
  84224. "sbc r3, r5\n\t"
  84225. #endif
  84226. "stm %[a]!, {r2, r3}\n\t"
  84227. "ldm %[b]!, {r4, r5}\n\t"
  84228. "ldr r2, [%[a]]\n\t"
  84229. "ldr r3, [%[a], #4]\n\t"
  84230. #ifdef WOLFSSL_KEIL
  84231. "sbcs r2, r2, r4\n\t"
  84232. #elif defined(__clang__)
  84233. "sbcs r2, r4\n\t"
  84234. #else
  84235. "sbc r2, r4\n\t"
  84236. #endif
  84237. #ifdef WOLFSSL_KEIL
  84238. "sbcs r3, r3, r5\n\t"
  84239. #elif defined(__clang__)
  84240. "sbcs r3, r5\n\t"
  84241. #else
  84242. "sbc r3, r5\n\t"
  84243. #endif
  84244. "stm %[a]!, {r2, r3}\n\t"
  84245. "ldm %[b]!, {r4, r5}\n\t"
  84246. "ldr r2, [%[a]]\n\t"
  84247. "ldr r3, [%[a], #4]\n\t"
  84248. #ifdef WOLFSSL_KEIL
  84249. "sbcs r2, r2, r4\n\t"
  84250. #elif defined(__clang__)
  84251. "sbcs r2, r4\n\t"
  84252. #else
  84253. "sbc r2, r4\n\t"
  84254. #endif
  84255. #ifdef WOLFSSL_KEIL
  84256. "sbcs r3, r3, r5\n\t"
  84257. #elif defined(__clang__)
  84258. "sbcs r3, r5\n\t"
  84259. #else
  84260. "sbc r3, r5\n\t"
  84261. #endif
  84262. "stm %[a]!, {r2, r3}\n\t"
  84263. "ldm %[b]!, {r4, r5}\n\t"
  84264. "ldr r2, [%[a]]\n\t"
  84265. "ldr r3, [%[a], #4]\n\t"
  84266. #ifdef WOLFSSL_KEIL
  84267. "sbcs r2, r2, r4\n\t"
  84268. #elif defined(__clang__)
  84269. "sbcs r2, r4\n\t"
  84270. #else
  84271. "sbc r2, r4\n\t"
  84272. #endif
  84273. #ifdef WOLFSSL_KEIL
  84274. "sbcs r3, r3, r5\n\t"
  84275. #elif defined(__clang__)
  84276. "sbcs r3, r5\n\t"
  84277. #else
  84278. "sbc r3, r5\n\t"
  84279. #endif
  84280. "stm %[a]!, {r2, r3}\n\t"
  84281. "ldm %[b]!, {r4, r5}\n\t"
  84282. "ldr r2, [%[a]]\n\t"
  84283. "ldr r3, [%[a], #4]\n\t"
  84284. #ifdef WOLFSSL_KEIL
  84285. "sbcs r2, r2, r4\n\t"
  84286. #elif defined(__clang__)
  84287. "sbcs r2, r4\n\t"
  84288. #else
  84289. "sbc r2, r4\n\t"
  84290. #endif
  84291. #ifdef WOLFSSL_KEIL
  84292. "sbcs r3, r3, r5\n\t"
  84293. #elif defined(__clang__)
  84294. "sbcs r3, r5\n\t"
  84295. #else
  84296. "sbc r3, r5\n\t"
  84297. #endif
  84298. "stm %[a]!, {r2, r3}\n\t"
  84299. "ldm %[b]!, {r4, r5}\n\t"
  84300. "ldr r2, [%[a]]\n\t"
  84301. "ldr r3, [%[a], #4]\n\t"
  84302. #ifdef WOLFSSL_KEIL
  84303. "sbcs r2, r2, r4\n\t"
  84304. #elif defined(__clang__)
  84305. "sbcs r2, r4\n\t"
  84306. #else
  84307. "sbc r2, r4\n\t"
  84308. #endif
  84309. #ifdef WOLFSSL_KEIL
  84310. "sbcs r3, r3, r5\n\t"
  84311. #elif defined(__clang__)
  84312. "sbcs r3, r5\n\t"
  84313. #else
  84314. "sbc r3, r5\n\t"
  84315. #endif
  84316. "stm %[a]!, {r2, r3}\n\t"
  84317. "ldm %[b]!, {r4, r5}\n\t"
  84318. "ldr r2, [%[a]]\n\t"
  84319. "ldr r3, [%[a], #4]\n\t"
  84320. #ifdef WOLFSSL_KEIL
  84321. "sbcs r2, r2, r4\n\t"
  84322. #elif defined(__clang__)
  84323. "sbcs r2, r4\n\t"
  84324. #else
  84325. "sbc r2, r4\n\t"
  84326. #endif
  84327. #ifdef WOLFSSL_KEIL
  84328. "sbcs r3, r3, r5\n\t"
  84329. #elif defined(__clang__)
  84330. "sbcs r3, r5\n\t"
  84331. #else
  84332. "sbc r3, r5\n\t"
  84333. #endif
  84334. "stm %[a]!, {r2, r3}\n\t"
  84335. "ldm %[b]!, {r4, r5}\n\t"
  84336. "ldr r2, [%[a]]\n\t"
  84337. "ldr r3, [%[a], #4]\n\t"
  84338. #ifdef WOLFSSL_KEIL
  84339. "sbcs r2, r2, r4\n\t"
  84340. #elif defined(__clang__)
  84341. "sbcs r2, r4\n\t"
  84342. #else
  84343. "sbc r2, r4\n\t"
  84344. #endif
  84345. #ifdef WOLFSSL_KEIL
  84346. "sbcs r3, r3, r5\n\t"
  84347. #elif defined(__clang__)
  84348. "sbcs r3, r5\n\t"
  84349. #else
  84350. "sbc r3, r5\n\t"
  84351. #endif
  84352. "stm %[a]!, {r2, r3}\n\t"
  84353. "ldm %[b]!, {r4, r5}\n\t"
  84354. "ldr r2, [%[a]]\n\t"
  84355. "ldr r3, [%[a], #4]\n\t"
  84356. #ifdef WOLFSSL_KEIL
  84357. "sbcs r2, r2, r4\n\t"
  84358. #elif defined(__clang__)
  84359. "sbcs r2, r4\n\t"
  84360. #else
  84361. "sbc r2, r4\n\t"
  84362. #endif
  84363. #ifdef WOLFSSL_KEIL
  84364. "sbcs r3, r3, r5\n\t"
  84365. #elif defined(__clang__)
  84366. "sbcs r3, r5\n\t"
  84367. #else
  84368. "sbc r3, r5\n\t"
  84369. #endif
  84370. "stm %[a]!, {r2, r3}\n\t"
  84371. "ldm %[b]!, {r4, r5}\n\t"
  84372. "ldr r2, [%[a]]\n\t"
  84373. "ldr r3, [%[a], #4]\n\t"
  84374. #ifdef WOLFSSL_KEIL
  84375. "sbcs r2, r2, r4\n\t"
  84376. #elif defined(__clang__)
  84377. "sbcs r2, r4\n\t"
  84378. #else
  84379. "sbc r2, r4\n\t"
  84380. #endif
  84381. #ifdef WOLFSSL_KEIL
  84382. "sbcs r3, r3, r5\n\t"
  84383. #elif defined(__clang__)
  84384. "sbcs r3, r5\n\t"
  84385. #else
  84386. "sbc r3, r5\n\t"
  84387. #endif
  84388. "stm %[a]!, {r2, r3}\n\t"
  84389. "ldm %[b]!, {r4, r5}\n\t"
  84390. "ldr r2, [%[a]]\n\t"
  84391. "ldr r3, [%[a], #4]\n\t"
  84392. #ifdef WOLFSSL_KEIL
  84393. "sbcs r2, r2, r4\n\t"
  84394. #elif defined(__clang__)
  84395. "sbcs r2, r4\n\t"
  84396. #else
  84397. "sbc r2, r4\n\t"
  84398. #endif
  84399. #ifdef WOLFSSL_KEIL
  84400. "sbcs r3, r3, r5\n\t"
  84401. #elif defined(__clang__)
  84402. "sbcs r3, r5\n\t"
  84403. #else
  84404. "sbc r3, r5\n\t"
  84405. #endif
  84406. "stm %[a]!, {r2, r3}\n\t"
  84407. "ldm %[b]!, {r4, r5}\n\t"
  84408. "ldr r2, [%[a]]\n\t"
  84409. "ldr r3, [%[a], #4]\n\t"
  84410. #ifdef WOLFSSL_KEIL
  84411. "sbcs r2, r2, r4\n\t"
  84412. #elif defined(__clang__)
  84413. "sbcs r2, r4\n\t"
  84414. #else
  84415. "sbc r2, r4\n\t"
  84416. #endif
  84417. #ifdef WOLFSSL_KEIL
  84418. "sbcs r3, r3, r5\n\t"
  84419. #elif defined(__clang__)
  84420. "sbcs r3, r5\n\t"
  84421. #else
  84422. "sbc r3, r5\n\t"
  84423. #endif
  84424. "stm %[a]!, {r2, r3}\n\t"
  84425. "ldm %[b]!, {r4, r5}\n\t"
  84426. "ldr r2, [%[a]]\n\t"
  84427. "ldr r3, [%[a], #4]\n\t"
  84428. #ifdef WOLFSSL_KEIL
  84429. "sbcs r2, r2, r4\n\t"
  84430. #elif defined(__clang__)
  84431. "sbcs r2, r4\n\t"
  84432. #else
  84433. "sbc r2, r4\n\t"
  84434. #endif
  84435. #ifdef WOLFSSL_KEIL
  84436. "sbcs r3, r3, r5\n\t"
  84437. #elif defined(__clang__)
  84438. "sbcs r3, r5\n\t"
  84439. #else
  84440. "sbc r3, r5\n\t"
  84441. #endif
  84442. "stm %[a]!, {r2, r3}\n\t"
  84443. "ldm %[b]!, {r4, r5}\n\t"
  84444. "ldr r2, [%[a]]\n\t"
  84445. "ldr r3, [%[a], #4]\n\t"
  84446. #ifdef WOLFSSL_KEIL
  84447. "sbcs r2, r2, r4\n\t"
  84448. #elif defined(__clang__)
  84449. "sbcs r2, r4\n\t"
  84450. #else
  84451. "sbc r2, r4\n\t"
  84452. #endif
  84453. #ifdef WOLFSSL_KEIL
  84454. "sbcs r3, r3, r5\n\t"
  84455. #elif defined(__clang__)
  84456. "sbcs r3, r5\n\t"
  84457. #else
  84458. "sbc r3, r5\n\t"
  84459. #endif
  84460. "stm %[a]!, {r2, r3}\n\t"
  84461. "ldm %[b]!, {r4, r5}\n\t"
  84462. "ldr r2, [%[a]]\n\t"
  84463. "ldr r3, [%[a], #4]\n\t"
  84464. #ifdef WOLFSSL_KEIL
  84465. "sbcs r2, r2, r4\n\t"
  84466. #elif defined(__clang__)
  84467. "sbcs r2, r4\n\t"
  84468. #else
  84469. "sbc r2, r4\n\t"
  84470. #endif
  84471. #ifdef WOLFSSL_KEIL
  84472. "sbcs r3, r3, r5\n\t"
  84473. #elif defined(__clang__)
  84474. "sbcs r3, r5\n\t"
  84475. #else
  84476. "sbc r3, r5\n\t"
  84477. #endif
  84478. "stm %[a]!, {r2, r3}\n\t"
  84479. "ldm %[b]!, {r4, r5}\n\t"
  84480. "ldr r2, [%[a]]\n\t"
  84481. "ldr r3, [%[a], #4]\n\t"
  84482. #ifdef WOLFSSL_KEIL
  84483. "sbcs r2, r2, r4\n\t"
  84484. #elif defined(__clang__)
  84485. "sbcs r2, r4\n\t"
  84486. #else
  84487. "sbc r2, r4\n\t"
  84488. #endif
  84489. #ifdef WOLFSSL_KEIL
  84490. "sbcs r3, r3, r5\n\t"
  84491. #elif defined(__clang__)
  84492. "sbcs r3, r5\n\t"
  84493. #else
  84494. "sbc r3, r5\n\t"
  84495. #endif
  84496. "stm %[a]!, {r2, r3}\n\t"
  84497. "ldm %[b]!, {r4, r5}\n\t"
  84498. "ldr r2, [%[a]]\n\t"
  84499. "ldr r3, [%[a], #4]\n\t"
  84500. #ifdef WOLFSSL_KEIL
  84501. "sbcs r2, r2, r4\n\t"
  84502. #elif defined(__clang__)
  84503. "sbcs r2, r4\n\t"
  84504. #else
  84505. "sbc r2, r4\n\t"
  84506. #endif
  84507. #ifdef WOLFSSL_KEIL
  84508. "sbcs r3, r3, r5\n\t"
  84509. #elif defined(__clang__)
  84510. "sbcs r3, r5\n\t"
  84511. #else
  84512. "sbc r3, r5\n\t"
  84513. #endif
  84514. "stm %[a]!, {r2, r3}\n\t"
  84515. "ldm %[b]!, {r4, r5}\n\t"
  84516. "ldr r2, [%[a]]\n\t"
  84517. "ldr r3, [%[a], #4]\n\t"
  84518. #ifdef WOLFSSL_KEIL
  84519. "sbcs r2, r2, r4\n\t"
  84520. #elif defined(__clang__)
  84521. "sbcs r2, r4\n\t"
  84522. #else
  84523. "sbc r2, r4\n\t"
  84524. #endif
  84525. #ifdef WOLFSSL_KEIL
  84526. "sbcs r3, r3, r5\n\t"
  84527. #elif defined(__clang__)
  84528. "sbcs r3, r5\n\t"
  84529. #else
  84530. "sbc r3, r5\n\t"
  84531. #endif
  84532. "stm %[a]!, {r2, r3}\n\t"
  84533. "ldm %[b]!, {r4, r5}\n\t"
  84534. "ldr r2, [%[a]]\n\t"
  84535. "ldr r3, [%[a], #4]\n\t"
  84536. #ifdef WOLFSSL_KEIL
  84537. "sbcs r2, r2, r4\n\t"
  84538. #elif defined(__clang__)
  84539. "sbcs r2, r4\n\t"
  84540. #else
  84541. "sbc r2, r4\n\t"
  84542. #endif
  84543. #ifdef WOLFSSL_KEIL
  84544. "sbcs r3, r3, r5\n\t"
  84545. #elif defined(__clang__)
  84546. "sbcs r3, r5\n\t"
  84547. #else
  84548. "sbc r3, r5\n\t"
  84549. #endif
  84550. "stm %[a]!, {r2, r3}\n\t"
  84551. "ldm %[b]!, {r4, r5}\n\t"
  84552. "ldr r2, [%[a]]\n\t"
  84553. "ldr r3, [%[a], #4]\n\t"
  84554. #ifdef WOLFSSL_KEIL
  84555. "sbcs r2, r2, r4\n\t"
  84556. #elif defined(__clang__)
  84557. "sbcs r2, r4\n\t"
  84558. #else
  84559. "sbc r2, r4\n\t"
  84560. #endif
  84561. #ifdef WOLFSSL_KEIL
  84562. "sbcs r3, r3, r5\n\t"
  84563. #elif defined(__clang__)
  84564. "sbcs r3, r5\n\t"
  84565. #else
  84566. "sbc r3, r5\n\t"
  84567. #endif
  84568. "stm %[a]!, {r2, r3}\n\t"
  84569. "ldm %[b]!, {r4, r5}\n\t"
  84570. "ldr r2, [%[a]]\n\t"
  84571. "ldr r3, [%[a], #4]\n\t"
  84572. #ifdef WOLFSSL_KEIL
  84573. "sbcs r2, r2, r4\n\t"
  84574. #elif defined(__clang__)
  84575. "sbcs r2, r4\n\t"
  84576. #else
  84577. "sbc r2, r4\n\t"
  84578. #endif
  84579. #ifdef WOLFSSL_KEIL
  84580. "sbcs r3, r3, r5\n\t"
  84581. #elif defined(__clang__)
  84582. "sbcs r3, r5\n\t"
  84583. #else
  84584. "sbc r3, r5\n\t"
  84585. #endif
  84586. "stm %[a]!, {r2, r3}\n\t"
  84587. "ldm %[b]!, {r4, r5}\n\t"
  84588. "ldr r2, [%[a]]\n\t"
  84589. "ldr r3, [%[a], #4]\n\t"
  84590. #ifdef WOLFSSL_KEIL
  84591. "sbcs r2, r2, r4\n\t"
  84592. #elif defined(__clang__)
  84593. "sbcs r2, r4\n\t"
  84594. #else
  84595. "sbc r2, r4\n\t"
  84596. #endif
  84597. #ifdef WOLFSSL_KEIL
  84598. "sbcs r3, r3, r5\n\t"
  84599. #elif defined(__clang__)
  84600. "sbcs r3, r5\n\t"
  84601. #else
  84602. "sbc r3, r5\n\t"
  84603. #endif
  84604. "stm %[a]!, {r2, r3}\n\t"
  84605. "ldm %[b]!, {r4, r5}\n\t"
  84606. "ldr r2, [%[a]]\n\t"
  84607. "ldr r3, [%[a], #4]\n\t"
  84608. #ifdef WOLFSSL_KEIL
  84609. "sbcs r2, r2, r4\n\t"
  84610. #elif defined(__clang__)
  84611. "sbcs r2, r4\n\t"
  84612. #else
  84613. "sbc r2, r4\n\t"
  84614. #endif
  84615. #ifdef WOLFSSL_KEIL
  84616. "sbcs r3, r3, r5\n\t"
  84617. #elif defined(__clang__)
  84618. "sbcs r3, r5\n\t"
  84619. #else
  84620. "sbc r3, r5\n\t"
  84621. #endif
  84622. "stm %[a]!, {r2, r3}\n\t"
  84623. #ifdef WOLFSSL_KEIL
  84624. "sbcs %[a], %[a], %[a]\n\t"
  84625. #elif defined(__clang__)
  84626. "sbcs %[a], %[a]\n\t"
  84627. #else
  84628. "sbc %[a], %[a]\n\t"
  84629. #endif
  84630. : [a] "+l" (a), [b] "+l" (b)
  84631. :
  84632. : "memory", "r2", "r3", "r4", "r5"
  84633. );
  84634. return (uint32_t)(size_t)a;
  84635. }
  84636. /* Add b to a into r. (r = a + b)
  84637. *
  84638. * r A single precision integer.
  84639. * a A single precision integer.
  84640. * b A single precision integer.
  84641. */
  84642. SP_NOINLINE static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a,
  84643. const sp_digit* b)
  84644. {
  84645. __asm__ __volatile__ (
  84646. "ldm %[b]!, {r5, r6}\n\t"
  84647. "ldm %[a]!, {r3, r4}\n\t"
  84648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  84649. "adds r3, r3, r5\n\t"
  84650. #else
  84651. "add r3, r3, r5\n\t"
  84652. #endif
  84653. #ifdef WOLFSSL_KEIL
  84654. "adcs r4, r4, r6\n\t"
  84655. #elif defined(__clang__)
  84656. "adcs r4, r6\n\t"
  84657. #else
  84658. "adc r4, r6\n\t"
  84659. #endif
  84660. "stm %[r]!, {r3, r4}\n\t"
  84661. "ldm %[b]!, {r5, r6}\n\t"
  84662. "ldm %[a]!, {r3, r4}\n\t"
  84663. #ifdef WOLFSSL_KEIL
  84664. "adcs r3, r3, r5\n\t"
  84665. #elif defined(__clang__)
  84666. "adcs r3, r5\n\t"
  84667. #else
  84668. "adc r3, r5\n\t"
  84669. #endif
  84670. #ifdef WOLFSSL_KEIL
  84671. "adcs r4, r4, r6\n\t"
  84672. #elif defined(__clang__)
  84673. "adcs r4, r6\n\t"
  84674. #else
  84675. "adc r4, r6\n\t"
  84676. #endif
  84677. "stm %[r]!, {r3, r4}\n\t"
  84678. "ldm %[b]!, {r5, r6}\n\t"
  84679. "ldm %[a]!, {r3, r4}\n\t"
  84680. #ifdef WOLFSSL_KEIL
  84681. "adcs r3, r3, r5\n\t"
  84682. #elif defined(__clang__)
  84683. "adcs r3, r5\n\t"
  84684. #else
  84685. "adc r3, r5\n\t"
  84686. #endif
  84687. #ifdef WOLFSSL_KEIL
  84688. "adcs r4, r4, r6\n\t"
  84689. #elif defined(__clang__)
  84690. "adcs r4, r6\n\t"
  84691. #else
  84692. "adc r4, r6\n\t"
  84693. #endif
  84694. "stm %[r]!, {r3, r4}\n\t"
  84695. "ldm %[b]!, {r5, r6}\n\t"
  84696. "ldm %[a]!, {r3, r4}\n\t"
  84697. #ifdef WOLFSSL_KEIL
  84698. "adcs r3, r3, r5\n\t"
  84699. #elif defined(__clang__)
  84700. "adcs r3, r5\n\t"
  84701. #else
  84702. "adc r3, r5\n\t"
  84703. #endif
  84704. #ifdef WOLFSSL_KEIL
  84705. "adcs r4, r4, r6\n\t"
  84706. #elif defined(__clang__)
  84707. "adcs r4, r6\n\t"
  84708. #else
  84709. "adc r4, r6\n\t"
  84710. #endif
  84711. "stm %[r]!, {r3, r4}\n\t"
  84712. "ldm %[b]!, {r5, r6}\n\t"
  84713. "ldm %[a]!, {r3, r4}\n\t"
  84714. #ifdef WOLFSSL_KEIL
  84715. "adcs r3, r3, r5\n\t"
  84716. #elif defined(__clang__)
  84717. "adcs r3, r5\n\t"
  84718. #else
  84719. "adc r3, r5\n\t"
  84720. #endif
  84721. #ifdef WOLFSSL_KEIL
  84722. "adcs r4, r4, r6\n\t"
  84723. #elif defined(__clang__)
  84724. "adcs r4, r6\n\t"
  84725. #else
  84726. "adc r4, r6\n\t"
  84727. #endif
  84728. "stm %[r]!, {r3, r4}\n\t"
  84729. "ldm %[b]!, {r5, r6}\n\t"
  84730. "ldm %[a]!, {r3, r4}\n\t"
  84731. #ifdef WOLFSSL_KEIL
  84732. "adcs r3, r3, r5\n\t"
  84733. #elif defined(__clang__)
  84734. "adcs r3, r5\n\t"
  84735. #else
  84736. "adc r3, r5\n\t"
  84737. #endif
  84738. #ifdef WOLFSSL_KEIL
  84739. "adcs r4, r4, r6\n\t"
  84740. #elif defined(__clang__)
  84741. "adcs r4, r6\n\t"
  84742. #else
  84743. "adc r4, r6\n\t"
  84744. #endif
  84745. "stm %[r]!, {r3, r4}\n\t"
  84746. "ldm %[b]!, {r5, r6}\n\t"
  84747. "ldm %[a]!, {r3, r4}\n\t"
  84748. #ifdef WOLFSSL_KEIL
  84749. "adcs r3, r3, r5\n\t"
  84750. #elif defined(__clang__)
  84751. "adcs r3, r5\n\t"
  84752. #else
  84753. "adc r3, r5\n\t"
  84754. #endif
  84755. #ifdef WOLFSSL_KEIL
  84756. "adcs r4, r4, r6\n\t"
  84757. #elif defined(__clang__)
  84758. "adcs r4, r6\n\t"
  84759. #else
  84760. "adc r4, r6\n\t"
  84761. #endif
  84762. "stm %[r]!, {r3, r4}\n\t"
  84763. "ldm %[b]!, {r5, r6}\n\t"
  84764. "ldm %[a]!, {r3, r4}\n\t"
  84765. #ifdef WOLFSSL_KEIL
  84766. "adcs r3, r3, r5\n\t"
  84767. #elif defined(__clang__)
  84768. "adcs r3, r5\n\t"
  84769. #else
  84770. "adc r3, r5\n\t"
  84771. #endif
  84772. #ifdef WOLFSSL_KEIL
  84773. "adcs r4, r4, r6\n\t"
  84774. #elif defined(__clang__)
  84775. "adcs r4, r6\n\t"
  84776. #else
  84777. "adc r4, r6\n\t"
  84778. #endif
  84779. "stm %[r]!, {r3, r4}\n\t"
  84780. "ldm %[b]!, {r5, r6}\n\t"
  84781. "ldm %[a]!, {r3, r4}\n\t"
  84782. #ifdef WOLFSSL_KEIL
  84783. "adcs r3, r3, r5\n\t"
  84784. #elif defined(__clang__)
  84785. "adcs r3, r5\n\t"
  84786. #else
  84787. "adc r3, r5\n\t"
  84788. #endif
  84789. #ifdef WOLFSSL_KEIL
  84790. "adcs r4, r4, r6\n\t"
  84791. #elif defined(__clang__)
  84792. "adcs r4, r6\n\t"
  84793. #else
  84794. "adc r4, r6\n\t"
  84795. #endif
  84796. "stm %[r]!, {r3, r4}\n\t"
  84797. "ldm %[b]!, {r5, r6}\n\t"
  84798. "ldm %[a]!, {r3, r4}\n\t"
  84799. #ifdef WOLFSSL_KEIL
  84800. "adcs r3, r3, r5\n\t"
  84801. #elif defined(__clang__)
  84802. "adcs r3, r5\n\t"
  84803. #else
  84804. "adc r3, r5\n\t"
  84805. #endif
  84806. #ifdef WOLFSSL_KEIL
  84807. "adcs r4, r4, r6\n\t"
  84808. #elif defined(__clang__)
  84809. "adcs r4, r6\n\t"
  84810. #else
  84811. "adc r4, r6\n\t"
  84812. #endif
  84813. "stm %[r]!, {r3, r4}\n\t"
  84814. "ldm %[b]!, {r5, r6}\n\t"
  84815. "ldm %[a]!, {r3, r4}\n\t"
  84816. #ifdef WOLFSSL_KEIL
  84817. "adcs r3, r3, r5\n\t"
  84818. #elif defined(__clang__)
  84819. "adcs r3, r5\n\t"
  84820. #else
  84821. "adc r3, r5\n\t"
  84822. #endif
  84823. #ifdef WOLFSSL_KEIL
  84824. "adcs r4, r4, r6\n\t"
  84825. #elif defined(__clang__)
  84826. "adcs r4, r6\n\t"
  84827. #else
  84828. "adc r4, r6\n\t"
  84829. #endif
  84830. "stm %[r]!, {r3, r4}\n\t"
  84831. "ldm %[b]!, {r5, r6}\n\t"
  84832. "ldm %[a]!, {r3, r4}\n\t"
  84833. #ifdef WOLFSSL_KEIL
  84834. "adcs r3, r3, r5\n\t"
  84835. #elif defined(__clang__)
  84836. "adcs r3, r5\n\t"
  84837. #else
  84838. "adc r3, r5\n\t"
  84839. #endif
  84840. #ifdef WOLFSSL_KEIL
  84841. "adcs r4, r4, r6\n\t"
  84842. #elif defined(__clang__)
  84843. "adcs r4, r6\n\t"
  84844. #else
  84845. "adc r4, r6\n\t"
  84846. #endif
  84847. "stm %[r]!, {r3, r4}\n\t"
  84848. "ldm %[b]!, {r5, r6}\n\t"
  84849. "ldm %[a]!, {r3, r4}\n\t"
  84850. #ifdef WOLFSSL_KEIL
  84851. "adcs r3, r3, r5\n\t"
  84852. #elif defined(__clang__)
  84853. "adcs r3, r5\n\t"
  84854. #else
  84855. "adc r3, r5\n\t"
  84856. #endif
  84857. #ifdef WOLFSSL_KEIL
  84858. "adcs r4, r4, r6\n\t"
  84859. #elif defined(__clang__)
  84860. "adcs r4, r6\n\t"
  84861. #else
  84862. "adc r4, r6\n\t"
  84863. #endif
  84864. "stm %[r]!, {r3, r4}\n\t"
  84865. "ldm %[b]!, {r5, r6}\n\t"
  84866. "ldm %[a]!, {r3, r4}\n\t"
  84867. #ifdef WOLFSSL_KEIL
  84868. "adcs r3, r3, r5\n\t"
  84869. #elif defined(__clang__)
  84870. "adcs r3, r5\n\t"
  84871. #else
  84872. "adc r3, r5\n\t"
  84873. #endif
  84874. #ifdef WOLFSSL_KEIL
  84875. "adcs r4, r4, r6\n\t"
  84876. #elif defined(__clang__)
  84877. "adcs r4, r6\n\t"
  84878. #else
  84879. "adc r4, r6\n\t"
  84880. #endif
  84881. "stm %[r]!, {r3, r4}\n\t"
  84882. "ldm %[b]!, {r5, r6}\n\t"
  84883. "ldm %[a]!, {r3, r4}\n\t"
  84884. #ifdef WOLFSSL_KEIL
  84885. "adcs r3, r3, r5\n\t"
  84886. #elif defined(__clang__)
  84887. "adcs r3, r5\n\t"
  84888. #else
  84889. "adc r3, r5\n\t"
  84890. #endif
  84891. #ifdef WOLFSSL_KEIL
  84892. "adcs r4, r4, r6\n\t"
  84893. #elif defined(__clang__)
  84894. "adcs r4, r6\n\t"
  84895. #else
  84896. "adc r4, r6\n\t"
  84897. #endif
  84898. "stm %[r]!, {r3, r4}\n\t"
  84899. "ldm %[b]!, {r5, r6}\n\t"
  84900. "ldm %[a]!, {r3, r4}\n\t"
  84901. #ifdef WOLFSSL_KEIL
  84902. "adcs r3, r3, r5\n\t"
  84903. #elif defined(__clang__)
  84904. "adcs r3, r5\n\t"
  84905. #else
  84906. "adc r3, r5\n\t"
  84907. #endif
  84908. #ifdef WOLFSSL_KEIL
  84909. "adcs r4, r4, r6\n\t"
  84910. #elif defined(__clang__)
  84911. "adcs r4, r6\n\t"
  84912. #else
  84913. "adc r4, r6\n\t"
  84914. #endif
  84915. "stm %[r]!, {r3, r4}\n\t"
  84916. "ldm %[b]!, {r5, r6}\n\t"
  84917. "ldm %[a]!, {r3, r4}\n\t"
  84918. #ifdef WOLFSSL_KEIL
  84919. "adcs r3, r3, r5\n\t"
  84920. #elif defined(__clang__)
  84921. "adcs r3, r5\n\t"
  84922. #else
  84923. "adc r3, r5\n\t"
  84924. #endif
  84925. #ifdef WOLFSSL_KEIL
  84926. "adcs r4, r4, r6\n\t"
  84927. #elif defined(__clang__)
  84928. "adcs r4, r6\n\t"
  84929. #else
  84930. "adc r4, r6\n\t"
  84931. #endif
  84932. "stm %[r]!, {r3, r4}\n\t"
  84933. "ldm %[b]!, {r5, r6}\n\t"
  84934. "ldm %[a]!, {r3, r4}\n\t"
  84935. #ifdef WOLFSSL_KEIL
  84936. "adcs r3, r3, r5\n\t"
  84937. #elif defined(__clang__)
  84938. "adcs r3, r5\n\t"
  84939. #else
  84940. "adc r3, r5\n\t"
  84941. #endif
  84942. #ifdef WOLFSSL_KEIL
  84943. "adcs r4, r4, r6\n\t"
  84944. #elif defined(__clang__)
  84945. "adcs r4, r6\n\t"
  84946. #else
  84947. "adc r4, r6\n\t"
  84948. #endif
  84949. "stm %[r]!, {r3, r4}\n\t"
  84950. "ldm %[b]!, {r5, r6}\n\t"
  84951. "ldm %[a]!, {r3, r4}\n\t"
  84952. #ifdef WOLFSSL_KEIL
  84953. "adcs r3, r3, r5\n\t"
  84954. #elif defined(__clang__)
  84955. "adcs r3, r5\n\t"
  84956. #else
  84957. "adc r3, r5\n\t"
  84958. #endif
  84959. #ifdef WOLFSSL_KEIL
  84960. "adcs r4, r4, r6\n\t"
  84961. #elif defined(__clang__)
  84962. "adcs r4, r6\n\t"
  84963. #else
  84964. "adc r4, r6\n\t"
  84965. #endif
  84966. "stm %[r]!, {r3, r4}\n\t"
  84967. "ldm %[b]!, {r5, r6}\n\t"
  84968. "ldm %[a]!, {r3, r4}\n\t"
  84969. #ifdef WOLFSSL_KEIL
  84970. "adcs r3, r3, r5\n\t"
  84971. #elif defined(__clang__)
  84972. "adcs r3, r5\n\t"
  84973. #else
  84974. "adc r3, r5\n\t"
  84975. #endif
  84976. #ifdef WOLFSSL_KEIL
  84977. "adcs r4, r4, r6\n\t"
  84978. #elif defined(__clang__)
  84979. "adcs r4, r6\n\t"
  84980. #else
  84981. "adc r4, r6\n\t"
  84982. #endif
  84983. "stm %[r]!, {r3, r4}\n\t"
  84984. "ldm %[b]!, {r5, r6}\n\t"
  84985. "ldm %[a]!, {r3, r4}\n\t"
  84986. #ifdef WOLFSSL_KEIL
  84987. "adcs r3, r3, r5\n\t"
  84988. #elif defined(__clang__)
  84989. "adcs r3, r5\n\t"
  84990. #else
  84991. "adc r3, r5\n\t"
  84992. #endif
  84993. #ifdef WOLFSSL_KEIL
  84994. "adcs r4, r4, r6\n\t"
  84995. #elif defined(__clang__)
  84996. "adcs r4, r6\n\t"
  84997. #else
  84998. "adc r4, r6\n\t"
  84999. #endif
  85000. "stm %[r]!, {r3, r4}\n\t"
  85001. "ldm %[b]!, {r5, r6}\n\t"
  85002. "ldm %[a]!, {r3, r4}\n\t"
  85003. #ifdef WOLFSSL_KEIL
  85004. "adcs r3, r3, r5\n\t"
  85005. #elif defined(__clang__)
  85006. "adcs r3, r5\n\t"
  85007. #else
  85008. "adc r3, r5\n\t"
  85009. #endif
  85010. #ifdef WOLFSSL_KEIL
  85011. "adcs r4, r4, r6\n\t"
  85012. #elif defined(__clang__)
  85013. "adcs r4, r6\n\t"
  85014. #else
  85015. "adc r4, r6\n\t"
  85016. #endif
  85017. "stm %[r]!, {r3, r4}\n\t"
  85018. "ldm %[b]!, {r5, r6}\n\t"
  85019. "ldm %[a]!, {r3, r4}\n\t"
  85020. #ifdef WOLFSSL_KEIL
  85021. "adcs r3, r3, r5\n\t"
  85022. #elif defined(__clang__)
  85023. "adcs r3, r5\n\t"
  85024. #else
  85025. "adc r3, r5\n\t"
  85026. #endif
  85027. #ifdef WOLFSSL_KEIL
  85028. "adcs r4, r4, r6\n\t"
  85029. #elif defined(__clang__)
  85030. "adcs r4, r6\n\t"
  85031. #else
  85032. "adc r4, r6\n\t"
  85033. #endif
  85034. "stm %[r]!, {r3, r4}\n\t"
  85035. "ldm %[b]!, {r5, r6}\n\t"
  85036. "ldm %[a]!, {r3, r4}\n\t"
  85037. #ifdef WOLFSSL_KEIL
  85038. "adcs r3, r3, r5\n\t"
  85039. #elif defined(__clang__)
  85040. "adcs r3, r5\n\t"
  85041. #else
  85042. "adc r3, r5\n\t"
  85043. #endif
  85044. #ifdef WOLFSSL_KEIL
  85045. "adcs r4, r4, r6\n\t"
  85046. #elif defined(__clang__)
  85047. "adcs r4, r6\n\t"
  85048. #else
  85049. "adc r4, r6\n\t"
  85050. #endif
  85051. "stm %[r]!, {r3, r4}\n\t"
  85052. "ldm %[b]!, {r5, r6}\n\t"
  85053. "ldm %[a]!, {r3, r4}\n\t"
  85054. #ifdef WOLFSSL_KEIL
  85055. "adcs r3, r3, r5\n\t"
  85056. #elif defined(__clang__)
  85057. "adcs r3, r5\n\t"
  85058. #else
  85059. "adc r3, r5\n\t"
  85060. #endif
  85061. #ifdef WOLFSSL_KEIL
  85062. "adcs r4, r4, r6\n\t"
  85063. #elif defined(__clang__)
  85064. "adcs r4, r6\n\t"
  85065. #else
  85066. "adc r4, r6\n\t"
  85067. #endif
  85068. "stm %[r]!, {r3, r4}\n\t"
  85069. "ldm %[b]!, {r5, r6}\n\t"
  85070. "ldm %[a]!, {r3, r4}\n\t"
  85071. #ifdef WOLFSSL_KEIL
  85072. "adcs r3, r3, r5\n\t"
  85073. #elif defined(__clang__)
  85074. "adcs r3, r5\n\t"
  85075. #else
  85076. "adc r3, r5\n\t"
  85077. #endif
  85078. #ifdef WOLFSSL_KEIL
  85079. "adcs r4, r4, r6\n\t"
  85080. #elif defined(__clang__)
  85081. "adcs r4, r6\n\t"
  85082. #else
  85083. "adc r4, r6\n\t"
  85084. #endif
  85085. "stm %[r]!, {r3, r4}\n\t"
  85086. "ldm %[b]!, {r5, r6}\n\t"
  85087. "ldm %[a]!, {r3, r4}\n\t"
  85088. #ifdef WOLFSSL_KEIL
  85089. "adcs r3, r3, r5\n\t"
  85090. #elif defined(__clang__)
  85091. "adcs r3, r5\n\t"
  85092. #else
  85093. "adc r3, r5\n\t"
  85094. #endif
  85095. #ifdef WOLFSSL_KEIL
  85096. "adcs r4, r4, r6\n\t"
  85097. #elif defined(__clang__)
  85098. "adcs r4, r6\n\t"
  85099. #else
  85100. "adc r4, r6\n\t"
  85101. #endif
  85102. "stm %[r]!, {r3, r4}\n\t"
  85103. "ldm %[b]!, {r5, r6}\n\t"
  85104. "ldm %[a]!, {r3, r4}\n\t"
  85105. #ifdef WOLFSSL_KEIL
  85106. "adcs r3, r3, r5\n\t"
  85107. #elif defined(__clang__)
  85108. "adcs r3, r5\n\t"
  85109. #else
  85110. "adc r3, r5\n\t"
  85111. #endif
  85112. #ifdef WOLFSSL_KEIL
  85113. "adcs r4, r4, r6\n\t"
  85114. #elif defined(__clang__)
  85115. "adcs r4, r6\n\t"
  85116. #else
  85117. "adc r4, r6\n\t"
  85118. #endif
  85119. "stm %[r]!, {r3, r4}\n\t"
  85120. "ldm %[b]!, {r5, r6}\n\t"
  85121. "ldm %[a]!, {r3, r4}\n\t"
  85122. #ifdef WOLFSSL_KEIL
  85123. "adcs r3, r3, r5\n\t"
  85124. #elif defined(__clang__)
  85125. "adcs r3, r5\n\t"
  85126. #else
  85127. "adc r3, r5\n\t"
  85128. #endif
  85129. #ifdef WOLFSSL_KEIL
  85130. "adcs r4, r4, r6\n\t"
  85131. #elif defined(__clang__)
  85132. "adcs r4, r6\n\t"
  85133. #else
  85134. "adc r4, r6\n\t"
  85135. #endif
  85136. "stm %[r]!, {r3, r4}\n\t"
  85137. "ldm %[b]!, {r5, r6}\n\t"
  85138. "ldm %[a]!, {r3, r4}\n\t"
  85139. #ifdef WOLFSSL_KEIL
  85140. "adcs r3, r3, r5\n\t"
  85141. #elif defined(__clang__)
  85142. "adcs r3, r5\n\t"
  85143. #else
  85144. "adc r3, r5\n\t"
  85145. #endif
  85146. #ifdef WOLFSSL_KEIL
  85147. "adcs r4, r4, r6\n\t"
  85148. #elif defined(__clang__)
  85149. "adcs r4, r6\n\t"
  85150. #else
  85151. "adc r4, r6\n\t"
  85152. #endif
  85153. "stm %[r]!, {r3, r4}\n\t"
  85154. "ldm %[b]!, {r5, r6}\n\t"
  85155. "ldm %[a]!, {r3, r4}\n\t"
  85156. #ifdef WOLFSSL_KEIL
  85157. "adcs r3, r3, r5\n\t"
  85158. #elif defined(__clang__)
  85159. "adcs r3, r5\n\t"
  85160. #else
  85161. "adc r3, r5\n\t"
  85162. #endif
  85163. #ifdef WOLFSSL_KEIL
  85164. "adcs r4, r4, r6\n\t"
  85165. #elif defined(__clang__)
  85166. "adcs r4, r6\n\t"
  85167. #else
  85168. "adc r4, r6\n\t"
  85169. #endif
  85170. "stm %[r]!, {r3, r4}\n\t"
  85171. "ldm %[b]!, {r5, r6}\n\t"
  85172. "ldm %[a]!, {r3, r4}\n\t"
  85173. #ifdef WOLFSSL_KEIL
  85174. "adcs r3, r3, r5\n\t"
  85175. #elif defined(__clang__)
  85176. "adcs r3, r5\n\t"
  85177. #else
  85178. "adc r3, r5\n\t"
  85179. #endif
  85180. #ifdef WOLFSSL_KEIL
  85181. "adcs r4, r4, r6\n\t"
  85182. #elif defined(__clang__)
  85183. "adcs r4, r6\n\t"
  85184. #else
  85185. "adc r4, r6\n\t"
  85186. #endif
  85187. "stm %[r]!, {r3, r4}\n\t"
  85188. "ldm %[b]!, {r5, r6}\n\t"
  85189. "ldm %[a]!, {r3, r4}\n\t"
  85190. #ifdef WOLFSSL_KEIL
  85191. "adcs r3, r3, r5\n\t"
  85192. #elif defined(__clang__)
  85193. "adcs r3, r5\n\t"
  85194. #else
  85195. "adc r3, r5\n\t"
  85196. #endif
  85197. #ifdef WOLFSSL_KEIL
  85198. "adcs r4, r4, r6\n\t"
  85199. #elif defined(__clang__)
  85200. "adcs r4, r6\n\t"
  85201. #else
  85202. "adc r4, r6\n\t"
  85203. #endif
  85204. "stm %[r]!, {r3, r4}\n\t"
  85205. "ldm %[b]!, {r5, r6}\n\t"
  85206. "ldm %[a]!, {r3, r4}\n\t"
  85207. #ifdef WOLFSSL_KEIL
  85208. "adcs r3, r3, r5\n\t"
  85209. #elif defined(__clang__)
  85210. "adcs r3, r5\n\t"
  85211. #else
  85212. "adc r3, r5\n\t"
  85213. #endif
  85214. #ifdef WOLFSSL_KEIL
  85215. "adcs r4, r4, r6\n\t"
  85216. #elif defined(__clang__)
  85217. "adcs r4, r6\n\t"
  85218. #else
  85219. "adc r4, r6\n\t"
  85220. #endif
  85221. "stm %[r]!, {r3, r4}\n\t"
  85222. "ldm %[b]!, {r5, r6}\n\t"
  85223. "ldm %[a]!, {r3, r4}\n\t"
  85224. #ifdef WOLFSSL_KEIL
  85225. "adcs r3, r3, r5\n\t"
  85226. #elif defined(__clang__)
  85227. "adcs r3, r5\n\t"
  85228. #else
  85229. "adc r3, r5\n\t"
  85230. #endif
  85231. #ifdef WOLFSSL_KEIL
  85232. "adcs r4, r4, r6\n\t"
  85233. #elif defined(__clang__)
  85234. "adcs r4, r6\n\t"
  85235. #else
  85236. "adc r4, r6\n\t"
  85237. #endif
  85238. "stm %[r]!, {r3, r4}\n\t"
  85239. "ldm %[b]!, {r5, r6}\n\t"
  85240. "ldm %[a]!, {r3, r4}\n\t"
  85241. #ifdef WOLFSSL_KEIL
  85242. "adcs r3, r3, r5\n\t"
  85243. #elif defined(__clang__)
  85244. "adcs r3, r5\n\t"
  85245. #else
  85246. "adc r3, r5\n\t"
  85247. #endif
  85248. #ifdef WOLFSSL_KEIL
  85249. "adcs r4, r4, r6\n\t"
  85250. #elif defined(__clang__)
  85251. "adcs r4, r6\n\t"
  85252. #else
  85253. "adc r4, r6\n\t"
  85254. #endif
  85255. "stm %[r]!, {r3, r4}\n\t"
  85256. "ldm %[b]!, {r5, r6}\n\t"
  85257. "ldm %[a]!, {r3, r4}\n\t"
  85258. #ifdef WOLFSSL_KEIL
  85259. "adcs r3, r3, r5\n\t"
  85260. #elif defined(__clang__)
  85261. "adcs r3, r5\n\t"
  85262. #else
  85263. "adc r3, r5\n\t"
  85264. #endif
  85265. #ifdef WOLFSSL_KEIL
  85266. "adcs r4, r4, r6\n\t"
  85267. #elif defined(__clang__)
  85268. "adcs r4, r6\n\t"
  85269. #else
  85270. "adc r4, r6\n\t"
  85271. #endif
  85272. "stm %[r]!, {r3, r4}\n\t"
  85273. "ldm %[b]!, {r5, r6}\n\t"
  85274. "ldm %[a]!, {r3, r4}\n\t"
  85275. #ifdef WOLFSSL_KEIL
  85276. "adcs r3, r3, r5\n\t"
  85277. #elif defined(__clang__)
  85278. "adcs r3, r5\n\t"
  85279. #else
  85280. "adc r3, r5\n\t"
  85281. #endif
  85282. #ifdef WOLFSSL_KEIL
  85283. "adcs r4, r4, r6\n\t"
  85284. #elif defined(__clang__)
  85285. "adcs r4, r6\n\t"
  85286. #else
  85287. "adc r4, r6\n\t"
  85288. #endif
  85289. "stm %[r]!, {r3, r4}\n\t"
  85290. "ldm %[b]!, {r5, r6}\n\t"
  85291. "ldm %[a]!, {r3, r4}\n\t"
  85292. #ifdef WOLFSSL_KEIL
  85293. "adcs r3, r3, r5\n\t"
  85294. #elif defined(__clang__)
  85295. "adcs r3, r5\n\t"
  85296. #else
  85297. "adc r3, r5\n\t"
  85298. #endif
  85299. #ifdef WOLFSSL_KEIL
  85300. "adcs r4, r4, r6\n\t"
  85301. #elif defined(__clang__)
  85302. "adcs r4, r6\n\t"
  85303. #else
  85304. "adc r4, r6\n\t"
  85305. #endif
  85306. "stm %[r]!, {r3, r4}\n\t"
  85307. "ldm %[b]!, {r5, r6}\n\t"
  85308. "ldm %[a]!, {r3, r4}\n\t"
  85309. #ifdef WOLFSSL_KEIL
  85310. "adcs r3, r3, r5\n\t"
  85311. #elif defined(__clang__)
  85312. "adcs r3, r5\n\t"
  85313. #else
  85314. "adc r3, r5\n\t"
  85315. #endif
  85316. #ifdef WOLFSSL_KEIL
  85317. "adcs r4, r4, r6\n\t"
  85318. #elif defined(__clang__)
  85319. "adcs r4, r6\n\t"
  85320. #else
  85321. "adc r4, r6\n\t"
  85322. #endif
  85323. "stm %[r]!, {r3, r4}\n\t"
  85324. "ldm %[b]!, {r5, r6}\n\t"
  85325. "ldm %[a]!, {r3, r4}\n\t"
  85326. #ifdef WOLFSSL_KEIL
  85327. "adcs r3, r3, r5\n\t"
  85328. #elif defined(__clang__)
  85329. "adcs r3, r5\n\t"
  85330. #else
  85331. "adc r3, r5\n\t"
  85332. #endif
  85333. #ifdef WOLFSSL_KEIL
  85334. "adcs r4, r4, r6\n\t"
  85335. #elif defined(__clang__)
  85336. "adcs r4, r6\n\t"
  85337. #else
  85338. "adc r4, r6\n\t"
  85339. #endif
  85340. "stm %[r]!, {r3, r4}\n\t"
  85341. "ldm %[b]!, {r5, r6}\n\t"
  85342. "ldm %[a]!, {r3, r4}\n\t"
  85343. #ifdef WOLFSSL_KEIL
  85344. "adcs r3, r3, r5\n\t"
  85345. #elif defined(__clang__)
  85346. "adcs r3, r5\n\t"
  85347. #else
  85348. "adc r3, r5\n\t"
  85349. #endif
  85350. #ifdef WOLFSSL_KEIL
  85351. "adcs r4, r4, r6\n\t"
  85352. #elif defined(__clang__)
  85353. "adcs r4, r6\n\t"
  85354. #else
  85355. "adc r4, r6\n\t"
  85356. #endif
  85357. "stm %[r]!, {r3, r4}\n\t"
  85358. "ldm %[b]!, {r5, r6}\n\t"
  85359. "ldm %[a]!, {r3, r4}\n\t"
  85360. #ifdef WOLFSSL_KEIL
  85361. "adcs r3, r3, r5\n\t"
  85362. #elif defined(__clang__)
  85363. "adcs r3, r5\n\t"
  85364. #else
  85365. "adc r3, r5\n\t"
  85366. #endif
  85367. #ifdef WOLFSSL_KEIL
  85368. "adcs r4, r4, r6\n\t"
  85369. #elif defined(__clang__)
  85370. "adcs r4, r6\n\t"
  85371. #else
  85372. "adc r4, r6\n\t"
  85373. #endif
  85374. "stm %[r]!, {r3, r4}\n\t"
  85375. "ldm %[b]!, {r5, r6}\n\t"
  85376. "ldm %[a]!, {r3, r4}\n\t"
  85377. #ifdef WOLFSSL_KEIL
  85378. "adcs r3, r3, r5\n\t"
  85379. #elif defined(__clang__)
  85380. "adcs r3, r5\n\t"
  85381. #else
  85382. "adc r3, r5\n\t"
  85383. #endif
  85384. #ifdef WOLFSSL_KEIL
  85385. "adcs r4, r4, r6\n\t"
  85386. #elif defined(__clang__)
  85387. "adcs r4, r6\n\t"
  85388. #else
  85389. "adc r4, r6\n\t"
  85390. #endif
  85391. "stm %[r]!, {r3, r4}\n\t"
  85392. "ldm %[b]!, {r5, r6}\n\t"
  85393. "ldm %[a]!, {r3, r4}\n\t"
  85394. #ifdef WOLFSSL_KEIL
  85395. "adcs r3, r3, r5\n\t"
  85396. #elif defined(__clang__)
  85397. "adcs r3, r5\n\t"
  85398. #else
  85399. "adc r3, r5\n\t"
  85400. #endif
  85401. #ifdef WOLFSSL_KEIL
  85402. "adcs r4, r4, r6\n\t"
  85403. #elif defined(__clang__)
  85404. "adcs r4, r6\n\t"
  85405. #else
  85406. "adc r4, r6\n\t"
  85407. #endif
  85408. "stm %[r]!, {r3, r4}\n\t"
  85409. "ldm %[b]!, {r5, r6}\n\t"
  85410. "ldm %[a]!, {r3, r4}\n\t"
  85411. #ifdef WOLFSSL_KEIL
  85412. "adcs r3, r3, r5\n\t"
  85413. #elif defined(__clang__)
  85414. "adcs r3, r5\n\t"
  85415. #else
  85416. "adc r3, r5\n\t"
  85417. #endif
  85418. #ifdef WOLFSSL_KEIL
  85419. "adcs r4, r4, r6\n\t"
  85420. #elif defined(__clang__)
  85421. "adcs r4, r6\n\t"
  85422. #else
  85423. "adc r4, r6\n\t"
  85424. #endif
  85425. "stm %[r]!, {r3, r4}\n\t"
  85426. "ldm %[b]!, {r5, r6}\n\t"
  85427. "ldm %[a]!, {r3, r4}\n\t"
  85428. #ifdef WOLFSSL_KEIL
  85429. "adcs r3, r3, r5\n\t"
  85430. #elif defined(__clang__)
  85431. "adcs r3, r5\n\t"
  85432. #else
  85433. "adc r3, r5\n\t"
  85434. #endif
  85435. #ifdef WOLFSSL_KEIL
  85436. "adcs r4, r4, r6\n\t"
  85437. #elif defined(__clang__)
  85438. "adcs r4, r6\n\t"
  85439. #else
  85440. "adc r4, r6\n\t"
  85441. #endif
  85442. "stm %[r]!, {r3, r4}\n\t"
  85443. "ldm %[b]!, {r5, r6}\n\t"
  85444. "ldm %[a]!, {r3, r4}\n\t"
  85445. #ifdef WOLFSSL_KEIL
  85446. "adcs r3, r3, r5\n\t"
  85447. #elif defined(__clang__)
  85448. "adcs r3, r5\n\t"
  85449. #else
  85450. "adc r3, r5\n\t"
  85451. #endif
  85452. #ifdef WOLFSSL_KEIL
  85453. "adcs r4, r4, r6\n\t"
  85454. #elif defined(__clang__)
  85455. "adcs r4, r6\n\t"
  85456. #else
  85457. "adc r4, r6\n\t"
  85458. #endif
  85459. "stm %[r]!, {r3, r4}\n\t"
  85460. "ldm %[b]!, {r5, r6}\n\t"
  85461. "ldm %[a]!, {r3, r4}\n\t"
  85462. #ifdef WOLFSSL_KEIL
  85463. "adcs r3, r3, r5\n\t"
  85464. #elif defined(__clang__)
  85465. "adcs r3, r5\n\t"
  85466. #else
  85467. "adc r3, r5\n\t"
  85468. #endif
  85469. #ifdef WOLFSSL_KEIL
  85470. "adcs r4, r4, r6\n\t"
  85471. #elif defined(__clang__)
  85472. "adcs r4, r6\n\t"
  85473. #else
  85474. "adc r4, r6\n\t"
  85475. #endif
  85476. "stm %[r]!, {r3, r4}\n\t"
  85477. "ldm %[b]!, {r5, r6}\n\t"
  85478. "ldm %[a]!, {r3, r4}\n\t"
  85479. #ifdef WOLFSSL_KEIL
  85480. "adcs r3, r3, r5\n\t"
  85481. #elif defined(__clang__)
  85482. "adcs r3, r5\n\t"
  85483. #else
  85484. "adc r3, r5\n\t"
  85485. #endif
  85486. #ifdef WOLFSSL_KEIL
  85487. "adcs r4, r4, r6\n\t"
  85488. #elif defined(__clang__)
  85489. "adcs r4, r6\n\t"
  85490. #else
  85491. "adc r4, r6\n\t"
  85492. #endif
  85493. "stm %[r]!, {r3, r4}\n\t"
  85494. "ldm %[b]!, {r5, r6}\n\t"
  85495. "ldm %[a]!, {r3, r4}\n\t"
  85496. #ifdef WOLFSSL_KEIL
  85497. "adcs r3, r3, r5\n\t"
  85498. #elif defined(__clang__)
  85499. "adcs r3, r5\n\t"
  85500. #else
  85501. "adc r3, r5\n\t"
  85502. #endif
  85503. #ifdef WOLFSSL_KEIL
  85504. "adcs r4, r4, r6\n\t"
  85505. #elif defined(__clang__)
  85506. "adcs r4, r6\n\t"
  85507. #else
  85508. "adc r4, r6\n\t"
  85509. #endif
  85510. "stm %[r]!, {r3, r4}\n\t"
  85511. "ldm %[b]!, {r5, r6}\n\t"
  85512. "ldm %[a]!, {r3, r4}\n\t"
  85513. #ifdef WOLFSSL_KEIL
  85514. "adcs r3, r3, r5\n\t"
  85515. #elif defined(__clang__)
  85516. "adcs r3, r5\n\t"
  85517. #else
  85518. "adc r3, r5\n\t"
  85519. #endif
  85520. #ifdef WOLFSSL_KEIL
  85521. "adcs r4, r4, r6\n\t"
  85522. #elif defined(__clang__)
  85523. "adcs r4, r6\n\t"
  85524. #else
  85525. "adc r4, r6\n\t"
  85526. #endif
  85527. "stm %[r]!, {r3, r4}\n\t"
  85528. "ldm %[b]!, {r5, r6}\n\t"
  85529. "ldm %[a]!, {r3, r4}\n\t"
  85530. #ifdef WOLFSSL_KEIL
  85531. "adcs r3, r3, r5\n\t"
  85532. #elif defined(__clang__)
  85533. "adcs r3, r5\n\t"
  85534. #else
  85535. "adc r3, r5\n\t"
  85536. #endif
  85537. #ifdef WOLFSSL_KEIL
  85538. "adcs r4, r4, r6\n\t"
  85539. #elif defined(__clang__)
  85540. "adcs r4, r6\n\t"
  85541. #else
  85542. "adc r4, r6\n\t"
  85543. #endif
  85544. "stm %[r]!, {r3, r4}\n\t"
  85545. "ldm %[b]!, {r5, r6}\n\t"
  85546. "ldm %[a]!, {r3, r4}\n\t"
  85547. #ifdef WOLFSSL_KEIL
  85548. "adcs r3, r3, r5\n\t"
  85549. #elif defined(__clang__)
  85550. "adcs r3, r5\n\t"
  85551. #else
  85552. "adc r3, r5\n\t"
  85553. #endif
  85554. #ifdef WOLFSSL_KEIL
  85555. "adcs r4, r4, r6\n\t"
  85556. #elif defined(__clang__)
  85557. "adcs r4, r6\n\t"
  85558. #else
  85559. "adc r4, r6\n\t"
  85560. #endif
  85561. "stm %[r]!, {r3, r4}\n\t"
  85562. "ldm %[b]!, {r5, r6}\n\t"
  85563. "ldm %[a]!, {r3, r4}\n\t"
  85564. #ifdef WOLFSSL_KEIL
  85565. "adcs r3, r3, r5\n\t"
  85566. #elif defined(__clang__)
  85567. "adcs r3, r5\n\t"
  85568. #else
  85569. "adc r3, r5\n\t"
  85570. #endif
  85571. #ifdef WOLFSSL_KEIL
  85572. "adcs r4, r4, r6\n\t"
  85573. #elif defined(__clang__)
  85574. "adcs r4, r6\n\t"
  85575. #else
  85576. "adc r4, r6\n\t"
  85577. #endif
  85578. "stm %[r]!, {r3, r4}\n\t"
  85579. "ldm %[b]!, {r5, r6}\n\t"
  85580. "ldm %[a]!, {r3, r4}\n\t"
  85581. #ifdef WOLFSSL_KEIL
  85582. "adcs r3, r3, r5\n\t"
  85583. #elif defined(__clang__)
  85584. "adcs r3, r5\n\t"
  85585. #else
  85586. "adc r3, r5\n\t"
  85587. #endif
  85588. #ifdef WOLFSSL_KEIL
  85589. "adcs r4, r4, r6\n\t"
  85590. #elif defined(__clang__)
  85591. "adcs r4, r6\n\t"
  85592. #else
  85593. "adc r4, r6\n\t"
  85594. #endif
  85595. "stm %[r]!, {r3, r4}\n\t"
  85596. "ldm %[b]!, {r5, r6}\n\t"
  85597. "ldm %[a]!, {r3, r4}\n\t"
  85598. #ifdef WOLFSSL_KEIL
  85599. "adcs r3, r3, r5\n\t"
  85600. #elif defined(__clang__)
  85601. "adcs r3, r5\n\t"
  85602. #else
  85603. "adc r3, r5\n\t"
  85604. #endif
  85605. #ifdef WOLFSSL_KEIL
  85606. "adcs r4, r4, r6\n\t"
  85607. #elif defined(__clang__)
  85608. "adcs r4, r6\n\t"
  85609. #else
  85610. "adc r4, r6\n\t"
  85611. #endif
  85612. "stm %[r]!, {r3, r4}\n\t"
  85613. "ldm %[b]!, {r5, r6}\n\t"
  85614. "ldm %[a]!, {r3, r4}\n\t"
  85615. #ifdef WOLFSSL_KEIL
  85616. "adcs r3, r3, r5\n\t"
  85617. #elif defined(__clang__)
  85618. "adcs r3, r5\n\t"
  85619. #else
  85620. "adc r3, r5\n\t"
  85621. #endif
  85622. #ifdef WOLFSSL_KEIL
  85623. "adcs r4, r4, r6\n\t"
  85624. #elif defined(__clang__)
  85625. "adcs r4, r6\n\t"
  85626. #else
  85627. "adc r4, r6\n\t"
  85628. #endif
  85629. "stm %[r]!, {r3, r4}\n\t"
  85630. "ldm %[b]!, {r5, r6}\n\t"
  85631. "ldm %[a]!, {r3, r4}\n\t"
  85632. #ifdef WOLFSSL_KEIL
  85633. "adcs r3, r3, r5\n\t"
  85634. #elif defined(__clang__)
  85635. "adcs r3, r5\n\t"
  85636. #else
  85637. "adc r3, r5\n\t"
  85638. #endif
  85639. #ifdef WOLFSSL_KEIL
  85640. "adcs r4, r4, r6\n\t"
  85641. #elif defined(__clang__)
  85642. "adcs r4, r6\n\t"
  85643. #else
  85644. "adc r4, r6\n\t"
  85645. #endif
  85646. "stm %[r]!, {r3, r4}\n\t"
  85647. "ldm %[b]!, {r5, r6}\n\t"
  85648. "ldm %[a]!, {r3, r4}\n\t"
  85649. #ifdef WOLFSSL_KEIL
  85650. "adcs r3, r3, r5\n\t"
  85651. #elif defined(__clang__)
  85652. "adcs r3, r5\n\t"
  85653. #else
  85654. "adc r3, r5\n\t"
  85655. #endif
  85656. #ifdef WOLFSSL_KEIL
  85657. "adcs r4, r4, r6\n\t"
  85658. #elif defined(__clang__)
  85659. "adcs r4, r6\n\t"
  85660. #else
  85661. "adc r4, r6\n\t"
  85662. #endif
  85663. "stm %[r]!, {r3, r4}\n\t"
  85664. "ldm %[b]!, {r5, r6}\n\t"
  85665. "ldm %[a]!, {r3, r4}\n\t"
  85666. #ifdef WOLFSSL_KEIL
  85667. "adcs r3, r3, r5\n\t"
  85668. #elif defined(__clang__)
  85669. "adcs r3, r5\n\t"
  85670. #else
  85671. "adc r3, r5\n\t"
  85672. #endif
  85673. #ifdef WOLFSSL_KEIL
  85674. "adcs r4, r4, r6\n\t"
  85675. #elif defined(__clang__)
  85676. "adcs r4, r6\n\t"
  85677. #else
  85678. "adc r4, r6\n\t"
  85679. #endif
  85680. "stm %[r]!, {r3, r4}\n\t"
  85681. "ldm %[b]!, {r5, r6}\n\t"
  85682. "ldm %[a]!, {r3, r4}\n\t"
  85683. #ifdef WOLFSSL_KEIL
  85684. "adcs r3, r3, r5\n\t"
  85685. #elif defined(__clang__)
  85686. "adcs r3, r5\n\t"
  85687. #else
  85688. "adc r3, r5\n\t"
  85689. #endif
  85690. #ifdef WOLFSSL_KEIL
  85691. "adcs r4, r4, r6\n\t"
  85692. #elif defined(__clang__)
  85693. "adcs r4, r6\n\t"
  85694. #else
  85695. "adc r4, r6\n\t"
  85696. #endif
  85697. "stm %[r]!, {r3, r4}\n\t"
  85698. "ldm %[b]!, {r5, r6}\n\t"
  85699. "ldm %[a]!, {r3, r4}\n\t"
  85700. #ifdef WOLFSSL_KEIL
  85701. "adcs r3, r3, r5\n\t"
  85702. #elif defined(__clang__)
  85703. "adcs r3, r5\n\t"
  85704. #else
  85705. "adc r3, r5\n\t"
  85706. #endif
  85707. #ifdef WOLFSSL_KEIL
  85708. "adcs r4, r4, r6\n\t"
  85709. #elif defined(__clang__)
  85710. "adcs r4, r6\n\t"
  85711. #else
  85712. "adc r4, r6\n\t"
  85713. #endif
  85714. "stm %[r]!, {r3, r4}\n\t"
  85715. "ldm %[b]!, {r5, r6}\n\t"
  85716. "ldm %[a]!, {r3, r4}\n\t"
  85717. #ifdef WOLFSSL_KEIL
  85718. "adcs r3, r3, r5\n\t"
  85719. #elif defined(__clang__)
  85720. "adcs r3, r5\n\t"
  85721. #else
  85722. "adc r3, r5\n\t"
  85723. #endif
  85724. #ifdef WOLFSSL_KEIL
  85725. "adcs r4, r4, r6\n\t"
  85726. #elif defined(__clang__)
  85727. "adcs r4, r6\n\t"
  85728. #else
  85729. "adc r4, r6\n\t"
  85730. #endif
  85731. "stm %[r]!, {r3, r4}\n\t"
  85732. "movs %[r], #0\n\t"
  85733. #ifdef WOLFSSL_KEIL
  85734. "adcs %[r], %[r], %[r]\n\t"
  85735. #elif defined(__clang__)
  85736. "adcs %[r], %[r]\n\t"
  85737. #else
  85738. "adc %[r], %[r]\n\t"
  85739. #endif
  85740. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  85741. :
  85742. : "memory", "r3", "r4", "r5", "r6"
  85743. );
  85744. return (uint32_t)(size_t)r;
  85745. }
  85746. /* Multiply a and b into r. (r = a * b)
  85747. *
  85748. * r A single precision integer.
  85749. * a A single precision integer.
  85750. * b A single precision integer.
  85751. */
  85752. SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a,
  85753. const sp_digit* b)
  85754. {
  85755. sp_digit* z0 = r;
  85756. sp_digit z1[128];
  85757. sp_digit a1[64];
  85758. sp_digit b1[64];
  85759. sp_digit* z2 = r + 128;
  85760. sp_digit u;
  85761. sp_digit ca;
  85762. sp_digit cb;
  85763. ca = sp_2048_add_64(a1, a, &a[64]);
  85764. cb = sp_2048_add_64(b1, b, &b[64]);
  85765. u = ca & cb;
  85766. sp_2048_mul_64(z2, &a[64], &b[64]);
  85767. sp_2048_mul_64(z0, a, b);
  85768. sp_2048_mul_64(z1, a1, b1);
  85769. u += sp_4096_sub_in_place_128(z1, z0);
  85770. u += sp_4096_sub_in_place_128(z1, z2);
  85771. sp_2048_mask_64(a1, a1, 0 - cb);
  85772. u += sp_2048_add_64(z1 + 64, z1 + 64, a1);
  85773. sp_2048_mask_64(b1, b1, 0 - ca);
  85774. u += sp_2048_add_64(z1 + 64, z1 + 64, b1);
  85775. u += sp_4096_add_128(r + 64, r + 64, z1);
  85776. (void)sp_4096_add_word_64(r + 192, r + 192, u);
  85777. }
  85778. /* Square a and put result in r. (r = a * a)
  85779. *
  85780. * r A single precision integer.
  85781. * a A single precision integer.
  85782. */
  85783. SP_NOINLINE static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a)
  85784. {
  85785. sp_digit* z0 = r;
  85786. sp_digit* z2 = r + 128;
  85787. sp_digit z1[128];
  85788. sp_digit* a1 = z1;
  85789. sp_digit* zero = z1 + 64;
  85790. sp_digit u;
  85791. sp_digit mask;
  85792. sp_digit* p1;
  85793. sp_digit* p2;
  85794. XMEMSET(zero, 0, sizeof(sp_digit) * 64);
  85795. mask = sp_2048_sub_64(a1, a, &a[64]);
  85796. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  85797. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  85798. (void)sp_2048_sub_64(a1, p1, p2);
  85799. sp_2048_sqr_64(z2, &a[64]);
  85800. sp_2048_sqr_64(z0, a);
  85801. sp_2048_sqr_64(z1, a1);
  85802. u = 0;
  85803. u -= sp_4096_sub_in_place_128(z1, z2);
  85804. u -= sp_4096_sub_in_place_128(z1, z0);
  85805. u += sp_4096_sub_in_place_128(r + 64, z1);
  85806. sp_4096_add_word_64(r + 192, r + 192, u);
  85807. }
  85808. #endif /* !WOLFSSL_SP_SMALL */
  85809. #ifdef WOLFSSL_SP_SMALL
  85810. /* Add b to a into r. (r = a + b)
  85811. *
  85812. * r A single precision integer.
  85813. * a A single precision integer.
  85814. * b A single precision integer.
  85815. */
  85816. SP_NOINLINE static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a,
  85817. const sp_digit* b)
  85818. {
  85819. __asm__ __volatile__ (
  85820. "movs r6, %[a]\n\t"
  85821. "movs r7, #0\n\t"
  85822. "movs r3, #0\n\t"
  85823. "movs r4, #2\n\t"
  85824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85825. "lsls r4, r4, #8\n\t"
  85826. #else
  85827. "lsl r4, r4, #8\n\t"
  85828. #endif
  85829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85830. "subs r7, r7, #1\n\t"
  85831. #else
  85832. "sub r7, r7, #1\n\t"
  85833. #endif
  85834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85835. "adds r6, r6, r4\n\t"
  85836. #else
  85837. "add r6, r6, r4\n\t"
  85838. #endif
  85839. "\n"
  85840. "L_sp_4096_add_128_word_%=:\n\t"
  85841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85842. "adds r3, r3, r7\n\t"
  85843. #else
  85844. "add r3, r3, r7\n\t"
  85845. #endif
  85846. "ldr r4, [%[a]]\n\t"
  85847. "ldr r5, [%[b]]\n\t"
  85848. #ifdef WOLFSSL_KEIL
  85849. "adcs r4, r4, r5\n\t"
  85850. #elif defined(__clang__)
  85851. "adcs r4, r5\n\t"
  85852. #else
  85853. "adc r4, r5\n\t"
  85854. #endif
  85855. "str r4, [%[r]]\n\t"
  85856. "movs r3, #0\n\t"
  85857. #ifdef WOLFSSL_KEIL
  85858. "adcs r3, r3, r3\n\t"
  85859. #elif defined(__clang__)
  85860. "adcs r3, r3\n\t"
  85861. #else
  85862. "adc r3, r3\n\t"
  85863. #endif
  85864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85865. "adds %[a], %[a], #4\n\t"
  85866. #else
  85867. "add %[a], %[a], #4\n\t"
  85868. #endif
  85869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85870. "adds %[b], %[b], #4\n\t"
  85871. #else
  85872. "add %[b], %[b], #4\n\t"
  85873. #endif
  85874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85875. "adds %[r], %[r], #4\n\t"
  85876. #else
  85877. "add %[r], %[r], #4\n\t"
  85878. #endif
  85879. "cmp %[a], r6\n\t"
  85880. "bne L_sp_4096_add_128_word_%=\n\t"
  85881. "movs %[r], r3\n\t"
  85882. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  85883. :
  85884. : "memory", "r3", "r4", "r5", "r6", "r7"
  85885. );
  85886. return (uint32_t)(size_t)r;
  85887. }
  85888. #endif /* WOLFSSL_SP_SMALL */
  85889. #ifdef WOLFSSL_SP_SMALL
  85890. /* Sub b from a into a. (a -= b)
  85891. *
  85892. * a A single precision integer.
  85893. * b A single precision integer.
  85894. */
  85895. SP_NOINLINE static sp_digit sp_4096_sub_in_place_128(sp_digit* a,
  85896. const sp_digit* b)
  85897. {
  85898. __asm__ __volatile__ (
  85899. "movs r7, %[a]\n\t"
  85900. "movs r2, #0\n\t"
  85901. "movs r5, #2\n\t"
  85902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85903. "lsls r5, r5, #8\n\t"
  85904. #else
  85905. "lsl r5, r5, #8\n\t"
  85906. #endif
  85907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85908. "adds r7, r7, r5\n\t"
  85909. #else
  85910. "add r7, r7, r5\n\t"
  85911. #endif
  85912. "\n"
  85913. "L_sp_4096_sub_in_place_128_words_%=:\n\t"
  85914. "movs r5, #0\n\t"
  85915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85916. "subs r5, r5, r2\n\t"
  85917. #else
  85918. "sub r5, r5, r2\n\t"
  85919. #endif
  85920. "ldr r3, [%[a]]\n\t"
  85921. "ldr r4, [%[a], #4]\n\t"
  85922. "ldr r5, [%[b]]\n\t"
  85923. "ldr r6, [%[b], #4]\n\t"
  85924. #ifdef WOLFSSL_KEIL
  85925. "sbcs r3, r3, r5\n\t"
  85926. #elif defined(__clang__)
  85927. "sbcs r3, r5\n\t"
  85928. #else
  85929. "sbc r3, r5\n\t"
  85930. #endif
  85931. #ifdef WOLFSSL_KEIL
  85932. "sbcs r4, r4, r6\n\t"
  85933. #elif defined(__clang__)
  85934. "sbcs r4, r6\n\t"
  85935. #else
  85936. "sbc r4, r6\n\t"
  85937. #endif
  85938. "str r3, [%[a]]\n\t"
  85939. "str r4, [%[a], #4]\n\t"
  85940. #ifdef WOLFSSL_KEIL
  85941. "sbcs r2, r2, r2\n\t"
  85942. #elif defined(__clang__)
  85943. "sbcs r2, r2\n\t"
  85944. #else
  85945. "sbc r2, r2\n\t"
  85946. #endif
  85947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85948. "adds %[a], %[a], #8\n\t"
  85949. #else
  85950. "add %[a], %[a], #8\n\t"
  85951. #endif
  85952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85953. "adds %[b], %[b], #8\n\t"
  85954. #else
  85955. "add %[b], %[b], #8\n\t"
  85956. #endif
  85957. "cmp %[a], r7\n\t"
  85958. "bne L_sp_4096_sub_in_place_128_words_%=\n\t"
  85959. "movs %[a], r2\n\t"
  85960. : [a] "+l" (a), [b] "+l" (b)
  85961. :
  85962. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  85963. );
  85964. return (uint32_t)(size_t)a;
  85965. }
  85966. #endif /* WOLFSSL_SP_SMALL */
  85967. #ifdef WOLFSSL_SP_SMALL
  85968. /* Multiply a and b into r. (r = a * b)
  85969. *
  85970. * r A single precision integer.
  85971. * a A single precision integer.
  85972. * b A single precision integer.
  85973. */
  85974. SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a,
  85975. const sp_digit* b)
  85976. {
  85977. sp_digit t[128 * 2];
  85978. sp_digit* tmp = t;
  85979. __asm__ __volatile__ (
  85980. "movs r3, #0\n\t"
  85981. "movs r4, #0\n\t"
  85982. "mov r8, r3\n\t"
  85983. "mov r11, %[tmp]\n\t"
  85984. "mov r9, %[a]\n\t"
  85985. "mov r10, %[b]\n\t"
  85986. "movs r6, #2\n\t"
  85987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  85988. "lsls r6, r6, #8\n\t"
  85989. #else
  85990. "lsl r6, r6, #8\n\t"
  85991. #endif
  85992. "add r6, r6, r9\n\t"
  85993. "mov r12, r6\n\t"
  85994. "\n"
  85995. "L_sp_4096_mul_128_words_%=:\n\t"
  85996. "movs %[tmp], #0\n\t"
  85997. "movs r5, #0\n\t"
  85998. "movs r6, #0xff\n\t"
  85999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86000. "adds r6, r6, #0xfd\n\t"
  86001. #else
  86002. "add r6, r6, #0xfd\n\t"
  86003. #endif
  86004. "mov %[a], r8\n\t"
  86005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86006. "subs %[a], %[a], r6\n\t"
  86007. #else
  86008. "sub %[a], %[a], r6\n\t"
  86009. #endif
  86010. #ifdef WOLFSSL_KEIL
  86011. "sbcs r6, r6, r6\n\t"
  86012. #elif defined(__clang__)
  86013. "sbcs r6, r6\n\t"
  86014. #else
  86015. "sbc r6, r6\n\t"
  86016. #endif
  86017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86018. "mvns r6, r6\n\t"
  86019. #else
  86020. "mvn r6, r6\n\t"
  86021. #endif
  86022. #ifdef WOLFSSL_KEIL
  86023. "ands %[a], %[a], r6\n\t"
  86024. #elif defined(__clang__)
  86025. "ands %[a], r6\n\t"
  86026. #else
  86027. "and %[a], r6\n\t"
  86028. #endif
  86029. "mov %[b], r8\n\t"
  86030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86031. "subs %[b], %[b], %[a]\n\t"
  86032. #else
  86033. "sub %[b], %[b], %[a]\n\t"
  86034. #endif
  86035. "add %[a], %[a], r9\n\t"
  86036. "add %[b], %[b], r10\n\t"
  86037. "\n"
  86038. "L_sp_4096_mul_128_mul_%=:\n\t"
  86039. "# Multiply Start\n\t"
  86040. "ldrh r6, [%[a]]\n\t"
  86041. "ldrh r7, [%[b]]\n\t"
  86042. #ifdef WOLFSSL_KEIL
  86043. "muls r7, r6, r7\n\t"
  86044. #elif defined(__clang__)
  86045. "muls r7, r6\n\t"
  86046. #else
  86047. "mul r7, r6\n\t"
  86048. #endif
  86049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86050. "adds r3, r3, r7\n\t"
  86051. #else
  86052. "add r3, r3, r7\n\t"
  86053. #endif
  86054. #ifdef WOLFSSL_KEIL
  86055. "adcs r4, r4, %[tmp]\n\t"
  86056. #elif defined(__clang__)
  86057. "adcs r4, %[tmp]\n\t"
  86058. #else
  86059. "adc r4, %[tmp]\n\t"
  86060. #endif
  86061. #ifdef WOLFSSL_KEIL
  86062. "adcs r5, r5, %[tmp]\n\t"
  86063. #elif defined(__clang__)
  86064. "adcs r5, %[tmp]\n\t"
  86065. #else
  86066. "adc r5, %[tmp]\n\t"
  86067. #endif
  86068. "ldr r7, [%[b]]\n\t"
  86069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86070. "lsrs r7, r7, #16\n\t"
  86071. #else
  86072. "lsr r7, r7, #16\n\t"
  86073. #endif
  86074. #ifdef WOLFSSL_KEIL
  86075. "muls r6, r7, r6\n\t"
  86076. #elif defined(__clang__)
  86077. "muls r6, r7\n\t"
  86078. #else
  86079. "mul r6, r7\n\t"
  86080. #endif
  86081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86082. "lsrs r7, r6, #16\n\t"
  86083. #else
  86084. "lsr r7, r6, #16\n\t"
  86085. #endif
  86086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86087. "lsls r6, r6, #16\n\t"
  86088. #else
  86089. "lsl r6, r6, #16\n\t"
  86090. #endif
  86091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86092. "adds r3, r3, r6\n\t"
  86093. #else
  86094. "add r3, r3, r6\n\t"
  86095. #endif
  86096. #ifdef WOLFSSL_KEIL
  86097. "adcs r4, r4, r7\n\t"
  86098. #elif defined(__clang__)
  86099. "adcs r4, r7\n\t"
  86100. #else
  86101. "adc r4, r7\n\t"
  86102. #endif
  86103. #ifdef WOLFSSL_KEIL
  86104. "adcs r5, r5, %[tmp]\n\t"
  86105. #elif defined(__clang__)
  86106. "adcs r5, %[tmp]\n\t"
  86107. #else
  86108. "adc r5, %[tmp]\n\t"
  86109. #endif
  86110. "ldr r6, [%[a]]\n\t"
  86111. "ldr r7, [%[b]]\n\t"
  86112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86113. "lsrs r6, r6, #16\n\t"
  86114. #else
  86115. "lsr r6, r6, #16\n\t"
  86116. #endif
  86117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86118. "lsrs r7, r7, #16\n\t"
  86119. #else
  86120. "lsr r7, r7, #16\n\t"
  86121. #endif
  86122. #ifdef WOLFSSL_KEIL
  86123. "muls r7, r6, r7\n\t"
  86124. #elif defined(__clang__)
  86125. "muls r7, r6\n\t"
  86126. #else
  86127. "mul r7, r6\n\t"
  86128. #endif
  86129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86130. "adds r4, r4, r7\n\t"
  86131. #else
  86132. "add r4, r4, r7\n\t"
  86133. #endif
  86134. #ifdef WOLFSSL_KEIL
  86135. "adcs r5, r5, %[tmp]\n\t"
  86136. #elif defined(__clang__)
  86137. "adcs r5, %[tmp]\n\t"
  86138. #else
  86139. "adc r5, %[tmp]\n\t"
  86140. #endif
  86141. "ldrh r7, [%[b]]\n\t"
  86142. #ifdef WOLFSSL_KEIL
  86143. "muls r6, r7, r6\n\t"
  86144. #elif defined(__clang__)
  86145. "muls r6, r7\n\t"
  86146. #else
  86147. "mul r6, r7\n\t"
  86148. #endif
  86149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86150. "lsrs r7, r6, #16\n\t"
  86151. #else
  86152. "lsr r7, r6, #16\n\t"
  86153. #endif
  86154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86155. "lsls r6, r6, #16\n\t"
  86156. #else
  86157. "lsl r6, r6, #16\n\t"
  86158. #endif
  86159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86160. "adds r3, r3, r6\n\t"
  86161. #else
  86162. "add r3, r3, r6\n\t"
  86163. #endif
  86164. #ifdef WOLFSSL_KEIL
  86165. "adcs r4, r4, r7\n\t"
  86166. #elif defined(__clang__)
  86167. "adcs r4, r7\n\t"
  86168. #else
  86169. "adc r4, r7\n\t"
  86170. #endif
  86171. #ifdef WOLFSSL_KEIL
  86172. "adcs r5, r5, %[tmp]\n\t"
  86173. #elif defined(__clang__)
  86174. "adcs r5, %[tmp]\n\t"
  86175. #else
  86176. "adc r5, %[tmp]\n\t"
  86177. #endif
  86178. "# Multiply Done\n\t"
  86179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86180. "adds %[a], %[a], #4\n\t"
  86181. #else
  86182. "add %[a], %[a], #4\n\t"
  86183. #endif
  86184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86185. "subs %[b], %[b], #4\n\t"
  86186. #else
  86187. "sub %[b], %[b], #4\n\t"
  86188. #endif
  86189. "cmp %[a], r12\n\t"
  86190. "beq L_sp_4096_mul_128_done_mul_%=\n\t"
  86191. "mov r6, r8\n\t"
  86192. "add r6, r6, r9\n\t"
  86193. "cmp %[a], r6\n\t"
  86194. "ble L_sp_4096_mul_128_mul_%=\n\t"
  86195. "\n"
  86196. "L_sp_4096_mul_128_done_mul_%=:\n\t"
  86197. "mov %[tmp], r11\n\t"
  86198. "mov r7, r8\n\t"
  86199. "str r3, [%[tmp], r7]\n\t"
  86200. "movs r3, r4\n\t"
  86201. "movs r4, r5\n\t"
  86202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86203. "adds r7, r7, #4\n\t"
  86204. #else
  86205. "add r7, r7, #4\n\t"
  86206. #endif
  86207. "mov r8, r7\n\t"
  86208. "movs r6, #3\n\t"
  86209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86210. "lsls r6, r6, #8\n\t"
  86211. #else
  86212. "lsl r6, r6, #8\n\t"
  86213. #endif
  86214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86215. "adds r6, r6, #0xf8\n\t"
  86216. #else
  86217. "add r6, r6, #0xf8\n\t"
  86218. #endif
  86219. "cmp r7, r6\n\t"
  86220. "ble L_sp_4096_mul_128_words_%=\n\t"
  86221. "str r3, [%[tmp], r7]\n\t"
  86222. "mov %[a], r9\n\t"
  86223. "mov %[b], r10\n\t"
  86224. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  86225. :
  86226. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  86227. );
  86228. XMEMCPY(r, t, sizeof(t));
  86229. }
  86230. /* Square a and put result in r. (r = a * a)
  86231. *
  86232. * r A single precision integer.
  86233. * a A single precision integer.
  86234. */
  86235. SP_NOINLINE static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a)
  86236. {
  86237. __asm__ __volatile__ (
  86238. "movs r3, #0\n\t"
  86239. "movs r4, #0\n\t"
  86240. "movs r5, #0\n\t"
  86241. "mov r8, r3\n\t"
  86242. "mov r11, %[r]\n\t"
  86243. "movs r6, #4\n\t"
  86244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86245. "lsls r6, r6, #8\n\t"
  86246. #else
  86247. "lsl r6, r6, #8\n\t"
  86248. #endif
  86249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86250. "negs r6, r6\n\t"
  86251. #else
  86252. "neg r6, r6\n\t"
  86253. #endif
  86254. "add sp, sp, r6\n\t"
  86255. "mov r10, sp\n\t"
  86256. "mov r9, %[a]\n\t"
  86257. "\n"
  86258. "L_sp_4096_sqr_128_words_%=:\n\t"
  86259. "movs %[r], #0\n\t"
  86260. "movs r6, #0xff\n\t"
  86261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86262. "adds r6, r6, #0xfd\n\t"
  86263. #else
  86264. "add r6, r6, #0xfd\n\t"
  86265. #endif
  86266. "mov %[a], r8\n\t"
  86267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86268. "subs %[a], %[a], r6\n\t"
  86269. #else
  86270. "sub %[a], %[a], r6\n\t"
  86271. #endif
  86272. #ifdef WOLFSSL_KEIL
  86273. "sbcs r6, r6, r6\n\t"
  86274. #elif defined(__clang__)
  86275. "sbcs r6, r6\n\t"
  86276. #else
  86277. "sbc r6, r6\n\t"
  86278. #endif
  86279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86280. "mvns r6, r6\n\t"
  86281. #else
  86282. "mvn r6, r6\n\t"
  86283. #endif
  86284. #ifdef WOLFSSL_KEIL
  86285. "ands %[a], %[a], r6\n\t"
  86286. #elif defined(__clang__)
  86287. "ands %[a], r6\n\t"
  86288. #else
  86289. "and %[a], r6\n\t"
  86290. #endif
  86291. "mov r2, r8\n\t"
  86292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86293. "subs r2, r2, %[a]\n\t"
  86294. #else
  86295. "sub r2, r2, %[a]\n\t"
  86296. #endif
  86297. "add %[a], %[a], r9\n\t"
  86298. "add r2, r2, r9\n\t"
  86299. "\n"
  86300. "L_sp_4096_sqr_128_mul_%=:\n\t"
  86301. "cmp r2, %[a]\n\t"
  86302. "beq L_sp_4096_sqr_128_sqr_%=\n\t"
  86303. "# Multiply * 2: Start\n\t"
  86304. "ldrh r6, [%[a]]\n\t"
  86305. "ldrh r7, [r2]\n\t"
  86306. #ifdef WOLFSSL_KEIL
  86307. "muls r7, r6, r7\n\t"
  86308. #elif defined(__clang__)
  86309. "muls r7, r6\n\t"
  86310. #else
  86311. "mul r7, r6\n\t"
  86312. #endif
  86313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86314. "adds r3, r3, r7\n\t"
  86315. #else
  86316. "add r3, r3, r7\n\t"
  86317. #endif
  86318. #ifdef WOLFSSL_KEIL
  86319. "adcs r4, r4, %[r]\n\t"
  86320. #elif defined(__clang__)
  86321. "adcs r4, %[r]\n\t"
  86322. #else
  86323. "adc r4, %[r]\n\t"
  86324. #endif
  86325. #ifdef WOLFSSL_KEIL
  86326. "adcs r5, r5, %[r]\n\t"
  86327. #elif defined(__clang__)
  86328. "adcs r5, %[r]\n\t"
  86329. #else
  86330. "adc r5, %[r]\n\t"
  86331. #endif
  86332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86333. "adds r3, r3, r7\n\t"
  86334. #else
  86335. "add r3, r3, r7\n\t"
  86336. #endif
  86337. #ifdef WOLFSSL_KEIL
  86338. "adcs r4, r4, %[r]\n\t"
  86339. #elif defined(__clang__)
  86340. "adcs r4, %[r]\n\t"
  86341. #else
  86342. "adc r4, %[r]\n\t"
  86343. #endif
  86344. #ifdef WOLFSSL_KEIL
  86345. "adcs r5, r5, %[r]\n\t"
  86346. #elif defined(__clang__)
  86347. "adcs r5, %[r]\n\t"
  86348. #else
  86349. "adc r5, %[r]\n\t"
  86350. #endif
  86351. "ldr r7, [r2]\n\t"
  86352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86353. "lsrs r7, r7, #16\n\t"
  86354. #else
  86355. "lsr r7, r7, #16\n\t"
  86356. #endif
  86357. #ifdef WOLFSSL_KEIL
  86358. "muls r6, r7, r6\n\t"
  86359. #elif defined(__clang__)
  86360. "muls r6, r7\n\t"
  86361. #else
  86362. "mul r6, r7\n\t"
  86363. #endif
  86364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86365. "lsrs r7, r6, #16\n\t"
  86366. #else
  86367. "lsr r7, r6, #16\n\t"
  86368. #endif
  86369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86370. "lsls r6, r6, #16\n\t"
  86371. #else
  86372. "lsl r6, r6, #16\n\t"
  86373. #endif
  86374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86375. "adds r3, r3, r6\n\t"
  86376. #else
  86377. "add r3, r3, r6\n\t"
  86378. #endif
  86379. #ifdef WOLFSSL_KEIL
  86380. "adcs r4, r4, r7\n\t"
  86381. #elif defined(__clang__)
  86382. "adcs r4, r7\n\t"
  86383. #else
  86384. "adc r4, r7\n\t"
  86385. #endif
  86386. #ifdef WOLFSSL_KEIL
  86387. "adcs r5, r5, %[r]\n\t"
  86388. #elif defined(__clang__)
  86389. "adcs r5, %[r]\n\t"
  86390. #else
  86391. "adc r5, %[r]\n\t"
  86392. #endif
  86393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86394. "adds r3, r3, r6\n\t"
  86395. #else
  86396. "add r3, r3, r6\n\t"
  86397. #endif
  86398. #ifdef WOLFSSL_KEIL
  86399. "adcs r4, r4, r7\n\t"
  86400. #elif defined(__clang__)
  86401. "adcs r4, r7\n\t"
  86402. #else
  86403. "adc r4, r7\n\t"
  86404. #endif
  86405. #ifdef WOLFSSL_KEIL
  86406. "adcs r5, r5, %[r]\n\t"
  86407. #elif defined(__clang__)
  86408. "adcs r5, %[r]\n\t"
  86409. #else
  86410. "adc r5, %[r]\n\t"
  86411. #endif
  86412. "ldr r6, [%[a]]\n\t"
  86413. "ldr r7, [r2]\n\t"
  86414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86415. "lsrs r6, r6, #16\n\t"
  86416. #else
  86417. "lsr r6, r6, #16\n\t"
  86418. #endif
  86419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86420. "lsrs r7, r7, #16\n\t"
  86421. #else
  86422. "lsr r7, r7, #16\n\t"
  86423. #endif
  86424. #ifdef WOLFSSL_KEIL
  86425. "muls r7, r6, r7\n\t"
  86426. #elif defined(__clang__)
  86427. "muls r7, r6\n\t"
  86428. #else
  86429. "mul r7, r6\n\t"
  86430. #endif
  86431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86432. "adds r4, r4, r7\n\t"
  86433. #else
  86434. "add r4, r4, r7\n\t"
  86435. #endif
  86436. #ifdef WOLFSSL_KEIL
  86437. "adcs r5, r5, %[r]\n\t"
  86438. #elif defined(__clang__)
  86439. "adcs r5, %[r]\n\t"
  86440. #else
  86441. "adc r5, %[r]\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. "ldrh r7, [r2]\n\t"
  86456. #ifdef WOLFSSL_KEIL
  86457. "muls r6, r7, r6\n\t"
  86458. #elif defined(__clang__)
  86459. "muls r6, r7\n\t"
  86460. #else
  86461. "mul r6, r7\n\t"
  86462. #endif
  86463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86464. "lsrs r7, r6, #16\n\t"
  86465. #else
  86466. "lsr r7, r6, #16\n\t"
  86467. #endif
  86468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86469. "lsls r6, r6, #16\n\t"
  86470. #else
  86471. "lsl r6, r6, #16\n\t"
  86472. #endif
  86473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86474. "adds r3, r3, r6\n\t"
  86475. #else
  86476. "add r3, r3, r6\n\t"
  86477. #endif
  86478. #ifdef WOLFSSL_KEIL
  86479. "adcs r4, r4, r7\n\t"
  86480. #elif defined(__clang__)
  86481. "adcs r4, r7\n\t"
  86482. #else
  86483. "adc r4, r7\n\t"
  86484. #endif
  86485. #ifdef WOLFSSL_KEIL
  86486. "adcs r5, r5, %[r]\n\t"
  86487. #elif defined(__clang__)
  86488. "adcs r5, %[r]\n\t"
  86489. #else
  86490. "adc r5, %[r]\n\t"
  86491. #endif
  86492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86493. "adds r3, r3, r6\n\t"
  86494. #else
  86495. "add r3, r3, r6\n\t"
  86496. #endif
  86497. #ifdef WOLFSSL_KEIL
  86498. "adcs r4, r4, r7\n\t"
  86499. #elif defined(__clang__)
  86500. "adcs r4, r7\n\t"
  86501. #else
  86502. "adc r4, r7\n\t"
  86503. #endif
  86504. #ifdef WOLFSSL_KEIL
  86505. "adcs r5, r5, %[r]\n\t"
  86506. #elif defined(__clang__)
  86507. "adcs r5, %[r]\n\t"
  86508. #else
  86509. "adc r5, %[r]\n\t"
  86510. #endif
  86511. "# Multiply * 2: Done\n\t"
  86512. "bal L_sp_4096_sqr_128_done_sqr_%=\n\t"
  86513. "\n"
  86514. "L_sp_4096_sqr_128_sqr_%=:\n\t"
  86515. "mov r12, r2\n\t"
  86516. "ldr r2, [%[a]]\n\t"
  86517. "# Square: Start\n\t"
  86518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86519. "lsrs r7, r2, #16\n\t"
  86520. #else
  86521. "lsr r7, r2, #16\n\t"
  86522. #endif
  86523. "uxth r6, r2\n\t"
  86524. #ifdef WOLFSSL_KEIL
  86525. "muls r6, r6, r6\n\t"
  86526. #elif defined(__clang__)
  86527. "muls r6, r6\n\t"
  86528. #else
  86529. "mul r6, r6\n\t"
  86530. #endif
  86531. #ifdef WOLFSSL_KEIL
  86532. "muls r7, r7, r7\n\t"
  86533. #elif defined(__clang__)
  86534. "muls r7, r7\n\t"
  86535. #else
  86536. "mul r7, r7\n\t"
  86537. #endif
  86538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86539. "adds r3, r3, r6\n\t"
  86540. #else
  86541. "add r3, r3, r6\n\t"
  86542. #endif
  86543. #ifdef WOLFSSL_KEIL
  86544. "adcs r4, r4, r7\n\t"
  86545. #elif defined(__clang__)
  86546. "adcs r4, r7\n\t"
  86547. #else
  86548. "adc r4, r7\n\t"
  86549. #endif
  86550. #ifdef WOLFSSL_KEIL
  86551. "adcs r5, r5, %[r]\n\t"
  86552. #elif defined(__clang__)
  86553. "adcs r5, %[r]\n\t"
  86554. #else
  86555. "adc r5, %[r]\n\t"
  86556. #endif
  86557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86558. "lsrs r7, r2, #16\n\t"
  86559. #else
  86560. "lsr r7, r2, #16\n\t"
  86561. #endif
  86562. "uxth r6, r2\n\t"
  86563. #ifdef WOLFSSL_KEIL
  86564. "muls r6, r7, r6\n\t"
  86565. #elif defined(__clang__)
  86566. "muls r6, r7\n\t"
  86567. #else
  86568. "mul r6, r7\n\t"
  86569. #endif
  86570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86571. "lsrs r7, r6, #15\n\t"
  86572. #else
  86573. "lsr r7, r6, #15\n\t"
  86574. #endif
  86575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86576. "lsls r6, r6, #17\n\t"
  86577. #else
  86578. "lsl r6, r6, #17\n\t"
  86579. #endif
  86580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86581. "adds r3, r3, r6\n\t"
  86582. #else
  86583. "add r3, r3, r6\n\t"
  86584. #endif
  86585. #ifdef WOLFSSL_KEIL
  86586. "adcs r4, r4, r7\n\t"
  86587. #elif defined(__clang__)
  86588. "adcs r4, r7\n\t"
  86589. #else
  86590. "adc r4, r7\n\t"
  86591. #endif
  86592. #ifdef WOLFSSL_KEIL
  86593. "adcs r5, r5, %[r]\n\t"
  86594. #elif defined(__clang__)
  86595. "adcs r5, %[r]\n\t"
  86596. #else
  86597. "adc r5, %[r]\n\t"
  86598. #endif
  86599. "# Square: Done\n\t"
  86600. "mov r2, r12\n\t"
  86601. "\n"
  86602. "L_sp_4096_sqr_128_done_sqr_%=:\n\t"
  86603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86604. "adds %[a], %[a], #4\n\t"
  86605. #else
  86606. "add %[a], %[a], #4\n\t"
  86607. #endif
  86608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86609. "subs r2, r2, #4\n\t"
  86610. #else
  86611. "sub r2, r2, #4\n\t"
  86612. #endif
  86613. "movs r6, #2\n\t"
  86614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86615. "lsls r6, r6, #8\n\t"
  86616. #else
  86617. "lsl r6, r6, #8\n\t"
  86618. #endif
  86619. "add r6, r6, r9\n\t"
  86620. "cmp %[a], r6\n\t"
  86621. "beq L_sp_4096_sqr_128_done_mul_%=\n\t"
  86622. "cmp %[a], r2\n\t"
  86623. "bgt L_sp_4096_sqr_128_done_mul_%=\n\t"
  86624. "mov r7, r8\n\t"
  86625. "add r7, r7, r9\n\t"
  86626. "cmp %[a], r7\n\t"
  86627. "ble L_sp_4096_sqr_128_mul_%=\n\t"
  86628. "\n"
  86629. "L_sp_4096_sqr_128_done_mul_%=:\n\t"
  86630. "mov %[r], r10\n\t"
  86631. "mov r7, r8\n\t"
  86632. "str r3, [%[r], r7]\n\t"
  86633. "movs r3, r4\n\t"
  86634. "movs r4, r5\n\t"
  86635. "movs r5, #0\n\t"
  86636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86637. "adds r7, r7, #4\n\t"
  86638. #else
  86639. "add r7, r7, #4\n\t"
  86640. #endif
  86641. "mov r8, r7\n\t"
  86642. "movs r6, #3\n\t"
  86643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86644. "lsls r6, r6, #8\n\t"
  86645. #else
  86646. "lsl r6, r6, #8\n\t"
  86647. #endif
  86648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86649. "adds r6, r6, #0xf8\n\t"
  86650. #else
  86651. "add r6, r6, #0xf8\n\t"
  86652. #endif
  86653. "cmp r7, r6\n\t"
  86654. "ble L_sp_4096_sqr_128_words_%=\n\t"
  86655. "mov %[a], r9\n\t"
  86656. "str r3, [%[r], r7]\n\t"
  86657. "mov %[r], r11\n\t"
  86658. "mov %[a], r10\n\t"
  86659. "movs r3, #3\n\t"
  86660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86661. "lsls r3, r3, #8\n\t"
  86662. #else
  86663. "lsl r3, r3, #8\n\t"
  86664. #endif
  86665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86666. "adds r3, r3, #0xfc\n\t"
  86667. #else
  86668. "add r3, r3, #0xfc\n\t"
  86669. #endif
  86670. "\n"
  86671. "L_sp_4096_sqr_128_store_%=:\n\t"
  86672. "ldr r6, [%[a], r3]\n\t"
  86673. "str r6, [%[r], r3]\n\t"
  86674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86675. "subs r3, r3, #4\n\t"
  86676. #else
  86677. "sub r3, r3, #4\n\t"
  86678. #endif
  86679. "bge L_sp_4096_sqr_128_store_%=\n\t"
  86680. "movs r6, #4\n\t"
  86681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86682. "lsls r6, r6, #8\n\t"
  86683. #else
  86684. "lsl r6, r6, #8\n\t"
  86685. #endif
  86686. "add sp, sp, r6\n\t"
  86687. : [r] "+l" (r), [a] "+l" (a)
  86688. :
  86689. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  86690. );
  86691. }
  86692. #endif /* WOLFSSL_SP_SMALL */
  86693. /* Caclulate the bottom digit of -1/a mod 2^n.
  86694. *
  86695. * a A single precision number.
  86696. * rho Bottom word of inverse.
  86697. */
  86698. static void sp_4096_mont_setup(const sp_digit* a, sp_digit* rho)
  86699. {
  86700. sp_digit x;
  86701. sp_digit b;
  86702. b = a[0];
  86703. x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */
  86704. x *= 2 - b * x; /* here x*a==1 mod 2**8 */
  86705. x *= 2 - b * x; /* here x*a==1 mod 2**16 */
  86706. x *= 2 - b * x; /* here x*a==1 mod 2**32 */
  86707. /* rho = -1/m mod b */
  86708. *rho = (sp_digit)0 - x;
  86709. }
  86710. /* Mul a by digit b into r. (r = a * b)
  86711. *
  86712. * r A single precision integer.
  86713. * a A single precision integer.
  86714. * b A single precision digit.
  86715. */
  86716. SP_NOINLINE static void sp_4096_mul_d_128(sp_digit* r, const sp_digit* a,
  86717. sp_digit b)
  86718. {
  86719. __asm__ __volatile__ (
  86720. "movs r6, #2\n\t"
  86721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86722. "lsls r6, r6, #8\n\t"
  86723. #else
  86724. "lsl r6, r6, #8\n\t"
  86725. #endif
  86726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86727. "adds r6, r6, %[a]\n\t"
  86728. #else
  86729. "add r6, r6, %[a]\n\t"
  86730. #endif
  86731. "mov r8, %[r]\n\t"
  86732. "mov r9, r6\n\t"
  86733. "movs r3, #0\n\t"
  86734. "movs r4, #0\n\t"
  86735. "\n"
  86736. "L_sp_4096_mul_d_128_%=:\n\t"
  86737. "movs %[r], #0\n\t"
  86738. "movs r5, #0\n\t"
  86739. "# A[] * B\n\t"
  86740. "ldrh r6, [%[a]]\n\t"
  86741. "uxth r7, %[b]\n\t"
  86742. #ifdef WOLFSSL_KEIL
  86743. "muls r7, r6, r7\n\t"
  86744. #elif defined(__clang__)
  86745. "muls r7, r6\n\t"
  86746. #else
  86747. "mul r7, r6\n\t"
  86748. #endif
  86749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86750. "adds r3, r3, r7\n\t"
  86751. #else
  86752. "add r3, r3, r7\n\t"
  86753. #endif
  86754. #ifdef WOLFSSL_KEIL
  86755. "adcs r4, r4, %[r]\n\t"
  86756. #elif defined(__clang__)
  86757. "adcs r4, %[r]\n\t"
  86758. #else
  86759. "adc r4, %[r]\n\t"
  86760. #endif
  86761. #ifdef WOLFSSL_KEIL
  86762. "adcs r5, r5, %[r]\n\t"
  86763. #elif defined(__clang__)
  86764. "adcs r5, %[r]\n\t"
  86765. #else
  86766. "adc r5, %[r]\n\t"
  86767. #endif
  86768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86769. "lsrs r7, %[b], #16\n\t"
  86770. #else
  86771. "lsr r7, %[b], #16\n\t"
  86772. #endif
  86773. #ifdef WOLFSSL_KEIL
  86774. "muls r6, r7, r6\n\t"
  86775. #elif defined(__clang__)
  86776. "muls r6, r7\n\t"
  86777. #else
  86778. "mul r6, r7\n\t"
  86779. #endif
  86780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86781. "lsrs r7, r6, #16\n\t"
  86782. #else
  86783. "lsr r7, r6, #16\n\t"
  86784. #endif
  86785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86786. "lsls r6, r6, #16\n\t"
  86787. #else
  86788. "lsl r6, r6, #16\n\t"
  86789. #endif
  86790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86791. "adds r3, r3, r6\n\t"
  86792. #else
  86793. "add r3, r3, r6\n\t"
  86794. #endif
  86795. #ifdef WOLFSSL_KEIL
  86796. "adcs r4, r4, r7\n\t"
  86797. #elif defined(__clang__)
  86798. "adcs r4, r7\n\t"
  86799. #else
  86800. "adc r4, r7\n\t"
  86801. #endif
  86802. #ifdef WOLFSSL_KEIL
  86803. "adcs r5, r5, %[r]\n\t"
  86804. #elif defined(__clang__)
  86805. "adcs r5, %[r]\n\t"
  86806. #else
  86807. "adc r5, %[r]\n\t"
  86808. #endif
  86809. "ldr r6, [%[a]]\n\t"
  86810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86811. "lsrs r6, r6, #16\n\t"
  86812. #else
  86813. "lsr r6, r6, #16\n\t"
  86814. #endif
  86815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86816. "lsrs r7, %[b], #16\n\t"
  86817. #else
  86818. "lsr r7, %[b], #16\n\t"
  86819. #endif
  86820. #ifdef WOLFSSL_KEIL
  86821. "muls r7, r6, r7\n\t"
  86822. #elif defined(__clang__)
  86823. "muls r7, r6\n\t"
  86824. #else
  86825. "mul r7, r6\n\t"
  86826. #endif
  86827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86828. "adds r4, r4, r7\n\t"
  86829. #else
  86830. "add r4, r4, r7\n\t"
  86831. #endif
  86832. #ifdef WOLFSSL_KEIL
  86833. "adcs r5, r5, %[r]\n\t"
  86834. #elif defined(__clang__)
  86835. "adcs r5, %[r]\n\t"
  86836. #else
  86837. "adc r5, %[r]\n\t"
  86838. #endif
  86839. "uxth r7, %[b]\n\t"
  86840. #ifdef WOLFSSL_KEIL
  86841. "muls r6, r7, r6\n\t"
  86842. #elif defined(__clang__)
  86843. "muls r6, r7\n\t"
  86844. #else
  86845. "mul r6, r7\n\t"
  86846. #endif
  86847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86848. "lsrs r7, r6, #16\n\t"
  86849. #else
  86850. "lsr r7, r6, #16\n\t"
  86851. #endif
  86852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86853. "lsls r6, r6, #16\n\t"
  86854. #else
  86855. "lsl r6, r6, #16\n\t"
  86856. #endif
  86857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86858. "adds r3, r3, r6\n\t"
  86859. #else
  86860. "add r3, r3, r6\n\t"
  86861. #endif
  86862. #ifdef WOLFSSL_KEIL
  86863. "adcs r4, r4, r7\n\t"
  86864. #elif defined(__clang__)
  86865. "adcs r4, r7\n\t"
  86866. #else
  86867. "adc r4, r7\n\t"
  86868. #endif
  86869. #ifdef WOLFSSL_KEIL
  86870. "adcs r5, r5, %[r]\n\t"
  86871. #elif defined(__clang__)
  86872. "adcs r5, %[r]\n\t"
  86873. #else
  86874. "adc r5, %[r]\n\t"
  86875. #endif
  86876. "# A[] * B - Done\n\t"
  86877. "mov %[r], r8\n\t"
  86878. "str r3, [%[r]]\n\t"
  86879. "movs r3, r4\n\t"
  86880. "movs r4, r5\n\t"
  86881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86882. "adds %[r], %[r], #4\n\t"
  86883. #else
  86884. "add %[r], %[r], #4\n\t"
  86885. #endif
  86886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86887. "adds %[a], %[a], #4\n\t"
  86888. #else
  86889. "add %[a], %[a], #4\n\t"
  86890. #endif
  86891. "mov r8, %[r]\n\t"
  86892. "cmp %[a], r9\n\t"
  86893. "blt L_sp_4096_mul_d_128_%=\n\t"
  86894. "str r3, [%[r]]\n\t"
  86895. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  86896. :
  86897. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  86898. );
  86899. }
  86900. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  86901. /* r = 2^n mod m where n is the number of bits to reduce by.
  86902. * Given m must be 4096 bits, just need to subtract.
  86903. *
  86904. * r A single precision number.
  86905. * m A single precision number.
  86906. */
  86907. static void sp_4096_mont_norm_128(sp_digit* r, const sp_digit* m)
  86908. {
  86909. XMEMSET(r, 0, sizeof(sp_digit) * 128);
  86910. /* r = 2^n mod m */
  86911. sp_4096_sub_in_place_128(r, m);
  86912. }
  86913. #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */
  86914. /* Conditionally subtract b from a using the mask m.
  86915. * m is -1 to subtract and 0 when not copying.
  86916. *
  86917. * r A single precision number representing condition subtract result.
  86918. * a A single precision number to subtract from.
  86919. * b A single precision number to subtract.
  86920. * m Mask value to apply.
  86921. */
  86922. SP_NOINLINE static sp_digit sp_4096_cond_sub_128(sp_digit* r, const sp_digit* a,
  86923. const sp_digit* b, sp_digit m)
  86924. {
  86925. __asm__ __volatile__ (
  86926. "movs r4, #0\n\t"
  86927. "movs r5, #2\n\t"
  86928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86929. "lsls r5, r5, #8\n\t"
  86930. #else
  86931. "lsl r5, r5, #8\n\t"
  86932. #endif
  86933. "mov r8, r5\n\t"
  86934. "movs r7, #0\n\t"
  86935. "\n"
  86936. "L_sp_4096_cond_sub_128_words_%=:\n\t"
  86937. "ldr r6, [%[b], r7]\n\t"
  86938. #ifdef WOLFSSL_KEIL
  86939. "ands r6, r6, %[m]\n\t"
  86940. #elif defined(__clang__)
  86941. "ands r6, %[m]\n\t"
  86942. #else
  86943. "and r6, %[m]\n\t"
  86944. #endif
  86945. "movs r5, #0\n\t"
  86946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86947. "subs r5, r5, r4\n\t"
  86948. #else
  86949. "sub r5, r5, r4\n\t"
  86950. #endif
  86951. "ldr r5, [%[a], r7]\n\t"
  86952. #ifdef WOLFSSL_KEIL
  86953. "sbcs r5, r5, r6\n\t"
  86954. #elif defined(__clang__)
  86955. "sbcs r5, r6\n\t"
  86956. #else
  86957. "sbc r5, r6\n\t"
  86958. #endif
  86959. #ifdef WOLFSSL_KEIL
  86960. "sbcs r4, r4, r4\n\t"
  86961. #elif defined(__clang__)
  86962. "sbcs r4, r4\n\t"
  86963. #else
  86964. "sbc r4, r4\n\t"
  86965. #endif
  86966. "str r5, [%[r], r7]\n\t"
  86967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86968. "adds r7, r7, #4\n\t"
  86969. #else
  86970. "add r7, r7, #4\n\t"
  86971. #endif
  86972. "cmp r7, r8\n\t"
  86973. "blt L_sp_4096_cond_sub_128_words_%=\n\t"
  86974. "movs %[r], r4\n\t"
  86975. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  86976. :
  86977. : "memory", "r4", "r5", "r6", "r7", "r8"
  86978. );
  86979. return (uint32_t)(size_t)r;
  86980. }
  86981. /* Reduce the number back to 4096 bits using Montgomery reduction.
  86982. *
  86983. * a A single precision number to reduce in place.
  86984. * m The single precision number representing the modulus.
  86985. * mp The digit representing the negative inverse of m mod 2^n.
  86986. */
  86987. SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a, const sp_digit* m,
  86988. sp_digit mp)
  86989. {
  86990. __asm__ __volatile__ (
  86991. "movs r7, #0\n\t"
  86992. "mov r8, %[mp]\n\t"
  86993. "mov r12, r7\n\t"
  86994. "mov lr, %[m]\n\t"
  86995. "mov r9, %[a]\n\t"
  86996. "mov r11, %[a]\n\t"
  86997. "movs r5, #0xff\n\t"
  86998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  86999. "adds r5, r5, #0xfd\n\t"
  87000. #else
  87001. "add r5, r5, #0xfd\n\t"
  87002. #endif
  87003. "movs r6, #2\n\t"
  87004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87005. "lsls r6, r6, #8\n\t"
  87006. #else
  87007. "lsl r6, r6, #8\n\t"
  87008. #endif
  87009. "add r9, r9, r5\n\t"
  87010. "add r11, r11, r6\n\t"
  87011. "\n"
  87012. "L_sp_4096_mont_reduce_128_mod_%=:\n\t"
  87013. "movs r7, #0\n\t"
  87014. "movs r4, #0\n\t"
  87015. "# a[i] += m[0] * mu\n\t"
  87016. "ldm %[m]!, {%[mp]}\n\t"
  87017. "ldm %[a]!, {r3}\n\t"
  87018. "# mu = a[i] * mp\n\t"
  87019. "mov r5, r8\n\t"
  87020. #ifdef WOLFSSL_KEIL
  87021. "muls r5, r3, r5\n\t"
  87022. #elif defined(__clang__)
  87023. "muls r5, r3\n\t"
  87024. #else
  87025. "mul r5, r3\n\t"
  87026. #endif
  87027. "mov r10, r5\n\t"
  87028. "# Multiply m[0] and mu - Start\n\t"
  87029. "mov r5, r10\n\t"
  87030. "uxth r6, %[mp]\n\t"
  87031. "uxth r5, r5\n\t"
  87032. #ifdef WOLFSSL_KEIL
  87033. "muls r6, r5, r6\n\t"
  87034. #elif defined(__clang__)
  87035. "muls r6, r5\n\t"
  87036. #else
  87037. "mul r6, r5\n\t"
  87038. #endif
  87039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87040. "adds r3, r3, r6\n\t"
  87041. #else
  87042. "add r3, r3, r6\n\t"
  87043. #endif
  87044. #ifdef WOLFSSL_KEIL
  87045. "adcs r4, r4, r7\n\t"
  87046. #elif defined(__clang__)
  87047. "adcs r4, r7\n\t"
  87048. #else
  87049. "adc r4, r7\n\t"
  87050. #endif
  87051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87052. "lsrs r6, %[mp], #16\n\t"
  87053. #else
  87054. "lsr r6, %[mp], #16\n\t"
  87055. #endif
  87056. #ifdef WOLFSSL_KEIL
  87057. "muls r5, r6, r5\n\t"
  87058. #elif defined(__clang__)
  87059. "muls r5, r6\n\t"
  87060. #else
  87061. "mul r5, r6\n\t"
  87062. #endif
  87063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87064. "lsrs r6, r5, #16\n\t"
  87065. #else
  87066. "lsr r6, r5, #16\n\t"
  87067. #endif
  87068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87069. "lsls r5, r5, #16\n\t"
  87070. #else
  87071. "lsl r5, r5, #16\n\t"
  87072. #endif
  87073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87074. "adds r3, r3, r5\n\t"
  87075. #else
  87076. "add r3, r3, r5\n\t"
  87077. #endif
  87078. #ifdef WOLFSSL_KEIL
  87079. "adcs r4, r4, r6\n\t"
  87080. #elif defined(__clang__)
  87081. "adcs r4, r6\n\t"
  87082. #else
  87083. "adc r4, r6\n\t"
  87084. #endif
  87085. "mov r5, r10\n\t"
  87086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87087. "lsrs r6, %[mp], #16\n\t"
  87088. #else
  87089. "lsr r6, %[mp], #16\n\t"
  87090. #endif
  87091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87092. "lsrs r5, r5, #16\n\t"
  87093. #else
  87094. "lsr r5, r5, #16\n\t"
  87095. #endif
  87096. #ifdef WOLFSSL_KEIL
  87097. "muls r6, r5, r6\n\t"
  87098. #elif defined(__clang__)
  87099. "muls r6, r5\n\t"
  87100. #else
  87101. "mul r6, r5\n\t"
  87102. #endif
  87103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87104. "adds r4, r4, r6\n\t"
  87105. #else
  87106. "add r4, r4, r6\n\t"
  87107. #endif
  87108. "uxth r6, %[mp]\n\t"
  87109. #ifdef WOLFSSL_KEIL
  87110. "muls r5, r6, r5\n\t"
  87111. #elif defined(__clang__)
  87112. "muls r5, r6\n\t"
  87113. #else
  87114. "mul r5, r6\n\t"
  87115. #endif
  87116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87117. "lsrs r6, r5, #16\n\t"
  87118. #else
  87119. "lsr r6, r5, #16\n\t"
  87120. #endif
  87121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87122. "lsls r5, r5, #16\n\t"
  87123. #else
  87124. "lsl r5, r5, #16\n\t"
  87125. #endif
  87126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87127. "adds r3, r3, r5\n\t"
  87128. #else
  87129. "add r3, r3, r5\n\t"
  87130. #endif
  87131. #ifdef WOLFSSL_KEIL
  87132. "adcs r4, r4, r6\n\t"
  87133. #elif defined(__clang__)
  87134. "adcs r4, r6\n\t"
  87135. #else
  87136. "adc r4, r6\n\t"
  87137. #endif
  87138. "# Multiply m[0] and mu - Done\n\t"
  87139. "\n"
  87140. "L_sp_4096_mont_reduce_128_word_%=:\n\t"
  87141. "# a[i+j] += m[j] * mu\n\t"
  87142. "ldr r3, [%[a]]\n\t"
  87143. "ldm %[m]!, {%[mp]}\n\t"
  87144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87145. "adds r3, r3, r4\n\t"
  87146. #else
  87147. "add r3, r3, r4\n\t"
  87148. #endif
  87149. "movs r4, #0\n\t"
  87150. #ifdef WOLFSSL_KEIL
  87151. "adcs r4, r4, r7\n\t"
  87152. #elif defined(__clang__)
  87153. "adcs r4, r7\n\t"
  87154. #else
  87155. "adc r4, r7\n\t"
  87156. #endif
  87157. "# Multiply m[j] and mu - Start\n\t"
  87158. "mov r5, r10\n\t"
  87159. "uxth r6, %[mp]\n\t"
  87160. "uxth r5, r5\n\t"
  87161. #ifdef WOLFSSL_KEIL
  87162. "muls r6, r5, r6\n\t"
  87163. #elif defined(__clang__)
  87164. "muls r6, r5\n\t"
  87165. #else
  87166. "mul r6, r5\n\t"
  87167. #endif
  87168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87169. "adds r3, r3, r6\n\t"
  87170. #else
  87171. "add r3, r3, r6\n\t"
  87172. #endif
  87173. #ifdef WOLFSSL_KEIL
  87174. "adcs r4, r4, r7\n\t"
  87175. #elif defined(__clang__)
  87176. "adcs r4, r7\n\t"
  87177. #else
  87178. "adc r4, r7\n\t"
  87179. #endif
  87180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87181. "lsrs r6, %[mp], #16\n\t"
  87182. #else
  87183. "lsr r6, %[mp], #16\n\t"
  87184. #endif
  87185. #ifdef WOLFSSL_KEIL
  87186. "muls r5, r6, r5\n\t"
  87187. #elif defined(__clang__)
  87188. "muls r5, r6\n\t"
  87189. #else
  87190. "mul r5, r6\n\t"
  87191. #endif
  87192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87193. "lsrs r6, r5, #16\n\t"
  87194. #else
  87195. "lsr r6, r5, #16\n\t"
  87196. #endif
  87197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87198. "lsls r5, r5, #16\n\t"
  87199. #else
  87200. "lsl r5, r5, #16\n\t"
  87201. #endif
  87202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87203. "adds r3, r3, r5\n\t"
  87204. #else
  87205. "add r3, r3, r5\n\t"
  87206. #endif
  87207. #ifdef WOLFSSL_KEIL
  87208. "adcs r4, r4, r6\n\t"
  87209. #elif defined(__clang__)
  87210. "adcs r4, r6\n\t"
  87211. #else
  87212. "adc r4, r6\n\t"
  87213. #endif
  87214. "mov r5, r10\n\t"
  87215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87216. "lsrs r6, %[mp], #16\n\t"
  87217. #else
  87218. "lsr r6, %[mp], #16\n\t"
  87219. #endif
  87220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87221. "lsrs r5, r5, #16\n\t"
  87222. #else
  87223. "lsr r5, r5, #16\n\t"
  87224. #endif
  87225. #ifdef WOLFSSL_KEIL
  87226. "muls r6, r5, r6\n\t"
  87227. #elif defined(__clang__)
  87228. "muls r6, r5\n\t"
  87229. #else
  87230. "mul r6, r5\n\t"
  87231. #endif
  87232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87233. "adds r4, r4, r6\n\t"
  87234. #else
  87235. "add r4, r4, r6\n\t"
  87236. #endif
  87237. "uxth r6, %[mp]\n\t"
  87238. #ifdef WOLFSSL_KEIL
  87239. "muls r5, r6, r5\n\t"
  87240. #elif defined(__clang__)
  87241. "muls r5, r6\n\t"
  87242. #else
  87243. "mul r5, r6\n\t"
  87244. #endif
  87245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87246. "lsrs r6, r5, #16\n\t"
  87247. #else
  87248. "lsr r6, r5, #16\n\t"
  87249. #endif
  87250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87251. "lsls r5, r5, #16\n\t"
  87252. #else
  87253. "lsl r5, r5, #16\n\t"
  87254. #endif
  87255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87256. "adds r3, r3, r5\n\t"
  87257. #else
  87258. "add r3, r3, r5\n\t"
  87259. #endif
  87260. #ifdef WOLFSSL_KEIL
  87261. "adcs r4, r4, r6\n\t"
  87262. #elif defined(__clang__)
  87263. "adcs r4, r6\n\t"
  87264. #else
  87265. "adc r4, r6\n\t"
  87266. #endif
  87267. "# Multiply m[j] and mu - Done\n\t"
  87268. "stm %[a]!, {r3}\n\t"
  87269. "cmp %[a], r9\n\t"
  87270. "blt L_sp_4096_mont_reduce_128_word_%=\n\t"
  87271. "# a[i+127] += m[127] * mu\n\t"
  87272. "ldr %[mp], [%[m]]\n\t"
  87273. "mov r3, r12\n\t"
  87274. "# Multiply m[127] and mu - Start\n\t"
  87275. "mov r5, r10\n\t"
  87276. "uxth r6, %[mp]\n\t"
  87277. "uxth r5, r5\n\t"
  87278. #ifdef WOLFSSL_KEIL
  87279. "muls r6, r5, r6\n\t"
  87280. #elif defined(__clang__)
  87281. "muls r6, r5\n\t"
  87282. #else
  87283. "mul r6, r5\n\t"
  87284. #endif
  87285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87286. "adds r4, r4, r6\n\t"
  87287. #else
  87288. "add r4, r4, r6\n\t"
  87289. #endif
  87290. #ifdef WOLFSSL_KEIL
  87291. "adcs r3, r3, r7\n\t"
  87292. #elif defined(__clang__)
  87293. "adcs r3, r7\n\t"
  87294. #else
  87295. "adc r3, r7\n\t"
  87296. #endif
  87297. #ifdef WOLFSSL_KEIL
  87298. "adcs r7, r7, r7\n\t"
  87299. #elif defined(__clang__)
  87300. "adcs r7, r7\n\t"
  87301. #else
  87302. "adc r7, r7\n\t"
  87303. #endif
  87304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87305. "lsrs r6, %[mp], #16\n\t"
  87306. #else
  87307. "lsr r6, %[mp], #16\n\t"
  87308. #endif
  87309. #ifdef WOLFSSL_KEIL
  87310. "muls r5, r6, r5\n\t"
  87311. #elif defined(__clang__)
  87312. "muls r5, r6\n\t"
  87313. #else
  87314. "mul r5, r6\n\t"
  87315. #endif
  87316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87317. "lsrs r6, r5, #16\n\t"
  87318. #else
  87319. "lsr r6, r5, #16\n\t"
  87320. #endif
  87321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87322. "lsls r5, r5, #16\n\t"
  87323. #else
  87324. "lsl r5, r5, #16\n\t"
  87325. #endif
  87326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87327. "adds r4, r4, r5\n\t"
  87328. #else
  87329. "add r4, r4, r5\n\t"
  87330. #endif
  87331. #ifdef WOLFSSL_KEIL
  87332. "adcs r3, r3, r6\n\t"
  87333. #elif defined(__clang__)
  87334. "adcs r3, r6\n\t"
  87335. #else
  87336. "adc r3, r6\n\t"
  87337. #endif
  87338. #ifdef WOLFSSL_KEIL
  87339. "adcs r7, r7, r7\n\t"
  87340. #elif defined(__clang__)
  87341. "adcs r7, r7\n\t"
  87342. #else
  87343. "adc r7, r7\n\t"
  87344. #endif
  87345. "mov r5, r10\n\t"
  87346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87347. "lsrs r6, %[mp], #16\n\t"
  87348. #else
  87349. "lsr r6, %[mp], #16\n\t"
  87350. #endif
  87351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87352. "lsrs r5, r5, #16\n\t"
  87353. #else
  87354. "lsr r5, r5, #16\n\t"
  87355. #endif
  87356. #ifdef WOLFSSL_KEIL
  87357. "muls r6, r5, r6\n\t"
  87358. #elif defined(__clang__)
  87359. "muls r6, r5\n\t"
  87360. #else
  87361. "mul r6, r5\n\t"
  87362. #endif
  87363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87364. "adds r3, r3, r6\n\t"
  87365. #else
  87366. "add r3, r3, r6\n\t"
  87367. #endif
  87368. #ifdef WOLFSSL_KEIL
  87369. "adcs r7, r7, r7\n\t"
  87370. #elif defined(__clang__)
  87371. "adcs r7, r7\n\t"
  87372. #else
  87373. "adc r7, r7\n\t"
  87374. #endif
  87375. "uxth r6, %[mp]\n\t"
  87376. #ifdef WOLFSSL_KEIL
  87377. "muls r5, r6, r5\n\t"
  87378. #elif defined(__clang__)
  87379. "muls r5, r6\n\t"
  87380. #else
  87381. "mul r5, r6\n\t"
  87382. #endif
  87383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87384. "lsrs r6, r5, #16\n\t"
  87385. #else
  87386. "lsr r6, r5, #16\n\t"
  87387. #endif
  87388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87389. "lsls r5, r5, #16\n\t"
  87390. #else
  87391. "lsl r5, r5, #16\n\t"
  87392. #endif
  87393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87394. "adds r4, r4, r5\n\t"
  87395. #else
  87396. "add r4, r4, r5\n\t"
  87397. #endif
  87398. #ifdef WOLFSSL_KEIL
  87399. "adcs r3, r3, r6\n\t"
  87400. #elif defined(__clang__)
  87401. "adcs r3, r6\n\t"
  87402. #else
  87403. "adc r3, r6\n\t"
  87404. #endif
  87405. #ifdef WOLFSSL_KEIL
  87406. "adcs r7, r7, r7\n\t"
  87407. #elif defined(__clang__)
  87408. "adcs r7, r7\n\t"
  87409. #else
  87410. "adc r7, r7\n\t"
  87411. #endif
  87412. "# Multiply m[127] and mu - Done\n\t"
  87413. "ldr r5, [%[a]]\n\t"
  87414. "ldr r6, [%[a], #4]\n\t"
  87415. "movs %[mp], #0\n\t"
  87416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87417. "adds r5, r5, r4\n\t"
  87418. #else
  87419. "add r5, r5, r4\n\t"
  87420. #endif
  87421. #ifdef WOLFSSL_KEIL
  87422. "adcs r6, r6, r3\n\t"
  87423. #elif defined(__clang__)
  87424. "adcs r6, r3\n\t"
  87425. #else
  87426. "adc r6, r3\n\t"
  87427. #endif
  87428. #ifdef WOLFSSL_KEIL
  87429. "adcs r7, r7, %[mp]\n\t"
  87430. #elif defined(__clang__)
  87431. "adcs r7, %[mp]\n\t"
  87432. #else
  87433. "adc r7, %[mp]\n\t"
  87434. #endif
  87435. "stm %[a]!, {r5, r6}\n\t"
  87436. "# i += 1\n\t"
  87437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87438. "subs %[a], %[a], #4\n\t"
  87439. #else
  87440. "sub %[a], %[a], #4\n\t"
  87441. #endif
  87442. "movs r3, #0xff\n\t"
  87443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87444. "adds r3, r3, #0xfd\n\t"
  87445. #else
  87446. "add r3, r3, #0xfd\n\t"
  87447. #endif
  87448. "mov r9, %[a]\n\t"
  87449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87450. "subs %[a], %[a], r3\n\t"
  87451. #else
  87452. "sub %[a], %[a], r3\n\t"
  87453. #endif
  87454. "mov r12, r7\n\t"
  87455. "mov %[m], lr\n\t"
  87456. "cmp r11, %[a]\n\t"
  87457. "bgt L_sp_4096_mont_reduce_128_mod_%=\n\t"
  87458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87459. "negs r7, r7\n\t"
  87460. #else
  87461. "neg r7, r7\n\t"
  87462. #endif
  87463. "# Subtract masked modulus\n\t"
  87464. "movs r4, #2\n\t"
  87465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87466. "lsls r4, r4, #8\n\t"
  87467. #else
  87468. "lsl r4, r4, #8\n\t"
  87469. #endif
  87470. "movs %[mp], #0\n\t"
  87471. "movs r3, #0\n\t"
  87472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87473. "subs %[a], %[a], r4\n\t"
  87474. #else
  87475. "sub %[a], %[a], r4\n\t"
  87476. #endif
  87477. #ifndef WOLFSSL_SP_LARGE_CODE
  87478. "\n"
  87479. "L_sp_4096_mont_reduce_128_sub_mask_%=:\n\t"
  87480. "ldm %[m]!, {r6}\n\t"
  87481. "movs r5, #0\n\t"
  87482. #ifdef WOLFSSL_KEIL
  87483. "ands r6, r6, r7\n\t"
  87484. #elif defined(__clang__)
  87485. "ands r6, r7\n\t"
  87486. #else
  87487. "and r6, r7\n\t"
  87488. #endif
  87489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87490. "subs r5, r5, %[mp]\n\t"
  87491. #else
  87492. "sub r5, r5, %[mp]\n\t"
  87493. #endif
  87494. "ldr r5, [%[a], r4]\n\t"
  87495. #ifdef WOLFSSL_KEIL
  87496. "sbcs r5, r5, r6\n\t"
  87497. #elif defined(__clang__)
  87498. "sbcs r5, r6\n\t"
  87499. #else
  87500. "sbc r5, r6\n\t"
  87501. #endif
  87502. #ifdef WOLFSSL_KEIL
  87503. "sbcs %[mp], %[mp], %[mp]\n\t"
  87504. #elif defined(__clang__)
  87505. "sbcs %[mp], %[mp]\n\t"
  87506. #else
  87507. "sbc %[mp], %[mp]\n\t"
  87508. #endif
  87509. "stm %[a]!, {r5}\n\t"
  87510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87511. "adds r3, r3, #4\n\t"
  87512. #else
  87513. "add r3, r3, #4\n\t"
  87514. #endif
  87515. "cmp r3, r4\n\t"
  87516. "blt L_sp_4096_mont_reduce_128_sub_mask_%=\n\t"
  87517. #else /* WOLFSSL_SP_LARGE_CODE */
  87518. "ldm %[m]!, {r6}\n\t"
  87519. #ifdef WOLFSSL_KEIL
  87520. "ands r6, r6, r7\n\t"
  87521. #elif defined(__clang__)
  87522. "ands r6, r7\n\t"
  87523. #else
  87524. "and r6, r7\n\t"
  87525. #endif
  87526. "ldr r5, [%[a], r4]\n\t"
  87527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  87528. "subs r5, r5, r6\n\t"
  87529. #else
  87530. "sub r5, r5, r6\n\t"
  87531. #endif
  87532. "stm %[a]!, {r5}\n\t"
  87533. "ldm %[m]!, {r6}\n\t"
  87534. #ifdef WOLFSSL_KEIL
  87535. "ands r6, r6, r7\n\t"
  87536. #elif defined(__clang__)
  87537. "ands r6, r7\n\t"
  87538. #else
  87539. "and r6, r7\n\t"
  87540. #endif
  87541. "ldr r5, [%[a], r4]\n\t"
  87542. #ifdef WOLFSSL_KEIL
  87543. "sbcs r5, r5, r6\n\t"
  87544. #elif defined(__clang__)
  87545. "sbcs r5, r6\n\t"
  87546. #else
  87547. "sbc r5, r6\n\t"
  87548. #endif
  87549. "stm %[a]!, {r5}\n\t"
  87550. "ldm %[m]!, {r6}\n\t"
  87551. #ifdef WOLFSSL_KEIL
  87552. "ands r6, r6, r7\n\t"
  87553. #elif defined(__clang__)
  87554. "ands r6, r7\n\t"
  87555. #else
  87556. "and r6, r7\n\t"
  87557. #endif
  87558. "ldr r5, [%[a], r4]\n\t"
  87559. #ifdef WOLFSSL_KEIL
  87560. "sbcs r5, r5, r6\n\t"
  87561. #elif defined(__clang__)
  87562. "sbcs r5, r6\n\t"
  87563. #else
  87564. "sbc r5, r6\n\t"
  87565. #endif
  87566. "stm %[a]!, {r5}\n\t"
  87567. "ldm %[m]!, {r6}\n\t"
  87568. #ifdef WOLFSSL_KEIL
  87569. "ands r6, r6, r7\n\t"
  87570. #elif defined(__clang__)
  87571. "ands r6, r7\n\t"
  87572. #else
  87573. "and r6, r7\n\t"
  87574. #endif
  87575. "ldr r5, [%[a], r4]\n\t"
  87576. #ifdef WOLFSSL_KEIL
  87577. "sbcs r5, r5, r6\n\t"
  87578. #elif defined(__clang__)
  87579. "sbcs r5, r6\n\t"
  87580. #else
  87581. "sbc r5, r6\n\t"
  87582. #endif
  87583. "stm %[a]!, {r5}\n\t"
  87584. "ldm %[m]!, {r6}\n\t"
  87585. #ifdef WOLFSSL_KEIL
  87586. "ands r6, r6, r7\n\t"
  87587. #elif defined(__clang__)
  87588. "ands r6, r7\n\t"
  87589. #else
  87590. "and r6, r7\n\t"
  87591. #endif
  87592. "ldr r5, [%[a], r4]\n\t"
  87593. #ifdef WOLFSSL_KEIL
  87594. "sbcs r5, r5, r6\n\t"
  87595. #elif defined(__clang__)
  87596. "sbcs r5, r6\n\t"
  87597. #else
  87598. "sbc r5, r6\n\t"
  87599. #endif
  87600. "stm %[a]!, {r5}\n\t"
  87601. "ldm %[m]!, {r6}\n\t"
  87602. #ifdef WOLFSSL_KEIL
  87603. "ands r6, r6, r7\n\t"
  87604. #elif defined(__clang__)
  87605. "ands r6, r7\n\t"
  87606. #else
  87607. "and r6, r7\n\t"
  87608. #endif
  87609. "ldr r5, [%[a], r4]\n\t"
  87610. #ifdef WOLFSSL_KEIL
  87611. "sbcs r5, r5, r6\n\t"
  87612. #elif defined(__clang__)
  87613. "sbcs r5, r6\n\t"
  87614. #else
  87615. "sbc r5, r6\n\t"
  87616. #endif
  87617. "stm %[a]!, {r5}\n\t"
  87618. "ldm %[m]!, {r6}\n\t"
  87619. #ifdef WOLFSSL_KEIL
  87620. "ands r6, r6, r7\n\t"
  87621. #elif defined(__clang__)
  87622. "ands r6, r7\n\t"
  87623. #else
  87624. "and r6, r7\n\t"
  87625. #endif
  87626. "ldr r5, [%[a], r4]\n\t"
  87627. #ifdef WOLFSSL_KEIL
  87628. "sbcs r5, r5, r6\n\t"
  87629. #elif defined(__clang__)
  87630. "sbcs r5, r6\n\t"
  87631. #else
  87632. "sbc r5, r6\n\t"
  87633. #endif
  87634. "stm %[a]!, {r5}\n\t"
  87635. "ldm %[m]!, {r6}\n\t"
  87636. #ifdef WOLFSSL_KEIL
  87637. "ands r6, r6, r7\n\t"
  87638. #elif defined(__clang__)
  87639. "ands r6, r7\n\t"
  87640. #else
  87641. "and r6, r7\n\t"
  87642. #endif
  87643. "ldr r5, [%[a], r4]\n\t"
  87644. #ifdef WOLFSSL_KEIL
  87645. "sbcs r5, r5, r6\n\t"
  87646. #elif defined(__clang__)
  87647. "sbcs r5, r6\n\t"
  87648. #else
  87649. "sbc r5, r6\n\t"
  87650. #endif
  87651. "stm %[a]!, {r5}\n\t"
  87652. "ldm %[m]!, {r6}\n\t"
  87653. #ifdef WOLFSSL_KEIL
  87654. "ands r6, r6, r7\n\t"
  87655. #elif defined(__clang__)
  87656. "ands r6, r7\n\t"
  87657. #else
  87658. "and r6, r7\n\t"
  87659. #endif
  87660. "ldr r5, [%[a], r4]\n\t"
  87661. #ifdef WOLFSSL_KEIL
  87662. "sbcs r5, r5, r6\n\t"
  87663. #elif defined(__clang__)
  87664. "sbcs r5, r6\n\t"
  87665. #else
  87666. "sbc r5, r6\n\t"
  87667. #endif
  87668. "stm %[a]!, {r5}\n\t"
  87669. "ldm %[m]!, {r6}\n\t"
  87670. #ifdef WOLFSSL_KEIL
  87671. "ands r6, r6, r7\n\t"
  87672. #elif defined(__clang__)
  87673. "ands r6, r7\n\t"
  87674. #else
  87675. "and r6, r7\n\t"
  87676. #endif
  87677. "ldr r5, [%[a], r4]\n\t"
  87678. #ifdef WOLFSSL_KEIL
  87679. "sbcs r5, r5, r6\n\t"
  87680. #elif defined(__clang__)
  87681. "sbcs r5, r6\n\t"
  87682. #else
  87683. "sbc r5, r6\n\t"
  87684. #endif
  87685. "stm %[a]!, {r5}\n\t"
  87686. "ldm %[m]!, {r6}\n\t"
  87687. #ifdef WOLFSSL_KEIL
  87688. "ands r6, r6, r7\n\t"
  87689. #elif defined(__clang__)
  87690. "ands r6, r7\n\t"
  87691. #else
  87692. "and r6, r7\n\t"
  87693. #endif
  87694. "ldr r5, [%[a], r4]\n\t"
  87695. #ifdef WOLFSSL_KEIL
  87696. "sbcs r5, r5, r6\n\t"
  87697. #elif defined(__clang__)
  87698. "sbcs r5, r6\n\t"
  87699. #else
  87700. "sbc r5, r6\n\t"
  87701. #endif
  87702. "stm %[a]!, {r5}\n\t"
  87703. "ldm %[m]!, {r6}\n\t"
  87704. #ifdef WOLFSSL_KEIL
  87705. "ands r6, r6, r7\n\t"
  87706. #elif defined(__clang__)
  87707. "ands r6, r7\n\t"
  87708. #else
  87709. "and r6, r7\n\t"
  87710. #endif
  87711. "ldr r5, [%[a], r4]\n\t"
  87712. #ifdef WOLFSSL_KEIL
  87713. "sbcs r5, r5, r6\n\t"
  87714. #elif defined(__clang__)
  87715. "sbcs r5, r6\n\t"
  87716. #else
  87717. "sbc r5, r6\n\t"
  87718. #endif
  87719. "stm %[a]!, {r5}\n\t"
  87720. "ldm %[m]!, {r6}\n\t"
  87721. #ifdef WOLFSSL_KEIL
  87722. "ands r6, r6, r7\n\t"
  87723. #elif defined(__clang__)
  87724. "ands r6, r7\n\t"
  87725. #else
  87726. "and r6, r7\n\t"
  87727. #endif
  87728. "ldr r5, [%[a], r4]\n\t"
  87729. #ifdef WOLFSSL_KEIL
  87730. "sbcs r5, r5, r6\n\t"
  87731. #elif defined(__clang__)
  87732. "sbcs r5, r6\n\t"
  87733. #else
  87734. "sbc r5, r6\n\t"
  87735. #endif
  87736. "stm %[a]!, {r5}\n\t"
  87737. "ldm %[m]!, {r6}\n\t"
  87738. #ifdef WOLFSSL_KEIL
  87739. "ands r6, r6, r7\n\t"
  87740. #elif defined(__clang__)
  87741. "ands r6, r7\n\t"
  87742. #else
  87743. "and r6, r7\n\t"
  87744. #endif
  87745. "ldr r5, [%[a], r4]\n\t"
  87746. #ifdef WOLFSSL_KEIL
  87747. "sbcs r5, r5, r6\n\t"
  87748. #elif defined(__clang__)
  87749. "sbcs r5, r6\n\t"
  87750. #else
  87751. "sbc r5, r6\n\t"
  87752. #endif
  87753. "stm %[a]!, {r5}\n\t"
  87754. "ldm %[m]!, {r6}\n\t"
  87755. #ifdef WOLFSSL_KEIL
  87756. "ands r6, r6, r7\n\t"
  87757. #elif defined(__clang__)
  87758. "ands r6, r7\n\t"
  87759. #else
  87760. "and r6, r7\n\t"
  87761. #endif
  87762. "ldr r5, [%[a], r4]\n\t"
  87763. #ifdef WOLFSSL_KEIL
  87764. "sbcs r5, r5, r6\n\t"
  87765. #elif defined(__clang__)
  87766. "sbcs r5, r6\n\t"
  87767. #else
  87768. "sbc r5, r6\n\t"
  87769. #endif
  87770. "stm %[a]!, {r5}\n\t"
  87771. "ldm %[m]!, {r6}\n\t"
  87772. #ifdef WOLFSSL_KEIL
  87773. "ands r6, r6, r7\n\t"
  87774. #elif defined(__clang__)
  87775. "ands r6, r7\n\t"
  87776. #else
  87777. "and r6, r7\n\t"
  87778. #endif
  87779. "ldr r5, [%[a], r4]\n\t"
  87780. #ifdef WOLFSSL_KEIL
  87781. "sbcs r5, r5, r6\n\t"
  87782. #elif defined(__clang__)
  87783. "sbcs r5, r6\n\t"
  87784. #else
  87785. "sbc r5, r6\n\t"
  87786. #endif
  87787. "stm %[a]!, {r5}\n\t"
  87788. "ldm %[m]!, {r6}\n\t"
  87789. #ifdef WOLFSSL_KEIL
  87790. "ands r6, r6, r7\n\t"
  87791. #elif defined(__clang__)
  87792. "ands r6, r7\n\t"
  87793. #else
  87794. "and r6, r7\n\t"
  87795. #endif
  87796. "ldr r5, [%[a], r4]\n\t"
  87797. #ifdef WOLFSSL_KEIL
  87798. "sbcs r5, r5, r6\n\t"
  87799. #elif defined(__clang__)
  87800. "sbcs r5, r6\n\t"
  87801. #else
  87802. "sbc r5, r6\n\t"
  87803. #endif
  87804. "stm %[a]!, {r5}\n\t"
  87805. "ldm %[m]!, {r6}\n\t"
  87806. #ifdef WOLFSSL_KEIL
  87807. "ands r6, r6, r7\n\t"
  87808. #elif defined(__clang__)
  87809. "ands r6, r7\n\t"
  87810. #else
  87811. "and r6, r7\n\t"
  87812. #endif
  87813. "ldr r5, [%[a], r4]\n\t"
  87814. #ifdef WOLFSSL_KEIL
  87815. "sbcs r5, r5, r6\n\t"
  87816. #elif defined(__clang__)
  87817. "sbcs r5, r6\n\t"
  87818. #else
  87819. "sbc r5, r6\n\t"
  87820. #endif
  87821. "stm %[a]!, {r5}\n\t"
  87822. "ldm %[m]!, {r6}\n\t"
  87823. #ifdef WOLFSSL_KEIL
  87824. "ands r6, r6, r7\n\t"
  87825. #elif defined(__clang__)
  87826. "ands r6, r7\n\t"
  87827. #else
  87828. "and r6, r7\n\t"
  87829. #endif
  87830. "ldr r5, [%[a], r4]\n\t"
  87831. #ifdef WOLFSSL_KEIL
  87832. "sbcs r5, r5, r6\n\t"
  87833. #elif defined(__clang__)
  87834. "sbcs r5, r6\n\t"
  87835. #else
  87836. "sbc r5, r6\n\t"
  87837. #endif
  87838. "stm %[a]!, {r5}\n\t"
  87839. "ldm %[m]!, {r6}\n\t"
  87840. #ifdef WOLFSSL_KEIL
  87841. "ands r6, r6, r7\n\t"
  87842. #elif defined(__clang__)
  87843. "ands r6, r7\n\t"
  87844. #else
  87845. "and r6, r7\n\t"
  87846. #endif
  87847. "ldr r5, [%[a], r4]\n\t"
  87848. #ifdef WOLFSSL_KEIL
  87849. "sbcs r5, r5, r6\n\t"
  87850. #elif defined(__clang__)
  87851. "sbcs r5, r6\n\t"
  87852. #else
  87853. "sbc r5, r6\n\t"
  87854. #endif
  87855. "stm %[a]!, {r5}\n\t"
  87856. "ldm %[m]!, {r6}\n\t"
  87857. #ifdef WOLFSSL_KEIL
  87858. "ands r6, r6, r7\n\t"
  87859. #elif defined(__clang__)
  87860. "ands r6, r7\n\t"
  87861. #else
  87862. "and r6, r7\n\t"
  87863. #endif
  87864. "ldr r5, [%[a], r4]\n\t"
  87865. #ifdef WOLFSSL_KEIL
  87866. "sbcs r5, r5, r6\n\t"
  87867. #elif defined(__clang__)
  87868. "sbcs r5, r6\n\t"
  87869. #else
  87870. "sbc r5, r6\n\t"
  87871. #endif
  87872. "stm %[a]!, {r5}\n\t"
  87873. "ldm %[m]!, {r6}\n\t"
  87874. #ifdef WOLFSSL_KEIL
  87875. "ands r6, r6, r7\n\t"
  87876. #elif defined(__clang__)
  87877. "ands r6, r7\n\t"
  87878. #else
  87879. "and r6, r7\n\t"
  87880. #endif
  87881. "ldr r5, [%[a], r4]\n\t"
  87882. #ifdef WOLFSSL_KEIL
  87883. "sbcs r5, r5, r6\n\t"
  87884. #elif defined(__clang__)
  87885. "sbcs r5, r6\n\t"
  87886. #else
  87887. "sbc r5, r6\n\t"
  87888. #endif
  87889. "stm %[a]!, {r5}\n\t"
  87890. "ldm %[m]!, {r6}\n\t"
  87891. #ifdef WOLFSSL_KEIL
  87892. "ands r6, r6, r7\n\t"
  87893. #elif defined(__clang__)
  87894. "ands r6, r7\n\t"
  87895. #else
  87896. "and r6, r7\n\t"
  87897. #endif
  87898. "ldr r5, [%[a], r4]\n\t"
  87899. #ifdef WOLFSSL_KEIL
  87900. "sbcs r5, r5, r6\n\t"
  87901. #elif defined(__clang__)
  87902. "sbcs r5, r6\n\t"
  87903. #else
  87904. "sbc r5, r6\n\t"
  87905. #endif
  87906. "stm %[a]!, {r5}\n\t"
  87907. "ldm %[m]!, {r6}\n\t"
  87908. #ifdef WOLFSSL_KEIL
  87909. "ands r6, r6, r7\n\t"
  87910. #elif defined(__clang__)
  87911. "ands r6, r7\n\t"
  87912. #else
  87913. "and r6, r7\n\t"
  87914. #endif
  87915. "ldr r5, [%[a], r4]\n\t"
  87916. #ifdef WOLFSSL_KEIL
  87917. "sbcs r5, r5, r6\n\t"
  87918. #elif defined(__clang__)
  87919. "sbcs r5, r6\n\t"
  87920. #else
  87921. "sbc r5, r6\n\t"
  87922. #endif
  87923. "stm %[a]!, {r5}\n\t"
  87924. "ldm %[m]!, {r6}\n\t"
  87925. #ifdef WOLFSSL_KEIL
  87926. "ands r6, r6, r7\n\t"
  87927. #elif defined(__clang__)
  87928. "ands r6, r7\n\t"
  87929. #else
  87930. "and r6, r7\n\t"
  87931. #endif
  87932. "ldr r5, [%[a], r4]\n\t"
  87933. #ifdef WOLFSSL_KEIL
  87934. "sbcs r5, r5, r6\n\t"
  87935. #elif defined(__clang__)
  87936. "sbcs r5, r6\n\t"
  87937. #else
  87938. "sbc r5, r6\n\t"
  87939. #endif
  87940. "stm %[a]!, {r5}\n\t"
  87941. "ldm %[m]!, {r6}\n\t"
  87942. #ifdef WOLFSSL_KEIL
  87943. "ands r6, r6, r7\n\t"
  87944. #elif defined(__clang__)
  87945. "ands r6, r7\n\t"
  87946. #else
  87947. "and r6, r7\n\t"
  87948. #endif
  87949. "ldr r5, [%[a], r4]\n\t"
  87950. #ifdef WOLFSSL_KEIL
  87951. "sbcs r5, r5, r6\n\t"
  87952. #elif defined(__clang__)
  87953. "sbcs r5, r6\n\t"
  87954. #else
  87955. "sbc r5, r6\n\t"
  87956. #endif
  87957. "stm %[a]!, {r5}\n\t"
  87958. "ldm %[m]!, {r6}\n\t"
  87959. #ifdef WOLFSSL_KEIL
  87960. "ands r6, r6, r7\n\t"
  87961. #elif defined(__clang__)
  87962. "ands r6, r7\n\t"
  87963. #else
  87964. "and r6, r7\n\t"
  87965. #endif
  87966. "ldr r5, [%[a], r4]\n\t"
  87967. #ifdef WOLFSSL_KEIL
  87968. "sbcs r5, r5, r6\n\t"
  87969. #elif defined(__clang__)
  87970. "sbcs r5, r6\n\t"
  87971. #else
  87972. "sbc r5, r6\n\t"
  87973. #endif
  87974. "stm %[a]!, {r5}\n\t"
  87975. "ldm %[m]!, {r6}\n\t"
  87976. #ifdef WOLFSSL_KEIL
  87977. "ands r6, r6, r7\n\t"
  87978. #elif defined(__clang__)
  87979. "ands r6, r7\n\t"
  87980. #else
  87981. "and r6, r7\n\t"
  87982. #endif
  87983. "ldr r5, [%[a], r4]\n\t"
  87984. #ifdef WOLFSSL_KEIL
  87985. "sbcs r5, r5, r6\n\t"
  87986. #elif defined(__clang__)
  87987. "sbcs r5, r6\n\t"
  87988. #else
  87989. "sbc r5, r6\n\t"
  87990. #endif
  87991. "stm %[a]!, {r5}\n\t"
  87992. "ldm %[m]!, {r6}\n\t"
  87993. #ifdef WOLFSSL_KEIL
  87994. "ands r6, r6, r7\n\t"
  87995. #elif defined(__clang__)
  87996. "ands r6, r7\n\t"
  87997. #else
  87998. "and r6, r7\n\t"
  87999. #endif
  88000. "ldr r5, [%[a], r4]\n\t"
  88001. #ifdef WOLFSSL_KEIL
  88002. "sbcs r5, r5, r6\n\t"
  88003. #elif defined(__clang__)
  88004. "sbcs r5, r6\n\t"
  88005. #else
  88006. "sbc r5, r6\n\t"
  88007. #endif
  88008. "stm %[a]!, {r5}\n\t"
  88009. "ldm %[m]!, {r6}\n\t"
  88010. #ifdef WOLFSSL_KEIL
  88011. "ands r6, r6, r7\n\t"
  88012. #elif defined(__clang__)
  88013. "ands r6, r7\n\t"
  88014. #else
  88015. "and r6, r7\n\t"
  88016. #endif
  88017. "ldr r5, [%[a], r4]\n\t"
  88018. #ifdef WOLFSSL_KEIL
  88019. "sbcs r5, r5, r6\n\t"
  88020. #elif defined(__clang__)
  88021. "sbcs r5, r6\n\t"
  88022. #else
  88023. "sbc r5, r6\n\t"
  88024. #endif
  88025. "stm %[a]!, {r5}\n\t"
  88026. "ldm %[m]!, {r6}\n\t"
  88027. #ifdef WOLFSSL_KEIL
  88028. "ands r6, r6, r7\n\t"
  88029. #elif defined(__clang__)
  88030. "ands r6, r7\n\t"
  88031. #else
  88032. "and r6, r7\n\t"
  88033. #endif
  88034. "ldr r5, [%[a], r4]\n\t"
  88035. #ifdef WOLFSSL_KEIL
  88036. "sbcs r5, r5, r6\n\t"
  88037. #elif defined(__clang__)
  88038. "sbcs r5, r6\n\t"
  88039. #else
  88040. "sbc r5, r6\n\t"
  88041. #endif
  88042. "stm %[a]!, {r5}\n\t"
  88043. "ldm %[m]!, {r6}\n\t"
  88044. #ifdef WOLFSSL_KEIL
  88045. "ands r6, r6, r7\n\t"
  88046. #elif defined(__clang__)
  88047. "ands r6, r7\n\t"
  88048. #else
  88049. "and r6, r7\n\t"
  88050. #endif
  88051. "ldr r5, [%[a], r4]\n\t"
  88052. #ifdef WOLFSSL_KEIL
  88053. "sbcs r5, r5, r6\n\t"
  88054. #elif defined(__clang__)
  88055. "sbcs r5, r6\n\t"
  88056. #else
  88057. "sbc r5, r6\n\t"
  88058. #endif
  88059. "stm %[a]!, {r5}\n\t"
  88060. "ldm %[m]!, {r6}\n\t"
  88061. #ifdef WOLFSSL_KEIL
  88062. "ands r6, r6, r7\n\t"
  88063. #elif defined(__clang__)
  88064. "ands r6, r7\n\t"
  88065. #else
  88066. "and r6, r7\n\t"
  88067. #endif
  88068. "ldr r5, [%[a], r4]\n\t"
  88069. #ifdef WOLFSSL_KEIL
  88070. "sbcs r5, r5, r6\n\t"
  88071. #elif defined(__clang__)
  88072. "sbcs r5, r6\n\t"
  88073. #else
  88074. "sbc r5, r6\n\t"
  88075. #endif
  88076. "stm %[a]!, {r5}\n\t"
  88077. "ldm %[m]!, {r6}\n\t"
  88078. #ifdef WOLFSSL_KEIL
  88079. "ands r6, r6, r7\n\t"
  88080. #elif defined(__clang__)
  88081. "ands r6, r7\n\t"
  88082. #else
  88083. "and r6, r7\n\t"
  88084. #endif
  88085. "ldr r5, [%[a], r4]\n\t"
  88086. #ifdef WOLFSSL_KEIL
  88087. "sbcs r5, r5, r6\n\t"
  88088. #elif defined(__clang__)
  88089. "sbcs r5, r6\n\t"
  88090. #else
  88091. "sbc r5, r6\n\t"
  88092. #endif
  88093. "stm %[a]!, {r5}\n\t"
  88094. "ldm %[m]!, {r6}\n\t"
  88095. #ifdef WOLFSSL_KEIL
  88096. "ands r6, r6, r7\n\t"
  88097. #elif defined(__clang__)
  88098. "ands r6, r7\n\t"
  88099. #else
  88100. "and r6, r7\n\t"
  88101. #endif
  88102. "ldr r5, [%[a], r4]\n\t"
  88103. #ifdef WOLFSSL_KEIL
  88104. "sbcs r5, r5, r6\n\t"
  88105. #elif defined(__clang__)
  88106. "sbcs r5, r6\n\t"
  88107. #else
  88108. "sbc r5, r6\n\t"
  88109. #endif
  88110. "stm %[a]!, {r5}\n\t"
  88111. "ldm %[m]!, {r6}\n\t"
  88112. #ifdef WOLFSSL_KEIL
  88113. "ands r6, r6, r7\n\t"
  88114. #elif defined(__clang__)
  88115. "ands r6, r7\n\t"
  88116. #else
  88117. "and r6, r7\n\t"
  88118. #endif
  88119. "ldr r5, [%[a], r4]\n\t"
  88120. #ifdef WOLFSSL_KEIL
  88121. "sbcs r5, r5, r6\n\t"
  88122. #elif defined(__clang__)
  88123. "sbcs r5, r6\n\t"
  88124. #else
  88125. "sbc r5, r6\n\t"
  88126. #endif
  88127. "stm %[a]!, {r5}\n\t"
  88128. "ldm %[m]!, {r6}\n\t"
  88129. #ifdef WOLFSSL_KEIL
  88130. "ands r6, r6, r7\n\t"
  88131. #elif defined(__clang__)
  88132. "ands r6, r7\n\t"
  88133. #else
  88134. "and r6, r7\n\t"
  88135. #endif
  88136. "ldr r5, [%[a], r4]\n\t"
  88137. #ifdef WOLFSSL_KEIL
  88138. "sbcs r5, r5, r6\n\t"
  88139. #elif defined(__clang__)
  88140. "sbcs r5, r6\n\t"
  88141. #else
  88142. "sbc r5, r6\n\t"
  88143. #endif
  88144. "stm %[a]!, {r5}\n\t"
  88145. "ldm %[m]!, {r6}\n\t"
  88146. #ifdef WOLFSSL_KEIL
  88147. "ands r6, r6, r7\n\t"
  88148. #elif defined(__clang__)
  88149. "ands r6, r7\n\t"
  88150. #else
  88151. "and r6, r7\n\t"
  88152. #endif
  88153. "ldr r5, [%[a], r4]\n\t"
  88154. #ifdef WOLFSSL_KEIL
  88155. "sbcs r5, r5, r6\n\t"
  88156. #elif defined(__clang__)
  88157. "sbcs r5, r6\n\t"
  88158. #else
  88159. "sbc r5, r6\n\t"
  88160. #endif
  88161. "stm %[a]!, {r5}\n\t"
  88162. "ldm %[m]!, {r6}\n\t"
  88163. #ifdef WOLFSSL_KEIL
  88164. "ands r6, r6, r7\n\t"
  88165. #elif defined(__clang__)
  88166. "ands r6, r7\n\t"
  88167. #else
  88168. "and r6, r7\n\t"
  88169. #endif
  88170. "ldr r5, [%[a], r4]\n\t"
  88171. #ifdef WOLFSSL_KEIL
  88172. "sbcs r5, r5, r6\n\t"
  88173. #elif defined(__clang__)
  88174. "sbcs r5, r6\n\t"
  88175. #else
  88176. "sbc r5, r6\n\t"
  88177. #endif
  88178. "stm %[a]!, {r5}\n\t"
  88179. "ldm %[m]!, {r6}\n\t"
  88180. #ifdef WOLFSSL_KEIL
  88181. "ands r6, r6, r7\n\t"
  88182. #elif defined(__clang__)
  88183. "ands r6, r7\n\t"
  88184. #else
  88185. "and r6, r7\n\t"
  88186. #endif
  88187. "ldr r5, [%[a], r4]\n\t"
  88188. #ifdef WOLFSSL_KEIL
  88189. "sbcs r5, r5, r6\n\t"
  88190. #elif defined(__clang__)
  88191. "sbcs r5, r6\n\t"
  88192. #else
  88193. "sbc r5, r6\n\t"
  88194. #endif
  88195. "stm %[a]!, {r5}\n\t"
  88196. "ldm %[m]!, {r6}\n\t"
  88197. #ifdef WOLFSSL_KEIL
  88198. "ands r6, r6, r7\n\t"
  88199. #elif defined(__clang__)
  88200. "ands r6, r7\n\t"
  88201. #else
  88202. "and r6, r7\n\t"
  88203. #endif
  88204. "ldr r5, [%[a], r4]\n\t"
  88205. #ifdef WOLFSSL_KEIL
  88206. "sbcs r5, r5, r6\n\t"
  88207. #elif defined(__clang__)
  88208. "sbcs r5, r6\n\t"
  88209. #else
  88210. "sbc r5, r6\n\t"
  88211. #endif
  88212. "stm %[a]!, {r5}\n\t"
  88213. "ldm %[m]!, {r6}\n\t"
  88214. #ifdef WOLFSSL_KEIL
  88215. "ands r6, r6, r7\n\t"
  88216. #elif defined(__clang__)
  88217. "ands r6, r7\n\t"
  88218. #else
  88219. "and r6, r7\n\t"
  88220. #endif
  88221. "ldr r5, [%[a], r4]\n\t"
  88222. #ifdef WOLFSSL_KEIL
  88223. "sbcs r5, r5, r6\n\t"
  88224. #elif defined(__clang__)
  88225. "sbcs r5, r6\n\t"
  88226. #else
  88227. "sbc r5, r6\n\t"
  88228. #endif
  88229. "stm %[a]!, {r5}\n\t"
  88230. "ldm %[m]!, {r6}\n\t"
  88231. #ifdef WOLFSSL_KEIL
  88232. "ands r6, r6, r7\n\t"
  88233. #elif defined(__clang__)
  88234. "ands r6, r7\n\t"
  88235. #else
  88236. "and r6, r7\n\t"
  88237. #endif
  88238. "ldr r5, [%[a], r4]\n\t"
  88239. #ifdef WOLFSSL_KEIL
  88240. "sbcs r5, r5, r6\n\t"
  88241. #elif defined(__clang__)
  88242. "sbcs r5, r6\n\t"
  88243. #else
  88244. "sbc r5, r6\n\t"
  88245. #endif
  88246. "stm %[a]!, {r5}\n\t"
  88247. "ldm %[m]!, {r6}\n\t"
  88248. #ifdef WOLFSSL_KEIL
  88249. "ands r6, r6, r7\n\t"
  88250. #elif defined(__clang__)
  88251. "ands r6, r7\n\t"
  88252. #else
  88253. "and r6, r7\n\t"
  88254. #endif
  88255. "ldr r5, [%[a], r4]\n\t"
  88256. #ifdef WOLFSSL_KEIL
  88257. "sbcs r5, r5, r6\n\t"
  88258. #elif defined(__clang__)
  88259. "sbcs r5, r6\n\t"
  88260. #else
  88261. "sbc r5, r6\n\t"
  88262. #endif
  88263. "stm %[a]!, {r5}\n\t"
  88264. "ldm %[m]!, {r6}\n\t"
  88265. #ifdef WOLFSSL_KEIL
  88266. "ands r6, r6, r7\n\t"
  88267. #elif defined(__clang__)
  88268. "ands r6, r7\n\t"
  88269. #else
  88270. "and r6, r7\n\t"
  88271. #endif
  88272. "ldr r5, [%[a], r4]\n\t"
  88273. #ifdef WOLFSSL_KEIL
  88274. "sbcs r5, r5, r6\n\t"
  88275. #elif defined(__clang__)
  88276. "sbcs r5, r6\n\t"
  88277. #else
  88278. "sbc r5, r6\n\t"
  88279. #endif
  88280. "stm %[a]!, {r5}\n\t"
  88281. "ldm %[m]!, {r6}\n\t"
  88282. #ifdef WOLFSSL_KEIL
  88283. "ands r6, r6, r7\n\t"
  88284. #elif defined(__clang__)
  88285. "ands r6, r7\n\t"
  88286. #else
  88287. "and r6, r7\n\t"
  88288. #endif
  88289. "ldr r5, [%[a], r4]\n\t"
  88290. #ifdef WOLFSSL_KEIL
  88291. "sbcs r5, r5, r6\n\t"
  88292. #elif defined(__clang__)
  88293. "sbcs r5, r6\n\t"
  88294. #else
  88295. "sbc r5, r6\n\t"
  88296. #endif
  88297. "stm %[a]!, {r5}\n\t"
  88298. "ldm %[m]!, {r6}\n\t"
  88299. #ifdef WOLFSSL_KEIL
  88300. "ands r6, r6, r7\n\t"
  88301. #elif defined(__clang__)
  88302. "ands r6, r7\n\t"
  88303. #else
  88304. "and r6, r7\n\t"
  88305. #endif
  88306. "ldr r5, [%[a], r4]\n\t"
  88307. #ifdef WOLFSSL_KEIL
  88308. "sbcs r5, r5, r6\n\t"
  88309. #elif defined(__clang__)
  88310. "sbcs r5, r6\n\t"
  88311. #else
  88312. "sbc r5, r6\n\t"
  88313. #endif
  88314. "stm %[a]!, {r5}\n\t"
  88315. "ldm %[m]!, {r6}\n\t"
  88316. #ifdef WOLFSSL_KEIL
  88317. "ands r6, r6, r7\n\t"
  88318. #elif defined(__clang__)
  88319. "ands r6, r7\n\t"
  88320. #else
  88321. "and r6, r7\n\t"
  88322. #endif
  88323. "ldr r5, [%[a], r4]\n\t"
  88324. #ifdef WOLFSSL_KEIL
  88325. "sbcs r5, r5, r6\n\t"
  88326. #elif defined(__clang__)
  88327. "sbcs r5, r6\n\t"
  88328. #else
  88329. "sbc r5, r6\n\t"
  88330. #endif
  88331. "stm %[a]!, {r5}\n\t"
  88332. "ldm %[m]!, {r6}\n\t"
  88333. #ifdef WOLFSSL_KEIL
  88334. "ands r6, r6, r7\n\t"
  88335. #elif defined(__clang__)
  88336. "ands r6, r7\n\t"
  88337. #else
  88338. "and r6, r7\n\t"
  88339. #endif
  88340. "ldr r5, [%[a], r4]\n\t"
  88341. #ifdef WOLFSSL_KEIL
  88342. "sbcs r5, r5, r6\n\t"
  88343. #elif defined(__clang__)
  88344. "sbcs r5, r6\n\t"
  88345. #else
  88346. "sbc r5, r6\n\t"
  88347. #endif
  88348. "stm %[a]!, {r5}\n\t"
  88349. "ldm %[m]!, {r6}\n\t"
  88350. #ifdef WOLFSSL_KEIL
  88351. "ands r6, r6, r7\n\t"
  88352. #elif defined(__clang__)
  88353. "ands r6, r7\n\t"
  88354. #else
  88355. "and r6, r7\n\t"
  88356. #endif
  88357. "ldr r5, [%[a], r4]\n\t"
  88358. #ifdef WOLFSSL_KEIL
  88359. "sbcs r5, r5, r6\n\t"
  88360. #elif defined(__clang__)
  88361. "sbcs r5, r6\n\t"
  88362. #else
  88363. "sbc r5, r6\n\t"
  88364. #endif
  88365. "stm %[a]!, {r5}\n\t"
  88366. "ldm %[m]!, {r6}\n\t"
  88367. #ifdef WOLFSSL_KEIL
  88368. "ands r6, r6, r7\n\t"
  88369. #elif defined(__clang__)
  88370. "ands r6, r7\n\t"
  88371. #else
  88372. "and r6, r7\n\t"
  88373. #endif
  88374. "ldr r5, [%[a], r4]\n\t"
  88375. #ifdef WOLFSSL_KEIL
  88376. "sbcs r5, r5, r6\n\t"
  88377. #elif defined(__clang__)
  88378. "sbcs r5, r6\n\t"
  88379. #else
  88380. "sbc r5, r6\n\t"
  88381. #endif
  88382. "stm %[a]!, {r5}\n\t"
  88383. "ldm %[m]!, {r6}\n\t"
  88384. #ifdef WOLFSSL_KEIL
  88385. "ands r6, r6, r7\n\t"
  88386. #elif defined(__clang__)
  88387. "ands r6, r7\n\t"
  88388. #else
  88389. "and r6, r7\n\t"
  88390. #endif
  88391. "ldr r5, [%[a], r4]\n\t"
  88392. #ifdef WOLFSSL_KEIL
  88393. "sbcs r5, r5, r6\n\t"
  88394. #elif defined(__clang__)
  88395. "sbcs r5, r6\n\t"
  88396. #else
  88397. "sbc r5, r6\n\t"
  88398. #endif
  88399. "stm %[a]!, {r5}\n\t"
  88400. "ldm %[m]!, {r6}\n\t"
  88401. #ifdef WOLFSSL_KEIL
  88402. "ands r6, r6, r7\n\t"
  88403. #elif defined(__clang__)
  88404. "ands r6, r7\n\t"
  88405. #else
  88406. "and r6, r7\n\t"
  88407. #endif
  88408. "ldr r5, [%[a], r4]\n\t"
  88409. #ifdef WOLFSSL_KEIL
  88410. "sbcs r5, r5, r6\n\t"
  88411. #elif defined(__clang__)
  88412. "sbcs r5, r6\n\t"
  88413. #else
  88414. "sbc r5, r6\n\t"
  88415. #endif
  88416. "stm %[a]!, {r5}\n\t"
  88417. "ldm %[m]!, {r6}\n\t"
  88418. #ifdef WOLFSSL_KEIL
  88419. "ands r6, r6, r7\n\t"
  88420. #elif defined(__clang__)
  88421. "ands r6, r7\n\t"
  88422. #else
  88423. "and r6, r7\n\t"
  88424. #endif
  88425. "ldr r5, [%[a], r4]\n\t"
  88426. #ifdef WOLFSSL_KEIL
  88427. "sbcs r5, r5, r6\n\t"
  88428. #elif defined(__clang__)
  88429. "sbcs r5, r6\n\t"
  88430. #else
  88431. "sbc r5, r6\n\t"
  88432. #endif
  88433. "stm %[a]!, {r5}\n\t"
  88434. "ldm %[m]!, {r6}\n\t"
  88435. #ifdef WOLFSSL_KEIL
  88436. "ands r6, r6, r7\n\t"
  88437. #elif defined(__clang__)
  88438. "ands r6, r7\n\t"
  88439. #else
  88440. "and r6, r7\n\t"
  88441. #endif
  88442. "ldr r5, [%[a], r4]\n\t"
  88443. #ifdef WOLFSSL_KEIL
  88444. "sbcs r5, r5, r6\n\t"
  88445. #elif defined(__clang__)
  88446. "sbcs r5, r6\n\t"
  88447. #else
  88448. "sbc r5, r6\n\t"
  88449. #endif
  88450. "stm %[a]!, {r5}\n\t"
  88451. "ldm %[m]!, {r6}\n\t"
  88452. #ifdef WOLFSSL_KEIL
  88453. "ands r6, r6, r7\n\t"
  88454. #elif defined(__clang__)
  88455. "ands r6, r7\n\t"
  88456. #else
  88457. "and r6, r7\n\t"
  88458. #endif
  88459. "ldr r5, [%[a], r4]\n\t"
  88460. #ifdef WOLFSSL_KEIL
  88461. "sbcs r5, r5, r6\n\t"
  88462. #elif defined(__clang__)
  88463. "sbcs r5, r6\n\t"
  88464. #else
  88465. "sbc r5, r6\n\t"
  88466. #endif
  88467. "stm %[a]!, {r5}\n\t"
  88468. "ldm %[m]!, {r6}\n\t"
  88469. #ifdef WOLFSSL_KEIL
  88470. "ands r6, r6, r7\n\t"
  88471. #elif defined(__clang__)
  88472. "ands r6, r7\n\t"
  88473. #else
  88474. "and r6, r7\n\t"
  88475. #endif
  88476. "ldr r5, [%[a], r4]\n\t"
  88477. #ifdef WOLFSSL_KEIL
  88478. "sbcs r5, r5, r6\n\t"
  88479. #elif defined(__clang__)
  88480. "sbcs r5, r6\n\t"
  88481. #else
  88482. "sbc r5, r6\n\t"
  88483. #endif
  88484. "stm %[a]!, {r5}\n\t"
  88485. "ldm %[m]!, {r6}\n\t"
  88486. #ifdef WOLFSSL_KEIL
  88487. "ands r6, r6, r7\n\t"
  88488. #elif defined(__clang__)
  88489. "ands r6, r7\n\t"
  88490. #else
  88491. "and r6, r7\n\t"
  88492. #endif
  88493. "ldr r5, [%[a], r4]\n\t"
  88494. #ifdef WOLFSSL_KEIL
  88495. "sbcs r5, r5, r6\n\t"
  88496. #elif defined(__clang__)
  88497. "sbcs r5, r6\n\t"
  88498. #else
  88499. "sbc r5, r6\n\t"
  88500. #endif
  88501. "stm %[a]!, {r5}\n\t"
  88502. "ldm %[m]!, {r6}\n\t"
  88503. #ifdef WOLFSSL_KEIL
  88504. "ands r6, r6, r7\n\t"
  88505. #elif defined(__clang__)
  88506. "ands r6, r7\n\t"
  88507. #else
  88508. "and r6, r7\n\t"
  88509. #endif
  88510. "ldr r5, [%[a], r4]\n\t"
  88511. #ifdef WOLFSSL_KEIL
  88512. "sbcs r5, r5, r6\n\t"
  88513. #elif defined(__clang__)
  88514. "sbcs r5, r6\n\t"
  88515. #else
  88516. "sbc r5, r6\n\t"
  88517. #endif
  88518. "stm %[a]!, {r5}\n\t"
  88519. "ldm %[m]!, {r6}\n\t"
  88520. #ifdef WOLFSSL_KEIL
  88521. "ands r6, r6, r7\n\t"
  88522. #elif defined(__clang__)
  88523. "ands r6, r7\n\t"
  88524. #else
  88525. "and r6, r7\n\t"
  88526. #endif
  88527. "ldr r5, [%[a], r4]\n\t"
  88528. #ifdef WOLFSSL_KEIL
  88529. "sbcs r5, r5, r6\n\t"
  88530. #elif defined(__clang__)
  88531. "sbcs r5, r6\n\t"
  88532. #else
  88533. "sbc r5, r6\n\t"
  88534. #endif
  88535. "stm %[a]!, {r5}\n\t"
  88536. "ldm %[m]!, {r6}\n\t"
  88537. #ifdef WOLFSSL_KEIL
  88538. "ands r6, r6, r7\n\t"
  88539. #elif defined(__clang__)
  88540. "ands r6, r7\n\t"
  88541. #else
  88542. "and r6, r7\n\t"
  88543. #endif
  88544. "ldr r5, [%[a], r4]\n\t"
  88545. #ifdef WOLFSSL_KEIL
  88546. "sbcs r5, r5, r6\n\t"
  88547. #elif defined(__clang__)
  88548. "sbcs r5, r6\n\t"
  88549. #else
  88550. "sbc r5, r6\n\t"
  88551. #endif
  88552. "stm %[a]!, {r5}\n\t"
  88553. "ldm %[m]!, {r6}\n\t"
  88554. #ifdef WOLFSSL_KEIL
  88555. "ands r6, r6, r7\n\t"
  88556. #elif defined(__clang__)
  88557. "ands r6, r7\n\t"
  88558. #else
  88559. "and r6, r7\n\t"
  88560. #endif
  88561. "ldr r5, [%[a], r4]\n\t"
  88562. #ifdef WOLFSSL_KEIL
  88563. "sbcs r5, r5, r6\n\t"
  88564. #elif defined(__clang__)
  88565. "sbcs r5, r6\n\t"
  88566. #else
  88567. "sbc r5, r6\n\t"
  88568. #endif
  88569. "stm %[a]!, {r5}\n\t"
  88570. "ldm %[m]!, {r6}\n\t"
  88571. #ifdef WOLFSSL_KEIL
  88572. "ands r6, r6, r7\n\t"
  88573. #elif defined(__clang__)
  88574. "ands r6, r7\n\t"
  88575. #else
  88576. "and r6, r7\n\t"
  88577. #endif
  88578. "ldr r5, [%[a], r4]\n\t"
  88579. #ifdef WOLFSSL_KEIL
  88580. "sbcs r5, r5, r6\n\t"
  88581. #elif defined(__clang__)
  88582. "sbcs r5, r6\n\t"
  88583. #else
  88584. "sbc r5, r6\n\t"
  88585. #endif
  88586. "stm %[a]!, {r5}\n\t"
  88587. "ldm %[m]!, {r6}\n\t"
  88588. #ifdef WOLFSSL_KEIL
  88589. "ands r6, r6, r7\n\t"
  88590. #elif defined(__clang__)
  88591. "ands r6, r7\n\t"
  88592. #else
  88593. "and r6, r7\n\t"
  88594. #endif
  88595. "ldr r5, [%[a], r4]\n\t"
  88596. #ifdef WOLFSSL_KEIL
  88597. "sbcs r5, r5, r6\n\t"
  88598. #elif defined(__clang__)
  88599. "sbcs r5, r6\n\t"
  88600. #else
  88601. "sbc r5, r6\n\t"
  88602. #endif
  88603. "stm %[a]!, {r5}\n\t"
  88604. "ldm %[m]!, {r6}\n\t"
  88605. #ifdef WOLFSSL_KEIL
  88606. "ands r6, r6, r7\n\t"
  88607. #elif defined(__clang__)
  88608. "ands r6, r7\n\t"
  88609. #else
  88610. "and r6, r7\n\t"
  88611. #endif
  88612. "ldr r5, [%[a], r4]\n\t"
  88613. #ifdef WOLFSSL_KEIL
  88614. "sbcs r5, r5, r6\n\t"
  88615. #elif defined(__clang__)
  88616. "sbcs r5, r6\n\t"
  88617. #else
  88618. "sbc r5, r6\n\t"
  88619. #endif
  88620. "stm %[a]!, {r5}\n\t"
  88621. "ldm %[m]!, {r6}\n\t"
  88622. #ifdef WOLFSSL_KEIL
  88623. "ands r6, r6, r7\n\t"
  88624. #elif defined(__clang__)
  88625. "ands r6, r7\n\t"
  88626. #else
  88627. "and r6, r7\n\t"
  88628. #endif
  88629. "ldr r5, [%[a], r4]\n\t"
  88630. #ifdef WOLFSSL_KEIL
  88631. "sbcs r5, r5, r6\n\t"
  88632. #elif defined(__clang__)
  88633. "sbcs r5, r6\n\t"
  88634. #else
  88635. "sbc r5, r6\n\t"
  88636. #endif
  88637. "stm %[a]!, {r5}\n\t"
  88638. "ldm %[m]!, {r6}\n\t"
  88639. #ifdef WOLFSSL_KEIL
  88640. "ands r6, r6, r7\n\t"
  88641. #elif defined(__clang__)
  88642. "ands r6, r7\n\t"
  88643. #else
  88644. "and r6, r7\n\t"
  88645. #endif
  88646. "ldr r5, [%[a], r4]\n\t"
  88647. #ifdef WOLFSSL_KEIL
  88648. "sbcs r5, r5, r6\n\t"
  88649. #elif defined(__clang__)
  88650. "sbcs r5, r6\n\t"
  88651. #else
  88652. "sbc r5, r6\n\t"
  88653. #endif
  88654. "stm %[a]!, {r5}\n\t"
  88655. "ldm %[m]!, {r6}\n\t"
  88656. #ifdef WOLFSSL_KEIL
  88657. "ands r6, r6, r7\n\t"
  88658. #elif defined(__clang__)
  88659. "ands r6, r7\n\t"
  88660. #else
  88661. "and r6, r7\n\t"
  88662. #endif
  88663. "ldr r5, [%[a], r4]\n\t"
  88664. #ifdef WOLFSSL_KEIL
  88665. "sbcs r5, r5, r6\n\t"
  88666. #elif defined(__clang__)
  88667. "sbcs r5, r6\n\t"
  88668. #else
  88669. "sbc r5, r6\n\t"
  88670. #endif
  88671. "stm %[a]!, {r5}\n\t"
  88672. "ldm %[m]!, {r6}\n\t"
  88673. #ifdef WOLFSSL_KEIL
  88674. "ands r6, r6, r7\n\t"
  88675. #elif defined(__clang__)
  88676. "ands r6, r7\n\t"
  88677. #else
  88678. "and r6, r7\n\t"
  88679. #endif
  88680. "ldr r5, [%[a], r4]\n\t"
  88681. #ifdef WOLFSSL_KEIL
  88682. "sbcs r5, r5, r6\n\t"
  88683. #elif defined(__clang__)
  88684. "sbcs r5, r6\n\t"
  88685. #else
  88686. "sbc r5, r6\n\t"
  88687. #endif
  88688. "stm %[a]!, {r5}\n\t"
  88689. "ldm %[m]!, {r6}\n\t"
  88690. #ifdef WOLFSSL_KEIL
  88691. "ands r6, r6, r7\n\t"
  88692. #elif defined(__clang__)
  88693. "ands r6, r7\n\t"
  88694. #else
  88695. "and r6, r7\n\t"
  88696. #endif
  88697. "ldr r5, [%[a], r4]\n\t"
  88698. #ifdef WOLFSSL_KEIL
  88699. "sbcs r5, r5, r6\n\t"
  88700. #elif defined(__clang__)
  88701. "sbcs r5, r6\n\t"
  88702. #else
  88703. "sbc r5, r6\n\t"
  88704. #endif
  88705. "stm %[a]!, {r5}\n\t"
  88706. "ldm %[m]!, {r6}\n\t"
  88707. #ifdef WOLFSSL_KEIL
  88708. "ands r6, r6, r7\n\t"
  88709. #elif defined(__clang__)
  88710. "ands r6, r7\n\t"
  88711. #else
  88712. "and r6, r7\n\t"
  88713. #endif
  88714. "ldr r5, [%[a], r4]\n\t"
  88715. #ifdef WOLFSSL_KEIL
  88716. "sbcs r5, r5, r6\n\t"
  88717. #elif defined(__clang__)
  88718. "sbcs r5, r6\n\t"
  88719. #else
  88720. "sbc r5, r6\n\t"
  88721. #endif
  88722. "stm %[a]!, {r5}\n\t"
  88723. "ldm %[m]!, {r6}\n\t"
  88724. #ifdef WOLFSSL_KEIL
  88725. "ands r6, r6, r7\n\t"
  88726. #elif defined(__clang__)
  88727. "ands r6, r7\n\t"
  88728. #else
  88729. "and r6, r7\n\t"
  88730. #endif
  88731. "ldr r5, [%[a], r4]\n\t"
  88732. #ifdef WOLFSSL_KEIL
  88733. "sbcs r5, r5, r6\n\t"
  88734. #elif defined(__clang__)
  88735. "sbcs r5, r6\n\t"
  88736. #else
  88737. "sbc r5, r6\n\t"
  88738. #endif
  88739. "stm %[a]!, {r5}\n\t"
  88740. "ldm %[m]!, {r6}\n\t"
  88741. #ifdef WOLFSSL_KEIL
  88742. "ands r6, r6, r7\n\t"
  88743. #elif defined(__clang__)
  88744. "ands r6, r7\n\t"
  88745. #else
  88746. "and r6, r7\n\t"
  88747. #endif
  88748. "ldr r5, [%[a], r4]\n\t"
  88749. #ifdef WOLFSSL_KEIL
  88750. "sbcs r5, r5, r6\n\t"
  88751. #elif defined(__clang__)
  88752. "sbcs r5, r6\n\t"
  88753. #else
  88754. "sbc r5, r6\n\t"
  88755. #endif
  88756. "stm %[a]!, {r5}\n\t"
  88757. "ldm %[m]!, {r6}\n\t"
  88758. #ifdef WOLFSSL_KEIL
  88759. "ands r6, r6, r7\n\t"
  88760. #elif defined(__clang__)
  88761. "ands r6, r7\n\t"
  88762. #else
  88763. "and r6, r7\n\t"
  88764. #endif
  88765. "ldr r5, [%[a], r4]\n\t"
  88766. #ifdef WOLFSSL_KEIL
  88767. "sbcs r5, r5, r6\n\t"
  88768. #elif defined(__clang__)
  88769. "sbcs r5, r6\n\t"
  88770. #else
  88771. "sbc r5, r6\n\t"
  88772. #endif
  88773. "stm %[a]!, {r5}\n\t"
  88774. "ldm %[m]!, {r6}\n\t"
  88775. #ifdef WOLFSSL_KEIL
  88776. "ands r6, r6, r7\n\t"
  88777. #elif defined(__clang__)
  88778. "ands r6, r7\n\t"
  88779. #else
  88780. "and r6, r7\n\t"
  88781. #endif
  88782. "ldr r5, [%[a], r4]\n\t"
  88783. #ifdef WOLFSSL_KEIL
  88784. "sbcs r5, r5, r6\n\t"
  88785. #elif defined(__clang__)
  88786. "sbcs r5, r6\n\t"
  88787. #else
  88788. "sbc r5, r6\n\t"
  88789. #endif
  88790. "stm %[a]!, {r5}\n\t"
  88791. "ldm %[m]!, {r6}\n\t"
  88792. #ifdef WOLFSSL_KEIL
  88793. "ands r6, r6, r7\n\t"
  88794. #elif defined(__clang__)
  88795. "ands r6, r7\n\t"
  88796. #else
  88797. "and r6, r7\n\t"
  88798. #endif
  88799. "ldr r5, [%[a], r4]\n\t"
  88800. #ifdef WOLFSSL_KEIL
  88801. "sbcs r5, r5, r6\n\t"
  88802. #elif defined(__clang__)
  88803. "sbcs r5, r6\n\t"
  88804. #else
  88805. "sbc r5, r6\n\t"
  88806. #endif
  88807. "stm %[a]!, {r5}\n\t"
  88808. "ldm %[m]!, {r6}\n\t"
  88809. #ifdef WOLFSSL_KEIL
  88810. "ands r6, r6, r7\n\t"
  88811. #elif defined(__clang__)
  88812. "ands r6, r7\n\t"
  88813. #else
  88814. "and r6, r7\n\t"
  88815. #endif
  88816. "ldr r5, [%[a], r4]\n\t"
  88817. #ifdef WOLFSSL_KEIL
  88818. "sbcs r5, r5, r6\n\t"
  88819. #elif defined(__clang__)
  88820. "sbcs r5, r6\n\t"
  88821. #else
  88822. "sbc r5, r6\n\t"
  88823. #endif
  88824. "stm %[a]!, {r5}\n\t"
  88825. "ldm %[m]!, {r6}\n\t"
  88826. #ifdef WOLFSSL_KEIL
  88827. "ands r6, r6, r7\n\t"
  88828. #elif defined(__clang__)
  88829. "ands r6, r7\n\t"
  88830. #else
  88831. "and r6, r7\n\t"
  88832. #endif
  88833. "ldr r5, [%[a], r4]\n\t"
  88834. #ifdef WOLFSSL_KEIL
  88835. "sbcs r5, r5, r6\n\t"
  88836. #elif defined(__clang__)
  88837. "sbcs r5, r6\n\t"
  88838. #else
  88839. "sbc r5, r6\n\t"
  88840. #endif
  88841. "stm %[a]!, {r5}\n\t"
  88842. "ldm %[m]!, {r6}\n\t"
  88843. #ifdef WOLFSSL_KEIL
  88844. "ands r6, r6, r7\n\t"
  88845. #elif defined(__clang__)
  88846. "ands r6, r7\n\t"
  88847. #else
  88848. "and r6, r7\n\t"
  88849. #endif
  88850. "ldr r5, [%[a], r4]\n\t"
  88851. #ifdef WOLFSSL_KEIL
  88852. "sbcs r5, r5, r6\n\t"
  88853. #elif defined(__clang__)
  88854. "sbcs r5, r6\n\t"
  88855. #else
  88856. "sbc r5, r6\n\t"
  88857. #endif
  88858. "stm %[a]!, {r5}\n\t"
  88859. "ldm %[m]!, {r6}\n\t"
  88860. #ifdef WOLFSSL_KEIL
  88861. "ands r6, r6, r7\n\t"
  88862. #elif defined(__clang__)
  88863. "ands r6, r7\n\t"
  88864. #else
  88865. "and r6, r7\n\t"
  88866. #endif
  88867. "ldr r5, [%[a], r4]\n\t"
  88868. #ifdef WOLFSSL_KEIL
  88869. "sbcs r5, r5, r6\n\t"
  88870. #elif defined(__clang__)
  88871. "sbcs r5, r6\n\t"
  88872. #else
  88873. "sbc r5, r6\n\t"
  88874. #endif
  88875. "stm %[a]!, {r5}\n\t"
  88876. "ldm %[m]!, {r6}\n\t"
  88877. #ifdef WOLFSSL_KEIL
  88878. "ands r6, r6, r7\n\t"
  88879. #elif defined(__clang__)
  88880. "ands r6, r7\n\t"
  88881. #else
  88882. "and r6, r7\n\t"
  88883. #endif
  88884. "ldr r5, [%[a], r4]\n\t"
  88885. #ifdef WOLFSSL_KEIL
  88886. "sbcs r5, r5, r6\n\t"
  88887. #elif defined(__clang__)
  88888. "sbcs r5, r6\n\t"
  88889. #else
  88890. "sbc r5, r6\n\t"
  88891. #endif
  88892. "stm %[a]!, {r5}\n\t"
  88893. "ldm %[m]!, {r6}\n\t"
  88894. #ifdef WOLFSSL_KEIL
  88895. "ands r6, r6, r7\n\t"
  88896. #elif defined(__clang__)
  88897. "ands r6, r7\n\t"
  88898. #else
  88899. "and r6, r7\n\t"
  88900. #endif
  88901. "ldr r5, [%[a], r4]\n\t"
  88902. #ifdef WOLFSSL_KEIL
  88903. "sbcs r5, r5, r6\n\t"
  88904. #elif defined(__clang__)
  88905. "sbcs r5, r6\n\t"
  88906. #else
  88907. "sbc r5, r6\n\t"
  88908. #endif
  88909. "stm %[a]!, {r5}\n\t"
  88910. "ldm %[m]!, {r6}\n\t"
  88911. #ifdef WOLFSSL_KEIL
  88912. "ands r6, r6, r7\n\t"
  88913. #elif defined(__clang__)
  88914. "ands r6, r7\n\t"
  88915. #else
  88916. "and r6, r7\n\t"
  88917. #endif
  88918. "ldr r5, [%[a], r4]\n\t"
  88919. #ifdef WOLFSSL_KEIL
  88920. "sbcs r5, r5, r6\n\t"
  88921. #elif defined(__clang__)
  88922. "sbcs r5, r6\n\t"
  88923. #else
  88924. "sbc r5, r6\n\t"
  88925. #endif
  88926. "stm %[a]!, {r5}\n\t"
  88927. "ldm %[m]!, {r6}\n\t"
  88928. #ifdef WOLFSSL_KEIL
  88929. "ands r6, r6, r7\n\t"
  88930. #elif defined(__clang__)
  88931. "ands r6, r7\n\t"
  88932. #else
  88933. "and r6, r7\n\t"
  88934. #endif
  88935. "ldr r5, [%[a], r4]\n\t"
  88936. #ifdef WOLFSSL_KEIL
  88937. "sbcs r5, r5, r6\n\t"
  88938. #elif defined(__clang__)
  88939. "sbcs r5, r6\n\t"
  88940. #else
  88941. "sbc r5, r6\n\t"
  88942. #endif
  88943. "stm %[a]!, {r5}\n\t"
  88944. "ldm %[m]!, {r6}\n\t"
  88945. #ifdef WOLFSSL_KEIL
  88946. "ands r6, r6, r7\n\t"
  88947. #elif defined(__clang__)
  88948. "ands r6, r7\n\t"
  88949. #else
  88950. "and r6, r7\n\t"
  88951. #endif
  88952. "ldr r5, [%[a], r4]\n\t"
  88953. #ifdef WOLFSSL_KEIL
  88954. "sbcs r5, r5, r6\n\t"
  88955. #elif defined(__clang__)
  88956. "sbcs r5, r6\n\t"
  88957. #else
  88958. "sbc r5, r6\n\t"
  88959. #endif
  88960. "stm %[a]!, {r5}\n\t"
  88961. "ldm %[m]!, {r6}\n\t"
  88962. #ifdef WOLFSSL_KEIL
  88963. "ands r6, r6, r7\n\t"
  88964. #elif defined(__clang__)
  88965. "ands r6, r7\n\t"
  88966. #else
  88967. "and r6, r7\n\t"
  88968. #endif
  88969. "ldr r5, [%[a], r4]\n\t"
  88970. #ifdef WOLFSSL_KEIL
  88971. "sbcs r5, r5, r6\n\t"
  88972. #elif defined(__clang__)
  88973. "sbcs r5, r6\n\t"
  88974. #else
  88975. "sbc r5, r6\n\t"
  88976. #endif
  88977. "stm %[a]!, {r5}\n\t"
  88978. "ldm %[m]!, {r6}\n\t"
  88979. #ifdef WOLFSSL_KEIL
  88980. "ands r6, r6, r7\n\t"
  88981. #elif defined(__clang__)
  88982. "ands r6, r7\n\t"
  88983. #else
  88984. "and r6, r7\n\t"
  88985. #endif
  88986. "ldr r5, [%[a], r4]\n\t"
  88987. #ifdef WOLFSSL_KEIL
  88988. "sbcs r5, r5, r6\n\t"
  88989. #elif defined(__clang__)
  88990. "sbcs r5, r6\n\t"
  88991. #else
  88992. "sbc r5, r6\n\t"
  88993. #endif
  88994. "stm %[a]!, {r5}\n\t"
  88995. "ldm %[m]!, {r6}\n\t"
  88996. #ifdef WOLFSSL_KEIL
  88997. "ands r6, r6, r7\n\t"
  88998. #elif defined(__clang__)
  88999. "ands r6, r7\n\t"
  89000. #else
  89001. "and r6, r7\n\t"
  89002. #endif
  89003. "ldr r5, [%[a], r4]\n\t"
  89004. #ifdef WOLFSSL_KEIL
  89005. "sbcs r5, r5, r6\n\t"
  89006. #elif defined(__clang__)
  89007. "sbcs r5, r6\n\t"
  89008. #else
  89009. "sbc r5, r6\n\t"
  89010. #endif
  89011. "stm %[a]!, {r5}\n\t"
  89012. "ldm %[m]!, {r6}\n\t"
  89013. #ifdef WOLFSSL_KEIL
  89014. "ands r6, r6, r7\n\t"
  89015. #elif defined(__clang__)
  89016. "ands r6, r7\n\t"
  89017. #else
  89018. "and r6, r7\n\t"
  89019. #endif
  89020. "ldr r5, [%[a], r4]\n\t"
  89021. #ifdef WOLFSSL_KEIL
  89022. "sbcs r5, r5, r6\n\t"
  89023. #elif defined(__clang__)
  89024. "sbcs r5, r6\n\t"
  89025. #else
  89026. "sbc r5, r6\n\t"
  89027. #endif
  89028. "stm %[a]!, {r5}\n\t"
  89029. "ldm %[m]!, {r6}\n\t"
  89030. #ifdef WOLFSSL_KEIL
  89031. "ands r6, r6, r7\n\t"
  89032. #elif defined(__clang__)
  89033. "ands r6, r7\n\t"
  89034. #else
  89035. "and r6, r7\n\t"
  89036. #endif
  89037. "ldr r5, [%[a], r4]\n\t"
  89038. #ifdef WOLFSSL_KEIL
  89039. "sbcs r5, r5, r6\n\t"
  89040. #elif defined(__clang__)
  89041. "sbcs r5, r6\n\t"
  89042. #else
  89043. "sbc r5, r6\n\t"
  89044. #endif
  89045. "stm %[a]!, {r5}\n\t"
  89046. "ldm %[m]!, {r6}\n\t"
  89047. #ifdef WOLFSSL_KEIL
  89048. "ands r6, r6, r7\n\t"
  89049. #elif defined(__clang__)
  89050. "ands r6, r7\n\t"
  89051. #else
  89052. "and r6, r7\n\t"
  89053. #endif
  89054. "ldr r5, [%[a], r4]\n\t"
  89055. #ifdef WOLFSSL_KEIL
  89056. "sbcs r5, r5, r6\n\t"
  89057. #elif defined(__clang__)
  89058. "sbcs r5, r6\n\t"
  89059. #else
  89060. "sbc r5, r6\n\t"
  89061. #endif
  89062. "stm %[a]!, {r5}\n\t"
  89063. "ldm %[m]!, {r6}\n\t"
  89064. #ifdef WOLFSSL_KEIL
  89065. "ands r6, r6, r7\n\t"
  89066. #elif defined(__clang__)
  89067. "ands r6, r7\n\t"
  89068. #else
  89069. "and r6, r7\n\t"
  89070. #endif
  89071. "ldr r5, [%[a], r4]\n\t"
  89072. #ifdef WOLFSSL_KEIL
  89073. "sbcs r5, r5, r6\n\t"
  89074. #elif defined(__clang__)
  89075. "sbcs r5, r6\n\t"
  89076. #else
  89077. "sbc r5, r6\n\t"
  89078. #endif
  89079. "stm %[a]!, {r5}\n\t"
  89080. "ldm %[m]!, {r6}\n\t"
  89081. #ifdef WOLFSSL_KEIL
  89082. "ands r6, r6, r7\n\t"
  89083. #elif defined(__clang__)
  89084. "ands r6, r7\n\t"
  89085. #else
  89086. "and r6, r7\n\t"
  89087. #endif
  89088. "ldr r5, [%[a], r4]\n\t"
  89089. #ifdef WOLFSSL_KEIL
  89090. "sbcs r5, r5, r6\n\t"
  89091. #elif defined(__clang__)
  89092. "sbcs r5, r6\n\t"
  89093. #else
  89094. "sbc r5, r6\n\t"
  89095. #endif
  89096. "stm %[a]!, {r5}\n\t"
  89097. "ldm %[m]!, {r6}\n\t"
  89098. #ifdef WOLFSSL_KEIL
  89099. "ands r6, r6, r7\n\t"
  89100. #elif defined(__clang__)
  89101. "ands r6, r7\n\t"
  89102. #else
  89103. "and r6, r7\n\t"
  89104. #endif
  89105. "ldr r5, [%[a], r4]\n\t"
  89106. #ifdef WOLFSSL_KEIL
  89107. "sbcs r5, r5, r6\n\t"
  89108. #elif defined(__clang__)
  89109. "sbcs r5, r6\n\t"
  89110. #else
  89111. "sbc r5, r6\n\t"
  89112. #endif
  89113. "stm %[a]!, {r5}\n\t"
  89114. "ldm %[m]!, {r6}\n\t"
  89115. #ifdef WOLFSSL_KEIL
  89116. "ands r6, r6, r7\n\t"
  89117. #elif defined(__clang__)
  89118. "ands r6, r7\n\t"
  89119. #else
  89120. "and r6, r7\n\t"
  89121. #endif
  89122. "ldr r5, [%[a], r4]\n\t"
  89123. #ifdef WOLFSSL_KEIL
  89124. "sbcs r5, r5, r6\n\t"
  89125. #elif defined(__clang__)
  89126. "sbcs r5, r6\n\t"
  89127. #else
  89128. "sbc r5, r6\n\t"
  89129. #endif
  89130. "stm %[a]!, {r5}\n\t"
  89131. "ldm %[m]!, {r6}\n\t"
  89132. #ifdef WOLFSSL_KEIL
  89133. "ands r6, r6, r7\n\t"
  89134. #elif defined(__clang__)
  89135. "ands r6, r7\n\t"
  89136. #else
  89137. "and r6, r7\n\t"
  89138. #endif
  89139. "ldr r5, [%[a], r4]\n\t"
  89140. #ifdef WOLFSSL_KEIL
  89141. "sbcs r5, r5, r6\n\t"
  89142. #elif defined(__clang__)
  89143. "sbcs r5, r6\n\t"
  89144. #else
  89145. "sbc r5, r6\n\t"
  89146. #endif
  89147. "stm %[a]!, {r5}\n\t"
  89148. "ldm %[m]!, {r6}\n\t"
  89149. #ifdef WOLFSSL_KEIL
  89150. "ands r6, r6, r7\n\t"
  89151. #elif defined(__clang__)
  89152. "ands r6, r7\n\t"
  89153. #else
  89154. "and r6, r7\n\t"
  89155. #endif
  89156. "ldr r5, [%[a], r4]\n\t"
  89157. #ifdef WOLFSSL_KEIL
  89158. "sbcs r5, r5, r6\n\t"
  89159. #elif defined(__clang__)
  89160. "sbcs r5, r6\n\t"
  89161. #else
  89162. "sbc r5, r6\n\t"
  89163. #endif
  89164. "stm %[a]!, {r5}\n\t"
  89165. "ldm %[m]!, {r6}\n\t"
  89166. #ifdef WOLFSSL_KEIL
  89167. "ands r6, r6, r7\n\t"
  89168. #elif defined(__clang__)
  89169. "ands r6, r7\n\t"
  89170. #else
  89171. "and r6, r7\n\t"
  89172. #endif
  89173. "ldr r5, [%[a], r4]\n\t"
  89174. #ifdef WOLFSSL_KEIL
  89175. "sbcs r5, r5, r6\n\t"
  89176. #elif defined(__clang__)
  89177. "sbcs r5, r6\n\t"
  89178. #else
  89179. "sbc r5, r6\n\t"
  89180. #endif
  89181. "stm %[a]!, {r5}\n\t"
  89182. "ldm %[m]!, {r6}\n\t"
  89183. #ifdef WOLFSSL_KEIL
  89184. "ands r6, r6, r7\n\t"
  89185. #elif defined(__clang__)
  89186. "ands r6, r7\n\t"
  89187. #else
  89188. "and r6, r7\n\t"
  89189. #endif
  89190. "ldr r5, [%[a], r4]\n\t"
  89191. #ifdef WOLFSSL_KEIL
  89192. "sbcs r5, r5, r6\n\t"
  89193. #elif defined(__clang__)
  89194. "sbcs r5, r6\n\t"
  89195. #else
  89196. "sbc r5, r6\n\t"
  89197. #endif
  89198. "stm %[a]!, {r5}\n\t"
  89199. "ldm %[m]!, {r6}\n\t"
  89200. #ifdef WOLFSSL_KEIL
  89201. "ands r6, r6, r7\n\t"
  89202. #elif defined(__clang__)
  89203. "ands r6, r7\n\t"
  89204. #else
  89205. "and r6, r7\n\t"
  89206. #endif
  89207. "ldr r5, [%[a], r4]\n\t"
  89208. #ifdef WOLFSSL_KEIL
  89209. "sbcs r5, r5, r6\n\t"
  89210. #elif defined(__clang__)
  89211. "sbcs r5, r6\n\t"
  89212. #else
  89213. "sbc r5, r6\n\t"
  89214. #endif
  89215. "stm %[a]!, {r5}\n\t"
  89216. "ldm %[m]!, {r6}\n\t"
  89217. #ifdef WOLFSSL_KEIL
  89218. "ands r6, r6, r7\n\t"
  89219. #elif defined(__clang__)
  89220. "ands r6, r7\n\t"
  89221. #else
  89222. "and r6, r7\n\t"
  89223. #endif
  89224. "ldr r5, [%[a], r4]\n\t"
  89225. #ifdef WOLFSSL_KEIL
  89226. "sbcs r5, r5, r6\n\t"
  89227. #elif defined(__clang__)
  89228. "sbcs r5, r6\n\t"
  89229. #else
  89230. "sbc r5, r6\n\t"
  89231. #endif
  89232. "stm %[a]!, {r5}\n\t"
  89233. "ldm %[m]!, {r6}\n\t"
  89234. #ifdef WOLFSSL_KEIL
  89235. "ands r6, r6, r7\n\t"
  89236. #elif defined(__clang__)
  89237. "ands r6, r7\n\t"
  89238. #else
  89239. "and r6, r7\n\t"
  89240. #endif
  89241. "ldr r5, [%[a], r4]\n\t"
  89242. #ifdef WOLFSSL_KEIL
  89243. "sbcs r5, r5, r6\n\t"
  89244. #elif defined(__clang__)
  89245. "sbcs r5, r6\n\t"
  89246. #else
  89247. "sbc r5, r6\n\t"
  89248. #endif
  89249. "stm %[a]!, {r5}\n\t"
  89250. "ldm %[m]!, {r6}\n\t"
  89251. #ifdef WOLFSSL_KEIL
  89252. "ands r6, r6, r7\n\t"
  89253. #elif defined(__clang__)
  89254. "ands r6, r7\n\t"
  89255. #else
  89256. "and r6, r7\n\t"
  89257. #endif
  89258. "ldr r5, [%[a], r4]\n\t"
  89259. #ifdef WOLFSSL_KEIL
  89260. "sbcs r5, r5, r6\n\t"
  89261. #elif defined(__clang__)
  89262. "sbcs r5, r6\n\t"
  89263. #else
  89264. "sbc r5, r6\n\t"
  89265. #endif
  89266. "stm %[a]!, {r5}\n\t"
  89267. "ldm %[m]!, {r6}\n\t"
  89268. #ifdef WOLFSSL_KEIL
  89269. "ands r6, r6, r7\n\t"
  89270. #elif defined(__clang__)
  89271. "ands r6, r7\n\t"
  89272. #else
  89273. "and r6, r7\n\t"
  89274. #endif
  89275. "ldr r5, [%[a], r4]\n\t"
  89276. #ifdef WOLFSSL_KEIL
  89277. "sbcs r5, r5, r6\n\t"
  89278. #elif defined(__clang__)
  89279. "sbcs r5, r6\n\t"
  89280. #else
  89281. "sbc r5, r6\n\t"
  89282. #endif
  89283. "stm %[a]!, {r5}\n\t"
  89284. "ldm %[m]!, {r6}\n\t"
  89285. #ifdef WOLFSSL_KEIL
  89286. "ands r6, r6, r7\n\t"
  89287. #elif defined(__clang__)
  89288. "ands r6, r7\n\t"
  89289. #else
  89290. "and r6, r7\n\t"
  89291. #endif
  89292. "ldr r5, [%[a], r4]\n\t"
  89293. #ifdef WOLFSSL_KEIL
  89294. "sbcs r5, r5, r6\n\t"
  89295. #elif defined(__clang__)
  89296. "sbcs r5, r6\n\t"
  89297. #else
  89298. "sbc r5, r6\n\t"
  89299. #endif
  89300. "stm %[a]!, {r5}\n\t"
  89301. "ldm %[m]!, {r6}\n\t"
  89302. #ifdef WOLFSSL_KEIL
  89303. "ands r6, r6, r7\n\t"
  89304. #elif defined(__clang__)
  89305. "ands r6, r7\n\t"
  89306. #else
  89307. "and r6, r7\n\t"
  89308. #endif
  89309. "ldr r5, [%[a], r4]\n\t"
  89310. #ifdef WOLFSSL_KEIL
  89311. "sbcs r5, r5, r6\n\t"
  89312. #elif defined(__clang__)
  89313. "sbcs r5, r6\n\t"
  89314. #else
  89315. "sbc r5, r6\n\t"
  89316. #endif
  89317. "stm %[a]!, {r5}\n\t"
  89318. "ldm %[m]!, {r6}\n\t"
  89319. #ifdef WOLFSSL_KEIL
  89320. "ands r6, r6, r7\n\t"
  89321. #elif defined(__clang__)
  89322. "ands r6, r7\n\t"
  89323. #else
  89324. "and r6, r7\n\t"
  89325. #endif
  89326. "ldr r5, [%[a], r4]\n\t"
  89327. #ifdef WOLFSSL_KEIL
  89328. "sbcs r5, r5, r6\n\t"
  89329. #elif defined(__clang__)
  89330. "sbcs r5, r6\n\t"
  89331. #else
  89332. "sbc r5, r6\n\t"
  89333. #endif
  89334. "stm %[a]!, {r5}\n\t"
  89335. "ldm %[m]!, {r6}\n\t"
  89336. #ifdef WOLFSSL_KEIL
  89337. "ands r6, r6, r7\n\t"
  89338. #elif defined(__clang__)
  89339. "ands r6, r7\n\t"
  89340. #else
  89341. "and r6, r7\n\t"
  89342. #endif
  89343. "ldr r5, [%[a], r4]\n\t"
  89344. #ifdef WOLFSSL_KEIL
  89345. "sbcs r5, r5, r6\n\t"
  89346. #elif defined(__clang__)
  89347. "sbcs r5, r6\n\t"
  89348. #else
  89349. "sbc r5, r6\n\t"
  89350. #endif
  89351. "stm %[a]!, {r5}\n\t"
  89352. "ldm %[m]!, {r6}\n\t"
  89353. #ifdef WOLFSSL_KEIL
  89354. "ands r6, r6, r7\n\t"
  89355. #elif defined(__clang__)
  89356. "ands r6, r7\n\t"
  89357. #else
  89358. "and r6, r7\n\t"
  89359. #endif
  89360. "ldr r5, [%[a], r4]\n\t"
  89361. #ifdef WOLFSSL_KEIL
  89362. "sbcs r5, r5, r6\n\t"
  89363. #elif defined(__clang__)
  89364. "sbcs r5, r6\n\t"
  89365. #else
  89366. "sbc r5, r6\n\t"
  89367. #endif
  89368. "stm %[a]!, {r5}\n\t"
  89369. "ldm %[m]!, {r6}\n\t"
  89370. #ifdef WOLFSSL_KEIL
  89371. "ands r6, r6, r7\n\t"
  89372. #elif defined(__clang__)
  89373. "ands r6, r7\n\t"
  89374. #else
  89375. "and r6, r7\n\t"
  89376. #endif
  89377. "ldr r5, [%[a], r4]\n\t"
  89378. #ifdef WOLFSSL_KEIL
  89379. "sbcs r5, r5, r6\n\t"
  89380. #elif defined(__clang__)
  89381. "sbcs r5, r6\n\t"
  89382. #else
  89383. "sbc r5, r6\n\t"
  89384. #endif
  89385. "stm %[a]!, {r5}\n\t"
  89386. "ldm %[m]!, {r6}\n\t"
  89387. #ifdef WOLFSSL_KEIL
  89388. "ands r6, r6, r7\n\t"
  89389. #elif defined(__clang__)
  89390. "ands r6, r7\n\t"
  89391. #else
  89392. "and r6, r7\n\t"
  89393. #endif
  89394. "ldr r5, [%[a], r4]\n\t"
  89395. #ifdef WOLFSSL_KEIL
  89396. "sbcs r5, r5, r6\n\t"
  89397. #elif defined(__clang__)
  89398. "sbcs r5, r6\n\t"
  89399. #else
  89400. "sbc r5, r6\n\t"
  89401. #endif
  89402. "stm %[a]!, {r5}\n\t"
  89403. "ldm %[m]!, {r6}\n\t"
  89404. #ifdef WOLFSSL_KEIL
  89405. "ands r6, r6, r7\n\t"
  89406. #elif defined(__clang__)
  89407. "ands r6, r7\n\t"
  89408. #else
  89409. "and r6, r7\n\t"
  89410. #endif
  89411. "ldr r5, [%[a], r4]\n\t"
  89412. #ifdef WOLFSSL_KEIL
  89413. "sbcs r5, r5, r6\n\t"
  89414. #elif defined(__clang__)
  89415. "sbcs r5, r6\n\t"
  89416. #else
  89417. "sbc r5, r6\n\t"
  89418. #endif
  89419. "stm %[a]!, {r5}\n\t"
  89420. "ldm %[m]!, {r6}\n\t"
  89421. #ifdef WOLFSSL_KEIL
  89422. "ands r6, r6, r7\n\t"
  89423. #elif defined(__clang__)
  89424. "ands r6, r7\n\t"
  89425. #else
  89426. "and r6, r7\n\t"
  89427. #endif
  89428. "ldr r5, [%[a], r4]\n\t"
  89429. #ifdef WOLFSSL_KEIL
  89430. "sbcs r5, r5, r6\n\t"
  89431. #elif defined(__clang__)
  89432. "sbcs r5, r6\n\t"
  89433. #else
  89434. "sbc r5, r6\n\t"
  89435. #endif
  89436. "stm %[a]!, {r5}\n\t"
  89437. "ldm %[m]!, {r6}\n\t"
  89438. #ifdef WOLFSSL_KEIL
  89439. "ands r6, r6, r7\n\t"
  89440. #elif defined(__clang__)
  89441. "ands r6, r7\n\t"
  89442. #else
  89443. "and r6, r7\n\t"
  89444. #endif
  89445. "ldr r5, [%[a], r4]\n\t"
  89446. #ifdef WOLFSSL_KEIL
  89447. "sbcs r5, r5, r6\n\t"
  89448. #elif defined(__clang__)
  89449. "sbcs r5, r6\n\t"
  89450. #else
  89451. "sbc r5, r6\n\t"
  89452. #endif
  89453. "stm %[a]!, {r5}\n\t"
  89454. "ldm %[m]!, {r6}\n\t"
  89455. #ifdef WOLFSSL_KEIL
  89456. "ands r6, r6, r7\n\t"
  89457. #elif defined(__clang__)
  89458. "ands r6, r7\n\t"
  89459. #else
  89460. "and r6, r7\n\t"
  89461. #endif
  89462. "ldr r5, [%[a], r4]\n\t"
  89463. #ifdef WOLFSSL_KEIL
  89464. "sbcs r5, r5, r6\n\t"
  89465. #elif defined(__clang__)
  89466. "sbcs r5, r6\n\t"
  89467. #else
  89468. "sbc r5, r6\n\t"
  89469. #endif
  89470. "stm %[a]!, {r5}\n\t"
  89471. "ldm %[m]!, {r6}\n\t"
  89472. #ifdef WOLFSSL_KEIL
  89473. "ands r6, r6, r7\n\t"
  89474. #elif defined(__clang__)
  89475. "ands r6, r7\n\t"
  89476. #else
  89477. "and r6, r7\n\t"
  89478. #endif
  89479. "ldr r5, [%[a], r4]\n\t"
  89480. #ifdef WOLFSSL_KEIL
  89481. "sbcs r5, r5, r6\n\t"
  89482. #elif defined(__clang__)
  89483. "sbcs r5, r6\n\t"
  89484. #else
  89485. "sbc r5, r6\n\t"
  89486. #endif
  89487. "stm %[a]!, {r5}\n\t"
  89488. "ldm %[m]!, {r6}\n\t"
  89489. #ifdef WOLFSSL_KEIL
  89490. "ands r6, r6, r7\n\t"
  89491. #elif defined(__clang__)
  89492. "ands r6, r7\n\t"
  89493. #else
  89494. "and r6, r7\n\t"
  89495. #endif
  89496. "ldr r5, [%[a], r4]\n\t"
  89497. #ifdef WOLFSSL_KEIL
  89498. "sbcs r5, r5, r6\n\t"
  89499. #elif defined(__clang__)
  89500. "sbcs r5, r6\n\t"
  89501. #else
  89502. "sbc r5, r6\n\t"
  89503. #endif
  89504. "stm %[a]!, {r5}\n\t"
  89505. "ldm %[m]!, {r6}\n\t"
  89506. #ifdef WOLFSSL_KEIL
  89507. "ands r6, r6, r7\n\t"
  89508. #elif defined(__clang__)
  89509. "ands r6, r7\n\t"
  89510. #else
  89511. "and r6, r7\n\t"
  89512. #endif
  89513. "ldr r5, [%[a], r4]\n\t"
  89514. #ifdef WOLFSSL_KEIL
  89515. "sbcs r5, r5, r6\n\t"
  89516. #elif defined(__clang__)
  89517. "sbcs r5, r6\n\t"
  89518. #else
  89519. "sbc r5, r6\n\t"
  89520. #endif
  89521. "stm %[a]!, {r5}\n\t"
  89522. "ldm %[m]!, {r6}\n\t"
  89523. #ifdef WOLFSSL_KEIL
  89524. "ands r6, r6, r7\n\t"
  89525. #elif defined(__clang__)
  89526. "ands r6, r7\n\t"
  89527. #else
  89528. "and r6, r7\n\t"
  89529. #endif
  89530. "ldr r5, [%[a], r4]\n\t"
  89531. #ifdef WOLFSSL_KEIL
  89532. "sbcs r5, r5, r6\n\t"
  89533. #elif defined(__clang__)
  89534. "sbcs r5, r6\n\t"
  89535. #else
  89536. "sbc r5, r6\n\t"
  89537. #endif
  89538. "stm %[a]!, {r5}\n\t"
  89539. "ldm %[m]!, {r6}\n\t"
  89540. #ifdef WOLFSSL_KEIL
  89541. "ands r6, r6, r7\n\t"
  89542. #elif defined(__clang__)
  89543. "ands r6, r7\n\t"
  89544. #else
  89545. "and r6, r7\n\t"
  89546. #endif
  89547. "ldr r5, [%[a], r4]\n\t"
  89548. #ifdef WOLFSSL_KEIL
  89549. "sbcs r5, r5, r6\n\t"
  89550. #elif defined(__clang__)
  89551. "sbcs r5, r6\n\t"
  89552. #else
  89553. "sbc r5, r6\n\t"
  89554. #endif
  89555. "stm %[a]!, {r5}\n\t"
  89556. "ldm %[m]!, {r6}\n\t"
  89557. #ifdef WOLFSSL_KEIL
  89558. "ands r6, r6, r7\n\t"
  89559. #elif defined(__clang__)
  89560. "ands r6, r7\n\t"
  89561. #else
  89562. "and r6, r7\n\t"
  89563. #endif
  89564. "ldr r5, [%[a], r4]\n\t"
  89565. #ifdef WOLFSSL_KEIL
  89566. "sbcs r5, r5, r6\n\t"
  89567. #elif defined(__clang__)
  89568. "sbcs r5, r6\n\t"
  89569. #else
  89570. "sbc r5, r6\n\t"
  89571. #endif
  89572. "stm %[a]!, {r5}\n\t"
  89573. "ldm %[m]!, {r6}\n\t"
  89574. #ifdef WOLFSSL_KEIL
  89575. "ands r6, r6, r7\n\t"
  89576. #elif defined(__clang__)
  89577. "ands r6, r7\n\t"
  89578. #else
  89579. "and r6, r7\n\t"
  89580. #endif
  89581. "ldr r5, [%[a], r4]\n\t"
  89582. #ifdef WOLFSSL_KEIL
  89583. "sbcs r5, r5, r6\n\t"
  89584. #elif defined(__clang__)
  89585. "sbcs r5, r6\n\t"
  89586. #else
  89587. "sbc r5, r6\n\t"
  89588. #endif
  89589. "stm %[a]!, {r5}\n\t"
  89590. "ldm %[m]!, {r6}\n\t"
  89591. #ifdef WOLFSSL_KEIL
  89592. "ands r6, r6, r7\n\t"
  89593. #elif defined(__clang__)
  89594. "ands r6, r7\n\t"
  89595. #else
  89596. "and r6, r7\n\t"
  89597. #endif
  89598. "ldr r5, [%[a], r4]\n\t"
  89599. #ifdef WOLFSSL_KEIL
  89600. "sbcs r5, r5, r6\n\t"
  89601. #elif defined(__clang__)
  89602. "sbcs r5, r6\n\t"
  89603. #else
  89604. "sbc r5, r6\n\t"
  89605. #endif
  89606. "stm %[a]!, {r5}\n\t"
  89607. "ldm %[m]!, {r6}\n\t"
  89608. #ifdef WOLFSSL_KEIL
  89609. "ands r6, r6, r7\n\t"
  89610. #elif defined(__clang__)
  89611. "ands r6, r7\n\t"
  89612. #else
  89613. "and r6, r7\n\t"
  89614. #endif
  89615. "ldr r5, [%[a], r4]\n\t"
  89616. #ifdef WOLFSSL_KEIL
  89617. "sbcs r5, r5, r6\n\t"
  89618. #elif defined(__clang__)
  89619. "sbcs r5, r6\n\t"
  89620. #else
  89621. "sbc r5, r6\n\t"
  89622. #endif
  89623. "stm %[a]!, {r5}\n\t"
  89624. "ldm %[m]!, {r6}\n\t"
  89625. #ifdef WOLFSSL_KEIL
  89626. "ands r6, r6, r7\n\t"
  89627. #elif defined(__clang__)
  89628. "ands r6, r7\n\t"
  89629. #else
  89630. "and r6, r7\n\t"
  89631. #endif
  89632. "ldr r5, [%[a], r4]\n\t"
  89633. #ifdef WOLFSSL_KEIL
  89634. "sbcs r5, r5, r6\n\t"
  89635. #elif defined(__clang__)
  89636. "sbcs r5, r6\n\t"
  89637. #else
  89638. "sbc r5, r6\n\t"
  89639. #endif
  89640. "stm %[a]!, {r5}\n\t"
  89641. "ldm %[m]!, {r6}\n\t"
  89642. #ifdef WOLFSSL_KEIL
  89643. "ands r6, r6, r7\n\t"
  89644. #elif defined(__clang__)
  89645. "ands r6, r7\n\t"
  89646. #else
  89647. "and r6, r7\n\t"
  89648. #endif
  89649. "ldr r5, [%[a], r4]\n\t"
  89650. #ifdef WOLFSSL_KEIL
  89651. "sbcs r5, r5, r6\n\t"
  89652. #elif defined(__clang__)
  89653. "sbcs r5, r6\n\t"
  89654. #else
  89655. "sbc r5, r6\n\t"
  89656. #endif
  89657. "stm %[a]!, {r5}\n\t"
  89658. "ldm %[m]!, {r6}\n\t"
  89659. #ifdef WOLFSSL_KEIL
  89660. "ands r6, r6, r7\n\t"
  89661. #elif defined(__clang__)
  89662. "ands r6, r7\n\t"
  89663. #else
  89664. "and r6, r7\n\t"
  89665. #endif
  89666. "ldr r5, [%[a], r4]\n\t"
  89667. #ifdef WOLFSSL_KEIL
  89668. "sbcs r5, r5, r6\n\t"
  89669. #elif defined(__clang__)
  89670. "sbcs r5, r6\n\t"
  89671. #else
  89672. "sbc r5, r6\n\t"
  89673. #endif
  89674. "stm %[a]!, {r5}\n\t"
  89675. "ldm %[m]!, {r6}\n\t"
  89676. #ifdef WOLFSSL_KEIL
  89677. "ands r6, r6, r7\n\t"
  89678. #elif defined(__clang__)
  89679. "ands r6, r7\n\t"
  89680. #else
  89681. "and r6, r7\n\t"
  89682. #endif
  89683. "ldr r5, [%[a], r4]\n\t"
  89684. #ifdef WOLFSSL_KEIL
  89685. "sbcs r5, r5, r6\n\t"
  89686. #elif defined(__clang__)
  89687. "sbcs r5, r6\n\t"
  89688. #else
  89689. "sbc r5, r6\n\t"
  89690. #endif
  89691. "stm %[a]!, {r5}\n\t"
  89692. #endif /* WOLFSSL_SP_LARGE_CODE */
  89693. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  89694. :
  89695. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  89696. );
  89697. }
  89698. /* Multiply two Montgomery form numbers mod the modulus (prime).
  89699. * (r = a * b mod m)
  89700. *
  89701. * r Result of multiplication.
  89702. * a First number to multiply in Montgomery form.
  89703. * b Second number to multiply in Montgomery form.
  89704. * m Modulus (prime).
  89705. * mp Montgomery mulitplier.
  89706. */
  89707. SP_NOINLINE static void sp_4096_mont_mul_128(sp_digit* r, const sp_digit* a,
  89708. const sp_digit* b, const sp_digit* m, sp_digit mp)
  89709. {
  89710. sp_4096_mul_128(r, a, b);
  89711. sp_4096_mont_reduce_128(r, m, mp);
  89712. }
  89713. /* Square the Montgomery form number. (r = a * a mod m)
  89714. *
  89715. * r Result of squaring.
  89716. * a Number to square in Montgomery form.
  89717. * m Modulus (prime).
  89718. * mp Montgomery mulitplier.
  89719. */
  89720. SP_NOINLINE static void sp_4096_mont_sqr_128(sp_digit* r, const sp_digit* a,
  89721. const sp_digit* m, sp_digit mp)
  89722. {
  89723. sp_4096_sqr_128(r, a);
  89724. sp_4096_mont_reduce_128(r, m, mp);
  89725. }
  89726. #ifdef WOLFSSL_SP_SMALL
  89727. /* Sub b from a into r. (r = a - b)
  89728. *
  89729. * r A single precision integer.
  89730. * a A single precision integer.
  89731. * b A single precision integer.
  89732. */
  89733. SP_NOINLINE static sp_digit sp_4096_sub_128(sp_digit* r, const sp_digit* a,
  89734. const sp_digit* b)
  89735. {
  89736. __asm__ __volatile__ (
  89737. "movs r6, %[a]\n\t"
  89738. "movs r3, #0\n\t"
  89739. "movs r5, #2\n\t"
  89740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89741. "lsls r5, r5, #8\n\t"
  89742. #else
  89743. "lsl r5, r5, #8\n\t"
  89744. #endif
  89745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89746. "adds r6, r6, r5\n\t"
  89747. #else
  89748. "add r6, r6, r5\n\t"
  89749. #endif
  89750. "\n"
  89751. "L_sp_4096_sub_128_word_%=:\n\t"
  89752. "movs r5, #0\n\t"
  89753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89754. "subs r5, r5, r3\n\t"
  89755. #else
  89756. "sub r5, r5, r3\n\t"
  89757. #endif
  89758. "ldr r4, [%[a]]\n\t"
  89759. "ldr r5, [%[b]]\n\t"
  89760. #ifdef WOLFSSL_KEIL
  89761. "sbcs r4, r4, r5\n\t"
  89762. #elif defined(__clang__)
  89763. "sbcs r4, r5\n\t"
  89764. #else
  89765. "sbc r4, r5\n\t"
  89766. #endif
  89767. "str r4, [%[r]]\n\t"
  89768. #ifdef WOLFSSL_KEIL
  89769. "sbcs r3, r3, r3\n\t"
  89770. #elif defined(__clang__)
  89771. "sbcs r3, r3\n\t"
  89772. #else
  89773. "sbc r3, r3\n\t"
  89774. #endif
  89775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89776. "adds %[a], %[a], #4\n\t"
  89777. #else
  89778. "add %[a], %[a], #4\n\t"
  89779. #endif
  89780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89781. "adds %[b], %[b], #4\n\t"
  89782. #else
  89783. "add %[b], %[b], #4\n\t"
  89784. #endif
  89785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89786. "adds %[r], %[r], #4\n\t"
  89787. #else
  89788. "add %[r], %[r], #4\n\t"
  89789. #endif
  89790. "cmp %[a], r6\n\t"
  89791. "bne L_sp_4096_sub_128_word_%=\n\t"
  89792. "movs %[r], r3\n\t"
  89793. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  89794. :
  89795. : "memory", "r3", "r4", "r5", "r6"
  89796. );
  89797. return (uint32_t)(size_t)r;
  89798. }
  89799. #else
  89800. /* Sub b from a into r. (r = a - b)
  89801. *
  89802. * r A single precision integer.
  89803. * a A single precision integer.
  89804. * b A single precision integer.
  89805. */
  89806. SP_NOINLINE static sp_digit sp_4096_sub_128(sp_digit* r, const sp_digit* a,
  89807. const sp_digit* b)
  89808. {
  89809. __asm__ __volatile__ (
  89810. "ldm %[b]!, {r5, r6}\n\t"
  89811. "ldm %[a]!, {r3, r4}\n\t"
  89812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  89813. "subs r3, r3, r5\n\t"
  89814. #else
  89815. "sub r3, r3, r5\n\t"
  89816. #endif
  89817. #ifdef WOLFSSL_KEIL
  89818. "sbcs r4, r4, r6\n\t"
  89819. #elif defined(__clang__)
  89820. "sbcs r4, r6\n\t"
  89821. #else
  89822. "sbc r4, r6\n\t"
  89823. #endif
  89824. "stm %[r]!, {r3, r4}\n\t"
  89825. "ldm %[b]!, {r5, r6}\n\t"
  89826. "ldm %[a]!, {r3, r4}\n\t"
  89827. #ifdef WOLFSSL_KEIL
  89828. "sbcs r3, r3, r5\n\t"
  89829. #elif defined(__clang__)
  89830. "sbcs r3, r5\n\t"
  89831. #else
  89832. "sbc r3, r5\n\t"
  89833. #endif
  89834. #ifdef WOLFSSL_KEIL
  89835. "sbcs r4, r4, r6\n\t"
  89836. #elif defined(__clang__)
  89837. "sbcs r4, r6\n\t"
  89838. #else
  89839. "sbc r4, r6\n\t"
  89840. #endif
  89841. "stm %[r]!, {r3, r4}\n\t"
  89842. "ldm %[b]!, {r5, r6}\n\t"
  89843. "ldm %[a]!, {r3, r4}\n\t"
  89844. #ifdef WOLFSSL_KEIL
  89845. "sbcs r3, r3, r5\n\t"
  89846. #elif defined(__clang__)
  89847. "sbcs r3, r5\n\t"
  89848. #else
  89849. "sbc r3, r5\n\t"
  89850. #endif
  89851. #ifdef WOLFSSL_KEIL
  89852. "sbcs r4, r4, r6\n\t"
  89853. #elif defined(__clang__)
  89854. "sbcs r4, r6\n\t"
  89855. #else
  89856. "sbc r4, r6\n\t"
  89857. #endif
  89858. "stm %[r]!, {r3, r4}\n\t"
  89859. "ldm %[b]!, {r5, r6}\n\t"
  89860. "ldm %[a]!, {r3, r4}\n\t"
  89861. #ifdef WOLFSSL_KEIL
  89862. "sbcs r3, r3, r5\n\t"
  89863. #elif defined(__clang__)
  89864. "sbcs r3, r5\n\t"
  89865. #else
  89866. "sbc r3, r5\n\t"
  89867. #endif
  89868. #ifdef WOLFSSL_KEIL
  89869. "sbcs r4, r4, r6\n\t"
  89870. #elif defined(__clang__)
  89871. "sbcs r4, r6\n\t"
  89872. #else
  89873. "sbc r4, r6\n\t"
  89874. #endif
  89875. "stm %[r]!, {r3, r4}\n\t"
  89876. "ldm %[b]!, {r5, r6}\n\t"
  89877. "ldm %[a]!, {r3, r4}\n\t"
  89878. #ifdef WOLFSSL_KEIL
  89879. "sbcs r3, r3, r5\n\t"
  89880. #elif defined(__clang__)
  89881. "sbcs r3, r5\n\t"
  89882. #else
  89883. "sbc r3, r5\n\t"
  89884. #endif
  89885. #ifdef WOLFSSL_KEIL
  89886. "sbcs r4, r4, r6\n\t"
  89887. #elif defined(__clang__)
  89888. "sbcs r4, r6\n\t"
  89889. #else
  89890. "sbc r4, r6\n\t"
  89891. #endif
  89892. "stm %[r]!, {r3, r4}\n\t"
  89893. "ldm %[b]!, {r5, r6}\n\t"
  89894. "ldm %[a]!, {r3, r4}\n\t"
  89895. #ifdef WOLFSSL_KEIL
  89896. "sbcs r3, r3, r5\n\t"
  89897. #elif defined(__clang__)
  89898. "sbcs r3, r5\n\t"
  89899. #else
  89900. "sbc r3, r5\n\t"
  89901. #endif
  89902. #ifdef WOLFSSL_KEIL
  89903. "sbcs r4, r4, r6\n\t"
  89904. #elif defined(__clang__)
  89905. "sbcs r4, r6\n\t"
  89906. #else
  89907. "sbc r4, r6\n\t"
  89908. #endif
  89909. "stm %[r]!, {r3, r4}\n\t"
  89910. "ldm %[b]!, {r5, r6}\n\t"
  89911. "ldm %[a]!, {r3, r4}\n\t"
  89912. #ifdef WOLFSSL_KEIL
  89913. "sbcs r3, r3, r5\n\t"
  89914. #elif defined(__clang__)
  89915. "sbcs r3, r5\n\t"
  89916. #else
  89917. "sbc r3, r5\n\t"
  89918. #endif
  89919. #ifdef WOLFSSL_KEIL
  89920. "sbcs r4, r4, r6\n\t"
  89921. #elif defined(__clang__)
  89922. "sbcs r4, r6\n\t"
  89923. #else
  89924. "sbc r4, r6\n\t"
  89925. #endif
  89926. "stm %[r]!, {r3, r4}\n\t"
  89927. "ldm %[b]!, {r5, r6}\n\t"
  89928. "ldm %[a]!, {r3, r4}\n\t"
  89929. #ifdef WOLFSSL_KEIL
  89930. "sbcs r3, r3, r5\n\t"
  89931. #elif defined(__clang__)
  89932. "sbcs r3, r5\n\t"
  89933. #else
  89934. "sbc r3, r5\n\t"
  89935. #endif
  89936. #ifdef WOLFSSL_KEIL
  89937. "sbcs r4, r4, r6\n\t"
  89938. #elif defined(__clang__)
  89939. "sbcs r4, r6\n\t"
  89940. #else
  89941. "sbc r4, r6\n\t"
  89942. #endif
  89943. "stm %[r]!, {r3, r4}\n\t"
  89944. "ldm %[b]!, {r5, r6}\n\t"
  89945. "ldm %[a]!, {r3, r4}\n\t"
  89946. #ifdef WOLFSSL_KEIL
  89947. "sbcs r3, r3, r5\n\t"
  89948. #elif defined(__clang__)
  89949. "sbcs r3, r5\n\t"
  89950. #else
  89951. "sbc r3, r5\n\t"
  89952. #endif
  89953. #ifdef WOLFSSL_KEIL
  89954. "sbcs r4, r4, r6\n\t"
  89955. #elif defined(__clang__)
  89956. "sbcs r4, r6\n\t"
  89957. #else
  89958. "sbc r4, r6\n\t"
  89959. #endif
  89960. "stm %[r]!, {r3, r4}\n\t"
  89961. "ldm %[b]!, {r5, r6}\n\t"
  89962. "ldm %[a]!, {r3, r4}\n\t"
  89963. #ifdef WOLFSSL_KEIL
  89964. "sbcs r3, r3, r5\n\t"
  89965. #elif defined(__clang__)
  89966. "sbcs r3, r5\n\t"
  89967. #else
  89968. "sbc r3, r5\n\t"
  89969. #endif
  89970. #ifdef WOLFSSL_KEIL
  89971. "sbcs r4, r4, r6\n\t"
  89972. #elif defined(__clang__)
  89973. "sbcs r4, r6\n\t"
  89974. #else
  89975. "sbc r4, r6\n\t"
  89976. #endif
  89977. "stm %[r]!, {r3, r4}\n\t"
  89978. "ldm %[b]!, {r5, r6}\n\t"
  89979. "ldm %[a]!, {r3, r4}\n\t"
  89980. #ifdef WOLFSSL_KEIL
  89981. "sbcs r3, r3, r5\n\t"
  89982. #elif defined(__clang__)
  89983. "sbcs r3, r5\n\t"
  89984. #else
  89985. "sbc r3, r5\n\t"
  89986. #endif
  89987. #ifdef WOLFSSL_KEIL
  89988. "sbcs r4, r4, r6\n\t"
  89989. #elif defined(__clang__)
  89990. "sbcs r4, r6\n\t"
  89991. #else
  89992. "sbc r4, r6\n\t"
  89993. #endif
  89994. "stm %[r]!, {r3, r4}\n\t"
  89995. "ldm %[b]!, {r5, r6}\n\t"
  89996. "ldm %[a]!, {r3, r4}\n\t"
  89997. #ifdef WOLFSSL_KEIL
  89998. "sbcs r3, r3, r5\n\t"
  89999. #elif defined(__clang__)
  90000. "sbcs r3, r5\n\t"
  90001. #else
  90002. "sbc r3, r5\n\t"
  90003. #endif
  90004. #ifdef WOLFSSL_KEIL
  90005. "sbcs r4, r4, r6\n\t"
  90006. #elif defined(__clang__)
  90007. "sbcs r4, r6\n\t"
  90008. #else
  90009. "sbc r4, r6\n\t"
  90010. #endif
  90011. "stm %[r]!, {r3, r4}\n\t"
  90012. "ldm %[b]!, {r5, r6}\n\t"
  90013. "ldm %[a]!, {r3, r4}\n\t"
  90014. #ifdef WOLFSSL_KEIL
  90015. "sbcs r3, r3, r5\n\t"
  90016. #elif defined(__clang__)
  90017. "sbcs r3, r5\n\t"
  90018. #else
  90019. "sbc r3, r5\n\t"
  90020. #endif
  90021. #ifdef WOLFSSL_KEIL
  90022. "sbcs r4, r4, r6\n\t"
  90023. #elif defined(__clang__)
  90024. "sbcs r4, r6\n\t"
  90025. #else
  90026. "sbc r4, r6\n\t"
  90027. #endif
  90028. "stm %[r]!, {r3, r4}\n\t"
  90029. "ldm %[b]!, {r5, r6}\n\t"
  90030. "ldm %[a]!, {r3, r4}\n\t"
  90031. #ifdef WOLFSSL_KEIL
  90032. "sbcs r3, r3, r5\n\t"
  90033. #elif defined(__clang__)
  90034. "sbcs r3, r5\n\t"
  90035. #else
  90036. "sbc r3, r5\n\t"
  90037. #endif
  90038. #ifdef WOLFSSL_KEIL
  90039. "sbcs r4, r4, r6\n\t"
  90040. #elif defined(__clang__)
  90041. "sbcs r4, r6\n\t"
  90042. #else
  90043. "sbc r4, r6\n\t"
  90044. #endif
  90045. "stm %[r]!, {r3, r4}\n\t"
  90046. "ldm %[b]!, {r5, r6}\n\t"
  90047. "ldm %[a]!, {r3, r4}\n\t"
  90048. #ifdef WOLFSSL_KEIL
  90049. "sbcs r3, r3, r5\n\t"
  90050. #elif defined(__clang__)
  90051. "sbcs r3, r5\n\t"
  90052. #else
  90053. "sbc r3, r5\n\t"
  90054. #endif
  90055. #ifdef WOLFSSL_KEIL
  90056. "sbcs r4, r4, r6\n\t"
  90057. #elif defined(__clang__)
  90058. "sbcs r4, r6\n\t"
  90059. #else
  90060. "sbc r4, r6\n\t"
  90061. #endif
  90062. "stm %[r]!, {r3, r4}\n\t"
  90063. "ldm %[b]!, {r5, r6}\n\t"
  90064. "ldm %[a]!, {r3, r4}\n\t"
  90065. #ifdef WOLFSSL_KEIL
  90066. "sbcs r3, r3, r5\n\t"
  90067. #elif defined(__clang__)
  90068. "sbcs r3, r5\n\t"
  90069. #else
  90070. "sbc r3, r5\n\t"
  90071. #endif
  90072. #ifdef WOLFSSL_KEIL
  90073. "sbcs r4, r4, r6\n\t"
  90074. #elif defined(__clang__)
  90075. "sbcs r4, r6\n\t"
  90076. #else
  90077. "sbc r4, r6\n\t"
  90078. #endif
  90079. "stm %[r]!, {r3, r4}\n\t"
  90080. "ldm %[b]!, {r5, r6}\n\t"
  90081. "ldm %[a]!, {r3, r4}\n\t"
  90082. #ifdef WOLFSSL_KEIL
  90083. "sbcs r3, r3, r5\n\t"
  90084. #elif defined(__clang__)
  90085. "sbcs r3, r5\n\t"
  90086. #else
  90087. "sbc r3, r5\n\t"
  90088. #endif
  90089. #ifdef WOLFSSL_KEIL
  90090. "sbcs r4, r4, r6\n\t"
  90091. #elif defined(__clang__)
  90092. "sbcs r4, r6\n\t"
  90093. #else
  90094. "sbc r4, r6\n\t"
  90095. #endif
  90096. "stm %[r]!, {r3, r4}\n\t"
  90097. "ldm %[b]!, {r5, r6}\n\t"
  90098. "ldm %[a]!, {r3, r4}\n\t"
  90099. #ifdef WOLFSSL_KEIL
  90100. "sbcs r3, r3, r5\n\t"
  90101. #elif defined(__clang__)
  90102. "sbcs r3, r5\n\t"
  90103. #else
  90104. "sbc r3, r5\n\t"
  90105. #endif
  90106. #ifdef WOLFSSL_KEIL
  90107. "sbcs r4, r4, r6\n\t"
  90108. #elif defined(__clang__)
  90109. "sbcs r4, r6\n\t"
  90110. #else
  90111. "sbc r4, r6\n\t"
  90112. #endif
  90113. "stm %[r]!, {r3, r4}\n\t"
  90114. "ldm %[b]!, {r5, r6}\n\t"
  90115. "ldm %[a]!, {r3, r4}\n\t"
  90116. #ifdef WOLFSSL_KEIL
  90117. "sbcs r3, r3, r5\n\t"
  90118. #elif defined(__clang__)
  90119. "sbcs r3, r5\n\t"
  90120. #else
  90121. "sbc r3, r5\n\t"
  90122. #endif
  90123. #ifdef WOLFSSL_KEIL
  90124. "sbcs r4, r4, r6\n\t"
  90125. #elif defined(__clang__)
  90126. "sbcs r4, r6\n\t"
  90127. #else
  90128. "sbc r4, r6\n\t"
  90129. #endif
  90130. "stm %[r]!, {r3, r4}\n\t"
  90131. "ldm %[b]!, {r5, r6}\n\t"
  90132. "ldm %[a]!, {r3, r4}\n\t"
  90133. #ifdef WOLFSSL_KEIL
  90134. "sbcs r3, r3, r5\n\t"
  90135. #elif defined(__clang__)
  90136. "sbcs r3, r5\n\t"
  90137. #else
  90138. "sbc r3, r5\n\t"
  90139. #endif
  90140. #ifdef WOLFSSL_KEIL
  90141. "sbcs r4, r4, r6\n\t"
  90142. #elif defined(__clang__)
  90143. "sbcs r4, r6\n\t"
  90144. #else
  90145. "sbc r4, r6\n\t"
  90146. #endif
  90147. "stm %[r]!, {r3, r4}\n\t"
  90148. "ldm %[b]!, {r5, r6}\n\t"
  90149. "ldm %[a]!, {r3, r4}\n\t"
  90150. #ifdef WOLFSSL_KEIL
  90151. "sbcs r3, r3, r5\n\t"
  90152. #elif defined(__clang__)
  90153. "sbcs r3, r5\n\t"
  90154. #else
  90155. "sbc r3, r5\n\t"
  90156. #endif
  90157. #ifdef WOLFSSL_KEIL
  90158. "sbcs r4, r4, r6\n\t"
  90159. #elif defined(__clang__)
  90160. "sbcs r4, r6\n\t"
  90161. #else
  90162. "sbc r4, r6\n\t"
  90163. #endif
  90164. "stm %[r]!, {r3, r4}\n\t"
  90165. "ldm %[b]!, {r5, r6}\n\t"
  90166. "ldm %[a]!, {r3, r4}\n\t"
  90167. #ifdef WOLFSSL_KEIL
  90168. "sbcs r3, r3, r5\n\t"
  90169. #elif defined(__clang__)
  90170. "sbcs r3, r5\n\t"
  90171. #else
  90172. "sbc r3, r5\n\t"
  90173. #endif
  90174. #ifdef WOLFSSL_KEIL
  90175. "sbcs r4, r4, r6\n\t"
  90176. #elif defined(__clang__)
  90177. "sbcs r4, r6\n\t"
  90178. #else
  90179. "sbc r4, r6\n\t"
  90180. #endif
  90181. "stm %[r]!, {r3, r4}\n\t"
  90182. "ldm %[b]!, {r5, r6}\n\t"
  90183. "ldm %[a]!, {r3, r4}\n\t"
  90184. #ifdef WOLFSSL_KEIL
  90185. "sbcs r3, r3, r5\n\t"
  90186. #elif defined(__clang__)
  90187. "sbcs r3, r5\n\t"
  90188. #else
  90189. "sbc r3, r5\n\t"
  90190. #endif
  90191. #ifdef WOLFSSL_KEIL
  90192. "sbcs r4, r4, r6\n\t"
  90193. #elif defined(__clang__)
  90194. "sbcs r4, r6\n\t"
  90195. #else
  90196. "sbc r4, r6\n\t"
  90197. #endif
  90198. "stm %[r]!, {r3, r4}\n\t"
  90199. "ldm %[b]!, {r5, r6}\n\t"
  90200. "ldm %[a]!, {r3, r4}\n\t"
  90201. #ifdef WOLFSSL_KEIL
  90202. "sbcs r3, r3, r5\n\t"
  90203. #elif defined(__clang__)
  90204. "sbcs r3, r5\n\t"
  90205. #else
  90206. "sbc r3, r5\n\t"
  90207. #endif
  90208. #ifdef WOLFSSL_KEIL
  90209. "sbcs r4, r4, r6\n\t"
  90210. #elif defined(__clang__)
  90211. "sbcs r4, r6\n\t"
  90212. #else
  90213. "sbc r4, r6\n\t"
  90214. #endif
  90215. "stm %[r]!, {r3, r4}\n\t"
  90216. "ldm %[b]!, {r5, r6}\n\t"
  90217. "ldm %[a]!, {r3, r4}\n\t"
  90218. #ifdef WOLFSSL_KEIL
  90219. "sbcs r3, r3, r5\n\t"
  90220. #elif defined(__clang__)
  90221. "sbcs r3, r5\n\t"
  90222. #else
  90223. "sbc r3, r5\n\t"
  90224. #endif
  90225. #ifdef WOLFSSL_KEIL
  90226. "sbcs r4, r4, r6\n\t"
  90227. #elif defined(__clang__)
  90228. "sbcs r4, r6\n\t"
  90229. #else
  90230. "sbc r4, r6\n\t"
  90231. #endif
  90232. "stm %[r]!, {r3, r4}\n\t"
  90233. "ldm %[b]!, {r5, r6}\n\t"
  90234. "ldm %[a]!, {r3, r4}\n\t"
  90235. #ifdef WOLFSSL_KEIL
  90236. "sbcs r3, r3, r5\n\t"
  90237. #elif defined(__clang__)
  90238. "sbcs r3, r5\n\t"
  90239. #else
  90240. "sbc r3, r5\n\t"
  90241. #endif
  90242. #ifdef WOLFSSL_KEIL
  90243. "sbcs r4, r4, r6\n\t"
  90244. #elif defined(__clang__)
  90245. "sbcs r4, r6\n\t"
  90246. #else
  90247. "sbc r4, r6\n\t"
  90248. #endif
  90249. "stm %[r]!, {r3, r4}\n\t"
  90250. "ldm %[b]!, {r5, r6}\n\t"
  90251. "ldm %[a]!, {r3, r4}\n\t"
  90252. #ifdef WOLFSSL_KEIL
  90253. "sbcs r3, r3, r5\n\t"
  90254. #elif defined(__clang__)
  90255. "sbcs r3, r5\n\t"
  90256. #else
  90257. "sbc r3, r5\n\t"
  90258. #endif
  90259. #ifdef WOLFSSL_KEIL
  90260. "sbcs r4, r4, r6\n\t"
  90261. #elif defined(__clang__)
  90262. "sbcs r4, r6\n\t"
  90263. #else
  90264. "sbc r4, r6\n\t"
  90265. #endif
  90266. "stm %[r]!, {r3, r4}\n\t"
  90267. "ldm %[b]!, {r5, r6}\n\t"
  90268. "ldm %[a]!, {r3, r4}\n\t"
  90269. #ifdef WOLFSSL_KEIL
  90270. "sbcs r3, r3, r5\n\t"
  90271. #elif defined(__clang__)
  90272. "sbcs r3, r5\n\t"
  90273. #else
  90274. "sbc r3, r5\n\t"
  90275. #endif
  90276. #ifdef WOLFSSL_KEIL
  90277. "sbcs r4, r4, r6\n\t"
  90278. #elif defined(__clang__)
  90279. "sbcs r4, r6\n\t"
  90280. #else
  90281. "sbc r4, r6\n\t"
  90282. #endif
  90283. "stm %[r]!, {r3, r4}\n\t"
  90284. "ldm %[b]!, {r5, r6}\n\t"
  90285. "ldm %[a]!, {r3, r4}\n\t"
  90286. #ifdef WOLFSSL_KEIL
  90287. "sbcs r3, r3, r5\n\t"
  90288. #elif defined(__clang__)
  90289. "sbcs r3, r5\n\t"
  90290. #else
  90291. "sbc r3, r5\n\t"
  90292. #endif
  90293. #ifdef WOLFSSL_KEIL
  90294. "sbcs r4, r4, r6\n\t"
  90295. #elif defined(__clang__)
  90296. "sbcs r4, r6\n\t"
  90297. #else
  90298. "sbc r4, r6\n\t"
  90299. #endif
  90300. "stm %[r]!, {r3, r4}\n\t"
  90301. "ldm %[b]!, {r5, r6}\n\t"
  90302. "ldm %[a]!, {r3, r4}\n\t"
  90303. #ifdef WOLFSSL_KEIL
  90304. "sbcs r3, r3, r5\n\t"
  90305. #elif defined(__clang__)
  90306. "sbcs r3, r5\n\t"
  90307. #else
  90308. "sbc r3, r5\n\t"
  90309. #endif
  90310. #ifdef WOLFSSL_KEIL
  90311. "sbcs r4, r4, r6\n\t"
  90312. #elif defined(__clang__)
  90313. "sbcs r4, r6\n\t"
  90314. #else
  90315. "sbc r4, r6\n\t"
  90316. #endif
  90317. "stm %[r]!, {r3, r4}\n\t"
  90318. "ldm %[b]!, {r5, r6}\n\t"
  90319. "ldm %[a]!, {r3, r4}\n\t"
  90320. #ifdef WOLFSSL_KEIL
  90321. "sbcs r3, r3, r5\n\t"
  90322. #elif defined(__clang__)
  90323. "sbcs r3, r5\n\t"
  90324. #else
  90325. "sbc r3, r5\n\t"
  90326. #endif
  90327. #ifdef WOLFSSL_KEIL
  90328. "sbcs r4, r4, r6\n\t"
  90329. #elif defined(__clang__)
  90330. "sbcs r4, r6\n\t"
  90331. #else
  90332. "sbc r4, r6\n\t"
  90333. #endif
  90334. "stm %[r]!, {r3, r4}\n\t"
  90335. "ldm %[b]!, {r5, r6}\n\t"
  90336. "ldm %[a]!, {r3, r4}\n\t"
  90337. #ifdef WOLFSSL_KEIL
  90338. "sbcs r3, r3, r5\n\t"
  90339. #elif defined(__clang__)
  90340. "sbcs r3, r5\n\t"
  90341. #else
  90342. "sbc r3, r5\n\t"
  90343. #endif
  90344. #ifdef WOLFSSL_KEIL
  90345. "sbcs r4, r4, r6\n\t"
  90346. #elif defined(__clang__)
  90347. "sbcs r4, r6\n\t"
  90348. #else
  90349. "sbc r4, r6\n\t"
  90350. #endif
  90351. "stm %[r]!, {r3, r4}\n\t"
  90352. "ldm %[b]!, {r5, r6}\n\t"
  90353. "ldm %[a]!, {r3, r4}\n\t"
  90354. #ifdef WOLFSSL_KEIL
  90355. "sbcs r3, r3, r5\n\t"
  90356. #elif defined(__clang__)
  90357. "sbcs r3, r5\n\t"
  90358. #else
  90359. "sbc r3, r5\n\t"
  90360. #endif
  90361. #ifdef WOLFSSL_KEIL
  90362. "sbcs r4, r4, r6\n\t"
  90363. #elif defined(__clang__)
  90364. "sbcs r4, r6\n\t"
  90365. #else
  90366. "sbc r4, r6\n\t"
  90367. #endif
  90368. "stm %[r]!, {r3, r4}\n\t"
  90369. "ldm %[b]!, {r5, r6}\n\t"
  90370. "ldm %[a]!, {r3, r4}\n\t"
  90371. #ifdef WOLFSSL_KEIL
  90372. "sbcs r3, r3, r5\n\t"
  90373. #elif defined(__clang__)
  90374. "sbcs r3, r5\n\t"
  90375. #else
  90376. "sbc r3, r5\n\t"
  90377. #endif
  90378. #ifdef WOLFSSL_KEIL
  90379. "sbcs r4, r4, r6\n\t"
  90380. #elif defined(__clang__)
  90381. "sbcs r4, r6\n\t"
  90382. #else
  90383. "sbc r4, r6\n\t"
  90384. #endif
  90385. "stm %[r]!, {r3, r4}\n\t"
  90386. "ldm %[b]!, {r5, r6}\n\t"
  90387. "ldm %[a]!, {r3, r4}\n\t"
  90388. #ifdef WOLFSSL_KEIL
  90389. "sbcs r3, r3, r5\n\t"
  90390. #elif defined(__clang__)
  90391. "sbcs r3, r5\n\t"
  90392. #else
  90393. "sbc r3, r5\n\t"
  90394. #endif
  90395. #ifdef WOLFSSL_KEIL
  90396. "sbcs r4, r4, r6\n\t"
  90397. #elif defined(__clang__)
  90398. "sbcs r4, r6\n\t"
  90399. #else
  90400. "sbc r4, r6\n\t"
  90401. #endif
  90402. "stm %[r]!, {r3, r4}\n\t"
  90403. "ldm %[b]!, {r5, r6}\n\t"
  90404. "ldm %[a]!, {r3, r4}\n\t"
  90405. #ifdef WOLFSSL_KEIL
  90406. "sbcs r3, r3, r5\n\t"
  90407. #elif defined(__clang__)
  90408. "sbcs r3, r5\n\t"
  90409. #else
  90410. "sbc r3, r5\n\t"
  90411. #endif
  90412. #ifdef WOLFSSL_KEIL
  90413. "sbcs r4, r4, r6\n\t"
  90414. #elif defined(__clang__)
  90415. "sbcs r4, r6\n\t"
  90416. #else
  90417. "sbc r4, r6\n\t"
  90418. #endif
  90419. "stm %[r]!, {r3, r4}\n\t"
  90420. "ldm %[b]!, {r5, r6}\n\t"
  90421. "ldm %[a]!, {r3, r4}\n\t"
  90422. #ifdef WOLFSSL_KEIL
  90423. "sbcs r3, r3, r5\n\t"
  90424. #elif defined(__clang__)
  90425. "sbcs r3, r5\n\t"
  90426. #else
  90427. "sbc r3, r5\n\t"
  90428. #endif
  90429. #ifdef WOLFSSL_KEIL
  90430. "sbcs r4, r4, r6\n\t"
  90431. #elif defined(__clang__)
  90432. "sbcs r4, r6\n\t"
  90433. #else
  90434. "sbc r4, r6\n\t"
  90435. #endif
  90436. "stm %[r]!, {r3, r4}\n\t"
  90437. "ldm %[b]!, {r5, r6}\n\t"
  90438. "ldm %[a]!, {r3, r4}\n\t"
  90439. #ifdef WOLFSSL_KEIL
  90440. "sbcs r3, r3, r5\n\t"
  90441. #elif defined(__clang__)
  90442. "sbcs r3, r5\n\t"
  90443. #else
  90444. "sbc r3, r5\n\t"
  90445. #endif
  90446. #ifdef WOLFSSL_KEIL
  90447. "sbcs r4, r4, r6\n\t"
  90448. #elif defined(__clang__)
  90449. "sbcs r4, r6\n\t"
  90450. #else
  90451. "sbc r4, r6\n\t"
  90452. #endif
  90453. "stm %[r]!, {r3, r4}\n\t"
  90454. "ldm %[b]!, {r5, r6}\n\t"
  90455. "ldm %[a]!, {r3, r4}\n\t"
  90456. #ifdef WOLFSSL_KEIL
  90457. "sbcs r3, r3, r5\n\t"
  90458. #elif defined(__clang__)
  90459. "sbcs r3, r5\n\t"
  90460. #else
  90461. "sbc r3, r5\n\t"
  90462. #endif
  90463. #ifdef WOLFSSL_KEIL
  90464. "sbcs r4, r4, r6\n\t"
  90465. #elif defined(__clang__)
  90466. "sbcs r4, r6\n\t"
  90467. #else
  90468. "sbc r4, r6\n\t"
  90469. #endif
  90470. "stm %[r]!, {r3, r4}\n\t"
  90471. "ldm %[b]!, {r5, r6}\n\t"
  90472. "ldm %[a]!, {r3, r4}\n\t"
  90473. #ifdef WOLFSSL_KEIL
  90474. "sbcs r3, r3, r5\n\t"
  90475. #elif defined(__clang__)
  90476. "sbcs r3, r5\n\t"
  90477. #else
  90478. "sbc r3, r5\n\t"
  90479. #endif
  90480. #ifdef WOLFSSL_KEIL
  90481. "sbcs r4, r4, r6\n\t"
  90482. #elif defined(__clang__)
  90483. "sbcs r4, r6\n\t"
  90484. #else
  90485. "sbc r4, r6\n\t"
  90486. #endif
  90487. "stm %[r]!, {r3, r4}\n\t"
  90488. "ldm %[b]!, {r5, r6}\n\t"
  90489. "ldm %[a]!, {r3, r4}\n\t"
  90490. #ifdef WOLFSSL_KEIL
  90491. "sbcs r3, r3, r5\n\t"
  90492. #elif defined(__clang__)
  90493. "sbcs r3, r5\n\t"
  90494. #else
  90495. "sbc r3, r5\n\t"
  90496. #endif
  90497. #ifdef WOLFSSL_KEIL
  90498. "sbcs r4, r4, r6\n\t"
  90499. #elif defined(__clang__)
  90500. "sbcs r4, r6\n\t"
  90501. #else
  90502. "sbc r4, r6\n\t"
  90503. #endif
  90504. "stm %[r]!, {r3, r4}\n\t"
  90505. "ldm %[b]!, {r5, r6}\n\t"
  90506. "ldm %[a]!, {r3, r4}\n\t"
  90507. #ifdef WOLFSSL_KEIL
  90508. "sbcs r3, r3, r5\n\t"
  90509. #elif defined(__clang__)
  90510. "sbcs r3, r5\n\t"
  90511. #else
  90512. "sbc r3, r5\n\t"
  90513. #endif
  90514. #ifdef WOLFSSL_KEIL
  90515. "sbcs r4, r4, r6\n\t"
  90516. #elif defined(__clang__)
  90517. "sbcs r4, r6\n\t"
  90518. #else
  90519. "sbc r4, r6\n\t"
  90520. #endif
  90521. "stm %[r]!, {r3, r4}\n\t"
  90522. "ldm %[b]!, {r5, r6}\n\t"
  90523. "ldm %[a]!, {r3, r4}\n\t"
  90524. #ifdef WOLFSSL_KEIL
  90525. "sbcs r3, r3, r5\n\t"
  90526. #elif defined(__clang__)
  90527. "sbcs r3, r5\n\t"
  90528. #else
  90529. "sbc r3, r5\n\t"
  90530. #endif
  90531. #ifdef WOLFSSL_KEIL
  90532. "sbcs r4, r4, r6\n\t"
  90533. #elif defined(__clang__)
  90534. "sbcs r4, r6\n\t"
  90535. #else
  90536. "sbc r4, r6\n\t"
  90537. #endif
  90538. "stm %[r]!, {r3, r4}\n\t"
  90539. "ldm %[b]!, {r5, r6}\n\t"
  90540. "ldm %[a]!, {r3, r4}\n\t"
  90541. #ifdef WOLFSSL_KEIL
  90542. "sbcs r3, r3, r5\n\t"
  90543. #elif defined(__clang__)
  90544. "sbcs r3, r5\n\t"
  90545. #else
  90546. "sbc r3, r5\n\t"
  90547. #endif
  90548. #ifdef WOLFSSL_KEIL
  90549. "sbcs r4, r4, r6\n\t"
  90550. #elif defined(__clang__)
  90551. "sbcs r4, r6\n\t"
  90552. #else
  90553. "sbc r4, r6\n\t"
  90554. #endif
  90555. "stm %[r]!, {r3, r4}\n\t"
  90556. "ldm %[b]!, {r5, r6}\n\t"
  90557. "ldm %[a]!, {r3, r4}\n\t"
  90558. #ifdef WOLFSSL_KEIL
  90559. "sbcs r3, r3, r5\n\t"
  90560. #elif defined(__clang__)
  90561. "sbcs r3, r5\n\t"
  90562. #else
  90563. "sbc r3, r5\n\t"
  90564. #endif
  90565. #ifdef WOLFSSL_KEIL
  90566. "sbcs r4, r4, r6\n\t"
  90567. #elif defined(__clang__)
  90568. "sbcs r4, r6\n\t"
  90569. #else
  90570. "sbc r4, r6\n\t"
  90571. #endif
  90572. "stm %[r]!, {r3, r4}\n\t"
  90573. "ldm %[b]!, {r5, r6}\n\t"
  90574. "ldm %[a]!, {r3, r4}\n\t"
  90575. #ifdef WOLFSSL_KEIL
  90576. "sbcs r3, r3, r5\n\t"
  90577. #elif defined(__clang__)
  90578. "sbcs r3, r5\n\t"
  90579. #else
  90580. "sbc r3, r5\n\t"
  90581. #endif
  90582. #ifdef WOLFSSL_KEIL
  90583. "sbcs r4, r4, r6\n\t"
  90584. #elif defined(__clang__)
  90585. "sbcs r4, r6\n\t"
  90586. #else
  90587. "sbc r4, r6\n\t"
  90588. #endif
  90589. "stm %[r]!, {r3, r4}\n\t"
  90590. "ldm %[b]!, {r5, r6}\n\t"
  90591. "ldm %[a]!, {r3, r4}\n\t"
  90592. #ifdef WOLFSSL_KEIL
  90593. "sbcs r3, r3, r5\n\t"
  90594. #elif defined(__clang__)
  90595. "sbcs r3, r5\n\t"
  90596. #else
  90597. "sbc r3, r5\n\t"
  90598. #endif
  90599. #ifdef WOLFSSL_KEIL
  90600. "sbcs r4, r4, r6\n\t"
  90601. #elif defined(__clang__)
  90602. "sbcs r4, r6\n\t"
  90603. #else
  90604. "sbc r4, r6\n\t"
  90605. #endif
  90606. "stm %[r]!, {r3, r4}\n\t"
  90607. "ldm %[b]!, {r5, r6}\n\t"
  90608. "ldm %[a]!, {r3, r4}\n\t"
  90609. #ifdef WOLFSSL_KEIL
  90610. "sbcs r3, r3, r5\n\t"
  90611. #elif defined(__clang__)
  90612. "sbcs r3, r5\n\t"
  90613. #else
  90614. "sbc r3, r5\n\t"
  90615. #endif
  90616. #ifdef WOLFSSL_KEIL
  90617. "sbcs r4, r4, r6\n\t"
  90618. #elif defined(__clang__)
  90619. "sbcs r4, r6\n\t"
  90620. #else
  90621. "sbc r4, r6\n\t"
  90622. #endif
  90623. "stm %[r]!, {r3, r4}\n\t"
  90624. "ldm %[b]!, {r5, r6}\n\t"
  90625. "ldm %[a]!, {r3, r4}\n\t"
  90626. #ifdef WOLFSSL_KEIL
  90627. "sbcs r3, r3, r5\n\t"
  90628. #elif defined(__clang__)
  90629. "sbcs r3, r5\n\t"
  90630. #else
  90631. "sbc r3, r5\n\t"
  90632. #endif
  90633. #ifdef WOLFSSL_KEIL
  90634. "sbcs r4, r4, r6\n\t"
  90635. #elif defined(__clang__)
  90636. "sbcs r4, r6\n\t"
  90637. #else
  90638. "sbc r4, r6\n\t"
  90639. #endif
  90640. "stm %[r]!, {r3, r4}\n\t"
  90641. "ldm %[b]!, {r5, r6}\n\t"
  90642. "ldm %[a]!, {r3, r4}\n\t"
  90643. #ifdef WOLFSSL_KEIL
  90644. "sbcs r3, r3, r5\n\t"
  90645. #elif defined(__clang__)
  90646. "sbcs r3, r5\n\t"
  90647. #else
  90648. "sbc r3, r5\n\t"
  90649. #endif
  90650. #ifdef WOLFSSL_KEIL
  90651. "sbcs r4, r4, r6\n\t"
  90652. #elif defined(__clang__)
  90653. "sbcs r4, r6\n\t"
  90654. #else
  90655. "sbc r4, r6\n\t"
  90656. #endif
  90657. "stm %[r]!, {r3, r4}\n\t"
  90658. "ldm %[b]!, {r5, r6}\n\t"
  90659. "ldm %[a]!, {r3, r4}\n\t"
  90660. #ifdef WOLFSSL_KEIL
  90661. "sbcs r3, r3, r5\n\t"
  90662. #elif defined(__clang__)
  90663. "sbcs r3, r5\n\t"
  90664. #else
  90665. "sbc r3, r5\n\t"
  90666. #endif
  90667. #ifdef WOLFSSL_KEIL
  90668. "sbcs r4, r4, r6\n\t"
  90669. #elif defined(__clang__)
  90670. "sbcs r4, r6\n\t"
  90671. #else
  90672. "sbc r4, r6\n\t"
  90673. #endif
  90674. "stm %[r]!, {r3, r4}\n\t"
  90675. "ldm %[b]!, {r5, r6}\n\t"
  90676. "ldm %[a]!, {r3, r4}\n\t"
  90677. #ifdef WOLFSSL_KEIL
  90678. "sbcs r3, r3, r5\n\t"
  90679. #elif defined(__clang__)
  90680. "sbcs r3, r5\n\t"
  90681. #else
  90682. "sbc r3, r5\n\t"
  90683. #endif
  90684. #ifdef WOLFSSL_KEIL
  90685. "sbcs r4, r4, r6\n\t"
  90686. #elif defined(__clang__)
  90687. "sbcs r4, r6\n\t"
  90688. #else
  90689. "sbc r4, r6\n\t"
  90690. #endif
  90691. "stm %[r]!, {r3, r4}\n\t"
  90692. "ldm %[b]!, {r5, r6}\n\t"
  90693. "ldm %[a]!, {r3, r4}\n\t"
  90694. #ifdef WOLFSSL_KEIL
  90695. "sbcs r3, r3, r5\n\t"
  90696. #elif defined(__clang__)
  90697. "sbcs r3, r5\n\t"
  90698. #else
  90699. "sbc r3, r5\n\t"
  90700. #endif
  90701. #ifdef WOLFSSL_KEIL
  90702. "sbcs r4, r4, r6\n\t"
  90703. #elif defined(__clang__)
  90704. "sbcs r4, r6\n\t"
  90705. #else
  90706. "sbc r4, r6\n\t"
  90707. #endif
  90708. "stm %[r]!, {r3, r4}\n\t"
  90709. "ldm %[b]!, {r5, r6}\n\t"
  90710. "ldm %[a]!, {r3, r4}\n\t"
  90711. #ifdef WOLFSSL_KEIL
  90712. "sbcs r3, r3, r5\n\t"
  90713. #elif defined(__clang__)
  90714. "sbcs r3, r5\n\t"
  90715. #else
  90716. "sbc r3, r5\n\t"
  90717. #endif
  90718. #ifdef WOLFSSL_KEIL
  90719. "sbcs r4, r4, r6\n\t"
  90720. #elif defined(__clang__)
  90721. "sbcs r4, r6\n\t"
  90722. #else
  90723. "sbc r4, r6\n\t"
  90724. #endif
  90725. "stm %[r]!, {r3, r4}\n\t"
  90726. "ldm %[b]!, {r5, r6}\n\t"
  90727. "ldm %[a]!, {r3, r4}\n\t"
  90728. #ifdef WOLFSSL_KEIL
  90729. "sbcs r3, r3, r5\n\t"
  90730. #elif defined(__clang__)
  90731. "sbcs r3, r5\n\t"
  90732. #else
  90733. "sbc r3, r5\n\t"
  90734. #endif
  90735. #ifdef WOLFSSL_KEIL
  90736. "sbcs r4, r4, r6\n\t"
  90737. #elif defined(__clang__)
  90738. "sbcs r4, r6\n\t"
  90739. #else
  90740. "sbc r4, r6\n\t"
  90741. #endif
  90742. "stm %[r]!, {r3, r4}\n\t"
  90743. "ldm %[b]!, {r5, r6}\n\t"
  90744. "ldm %[a]!, {r3, r4}\n\t"
  90745. #ifdef WOLFSSL_KEIL
  90746. "sbcs r3, r3, r5\n\t"
  90747. #elif defined(__clang__)
  90748. "sbcs r3, r5\n\t"
  90749. #else
  90750. "sbc r3, r5\n\t"
  90751. #endif
  90752. #ifdef WOLFSSL_KEIL
  90753. "sbcs r4, r4, r6\n\t"
  90754. #elif defined(__clang__)
  90755. "sbcs r4, r6\n\t"
  90756. #else
  90757. "sbc r4, r6\n\t"
  90758. #endif
  90759. "stm %[r]!, {r3, r4}\n\t"
  90760. "ldm %[b]!, {r5, r6}\n\t"
  90761. "ldm %[a]!, {r3, r4}\n\t"
  90762. #ifdef WOLFSSL_KEIL
  90763. "sbcs r3, r3, r5\n\t"
  90764. #elif defined(__clang__)
  90765. "sbcs r3, r5\n\t"
  90766. #else
  90767. "sbc r3, r5\n\t"
  90768. #endif
  90769. #ifdef WOLFSSL_KEIL
  90770. "sbcs r4, r4, r6\n\t"
  90771. #elif defined(__clang__)
  90772. "sbcs r4, r6\n\t"
  90773. #else
  90774. "sbc r4, r6\n\t"
  90775. #endif
  90776. "stm %[r]!, {r3, r4}\n\t"
  90777. "ldm %[b]!, {r5, r6}\n\t"
  90778. "ldm %[a]!, {r3, r4}\n\t"
  90779. #ifdef WOLFSSL_KEIL
  90780. "sbcs r3, r3, r5\n\t"
  90781. #elif defined(__clang__)
  90782. "sbcs r3, r5\n\t"
  90783. #else
  90784. "sbc r3, r5\n\t"
  90785. #endif
  90786. #ifdef WOLFSSL_KEIL
  90787. "sbcs r4, r4, r6\n\t"
  90788. #elif defined(__clang__)
  90789. "sbcs r4, r6\n\t"
  90790. #else
  90791. "sbc r4, r6\n\t"
  90792. #endif
  90793. "stm %[r]!, {r3, r4}\n\t"
  90794. "ldm %[b]!, {r5, r6}\n\t"
  90795. "ldm %[a]!, {r3, r4}\n\t"
  90796. #ifdef WOLFSSL_KEIL
  90797. "sbcs r3, r3, r5\n\t"
  90798. #elif defined(__clang__)
  90799. "sbcs r3, r5\n\t"
  90800. #else
  90801. "sbc r3, r5\n\t"
  90802. #endif
  90803. #ifdef WOLFSSL_KEIL
  90804. "sbcs r4, r4, r6\n\t"
  90805. #elif defined(__clang__)
  90806. "sbcs r4, r6\n\t"
  90807. #else
  90808. "sbc r4, r6\n\t"
  90809. #endif
  90810. "stm %[r]!, {r3, r4}\n\t"
  90811. "ldm %[b]!, {r5, r6}\n\t"
  90812. "ldm %[a]!, {r3, r4}\n\t"
  90813. #ifdef WOLFSSL_KEIL
  90814. "sbcs r3, r3, r5\n\t"
  90815. #elif defined(__clang__)
  90816. "sbcs r3, r5\n\t"
  90817. #else
  90818. "sbc r3, r5\n\t"
  90819. #endif
  90820. #ifdef WOLFSSL_KEIL
  90821. "sbcs r4, r4, r6\n\t"
  90822. #elif defined(__clang__)
  90823. "sbcs r4, r6\n\t"
  90824. #else
  90825. "sbc r4, r6\n\t"
  90826. #endif
  90827. "stm %[r]!, {r3, r4}\n\t"
  90828. "ldm %[b]!, {r5, r6}\n\t"
  90829. "ldm %[a]!, {r3, r4}\n\t"
  90830. #ifdef WOLFSSL_KEIL
  90831. "sbcs r3, r3, r5\n\t"
  90832. #elif defined(__clang__)
  90833. "sbcs r3, r5\n\t"
  90834. #else
  90835. "sbc r3, r5\n\t"
  90836. #endif
  90837. #ifdef WOLFSSL_KEIL
  90838. "sbcs r4, r4, r6\n\t"
  90839. #elif defined(__clang__)
  90840. "sbcs r4, r6\n\t"
  90841. #else
  90842. "sbc r4, r6\n\t"
  90843. #endif
  90844. "stm %[r]!, {r3, r4}\n\t"
  90845. "ldm %[b]!, {r5, r6}\n\t"
  90846. "ldm %[a]!, {r3, r4}\n\t"
  90847. #ifdef WOLFSSL_KEIL
  90848. "sbcs r3, r3, r5\n\t"
  90849. #elif defined(__clang__)
  90850. "sbcs r3, r5\n\t"
  90851. #else
  90852. "sbc r3, r5\n\t"
  90853. #endif
  90854. #ifdef WOLFSSL_KEIL
  90855. "sbcs r4, r4, r6\n\t"
  90856. #elif defined(__clang__)
  90857. "sbcs r4, r6\n\t"
  90858. #else
  90859. "sbc r4, r6\n\t"
  90860. #endif
  90861. "stm %[r]!, {r3, r4}\n\t"
  90862. "ldm %[b]!, {r5, r6}\n\t"
  90863. "ldm %[a]!, {r3, r4}\n\t"
  90864. #ifdef WOLFSSL_KEIL
  90865. "sbcs r3, r3, r5\n\t"
  90866. #elif defined(__clang__)
  90867. "sbcs r3, r5\n\t"
  90868. #else
  90869. "sbc r3, r5\n\t"
  90870. #endif
  90871. #ifdef WOLFSSL_KEIL
  90872. "sbcs r4, r4, r6\n\t"
  90873. #elif defined(__clang__)
  90874. "sbcs r4, r6\n\t"
  90875. #else
  90876. "sbc r4, r6\n\t"
  90877. #endif
  90878. "stm %[r]!, {r3, r4}\n\t"
  90879. "ldm %[b]!, {r5, r6}\n\t"
  90880. "ldm %[a]!, {r3, r4}\n\t"
  90881. #ifdef WOLFSSL_KEIL
  90882. "sbcs r3, r3, r5\n\t"
  90883. #elif defined(__clang__)
  90884. "sbcs r3, r5\n\t"
  90885. #else
  90886. "sbc r3, r5\n\t"
  90887. #endif
  90888. #ifdef WOLFSSL_KEIL
  90889. "sbcs r4, r4, r6\n\t"
  90890. #elif defined(__clang__)
  90891. "sbcs r4, r6\n\t"
  90892. #else
  90893. "sbc r4, r6\n\t"
  90894. #endif
  90895. "stm %[r]!, {r3, r4}\n\t"
  90896. #ifdef WOLFSSL_KEIL
  90897. "sbcs %[r], %[r], %[r]\n\t"
  90898. #elif defined(__clang__)
  90899. "sbcs %[r], %[r]\n\t"
  90900. #else
  90901. "sbc %[r], %[r]\n\t"
  90902. #endif
  90903. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  90904. :
  90905. : "memory", "r3", "r4", "r5", "r6"
  90906. );
  90907. return (uint32_t)(size_t)r;
  90908. }
  90909. #endif /* WOLFSSL_SP_SMALL */
  90910. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  90911. *
  90912. * d1 The high order half of the number to divide.
  90913. * d0 The low order half of the number to divide.
  90914. * div The divisor.
  90915. * returns the result of the division.
  90916. *
  90917. * Note that this is an approximate div. It may give an answer 1 larger.
  90918. */
  90919. SP_NOINLINE static sp_digit div_4096_word_128(sp_digit d1, sp_digit d0,
  90920. sp_digit div)
  90921. {
  90922. __asm__ __volatile__ (
  90923. "movs r3, #0\n\t"
  90924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90925. "lsrs r5, %[div], #1\n\t"
  90926. #else
  90927. "lsr r5, %[div], #1\n\t"
  90928. #endif
  90929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90930. "adds r5, r5, #1\n\t"
  90931. #else
  90932. "add r5, r5, #1\n\t"
  90933. #endif
  90934. "mov r8, %[d0]\n\t"
  90935. "mov r9, %[d1]\n\t"
  90936. "# Do top 32\n\t"
  90937. "movs r6, r5\n\t"
  90938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90939. "subs r6, r6, %[d1]\n\t"
  90940. #else
  90941. "sub r6, r6, %[d1]\n\t"
  90942. #endif
  90943. #ifdef WOLFSSL_KEIL
  90944. "sbcs r6, r6, r6\n\t"
  90945. #elif defined(__clang__)
  90946. "sbcs r6, r6\n\t"
  90947. #else
  90948. "sbc r6, r6\n\t"
  90949. #endif
  90950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90951. "adds r3, r3, r3\n\t"
  90952. #else
  90953. "add r3, r3, r3\n\t"
  90954. #endif
  90955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90956. "subs r3, r3, r6\n\t"
  90957. #else
  90958. "sub r3, r3, r6\n\t"
  90959. #endif
  90960. #ifdef WOLFSSL_KEIL
  90961. "ands r6, r6, r5\n\t"
  90962. #elif defined(__clang__)
  90963. "ands r6, r5\n\t"
  90964. #else
  90965. "and r6, r5\n\t"
  90966. #endif
  90967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90968. "subs %[d1], %[d1], r6\n\t"
  90969. #else
  90970. "sub %[d1], %[d1], r6\n\t"
  90971. #endif
  90972. "movs r4, #29\n\t"
  90973. "\n"
  90974. "L_div_4096_word_128_loop_%=:\n\t"
  90975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90976. "lsls %[d0], %[d0], #1\n\t"
  90977. #else
  90978. "lsl %[d0], %[d0], #1\n\t"
  90979. #endif
  90980. #ifdef WOLFSSL_KEIL
  90981. "adcs %[d1], %[d1], %[d1]\n\t"
  90982. #elif defined(__clang__)
  90983. "adcs %[d1], %[d1]\n\t"
  90984. #else
  90985. "adc %[d1], %[d1]\n\t"
  90986. #endif
  90987. "movs r6, r5\n\t"
  90988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  90989. "subs r6, r6, %[d1]\n\t"
  90990. #else
  90991. "sub r6, r6, %[d1]\n\t"
  90992. #endif
  90993. #ifdef WOLFSSL_KEIL
  90994. "sbcs r6, r6, r6\n\t"
  90995. #elif defined(__clang__)
  90996. "sbcs r6, r6\n\t"
  90997. #else
  90998. "sbc r6, r6\n\t"
  90999. #endif
  91000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91001. "adds r3, r3, r3\n\t"
  91002. #else
  91003. "add r3, r3, r3\n\t"
  91004. #endif
  91005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91006. "subs r3, r3, r6\n\t"
  91007. #else
  91008. "sub r3, r3, r6\n\t"
  91009. #endif
  91010. #ifdef WOLFSSL_KEIL
  91011. "ands r6, r6, r5\n\t"
  91012. #elif defined(__clang__)
  91013. "ands r6, r5\n\t"
  91014. #else
  91015. "and r6, r5\n\t"
  91016. #endif
  91017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91018. "subs %[d1], %[d1], r6\n\t"
  91019. #else
  91020. "sub %[d1], %[d1], r6\n\t"
  91021. #endif
  91022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91023. "subs r4, r4, #1\n\t"
  91024. #else
  91025. "sub r4, r4, #1\n\t"
  91026. #endif
  91027. "bpl L_div_4096_word_128_loop_%=\n\t"
  91028. "movs r7, #0\n\t"
  91029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91030. "adds r3, r3, r3\n\t"
  91031. #else
  91032. "add r3, r3, r3\n\t"
  91033. #endif
  91034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91035. "adds r3, r3, #1\n\t"
  91036. #else
  91037. "add r3, r3, #1\n\t"
  91038. #endif
  91039. "# r * div - Start\n\t"
  91040. "uxth %[d1], r3\n\t"
  91041. "uxth r4, %[div]\n\t"
  91042. #ifdef WOLFSSL_KEIL
  91043. "muls r4, %[d1], r4\n\t"
  91044. #elif defined(__clang__)
  91045. "muls r4, %[d1]\n\t"
  91046. #else
  91047. "mul r4, %[d1]\n\t"
  91048. #endif
  91049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91050. "lsrs r6, %[div], #16\n\t"
  91051. #else
  91052. "lsr r6, %[div], #16\n\t"
  91053. #endif
  91054. #ifdef WOLFSSL_KEIL
  91055. "muls %[d1], r6, %[d1]\n\t"
  91056. #elif defined(__clang__)
  91057. "muls %[d1], r6\n\t"
  91058. #else
  91059. "mul %[d1], r6\n\t"
  91060. #endif
  91061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91062. "lsrs r5, %[d1], #16\n\t"
  91063. #else
  91064. "lsr r5, %[d1], #16\n\t"
  91065. #endif
  91066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91067. "lsls %[d1], %[d1], #16\n\t"
  91068. #else
  91069. "lsl %[d1], %[d1], #16\n\t"
  91070. #endif
  91071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91072. "adds r4, r4, %[d1]\n\t"
  91073. #else
  91074. "add r4, r4, %[d1]\n\t"
  91075. #endif
  91076. #ifdef WOLFSSL_KEIL
  91077. "adcs r5, r5, r7\n\t"
  91078. #elif defined(__clang__)
  91079. "adcs r5, r7\n\t"
  91080. #else
  91081. "adc r5, r7\n\t"
  91082. #endif
  91083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91084. "lsrs %[d1], r3, #16\n\t"
  91085. #else
  91086. "lsr %[d1], r3, #16\n\t"
  91087. #endif
  91088. #ifdef WOLFSSL_KEIL
  91089. "muls r6, %[d1], r6\n\t"
  91090. #elif defined(__clang__)
  91091. "muls r6, %[d1]\n\t"
  91092. #else
  91093. "mul r6, %[d1]\n\t"
  91094. #endif
  91095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91096. "adds r5, r5, r6\n\t"
  91097. #else
  91098. "add r5, r5, r6\n\t"
  91099. #endif
  91100. "uxth r6, %[div]\n\t"
  91101. #ifdef WOLFSSL_KEIL
  91102. "muls %[d1], r6, %[d1]\n\t"
  91103. #elif defined(__clang__)
  91104. "muls %[d1], r6\n\t"
  91105. #else
  91106. "mul %[d1], r6\n\t"
  91107. #endif
  91108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91109. "lsrs r6, %[d1], #16\n\t"
  91110. #else
  91111. "lsr r6, %[d1], #16\n\t"
  91112. #endif
  91113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91114. "lsls %[d1], %[d1], #16\n\t"
  91115. #else
  91116. "lsl %[d1], %[d1], #16\n\t"
  91117. #endif
  91118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91119. "adds r4, r4, %[d1]\n\t"
  91120. #else
  91121. "add r4, r4, %[d1]\n\t"
  91122. #endif
  91123. #ifdef WOLFSSL_KEIL
  91124. "adcs r5, r5, r6\n\t"
  91125. #elif defined(__clang__)
  91126. "adcs r5, r6\n\t"
  91127. #else
  91128. "adc r5, r6\n\t"
  91129. #endif
  91130. "# r * div - Done\n\t"
  91131. "mov %[d1], r8\n\t"
  91132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91133. "subs %[d1], %[d1], r4\n\t"
  91134. #else
  91135. "sub %[d1], %[d1], r4\n\t"
  91136. #endif
  91137. "movs r4, %[d1]\n\t"
  91138. "mov %[d1], r9\n\t"
  91139. #ifdef WOLFSSL_KEIL
  91140. "sbcs %[d1], %[d1], r5\n\t"
  91141. #elif defined(__clang__)
  91142. "sbcs %[d1], r5\n\t"
  91143. #else
  91144. "sbc %[d1], r5\n\t"
  91145. #endif
  91146. "movs r5, %[d1]\n\t"
  91147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91148. "adds r3, r3, r5\n\t"
  91149. #else
  91150. "add r3, r3, r5\n\t"
  91151. #endif
  91152. "# r * div - Start\n\t"
  91153. "uxth %[d1], r3\n\t"
  91154. "uxth r4, %[div]\n\t"
  91155. #ifdef WOLFSSL_KEIL
  91156. "muls r4, %[d1], r4\n\t"
  91157. #elif defined(__clang__)
  91158. "muls r4, %[d1]\n\t"
  91159. #else
  91160. "mul r4, %[d1]\n\t"
  91161. #endif
  91162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91163. "lsrs r6, %[div], #16\n\t"
  91164. #else
  91165. "lsr r6, %[div], #16\n\t"
  91166. #endif
  91167. #ifdef WOLFSSL_KEIL
  91168. "muls %[d1], r6, %[d1]\n\t"
  91169. #elif defined(__clang__)
  91170. "muls %[d1], r6\n\t"
  91171. #else
  91172. "mul %[d1], r6\n\t"
  91173. #endif
  91174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91175. "lsrs r5, %[d1], #16\n\t"
  91176. #else
  91177. "lsr r5, %[d1], #16\n\t"
  91178. #endif
  91179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91180. "lsls %[d1], %[d1], #16\n\t"
  91181. #else
  91182. "lsl %[d1], %[d1], #16\n\t"
  91183. #endif
  91184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91185. "adds r4, r4, %[d1]\n\t"
  91186. #else
  91187. "add r4, r4, %[d1]\n\t"
  91188. #endif
  91189. #ifdef WOLFSSL_KEIL
  91190. "adcs r5, r5, r7\n\t"
  91191. #elif defined(__clang__)
  91192. "adcs r5, r7\n\t"
  91193. #else
  91194. "adc r5, r7\n\t"
  91195. #endif
  91196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91197. "lsrs %[d1], r3, #16\n\t"
  91198. #else
  91199. "lsr %[d1], r3, #16\n\t"
  91200. #endif
  91201. #ifdef WOLFSSL_KEIL
  91202. "muls r6, %[d1], r6\n\t"
  91203. #elif defined(__clang__)
  91204. "muls r6, %[d1]\n\t"
  91205. #else
  91206. "mul r6, %[d1]\n\t"
  91207. #endif
  91208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91209. "adds r5, r5, r6\n\t"
  91210. #else
  91211. "add r5, r5, r6\n\t"
  91212. #endif
  91213. "uxth r6, %[div]\n\t"
  91214. #ifdef WOLFSSL_KEIL
  91215. "muls %[d1], r6, %[d1]\n\t"
  91216. #elif defined(__clang__)
  91217. "muls %[d1], r6\n\t"
  91218. #else
  91219. "mul %[d1], r6\n\t"
  91220. #endif
  91221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91222. "lsrs r6, %[d1], #16\n\t"
  91223. #else
  91224. "lsr r6, %[d1], #16\n\t"
  91225. #endif
  91226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91227. "lsls %[d1], %[d1], #16\n\t"
  91228. #else
  91229. "lsl %[d1], %[d1], #16\n\t"
  91230. #endif
  91231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91232. "adds r4, r4, %[d1]\n\t"
  91233. #else
  91234. "add r4, r4, %[d1]\n\t"
  91235. #endif
  91236. #ifdef WOLFSSL_KEIL
  91237. "adcs r5, r5, r6\n\t"
  91238. #elif defined(__clang__)
  91239. "adcs r5, r6\n\t"
  91240. #else
  91241. "adc r5, r6\n\t"
  91242. #endif
  91243. "# r * div - Done\n\t"
  91244. "mov %[d1], r8\n\t"
  91245. "mov r6, r9\n\t"
  91246. #ifdef WOLFSSL_KEIL
  91247. "subs r4, %[d1], r4\n\t"
  91248. #else
  91249. #ifdef __clang__
  91250. "subs r4, %[d1], r4\n\t"
  91251. #else
  91252. "sub r4, %[d1], r4\n\t"
  91253. #endif
  91254. #endif
  91255. #ifdef WOLFSSL_KEIL
  91256. "sbcs r6, r6, r5\n\t"
  91257. #elif defined(__clang__)
  91258. "sbcs r6, r5\n\t"
  91259. #else
  91260. "sbc r6, r5\n\t"
  91261. #endif
  91262. "movs r5, r6\n\t"
  91263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91264. "adds r3, r3, r5\n\t"
  91265. #else
  91266. "add r3, r3, r5\n\t"
  91267. #endif
  91268. "# r * div - Start\n\t"
  91269. "uxth %[d1], r3\n\t"
  91270. "uxth r4, %[div]\n\t"
  91271. #ifdef WOLFSSL_KEIL
  91272. "muls r4, %[d1], r4\n\t"
  91273. #elif defined(__clang__)
  91274. "muls r4, %[d1]\n\t"
  91275. #else
  91276. "mul r4, %[d1]\n\t"
  91277. #endif
  91278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91279. "lsrs r6, %[div], #16\n\t"
  91280. #else
  91281. "lsr r6, %[div], #16\n\t"
  91282. #endif
  91283. #ifdef WOLFSSL_KEIL
  91284. "muls %[d1], r6, %[d1]\n\t"
  91285. #elif defined(__clang__)
  91286. "muls %[d1], r6\n\t"
  91287. #else
  91288. "mul %[d1], r6\n\t"
  91289. #endif
  91290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91291. "lsrs r5, %[d1], #16\n\t"
  91292. #else
  91293. "lsr r5, %[d1], #16\n\t"
  91294. #endif
  91295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91296. "lsls %[d1], %[d1], #16\n\t"
  91297. #else
  91298. "lsl %[d1], %[d1], #16\n\t"
  91299. #endif
  91300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91301. "adds r4, r4, %[d1]\n\t"
  91302. #else
  91303. "add r4, r4, %[d1]\n\t"
  91304. #endif
  91305. #ifdef WOLFSSL_KEIL
  91306. "adcs r5, r5, r7\n\t"
  91307. #elif defined(__clang__)
  91308. "adcs r5, r7\n\t"
  91309. #else
  91310. "adc r5, r7\n\t"
  91311. #endif
  91312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91313. "lsrs %[d1], r3, #16\n\t"
  91314. #else
  91315. "lsr %[d1], r3, #16\n\t"
  91316. #endif
  91317. #ifdef WOLFSSL_KEIL
  91318. "muls r6, %[d1], r6\n\t"
  91319. #elif defined(__clang__)
  91320. "muls r6, %[d1]\n\t"
  91321. #else
  91322. "mul r6, %[d1]\n\t"
  91323. #endif
  91324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91325. "adds r5, r5, r6\n\t"
  91326. #else
  91327. "add r5, r5, r6\n\t"
  91328. #endif
  91329. "uxth r6, %[div]\n\t"
  91330. #ifdef WOLFSSL_KEIL
  91331. "muls %[d1], r6, %[d1]\n\t"
  91332. #elif defined(__clang__)
  91333. "muls %[d1], r6\n\t"
  91334. #else
  91335. "mul %[d1], r6\n\t"
  91336. #endif
  91337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91338. "lsrs r6, %[d1], #16\n\t"
  91339. #else
  91340. "lsr r6, %[d1], #16\n\t"
  91341. #endif
  91342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91343. "lsls %[d1], %[d1], #16\n\t"
  91344. #else
  91345. "lsl %[d1], %[d1], #16\n\t"
  91346. #endif
  91347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91348. "adds r4, r4, %[d1]\n\t"
  91349. #else
  91350. "add r4, r4, %[d1]\n\t"
  91351. #endif
  91352. #ifdef WOLFSSL_KEIL
  91353. "adcs r5, r5, r6\n\t"
  91354. #elif defined(__clang__)
  91355. "adcs r5, r6\n\t"
  91356. #else
  91357. "adc r5, r6\n\t"
  91358. #endif
  91359. "# r * div - Done\n\t"
  91360. "mov %[d1], r8\n\t"
  91361. "mov r6, r9\n\t"
  91362. #ifdef WOLFSSL_KEIL
  91363. "subs r4, %[d1], r4\n\t"
  91364. #else
  91365. #ifdef __clang__
  91366. "subs r4, %[d1], r4\n\t"
  91367. #else
  91368. "sub r4, %[d1], r4\n\t"
  91369. #endif
  91370. #endif
  91371. #ifdef WOLFSSL_KEIL
  91372. "sbcs r6, r6, r5\n\t"
  91373. #elif defined(__clang__)
  91374. "sbcs r6, r5\n\t"
  91375. #else
  91376. "sbc r6, r5\n\t"
  91377. #endif
  91378. "movs r5, r6\n\t"
  91379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91380. "adds r3, r3, r5\n\t"
  91381. #else
  91382. "add r3, r3, r5\n\t"
  91383. #endif
  91384. "# r * div - Start\n\t"
  91385. "uxth %[d1], r3\n\t"
  91386. "uxth r4, %[div]\n\t"
  91387. #ifdef WOLFSSL_KEIL
  91388. "muls r4, %[d1], r4\n\t"
  91389. #elif defined(__clang__)
  91390. "muls r4, %[d1]\n\t"
  91391. #else
  91392. "mul r4, %[d1]\n\t"
  91393. #endif
  91394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91395. "lsrs r6, %[div], #16\n\t"
  91396. #else
  91397. "lsr r6, %[div], #16\n\t"
  91398. #endif
  91399. #ifdef WOLFSSL_KEIL
  91400. "muls %[d1], r6, %[d1]\n\t"
  91401. #elif defined(__clang__)
  91402. "muls %[d1], r6\n\t"
  91403. #else
  91404. "mul %[d1], r6\n\t"
  91405. #endif
  91406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91407. "lsrs r5, %[d1], #16\n\t"
  91408. #else
  91409. "lsr r5, %[d1], #16\n\t"
  91410. #endif
  91411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91412. "lsls %[d1], %[d1], #16\n\t"
  91413. #else
  91414. "lsl %[d1], %[d1], #16\n\t"
  91415. #endif
  91416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91417. "adds r4, r4, %[d1]\n\t"
  91418. #else
  91419. "add r4, r4, %[d1]\n\t"
  91420. #endif
  91421. #ifdef WOLFSSL_KEIL
  91422. "adcs r5, r5, r7\n\t"
  91423. #elif defined(__clang__)
  91424. "adcs r5, r7\n\t"
  91425. #else
  91426. "adc r5, r7\n\t"
  91427. #endif
  91428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91429. "lsrs %[d1], r3, #16\n\t"
  91430. #else
  91431. "lsr %[d1], r3, #16\n\t"
  91432. #endif
  91433. #ifdef WOLFSSL_KEIL
  91434. "muls r6, %[d1], r6\n\t"
  91435. #elif defined(__clang__)
  91436. "muls r6, %[d1]\n\t"
  91437. #else
  91438. "mul r6, %[d1]\n\t"
  91439. #endif
  91440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91441. "adds r5, r5, r6\n\t"
  91442. #else
  91443. "add r5, r5, r6\n\t"
  91444. #endif
  91445. "uxth r6, %[div]\n\t"
  91446. #ifdef WOLFSSL_KEIL
  91447. "muls %[d1], r6, %[d1]\n\t"
  91448. #elif defined(__clang__)
  91449. "muls %[d1], r6\n\t"
  91450. #else
  91451. "mul %[d1], r6\n\t"
  91452. #endif
  91453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91454. "lsrs r6, %[d1], #16\n\t"
  91455. #else
  91456. "lsr r6, %[d1], #16\n\t"
  91457. #endif
  91458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91459. "lsls %[d1], %[d1], #16\n\t"
  91460. #else
  91461. "lsl %[d1], %[d1], #16\n\t"
  91462. #endif
  91463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91464. "adds r4, r4, %[d1]\n\t"
  91465. #else
  91466. "add r4, r4, %[d1]\n\t"
  91467. #endif
  91468. #ifdef WOLFSSL_KEIL
  91469. "adcs r5, r5, r6\n\t"
  91470. #elif defined(__clang__)
  91471. "adcs r5, r6\n\t"
  91472. #else
  91473. "adc r5, r6\n\t"
  91474. #endif
  91475. "# r * div - Done\n\t"
  91476. "mov %[d1], r8\n\t"
  91477. "mov r6, r9\n\t"
  91478. #ifdef WOLFSSL_KEIL
  91479. "subs r4, %[d1], r4\n\t"
  91480. #else
  91481. #ifdef __clang__
  91482. "subs r4, %[d1], r4\n\t"
  91483. #else
  91484. "sub r4, %[d1], r4\n\t"
  91485. #endif
  91486. #endif
  91487. #ifdef WOLFSSL_KEIL
  91488. "sbcs r6, r6, r5\n\t"
  91489. #elif defined(__clang__)
  91490. "sbcs r6, r5\n\t"
  91491. #else
  91492. "sbc r6, r5\n\t"
  91493. #endif
  91494. "movs r5, r6\n\t"
  91495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91496. "adds r3, r3, r5\n\t"
  91497. #else
  91498. "add r3, r3, r5\n\t"
  91499. #endif
  91500. "movs r6, %[div]\n\t"
  91501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91502. "subs r6, r6, r4\n\t"
  91503. #else
  91504. "sub r6, r6, r4\n\t"
  91505. #endif
  91506. #ifdef WOLFSSL_KEIL
  91507. "sbcs r6, r6, r6\n\t"
  91508. #elif defined(__clang__)
  91509. "sbcs r6, r6\n\t"
  91510. #else
  91511. "sbc r6, r6\n\t"
  91512. #endif
  91513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91514. "subs r3, r3, r6\n\t"
  91515. #else
  91516. "sub r3, r3, r6\n\t"
  91517. #endif
  91518. "movs %[d1], r3\n\t"
  91519. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  91520. :
  91521. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  91522. );
  91523. return (uint32_t)(size_t)d1;
  91524. }
  91525. /* Divide d in a and put remainder into r (m*d + r = a)
  91526. * m is not calculated as it is not needed at this time.
  91527. *
  91528. * a Number to be divided.
  91529. * d Number to divide with.
  91530. * m Multiplier result.
  91531. * r Remainder from the division.
  91532. * returns MP_OKAY indicating success.
  91533. */
  91534. static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d, sp_digit* m,
  91535. sp_digit* r)
  91536. {
  91537. sp_digit t1[256], t2[129];
  91538. sp_digit div, r1;
  91539. int i;
  91540. (void)m;
  91541. div = d[127];
  91542. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  91543. for (i = 127; i > 0; i--) {
  91544. if (t1[i + 128] != d[i])
  91545. break;
  91546. }
  91547. if (t1[i + 128] >= d[i]) {
  91548. sp_4096_sub_in_place_128(&t1[128], d);
  91549. }
  91550. for (i = 127; i >= 0; i--) {
  91551. if (t1[128 + i] == div) {
  91552. r1 = SP_DIGIT_MAX;
  91553. }
  91554. else {
  91555. r1 = div_4096_word_128(t1[128 + i], t1[128 + i - 1], div);
  91556. }
  91557. sp_4096_mul_d_128(t2, d, r1);
  91558. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  91559. t1[128 + i] -= t2[128];
  91560. if (t1[128 + i] != 0) {
  91561. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  91562. if (t1[128 + i] != 0)
  91563. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], d);
  91564. }
  91565. }
  91566. for (i = 127; i > 0; i--) {
  91567. if (t1[i] != d[i])
  91568. break;
  91569. }
  91570. if (t1[i] >= d[i]) {
  91571. sp_4096_sub_128(r, t1, d);
  91572. }
  91573. else {
  91574. XMEMCPY(r, t1, sizeof(*t1) * 128);
  91575. }
  91576. return MP_OKAY;
  91577. }
  91578. /* Reduce a modulo m into r. (r = a mod m)
  91579. *
  91580. * r A single precision number that is the reduced result.
  91581. * a A single precision number that is to be reduced.
  91582. * m A single precision number that is the modulus to reduce with.
  91583. * returns MP_OKAY indicating success.
  91584. */
  91585. static WC_INLINE int sp_4096_mod_128_cond(sp_digit* r, const sp_digit* a, const sp_digit* m)
  91586. {
  91587. int ret;
  91588. ret = sp_4096_div_128_cond(a, m, NULL, r);
  91589. return ret;
  91590. }
  91591. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH)
  91592. /* AND m into each word of a and store in r.
  91593. *
  91594. * r A single precision integer.
  91595. * a A single precision integer.
  91596. * m Mask to AND against each digit.
  91597. */
  91598. static void sp_4096_mask_128(sp_digit* r, const sp_digit* a, sp_digit m)
  91599. {
  91600. #ifdef WOLFSSL_SP_SMALL
  91601. int i;
  91602. for (i=0; i<128; i++) {
  91603. r[i] = a[i] & m;
  91604. }
  91605. #else
  91606. int i;
  91607. for (i = 0; i < 128; i += 8) {
  91608. r[i+0] = a[i+0] & m;
  91609. r[i+1] = a[i+1] & m;
  91610. r[i+2] = a[i+2] & m;
  91611. r[i+3] = a[i+3] & m;
  91612. r[i+4] = a[i+4] & m;
  91613. r[i+5] = a[i+5] & m;
  91614. r[i+6] = a[i+6] & m;
  91615. r[i+7] = a[i+7] & m;
  91616. }
  91617. #endif
  91618. }
  91619. /* Compare a with b in constant time.
  91620. *
  91621. * a A single precision integer.
  91622. * b A single precision integer.
  91623. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  91624. * respectively.
  91625. */
  91626. SP_NOINLINE static sp_int32 sp_4096_cmp_128(const sp_digit* a,
  91627. const sp_digit* b)
  91628. {
  91629. __asm__ __volatile__ (
  91630. "movs r2, #0\n\t"
  91631. "movs r3, #0\n\t"
  91632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91633. "mvns r3, r3\n\t"
  91634. #else
  91635. "mvn r3, r3\n\t"
  91636. #endif
  91637. "movs r6, #0xff\n\t"
  91638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91639. "adds r6, r6, #0xfd\n\t"
  91640. #else
  91641. "add r6, r6, #0xfd\n\t"
  91642. #endif
  91643. "\n"
  91644. "L_sp_4096_cmp_128_words_%=:\n\t"
  91645. "ldr r7, [%[a], r6]\n\t"
  91646. "ldr r5, [%[b], r6]\n\t"
  91647. #ifdef WOLFSSL_KEIL
  91648. "ands r7, r7, r3\n\t"
  91649. #elif defined(__clang__)
  91650. "ands r7, r3\n\t"
  91651. #else
  91652. "and r7, r3\n\t"
  91653. #endif
  91654. #ifdef WOLFSSL_KEIL
  91655. "ands r5, r5, r3\n\t"
  91656. #elif defined(__clang__)
  91657. "ands r5, r3\n\t"
  91658. #else
  91659. "and r5, r3\n\t"
  91660. #endif
  91661. "movs r4, r7\n\t"
  91662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91663. "subs r7, r7, r5\n\t"
  91664. #else
  91665. "sub r7, r7, r5\n\t"
  91666. #endif
  91667. #ifdef WOLFSSL_KEIL
  91668. "sbcs r7, r7, r7\n\t"
  91669. #elif defined(__clang__)
  91670. "sbcs r7, r7\n\t"
  91671. #else
  91672. "sbc r7, r7\n\t"
  91673. #endif
  91674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91675. "adds r2, r2, r7\n\t"
  91676. #else
  91677. "add r2, r2, r7\n\t"
  91678. #endif
  91679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91680. "mvns r7, r7\n\t"
  91681. #else
  91682. "mvn r7, r7\n\t"
  91683. #endif
  91684. #ifdef WOLFSSL_KEIL
  91685. "ands r3, r3, r7\n\t"
  91686. #elif defined(__clang__)
  91687. "ands r3, r7\n\t"
  91688. #else
  91689. "and r3, r7\n\t"
  91690. #endif
  91691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91692. "subs r5, r5, r4\n\t"
  91693. #else
  91694. "sub r5, r5, r4\n\t"
  91695. #endif
  91696. #ifdef WOLFSSL_KEIL
  91697. "sbcs r7, r7, r7\n\t"
  91698. #elif defined(__clang__)
  91699. "sbcs r7, r7\n\t"
  91700. #else
  91701. "sbc r7, r7\n\t"
  91702. #endif
  91703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91704. "subs r2, r2, r7\n\t"
  91705. #else
  91706. "sub r2, r2, r7\n\t"
  91707. #endif
  91708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91709. "mvns r7, r7\n\t"
  91710. #else
  91711. "mvn r7, r7\n\t"
  91712. #endif
  91713. #ifdef WOLFSSL_KEIL
  91714. "ands r3, r3, r7\n\t"
  91715. #elif defined(__clang__)
  91716. "ands r3, r7\n\t"
  91717. #else
  91718. "and r3, r7\n\t"
  91719. #endif
  91720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  91721. "subs r6, r6, #4\n\t"
  91722. #else
  91723. "sub r6, r6, #4\n\t"
  91724. #endif
  91725. "bge L_sp_4096_cmp_128_words_%=\n\t"
  91726. "movs %[a], r2\n\t"
  91727. : [a] "+l" (a), [b] "+l" (b)
  91728. :
  91729. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  91730. );
  91731. return (uint32_t)(size_t)a;
  91732. }
  91733. /* Divide d in a and put remainder into r (m*d + r = a)
  91734. * m is not calculated as it is not needed at this time.
  91735. *
  91736. * a Number to be divided.
  91737. * d Number to divide with.
  91738. * m Multiplier result.
  91739. * r Remainder from the division.
  91740. * returns MP_OKAY indicating success.
  91741. */
  91742. static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d, sp_digit* m,
  91743. sp_digit* r)
  91744. {
  91745. sp_digit t1[256], t2[129];
  91746. sp_digit div, r1;
  91747. int i;
  91748. (void)m;
  91749. div = d[127];
  91750. XMEMCPY(t1, a, sizeof(*t1) * 2 * 128);
  91751. r1 = sp_4096_cmp_128(&t1[128], d) >= 0;
  91752. sp_4096_cond_sub_128(&t1[128], &t1[128], d, (sp_digit)0 - r1);
  91753. for (i = 127; i >= 0; i--) {
  91754. sp_digit mask = 0 - (t1[128 + i] == div);
  91755. sp_digit hi = t1[128 + i] + mask;
  91756. r1 = div_4096_word_128(hi, t1[128 + i - 1], div);
  91757. r1 |= mask;
  91758. sp_4096_mul_d_128(t2, d, r1);
  91759. t1[128 + i] += sp_4096_sub_in_place_128(&t1[i], t2);
  91760. t1[128 + i] -= t2[128];
  91761. sp_4096_mask_128(t2, d, t1[128 + i]);
  91762. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  91763. sp_4096_mask_128(t2, d, t1[128 + i]);
  91764. t1[128 + i] += sp_4096_add_128(&t1[i], &t1[i], t2);
  91765. }
  91766. r1 = sp_4096_cmp_128(t1, d) >= 0;
  91767. sp_4096_cond_sub_128(r, t1, d, (sp_digit)0 - r1);
  91768. return MP_OKAY;
  91769. }
  91770. /* Reduce a modulo m into r. (r = a mod m)
  91771. *
  91772. * r A single precision number that is the reduced result.
  91773. * a A single precision number that is to be reduced.
  91774. * m A single precision number that is the modulus to reduce with.
  91775. * returns MP_OKAY indicating success.
  91776. */
  91777. static WC_INLINE int sp_4096_mod_128(sp_digit* r, const sp_digit* a, const sp_digit* m)
  91778. {
  91779. int ret;
  91780. ret = sp_4096_div_128(a, m, NULL, r);
  91781. return ret;
  91782. }
  91783. #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \
  91784. defined(WOLFSSL_HAVE_SP_DH)
  91785. #ifdef WOLFSSL_SP_SMALL
  91786. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  91787. *
  91788. * r A single precision number that is the result of the operation.
  91789. * a A single precision number being exponentiated.
  91790. * e A single precision number that is the exponent.
  91791. * bits The number of bits in the exponent.
  91792. * m A single precision number that is the modulus.
  91793. * returns 0 on success.
  91794. * returns MEMORY_E on dynamic memory allocation failure.
  91795. * returns MP_VAL when base is even or exponent is 0.
  91796. */
  91797. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  91798. int bits, const sp_digit* m, int reduceA)
  91799. {
  91800. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91801. sp_digit* td = NULL;
  91802. #else
  91803. sp_digit td[8 * 256];
  91804. #endif
  91805. sp_digit* t[8];
  91806. sp_digit* norm = NULL;
  91807. sp_digit mp = 1;
  91808. sp_digit n;
  91809. sp_digit mask;
  91810. int i;
  91811. int c;
  91812. byte y;
  91813. int err = MP_OKAY;
  91814. if (bits == 0) {
  91815. err = MP_VAL;
  91816. }
  91817. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91818. if (err == MP_OKAY) {
  91819. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (8 * 256), NULL,
  91820. DYNAMIC_TYPE_TMP_BUFFER);
  91821. if (td == NULL)
  91822. err = MEMORY_E;
  91823. }
  91824. #endif
  91825. if (err == MP_OKAY) {
  91826. norm = td;
  91827. for (i=0; i<8; i++) {
  91828. t[i] = td + i * 256;
  91829. }
  91830. sp_4096_mont_setup(m, &mp);
  91831. sp_4096_mont_norm_128(norm, m);
  91832. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  91833. if (reduceA != 0) {
  91834. err = sp_4096_mod_128(t[1] + 128, a, m);
  91835. if (err == MP_OKAY) {
  91836. err = sp_4096_mod_128(t[1], t[1], m);
  91837. }
  91838. }
  91839. else {
  91840. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  91841. err = sp_4096_mod_128(t[1], t[1], m);
  91842. }
  91843. }
  91844. if (err == MP_OKAY) {
  91845. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  91846. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  91847. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  91848. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  91849. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  91850. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  91851. i = (bits - 1) / 32;
  91852. n = e[i--];
  91853. c = bits & 31;
  91854. if (c == 0) {
  91855. c = 32;
  91856. }
  91857. c -= bits % 3;
  91858. if (c == 32) {
  91859. c = 29;
  91860. }
  91861. if (c < 0) {
  91862. /* Number of bits in top word is less than number needed. */
  91863. c = -c;
  91864. y = (byte)(n << c);
  91865. n = e[i--];
  91866. y |= (byte)(n >> (64 - c));
  91867. n <<= c;
  91868. c = 64 - c;
  91869. }
  91870. else if (c == 0) {
  91871. /* All bits in top word used. */
  91872. y = (byte)n;
  91873. }
  91874. else {
  91875. y = (byte)(n >> c);
  91876. n <<= 32 - c;
  91877. }
  91878. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  91879. for (; i>=0 || c>=3; ) {
  91880. if (c == 0) {
  91881. n = e[i--];
  91882. y = (byte)(n >> 29);
  91883. n <<= 3;
  91884. c = 29;
  91885. }
  91886. else if (c < 3) {
  91887. y = (byte)(n >> 29);
  91888. n = e[i--];
  91889. c = 3 - c;
  91890. y |= (byte)(n >> (32 - c));
  91891. n <<= c;
  91892. c = 32 - c;
  91893. }
  91894. else {
  91895. y = (byte)((n >> 29) & 0x7);
  91896. n <<= 3;
  91897. c -= 3;
  91898. }
  91899. sp_4096_mont_sqr_128(r, r, m, mp);
  91900. sp_4096_mont_sqr_128(r, r, m, mp);
  91901. sp_4096_mont_sqr_128(r, r, m, mp);
  91902. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  91903. }
  91904. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  91905. sp_4096_mont_reduce_128(r, m, mp);
  91906. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  91907. sp_4096_cond_sub_128(r, r, m, mask);
  91908. }
  91909. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91910. if (td != NULL)
  91911. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  91912. #endif
  91913. return err;
  91914. }
  91915. #else
  91916. /* Modular exponentiate a to the e mod m. (r = a^e mod m)
  91917. *
  91918. * r A single precision number that is the result of the operation.
  91919. * a A single precision number being exponentiated.
  91920. * e A single precision number that is the exponent.
  91921. * bits The number of bits in the exponent.
  91922. * m A single precision number that is the modulus.
  91923. * returns 0 on success.
  91924. * returns MEMORY_E on dynamic memory allocation failure.
  91925. * returns MP_VAL when base is even or exponent is 0.
  91926. */
  91927. static int sp_4096_mod_exp_128(sp_digit* r, const sp_digit* a, const sp_digit* e,
  91928. int bits, const sp_digit* m, int reduceA)
  91929. {
  91930. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91931. sp_digit* td = NULL;
  91932. #else
  91933. sp_digit td[16 * 256];
  91934. #endif
  91935. sp_digit* t[16];
  91936. sp_digit* norm = NULL;
  91937. sp_digit mp = 1;
  91938. sp_digit n;
  91939. sp_digit mask;
  91940. int i;
  91941. int c;
  91942. byte y;
  91943. int err = MP_OKAY;
  91944. if (bits == 0) {
  91945. err = MP_VAL;
  91946. }
  91947. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  91948. if (err == MP_OKAY) {
  91949. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * (16 * 256), NULL,
  91950. DYNAMIC_TYPE_TMP_BUFFER);
  91951. if (td == NULL)
  91952. err = MEMORY_E;
  91953. }
  91954. #endif
  91955. if (err == MP_OKAY) {
  91956. norm = td;
  91957. for (i=0; i<16; i++) {
  91958. t[i] = td + i * 256;
  91959. }
  91960. sp_4096_mont_setup(m, &mp);
  91961. sp_4096_mont_norm_128(norm, m);
  91962. XMEMSET(t[1], 0, sizeof(sp_digit) * 128U);
  91963. if (reduceA != 0) {
  91964. err = sp_4096_mod_128(t[1] + 128, a, m);
  91965. if (err == MP_OKAY) {
  91966. err = sp_4096_mod_128(t[1], t[1], m);
  91967. }
  91968. }
  91969. else {
  91970. XMEMCPY(t[1] + 128, a, sizeof(sp_digit) * 128);
  91971. err = sp_4096_mod_128(t[1], t[1], m);
  91972. }
  91973. }
  91974. if (err == MP_OKAY) {
  91975. sp_4096_mont_sqr_128(t[ 2], t[ 1], m, mp);
  91976. sp_4096_mont_mul_128(t[ 3], t[ 2], t[ 1], m, mp);
  91977. sp_4096_mont_sqr_128(t[ 4], t[ 2], m, mp);
  91978. sp_4096_mont_mul_128(t[ 5], t[ 3], t[ 2], m, mp);
  91979. sp_4096_mont_sqr_128(t[ 6], t[ 3], m, mp);
  91980. sp_4096_mont_mul_128(t[ 7], t[ 4], t[ 3], m, mp);
  91981. sp_4096_mont_sqr_128(t[ 8], t[ 4], m, mp);
  91982. sp_4096_mont_mul_128(t[ 9], t[ 5], t[ 4], m, mp);
  91983. sp_4096_mont_sqr_128(t[10], t[ 5], m, mp);
  91984. sp_4096_mont_mul_128(t[11], t[ 6], t[ 5], m, mp);
  91985. sp_4096_mont_sqr_128(t[12], t[ 6], m, mp);
  91986. sp_4096_mont_mul_128(t[13], t[ 7], t[ 6], m, mp);
  91987. sp_4096_mont_sqr_128(t[14], t[ 7], m, mp);
  91988. sp_4096_mont_mul_128(t[15], t[ 8], t[ 7], m, mp);
  91989. i = (bits - 1) / 32;
  91990. n = e[i--];
  91991. c = bits & 31;
  91992. if (c == 0) {
  91993. c = 32;
  91994. }
  91995. c -= bits % 4;
  91996. if (c == 32) {
  91997. c = 28;
  91998. }
  91999. if (c < 0) {
  92000. /* Number of bits in top word is less than number needed. */
  92001. c = -c;
  92002. y = (byte)(n << c);
  92003. n = e[i--];
  92004. y |= (byte)(n >> (64 - c));
  92005. n <<= c;
  92006. c = 64 - c;
  92007. }
  92008. else if (c == 0) {
  92009. /* All bits in top word used. */
  92010. y = (byte)n;
  92011. }
  92012. else {
  92013. y = (byte)(n >> c);
  92014. n <<= 32 - c;
  92015. }
  92016. XMEMCPY(r, t[y], sizeof(sp_digit) * 128);
  92017. for (; i>=0 || c>=4; ) {
  92018. if (c == 0) {
  92019. n = e[i--];
  92020. y = (byte)(n >> 28);
  92021. n <<= 4;
  92022. c = 28;
  92023. }
  92024. else if (c < 4) {
  92025. y = (byte)(n >> 28);
  92026. n = e[i--];
  92027. c = 4 - c;
  92028. y |= (byte)(n >> (32 - c));
  92029. n <<= c;
  92030. c = 32 - c;
  92031. }
  92032. else {
  92033. y = (byte)((n >> 28) & 0xf);
  92034. n <<= 4;
  92035. c -= 4;
  92036. }
  92037. sp_4096_mont_sqr_128(r, r, m, mp);
  92038. sp_4096_mont_sqr_128(r, r, m, mp);
  92039. sp_4096_mont_sqr_128(r, r, m, mp);
  92040. sp_4096_mont_sqr_128(r, r, m, mp);
  92041. sp_4096_mont_mul_128(r, r, t[y], m, mp);
  92042. }
  92043. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  92044. sp_4096_mont_reduce_128(r, m, mp);
  92045. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  92046. sp_4096_cond_sub_128(r, r, m, mask);
  92047. }
  92048. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92049. if (td != NULL)
  92050. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  92051. #endif
  92052. return err;
  92053. }
  92054. #endif /* WOLFSSL_SP_SMALL */
  92055. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  92056. #endif /* (WOLFSSL_HAVE_SP_RSA && !WOLFSSL_RSA_PUBLIC_ONLY) || WOLFSSL_HAVE_SP_DH */
  92057. #ifdef WOLFSSL_HAVE_SP_RSA
  92058. /* RSA public key operation.
  92059. *
  92060. * in Array of bytes representing the number to exponentiate, base.
  92061. * inLen Number of bytes in base.
  92062. * em Public exponent.
  92063. * mm Modulus.
  92064. * out Buffer to hold big-endian bytes of exponentiation result.
  92065. * Must be at least 512 bytes long.
  92066. * outLen Number of bytes in result.
  92067. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  92068. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  92069. */
  92070. int sp_RsaPublic_4096(const byte* in, word32 inLen, const mp_int* em,
  92071. const mp_int* mm, byte* out, word32* outLen)
  92072. {
  92073. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92074. sp_digit* a = NULL;
  92075. #else
  92076. sp_digit a[128 * 5];
  92077. #endif
  92078. sp_digit* m = NULL;
  92079. sp_digit* r = NULL;
  92080. sp_digit *ah = NULL;
  92081. sp_digit e[1] = {0};
  92082. int err = MP_OKAY;
  92083. if (*outLen < 512) {
  92084. err = MP_TO_E;
  92085. }
  92086. else if (mp_count_bits(em) > 32 || inLen > 512 ||
  92087. mp_count_bits(mm) != 4096) {
  92088. err = MP_READ_E;
  92089. }
  92090. else if (mp_iseven(mm)) {
  92091. err = MP_VAL;
  92092. }
  92093. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92094. if (err == MP_OKAY) {
  92095. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 5, NULL,
  92096. DYNAMIC_TYPE_RSA);
  92097. if (a == NULL)
  92098. err = MEMORY_E;
  92099. }
  92100. #endif
  92101. if (err == MP_OKAY) {
  92102. ah = a + 128;
  92103. r = a + 128 * 2;
  92104. m = r + 128 * 2;
  92105. sp_4096_from_bin(ah, 128, in, inLen);
  92106. #if DIGIT_BIT >= 32
  92107. e[0] = em->dp[0];
  92108. #else
  92109. e[0] = em->dp[0];
  92110. if (em->used > 1) {
  92111. e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT;
  92112. }
  92113. #endif
  92114. if (e[0] == 0) {
  92115. err = MP_EXPTMOD_E;
  92116. }
  92117. }
  92118. if (err == MP_OKAY) {
  92119. sp_4096_from_mp(m, 128, mm);
  92120. if (e[0] == 0x10001) {
  92121. int i;
  92122. sp_digit mp;
  92123. sp_4096_mont_setup(m, &mp);
  92124. /* Convert to Montgomery form. */
  92125. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  92126. err = sp_4096_mod_128_cond(r, a, m);
  92127. /* Montgomery form: r = a.R mod m */
  92128. if (err == MP_OKAY) {
  92129. /* r = a ^ 0x10000 => r = a squared 16 times */
  92130. for (i = 15; i >= 0; i--) {
  92131. sp_4096_mont_sqr_128(r, r, m, mp);
  92132. }
  92133. /* mont_red(r.R.R) = (r.R.R / R) mod m = r.R mod m
  92134. * mont_red(r.R * a) = (r.R.a / R) mod m = r.a mod m
  92135. */
  92136. sp_4096_mont_mul_128(r, r, ah, m, mp);
  92137. for (i = 127; i > 0; i--) {
  92138. if (r[i] != m[i]) {
  92139. break;
  92140. }
  92141. }
  92142. if (r[i] >= m[i]) {
  92143. sp_4096_sub_in_place_128(r, m);
  92144. }
  92145. }
  92146. }
  92147. else if (e[0] == 0x3) {
  92148. if (err == MP_OKAY) {
  92149. sp_4096_sqr_128(r, ah);
  92150. err = sp_4096_mod_128_cond(r, r, m);
  92151. }
  92152. if (err == MP_OKAY) {
  92153. sp_4096_mul_128(r, ah, r);
  92154. err = sp_4096_mod_128_cond(r, r, m);
  92155. }
  92156. }
  92157. else {
  92158. int i;
  92159. sp_digit mp;
  92160. sp_4096_mont_setup(m, &mp);
  92161. /* Convert to Montgomery form. */
  92162. XMEMSET(a, 0, sizeof(sp_digit) * 128);
  92163. err = sp_4096_mod_128_cond(a, a, m);
  92164. if (err == MP_OKAY) {
  92165. for (i = 31; i >= 0; i--) {
  92166. if (e[0] >> i) {
  92167. break;
  92168. }
  92169. }
  92170. XMEMCPY(r, a, sizeof(sp_digit) * 128);
  92171. for (i--; i >= 0; i--) {
  92172. sp_4096_mont_sqr_128(r, r, m, mp);
  92173. if (((e[0] >> i) & 1) == 1) {
  92174. sp_4096_mont_mul_128(r, r, a, m, mp);
  92175. }
  92176. }
  92177. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128);
  92178. sp_4096_mont_reduce_128(r, m, mp);
  92179. for (i = 127; i > 0; i--) {
  92180. if (r[i] != m[i]) {
  92181. break;
  92182. }
  92183. }
  92184. if (r[i] >= m[i]) {
  92185. sp_4096_sub_in_place_128(r, m);
  92186. }
  92187. }
  92188. }
  92189. }
  92190. if (err == MP_OKAY) {
  92191. sp_4096_to_bin_128(r, out);
  92192. *outLen = 512;
  92193. }
  92194. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92195. if (a != NULL)
  92196. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  92197. #endif
  92198. return err;
  92199. }
  92200. #ifndef WOLFSSL_RSA_PUBLIC_ONLY
  92201. /* Conditionally add a and b using the mask m.
  92202. * m is -1 to add and 0 when not.
  92203. *
  92204. * r A single precision number representing conditional add result.
  92205. * a A single precision number to add with.
  92206. * b A single precision number to add.
  92207. * m Mask value to apply.
  92208. */
  92209. SP_NOINLINE static sp_digit sp_4096_cond_add_64(sp_digit* r, const sp_digit* a,
  92210. const sp_digit* b, sp_digit m)
  92211. {
  92212. __asm__ __volatile__ (
  92213. "movs r4, #0\n\t"
  92214. "movs r5, #0xff\n\t"
  92215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92216. "adds r5, r5, #1\n\t"
  92217. #else
  92218. "add r5, r5, #1\n\t"
  92219. #endif
  92220. "mov r8, r5\n\t"
  92221. "movs r7, #0\n\t"
  92222. "\n"
  92223. "L_sp_4096_cond_add_64_words_%=:\n\t"
  92224. "ldr r6, [%[b], r7]\n\t"
  92225. #ifdef WOLFSSL_KEIL
  92226. "ands r6, r6, %[m]\n\t"
  92227. #elif defined(__clang__)
  92228. "ands r6, %[m]\n\t"
  92229. #else
  92230. "and r6, %[m]\n\t"
  92231. #endif
  92232. "movs r5, #0\n\t"
  92233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92234. "subs r5, r5, #1\n\t"
  92235. #else
  92236. "sub r5, r5, #1\n\t"
  92237. #endif
  92238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92239. "adds r5, r5, r4\n\t"
  92240. #else
  92241. "add r5, r5, r4\n\t"
  92242. #endif
  92243. "ldr r5, [%[a], r7]\n\t"
  92244. #ifdef WOLFSSL_KEIL
  92245. "adcs r5, r5, r6\n\t"
  92246. #elif defined(__clang__)
  92247. "adcs r5, r6\n\t"
  92248. #else
  92249. "adc r5, r6\n\t"
  92250. #endif
  92251. "movs r4, #0\n\t"
  92252. #ifdef WOLFSSL_KEIL
  92253. "adcs r4, r4, r4\n\t"
  92254. #elif defined(__clang__)
  92255. "adcs r4, r4\n\t"
  92256. #else
  92257. "adc r4, r4\n\t"
  92258. #endif
  92259. "str r5, [%[r], r7]\n\t"
  92260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92261. "adds r7, r7, #4\n\t"
  92262. #else
  92263. "add r7, r7, #4\n\t"
  92264. #endif
  92265. "cmp r7, r8\n\t"
  92266. "blt L_sp_4096_cond_add_64_words_%=\n\t"
  92267. "movs %[r], r4\n\t"
  92268. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  92269. :
  92270. : "memory", "r4", "r5", "r6", "r7", "r8"
  92271. );
  92272. return (uint32_t)(size_t)r;
  92273. }
  92274. /* RSA private key operation.
  92275. *
  92276. * in Array of bytes representing the number to exponentiate, base.
  92277. * inLen Number of bytes in base.
  92278. * dm Private exponent.
  92279. * pm First prime.
  92280. * qm Second prime.
  92281. * dpm First prime's CRT exponent.
  92282. * dqm Second prime's CRT exponent.
  92283. * qim Inverse of second prime mod p.
  92284. * mm Modulus.
  92285. * out Buffer to hold big-endian bytes of exponentiation result.
  92286. * Must be at least 512 bytes long.
  92287. * outLen Number of bytes in result.
  92288. * returns 0 on success, MP_TO_E when the outLen is too small, MP_READ_E when
  92289. * an array is too long and MEMORY_E when dynamic memory allocation fails.
  92290. */
  92291. int sp_RsaPrivate_4096(const byte* in, word32 inLen, const mp_int* dm,
  92292. const mp_int* pm, const mp_int* qm, const mp_int* dpm, const mp_int* dqm,
  92293. const mp_int* qim, const mp_int* mm, byte* out, word32* outLen)
  92294. {
  92295. #if defined(SP_RSA_PRIVATE_EXP_D) || defined(RSA_LOW_MEM)
  92296. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92297. sp_digit* d = NULL;
  92298. #else
  92299. sp_digit d[128 * 4];
  92300. #endif
  92301. sp_digit* a = NULL;
  92302. sp_digit* m = NULL;
  92303. sp_digit* r = NULL;
  92304. int err = MP_OKAY;
  92305. (void)pm;
  92306. (void)qm;
  92307. (void)dpm;
  92308. (void)dqm;
  92309. (void)qim;
  92310. if (*outLen < 512U) {
  92311. err = MP_TO_E;
  92312. }
  92313. if (err == MP_OKAY) {
  92314. if (mp_count_bits(dm) > 4096) {
  92315. err = MP_READ_E;
  92316. }
  92317. else if (inLen > 512) {
  92318. err = MP_READ_E;
  92319. }
  92320. else if (mp_count_bits(mm) != 4096) {
  92321. err = MP_READ_E;
  92322. }
  92323. else if (mp_iseven(mm)) {
  92324. err = MP_VAL;
  92325. }
  92326. }
  92327. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92328. if (err == MP_OKAY) {
  92329. d = (sp_digit*)XMALLOC(sizeof(sp_digit) * 128 * 4, NULL,
  92330. DYNAMIC_TYPE_RSA);
  92331. if (d == NULL)
  92332. err = MEMORY_E;
  92333. }
  92334. #endif
  92335. if (err == MP_OKAY) {
  92336. a = d + 128;
  92337. m = a + 256;
  92338. r = a;
  92339. sp_4096_from_bin(a, 128, in, inLen);
  92340. sp_4096_from_mp(d, 128, dm);
  92341. sp_4096_from_mp(m, 128, mm);
  92342. err = sp_4096_mod_exp_128(r, a, d, 4096, m, 0);
  92343. }
  92344. if (err == MP_OKAY) {
  92345. sp_4096_to_bin_128(r, out);
  92346. *outLen = 512;
  92347. }
  92348. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92349. if (d != NULL)
  92350. #endif
  92351. {
  92352. /* only "a" and "r" are sensitive and need zeroized (same pointer) */
  92353. if (a != NULL)
  92354. ForceZero(a, sizeof(sp_digit) * 128);
  92355. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92356. XFREE(d, NULL, DYNAMIC_TYPE_RSA);
  92357. #endif
  92358. }
  92359. return err;
  92360. #else
  92361. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92362. sp_digit* a = NULL;
  92363. #else
  92364. sp_digit a[64 * 11];
  92365. #endif
  92366. sp_digit* p = NULL;
  92367. sp_digit* q = NULL;
  92368. sp_digit* dp = NULL;
  92369. sp_digit* tmpa = NULL;
  92370. sp_digit* tmpb = NULL;
  92371. sp_digit* r = NULL;
  92372. sp_digit* qi = NULL;
  92373. sp_digit* dq = NULL;
  92374. sp_digit c;
  92375. int err = MP_OKAY;
  92376. (void)dm;
  92377. (void)mm;
  92378. if (*outLen < 512) {
  92379. err = MP_TO_E;
  92380. }
  92381. else if (inLen > 512 || mp_count_bits(mm) != 4096) {
  92382. err = MP_READ_E;
  92383. }
  92384. else if (mp_iseven(mm)) {
  92385. err = MP_VAL;
  92386. }
  92387. else if (mp_iseven(pm)) {
  92388. err = MP_VAL;
  92389. }
  92390. else if (mp_iseven(qm)) {
  92391. err = MP_VAL;
  92392. }
  92393. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92394. if (err == MP_OKAY) {
  92395. a = (sp_digit*)XMALLOC(sizeof(sp_digit) * 64 * 11, NULL,
  92396. DYNAMIC_TYPE_RSA);
  92397. if (a == NULL)
  92398. err = MEMORY_E;
  92399. }
  92400. #endif
  92401. if (err == MP_OKAY) {
  92402. p = a + 128 * 2;
  92403. q = p + 64;
  92404. qi = dq = dp = q + 64;
  92405. tmpa = qi + 64;
  92406. tmpb = tmpa + 128;
  92407. r = a;
  92408. sp_4096_from_bin(a, 128, in, inLen);
  92409. sp_4096_from_mp(p, 64, pm);
  92410. sp_4096_from_mp(q, 64, qm);
  92411. sp_4096_from_mp(dp, 64, dpm);
  92412. err = sp_2048_mod_exp_64(tmpa, a, dp, 2048, p, 1);
  92413. }
  92414. if (err == MP_OKAY) {
  92415. sp_4096_from_mp(dq, 64, dqm);
  92416. err = sp_2048_mod_exp_64(tmpb, a, dq, 2048, q, 1);
  92417. }
  92418. if (err == MP_OKAY) {
  92419. c = sp_2048_sub_in_place_64(tmpa, tmpb);
  92420. c += sp_4096_cond_add_64(tmpa, tmpa, p, c);
  92421. sp_4096_cond_add_64(tmpa, tmpa, p, c);
  92422. sp_2048_from_mp(qi, 64, qim);
  92423. sp_2048_mul_64(tmpa, tmpa, qi);
  92424. err = sp_2048_mod_64(tmpa, tmpa, p);
  92425. }
  92426. if (err == MP_OKAY) {
  92427. sp_2048_mul_64(tmpa, q, tmpa);
  92428. XMEMSET(&tmpb[64], 0, sizeof(sp_digit) * 64);
  92429. sp_4096_add_128(r, tmpb, tmpa);
  92430. sp_4096_to_bin_128(r, out);
  92431. *outLen = 512;
  92432. }
  92433. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92434. if (a != NULL)
  92435. #endif
  92436. {
  92437. ForceZero(a, sizeof(sp_digit) * 64 * 11);
  92438. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  92439. XFREE(a, NULL, DYNAMIC_TYPE_RSA);
  92440. #endif
  92441. }
  92442. #endif /* SP_RSA_PRIVATE_EXP_D || RSA_LOW_MEM */
  92443. return err;
  92444. }
  92445. #endif /* WOLFSSL_RSA_PUBLIC_ONLY */
  92446. #endif /* WOLFSSL_HAVE_SP_RSA */
  92447. #if defined(WOLFSSL_HAVE_SP_DH) || (defined(WOLFSSL_HAVE_SP_RSA) && \
  92448. !defined(WOLFSSL_RSA_PUBLIC_ONLY))
  92449. /* Convert an array of sp_digit to an mp_int.
  92450. *
  92451. * a A single precision integer.
  92452. * r A multi-precision integer.
  92453. */
  92454. static int sp_4096_to_mp(const sp_digit* a, mp_int* r)
  92455. {
  92456. int err;
  92457. err = mp_grow(r, (4096 + DIGIT_BIT - 1) / DIGIT_BIT);
  92458. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  92459. #if DIGIT_BIT == 32
  92460. XMEMCPY(r->dp, a, sizeof(sp_digit) * 128);
  92461. r->used = 128;
  92462. mp_clamp(r);
  92463. #elif DIGIT_BIT < 32
  92464. int i;
  92465. int j = 0;
  92466. int s = 0;
  92467. r->dp[0] = 0;
  92468. for (i = 0; i < 128; i++) {
  92469. r->dp[j] |= (mp_digit)(a[i] << s);
  92470. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  92471. s = DIGIT_BIT - s;
  92472. r->dp[++j] = (mp_digit)(a[i] >> s);
  92473. while (s + DIGIT_BIT <= 32) {
  92474. s += DIGIT_BIT;
  92475. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  92476. if (s == SP_WORD_SIZE) {
  92477. r->dp[j] = 0;
  92478. }
  92479. else {
  92480. r->dp[j] = (mp_digit)(a[i] >> s);
  92481. }
  92482. }
  92483. s = 32 - s;
  92484. }
  92485. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  92486. mp_clamp(r);
  92487. #else
  92488. int i;
  92489. int j = 0;
  92490. int s = 0;
  92491. r->dp[0] = 0;
  92492. for (i = 0; i < 128; i++) {
  92493. r->dp[j] |= ((mp_digit)a[i]) << s;
  92494. if (s + 32 >= DIGIT_BIT) {
  92495. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  92496. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  92497. #endif
  92498. s = DIGIT_BIT - s;
  92499. r->dp[++j] = a[i] >> s;
  92500. s = 32 - s;
  92501. }
  92502. else {
  92503. s += 32;
  92504. }
  92505. }
  92506. r->used = (4096 + DIGIT_BIT - 1) / DIGIT_BIT;
  92507. mp_clamp(r);
  92508. #endif
  92509. }
  92510. return err;
  92511. }
  92512. /* Perform the modular exponentiation for Diffie-Hellman.
  92513. *
  92514. * base Base. MP integer.
  92515. * exp Exponent. MP integer.
  92516. * mod Modulus. MP integer.
  92517. * res Result. MP integer.
  92518. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  92519. * and MEMORY_E if memory allocation fails.
  92520. */
  92521. int sp_ModExp_4096(const mp_int* base, const mp_int* exp, const mp_int* mod,
  92522. mp_int* res)
  92523. {
  92524. int err = MP_OKAY;
  92525. sp_digit b[256];
  92526. sp_digit e[128];
  92527. sp_digit m[128];
  92528. sp_digit* r = b;
  92529. int expBits = mp_count_bits(exp);
  92530. if (mp_count_bits(base) > 4096) {
  92531. err = MP_READ_E;
  92532. }
  92533. else if (expBits > 4096) {
  92534. err = MP_READ_E;
  92535. }
  92536. else if (mp_count_bits(mod) != 4096) {
  92537. err = MP_READ_E;
  92538. }
  92539. else if (mp_iseven(mod)) {
  92540. err = MP_VAL;
  92541. }
  92542. if (err == MP_OKAY) {
  92543. sp_4096_from_mp(b, 128, base);
  92544. sp_4096_from_mp(e, 128, exp);
  92545. sp_4096_from_mp(m, 128, mod);
  92546. err = sp_4096_mod_exp_128(r, b, e, expBits, m, 0);
  92547. }
  92548. if (err == MP_OKAY) {
  92549. err = sp_4096_to_mp(r, res);
  92550. }
  92551. XMEMSET(e, 0, sizeof(e));
  92552. return err;
  92553. }
  92554. #ifdef WOLFSSL_HAVE_SP_DH
  92555. #ifdef HAVE_FFDHE_4096
  92556. /* Lefy shift a by n bits into r. (r = a << n)
  92557. *
  92558. * r A single precision integer.
  92559. * a A single precision integer.
  92560. * n Integer representing number of bits to shift.
  92561. */
  92562. static void sp_4096_lshift_128(sp_digit* r, const sp_digit* a, byte n)
  92563. {
  92564. __asm__ __volatile__ (
  92565. "movs r7, #31\n\t"
  92566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92567. "subs r7, r7, %[n]\n\t"
  92568. #else
  92569. "sub r7, r7, %[n]\n\t"
  92570. #endif
  92571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92572. "adds %[a], %[a], #0xff\n\t"
  92573. #else
  92574. "add %[a], %[a], #0xff\n\t"
  92575. #endif
  92576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92577. "adds %[r], %[r], #0xff\n\t"
  92578. #else
  92579. "add %[r], %[r], #0xff\n\t"
  92580. #endif
  92581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92582. "adds %[a], %[a], #0xc1\n\t"
  92583. #else
  92584. "add %[a], %[a], #0xc1\n\t"
  92585. #endif
  92586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92587. "adds %[r], %[r], #0xc1\n\t"
  92588. #else
  92589. "add %[r], %[r], #0xc1\n\t"
  92590. #endif
  92591. "ldr r4, [%[a], #60]\n\t"
  92592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92593. "lsrs r5, r4, #1\n\t"
  92594. #else
  92595. "lsr r5, r4, #1\n\t"
  92596. #endif
  92597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92598. "lsls r4, r4, %[n]\n\t"
  92599. #else
  92600. "lsl r4, r4, %[n]\n\t"
  92601. #endif
  92602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92603. "lsrs r5, r5, r7\n\t"
  92604. #else
  92605. "lsr r5, r5, r7\n\t"
  92606. #endif
  92607. "ldr r3, [%[a], #56]\n\t"
  92608. "str r5, [%[r], #64]\n\t"
  92609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92610. "lsrs r6, r3, #1\n\t"
  92611. #else
  92612. "lsr r6, r3, #1\n\t"
  92613. #endif
  92614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92615. "lsls r3, r3, %[n]\n\t"
  92616. #else
  92617. "lsl r3, r3, %[n]\n\t"
  92618. #endif
  92619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92620. "lsrs r6, r6, r7\n\t"
  92621. #else
  92622. "lsr r6, r6, r7\n\t"
  92623. #endif
  92624. #ifdef WOLFSSL_KEIL
  92625. "orrs r4, r4, r6\n\t"
  92626. #elif defined(__clang__)
  92627. "orrs r4, r6\n\t"
  92628. #else
  92629. "orr r4, r6\n\t"
  92630. #endif
  92631. "ldr r5, [%[a], #52]\n\t"
  92632. "str r4, [%[r], #60]\n\t"
  92633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92634. "lsrs r6, r5, #1\n\t"
  92635. #else
  92636. "lsr r6, r5, #1\n\t"
  92637. #endif
  92638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92639. "lsls r5, r5, %[n]\n\t"
  92640. #else
  92641. "lsl r5, r5, %[n]\n\t"
  92642. #endif
  92643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92644. "lsrs r6, r6, r7\n\t"
  92645. #else
  92646. "lsr r6, r6, r7\n\t"
  92647. #endif
  92648. #ifdef WOLFSSL_KEIL
  92649. "orrs r3, r3, r6\n\t"
  92650. #elif defined(__clang__)
  92651. "orrs r3, r6\n\t"
  92652. #else
  92653. "orr r3, r6\n\t"
  92654. #endif
  92655. "ldr r4, [%[a], #48]\n\t"
  92656. "str r3, [%[r], #56]\n\t"
  92657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92658. "lsrs r6, r4, #1\n\t"
  92659. #else
  92660. "lsr r6, r4, #1\n\t"
  92661. #endif
  92662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92663. "lsls r4, r4, %[n]\n\t"
  92664. #else
  92665. "lsl r4, r4, %[n]\n\t"
  92666. #endif
  92667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92668. "lsrs r6, r6, r7\n\t"
  92669. #else
  92670. "lsr r6, r6, r7\n\t"
  92671. #endif
  92672. #ifdef WOLFSSL_KEIL
  92673. "orrs r5, r5, r6\n\t"
  92674. #elif defined(__clang__)
  92675. "orrs r5, r6\n\t"
  92676. #else
  92677. "orr r5, r6\n\t"
  92678. #endif
  92679. "ldr r3, [%[a], #44]\n\t"
  92680. "str r5, [%[r], #52]\n\t"
  92681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92682. "lsrs r6, r3, #1\n\t"
  92683. #else
  92684. "lsr r6, r3, #1\n\t"
  92685. #endif
  92686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92687. "lsls r3, r3, %[n]\n\t"
  92688. #else
  92689. "lsl r3, r3, %[n]\n\t"
  92690. #endif
  92691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92692. "lsrs r6, r6, r7\n\t"
  92693. #else
  92694. "lsr r6, r6, r7\n\t"
  92695. #endif
  92696. #ifdef WOLFSSL_KEIL
  92697. "orrs r4, r4, r6\n\t"
  92698. #elif defined(__clang__)
  92699. "orrs r4, r6\n\t"
  92700. #else
  92701. "orr r4, r6\n\t"
  92702. #endif
  92703. "ldr r5, [%[a], #40]\n\t"
  92704. "str r4, [%[r], #48]\n\t"
  92705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92706. "lsrs r6, r5, #1\n\t"
  92707. #else
  92708. "lsr r6, r5, #1\n\t"
  92709. #endif
  92710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92711. "lsls r5, r5, %[n]\n\t"
  92712. #else
  92713. "lsl r5, r5, %[n]\n\t"
  92714. #endif
  92715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92716. "lsrs r6, r6, r7\n\t"
  92717. #else
  92718. "lsr r6, r6, r7\n\t"
  92719. #endif
  92720. #ifdef WOLFSSL_KEIL
  92721. "orrs r3, r3, r6\n\t"
  92722. #elif defined(__clang__)
  92723. "orrs r3, r6\n\t"
  92724. #else
  92725. "orr r3, r6\n\t"
  92726. #endif
  92727. "ldr r4, [%[a], #36]\n\t"
  92728. "str r3, [%[r], #44]\n\t"
  92729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92730. "lsrs r6, r4, #1\n\t"
  92731. #else
  92732. "lsr r6, r4, #1\n\t"
  92733. #endif
  92734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92735. "lsls r4, r4, %[n]\n\t"
  92736. #else
  92737. "lsl r4, r4, %[n]\n\t"
  92738. #endif
  92739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92740. "lsrs r6, r6, r7\n\t"
  92741. #else
  92742. "lsr r6, r6, r7\n\t"
  92743. #endif
  92744. #ifdef WOLFSSL_KEIL
  92745. "orrs r5, r5, r6\n\t"
  92746. #elif defined(__clang__)
  92747. "orrs r5, r6\n\t"
  92748. #else
  92749. "orr r5, r6\n\t"
  92750. #endif
  92751. "ldr r3, [%[a], #32]\n\t"
  92752. "str r5, [%[r], #40]\n\t"
  92753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92754. "lsrs r6, r3, #1\n\t"
  92755. #else
  92756. "lsr r6, r3, #1\n\t"
  92757. #endif
  92758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92759. "lsls r3, r3, %[n]\n\t"
  92760. #else
  92761. "lsl r3, r3, %[n]\n\t"
  92762. #endif
  92763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92764. "lsrs r6, r6, r7\n\t"
  92765. #else
  92766. "lsr r6, r6, r7\n\t"
  92767. #endif
  92768. #ifdef WOLFSSL_KEIL
  92769. "orrs r4, r4, r6\n\t"
  92770. #elif defined(__clang__)
  92771. "orrs r4, r6\n\t"
  92772. #else
  92773. "orr r4, r6\n\t"
  92774. #endif
  92775. "ldr r5, [%[a], #28]\n\t"
  92776. "str r4, [%[r], #36]\n\t"
  92777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92778. "lsrs r6, r5, #1\n\t"
  92779. #else
  92780. "lsr r6, r5, #1\n\t"
  92781. #endif
  92782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92783. "lsls r5, r5, %[n]\n\t"
  92784. #else
  92785. "lsl r5, r5, %[n]\n\t"
  92786. #endif
  92787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92788. "lsrs r6, r6, r7\n\t"
  92789. #else
  92790. "lsr r6, r6, r7\n\t"
  92791. #endif
  92792. #ifdef WOLFSSL_KEIL
  92793. "orrs r3, r3, r6\n\t"
  92794. #elif defined(__clang__)
  92795. "orrs r3, r6\n\t"
  92796. #else
  92797. "orr r3, r6\n\t"
  92798. #endif
  92799. "ldr r4, [%[a], #24]\n\t"
  92800. "str r3, [%[r], #32]\n\t"
  92801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92802. "lsrs r6, r4, #1\n\t"
  92803. #else
  92804. "lsr r6, r4, #1\n\t"
  92805. #endif
  92806. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92807. "lsls r4, r4, %[n]\n\t"
  92808. #else
  92809. "lsl r4, r4, %[n]\n\t"
  92810. #endif
  92811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92812. "lsrs r6, r6, r7\n\t"
  92813. #else
  92814. "lsr r6, r6, r7\n\t"
  92815. #endif
  92816. #ifdef WOLFSSL_KEIL
  92817. "orrs r5, r5, r6\n\t"
  92818. #elif defined(__clang__)
  92819. "orrs r5, r6\n\t"
  92820. #else
  92821. "orr r5, r6\n\t"
  92822. #endif
  92823. "ldr r3, [%[a], #20]\n\t"
  92824. "str r5, [%[r], #28]\n\t"
  92825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92826. "lsrs r6, r3, #1\n\t"
  92827. #else
  92828. "lsr r6, r3, #1\n\t"
  92829. #endif
  92830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92831. "lsls r3, r3, %[n]\n\t"
  92832. #else
  92833. "lsl r3, r3, %[n]\n\t"
  92834. #endif
  92835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92836. "lsrs r6, r6, r7\n\t"
  92837. #else
  92838. "lsr r6, r6, r7\n\t"
  92839. #endif
  92840. #ifdef WOLFSSL_KEIL
  92841. "orrs r4, r4, r6\n\t"
  92842. #elif defined(__clang__)
  92843. "orrs r4, r6\n\t"
  92844. #else
  92845. "orr r4, r6\n\t"
  92846. #endif
  92847. "ldr r5, [%[a], #16]\n\t"
  92848. "str r4, [%[r], #24]\n\t"
  92849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92850. "lsrs r6, r5, #1\n\t"
  92851. #else
  92852. "lsr r6, r5, #1\n\t"
  92853. #endif
  92854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92855. "lsls r5, r5, %[n]\n\t"
  92856. #else
  92857. "lsl r5, r5, %[n]\n\t"
  92858. #endif
  92859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92860. "lsrs r6, r6, r7\n\t"
  92861. #else
  92862. "lsr r6, r6, r7\n\t"
  92863. #endif
  92864. #ifdef WOLFSSL_KEIL
  92865. "orrs r3, r3, r6\n\t"
  92866. #elif defined(__clang__)
  92867. "orrs r3, r6\n\t"
  92868. #else
  92869. "orr r3, r6\n\t"
  92870. #endif
  92871. "ldr r4, [%[a], #12]\n\t"
  92872. "str r3, [%[r], #20]\n\t"
  92873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92874. "lsrs r6, r4, #1\n\t"
  92875. #else
  92876. "lsr r6, r4, #1\n\t"
  92877. #endif
  92878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92879. "lsls r4, r4, %[n]\n\t"
  92880. #else
  92881. "lsl r4, r4, %[n]\n\t"
  92882. #endif
  92883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92884. "lsrs r6, r6, r7\n\t"
  92885. #else
  92886. "lsr r6, r6, r7\n\t"
  92887. #endif
  92888. #ifdef WOLFSSL_KEIL
  92889. "orrs r5, r5, r6\n\t"
  92890. #elif defined(__clang__)
  92891. "orrs r5, r6\n\t"
  92892. #else
  92893. "orr r5, r6\n\t"
  92894. #endif
  92895. "ldr r3, [%[a], #8]\n\t"
  92896. "str r5, [%[r], #16]\n\t"
  92897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92898. "lsrs r6, r3, #1\n\t"
  92899. #else
  92900. "lsr r6, r3, #1\n\t"
  92901. #endif
  92902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92903. "lsls r3, r3, %[n]\n\t"
  92904. #else
  92905. "lsl r3, r3, %[n]\n\t"
  92906. #endif
  92907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92908. "lsrs r6, r6, r7\n\t"
  92909. #else
  92910. "lsr r6, r6, r7\n\t"
  92911. #endif
  92912. #ifdef WOLFSSL_KEIL
  92913. "orrs r4, r4, r6\n\t"
  92914. #elif defined(__clang__)
  92915. "orrs r4, r6\n\t"
  92916. #else
  92917. "orr r4, r6\n\t"
  92918. #endif
  92919. "ldr r5, [%[a], #4]\n\t"
  92920. "str r4, [%[r], #12]\n\t"
  92921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92922. "lsrs r6, r5, #1\n\t"
  92923. #else
  92924. "lsr r6, r5, #1\n\t"
  92925. #endif
  92926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92927. "lsls r5, r5, %[n]\n\t"
  92928. #else
  92929. "lsl r5, r5, %[n]\n\t"
  92930. #endif
  92931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92932. "lsrs r6, r6, r7\n\t"
  92933. #else
  92934. "lsr r6, r6, r7\n\t"
  92935. #endif
  92936. #ifdef WOLFSSL_KEIL
  92937. "orrs r3, r3, r6\n\t"
  92938. #elif defined(__clang__)
  92939. "orrs r3, r6\n\t"
  92940. #else
  92941. "orr r3, r6\n\t"
  92942. #endif
  92943. "ldr r4, [%[a]]\n\t"
  92944. "str r3, [%[r], #8]\n\t"
  92945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92946. "lsrs r6, r4, #1\n\t"
  92947. #else
  92948. "lsr r6, r4, #1\n\t"
  92949. #endif
  92950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92951. "lsls r4, r4, %[n]\n\t"
  92952. #else
  92953. "lsl r4, r4, %[n]\n\t"
  92954. #endif
  92955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92956. "lsrs r6, r6, r7\n\t"
  92957. #else
  92958. "lsr r6, r6, r7\n\t"
  92959. #endif
  92960. #ifdef WOLFSSL_KEIL
  92961. "orrs r5, r5, r6\n\t"
  92962. #elif defined(__clang__)
  92963. "orrs r5, r6\n\t"
  92964. #else
  92965. "orr r5, r6\n\t"
  92966. #endif
  92967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92968. "subs %[a], %[a], #0x40\n\t"
  92969. #else
  92970. "sub %[a], %[a], #0x40\n\t"
  92971. #endif
  92972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92973. "subs %[r], %[r], #0x40\n\t"
  92974. #else
  92975. "sub %[r], %[r], #0x40\n\t"
  92976. #endif
  92977. "ldr r3, [%[a], #60]\n\t"
  92978. "str r5, [%[r], #68]\n\t"
  92979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92980. "lsrs r6, r3, #1\n\t"
  92981. #else
  92982. "lsr r6, r3, #1\n\t"
  92983. #endif
  92984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92985. "lsls r3, r3, %[n]\n\t"
  92986. #else
  92987. "lsl r3, r3, %[n]\n\t"
  92988. #endif
  92989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  92990. "lsrs r6, r6, r7\n\t"
  92991. #else
  92992. "lsr r6, r6, r7\n\t"
  92993. #endif
  92994. #ifdef WOLFSSL_KEIL
  92995. "orrs r4, r4, r6\n\t"
  92996. #elif defined(__clang__)
  92997. "orrs r4, r6\n\t"
  92998. #else
  92999. "orr r4, r6\n\t"
  93000. #endif
  93001. "ldr r5, [%[a], #56]\n\t"
  93002. "str r4, [%[r], #64]\n\t"
  93003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93004. "lsrs r6, r5, #1\n\t"
  93005. #else
  93006. "lsr r6, r5, #1\n\t"
  93007. #endif
  93008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93009. "lsls r5, r5, %[n]\n\t"
  93010. #else
  93011. "lsl r5, r5, %[n]\n\t"
  93012. #endif
  93013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93014. "lsrs r6, r6, r7\n\t"
  93015. #else
  93016. "lsr r6, r6, r7\n\t"
  93017. #endif
  93018. #ifdef WOLFSSL_KEIL
  93019. "orrs r3, r3, r6\n\t"
  93020. #elif defined(__clang__)
  93021. "orrs r3, r6\n\t"
  93022. #else
  93023. "orr r3, r6\n\t"
  93024. #endif
  93025. "ldr r4, [%[a], #52]\n\t"
  93026. "str r3, [%[r], #60]\n\t"
  93027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93028. "lsrs r6, r4, #1\n\t"
  93029. #else
  93030. "lsr r6, r4, #1\n\t"
  93031. #endif
  93032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93033. "lsls r4, r4, %[n]\n\t"
  93034. #else
  93035. "lsl r4, r4, %[n]\n\t"
  93036. #endif
  93037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93038. "lsrs r6, r6, r7\n\t"
  93039. #else
  93040. "lsr r6, r6, r7\n\t"
  93041. #endif
  93042. #ifdef WOLFSSL_KEIL
  93043. "orrs r5, r5, r6\n\t"
  93044. #elif defined(__clang__)
  93045. "orrs r5, r6\n\t"
  93046. #else
  93047. "orr r5, r6\n\t"
  93048. #endif
  93049. "ldr r3, [%[a], #48]\n\t"
  93050. "str r5, [%[r], #56]\n\t"
  93051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93052. "lsrs r6, r3, #1\n\t"
  93053. #else
  93054. "lsr r6, r3, #1\n\t"
  93055. #endif
  93056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93057. "lsls r3, r3, %[n]\n\t"
  93058. #else
  93059. "lsl r3, r3, %[n]\n\t"
  93060. #endif
  93061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93062. "lsrs r6, r6, r7\n\t"
  93063. #else
  93064. "lsr r6, r6, r7\n\t"
  93065. #endif
  93066. #ifdef WOLFSSL_KEIL
  93067. "orrs r4, r4, r6\n\t"
  93068. #elif defined(__clang__)
  93069. "orrs r4, r6\n\t"
  93070. #else
  93071. "orr r4, r6\n\t"
  93072. #endif
  93073. "ldr r5, [%[a], #44]\n\t"
  93074. "str r4, [%[r], #52]\n\t"
  93075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93076. "lsrs r6, r5, #1\n\t"
  93077. #else
  93078. "lsr r6, r5, #1\n\t"
  93079. #endif
  93080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93081. "lsls r5, r5, %[n]\n\t"
  93082. #else
  93083. "lsl r5, r5, %[n]\n\t"
  93084. #endif
  93085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93086. "lsrs r6, r6, r7\n\t"
  93087. #else
  93088. "lsr r6, r6, r7\n\t"
  93089. #endif
  93090. #ifdef WOLFSSL_KEIL
  93091. "orrs r3, r3, r6\n\t"
  93092. #elif defined(__clang__)
  93093. "orrs r3, r6\n\t"
  93094. #else
  93095. "orr r3, r6\n\t"
  93096. #endif
  93097. "ldr r4, [%[a], #40]\n\t"
  93098. "str r3, [%[r], #48]\n\t"
  93099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93100. "lsrs r6, r4, #1\n\t"
  93101. #else
  93102. "lsr r6, r4, #1\n\t"
  93103. #endif
  93104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93105. "lsls r4, r4, %[n]\n\t"
  93106. #else
  93107. "lsl r4, r4, %[n]\n\t"
  93108. #endif
  93109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93110. "lsrs r6, r6, r7\n\t"
  93111. #else
  93112. "lsr r6, r6, r7\n\t"
  93113. #endif
  93114. #ifdef WOLFSSL_KEIL
  93115. "orrs r5, r5, r6\n\t"
  93116. #elif defined(__clang__)
  93117. "orrs r5, r6\n\t"
  93118. #else
  93119. "orr r5, r6\n\t"
  93120. #endif
  93121. "ldr r3, [%[a], #36]\n\t"
  93122. "str r5, [%[r], #44]\n\t"
  93123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93124. "lsrs r6, r3, #1\n\t"
  93125. #else
  93126. "lsr r6, r3, #1\n\t"
  93127. #endif
  93128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93129. "lsls r3, r3, %[n]\n\t"
  93130. #else
  93131. "lsl r3, r3, %[n]\n\t"
  93132. #endif
  93133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93134. "lsrs r6, r6, r7\n\t"
  93135. #else
  93136. "lsr r6, r6, r7\n\t"
  93137. #endif
  93138. #ifdef WOLFSSL_KEIL
  93139. "orrs r4, r4, r6\n\t"
  93140. #elif defined(__clang__)
  93141. "orrs r4, r6\n\t"
  93142. #else
  93143. "orr r4, r6\n\t"
  93144. #endif
  93145. "ldr r5, [%[a], #32]\n\t"
  93146. "str r4, [%[r], #40]\n\t"
  93147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93148. "lsrs r6, r5, #1\n\t"
  93149. #else
  93150. "lsr r6, r5, #1\n\t"
  93151. #endif
  93152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93153. "lsls r5, r5, %[n]\n\t"
  93154. #else
  93155. "lsl r5, r5, %[n]\n\t"
  93156. #endif
  93157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93158. "lsrs r6, r6, r7\n\t"
  93159. #else
  93160. "lsr r6, r6, r7\n\t"
  93161. #endif
  93162. #ifdef WOLFSSL_KEIL
  93163. "orrs r3, r3, r6\n\t"
  93164. #elif defined(__clang__)
  93165. "orrs r3, r6\n\t"
  93166. #else
  93167. "orr r3, r6\n\t"
  93168. #endif
  93169. "ldr r4, [%[a], #28]\n\t"
  93170. "str r3, [%[r], #36]\n\t"
  93171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93172. "lsrs r6, r4, #1\n\t"
  93173. #else
  93174. "lsr r6, r4, #1\n\t"
  93175. #endif
  93176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93177. "lsls r4, r4, %[n]\n\t"
  93178. #else
  93179. "lsl r4, r4, %[n]\n\t"
  93180. #endif
  93181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93182. "lsrs r6, r6, r7\n\t"
  93183. #else
  93184. "lsr r6, r6, r7\n\t"
  93185. #endif
  93186. #ifdef WOLFSSL_KEIL
  93187. "orrs r5, r5, r6\n\t"
  93188. #elif defined(__clang__)
  93189. "orrs r5, r6\n\t"
  93190. #else
  93191. "orr r5, r6\n\t"
  93192. #endif
  93193. "ldr r3, [%[a], #24]\n\t"
  93194. "str r5, [%[r], #32]\n\t"
  93195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93196. "lsrs r6, r3, #1\n\t"
  93197. #else
  93198. "lsr r6, r3, #1\n\t"
  93199. #endif
  93200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93201. "lsls r3, r3, %[n]\n\t"
  93202. #else
  93203. "lsl r3, r3, %[n]\n\t"
  93204. #endif
  93205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93206. "lsrs r6, r6, r7\n\t"
  93207. #else
  93208. "lsr r6, r6, r7\n\t"
  93209. #endif
  93210. #ifdef WOLFSSL_KEIL
  93211. "orrs r4, r4, r6\n\t"
  93212. #elif defined(__clang__)
  93213. "orrs r4, r6\n\t"
  93214. #else
  93215. "orr r4, r6\n\t"
  93216. #endif
  93217. "ldr r5, [%[a], #20]\n\t"
  93218. "str r4, [%[r], #28]\n\t"
  93219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93220. "lsrs r6, r5, #1\n\t"
  93221. #else
  93222. "lsr r6, r5, #1\n\t"
  93223. #endif
  93224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93225. "lsls r5, r5, %[n]\n\t"
  93226. #else
  93227. "lsl r5, r5, %[n]\n\t"
  93228. #endif
  93229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93230. "lsrs r6, r6, r7\n\t"
  93231. #else
  93232. "lsr r6, r6, r7\n\t"
  93233. #endif
  93234. #ifdef WOLFSSL_KEIL
  93235. "orrs r3, r3, r6\n\t"
  93236. #elif defined(__clang__)
  93237. "orrs r3, r6\n\t"
  93238. #else
  93239. "orr r3, r6\n\t"
  93240. #endif
  93241. "ldr r4, [%[a], #16]\n\t"
  93242. "str r3, [%[r], #24]\n\t"
  93243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93244. "lsrs r6, r4, #1\n\t"
  93245. #else
  93246. "lsr r6, r4, #1\n\t"
  93247. #endif
  93248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93249. "lsls r4, r4, %[n]\n\t"
  93250. #else
  93251. "lsl r4, r4, %[n]\n\t"
  93252. #endif
  93253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93254. "lsrs r6, r6, r7\n\t"
  93255. #else
  93256. "lsr r6, r6, r7\n\t"
  93257. #endif
  93258. #ifdef WOLFSSL_KEIL
  93259. "orrs r5, r5, r6\n\t"
  93260. #elif defined(__clang__)
  93261. "orrs r5, r6\n\t"
  93262. #else
  93263. "orr r5, r6\n\t"
  93264. #endif
  93265. "ldr r3, [%[a], #12]\n\t"
  93266. "str r5, [%[r], #20]\n\t"
  93267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93268. "lsrs r6, r3, #1\n\t"
  93269. #else
  93270. "lsr r6, r3, #1\n\t"
  93271. #endif
  93272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93273. "lsls r3, r3, %[n]\n\t"
  93274. #else
  93275. "lsl r3, r3, %[n]\n\t"
  93276. #endif
  93277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93278. "lsrs r6, r6, r7\n\t"
  93279. #else
  93280. "lsr r6, r6, r7\n\t"
  93281. #endif
  93282. #ifdef WOLFSSL_KEIL
  93283. "orrs r4, r4, r6\n\t"
  93284. #elif defined(__clang__)
  93285. "orrs r4, r6\n\t"
  93286. #else
  93287. "orr r4, r6\n\t"
  93288. #endif
  93289. "ldr r5, [%[a], #8]\n\t"
  93290. "str r4, [%[r], #16]\n\t"
  93291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93292. "lsrs r6, r5, #1\n\t"
  93293. #else
  93294. "lsr r6, r5, #1\n\t"
  93295. #endif
  93296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93297. "lsls r5, r5, %[n]\n\t"
  93298. #else
  93299. "lsl r5, r5, %[n]\n\t"
  93300. #endif
  93301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93302. "lsrs r6, r6, r7\n\t"
  93303. #else
  93304. "lsr r6, r6, r7\n\t"
  93305. #endif
  93306. #ifdef WOLFSSL_KEIL
  93307. "orrs r3, r3, r6\n\t"
  93308. #elif defined(__clang__)
  93309. "orrs r3, r6\n\t"
  93310. #else
  93311. "orr r3, r6\n\t"
  93312. #endif
  93313. "ldr r4, [%[a], #4]\n\t"
  93314. "str r3, [%[r], #12]\n\t"
  93315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93316. "lsrs r6, r4, #1\n\t"
  93317. #else
  93318. "lsr r6, r4, #1\n\t"
  93319. #endif
  93320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93321. "lsls r4, r4, %[n]\n\t"
  93322. #else
  93323. "lsl r4, r4, %[n]\n\t"
  93324. #endif
  93325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93326. "lsrs r6, r6, r7\n\t"
  93327. #else
  93328. "lsr r6, r6, r7\n\t"
  93329. #endif
  93330. #ifdef WOLFSSL_KEIL
  93331. "orrs r5, r5, r6\n\t"
  93332. #elif defined(__clang__)
  93333. "orrs r5, r6\n\t"
  93334. #else
  93335. "orr r5, r6\n\t"
  93336. #endif
  93337. "ldr r3, [%[a]]\n\t"
  93338. "str r5, [%[r], #8]\n\t"
  93339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93340. "lsrs r6, r3, #1\n\t"
  93341. #else
  93342. "lsr r6, r3, #1\n\t"
  93343. #endif
  93344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93345. "lsls r3, r3, %[n]\n\t"
  93346. #else
  93347. "lsl r3, r3, %[n]\n\t"
  93348. #endif
  93349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93350. "lsrs r6, r6, r7\n\t"
  93351. #else
  93352. "lsr r6, r6, r7\n\t"
  93353. #endif
  93354. #ifdef WOLFSSL_KEIL
  93355. "orrs r4, r4, r6\n\t"
  93356. #elif defined(__clang__)
  93357. "orrs r4, r6\n\t"
  93358. #else
  93359. "orr r4, r6\n\t"
  93360. #endif
  93361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93362. "subs %[a], %[a], #0x40\n\t"
  93363. #else
  93364. "sub %[a], %[a], #0x40\n\t"
  93365. #endif
  93366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93367. "subs %[r], %[r], #0x40\n\t"
  93368. #else
  93369. "sub %[r], %[r], #0x40\n\t"
  93370. #endif
  93371. "ldr r5, [%[a], #60]\n\t"
  93372. "str r4, [%[r], #68]\n\t"
  93373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93374. "lsrs r6, r5, #1\n\t"
  93375. #else
  93376. "lsr r6, r5, #1\n\t"
  93377. #endif
  93378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93379. "lsls r5, r5, %[n]\n\t"
  93380. #else
  93381. "lsl r5, r5, %[n]\n\t"
  93382. #endif
  93383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93384. "lsrs r6, r6, r7\n\t"
  93385. #else
  93386. "lsr r6, r6, r7\n\t"
  93387. #endif
  93388. #ifdef WOLFSSL_KEIL
  93389. "orrs r3, r3, r6\n\t"
  93390. #elif defined(__clang__)
  93391. "orrs r3, r6\n\t"
  93392. #else
  93393. "orr r3, r6\n\t"
  93394. #endif
  93395. "ldr r4, [%[a], #56]\n\t"
  93396. "str r3, [%[r], #64]\n\t"
  93397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93398. "lsrs r6, r4, #1\n\t"
  93399. #else
  93400. "lsr r6, r4, #1\n\t"
  93401. #endif
  93402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93403. "lsls r4, r4, %[n]\n\t"
  93404. #else
  93405. "lsl r4, r4, %[n]\n\t"
  93406. #endif
  93407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93408. "lsrs r6, r6, r7\n\t"
  93409. #else
  93410. "lsr r6, r6, r7\n\t"
  93411. #endif
  93412. #ifdef WOLFSSL_KEIL
  93413. "orrs r5, r5, r6\n\t"
  93414. #elif defined(__clang__)
  93415. "orrs r5, r6\n\t"
  93416. #else
  93417. "orr r5, r6\n\t"
  93418. #endif
  93419. "ldr r3, [%[a], #52]\n\t"
  93420. "str r5, [%[r], #60]\n\t"
  93421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93422. "lsrs r6, r3, #1\n\t"
  93423. #else
  93424. "lsr r6, r3, #1\n\t"
  93425. #endif
  93426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93427. "lsls r3, r3, %[n]\n\t"
  93428. #else
  93429. "lsl r3, r3, %[n]\n\t"
  93430. #endif
  93431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93432. "lsrs r6, r6, r7\n\t"
  93433. #else
  93434. "lsr r6, r6, r7\n\t"
  93435. #endif
  93436. #ifdef WOLFSSL_KEIL
  93437. "orrs r4, r4, r6\n\t"
  93438. #elif defined(__clang__)
  93439. "orrs r4, r6\n\t"
  93440. #else
  93441. "orr r4, r6\n\t"
  93442. #endif
  93443. "ldr r5, [%[a], #48]\n\t"
  93444. "str r4, [%[r], #56]\n\t"
  93445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93446. "lsrs r6, r5, #1\n\t"
  93447. #else
  93448. "lsr r6, r5, #1\n\t"
  93449. #endif
  93450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93451. "lsls r5, r5, %[n]\n\t"
  93452. #else
  93453. "lsl r5, r5, %[n]\n\t"
  93454. #endif
  93455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93456. "lsrs r6, r6, r7\n\t"
  93457. #else
  93458. "lsr r6, r6, r7\n\t"
  93459. #endif
  93460. #ifdef WOLFSSL_KEIL
  93461. "orrs r3, r3, r6\n\t"
  93462. #elif defined(__clang__)
  93463. "orrs r3, r6\n\t"
  93464. #else
  93465. "orr r3, r6\n\t"
  93466. #endif
  93467. "ldr r4, [%[a], #44]\n\t"
  93468. "str r3, [%[r], #52]\n\t"
  93469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93470. "lsrs r6, r4, #1\n\t"
  93471. #else
  93472. "lsr r6, r4, #1\n\t"
  93473. #endif
  93474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93475. "lsls r4, r4, %[n]\n\t"
  93476. #else
  93477. "lsl r4, r4, %[n]\n\t"
  93478. #endif
  93479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93480. "lsrs r6, r6, r7\n\t"
  93481. #else
  93482. "lsr r6, r6, r7\n\t"
  93483. #endif
  93484. #ifdef WOLFSSL_KEIL
  93485. "orrs r5, r5, r6\n\t"
  93486. #elif defined(__clang__)
  93487. "orrs r5, r6\n\t"
  93488. #else
  93489. "orr r5, r6\n\t"
  93490. #endif
  93491. "ldr r3, [%[a], #40]\n\t"
  93492. "str r5, [%[r], #48]\n\t"
  93493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93494. "lsrs r6, r3, #1\n\t"
  93495. #else
  93496. "lsr r6, r3, #1\n\t"
  93497. #endif
  93498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93499. "lsls r3, r3, %[n]\n\t"
  93500. #else
  93501. "lsl r3, r3, %[n]\n\t"
  93502. #endif
  93503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93504. "lsrs r6, r6, r7\n\t"
  93505. #else
  93506. "lsr r6, r6, r7\n\t"
  93507. #endif
  93508. #ifdef WOLFSSL_KEIL
  93509. "orrs r4, r4, r6\n\t"
  93510. #elif defined(__clang__)
  93511. "orrs r4, r6\n\t"
  93512. #else
  93513. "orr r4, r6\n\t"
  93514. #endif
  93515. "ldr r5, [%[a], #36]\n\t"
  93516. "str r4, [%[r], #44]\n\t"
  93517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93518. "lsrs r6, r5, #1\n\t"
  93519. #else
  93520. "lsr r6, r5, #1\n\t"
  93521. #endif
  93522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93523. "lsls r5, r5, %[n]\n\t"
  93524. #else
  93525. "lsl r5, r5, %[n]\n\t"
  93526. #endif
  93527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93528. "lsrs r6, r6, r7\n\t"
  93529. #else
  93530. "lsr r6, r6, r7\n\t"
  93531. #endif
  93532. #ifdef WOLFSSL_KEIL
  93533. "orrs r3, r3, r6\n\t"
  93534. #elif defined(__clang__)
  93535. "orrs r3, r6\n\t"
  93536. #else
  93537. "orr r3, r6\n\t"
  93538. #endif
  93539. "ldr r4, [%[a], #32]\n\t"
  93540. "str r3, [%[r], #40]\n\t"
  93541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93542. "lsrs r6, r4, #1\n\t"
  93543. #else
  93544. "lsr r6, r4, #1\n\t"
  93545. #endif
  93546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93547. "lsls r4, r4, %[n]\n\t"
  93548. #else
  93549. "lsl r4, r4, %[n]\n\t"
  93550. #endif
  93551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93552. "lsrs r6, r6, r7\n\t"
  93553. #else
  93554. "lsr r6, r6, r7\n\t"
  93555. #endif
  93556. #ifdef WOLFSSL_KEIL
  93557. "orrs r5, r5, r6\n\t"
  93558. #elif defined(__clang__)
  93559. "orrs r5, r6\n\t"
  93560. #else
  93561. "orr r5, r6\n\t"
  93562. #endif
  93563. "ldr r3, [%[a], #28]\n\t"
  93564. "str r5, [%[r], #36]\n\t"
  93565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93566. "lsrs r6, r3, #1\n\t"
  93567. #else
  93568. "lsr r6, r3, #1\n\t"
  93569. #endif
  93570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93571. "lsls r3, r3, %[n]\n\t"
  93572. #else
  93573. "lsl r3, r3, %[n]\n\t"
  93574. #endif
  93575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93576. "lsrs r6, r6, r7\n\t"
  93577. #else
  93578. "lsr r6, r6, r7\n\t"
  93579. #endif
  93580. #ifdef WOLFSSL_KEIL
  93581. "orrs r4, r4, r6\n\t"
  93582. #elif defined(__clang__)
  93583. "orrs r4, r6\n\t"
  93584. #else
  93585. "orr r4, r6\n\t"
  93586. #endif
  93587. "ldr r5, [%[a], #24]\n\t"
  93588. "str r4, [%[r], #32]\n\t"
  93589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93590. "lsrs r6, r5, #1\n\t"
  93591. #else
  93592. "lsr r6, r5, #1\n\t"
  93593. #endif
  93594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93595. "lsls r5, r5, %[n]\n\t"
  93596. #else
  93597. "lsl r5, r5, %[n]\n\t"
  93598. #endif
  93599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93600. "lsrs r6, r6, r7\n\t"
  93601. #else
  93602. "lsr r6, r6, r7\n\t"
  93603. #endif
  93604. #ifdef WOLFSSL_KEIL
  93605. "orrs r3, r3, r6\n\t"
  93606. #elif defined(__clang__)
  93607. "orrs r3, r6\n\t"
  93608. #else
  93609. "orr r3, r6\n\t"
  93610. #endif
  93611. "ldr r4, [%[a], #20]\n\t"
  93612. "str r3, [%[r], #28]\n\t"
  93613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93614. "lsrs r6, r4, #1\n\t"
  93615. #else
  93616. "lsr r6, r4, #1\n\t"
  93617. #endif
  93618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93619. "lsls r4, r4, %[n]\n\t"
  93620. #else
  93621. "lsl r4, r4, %[n]\n\t"
  93622. #endif
  93623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93624. "lsrs r6, r6, r7\n\t"
  93625. #else
  93626. "lsr r6, r6, r7\n\t"
  93627. #endif
  93628. #ifdef WOLFSSL_KEIL
  93629. "orrs r5, r5, r6\n\t"
  93630. #elif defined(__clang__)
  93631. "orrs r5, r6\n\t"
  93632. #else
  93633. "orr r5, r6\n\t"
  93634. #endif
  93635. "ldr r3, [%[a], #16]\n\t"
  93636. "str r5, [%[r], #24]\n\t"
  93637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93638. "lsrs r6, r3, #1\n\t"
  93639. #else
  93640. "lsr r6, r3, #1\n\t"
  93641. #endif
  93642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93643. "lsls r3, r3, %[n]\n\t"
  93644. #else
  93645. "lsl r3, r3, %[n]\n\t"
  93646. #endif
  93647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93648. "lsrs r6, r6, r7\n\t"
  93649. #else
  93650. "lsr r6, r6, r7\n\t"
  93651. #endif
  93652. #ifdef WOLFSSL_KEIL
  93653. "orrs r4, r4, r6\n\t"
  93654. #elif defined(__clang__)
  93655. "orrs r4, r6\n\t"
  93656. #else
  93657. "orr r4, r6\n\t"
  93658. #endif
  93659. "ldr r5, [%[a], #12]\n\t"
  93660. "str r4, [%[r], #20]\n\t"
  93661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93662. "lsrs r6, r5, #1\n\t"
  93663. #else
  93664. "lsr r6, r5, #1\n\t"
  93665. #endif
  93666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93667. "lsls r5, r5, %[n]\n\t"
  93668. #else
  93669. "lsl r5, r5, %[n]\n\t"
  93670. #endif
  93671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93672. "lsrs r6, r6, r7\n\t"
  93673. #else
  93674. "lsr r6, r6, r7\n\t"
  93675. #endif
  93676. #ifdef WOLFSSL_KEIL
  93677. "orrs r3, r3, r6\n\t"
  93678. #elif defined(__clang__)
  93679. "orrs r3, r6\n\t"
  93680. #else
  93681. "orr r3, r6\n\t"
  93682. #endif
  93683. "ldr r4, [%[a], #8]\n\t"
  93684. "str r3, [%[r], #16]\n\t"
  93685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93686. "lsrs r6, r4, #1\n\t"
  93687. #else
  93688. "lsr r6, r4, #1\n\t"
  93689. #endif
  93690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93691. "lsls r4, r4, %[n]\n\t"
  93692. #else
  93693. "lsl r4, r4, %[n]\n\t"
  93694. #endif
  93695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93696. "lsrs r6, r6, r7\n\t"
  93697. #else
  93698. "lsr r6, r6, r7\n\t"
  93699. #endif
  93700. #ifdef WOLFSSL_KEIL
  93701. "orrs r5, r5, r6\n\t"
  93702. #elif defined(__clang__)
  93703. "orrs r5, r6\n\t"
  93704. #else
  93705. "orr r5, r6\n\t"
  93706. #endif
  93707. "ldr r3, [%[a], #4]\n\t"
  93708. "str r5, [%[r], #12]\n\t"
  93709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93710. "lsrs r6, r3, #1\n\t"
  93711. #else
  93712. "lsr r6, r3, #1\n\t"
  93713. #endif
  93714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93715. "lsls r3, r3, %[n]\n\t"
  93716. #else
  93717. "lsl r3, r3, %[n]\n\t"
  93718. #endif
  93719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93720. "lsrs r6, r6, r7\n\t"
  93721. #else
  93722. "lsr r6, r6, r7\n\t"
  93723. #endif
  93724. #ifdef WOLFSSL_KEIL
  93725. "orrs r4, r4, r6\n\t"
  93726. #elif defined(__clang__)
  93727. "orrs r4, r6\n\t"
  93728. #else
  93729. "orr r4, r6\n\t"
  93730. #endif
  93731. "ldr r5, [%[a]]\n\t"
  93732. "str r4, [%[r], #8]\n\t"
  93733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93734. "lsrs r6, r5, #1\n\t"
  93735. #else
  93736. "lsr r6, r5, #1\n\t"
  93737. #endif
  93738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93739. "lsls r5, r5, %[n]\n\t"
  93740. #else
  93741. "lsl r5, r5, %[n]\n\t"
  93742. #endif
  93743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93744. "lsrs r6, r6, r7\n\t"
  93745. #else
  93746. "lsr r6, r6, r7\n\t"
  93747. #endif
  93748. #ifdef WOLFSSL_KEIL
  93749. "orrs r3, r3, r6\n\t"
  93750. #elif defined(__clang__)
  93751. "orrs r3, r6\n\t"
  93752. #else
  93753. "orr r3, r6\n\t"
  93754. #endif
  93755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93756. "subs %[a], %[a], #0x40\n\t"
  93757. #else
  93758. "sub %[a], %[a], #0x40\n\t"
  93759. #endif
  93760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93761. "subs %[r], %[r], #0x40\n\t"
  93762. #else
  93763. "sub %[r], %[r], #0x40\n\t"
  93764. #endif
  93765. "ldr r4, [%[a], #60]\n\t"
  93766. "str r3, [%[r], #68]\n\t"
  93767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93768. "lsrs r6, r4, #1\n\t"
  93769. #else
  93770. "lsr r6, r4, #1\n\t"
  93771. #endif
  93772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93773. "lsls r4, r4, %[n]\n\t"
  93774. #else
  93775. "lsl r4, r4, %[n]\n\t"
  93776. #endif
  93777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93778. "lsrs r6, r6, r7\n\t"
  93779. #else
  93780. "lsr r6, r6, r7\n\t"
  93781. #endif
  93782. #ifdef WOLFSSL_KEIL
  93783. "orrs r5, r5, r6\n\t"
  93784. #elif defined(__clang__)
  93785. "orrs r5, r6\n\t"
  93786. #else
  93787. "orr r5, r6\n\t"
  93788. #endif
  93789. "ldr r3, [%[a], #56]\n\t"
  93790. "str r5, [%[r], #64]\n\t"
  93791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93792. "lsrs r6, r3, #1\n\t"
  93793. #else
  93794. "lsr r6, r3, #1\n\t"
  93795. #endif
  93796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93797. "lsls r3, r3, %[n]\n\t"
  93798. #else
  93799. "lsl r3, r3, %[n]\n\t"
  93800. #endif
  93801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93802. "lsrs r6, r6, r7\n\t"
  93803. #else
  93804. "lsr r6, r6, r7\n\t"
  93805. #endif
  93806. #ifdef WOLFSSL_KEIL
  93807. "orrs r4, r4, r6\n\t"
  93808. #elif defined(__clang__)
  93809. "orrs r4, r6\n\t"
  93810. #else
  93811. "orr r4, r6\n\t"
  93812. #endif
  93813. "ldr r5, [%[a], #52]\n\t"
  93814. "str r4, [%[r], #60]\n\t"
  93815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93816. "lsrs r6, r5, #1\n\t"
  93817. #else
  93818. "lsr r6, r5, #1\n\t"
  93819. #endif
  93820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93821. "lsls r5, r5, %[n]\n\t"
  93822. #else
  93823. "lsl r5, r5, %[n]\n\t"
  93824. #endif
  93825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93826. "lsrs r6, r6, r7\n\t"
  93827. #else
  93828. "lsr r6, r6, r7\n\t"
  93829. #endif
  93830. #ifdef WOLFSSL_KEIL
  93831. "orrs r3, r3, r6\n\t"
  93832. #elif defined(__clang__)
  93833. "orrs r3, r6\n\t"
  93834. #else
  93835. "orr r3, r6\n\t"
  93836. #endif
  93837. "ldr r4, [%[a], #48]\n\t"
  93838. "str r3, [%[r], #56]\n\t"
  93839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93840. "lsrs r6, r4, #1\n\t"
  93841. #else
  93842. "lsr r6, r4, #1\n\t"
  93843. #endif
  93844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93845. "lsls r4, r4, %[n]\n\t"
  93846. #else
  93847. "lsl r4, r4, %[n]\n\t"
  93848. #endif
  93849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93850. "lsrs r6, r6, r7\n\t"
  93851. #else
  93852. "lsr r6, r6, r7\n\t"
  93853. #endif
  93854. #ifdef WOLFSSL_KEIL
  93855. "orrs r5, r5, r6\n\t"
  93856. #elif defined(__clang__)
  93857. "orrs r5, r6\n\t"
  93858. #else
  93859. "orr r5, r6\n\t"
  93860. #endif
  93861. "ldr r3, [%[a], #44]\n\t"
  93862. "str r5, [%[r], #52]\n\t"
  93863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93864. "lsrs r6, r3, #1\n\t"
  93865. #else
  93866. "lsr r6, r3, #1\n\t"
  93867. #endif
  93868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93869. "lsls r3, r3, %[n]\n\t"
  93870. #else
  93871. "lsl r3, r3, %[n]\n\t"
  93872. #endif
  93873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93874. "lsrs r6, r6, r7\n\t"
  93875. #else
  93876. "lsr r6, r6, r7\n\t"
  93877. #endif
  93878. #ifdef WOLFSSL_KEIL
  93879. "orrs r4, r4, r6\n\t"
  93880. #elif defined(__clang__)
  93881. "orrs r4, r6\n\t"
  93882. #else
  93883. "orr r4, r6\n\t"
  93884. #endif
  93885. "ldr r5, [%[a], #40]\n\t"
  93886. "str r4, [%[r], #48]\n\t"
  93887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93888. "lsrs r6, r5, #1\n\t"
  93889. #else
  93890. "lsr r6, r5, #1\n\t"
  93891. #endif
  93892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93893. "lsls r5, r5, %[n]\n\t"
  93894. #else
  93895. "lsl r5, r5, %[n]\n\t"
  93896. #endif
  93897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93898. "lsrs r6, r6, r7\n\t"
  93899. #else
  93900. "lsr r6, r6, r7\n\t"
  93901. #endif
  93902. #ifdef WOLFSSL_KEIL
  93903. "orrs r3, r3, r6\n\t"
  93904. #elif defined(__clang__)
  93905. "orrs r3, r6\n\t"
  93906. #else
  93907. "orr r3, r6\n\t"
  93908. #endif
  93909. "ldr r4, [%[a], #36]\n\t"
  93910. "str r3, [%[r], #44]\n\t"
  93911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93912. "lsrs r6, r4, #1\n\t"
  93913. #else
  93914. "lsr r6, r4, #1\n\t"
  93915. #endif
  93916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93917. "lsls r4, r4, %[n]\n\t"
  93918. #else
  93919. "lsl r4, r4, %[n]\n\t"
  93920. #endif
  93921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93922. "lsrs r6, r6, r7\n\t"
  93923. #else
  93924. "lsr r6, r6, r7\n\t"
  93925. #endif
  93926. #ifdef WOLFSSL_KEIL
  93927. "orrs r5, r5, r6\n\t"
  93928. #elif defined(__clang__)
  93929. "orrs r5, r6\n\t"
  93930. #else
  93931. "orr r5, r6\n\t"
  93932. #endif
  93933. "ldr r3, [%[a], #32]\n\t"
  93934. "str r5, [%[r], #40]\n\t"
  93935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93936. "lsrs r6, r3, #1\n\t"
  93937. #else
  93938. "lsr r6, r3, #1\n\t"
  93939. #endif
  93940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93941. "lsls r3, r3, %[n]\n\t"
  93942. #else
  93943. "lsl r3, r3, %[n]\n\t"
  93944. #endif
  93945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93946. "lsrs r6, r6, r7\n\t"
  93947. #else
  93948. "lsr r6, r6, r7\n\t"
  93949. #endif
  93950. #ifdef WOLFSSL_KEIL
  93951. "orrs r4, r4, r6\n\t"
  93952. #elif defined(__clang__)
  93953. "orrs r4, r6\n\t"
  93954. #else
  93955. "orr r4, r6\n\t"
  93956. #endif
  93957. "ldr r5, [%[a], #28]\n\t"
  93958. "str r4, [%[r], #36]\n\t"
  93959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93960. "lsrs r6, r5, #1\n\t"
  93961. #else
  93962. "lsr r6, r5, #1\n\t"
  93963. #endif
  93964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93965. "lsls r5, r5, %[n]\n\t"
  93966. #else
  93967. "lsl r5, r5, %[n]\n\t"
  93968. #endif
  93969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93970. "lsrs r6, r6, r7\n\t"
  93971. #else
  93972. "lsr r6, r6, r7\n\t"
  93973. #endif
  93974. #ifdef WOLFSSL_KEIL
  93975. "orrs r3, r3, r6\n\t"
  93976. #elif defined(__clang__)
  93977. "orrs r3, r6\n\t"
  93978. #else
  93979. "orr r3, r6\n\t"
  93980. #endif
  93981. "ldr r4, [%[a], #24]\n\t"
  93982. "str r3, [%[r], #32]\n\t"
  93983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93984. "lsrs r6, r4, #1\n\t"
  93985. #else
  93986. "lsr r6, r4, #1\n\t"
  93987. #endif
  93988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93989. "lsls r4, r4, %[n]\n\t"
  93990. #else
  93991. "lsl r4, r4, %[n]\n\t"
  93992. #endif
  93993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  93994. "lsrs r6, r6, r7\n\t"
  93995. #else
  93996. "lsr r6, r6, r7\n\t"
  93997. #endif
  93998. #ifdef WOLFSSL_KEIL
  93999. "orrs r5, r5, r6\n\t"
  94000. #elif defined(__clang__)
  94001. "orrs r5, r6\n\t"
  94002. #else
  94003. "orr r5, r6\n\t"
  94004. #endif
  94005. "ldr r3, [%[a], #20]\n\t"
  94006. "str r5, [%[r], #28]\n\t"
  94007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94008. "lsrs r6, r3, #1\n\t"
  94009. #else
  94010. "lsr r6, r3, #1\n\t"
  94011. #endif
  94012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94013. "lsls r3, r3, %[n]\n\t"
  94014. #else
  94015. "lsl r3, r3, %[n]\n\t"
  94016. #endif
  94017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94018. "lsrs r6, r6, r7\n\t"
  94019. #else
  94020. "lsr r6, r6, r7\n\t"
  94021. #endif
  94022. #ifdef WOLFSSL_KEIL
  94023. "orrs r4, r4, r6\n\t"
  94024. #elif defined(__clang__)
  94025. "orrs r4, r6\n\t"
  94026. #else
  94027. "orr r4, r6\n\t"
  94028. #endif
  94029. "ldr r5, [%[a], #16]\n\t"
  94030. "str r4, [%[r], #24]\n\t"
  94031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94032. "lsrs r6, r5, #1\n\t"
  94033. #else
  94034. "lsr r6, r5, #1\n\t"
  94035. #endif
  94036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94037. "lsls r5, r5, %[n]\n\t"
  94038. #else
  94039. "lsl r5, r5, %[n]\n\t"
  94040. #endif
  94041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94042. "lsrs r6, r6, r7\n\t"
  94043. #else
  94044. "lsr r6, r6, r7\n\t"
  94045. #endif
  94046. #ifdef WOLFSSL_KEIL
  94047. "orrs r3, r3, r6\n\t"
  94048. #elif defined(__clang__)
  94049. "orrs r3, r6\n\t"
  94050. #else
  94051. "orr r3, r6\n\t"
  94052. #endif
  94053. "ldr r4, [%[a], #12]\n\t"
  94054. "str r3, [%[r], #20]\n\t"
  94055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94056. "lsrs r6, r4, #1\n\t"
  94057. #else
  94058. "lsr r6, r4, #1\n\t"
  94059. #endif
  94060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94061. "lsls r4, r4, %[n]\n\t"
  94062. #else
  94063. "lsl r4, r4, %[n]\n\t"
  94064. #endif
  94065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94066. "lsrs r6, r6, r7\n\t"
  94067. #else
  94068. "lsr r6, r6, r7\n\t"
  94069. #endif
  94070. #ifdef WOLFSSL_KEIL
  94071. "orrs r5, r5, r6\n\t"
  94072. #elif defined(__clang__)
  94073. "orrs r5, r6\n\t"
  94074. #else
  94075. "orr r5, r6\n\t"
  94076. #endif
  94077. "ldr r3, [%[a], #8]\n\t"
  94078. "str r5, [%[r], #16]\n\t"
  94079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94080. "lsrs r6, r3, #1\n\t"
  94081. #else
  94082. "lsr r6, r3, #1\n\t"
  94083. #endif
  94084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94085. "lsls r3, r3, %[n]\n\t"
  94086. #else
  94087. "lsl r3, r3, %[n]\n\t"
  94088. #endif
  94089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94090. "lsrs r6, r6, r7\n\t"
  94091. #else
  94092. "lsr r6, r6, r7\n\t"
  94093. #endif
  94094. #ifdef WOLFSSL_KEIL
  94095. "orrs r4, r4, r6\n\t"
  94096. #elif defined(__clang__)
  94097. "orrs r4, r6\n\t"
  94098. #else
  94099. "orr r4, r6\n\t"
  94100. #endif
  94101. "ldr r5, [%[a], #4]\n\t"
  94102. "str r4, [%[r], #12]\n\t"
  94103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94104. "lsrs r6, r5, #1\n\t"
  94105. #else
  94106. "lsr r6, r5, #1\n\t"
  94107. #endif
  94108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94109. "lsls r5, r5, %[n]\n\t"
  94110. #else
  94111. "lsl r5, r5, %[n]\n\t"
  94112. #endif
  94113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94114. "lsrs r6, r6, r7\n\t"
  94115. #else
  94116. "lsr r6, r6, r7\n\t"
  94117. #endif
  94118. #ifdef WOLFSSL_KEIL
  94119. "orrs r3, r3, r6\n\t"
  94120. #elif defined(__clang__)
  94121. "orrs r3, r6\n\t"
  94122. #else
  94123. "orr r3, r6\n\t"
  94124. #endif
  94125. "ldr r4, [%[a]]\n\t"
  94126. "str r3, [%[r], #8]\n\t"
  94127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94128. "lsrs r6, r4, #1\n\t"
  94129. #else
  94130. "lsr r6, r4, #1\n\t"
  94131. #endif
  94132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94133. "lsls r4, r4, %[n]\n\t"
  94134. #else
  94135. "lsl r4, r4, %[n]\n\t"
  94136. #endif
  94137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94138. "lsrs r6, r6, r7\n\t"
  94139. #else
  94140. "lsr r6, r6, r7\n\t"
  94141. #endif
  94142. #ifdef WOLFSSL_KEIL
  94143. "orrs r5, r5, r6\n\t"
  94144. #elif defined(__clang__)
  94145. "orrs r5, r6\n\t"
  94146. #else
  94147. "orr r5, r6\n\t"
  94148. #endif
  94149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94150. "subs %[a], %[a], #0x40\n\t"
  94151. #else
  94152. "sub %[a], %[a], #0x40\n\t"
  94153. #endif
  94154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94155. "subs %[r], %[r], #0x40\n\t"
  94156. #else
  94157. "sub %[r], %[r], #0x40\n\t"
  94158. #endif
  94159. "ldr r3, [%[a], #60]\n\t"
  94160. "str r5, [%[r], #68]\n\t"
  94161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94162. "lsrs r6, r3, #1\n\t"
  94163. #else
  94164. "lsr r6, r3, #1\n\t"
  94165. #endif
  94166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94167. "lsls r3, r3, %[n]\n\t"
  94168. #else
  94169. "lsl r3, r3, %[n]\n\t"
  94170. #endif
  94171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94172. "lsrs r6, r6, r7\n\t"
  94173. #else
  94174. "lsr r6, r6, r7\n\t"
  94175. #endif
  94176. #ifdef WOLFSSL_KEIL
  94177. "orrs r4, r4, r6\n\t"
  94178. #elif defined(__clang__)
  94179. "orrs r4, r6\n\t"
  94180. #else
  94181. "orr r4, r6\n\t"
  94182. #endif
  94183. "ldr r5, [%[a], #56]\n\t"
  94184. "str r4, [%[r], #64]\n\t"
  94185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94186. "lsrs r6, r5, #1\n\t"
  94187. #else
  94188. "lsr r6, r5, #1\n\t"
  94189. #endif
  94190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94191. "lsls r5, r5, %[n]\n\t"
  94192. #else
  94193. "lsl r5, r5, %[n]\n\t"
  94194. #endif
  94195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94196. "lsrs r6, r6, r7\n\t"
  94197. #else
  94198. "lsr r6, r6, r7\n\t"
  94199. #endif
  94200. #ifdef WOLFSSL_KEIL
  94201. "orrs r3, r3, r6\n\t"
  94202. #elif defined(__clang__)
  94203. "orrs r3, r6\n\t"
  94204. #else
  94205. "orr r3, r6\n\t"
  94206. #endif
  94207. "ldr r4, [%[a], #52]\n\t"
  94208. "str r3, [%[r], #60]\n\t"
  94209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94210. "lsrs r6, r4, #1\n\t"
  94211. #else
  94212. "lsr r6, r4, #1\n\t"
  94213. #endif
  94214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94215. "lsls r4, r4, %[n]\n\t"
  94216. #else
  94217. "lsl r4, r4, %[n]\n\t"
  94218. #endif
  94219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94220. "lsrs r6, r6, r7\n\t"
  94221. #else
  94222. "lsr r6, r6, r7\n\t"
  94223. #endif
  94224. #ifdef WOLFSSL_KEIL
  94225. "orrs r5, r5, r6\n\t"
  94226. #elif defined(__clang__)
  94227. "orrs r5, r6\n\t"
  94228. #else
  94229. "orr r5, r6\n\t"
  94230. #endif
  94231. "ldr r3, [%[a], #48]\n\t"
  94232. "str r5, [%[r], #56]\n\t"
  94233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94234. "lsrs r6, r3, #1\n\t"
  94235. #else
  94236. "lsr r6, r3, #1\n\t"
  94237. #endif
  94238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94239. "lsls r3, r3, %[n]\n\t"
  94240. #else
  94241. "lsl r3, r3, %[n]\n\t"
  94242. #endif
  94243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94244. "lsrs r6, r6, r7\n\t"
  94245. #else
  94246. "lsr r6, r6, r7\n\t"
  94247. #endif
  94248. #ifdef WOLFSSL_KEIL
  94249. "orrs r4, r4, r6\n\t"
  94250. #elif defined(__clang__)
  94251. "orrs r4, r6\n\t"
  94252. #else
  94253. "orr r4, r6\n\t"
  94254. #endif
  94255. "ldr r5, [%[a], #44]\n\t"
  94256. "str r4, [%[r], #52]\n\t"
  94257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94258. "lsrs r6, r5, #1\n\t"
  94259. #else
  94260. "lsr r6, r5, #1\n\t"
  94261. #endif
  94262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94263. "lsls r5, r5, %[n]\n\t"
  94264. #else
  94265. "lsl r5, r5, %[n]\n\t"
  94266. #endif
  94267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94268. "lsrs r6, r6, r7\n\t"
  94269. #else
  94270. "lsr r6, r6, r7\n\t"
  94271. #endif
  94272. #ifdef WOLFSSL_KEIL
  94273. "orrs r3, r3, r6\n\t"
  94274. #elif defined(__clang__)
  94275. "orrs r3, r6\n\t"
  94276. #else
  94277. "orr r3, r6\n\t"
  94278. #endif
  94279. "ldr r4, [%[a], #40]\n\t"
  94280. "str r3, [%[r], #48]\n\t"
  94281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94282. "lsrs r6, r4, #1\n\t"
  94283. #else
  94284. "lsr r6, r4, #1\n\t"
  94285. #endif
  94286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94287. "lsls r4, r4, %[n]\n\t"
  94288. #else
  94289. "lsl r4, r4, %[n]\n\t"
  94290. #endif
  94291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94292. "lsrs r6, r6, r7\n\t"
  94293. #else
  94294. "lsr r6, r6, r7\n\t"
  94295. #endif
  94296. #ifdef WOLFSSL_KEIL
  94297. "orrs r5, r5, r6\n\t"
  94298. #elif defined(__clang__)
  94299. "orrs r5, r6\n\t"
  94300. #else
  94301. "orr r5, r6\n\t"
  94302. #endif
  94303. "ldr r3, [%[a], #36]\n\t"
  94304. "str r5, [%[r], #44]\n\t"
  94305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94306. "lsrs r6, r3, #1\n\t"
  94307. #else
  94308. "lsr r6, r3, #1\n\t"
  94309. #endif
  94310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94311. "lsls r3, r3, %[n]\n\t"
  94312. #else
  94313. "lsl r3, r3, %[n]\n\t"
  94314. #endif
  94315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94316. "lsrs r6, r6, r7\n\t"
  94317. #else
  94318. "lsr r6, r6, r7\n\t"
  94319. #endif
  94320. #ifdef WOLFSSL_KEIL
  94321. "orrs r4, r4, r6\n\t"
  94322. #elif defined(__clang__)
  94323. "orrs r4, r6\n\t"
  94324. #else
  94325. "orr r4, r6\n\t"
  94326. #endif
  94327. "ldr r5, [%[a], #32]\n\t"
  94328. "str r4, [%[r], #40]\n\t"
  94329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94330. "lsrs r6, r5, #1\n\t"
  94331. #else
  94332. "lsr r6, r5, #1\n\t"
  94333. #endif
  94334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94335. "lsls r5, r5, %[n]\n\t"
  94336. #else
  94337. "lsl r5, r5, %[n]\n\t"
  94338. #endif
  94339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94340. "lsrs r6, r6, r7\n\t"
  94341. #else
  94342. "lsr r6, r6, r7\n\t"
  94343. #endif
  94344. #ifdef WOLFSSL_KEIL
  94345. "orrs r3, r3, r6\n\t"
  94346. #elif defined(__clang__)
  94347. "orrs r3, r6\n\t"
  94348. #else
  94349. "orr r3, r6\n\t"
  94350. #endif
  94351. "ldr r4, [%[a], #28]\n\t"
  94352. "str r3, [%[r], #36]\n\t"
  94353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94354. "lsrs r6, r4, #1\n\t"
  94355. #else
  94356. "lsr r6, r4, #1\n\t"
  94357. #endif
  94358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94359. "lsls r4, r4, %[n]\n\t"
  94360. #else
  94361. "lsl r4, r4, %[n]\n\t"
  94362. #endif
  94363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94364. "lsrs r6, r6, r7\n\t"
  94365. #else
  94366. "lsr r6, r6, r7\n\t"
  94367. #endif
  94368. #ifdef WOLFSSL_KEIL
  94369. "orrs r5, r5, r6\n\t"
  94370. #elif defined(__clang__)
  94371. "orrs r5, r6\n\t"
  94372. #else
  94373. "orr r5, r6\n\t"
  94374. #endif
  94375. "ldr r3, [%[a], #24]\n\t"
  94376. "str r5, [%[r], #32]\n\t"
  94377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94378. "lsrs r6, r3, #1\n\t"
  94379. #else
  94380. "lsr r6, r3, #1\n\t"
  94381. #endif
  94382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94383. "lsls r3, r3, %[n]\n\t"
  94384. #else
  94385. "lsl r3, r3, %[n]\n\t"
  94386. #endif
  94387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94388. "lsrs r6, r6, r7\n\t"
  94389. #else
  94390. "lsr r6, r6, r7\n\t"
  94391. #endif
  94392. #ifdef WOLFSSL_KEIL
  94393. "orrs r4, r4, r6\n\t"
  94394. #elif defined(__clang__)
  94395. "orrs r4, r6\n\t"
  94396. #else
  94397. "orr r4, r6\n\t"
  94398. #endif
  94399. "ldr r5, [%[a], #20]\n\t"
  94400. "str r4, [%[r], #28]\n\t"
  94401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94402. "lsrs r6, r5, #1\n\t"
  94403. #else
  94404. "lsr r6, r5, #1\n\t"
  94405. #endif
  94406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94407. "lsls r5, r5, %[n]\n\t"
  94408. #else
  94409. "lsl r5, r5, %[n]\n\t"
  94410. #endif
  94411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94412. "lsrs r6, r6, r7\n\t"
  94413. #else
  94414. "lsr r6, r6, r7\n\t"
  94415. #endif
  94416. #ifdef WOLFSSL_KEIL
  94417. "orrs r3, r3, r6\n\t"
  94418. #elif defined(__clang__)
  94419. "orrs r3, r6\n\t"
  94420. #else
  94421. "orr r3, r6\n\t"
  94422. #endif
  94423. "ldr r4, [%[a], #16]\n\t"
  94424. "str r3, [%[r], #24]\n\t"
  94425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94426. "lsrs r6, r4, #1\n\t"
  94427. #else
  94428. "lsr r6, r4, #1\n\t"
  94429. #endif
  94430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94431. "lsls r4, r4, %[n]\n\t"
  94432. #else
  94433. "lsl r4, r4, %[n]\n\t"
  94434. #endif
  94435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94436. "lsrs r6, r6, r7\n\t"
  94437. #else
  94438. "lsr r6, r6, r7\n\t"
  94439. #endif
  94440. #ifdef WOLFSSL_KEIL
  94441. "orrs r5, r5, r6\n\t"
  94442. #elif defined(__clang__)
  94443. "orrs r5, r6\n\t"
  94444. #else
  94445. "orr r5, r6\n\t"
  94446. #endif
  94447. "ldr r3, [%[a], #12]\n\t"
  94448. "str r5, [%[r], #20]\n\t"
  94449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94450. "lsrs r6, r3, #1\n\t"
  94451. #else
  94452. "lsr r6, r3, #1\n\t"
  94453. #endif
  94454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94455. "lsls r3, r3, %[n]\n\t"
  94456. #else
  94457. "lsl r3, r3, %[n]\n\t"
  94458. #endif
  94459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94460. "lsrs r6, r6, r7\n\t"
  94461. #else
  94462. "lsr r6, r6, r7\n\t"
  94463. #endif
  94464. #ifdef WOLFSSL_KEIL
  94465. "orrs r4, r4, r6\n\t"
  94466. #elif defined(__clang__)
  94467. "orrs r4, r6\n\t"
  94468. #else
  94469. "orr r4, r6\n\t"
  94470. #endif
  94471. "ldr r5, [%[a], #8]\n\t"
  94472. "str r4, [%[r], #16]\n\t"
  94473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94474. "lsrs r6, r5, #1\n\t"
  94475. #else
  94476. "lsr r6, r5, #1\n\t"
  94477. #endif
  94478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94479. "lsls r5, r5, %[n]\n\t"
  94480. #else
  94481. "lsl r5, r5, %[n]\n\t"
  94482. #endif
  94483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94484. "lsrs r6, r6, r7\n\t"
  94485. #else
  94486. "lsr r6, r6, r7\n\t"
  94487. #endif
  94488. #ifdef WOLFSSL_KEIL
  94489. "orrs r3, r3, r6\n\t"
  94490. #elif defined(__clang__)
  94491. "orrs r3, r6\n\t"
  94492. #else
  94493. "orr r3, r6\n\t"
  94494. #endif
  94495. "ldr r4, [%[a], #4]\n\t"
  94496. "str r3, [%[r], #12]\n\t"
  94497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94498. "lsrs r6, r4, #1\n\t"
  94499. #else
  94500. "lsr r6, r4, #1\n\t"
  94501. #endif
  94502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94503. "lsls r4, r4, %[n]\n\t"
  94504. #else
  94505. "lsl r4, r4, %[n]\n\t"
  94506. #endif
  94507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94508. "lsrs r6, r6, r7\n\t"
  94509. #else
  94510. "lsr r6, r6, r7\n\t"
  94511. #endif
  94512. #ifdef WOLFSSL_KEIL
  94513. "orrs r5, r5, r6\n\t"
  94514. #elif defined(__clang__)
  94515. "orrs r5, r6\n\t"
  94516. #else
  94517. "orr r5, r6\n\t"
  94518. #endif
  94519. "ldr r3, [%[a]]\n\t"
  94520. "str r5, [%[r], #8]\n\t"
  94521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94522. "lsrs r6, r3, #1\n\t"
  94523. #else
  94524. "lsr r6, r3, #1\n\t"
  94525. #endif
  94526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94527. "lsls r3, r3, %[n]\n\t"
  94528. #else
  94529. "lsl r3, r3, %[n]\n\t"
  94530. #endif
  94531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94532. "lsrs r6, r6, r7\n\t"
  94533. #else
  94534. "lsr r6, r6, r7\n\t"
  94535. #endif
  94536. #ifdef WOLFSSL_KEIL
  94537. "orrs r4, r4, r6\n\t"
  94538. #elif defined(__clang__)
  94539. "orrs r4, r6\n\t"
  94540. #else
  94541. "orr r4, r6\n\t"
  94542. #endif
  94543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94544. "subs %[a], %[a], #0x40\n\t"
  94545. #else
  94546. "sub %[a], %[a], #0x40\n\t"
  94547. #endif
  94548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94549. "subs %[r], %[r], #0x40\n\t"
  94550. #else
  94551. "sub %[r], %[r], #0x40\n\t"
  94552. #endif
  94553. "ldr r5, [%[a], #60]\n\t"
  94554. "str r4, [%[r], #68]\n\t"
  94555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94556. "lsrs r6, r5, #1\n\t"
  94557. #else
  94558. "lsr r6, r5, #1\n\t"
  94559. #endif
  94560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94561. "lsls r5, r5, %[n]\n\t"
  94562. #else
  94563. "lsl r5, r5, %[n]\n\t"
  94564. #endif
  94565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94566. "lsrs r6, r6, r7\n\t"
  94567. #else
  94568. "lsr r6, r6, r7\n\t"
  94569. #endif
  94570. #ifdef WOLFSSL_KEIL
  94571. "orrs r3, r3, r6\n\t"
  94572. #elif defined(__clang__)
  94573. "orrs r3, r6\n\t"
  94574. #else
  94575. "orr r3, r6\n\t"
  94576. #endif
  94577. "ldr r4, [%[a], #56]\n\t"
  94578. "str r3, [%[r], #64]\n\t"
  94579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94580. "lsrs r6, r4, #1\n\t"
  94581. #else
  94582. "lsr r6, r4, #1\n\t"
  94583. #endif
  94584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94585. "lsls r4, r4, %[n]\n\t"
  94586. #else
  94587. "lsl r4, r4, %[n]\n\t"
  94588. #endif
  94589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94590. "lsrs r6, r6, r7\n\t"
  94591. #else
  94592. "lsr r6, r6, r7\n\t"
  94593. #endif
  94594. #ifdef WOLFSSL_KEIL
  94595. "orrs r5, r5, r6\n\t"
  94596. #elif defined(__clang__)
  94597. "orrs r5, r6\n\t"
  94598. #else
  94599. "orr r5, r6\n\t"
  94600. #endif
  94601. "ldr r3, [%[a], #52]\n\t"
  94602. "str r5, [%[r], #60]\n\t"
  94603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94604. "lsrs r6, r3, #1\n\t"
  94605. #else
  94606. "lsr r6, r3, #1\n\t"
  94607. #endif
  94608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94609. "lsls r3, r3, %[n]\n\t"
  94610. #else
  94611. "lsl r3, r3, %[n]\n\t"
  94612. #endif
  94613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94614. "lsrs r6, r6, r7\n\t"
  94615. #else
  94616. "lsr r6, r6, r7\n\t"
  94617. #endif
  94618. #ifdef WOLFSSL_KEIL
  94619. "orrs r4, r4, r6\n\t"
  94620. #elif defined(__clang__)
  94621. "orrs r4, r6\n\t"
  94622. #else
  94623. "orr r4, r6\n\t"
  94624. #endif
  94625. "ldr r5, [%[a], #48]\n\t"
  94626. "str r4, [%[r], #56]\n\t"
  94627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94628. "lsrs r6, r5, #1\n\t"
  94629. #else
  94630. "lsr r6, r5, #1\n\t"
  94631. #endif
  94632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94633. "lsls r5, r5, %[n]\n\t"
  94634. #else
  94635. "lsl r5, r5, %[n]\n\t"
  94636. #endif
  94637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94638. "lsrs r6, r6, r7\n\t"
  94639. #else
  94640. "lsr r6, r6, r7\n\t"
  94641. #endif
  94642. #ifdef WOLFSSL_KEIL
  94643. "orrs r3, r3, r6\n\t"
  94644. #elif defined(__clang__)
  94645. "orrs r3, r6\n\t"
  94646. #else
  94647. "orr r3, r6\n\t"
  94648. #endif
  94649. "ldr r4, [%[a], #44]\n\t"
  94650. "str r3, [%[r], #52]\n\t"
  94651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94652. "lsrs r6, r4, #1\n\t"
  94653. #else
  94654. "lsr r6, r4, #1\n\t"
  94655. #endif
  94656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94657. "lsls r4, r4, %[n]\n\t"
  94658. #else
  94659. "lsl r4, r4, %[n]\n\t"
  94660. #endif
  94661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94662. "lsrs r6, r6, r7\n\t"
  94663. #else
  94664. "lsr r6, r6, r7\n\t"
  94665. #endif
  94666. #ifdef WOLFSSL_KEIL
  94667. "orrs r5, r5, r6\n\t"
  94668. #elif defined(__clang__)
  94669. "orrs r5, r6\n\t"
  94670. #else
  94671. "orr r5, r6\n\t"
  94672. #endif
  94673. "ldr r3, [%[a], #40]\n\t"
  94674. "str r5, [%[r], #48]\n\t"
  94675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94676. "lsrs r6, r3, #1\n\t"
  94677. #else
  94678. "lsr r6, r3, #1\n\t"
  94679. #endif
  94680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94681. "lsls r3, r3, %[n]\n\t"
  94682. #else
  94683. "lsl r3, r3, %[n]\n\t"
  94684. #endif
  94685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94686. "lsrs r6, r6, r7\n\t"
  94687. #else
  94688. "lsr r6, r6, r7\n\t"
  94689. #endif
  94690. #ifdef WOLFSSL_KEIL
  94691. "orrs r4, r4, r6\n\t"
  94692. #elif defined(__clang__)
  94693. "orrs r4, r6\n\t"
  94694. #else
  94695. "orr r4, r6\n\t"
  94696. #endif
  94697. "ldr r5, [%[a], #36]\n\t"
  94698. "str r4, [%[r], #44]\n\t"
  94699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94700. "lsrs r6, r5, #1\n\t"
  94701. #else
  94702. "lsr r6, r5, #1\n\t"
  94703. #endif
  94704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94705. "lsls r5, r5, %[n]\n\t"
  94706. #else
  94707. "lsl r5, r5, %[n]\n\t"
  94708. #endif
  94709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94710. "lsrs r6, r6, r7\n\t"
  94711. #else
  94712. "lsr r6, r6, r7\n\t"
  94713. #endif
  94714. #ifdef WOLFSSL_KEIL
  94715. "orrs r3, r3, r6\n\t"
  94716. #elif defined(__clang__)
  94717. "orrs r3, r6\n\t"
  94718. #else
  94719. "orr r3, r6\n\t"
  94720. #endif
  94721. "ldr r4, [%[a], #32]\n\t"
  94722. "str r3, [%[r], #40]\n\t"
  94723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94724. "lsrs r6, r4, #1\n\t"
  94725. #else
  94726. "lsr r6, r4, #1\n\t"
  94727. #endif
  94728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94729. "lsls r4, r4, %[n]\n\t"
  94730. #else
  94731. "lsl r4, r4, %[n]\n\t"
  94732. #endif
  94733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94734. "lsrs r6, r6, r7\n\t"
  94735. #else
  94736. "lsr r6, r6, r7\n\t"
  94737. #endif
  94738. #ifdef WOLFSSL_KEIL
  94739. "orrs r5, r5, r6\n\t"
  94740. #elif defined(__clang__)
  94741. "orrs r5, r6\n\t"
  94742. #else
  94743. "orr r5, r6\n\t"
  94744. #endif
  94745. "ldr r3, [%[a], #28]\n\t"
  94746. "str r5, [%[r], #36]\n\t"
  94747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94748. "lsrs r6, r3, #1\n\t"
  94749. #else
  94750. "lsr r6, r3, #1\n\t"
  94751. #endif
  94752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94753. "lsls r3, r3, %[n]\n\t"
  94754. #else
  94755. "lsl r3, r3, %[n]\n\t"
  94756. #endif
  94757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94758. "lsrs r6, r6, r7\n\t"
  94759. #else
  94760. "lsr r6, r6, r7\n\t"
  94761. #endif
  94762. #ifdef WOLFSSL_KEIL
  94763. "orrs r4, r4, r6\n\t"
  94764. #elif defined(__clang__)
  94765. "orrs r4, r6\n\t"
  94766. #else
  94767. "orr r4, r6\n\t"
  94768. #endif
  94769. "ldr r5, [%[a], #24]\n\t"
  94770. "str r4, [%[r], #32]\n\t"
  94771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94772. "lsrs r6, r5, #1\n\t"
  94773. #else
  94774. "lsr r6, r5, #1\n\t"
  94775. #endif
  94776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94777. "lsls r5, r5, %[n]\n\t"
  94778. #else
  94779. "lsl r5, r5, %[n]\n\t"
  94780. #endif
  94781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94782. "lsrs r6, r6, r7\n\t"
  94783. #else
  94784. "lsr r6, r6, r7\n\t"
  94785. #endif
  94786. #ifdef WOLFSSL_KEIL
  94787. "orrs r3, r3, r6\n\t"
  94788. #elif defined(__clang__)
  94789. "orrs r3, r6\n\t"
  94790. #else
  94791. "orr r3, r6\n\t"
  94792. #endif
  94793. "ldr r4, [%[a], #20]\n\t"
  94794. "str r3, [%[r], #28]\n\t"
  94795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94796. "lsrs r6, r4, #1\n\t"
  94797. #else
  94798. "lsr r6, r4, #1\n\t"
  94799. #endif
  94800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94801. "lsls r4, r4, %[n]\n\t"
  94802. #else
  94803. "lsl r4, r4, %[n]\n\t"
  94804. #endif
  94805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94806. "lsrs r6, r6, r7\n\t"
  94807. #else
  94808. "lsr r6, r6, r7\n\t"
  94809. #endif
  94810. #ifdef WOLFSSL_KEIL
  94811. "orrs r5, r5, r6\n\t"
  94812. #elif defined(__clang__)
  94813. "orrs r5, r6\n\t"
  94814. #else
  94815. "orr r5, r6\n\t"
  94816. #endif
  94817. "ldr r3, [%[a], #16]\n\t"
  94818. "str r5, [%[r], #24]\n\t"
  94819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94820. "lsrs r6, r3, #1\n\t"
  94821. #else
  94822. "lsr r6, r3, #1\n\t"
  94823. #endif
  94824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94825. "lsls r3, r3, %[n]\n\t"
  94826. #else
  94827. "lsl r3, r3, %[n]\n\t"
  94828. #endif
  94829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94830. "lsrs r6, r6, r7\n\t"
  94831. #else
  94832. "lsr r6, r6, r7\n\t"
  94833. #endif
  94834. #ifdef WOLFSSL_KEIL
  94835. "orrs r4, r4, r6\n\t"
  94836. #elif defined(__clang__)
  94837. "orrs r4, r6\n\t"
  94838. #else
  94839. "orr r4, r6\n\t"
  94840. #endif
  94841. "ldr r5, [%[a], #12]\n\t"
  94842. "str r4, [%[r], #20]\n\t"
  94843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94844. "lsrs r6, r5, #1\n\t"
  94845. #else
  94846. "lsr r6, r5, #1\n\t"
  94847. #endif
  94848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94849. "lsls r5, r5, %[n]\n\t"
  94850. #else
  94851. "lsl r5, r5, %[n]\n\t"
  94852. #endif
  94853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94854. "lsrs r6, r6, r7\n\t"
  94855. #else
  94856. "lsr r6, r6, r7\n\t"
  94857. #endif
  94858. #ifdef WOLFSSL_KEIL
  94859. "orrs r3, r3, r6\n\t"
  94860. #elif defined(__clang__)
  94861. "orrs r3, r6\n\t"
  94862. #else
  94863. "orr r3, r6\n\t"
  94864. #endif
  94865. "ldr r4, [%[a], #8]\n\t"
  94866. "str r3, [%[r], #16]\n\t"
  94867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94868. "lsrs r6, r4, #1\n\t"
  94869. #else
  94870. "lsr r6, r4, #1\n\t"
  94871. #endif
  94872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94873. "lsls r4, r4, %[n]\n\t"
  94874. #else
  94875. "lsl r4, r4, %[n]\n\t"
  94876. #endif
  94877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94878. "lsrs r6, r6, r7\n\t"
  94879. #else
  94880. "lsr r6, r6, r7\n\t"
  94881. #endif
  94882. #ifdef WOLFSSL_KEIL
  94883. "orrs r5, r5, r6\n\t"
  94884. #elif defined(__clang__)
  94885. "orrs r5, r6\n\t"
  94886. #else
  94887. "orr r5, r6\n\t"
  94888. #endif
  94889. "ldr r3, [%[a], #4]\n\t"
  94890. "str r5, [%[r], #12]\n\t"
  94891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94892. "lsrs r6, r3, #1\n\t"
  94893. #else
  94894. "lsr r6, r3, #1\n\t"
  94895. #endif
  94896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94897. "lsls r3, r3, %[n]\n\t"
  94898. #else
  94899. "lsl r3, r3, %[n]\n\t"
  94900. #endif
  94901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94902. "lsrs r6, r6, r7\n\t"
  94903. #else
  94904. "lsr r6, r6, r7\n\t"
  94905. #endif
  94906. #ifdef WOLFSSL_KEIL
  94907. "orrs r4, r4, r6\n\t"
  94908. #elif defined(__clang__)
  94909. "orrs r4, r6\n\t"
  94910. #else
  94911. "orr r4, r6\n\t"
  94912. #endif
  94913. "ldr r5, [%[a]]\n\t"
  94914. "str r4, [%[r], #8]\n\t"
  94915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94916. "lsrs r6, r5, #1\n\t"
  94917. #else
  94918. "lsr r6, r5, #1\n\t"
  94919. #endif
  94920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94921. "lsls r5, r5, %[n]\n\t"
  94922. #else
  94923. "lsl r5, r5, %[n]\n\t"
  94924. #endif
  94925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94926. "lsrs r6, r6, r7\n\t"
  94927. #else
  94928. "lsr r6, r6, r7\n\t"
  94929. #endif
  94930. #ifdef WOLFSSL_KEIL
  94931. "orrs r3, r3, r6\n\t"
  94932. #elif defined(__clang__)
  94933. "orrs r3, r6\n\t"
  94934. #else
  94935. "orr r3, r6\n\t"
  94936. #endif
  94937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94938. "subs %[a], %[a], #0x40\n\t"
  94939. #else
  94940. "sub %[a], %[a], #0x40\n\t"
  94941. #endif
  94942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94943. "subs %[r], %[r], #0x40\n\t"
  94944. #else
  94945. "sub %[r], %[r], #0x40\n\t"
  94946. #endif
  94947. "ldr r4, [%[a], #60]\n\t"
  94948. "str r3, [%[r], #68]\n\t"
  94949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94950. "lsrs r6, r4, #1\n\t"
  94951. #else
  94952. "lsr r6, r4, #1\n\t"
  94953. #endif
  94954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94955. "lsls r4, r4, %[n]\n\t"
  94956. #else
  94957. "lsl r4, r4, %[n]\n\t"
  94958. #endif
  94959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94960. "lsrs r6, r6, r7\n\t"
  94961. #else
  94962. "lsr r6, r6, r7\n\t"
  94963. #endif
  94964. #ifdef WOLFSSL_KEIL
  94965. "orrs r5, r5, r6\n\t"
  94966. #elif defined(__clang__)
  94967. "orrs r5, r6\n\t"
  94968. #else
  94969. "orr r5, r6\n\t"
  94970. #endif
  94971. "ldr r3, [%[a], #56]\n\t"
  94972. "str r5, [%[r], #64]\n\t"
  94973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94974. "lsrs r6, r3, #1\n\t"
  94975. #else
  94976. "lsr r6, r3, #1\n\t"
  94977. #endif
  94978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94979. "lsls r3, r3, %[n]\n\t"
  94980. #else
  94981. "lsl r3, r3, %[n]\n\t"
  94982. #endif
  94983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94984. "lsrs r6, r6, r7\n\t"
  94985. #else
  94986. "lsr r6, r6, r7\n\t"
  94987. #endif
  94988. #ifdef WOLFSSL_KEIL
  94989. "orrs r4, r4, r6\n\t"
  94990. #elif defined(__clang__)
  94991. "orrs r4, r6\n\t"
  94992. #else
  94993. "orr r4, r6\n\t"
  94994. #endif
  94995. "ldr r5, [%[a], #52]\n\t"
  94996. "str r4, [%[r], #60]\n\t"
  94997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  94998. "lsrs r6, r5, #1\n\t"
  94999. #else
  95000. "lsr r6, r5, #1\n\t"
  95001. #endif
  95002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95003. "lsls r5, r5, %[n]\n\t"
  95004. #else
  95005. "lsl r5, r5, %[n]\n\t"
  95006. #endif
  95007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95008. "lsrs r6, r6, r7\n\t"
  95009. #else
  95010. "lsr r6, r6, r7\n\t"
  95011. #endif
  95012. #ifdef WOLFSSL_KEIL
  95013. "orrs r3, r3, r6\n\t"
  95014. #elif defined(__clang__)
  95015. "orrs r3, r6\n\t"
  95016. #else
  95017. "orr r3, r6\n\t"
  95018. #endif
  95019. "ldr r4, [%[a], #48]\n\t"
  95020. "str r3, [%[r], #56]\n\t"
  95021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95022. "lsrs r6, r4, #1\n\t"
  95023. #else
  95024. "lsr r6, r4, #1\n\t"
  95025. #endif
  95026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95027. "lsls r4, r4, %[n]\n\t"
  95028. #else
  95029. "lsl r4, r4, %[n]\n\t"
  95030. #endif
  95031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95032. "lsrs r6, r6, r7\n\t"
  95033. #else
  95034. "lsr r6, r6, r7\n\t"
  95035. #endif
  95036. #ifdef WOLFSSL_KEIL
  95037. "orrs r5, r5, r6\n\t"
  95038. #elif defined(__clang__)
  95039. "orrs r5, r6\n\t"
  95040. #else
  95041. "orr r5, r6\n\t"
  95042. #endif
  95043. "ldr r3, [%[a], #44]\n\t"
  95044. "str r5, [%[r], #52]\n\t"
  95045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95046. "lsrs r6, r3, #1\n\t"
  95047. #else
  95048. "lsr r6, r3, #1\n\t"
  95049. #endif
  95050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95051. "lsls r3, r3, %[n]\n\t"
  95052. #else
  95053. "lsl r3, r3, %[n]\n\t"
  95054. #endif
  95055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95056. "lsrs r6, r6, r7\n\t"
  95057. #else
  95058. "lsr r6, r6, r7\n\t"
  95059. #endif
  95060. #ifdef WOLFSSL_KEIL
  95061. "orrs r4, r4, r6\n\t"
  95062. #elif defined(__clang__)
  95063. "orrs r4, r6\n\t"
  95064. #else
  95065. "orr r4, r6\n\t"
  95066. #endif
  95067. "ldr r5, [%[a], #40]\n\t"
  95068. "str r4, [%[r], #48]\n\t"
  95069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95070. "lsrs r6, r5, #1\n\t"
  95071. #else
  95072. "lsr r6, r5, #1\n\t"
  95073. #endif
  95074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95075. "lsls r5, r5, %[n]\n\t"
  95076. #else
  95077. "lsl r5, r5, %[n]\n\t"
  95078. #endif
  95079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95080. "lsrs r6, r6, r7\n\t"
  95081. #else
  95082. "lsr r6, r6, r7\n\t"
  95083. #endif
  95084. #ifdef WOLFSSL_KEIL
  95085. "orrs r3, r3, r6\n\t"
  95086. #elif defined(__clang__)
  95087. "orrs r3, r6\n\t"
  95088. #else
  95089. "orr r3, r6\n\t"
  95090. #endif
  95091. "ldr r4, [%[a], #36]\n\t"
  95092. "str r3, [%[r], #44]\n\t"
  95093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95094. "lsrs r6, r4, #1\n\t"
  95095. #else
  95096. "lsr r6, r4, #1\n\t"
  95097. #endif
  95098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95099. "lsls r4, r4, %[n]\n\t"
  95100. #else
  95101. "lsl r4, r4, %[n]\n\t"
  95102. #endif
  95103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95104. "lsrs r6, r6, r7\n\t"
  95105. #else
  95106. "lsr r6, r6, r7\n\t"
  95107. #endif
  95108. #ifdef WOLFSSL_KEIL
  95109. "orrs r5, r5, r6\n\t"
  95110. #elif defined(__clang__)
  95111. "orrs r5, r6\n\t"
  95112. #else
  95113. "orr r5, r6\n\t"
  95114. #endif
  95115. "ldr r3, [%[a], #32]\n\t"
  95116. "str r5, [%[r], #40]\n\t"
  95117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95118. "lsrs r6, r3, #1\n\t"
  95119. #else
  95120. "lsr r6, r3, #1\n\t"
  95121. #endif
  95122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95123. "lsls r3, r3, %[n]\n\t"
  95124. #else
  95125. "lsl r3, r3, %[n]\n\t"
  95126. #endif
  95127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95128. "lsrs r6, r6, r7\n\t"
  95129. #else
  95130. "lsr r6, r6, r7\n\t"
  95131. #endif
  95132. #ifdef WOLFSSL_KEIL
  95133. "orrs r4, r4, r6\n\t"
  95134. #elif defined(__clang__)
  95135. "orrs r4, r6\n\t"
  95136. #else
  95137. "orr r4, r6\n\t"
  95138. #endif
  95139. "ldr r5, [%[a], #28]\n\t"
  95140. "str r4, [%[r], #36]\n\t"
  95141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95142. "lsrs r6, r5, #1\n\t"
  95143. #else
  95144. "lsr r6, r5, #1\n\t"
  95145. #endif
  95146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95147. "lsls r5, r5, %[n]\n\t"
  95148. #else
  95149. "lsl r5, r5, %[n]\n\t"
  95150. #endif
  95151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95152. "lsrs r6, r6, r7\n\t"
  95153. #else
  95154. "lsr r6, r6, r7\n\t"
  95155. #endif
  95156. #ifdef WOLFSSL_KEIL
  95157. "orrs r3, r3, r6\n\t"
  95158. #elif defined(__clang__)
  95159. "orrs r3, r6\n\t"
  95160. #else
  95161. "orr r3, r6\n\t"
  95162. #endif
  95163. "ldr r4, [%[a], #24]\n\t"
  95164. "str r3, [%[r], #32]\n\t"
  95165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95166. "lsrs r6, r4, #1\n\t"
  95167. #else
  95168. "lsr r6, r4, #1\n\t"
  95169. #endif
  95170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95171. "lsls r4, r4, %[n]\n\t"
  95172. #else
  95173. "lsl r4, r4, %[n]\n\t"
  95174. #endif
  95175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95176. "lsrs r6, r6, r7\n\t"
  95177. #else
  95178. "lsr r6, r6, r7\n\t"
  95179. #endif
  95180. #ifdef WOLFSSL_KEIL
  95181. "orrs r5, r5, r6\n\t"
  95182. #elif defined(__clang__)
  95183. "orrs r5, r6\n\t"
  95184. #else
  95185. "orr r5, r6\n\t"
  95186. #endif
  95187. "ldr r3, [%[a], #20]\n\t"
  95188. "str r5, [%[r], #28]\n\t"
  95189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95190. "lsrs r6, r3, #1\n\t"
  95191. #else
  95192. "lsr r6, r3, #1\n\t"
  95193. #endif
  95194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95195. "lsls r3, r3, %[n]\n\t"
  95196. #else
  95197. "lsl r3, r3, %[n]\n\t"
  95198. #endif
  95199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95200. "lsrs r6, r6, r7\n\t"
  95201. #else
  95202. "lsr r6, r6, r7\n\t"
  95203. #endif
  95204. #ifdef WOLFSSL_KEIL
  95205. "orrs r4, r4, r6\n\t"
  95206. #elif defined(__clang__)
  95207. "orrs r4, r6\n\t"
  95208. #else
  95209. "orr r4, r6\n\t"
  95210. #endif
  95211. "ldr r5, [%[a], #16]\n\t"
  95212. "str r4, [%[r], #24]\n\t"
  95213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95214. "lsrs r6, r5, #1\n\t"
  95215. #else
  95216. "lsr r6, r5, #1\n\t"
  95217. #endif
  95218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95219. "lsls r5, r5, %[n]\n\t"
  95220. #else
  95221. "lsl r5, r5, %[n]\n\t"
  95222. #endif
  95223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95224. "lsrs r6, r6, r7\n\t"
  95225. #else
  95226. "lsr r6, r6, r7\n\t"
  95227. #endif
  95228. #ifdef WOLFSSL_KEIL
  95229. "orrs r3, r3, r6\n\t"
  95230. #elif defined(__clang__)
  95231. "orrs r3, r6\n\t"
  95232. #else
  95233. "orr r3, r6\n\t"
  95234. #endif
  95235. "ldr r4, [%[a], #12]\n\t"
  95236. "str r3, [%[r], #20]\n\t"
  95237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95238. "lsrs r6, r4, #1\n\t"
  95239. #else
  95240. "lsr r6, r4, #1\n\t"
  95241. #endif
  95242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95243. "lsls r4, r4, %[n]\n\t"
  95244. #else
  95245. "lsl r4, r4, %[n]\n\t"
  95246. #endif
  95247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95248. "lsrs r6, r6, r7\n\t"
  95249. #else
  95250. "lsr r6, r6, r7\n\t"
  95251. #endif
  95252. #ifdef WOLFSSL_KEIL
  95253. "orrs r5, r5, r6\n\t"
  95254. #elif defined(__clang__)
  95255. "orrs r5, r6\n\t"
  95256. #else
  95257. "orr r5, r6\n\t"
  95258. #endif
  95259. "ldr r3, [%[a], #8]\n\t"
  95260. "str r5, [%[r], #16]\n\t"
  95261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95262. "lsrs r6, r3, #1\n\t"
  95263. #else
  95264. "lsr r6, r3, #1\n\t"
  95265. #endif
  95266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95267. "lsls r3, r3, %[n]\n\t"
  95268. #else
  95269. "lsl r3, r3, %[n]\n\t"
  95270. #endif
  95271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95272. "lsrs r6, r6, r7\n\t"
  95273. #else
  95274. "lsr r6, r6, r7\n\t"
  95275. #endif
  95276. #ifdef WOLFSSL_KEIL
  95277. "orrs r4, r4, r6\n\t"
  95278. #elif defined(__clang__)
  95279. "orrs r4, r6\n\t"
  95280. #else
  95281. "orr r4, r6\n\t"
  95282. #endif
  95283. "ldr r5, [%[a], #4]\n\t"
  95284. "str r4, [%[r], #12]\n\t"
  95285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95286. "lsrs r6, r5, #1\n\t"
  95287. #else
  95288. "lsr r6, r5, #1\n\t"
  95289. #endif
  95290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95291. "lsls r5, r5, %[n]\n\t"
  95292. #else
  95293. "lsl r5, r5, %[n]\n\t"
  95294. #endif
  95295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95296. "lsrs r6, r6, r7\n\t"
  95297. #else
  95298. "lsr r6, r6, r7\n\t"
  95299. #endif
  95300. #ifdef WOLFSSL_KEIL
  95301. "orrs r3, r3, r6\n\t"
  95302. #elif defined(__clang__)
  95303. "orrs r3, r6\n\t"
  95304. #else
  95305. "orr r3, r6\n\t"
  95306. #endif
  95307. "ldr r4, [%[a]]\n\t"
  95308. "str r3, [%[r], #8]\n\t"
  95309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95310. "lsrs r6, r4, #1\n\t"
  95311. #else
  95312. "lsr r6, r4, #1\n\t"
  95313. #endif
  95314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95315. "lsls r4, r4, %[n]\n\t"
  95316. #else
  95317. "lsl r4, r4, %[n]\n\t"
  95318. #endif
  95319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95320. "lsrs r6, r6, r7\n\t"
  95321. #else
  95322. "lsr r6, r6, r7\n\t"
  95323. #endif
  95324. #ifdef WOLFSSL_KEIL
  95325. "orrs r5, r5, r6\n\t"
  95326. #elif defined(__clang__)
  95327. "orrs r5, r6\n\t"
  95328. #else
  95329. "orr r5, r6\n\t"
  95330. #endif
  95331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95332. "subs %[a], %[a], #0x40\n\t"
  95333. #else
  95334. "sub %[a], %[a], #0x40\n\t"
  95335. #endif
  95336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95337. "subs %[r], %[r], #0x40\n\t"
  95338. #else
  95339. "sub %[r], %[r], #0x40\n\t"
  95340. #endif
  95341. "ldr r3, [%[a], #60]\n\t"
  95342. "str r5, [%[r], #68]\n\t"
  95343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95344. "lsrs r6, r3, #1\n\t"
  95345. #else
  95346. "lsr r6, r3, #1\n\t"
  95347. #endif
  95348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95349. "lsls r3, r3, %[n]\n\t"
  95350. #else
  95351. "lsl r3, r3, %[n]\n\t"
  95352. #endif
  95353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95354. "lsrs r6, r6, r7\n\t"
  95355. #else
  95356. "lsr r6, r6, r7\n\t"
  95357. #endif
  95358. #ifdef WOLFSSL_KEIL
  95359. "orrs r4, r4, r6\n\t"
  95360. #elif defined(__clang__)
  95361. "orrs r4, r6\n\t"
  95362. #else
  95363. "orr r4, r6\n\t"
  95364. #endif
  95365. "ldr r5, [%[a], #56]\n\t"
  95366. "str r4, [%[r], #64]\n\t"
  95367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95368. "lsrs r6, r5, #1\n\t"
  95369. #else
  95370. "lsr r6, r5, #1\n\t"
  95371. #endif
  95372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95373. "lsls r5, r5, %[n]\n\t"
  95374. #else
  95375. "lsl r5, r5, %[n]\n\t"
  95376. #endif
  95377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95378. "lsrs r6, r6, r7\n\t"
  95379. #else
  95380. "lsr r6, r6, r7\n\t"
  95381. #endif
  95382. #ifdef WOLFSSL_KEIL
  95383. "orrs r3, r3, r6\n\t"
  95384. #elif defined(__clang__)
  95385. "orrs r3, r6\n\t"
  95386. #else
  95387. "orr r3, r6\n\t"
  95388. #endif
  95389. "ldr r4, [%[a], #52]\n\t"
  95390. "str r3, [%[r], #60]\n\t"
  95391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95392. "lsrs r6, r4, #1\n\t"
  95393. #else
  95394. "lsr r6, r4, #1\n\t"
  95395. #endif
  95396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95397. "lsls r4, r4, %[n]\n\t"
  95398. #else
  95399. "lsl r4, r4, %[n]\n\t"
  95400. #endif
  95401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95402. "lsrs r6, r6, r7\n\t"
  95403. #else
  95404. "lsr r6, r6, r7\n\t"
  95405. #endif
  95406. #ifdef WOLFSSL_KEIL
  95407. "orrs r5, r5, r6\n\t"
  95408. #elif defined(__clang__)
  95409. "orrs r5, r6\n\t"
  95410. #else
  95411. "orr r5, r6\n\t"
  95412. #endif
  95413. "ldr r3, [%[a], #48]\n\t"
  95414. "str r5, [%[r], #56]\n\t"
  95415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95416. "lsrs r6, r3, #1\n\t"
  95417. #else
  95418. "lsr r6, r3, #1\n\t"
  95419. #endif
  95420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95421. "lsls r3, r3, %[n]\n\t"
  95422. #else
  95423. "lsl r3, r3, %[n]\n\t"
  95424. #endif
  95425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95426. "lsrs r6, r6, r7\n\t"
  95427. #else
  95428. "lsr r6, r6, r7\n\t"
  95429. #endif
  95430. #ifdef WOLFSSL_KEIL
  95431. "orrs r4, r4, r6\n\t"
  95432. #elif defined(__clang__)
  95433. "orrs r4, r6\n\t"
  95434. #else
  95435. "orr r4, r6\n\t"
  95436. #endif
  95437. "ldr r5, [%[a], #44]\n\t"
  95438. "str r4, [%[r], #52]\n\t"
  95439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95440. "lsrs r6, r5, #1\n\t"
  95441. #else
  95442. "lsr r6, r5, #1\n\t"
  95443. #endif
  95444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95445. "lsls r5, r5, %[n]\n\t"
  95446. #else
  95447. "lsl r5, r5, %[n]\n\t"
  95448. #endif
  95449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95450. "lsrs r6, r6, r7\n\t"
  95451. #else
  95452. "lsr r6, r6, r7\n\t"
  95453. #endif
  95454. #ifdef WOLFSSL_KEIL
  95455. "orrs r3, r3, r6\n\t"
  95456. #elif defined(__clang__)
  95457. "orrs r3, r6\n\t"
  95458. #else
  95459. "orr r3, r6\n\t"
  95460. #endif
  95461. "ldr r4, [%[a], #40]\n\t"
  95462. "str r3, [%[r], #48]\n\t"
  95463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95464. "lsrs r6, r4, #1\n\t"
  95465. #else
  95466. "lsr r6, r4, #1\n\t"
  95467. #endif
  95468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95469. "lsls r4, r4, %[n]\n\t"
  95470. #else
  95471. "lsl r4, r4, %[n]\n\t"
  95472. #endif
  95473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95474. "lsrs r6, r6, r7\n\t"
  95475. #else
  95476. "lsr r6, r6, r7\n\t"
  95477. #endif
  95478. #ifdef WOLFSSL_KEIL
  95479. "orrs r5, r5, r6\n\t"
  95480. #elif defined(__clang__)
  95481. "orrs r5, r6\n\t"
  95482. #else
  95483. "orr r5, r6\n\t"
  95484. #endif
  95485. "ldr r3, [%[a], #36]\n\t"
  95486. "str r5, [%[r], #44]\n\t"
  95487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95488. "lsrs r6, r3, #1\n\t"
  95489. #else
  95490. "lsr r6, r3, #1\n\t"
  95491. #endif
  95492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95493. "lsls r3, r3, %[n]\n\t"
  95494. #else
  95495. "lsl r3, r3, %[n]\n\t"
  95496. #endif
  95497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95498. "lsrs r6, r6, r7\n\t"
  95499. #else
  95500. "lsr r6, r6, r7\n\t"
  95501. #endif
  95502. #ifdef WOLFSSL_KEIL
  95503. "orrs r4, r4, r6\n\t"
  95504. #elif defined(__clang__)
  95505. "orrs r4, r6\n\t"
  95506. #else
  95507. "orr r4, r6\n\t"
  95508. #endif
  95509. "ldr r5, [%[a], #32]\n\t"
  95510. "str r4, [%[r], #40]\n\t"
  95511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95512. "lsrs r6, r5, #1\n\t"
  95513. #else
  95514. "lsr r6, r5, #1\n\t"
  95515. #endif
  95516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95517. "lsls r5, r5, %[n]\n\t"
  95518. #else
  95519. "lsl r5, r5, %[n]\n\t"
  95520. #endif
  95521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95522. "lsrs r6, r6, r7\n\t"
  95523. #else
  95524. "lsr r6, r6, r7\n\t"
  95525. #endif
  95526. #ifdef WOLFSSL_KEIL
  95527. "orrs r3, r3, r6\n\t"
  95528. #elif defined(__clang__)
  95529. "orrs r3, r6\n\t"
  95530. #else
  95531. "orr r3, r6\n\t"
  95532. #endif
  95533. "ldr r4, [%[a], #28]\n\t"
  95534. "str r3, [%[r], #36]\n\t"
  95535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95536. "lsrs r6, r4, #1\n\t"
  95537. #else
  95538. "lsr r6, r4, #1\n\t"
  95539. #endif
  95540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95541. "lsls r4, r4, %[n]\n\t"
  95542. #else
  95543. "lsl r4, r4, %[n]\n\t"
  95544. #endif
  95545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95546. "lsrs r6, r6, r7\n\t"
  95547. #else
  95548. "lsr r6, r6, r7\n\t"
  95549. #endif
  95550. #ifdef WOLFSSL_KEIL
  95551. "orrs r5, r5, r6\n\t"
  95552. #elif defined(__clang__)
  95553. "orrs r5, r6\n\t"
  95554. #else
  95555. "orr r5, r6\n\t"
  95556. #endif
  95557. "ldr r3, [%[a], #24]\n\t"
  95558. "str r5, [%[r], #32]\n\t"
  95559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95560. "lsrs r6, r3, #1\n\t"
  95561. #else
  95562. "lsr r6, r3, #1\n\t"
  95563. #endif
  95564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95565. "lsls r3, r3, %[n]\n\t"
  95566. #else
  95567. "lsl r3, r3, %[n]\n\t"
  95568. #endif
  95569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95570. "lsrs r6, r6, r7\n\t"
  95571. #else
  95572. "lsr r6, r6, r7\n\t"
  95573. #endif
  95574. #ifdef WOLFSSL_KEIL
  95575. "orrs r4, r4, r6\n\t"
  95576. #elif defined(__clang__)
  95577. "orrs r4, r6\n\t"
  95578. #else
  95579. "orr r4, r6\n\t"
  95580. #endif
  95581. "ldr r5, [%[a], #20]\n\t"
  95582. "str r4, [%[r], #28]\n\t"
  95583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95584. "lsrs r6, r5, #1\n\t"
  95585. #else
  95586. "lsr r6, r5, #1\n\t"
  95587. #endif
  95588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95589. "lsls r5, r5, %[n]\n\t"
  95590. #else
  95591. "lsl r5, r5, %[n]\n\t"
  95592. #endif
  95593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95594. "lsrs r6, r6, r7\n\t"
  95595. #else
  95596. "lsr r6, r6, r7\n\t"
  95597. #endif
  95598. #ifdef WOLFSSL_KEIL
  95599. "orrs r3, r3, r6\n\t"
  95600. #elif defined(__clang__)
  95601. "orrs r3, r6\n\t"
  95602. #else
  95603. "orr r3, r6\n\t"
  95604. #endif
  95605. "ldr r4, [%[a], #16]\n\t"
  95606. "str r3, [%[r], #24]\n\t"
  95607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95608. "lsrs r6, r4, #1\n\t"
  95609. #else
  95610. "lsr r6, r4, #1\n\t"
  95611. #endif
  95612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95613. "lsls r4, r4, %[n]\n\t"
  95614. #else
  95615. "lsl r4, r4, %[n]\n\t"
  95616. #endif
  95617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95618. "lsrs r6, r6, r7\n\t"
  95619. #else
  95620. "lsr r6, r6, r7\n\t"
  95621. #endif
  95622. #ifdef WOLFSSL_KEIL
  95623. "orrs r5, r5, r6\n\t"
  95624. #elif defined(__clang__)
  95625. "orrs r5, r6\n\t"
  95626. #else
  95627. "orr r5, r6\n\t"
  95628. #endif
  95629. "ldr r3, [%[a], #12]\n\t"
  95630. "str r5, [%[r], #20]\n\t"
  95631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95632. "lsrs r6, r3, #1\n\t"
  95633. #else
  95634. "lsr r6, r3, #1\n\t"
  95635. #endif
  95636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95637. "lsls r3, r3, %[n]\n\t"
  95638. #else
  95639. "lsl r3, r3, %[n]\n\t"
  95640. #endif
  95641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95642. "lsrs r6, r6, r7\n\t"
  95643. #else
  95644. "lsr r6, r6, r7\n\t"
  95645. #endif
  95646. #ifdef WOLFSSL_KEIL
  95647. "orrs r4, r4, r6\n\t"
  95648. #elif defined(__clang__)
  95649. "orrs r4, r6\n\t"
  95650. #else
  95651. "orr r4, r6\n\t"
  95652. #endif
  95653. "ldr r5, [%[a], #8]\n\t"
  95654. "str r4, [%[r], #16]\n\t"
  95655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95656. "lsrs r6, r5, #1\n\t"
  95657. #else
  95658. "lsr r6, r5, #1\n\t"
  95659. #endif
  95660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95661. "lsls r5, r5, %[n]\n\t"
  95662. #else
  95663. "lsl r5, r5, %[n]\n\t"
  95664. #endif
  95665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95666. "lsrs r6, r6, r7\n\t"
  95667. #else
  95668. "lsr r6, r6, r7\n\t"
  95669. #endif
  95670. #ifdef WOLFSSL_KEIL
  95671. "orrs r3, r3, r6\n\t"
  95672. #elif defined(__clang__)
  95673. "orrs r3, r6\n\t"
  95674. #else
  95675. "orr r3, r6\n\t"
  95676. #endif
  95677. "ldr r4, [%[a], #4]\n\t"
  95678. "str r3, [%[r], #12]\n\t"
  95679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95680. "lsrs r6, r4, #1\n\t"
  95681. #else
  95682. "lsr r6, r4, #1\n\t"
  95683. #endif
  95684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95685. "lsls r4, r4, %[n]\n\t"
  95686. #else
  95687. "lsl r4, r4, %[n]\n\t"
  95688. #endif
  95689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95690. "lsrs r6, r6, r7\n\t"
  95691. #else
  95692. "lsr r6, r6, r7\n\t"
  95693. #endif
  95694. #ifdef WOLFSSL_KEIL
  95695. "orrs r5, r5, r6\n\t"
  95696. #elif defined(__clang__)
  95697. "orrs r5, r6\n\t"
  95698. #else
  95699. "orr r5, r6\n\t"
  95700. #endif
  95701. "ldr r3, [%[a]]\n\t"
  95702. "str r5, [%[r], #8]\n\t"
  95703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95704. "lsrs r6, r3, #1\n\t"
  95705. #else
  95706. "lsr r6, r3, #1\n\t"
  95707. #endif
  95708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95709. "lsls r3, r3, %[n]\n\t"
  95710. #else
  95711. "lsl r3, r3, %[n]\n\t"
  95712. #endif
  95713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  95714. "lsrs r6, r6, r7\n\t"
  95715. #else
  95716. "lsr r6, r6, r7\n\t"
  95717. #endif
  95718. #ifdef WOLFSSL_KEIL
  95719. "orrs r4, r4, r6\n\t"
  95720. #elif defined(__clang__)
  95721. "orrs r4, r6\n\t"
  95722. #else
  95723. "orr r4, r6\n\t"
  95724. #endif
  95725. "str r3, [%[r]]\n\t"
  95726. "str r4, [%[r], #4]\n\t"
  95727. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  95728. :
  95729. : "memory", "r3", "r4", "r5", "r6", "r7"
  95730. );
  95731. }
  95732. /* Modular exponentiate 2 to the e mod m. (r = 2^e mod m)
  95733. *
  95734. * r A single precision number that is the result of the operation.
  95735. * e A single precision number that is the exponent.
  95736. * bits The number of bits in the exponent.
  95737. * m A single precision number that is the modulus.
  95738. * returns 0 on success.
  95739. * returns MEMORY_E on dynamic memory allocation failure.
  95740. * returns MP_VAL when base is even.
  95741. */
  95742. static int sp_4096_mod_exp_2_128(sp_digit* r, const sp_digit* e, int bits,
  95743. const sp_digit* m)
  95744. {
  95745. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  95746. sp_digit* td = NULL;
  95747. #else
  95748. sp_digit td[385];
  95749. #endif
  95750. sp_digit* norm = NULL;
  95751. sp_digit* tmp = NULL;
  95752. sp_digit mp = 1;
  95753. sp_digit n;
  95754. sp_digit o;
  95755. sp_digit mask;
  95756. int i;
  95757. int c;
  95758. byte y;
  95759. int err = MP_OKAY;
  95760. if (bits == 0) {
  95761. err = MP_VAL;
  95762. }
  95763. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  95764. if (err == MP_OKAY) {
  95765. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 385, NULL,
  95766. DYNAMIC_TYPE_TMP_BUFFER);
  95767. if (td == NULL)
  95768. err = MEMORY_E;
  95769. }
  95770. #endif
  95771. if (err == MP_OKAY) {
  95772. norm = td;
  95773. tmp = td + 256;
  95774. sp_4096_mont_setup(m, &mp);
  95775. sp_4096_mont_norm_128(norm, m);
  95776. i = (bits - 1) / 32;
  95777. n = e[i--];
  95778. c = bits & 31;
  95779. if (c == 0) {
  95780. c = 32;
  95781. }
  95782. c -= bits % 5;
  95783. if (c == 32) {
  95784. c = 27;
  95785. }
  95786. if (c < 0) {
  95787. /* Number of bits in top word is less than number needed. */
  95788. c = -c;
  95789. y = (byte)(n << c);
  95790. n = e[i--];
  95791. y |= (byte)(n >> (64 - c));
  95792. n <<= c;
  95793. c = 64 - c;
  95794. }
  95795. else if (c == 0) {
  95796. /* All bits in top word used. */
  95797. y = (byte)n;
  95798. }
  95799. else {
  95800. y = (byte)(n >> c);
  95801. n <<= 32 - c;
  95802. }
  95803. sp_4096_lshift_128(r, norm, y);
  95804. for (; i>=0 || c>=5; ) {
  95805. if (c == 0) {
  95806. n = e[i--];
  95807. y = (byte)(n >> 27);
  95808. n <<= 5;
  95809. c = 27;
  95810. }
  95811. else if (c < 5) {
  95812. y = (byte)(n >> 27);
  95813. n = e[i--];
  95814. c = 5 - c;
  95815. y |= (byte)(n >> (32 - c));
  95816. n <<= c;
  95817. c = 32 - c;
  95818. }
  95819. else {
  95820. y = (byte)((n >> 27) & 0x1f);
  95821. n <<= 5;
  95822. c -= 5;
  95823. }
  95824. sp_4096_mont_sqr_128(r, r, m, mp);
  95825. sp_4096_mont_sqr_128(r, r, m, mp);
  95826. sp_4096_mont_sqr_128(r, r, m, mp);
  95827. sp_4096_mont_sqr_128(r, r, m, mp);
  95828. sp_4096_mont_sqr_128(r, r, m, mp);
  95829. sp_4096_lshift_128(r, r, y);
  95830. sp_4096_mul_d_128(tmp, norm, r[128]);
  95831. r[128] = 0;
  95832. o = sp_4096_add_128(r, r, tmp);
  95833. sp_4096_cond_sub_128(r, r, m, (sp_digit)0 - o);
  95834. }
  95835. XMEMSET(&r[128], 0, sizeof(sp_digit) * 128U);
  95836. sp_4096_mont_reduce_128(r, m, mp);
  95837. mask = 0 - (sp_4096_cmp_128(r, m) >= 0);
  95838. sp_4096_cond_sub_128(r, r, m, mask);
  95839. }
  95840. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  95841. if (td != NULL)
  95842. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  95843. #endif
  95844. return err;
  95845. }
  95846. #endif /* HAVE_FFDHE_4096 */
  95847. /* Perform the modular exponentiation for Diffie-Hellman.
  95848. *
  95849. * base Base.
  95850. * exp Array of bytes that is the exponent.
  95851. * expLen Length of data, in bytes, in exponent.
  95852. * mod Modulus.
  95853. * out Buffer to hold big-endian bytes of exponentiation result.
  95854. * Must be at least 512 bytes long.
  95855. * outLen Length, in bytes, of exponentiation result.
  95856. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  95857. * and MEMORY_E if memory allocation fails.
  95858. */
  95859. int sp_DhExp_4096(const mp_int* base, const byte* exp, word32 expLen,
  95860. const mp_int* mod, byte* out, word32* outLen)
  95861. {
  95862. int err = MP_OKAY;
  95863. sp_digit b[256];
  95864. sp_digit e[128];
  95865. sp_digit m[128];
  95866. sp_digit* r = b;
  95867. word32 i;
  95868. if (mp_count_bits(base) > 4096) {
  95869. err = MP_READ_E;
  95870. }
  95871. else if (expLen > 512) {
  95872. err = MP_READ_E;
  95873. }
  95874. else if (mp_count_bits(mod) != 4096) {
  95875. err = MP_READ_E;
  95876. }
  95877. else if (mp_iseven(mod)) {
  95878. err = MP_VAL;
  95879. }
  95880. if (err == MP_OKAY) {
  95881. sp_4096_from_mp(b, 128, base);
  95882. sp_4096_from_bin(e, 128, exp, expLen);
  95883. sp_4096_from_mp(m, 128, mod);
  95884. #ifdef HAVE_FFDHE_4096
  95885. if (base->used == 1 && base->dp[0] == 2 && m[127] == (sp_digit)-1)
  95886. err = sp_4096_mod_exp_2_128(r, e, expLen * 8, m);
  95887. else
  95888. #endif
  95889. err = sp_4096_mod_exp_128(r, b, e, expLen * 8, m, 0);
  95890. }
  95891. if (err == MP_OKAY) {
  95892. sp_4096_to_bin_128(r, out);
  95893. *outLen = 512;
  95894. for (i=0; i<512 && out[i] == 0; i++) {
  95895. /* Search for first non-zero. */
  95896. }
  95897. *outLen -= i;
  95898. XMEMMOVE(out, out + i, *outLen);
  95899. }
  95900. XMEMSET(e, 0, sizeof(e));
  95901. return err;
  95902. }
  95903. #endif /* WOLFSSL_HAVE_SP_DH */
  95904. #endif /* WOLFSSL_HAVE_SP_DH | (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) */
  95905. #endif /* WOLFSSL_SP_4096 */
  95906. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH */
  95907. #ifdef WOLFSSL_HAVE_SP_ECC
  95908. #ifndef WOLFSSL_SP_NO_256
  95909. /* Point structure to use. */
  95910. typedef struct sp_point_256 {
  95911. /* X ordinate of point. */
  95912. sp_digit x[2 * 8];
  95913. /* Y ordinate of point. */
  95914. sp_digit y[2 * 8];
  95915. /* Z ordinate of point. */
  95916. sp_digit z[2 * 8];
  95917. /* Indicates point is at infinity. */
  95918. int infinity;
  95919. } sp_point_256;
  95920. /* The modulus (prime) of the curve P256. */
  95921. static const sp_digit p256_mod[8] = {
  95922. 0xffffffff,0xffffffff,0xffffffff,0x00000000,0x00000000,0x00000000,
  95923. 0x00000001,0xffffffff
  95924. };
  95925. /* The Montgomery normalizer for modulus of the curve P256. */
  95926. static const sp_digit p256_norm_mod[8] = {
  95927. 0x00000001,0x00000000,0x00000000,0xffffffff,0xffffffff,0xffffffff,
  95928. 0xfffffffe,0x00000000
  95929. };
  95930. /* The Montgomery multiplier for modulus of the curve P256. */
  95931. static const sp_digit p256_mp_mod = 0x00000001;
  95932. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  95933. defined(HAVE_ECC_VERIFY)
  95934. /* The order of the curve P256. */
  95935. static const sp_digit p256_order[8] = {
  95936. 0xfc632551,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  95937. 0x00000000,0xffffffff
  95938. };
  95939. #endif
  95940. /* The order of the curve P256 minus 2. */
  95941. static const sp_digit p256_order2[8] = {
  95942. 0xfc63254f,0xf3b9cac2,0xa7179e84,0xbce6faad,0xffffffff,0xffffffff,
  95943. 0x00000000,0xffffffff
  95944. };
  95945. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  95946. /* The Montgomery normalizer for order of the curve P256. */
  95947. static const sp_digit p256_norm_order[8] = {
  95948. 0x039cdaaf,0x0c46353d,0x58e8617b,0x43190552,0x00000000,0x00000000,
  95949. 0xffffffff,0x00000000
  95950. };
  95951. #endif
  95952. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  95953. /* The Montgomery multiplier for order of the curve P256. */
  95954. static const sp_digit p256_mp_order = 0xee00bc4f;
  95955. #endif
  95956. /* The base point of curve P256. */
  95957. static const sp_point_256 p256_base = {
  95958. /* X ordinate */
  95959. {
  95960. 0xd898c296,0xf4a13945,0x2deb33a0,0x77037d81,0x63a440f2,0xf8bce6e5,
  95961. 0xe12c4247,0x6b17d1f2,
  95962. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  95963. (sp_digit)0, (sp_digit)0, (sp_digit)0
  95964. },
  95965. /* Y ordinate */
  95966. {
  95967. 0x37bf51f5,0xcbb64068,0x6b315ece,0x2bce3357,0x7c0f9e16,0x8ee7eb4a,
  95968. 0xfe1a7f9b,0x4fe342e2,
  95969. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  95970. (sp_digit)0, (sp_digit)0, (sp_digit)0
  95971. },
  95972. /* Z ordinate */
  95973. {
  95974. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  95975. 0x00000000,0x00000000,
  95976. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  95977. (sp_digit)0, (sp_digit)0, (sp_digit)0
  95978. },
  95979. /* infinity */
  95980. 0
  95981. };
  95982. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  95983. static const sp_digit p256_b[8] = {
  95984. 0x27d2604b,0x3bce3c3e,0xcc53b0f6,0x651d06b0,0x769886bc,0xb3ebbd55,
  95985. 0xaa3a93e7,0x5ac635d8
  95986. };
  95987. #endif
  95988. /* Multiply a and b into r. (r = a * b)
  95989. *
  95990. * r A single precision integer.
  95991. * a A single precision integer.
  95992. * b A single precision integer.
  95993. */
  95994. SP_NOINLINE static void sp_256_mul_8(sp_digit* r, const sp_digit* a,
  95995. const sp_digit* b)
  95996. {
  95997. sp_digit t[8 * 2];
  95998. sp_digit* tmp = t;
  95999. __asm__ __volatile__ (
  96000. "movs r3, #0\n\t"
  96001. "movs r4, #0\n\t"
  96002. "mov r8, r3\n\t"
  96003. "mov r11, %[tmp]\n\t"
  96004. "mov r9, %[a]\n\t"
  96005. "mov r10, %[b]\n\t"
  96006. "movs r6, #32\n\t"
  96007. "add r6, r6, r9\n\t"
  96008. "mov r12, r6\n\t"
  96009. "\n"
  96010. "L_sp_256_mul_8_words_%=:\n\t"
  96011. "movs %[tmp], #0\n\t"
  96012. "movs r5, #0\n\t"
  96013. "movs r6, #28\n\t"
  96014. "mov %[a], r8\n\t"
  96015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96016. "subs %[a], %[a], r6\n\t"
  96017. #else
  96018. "sub %[a], %[a], r6\n\t"
  96019. #endif
  96020. #ifdef WOLFSSL_KEIL
  96021. "sbcs r6, r6, r6\n\t"
  96022. #elif defined(__clang__)
  96023. "sbcs r6, r6\n\t"
  96024. #else
  96025. "sbc r6, r6\n\t"
  96026. #endif
  96027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96028. "mvns r6, r6\n\t"
  96029. #else
  96030. "mvn r6, r6\n\t"
  96031. #endif
  96032. #ifdef WOLFSSL_KEIL
  96033. "ands %[a], %[a], r6\n\t"
  96034. #elif defined(__clang__)
  96035. "ands %[a], r6\n\t"
  96036. #else
  96037. "and %[a], r6\n\t"
  96038. #endif
  96039. "mov %[b], r8\n\t"
  96040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96041. "subs %[b], %[b], %[a]\n\t"
  96042. #else
  96043. "sub %[b], %[b], %[a]\n\t"
  96044. #endif
  96045. "add %[a], %[a], r9\n\t"
  96046. "add %[b], %[b], r10\n\t"
  96047. "\n"
  96048. "L_sp_256_mul_8_mul_%=:\n\t"
  96049. "# Multiply Start\n\t"
  96050. "ldrh r6, [%[a]]\n\t"
  96051. "ldrh r7, [%[b]]\n\t"
  96052. #ifdef WOLFSSL_KEIL
  96053. "muls r7, r6, r7\n\t"
  96054. #elif defined(__clang__)
  96055. "muls r7, r6\n\t"
  96056. #else
  96057. "mul r7, r6\n\t"
  96058. #endif
  96059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96060. "adds r3, r3, r7\n\t"
  96061. #else
  96062. "add r3, r3, r7\n\t"
  96063. #endif
  96064. #ifdef WOLFSSL_KEIL
  96065. "adcs r4, r4, %[tmp]\n\t"
  96066. #elif defined(__clang__)
  96067. "adcs r4, %[tmp]\n\t"
  96068. #else
  96069. "adc r4, %[tmp]\n\t"
  96070. #endif
  96071. #ifdef WOLFSSL_KEIL
  96072. "adcs r5, r5, %[tmp]\n\t"
  96073. #elif defined(__clang__)
  96074. "adcs r5, %[tmp]\n\t"
  96075. #else
  96076. "adc r5, %[tmp]\n\t"
  96077. #endif
  96078. "ldr r7, [%[b]]\n\t"
  96079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96080. "lsrs r7, r7, #16\n\t"
  96081. #else
  96082. "lsr r7, r7, #16\n\t"
  96083. #endif
  96084. #ifdef WOLFSSL_KEIL
  96085. "muls r6, r7, r6\n\t"
  96086. #elif defined(__clang__)
  96087. "muls r6, r7\n\t"
  96088. #else
  96089. "mul r6, r7\n\t"
  96090. #endif
  96091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96092. "lsrs r7, r6, #16\n\t"
  96093. #else
  96094. "lsr r7, r6, #16\n\t"
  96095. #endif
  96096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96097. "lsls r6, r6, #16\n\t"
  96098. #else
  96099. "lsl r6, r6, #16\n\t"
  96100. #endif
  96101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96102. "adds r3, r3, r6\n\t"
  96103. #else
  96104. "add r3, r3, r6\n\t"
  96105. #endif
  96106. #ifdef WOLFSSL_KEIL
  96107. "adcs r4, r4, r7\n\t"
  96108. #elif defined(__clang__)
  96109. "adcs r4, r7\n\t"
  96110. #else
  96111. "adc r4, r7\n\t"
  96112. #endif
  96113. #ifdef WOLFSSL_KEIL
  96114. "adcs r5, r5, %[tmp]\n\t"
  96115. #elif defined(__clang__)
  96116. "adcs r5, %[tmp]\n\t"
  96117. #else
  96118. "adc r5, %[tmp]\n\t"
  96119. #endif
  96120. "ldr r6, [%[a]]\n\t"
  96121. "ldr r7, [%[b]]\n\t"
  96122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96123. "lsrs r6, r6, #16\n\t"
  96124. #else
  96125. "lsr r6, r6, #16\n\t"
  96126. #endif
  96127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96128. "lsrs r7, r7, #16\n\t"
  96129. #else
  96130. "lsr r7, r7, #16\n\t"
  96131. #endif
  96132. #ifdef WOLFSSL_KEIL
  96133. "muls r7, r6, r7\n\t"
  96134. #elif defined(__clang__)
  96135. "muls r7, r6\n\t"
  96136. #else
  96137. "mul r7, r6\n\t"
  96138. #endif
  96139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96140. "adds r4, r4, r7\n\t"
  96141. #else
  96142. "add r4, r4, r7\n\t"
  96143. #endif
  96144. #ifdef WOLFSSL_KEIL
  96145. "adcs r5, r5, %[tmp]\n\t"
  96146. #elif defined(__clang__)
  96147. "adcs r5, %[tmp]\n\t"
  96148. #else
  96149. "adc r5, %[tmp]\n\t"
  96150. #endif
  96151. "ldrh r7, [%[b]]\n\t"
  96152. #ifdef WOLFSSL_KEIL
  96153. "muls r6, r7, r6\n\t"
  96154. #elif defined(__clang__)
  96155. "muls r6, r7\n\t"
  96156. #else
  96157. "mul r6, r7\n\t"
  96158. #endif
  96159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96160. "lsrs r7, r6, #16\n\t"
  96161. #else
  96162. "lsr r7, r6, #16\n\t"
  96163. #endif
  96164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96165. "lsls r6, r6, #16\n\t"
  96166. #else
  96167. "lsl r6, r6, #16\n\t"
  96168. #endif
  96169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96170. "adds r3, r3, r6\n\t"
  96171. #else
  96172. "add r3, r3, r6\n\t"
  96173. #endif
  96174. #ifdef WOLFSSL_KEIL
  96175. "adcs r4, r4, r7\n\t"
  96176. #elif defined(__clang__)
  96177. "adcs r4, r7\n\t"
  96178. #else
  96179. "adc r4, r7\n\t"
  96180. #endif
  96181. #ifdef WOLFSSL_KEIL
  96182. "adcs r5, r5, %[tmp]\n\t"
  96183. #elif defined(__clang__)
  96184. "adcs r5, %[tmp]\n\t"
  96185. #else
  96186. "adc r5, %[tmp]\n\t"
  96187. #endif
  96188. "# Multiply Done\n\t"
  96189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96190. "adds %[a], %[a], #4\n\t"
  96191. #else
  96192. "add %[a], %[a], #4\n\t"
  96193. #endif
  96194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96195. "subs %[b], %[b], #4\n\t"
  96196. #else
  96197. "sub %[b], %[b], #4\n\t"
  96198. #endif
  96199. "cmp %[a], r12\n\t"
  96200. "beq L_sp_256_mul_8_done_mul_%=\n\t"
  96201. "mov r6, r8\n\t"
  96202. "add r6, r6, r9\n\t"
  96203. "cmp %[a], r6\n\t"
  96204. "ble L_sp_256_mul_8_mul_%=\n\t"
  96205. "\n"
  96206. "L_sp_256_mul_8_done_mul_%=:\n\t"
  96207. "mov %[tmp], r11\n\t"
  96208. "mov r7, r8\n\t"
  96209. "str r3, [%[tmp], r7]\n\t"
  96210. "movs r3, r4\n\t"
  96211. "movs r4, r5\n\t"
  96212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96213. "adds r7, r7, #4\n\t"
  96214. #else
  96215. "add r7, r7, #4\n\t"
  96216. #endif
  96217. "mov r8, r7\n\t"
  96218. "movs r6, #56\n\t"
  96219. "cmp r7, r6\n\t"
  96220. "ble L_sp_256_mul_8_words_%=\n\t"
  96221. "str r3, [%[tmp], r7]\n\t"
  96222. "mov %[a], r9\n\t"
  96223. "mov %[b], r10\n\t"
  96224. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  96225. :
  96226. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  96227. );
  96228. XMEMCPY(r, t, sizeof(t));
  96229. }
  96230. /* Square a and put result in r. (r = a * a)
  96231. *
  96232. * r A single precision integer.
  96233. * a A single precision integer.
  96234. */
  96235. SP_NOINLINE static void sp_256_sqr_8(sp_digit* r, const sp_digit* a)
  96236. {
  96237. __asm__ __volatile__ (
  96238. "movs r3, #0\n\t"
  96239. "movs r4, #0\n\t"
  96240. "movs r5, #0\n\t"
  96241. "mov r8, r3\n\t"
  96242. "mov r11, %[r]\n\t"
  96243. "movs r6, #0x40\n\t"
  96244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96245. "negs r6, r6\n\t"
  96246. #else
  96247. "neg r6, r6\n\t"
  96248. #endif
  96249. "add sp, sp, r6\n\t"
  96250. "mov r10, sp\n\t"
  96251. "mov r9, %[a]\n\t"
  96252. "\n"
  96253. "L_sp_256_sqr_8_words_%=:\n\t"
  96254. "movs %[r], #0\n\t"
  96255. "movs r6, #28\n\t"
  96256. "mov %[a], r8\n\t"
  96257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96258. "subs %[a], %[a], r6\n\t"
  96259. #else
  96260. "sub %[a], %[a], r6\n\t"
  96261. #endif
  96262. #ifdef WOLFSSL_KEIL
  96263. "sbcs r6, r6, r6\n\t"
  96264. #elif defined(__clang__)
  96265. "sbcs r6, r6\n\t"
  96266. #else
  96267. "sbc r6, r6\n\t"
  96268. #endif
  96269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96270. "mvns r6, r6\n\t"
  96271. #else
  96272. "mvn r6, r6\n\t"
  96273. #endif
  96274. #ifdef WOLFSSL_KEIL
  96275. "ands %[a], %[a], r6\n\t"
  96276. #elif defined(__clang__)
  96277. "ands %[a], r6\n\t"
  96278. #else
  96279. "and %[a], r6\n\t"
  96280. #endif
  96281. "mov r2, r8\n\t"
  96282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96283. "subs r2, r2, %[a]\n\t"
  96284. #else
  96285. "sub r2, r2, %[a]\n\t"
  96286. #endif
  96287. "add %[a], %[a], r9\n\t"
  96288. "add r2, r2, r9\n\t"
  96289. "\n"
  96290. "L_sp_256_sqr_8_mul_%=:\n\t"
  96291. "cmp r2, %[a]\n\t"
  96292. "beq L_sp_256_sqr_8_sqr_%=\n\t"
  96293. "# Multiply * 2: Start\n\t"
  96294. "ldrh r6, [%[a]]\n\t"
  96295. "ldrh r7, [r2]\n\t"
  96296. #ifdef WOLFSSL_KEIL
  96297. "muls r7, r6, r7\n\t"
  96298. #elif defined(__clang__)
  96299. "muls r7, r6\n\t"
  96300. #else
  96301. "mul r7, r6\n\t"
  96302. #endif
  96303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96304. "adds r3, r3, r7\n\t"
  96305. #else
  96306. "add r3, r3, r7\n\t"
  96307. #endif
  96308. #ifdef WOLFSSL_KEIL
  96309. "adcs r4, r4, %[r]\n\t"
  96310. #elif defined(__clang__)
  96311. "adcs r4, %[r]\n\t"
  96312. #else
  96313. "adc r4, %[r]\n\t"
  96314. #endif
  96315. #ifdef WOLFSSL_KEIL
  96316. "adcs r5, r5, %[r]\n\t"
  96317. #elif defined(__clang__)
  96318. "adcs r5, %[r]\n\t"
  96319. #else
  96320. "adc r5, %[r]\n\t"
  96321. #endif
  96322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96323. "adds r3, r3, r7\n\t"
  96324. #else
  96325. "add r3, r3, r7\n\t"
  96326. #endif
  96327. #ifdef WOLFSSL_KEIL
  96328. "adcs r4, r4, %[r]\n\t"
  96329. #elif defined(__clang__)
  96330. "adcs r4, %[r]\n\t"
  96331. #else
  96332. "adc r4, %[r]\n\t"
  96333. #endif
  96334. #ifdef WOLFSSL_KEIL
  96335. "adcs r5, r5, %[r]\n\t"
  96336. #elif defined(__clang__)
  96337. "adcs r5, %[r]\n\t"
  96338. #else
  96339. "adc r5, %[r]\n\t"
  96340. #endif
  96341. "ldr r7, [r2]\n\t"
  96342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96343. "lsrs r7, r7, #16\n\t"
  96344. #else
  96345. "lsr r7, r7, #16\n\t"
  96346. #endif
  96347. #ifdef WOLFSSL_KEIL
  96348. "muls r6, r7, r6\n\t"
  96349. #elif defined(__clang__)
  96350. "muls r6, r7\n\t"
  96351. #else
  96352. "mul r6, r7\n\t"
  96353. #endif
  96354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96355. "lsrs r7, r6, #16\n\t"
  96356. #else
  96357. "lsr r7, r6, #16\n\t"
  96358. #endif
  96359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96360. "lsls r6, r6, #16\n\t"
  96361. #else
  96362. "lsl r6, r6, #16\n\t"
  96363. #endif
  96364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96365. "adds r3, r3, r6\n\t"
  96366. #else
  96367. "add r3, r3, r6\n\t"
  96368. #endif
  96369. #ifdef WOLFSSL_KEIL
  96370. "adcs r4, r4, r7\n\t"
  96371. #elif defined(__clang__)
  96372. "adcs r4, r7\n\t"
  96373. #else
  96374. "adc r4, r7\n\t"
  96375. #endif
  96376. #ifdef WOLFSSL_KEIL
  96377. "adcs r5, r5, %[r]\n\t"
  96378. #elif defined(__clang__)
  96379. "adcs r5, %[r]\n\t"
  96380. #else
  96381. "adc r5, %[r]\n\t"
  96382. #endif
  96383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96384. "adds r3, r3, r6\n\t"
  96385. #else
  96386. "add r3, r3, r6\n\t"
  96387. #endif
  96388. #ifdef WOLFSSL_KEIL
  96389. "adcs r4, r4, r7\n\t"
  96390. #elif defined(__clang__)
  96391. "adcs r4, r7\n\t"
  96392. #else
  96393. "adc r4, r7\n\t"
  96394. #endif
  96395. #ifdef WOLFSSL_KEIL
  96396. "adcs r5, r5, %[r]\n\t"
  96397. #elif defined(__clang__)
  96398. "adcs r5, %[r]\n\t"
  96399. #else
  96400. "adc r5, %[r]\n\t"
  96401. #endif
  96402. "ldr r6, [%[a]]\n\t"
  96403. "ldr r7, [r2]\n\t"
  96404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96405. "lsrs r6, r6, #16\n\t"
  96406. #else
  96407. "lsr r6, r6, #16\n\t"
  96408. #endif
  96409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96410. "lsrs r7, r7, #16\n\t"
  96411. #else
  96412. "lsr r7, r7, #16\n\t"
  96413. #endif
  96414. #ifdef WOLFSSL_KEIL
  96415. "muls r7, r6, r7\n\t"
  96416. #elif defined(__clang__)
  96417. "muls r7, r6\n\t"
  96418. #else
  96419. "mul r7, r6\n\t"
  96420. #endif
  96421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96422. "adds r4, r4, r7\n\t"
  96423. #else
  96424. "add r4, r4, r7\n\t"
  96425. #endif
  96426. #ifdef WOLFSSL_KEIL
  96427. "adcs r5, r5, %[r]\n\t"
  96428. #elif defined(__clang__)
  96429. "adcs r5, %[r]\n\t"
  96430. #else
  96431. "adc r5, %[r]\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. "ldrh r7, [r2]\n\t"
  96446. #ifdef WOLFSSL_KEIL
  96447. "muls r6, r7, r6\n\t"
  96448. #elif defined(__clang__)
  96449. "muls r6, r7\n\t"
  96450. #else
  96451. "mul r6, r7\n\t"
  96452. #endif
  96453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96454. "lsrs r7, r6, #16\n\t"
  96455. #else
  96456. "lsr r7, r6, #16\n\t"
  96457. #endif
  96458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96459. "lsls r6, r6, #16\n\t"
  96460. #else
  96461. "lsl r6, r6, #16\n\t"
  96462. #endif
  96463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96464. "adds r3, r3, r6\n\t"
  96465. #else
  96466. "add r3, r3, r6\n\t"
  96467. #endif
  96468. #ifdef WOLFSSL_KEIL
  96469. "adcs r4, r4, r7\n\t"
  96470. #elif defined(__clang__)
  96471. "adcs r4, r7\n\t"
  96472. #else
  96473. "adc r4, r7\n\t"
  96474. #endif
  96475. #ifdef WOLFSSL_KEIL
  96476. "adcs r5, r5, %[r]\n\t"
  96477. #elif defined(__clang__)
  96478. "adcs r5, %[r]\n\t"
  96479. #else
  96480. "adc r5, %[r]\n\t"
  96481. #endif
  96482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96483. "adds r3, r3, r6\n\t"
  96484. #else
  96485. "add r3, r3, r6\n\t"
  96486. #endif
  96487. #ifdef WOLFSSL_KEIL
  96488. "adcs r4, r4, r7\n\t"
  96489. #elif defined(__clang__)
  96490. "adcs r4, r7\n\t"
  96491. #else
  96492. "adc r4, r7\n\t"
  96493. #endif
  96494. #ifdef WOLFSSL_KEIL
  96495. "adcs r5, r5, %[r]\n\t"
  96496. #elif defined(__clang__)
  96497. "adcs r5, %[r]\n\t"
  96498. #else
  96499. "adc r5, %[r]\n\t"
  96500. #endif
  96501. "# Multiply * 2: Done\n\t"
  96502. "bal L_sp_256_sqr_8_done_sqr_%=\n\t"
  96503. "\n"
  96504. "L_sp_256_sqr_8_sqr_%=:\n\t"
  96505. "mov r12, r2\n\t"
  96506. "ldr r2, [%[a]]\n\t"
  96507. "# Square: Start\n\t"
  96508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96509. "lsrs r7, r2, #16\n\t"
  96510. #else
  96511. "lsr r7, r2, #16\n\t"
  96512. #endif
  96513. "uxth r6, r2\n\t"
  96514. #ifdef WOLFSSL_KEIL
  96515. "muls r6, r6, r6\n\t"
  96516. #elif defined(__clang__)
  96517. "muls r6, r6\n\t"
  96518. #else
  96519. "mul r6, r6\n\t"
  96520. #endif
  96521. #ifdef WOLFSSL_KEIL
  96522. "muls r7, r7, r7\n\t"
  96523. #elif defined(__clang__)
  96524. "muls r7, r7\n\t"
  96525. #else
  96526. "mul r7, r7\n\t"
  96527. #endif
  96528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96529. "adds r3, r3, r6\n\t"
  96530. #else
  96531. "add r3, r3, r6\n\t"
  96532. #endif
  96533. #ifdef WOLFSSL_KEIL
  96534. "adcs r4, r4, r7\n\t"
  96535. #elif defined(__clang__)
  96536. "adcs r4, r7\n\t"
  96537. #else
  96538. "adc r4, r7\n\t"
  96539. #endif
  96540. #ifdef WOLFSSL_KEIL
  96541. "adcs r5, r5, %[r]\n\t"
  96542. #elif defined(__clang__)
  96543. "adcs r5, %[r]\n\t"
  96544. #else
  96545. "adc r5, %[r]\n\t"
  96546. #endif
  96547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96548. "lsrs r7, r2, #16\n\t"
  96549. #else
  96550. "lsr r7, r2, #16\n\t"
  96551. #endif
  96552. "uxth r6, r2\n\t"
  96553. #ifdef WOLFSSL_KEIL
  96554. "muls r6, r7, r6\n\t"
  96555. #elif defined(__clang__)
  96556. "muls r6, r7\n\t"
  96557. #else
  96558. "mul r6, r7\n\t"
  96559. #endif
  96560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96561. "lsrs r7, r6, #15\n\t"
  96562. #else
  96563. "lsr r7, r6, #15\n\t"
  96564. #endif
  96565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96566. "lsls r6, r6, #17\n\t"
  96567. #else
  96568. "lsl r6, r6, #17\n\t"
  96569. #endif
  96570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96571. "adds r3, r3, r6\n\t"
  96572. #else
  96573. "add r3, r3, r6\n\t"
  96574. #endif
  96575. #ifdef WOLFSSL_KEIL
  96576. "adcs r4, r4, r7\n\t"
  96577. #elif defined(__clang__)
  96578. "adcs r4, r7\n\t"
  96579. #else
  96580. "adc r4, r7\n\t"
  96581. #endif
  96582. #ifdef WOLFSSL_KEIL
  96583. "adcs r5, r5, %[r]\n\t"
  96584. #elif defined(__clang__)
  96585. "adcs r5, %[r]\n\t"
  96586. #else
  96587. "adc r5, %[r]\n\t"
  96588. #endif
  96589. "# Square: Done\n\t"
  96590. "mov r2, r12\n\t"
  96591. "\n"
  96592. "L_sp_256_sqr_8_done_sqr_%=:\n\t"
  96593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96594. "adds %[a], %[a], #4\n\t"
  96595. #else
  96596. "add %[a], %[a], #4\n\t"
  96597. #endif
  96598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96599. "subs r2, r2, #4\n\t"
  96600. #else
  96601. "sub r2, r2, #4\n\t"
  96602. #endif
  96603. "movs r6, #32\n\t"
  96604. "add r6, r6, r9\n\t"
  96605. "cmp %[a], r6\n\t"
  96606. "beq L_sp_256_sqr_8_done_mul_%=\n\t"
  96607. "cmp %[a], r2\n\t"
  96608. "bgt L_sp_256_sqr_8_done_mul_%=\n\t"
  96609. "mov r7, r8\n\t"
  96610. "add r7, r7, r9\n\t"
  96611. "cmp %[a], r7\n\t"
  96612. "ble L_sp_256_sqr_8_mul_%=\n\t"
  96613. "\n"
  96614. "L_sp_256_sqr_8_done_mul_%=:\n\t"
  96615. "mov %[r], r10\n\t"
  96616. "mov r7, r8\n\t"
  96617. "str r3, [%[r], r7]\n\t"
  96618. "movs r3, r4\n\t"
  96619. "movs r4, r5\n\t"
  96620. "movs r5, #0\n\t"
  96621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96622. "adds r7, r7, #4\n\t"
  96623. #else
  96624. "add r7, r7, #4\n\t"
  96625. #endif
  96626. "mov r8, r7\n\t"
  96627. "movs r6, #56\n\t"
  96628. "cmp r7, r6\n\t"
  96629. "ble L_sp_256_sqr_8_words_%=\n\t"
  96630. "mov %[a], r9\n\t"
  96631. "str r3, [%[r], r7]\n\t"
  96632. "mov %[r], r11\n\t"
  96633. "mov %[a], r10\n\t"
  96634. "movs r3, #60\n\t"
  96635. "\n"
  96636. "L_sp_256_sqr_8_store_%=:\n\t"
  96637. "ldr r6, [%[a], r3]\n\t"
  96638. "str r6, [%[r], r3]\n\t"
  96639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96640. "subs r3, r3, #4\n\t"
  96641. #else
  96642. "sub r3, r3, #4\n\t"
  96643. #endif
  96644. "bge L_sp_256_sqr_8_store_%=\n\t"
  96645. "movs r6, #0x40\n\t"
  96646. "add sp, sp, r6\n\t"
  96647. : [r] "+l" (r), [a] "+l" (a)
  96648. :
  96649. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  96650. );
  96651. }
  96652. #ifdef WOLFSSL_SP_SMALL
  96653. /* Add b to a into r. (r = a + b)
  96654. *
  96655. * r A single precision integer.
  96656. * a A single precision integer.
  96657. * b A single precision integer.
  96658. */
  96659. SP_NOINLINE static sp_digit sp_256_add_8(sp_digit* r, const sp_digit* a,
  96660. const sp_digit* b)
  96661. {
  96662. __asm__ __volatile__ (
  96663. "movs r6, %[a]\n\t"
  96664. "movs r7, #0\n\t"
  96665. "movs r3, #0\n\t"
  96666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96667. "adds r6, r6, #32\n\t"
  96668. #else
  96669. "add r6, r6, #32\n\t"
  96670. #endif
  96671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96672. "subs r7, r7, #1\n\t"
  96673. #else
  96674. "sub r7, r7, #1\n\t"
  96675. #endif
  96676. "\n"
  96677. "L_sp_256_add_8_word_%=:\n\t"
  96678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96679. "adds r3, r3, r7\n\t"
  96680. #else
  96681. "add r3, r3, r7\n\t"
  96682. #endif
  96683. "ldr r4, [%[a]]\n\t"
  96684. "ldr r5, [%[b]]\n\t"
  96685. #ifdef WOLFSSL_KEIL
  96686. "adcs r4, r4, r5\n\t"
  96687. #elif defined(__clang__)
  96688. "adcs r4, r5\n\t"
  96689. #else
  96690. "adc r4, r5\n\t"
  96691. #endif
  96692. "str r4, [%[r]]\n\t"
  96693. "movs r3, #0\n\t"
  96694. #ifdef WOLFSSL_KEIL
  96695. "adcs r3, r3, r3\n\t"
  96696. #elif defined(__clang__)
  96697. "adcs r3, r3\n\t"
  96698. #else
  96699. "adc r3, r3\n\t"
  96700. #endif
  96701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96702. "adds %[a], %[a], #4\n\t"
  96703. #else
  96704. "add %[a], %[a], #4\n\t"
  96705. #endif
  96706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96707. "adds %[b], %[b], #4\n\t"
  96708. #else
  96709. "add %[b], %[b], #4\n\t"
  96710. #endif
  96711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96712. "adds %[r], %[r], #4\n\t"
  96713. #else
  96714. "add %[r], %[r], #4\n\t"
  96715. #endif
  96716. "cmp %[a], r6\n\t"
  96717. "bne L_sp_256_add_8_word_%=\n\t"
  96718. "movs %[r], r3\n\t"
  96719. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  96720. :
  96721. : "memory", "r3", "r4", "r5", "r6", "r7"
  96722. );
  96723. return (uint32_t)(size_t)r;
  96724. }
  96725. #else
  96726. /* Add b to a into r. (r = a + b)
  96727. *
  96728. * r A single precision integer.
  96729. * a A single precision integer.
  96730. * b A single precision integer.
  96731. */
  96732. SP_NOINLINE static sp_digit sp_256_add_8(sp_digit* r, const sp_digit* a,
  96733. const sp_digit* b)
  96734. {
  96735. __asm__ __volatile__ (
  96736. "ldm %[b]!, {r5, r6}\n\t"
  96737. "ldm %[a]!, {r3, r4}\n\t"
  96738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96739. "adds r3, r3, r5\n\t"
  96740. #else
  96741. "add r3, r3, r5\n\t"
  96742. #endif
  96743. #ifdef WOLFSSL_KEIL
  96744. "adcs r4, r4, r6\n\t"
  96745. #elif defined(__clang__)
  96746. "adcs r4, r6\n\t"
  96747. #else
  96748. "adc r4, r6\n\t"
  96749. #endif
  96750. "stm %[r]!, {r3, r4}\n\t"
  96751. "ldm %[b]!, {r5, r6}\n\t"
  96752. "ldm %[a]!, {r3, r4}\n\t"
  96753. #ifdef WOLFSSL_KEIL
  96754. "adcs r3, r3, r5\n\t"
  96755. #elif defined(__clang__)
  96756. "adcs r3, r5\n\t"
  96757. #else
  96758. "adc r3, r5\n\t"
  96759. #endif
  96760. #ifdef WOLFSSL_KEIL
  96761. "adcs r4, r4, r6\n\t"
  96762. #elif defined(__clang__)
  96763. "adcs r4, r6\n\t"
  96764. #else
  96765. "adc r4, r6\n\t"
  96766. #endif
  96767. "stm %[r]!, {r3, r4}\n\t"
  96768. "ldm %[b]!, {r5, r6}\n\t"
  96769. "ldm %[a]!, {r3, r4}\n\t"
  96770. #ifdef WOLFSSL_KEIL
  96771. "adcs r3, r3, r5\n\t"
  96772. #elif defined(__clang__)
  96773. "adcs r3, r5\n\t"
  96774. #else
  96775. "adc r3, r5\n\t"
  96776. #endif
  96777. #ifdef WOLFSSL_KEIL
  96778. "adcs r4, r4, r6\n\t"
  96779. #elif defined(__clang__)
  96780. "adcs r4, r6\n\t"
  96781. #else
  96782. "adc r4, r6\n\t"
  96783. #endif
  96784. "stm %[r]!, {r3, r4}\n\t"
  96785. "ldm %[b]!, {r5, r6}\n\t"
  96786. "ldm %[a]!, {r3, r4}\n\t"
  96787. #ifdef WOLFSSL_KEIL
  96788. "adcs r3, r3, r5\n\t"
  96789. #elif defined(__clang__)
  96790. "adcs r3, r5\n\t"
  96791. #else
  96792. "adc r3, r5\n\t"
  96793. #endif
  96794. #ifdef WOLFSSL_KEIL
  96795. "adcs r4, r4, r6\n\t"
  96796. #elif defined(__clang__)
  96797. "adcs r4, r6\n\t"
  96798. #else
  96799. "adc r4, r6\n\t"
  96800. #endif
  96801. "stm %[r]!, {r3, r4}\n\t"
  96802. "movs %[r], #0\n\t"
  96803. #ifdef WOLFSSL_KEIL
  96804. "adcs %[r], %[r], %[r]\n\t"
  96805. #elif defined(__clang__)
  96806. "adcs %[r], %[r]\n\t"
  96807. #else
  96808. "adc %[r], %[r]\n\t"
  96809. #endif
  96810. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  96811. :
  96812. : "memory", "r3", "r4", "r5", "r6"
  96813. );
  96814. return (uint32_t)(size_t)r;
  96815. }
  96816. #endif /* WOLFSSL_SP_SMALL */
  96817. #ifdef WOLFSSL_SP_SMALL
  96818. /* Sub b from a into r. (r = a - b)
  96819. *
  96820. * r A single precision integer.
  96821. * a A single precision integer.
  96822. * b A single precision integer.
  96823. */
  96824. SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a,
  96825. const sp_digit* b)
  96826. {
  96827. __asm__ __volatile__ (
  96828. "movs r6, %[a]\n\t"
  96829. "movs r3, #0\n\t"
  96830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96831. "adds r6, r6, #32\n\t"
  96832. #else
  96833. "add r6, r6, #32\n\t"
  96834. #endif
  96835. "\n"
  96836. "L_sp_256_sub_8_word_%=:\n\t"
  96837. "movs r5, #0\n\t"
  96838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96839. "subs r5, r5, r3\n\t"
  96840. #else
  96841. "sub r5, r5, r3\n\t"
  96842. #endif
  96843. "ldr r4, [%[a]]\n\t"
  96844. "ldr r5, [%[b]]\n\t"
  96845. #ifdef WOLFSSL_KEIL
  96846. "sbcs r4, r4, r5\n\t"
  96847. #elif defined(__clang__)
  96848. "sbcs r4, r5\n\t"
  96849. #else
  96850. "sbc r4, r5\n\t"
  96851. #endif
  96852. "str r4, [%[r]]\n\t"
  96853. #ifdef WOLFSSL_KEIL
  96854. "sbcs r3, r3, r3\n\t"
  96855. #elif defined(__clang__)
  96856. "sbcs r3, r3\n\t"
  96857. #else
  96858. "sbc r3, r3\n\t"
  96859. #endif
  96860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96861. "adds %[a], %[a], #4\n\t"
  96862. #else
  96863. "add %[a], %[a], #4\n\t"
  96864. #endif
  96865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96866. "adds %[b], %[b], #4\n\t"
  96867. #else
  96868. "add %[b], %[b], #4\n\t"
  96869. #endif
  96870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96871. "adds %[r], %[r], #4\n\t"
  96872. #else
  96873. "add %[r], %[r], #4\n\t"
  96874. #endif
  96875. "cmp %[a], r6\n\t"
  96876. "bne L_sp_256_sub_8_word_%=\n\t"
  96877. "movs %[r], r3\n\t"
  96878. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  96879. :
  96880. : "memory", "r3", "r4", "r5", "r6"
  96881. );
  96882. return (uint32_t)(size_t)r;
  96883. }
  96884. #else
  96885. /* Sub b from a into r. (r = a - b)
  96886. *
  96887. * r A single precision integer.
  96888. * a A single precision integer.
  96889. * b A single precision integer.
  96890. */
  96891. SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a,
  96892. const sp_digit* b)
  96893. {
  96894. __asm__ __volatile__ (
  96895. "ldm %[b]!, {r5, r6}\n\t"
  96896. "ldm %[a]!, {r3, r4}\n\t"
  96897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  96898. "subs r3, r3, r5\n\t"
  96899. #else
  96900. "sub r3, r3, r5\n\t"
  96901. #endif
  96902. #ifdef WOLFSSL_KEIL
  96903. "sbcs r4, r4, r6\n\t"
  96904. #elif defined(__clang__)
  96905. "sbcs r4, r6\n\t"
  96906. #else
  96907. "sbc r4, r6\n\t"
  96908. #endif
  96909. "stm %[r]!, {r3, r4}\n\t"
  96910. "ldm %[b]!, {r5, r6}\n\t"
  96911. "ldm %[a]!, {r3, r4}\n\t"
  96912. #ifdef WOLFSSL_KEIL
  96913. "sbcs r3, r3, r5\n\t"
  96914. #elif defined(__clang__)
  96915. "sbcs r3, r5\n\t"
  96916. #else
  96917. "sbc r3, r5\n\t"
  96918. #endif
  96919. #ifdef WOLFSSL_KEIL
  96920. "sbcs r4, r4, r6\n\t"
  96921. #elif defined(__clang__)
  96922. "sbcs r4, r6\n\t"
  96923. #else
  96924. "sbc r4, r6\n\t"
  96925. #endif
  96926. "stm %[r]!, {r3, r4}\n\t"
  96927. "ldm %[b]!, {r5, r6}\n\t"
  96928. "ldm %[a]!, {r3, r4}\n\t"
  96929. #ifdef WOLFSSL_KEIL
  96930. "sbcs r3, r3, r5\n\t"
  96931. #elif defined(__clang__)
  96932. "sbcs r3, r5\n\t"
  96933. #else
  96934. "sbc r3, r5\n\t"
  96935. #endif
  96936. #ifdef WOLFSSL_KEIL
  96937. "sbcs r4, r4, r6\n\t"
  96938. #elif defined(__clang__)
  96939. "sbcs r4, r6\n\t"
  96940. #else
  96941. "sbc r4, r6\n\t"
  96942. #endif
  96943. "stm %[r]!, {r3, r4}\n\t"
  96944. "ldm %[b]!, {r5, r6}\n\t"
  96945. "ldm %[a]!, {r3, r4}\n\t"
  96946. #ifdef WOLFSSL_KEIL
  96947. "sbcs r3, r3, r5\n\t"
  96948. #elif defined(__clang__)
  96949. "sbcs r3, r5\n\t"
  96950. #else
  96951. "sbc r3, r5\n\t"
  96952. #endif
  96953. #ifdef WOLFSSL_KEIL
  96954. "sbcs r4, r4, r6\n\t"
  96955. #elif defined(__clang__)
  96956. "sbcs r4, r6\n\t"
  96957. #else
  96958. "sbc r4, r6\n\t"
  96959. #endif
  96960. "stm %[r]!, {r3, r4}\n\t"
  96961. #ifdef WOLFSSL_KEIL
  96962. "sbcs %[r], %[r], %[r]\n\t"
  96963. #elif defined(__clang__)
  96964. "sbcs %[r], %[r]\n\t"
  96965. #else
  96966. "sbc %[r], %[r]\n\t"
  96967. #endif
  96968. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  96969. :
  96970. : "memory", "r3", "r4", "r5", "r6"
  96971. );
  96972. return (uint32_t)(size_t)r;
  96973. }
  96974. #endif /* WOLFSSL_SP_SMALL */
  96975. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  96976. *
  96977. * r The resulting Montgomery form number.
  96978. * a The number to convert.
  96979. * m The modulus (prime).
  96980. */
  96981. static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  96982. {
  96983. int64_t t[8];
  96984. int64_t a64[8];
  96985. int64_t o;
  96986. (void)m;
  96987. a64[0] = a[0];
  96988. a64[1] = a[1];
  96989. a64[2] = a[2];
  96990. a64[3] = a[3];
  96991. a64[4] = a[4];
  96992. a64[5] = a[5];
  96993. a64[6] = a[6];
  96994. a64[7] = a[7];
  96995. /* 1 1 0 -1 -1 -1 -1 0 */
  96996. t[0] = 0 + a64[0] + a64[1] - a64[3] - a64[4] - a64[5] - a64[6];
  96997. /* 0 1 1 0 -1 -1 -1 -1 */
  96998. t[1] = 0 + a64[1] + a64[2] - a64[4] - a64[5] - a64[6] - a64[7];
  96999. /* 0 0 1 1 0 -1 -1 -1 */
  97000. t[2] = 0 + a64[2] + a64[3] - a64[5] - a64[6] - a64[7];
  97001. /* -1 -1 0 2 2 1 0 -1 */
  97002. t[3] = 0 - a64[0] - a64[1] + 2 * a64[3] + 2 * a64[4] + a64[5] - a64[7];
  97003. /* 0 -1 -1 0 2 2 1 0 */
  97004. t[4] = 0 - a64[1] - a64[2] + 2 * a64[4] + 2 * a64[5] + a64[6];
  97005. /* 0 0 -1 -1 0 2 2 1 */
  97006. t[5] = 0 - a64[2] - a64[3] + 2 * a64[5] + 2 * a64[6] + a64[7];
  97007. /* -1 -1 0 0 0 1 3 2 */
  97008. t[6] = 0 - a64[0] - a64[1] + a64[5] + 3 * a64[6] + 2 * a64[7];
  97009. /* 1 0 -1 -1 -1 -1 0 3 */
  97010. t[7] = 0 + a64[0] - a64[2] - a64[3] - a64[4] - a64[5] + 3 * a64[7];
  97011. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  97012. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  97013. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  97014. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  97015. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  97016. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  97017. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  97018. o = t[7] >> 32; t[7] &= 0xffffffff;
  97019. t[0] += o;
  97020. t[3] -= o;
  97021. t[6] -= o;
  97022. t[7] += o;
  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. r[0] = (sp_digit)t[0];
  97031. r[1] = (sp_digit)t[1];
  97032. r[2] = (sp_digit)t[2];
  97033. r[3] = (sp_digit)t[3];
  97034. r[4] = (sp_digit)t[4];
  97035. r[5] = (sp_digit)t[5];
  97036. r[6] = (sp_digit)t[6];
  97037. r[7] = (sp_digit)t[7];
  97038. return MP_OKAY;
  97039. }
  97040. /* Convert an mp_int to an array of sp_digit.
  97041. *
  97042. * r A single precision integer.
  97043. * size Maximum number of bytes to convert
  97044. * a A multi-precision integer.
  97045. */
  97046. static void sp_256_from_mp(sp_digit* r, int size, const mp_int* a)
  97047. {
  97048. #if DIGIT_BIT == 32
  97049. int j;
  97050. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  97051. for (j = a->used; j < size; j++) {
  97052. r[j] = 0;
  97053. }
  97054. #elif DIGIT_BIT > 32
  97055. int i;
  97056. int j = 0;
  97057. word32 s = 0;
  97058. r[0] = 0;
  97059. for (i = 0; i < a->used && j < size; i++) {
  97060. r[j] |= ((sp_digit)a->dp[i] << s);
  97061. r[j] &= 0xffffffff;
  97062. s = 32U - s;
  97063. if (j + 1 >= size) {
  97064. break;
  97065. }
  97066. /* lint allow cast of mismatch word32 and mp_digit */
  97067. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  97068. while ((s + 32U) <= (word32)DIGIT_BIT) {
  97069. s += 32U;
  97070. r[j] &= 0xffffffff;
  97071. if (j + 1 >= size) {
  97072. break;
  97073. }
  97074. if (s < (word32)DIGIT_BIT) {
  97075. /* lint allow cast of mismatch word32 and mp_digit */
  97076. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  97077. }
  97078. else {
  97079. r[++j] = (sp_digit)0;
  97080. }
  97081. }
  97082. s = (word32)DIGIT_BIT - s;
  97083. }
  97084. for (j++; j < size; j++) {
  97085. r[j] = 0;
  97086. }
  97087. #else
  97088. int i;
  97089. int j = 0;
  97090. int s = 0;
  97091. r[0] = 0;
  97092. for (i = 0; i < a->used && j < size; i++) {
  97093. r[j] |= ((sp_digit)a->dp[i]) << s;
  97094. if (s + DIGIT_BIT >= 32) {
  97095. r[j] &= 0xffffffff;
  97096. if (j + 1 >= size) {
  97097. break;
  97098. }
  97099. s = 32 - s;
  97100. if (s == DIGIT_BIT) {
  97101. r[++j] = 0;
  97102. s = 0;
  97103. }
  97104. else {
  97105. r[++j] = a->dp[i] >> s;
  97106. s = DIGIT_BIT - s;
  97107. }
  97108. }
  97109. else {
  97110. s += DIGIT_BIT;
  97111. }
  97112. }
  97113. for (j++; j < size; j++) {
  97114. r[j] = 0;
  97115. }
  97116. #endif
  97117. }
  97118. /* Convert a point of type ecc_point to type sp_point_256.
  97119. *
  97120. * p Point of type sp_point_256 (result).
  97121. * pm Point of type ecc_point.
  97122. */
  97123. static void sp_256_point_from_ecc_point_8(sp_point_256* p,
  97124. const ecc_point* pm)
  97125. {
  97126. XMEMSET(p->x, 0, sizeof(p->x));
  97127. XMEMSET(p->y, 0, sizeof(p->y));
  97128. XMEMSET(p->z, 0, sizeof(p->z));
  97129. sp_256_from_mp(p->x, 8, pm->x);
  97130. sp_256_from_mp(p->y, 8, pm->y);
  97131. sp_256_from_mp(p->z, 8, pm->z);
  97132. p->infinity = 0;
  97133. }
  97134. /* Convert an array of sp_digit to an mp_int.
  97135. *
  97136. * a A single precision integer.
  97137. * r A multi-precision integer.
  97138. */
  97139. static int sp_256_to_mp(const sp_digit* a, mp_int* r)
  97140. {
  97141. int err;
  97142. err = mp_grow(r, (256 + DIGIT_BIT - 1) / DIGIT_BIT);
  97143. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  97144. #if DIGIT_BIT == 32
  97145. XMEMCPY(r->dp, a, sizeof(sp_digit) * 8);
  97146. r->used = 8;
  97147. mp_clamp(r);
  97148. #elif DIGIT_BIT < 32
  97149. int i;
  97150. int j = 0;
  97151. int s = 0;
  97152. r->dp[0] = 0;
  97153. for (i = 0; i < 8; i++) {
  97154. r->dp[j] |= (mp_digit)(a[i] << s);
  97155. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  97156. s = DIGIT_BIT - s;
  97157. r->dp[++j] = (mp_digit)(a[i] >> s);
  97158. while (s + DIGIT_BIT <= 32) {
  97159. s += DIGIT_BIT;
  97160. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  97161. if (s == SP_WORD_SIZE) {
  97162. r->dp[j] = 0;
  97163. }
  97164. else {
  97165. r->dp[j] = (mp_digit)(a[i] >> s);
  97166. }
  97167. }
  97168. s = 32 - s;
  97169. }
  97170. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  97171. mp_clamp(r);
  97172. #else
  97173. int i;
  97174. int j = 0;
  97175. int s = 0;
  97176. r->dp[0] = 0;
  97177. for (i = 0; i < 8; i++) {
  97178. r->dp[j] |= ((mp_digit)a[i]) << s;
  97179. if (s + 32 >= DIGIT_BIT) {
  97180. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  97181. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  97182. #endif
  97183. s = DIGIT_BIT - s;
  97184. r->dp[++j] = a[i] >> s;
  97185. s = 32 - s;
  97186. }
  97187. else {
  97188. s += 32;
  97189. }
  97190. }
  97191. r->used = (256 + DIGIT_BIT - 1) / DIGIT_BIT;
  97192. mp_clamp(r);
  97193. #endif
  97194. }
  97195. return err;
  97196. }
  97197. /* Convert a point of type sp_point_256 to type ecc_point.
  97198. *
  97199. * p Point of type sp_point_256.
  97200. * pm Point of type ecc_point (result).
  97201. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  97202. * MP_OKAY.
  97203. */
  97204. static int sp_256_point_to_ecc_point_8(const sp_point_256* p, ecc_point* pm)
  97205. {
  97206. int err;
  97207. err = sp_256_to_mp(p->x, pm->x);
  97208. if (err == MP_OKAY) {
  97209. err = sp_256_to_mp(p->y, pm->y);
  97210. }
  97211. if (err == MP_OKAY) {
  97212. err = sp_256_to_mp(p->z, pm->z);
  97213. }
  97214. return err;
  97215. }
  97216. /* Conditionally subtract b from a using the mask m.
  97217. * m is -1 to subtract and 0 when not copying.
  97218. *
  97219. * r A single precision number representing condition subtract result.
  97220. * a A single precision number to subtract from.
  97221. * b A single precision number to subtract.
  97222. * m Mask value to apply.
  97223. */
  97224. SP_NOINLINE static sp_digit sp_256_cond_sub_8(sp_digit* r, const sp_digit* a,
  97225. const sp_digit* b, sp_digit m)
  97226. {
  97227. __asm__ __volatile__ (
  97228. "movs r4, #0\n\t"
  97229. "movs r5, #32\n\t"
  97230. "mov r8, r5\n\t"
  97231. "movs r7, #0\n\t"
  97232. "\n"
  97233. "L_sp_256_cond_sub_8_words_%=:\n\t"
  97234. "ldr r6, [%[b], r7]\n\t"
  97235. #ifdef WOLFSSL_KEIL
  97236. "ands r6, r6, %[m]\n\t"
  97237. #elif defined(__clang__)
  97238. "ands r6, %[m]\n\t"
  97239. #else
  97240. "and r6, %[m]\n\t"
  97241. #endif
  97242. "movs r5, #0\n\t"
  97243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97244. "subs r5, r5, r4\n\t"
  97245. #else
  97246. "sub r5, r5, r4\n\t"
  97247. #endif
  97248. "ldr r5, [%[a], r7]\n\t"
  97249. #ifdef WOLFSSL_KEIL
  97250. "sbcs r5, r5, r6\n\t"
  97251. #elif defined(__clang__)
  97252. "sbcs r5, r6\n\t"
  97253. #else
  97254. "sbc r5, r6\n\t"
  97255. #endif
  97256. #ifdef WOLFSSL_KEIL
  97257. "sbcs r4, r4, r4\n\t"
  97258. #elif defined(__clang__)
  97259. "sbcs r4, r4\n\t"
  97260. #else
  97261. "sbc r4, r4\n\t"
  97262. #endif
  97263. "str r5, [%[r], r7]\n\t"
  97264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97265. "adds r7, r7, #4\n\t"
  97266. #else
  97267. "add r7, r7, #4\n\t"
  97268. #endif
  97269. "cmp r7, r8\n\t"
  97270. "blt L_sp_256_cond_sub_8_words_%=\n\t"
  97271. "movs %[r], r4\n\t"
  97272. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  97273. :
  97274. : "memory", "r4", "r5", "r6", "r7", "r8"
  97275. );
  97276. return (uint32_t)(size_t)r;
  97277. }
  97278. /* Reduce the number back to 256 bits using Montgomery reduction.
  97279. *
  97280. * a A single precision number to reduce in place.
  97281. * m The single precision number representing the modulus.
  97282. * mp The digit representing the negative inverse of m mod 2^n.
  97283. */
  97284. SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a, const sp_digit* m,
  97285. sp_digit mp)
  97286. {
  97287. (void)mp;
  97288. (void)m;
  97289. __asm__ __volatile__ (
  97290. "movs r2, #0\n\t"
  97291. "movs r1, #0\n\t"
  97292. "# i = 0\n\t"
  97293. "mov r8, r2\n\t"
  97294. "\n"
  97295. "L_sp_256_mont_reduce_8_mod_%=:\n\t"
  97296. "movs r4, #0\n\t"
  97297. "# mu = a[i] * 1 (mp) = a[i]\n\t"
  97298. "ldr r3, [%[a]]\n\t"
  97299. "# a[i+0] += -1 * mu\n\t"
  97300. "movs r5, r3\n\t"
  97301. "str r4, [%[a]]\n\t"
  97302. "# a[i+1] += -1 * mu\n\t"
  97303. "ldr r6, [%[a], #4]\n\t"
  97304. "movs r4, r3\n\t"
  97305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97306. "subs r5, r5, r3\n\t"
  97307. #else
  97308. "sub r5, r5, r3\n\t"
  97309. #endif
  97310. #ifdef WOLFSSL_KEIL
  97311. "sbcs r4, r4, r2\n\t"
  97312. #elif defined(__clang__)
  97313. "sbcs r4, r2\n\t"
  97314. #else
  97315. "sbc r4, r2\n\t"
  97316. #endif
  97317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97318. "adds r5, r5, r6\n\t"
  97319. #else
  97320. "add r5, r5, r6\n\t"
  97321. #endif
  97322. #ifdef WOLFSSL_KEIL
  97323. "adcs r4, r4, r2\n\t"
  97324. #elif defined(__clang__)
  97325. "adcs r4, r2\n\t"
  97326. #else
  97327. "adc r4, r2\n\t"
  97328. #endif
  97329. "str r5, [%[a], #4]\n\t"
  97330. "# a[i+2] += -1 * mu\n\t"
  97331. "ldr r6, [%[a], #8]\n\t"
  97332. "movs r5, r3\n\t"
  97333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97334. "subs r4, r4, r3\n\t"
  97335. #else
  97336. "sub r4, r4, r3\n\t"
  97337. #endif
  97338. #ifdef WOLFSSL_KEIL
  97339. "sbcs r5, r5, r2\n\t"
  97340. #elif defined(__clang__)
  97341. "sbcs r5, r2\n\t"
  97342. #else
  97343. "sbc r5, r2\n\t"
  97344. #endif
  97345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97346. "adds r4, r4, r6\n\t"
  97347. #else
  97348. "add r4, r4, r6\n\t"
  97349. #endif
  97350. #ifdef WOLFSSL_KEIL
  97351. "adcs r5, r5, r2\n\t"
  97352. #elif defined(__clang__)
  97353. "adcs r5, r2\n\t"
  97354. #else
  97355. "adc r5, r2\n\t"
  97356. #endif
  97357. "str r4, [%[a], #8]\n\t"
  97358. "# a[i+3] += 0 * mu\n\t"
  97359. "ldr r6, [%[a], #12]\n\t"
  97360. "movs r4, #0\n\t"
  97361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97362. "adds r5, r5, r6\n\t"
  97363. #else
  97364. "add r5, r5, r6\n\t"
  97365. #endif
  97366. #ifdef WOLFSSL_KEIL
  97367. "adcs r4, r4, r2\n\t"
  97368. #elif defined(__clang__)
  97369. "adcs r4, r2\n\t"
  97370. #else
  97371. "adc r4, r2\n\t"
  97372. #endif
  97373. "str r5, [%[a], #12]\n\t"
  97374. "# a[i+4] += 0 * mu\n\t"
  97375. "ldr r6, [%[a], #16]\n\t"
  97376. "movs r5, #0\n\t"
  97377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97378. "adds r4, r4, r6\n\t"
  97379. #else
  97380. "add r4, r4, r6\n\t"
  97381. #endif
  97382. #ifdef WOLFSSL_KEIL
  97383. "adcs r5, r5, r2\n\t"
  97384. #elif defined(__clang__)
  97385. "adcs r5, r2\n\t"
  97386. #else
  97387. "adc r5, r2\n\t"
  97388. #endif
  97389. "str r4, [%[a], #16]\n\t"
  97390. "# a[i+5] += 0 * mu\n\t"
  97391. "ldr r6, [%[a], #20]\n\t"
  97392. "movs r4, #0\n\t"
  97393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97394. "adds r5, r5, r6\n\t"
  97395. #else
  97396. "add r5, r5, r6\n\t"
  97397. #endif
  97398. #ifdef WOLFSSL_KEIL
  97399. "adcs r4, r4, r2\n\t"
  97400. #elif defined(__clang__)
  97401. "adcs r4, r2\n\t"
  97402. #else
  97403. "adc r4, r2\n\t"
  97404. #endif
  97405. "str r5, [%[a], #20]\n\t"
  97406. "# a[i+6] += 1 * mu\n\t"
  97407. "ldr r6, [%[a], #24]\n\t"
  97408. "movs r5, #0\n\t"
  97409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97410. "adds r4, r4, r3\n\t"
  97411. #else
  97412. "add r4, r4, r3\n\t"
  97413. #endif
  97414. #ifdef WOLFSSL_KEIL
  97415. "adcs r5, r5, r2\n\t"
  97416. #elif defined(__clang__)
  97417. "adcs r5, r2\n\t"
  97418. #else
  97419. "adc r5, r2\n\t"
  97420. #endif
  97421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97422. "adds r4, r4, r6\n\t"
  97423. #else
  97424. "add r4, r4, r6\n\t"
  97425. #endif
  97426. #ifdef WOLFSSL_KEIL
  97427. "adcs r5, r5, r2\n\t"
  97428. #elif defined(__clang__)
  97429. "adcs r5, r2\n\t"
  97430. #else
  97431. "adc r5, r2\n\t"
  97432. #endif
  97433. "str r4, [%[a], #24]\n\t"
  97434. "# a[i+7] += -1 * mu\n\t"
  97435. "ldr r6, [%[a], #28]\n\t"
  97436. "ldr r7, [%[a], #32]\n\t"
  97437. #ifdef WOLFSSL_KEIL
  97438. "adds r4, r1, r3\n\t"
  97439. #else
  97440. #ifdef __clang__
  97441. "adds r4, r1, r3\n\t"
  97442. #else
  97443. "add r4, r1, r3\n\t"
  97444. #endif
  97445. #endif
  97446. "movs r1, #0\n\t"
  97447. #ifdef WOLFSSL_KEIL
  97448. "adcs r1, r1, r2\n\t"
  97449. #elif defined(__clang__)
  97450. "adcs r1, r2\n\t"
  97451. #else
  97452. "adc r1, r2\n\t"
  97453. #endif
  97454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97455. "subs r5, r5, r3\n\t"
  97456. #else
  97457. "sub r5, r5, r3\n\t"
  97458. #endif
  97459. #ifdef WOLFSSL_KEIL
  97460. "sbcs r4, r4, r2\n\t"
  97461. #elif defined(__clang__)
  97462. "sbcs r4, r2\n\t"
  97463. #else
  97464. "sbc r4, r2\n\t"
  97465. #endif
  97466. #ifdef WOLFSSL_KEIL
  97467. "sbcs r1, r1, r2\n\t"
  97468. #elif defined(__clang__)
  97469. "sbcs r1, r2\n\t"
  97470. #else
  97471. "sbc r1, r2\n\t"
  97472. #endif
  97473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97474. "adds r5, r5, r6\n\t"
  97475. #else
  97476. "add r5, r5, r6\n\t"
  97477. #endif
  97478. #ifdef WOLFSSL_KEIL
  97479. "adcs r4, r4, r7\n\t"
  97480. #elif defined(__clang__)
  97481. "adcs r4, r7\n\t"
  97482. #else
  97483. "adc r4, r7\n\t"
  97484. #endif
  97485. #ifdef WOLFSSL_KEIL
  97486. "adcs r1, r1, r2\n\t"
  97487. #elif defined(__clang__)
  97488. "adcs r1, r2\n\t"
  97489. #else
  97490. "adc r1, r2\n\t"
  97491. #endif
  97492. "str r5, [%[a], #28]\n\t"
  97493. "str r4, [%[a], #32]\n\t"
  97494. "# i += 1\n\t"
  97495. "movs r6, #4\n\t"
  97496. "add r8, r8, r6\n\t"
  97497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97498. "adds %[a], %[a], #4\n\t"
  97499. #else
  97500. "add %[a], %[a], #4\n\t"
  97501. #endif
  97502. "movs r6, #32\n\t"
  97503. "cmp r8, r6\n\t"
  97504. "blt L_sp_256_mont_reduce_8_mod_%=\n\t"
  97505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97506. "subs %[a], %[a], #32\n\t"
  97507. #else
  97508. "sub %[a], %[a], #32\n\t"
  97509. #endif
  97510. "movs r3, r1\n\t"
  97511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97512. "subs r1, r1, #1\n\t"
  97513. #else
  97514. "sub r1, r1, #1\n\t"
  97515. #endif
  97516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97517. "mvns r1, r1\n\t"
  97518. #else
  97519. "mvn r1, r1\n\t"
  97520. #endif
  97521. "ldr r5, [%[a], #32]\n\t"
  97522. "ldr r4, [%[a], #36]\n\t"
  97523. "ldr r6, [%[a], #40]\n\t"
  97524. "ldr r7, [%[a], #44]\n\t"
  97525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97526. "subs r5, r5, r1\n\t"
  97527. #else
  97528. "sub r5, r5, r1\n\t"
  97529. #endif
  97530. #ifdef WOLFSSL_KEIL
  97531. "sbcs r4, r4, r1\n\t"
  97532. #elif defined(__clang__)
  97533. "sbcs r4, r1\n\t"
  97534. #else
  97535. "sbc r4, r1\n\t"
  97536. #endif
  97537. #ifdef WOLFSSL_KEIL
  97538. "sbcs r6, r6, r1\n\t"
  97539. #elif defined(__clang__)
  97540. "sbcs r6, r1\n\t"
  97541. #else
  97542. "sbc r6, r1\n\t"
  97543. #endif
  97544. #ifdef WOLFSSL_KEIL
  97545. "sbcs r7, r7, r2\n\t"
  97546. #elif defined(__clang__)
  97547. "sbcs r7, r2\n\t"
  97548. #else
  97549. "sbc r7, r2\n\t"
  97550. #endif
  97551. "str r5, [%[a]]\n\t"
  97552. "str r4, [%[a], #4]\n\t"
  97553. "str r6, [%[a], #8]\n\t"
  97554. "str r7, [%[a], #12]\n\t"
  97555. "ldr r5, [%[a], #48]\n\t"
  97556. "ldr r4, [%[a], #52]\n\t"
  97557. "ldr r6, [%[a], #56]\n\t"
  97558. "ldr r7, [%[a], #60]\n\t"
  97559. #ifdef WOLFSSL_KEIL
  97560. "sbcs r5, r5, r2\n\t"
  97561. #elif defined(__clang__)
  97562. "sbcs r5, r2\n\t"
  97563. #else
  97564. "sbc r5, r2\n\t"
  97565. #endif
  97566. #ifdef WOLFSSL_KEIL
  97567. "sbcs r4, r4, r2\n\t"
  97568. #elif defined(__clang__)
  97569. "sbcs r4, r2\n\t"
  97570. #else
  97571. "sbc r4, r2\n\t"
  97572. #endif
  97573. #ifdef WOLFSSL_KEIL
  97574. "sbcs r6, r6, r3\n\t"
  97575. #elif defined(__clang__)
  97576. "sbcs r6, r3\n\t"
  97577. #else
  97578. "sbc r6, r3\n\t"
  97579. #endif
  97580. #ifdef WOLFSSL_KEIL
  97581. "sbcs r7, r7, r1\n\t"
  97582. #elif defined(__clang__)
  97583. "sbcs r7, r1\n\t"
  97584. #else
  97585. "sbc r7, r1\n\t"
  97586. #endif
  97587. "str r5, [%[a], #16]\n\t"
  97588. "str r4, [%[a], #20]\n\t"
  97589. "str r6, [%[a], #24]\n\t"
  97590. "str r7, [%[a], #28]\n\t"
  97591. : [a] "+l" (a)
  97592. :
  97593. : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8"
  97594. );
  97595. }
  97596. /* Reduce the number back to 256 bits using Montgomery reduction.
  97597. *
  97598. * a A single precision number to reduce in place.
  97599. * m The single precision number representing the modulus.
  97600. * mp The digit representing the negative inverse of m mod 2^n.
  97601. */
  97602. SP_NOINLINE static void sp_256_mont_reduce_order_8(sp_digit* a,
  97603. const sp_digit* m, sp_digit mp)
  97604. {
  97605. __asm__ __volatile__ (
  97606. "movs r7, #0\n\t"
  97607. "mov r8, %[mp]\n\t"
  97608. "mov r12, r7\n\t"
  97609. "mov lr, %[m]\n\t"
  97610. "mov r9, %[a]\n\t"
  97611. "mov r11, %[a]\n\t"
  97612. "movs r5, #28\n\t"
  97613. "movs r6, #32\n\t"
  97614. "add r9, r9, r5\n\t"
  97615. "add r11, r11, r6\n\t"
  97616. "\n"
  97617. "L_sp_256_mont_reduce_order_8_mod_%=:\n\t"
  97618. "movs r7, #0\n\t"
  97619. "movs r4, #0\n\t"
  97620. "# a[i] += m[0] * mu\n\t"
  97621. "ldm %[m]!, {%[mp]}\n\t"
  97622. "ldm %[a]!, {r3}\n\t"
  97623. "# mu = a[i] * mp\n\t"
  97624. "mov r5, r8\n\t"
  97625. #ifdef WOLFSSL_KEIL
  97626. "muls r5, r3, r5\n\t"
  97627. #elif defined(__clang__)
  97628. "muls r5, r3\n\t"
  97629. #else
  97630. "mul r5, r3\n\t"
  97631. #endif
  97632. "mov r10, r5\n\t"
  97633. "# Multiply m[0] and mu - Start\n\t"
  97634. "mov r5, r10\n\t"
  97635. "uxth r6, %[mp]\n\t"
  97636. "uxth r5, r5\n\t"
  97637. #ifdef WOLFSSL_KEIL
  97638. "muls r6, r5, r6\n\t"
  97639. #elif defined(__clang__)
  97640. "muls r6, r5\n\t"
  97641. #else
  97642. "mul r6, r5\n\t"
  97643. #endif
  97644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97645. "adds r3, r3, r6\n\t"
  97646. #else
  97647. "add r3, r3, r6\n\t"
  97648. #endif
  97649. #ifdef WOLFSSL_KEIL
  97650. "adcs r4, r4, r7\n\t"
  97651. #elif defined(__clang__)
  97652. "adcs r4, r7\n\t"
  97653. #else
  97654. "adc r4, r7\n\t"
  97655. #endif
  97656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97657. "lsrs r6, %[mp], #16\n\t"
  97658. #else
  97659. "lsr r6, %[mp], #16\n\t"
  97660. #endif
  97661. #ifdef WOLFSSL_KEIL
  97662. "muls r5, r6, r5\n\t"
  97663. #elif defined(__clang__)
  97664. "muls r5, r6\n\t"
  97665. #else
  97666. "mul r5, r6\n\t"
  97667. #endif
  97668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97669. "lsrs r6, r5, #16\n\t"
  97670. #else
  97671. "lsr r6, r5, #16\n\t"
  97672. #endif
  97673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97674. "lsls r5, r5, #16\n\t"
  97675. #else
  97676. "lsl r5, r5, #16\n\t"
  97677. #endif
  97678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97679. "adds r3, r3, r5\n\t"
  97680. #else
  97681. "add r3, r3, r5\n\t"
  97682. #endif
  97683. #ifdef WOLFSSL_KEIL
  97684. "adcs r4, r4, r6\n\t"
  97685. #elif defined(__clang__)
  97686. "adcs r4, r6\n\t"
  97687. #else
  97688. "adc r4, r6\n\t"
  97689. #endif
  97690. "mov r5, r10\n\t"
  97691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97692. "lsrs r6, %[mp], #16\n\t"
  97693. #else
  97694. "lsr r6, %[mp], #16\n\t"
  97695. #endif
  97696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97697. "lsrs r5, r5, #16\n\t"
  97698. #else
  97699. "lsr r5, r5, #16\n\t"
  97700. #endif
  97701. #ifdef WOLFSSL_KEIL
  97702. "muls r6, r5, r6\n\t"
  97703. #elif defined(__clang__)
  97704. "muls r6, r5\n\t"
  97705. #else
  97706. "mul r6, r5\n\t"
  97707. #endif
  97708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97709. "adds r4, r4, r6\n\t"
  97710. #else
  97711. "add r4, r4, r6\n\t"
  97712. #endif
  97713. "uxth r6, %[mp]\n\t"
  97714. #ifdef WOLFSSL_KEIL
  97715. "muls r5, r6, r5\n\t"
  97716. #elif defined(__clang__)
  97717. "muls r5, r6\n\t"
  97718. #else
  97719. "mul r5, r6\n\t"
  97720. #endif
  97721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97722. "lsrs r6, r5, #16\n\t"
  97723. #else
  97724. "lsr r6, r5, #16\n\t"
  97725. #endif
  97726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97727. "lsls r5, r5, #16\n\t"
  97728. #else
  97729. "lsl r5, r5, #16\n\t"
  97730. #endif
  97731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97732. "adds r3, r3, r5\n\t"
  97733. #else
  97734. "add r3, r3, r5\n\t"
  97735. #endif
  97736. #ifdef WOLFSSL_KEIL
  97737. "adcs r4, r4, r6\n\t"
  97738. #elif defined(__clang__)
  97739. "adcs r4, r6\n\t"
  97740. #else
  97741. "adc r4, r6\n\t"
  97742. #endif
  97743. "# Multiply m[0] and mu - Done\n\t"
  97744. "\n"
  97745. "L_sp_256_mont_reduce_order_8_word_%=:\n\t"
  97746. "# a[i+j] += m[j] * mu\n\t"
  97747. "ldr r3, [%[a]]\n\t"
  97748. "ldm %[m]!, {%[mp]}\n\t"
  97749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97750. "adds r3, r3, r4\n\t"
  97751. #else
  97752. "add r3, r3, r4\n\t"
  97753. #endif
  97754. "movs r4, #0\n\t"
  97755. #ifdef WOLFSSL_KEIL
  97756. "adcs r4, r4, r7\n\t"
  97757. #elif defined(__clang__)
  97758. "adcs r4, r7\n\t"
  97759. #else
  97760. "adc r4, r7\n\t"
  97761. #endif
  97762. "# Multiply m[j] and mu - Start\n\t"
  97763. "mov r5, r10\n\t"
  97764. "uxth r6, %[mp]\n\t"
  97765. "uxth r5, r5\n\t"
  97766. #ifdef WOLFSSL_KEIL
  97767. "muls r6, r5, r6\n\t"
  97768. #elif defined(__clang__)
  97769. "muls r6, r5\n\t"
  97770. #else
  97771. "mul r6, r5\n\t"
  97772. #endif
  97773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97774. "adds r3, r3, r6\n\t"
  97775. #else
  97776. "add r3, r3, r6\n\t"
  97777. #endif
  97778. #ifdef WOLFSSL_KEIL
  97779. "adcs r4, r4, r7\n\t"
  97780. #elif defined(__clang__)
  97781. "adcs r4, r7\n\t"
  97782. #else
  97783. "adc r4, r7\n\t"
  97784. #endif
  97785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97786. "lsrs r6, %[mp], #16\n\t"
  97787. #else
  97788. "lsr r6, %[mp], #16\n\t"
  97789. #endif
  97790. #ifdef WOLFSSL_KEIL
  97791. "muls r5, r6, r5\n\t"
  97792. #elif defined(__clang__)
  97793. "muls r5, r6\n\t"
  97794. #else
  97795. "mul r5, r6\n\t"
  97796. #endif
  97797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97798. "lsrs r6, r5, #16\n\t"
  97799. #else
  97800. "lsr r6, r5, #16\n\t"
  97801. #endif
  97802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97803. "lsls r5, r5, #16\n\t"
  97804. #else
  97805. "lsl r5, r5, #16\n\t"
  97806. #endif
  97807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97808. "adds r3, r3, r5\n\t"
  97809. #else
  97810. "add r3, r3, r5\n\t"
  97811. #endif
  97812. #ifdef WOLFSSL_KEIL
  97813. "adcs r4, r4, r6\n\t"
  97814. #elif defined(__clang__)
  97815. "adcs r4, r6\n\t"
  97816. #else
  97817. "adc r4, r6\n\t"
  97818. #endif
  97819. "mov r5, r10\n\t"
  97820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97821. "lsrs r6, %[mp], #16\n\t"
  97822. #else
  97823. "lsr r6, %[mp], #16\n\t"
  97824. #endif
  97825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97826. "lsrs r5, r5, #16\n\t"
  97827. #else
  97828. "lsr r5, r5, #16\n\t"
  97829. #endif
  97830. #ifdef WOLFSSL_KEIL
  97831. "muls r6, r5, r6\n\t"
  97832. #elif defined(__clang__)
  97833. "muls r6, r5\n\t"
  97834. #else
  97835. "mul r6, r5\n\t"
  97836. #endif
  97837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97838. "adds r4, r4, r6\n\t"
  97839. #else
  97840. "add r4, r4, r6\n\t"
  97841. #endif
  97842. "uxth r6, %[mp]\n\t"
  97843. #ifdef WOLFSSL_KEIL
  97844. "muls r5, r6, r5\n\t"
  97845. #elif defined(__clang__)
  97846. "muls r5, r6\n\t"
  97847. #else
  97848. "mul r5, r6\n\t"
  97849. #endif
  97850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97851. "lsrs r6, r5, #16\n\t"
  97852. #else
  97853. "lsr r6, r5, #16\n\t"
  97854. #endif
  97855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97856. "lsls r5, r5, #16\n\t"
  97857. #else
  97858. "lsl r5, r5, #16\n\t"
  97859. #endif
  97860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97861. "adds r3, r3, r5\n\t"
  97862. #else
  97863. "add r3, r3, r5\n\t"
  97864. #endif
  97865. #ifdef WOLFSSL_KEIL
  97866. "adcs r4, r4, r6\n\t"
  97867. #elif defined(__clang__)
  97868. "adcs r4, r6\n\t"
  97869. #else
  97870. "adc r4, r6\n\t"
  97871. #endif
  97872. "# Multiply m[j] and mu - Done\n\t"
  97873. "stm %[a]!, {r3}\n\t"
  97874. "cmp %[a], r9\n\t"
  97875. "blt L_sp_256_mont_reduce_order_8_word_%=\n\t"
  97876. "# a[i+7] += m[7] * mu\n\t"
  97877. "ldr %[mp], [%[m]]\n\t"
  97878. "mov r3, r12\n\t"
  97879. "# Multiply m[7] and mu - Start\n\t"
  97880. "mov r5, r10\n\t"
  97881. "uxth r6, %[mp]\n\t"
  97882. "uxth r5, r5\n\t"
  97883. #ifdef WOLFSSL_KEIL
  97884. "muls r6, r5, r6\n\t"
  97885. #elif defined(__clang__)
  97886. "muls r6, r5\n\t"
  97887. #else
  97888. "mul r6, r5\n\t"
  97889. #endif
  97890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97891. "adds r4, r4, r6\n\t"
  97892. #else
  97893. "add r4, r4, r6\n\t"
  97894. #endif
  97895. #ifdef WOLFSSL_KEIL
  97896. "adcs r3, r3, r7\n\t"
  97897. #elif defined(__clang__)
  97898. "adcs r3, r7\n\t"
  97899. #else
  97900. "adc r3, r7\n\t"
  97901. #endif
  97902. #ifdef WOLFSSL_KEIL
  97903. "adcs r7, r7, r7\n\t"
  97904. #elif defined(__clang__)
  97905. "adcs r7, r7\n\t"
  97906. #else
  97907. "adc r7, r7\n\t"
  97908. #endif
  97909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97910. "lsrs r6, %[mp], #16\n\t"
  97911. #else
  97912. "lsr r6, %[mp], #16\n\t"
  97913. #endif
  97914. #ifdef WOLFSSL_KEIL
  97915. "muls r5, r6, r5\n\t"
  97916. #elif defined(__clang__)
  97917. "muls r5, r6\n\t"
  97918. #else
  97919. "mul r5, r6\n\t"
  97920. #endif
  97921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97922. "lsrs r6, r5, #16\n\t"
  97923. #else
  97924. "lsr r6, r5, #16\n\t"
  97925. #endif
  97926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97927. "lsls r5, r5, #16\n\t"
  97928. #else
  97929. "lsl r5, r5, #16\n\t"
  97930. #endif
  97931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97932. "adds r4, r4, r5\n\t"
  97933. #else
  97934. "add r4, r4, r5\n\t"
  97935. #endif
  97936. #ifdef WOLFSSL_KEIL
  97937. "adcs r3, r3, r6\n\t"
  97938. #elif defined(__clang__)
  97939. "adcs r3, r6\n\t"
  97940. #else
  97941. "adc r3, r6\n\t"
  97942. #endif
  97943. #ifdef WOLFSSL_KEIL
  97944. "adcs r7, r7, r7\n\t"
  97945. #elif defined(__clang__)
  97946. "adcs r7, r7\n\t"
  97947. #else
  97948. "adc r7, r7\n\t"
  97949. #endif
  97950. "mov r5, r10\n\t"
  97951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97952. "lsrs r6, %[mp], #16\n\t"
  97953. #else
  97954. "lsr r6, %[mp], #16\n\t"
  97955. #endif
  97956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97957. "lsrs r5, r5, #16\n\t"
  97958. #else
  97959. "lsr r5, r5, #16\n\t"
  97960. #endif
  97961. #ifdef WOLFSSL_KEIL
  97962. "muls r6, r5, r6\n\t"
  97963. #elif defined(__clang__)
  97964. "muls r6, r5\n\t"
  97965. #else
  97966. "mul r6, r5\n\t"
  97967. #endif
  97968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97969. "adds r3, r3, r6\n\t"
  97970. #else
  97971. "add r3, r3, r6\n\t"
  97972. #endif
  97973. #ifdef WOLFSSL_KEIL
  97974. "adcs r7, r7, r7\n\t"
  97975. #elif defined(__clang__)
  97976. "adcs r7, r7\n\t"
  97977. #else
  97978. "adc r7, r7\n\t"
  97979. #endif
  97980. "uxth r6, %[mp]\n\t"
  97981. #ifdef WOLFSSL_KEIL
  97982. "muls r5, r6, r5\n\t"
  97983. #elif defined(__clang__)
  97984. "muls r5, r6\n\t"
  97985. #else
  97986. "mul r5, r6\n\t"
  97987. #endif
  97988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97989. "lsrs r6, r5, #16\n\t"
  97990. #else
  97991. "lsr r6, r5, #16\n\t"
  97992. #endif
  97993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97994. "lsls r5, r5, #16\n\t"
  97995. #else
  97996. "lsl r5, r5, #16\n\t"
  97997. #endif
  97998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  97999. "adds r4, r4, r5\n\t"
  98000. #else
  98001. "add r4, r4, r5\n\t"
  98002. #endif
  98003. #ifdef WOLFSSL_KEIL
  98004. "adcs r3, r3, r6\n\t"
  98005. #elif defined(__clang__)
  98006. "adcs r3, r6\n\t"
  98007. #else
  98008. "adc r3, r6\n\t"
  98009. #endif
  98010. #ifdef WOLFSSL_KEIL
  98011. "adcs r7, r7, r7\n\t"
  98012. #elif defined(__clang__)
  98013. "adcs r7, r7\n\t"
  98014. #else
  98015. "adc r7, r7\n\t"
  98016. #endif
  98017. "# Multiply m[7] and mu - Done\n\t"
  98018. "ldr r5, [%[a]]\n\t"
  98019. "ldr r6, [%[a], #4]\n\t"
  98020. "movs %[mp], #0\n\t"
  98021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98022. "adds r5, r5, r4\n\t"
  98023. #else
  98024. "add r5, r5, r4\n\t"
  98025. #endif
  98026. #ifdef WOLFSSL_KEIL
  98027. "adcs r6, r6, r3\n\t"
  98028. #elif defined(__clang__)
  98029. "adcs r6, r3\n\t"
  98030. #else
  98031. "adc r6, r3\n\t"
  98032. #endif
  98033. #ifdef WOLFSSL_KEIL
  98034. "adcs r7, r7, %[mp]\n\t"
  98035. #elif defined(__clang__)
  98036. "adcs r7, %[mp]\n\t"
  98037. #else
  98038. "adc r7, %[mp]\n\t"
  98039. #endif
  98040. "stm %[a]!, {r5, r6}\n\t"
  98041. "# i += 1\n\t"
  98042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98043. "subs %[a], %[a], #4\n\t"
  98044. #else
  98045. "sub %[a], %[a], #4\n\t"
  98046. #endif
  98047. "movs r3, #28\n\t"
  98048. "mov r9, %[a]\n\t"
  98049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98050. "subs %[a], %[a], r3\n\t"
  98051. #else
  98052. "sub %[a], %[a], r3\n\t"
  98053. #endif
  98054. "mov r12, r7\n\t"
  98055. "mov %[m], lr\n\t"
  98056. "cmp r11, %[a]\n\t"
  98057. "bgt L_sp_256_mont_reduce_order_8_mod_%=\n\t"
  98058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98059. "negs r7, r7\n\t"
  98060. #else
  98061. "neg r7, r7\n\t"
  98062. #endif
  98063. "# Subtract masked modulus\n\t"
  98064. "movs r4, #32\n\t"
  98065. "movs %[mp], #0\n\t"
  98066. "movs r3, #0\n\t"
  98067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98068. "subs %[a], %[a], r4\n\t"
  98069. #else
  98070. "sub %[a], %[a], r4\n\t"
  98071. #endif
  98072. #ifndef WOLFSSL_SP_LARGE_CODE
  98073. "\n"
  98074. "L_sp_256_mont_reduce_order_8_sub_mask_%=:\n\t"
  98075. "ldm %[m]!, {r6}\n\t"
  98076. "movs r5, #0\n\t"
  98077. #ifdef WOLFSSL_KEIL
  98078. "ands r6, r6, r7\n\t"
  98079. #elif defined(__clang__)
  98080. "ands r6, r7\n\t"
  98081. #else
  98082. "and r6, r7\n\t"
  98083. #endif
  98084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98085. "subs r5, r5, %[mp]\n\t"
  98086. #else
  98087. "sub r5, r5, %[mp]\n\t"
  98088. #endif
  98089. "ldr r5, [%[a], r4]\n\t"
  98090. #ifdef WOLFSSL_KEIL
  98091. "sbcs r5, r5, r6\n\t"
  98092. #elif defined(__clang__)
  98093. "sbcs r5, r6\n\t"
  98094. #else
  98095. "sbc r5, r6\n\t"
  98096. #endif
  98097. #ifdef WOLFSSL_KEIL
  98098. "sbcs %[mp], %[mp], %[mp]\n\t"
  98099. #elif defined(__clang__)
  98100. "sbcs %[mp], %[mp]\n\t"
  98101. #else
  98102. "sbc %[mp], %[mp]\n\t"
  98103. #endif
  98104. "stm %[a]!, {r5}\n\t"
  98105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98106. "adds r3, r3, #4\n\t"
  98107. #else
  98108. "add r3, r3, #4\n\t"
  98109. #endif
  98110. "cmp r3, r4\n\t"
  98111. "blt L_sp_256_mont_reduce_order_8_sub_mask_%=\n\t"
  98112. #else /* WOLFSSL_SP_LARGE_CODE */
  98113. "ldm %[m]!, {r6}\n\t"
  98114. #ifdef WOLFSSL_KEIL
  98115. "ands r6, r6, r7\n\t"
  98116. #elif defined(__clang__)
  98117. "ands r6, r7\n\t"
  98118. #else
  98119. "and r6, r7\n\t"
  98120. #endif
  98121. "ldr r5, [%[a], r4]\n\t"
  98122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98123. "subs r5, r5, r6\n\t"
  98124. #else
  98125. "sub r5, r5, r6\n\t"
  98126. #endif
  98127. "stm %[a]!, {r5}\n\t"
  98128. "ldm %[m]!, {r6}\n\t"
  98129. #ifdef WOLFSSL_KEIL
  98130. "ands r6, r6, r7\n\t"
  98131. #elif defined(__clang__)
  98132. "ands r6, r7\n\t"
  98133. #else
  98134. "and r6, r7\n\t"
  98135. #endif
  98136. "ldr r5, [%[a], r4]\n\t"
  98137. #ifdef WOLFSSL_KEIL
  98138. "sbcs r5, r5, r6\n\t"
  98139. #elif defined(__clang__)
  98140. "sbcs r5, r6\n\t"
  98141. #else
  98142. "sbc r5, r6\n\t"
  98143. #endif
  98144. "stm %[a]!, {r5}\n\t"
  98145. "ldm %[m]!, {r6}\n\t"
  98146. #ifdef WOLFSSL_KEIL
  98147. "ands r6, r6, r7\n\t"
  98148. #elif defined(__clang__)
  98149. "ands r6, r7\n\t"
  98150. #else
  98151. "and r6, r7\n\t"
  98152. #endif
  98153. "ldr r5, [%[a], r4]\n\t"
  98154. #ifdef WOLFSSL_KEIL
  98155. "sbcs r5, r5, r6\n\t"
  98156. #elif defined(__clang__)
  98157. "sbcs r5, r6\n\t"
  98158. #else
  98159. "sbc r5, r6\n\t"
  98160. #endif
  98161. "stm %[a]!, {r5}\n\t"
  98162. "ldm %[m]!, {r6}\n\t"
  98163. #ifdef WOLFSSL_KEIL
  98164. "ands r6, r6, r7\n\t"
  98165. #elif defined(__clang__)
  98166. "ands r6, r7\n\t"
  98167. #else
  98168. "and r6, r7\n\t"
  98169. #endif
  98170. "ldr r5, [%[a], r4]\n\t"
  98171. #ifdef WOLFSSL_KEIL
  98172. "sbcs r5, r5, r6\n\t"
  98173. #elif defined(__clang__)
  98174. "sbcs r5, r6\n\t"
  98175. #else
  98176. "sbc r5, r6\n\t"
  98177. #endif
  98178. "stm %[a]!, {r5}\n\t"
  98179. "ldm %[m]!, {r6}\n\t"
  98180. #ifdef WOLFSSL_KEIL
  98181. "ands r6, r6, r7\n\t"
  98182. #elif defined(__clang__)
  98183. "ands r6, r7\n\t"
  98184. #else
  98185. "and r6, r7\n\t"
  98186. #endif
  98187. "ldr r5, [%[a], r4]\n\t"
  98188. #ifdef WOLFSSL_KEIL
  98189. "sbcs r5, r5, r6\n\t"
  98190. #elif defined(__clang__)
  98191. "sbcs r5, r6\n\t"
  98192. #else
  98193. "sbc r5, r6\n\t"
  98194. #endif
  98195. "stm %[a]!, {r5}\n\t"
  98196. "ldm %[m]!, {r6}\n\t"
  98197. #ifdef WOLFSSL_KEIL
  98198. "ands r6, r6, r7\n\t"
  98199. #elif defined(__clang__)
  98200. "ands r6, r7\n\t"
  98201. #else
  98202. "and r6, r7\n\t"
  98203. #endif
  98204. "ldr r5, [%[a], r4]\n\t"
  98205. #ifdef WOLFSSL_KEIL
  98206. "sbcs r5, r5, r6\n\t"
  98207. #elif defined(__clang__)
  98208. "sbcs r5, r6\n\t"
  98209. #else
  98210. "sbc r5, r6\n\t"
  98211. #endif
  98212. "stm %[a]!, {r5}\n\t"
  98213. "ldm %[m]!, {r6}\n\t"
  98214. #ifdef WOLFSSL_KEIL
  98215. "ands r6, r6, r7\n\t"
  98216. #elif defined(__clang__)
  98217. "ands r6, r7\n\t"
  98218. #else
  98219. "and r6, r7\n\t"
  98220. #endif
  98221. "ldr r5, [%[a], r4]\n\t"
  98222. #ifdef WOLFSSL_KEIL
  98223. "sbcs r5, r5, r6\n\t"
  98224. #elif defined(__clang__)
  98225. "sbcs r5, r6\n\t"
  98226. #else
  98227. "sbc r5, r6\n\t"
  98228. #endif
  98229. "stm %[a]!, {r5}\n\t"
  98230. "ldm %[m]!, {r6}\n\t"
  98231. #ifdef WOLFSSL_KEIL
  98232. "ands r6, r6, r7\n\t"
  98233. #elif defined(__clang__)
  98234. "ands r6, r7\n\t"
  98235. #else
  98236. "and r6, r7\n\t"
  98237. #endif
  98238. "ldr r5, [%[a], r4]\n\t"
  98239. #ifdef WOLFSSL_KEIL
  98240. "sbcs r5, r5, r6\n\t"
  98241. #elif defined(__clang__)
  98242. "sbcs r5, r6\n\t"
  98243. #else
  98244. "sbc r5, r6\n\t"
  98245. #endif
  98246. "stm %[a]!, {r5}\n\t"
  98247. #endif /* WOLFSSL_SP_LARGE_CODE */
  98248. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  98249. :
  98250. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  98251. );
  98252. }
  98253. /* Multiply two Montgomery form numbers mod the modulus (prime).
  98254. * (r = a * b mod m)
  98255. *
  98256. * r Result of multiplication.
  98257. * a First number to multiply in Montgomery form.
  98258. * b Second number to multiply in Montgomery form.
  98259. * m Modulus (prime).
  98260. * mp Montgomery mulitplier.
  98261. */
  98262. SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a,
  98263. const sp_digit* b, const sp_digit* m, sp_digit mp)
  98264. {
  98265. sp_256_mul_8(r, a, b);
  98266. sp_256_mont_reduce_8(r, m, mp);
  98267. }
  98268. /* Square the Montgomery form number. (r = a * a mod m)
  98269. *
  98270. * r Result of squaring.
  98271. * a Number to square in Montgomery form.
  98272. * m Modulus (prime).
  98273. * mp Montgomery mulitplier.
  98274. */
  98275. SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a,
  98276. const sp_digit* m, sp_digit mp)
  98277. {
  98278. sp_256_sqr_8(r, a);
  98279. sp_256_mont_reduce_8(r, m, mp);
  98280. }
  98281. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  98282. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  98283. *
  98284. * r Result of squaring.
  98285. * a Number to square in Montgomery form.
  98286. * n Number of times to square.
  98287. * m Modulus (prime).
  98288. * mp Montgomery mulitplier.
  98289. */
  98290. static void sp_256_mont_sqr_n_8(sp_digit* r, const sp_digit* a, int n,
  98291. const sp_digit* m, sp_digit mp)
  98292. {
  98293. sp_256_mont_sqr_8(r, a, m, mp);
  98294. for (; n > 1; n--) {
  98295. sp_256_mont_sqr_8(r, r, m, mp);
  98296. }
  98297. }
  98298. #endif /* !WOLFSSL_SP_SMALL | HAVE_COMP_KEY */
  98299. #ifdef WOLFSSL_SP_SMALL
  98300. /* Mod-2 for the P256 curve. */
  98301. static const uint32_t p256_mod_minus_2[8] = {
  98302. 0xfffffffdU,0xffffffffU,0xffffffffU,0x00000000U,0x00000000U,0x00000000U,
  98303. 0x00000001U,0xffffffffU
  98304. };
  98305. #endif /* !WOLFSSL_SP_SMALL */
  98306. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  98307. * P256 curve. (r = 1 / a mod m)
  98308. *
  98309. * r Inverse result.
  98310. * a Number to invert.
  98311. * td Temporary data.
  98312. */
  98313. static void sp_256_mont_inv_8(sp_digit* r, const sp_digit* a, sp_digit* td)
  98314. {
  98315. #ifdef WOLFSSL_SP_SMALL
  98316. sp_digit* t = td;
  98317. int i;
  98318. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  98319. for (i=254; i>=0; i--) {
  98320. sp_256_mont_sqr_8(t, t, p256_mod, p256_mp_mod);
  98321. if (p256_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  98322. sp_256_mont_mul_8(t, t, a, p256_mod, p256_mp_mod);
  98323. }
  98324. XMEMCPY(r, t, sizeof(sp_digit) * 8);
  98325. #else
  98326. sp_digit* t1 = td;
  98327. sp_digit* t2 = td + 2 * 8;
  98328. sp_digit* t3 = td + 4 * 8;
  98329. /* 0x2 */
  98330. sp_256_mont_sqr_8(t1, a, p256_mod, p256_mp_mod);
  98331. /* 0x3 */
  98332. sp_256_mont_mul_8(t2, t1, a, p256_mod, p256_mp_mod);
  98333. /* 0xc */
  98334. sp_256_mont_sqr_n_8(t1, t2, 2, p256_mod, p256_mp_mod);
  98335. /* 0xd */
  98336. sp_256_mont_mul_8(t3, t1, a, p256_mod, p256_mp_mod);
  98337. /* 0xf */
  98338. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98339. /* 0xf0 */
  98340. sp_256_mont_sqr_n_8(t1, t2, 4, p256_mod, p256_mp_mod);
  98341. /* 0xfd */
  98342. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  98343. /* 0xff */
  98344. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98345. /* 0xff00 */
  98346. sp_256_mont_sqr_n_8(t1, t2, 8, p256_mod, p256_mp_mod);
  98347. /* 0xfffd */
  98348. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  98349. /* 0xffff */
  98350. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98351. /* 0xffff0000 */
  98352. sp_256_mont_sqr_n_8(t1, t2, 16, p256_mod, p256_mp_mod);
  98353. /* 0xfffffffd */
  98354. sp_256_mont_mul_8(t3, t3, t1, p256_mod, p256_mp_mod);
  98355. /* 0xffffffff */
  98356. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98357. /* 0xffffffff00000000 */
  98358. sp_256_mont_sqr_n_8(t1, t2, 32, p256_mod, p256_mp_mod);
  98359. /* 0xffffffffffffffff */
  98360. sp_256_mont_mul_8(t2, t2, t1, p256_mod, p256_mp_mod);
  98361. /* 0xffffffff00000001 */
  98362. sp_256_mont_mul_8(r, t1, a, p256_mod, p256_mp_mod);
  98363. /* 0xffffffff000000010000000000000000000000000000000000000000 */
  98364. sp_256_mont_sqr_n_8(r, r, 160, p256_mod, p256_mp_mod);
  98365. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff */
  98366. sp_256_mont_mul_8(r, r, t2, p256_mod, p256_mp_mod);
  98367. /* 0xffffffff00000001000000000000000000000000ffffffffffffffff00000000 */
  98368. sp_256_mont_sqr_n_8(r, r, 32, p256_mod, p256_mp_mod);
  98369. /* 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffd */
  98370. sp_256_mont_mul_8(r, r, t3, p256_mod, p256_mp_mod);
  98371. #endif /* WOLFSSL_SP_SMALL */
  98372. }
  98373. /* Compare a with b in constant time.
  98374. *
  98375. * a A single precision integer.
  98376. * b A single precision integer.
  98377. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  98378. * respectively.
  98379. */
  98380. SP_NOINLINE static sp_int32 sp_256_cmp_8(const sp_digit* a, const sp_digit* b)
  98381. {
  98382. __asm__ __volatile__ (
  98383. "movs r2, #0\n\t"
  98384. "movs r3, #0\n\t"
  98385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98386. "mvns r3, r3\n\t"
  98387. #else
  98388. "mvn r3, r3\n\t"
  98389. #endif
  98390. "movs r6, #28\n\t"
  98391. "\n"
  98392. "L_sp_256_cmp_8_words_%=:\n\t"
  98393. "ldr r7, [%[a], r6]\n\t"
  98394. "ldr r5, [%[b], r6]\n\t"
  98395. #ifdef WOLFSSL_KEIL
  98396. "ands r7, r7, r3\n\t"
  98397. #elif defined(__clang__)
  98398. "ands r7, r3\n\t"
  98399. #else
  98400. "and r7, r3\n\t"
  98401. #endif
  98402. #ifdef WOLFSSL_KEIL
  98403. "ands r5, r5, r3\n\t"
  98404. #elif defined(__clang__)
  98405. "ands r5, r3\n\t"
  98406. #else
  98407. "and r5, r3\n\t"
  98408. #endif
  98409. "movs r4, r7\n\t"
  98410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98411. "subs r7, r7, r5\n\t"
  98412. #else
  98413. "sub r7, r7, r5\n\t"
  98414. #endif
  98415. #ifdef WOLFSSL_KEIL
  98416. "sbcs r7, r7, r7\n\t"
  98417. #elif defined(__clang__)
  98418. "sbcs r7, r7\n\t"
  98419. #else
  98420. "sbc r7, r7\n\t"
  98421. #endif
  98422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98423. "adds r2, r2, r7\n\t"
  98424. #else
  98425. "add r2, r2, r7\n\t"
  98426. #endif
  98427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98428. "mvns r7, r7\n\t"
  98429. #else
  98430. "mvn r7, r7\n\t"
  98431. #endif
  98432. #ifdef WOLFSSL_KEIL
  98433. "ands r3, r3, r7\n\t"
  98434. #elif defined(__clang__)
  98435. "ands r3, r7\n\t"
  98436. #else
  98437. "and r3, r7\n\t"
  98438. #endif
  98439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98440. "subs r5, r5, r4\n\t"
  98441. #else
  98442. "sub r5, r5, r4\n\t"
  98443. #endif
  98444. #ifdef WOLFSSL_KEIL
  98445. "sbcs r7, r7, r7\n\t"
  98446. #elif defined(__clang__)
  98447. "sbcs r7, r7\n\t"
  98448. #else
  98449. "sbc r7, r7\n\t"
  98450. #endif
  98451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98452. "subs r2, r2, r7\n\t"
  98453. #else
  98454. "sub r2, r2, r7\n\t"
  98455. #endif
  98456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98457. "mvns r7, r7\n\t"
  98458. #else
  98459. "mvn r7, r7\n\t"
  98460. #endif
  98461. #ifdef WOLFSSL_KEIL
  98462. "ands r3, r3, r7\n\t"
  98463. #elif defined(__clang__)
  98464. "ands r3, r7\n\t"
  98465. #else
  98466. "and r3, r7\n\t"
  98467. #endif
  98468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98469. "subs r6, r6, #4\n\t"
  98470. #else
  98471. "sub r6, r6, #4\n\t"
  98472. #endif
  98473. "bge L_sp_256_cmp_8_words_%=\n\t"
  98474. "movs %[a], r2\n\t"
  98475. : [a] "+l" (a), [b] "+l" (b)
  98476. :
  98477. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  98478. );
  98479. return (uint32_t)(size_t)a;
  98480. }
  98481. /* Normalize the values in each word to 32.
  98482. *
  98483. * a Array of sp_digit to normalize.
  98484. */
  98485. #define sp_256_norm_8(a)
  98486. /* Map the Montgomery form projective coordinate point to an affine point.
  98487. *
  98488. * r Resulting affine coordinate point.
  98489. * p Montgomery form projective coordinate point.
  98490. * t Temporary ordinate data.
  98491. */
  98492. static void sp_256_map_8(sp_point_256* r, const sp_point_256* p,
  98493. sp_digit* t)
  98494. {
  98495. sp_digit* t1 = t;
  98496. sp_digit* t2 = t + 2*8;
  98497. sp_int32 n;
  98498. sp_256_mont_inv_8(t1, p->z, t + 2*8);
  98499. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  98500. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  98501. /* x /= z^2 */
  98502. sp_256_mont_mul_8(r->x, p->x, t2, p256_mod, p256_mp_mod);
  98503. XMEMSET(r->x + 8, 0, sizeof(r->x) / 2U);
  98504. sp_256_mont_reduce_8(r->x, p256_mod, p256_mp_mod);
  98505. /* Reduce x to less than modulus */
  98506. n = sp_256_cmp_8(r->x, p256_mod);
  98507. sp_256_cond_sub_8(r->x, r->x, p256_mod, ~(n >> 31));
  98508. sp_256_norm_8(r->x);
  98509. /* y /= z^3 */
  98510. sp_256_mont_mul_8(r->y, p->y, t1, p256_mod, p256_mp_mod);
  98511. XMEMSET(r->y + 8, 0, sizeof(r->y) / 2U);
  98512. sp_256_mont_reduce_8(r->y, p256_mod, p256_mp_mod);
  98513. /* Reduce y to less than modulus */
  98514. n = sp_256_cmp_8(r->y, p256_mod);
  98515. sp_256_cond_sub_8(r->y, r->y, p256_mod, ~(n >> 31));
  98516. sp_256_norm_8(r->y);
  98517. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  98518. r->z[0] = 1;
  98519. }
  98520. /* Add two Montgomery form numbers (r = a + b % m).
  98521. *
  98522. * r Result of addition.
  98523. * a First number to add in Montgomery form.
  98524. * b Second number to add in Montgomery form.
  98525. * m Modulus (prime).
  98526. */
  98527. SP_NOINLINE static void sp_256_mont_add_8(sp_digit* r, const sp_digit* a,
  98528. const sp_digit* b, const sp_digit* m)
  98529. {
  98530. (void)m;
  98531. __asm__ __volatile__ (
  98532. "movs r3, #0\n\t"
  98533. "ldr r4, [%[a]]\n\t"
  98534. "ldr r5, [%[a], #4]\n\t"
  98535. "ldr r6, [%[b]]\n\t"
  98536. "ldr r7, [%[b], #4]\n\t"
  98537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98538. "adds r4, r4, r6\n\t"
  98539. #else
  98540. "add r4, r4, r6\n\t"
  98541. #endif
  98542. #ifdef WOLFSSL_KEIL
  98543. "adcs r5, r5, r7\n\t"
  98544. #elif defined(__clang__)
  98545. "adcs r5, r7\n\t"
  98546. #else
  98547. "adc r5, r7\n\t"
  98548. #endif
  98549. "str r4, [%[r]]\n\t"
  98550. "str r5, [%[r], #4]\n\t"
  98551. "ldr r4, [%[a], #8]\n\t"
  98552. "ldr r5, [%[a], #12]\n\t"
  98553. "ldr r6, [%[b], #8]\n\t"
  98554. "ldr r7, [%[b], #12]\n\t"
  98555. #ifdef WOLFSSL_KEIL
  98556. "adcs r4, r4, r6\n\t"
  98557. #elif defined(__clang__)
  98558. "adcs r4, r6\n\t"
  98559. #else
  98560. "adc r4, r6\n\t"
  98561. #endif
  98562. #ifdef WOLFSSL_KEIL
  98563. "adcs r5, r5, r7\n\t"
  98564. #elif defined(__clang__)
  98565. "adcs r5, r7\n\t"
  98566. #else
  98567. "adc r5, r7\n\t"
  98568. #endif
  98569. "str r4, [%[r], #8]\n\t"
  98570. "str r5, [%[r], #12]\n\t"
  98571. "ldr r4, [%[a], #16]\n\t"
  98572. "ldr r5, [%[a], #20]\n\t"
  98573. "ldr r6, [%[b], #16]\n\t"
  98574. "ldr r7, [%[b], #20]\n\t"
  98575. #ifdef WOLFSSL_KEIL
  98576. "adcs r4, r4, r6\n\t"
  98577. #elif defined(__clang__)
  98578. "adcs r4, r6\n\t"
  98579. #else
  98580. "adc r4, r6\n\t"
  98581. #endif
  98582. #ifdef WOLFSSL_KEIL
  98583. "adcs r5, r5, r7\n\t"
  98584. #elif defined(__clang__)
  98585. "adcs r5, r7\n\t"
  98586. #else
  98587. "adc r5, r7\n\t"
  98588. #endif
  98589. "mov r8, r4\n\t"
  98590. "mov r9, r5\n\t"
  98591. "ldr r4, [%[a], #24]\n\t"
  98592. "ldr r5, [%[a], #28]\n\t"
  98593. "ldr r6, [%[b], #24]\n\t"
  98594. "ldr r7, [%[b], #28]\n\t"
  98595. #ifdef WOLFSSL_KEIL
  98596. "adcs r4, r4, r6\n\t"
  98597. #elif defined(__clang__)
  98598. "adcs r4, r6\n\t"
  98599. #else
  98600. "adc r4, r6\n\t"
  98601. #endif
  98602. #ifdef WOLFSSL_KEIL
  98603. "adcs r5, r5, r7\n\t"
  98604. #elif defined(__clang__)
  98605. "adcs r5, r7\n\t"
  98606. #else
  98607. "adc r5, r7\n\t"
  98608. #endif
  98609. "mov r10, r4\n\t"
  98610. "mov r11, r5\n\t"
  98611. #ifdef WOLFSSL_KEIL
  98612. "adcs r3, r3, r3\n\t"
  98613. #elif defined(__clang__)
  98614. "adcs r3, r3\n\t"
  98615. #else
  98616. "adc r3, r3\n\t"
  98617. #endif
  98618. "movs r6, r3\n\t"
  98619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98620. "subs r3, r3, #1\n\t"
  98621. #else
  98622. "sub r3, r3, #1\n\t"
  98623. #endif
  98624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98625. "mvns r3, r3\n\t"
  98626. #else
  98627. "mvn r3, r3\n\t"
  98628. #endif
  98629. "movs r7, #0\n\t"
  98630. "ldr r4, [%[r]]\n\t"
  98631. "ldr r5, [%[r], #4]\n\t"
  98632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98633. "subs r4, r4, r3\n\t"
  98634. #else
  98635. "sub r4, r4, r3\n\t"
  98636. #endif
  98637. #ifdef WOLFSSL_KEIL
  98638. "sbcs r5, r5, r3\n\t"
  98639. #elif defined(__clang__)
  98640. "sbcs r5, r3\n\t"
  98641. #else
  98642. "sbc r5, r3\n\t"
  98643. #endif
  98644. "str r4, [%[r]]\n\t"
  98645. "str r5, [%[r], #4]\n\t"
  98646. "ldr r4, [%[r], #8]\n\t"
  98647. "ldr r5, [%[r], #12]\n\t"
  98648. #ifdef WOLFSSL_KEIL
  98649. "sbcs r4, r4, r3\n\t"
  98650. #elif defined(__clang__)
  98651. "sbcs r4, r3\n\t"
  98652. #else
  98653. "sbc r4, r3\n\t"
  98654. #endif
  98655. #ifdef WOLFSSL_KEIL
  98656. "sbcs r5, r5, r7\n\t"
  98657. #elif defined(__clang__)
  98658. "sbcs r5, r7\n\t"
  98659. #else
  98660. "sbc r5, r7\n\t"
  98661. #endif
  98662. "str r4, [%[r], #8]\n\t"
  98663. "str r5, [%[r], #12]\n\t"
  98664. "mov r4, r8\n\t"
  98665. "mov r5, r9\n\t"
  98666. #ifdef WOLFSSL_KEIL
  98667. "sbcs r4, r4, r7\n\t"
  98668. #elif defined(__clang__)
  98669. "sbcs r4, r7\n\t"
  98670. #else
  98671. "sbc r4, r7\n\t"
  98672. #endif
  98673. #ifdef WOLFSSL_KEIL
  98674. "sbcs r5, r5, r7\n\t"
  98675. #elif defined(__clang__)
  98676. "sbcs r5, r7\n\t"
  98677. #else
  98678. "sbc r5, r7\n\t"
  98679. #endif
  98680. "str r4, [%[r], #16]\n\t"
  98681. "str r5, [%[r], #20]\n\t"
  98682. "mov r4, r10\n\t"
  98683. "mov r5, r11\n\t"
  98684. #ifdef WOLFSSL_KEIL
  98685. "sbcs r4, r4, r6\n\t"
  98686. #elif defined(__clang__)
  98687. "sbcs r4, r6\n\t"
  98688. #else
  98689. "sbc r4, r6\n\t"
  98690. #endif
  98691. #ifdef WOLFSSL_KEIL
  98692. "sbcs r5, r5, r3\n\t"
  98693. #elif defined(__clang__)
  98694. "sbcs r5, r3\n\t"
  98695. #else
  98696. "sbc r5, r3\n\t"
  98697. #endif
  98698. "str r4, [%[r], #24]\n\t"
  98699. "str r5, [%[r], #28]\n\t"
  98700. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  98701. :
  98702. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  98703. );
  98704. }
  98705. /* Double a Montgomery form number (r = a + a % m).
  98706. *
  98707. * r Result of doubling.
  98708. * a Number to double in Montgomery form.
  98709. * m Modulus (prime).
  98710. */
  98711. SP_NOINLINE static void sp_256_mont_dbl_8(sp_digit* r, const sp_digit* a,
  98712. const sp_digit* m)
  98713. {
  98714. (void)m;
  98715. __asm__ __volatile__ (
  98716. "ldr r4, [%[a]]\n\t"
  98717. "ldr r5, [%[a], #4]\n\t"
  98718. "ldr r6, [%[a], #8]\n\t"
  98719. "ldr r7, [%[a], #12]\n\t"
  98720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98721. "adds r4, r4, r4\n\t"
  98722. #else
  98723. "add r4, r4, r4\n\t"
  98724. #endif
  98725. #ifdef WOLFSSL_KEIL
  98726. "adcs r5, r5, r5\n\t"
  98727. #elif defined(__clang__)
  98728. "adcs r5, r5\n\t"
  98729. #else
  98730. "adc r5, r5\n\t"
  98731. #endif
  98732. #ifdef WOLFSSL_KEIL
  98733. "adcs r6, r6, r6\n\t"
  98734. #elif defined(__clang__)
  98735. "adcs r6, r6\n\t"
  98736. #else
  98737. "adc r6, r6\n\t"
  98738. #endif
  98739. #ifdef WOLFSSL_KEIL
  98740. "adcs r7, r7, r7\n\t"
  98741. #elif defined(__clang__)
  98742. "adcs r7, r7\n\t"
  98743. #else
  98744. "adc r7, r7\n\t"
  98745. #endif
  98746. "str r4, [%[r]]\n\t"
  98747. "str r5, [%[r], #4]\n\t"
  98748. "str r6, [%[r], #8]\n\t"
  98749. "str r7, [%[r], #12]\n\t"
  98750. "ldr r4, [%[a], #16]\n\t"
  98751. "ldr r5, [%[a], #20]\n\t"
  98752. "ldr r6, [%[a], #24]\n\t"
  98753. "ldr r7, [%[a], #28]\n\t"
  98754. #ifdef WOLFSSL_KEIL
  98755. "adcs r4, r4, r4\n\t"
  98756. #elif defined(__clang__)
  98757. "adcs r4, r4\n\t"
  98758. #else
  98759. "adc r4, r4\n\t"
  98760. #endif
  98761. #ifdef WOLFSSL_KEIL
  98762. "adcs r5, r5, r5\n\t"
  98763. #elif defined(__clang__)
  98764. "adcs r5, r5\n\t"
  98765. #else
  98766. "adc r5, r5\n\t"
  98767. #endif
  98768. #ifdef WOLFSSL_KEIL
  98769. "adcs r6, r6, r6\n\t"
  98770. #elif defined(__clang__)
  98771. "adcs r6, r6\n\t"
  98772. #else
  98773. "adc r6, r6\n\t"
  98774. #endif
  98775. #ifdef WOLFSSL_KEIL
  98776. "adcs r7, r7, r7\n\t"
  98777. #elif defined(__clang__)
  98778. "adcs r7, r7\n\t"
  98779. #else
  98780. "adc r7, r7\n\t"
  98781. #endif
  98782. "mov r8, r4\n\t"
  98783. "mov r9, r5\n\t"
  98784. "mov r10, r6\n\t"
  98785. "mov r11, r7\n\t"
  98786. "movs r3, #0\n\t"
  98787. "movs r7, #0\n\t"
  98788. #ifdef WOLFSSL_KEIL
  98789. "adcs r3, r3, r3\n\t"
  98790. #elif defined(__clang__)
  98791. "adcs r3, r3\n\t"
  98792. #else
  98793. "adc r3, r3\n\t"
  98794. #endif
  98795. "movs r2, r3\n\t"
  98796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98797. "subs r3, r3, #1\n\t"
  98798. #else
  98799. "sub r3, r3, #1\n\t"
  98800. #endif
  98801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98802. "mvns r3, r3\n\t"
  98803. #else
  98804. "mvn r3, r3\n\t"
  98805. #endif
  98806. "ldr r4, [%[r]]\n\t"
  98807. "ldr r5, [%[r], #4]\n\t"
  98808. "ldr r6, [%[r], #8]\n\t"
  98809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98810. "subs r4, r4, r3\n\t"
  98811. #else
  98812. "sub r4, r4, r3\n\t"
  98813. #endif
  98814. #ifdef WOLFSSL_KEIL
  98815. "sbcs r5, r5, r3\n\t"
  98816. #elif defined(__clang__)
  98817. "sbcs r5, r3\n\t"
  98818. #else
  98819. "sbc r5, r3\n\t"
  98820. #endif
  98821. #ifdef WOLFSSL_KEIL
  98822. "sbcs r6, r6, r3\n\t"
  98823. #elif defined(__clang__)
  98824. "sbcs r6, r3\n\t"
  98825. #else
  98826. "sbc r6, r3\n\t"
  98827. #endif
  98828. "str r4, [%[r]]\n\t"
  98829. "str r5, [%[r], #4]\n\t"
  98830. "str r6, [%[r], #8]\n\t"
  98831. "ldr r4, [%[r], #12]\n\t"
  98832. "mov r5, r8\n\t"
  98833. "mov r6, r9\n\t"
  98834. #ifdef WOLFSSL_KEIL
  98835. "sbcs r4, r4, r7\n\t"
  98836. #elif defined(__clang__)
  98837. "sbcs r4, r7\n\t"
  98838. #else
  98839. "sbc r4, r7\n\t"
  98840. #endif
  98841. #ifdef WOLFSSL_KEIL
  98842. "sbcs r5, r5, r7\n\t"
  98843. #elif defined(__clang__)
  98844. "sbcs r5, r7\n\t"
  98845. #else
  98846. "sbc r5, r7\n\t"
  98847. #endif
  98848. #ifdef WOLFSSL_KEIL
  98849. "sbcs r6, r6, r7\n\t"
  98850. #elif defined(__clang__)
  98851. "sbcs r6, r7\n\t"
  98852. #else
  98853. "sbc r6, r7\n\t"
  98854. #endif
  98855. "str r4, [%[r], #12]\n\t"
  98856. "str r5, [%[r], #16]\n\t"
  98857. "str r6, [%[r], #20]\n\t"
  98858. "mov r4, r10\n\t"
  98859. "mov r5, r11\n\t"
  98860. #ifdef WOLFSSL_KEIL
  98861. "sbcs r4, r4, r2\n\t"
  98862. #elif defined(__clang__)
  98863. "sbcs r4, r2\n\t"
  98864. #else
  98865. "sbc r4, r2\n\t"
  98866. #endif
  98867. #ifdef WOLFSSL_KEIL
  98868. "sbcs r5, r5, r3\n\t"
  98869. #elif defined(__clang__)
  98870. "sbcs r5, r3\n\t"
  98871. #else
  98872. "sbc r5, r3\n\t"
  98873. #endif
  98874. "str r4, [%[r], #24]\n\t"
  98875. "str r5, [%[r], #28]\n\t"
  98876. : [r] "+l" (r), [a] "+l" (a)
  98877. :
  98878. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  98879. );
  98880. }
  98881. /* Triple a Montgomery form number (r = a + a + a % m).
  98882. *
  98883. * r Result of Tripling.
  98884. * a Number to triple in Montgomery form.
  98885. * m Modulus (prime).
  98886. */
  98887. SP_NOINLINE static void sp_256_mont_tpl_8(sp_digit* r, const sp_digit* a,
  98888. const sp_digit* m)
  98889. {
  98890. (void)m;
  98891. __asm__ __volatile__ (
  98892. "ldr r6, [%[a]]\n\t"
  98893. "ldr r7, [%[a], #4]\n\t"
  98894. "ldr r4, [%[a], #8]\n\t"
  98895. "ldr r5, [%[a], #12]\n\t"
  98896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98897. "adds r6, r6, r6\n\t"
  98898. #else
  98899. "add r6, r6, r6\n\t"
  98900. #endif
  98901. #ifdef WOLFSSL_KEIL
  98902. "adcs r7, r7, r7\n\t"
  98903. #elif defined(__clang__)
  98904. "adcs r7, r7\n\t"
  98905. #else
  98906. "adc r7, r7\n\t"
  98907. #endif
  98908. #ifdef WOLFSSL_KEIL
  98909. "adcs r4, r4, r4\n\t"
  98910. #elif defined(__clang__)
  98911. "adcs r4, r4\n\t"
  98912. #else
  98913. "adc r4, r4\n\t"
  98914. #endif
  98915. #ifdef WOLFSSL_KEIL
  98916. "adcs r5, r5, r5\n\t"
  98917. #elif defined(__clang__)
  98918. "adcs r5, r5\n\t"
  98919. #else
  98920. "adc r5, r5\n\t"
  98921. #endif
  98922. "mov r8, r4\n\t"
  98923. "mov r9, r5\n\t"
  98924. "ldr r2, [%[a], #16]\n\t"
  98925. "ldr r3, [%[a], #20]\n\t"
  98926. "ldr r4, [%[a], #24]\n\t"
  98927. "ldr r5, [%[a], #28]\n\t"
  98928. #ifdef WOLFSSL_KEIL
  98929. "adcs r2, r2, r2\n\t"
  98930. #elif defined(__clang__)
  98931. "adcs r2, r2\n\t"
  98932. #else
  98933. "adc r2, r2\n\t"
  98934. #endif
  98935. #ifdef WOLFSSL_KEIL
  98936. "adcs r3, r3, r3\n\t"
  98937. #elif defined(__clang__)
  98938. "adcs r3, r3\n\t"
  98939. #else
  98940. "adc r3, r3\n\t"
  98941. #endif
  98942. #ifdef WOLFSSL_KEIL
  98943. "adcs r4, r4, r4\n\t"
  98944. #elif defined(__clang__)
  98945. "adcs r4, r4\n\t"
  98946. #else
  98947. "adc r4, r4\n\t"
  98948. #endif
  98949. #ifdef WOLFSSL_KEIL
  98950. "adcs r5, r5, r5\n\t"
  98951. #elif defined(__clang__)
  98952. "adcs r5, r5\n\t"
  98953. #else
  98954. "adc r5, r5\n\t"
  98955. #endif
  98956. "mov r10, r2\n\t"
  98957. "mov r11, r3\n\t"
  98958. "mov r12, r4\n\t"
  98959. "mov lr, r5\n\t"
  98960. "movs r3, #0\n\t"
  98961. "movs r5, #0\n\t"
  98962. #ifdef WOLFSSL_KEIL
  98963. "adcs r3, r3, r3\n\t"
  98964. #elif defined(__clang__)
  98965. "adcs r3, r3\n\t"
  98966. #else
  98967. "adc r3, r3\n\t"
  98968. #endif
  98969. "movs r4, r3\n\t"
  98970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98971. "subs r3, r3, #1\n\t"
  98972. #else
  98973. "sub r3, r3, #1\n\t"
  98974. #endif
  98975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98976. "mvns r3, r3\n\t"
  98977. #else
  98978. "mvn r3, r3\n\t"
  98979. #endif
  98980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  98981. "subs r6, r6, r3\n\t"
  98982. #else
  98983. "sub r6, r6, r3\n\t"
  98984. #endif
  98985. #ifdef WOLFSSL_KEIL
  98986. "sbcs r7, r7, r3\n\t"
  98987. #elif defined(__clang__)
  98988. "sbcs r7, r3\n\t"
  98989. #else
  98990. "sbc r7, r3\n\t"
  98991. #endif
  98992. "mov r2, r8\n\t"
  98993. #ifdef WOLFSSL_KEIL
  98994. "sbcs r2, r2, r3\n\t"
  98995. #elif defined(__clang__)
  98996. "sbcs r2, r3\n\t"
  98997. #else
  98998. "sbc r2, r3\n\t"
  98999. #endif
  99000. "mov r8, r2\n\t"
  99001. "mov r2, r9\n\t"
  99002. #ifdef WOLFSSL_KEIL
  99003. "sbcs r2, r2, r5\n\t"
  99004. #elif defined(__clang__)
  99005. "sbcs r2, r5\n\t"
  99006. #else
  99007. "sbc r2, r5\n\t"
  99008. #endif
  99009. "mov r9, r2\n\t"
  99010. "mov r2, r10\n\t"
  99011. #ifdef WOLFSSL_KEIL
  99012. "sbcs r2, r2, r5\n\t"
  99013. #elif defined(__clang__)
  99014. "sbcs r2, r5\n\t"
  99015. #else
  99016. "sbc r2, r5\n\t"
  99017. #endif
  99018. "mov r10, r2\n\t"
  99019. "mov r2, r11\n\t"
  99020. #ifdef WOLFSSL_KEIL
  99021. "sbcs r2, r2, r5\n\t"
  99022. #elif defined(__clang__)
  99023. "sbcs r2, r5\n\t"
  99024. #else
  99025. "sbc r2, r5\n\t"
  99026. #endif
  99027. "mov r11, r2\n\t"
  99028. "mov r2, r12\n\t"
  99029. #ifdef WOLFSSL_KEIL
  99030. "sbcs r2, r2, r4\n\t"
  99031. #elif defined(__clang__)
  99032. "sbcs r2, r4\n\t"
  99033. #else
  99034. "sbc r2, r4\n\t"
  99035. #endif
  99036. "mov r12, r2\n\t"
  99037. "mov r2, lr\n\t"
  99038. #ifdef WOLFSSL_KEIL
  99039. "sbcs r2, r2, r3\n\t"
  99040. #elif defined(__clang__)
  99041. "sbcs r2, r3\n\t"
  99042. #else
  99043. "sbc r2, r3\n\t"
  99044. #endif
  99045. "mov lr, r2\n\t"
  99046. "ldr r2, [%[a]]\n\t"
  99047. "ldr r3, [%[a], #4]\n\t"
  99048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99049. "adds r6, r6, r2\n\t"
  99050. #else
  99051. "add r6, r6, r2\n\t"
  99052. #endif
  99053. #ifdef WOLFSSL_KEIL
  99054. "adcs r7, r7, r3\n\t"
  99055. #elif defined(__clang__)
  99056. "adcs r7, r3\n\t"
  99057. #else
  99058. "adc r7, r3\n\t"
  99059. #endif
  99060. "ldr r2, [%[a], #8]\n\t"
  99061. "ldr r3, [%[a], #12]\n\t"
  99062. "mov r4, r8\n\t"
  99063. "mov r5, r9\n\t"
  99064. #ifdef WOLFSSL_KEIL
  99065. "adcs r2, r2, r4\n\t"
  99066. #elif defined(__clang__)
  99067. "adcs r2, r4\n\t"
  99068. #else
  99069. "adc r2, r4\n\t"
  99070. #endif
  99071. #ifdef WOLFSSL_KEIL
  99072. "adcs r3, r3, r5\n\t"
  99073. #elif defined(__clang__)
  99074. "adcs r3, r5\n\t"
  99075. #else
  99076. "adc r3, r5\n\t"
  99077. #endif
  99078. "mov r8, r2\n\t"
  99079. "mov r9, r3\n\t"
  99080. "ldr r2, [%[a], #16]\n\t"
  99081. "ldr r3, [%[a], #20]\n\t"
  99082. "mov r4, r10\n\t"
  99083. "mov r5, r11\n\t"
  99084. #ifdef WOLFSSL_KEIL
  99085. "adcs r2, r2, r4\n\t"
  99086. #elif defined(__clang__)
  99087. "adcs r2, r4\n\t"
  99088. #else
  99089. "adc r2, r4\n\t"
  99090. #endif
  99091. #ifdef WOLFSSL_KEIL
  99092. "adcs r3, r3, r5\n\t"
  99093. #elif defined(__clang__)
  99094. "adcs r3, r5\n\t"
  99095. #else
  99096. "adc r3, r5\n\t"
  99097. #endif
  99098. "mov r10, r2\n\t"
  99099. "mov r11, r3\n\t"
  99100. "ldr r2, [%[a], #24]\n\t"
  99101. "ldr r3, [%[a], #28]\n\t"
  99102. "mov r4, r12\n\t"
  99103. "mov r5, lr\n\t"
  99104. #ifdef WOLFSSL_KEIL
  99105. "adcs r2, r2, r4\n\t"
  99106. #elif defined(__clang__)
  99107. "adcs r2, r4\n\t"
  99108. #else
  99109. "adc r2, r4\n\t"
  99110. #endif
  99111. #ifdef WOLFSSL_KEIL
  99112. "adcs r3, r3, r5\n\t"
  99113. #elif defined(__clang__)
  99114. "adcs r3, r5\n\t"
  99115. #else
  99116. "adc r3, r5\n\t"
  99117. #endif
  99118. "mov r12, r2\n\t"
  99119. "mov lr, r3\n\t"
  99120. "movs r3, #0\n\t"
  99121. "movs r5, #0\n\t"
  99122. #ifdef WOLFSSL_KEIL
  99123. "adcs r3, r3, r3\n\t"
  99124. #elif defined(__clang__)
  99125. "adcs r3, r3\n\t"
  99126. #else
  99127. "adc r3, r3\n\t"
  99128. #endif
  99129. "movs r4, r3\n\t"
  99130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99131. "subs r3, r3, #1\n\t"
  99132. #else
  99133. "sub r3, r3, #1\n\t"
  99134. #endif
  99135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99136. "mvns r3, r3\n\t"
  99137. #else
  99138. "mvn r3, r3\n\t"
  99139. #endif
  99140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99141. "subs r6, r6, r3\n\t"
  99142. #else
  99143. "sub r6, r6, r3\n\t"
  99144. #endif
  99145. "str r6, [%[r]]\n\t"
  99146. #ifdef WOLFSSL_KEIL
  99147. "sbcs r7, r7, r3\n\t"
  99148. #elif defined(__clang__)
  99149. "sbcs r7, r3\n\t"
  99150. #else
  99151. "sbc r7, r3\n\t"
  99152. #endif
  99153. "str r7, [%[r], #4]\n\t"
  99154. "mov r2, r8\n\t"
  99155. #ifdef WOLFSSL_KEIL
  99156. "sbcs r2, r2, r3\n\t"
  99157. #elif defined(__clang__)
  99158. "sbcs r2, r3\n\t"
  99159. #else
  99160. "sbc r2, r3\n\t"
  99161. #endif
  99162. "str r2, [%[r], #8]\n\t"
  99163. "mov r2, r9\n\t"
  99164. #ifdef WOLFSSL_KEIL
  99165. "sbcs r2, r2, r5\n\t"
  99166. #elif defined(__clang__)
  99167. "sbcs r2, r5\n\t"
  99168. #else
  99169. "sbc r2, r5\n\t"
  99170. #endif
  99171. "str r2, [%[r], #12]\n\t"
  99172. "mov r2, r10\n\t"
  99173. #ifdef WOLFSSL_KEIL
  99174. "sbcs r2, r2, r5\n\t"
  99175. #elif defined(__clang__)
  99176. "sbcs r2, r5\n\t"
  99177. #else
  99178. "sbc r2, r5\n\t"
  99179. #endif
  99180. "str r2, [%[r], #16]\n\t"
  99181. "mov r2, r11\n\t"
  99182. #ifdef WOLFSSL_KEIL
  99183. "sbcs r2, r2, r5\n\t"
  99184. #elif defined(__clang__)
  99185. "sbcs r2, r5\n\t"
  99186. #else
  99187. "sbc r2, r5\n\t"
  99188. #endif
  99189. "str r2, [%[r], #20]\n\t"
  99190. "mov r2, r12\n\t"
  99191. #ifdef WOLFSSL_KEIL
  99192. "sbcs r2, r2, r4\n\t"
  99193. #elif defined(__clang__)
  99194. "sbcs r2, r4\n\t"
  99195. #else
  99196. "sbc r2, r4\n\t"
  99197. #endif
  99198. "str r2, [%[r], #24]\n\t"
  99199. "mov r2, lr\n\t"
  99200. #ifdef WOLFSSL_KEIL
  99201. "sbcs r2, r2, r3\n\t"
  99202. #elif defined(__clang__)
  99203. "sbcs r2, r3\n\t"
  99204. #else
  99205. "sbc r2, r3\n\t"
  99206. #endif
  99207. "str r2, [%[r], #28]\n\t"
  99208. : [r] "+l" (r), [a] "+l" (a)
  99209. :
  99210. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  99211. );
  99212. }
  99213. /* Subtract two Montgomery form numbers (r = a - b % m).
  99214. *
  99215. * r Result of subtration.
  99216. * a Number to subtract from in Montgomery form.
  99217. * b Number to subtract with in Montgomery form.
  99218. * m Modulus (prime).
  99219. */
  99220. SP_NOINLINE static void sp_256_mont_sub_8(sp_digit* r, const sp_digit* a,
  99221. const sp_digit* b, const sp_digit* m)
  99222. {
  99223. (void)m;
  99224. __asm__ __volatile__ (
  99225. "ldr r4, [%[a]]\n\t"
  99226. "ldr r5, [%[a], #4]\n\t"
  99227. "ldr r6, [%[b]]\n\t"
  99228. "ldr r7, [%[b], #4]\n\t"
  99229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99230. "subs r4, r4, r6\n\t"
  99231. #else
  99232. "sub r4, r4, r6\n\t"
  99233. #endif
  99234. #ifdef WOLFSSL_KEIL
  99235. "sbcs r5, r5, r7\n\t"
  99236. #elif defined(__clang__)
  99237. "sbcs r5, r7\n\t"
  99238. #else
  99239. "sbc r5, r7\n\t"
  99240. #endif
  99241. "str r4, [%[r]]\n\t"
  99242. "str r5, [%[r], #4]\n\t"
  99243. "ldr r4, [%[a], #8]\n\t"
  99244. "ldr r5, [%[a], #12]\n\t"
  99245. "ldr r6, [%[b], #8]\n\t"
  99246. "ldr r7, [%[b], #12]\n\t"
  99247. #ifdef WOLFSSL_KEIL
  99248. "sbcs r4, r4, r6\n\t"
  99249. #elif defined(__clang__)
  99250. "sbcs r4, r6\n\t"
  99251. #else
  99252. "sbc r4, r6\n\t"
  99253. #endif
  99254. #ifdef WOLFSSL_KEIL
  99255. "sbcs r5, r5, r7\n\t"
  99256. #elif defined(__clang__)
  99257. "sbcs r5, r7\n\t"
  99258. #else
  99259. "sbc r5, r7\n\t"
  99260. #endif
  99261. "str r4, [%[r], #8]\n\t"
  99262. "str r5, [%[r], #12]\n\t"
  99263. "ldr r4, [%[a], #16]\n\t"
  99264. "ldr r5, [%[a], #20]\n\t"
  99265. "ldr r6, [%[b], #16]\n\t"
  99266. "ldr r7, [%[b], #20]\n\t"
  99267. #ifdef WOLFSSL_KEIL
  99268. "sbcs r4, r4, r6\n\t"
  99269. #elif defined(__clang__)
  99270. "sbcs r4, r6\n\t"
  99271. #else
  99272. "sbc r4, r6\n\t"
  99273. #endif
  99274. #ifdef WOLFSSL_KEIL
  99275. "sbcs r5, r5, r7\n\t"
  99276. #elif defined(__clang__)
  99277. "sbcs r5, r7\n\t"
  99278. #else
  99279. "sbc r5, r7\n\t"
  99280. #endif
  99281. "mov r8, r4\n\t"
  99282. "mov r9, r5\n\t"
  99283. "ldr r4, [%[a], #24]\n\t"
  99284. "ldr r5, [%[a], #28]\n\t"
  99285. "ldr r6, [%[b], #24]\n\t"
  99286. "ldr r7, [%[b], #28]\n\t"
  99287. #ifdef WOLFSSL_KEIL
  99288. "sbcs r4, r4, r6\n\t"
  99289. #elif defined(__clang__)
  99290. "sbcs r4, r6\n\t"
  99291. #else
  99292. "sbc r4, r6\n\t"
  99293. #endif
  99294. #ifdef WOLFSSL_KEIL
  99295. "sbcs r5, r5, r7\n\t"
  99296. #elif defined(__clang__)
  99297. "sbcs r5, r7\n\t"
  99298. #else
  99299. "sbc r5, r7\n\t"
  99300. #endif
  99301. "mov r10, r4\n\t"
  99302. "mov r11, r5\n\t"
  99303. #ifdef WOLFSSL_KEIL
  99304. "sbcs r3, r3, r3\n\t"
  99305. #elif defined(__clang__)
  99306. "sbcs r3, r3\n\t"
  99307. #else
  99308. "sbc r3, r3\n\t"
  99309. #endif
  99310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99311. "lsrs r7, r3, #31\n\t"
  99312. #else
  99313. "lsr r7, r3, #31\n\t"
  99314. #endif
  99315. "movs r6, #0\n\t"
  99316. "ldr r4, [%[r]]\n\t"
  99317. "ldr r5, [%[r], #4]\n\t"
  99318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99319. "adds r4, r4, r3\n\t"
  99320. #else
  99321. "add r4, r4, r3\n\t"
  99322. #endif
  99323. #ifdef WOLFSSL_KEIL
  99324. "adcs r5, r5, r3\n\t"
  99325. #elif defined(__clang__)
  99326. "adcs r5, r3\n\t"
  99327. #else
  99328. "adc r5, r3\n\t"
  99329. #endif
  99330. "str r4, [%[r]]\n\t"
  99331. "str r5, [%[r], #4]\n\t"
  99332. "ldr r4, [%[r], #8]\n\t"
  99333. "ldr r5, [%[r], #12]\n\t"
  99334. #ifdef WOLFSSL_KEIL
  99335. "adcs r4, r4, r3\n\t"
  99336. #elif defined(__clang__)
  99337. "adcs r4, r3\n\t"
  99338. #else
  99339. "adc r4, r3\n\t"
  99340. #endif
  99341. #ifdef WOLFSSL_KEIL
  99342. "adcs r5, r5, r6\n\t"
  99343. #elif defined(__clang__)
  99344. "adcs r5, r6\n\t"
  99345. #else
  99346. "adc r5, r6\n\t"
  99347. #endif
  99348. "str r4, [%[r], #8]\n\t"
  99349. "str r5, [%[r], #12]\n\t"
  99350. "mov r4, r8\n\t"
  99351. "mov r5, r9\n\t"
  99352. #ifdef WOLFSSL_KEIL
  99353. "adcs r4, r4, r6\n\t"
  99354. #elif defined(__clang__)
  99355. "adcs r4, r6\n\t"
  99356. #else
  99357. "adc r4, r6\n\t"
  99358. #endif
  99359. #ifdef WOLFSSL_KEIL
  99360. "adcs r5, r5, r6\n\t"
  99361. #elif defined(__clang__)
  99362. "adcs r5, r6\n\t"
  99363. #else
  99364. "adc r5, r6\n\t"
  99365. #endif
  99366. "str r4, [%[r], #16]\n\t"
  99367. "str r5, [%[r], #20]\n\t"
  99368. "mov r4, r10\n\t"
  99369. "mov r5, r11\n\t"
  99370. #ifdef WOLFSSL_KEIL
  99371. "adcs r4, r4, r7\n\t"
  99372. #elif defined(__clang__)
  99373. "adcs r4, r7\n\t"
  99374. #else
  99375. "adc r4, r7\n\t"
  99376. #endif
  99377. #ifdef WOLFSSL_KEIL
  99378. "adcs r5, r5, r3\n\t"
  99379. #elif defined(__clang__)
  99380. "adcs r5, r3\n\t"
  99381. #else
  99382. "adc r5, r3\n\t"
  99383. #endif
  99384. "str r4, [%[r], #24]\n\t"
  99385. "str r5, [%[r], #28]\n\t"
  99386. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  99387. :
  99388. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11"
  99389. );
  99390. }
  99391. #define sp_256_mont_sub_lower_8 sp_256_mont_sub_8
  99392. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  99393. *
  99394. * r Result of division by 2.
  99395. * a Number to divide.
  99396. * m Modulus (prime).
  99397. */
  99398. SP_NOINLINE static void sp_256_div2_8(sp_digit* r, const sp_digit* a,
  99399. const sp_digit* m)
  99400. {
  99401. (void)m;
  99402. __asm__ __volatile__ (
  99403. "ldr r6, [%[a]]\n\t"
  99404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99405. "lsls r6, r6, #31\n\t"
  99406. #else
  99407. "lsl r6, r6, #31\n\t"
  99408. #endif
  99409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99410. "lsrs r6, r6, #31\n\t"
  99411. #else
  99412. "lsr r6, r6, #31\n\t"
  99413. #endif
  99414. "movs r4, #0\n\t"
  99415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99416. "subs r4, r4, r6\n\t"
  99417. #else
  99418. "sub r4, r4, r6\n\t"
  99419. #endif
  99420. "movs r6, #0\n\t"
  99421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99422. "lsls r5, r4, #31\n\t"
  99423. #else
  99424. "lsl r5, r4, #31\n\t"
  99425. #endif
  99426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99427. "lsrs r5, r5, #31\n\t"
  99428. #else
  99429. "lsr r5, r5, #31\n\t"
  99430. #endif
  99431. "ldr r2, [%[a]]\n\t"
  99432. "ldr r3, [%[a], #4]\n\t"
  99433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99434. "adds r2, r2, r4\n\t"
  99435. #else
  99436. "add r2, r2, r4\n\t"
  99437. #endif
  99438. #ifdef WOLFSSL_KEIL
  99439. "adcs r3, r3, r4\n\t"
  99440. #elif defined(__clang__)
  99441. "adcs r3, r4\n\t"
  99442. #else
  99443. "adc r3, r4\n\t"
  99444. #endif
  99445. "str r2, [%[r]]\n\t"
  99446. "str r3, [%[r], #4]\n\t"
  99447. "ldr r2, [%[a], #8]\n\t"
  99448. "ldr r3, [%[a], #12]\n\t"
  99449. #ifdef WOLFSSL_KEIL
  99450. "adcs r2, r2, r4\n\t"
  99451. #elif defined(__clang__)
  99452. "adcs r2, r4\n\t"
  99453. #else
  99454. "adc r2, r4\n\t"
  99455. #endif
  99456. #ifdef WOLFSSL_KEIL
  99457. "adcs r3, r3, r6\n\t"
  99458. #elif defined(__clang__)
  99459. "adcs r3, r6\n\t"
  99460. #else
  99461. "adc r3, r6\n\t"
  99462. #endif
  99463. "str r2, [%[r], #8]\n\t"
  99464. "str r3, [%[r], #12]\n\t"
  99465. "ldr r2, [%[a], #16]\n\t"
  99466. "ldr r3, [%[a], #20]\n\t"
  99467. #ifdef WOLFSSL_KEIL
  99468. "adcs r2, r2, r6\n\t"
  99469. #elif defined(__clang__)
  99470. "adcs r2, r6\n\t"
  99471. #else
  99472. "adc r2, r6\n\t"
  99473. #endif
  99474. #ifdef WOLFSSL_KEIL
  99475. "adcs r3, r3, r6\n\t"
  99476. #elif defined(__clang__)
  99477. "adcs r3, r6\n\t"
  99478. #else
  99479. "adc r3, r6\n\t"
  99480. #endif
  99481. "str r2, [%[r], #16]\n\t"
  99482. "str r3, [%[r], #20]\n\t"
  99483. "ldr r2, [%[a], #24]\n\t"
  99484. "ldr r3, [%[a], #28]\n\t"
  99485. #ifdef WOLFSSL_KEIL
  99486. "adcs r2, r2, r5\n\t"
  99487. #elif defined(__clang__)
  99488. "adcs r2, r5\n\t"
  99489. #else
  99490. "adc r2, r5\n\t"
  99491. #endif
  99492. #ifdef WOLFSSL_KEIL
  99493. "adcs r3, r3, r4\n\t"
  99494. #elif defined(__clang__)
  99495. "adcs r3, r4\n\t"
  99496. #else
  99497. "adc r3, r4\n\t"
  99498. #endif
  99499. #ifdef WOLFSSL_KEIL
  99500. "adcs r6, r6, r6\n\t"
  99501. #elif defined(__clang__)
  99502. "adcs r6, r6\n\t"
  99503. #else
  99504. "adc r6, r6\n\t"
  99505. #endif
  99506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99507. "lsls r6, r6, #31\n\t"
  99508. #else
  99509. "lsl r6, r6, #31\n\t"
  99510. #endif
  99511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99512. "lsrs r4, r2, #1\n\t"
  99513. #else
  99514. "lsr r4, r2, #1\n\t"
  99515. #endif
  99516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99517. "lsls r2, r2, #31\n\t"
  99518. #else
  99519. "lsl r2, r2, #31\n\t"
  99520. #endif
  99521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99522. "lsrs r5, r3, #1\n\t"
  99523. #else
  99524. "lsr r5, r3, #1\n\t"
  99525. #endif
  99526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99527. "lsls r3, r3, #31\n\t"
  99528. #else
  99529. "lsl r3, r3, #31\n\t"
  99530. #endif
  99531. #ifdef WOLFSSL_KEIL
  99532. "orrs r4, r4, r3\n\t"
  99533. #elif defined(__clang__)
  99534. "orrs r4, r3\n\t"
  99535. #else
  99536. "orr r4, r3\n\t"
  99537. #endif
  99538. #ifdef WOLFSSL_KEIL
  99539. "orrs r5, r5, r6\n\t"
  99540. #elif defined(__clang__)
  99541. "orrs r5, r6\n\t"
  99542. #else
  99543. "orr r5, r6\n\t"
  99544. #endif
  99545. "movs r6, r2\n\t"
  99546. "str r4, [%[r], #24]\n\t"
  99547. "str r5, [%[r], #28]\n\t"
  99548. "ldr r2, [%[r], #16]\n\t"
  99549. "ldr r3, [%[r], #20]\n\t"
  99550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99551. "lsrs r4, r2, #1\n\t"
  99552. #else
  99553. "lsr r4, r2, #1\n\t"
  99554. #endif
  99555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99556. "lsls r2, r2, #31\n\t"
  99557. #else
  99558. "lsl r2, r2, #31\n\t"
  99559. #endif
  99560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99561. "lsrs r5, r3, #1\n\t"
  99562. #else
  99563. "lsr r5, r3, #1\n\t"
  99564. #endif
  99565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99566. "lsls r3, r3, #31\n\t"
  99567. #else
  99568. "lsl r3, r3, #31\n\t"
  99569. #endif
  99570. #ifdef WOLFSSL_KEIL
  99571. "orrs r4, r4, r3\n\t"
  99572. #elif defined(__clang__)
  99573. "orrs r4, r3\n\t"
  99574. #else
  99575. "orr r4, r3\n\t"
  99576. #endif
  99577. #ifdef WOLFSSL_KEIL
  99578. "orrs r5, r5, r6\n\t"
  99579. #elif defined(__clang__)
  99580. "orrs r5, r6\n\t"
  99581. #else
  99582. "orr r5, r6\n\t"
  99583. #endif
  99584. "movs r6, r2\n\t"
  99585. "str r4, [%[r], #16]\n\t"
  99586. "str r5, [%[r], #20]\n\t"
  99587. "ldr r2, [%[r], #8]\n\t"
  99588. "ldr r3, [%[r], #12]\n\t"
  99589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99590. "lsrs r4, r2, #1\n\t"
  99591. #else
  99592. "lsr r4, r2, #1\n\t"
  99593. #endif
  99594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99595. "lsls r2, r2, #31\n\t"
  99596. #else
  99597. "lsl r2, r2, #31\n\t"
  99598. #endif
  99599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99600. "lsrs r5, r3, #1\n\t"
  99601. #else
  99602. "lsr r5, r3, #1\n\t"
  99603. #endif
  99604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99605. "lsls r3, r3, #31\n\t"
  99606. #else
  99607. "lsl r3, r3, #31\n\t"
  99608. #endif
  99609. #ifdef WOLFSSL_KEIL
  99610. "orrs r4, r4, r3\n\t"
  99611. #elif defined(__clang__)
  99612. "orrs r4, r3\n\t"
  99613. #else
  99614. "orr r4, r3\n\t"
  99615. #endif
  99616. #ifdef WOLFSSL_KEIL
  99617. "orrs r5, r5, r6\n\t"
  99618. #elif defined(__clang__)
  99619. "orrs r5, r6\n\t"
  99620. #else
  99621. "orr r5, r6\n\t"
  99622. #endif
  99623. "movs r6, r2\n\t"
  99624. "str r4, [%[r], #8]\n\t"
  99625. "str r5, [%[r], #12]\n\t"
  99626. "ldr r2, [%[r]]\n\t"
  99627. "ldr r3, [%[r], #4]\n\t"
  99628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99629. "lsrs r4, r2, #1\n\t"
  99630. #else
  99631. "lsr r4, r2, #1\n\t"
  99632. #endif
  99633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99634. "lsrs r5, r3, #1\n\t"
  99635. #else
  99636. "lsr r5, r3, #1\n\t"
  99637. #endif
  99638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  99639. "lsls r3, r3, #31\n\t"
  99640. #else
  99641. "lsl r3, r3, #31\n\t"
  99642. #endif
  99643. #ifdef WOLFSSL_KEIL
  99644. "orrs r4, r4, r3\n\t"
  99645. #elif defined(__clang__)
  99646. "orrs r4, r3\n\t"
  99647. #else
  99648. "orr r4, r3\n\t"
  99649. #endif
  99650. #ifdef WOLFSSL_KEIL
  99651. "orrs r5, r5, r6\n\t"
  99652. #elif defined(__clang__)
  99653. "orrs r5, r6\n\t"
  99654. #else
  99655. "orr r5, r6\n\t"
  99656. #endif
  99657. "str r4, [%[r]]\n\t"
  99658. "str r5, [%[r], #4]\n\t"
  99659. : [r] "+l" (r), [a] "+l" (a)
  99660. :
  99661. : "memory", "r2", "r3", "r4", "r5", "r6"
  99662. );
  99663. }
  99664. /* Double the Montgomery form projective point p.
  99665. *
  99666. * r Result of doubling point.
  99667. * p Point to double.
  99668. * t Temporary ordinate data.
  99669. */
  99670. #ifdef WOLFSSL_SP_NONBLOCK
  99671. typedef struct sp_256_proj_point_dbl_8_ctx {
  99672. int state;
  99673. sp_digit* t1;
  99674. sp_digit* t2;
  99675. sp_digit* x;
  99676. sp_digit* y;
  99677. sp_digit* z;
  99678. } sp_256_proj_point_dbl_8_ctx;
  99679. 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)
  99680. {
  99681. int err = FP_WOULDBLOCK;
  99682. sp_256_proj_point_dbl_8_ctx* ctx = (sp_256_proj_point_dbl_8_ctx*)sp_ctx->data;
  99683. typedef char ctx_size_test[sizeof(sp_256_proj_point_dbl_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  99684. (void)sizeof(ctx_size_test);
  99685. switch (ctx->state) {
  99686. case 0:
  99687. ctx->t1 = t;
  99688. ctx->t2 = t + 2*8;
  99689. ctx->x = r->x;
  99690. ctx->y = r->y;
  99691. ctx->z = r->z;
  99692. /* Put infinity into result. */
  99693. if (r != p) {
  99694. r->infinity = p->infinity;
  99695. }
  99696. ctx->state = 1;
  99697. break;
  99698. case 1:
  99699. /* T1 = Z * Z */
  99700. sp_256_mont_sqr_8(ctx->t1, p->z, p256_mod, p256_mp_mod);
  99701. ctx->state = 2;
  99702. break;
  99703. case 2:
  99704. /* Z = Y * Z */
  99705. sp_256_mont_mul_8(ctx->z, p->y, p->z, p256_mod, p256_mp_mod);
  99706. ctx->state = 3;
  99707. break;
  99708. case 3:
  99709. /* Z = 2Z */
  99710. sp_256_mont_dbl_8(ctx->z, ctx->z, p256_mod);
  99711. ctx->state = 4;
  99712. break;
  99713. case 4:
  99714. /* T2 = X - T1 */
  99715. sp_256_mont_sub_8(ctx->t2, p->x, ctx->t1, p256_mod);
  99716. ctx->state = 5;
  99717. break;
  99718. case 5:
  99719. /* T1 = X + T1 */
  99720. sp_256_mont_add_8(ctx->t1, p->x, ctx->t1, p256_mod);
  99721. ctx->state = 6;
  99722. break;
  99723. case 6:
  99724. /* T2 = T1 * T2 */
  99725. sp_256_mont_mul_8(ctx->t2, ctx->t1, ctx->t2, p256_mod, p256_mp_mod);
  99726. ctx->state = 7;
  99727. break;
  99728. case 7:
  99729. /* T1 = 3T2 */
  99730. sp_256_mont_tpl_8(ctx->t1, ctx->t2, p256_mod);
  99731. ctx->state = 8;
  99732. break;
  99733. case 8:
  99734. /* Y = 2Y */
  99735. sp_256_mont_dbl_8(ctx->y, p->y, p256_mod);
  99736. ctx->state = 9;
  99737. break;
  99738. case 9:
  99739. /* Y = Y * Y */
  99740. sp_256_mont_sqr_8(ctx->y, ctx->y, p256_mod, p256_mp_mod);
  99741. ctx->state = 10;
  99742. break;
  99743. case 10:
  99744. /* T2 = Y * Y */
  99745. sp_256_mont_sqr_8(ctx->t2, ctx->y, p256_mod, p256_mp_mod);
  99746. ctx->state = 11;
  99747. break;
  99748. case 11:
  99749. /* T2 = T2/2 */
  99750. sp_256_div2_8(ctx->t2, ctx->t2, p256_mod);
  99751. ctx->state = 12;
  99752. break;
  99753. case 12:
  99754. /* Y = Y * X */
  99755. sp_256_mont_mul_8(ctx->y, ctx->y, p->x, p256_mod, p256_mp_mod);
  99756. ctx->state = 13;
  99757. break;
  99758. case 13:
  99759. /* X = T1 * T1 */
  99760. sp_256_mont_sqr_8(ctx->x, ctx->t1, p256_mod, p256_mp_mod);
  99761. ctx->state = 14;
  99762. break;
  99763. case 14:
  99764. /* X = X - Y */
  99765. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  99766. ctx->state = 15;
  99767. break;
  99768. case 15:
  99769. /* X = X - Y */
  99770. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->y, p256_mod);
  99771. ctx->state = 16;
  99772. break;
  99773. case 16:
  99774. /* Y = Y - X */
  99775. sp_256_mont_sub_lower_8(ctx->y, ctx->y, ctx->x, p256_mod);
  99776. ctx->state = 17;
  99777. break;
  99778. case 17:
  99779. /* Y = Y * T1 */
  99780. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t1, p256_mod, p256_mp_mod);
  99781. ctx->state = 18;
  99782. break;
  99783. case 18:
  99784. /* Y = Y - T2 */
  99785. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t2, p256_mod);
  99786. ctx->state = 19;
  99787. /* fall-through */
  99788. case 19:
  99789. err = MP_OKAY;
  99790. break;
  99791. }
  99792. if (err == MP_OKAY && ctx->state != 19) {
  99793. err = FP_WOULDBLOCK;
  99794. }
  99795. return err;
  99796. }
  99797. #endif /* WOLFSSL_SP_NONBLOCK */
  99798. static void sp_256_proj_point_dbl_8(sp_point_256* r, const sp_point_256* p,
  99799. sp_digit* t)
  99800. {
  99801. sp_digit* t1 = t;
  99802. sp_digit* t2 = t + 2*8;
  99803. sp_digit* x;
  99804. sp_digit* y;
  99805. sp_digit* z;
  99806. x = r->x;
  99807. y = r->y;
  99808. z = r->z;
  99809. /* Put infinity into result. */
  99810. if (r != p) {
  99811. r->infinity = p->infinity;
  99812. }
  99813. /* T1 = Z * Z */
  99814. sp_256_mont_sqr_8(t1, p->z, p256_mod, p256_mp_mod);
  99815. /* Z = Y * Z */
  99816. sp_256_mont_mul_8(z, p->y, p->z, p256_mod, p256_mp_mod);
  99817. /* Z = 2Z */
  99818. sp_256_mont_dbl_8(z, z, p256_mod);
  99819. /* T2 = X - T1 */
  99820. sp_256_mont_sub_8(t2, p->x, t1, p256_mod);
  99821. /* T1 = X + T1 */
  99822. sp_256_mont_add_8(t1, p->x, t1, p256_mod);
  99823. /* T2 = T1 * T2 */
  99824. sp_256_mont_mul_8(t2, t1, t2, p256_mod, p256_mp_mod);
  99825. /* T1 = 3T2 */
  99826. sp_256_mont_tpl_8(t1, t2, p256_mod);
  99827. /* Y = 2Y */
  99828. sp_256_mont_dbl_8(y, p->y, p256_mod);
  99829. /* Y = Y * Y */
  99830. sp_256_mont_sqr_8(y, y, p256_mod, p256_mp_mod);
  99831. /* T2 = Y * Y */
  99832. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  99833. /* T2 = T2/2 */
  99834. sp_256_div2_8(t2, t2, p256_mod);
  99835. /* Y = Y * X */
  99836. sp_256_mont_mul_8(y, y, p->x, p256_mod, p256_mp_mod);
  99837. /* X = T1 * T1 */
  99838. sp_256_mont_sqr_8(x, t1, p256_mod, p256_mp_mod);
  99839. /* X = X - Y */
  99840. sp_256_mont_sub_8(x, x, y, p256_mod);
  99841. /* X = X - Y */
  99842. sp_256_mont_sub_8(x, x, y, p256_mod);
  99843. /* Y = Y - X */
  99844. sp_256_mont_sub_lower_8(y, y, x, p256_mod);
  99845. /* Y = Y * T1 */
  99846. sp_256_mont_mul_8(y, y, t1, p256_mod, p256_mp_mod);
  99847. /* Y = Y - T2 */
  99848. sp_256_mont_sub_8(y, y, t2, p256_mod);
  99849. }
  99850. /* Compare two numbers to determine if they are equal.
  99851. * Constant time implementation.
  99852. *
  99853. * a First number to compare.
  99854. * b Second number to compare.
  99855. * returns 1 when equal and 0 otherwise.
  99856. */
  99857. static int sp_256_cmp_equal_8(const sp_digit* a, const sp_digit* b)
  99858. {
  99859. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  99860. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  99861. (a[6] ^ b[6]) | (a[7] ^ b[7])) == 0;
  99862. }
  99863. /* Returns 1 if the number of zero.
  99864. * Implementation is constant time.
  99865. *
  99866. * a Number to check.
  99867. * returns 1 if the number is zero and 0 otherwise.
  99868. */
  99869. static int sp_256_iszero_8(const sp_digit* a)
  99870. {
  99871. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7]) == 0;
  99872. }
  99873. /* Add two Montgomery form projective points.
  99874. *
  99875. * r Result of addition.
  99876. * p First point to add.
  99877. * q Second point to add.
  99878. * t Temporary ordinate data.
  99879. */
  99880. #ifdef WOLFSSL_SP_NONBLOCK
  99881. typedef struct sp_256_proj_point_add_8_ctx {
  99882. int state;
  99883. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  99884. const sp_point_256* ap[2];
  99885. sp_point_256* rp[2];
  99886. sp_digit* t1;
  99887. sp_digit* t2;
  99888. sp_digit* t3;
  99889. sp_digit* t4;
  99890. sp_digit* t5;
  99891. sp_digit* t6;
  99892. sp_digit* x;
  99893. sp_digit* y;
  99894. sp_digit* z;
  99895. } sp_256_proj_point_add_8_ctx;
  99896. static int sp_256_proj_point_add_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r,
  99897. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  99898. {
  99899. int err = FP_WOULDBLOCK;
  99900. sp_256_proj_point_add_8_ctx* ctx = (sp_256_proj_point_add_8_ctx*)sp_ctx->data;
  99901. /* Ensure only the first point is the same as the result. */
  99902. if (q == r) {
  99903. const sp_point_256* a = p;
  99904. p = q;
  99905. q = a;
  99906. }
  99907. typedef char ctx_size_test[sizeof(sp_256_proj_point_add_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  99908. (void)sizeof(ctx_size_test);
  99909. switch (ctx->state) {
  99910. case 0: /* INIT */
  99911. ctx->t1 = t;
  99912. ctx->t2 = t + 2*8;
  99913. ctx->t3 = t + 4*8;
  99914. ctx->t4 = t + 6*8;
  99915. ctx->t5 = t + 8*8;
  99916. ctx->t6 = t + 10*8;
  99917. ctx->x = ctx->t6;
  99918. ctx->y = ctx->t1;
  99919. ctx->z = ctx->t2;
  99920. ctx->state = 1;
  99921. break;
  99922. case 1:
  99923. /* Check double */
  99924. (void)sp_256_sub_8(ctx->t1, p256_mod, q->y);
  99925. sp_256_norm_8(ctx->t1);
  99926. if ((~p->infinity & ~q->infinity &
  99927. sp_256_cmp_equal_8(p->x, q->x) & sp_256_cmp_equal_8(p->z, q->z) &
  99928. (sp_256_cmp_equal_8(p->y, q->y) | sp_256_cmp_equal_8(p->y, ctx->t1))) != 0)
  99929. {
  99930. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  99931. ctx->state = 2;
  99932. }
  99933. else {
  99934. ctx->state = 3;
  99935. }
  99936. break;
  99937. case 2:
  99938. err = sp_256_proj_point_dbl_8_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  99939. if (err == MP_OKAY)
  99940. ctx->state = 27; /* done */
  99941. break;
  99942. case 3:
  99943. {
  99944. ctx->state = 4;
  99945. break;
  99946. }
  99947. case 4:
  99948. /* U1 = X1*Z2^2 */
  99949. sp_256_mont_sqr_8(ctx->t1, q->z, p256_mod, p256_mp_mod);
  99950. ctx->state = 5;
  99951. break;
  99952. case 5:
  99953. sp_256_mont_mul_8(ctx->t3, ctx->t1, q->z, p256_mod, p256_mp_mod);
  99954. ctx->state = 6;
  99955. break;
  99956. case 6:
  99957. sp_256_mont_mul_8(ctx->t1, ctx->t1, p->x, p256_mod, p256_mp_mod);
  99958. ctx->state = 7;
  99959. break;
  99960. case 7:
  99961. /* U2 = X2*Z1^2 */
  99962. sp_256_mont_sqr_8(ctx->t2, p->z, p256_mod, p256_mp_mod);
  99963. ctx->state = 8;
  99964. break;
  99965. case 8:
  99966. sp_256_mont_mul_8(ctx->t4, ctx->t2, p->z, p256_mod, p256_mp_mod);
  99967. ctx->state = 9;
  99968. break;
  99969. case 9:
  99970. sp_256_mont_mul_8(ctx->t2, ctx->t2, q->x, p256_mod, p256_mp_mod);
  99971. ctx->state = 10;
  99972. break;
  99973. case 10:
  99974. /* S1 = Y1*Z2^3 */
  99975. sp_256_mont_mul_8(ctx->t3, ctx->t3, p->y, p256_mod, p256_mp_mod);
  99976. ctx->state = 11;
  99977. break;
  99978. case 11:
  99979. /* S2 = Y2*Z1^3 */
  99980. sp_256_mont_mul_8(ctx->t4, ctx->t4, q->y, p256_mod, p256_mp_mod);
  99981. ctx->state = 12;
  99982. break;
  99983. case 12:
  99984. /* H = U2 - U1 */
  99985. sp_256_mont_sub_8(ctx->t2, ctx->t2, ctx->t1, p256_mod);
  99986. ctx->state = 13;
  99987. break;
  99988. case 13:
  99989. /* R = S2 - S1 */
  99990. sp_256_mont_sub_8(ctx->t4, ctx->t4, ctx->t3, p256_mod);
  99991. ctx->state = 14;
  99992. break;
  99993. case 14:
  99994. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  99995. sp_256_mont_sqr_8(ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  99996. ctx->state = 15;
  99997. break;
  99998. case 15:
  99999. sp_256_mont_mul_8(ctx->y, ctx->t1, ctx->t5, p256_mod, p256_mp_mod);
  100000. ctx->state = 16;
  100001. break;
  100002. case 16:
  100003. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t2, p256_mod, p256_mp_mod);
  100004. ctx->state = 17;
  100005. break;
  100006. case 17:
  100007. /* Z3 = H*Z1*Z2 */
  100008. sp_256_mont_mul_8(ctx->z, p->z, ctx->t2, p256_mod, p256_mp_mod);
  100009. ctx->state = 18;
  100010. break;
  100011. case 18:
  100012. sp_256_mont_mul_8(ctx->z, ctx->z, q->z, p256_mod, p256_mp_mod);
  100013. ctx->state = 19;
  100014. break;
  100015. case 19:
  100016. sp_256_mont_sqr_8(ctx->x, ctx->t4, p256_mod, p256_mp_mod);
  100017. ctx->state = 20;
  100018. break;
  100019. case 20:
  100020. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t5, p256_mod);
  100021. ctx->state = 21;
  100022. break;
  100023. case 21:
  100024. sp_256_mont_mul_8(ctx->t5, ctx->t5, ctx->t3, p256_mod, p256_mp_mod);
  100025. ctx->state = 22;
  100026. break;
  100027. case 22:
  100028. sp_256_mont_dbl_8(ctx->t3, ctx->y, p256_mod);
  100029. ctx->state = 23;
  100030. break;
  100031. case 23:
  100032. sp_256_mont_sub_8(ctx->x, ctx->x, ctx->t3, p256_mod);
  100033. ctx->state = 24;
  100034. break;
  100035. case 24:
  100036. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  100037. sp_256_mont_sub_lower_8(ctx->y, ctx->y, ctx->x, p256_mod);
  100038. ctx->state = 25;
  100039. break;
  100040. case 25:
  100041. sp_256_mont_mul_8(ctx->y, ctx->y, ctx->t4, p256_mod, p256_mp_mod);
  100042. ctx->state = 26;
  100043. break;
  100044. case 26:
  100045. sp_256_mont_sub_8(ctx->y, ctx->y, ctx->t5, p256_mod);
  100046. ctx->state = 27;
  100047. /* fall-through */
  100048. case 27:
  100049. {
  100050. int i;
  100051. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  100052. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  100053. sp_digit maskt = ~(maskp | maskq);
  100054. for (i = 0; i < 8; i++) {
  100055. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  100056. (ctx->x[i] & maskt);
  100057. }
  100058. for (i = 0; i < 8; i++) {
  100059. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  100060. (ctx->y[i] & maskt);
  100061. }
  100062. for (i = 0; i < 8; i++) {
  100063. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  100064. (ctx->z[i] & maskt);
  100065. }
  100066. r->z[0] |= p->infinity & q->infinity;
  100067. r->infinity = p->infinity & q->infinity;
  100068. err = MP_OKAY;
  100069. break;
  100070. }
  100071. }
  100072. if (err == MP_OKAY && ctx->state != 27) {
  100073. err = FP_WOULDBLOCK;
  100074. }
  100075. return err;
  100076. }
  100077. #endif /* WOLFSSL_SP_NONBLOCK */
  100078. static void sp_256_proj_point_add_8(sp_point_256* r,
  100079. const sp_point_256* p, const sp_point_256* q, sp_digit* t)
  100080. {
  100081. sp_digit* t1 = t;
  100082. sp_digit* t2 = t + 2*8;
  100083. sp_digit* t3 = t + 4*8;
  100084. sp_digit* t4 = t + 6*8;
  100085. sp_digit* t5 = t + 8*8;
  100086. sp_digit* t6 = t + 10*8;
  100087. /* Check double */
  100088. (void)sp_256_sub_8(t1, p256_mod, q->y);
  100089. sp_256_norm_8(t1);
  100090. if ((~p->infinity & ~q->infinity &
  100091. sp_256_cmp_equal_8(p->x, q->x) & sp_256_cmp_equal_8(p->z, q->z) &
  100092. (sp_256_cmp_equal_8(p->y, q->y) | sp_256_cmp_equal_8(p->y, t1))) != 0) {
  100093. sp_256_proj_point_dbl_8(r, p, t);
  100094. }
  100095. else {
  100096. sp_digit maskp;
  100097. sp_digit maskq;
  100098. sp_digit maskt;
  100099. sp_digit* x = t6;
  100100. sp_digit* y = t1;
  100101. sp_digit* z = t2;
  100102. int i;
  100103. maskp = 0 - (q->infinity & (!p->infinity));
  100104. maskq = 0 - (p->infinity & (!q->infinity));
  100105. maskt = ~(maskp | maskq);
  100106. /* U1 = X1*Z2^2 */
  100107. sp_256_mont_sqr_8(t1, q->z, p256_mod, p256_mp_mod);
  100108. sp_256_mont_mul_8(t3, t1, q->z, p256_mod, p256_mp_mod);
  100109. sp_256_mont_mul_8(t1, t1, p->x, p256_mod, p256_mp_mod);
  100110. /* U2 = X2*Z1^2 */
  100111. sp_256_mont_sqr_8(t2, p->z, p256_mod, p256_mp_mod);
  100112. sp_256_mont_mul_8(t4, t2, p->z, p256_mod, p256_mp_mod);
  100113. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  100114. /* S1 = Y1*Z2^3 */
  100115. sp_256_mont_mul_8(t3, t3, p->y, p256_mod, p256_mp_mod);
  100116. /* S2 = Y2*Z1^3 */
  100117. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  100118. /* H = U2 - U1 */
  100119. sp_256_mont_sub_8(t2, t2, t1, p256_mod);
  100120. /* R = S2 - S1 */
  100121. sp_256_mont_sub_8(t4, t4, t3, p256_mod);
  100122. if (~p->infinity & ~q->infinity &
  100123. sp_256_iszero_8(t2) & sp_256_iszero_8(t4) & maskt) {
  100124. sp_256_proj_point_dbl_8(r, p, t);
  100125. }
  100126. else {
  100127. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  100128. sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod);
  100129. sp_256_mont_mul_8(y, t1, t5, p256_mod, p256_mp_mod);
  100130. sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod);
  100131. /* Z3 = H*Z1*Z2 */
  100132. sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod);
  100133. sp_256_mont_mul_8(z, z, q->z, p256_mod, p256_mp_mod);
  100134. sp_256_mont_sqr_8(x, t4, p256_mod, p256_mp_mod);
  100135. sp_256_mont_sub_8(x, x, t5, p256_mod);
  100136. sp_256_mont_mul_8(t5, t5, t3, p256_mod, p256_mp_mod);
  100137. sp_256_mont_dbl_8(t3, y, p256_mod);
  100138. sp_256_mont_sub_8(x, x, t3, p256_mod);
  100139. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  100140. sp_256_mont_sub_lower_8(y, y, x, p256_mod);
  100141. sp_256_mont_mul_8(y, y, t4, p256_mod, p256_mp_mod);
  100142. sp_256_mont_sub_8(y, y, t5, p256_mod);
  100143. for (i = 0; i < 8; i++) {
  100144. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  100145. (x[i] & maskt);
  100146. }
  100147. for (i = 0; i < 8; i++) {
  100148. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  100149. (y[i] & maskt);
  100150. }
  100151. for (i = 0; i < 8; i++) {
  100152. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  100153. (z[i] & maskt);
  100154. }
  100155. r->z[0] |= p->infinity & q->infinity;
  100156. r->infinity = p->infinity & q->infinity;
  100157. }
  100158. }
  100159. }
  100160. #ifndef WC_NO_CACHE_RESISTANT
  100161. /* Touch each possible point that could be being copied.
  100162. *
  100163. * r Point to copy into.
  100164. * table Table - start of the entires to access
  100165. * idx Index of entry to retrieve.
  100166. */
  100167. static void sp_256_get_point_16_8(sp_point_256* r, const sp_point_256* table,
  100168. int idx)
  100169. {
  100170. int i;
  100171. sp_digit mask;
  100172. r->x[0] = 0;
  100173. r->x[1] = 0;
  100174. r->x[2] = 0;
  100175. r->x[3] = 0;
  100176. r->x[4] = 0;
  100177. r->x[5] = 0;
  100178. r->x[6] = 0;
  100179. r->x[7] = 0;
  100180. r->y[0] = 0;
  100181. r->y[1] = 0;
  100182. r->y[2] = 0;
  100183. r->y[3] = 0;
  100184. r->y[4] = 0;
  100185. r->y[5] = 0;
  100186. r->y[6] = 0;
  100187. r->y[7] = 0;
  100188. r->z[0] = 0;
  100189. r->z[1] = 0;
  100190. r->z[2] = 0;
  100191. r->z[3] = 0;
  100192. r->z[4] = 0;
  100193. r->z[5] = 0;
  100194. r->z[6] = 0;
  100195. r->z[7] = 0;
  100196. for (i = 1; i < 16; i++) {
  100197. mask = 0 - (i == idx);
  100198. r->x[0] |= mask & table[i].x[0];
  100199. r->x[1] |= mask & table[i].x[1];
  100200. r->x[2] |= mask & table[i].x[2];
  100201. r->x[3] |= mask & table[i].x[3];
  100202. r->x[4] |= mask & table[i].x[4];
  100203. r->x[5] |= mask & table[i].x[5];
  100204. r->x[6] |= mask & table[i].x[6];
  100205. r->x[7] |= mask & table[i].x[7];
  100206. r->y[0] |= mask & table[i].y[0];
  100207. r->y[1] |= mask & table[i].y[1];
  100208. r->y[2] |= mask & table[i].y[2];
  100209. r->y[3] |= mask & table[i].y[3];
  100210. r->y[4] |= mask & table[i].y[4];
  100211. r->y[5] |= mask & table[i].y[5];
  100212. r->y[6] |= mask & table[i].y[6];
  100213. r->y[7] |= mask & table[i].y[7];
  100214. r->z[0] |= mask & table[i].z[0];
  100215. r->z[1] |= mask & table[i].z[1];
  100216. r->z[2] |= mask & table[i].z[2];
  100217. r->z[3] |= mask & table[i].z[3];
  100218. r->z[4] |= mask & table[i].z[4];
  100219. r->z[5] |= mask & table[i].z[5];
  100220. r->z[6] |= mask & table[i].z[6];
  100221. r->z[7] |= mask & table[i].z[7];
  100222. }
  100223. }
  100224. #endif /* !WC_NO_CACHE_RESISTANT */
  100225. /* Multiply the point by the scalar and return the result.
  100226. * If map is true then convert result to affine coordinates.
  100227. *
  100228. * Fast implementation that generates a pre-computation table.
  100229. * 4 bits of window (no sliding!).
  100230. * Uses add and double for calculating table.
  100231. * 256 doubles.
  100232. * 76 adds.
  100233. *
  100234. * r Resulting point.
  100235. * g Point to multiply.
  100236. * k Scalar to multiply by.
  100237. * map Indicates whether to convert result to affine.
  100238. * ct Constant time required.
  100239. * heap Heap to use for allocation.
  100240. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100241. */
  100242. static int sp_256_ecc_mulmod_fast_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  100243. int map, int ct, void* heap)
  100244. {
  100245. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100246. sp_point_256* t = NULL;
  100247. sp_digit* tmp = NULL;
  100248. #else
  100249. sp_point_256 t[16 + 1];
  100250. sp_digit tmp[2 * 8 * 6];
  100251. #endif
  100252. sp_point_256* rt = NULL;
  100253. #ifndef WC_NO_CACHE_RESISTANT
  100254. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100255. sp_point_256* p = NULL;
  100256. #else
  100257. sp_point_256 p[1];
  100258. #endif
  100259. #endif /* !WC_NO_CACHE_RESISTANT */
  100260. sp_digit n;
  100261. int i;
  100262. int c;
  100263. int y;
  100264. int err = MP_OKAY;
  100265. /* Constant time used for cache attack resistance implementation. */
  100266. (void)ct;
  100267. (void)heap;
  100268. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100269. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * (16 + 1),
  100270. heap, DYNAMIC_TYPE_ECC);
  100271. if (t == NULL)
  100272. err = MEMORY_E;
  100273. #ifndef WC_NO_CACHE_RESISTANT
  100274. if (err == MP_OKAY) {
  100275. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256),
  100276. heap, DYNAMIC_TYPE_ECC);
  100277. if (p == NULL)
  100278. err = MEMORY_E;
  100279. }
  100280. #endif
  100281. if (err == MP_OKAY) {
  100282. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  100283. DYNAMIC_TYPE_ECC);
  100284. if (tmp == NULL)
  100285. err = MEMORY_E;
  100286. }
  100287. #endif
  100288. if (err == MP_OKAY) {
  100289. rt = t + 16;
  100290. /* t[0] = {0, 0, 1} * norm */
  100291. XMEMSET(&t[0], 0, sizeof(t[0]));
  100292. t[0].infinity = 1;
  100293. /* t[1] = {g->x, g->y, g->z} * norm */
  100294. (void)sp_256_mod_mul_norm_8(t[1].x, g->x, p256_mod);
  100295. (void)sp_256_mod_mul_norm_8(t[1].y, g->y, p256_mod);
  100296. (void)sp_256_mod_mul_norm_8(t[1].z, g->z, p256_mod);
  100297. t[1].infinity = 0;
  100298. sp_256_proj_point_dbl_8(&t[ 2], &t[ 1], tmp);
  100299. t[ 2].infinity = 0;
  100300. sp_256_proj_point_add_8(&t[ 3], &t[ 2], &t[ 1], tmp);
  100301. t[ 3].infinity = 0;
  100302. sp_256_proj_point_dbl_8(&t[ 4], &t[ 2], tmp);
  100303. t[ 4].infinity = 0;
  100304. sp_256_proj_point_add_8(&t[ 5], &t[ 3], &t[ 2], tmp);
  100305. t[ 5].infinity = 0;
  100306. sp_256_proj_point_dbl_8(&t[ 6], &t[ 3], tmp);
  100307. t[ 6].infinity = 0;
  100308. sp_256_proj_point_add_8(&t[ 7], &t[ 4], &t[ 3], tmp);
  100309. t[ 7].infinity = 0;
  100310. sp_256_proj_point_dbl_8(&t[ 8], &t[ 4], tmp);
  100311. t[ 8].infinity = 0;
  100312. sp_256_proj_point_add_8(&t[ 9], &t[ 5], &t[ 4], tmp);
  100313. t[ 9].infinity = 0;
  100314. sp_256_proj_point_dbl_8(&t[10], &t[ 5], tmp);
  100315. t[10].infinity = 0;
  100316. sp_256_proj_point_add_8(&t[11], &t[ 6], &t[ 5], tmp);
  100317. t[11].infinity = 0;
  100318. sp_256_proj_point_dbl_8(&t[12], &t[ 6], tmp);
  100319. t[12].infinity = 0;
  100320. sp_256_proj_point_add_8(&t[13], &t[ 7], &t[ 6], tmp);
  100321. t[13].infinity = 0;
  100322. sp_256_proj_point_dbl_8(&t[14], &t[ 7], tmp);
  100323. t[14].infinity = 0;
  100324. sp_256_proj_point_add_8(&t[15], &t[ 8], &t[ 7], tmp);
  100325. t[15].infinity = 0;
  100326. i = 6;
  100327. n = k[i+1] << 0;
  100328. c = 28;
  100329. y = (int)(n >> 28);
  100330. #ifndef WC_NO_CACHE_RESISTANT
  100331. if (ct) {
  100332. sp_256_get_point_16_8(rt, t, y);
  100333. rt->infinity = !y;
  100334. }
  100335. else
  100336. #endif
  100337. {
  100338. XMEMCPY(rt, &t[y], sizeof(sp_point_256));
  100339. }
  100340. n <<= 4;
  100341. for (; i>=0 || c>=4; ) {
  100342. if (c < 4) {
  100343. n |= k[i--];
  100344. c += 32;
  100345. }
  100346. y = (n >> 28) & 0xf;
  100347. n <<= 4;
  100348. c -= 4;
  100349. sp_256_proj_point_dbl_8(rt, rt, tmp);
  100350. sp_256_proj_point_dbl_8(rt, rt, tmp);
  100351. sp_256_proj_point_dbl_8(rt, rt, tmp);
  100352. sp_256_proj_point_dbl_8(rt, rt, tmp);
  100353. #ifndef WC_NO_CACHE_RESISTANT
  100354. if (ct) {
  100355. sp_256_get_point_16_8(p, t, y);
  100356. p->infinity = !y;
  100357. sp_256_proj_point_add_8(rt, rt, p, tmp);
  100358. }
  100359. else
  100360. #endif
  100361. {
  100362. sp_256_proj_point_add_8(rt, rt, &t[y], tmp);
  100363. }
  100364. }
  100365. if (map != 0) {
  100366. sp_256_map_8(r, rt, tmp);
  100367. }
  100368. else {
  100369. XMEMCPY(r, rt, sizeof(sp_point_256));
  100370. }
  100371. }
  100372. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100373. if (tmp != NULL)
  100374. #endif
  100375. {
  100376. ForceZero(tmp, sizeof(sp_digit) * 2 * 8 * 6);
  100377. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100378. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  100379. #endif
  100380. }
  100381. #ifndef WC_NO_CACHE_RESISTANT
  100382. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100383. if (p != NULL)
  100384. #endif
  100385. {
  100386. ForceZero(p, sizeof(sp_point_256));
  100387. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100388. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  100389. #endif
  100390. }
  100391. #endif /* !WC_NO_CACHE_RESISTANT */
  100392. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100393. if (t != NULL)
  100394. #endif
  100395. {
  100396. ForceZero(t, sizeof(sp_point_256) * 17);
  100397. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100398. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  100399. #endif
  100400. }
  100401. return err;
  100402. }
  100403. #ifdef FP_ECC
  100404. #define sp_256_mont_dbl_lower_8 sp_256_mont_dbl_8
  100405. #define sp_256_mont_tpl_lower_8 sp_256_mont_tpl_8
  100406. /* Double the Montgomery form projective point p a number of times.
  100407. *
  100408. * r Result of repeated doubling of point.
  100409. * p Point to double.
  100410. * n Number of times to double
  100411. * t Temporary ordinate data.
  100412. */
  100413. static void sp_256_proj_point_dbl_n_8(sp_point_256* p, int i,
  100414. sp_digit* t)
  100415. {
  100416. sp_digit* w = t;
  100417. sp_digit* a = t + 2*8;
  100418. sp_digit* b = t + 4*8;
  100419. sp_digit* t1 = t + 6*8;
  100420. sp_digit* t2 = t + 8*8;
  100421. sp_digit* x;
  100422. sp_digit* y;
  100423. sp_digit* z;
  100424. volatile int n = i;
  100425. x = p->x;
  100426. y = p->y;
  100427. z = p->z;
  100428. /* Y = 2*Y */
  100429. sp_256_mont_dbl_8(y, y, p256_mod);
  100430. /* W = Z^4 */
  100431. sp_256_mont_sqr_8(w, z, p256_mod, p256_mp_mod);
  100432. sp_256_mont_sqr_8(w, w, p256_mod, p256_mp_mod);
  100433. #ifndef WOLFSSL_SP_SMALL
  100434. while (--n > 0)
  100435. #else
  100436. while (--n >= 0)
  100437. #endif
  100438. {
  100439. /* A = 3*(X^2 - W) */
  100440. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  100441. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  100442. sp_256_mont_tpl_lower_8(a, t1, p256_mod);
  100443. /* B = X*Y^2 */
  100444. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  100445. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  100446. /* X = A^2 - 2B */
  100447. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  100448. sp_256_mont_dbl_8(t2, b, p256_mod);
  100449. sp_256_mont_sub_8(x, x, t2, p256_mod);
  100450. /* b = 2.(B - X) */
  100451. sp_256_mont_sub_lower_8(t2, b, x, p256_mod);
  100452. sp_256_mont_dbl_lower_8(b, t2, p256_mod);
  100453. /* Z = Z*Y */
  100454. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  100455. /* t1 = Y^4 */
  100456. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  100457. #ifdef WOLFSSL_SP_SMALL
  100458. if (n != 0)
  100459. #endif
  100460. {
  100461. /* W = W*Y^4 */
  100462. sp_256_mont_mul_8(w, w, t1, p256_mod, p256_mp_mod);
  100463. }
  100464. /* y = 2*A*(B - X) - Y^4 */
  100465. sp_256_mont_mul_8(y, b, a, p256_mod, p256_mp_mod);
  100466. sp_256_mont_sub_8(y, y, t1, p256_mod);
  100467. }
  100468. #ifndef WOLFSSL_SP_SMALL
  100469. /* A = 3*(X^2 - W) */
  100470. sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod);
  100471. sp_256_mont_sub_8(t1, t1, w, p256_mod);
  100472. sp_256_mont_tpl_lower_8(a, t1, p256_mod);
  100473. /* B = X*Y^2 */
  100474. sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod);
  100475. sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod);
  100476. /* X = A^2 - 2B */
  100477. sp_256_mont_sqr_8(x, a, p256_mod, p256_mp_mod);
  100478. sp_256_mont_dbl_8(t2, b, p256_mod);
  100479. sp_256_mont_sub_8(x, x, t2, p256_mod);
  100480. /* b = 2.(B - X) */
  100481. sp_256_mont_sub_lower_8(t2, b, x, p256_mod);
  100482. sp_256_mont_dbl_lower_8(b, t2, p256_mod);
  100483. /* Z = Z*Y */
  100484. sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod);
  100485. /* t1 = Y^4 */
  100486. sp_256_mont_sqr_8(t1, t1, p256_mod, p256_mp_mod);
  100487. /* y = 2*A*(B - X) - Y^4 */
  100488. sp_256_mont_mul_8(y, b, a, p256_mod, p256_mp_mod);
  100489. sp_256_mont_sub_8(y, y, t1, p256_mod);
  100490. #endif
  100491. /* Y = Y/2 */
  100492. sp_256_div2_8(y, y, p256_mod);
  100493. }
  100494. /* Convert the projective point to affine.
  100495. * Ordinates are in Montgomery form.
  100496. *
  100497. * a Point to convert.
  100498. * t Temporary data.
  100499. */
  100500. static void sp_256_proj_to_affine_8(sp_point_256* a, sp_digit* t)
  100501. {
  100502. sp_digit* t1 = t;
  100503. sp_digit* t2 = t + 2 * 8;
  100504. sp_digit* tmp = t + 4 * 8;
  100505. sp_256_mont_inv_8(t1, a->z, tmp);
  100506. sp_256_mont_sqr_8(t2, t1, p256_mod, p256_mp_mod);
  100507. sp_256_mont_mul_8(t1, t2, t1, p256_mod, p256_mp_mod);
  100508. sp_256_mont_mul_8(a->x, a->x, t2, p256_mod, p256_mp_mod);
  100509. sp_256_mont_mul_8(a->y, a->y, t1, p256_mod, p256_mp_mod);
  100510. XMEMCPY(a->z, p256_norm_mod, sizeof(p256_norm_mod));
  100511. }
  100512. #endif /* FP_ECC */
  100513. /* A table entry for pre-computed points. */
  100514. typedef struct sp_table_entry_256 {
  100515. sp_digit x[8];
  100516. sp_digit y[8];
  100517. } sp_table_entry_256;
  100518. #ifdef FP_ECC
  100519. #endif /* FP_ECC */
  100520. /* Add two Montgomery form projective points. The second point has a q value of
  100521. * one.
  100522. * Only the first point can be the same pointer as the result point.
  100523. *
  100524. * r Result of addition.
  100525. * p First point to add.
  100526. * q Second point to add.
  100527. * t Temporary ordinate data.
  100528. */
  100529. static void sp_256_proj_point_add_qz1_8(sp_point_256* r, const sp_point_256* p,
  100530. const sp_point_256* q, sp_digit* t)
  100531. {
  100532. sp_digit* t1 = t;
  100533. sp_digit* t2 = t + 2*8;
  100534. sp_digit* t3 = t + 4*8;
  100535. sp_digit* t4 = t + 6*8;
  100536. sp_digit* t5 = t + 8*8;
  100537. sp_digit* t6 = t + 10*8;
  100538. /* Check double */
  100539. (void)sp_256_sub_8(t1, p256_mod, q->y);
  100540. sp_256_norm_8(t1);
  100541. if ((~p->infinity & ~q->infinity &
  100542. sp_256_cmp_equal_8(p->x, q->x) & sp_256_cmp_equal_8(p->z, q->z) &
  100543. (sp_256_cmp_equal_8(p->y, q->y) | sp_256_cmp_equal_8(p->y, t1))) != 0) {
  100544. sp_256_proj_point_dbl_8(r, p, t);
  100545. }
  100546. else {
  100547. sp_digit maskp;
  100548. sp_digit maskq;
  100549. sp_digit maskt;
  100550. sp_digit* x = t2;
  100551. sp_digit* y = t5;
  100552. sp_digit* z = t6;
  100553. int i;
  100554. /* U2 = X2*Z1^2 */
  100555. sp_256_mont_sqr_8(t2, p->z, p256_mod, p256_mp_mod);
  100556. sp_256_mont_mul_8(t4, t2, p->z, p256_mod, p256_mp_mod);
  100557. sp_256_mont_mul_8(t2, t2, q->x, p256_mod, p256_mp_mod);
  100558. /* S2 = Y2*Z1^3 */
  100559. sp_256_mont_mul_8(t4, t4, q->y, p256_mod, p256_mp_mod);
  100560. /* H = U2 - X1 */
  100561. sp_256_mont_sub_8(t2, t2, p->x, p256_mod);
  100562. /* R = S2 - Y1 */
  100563. sp_256_mont_sub_8(t4, t4, p->y, p256_mod);
  100564. /* Z3 = H*Z1 */
  100565. sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod);
  100566. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  100567. sp_256_mont_sqr_8(t1, t4, p256_mod, p256_mp_mod);
  100568. sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod);
  100569. sp_256_mont_mul_8(t3, p->x, t5, p256_mod, p256_mp_mod);
  100570. sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod);
  100571. sp_256_mont_sub_8(x, t1, t5, p256_mod);
  100572. sp_256_mont_dbl_8(t1, t3, p256_mod);
  100573. sp_256_mont_sub_8(x, x, t1, p256_mod);
  100574. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  100575. sp_256_mont_sub_lower_8(t3, t3, x, p256_mod);
  100576. sp_256_mont_mul_8(t3, t3, t4, p256_mod, p256_mp_mod);
  100577. sp_256_mont_mul_8(t5, t5, p->y, p256_mod, p256_mp_mod);
  100578. sp_256_mont_sub_8(y, t3, t5, p256_mod);
  100579. maskp = 0 - (q->infinity & (!p->infinity));
  100580. maskq = 0 - (p->infinity & (!q->infinity));
  100581. maskt = ~(maskp | maskq);
  100582. for (i = 0; i < 8; i++) {
  100583. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt);
  100584. }
  100585. for (i = 0; i < 8; i++) {
  100586. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt);
  100587. }
  100588. for (i = 0; i < 8; i++) {
  100589. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt);
  100590. }
  100591. r->z[0] |= p->infinity & q->infinity;
  100592. r->infinity = p->infinity & q->infinity;
  100593. }
  100594. }
  100595. #ifdef WOLFSSL_SP_SMALL
  100596. #ifdef FP_ECC
  100597. /* Generate the pre-computed table of points for the base point.
  100598. *
  100599. * width = 4
  100600. * 16 entries
  100601. * 64 bits between
  100602. *
  100603. * a The base point.
  100604. * table Place to store generated point data.
  100605. * tmp Temporary data.
  100606. * heap Heap to use for allocation.
  100607. */
  100608. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  100609. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  100610. {
  100611. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100612. sp_point_256* t = NULL;
  100613. #else
  100614. sp_point_256 t[3];
  100615. #endif
  100616. sp_point_256* s1 = NULL;
  100617. sp_point_256* s2 = NULL;
  100618. int i;
  100619. int j;
  100620. int err = MP_OKAY;
  100621. (void)heap;
  100622. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100623. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  100624. DYNAMIC_TYPE_ECC);
  100625. if (t == NULL)
  100626. err = MEMORY_E;
  100627. #endif
  100628. if (err == MP_OKAY) {
  100629. s1 = t + 1;
  100630. s2 = t + 2;
  100631. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  100632. }
  100633. if (err == MP_OKAY) {
  100634. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  100635. }
  100636. if (err == MP_OKAY) {
  100637. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  100638. }
  100639. if (err == MP_OKAY) {
  100640. t->infinity = 0;
  100641. sp_256_proj_to_affine_8(t, tmp);
  100642. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  100643. s1->infinity = 0;
  100644. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  100645. s2->infinity = 0;
  100646. /* table[0] = {0, 0, infinity} */
  100647. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  100648. /* table[1] = Affine version of 'a' in Montgomery form */
  100649. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  100650. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  100651. for (i=1; i<4; i++) {
  100652. sp_256_proj_point_dbl_n_8(t, 64, tmp);
  100653. sp_256_proj_to_affine_8(t, tmp);
  100654. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  100655. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  100656. }
  100657. for (i=1; i<4; i++) {
  100658. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  100659. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  100660. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  100661. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  100662. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  100663. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  100664. sp_256_proj_to_affine_8(t, tmp);
  100665. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  100666. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  100667. }
  100668. }
  100669. }
  100670. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100671. if (t != NULL)
  100672. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  100673. #endif
  100674. return err;
  100675. }
  100676. #endif /* FP_ECC */
  100677. #ifndef WC_NO_CACHE_RESISTANT
  100678. /* Touch each possible entry that could be being copied.
  100679. *
  100680. * r Point to copy into.
  100681. * table Table - start of the entires to access
  100682. * idx Index of entry to retrieve.
  100683. */
  100684. static void sp_256_get_entry_16_8(sp_point_256* r,
  100685. const sp_table_entry_256* table, int idx)
  100686. {
  100687. int i;
  100688. sp_digit mask;
  100689. r->x[0] = 0;
  100690. r->x[1] = 0;
  100691. r->x[2] = 0;
  100692. r->x[3] = 0;
  100693. r->x[4] = 0;
  100694. r->x[5] = 0;
  100695. r->x[6] = 0;
  100696. r->x[7] = 0;
  100697. r->y[0] = 0;
  100698. r->y[1] = 0;
  100699. r->y[2] = 0;
  100700. r->y[3] = 0;
  100701. r->y[4] = 0;
  100702. r->y[5] = 0;
  100703. r->y[6] = 0;
  100704. r->y[7] = 0;
  100705. for (i = 1; i < 16; i++) {
  100706. mask = 0 - (i == idx);
  100707. r->x[0] |= mask & table[i].x[0];
  100708. r->x[1] |= mask & table[i].x[1];
  100709. r->x[2] |= mask & table[i].x[2];
  100710. r->x[3] |= mask & table[i].x[3];
  100711. r->x[4] |= mask & table[i].x[4];
  100712. r->x[5] |= mask & table[i].x[5];
  100713. r->x[6] |= mask & table[i].x[6];
  100714. r->x[7] |= mask & table[i].x[7];
  100715. r->y[0] |= mask & table[i].y[0];
  100716. r->y[1] |= mask & table[i].y[1];
  100717. r->y[2] |= mask & table[i].y[2];
  100718. r->y[3] |= mask & table[i].y[3];
  100719. r->y[4] |= mask & table[i].y[4];
  100720. r->y[5] |= mask & table[i].y[5];
  100721. r->y[6] |= mask & table[i].y[6];
  100722. r->y[7] |= mask & table[i].y[7];
  100723. }
  100724. }
  100725. #endif /* !WC_NO_CACHE_RESISTANT */
  100726. /* Multiply the point by the scalar and return the result.
  100727. * If map is true then convert result to affine coordinates.
  100728. *
  100729. * Stripe implementation.
  100730. * Pre-generated: 2^0, 2^64, ...
  100731. * Pre-generated: products of all combinations of above.
  100732. * 4 doubles and adds (with qz=1)
  100733. *
  100734. * r Resulting point.
  100735. * k Scalar to multiply by.
  100736. * table Pre-computed table.
  100737. * map Indicates whether to convert result to affine.
  100738. * ct Constant time required.
  100739. * heap Heap to use for allocation.
  100740. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100741. */
  100742. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  100743. const sp_table_entry_256* table, const sp_digit* k, int map,
  100744. int ct, void* heap)
  100745. {
  100746. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100747. sp_point_256* rt = NULL;
  100748. sp_digit* t = NULL;
  100749. #else
  100750. sp_point_256 rt[2];
  100751. sp_digit t[2 * 8 * 6];
  100752. #endif
  100753. sp_point_256* p = NULL;
  100754. int i;
  100755. int j;
  100756. int y;
  100757. int x;
  100758. int err = MP_OKAY;
  100759. (void)g;
  100760. /* Constant time used for cache attack resistance implementation. */
  100761. (void)ct;
  100762. (void)heap;
  100763. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100764. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  100765. DYNAMIC_TYPE_ECC);
  100766. if (rt == NULL)
  100767. err = MEMORY_E;
  100768. if (err == MP_OKAY) {
  100769. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  100770. DYNAMIC_TYPE_ECC);
  100771. if (t == NULL)
  100772. err = MEMORY_E;
  100773. }
  100774. #endif
  100775. if (err == MP_OKAY) {
  100776. p = rt + 1;
  100777. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  100778. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  100779. y = 0;
  100780. x = 63;
  100781. for (j=0; j<4; j++) {
  100782. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  100783. x += 64;
  100784. }
  100785. #ifndef WC_NO_CACHE_RESISTANT
  100786. if (ct) {
  100787. sp_256_get_entry_16_8(rt, table, y);
  100788. } else
  100789. #endif
  100790. {
  100791. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  100792. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  100793. }
  100794. rt->infinity = !y;
  100795. for (i=62; i>=0; i--) {
  100796. y = 0;
  100797. x = i;
  100798. for (j=0; j<4; j++) {
  100799. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  100800. x += 64;
  100801. }
  100802. sp_256_proj_point_dbl_8(rt, rt, t);
  100803. #ifndef WC_NO_CACHE_RESISTANT
  100804. if (ct) {
  100805. sp_256_get_entry_16_8(p, table, y);
  100806. }
  100807. else
  100808. #endif
  100809. {
  100810. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  100811. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  100812. }
  100813. p->infinity = !y;
  100814. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  100815. }
  100816. if (map != 0) {
  100817. sp_256_map_8(r, rt, t);
  100818. }
  100819. else {
  100820. XMEMCPY(r, rt, sizeof(sp_point_256));
  100821. }
  100822. }
  100823. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100824. if (t != NULL)
  100825. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  100826. if (rt != NULL)
  100827. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  100828. #endif
  100829. return err;
  100830. }
  100831. #ifdef FP_ECC
  100832. #ifndef FP_ENTRIES
  100833. #define FP_ENTRIES 16
  100834. #endif
  100835. /* Cache entry - holds precomputation tables for a point. */
  100836. typedef struct sp_cache_256_t {
  100837. /* X ordinate of point that table was generated from. */
  100838. sp_digit x[8];
  100839. /* Y ordinate of point that table was generated from. */
  100840. sp_digit y[8];
  100841. /* Precomputation table for point. */
  100842. sp_table_entry_256 table[16];
  100843. /* Count of entries in table. */
  100844. uint32_t cnt;
  100845. /* Point and table set in entry. */
  100846. int set;
  100847. } sp_cache_256_t;
  100848. /* Cache of tables. */
  100849. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  100850. /* Index of last entry in cache. */
  100851. static THREAD_LS_T int sp_cache_256_last = -1;
  100852. /* Cache has been initialized. */
  100853. static THREAD_LS_T int sp_cache_256_inited = 0;
  100854. #ifndef HAVE_THREAD_LS
  100855. static volatile int initCacheMutex_256 = 0;
  100856. static wolfSSL_Mutex sp_cache_256_lock;
  100857. #endif
  100858. /* Get the cache entry for the point.
  100859. *
  100860. * g [in] Point scalar multipling.
  100861. * cache [out] Cache table to use.
  100862. */
  100863. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  100864. {
  100865. int i;
  100866. int j;
  100867. uint32_t least;
  100868. if (sp_cache_256_inited == 0) {
  100869. for (i=0; i<FP_ENTRIES; i++) {
  100870. sp_cache_256[i].set = 0;
  100871. }
  100872. sp_cache_256_inited = 1;
  100873. }
  100874. /* Compare point with those in cache. */
  100875. for (i=0; i<FP_ENTRIES; i++) {
  100876. if (!sp_cache_256[i].set)
  100877. continue;
  100878. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  100879. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  100880. sp_cache_256[i].cnt++;
  100881. break;
  100882. }
  100883. }
  100884. /* No match. */
  100885. if (i == FP_ENTRIES) {
  100886. /* Find empty entry. */
  100887. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  100888. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  100889. if (!sp_cache_256[i].set) {
  100890. break;
  100891. }
  100892. }
  100893. /* Evict least used. */
  100894. if (i == sp_cache_256_last) {
  100895. least = sp_cache_256[0].cnt;
  100896. for (j=1; j<FP_ENTRIES; j++) {
  100897. if (sp_cache_256[j].cnt < least) {
  100898. i = j;
  100899. least = sp_cache_256[i].cnt;
  100900. }
  100901. }
  100902. }
  100903. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  100904. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  100905. sp_cache_256[i].set = 1;
  100906. sp_cache_256[i].cnt = 1;
  100907. }
  100908. *cache = &sp_cache_256[i];
  100909. sp_cache_256_last = i;
  100910. }
  100911. #endif /* FP_ECC */
  100912. /* Multiply the base point of P256 by the scalar and return the result.
  100913. * If map is true then convert result to affine coordinates.
  100914. *
  100915. * r Resulting point.
  100916. * g Point to multiply.
  100917. * k Scalar to multiply by.
  100918. * map Indicates whether to convert result to affine.
  100919. * ct Constant time required.
  100920. * heap Heap to use for allocation.
  100921. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  100922. */
  100923. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  100924. int map, int ct, void* heap)
  100925. {
  100926. #ifndef FP_ECC
  100927. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  100928. #else
  100929. sp_digit tmp[2 * 8 * 6];
  100930. sp_cache_256_t* cache;
  100931. int err = MP_OKAY;
  100932. #ifndef HAVE_THREAD_LS
  100933. if (initCacheMutex_256 == 0) {
  100934. wc_InitMutex(&sp_cache_256_lock);
  100935. initCacheMutex_256 = 1;
  100936. }
  100937. if (wc_LockMutex(&sp_cache_256_lock) != 0)
  100938. err = BAD_MUTEX_E;
  100939. #endif /* HAVE_THREAD_LS */
  100940. if (err == MP_OKAY) {
  100941. sp_ecc_get_cache_256(g, &cache);
  100942. if (cache->cnt == 2)
  100943. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  100944. #ifndef HAVE_THREAD_LS
  100945. wc_UnLockMutex(&sp_cache_256_lock);
  100946. #endif /* HAVE_THREAD_LS */
  100947. if (cache->cnt < 2) {
  100948. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  100949. }
  100950. else {
  100951. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  100952. map, ct, heap);
  100953. }
  100954. }
  100955. return err;
  100956. #endif
  100957. }
  100958. #else
  100959. #ifdef FP_ECC
  100960. /* Generate the pre-computed table of points for the base point.
  100961. *
  100962. * width = 8
  100963. * 256 entries
  100964. * 32 bits between
  100965. *
  100966. * a The base point.
  100967. * table Place to store generated point data.
  100968. * tmp Temporary data.
  100969. * heap Heap to use for allocation.
  100970. */
  100971. static int sp_256_gen_stripe_table_8(const sp_point_256* a,
  100972. sp_table_entry_256* table, sp_digit* tmp, void* heap)
  100973. {
  100974. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100975. sp_point_256* t = NULL;
  100976. #else
  100977. sp_point_256 t[3];
  100978. #endif
  100979. sp_point_256* s1 = NULL;
  100980. sp_point_256* s2 = NULL;
  100981. int i;
  100982. int j;
  100983. int err = MP_OKAY;
  100984. (void)heap;
  100985. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  100986. t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 3, heap,
  100987. DYNAMIC_TYPE_ECC);
  100988. if (t == NULL)
  100989. err = MEMORY_E;
  100990. #endif
  100991. if (err == MP_OKAY) {
  100992. s1 = t + 1;
  100993. s2 = t + 2;
  100994. err = sp_256_mod_mul_norm_8(t->x, a->x, p256_mod);
  100995. }
  100996. if (err == MP_OKAY) {
  100997. err = sp_256_mod_mul_norm_8(t->y, a->y, p256_mod);
  100998. }
  100999. if (err == MP_OKAY) {
  101000. err = sp_256_mod_mul_norm_8(t->z, a->z, p256_mod);
  101001. }
  101002. if (err == MP_OKAY) {
  101003. t->infinity = 0;
  101004. sp_256_proj_to_affine_8(t, tmp);
  101005. XMEMCPY(s1->z, p256_norm_mod, sizeof(p256_norm_mod));
  101006. s1->infinity = 0;
  101007. XMEMCPY(s2->z, p256_norm_mod, sizeof(p256_norm_mod));
  101008. s2->infinity = 0;
  101009. /* table[0] = {0, 0, infinity} */
  101010. XMEMSET(&table[0], 0, sizeof(sp_table_entry_256));
  101011. /* table[1] = Affine version of 'a' in Montgomery form */
  101012. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  101013. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  101014. for (i=1; i<8; i++) {
  101015. sp_256_proj_point_dbl_n_8(t, 32, tmp);
  101016. sp_256_proj_to_affine_8(t, tmp);
  101017. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  101018. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  101019. }
  101020. for (i=1; i<8; i++) {
  101021. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  101022. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  101023. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  101024. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  101025. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  101026. sp_256_proj_point_add_qz1_8(t, s1, s2, tmp);
  101027. sp_256_proj_to_affine_8(t, tmp);
  101028. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  101029. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  101030. }
  101031. }
  101032. }
  101033. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101034. if (t != NULL)
  101035. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  101036. #endif
  101037. return err;
  101038. }
  101039. #endif /* FP_ECC */
  101040. #ifndef WC_NO_CACHE_RESISTANT
  101041. /* Touch each possible entry that could be being copied.
  101042. *
  101043. * r Point to copy into.
  101044. * table Table - start of the entires to access
  101045. * idx Index of entry to retrieve.
  101046. */
  101047. static void sp_256_get_entry_256_8(sp_point_256* r,
  101048. const sp_table_entry_256* table, int idx)
  101049. {
  101050. int i;
  101051. sp_digit mask;
  101052. r->x[0] = 0;
  101053. r->x[1] = 0;
  101054. r->x[2] = 0;
  101055. r->x[3] = 0;
  101056. r->x[4] = 0;
  101057. r->x[5] = 0;
  101058. r->x[6] = 0;
  101059. r->x[7] = 0;
  101060. r->y[0] = 0;
  101061. r->y[1] = 0;
  101062. r->y[2] = 0;
  101063. r->y[3] = 0;
  101064. r->y[4] = 0;
  101065. r->y[5] = 0;
  101066. r->y[6] = 0;
  101067. r->y[7] = 0;
  101068. for (i = 1; i < 256; i++) {
  101069. mask = 0 - (i == idx);
  101070. r->x[0] |= mask & table[i].x[0];
  101071. r->x[1] |= mask & table[i].x[1];
  101072. r->x[2] |= mask & table[i].x[2];
  101073. r->x[3] |= mask & table[i].x[3];
  101074. r->x[4] |= mask & table[i].x[4];
  101075. r->x[5] |= mask & table[i].x[5];
  101076. r->x[6] |= mask & table[i].x[6];
  101077. r->x[7] |= mask & table[i].x[7];
  101078. r->y[0] |= mask & table[i].y[0];
  101079. r->y[1] |= mask & table[i].y[1];
  101080. r->y[2] |= mask & table[i].y[2];
  101081. r->y[3] |= mask & table[i].y[3];
  101082. r->y[4] |= mask & table[i].y[4];
  101083. r->y[5] |= mask & table[i].y[5];
  101084. r->y[6] |= mask & table[i].y[6];
  101085. r->y[7] |= mask & table[i].y[7];
  101086. }
  101087. }
  101088. #endif /* !WC_NO_CACHE_RESISTANT */
  101089. /* Multiply the point by the scalar and return the result.
  101090. * If map is true then convert result to affine coordinates.
  101091. *
  101092. * Stripe implementation.
  101093. * Pre-generated: 2^0, 2^32, ...
  101094. * Pre-generated: products of all combinations of above.
  101095. * 8 doubles and adds (with qz=1)
  101096. *
  101097. * r Resulting point.
  101098. * k Scalar to multiply by.
  101099. * table Pre-computed table.
  101100. * map Indicates whether to convert result to affine.
  101101. * ct Constant time required.
  101102. * heap Heap to use for allocation.
  101103. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101104. */
  101105. static int sp_256_ecc_mulmod_stripe_8(sp_point_256* r, const sp_point_256* g,
  101106. const sp_table_entry_256* table, const sp_digit* k, int map,
  101107. int ct, void* heap)
  101108. {
  101109. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101110. sp_point_256* rt = NULL;
  101111. sp_digit* t = NULL;
  101112. #else
  101113. sp_point_256 rt[2];
  101114. sp_digit t[2 * 8 * 6];
  101115. #endif
  101116. sp_point_256* p = NULL;
  101117. int i;
  101118. int j;
  101119. int y;
  101120. int x;
  101121. int err = MP_OKAY;
  101122. (void)g;
  101123. /* Constant time used for cache attack resistance implementation. */
  101124. (void)ct;
  101125. (void)heap;
  101126. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101127. rt = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  101128. DYNAMIC_TYPE_ECC);
  101129. if (rt == NULL)
  101130. err = MEMORY_E;
  101131. if (err == MP_OKAY) {
  101132. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, heap,
  101133. DYNAMIC_TYPE_ECC);
  101134. if (t == NULL)
  101135. err = MEMORY_E;
  101136. }
  101137. #endif
  101138. if (err == MP_OKAY) {
  101139. p = rt + 1;
  101140. XMEMCPY(p->z, p256_norm_mod, sizeof(p256_norm_mod));
  101141. XMEMCPY(rt->z, p256_norm_mod, sizeof(p256_norm_mod));
  101142. y = 0;
  101143. x = 31;
  101144. for (j=0; j<8; j++) {
  101145. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  101146. x += 32;
  101147. }
  101148. #ifndef WC_NO_CACHE_RESISTANT
  101149. if (ct) {
  101150. sp_256_get_entry_256_8(rt, table, y);
  101151. } else
  101152. #endif
  101153. {
  101154. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  101155. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  101156. }
  101157. rt->infinity = !y;
  101158. for (i=30; i>=0; i--) {
  101159. y = 0;
  101160. x = i;
  101161. for (j=0; j<8; j++) {
  101162. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  101163. x += 32;
  101164. }
  101165. sp_256_proj_point_dbl_8(rt, rt, t);
  101166. #ifndef WC_NO_CACHE_RESISTANT
  101167. if (ct) {
  101168. sp_256_get_entry_256_8(p, table, y);
  101169. }
  101170. else
  101171. #endif
  101172. {
  101173. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  101174. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  101175. }
  101176. p->infinity = !y;
  101177. sp_256_proj_point_add_qz1_8(rt, rt, p, t);
  101178. }
  101179. if (map != 0) {
  101180. sp_256_map_8(r, rt, t);
  101181. }
  101182. else {
  101183. XMEMCPY(r, rt, sizeof(sp_point_256));
  101184. }
  101185. }
  101186. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101187. if (t != NULL)
  101188. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  101189. if (rt != NULL)
  101190. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  101191. #endif
  101192. return err;
  101193. }
  101194. #ifdef FP_ECC
  101195. #ifndef FP_ENTRIES
  101196. #define FP_ENTRIES 16
  101197. #endif
  101198. /* Cache entry - holds precomputation tables for a point. */
  101199. typedef struct sp_cache_256_t {
  101200. /* X ordinate of point that table was generated from. */
  101201. sp_digit x[8];
  101202. /* Y ordinate of point that table was generated from. */
  101203. sp_digit y[8];
  101204. /* Precomputation table for point. */
  101205. sp_table_entry_256 table[256];
  101206. /* Count of entries in table. */
  101207. uint32_t cnt;
  101208. /* Point and table set in entry. */
  101209. int set;
  101210. } sp_cache_256_t;
  101211. /* Cache of tables. */
  101212. static THREAD_LS_T sp_cache_256_t sp_cache_256[FP_ENTRIES];
  101213. /* Index of last entry in cache. */
  101214. static THREAD_LS_T int sp_cache_256_last = -1;
  101215. /* Cache has been initialized. */
  101216. static THREAD_LS_T int sp_cache_256_inited = 0;
  101217. #ifndef HAVE_THREAD_LS
  101218. static volatile int initCacheMutex_256 = 0;
  101219. static wolfSSL_Mutex sp_cache_256_lock;
  101220. #endif
  101221. /* Get the cache entry for the point.
  101222. *
  101223. * g [in] Point scalar multipling.
  101224. * cache [out] Cache table to use.
  101225. */
  101226. static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache)
  101227. {
  101228. int i;
  101229. int j;
  101230. uint32_t least;
  101231. if (sp_cache_256_inited == 0) {
  101232. for (i=0; i<FP_ENTRIES; i++) {
  101233. sp_cache_256[i].set = 0;
  101234. }
  101235. sp_cache_256_inited = 1;
  101236. }
  101237. /* Compare point with those in cache. */
  101238. for (i=0; i<FP_ENTRIES; i++) {
  101239. if (!sp_cache_256[i].set)
  101240. continue;
  101241. if (sp_256_cmp_equal_8(g->x, sp_cache_256[i].x) &
  101242. sp_256_cmp_equal_8(g->y, sp_cache_256[i].y)) {
  101243. sp_cache_256[i].cnt++;
  101244. break;
  101245. }
  101246. }
  101247. /* No match. */
  101248. if (i == FP_ENTRIES) {
  101249. /* Find empty entry. */
  101250. i = (sp_cache_256_last + 1) % FP_ENTRIES;
  101251. for (; i != sp_cache_256_last; i=(i+1)%FP_ENTRIES) {
  101252. if (!sp_cache_256[i].set) {
  101253. break;
  101254. }
  101255. }
  101256. /* Evict least used. */
  101257. if (i == sp_cache_256_last) {
  101258. least = sp_cache_256[0].cnt;
  101259. for (j=1; j<FP_ENTRIES; j++) {
  101260. if (sp_cache_256[j].cnt < least) {
  101261. i = j;
  101262. least = sp_cache_256[i].cnt;
  101263. }
  101264. }
  101265. }
  101266. XMEMCPY(sp_cache_256[i].x, g->x, sizeof(sp_cache_256[i].x));
  101267. XMEMCPY(sp_cache_256[i].y, g->y, sizeof(sp_cache_256[i].y));
  101268. sp_cache_256[i].set = 1;
  101269. sp_cache_256[i].cnt = 1;
  101270. }
  101271. *cache = &sp_cache_256[i];
  101272. sp_cache_256_last = i;
  101273. }
  101274. #endif /* FP_ECC */
  101275. /* Multiply the base point of P256 by the scalar and return the result.
  101276. * If map is true then convert result to affine coordinates.
  101277. *
  101278. * r Resulting point.
  101279. * g Point to multiply.
  101280. * k Scalar to multiply by.
  101281. * map Indicates whether to convert result to affine.
  101282. * ct Constant time required.
  101283. * heap Heap to use for allocation.
  101284. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101285. */
  101286. static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k,
  101287. int map, int ct, void* heap)
  101288. {
  101289. #ifndef FP_ECC
  101290. return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  101291. #else
  101292. sp_digit tmp[2 * 8 * 6];
  101293. sp_cache_256_t* cache;
  101294. int err = MP_OKAY;
  101295. #ifndef HAVE_THREAD_LS
  101296. if (initCacheMutex_256 == 0) {
  101297. wc_InitMutex(&sp_cache_256_lock);
  101298. initCacheMutex_256 = 1;
  101299. }
  101300. if (wc_LockMutex(&sp_cache_256_lock) != 0)
  101301. err = BAD_MUTEX_E;
  101302. #endif /* HAVE_THREAD_LS */
  101303. if (err == MP_OKAY) {
  101304. sp_ecc_get_cache_256(g, &cache);
  101305. if (cache->cnt == 2)
  101306. sp_256_gen_stripe_table_8(g, cache->table, tmp, heap);
  101307. #ifndef HAVE_THREAD_LS
  101308. wc_UnLockMutex(&sp_cache_256_lock);
  101309. #endif /* HAVE_THREAD_LS */
  101310. if (cache->cnt < 2) {
  101311. err = sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap);
  101312. }
  101313. else {
  101314. err = sp_256_ecc_mulmod_stripe_8(r, g, cache->table, k,
  101315. map, ct, heap);
  101316. }
  101317. }
  101318. return err;
  101319. #endif
  101320. }
  101321. #endif /* WOLFSSL_SP_SMALL */
  101322. /* Multiply the point by the scalar and return the result.
  101323. * If map is true then convert result to affine coordinates.
  101324. *
  101325. * km Scalar to multiply by.
  101326. * p Point to multiply.
  101327. * r Resulting point.
  101328. * map Indicates whether to convert result to affine.
  101329. * heap Heap to use for allocation.
  101330. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101331. */
  101332. int sp_ecc_mulmod_256(const mp_int* km, const ecc_point* gm, ecc_point* r,
  101333. int map, void* heap)
  101334. {
  101335. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101336. sp_point_256* point = NULL;
  101337. sp_digit* k = NULL;
  101338. #else
  101339. sp_point_256 point[1];
  101340. sp_digit k[8];
  101341. #endif
  101342. int err = MP_OKAY;
  101343. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101344. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  101345. DYNAMIC_TYPE_ECC);
  101346. if (point == NULL)
  101347. err = MEMORY_E;
  101348. if (err == MP_OKAY) {
  101349. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  101350. DYNAMIC_TYPE_ECC);
  101351. if (k == NULL)
  101352. err = MEMORY_E;
  101353. }
  101354. #endif
  101355. if (err == MP_OKAY) {
  101356. sp_256_from_mp(k, 8, km);
  101357. sp_256_point_from_ecc_point_8(point, gm);
  101358. err = sp_256_ecc_mulmod_8(point, point, k, map, 1, heap);
  101359. }
  101360. if (err == MP_OKAY) {
  101361. err = sp_256_point_to_ecc_point_8(point, r);
  101362. }
  101363. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101364. if (k != NULL)
  101365. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  101366. if (point != NULL)
  101367. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  101368. #endif
  101369. return err;
  101370. }
  101371. /* Multiply the point by the scalar, add point a and return the result.
  101372. * If map is true then convert result to affine coordinates.
  101373. *
  101374. * km Scalar to multiply by.
  101375. * p Point to multiply.
  101376. * am Point to add to scalar mulitply result.
  101377. * inMont Point to add is in montgomery form.
  101378. * r Resulting point.
  101379. * map Indicates whether to convert result to affine.
  101380. * heap Heap to use for allocation.
  101381. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101382. */
  101383. int sp_ecc_mulmod_add_256(const mp_int* km, const ecc_point* gm,
  101384. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  101385. {
  101386. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101387. sp_point_256* point = NULL;
  101388. sp_digit* k = NULL;
  101389. #else
  101390. sp_point_256 point[2];
  101391. sp_digit k[8 + 8 * 2 * 6];
  101392. #endif
  101393. sp_point_256* addP = NULL;
  101394. sp_digit* tmp = NULL;
  101395. int err = MP_OKAY;
  101396. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101397. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  101398. DYNAMIC_TYPE_ECC);
  101399. if (point == NULL)
  101400. err = MEMORY_E;
  101401. if (err == MP_OKAY) {
  101402. k = (sp_digit*)XMALLOC(
  101403. sizeof(sp_digit) * (8 + 8 * 2 * 6), heap,
  101404. DYNAMIC_TYPE_ECC);
  101405. if (k == NULL)
  101406. err = MEMORY_E;
  101407. }
  101408. #endif
  101409. if (err == MP_OKAY) {
  101410. addP = point + 1;
  101411. tmp = k + 8;
  101412. sp_256_from_mp(k, 8, km);
  101413. sp_256_point_from_ecc_point_8(point, gm);
  101414. sp_256_point_from_ecc_point_8(addP, am);
  101415. }
  101416. if ((err == MP_OKAY) && (!inMont)) {
  101417. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  101418. }
  101419. if ((err == MP_OKAY) && (!inMont)) {
  101420. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  101421. }
  101422. if ((err == MP_OKAY) && (!inMont)) {
  101423. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  101424. }
  101425. if (err == MP_OKAY) {
  101426. err = sp_256_ecc_mulmod_8(point, point, k, 0, 0, heap);
  101427. }
  101428. if (err == MP_OKAY) {
  101429. sp_256_proj_point_add_8(point, point, addP, tmp);
  101430. if (map) {
  101431. sp_256_map_8(point, point, tmp);
  101432. }
  101433. err = sp_256_point_to_ecc_point_8(point, r);
  101434. }
  101435. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  101436. if (k != NULL)
  101437. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  101438. if (point != NULL)
  101439. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  101440. #endif
  101441. return err;
  101442. }
  101443. #ifdef WOLFSSL_SP_SMALL
  101444. /* Striping precomputation table.
  101445. * 4 points combined into a table of 16 points.
  101446. * Distance of 64 between points.
  101447. */
  101448. static const sp_table_entry_256 p256_table[16] = {
  101449. /* 0 */
  101450. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  101451. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  101452. /* 1 */
  101453. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  101454. 0xa53755c6,0x18905f76 },
  101455. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  101456. 0x25885d85,0x8571ff18 } },
  101457. /* 2 */
  101458. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  101459. 0xfd1b667f,0x2f5e6961 },
  101460. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  101461. 0x8d6f0f7b,0xf648f916 } },
  101462. /* 3 */
  101463. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  101464. 0x133d0015,0x5abe0285 },
  101465. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  101466. 0x6b6f7383,0x94bb725b } },
  101467. /* 4 */
  101468. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  101469. 0x21d324f6,0x61d587d4 },
  101470. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  101471. 0x4621efbe,0xfa11fe12 } },
  101472. /* 5 */
  101473. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  101474. 0x1f13bedc,0x586eb04c },
  101475. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  101476. 0x70864f11,0x19d5ac08 } },
  101477. /* 6 */
  101478. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  101479. 0xc3b266b1,0xbb6de651 },
  101480. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  101481. 0x5d18b99b,0x60b4619a } },
  101482. /* 7 */
  101483. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  101484. 0xaeebffcd,0x9d0f27b2 },
  101485. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  101486. 0x356ec48d,0x244a566d } },
  101487. /* 8 */
  101488. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  101489. 0xcd42ab1b,0x803f3e02 },
  101490. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  101491. 0x5067adc1,0xc097440e } },
  101492. /* 9 */
  101493. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  101494. 0x915f1f30,0xf1af32d5 },
  101495. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  101496. 0xe2d41c8b,0x23d0f130 } },
  101497. /* 10 */
  101498. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  101499. 0x7990216a,0x50bbb4d9 },
  101500. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  101501. 0x01fe49c3,0x2b100118 } },
  101502. /* 11 */
  101503. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  101504. 0x83fbae0c,0xdd558999 },
  101505. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  101506. 0x149d6041,0xe6e4c551 } },
  101507. /* 12 */
  101508. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  101509. 0xdb7e63af,0xfad27148 },
  101510. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  101511. 0x9f0e1a84,0x77387de3 } },
  101512. /* 13 */
  101513. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  101514. 0xbef0c47e,0xb37b85c0 },
  101515. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  101516. 0xf9f628d5,0x9c135ac8 } },
  101517. /* 14 */
  101518. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  101519. 0x91ece900,0xc109f9cb },
  101520. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  101521. 0x2eee1ee1,0x9bc3344f } },
  101522. /* 15 */
  101523. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  101524. 0x5f1a4cc1,0x29591d52 },
  101525. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  101526. 0x18ef332c,0x6376551f } },
  101527. };
  101528. /* Multiply the base point of P256 by the scalar and return the result.
  101529. * If map is true then convert result to affine coordinates.
  101530. *
  101531. * Stripe implementation.
  101532. * Pre-generated: 2^0, 2^64, ...
  101533. * Pre-generated: products of all combinations of above.
  101534. * 4 doubles and adds (with qz=1)
  101535. *
  101536. * r Resulting point.
  101537. * k Scalar to multiply by.
  101538. * map Indicates whether to convert result to affine.
  101539. * ct Constant time required.
  101540. * heap Heap to use for allocation.
  101541. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  101542. */
  101543. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  101544. int map, int ct, void* heap)
  101545. {
  101546. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  101547. k, map, ct, heap);
  101548. }
  101549. #else
  101550. /* Striping precomputation table.
  101551. * 8 points combined into a table of 256 points.
  101552. * Distance of 32 between points.
  101553. */
  101554. static const sp_table_entry_256 p256_table[256] = {
  101555. /* 0 */
  101556. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  101557. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  101558. /* 1 */
  101559. { { 0x18a9143c,0x79e730d4,0x5fedb601,0x75ba95fc,0x77622510,0x79fb732b,
  101560. 0xa53755c6,0x18905f76 },
  101561. { 0xce95560a,0xddf25357,0xba19e45c,0x8b4ab8e4,0xdd21f325,0xd2e88688,
  101562. 0x25885d85,0x8571ff18 } },
  101563. /* 2 */
  101564. { { 0x4147519a,0x20288602,0x26b372f0,0xd0981eac,0xa785ebc8,0xa9d4a7ca,
  101565. 0xdbdf58e9,0xd953c50d },
  101566. { 0xfd590f8f,0x9d6361cc,0x44e6c917,0x72e9626b,0x22eb64cf,0x7fd96110,
  101567. 0x9eb288f3,0x863ebb7e } },
  101568. /* 3 */
  101569. { { 0x5cdb6485,0x7856b623,0x2f0a2f97,0x808f0ea2,0x4f7e300b,0x3e68d954,
  101570. 0xb5ff80a0,0x00076055 },
  101571. { 0x838d2010,0x7634eb9b,0x3243708a,0x54014fbb,0x842a6606,0xe0e47d39,
  101572. 0x34373ee0,0x83087761 } },
  101573. /* 4 */
  101574. { { 0x16a0d2bb,0x4f922fc5,0x1a623499,0x0d5cc16c,0x57c62c8b,0x9241cf3a,
  101575. 0xfd1b667f,0x2f5e6961 },
  101576. { 0xf5a01797,0x5c15c70b,0x60956192,0x3d20b44d,0x071fdb52,0x04911b37,
  101577. 0x8d6f0f7b,0xf648f916 } },
  101578. /* 5 */
  101579. { { 0xe137bbbc,0x9e566847,0x8a6a0bec,0xe434469e,0x79d73463,0xb1c42761,
  101580. 0x133d0015,0x5abe0285 },
  101581. { 0xc04c7dab,0x92aa837c,0x43260c07,0x573d9f4c,0x78e6cc37,0x0c931562,
  101582. 0x6b6f7383,0x94bb725b } },
  101583. /* 6 */
  101584. { { 0x720f141c,0xbbf9b48f,0x2df5bc74,0x6199b3cd,0x411045c4,0xdc3f6129,
  101585. 0x2f7dc4ef,0xcdd6bbcb },
  101586. { 0xeaf436fd,0xcca6700b,0xb99326be,0x6f647f6d,0x014f2522,0x0c0fa792,
  101587. 0x4bdae5f6,0xa361bebd } },
  101588. /* 7 */
  101589. { { 0x597c13c7,0x28aa2558,0x50b7c3e1,0xc38d635f,0xf3c09d1d,0x07039aec,
  101590. 0xc4b5292c,0xba12ca09 },
  101591. { 0x59f91dfd,0x9e408fa4,0xceea07fb,0x3af43b66,0x9d780b29,0x1eceb089,
  101592. 0x701fef4b,0x53ebb99d } },
  101593. /* 8 */
  101594. { { 0xb0e63d34,0x4fe7ee31,0xa9e54fab,0xf4600572,0xd5e7b5a4,0xc0493334,
  101595. 0x06d54831,0x8589fb92 },
  101596. { 0x6583553a,0xaa70f5cc,0xe25649e5,0x0879094a,0x10044652,0xcc904507,
  101597. 0x02541c4f,0xebb0696d } },
  101598. /* 9 */
  101599. { { 0xac1647c5,0x4616ca15,0xc4cf5799,0xb8127d47,0x764dfbac,0xdc666aa3,
  101600. 0xd1b27da3,0xeb2820cb },
  101601. { 0x6a87e008,0x9406f8d8,0x922378f3,0xd87dfa9d,0x80ccecb2,0x56ed2e42,
  101602. 0x55a7da1d,0x1f28289b } },
  101603. /* 10 */
  101604. { { 0x3b89da99,0xabbaa0c0,0xb8284022,0xa6f2d79e,0xb81c05e8,0x27847862,
  101605. 0x05e54d63,0x337a4b59 },
  101606. { 0x21f7794a,0x3c67500d,0x7d6d7f61,0x207005b7,0x04cfd6e8,0x0a5a3781,
  101607. 0xf4c2fbd6,0x0d65e0d5 } },
  101608. /* 11 */
  101609. { { 0xb5275d38,0xd9d09bbe,0x0be0a358,0x4268a745,0x973eb265,0xf0762ff4,
  101610. 0x52f4a232,0xc23da242 },
  101611. { 0x0b94520c,0x5da1b84f,0xb05bd78e,0x09666763,0x94d29ea1,0x3a4dcb86,
  101612. 0xc790cff1,0x19de3b8c } },
  101613. /* 12 */
  101614. { { 0x26c5fe04,0x183a716c,0x3bba1bdb,0x3b28de0b,0xa4cb712c,0x7432c586,
  101615. 0x91fccbfd,0xe34dcbd4 },
  101616. { 0xaaa58403,0xb408d46b,0x82e97a53,0x9a697486,0x36aaa8af,0x9e390127,
  101617. 0x7b4e0f7f,0xe7641f44 } },
  101618. /* 13 */
  101619. { { 0xdf64ba59,0x7d753941,0x0b0242fc,0xd33f10ec,0xa1581859,0x4f06dfc6,
  101620. 0x052a57bf,0x4a12df57 },
  101621. { 0x9439dbd0,0xbfa6338f,0xbde53e1f,0xd3c24bd4,0x21f1b314,0xfd5e4ffa,
  101622. 0xbb5bea46,0x6af5aa93 } },
  101623. /* 14 */
  101624. { { 0x10c91999,0xda10b699,0x2a580491,0x0a24b440,0xb8cc2090,0x3e0094b4,
  101625. 0x66a44013,0x5fe3475a },
  101626. { 0xf93e7b4b,0xb0f8cabd,0x7c23f91a,0x292b501a,0xcd1e6263,0x42e889ae,
  101627. 0xecfea916,0xb544e308 } },
  101628. /* 15 */
  101629. { { 0x16ddfdce,0x6478c6e9,0xf89179e6,0x2c329166,0x4d4e67e1,0x4e8d6e76,
  101630. 0xa6b0c20b,0xe0b6b2bd },
  101631. { 0xbb7efb57,0x0d312df2,0x790c4007,0x1aac0dde,0x679bc944,0xf90336ad,
  101632. 0x25a63774,0x71c023de } },
  101633. /* 16 */
  101634. { { 0xbfe20925,0x62a8c244,0x8fdce867,0x91c19ac3,0xdd387063,0x5a96a5d5,
  101635. 0x21d324f6,0x61d587d4 },
  101636. { 0xa37173ea,0xe87673a2,0x53778b65,0x23848008,0x05bab43e,0x10f8441e,
  101637. 0x4621efbe,0xfa11fe12 } },
  101638. /* 17 */
  101639. { { 0x2cb19ffd,0x1c891f2b,0xb1923c23,0x01ba8d5b,0x8ac5ca8e,0xb6d03d67,
  101640. 0x1f13bedc,0x586eb04c },
  101641. { 0x27e8ed09,0x0c35c6e5,0x1819ede2,0x1e81a33c,0x56c652fa,0x278fd6c0,
  101642. 0x70864f11,0x19d5ac08 } },
  101643. /* 18 */
  101644. { { 0x309a4e1f,0x1e99f581,0xe9270074,0xab7de71b,0xefd28d20,0x26a5ef0b,
  101645. 0x7f9c563f,0xe7c0073f },
  101646. { 0x0ef59f76,0x1f6d663a,0x20fcb050,0x669b3b54,0x7a6602d4,0xc08c1f7a,
  101647. 0xc65b3c0a,0xe08504fe } },
  101648. /* 19 */
  101649. { { 0xa031b3ca,0xf098f68d,0xe6da6d66,0x6d1cab9e,0x94f246e8,0x5bfd81fa,
  101650. 0x5b0996b4,0x78f01882 },
  101651. { 0x3a25787f,0xb7eefde4,0x1dccac9b,0x8016f80d,0xb35bfc36,0x0cea4877,
  101652. 0x7e94747a,0x43a773b8 } },
  101653. /* 20 */
  101654. { { 0xd2b533d5,0x62577734,0xa1bdddc0,0x673b8af6,0xa79ec293,0x577e7c9a,
  101655. 0xc3b266b1,0xbb6de651 },
  101656. { 0xb65259b3,0xe7e9303a,0xd03a7480,0xd6a0afd3,0x9b3cfc27,0xc5ac83d1,
  101657. 0x5d18b99b,0x60b4619a } },
  101658. /* 21 */
  101659. { { 0x1ae5aa1c,0xbd6a38e1,0x49e73658,0xb8b7652b,0xee5f87ed,0x0b130014,
  101660. 0xaeebffcd,0x9d0f27b2 },
  101661. { 0x7a730a55,0xca924631,0xddbbc83a,0x9c955b2f,0xac019a71,0x07c1dfe0,
  101662. 0x356ec48d,0x244a566d } },
  101663. /* 22 */
  101664. { { 0xeacf1f96,0x6db0394a,0x024c271c,0x9f2122a9,0x82cbd3b9,0x2626ac1b,
  101665. 0x3581ef69,0x45e58c87 },
  101666. { 0xa38f9dbc,0xd3ff479d,0xe888a040,0xa8aaf146,0x46e0bed7,0x945adfb2,
  101667. 0xc1e4b7a4,0xc040e21c } },
  101668. /* 23 */
  101669. { { 0x6f8117b6,0x847af000,0x73a35433,0x651969ff,0x1d9475eb,0x482b3576,
  101670. 0x682c6ec7,0x1cdf5c97 },
  101671. { 0x11f04839,0x7db775b4,0x48de1698,0x7dbeacf4,0xb70b3219,0xb2921dd1,
  101672. 0xa92dff3d,0x046755f8 } },
  101673. /* 24 */
  101674. { { 0xbce8ffcd,0xcc8ac5d2,0x2fe61a82,0x0d53c48b,0x7202d6c7,0xf6f16172,
  101675. 0x3b83a5f3,0x046e5e11 },
  101676. { 0xd8007f01,0xe7b8ff64,0x5af43183,0x7fb1ef12,0x35e1a03c,0x045c5ea6,
  101677. 0x303d005b,0x6e0106c3 } },
  101678. /* 25 */
  101679. { { 0x88dd73b1,0x48c73584,0x995ed0d9,0x7670708f,0xc56a2ab7,0x38385ea8,
  101680. 0xe901cf1f,0x442594ed },
  101681. { 0x12d4b65b,0xf8faa2c9,0x96c90c37,0x94c2343b,0x5e978d1f,0xd326e4a1,
  101682. 0x4c2ee68e,0xa796fa51 } },
  101683. /* 26 */
  101684. { { 0x823addd7,0x359fb604,0xe56693b3,0x9e2a6183,0x3cbf3c80,0xf885b78e,
  101685. 0xc69766e9,0xe4ad2da9 },
  101686. { 0x8e048a61,0x357f7f42,0xc092d9a0,0x082d198c,0xc03ed8ef,0xfc3a1af4,
  101687. 0xc37b5143,0xc5e94046 } },
  101688. /* 27 */
  101689. { { 0x2be75f9e,0x476a538c,0xcb123a78,0x6fd1a9e8,0xb109c04b,0xd85e4df0,
  101690. 0xdb464747,0x63283daf },
  101691. { 0xbaf2df15,0xce728cf7,0x0ad9a7f4,0xe592c455,0xe834bcc3,0xfab226ad,
  101692. 0x1981a938,0x68bd19ab } },
  101693. /* 28 */
  101694. { { 0x1887d659,0xc08ead51,0xb359305a,0x3374d5f4,0xcfe74fe3,0x96986981,
  101695. 0x3c6fdfd6,0x495292f5 },
  101696. { 0x1acec896,0x4a878c9e,0xec5b4484,0xd964b210,0x664d60a7,0x6696f7e2,
  101697. 0x26036837,0x0ec7530d } },
  101698. /* 29 */
  101699. { { 0xad2687bb,0x2da13a05,0xf32e21fa,0xa1f83b6a,0x1dd4607b,0x390f5ef5,
  101700. 0x64863f0b,0x0f6207a6 },
  101701. { 0x0f138233,0xbd67e3bb,0x272aa718,0xdd66b96c,0x26ec88ae,0x8ed00407,
  101702. 0x08ed6dcf,0xff0db072 } },
  101703. /* 30 */
  101704. { { 0x4c95d553,0x749fa101,0x5d680a8a,0xa44052fd,0xff3b566f,0x183b4317,
  101705. 0x88740ea3,0x313b513c },
  101706. { 0x08d11549,0xb402e2ac,0xb4dee21c,0x071ee10b,0x47f2320e,0x26b987dd,
  101707. 0x86f19f81,0x2d3abcf9 } },
  101708. /* 31 */
  101709. { { 0x815581a2,0x4c288501,0x632211af,0x9a0a6d56,0x0cab2e99,0x19ba7a0f,
  101710. 0xded98cdf,0xc036fa10 },
  101711. { 0xc1fbd009,0x29ae08ba,0x06d15816,0x0b68b190,0x9b9e0d8f,0xc2eb3277,
  101712. 0xb6d40194,0xa6b2a2c4 } },
  101713. /* 32 */
  101714. { { 0x6d3549cf,0xd433e50f,0xfacd665e,0x6f33696f,0xce11fcb4,0x695bfdac,
  101715. 0xaf7c9860,0x810ee252 },
  101716. { 0x7159bb2c,0x65450fe1,0x758b357b,0xf7dfbebe,0xd69fea72,0x2b057e74,
  101717. 0x92731745,0xd485717a } },
  101718. /* 33 */
  101719. { { 0xf0cb5a98,0x11741a8a,0x1f3110bf,0xd3da8f93,0xab382adf,0x1994e2cb,
  101720. 0x2f9a604e,0x6a6045a7 },
  101721. { 0xa2b2411d,0x170c0d3f,0x510e96e0,0xbe0eb83e,0x8865b3cc,0x3bcc9f73,
  101722. 0xf9e15790,0xd3e45cfa } },
  101723. /* 34 */
  101724. { { 0xe83f7669,0xce1f69bb,0x72877d6b,0x09f8ae82,0x3244278d,0x9548ae54,
  101725. 0xe3c2c19c,0x207755de },
  101726. { 0x6fef1945,0x87bd61d9,0xb12d28c3,0x18813cef,0x72df64aa,0x9fbcd1d6,
  101727. 0x7154b00d,0x48dc5ee5 } },
  101728. /* 35 */
  101729. { { 0xf7e5a199,0x123790bf,0x989ccbb7,0xe0efb8cf,0x0a519c79,0xc27a2bfe,
  101730. 0xdff6f445,0xf2fb0aed },
  101731. { 0xf0b5025f,0x41c09575,0x40fa9f22,0x550543d7,0x380bfbd0,0x8fa3c8ad,
  101732. 0xdb28d525,0xa13e9015 } },
  101733. /* 36 */
  101734. { { 0xa2b65cbc,0xf9f7a350,0x2a464226,0x0b04b972,0xe23f07a1,0x265ce241,
  101735. 0x1497526f,0x2bf0d6b0 },
  101736. { 0x4b216fb7,0xd3d4dd3f,0xfbdda26a,0xf7d7b867,0x6708505c,0xaeb7b83f,
  101737. 0x162fe89f,0x42a94a5a } },
  101738. /* 37 */
  101739. { { 0xeaadf191,0x5846ad0b,0x25a268d7,0x0f8a4890,0x494dc1f6,0xe8603050,
  101740. 0xc65ede3d,0x2c2dd969 },
  101741. { 0x93849c17,0x6d02171d,0x1da250dd,0x460488ba,0x3c3a5485,0x4810c706,
  101742. 0x42c56dbc,0xf437fa1f } },
  101743. /* 38 */
  101744. { { 0x4a0f7dab,0x6aa0d714,0x1776e9ac,0x0f049793,0xf5f39786,0x52c0a050,
  101745. 0x54707aa8,0xaaf45b33 },
  101746. { 0xc18d364a,0x85e37c33,0x3e497165,0xd40b9b06,0x15ec5444,0xf4171681,
  101747. 0xf4f272bc,0xcdf6310d } },
  101748. /* 39 */
  101749. { { 0x8ea8b7ef,0x7473c623,0x85bc2287,0x08e93518,0x2bda8e34,0x41956772,
  101750. 0xda9e2ff2,0xf0d008ba },
  101751. { 0x2414d3b1,0x2912671d,0xb019ea76,0xb3754985,0x453bcbdb,0x5c61b96d,
  101752. 0xca887b8b,0x5bd5c2f5 } },
  101753. /* 40 */
  101754. { { 0xf49a3154,0xef0f469e,0x6e2b2e9a,0x3e85a595,0xaa924a9c,0x45aaec1e,
  101755. 0xa09e4719,0xaa12dfc8 },
  101756. { 0x4df69f1d,0x26f27227,0xa2ff5e73,0xe0e4c82c,0xb7a9dd44,0xb9d8ce73,
  101757. 0xe48ca901,0x6c036e73 } },
  101758. /* 41 */
  101759. { { 0x0f6e3138,0x5cfae12a,0x25ad345a,0x6966ef00,0x45672bc5,0x8993c64b,
  101760. 0x96afbe24,0x292ff658 },
  101761. { 0x5e213402,0xd5250d44,0x4392c9fe,0xf6580e27,0xda1c72e8,0x097b397f,
  101762. 0x311b7276,0x644e0c90 } },
  101763. /* 42 */
  101764. { { 0xa47153f0,0xe1e421e1,0x920418c9,0xb86c3b79,0x705d7672,0x93bdce87,
  101765. 0xcab79a77,0xf25ae793 },
  101766. { 0x6d869d0c,0x1f3194a3,0x4986c264,0x9d55c882,0x096e945e,0x49fb5ea3,
  101767. 0x13db0a3e,0x39b8e653 } },
  101768. /* 43 */
  101769. { { 0xb6fd2e59,0x37754200,0x9255c98f,0x35e2c066,0x0e2a5739,0xd9dab21a,
  101770. 0x0f19db06,0x39122f2f },
  101771. { 0x03cad53c,0xcfbce1e0,0xe65c17e3,0x225b2c0f,0x9aa13877,0x72baf1d2,
  101772. 0xce80ff8d,0x8de80af8 } },
  101773. /* 44 */
  101774. { { 0x207bbb76,0xafbea8d9,0x21782758,0x921c7e7c,0x1c0436b1,0xdfa2b74b,
  101775. 0x2e368c04,0x87194906 },
  101776. { 0xa3993df5,0xb5f928bb,0xf3b3d26a,0x639d75b5,0x85b55050,0x011aa78a,
  101777. 0x5b74fde1,0xfc315e6a } },
  101778. /* 45 */
  101779. { { 0xe8d6ecfa,0x561fd41a,0x1aec7f86,0x5f8c44f6,0x4924741d,0x98452a7b,
  101780. 0xee389088,0xe6d4a7ad },
  101781. { 0x4593c75d,0x60552ed1,0xdd271162,0x70a70da4,0x7ba2c7db,0xd2aede93,
  101782. 0x9be2ae57,0x35dfaf9a } },
  101783. /* 46 */
  101784. { { 0xaa736636,0x6b956fcd,0xae2cab7e,0x09f51d97,0x0f349966,0xfb10bf41,
  101785. 0x1c830d2b,0x1da5c7d7 },
  101786. { 0x3cce6825,0x5c41e483,0xf9573c3b,0x15ad118f,0xf23036b8,0xa28552c7,
  101787. 0xdbf4b9d6,0x7077c0fd } },
  101788. /* 47 */
  101789. { { 0x46b9661c,0xbf63ff8d,0x0d2cfd71,0xa1dfd36b,0xa847f8f7,0x0373e140,
  101790. 0xe50efe44,0x53a8632e },
  101791. { 0x696d8051,0x0976ff68,0xc74f468a,0xdaec0c95,0x5e4e26bd,0x62994dc3,
  101792. 0x34e1fcc1,0x028ca76d } },
  101793. /* 48 */
  101794. { { 0xfc9877ee,0xd11d47dc,0x801d0002,0xc8b36210,0x54c260b6,0xd002c117,
  101795. 0x6962f046,0x04c17cd8 },
  101796. { 0xb0daddf5,0x6d9bd094,0x24ce55c0,0xbea23575,0x72da03b5,0x663356e6,
  101797. 0xfed97474,0xf7ba4de9 } },
  101798. /* 49 */
  101799. { { 0xebe1263f,0xd0dbfa34,0x71ae7ce6,0x55763735,0x82a6f523,0xd2440553,
  101800. 0x52131c41,0xe31f9600 },
  101801. { 0xea6b6ec6,0xd1bb9216,0x73c2fc44,0x37a1d12e,0x89d0a294,0xc10e7eac,
  101802. 0xce34d47b,0xaa3a6259 } },
  101803. /* 50 */
  101804. { { 0x36f3dcd3,0xfbcf9df5,0xd2bf7360,0x6ceded50,0xdf504f5b,0x491710fa,
  101805. 0x7e79daee,0x2398dd62 },
  101806. { 0x6d09569e,0xcf4705a3,0x5149f769,0xea0619bb,0x35f6034c,0xff9c0377,
  101807. 0x1c046210,0x5717f5b2 } },
  101808. /* 51 */
  101809. { { 0x21dd895e,0x9fe229c9,0x40c28451,0x8e518500,0x1d637ecd,0xfa13d239,
  101810. 0x0e3c28de,0x660a2c56 },
  101811. { 0xd67fcbd0,0x9cca88ae,0x0ea9f096,0xc8472478,0x72e92b4d,0x32b2f481,
  101812. 0x4f522453,0x624ee54c } },
  101813. /* 52 */
  101814. { { 0xd897eccc,0x09549ce4,0x3f9880aa,0x4d49d1d9,0x043a7c20,0x723c2423,
  101815. 0x92bdfbc0,0x4f392afb },
  101816. { 0x7de44fd9,0x6969f8fa,0x57b32156,0xb66cfbe4,0x368ebc3c,0xdb2fa803,
  101817. 0xccdb399c,0x8a3e7977 } },
  101818. /* 53 */
  101819. { { 0x06c4b125,0xdde1881f,0xf6e3ca8c,0xae34e300,0x5c7a13e9,0xef6999de,
  101820. 0x70c24404,0x3888d023 },
  101821. { 0x44f91081,0x76280356,0x5f015504,0x3d9fcf61,0x632cd36e,0x1827edc8,
  101822. 0x18102336,0xa5e62e47 } },
  101823. /* 54 */
  101824. { { 0x2facd6c8,0x1a825ee3,0x54bcbc66,0x699c6354,0x98df9931,0x0ce3edf7,
  101825. 0x466a5adc,0x2c4768e6 },
  101826. { 0x90a64bc9,0xb346ff8c,0xe4779f5c,0x630a6020,0xbc05e884,0xd949d064,
  101827. 0xf9e652a0,0x7b5e6441 } },
  101828. /* 55 */
  101829. { { 0x1d28444a,0x2169422c,0xbe136a39,0xe996c5d8,0xfb0c7fce,0x2387afe5,
  101830. 0x0c8d744a,0xb8af73cb },
  101831. { 0x338b86fd,0x5fde83aa,0xa58a5cff,0xfee3f158,0x20ac9433,0xc9ee8f6f,
  101832. 0x7f3f0895,0xa036395f } },
  101833. /* 56 */
  101834. { { 0xa10f7770,0x8c73c6bb,0xa12a0e24,0xa6f16d81,0x51bc2b9f,0x100df682,
  101835. 0x875fb533,0x4be36b01 },
  101836. { 0x9fb56dbb,0x9226086e,0x07e7a4f8,0x306fef8b,0x66d52f20,0xeeaccc05,
  101837. 0x1bdc00c0,0x8cbc9a87 } },
  101838. /* 57 */
  101839. { { 0xc0dac4ab,0xe131895c,0x712ff112,0xa874a440,0x6a1cee57,0x6332ae7c,
  101840. 0x0c0835f8,0x44e7553e },
  101841. { 0x7734002d,0x6d503fff,0x0b34425c,0x9d35cb8b,0x0e8738b5,0x95f70276,
  101842. 0x5eb8fc18,0x470a683a } },
  101843. /* 58 */
  101844. { { 0x90513482,0x81b761dc,0x01e9276a,0x0287202a,0x0ce73083,0xcda441ee,
  101845. 0xc63dc6ef,0x16410690 },
  101846. { 0x6d06a2ed,0xf5034a06,0x189b100b,0xdd4d7745,0xab8218c9,0xd914ae72,
  101847. 0x7abcbb4f,0xd73479fd } },
  101848. /* 59 */
  101849. { { 0x5ad4c6e5,0x7edefb16,0x5b06d04d,0x262cf08f,0x8575cb14,0x12ed5bb1,
  101850. 0x0771666b,0x816469e3 },
  101851. { 0x561e291e,0xd7ab9d79,0xc1de1661,0xeb9daf22,0x135e0513,0xf49827eb,
  101852. 0xf0dd3f9c,0x0a36dd23 } },
  101853. /* 60 */
  101854. { { 0x41d5533c,0x098d32c7,0x8684628f,0x7c5f5a9e,0xe349bd11,0x39a228ad,
  101855. 0xfdbab118,0xe331dfd6 },
  101856. { 0x6bcc6ed8,0x5100ab68,0xef7a260e,0x7160c3bd,0xbce850d7,0x9063d9a7,
  101857. 0x492e3389,0xd3b4782a } },
  101858. /* 61 */
  101859. { { 0xf3821f90,0xa149b6e8,0x66eb7aad,0x92edd9ed,0x1a013116,0x0bb66953,
  101860. 0x4c86a5bd,0x7281275a },
  101861. { 0xd3ff47e5,0x503858f7,0x61016441,0x5e1616bc,0x7dfd9bb1,0x62b0f11a,
  101862. 0xce145059,0x2c062e7e } },
  101863. /* 62 */
  101864. { { 0x0159ac2e,0xa76f996f,0xcbdb2713,0x281e7736,0x08e46047,0x2ad6d288,
  101865. 0x2c4e7ef1,0x282a35f9 },
  101866. { 0xc0ce5cd2,0x9c354b1e,0x1379c229,0xcf99efc9,0x3e82c11e,0x992caf38,
  101867. 0x554d2abd,0xc71cd513 } },
  101868. /* 63 */
  101869. { { 0x09b578f4,0x4885de9c,0xe3affa7a,0x1884e258,0x59182f1f,0x8f76b1b7,
  101870. 0xcf47f3a3,0xc50f6740 },
  101871. { 0x374b68ea,0xa9c4adf3,0x69965fe2,0xa406f323,0x85a53050,0x2f86a222,
  101872. 0x212958dc,0xb9ecb3a7 } },
  101873. /* 64 */
  101874. { { 0xf4f8b16a,0x56f8410e,0xc47b266a,0x97241afe,0x6d9c87c1,0x0a406b8e,
  101875. 0xcd42ab1b,0x803f3e02 },
  101876. { 0x04dbec69,0x7f0309a8,0x3bbad05f,0xa83b85f7,0xad8e197f,0xc6097273,
  101877. 0x5067adc1,0xc097440e } },
  101878. /* 65 */
  101879. { { 0xc379ab34,0x846a56f2,0x841df8d1,0xa8ee068b,0x176c68ef,0x20314459,
  101880. 0x915f1f30,0xf1af32d5 },
  101881. { 0x5d75bd50,0x99c37531,0xf72f67bc,0x837cffba,0x48d7723f,0x0613a418,
  101882. 0xe2d41c8b,0x23d0f130 } },
  101883. /* 66 */
  101884. { { 0xf41500d9,0x857ab6ed,0xfcbeada8,0x0d890ae5,0x89725951,0x52fe8648,
  101885. 0xc0a3fadd,0xb0288dd6 },
  101886. { 0x650bcb08,0x85320f30,0x695d6e16,0x71af6313,0xb989aa76,0x31f520a7,
  101887. 0xf408c8d2,0xffd3724f } },
  101888. /* 67 */
  101889. { { 0xb458e6cb,0x53968e64,0x317a5d28,0x992dad20,0x7aa75f56,0x3814ae0b,
  101890. 0xd78c26df,0xf5590f4a },
  101891. { 0xcf0ba55a,0x0fc24bd3,0x0c778bae,0x0fc4724a,0x683b674a,0x1ce9864f,
  101892. 0xf6f74a20,0x18d6da54 } },
  101893. /* 68 */
  101894. { { 0xd5be5a2b,0xed93e225,0x5934f3c6,0x6fe79983,0x22626ffc,0x43140926,
  101895. 0x7990216a,0x50bbb4d9 },
  101896. { 0xe57ec63e,0x378191c6,0x181dcdb2,0x65422c40,0x0236e0f6,0x41a8099b,
  101897. 0x01fe49c3,0x2b100118 } },
  101898. /* 69 */
  101899. { { 0x9b391593,0xfc68b5c5,0x598270fc,0xc385f5a2,0xd19adcbb,0x7144f3aa,
  101900. 0x83fbae0c,0xdd558999 },
  101901. { 0x74b82ff4,0x93b88b8e,0x71e734c9,0xd2e03c40,0x43c0322a,0x9a7a9eaf,
  101902. 0x149d6041,0xe6e4c551 } },
  101903. /* 70 */
  101904. { { 0x1e9af288,0x55f655bb,0xf7ada931,0x647e1a64,0xcb2820e5,0x43697e4b,
  101905. 0x07ed56ff,0x51e00db1 },
  101906. { 0x771c327e,0x43d169b8,0x4a96c2ad,0x29cdb20b,0x3deb4779,0xc07d51f5,
  101907. 0x49829177,0xe22f4241 } },
  101908. /* 71 */
  101909. { { 0x635f1abb,0xcd45e8f4,0x68538874,0x7edc0cb5,0xb5a8034d,0xc9472c1f,
  101910. 0x52dc48c9,0xf709373d },
  101911. { 0xa8af30d6,0x401966bb,0xf137b69c,0x95bf5f4a,0x9361c47e,0x3966162a,
  101912. 0xe7275b11,0xbd52d288 } },
  101913. /* 72 */
  101914. { { 0x9c5fa877,0xab155c7a,0x7d3a3d48,0x17dad672,0x73d189d8,0x43f43f9e,
  101915. 0xc8aa77a6,0xa0d0f8e4 },
  101916. { 0xcc94f92d,0x0bbeafd8,0x0c4ddb3a,0xd818c8be,0xb82eba14,0x22cc65f8,
  101917. 0x946d6a00,0xa56c78c7 } },
  101918. /* 73 */
  101919. { { 0x0dd09529,0x2962391b,0x3daddfcf,0x803e0ea6,0x5b5bf481,0x2c77351f,
  101920. 0x731a367a,0xd8befdf8 },
  101921. { 0xfc0157f4,0xab919d42,0xfec8e650,0xf51caed7,0x02d48b0a,0xcdf9cb40,
  101922. 0xce9f6478,0x854a68a5 } },
  101923. /* 74 */
  101924. { { 0x63506ea5,0xdc35f67b,0xa4fe0d66,0x9286c489,0xfe95cd4d,0x3f101d3b,
  101925. 0x98846a95,0x5cacea0b },
  101926. { 0x9ceac44d,0xa90df60c,0x354d1c3a,0x3db29af4,0xad5dbabe,0x08dd3de8,
  101927. 0x35e4efa9,0xe4982d12 } },
  101928. /* 75 */
  101929. { { 0xc34cd55e,0x23104a22,0x2680d132,0x58695bb3,0x1fa1d943,0xfb345afa,
  101930. 0x16b20499,0x8046b7f6 },
  101931. { 0x38e7d098,0xb533581e,0xf46f0b70,0xd7f61e8d,0x44cb78c4,0x30dea9ea,
  101932. 0x9082af55,0xeb17ca7b } },
  101933. /* 76 */
  101934. { { 0x76a145b9,0x1751b598,0xc1bc71ec,0xa5cf6b0f,0x392715bb,0xd3e03565,
  101935. 0xfab5e131,0x097b00ba },
  101936. { 0x565f69e1,0xaa66c8e9,0xb5be5199,0x77e8f75a,0xda4fd984,0x6033ba11,
  101937. 0xafdbcc9e,0xf95c747b } },
  101938. /* 77 */
  101939. { { 0xbebae45e,0x558f01d3,0xc4bc6955,0xa8ebe9f0,0xdbc64fc6,0xaeb705b1,
  101940. 0x566ed837,0x3512601e },
  101941. { 0xfa1161cd,0x9336f1e1,0x4c65ef87,0x328ab8d5,0x724f21e5,0x4757eee2,
  101942. 0x6068ab6b,0x0ef97123 } },
  101943. /* 78 */
  101944. { { 0x54ca4226,0x02598cf7,0xf8642c8e,0x5eede138,0x468e1790,0x48963f74,
  101945. 0x3b4fbc95,0xfc16d933 },
  101946. { 0xe7c800ca,0xbe96fb31,0x2678adaa,0x13806331,0x6ff3e8b5,0x3d624497,
  101947. 0xb95d7a17,0x14ca4af1 } },
  101948. /* 79 */
  101949. { { 0xbd2f81d5,0x7a4771ba,0x01f7d196,0x1a5f9d69,0xcad9c907,0xd898bef7,
  101950. 0xf59c231d,0x4057b063 },
  101951. { 0x89c05c0a,0xbffd82fe,0x1dc0df85,0xe4911c6f,0xa35a16db,0x3befccae,
  101952. 0xf1330b13,0x1c3b5d64 } },
  101953. /* 80 */
  101954. { { 0x80ec21fe,0x5fe14bfe,0xc255be82,0xf6ce116a,0x2f4a5d67,0x98bc5a07,
  101955. 0xdb7e63af,0xfad27148 },
  101956. { 0x29ab05b3,0x90c0b6ac,0x4e251ae6,0x37a9a83c,0xc2aade7d,0x0a7dc875,
  101957. 0x9f0e1a84,0x77387de3 } },
  101958. /* 81 */
  101959. { { 0xa56c0dd7,0x1e9ecc49,0x46086c74,0xa5cffcd8,0xf505aece,0x8f7a1408,
  101960. 0xbef0c47e,0xb37b85c0 },
  101961. { 0xcc0e6a8f,0x3596b6e4,0x6b388f23,0xfd6d4bbf,0xc39cef4e,0xaba453fa,
  101962. 0xf9f628d5,0x9c135ac8 } },
  101963. /* 82 */
  101964. { { 0x84e35743,0x32aa3202,0x85a3cdef,0x320d6ab1,0x1df19819,0xb821b176,
  101965. 0xc433851f,0x5721361f },
  101966. { 0x71fc9168,0x1f0db36a,0x5e5c403c,0x5f98ba73,0x37bcd8f5,0xf64ca87e,
  101967. 0xe6bb11bd,0xdcbac3c9 } },
  101968. /* 83 */
  101969. { { 0x4518cbe2,0xf01d9968,0x9c9eb04e,0xd242fc18,0xe47feebf,0x727663c7,
  101970. 0x2d626862,0xb8c1c89e },
  101971. { 0xc8e1d569,0x51a58bdd,0xb7d88cd0,0x563809c8,0xf11f31eb,0x26c27fd9,
  101972. 0x2f9422d4,0x5d23bbda } },
  101973. /* 84 */
  101974. { { 0x95c8f8be,0x0a1c7294,0x3bf362bf,0x2961c480,0xdf63d4ac,0x9e418403,
  101975. 0x91ece900,0xc109f9cb },
  101976. { 0x58945705,0xc2d095d0,0xddeb85c0,0xb9083d96,0x7a40449b,0x84692b8d,
  101977. 0x2eee1ee1,0x9bc3344f } },
  101978. /* 85 */
  101979. { { 0x42913074,0x0d5ae356,0x48a542b1,0x55491b27,0xb310732a,0x469ca665,
  101980. 0x5f1a4cc1,0x29591d52 },
  101981. { 0xb84f983f,0xe76f5b6b,0x9f5f84e1,0xbe7eef41,0x80baa189,0x1200d496,
  101982. 0x18ef332c,0x6376551f } },
  101983. /* 86 */
  101984. { { 0x562976cc,0xbda5f14e,0x0ef12c38,0x22bca3e6,0x6cca9852,0xbbfa3064,
  101985. 0x08e2987a,0xbdb79dc8 },
  101986. { 0xcb06a772,0xfd2cb5c9,0xfe536dce,0x38f475aa,0x7c2b5db8,0xc2a3e022,
  101987. 0xadd3c14a,0x8ee86001 } },
  101988. /* 87 */
  101989. { { 0xa4ade873,0xcbe96981,0xc4fba48c,0x7ee9aa4d,0x5a054ba5,0x2cee2899,
  101990. 0x6f77aa4b,0x92e51d7a },
  101991. { 0x7190a34d,0x948bafa8,0xf6bd1ed1,0xd698f75b,0x0caf1144,0xd00ee6e3,
  101992. 0x0a56aaaa,0x5182f86f } },
  101993. /* 88 */
  101994. { { 0x7a4cc99c,0xfba6212c,0x3e6d9ca1,0xff609b68,0x5ac98c5a,0x5dbb27cb,
  101995. 0x4073a6f2,0x91dcab5d },
  101996. { 0x5f575a70,0x01b6cc3d,0x6f8d87fa,0x0cb36139,0x89981736,0x165d4e8c,
  101997. 0x97974f2b,0x17a0cedb } },
  101998. /* 89 */
  101999. { { 0x076c8d3a,0x38861e2a,0x210f924b,0x701aad39,0x13a835d9,0x94d0eae4,
  102000. 0x7f4cdf41,0x2e8ce36c },
  102001. { 0x037a862b,0x91273dab,0x60e4c8fa,0x01ba9bb7,0x33baf2dd,0xf9645388,
  102002. 0x34f668f3,0xf4ccc6cb } },
  102003. /* 90 */
  102004. { { 0xf1f79687,0x44ef525c,0x92efa815,0x7c595495,0xa5c78d29,0xe1231741,
  102005. 0x9a0df3c9,0xac0db488 },
  102006. { 0xdf01747f,0x86bfc711,0xef17df13,0x592b9358,0x5ccb6bb5,0xe5880e4f,
  102007. 0x94c974a2,0x95a64a61 } },
  102008. /* 91 */
  102009. { { 0xc15a4c93,0x72c1efda,0x82585141,0x40269b73,0x16cb0bad,0x6a8dfb1c,
  102010. 0x29210677,0x231e54ba },
  102011. { 0x8ae6d2dc,0xa70df917,0x39112918,0x4d6aa63f,0x5e5b7223,0xf627726b,
  102012. 0xd8a731e1,0xab0be032 } },
  102013. /* 92 */
  102014. { { 0x8d131f2d,0x097ad0e9,0x3b04f101,0x637f09e3,0xd5e9a748,0x1ac86196,
  102015. 0x2cf6a679,0xf1bcc880 },
  102016. { 0xe8daacb4,0x25c69140,0x60f65009,0x3c4e4055,0x477937a6,0x591cc8fc,
  102017. 0x5aebb271,0x85169469 } },
  102018. /* 93 */
  102019. { { 0xf1dcf593,0xde35c143,0xb018be3b,0x78202b29,0x9bdd9d3d,0xe9cdadc2,
  102020. 0xdaad55d8,0x8f67d9d2 },
  102021. { 0x7481ea5f,0x84111656,0xe34c590c,0xe7d2dde9,0x05053fa8,0xffdd43f4,
  102022. 0xc0728b5d,0xf84572b9 } },
  102023. /* 94 */
  102024. { { 0x97af71c9,0x5e1a7a71,0x7a736565,0xa1449444,0x0e1d5063,0xa1b4ae07,
  102025. 0x616b2c19,0xedee2710 },
  102026. { 0x11734121,0xb2f034f5,0x4a25e9f0,0x1cac6e55,0xa40c2ecf,0x8dc148f3,
  102027. 0x44ebd7f4,0x9fd27e9b } },
  102028. /* 95 */
  102029. { { 0xf6e2cb16,0x3cc7658a,0xfe5919b6,0xe3eb7d2c,0x168d5583,0x5a8c5816,
  102030. 0x958ff387,0xa40c2fb6 },
  102031. { 0xfedcc158,0x8c9ec560,0x55f23056,0x7ad804c6,0x9a307e12,0xd9396704,
  102032. 0x7dc6decf,0x99bc9bb8 } },
  102033. /* 96 */
  102034. { { 0x927dafc6,0x84a9521d,0x5c09cd19,0x52c1fb69,0xf9366dde,0x9d9581a0,
  102035. 0xa16d7e64,0x9abe210b },
  102036. { 0x48915220,0x480af84a,0x4dd816c6,0xfa73176a,0x1681ca5a,0xc7d53987,
  102037. 0x87f344b0,0x7881c257 } },
  102038. /* 97 */
  102039. { { 0xe0bcf3ff,0x93399b51,0x127f74f6,0x0d02cbc5,0xdd01d968,0x8fb465a2,
  102040. 0xa30e8940,0x15e6e319 },
  102041. { 0x3e0e05f4,0x646d6e0d,0x43588404,0xfad7bddc,0xc4f850d3,0xbe61c7d1,
  102042. 0x191172ce,0x0e55facf } },
  102043. /* 98 */
  102044. { { 0xf8787564,0x7e9d9806,0x31e85ce6,0x1a331721,0xb819e8d6,0x6b0158ca,
  102045. 0x6fe96577,0xd73d0976 },
  102046. { 0x1eb7206e,0x42483425,0xc618bb42,0xa519290f,0x5e30a520,0x5dcbb859,
  102047. 0x8f15a50b,0x9250a374 } },
  102048. /* 99 */
  102049. { { 0xbe577410,0xcaff08f8,0x5077a8c6,0xfd408a03,0xec0a63a4,0xf1f63289,
  102050. 0xc1cc8c0b,0x77414082 },
  102051. { 0xeb0991cd,0x05a40fa6,0x49fdc296,0xc1ca0866,0xb324fd40,0x3a68a3c7,
  102052. 0x12eb20b9,0x8cb04f4d } },
  102053. /* 100 */
  102054. { { 0x6906171c,0xb1c2d055,0xb0240c3f,0x9073e9cd,0xd8906841,0xdb8e6b4f,
  102055. 0x47123b51,0xe4e429ef },
  102056. { 0x38ec36f4,0x0b8dd53c,0xff4b6a27,0xf9d2dc01,0x879a9a48,0x5d066e07,
  102057. 0x3c6e6552,0x37bca2ff } },
  102058. /* 101 */
  102059. { { 0xdf562470,0x4cd2e3c7,0xc0964ac9,0x44f272a2,0x80c793be,0x7c6d5df9,
  102060. 0x3002b22a,0x59913edc },
  102061. { 0x5750592a,0x7a139a83,0xe783de02,0x99e01d80,0xea05d64f,0xcf8c0375,
  102062. 0xb013e226,0x43786e4a } },
  102063. /* 102 */
  102064. { { 0x9e56b5a6,0xff32b0ed,0xd9fc68f9,0x0750d9a6,0x597846a7,0xec15e845,
  102065. 0xb7e79e7a,0x8638ca98 },
  102066. { 0x0afc24b2,0x2f5ae096,0x4dace8f2,0x05398eaf,0xaecba78f,0x3b765dd0,
  102067. 0x7b3aa6f0,0x1ecdd36a } },
  102068. /* 103 */
  102069. { { 0x6c5ff2f3,0x5d3acd62,0x2873a978,0xa2d516c0,0xd2110d54,0xad94c9fa,
  102070. 0xd459f32d,0xd85d0f85 },
  102071. { 0x10b11da3,0x9f700b8d,0xa78318c4,0xd2c22c30,0x9208decd,0x556988f4,
  102072. 0xb4ed3c62,0xa04f19c3 } },
  102073. /* 104 */
  102074. { { 0xed7f93bd,0x087924c8,0x392f51f6,0xcb64ac5d,0x821b71af,0x7cae330a,
  102075. 0x5c0950b0,0x92b2eeea },
  102076. { 0x85b6e235,0x85ac4c94,0x2936c0f0,0xab2ca4a9,0xe0508891,0x80faa6b3,
  102077. 0x5834276c,0x1ee78221 } },
  102078. /* 105 */
  102079. { { 0xe63e79f7,0xa60a2e00,0xf399d906,0xf590e7b2,0x6607c09d,0x9021054a,
  102080. 0x57a6e150,0xf3f2ced8 },
  102081. { 0xf10d9b55,0x200510f3,0xd8642648,0x9d2fcfac,0xe8bd0e7c,0xe5631aa7,
  102082. 0x3da3e210,0x0f56a454 } },
  102083. /* 106 */
  102084. { { 0x1043e0df,0x5b21bffa,0x9c007e6d,0x6c74b6cc,0xd4a8517a,0x1a656ec0,
  102085. 0x1969e263,0xbd8f1741 },
  102086. { 0xbeb7494a,0x8a9bbb86,0x45f3b838,0x1567d46f,0xa4e5a79a,0xdf7a12a7,
  102087. 0x30ccfa09,0x2d1a1c35 } },
  102088. /* 107 */
  102089. { { 0x506508da,0x192e3813,0xa1d795a7,0x336180c4,0x7a9944b3,0xcddb5949,
  102090. 0xb91fba46,0xa107a65e },
  102091. { 0x0f94d639,0xe6d1d1c5,0x8a58b7d7,0x8b4af375,0xbd37ca1c,0x1a7c5584,
  102092. 0xf87a9af2,0x183d760a } },
  102093. /* 108 */
  102094. { { 0x0dde59a4,0x29d69711,0x0e8bef87,0xf1ad8d07,0x4f2ebe78,0x229b4963,
  102095. 0xc269d754,0x1d44179d },
  102096. { 0x8390d30e,0xb32dc0cf,0x0de8110c,0x0a3b2753,0x2bc0339a,0x31af1dc5,
  102097. 0x9606d262,0x771f9cc2 } },
  102098. /* 109 */
  102099. { { 0x85040739,0x99993e77,0x8026a939,0x44539db9,0xf5f8fc26,0xcf40f6f2,
  102100. 0x0362718e,0x64427a31 },
  102101. { 0x85428aa8,0x4f4f2d87,0xebfb49a8,0x7b7adc3f,0xf23d01ac,0x201b2c6d,
  102102. 0x6ae90d6d,0x49d9b749 } },
  102103. /* 110 */
  102104. { { 0x435d1099,0xcc78d8bc,0x8e8d1a08,0x2adbcd4e,0x2cb68a41,0x02c2e2a0,
  102105. 0x3f605445,0x9037d81b },
  102106. { 0x074c7b61,0x7cdbac27,0x57bfd72e,0xfe2031ab,0x596d5352,0x61ccec96,
  102107. 0x7cc0639c,0x08c3de6a } },
  102108. /* 111 */
  102109. { { 0xf6d552ab,0x20fdd020,0x05cd81f1,0x56baff98,0x91351291,0x06fb7c3e,
  102110. 0x45796b2f,0xc6909442 },
  102111. { 0x41231bd1,0x17b3ae9c,0x5cc58205,0x1eac6e87,0xf9d6a122,0x208837ab,
  102112. 0xcafe3ac0,0x3fa3db02 } },
  102113. /* 112 */
  102114. { { 0x05058880,0xd75a3e65,0x643943f2,0x7da365ef,0xfab24925,0x4147861c,
  102115. 0xfdb808ff,0xc5c4bdb0 },
  102116. { 0xb272b56b,0x73513e34,0x11b9043a,0xc8327e95,0xf8844969,0xfd8ce37d,
  102117. 0x46c2b6b5,0x2d56db94 } },
  102118. /* 113 */
  102119. { { 0xff46ac6b,0x2461782f,0x07a2e425,0xd19f7926,0x09a48de1,0xfafea3c4,
  102120. 0xe503ba42,0x0f56bd9d },
  102121. { 0x345cda49,0x137d4ed1,0x816f299d,0x821158fc,0xaeb43402,0xe7c6a54a,
  102122. 0x1173b5f1,0x4003bb9d } },
  102123. /* 114 */
  102124. { { 0xa0803387,0x3b8e8189,0x39cbd404,0xece115f5,0xd2877f21,0x4297208d,
  102125. 0xa07f2f9e,0x53765522 },
  102126. { 0xa8a4182d,0xa4980a21,0x3219df79,0xa2bbd07a,0x1a19a2d4,0x674d0a2e,
  102127. 0x6c5d4549,0x7a056f58 } },
  102128. /* 115 */
  102129. { { 0x9d8a2a47,0x646b2558,0xc3df2773,0x5b582948,0xabf0d539,0x51ec000e,
  102130. 0x7a1a2675,0x77d482f1 },
  102131. { 0x87853948,0xb8a1bd95,0x6cfbffee,0xa6f817bd,0x80681e47,0xab6ec057,
  102132. 0x2b38b0e4,0x4115012b } },
  102133. /* 116 */
  102134. { { 0x6de28ced,0x3c73f0f4,0x9b13ec47,0x1d5da760,0x6e5c6392,0x61b8ce9e,
  102135. 0xfbea0946,0xcdf04572 },
  102136. { 0x6c53c3b0,0x1cb3c58b,0x447b843c,0x97fe3c10,0x2cb9780e,0xfb2b8ae1,
  102137. 0x97383109,0xee703dda } },
  102138. /* 117 */
  102139. { { 0xff57e43a,0x34515140,0xb1b811b8,0xd44660d3,0x8f42b986,0x2b3b5dff,
  102140. 0xa162ce21,0x2a0ad89d },
  102141. { 0x6bc277ba,0x64e4a694,0xc141c276,0xc788c954,0xcabf6274,0x141aa64c,
  102142. 0xac2b4659,0xd62d0b67 } },
  102143. /* 118 */
  102144. { { 0x2c054ac4,0x39c5d87b,0xf27df788,0x57005859,0xb18128d6,0xedf7cbf3,
  102145. 0x991c2426,0xb39a23f2 },
  102146. { 0xf0b16ae5,0x95284a15,0xa136f51b,0x0c6a05b1,0xf2700783,0x1d63c137,
  102147. 0xc0674cc5,0x04ed0092 } },
  102148. /* 119 */
  102149. { { 0x9ae90393,0x1f4185d1,0x4a3d64e6,0x3047b429,0x9854fc14,0xae0001a6,
  102150. 0x0177c387,0xa0a91fc1 },
  102151. { 0xae2c831e,0xff0a3f01,0x2b727e16,0xbb76ae82,0x5a3075b4,0x8f12c8a1,
  102152. 0x9ed20c41,0x084cf988 } },
  102153. /* 120 */
  102154. { { 0xfca6becf,0xd98509de,0x7dffb328,0x2fceae80,0x4778e8b9,0x5d8a15c4,
  102155. 0x73abf77e,0xd57955b2 },
  102156. { 0x31b5d4f1,0x210da79e,0x3cfa7a1c,0xaa52f04b,0xdc27c20b,0xd4d12089,
  102157. 0x02d141f1,0x8e14ea42 } },
  102158. /* 121 */
  102159. { { 0xf2897042,0xeed50345,0x43402c4a,0x8d05331f,0xc8bdfb21,0xc8d9c194,
  102160. 0x2aa4d158,0x597e1a37 },
  102161. { 0xcf0bd68c,0x0327ec1a,0xab024945,0x6d4be0dc,0xc9fe3e84,0x5b9c8d7a,
  102162. 0x199b4dea,0xca3f0236 } },
  102163. /* 122 */
  102164. { { 0x6170bd20,0x592a10b5,0x6d3f5de7,0x0ea897f1,0x44b2ade2,0xa3363ff1,
  102165. 0x309c07e4,0xbde7fd7e },
  102166. { 0xb8f5432c,0x516bb6d2,0xe043444b,0x210dc1cb,0xf8f95b5a,0x3db01e6f,
  102167. 0x0a7dd198,0xb623ad0e } },
  102168. /* 123 */
  102169. { { 0x60c7b65b,0xa75bd675,0x23a4a289,0xab8c5590,0xd7b26795,0xf8220fd0,
  102170. 0x58ec137b,0xd6aa2e46 },
  102171. { 0x5138bb85,0x10abc00b,0xd833a95c,0x8c31d121,0x1702a32e,0xb24ff00b,
  102172. 0x2dcc513a,0x111662e0 } },
  102173. /* 124 */
  102174. { { 0xefb42b87,0x78114015,0x1b6c4dff,0xbd9f5d70,0xa7d7c129,0x66ecccd7,
  102175. 0x94b750f8,0xdb3ee1cb },
  102176. { 0xf34837cf,0xb26f3db0,0xb9578d4f,0xe7eed18b,0x7c56657d,0x5d2cdf93,
  102177. 0x52206a59,0x886a6442 } },
  102178. /* 125 */
  102179. { { 0x65b569ea,0x3c234cfb,0xf72119c1,0x20011141,0xa15a619e,0x8badc85d,
  102180. 0x018a17bc,0xa70cf4eb },
  102181. { 0x8c4a6a65,0x224f97ae,0x0134378f,0x36e5cf27,0x4f7e0960,0xbe3a609e,
  102182. 0xd1747b77,0xaa4772ab } },
  102183. /* 126 */
  102184. { { 0x7aa60cc0,0x67676131,0x0368115f,0xc7916361,0xbbc1bb5a,0xded98bb4,
  102185. 0x30faf974,0x611a6ddc },
  102186. { 0xc15ee47a,0x30e78cbc,0x4e0d96a5,0x2e896282,0x3dd9ed88,0x36f35adf,
  102187. 0x16429c88,0x5cfffaf8 } },
  102188. /* 127 */
  102189. { { 0x9b7a99cd,0xc0d54cff,0x843c45a1,0x7bf3b99d,0x62c739e1,0x038a908f,
  102190. 0x7dc1994c,0x6e5a6b23 },
  102191. { 0x0ba5db77,0xef8b454e,0xacf60d63,0xb7b8807f,0x76608378,0xe591c0c6,
  102192. 0x242dabcc,0x481a238d } },
  102193. /* 128 */
  102194. { { 0x35d0b34a,0xe3417bc0,0x8327c0a7,0x440b386b,0xac0362d1,0x8fb7262d,
  102195. 0xe0cdf943,0x2c41114c },
  102196. { 0xad95a0b1,0x2ba5cef1,0x67d54362,0xc09b37a8,0x01e486c9,0x26d6cdd2,
  102197. 0x42ff9297,0x20477abf } },
  102198. /* 129 */
  102199. { { 0x18d65dbf,0x2f75173c,0x339edad8,0x77bf940e,0xdcf1001c,0x7022d26b,
  102200. 0xc77396b6,0xac66409a },
  102201. { 0xc6261cc3,0x8b0bb36f,0x190e7e90,0x213f7bc9,0xa45e6c10,0x6541ceba,
  102202. 0xcc122f85,0xce8e6975 } },
  102203. /* 130 */
  102204. { { 0xbc0a67d2,0x0f121b41,0x444d248a,0x62d4760a,0x659b4737,0x0e044f1d,
  102205. 0x250bb4a8,0x08fde365 },
  102206. { 0x848bf287,0xaceec3da,0xd3369d6e,0xc2a62182,0x92449482,0x3582dfdc,
  102207. 0x565d6cd7,0x2f7e2fd2 } },
  102208. /* 131 */
  102209. { { 0xc3770fa7,0xae4b92db,0x379043f9,0x095e8d5c,0x17761171,0x54f34e9d,
  102210. 0x907702ae,0xc65be92e },
  102211. { 0xf6fd0a40,0x2758a303,0xbcce784b,0xe7d822e3,0x4f9767bf,0x7ae4f585,
  102212. 0xd1193b3a,0x4bff8e47 } },
  102213. /* 132 */
  102214. { { 0x00ff1480,0xcd41d21f,0x0754db16,0x2ab8fb7d,0xbbe0f3ea,0xac81d2ef,
  102215. 0x5772967d,0x3e4e4ae6 },
  102216. { 0x3c5303e6,0x7e18f36d,0x92262397,0x3bd9994b,0x1324c3c0,0x9ed70e26,
  102217. 0x58ec6028,0x5388aefd } },
  102218. /* 133 */
  102219. { { 0x5e5d7713,0xad1317eb,0x75de49da,0x09b985ee,0xc74fb261,0x32f5bc4f,
  102220. 0x4f75be0e,0x5cf908d1 },
  102221. { 0x8e657b12,0x76043510,0xb96ed9e6,0xbfd421a5,0x8970ccc2,0x0e29f51f,
  102222. 0x60f00ce2,0xa698ba40 } },
  102223. /* 134 */
  102224. { { 0xef748fec,0x73db1686,0x7e9d2cf9,0xe6e755a2,0xce265eff,0x630b6544,
  102225. 0x7aebad8d,0xb142ef8a },
  102226. { 0x17d5770a,0xad31af9f,0x2cb3412f,0x66af3b67,0xdf3359de,0x6bd60d1b,
  102227. 0x58515075,0xd1896a96 } },
  102228. /* 135 */
  102229. { { 0x33c41c08,0xec5957ab,0x5468e2e1,0x87de94ac,0xac472f6c,0x18816b73,
  102230. 0x7981da39,0x267b0e0b },
  102231. { 0x8e62b988,0x6e554e5d,0x116d21e7,0xd8ddc755,0x3d2a6f99,0x4610faf0,
  102232. 0xa1119393,0xb54e287a } },
  102233. /* 136 */
  102234. { { 0x178a876b,0x0a0122b5,0x085104b4,0x51ff96ff,0x14f29f76,0x050b31ab,
  102235. 0x5f87d4e6,0x84abb28b },
  102236. { 0x8270790a,0xd5ed439f,0x85e3f46b,0x2d6cb59d,0x6c1e2212,0x75f55c1b,
  102237. 0x17655640,0xe5436f67 } },
  102238. /* 137 */
  102239. { { 0x2286e8d5,0x53f9025e,0x864453be,0x353c95b4,0xe408e3a0,0xd832f5bd,
  102240. 0x5b9ce99e,0x0404f68b },
  102241. { 0xa781e8e5,0xcad33bde,0x163c2f5b,0x3cdf5018,0x0119caa3,0x57576960,
  102242. 0x0ac1c701,0x3a4263df } },
  102243. /* 138 */
  102244. { { 0x9aeb596d,0xc2965ecc,0x023c92b4,0x01ea03e7,0x2e013961,0x4704b4b6,
  102245. 0x905ea367,0x0ca8fd3f },
  102246. { 0x551b2b61,0x92523a42,0x390fcd06,0x1eb7a89c,0x0392a63e,0xe7f1d2be,
  102247. 0x4ddb0c33,0x96dca264 } },
  102248. /* 139 */
  102249. { { 0x387510af,0x203bb43a,0xa9a36a01,0x846feaa8,0x2f950378,0xd23a5770,
  102250. 0x3aad59dc,0x4363e212 },
  102251. { 0x40246a47,0xca43a1c7,0xe55dd24d,0xb362b8d2,0x5d8faf96,0xf9b08604,
  102252. 0xd8bb98c4,0x840e115c } },
  102253. /* 140 */
  102254. { { 0x1023e8a7,0xf12205e2,0xd8dc7a0b,0xc808a8cd,0x163a5ddf,0xe292a272,
  102255. 0x30ded6d4,0x5e0d6abd },
  102256. { 0x7cfc0f64,0x07a721c2,0x0e55ed88,0x42eec01d,0x1d1f9db2,0x26a7bef9,
  102257. 0x2945a25a,0x7dea48f4 } },
  102258. /* 141 */
  102259. { { 0xe5060a81,0xabdf6f1c,0xf8f95615,0xe79f9c72,0x06ac268b,0xcfd36c54,
  102260. 0xebfd16d1,0xabc2a2be },
  102261. { 0xd3e2eac7,0x8ac66f91,0xd2dd0466,0x6f10ba63,0x0282d31b,0x6790e377,
  102262. 0x6c7eefc1,0x4ea35394 } },
  102263. /* 142 */
  102264. { { 0x5266309d,0xed8a2f8d,0x81945a3e,0x0a51c6c0,0x578c5dc1,0xcecaf45a,
  102265. 0x1c94ffc3,0x3a76e689 },
  102266. { 0x7d7b0d0f,0x9aace8a4,0x8f584a5f,0x963ace96,0x4e697fbe,0x51a30c72,
  102267. 0x465e6464,0x8212a10a } },
  102268. /* 143 */
  102269. { { 0xcfab8caa,0xef7c61c3,0x0e142390,0x18eb8e84,0x7e9733ca,0xcd1dff67,
  102270. 0x599cb164,0xaa7cab71 },
  102271. { 0xbc837bd1,0x02fc9273,0xc36af5d7,0xc06407d0,0xf423da49,0x17621292,
  102272. 0xfe0617c3,0x40e38073 } },
  102273. /* 144 */
  102274. { { 0xa7bf9b7c,0xf4f80824,0x3fbe30d0,0x365d2320,0x97cf9ce3,0xbfbe5320,
  102275. 0xb3055526,0xe3604700 },
  102276. { 0x6cc6c2c7,0x4dcb9911,0xba4cbee6,0x72683708,0x637ad9ec,0xdcded434,
  102277. 0xa3dee15f,0x6542d677 } },
  102278. /* 145 */
  102279. { { 0x7b6c377a,0x3f32b6d0,0x903448be,0x6cb03847,0x20da8af7,0xd6fdd3a8,
  102280. 0x09bb6f21,0xa6534aee },
  102281. { 0x1035facf,0x30a1780d,0x9dcb47e6,0x35e55a33,0xc447f393,0x6ea50fe1,
  102282. 0xdc9aef22,0xf3cb672f } },
  102283. /* 146 */
  102284. { { 0x3b55fd83,0xeb3719fe,0x875ddd10,0xe0d7a46c,0x05cea784,0x33ac9fa9,
  102285. 0xaae870e7,0x7cafaa2e },
  102286. { 0x1d53b338,0x9b814d04,0xef87e6c6,0xe0acc0a0,0x11672b0f,0xfb93d108,
  102287. 0xb9bd522e,0x0aab13c1 } },
  102288. /* 147 */
  102289. { { 0xd2681297,0xddcce278,0xb509546a,0xcb350eb1,0x7661aaf2,0x2dc43173,
  102290. 0x847012e9,0x4b91a602 },
  102291. { 0x72f8ddcf,0xdcff1095,0x9a911af4,0x08ebf61e,0xc372430e,0x48f4360a,
  102292. 0x72321cab,0x49534c53 } },
  102293. /* 148 */
  102294. { { 0xf07b7e9d,0x83df7d71,0x13cd516f,0xa478efa3,0x6c047ee3,0x78ef264b,
  102295. 0xd65ac5ee,0xcaf46c4f },
  102296. { 0x92aa8266,0xa04d0c77,0x913684bb,0xedf45466,0xae4b16b0,0x56e65168,
  102297. 0x04c6770f,0x14ce9e57 } },
  102298. /* 149 */
  102299. { { 0x965e8f91,0x99445e3e,0xcb0f2492,0xd3aca1ba,0x90c8a0a0,0xd31cc70f,
  102300. 0x3e4c9a71,0x1bb708a5 },
  102301. { 0x558bdd7a,0xd5ca9e69,0x018a26b1,0x734a0508,0x4c9cf1ec,0xb093aa71,
  102302. 0xda300102,0xf9d126f2 } },
  102303. /* 150 */
  102304. { { 0xaff9563e,0x749bca7a,0xb49914a0,0xdd077afe,0xbf5f1671,0xe27a0311,
  102305. 0x729ecc69,0x807afcb9 },
  102306. { 0xc9b08b77,0x7f8a9337,0x443c7e38,0x86c3a785,0x476fd8ba,0x85fafa59,
  102307. 0x6568cd8c,0x751adcd1 } },
  102308. /* 151 */
  102309. { { 0x10715c0d,0x8aea38b4,0x8f7697f7,0xd113ea71,0x93fbf06d,0x665eab14,
  102310. 0x2537743f,0x29ec4468 },
  102311. { 0xb50bebbc,0x3d94719c,0xe4505422,0x399ee5bf,0x8d2dedb1,0x90cd5b3a,
  102312. 0x92a4077d,0xff9370e3 } },
  102313. /* 152 */
  102314. { { 0xc6b75b65,0x59a2d69b,0x266651c5,0x4188f8d5,0x3de9d7d2,0x28a9f33e,
  102315. 0xa2a9d01a,0x9776478b },
  102316. { 0x929af2c7,0x8852622d,0x4e690923,0x334f5d6d,0xa89a51e9,0xce6cc7e5,
  102317. 0xac2f82fa,0x74a6313f } },
  102318. /* 153 */
  102319. { { 0xb75f079c,0xb2f4dfdd,0x18e36fbb,0x85b07c95,0xe7cd36dd,0x1b6cfcf0,
  102320. 0x0ff4863d,0xab75be15 },
  102321. { 0x173fc9b7,0x81b367c0,0xd2594fd0,0xb90a7420,0xc4091236,0x15fdbf03,
  102322. 0x0b4459f6,0x4ebeac2e } },
  102323. /* 154 */
  102324. { { 0x5c9f2c53,0xeb6c5fe7,0x8eae9411,0xd2522011,0xf95ac5d8,0xc8887633,
  102325. 0x2c1baffc,0xdf99887b },
  102326. { 0x850aaecb,0xbb78eed2,0x01d6a272,0x9d49181b,0xb1cdbcac,0x978dd511,
  102327. 0x779f4058,0x27b040a7 } },
  102328. /* 155 */
  102329. { { 0xf73b2eb2,0x90405db7,0x8e1b2118,0xe0df8508,0x5962327e,0x501b7152,
  102330. 0xe4cfa3f5,0xb393dd37 },
  102331. { 0x3fd75165,0xa1230e7b,0xbcd33554,0xd66344c2,0x0f7b5022,0x6c36f1be,
  102332. 0xd0463419,0x09588c12 } },
  102333. /* 156 */
  102334. { { 0x02601c3b,0xe086093f,0xcf5c335f,0xfb0252f8,0x894aff28,0x955cf280,
  102335. 0xdb9f648b,0x81c879a9 },
  102336. { 0xc6f56c51,0x040e687c,0x3f17618c,0xfed47169,0x9059353b,0x44f88a41,
  102337. 0x5fc11bc4,0xfa0d48f5 } },
  102338. /* 157 */
  102339. { { 0xe1608e4d,0xbc6e1c9d,0x3582822c,0x010dda11,0x157ec2d7,0xf6b7ddc1,
  102340. 0xb6a367d6,0x8ea0e156 },
  102341. { 0x2383b3b4,0xa354e02f,0x3f01f53c,0x69966b94,0x2de03ca5,0x4ff6632b,
  102342. 0xfa00b5ac,0x3f5ab924 } },
  102343. /* 158 */
  102344. { { 0x59739efb,0x337bb0d9,0xe7ebec0d,0xc751b0f4,0x411a67d1,0x2da52dd6,
  102345. 0x2b74256e,0x8bc76887 },
  102346. { 0x82d3d253,0xa5be3b72,0xf58d779f,0xa9f679a1,0xe16767bb,0xa1cac168,
  102347. 0x60fcf34f,0xb386f190 } },
  102348. /* 159 */
  102349. { { 0x2fedcfc2,0x31f3c135,0x62f8af0d,0x5396bf62,0xe57288c2,0x9a02b4ea,
  102350. 0x1b069c4d,0x4cb460f7 },
  102351. { 0x5b8095ea,0xae67b4d3,0x6fc07603,0x92bbf859,0xb614a165,0xe1475f66,
  102352. 0x95ef5223,0x52c0d508 } },
  102353. /* 160 */
  102354. { { 0x15339848,0x231c210e,0x70778c8d,0xe87a28e8,0x6956e170,0x9d1de661,
  102355. 0x2bb09c0b,0x4ac3c938 },
  102356. { 0x6998987d,0x19be0551,0xae09f4d6,0x8b2376c4,0x1a3f933d,0x1de0b765,
  102357. 0xe39705f4,0x380d94c7 } },
  102358. /* 161 */
  102359. { { 0x81542e75,0x01a355aa,0xee01b9b7,0x96c724a1,0x624d7087,0x6b3a2977,
  102360. 0xde2637af,0x2ce3e171 },
  102361. { 0xf5d5bc1a,0xcfefeb49,0x2777e2b5,0xa655607e,0x9513756c,0x4feaac2f,
  102362. 0x0b624e4d,0x2e6cd852 } },
  102363. /* 162 */
  102364. { { 0x8c31c31d,0x3685954b,0x5bf21a0c,0x68533d00,0x75c79ec9,0x0bd7626e,
  102365. 0x42c69d54,0xca177547 },
  102366. { 0xf6d2dbb2,0xcc6edaff,0x174a9d18,0xfd0d8cbd,0xaa4578e8,0x875e8793,
  102367. 0x9cab2ce6,0xa976a713 } },
  102368. /* 163 */
  102369. { { 0x93fb353d,0x0a651f1b,0x57fcfa72,0xd75cab8b,0x31b15281,0xaa88cfa7,
  102370. 0x0a1f4999,0x8720a717 },
  102371. { 0x693e1b90,0x8c3e8d37,0x16f6dfc3,0xd345dc0b,0xb52a8742,0x8ea8d00a,
  102372. 0xc769893c,0x9719ef29 } },
  102373. /* 164 */
  102374. { { 0x58e35909,0x820eed8d,0x33ddc116,0x9366d8dc,0x6e205026,0xd7f999d0,
  102375. 0xe15704c1,0xa5072976 },
  102376. { 0xc4e70b2e,0x002a37ea,0x6890aa8a,0x84dcf657,0x645b2a5c,0xcd71bf18,
  102377. 0xf7b77725,0x99389c9d } },
  102378. /* 165 */
  102379. { { 0x7ada7a4b,0x238c08f2,0xfd389366,0x3abe9d03,0x766f512c,0x6b672e89,
  102380. 0x202c82e4,0xa88806aa },
  102381. { 0xd380184e,0x6602044a,0x126a8b85,0xa8cb78c4,0xad844f17,0x79d670c0,
  102382. 0x4738dcfe,0x0043bffb } },
  102383. /* 166 */
  102384. { { 0x36d5192e,0x8d59b5dc,0x4590b2af,0xacf885d3,0x11601781,0x83566d0a,
  102385. 0xba6c4866,0x52f3ef01 },
  102386. { 0x0edcb64d,0x3986732a,0x8068379f,0x0a482c23,0x7040f309,0x16cbe5fa,
  102387. 0x9ef27e75,0x3296bd89 } },
  102388. /* 167 */
  102389. { { 0x454d81d7,0x476aba89,0x51eb9b3c,0x9eade7ef,0x81c57986,0x619a21cd,
  102390. 0xaee571e9,0x3b90febf },
  102391. { 0x5496f7cb,0x9393023e,0x7fb51bc4,0x55be41d8,0x99beb5ce,0x03f1dd48,
  102392. 0x9f810b18,0x6e88069d } },
  102393. /* 168 */
  102394. { { 0xb43ea1db,0xce37ab11,0x5259d292,0x0a7ff1a9,0x8f84f186,0x851b0221,
  102395. 0xdefaad13,0xa7222bea },
  102396. { 0x2b0a9144,0xa2ac78ec,0xf2fa59c5,0x5a024051,0x6147ce38,0x91d1eca5,
  102397. 0xbc2ac690,0xbe94d523 } },
  102398. /* 169 */
  102399. { { 0x0b226ce7,0x72f4945e,0x967e8b70,0xb8afd747,0x85a6c63e,0xedea46f1,
  102400. 0x9be8c766,0x7782defe },
  102401. { 0x3db38626,0x760d2aa4,0x76f67ad1,0x460ae787,0x54499cdb,0x341b86fc,
  102402. 0xa2892e4b,0x03838567 } },
  102403. /* 170 */
  102404. { { 0x79ec1a0f,0x2d8daefd,0xceb39c97,0x3bbcd6fd,0x58f61a95,0xf5575ffc,
  102405. 0xadf7b420,0xdbd986c4 },
  102406. { 0x15f39eb7,0x81aa8814,0xb98d976c,0x6ee2fcf5,0xcf2f717d,0x5465475d,
  102407. 0x6860bbd0,0x8e24d3c4 } },
  102408. /* 171 */
  102409. { { 0x9a587390,0x749d8e54,0x0cbec588,0x12bb194f,0xb25983c6,0x46e07da4,
  102410. 0x407bafc8,0x541a99c4 },
  102411. { 0x624c8842,0xdb241692,0xd86c05ff,0x6044c12a,0x4f7fcf62,0xc59d14b4,
  102412. 0xf57d35d1,0xc0092c49 } },
  102413. /* 172 */
  102414. { { 0xdf2e61ef,0xd3cc75c3,0x2e1b35ca,0x7e8841c8,0x909f29f4,0xc62d30d1,
  102415. 0x7286944d,0x75e40634 },
  102416. { 0xbbc237d0,0xe7d41fc5,0xec4f01c9,0xc9537bf0,0x282bd534,0x91c51a16,
  102417. 0xc7848586,0x5b7cb658 } },
  102418. /* 173 */
  102419. { { 0x8a28ead1,0x964a7084,0xfd3b47f6,0x802dc508,0x767e5b39,0x9ae4bfd1,
  102420. 0x8df097a1,0x7ae13eba },
  102421. { 0xeadd384e,0xfd216ef8,0xb6b2ff06,0x0361a2d9,0x4bcdb5f3,0x204b9878,
  102422. 0xe2a8e3fd,0x787d8074 } },
  102423. /* 174 */
  102424. { { 0x757fbb1c,0xc5e25d6b,0xca201deb,0xe47bddb2,0x6d2233ff,0x4a55e9a3,
  102425. 0x9ef28484,0x5c222819 },
  102426. { 0x88315250,0x773d4a85,0x827097c1,0x21b21a2b,0xdef5d33f,0xab7c4ea1,
  102427. 0xbaf0f2b0,0xe45d37ab } },
  102428. /* 175 */
  102429. { { 0x28511c8a,0xd2df1e34,0xbdca6cd3,0xebb229c8,0x627c39a7,0x578a71a7,
  102430. 0x84dfb9d3,0xed7bc122 },
  102431. { 0x93dea561,0xcf22a6df,0xd48f0ed1,0x5443f18d,0x5bad23e8,0xd8b86140,
  102432. 0x45ca6d27,0xaac97cc9 } },
  102433. /* 176 */
  102434. { { 0xa16bd00a,0xeb54ea74,0xf5c0bcc1,0xd839e9ad,0x1f9bfc06,0x092bb7f1,
  102435. 0x1163dc4e,0x318f97b3 },
  102436. { 0xc30d7138,0xecc0c5be,0xabc30220,0x44e8df23,0xb0223606,0x2bb7972f,
  102437. 0x9a84ff4d,0xfa41faa1 } },
  102438. /* 177 */
  102439. { { 0xa6642269,0x4402d974,0x9bb783bd,0xc81814ce,0x7941e60b,0x398d38e4,
  102440. 0x1d26e9e2,0x38bb6b2c },
  102441. { 0x6a577f87,0xc64e4a25,0xdc11fe1c,0x8b52d253,0x62280728,0xff336abf,
  102442. 0xce7601a5,0x94dd0905 } },
  102443. /* 178 */
  102444. { { 0xde93f92a,0x156cf7dc,0x89b5f315,0xa01333cb,0xc995e750,0x02404df9,
  102445. 0xd25c2ae9,0x92077867 },
  102446. { 0x0bf39d44,0xe2471e01,0x96bb53d7,0x5f2c9020,0x5c9c3d8f,0x4c44b7b3,
  102447. 0xd29beb51,0x81e8428b } },
  102448. /* 179 */
  102449. { { 0xc477199f,0x6dd9c2ba,0x6b5ecdd9,0x8cb8eeee,0xee40fd0e,0x8af7db3f,
  102450. 0xdbbfa4b1,0x1b94ab62 },
  102451. { 0xce47f143,0x44f0d8b3,0x63f46163,0x51e623fc,0xcc599383,0xf18f270f,
  102452. 0x055590ee,0x06a38e28 } },
  102453. /* 180 */
  102454. { { 0xb3355b49,0x2e5b0139,0xb4ebf99b,0x20e26560,0xd269f3dc,0xc08ffa6b,
  102455. 0x83d9d4f8,0xa7b36c20 },
  102456. { 0x1b3e8830,0x64d15c3a,0xa89f9c0b,0xd5fceae1,0xe2d16930,0xcfeee4a2,
  102457. 0xa2822a20,0xbe54c6b4 } },
  102458. /* 181 */
  102459. { { 0x8d91167c,0xd6cdb3df,0xe7a6625e,0x517c3f79,0x346ac7f4,0x7105648f,
  102460. 0xeae022bb,0xbf30a5ab },
  102461. { 0x93828a68,0x8e7785be,0x7f3ef036,0x5161c332,0x592146b2,0xe11b5feb,
  102462. 0x2732d13a,0xd1c820de } },
  102463. /* 182 */
  102464. { { 0x9038b363,0x043e1347,0x6b05e519,0x58c11f54,0x6026cad1,0x4fe57abe,
  102465. 0x68a18da3,0xb7d17bed },
  102466. { 0xe29c2559,0x44ca5891,0x5bfffd84,0x4f7a0376,0x74e46948,0x498de4af,
  102467. 0x6412cc64,0x3997fd5e } },
  102468. /* 183 */
  102469. { { 0x8bd61507,0xf2074682,0x34a64d2a,0x29e132d5,0x8a8a15e3,0xffeddfb0,
  102470. 0x3c6c13e8,0x0eeb8929 },
  102471. { 0xa7e259f8,0xe9b69a3e,0xd13e7e67,0xce1db7e6,0xad1fa685,0x277318f6,
  102472. 0xc922b6ef,0x228916f8 } },
  102473. /* 184 */
  102474. { { 0x0a12ab5b,0x959ae25b,0x957bc136,0xcc11171f,0xd16e2b0c,0x8058429e,
  102475. 0x6e93097e,0xec05ad1d },
  102476. { 0xac3f3708,0x157ba5be,0x30b59d77,0x31baf935,0x118234e5,0x47b55237,
  102477. 0x7ff11b37,0x7d314156 } },
  102478. /* 185 */
  102479. { { 0xf6dfefab,0x7bd9c05c,0xdcb37707,0xbe2f2268,0x3a38bb95,0xe53ead97,
  102480. 0x9bc1d7a3,0xe9ce66fc },
  102481. { 0x6f6a02a1,0x75aa1576,0x60e600ed,0x38c087df,0x68cdc1b9,0xf8947f34,
  102482. 0x72280651,0xd9650b01 } },
  102483. /* 186 */
  102484. { { 0x5a057e60,0x504b4c4a,0x8def25e4,0xcbccc3be,0x17c1ccbd,0xa6353208,
  102485. 0x804eb7a2,0x14d6699a },
  102486. { 0xdb1f411a,0x2c8a8415,0xf80d769c,0x09fbaf0b,0x1c2f77ad,0xb4deef90,
  102487. 0x0d43598a,0x6f4c6841 } },
  102488. /* 187 */
  102489. { { 0x96c24a96,0x8726df4e,0xfcbd99a3,0x534dbc85,0x8b2ae30a,0x3c466ef2,
  102490. 0x61189abb,0x4c4350fd },
  102491. { 0xf855b8da,0x2967f716,0x463c38a1,0x41a42394,0xeae93343,0xc37e1413,
  102492. 0x5a3118b5,0xa726d242 } },
  102493. /* 188 */
  102494. { { 0x948c1086,0xdae6b3ee,0xcbd3a2e1,0xf1de503d,0x03d022f3,0x3f35ed3f,
  102495. 0xcc6cf392,0x13639e82 },
  102496. { 0xcdafaa86,0x9ac938fb,0x2654a258,0xf45bc5fb,0x45051329,0x1963b26e,
  102497. 0xc1a335a3,0xca9365e1 } },
  102498. /* 189 */
  102499. { { 0x4c3b2d20,0x3615ac75,0x904e241b,0x742a5417,0xcc9d071d,0xb08521c4,
  102500. 0x970b72a5,0x9ce29c34 },
  102501. { 0x6d3e0ad6,0x8cc81f73,0xf2f8434c,0x8060da9e,0x6ce862d9,0x35ed1d1a,
  102502. 0xab42af98,0x48c4abd7 } },
  102503. /* 190 */
  102504. { { 0x40c7485a,0xd221b0cc,0xe5274dbf,0xead455bb,0x9263d2e8,0x493c7698,
  102505. 0xf67b33cb,0x78017c32 },
  102506. { 0x930cb5ee,0xb9d35769,0x0c408ed2,0xc0d14e94,0x272f1a4d,0xf8b7bf55,
  102507. 0xde5c1c04,0x53cd0454 } },
  102508. /* 191 */
  102509. { { 0x5d28ccac,0xbcd585fa,0x005b746e,0x5f823e56,0xcd0123aa,0x7c79f0a1,
  102510. 0xd3d7fa8f,0xeea465c1 },
  102511. { 0x0551803b,0x7810659f,0x7ce6af70,0x6c0b599f,0x29288e70,0x4195a770,
  102512. 0x7ae69193,0x1b6e42a4 } },
  102513. /* 192 */
  102514. { { 0xf67d04c3,0x2e80937c,0x89eeb811,0x1e312be2,0x92594d60,0x56b5d887,
  102515. 0x187fbd3d,0x0224da14 },
  102516. { 0x0c5fe36f,0x87abb863,0x4ef51f5f,0x580f3c60,0xb3b429ec,0x964fb1bf,
  102517. 0x42bfff33,0x60838ef0 } },
  102518. /* 193 */
  102519. { { 0x7e0bbe99,0x432cb2f2,0x04aa39ee,0x7bda44f3,0x9fa93903,0x5f497c7a,
  102520. 0x2d331643,0x636eb202 },
  102521. { 0x93ae00aa,0xfcfd0e61,0x31ae6d2f,0x875a00fe,0x9f93901c,0xf43658a2,
  102522. 0x39218bac,0x8844eeb6 } },
  102523. /* 194 */
  102524. { { 0x6b3bae58,0x114171d2,0x17e39f3e,0x7db3df71,0x81a8eada,0xcd37bc7f,
  102525. 0x51fb789e,0x27ba83dc },
  102526. { 0xfbf54de5,0xa7df439f,0xb5fe1a71,0x7277030b,0xdb297a48,0x42ee8e35,
  102527. 0x87f3a4ab,0xadb62d34 } },
  102528. /* 195 */
  102529. { { 0xa175df2a,0x9b1168a2,0x618c32e9,0x082aa04f,0x146b0916,0xc9e4f2e7,
  102530. 0x75e7c8b2,0xb990fd76 },
  102531. { 0x4df37313,0x0829d96b,0xd0b40789,0x1c205579,0x78087711,0x66c9ae4a,
  102532. 0x4d10d18d,0x81707ef9 } },
  102533. /* 196 */
  102534. { { 0x03d6ff96,0x97d7cab2,0x0d843360,0x5b851bfc,0xd042db4b,0x268823c4,
  102535. 0xd5a8aa5c,0x3792daea },
  102536. { 0x941afa0b,0x52818865,0x42d83671,0xf3e9e741,0x5be4e0a7,0x17c82527,
  102537. 0x94b001ba,0x5abd635e } },
  102538. /* 197 */
  102539. { { 0x0ac4927c,0x727fa84e,0xa7c8cf23,0xe3886035,0x4adca0df,0xa4bcd5ea,
  102540. 0x846ab610,0x5995bf21 },
  102541. { 0x829dfa33,0xe90f860b,0x958fc18b,0xcaafe2ae,0x78630366,0x9b3baf44,
  102542. 0xd483411e,0x44c32ca2 } },
  102543. /* 198 */
  102544. { { 0xe40ed80c,0xa74a97f1,0x31d2ca82,0x5f938cb1,0x7c2d6ad9,0x53f2124b,
  102545. 0x8082a54c,0x1f2162fb },
  102546. { 0x720b173e,0x7e467cc5,0x085f12f9,0x40e8a666,0x4c9d65dc,0x8cebc20e,
  102547. 0xc3e907c9,0x8f1d402b } },
  102548. /* 199 */
  102549. { { 0xfbc4058a,0x4f592f9c,0x292f5670,0xb15e14b6,0xbc1d8c57,0xc55cfe37,
  102550. 0x926edbf9,0xb1980f43 },
  102551. { 0x32c76b09,0x98c33e09,0x33b07f78,0x1df5279d,0x863bb461,0x6f08ead4,
  102552. 0x37448e45,0x2828ad9b } },
  102553. /* 200 */
  102554. { { 0xc4cf4ac5,0x696722c4,0xdde64afb,0xf5ac1a3f,0xe0890832,0x0551baa2,
  102555. 0x5a14b390,0x4973f127 },
  102556. { 0x322eac5d,0xe59d8335,0x0bd9b568,0x5e07eef5,0xa2588393,0xab36720f,
  102557. 0xdb168ac7,0x6dac8ed0 } },
  102558. /* 201 */
  102559. { { 0xeda835ef,0xf7b545ae,0x1d10ed51,0x4aa113d2,0x13741b09,0x035a65e0,
  102560. 0x20b9de4c,0x4b23ef59 },
  102561. { 0x3c4c7341,0xe82bb680,0x3f58bc37,0xd457706d,0xa51e3ee8,0x73527863,
  102562. 0xddf49a4e,0x4dd71534 } },
  102563. /* 202 */
  102564. { { 0x95476cd9,0xbf944672,0xe31a725b,0x648d072f,0xfc4b67e0,0x1441c8b8,
  102565. 0x2f4a4dbb,0xfd317000 },
  102566. { 0x8995d0e1,0x1cb43ff4,0x0ef729aa,0x76e695d1,0x41798982,0xe0d5f976,
  102567. 0x9569f365,0x14fac58c } },
  102568. /* 203 */
  102569. { { 0xf312ae18,0xad9a0065,0xfcc93fc9,0x51958dc0,0x8a7d2846,0xd9a14240,
  102570. 0x36abda50,0xed7c7651 },
  102571. { 0x25d4abbc,0x46270f1a,0xf1a113ea,0x9b5dd8f3,0x5b51952f,0xc609b075,
  102572. 0x4d2e9f53,0xfefcb7f7 } },
  102573. /* 204 */
  102574. { { 0xba119185,0xbd09497a,0xaac45ba4,0xd54e8c30,0xaa521179,0x492479de,
  102575. 0x87e0d80b,0x1801a57e },
  102576. { 0xfcafffb0,0x073d3f8d,0xae255240,0x6cf33c0b,0x5b5fdfbc,0x781d763b,
  102577. 0x1ead1064,0x9f8fc11e } },
  102578. /* 205 */
  102579. { { 0x5e69544c,0x1583a171,0xf04b7813,0x0eaf8567,0x278a4c32,0x1e22a8fd,
  102580. 0x3d3a69a9,0xa9d3809d },
  102581. { 0x59a2da3b,0x936c2c2c,0x1895c847,0x38ccbcf6,0x63d50869,0x5e65244e,
  102582. 0xe1178ef7,0x3006b9ae } },
  102583. /* 206 */
  102584. { { 0xc9eead28,0x0bb1f2b0,0x89f4dfbc,0x7eef635d,0xb2ce8939,0x074757fd,
  102585. 0x45f8f761,0x0ab85fd7 },
  102586. { 0x3e5b4549,0xecda7c93,0x97922f21,0x4be2bb5c,0xb43b8040,0x261a1274,
  102587. 0x11e942c2,0xb122d675 } },
  102588. /* 207 */
  102589. { { 0x66a5ae7a,0x3be607be,0x76adcbe3,0x01e703fa,0x4eb6e5c5,0xaf904301,
  102590. 0x097dbaec,0x9f599dc1 },
  102591. { 0x0ff250ed,0x6d75b718,0x349a20dc,0x8eb91574,0x10b227a3,0x425605a4,
  102592. 0x8a294b78,0x7d5528e0 } },
  102593. /* 208 */
  102594. { { 0x20c26def,0xf0f58f66,0x582b2d1e,0x025585ea,0x01ce3881,0xfbe7d79b,
  102595. 0x303f1730,0x28ccea01 },
  102596. { 0x79644ba5,0xd1dabcd1,0x06fff0b8,0x1fc643e8,0x66b3e17b,0xa60a76fc,
  102597. 0xa1d013bf,0xc18baf48 } },
  102598. /* 209 */
  102599. { { 0x5dc4216d,0x34e638c8,0x206142ac,0x00c01067,0x95f5064a,0xd453a171,
  102600. 0xb7a9596b,0x9def809d },
  102601. { 0x67ab8d2c,0x41e8642e,0x6237a2b6,0xb4240433,0x64c4218b,0x7d506a6d,
  102602. 0x68808ce5,0x0357f8b0 } },
  102603. /* 210 */
  102604. { { 0x4cd2cc88,0x8e9dbe64,0xf0b8f39d,0xcc61c28d,0xcd30a0c8,0x4a309874,
  102605. 0x1b489887,0xe4a01add },
  102606. { 0xf57cd8f9,0x2ed1eeac,0xbd594c48,0x1b767d3e,0x7bd2f787,0xa7295c71,
  102607. 0xce10cc30,0x466d7d79 } },
  102608. /* 211 */
  102609. { { 0x9dada2c7,0x47d31892,0x8f9aa27d,0x4fa0a6c3,0x820a59e1,0x90e4fd28,
  102610. 0x451ead1a,0xc672a522 },
  102611. { 0x5d86b655,0x30607cc8,0xf9ad4af1,0xf0235d3b,0x571172a6,0x99a08680,
  102612. 0xf2a67513,0x5e3d64fa } },
  102613. /* 212 */
  102614. { { 0x9b3b4416,0xaa6410c7,0xeab26d99,0xcd8fcf85,0xdb656a74,0x5ebff74a,
  102615. 0xeb8e42fc,0x6c8a7a95 },
  102616. { 0xb02a63bd,0x10c60ba7,0x8b8f0047,0x6b2f2303,0x312d90b0,0x8c6c3738,
  102617. 0xad82ca91,0x348ae422 } },
  102618. /* 213 */
  102619. { { 0x5ccda2fb,0x7f474663,0x8e0726d2,0x22accaa1,0x492b1f20,0x85adf782,
  102620. 0xd9ef2d2e,0xc1074de0 },
  102621. { 0xae9a65b3,0xfcf3ce44,0x05d7151b,0xfd71e4ac,0xce6a9788,0xd4711f50,
  102622. 0xc9e54ffc,0xfbadfbdb } },
  102623. /* 214 */
  102624. { { 0x20a99363,0x1713f1cd,0x6cf22775,0xb915658f,0x24d359b2,0x968175cd,
  102625. 0x83716fcd,0xb7f976b4 },
  102626. { 0x5d6dbf74,0x5758e24d,0x71c3af36,0x8d23bafd,0x0243dfe3,0x48f47760,
  102627. 0xcafcc805,0xf4d41b2e } },
  102628. /* 215 */
  102629. { { 0xfdabd48d,0x51f1cf28,0x32c078a4,0xce81be36,0x117146e9,0x6ace2974,
  102630. 0xe0160f10,0x180824ea },
  102631. { 0x66e58358,0x0387698b,0xce6ca358,0x63568752,0x5e41e6c5,0x82380e34,
  102632. 0x83cf6d25,0x67e5f639 } },
  102633. /* 216 */
  102634. { { 0xcf4899ef,0xf89ccb8d,0x9ebb44c0,0x949015f0,0xb2598ec9,0x546f9276,
  102635. 0x04c11fc6,0x9fef789a },
  102636. { 0x53d2a071,0x6d367ecf,0xa4519b09,0xb10e1a7f,0x611e2eef,0xca6b3fb0,
  102637. 0xa99c4e20,0xbc80c181 } },
  102638. /* 217 */
  102639. { { 0xe5eb82e6,0x972536f8,0xf56cb920,0x1a484fc7,0x50b5da5e,0xc78e2171,
  102640. 0x9f8cdf10,0x49270e62 },
  102641. { 0xea6b50ad,0x1a39b7bb,0xa2388ffc,0x9a0284c1,0x8107197b,0x5403eb17,
  102642. 0x61372f7f,0xd2ee52f9 } },
  102643. /* 218 */
  102644. { { 0x88e0362a,0xd37cd285,0x8fa5d94d,0x442fa8a7,0xa434a526,0xaff836e5,
  102645. 0xe5abb733,0xdfb478be },
  102646. { 0x673eede6,0xa91f1ce7,0x2b5b2f04,0xa5390ad4,0x5530da2f,0x5e66f7bf,
  102647. 0x08df473a,0xd9a140b4 } },
  102648. /* 219 */
  102649. { { 0x6e8ea498,0x0e0221b5,0x3563ee09,0x62347829,0x335d2ade,0xe06b8391,
  102650. 0x623f4b1a,0x760c058d },
  102651. { 0xc198aa79,0x0b89b58c,0xf07aba7f,0xf74890d2,0xfde2556a,0x4e204110,
  102652. 0x8f190409,0x7141982d } },
  102653. /* 220 */
  102654. { { 0x4d4b0f45,0x6f0a0e33,0x392a94e1,0xd9280b38,0xb3c61d5e,0x3af324c6,
  102655. 0x89d54e47,0x3af9d1ce },
  102656. { 0x20930371,0xfd8f7981,0x21c17097,0xeda2664c,0xdc42309b,0x0e9545dc,
  102657. 0x73957dd6,0xb1f815c3 } },
  102658. /* 221 */
  102659. { { 0x89fec44a,0x84faa78e,0x3caa4caf,0xc8c2ae47,0xc1b6a624,0x691c807d,
  102660. 0x1543f052,0xa41aed14 },
  102661. { 0x7d5ffe04,0x42435399,0x625b6e20,0x8bacb2df,0x87817775,0x85d660be,
  102662. 0x86fb60ef,0xd6e9c1dd } },
  102663. /* 222 */
  102664. { { 0xc6853264,0x3aa2e97e,0xe2304a0b,0x771533b7,0xb8eae9be,0x1b912bb7,
  102665. 0xae9bf8c2,0x9c9c6e10 },
  102666. { 0xe030b74c,0xa2309a59,0x6a631e90,0x4ed7494d,0xa49b79f2,0x89f44b23,
  102667. 0x40fa61b6,0x566bd596 } },
  102668. /* 223 */
  102669. { { 0xc18061f3,0x066c0118,0x7c83fc70,0x190b25d3,0x27273245,0xf05fc8e0,
  102670. 0xf525345e,0xcf2c7390 },
  102671. { 0x10eb30cf,0xa09bceb4,0x0d77703a,0xcfd2ebba,0x150ff255,0xe842c43a,
  102672. 0x8aa20979,0x02f51755 } },
  102673. /* 224 */
  102674. { { 0xaddb7d07,0x396ef794,0x24455500,0x0b4fc742,0xc78aa3ce,0xfaff8eac,
  102675. 0xe8d4d97d,0x14e9ada5 },
  102676. { 0x2f7079e2,0xdaa480a1,0xe4b0800e,0x45baa3cd,0x7838157d,0x01765e2d,
  102677. 0x8e9d9ae8,0xa0ad4fab } },
  102678. /* 225 */
  102679. { { 0x4a653618,0x0bfb7621,0x31eaaa5f,0x1872813c,0x44949d5e,0x1553e737,
  102680. 0x6e56ed1e,0xbcd530b8 },
  102681. { 0x32e9c47b,0x169be853,0xb50059ab,0xdc2776fe,0x192bfbb4,0xcdba9761,
  102682. 0x6979341d,0x909283cf } },
  102683. /* 226 */
  102684. { { 0x76e81a13,0x67b00324,0x62171239,0x9bee1a99,0xd32e19d6,0x08ed361b,
  102685. 0xace1549a,0x35eeb7c9 },
  102686. { 0x7e4e5bdc,0x1280ae5a,0xb6ceec6e,0x2dcd2cd3,0x6e266bc1,0x52e4224c,
  102687. 0x448ae864,0x9a8b2cf4 } },
  102688. /* 227 */
  102689. { { 0x09d03b59,0xf6471bf2,0xb65af2ab,0xc90e62a3,0xebd5eec9,0xff7ff168,
  102690. 0xd4491379,0x6bdb60f4 },
  102691. { 0x8a55bc30,0xdadafebc,0x10097fe0,0xc79ead16,0x4c1e3bdd,0x42e19741,
  102692. 0x94ba08a9,0x01ec3cfd } },
  102693. /* 228 */
  102694. { { 0xdc9485c2,0xba6277eb,0x22fb10c7,0x48cc9a79,0x70a28d8a,0x4f61d60f,
  102695. 0x475464f6,0xd1acb1c0 },
  102696. { 0x26f36612,0xd26902b1,0xe0618d8b,0x59c3a44e,0x308357ee,0x4df8a813,
  102697. 0x405626c2,0x7dcd079d } },
  102698. /* 229 */
  102699. { { 0xf05a4b48,0x5ce7d4d3,0x37230772,0xadcd2952,0x812a915a,0xd18f7971,
  102700. 0x377d19b8,0x0bf53589 },
  102701. { 0x6c68ea73,0x35ecd95a,0x823a584d,0xc7f3bbca,0xf473a723,0x9fb674c6,
  102702. 0xe16686fc,0xd28be4d9 } },
  102703. /* 230 */
  102704. { { 0x38fa8e4b,0x5d2b9906,0x893fd8fc,0x559f186e,0x436fb6fc,0x3a6de2aa,
  102705. 0x510f88ce,0xd76007aa },
  102706. { 0x523a4988,0x2d10aab6,0x74dd0273,0xb455cf44,0xa3407278,0x7f467082,
  102707. 0xb303bb01,0xf2b52f68 } },
  102708. /* 231 */
  102709. { { 0x9835b4ca,0x0d57eafa,0xbb669cbc,0x2d2232fc,0xc6643198,0x8eeeb680,
  102710. 0xcc5aed3a,0xd8dbe98e },
  102711. { 0xc5a02709,0xcba9be3f,0xf5ba1fa8,0x30be68e5,0xf10ea852,0xfebd43cd,
  102712. 0xee559705,0xe01593a3 } },
  102713. /* 232 */
  102714. { { 0xea75a0a6,0xd3e5af50,0x57858033,0x512226ac,0xd0176406,0x6fe6d50f,
  102715. 0xaeb8ef06,0xafec07b1 },
  102716. { 0x80bb0a31,0x7fb99567,0x37309aae,0x6f1af3cc,0x01abf389,0x9153a15a,
  102717. 0x6e2dbfdd,0xa71b9354 } },
  102718. /* 233 */
  102719. { { 0x18f593d2,0xbf8e12e0,0xa078122b,0xd1a90428,0x0ba4f2ad,0x150505db,
  102720. 0x628523d9,0x53a2005c },
  102721. { 0xe7f2b935,0x07c8b639,0xc182961a,0x2bff975a,0x7518ca2c,0x86bceea7,
  102722. 0x3d588e3d,0xbf47d19b } },
  102723. /* 234 */
  102724. { { 0xdd7665d5,0x672967a7,0x2f2f4de5,0x4e303057,0x80d4903f,0x144005ae,
  102725. 0x39c9a1b6,0x001c2c7f },
  102726. { 0x69efc6d6,0x143a8014,0x7bc7a724,0xc810bdaa,0xa78150a4,0x5f65670b,
  102727. 0x86ffb99b,0xfdadf8e7 } },
  102728. /* 235 */
  102729. { { 0xffc00785,0xfd38cb88,0x3b48eb67,0x77fa7591,0xbf368fbc,0x0454d055,
  102730. 0x5aa43c94,0x3a838e4d },
  102731. { 0x3e97bb9a,0x56166329,0x441d94d9,0x9eb93363,0x0adb2a83,0x515591a6,
  102732. 0x873e1da3,0x3cdb8257 } },
  102733. /* 236 */
  102734. { { 0x7de77eab,0x137140a9,0x41648109,0xf7e1c50d,0xceb1d0df,0x762dcad2,
  102735. 0xf1f57fba,0x5a60cc89 },
  102736. { 0x40d45673,0x80b36382,0x5913c655,0x1b82be19,0xdd64b741,0x057284b8,
  102737. 0xdbfd8fc0,0x922ff56f } },
  102738. /* 237 */
  102739. { { 0xc9a129a1,0x1b265dee,0xcc284e04,0xa5b1ce57,0xcebfbe3c,0x04380c46,
  102740. 0xf6c5cd62,0x72919a7d },
  102741. { 0x8fb90f9a,0x298f453a,0x88e4031b,0xd719c00b,0x796f1856,0xe32c0e77,
  102742. 0x3624089a,0x5e791780 } },
  102743. /* 238 */
  102744. { { 0x7f63cdfb,0x5c16ec55,0xf1cae4fd,0x8e6a3571,0x560597ca,0xfce26bea,
  102745. 0xe24c2fab,0x4e0a5371 },
  102746. { 0xa5765357,0x276a40d3,0x0d73a2b4,0x3c89af44,0x41d11a32,0xb8f370ae,
  102747. 0xd56604ee,0xf5ff7818 } },
  102748. /* 239 */
  102749. { { 0x1a09df21,0xfbf3e3fe,0xe66e8e47,0x26d5d28e,0x29c89015,0x2096bd0a,
  102750. 0x533f5e64,0xe41df0e9 },
  102751. { 0xb3ba9e3f,0x305fda40,0x2604d895,0xf2340ceb,0x7f0367c7,0x0866e192,
  102752. 0xac4f155f,0x8edd7d6e } },
  102753. /* 240 */
  102754. { { 0x0bfc8ff3,0xc9a1dc0e,0xe936f42f,0x14efd82b,0xcca381ef,0x67016f7c,
  102755. 0xed8aee96,0x1432c1ca },
  102756. { 0x70b23c26,0xec684829,0x0735b273,0xa64fe873,0xeaef0f5a,0xe389f6e5,
  102757. 0x5ac8d2c6,0xcaef480b } },
  102758. /* 241 */
  102759. { { 0x75315922,0x5245c978,0x3063cca5,0xd8295171,0xb64ef2cb,0xf3ce60d0,
  102760. 0x8efae236,0xd0ba177e },
  102761. { 0xb1b3af60,0x53a9ae8f,0x3d2da20e,0x1a796ae5,0xdf9eef28,0x01d63605,
  102762. 0x1c54ae16,0xf31c957c } },
  102763. /* 242 */
  102764. { { 0x49cc4597,0xc0f58d52,0xbae0a028,0xdc5015b0,0x734a814a,0xefc5fc55,
  102765. 0x96e17c3a,0x013404cb },
  102766. { 0xc9a824bf,0xb29e2585,0x001eaed7,0xd593185e,0x61ef68ac,0x8d6ee682,
  102767. 0x91933e6c,0x6f377c4b } },
  102768. /* 243 */
  102769. { { 0xa8333fd2,0x9f93bad1,0x5a2a95b8,0xa8930202,0xeaf75ace,0x211e5037,
  102770. 0xd2d09506,0x6dba3e4e },
  102771. { 0xd04399cd,0xa48ef98c,0xe6b73ade,0x1811c66e,0xc17ecaf3,0x72f60752,
  102772. 0x3becf4a7,0xf13cf342 } },
  102773. /* 244 */
  102774. { { 0xa919e2eb,0xceeb9ec0,0xf62c0f68,0x83a9a195,0x7aba2299,0xcfba3bb6,
  102775. 0x274bbad3,0xc83fa9a9 },
  102776. { 0x62fa1ce0,0x0d7d1b0b,0x3418efbf,0xe58b60f5,0x52706f04,0xbfa8ef9e,
  102777. 0x5d702683,0xb49d70f4 } },
  102778. /* 245 */
  102779. { { 0xfad5513b,0x914c7510,0xb1751e2d,0x05f32eec,0xd9fb9d59,0x6d850418,
  102780. 0x0c30f1cf,0x59cfadbb },
  102781. { 0x55cb7fd6,0xe167ac23,0x820426a3,0x249367b8,0x90a78864,0xeaeec58c,
  102782. 0x354a4b67,0x5babf362 } },
  102783. /* 246 */
  102784. { { 0xee424865,0x37c981d1,0xf2e5577f,0x8b002878,0xb9e0c058,0x702970f1,
  102785. 0x9026c8f0,0x6188c6a7 },
  102786. { 0xd0f244da,0x06f9a19b,0xfb080873,0x1ecced5c,0x9f213637,0x35470f9b,
  102787. 0xdf50b9d9,0x993fe475 } },
  102788. /* 247 */
  102789. { { 0x9b2c3609,0x68e31cdf,0x2c46d4ea,0x84eb19c0,0x9a775101,0x7ac9ec1a,
  102790. 0x4c80616b,0x81f76466 },
  102791. { 0x75fbe978,0x1d7c2a5a,0xf183b356,0x6743fed3,0x501dd2bf,0x838d1f04,
  102792. 0x5fe9060d,0x564a812a } },
  102793. /* 248 */
  102794. { { 0xfa817d1d,0x7a5a64f4,0xbea82e0f,0x55f96844,0xcd57f9aa,0xb5ff5a0f,
  102795. 0x00e51d6c,0x226bf3cf },
  102796. { 0x2f2833cf,0xd6d1a9f9,0x4f4f89a8,0x20a0a35a,0x8f3f7f77,0x11536c49,
  102797. 0xff257836,0x68779f47 } },
  102798. /* 249 */
  102799. { { 0x73043d08,0x79b0c1c1,0x1fc020fa,0xa5446774,0x9a6d26d0,0xd3767e28,
  102800. 0xeb092e0b,0x97bcb0d1 },
  102801. { 0xf32ed3c3,0x2ab6eaa8,0xb281bc48,0xc8a4f151,0xbfa178f3,0x4d1bf4f3,
  102802. 0x0a784655,0xa872ffe8 } },
  102803. /* 250 */
  102804. { { 0xa32b2086,0xb1ab7935,0x8160f486,0xe1eb710e,0x3b6ae6be,0x9bd0cd91,
  102805. 0xb732a36a,0x02812bfc },
  102806. { 0xcf605318,0xa63fd7ca,0xfdfd6d1d,0x646e5d50,0x2102d619,0xa1d68398,
  102807. 0xfe5396af,0x07391cc9 } },
  102808. /* 251 */
  102809. { { 0x8b80d02b,0xc50157f0,0x62877f7f,0x6b8333d1,0x78d542ae,0x7aca1af8,
  102810. 0x7e6d2a08,0x355d2adc },
  102811. { 0x287386e1,0xb41f335a,0xf8e43275,0xfd272a94,0xe79989ea,0x286ca2cd,
  102812. 0x7c2a3a79,0x3dc2b1e3 } },
  102813. /* 252 */
  102814. { { 0x04581352,0xd689d21c,0x376782be,0x0a00c825,0x9fed701f,0x203bd590,
  102815. 0x3ccd846b,0xc4786910 },
  102816. { 0x24c768ed,0x5dba7708,0x6841f657,0x72feea02,0x6accce0e,0x73313ed5,
  102817. 0xd5bb4d32,0xccc42968 } },
  102818. /* 253 */
  102819. { { 0x3d7620b9,0x94e50de1,0x5992a56a,0xd89a5c8a,0x675487c9,0xdc007640,
  102820. 0xaa4871cf,0xe147eb42 },
  102821. { 0xacf3ae46,0x274ab4ee,0x50350fbe,0xfd4936fb,0x48c840ea,0xdf2afe47,
  102822. 0x080e96e3,0x239ac047 } },
  102823. /* 254 */
  102824. { { 0x2bfee8d4,0x481d1f35,0xfa7b0fec,0xce80b5cf,0x2ce9af3c,0x105c4c9e,
  102825. 0xf5f7e59d,0xc55fa1a3 },
  102826. { 0x8257c227,0x3186f14e,0x342be00b,0xc5b1653f,0xaa904fb2,0x09afc998,
  102827. 0xd4f4b699,0x094cd99c } },
  102828. /* 255 */
  102829. { { 0xd703beba,0x8a981c84,0x32ceb291,0x8631d150,0xe3bd49ec,0xa445f2c9,
  102830. 0x42abad33,0xb90a30b6 },
  102831. { 0xb4a5abf9,0xb465404f,0x75db7603,0x004750c3,0xca35d89f,0x6f9a42cc,
  102832. 0x1b7924f7,0x019f8b9a } },
  102833. };
  102834. /* Multiply the base point of P256 by the scalar and return the result.
  102835. * If map is true then convert result to affine coordinates.
  102836. *
  102837. * Stripe implementation.
  102838. * Pre-generated: 2^0, 2^32, ...
  102839. * Pre-generated: products of all combinations of above.
  102840. * 8 doubles and adds (with qz=1)
  102841. *
  102842. * r Resulting point.
  102843. * k Scalar to multiply by.
  102844. * map Indicates whether to convert result to affine.
  102845. * ct Constant time required.
  102846. * heap Heap to use for allocation.
  102847. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  102848. */
  102849. static int sp_256_ecc_mulmod_base_8(sp_point_256* r, const sp_digit* k,
  102850. int map, int ct, void* heap)
  102851. {
  102852. return sp_256_ecc_mulmod_stripe_8(r, &p256_base, p256_table,
  102853. k, map, ct, heap);
  102854. }
  102855. #endif
  102856. /* Multiply the base point of P256 by the scalar and return the result.
  102857. * If map is true then convert result to affine coordinates.
  102858. *
  102859. * km Scalar to multiply by.
  102860. * r Resulting point.
  102861. * map Indicates whether to convert result to affine.
  102862. * heap Heap to use for allocation.
  102863. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  102864. */
  102865. int sp_ecc_mulmod_base_256(const mp_int* km, ecc_point* r, int map, void* heap)
  102866. {
  102867. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102868. sp_point_256* point = NULL;
  102869. sp_digit* k = NULL;
  102870. #else
  102871. sp_point_256 point[1];
  102872. sp_digit k[8];
  102873. #endif
  102874. int err = MP_OKAY;
  102875. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102876. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  102877. DYNAMIC_TYPE_ECC);
  102878. if (point == NULL)
  102879. err = MEMORY_E;
  102880. if (err == MP_OKAY) {
  102881. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  102882. DYNAMIC_TYPE_ECC);
  102883. if (k == NULL)
  102884. err = MEMORY_E;
  102885. }
  102886. #endif
  102887. if (err == MP_OKAY) {
  102888. sp_256_from_mp(k, 8, km);
  102889. err = sp_256_ecc_mulmod_base_8(point, k, map, 1, heap);
  102890. }
  102891. if (err == MP_OKAY) {
  102892. err = sp_256_point_to_ecc_point_8(point, r);
  102893. }
  102894. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102895. if (k != NULL)
  102896. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  102897. if (point != NULL)
  102898. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  102899. #endif
  102900. return err;
  102901. }
  102902. /* Multiply the base point of P256 by the scalar, add point a and return
  102903. * the result. If map is true then convert result to affine coordinates.
  102904. *
  102905. * km Scalar to multiply by.
  102906. * am Point to add to scalar mulitply result.
  102907. * inMont Point to add is in montgomery form.
  102908. * r Resulting point.
  102909. * map Indicates whether to convert result to affine.
  102910. * heap Heap to use for allocation.
  102911. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  102912. */
  102913. int sp_ecc_mulmod_base_add_256(const mp_int* km, const ecc_point* am,
  102914. int inMont, ecc_point* r, int map, void* heap)
  102915. {
  102916. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102917. sp_point_256* point = NULL;
  102918. sp_digit* k = NULL;
  102919. #else
  102920. sp_point_256 point[2];
  102921. sp_digit k[8 + 8 * 2 * 6];
  102922. #endif
  102923. sp_point_256* addP = NULL;
  102924. sp_digit* tmp = NULL;
  102925. int err = MP_OKAY;
  102926. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102927. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  102928. DYNAMIC_TYPE_ECC);
  102929. if (point == NULL)
  102930. err = MEMORY_E;
  102931. if (err == MP_OKAY) {
  102932. k = (sp_digit*)XMALLOC(
  102933. sizeof(sp_digit) * (8 + 8 * 2 * 6),
  102934. heap, DYNAMIC_TYPE_ECC);
  102935. if (k == NULL)
  102936. err = MEMORY_E;
  102937. }
  102938. #endif
  102939. if (err == MP_OKAY) {
  102940. addP = point + 1;
  102941. tmp = k + 8;
  102942. sp_256_from_mp(k, 8, km);
  102943. sp_256_point_from_ecc_point_8(addP, am);
  102944. }
  102945. if ((err == MP_OKAY) && (!inMont)) {
  102946. err = sp_256_mod_mul_norm_8(addP->x, addP->x, p256_mod);
  102947. }
  102948. if ((err == MP_OKAY) && (!inMont)) {
  102949. err = sp_256_mod_mul_norm_8(addP->y, addP->y, p256_mod);
  102950. }
  102951. if ((err == MP_OKAY) && (!inMont)) {
  102952. err = sp_256_mod_mul_norm_8(addP->z, addP->z, p256_mod);
  102953. }
  102954. if (err == MP_OKAY) {
  102955. err = sp_256_ecc_mulmod_base_8(point, k, 0, 0, heap);
  102956. }
  102957. if (err == MP_OKAY) {
  102958. sp_256_proj_point_add_8(point, point, addP, tmp);
  102959. if (map) {
  102960. sp_256_map_8(point, point, tmp);
  102961. }
  102962. err = sp_256_point_to_ecc_point_8(point, r);
  102963. }
  102964. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  102965. if (k != NULL)
  102966. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  102967. if (point)
  102968. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  102969. #endif
  102970. return err;
  102971. }
  102972. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  102973. defined(HAVE_ECC_VERIFY)
  102974. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  102975. /* Add 1 to a. (a = a + 1)
  102976. *
  102977. * a A single precision integer.
  102978. */
  102979. SP_NOINLINE static void sp_256_add_one_8(sp_digit* a)
  102980. {
  102981. __asm__ __volatile__ (
  102982. "movs r2, #1\n\t"
  102983. "ldr r1, [%[a]]\n\t"
  102984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  102985. "adds r1, r1, r2\n\t"
  102986. #else
  102987. "add r1, r1, r2\n\t"
  102988. #endif
  102989. "movs r2, #0\n\t"
  102990. "str r1, [%[a]]\n\t"
  102991. "ldr r1, [%[a], #4]\n\t"
  102992. #ifdef WOLFSSL_KEIL
  102993. "adcs r1, r1, r2\n\t"
  102994. #elif defined(__clang__)
  102995. "adcs r1, r2\n\t"
  102996. #else
  102997. "adc r1, r2\n\t"
  102998. #endif
  102999. "str r1, [%[a], #4]\n\t"
  103000. "ldr r1, [%[a], #8]\n\t"
  103001. #ifdef WOLFSSL_KEIL
  103002. "adcs r1, r1, r2\n\t"
  103003. #elif defined(__clang__)
  103004. "adcs r1, r2\n\t"
  103005. #else
  103006. "adc r1, r2\n\t"
  103007. #endif
  103008. "str r1, [%[a], #8]\n\t"
  103009. "ldr r1, [%[a], #12]\n\t"
  103010. #ifdef WOLFSSL_KEIL
  103011. "adcs r1, r1, r2\n\t"
  103012. #elif defined(__clang__)
  103013. "adcs r1, r2\n\t"
  103014. #else
  103015. "adc r1, r2\n\t"
  103016. #endif
  103017. "str r1, [%[a], #12]\n\t"
  103018. "ldr r1, [%[a], #16]\n\t"
  103019. #ifdef WOLFSSL_KEIL
  103020. "adcs r1, r1, r2\n\t"
  103021. #elif defined(__clang__)
  103022. "adcs r1, r2\n\t"
  103023. #else
  103024. "adc r1, r2\n\t"
  103025. #endif
  103026. "str r1, [%[a], #16]\n\t"
  103027. "ldr r1, [%[a], #20]\n\t"
  103028. #ifdef WOLFSSL_KEIL
  103029. "adcs r1, r1, r2\n\t"
  103030. #elif defined(__clang__)
  103031. "adcs r1, r2\n\t"
  103032. #else
  103033. "adc r1, r2\n\t"
  103034. #endif
  103035. "str r1, [%[a], #20]\n\t"
  103036. "ldr r1, [%[a], #24]\n\t"
  103037. #ifdef WOLFSSL_KEIL
  103038. "adcs r1, r1, r2\n\t"
  103039. #elif defined(__clang__)
  103040. "adcs r1, r2\n\t"
  103041. #else
  103042. "adc r1, r2\n\t"
  103043. #endif
  103044. "str r1, [%[a], #24]\n\t"
  103045. "ldr r1, [%[a], #28]\n\t"
  103046. #ifdef WOLFSSL_KEIL
  103047. "adcs r1, r1, r2\n\t"
  103048. #elif defined(__clang__)
  103049. "adcs r1, r2\n\t"
  103050. #else
  103051. "adc r1, r2\n\t"
  103052. #endif
  103053. "str r1, [%[a], #28]\n\t"
  103054. : [a] "+l" (a)
  103055. :
  103056. : "memory", "r1", "r2"
  103057. );
  103058. }
  103059. /* Read big endian unsigned byte array into r.
  103060. *
  103061. * r A single precision integer.
  103062. * size Maximum number of bytes to convert
  103063. * a Byte array.
  103064. * n Number of bytes in array to read.
  103065. */
  103066. static void sp_256_from_bin(sp_digit* r, int size, const byte* a, int n)
  103067. {
  103068. int i;
  103069. int j;
  103070. byte* d;
  103071. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  103072. r[j] = ((sp_digit)a[i - 0] << 0) |
  103073. ((sp_digit)a[i - 1] << 8) |
  103074. ((sp_digit)a[i - 2] << 16) |
  103075. ((sp_digit)a[i - 3] << 24);
  103076. j++;
  103077. }
  103078. if (i >= 0) {
  103079. r[j] = 0;
  103080. d = (byte*)r;
  103081. switch (i) {
  103082. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  103083. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  103084. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  103085. }
  103086. j++;
  103087. }
  103088. for (; j < size; j++) {
  103089. r[j] = 0;
  103090. }
  103091. }
  103092. /* Generates a scalar that is in the range 1..order-1.
  103093. *
  103094. * rng Random number generator.
  103095. * k Scalar value.
  103096. * returns RNG failures, MEMORY_E when memory allocation fails and
  103097. * MP_OKAY on success.
  103098. */
  103099. static int sp_256_ecc_gen_k_8(WC_RNG* rng, sp_digit* k)
  103100. {
  103101. int err;
  103102. byte buf[32];
  103103. do {
  103104. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  103105. if (err == 0) {
  103106. sp_256_from_bin(k, 8, buf, (int)sizeof(buf));
  103107. if (sp_256_cmp_8(k, p256_order2) <= 0) {
  103108. sp_256_add_one_8(k);
  103109. break;
  103110. }
  103111. }
  103112. }
  103113. while (err == 0);
  103114. return err;
  103115. }
  103116. /* Makes a random EC key pair.
  103117. *
  103118. * rng Random number generator.
  103119. * priv Generated private value.
  103120. * pub Generated public point.
  103121. * heap Heap to use for allocation.
  103122. * returns ECC_INF_E when the point does not have the correct order, RNG
  103123. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  103124. */
  103125. int sp_ecc_make_key_256(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  103126. {
  103127. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103128. sp_point_256* point = NULL;
  103129. sp_digit* k = NULL;
  103130. #else
  103131. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103132. sp_point_256 point[2];
  103133. #else
  103134. sp_point_256 point[1];
  103135. #endif
  103136. sp_digit k[8];
  103137. #endif
  103138. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103139. sp_point_256* infinity = NULL;
  103140. #endif
  103141. int err = MP_OKAY;
  103142. (void)heap;
  103143. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103144. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103145. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC);
  103146. #else
  103147. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC);
  103148. #endif
  103149. if (point == NULL)
  103150. err = MEMORY_E;
  103151. if (err == MP_OKAY) {
  103152. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  103153. DYNAMIC_TYPE_ECC);
  103154. if (k == NULL)
  103155. err = MEMORY_E;
  103156. }
  103157. #endif
  103158. if (err == MP_OKAY) {
  103159. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103160. infinity = point + 1;
  103161. #endif
  103162. err = sp_256_ecc_gen_k_8(rng, k);
  103163. }
  103164. if (err == MP_OKAY) {
  103165. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, NULL);
  103166. }
  103167. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  103168. if (err == MP_OKAY) {
  103169. err = sp_256_ecc_mulmod_8(infinity, point, p256_order, 1, 1, NULL);
  103170. }
  103171. if (err == MP_OKAY) {
  103172. if (sp_256_iszero_8(point->x) || sp_256_iszero_8(point->y)) {
  103173. err = ECC_INF_E;
  103174. }
  103175. }
  103176. #endif
  103177. if (err == MP_OKAY) {
  103178. err = sp_256_to_mp(k, priv);
  103179. }
  103180. if (err == MP_OKAY) {
  103181. err = sp_256_point_to_ecc_point_8(point, pub);
  103182. }
  103183. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103184. if (k != NULL)
  103185. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  103186. if (point != NULL) {
  103187. /* point is not sensitive, so no need to zeroize */
  103188. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  103189. }
  103190. #endif
  103191. return err;
  103192. }
  103193. #ifdef HAVE_ECC_DHE
  103194. /* Write r as big endian to byte array.
  103195. * Fixed length number of bytes written: 32
  103196. *
  103197. * r A single precision integer.
  103198. * a Byte array.
  103199. */
  103200. static void sp_256_to_bin_8(sp_digit* r, byte* a)
  103201. {
  103202. int i;
  103203. int j = 0;
  103204. for (i = 7; i >= 0; i--) {
  103205. a[j++] = r[i] >> 24;
  103206. a[j++] = r[i] >> 16;
  103207. a[j++] = r[i] >> 8;
  103208. a[j++] = r[i] >> 0;
  103209. }
  103210. }
  103211. /* Multiply the point by the scalar and serialize the X ordinate.
  103212. * The number is 0 padded to maximum size on output.
  103213. *
  103214. * priv Scalar to multiply the point by.
  103215. * pub Point to multiply.
  103216. * out Buffer to hold X ordinate.
  103217. * outLen On entry, size of the buffer in bytes.
  103218. * On exit, length of data in buffer in bytes.
  103219. * heap Heap to use for allocation.
  103220. * returns BUFFER_E if the buffer is to small for output size,
  103221. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  103222. */
  103223. int sp_ecc_secret_gen_256(const mp_int* priv, const ecc_point* pub, byte* out,
  103224. word32* outLen, void* heap)
  103225. {
  103226. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103227. sp_point_256* point = NULL;
  103228. sp_digit* k = NULL;
  103229. #else
  103230. sp_point_256 point[1];
  103231. sp_digit k[8];
  103232. #endif
  103233. int err = MP_OKAY;
  103234. if (*outLen < 32U) {
  103235. err = BUFFER_E;
  103236. }
  103237. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103238. if (err == MP_OKAY) {
  103239. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  103240. DYNAMIC_TYPE_ECC);
  103241. if (point == NULL)
  103242. err = MEMORY_E;
  103243. }
  103244. if (err == MP_OKAY) {
  103245. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  103246. DYNAMIC_TYPE_ECC);
  103247. if (k == NULL)
  103248. err = MEMORY_E;
  103249. }
  103250. #endif
  103251. if (err == MP_OKAY) {
  103252. sp_256_from_mp(k, 8, priv);
  103253. sp_256_point_from_ecc_point_8(point, pub);
  103254. err = sp_256_ecc_mulmod_8(point, point, k, 1, 1, heap);
  103255. }
  103256. if (err == MP_OKAY) {
  103257. sp_256_to_bin_8(point->x, out);
  103258. *outLen = 32;
  103259. }
  103260. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  103261. if (k != NULL)
  103262. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  103263. if (point != NULL)
  103264. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  103265. #endif
  103266. return err;
  103267. }
  103268. #endif /* HAVE_ECC_DHE */
  103269. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  103270. #endif
  103271. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  103272. #endif
  103273. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  103274. #ifdef WOLFSSL_SP_SMALL
  103275. /* Sub b from a into a. (a -= b)
  103276. *
  103277. * a A single precision integer.
  103278. * b A single precision integer.
  103279. */
  103280. SP_NOINLINE static sp_digit sp_256_sub_in_place_8(sp_digit* a,
  103281. const sp_digit* b)
  103282. {
  103283. __asm__ __volatile__ (
  103284. "movs r7, %[a]\n\t"
  103285. "movs r2, #0\n\t"
  103286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103287. "adds r7, r7, #32\n\t"
  103288. #else
  103289. "add r7, r7, #32\n\t"
  103290. #endif
  103291. "\n"
  103292. "L_sp_256_sub_in_place_8_words_%=:\n\t"
  103293. "movs r5, #0\n\t"
  103294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103295. "subs r5, r5, r2\n\t"
  103296. #else
  103297. "sub r5, r5, r2\n\t"
  103298. #endif
  103299. "ldr r3, [%[a]]\n\t"
  103300. "ldr r4, [%[a], #4]\n\t"
  103301. "ldr r5, [%[b]]\n\t"
  103302. "ldr r6, [%[b], #4]\n\t"
  103303. #ifdef WOLFSSL_KEIL
  103304. "sbcs r3, r3, r5\n\t"
  103305. #elif defined(__clang__)
  103306. "sbcs r3, r5\n\t"
  103307. #else
  103308. "sbc r3, r5\n\t"
  103309. #endif
  103310. #ifdef WOLFSSL_KEIL
  103311. "sbcs r4, r4, r6\n\t"
  103312. #elif defined(__clang__)
  103313. "sbcs r4, r6\n\t"
  103314. #else
  103315. "sbc r4, r6\n\t"
  103316. #endif
  103317. "str r3, [%[a]]\n\t"
  103318. "str r4, [%[a], #4]\n\t"
  103319. #ifdef WOLFSSL_KEIL
  103320. "sbcs r2, r2, r2\n\t"
  103321. #elif defined(__clang__)
  103322. "sbcs r2, r2\n\t"
  103323. #else
  103324. "sbc r2, r2\n\t"
  103325. #endif
  103326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103327. "adds %[a], %[a], #8\n\t"
  103328. #else
  103329. "add %[a], %[a], #8\n\t"
  103330. #endif
  103331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103332. "adds %[b], %[b], #8\n\t"
  103333. #else
  103334. "add %[b], %[b], #8\n\t"
  103335. #endif
  103336. "cmp %[a], r7\n\t"
  103337. "bne L_sp_256_sub_in_place_8_words_%=\n\t"
  103338. "movs %[a], r2\n\t"
  103339. : [a] "+l" (a), [b] "+l" (b)
  103340. :
  103341. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  103342. );
  103343. return (uint32_t)(size_t)a;
  103344. }
  103345. #else
  103346. /* Sub b from a into a. (a -= b)
  103347. *
  103348. * a A single precision integer.
  103349. * b A single precision integer.
  103350. */
  103351. SP_NOINLINE static sp_digit sp_256_sub_in_place_8(sp_digit* a,
  103352. const sp_digit* b)
  103353. {
  103354. __asm__ __volatile__ (
  103355. "ldm %[b]!, {r4, r5}\n\t"
  103356. "ldr r2, [%[a]]\n\t"
  103357. "ldr r3, [%[a], #4]\n\t"
  103358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103359. "subs r2, r2, r4\n\t"
  103360. #else
  103361. "sub r2, r2, r4\n\t"
  103362. #endif
  103363. #ifdef WOLFSSL_KEIL
  103364. "sbcs r3, r3, r5\n\t"
  103365. #elif defined(__clang__)
  103366. "sbcs r3, r5\n\t"
  103367. #else
  103368. "sbc r3, r5\n\t"
  103369. #endif
  103370. "stm %[a]!, {r2, r3}\n\t"
  103371. "ldm %[b]!, {r4, r5}\n\t"
  103372. "ldr r2, [%[a]]\n\t"
  103373. "ldr r3, [%[a], #4]\n\t"
  103374. #ifdef WOLFSSL_KEIL
  103375. "sbcs r2, r2, r4\n\t"
  103376. #elif defined(__clang__)
  103377. "sbcs r2, r4\n\t"
  103378. #else
  103379. "sbc r2, r4\n\t"
  103380. #endif
  103381. #ifdef WOLFSSL_KEIL
  103382. "sbcs r3, r3, r5\n\t"
  103383. #elif defined(__clang__)
  103384. "sbcs r3, r5\n\t"
  103385. #else
  103386. "sbc r3, r5\n\t"
  103387. #endif
  103388. "stm %[a]!, {r2, r3}\n\t"
  103389. "ldm %[b]!, {r4, r5}\n\t"
  103390. "ldr r2, [%[a]]\n\t"
  103391. "ldr r3, [%[a], #4]\n\t"
  103392. #ifdef WOLFSSL_KEIL
  103393. "sbcs r2, r2, r4\n\t"
  103394. #elif defined(__clang__)
  103395. "sbcs r2, r4\n\t"
  103396. #else
  103397. "sbc r2, r4\n\t"
  103398. #endif
  103399. #ifdef WOLFSSL_KEIL
  103400. "sbcs r3, r3, r5\n\t"
  103401. #elif defined(__clang__)
  103402. "sbcs r3, r5\n\t"
  103403. #else
  103404. "sbc r3, r5\n\t"
  103405. #endif
  103406. "stm %[a]!, {r2, r3}\n\t"
  103407. "ldm %[b]!, {r4, r5}\n\t"
  103408. "ldr r2, [%[a]]\n\t"
  103409. "ldr r3, [%[a], #4]\n\t"
  103410. #ifdef WOLFSSL_KEIL
  103411. "sbcs r2, r2, r4\n\t"
  103412. #elif defined(__clang__)
  103413. "sbcs r2, r4\n\t"
  103414. #else
  103415. "sbc r2, r4\n\t"
  103416. #endif
  103417. #ifdef WOLFSSL_KEIL
  103418. "sbcs r3, r3, r5\n\t"
  103419. #elif defined(__clang__)
  103420. "sbcs r3, r5\n\t"
  103421. #else
  103422. "sbc r3, r5\n\t"
  103423. #endif
  103424. "stm %[a]!, {r2, r3}\n\t"
  103425. #ifdef WOLFSSL_KEIL
  103426. "sbcs %[a], %[a], %[a]\n\t"
  103427. #elif defined(__clang__)
  103428. "sbcs %[a], %[a]\n\t"
  103429. #else
  103430. "sbc %[a], %[a]\n\t"
  103431. #endif
  103432. : [a] "+l" (a), [b] "+l" (b)
  103433. :
  103434. : "memory", "r2", "r3", "r4", "r5"
  103435. );
  103436. return (uint32_t)(size_t)a;
  103437. }
  103438. #endif /* WOLFSSL_SP_SMALL */
  103439. /* Mul a by digit b into r. (r = a * b)
  103440. *
  103441. * r A single precision integer.
  103442. * a A single precision integer.
  103443. * b A single precision digit.
  103444. */
  103445. SP_NOINLINE static void sp_256_mul_d_8(sp_digit* r, const sp_digit* a,
  103446. sp_digit b)
  103447. {
  103448. __asm__ __volatile__ (
  103449. "movs r6, #32\n\t"
  103450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103451. "adds r6, r6, %[a]\n\t"
  103452. #else
  103453. "add r6, r6, %[a]\n\t"
  103454. #endif
  103455. "mov r8, %[r]\n\t"
  103456. "mov r9, r6\n\t"
  103457. "movs r3, #0\n\t"
  103458. "movs r4, #0\n\t"
  103459. "\n"
  103460. "L_sp_256_mul_d_8_%=:\n\t"
  103461. "movs %[r], #0\n\t"
  103462. "movs r5, #0\n\t"
  103463. "# A[] * B\n\t"
  103464. "ldrh r6, [%[a]]\n\t"
  103465. "uxth r7, %[b]\n\t"
  103466. #ifdef WOLFSSL_KEIL
  103467. "muls r7, r6, r7\n\t"
  103468. #elif defined(__clang__)
  103469. "muls r7, r6\n\t"
  103470. #else
  103471. "mul r7, r6\n\t"
  103472. #endif
  103473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103474. "adds r3, r3, r7\n\t"
  103475. #else
  103476. "add r3, r3, r7\n\t"
  103477. #endif
  103478. #ifdef WOLFSSL_KEIL
  103479. "adcs r4, r4, %[r]\n\t"
  103480. #elif defined(__clang__)
  103481. "adcs r4, %[r]\n\t"
  103482. #else
  103483. "adc r4, %[r]\n\t"
  103484. #endif
  103485. #ifdef WOLFSSL_KEIL
  103486. "adcs r5, r5, %[r]\n\t"
  103487. #elif defined(__clang__)
  103488. "adcs r5, %[r]\n\t"
  103489. #else
  103490. "adc r5, %[r]\n\t"
  103491. #endif
  103492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103493. "lsrs r7, %[b], #16\n\t"
  103494. #else
  103495. "lsr r7, %[b], #16\n\t"
  103496. #endif
  103497. #ifdef WOLFSSL_KEIL
  103498. "muls r6, r7, r6\n\t"
  103499. #elif defined(__clang__)
  103500. "muls r6, r7\n\t"
  103501. #else
  103502. "mul r6, r7\n\t"
  103503. #endif
  103504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103505. "lsrs r7, r6, #16\n\t"
  103506. #else
  103507. "lsr r7, r6, #16\n\t"
  103508. #endif
  103509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103510. "lsls r6, r6, #16\n\t"
  103511. #else
  103512. "lsl r6, r6, #16\n\t"
  103513. #endif
  103514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103515. "adds r3, r3, r6\n\t"
  103516. #else
  103517. "add r3, r3, r6\n\t"
  103518. #endif
  103519. #ifdef WOLFSSL_KEIL
  103520. "adcs r4, r4, r7\n\t"
  103521. #elif defined(__clang__)
  103522. "adcs r4, r7\n\t"
  103523. #else
  103524. "adc r4, r7\n\t"
  103525. #endif
  103526. #ifdef WOLFSSL_KEIL
  103527. "adcs r5, r5, %[r]\n\t"
  103528. #elif defined(__clang__)
  103529. "adcs r5, %[r]\n\t"
  103530. #else
  103531. "adc r5, %[r]\n\t"
  103532. #endif
  103533. "ldr r6, [%[a]]\n\t"
  103534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103535. "lsrs r6, r6, #16\n\t"
  103536. #else
  103537. "lsr r6, r6, #16\n\t"
  103538. #endif
  103539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103540. "lsrs r7, %[b], #16\n\t"
  103541. #else
  103542. "lsr r7, %[b], #16\n\t"
  103543. #endif
  103544. #ifdef WOLFSSL_KEIL
  103545. "muls r7, r6, r7\n\t"
  103546. #elif defined(__clang__)
  103547. "muls r7, r6\n\t"
  103548. #else
  103549. "mul r7, r6\n\t"
  103550. #endif
  103551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103552. "adds r4, r4, r7\n\t"
  103553. #else
  103554. "add r4, r4, r7\n\t"
  103555. #endif
  103556. #ifdef WOLFSSL_KEIL
  103557. "adcs r5, r5, %[r]\n\t"
  103558. #elif defined(__clang__)
  103559. "adcs r5, %[r]\n\t"
  103560. #else
  103561. "adc r5, %[r]\n\t"
  103562. #endif
  103563. "uxth r7, %[b]\n\t"
  103564. #ifdef WOLFSSL_KEIL
  103565. "muls r6, r7, r6\n\t"
  103566. #elif defined(__clang__)
  103567. "muls r6, r7\n\t"
  103568. #else
  103569. "mul r6, r7\n\t"
  103570. #endif
  103571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103572. "lsrs r7, r6, #16\n\t"
  103573. #else
  103574. "lsr r7, r6, #16\n\t"
  103575. #endif
  103576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103577. "lsls r6, r6, #16\n\t"
  103578. #else
  103579. "lsl r6, r6, #16\n\t"
  103580. #endif
  103581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103582. "adds r3, r3, r6\n\t"
  103583. #else
  103584. "add r3, r3, r6\n\t"
  103585. #endif
  103586. #ifdef WOLFSSL_KEIL
  103587. "adcs r4, r4, r7\n\t"
  103588. #elif defined(__clang__)
  103589. "adcs r4, r7\n\t"
  103590. #else
  103591. "adc r4, r7\n\t"
  103592. #endif
  103593. #ifdef WOLFSSL_KEIL
  103594. "adcs r5, r5, %[r]\n\t"
  103595. #elif defined(__clang__)
  103596. "adcs r5, %[r]\n\t"
  103597. #else
  103598. "adc r5, %[r]\n\t"
  103599. #endif
  103600. "# A[] * B - Done\n\t"
  103601. "mov %[r], r8\n\t"
  103602. "str r3, [%[r]]\n\t"
  103603. "movs r3, r4\n\t"
  103604. "movs r4, r5\n\t"
  103605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103606. "adds %[r], %[r], #4\n\t"
  103607. #else
  103608. "add %[r], %[r], #4\n\t"
  103609. #endif
  103610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103611. "adds %[a], %[a], #4\n\t"
  103612. #else
  103613. "add %[a], %[a], #4\n\t"
  103614. #endif
  103615. "mov r8, %[r]\n\t"
  103616. "cmp %[a], r9\n\t"
  103617. "blt L_sp_256_mul_d_8_%=\n\t"
  103618. "str r3, [%[r]]\n\t"
  103619. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  103620. :
  103621. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  103622. );
  103623. }
  103624. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  103625. *
  103626. * d1 The high order half of the number to divide.
  103627. * d0 The low order half of the number to divide.
  103628. * div The divisor.
  103629. * returns the result of the division.
  103630. *
  103631. * Note that this is an approximate div. It may give an answer 1 larger.
  103632. */
  103633. SP_NOINLINE static sp_digit div_256_word_8(sp_digit d1, sp_digit d0,
  103634. sp_digit div)
  103635. {
  103636. __asm__ __volatile__ (
  103637. "movs r3, #0\n\t"
  103638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103639. "lsrs r5, %[div], #1\n\t"
  103640. #else
  103641. "lsr r5, %[div], #1\n\t"
  103642. #endif
  103643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103644. "adds r5, r5, #1\n\t"
  103645. #else
  103646. "add r5, r5, #1\n\t"
  103647. #endif
  103648. "mov r8, %[d0]\n\t"
  103649. "mov r9, %[d1]\n\t"
  103650. "# Do top 32\n\t"
  103651. "movs r6, r5\n\t"
  103652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103653. "subs r6, r6, %[d1]\n\t"
  103654. #else
  103655. "sub r6, r6, %[d1]\n\t"
  103656. #endif
  103657. #ifdef WOLFSSL_KEIL
  103658. "sbcs r6, r6, r6\n\t"
  103659. #elif defined(__clang__)
  103660. "sbcs r6, r6\n\t"
  103661. #else
  103662. "sbc r6, r6\n\t"
  103663. #endif
  103664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103665. "adds r3, r3, r3\n\t"
  103666. #else
  103667. "add r3, r3, r3\n\t"
  103668. #endif
  103669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103670. "subs r3, r3, r6\n\t"
  103671. #else
  103672. "sub r3, r3, r6\n\t"
  103673. #endif
  103674. #ifdef WOLFSSL_KEIL
  103675. "ands r6, r6, r5\n\t"
  103676. #elif defined(__clang__)
  103677. "ands r6, r5\n\t"
  103678. #else
  103679. "and r6, r5\n\t"
  103680. #endif
  103681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103682. "subs %[d1], %[d1], r6\n\t"
  103683. #else
  103684. "sub %[d1], %[d1], r6\n\t"
  103685. #endif
  103686. "movs r4, #29\n\t"
  103687. "\n"
  103688. "L_div_256_word_8_loop_%=:\n\t"
  103689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103690. "lsls %[d0], %[d0], #1\n\t"
  103691. #else
  103692. "lsl %[d0], %[d0], #1\n\t"
  103693. #endif
  103694. #ifdef WOLFSSL_KEIL
  103695. "adcs %[d1], %[d1], %[d1]\n\t"
  103696. #elif defined(__clang__)
  103697. "adcs %[d1], %[d1]\n\t"
  103698. #else
  103699. "adc %[d1], %[d1]\n\t"
  103700. #endif
  103701. "movs r6, r5\n\t"
  103702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103703. "subs r6, r6, %[d1]\n\t"
  103704. #else
  103705. "sub r6, r6, %[d1]\n\t"
  103706. #endif
  103707. #ifdef WOLFSSL_KEIL
  103708. "sbcs r6, r6, r6\n\t"
  103709. #elif defined(__clang__)
  103710. "sbcs r6, r6\n\t"
  103711. #else
  103712. "sbc r6, r6\n\t"
  103713. #endif
  103714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103715. "adds r3, r3, r3\n\t"
  103716. #else
  103717. "add r3, r3, r3\n\t"
  103718. #endif
  103719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103720. "subs r3, r3, r6\n\t"
  103721. #else
  103722. "sub r3, r3, r6\n\t"
  103723. #endif
  103724. #ifdef WOLFSSL_KEIL
  103725. "ands r6, r6, r5\n\t"
  103726. #elif defined(__clang__)
  103727. "ands r6, r5\n\t"
  103728. #else
  103729. "and r6, r5\n\t"
  103730. #endif
  103731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103732. "subs %[d1], %[d1], r6\n\t"
  103733. #else
  103734. "sub %[d1], %[d1], r6\n\t"
  103735. #endif
  103736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103737. "subs r4, r4, #1\n\t"
  103738. #else
  103739. "sub r4, r4, #1\n\t"
  103740. #endif
  103741. "bpl L_div_256_word_8_loop_%=\n\t"
  103742. "movs r7, #0\n\t"
  103743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103744. "adds r3, r3, r3\n\t"
  103745. #else
  103746. "add r3, r3, r3\n\t"
  103747. #endif
  103748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103749. "adds r3, r3, #1\n\t"
  103750. #else
  103751. "add r3, r3, #1\n\t"
  103752. #endif
  103753. "# r * div - Start\n\t"
  103754. "uxth %[d1], r3\n\t"
  103755. "uxth r4, %[div]\n\t"
  103756. #ifdef WOLFSSL_KEIL
  103757. "muls r4, %[d1], r4\n\t"
  103758. #elif defined(__clang__)
  103759. "muls r4, %[d1]\n\t"
  103760. #else
  103761. "mul r4, %[d1]\n\t"
  103762. #endif
  103763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103764. "lsrs r6, %[div], #16\n\t"
  103765. #else
  103766. "lsr r6, %[div], #16\n\t"
  103767. #endif
  103768. #ifdef WOLFSSL_KEIL
  103769. "muls %[d1], r6, %[d1]\n\t"
  103770. #elif defined(__clang__)
  103771. "muls %[d1], r6\n\t"
  103772. #else
  103773. "mul %[d1], r6\n\t"
  103774. #endif
  103775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103776. "lsrs r5, %[d1], #16\n\t"
  103777. #else
  103778. "lsr r5, %[d1], #16\n\t"
  103779. #endif
  103780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103781. "lsls %[d1], %[d1], #16\n\t"
  103782. #else
  103783. "lsl %[d1], %[d1], #16\n\t"
  103784. #endif
  103785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103786. "adds r4, r4, %[d1]\n\t"
  103787. #else
  103788. "add r4, r4, %[d1]\n\t"
  103789. #endif
  103790. #ifdef WOLFSSL_KEIL
  103791. "adcs r5, r5, r7\n\t"
  103792. #elif defined(__clang__)
  103793. "adcs r5, r7\n\t"
  103794. #else
  103795. "adc r5, r7\n\t"
  103796. #endif
  103797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103798. "lsrs %[d1], r3, #16\n\t"
  103799. #else
  103800. "lsr %[d1], r3, #16\n\t"
  103801. #endif
  103802. #ifdef WOLFSSL_KEIL
  103803. "muls r6, %[d1], r6\n\t"
  103804. #elif defined(__clang__)
  103805. "muls r6, %[d1]\n\t"
  103806. #else
  103807. "mul r6, %[d1]\n\t"
  103808. #endif
  103809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103810. "adds r5, r5, r6\n\t"
  103811. #else
  103812. "add r5, r5, r6\n\t"
  103813. #endif
  103814. "uxth r6, %[div]\n\t"
  103815. #ifdef WOLFSSL_KEIL
  103816. "muls %[d1], r6, %[d1]\n\t"
  103817. #elif defined(__clang__)
  103818. "muls %[d1], r6\n\t"
  103819. #else
  103820. "mul %[d1], r6\n\t"
  103821. #endif
  103822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103823. "lsrs r6, %[d1], #16\n\t"
  103824. #else
  103825. "lsr r6, %[d1], #16\n\t"
  103826. #endif
  103827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103828. "lsls %[d1], %[d1], #16\n\t"
  103829. #else
  103830. "lsl %[d1], %[d1], #16\n\t"
  103831. #endif
  103832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103833. "adds r4, r4, %[d1]\n\t"
  103834. #else
  103835. "add r4, r4, %[d1]\n\t"
  103836. #endif
  103837. #ifdef WOLFSSL_KEIL
  103838. "adcs r5, r5, r6\n\t"
  103839. #elif defined(__clang__)
  103840. "adcs r5, r6\n\t"
  103841. #else
  103842. "adc r5, r6\n\t"
  103843. #endif
  103844. "# r * div - Done\n\t"
  103845. "mov %[d1], r8\n\t"
  103846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103847. "subs %[d1], %[d1], r4\n\t"
  103848. #else
  103849. "sub %[d1], %[d1], r4\n\t"
  103850. #endif
  103851. "movs r4, %[d1]\n\t"
  103852. "mov %[d1], r9\n\t"
  103853. #ifdef WOLFSSL_KEIL
  103854. "sbcs %[d1], %[d1], r5\n\t"
  103855. #elif defined(__clang__)
  103856. "sbcs %[d1], r5\n\t"
  103857. #else
  103858. "sbc %[d1], r5\n\t"
  103859. #endif
  103860. "movs r5, %[d1]\n\t"
  103861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103862. "adds r3, r3, r5\n\t"
  103863. #else
  103864. "add r3, r3, r5\n\t"
  103865. #endif
  103866. "# r * div - Start\n\t"
  103867. "uxth %[d1], r3\n\t"
  103868. "uxth r4, %[div]\n\t"
  103869. #ifdef WOLFSSL_KEIL
  103870. "muls r4, %[d1], r4\n\t"
  103871. #elif defined(__clang__)
  103872. "muls r4, %[d1]\n\t"
  103873. #else
  103874. "mul r4, %[d1]\n\t"
  103875. #endif
  103876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103877. "lsrs r6, %[div], #16\n\t"
  103878. #else
  103879. "lsr r6, %[div], #16\n\t"
  103880. #endif
  103881. #ifdef WOLFSSL_KEIL
  103882. "muls %[d1], r6, %[d1]\n\t"
  103883. #elif defined(__clang__)
  103884. "muls %[d1], r6\n\t"
  103885. #else
  103886. "mul %[d1], r6\n\t"
  103887. #endif
  103888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103889. "lsrs r5, %[d1], #16\n\t"
  103890. #else
  103891. "lsr r5, %[d1], #16\n\t"
  103892. #endif
  103893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103894. "lsls %[d1], %[d1], #16\n\t"
  103895. #else
  103896. "lsl %[d1], %[d1], #16\n\t"
  103897. #endif
  103898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103899. "adds r4, r4, %[d1]\n\t"
  103900. #else
  103901. "add r4, r4, %[d1]\n\t"
  103902. #endif
  103903. #ifdef WOLFSSL_KEIL
  103904. "adcs r5, r5, r7\n\t"
  103905. #elif defined(__clang__)
  103906. "adcs r5, r7\n\t"
  103907. #else
  103908. "adc r5, r7\n\t"
  103909. #endif
  103910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103911. "lsrs %[d1], r3, #16\n\t"
  103912. #else
  103913. "lsr %[d1], r3, #16\n\t"
  103914. #endif
  103915. #ifdef WOLFSSL_KEIL
  103916. "muls r6, %[d1], r6\n\t"
  103917. #elif defined(__clang__)
  103918. "muls r6, %[d1]\n\t"
  103919. #else
  103920. "mul r6, %[d1]\n\t"
  103921. #endif
  103922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103923. "adds r5, r5, r6\n\t"
  103924. #else
  103925. "add r5, r5, r6\n\t"
  103926. #endif
  103927. "uxth r6, %[div]\n\t"
  103928. #ifdef WOLFSSL_KEIL
  103929. "muls %[d1], r6, %[d1]\n\t"
  103930. #elif defined(__clang__)
  103931. "muls %[d1], r6\n\t"
  103932. #else
  103933. "mul %[d1], r6\n\t"
  103934. #endif
  103935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103936. "lsrs r6, %[d1], #16\n\t"
  103937. #else
  103938. "lsr r6, %[d1], #16\n\t"
  103939. #endif
  103940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103941. "lsls %[d1], %[d1], #16\n\t"
  103942. #else
  103943. "lsl %[d1], %[d1], #16\n\t"
  103944. #endif
  103945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103946. "adds r4, r4, %[d1]\n\t"
  103947. #else
  103948. "add r4, r4, %[d1]\n\t"
  103949. #endif
  103950. #ifdef WOLFSSL_KEIL
  103951. "adcs r5, r5, r6\n\t"
  103952. #elif defined(__clang__)
  103953. "adcs r5, r6\n\t"
  103954. #else
  103955. "adc r5, r6\n\t"
  103956. #endif
  103957. "# r * div - Done\n\t"
  103958. "mov %[d1], r8\n\t"
  103959. "mov r6, r9\n\t"
  103960. #ifdef WOLFSSL_KEIL
  103961. "subs r4, %[d1], r4\n\t"
  103962. #else
  103963. #ifdef __clang__
  103964. "subs r4, %[d1], r4\n\t"
  103965. #else
  103966. "sub r4, %[d1], r4\n\t"
  103967. #endif
  103968. #endif
  103969. #ifdef WOLFSSL_KEIL
  103970. "sbcs r6, r6, r5\n\t"
  103971. #elif defined(__clang__)
  103972. "sbcs r6, r5\n\t"
  103973. #else
  103974. "sbc r6, r5\n\t"
  103975. #endif
  103976. "movs r5, r6\n\t"
  103977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103978. "adds r3, r3, r5\n\t"
  103979. #else
  103980. "add r3, r3, r5\n\t"
  103981. #endif
  103982. "# r * div - Start\n\t"
  103983. "uxth %[d1], r3\n\t"
  103984. "uxth r4, %[div]\n\t"
  103985. #ifdef WOLFSSL_KEIL
  103986. "muls r4, %[d1], r4\n\t"
  103987. #elif defined(__clang__)
  103988. "muls r4, %[d1]\n\t"
  103989. #else
  103990. "mul r4, %[d1]\n\t"
  103991. #endif
  103992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  103993. "lsrs r6, %[div], #16\n\t"
  103994. #else
  103995. "lsr r6, %[div], #16\n\t"
  103996. #endif
  103997. #ifdef WOLFSSL_KEIL
  103998. "muls %[d1], r6, %[d1]\n\t"
  103999. #elif defined(__clang__)
  104000. "muls %[d1], r6\n\t"
  104001. #else
  104002. "mul %[d1], r6\n\t"
  104003. #endif
  104004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104005. "lsrs r5, %[d1], #16\n\t"
  104006. #else
  104007. "lsr r5, %[d1], #16\n\t"
  104008. #endif
  104009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104010. "lsls %[d1], %[d1], #16\n\t"
  104011. #else
  104012. "lsl %[d1], %[d1], #16\n\t"
  104013. #endif
  104014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104015. "adds r4, r4, %[d1]\n\t"
  104016. #else
  104017. "add r4, r4, %[d1]\n\t"
  104018. #endif
  104019. #ifdef WOLFSSL_KEIL
  104020. "adcs r5, r5, r7\n\t"
  104021. #elif defined(__clang__)
  104022. "adcs r5, r7\n\t"
  104023. #else
  104024. "adc r5, r7\n\t"
  104025. #endif
  104026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104027. "lsrs %[d1], r3, #16\n\t"
  104028. #else
  104029. "lsr %[d1], r3, #16\n\t"
  104030. #endif
  104031. #ifdef WOLFSSL_KEIL
  104032. "muls r6, %[d1], r6\n\t"
  104033. #elif defined(__clang__)
  104034. "muls r6, %[d1]\n\t"
  104035. #else
  104036. "mul r6, %[d1]\n\t"
  104037. #endif
  104038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104039. "adds r5, r5, r6\n\t"
  104040. #else
  104041. "add r5, r5, r6\n\t"
  104042. #endif
  104043. "uxth r6, %[div]\n\t"
  104044. #ifdef WOLFSSL_KEIL
  104045. "muls %[d1], r6, %[d1]\n\t"
  104046. #elif defined(__clang__)
  104047. "muls %[d1], r6\n\t"
  104048. #else
  104049. "mul %[d1], r6\n\t"
  104050. #endif
  104051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104052. "lsrs r6, %[d1], #16\n\t"
  104053. #else
  104054. "lsr r6, %[d1], #16\n\t"
  104055. #endif
  104056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104057. "lsls %[d1], %[d1], #16\n\t"
  104058. #else
  104059. "lsl %[d1], %[d1], #16\n\t"
  104060. #endif
  104061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104062. "adds r4, r4, %[d1]\n\t"
  104063. #else
  104064. "add r4, r4, %[d1]\n\t"
  104065. #endif
  104066. #ifdef WOLFSSL_KEIL
  104067. "adcs r5, r5, r6\n\t"
  104068. #elif defined(__clang__)
  104069. "adcs r5, r6\n\t"
  104070. #else
  104071. "adc r5, r6\n\t"
  104072. #endif
  104073. "# r * div - Done\n\t"
  104074. "mov %[d1], r8\n\t"
  104075. "mov r6, r9\n\t"
  104076. #ifdef WOLFSSL_KEIL
  104077. "subs r4, %[d1], r4\n\t"
  104078. #else
  104079. #ifdef __clang__
  104080. "subs r4, %[d1], r4\n\t"
  104081. #else
  104082. "sub r4, %[d1], r4\n\t"
  104083. #endif
  104084. #endif
  104085. #ifdef WOLFSSL_KEIL
  104086. "sbcs r6, r6, r5\n\t"
  104087. #elif defined(__clang__)
  104088. "sbcs r6, r5\n\t"
  104089. #else
  104090. "sbc r6, r5\n\t"
  104091. #endif
  104092. "movs r5, r6\n\t"
  104093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104094. "adds r3, r3, r5\n\t"
  104095. #else
  104096. "add r3, r3, r5\n\t"
  104097. #endif
  104098. "# r * div - Start\n\t"
  104099. "uxth %[d1], r3\n\t"
  104100. "uxth r4, %[div]\n\t"
  104101. #ifdef WOLFSSL_KEIL
  104102. "muls r4, %[d1], r4\n\t"
  104103. #elif defined(__clang__)
  104104. "muls r4, %[d1]\n\t"
  104105. #else
  104106. "mul r4, %[d1]\n\t"
  104107. #endif
  104108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104109. "lsrs r6, %[div], #16\n\t"
  104110. #else
  104111. "lsr r6, %[div], #16\n\t"
  104112. #endif
  104113. #ifdef WOLFSSL_KEIL
  104114. "muls %[d1], r6, %[d1]\n\t"
  104115. #elif defined(__clang__)
  104116. "muls %[d1], r6\n\t"
  104117. #else
  104118. "mul %[d1], r6\n\t"
  104119. #endif
  104120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104121. "lsrs r5, %[d1], #16\n\t"
  104122. #else
  104123. "lsr r5, %[d1], #16\n\t"
  104124. #endif
  104125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104126. "lsls %[d1], %[d1], #16\n\t"
  104127. #else
  104128. "lsl %[d1], %[d1], #16\n\t"
  104129. #endif
  104130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104131. "adds r4, r4, %[d1]\n\t"
  104132. #else
  104133. "add r4, r4, %[d1]\n\t"
  104134. #endif
  104135. #ifdef WOLFSSL_KEIL
  104136. "adcs r5, r5, r7\n\t"
  104137. #elif defined(__clang__)
  104138. "adcs r5, r7\n\t"
  104139. #else
  104140. "adc r5, r7\n\t"
  104141. #endif
  104142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104143. "lsrs %[d1], r3, #16\n\t"
  104144. #else
  104145. "lsr %[d1], r3, #16\n\t"
  104146. #endif
  104147. #ifdef WOLFSSL_KEIL
  104148. "muls r6, %[d1], r6\n\t"
  104149. #elif defined(__clang__)
  104150. "muls r6, %[d1]\n\t"
  104151. #else
  104152. "mul r6, %[d1]\n\t"
  104153. #endif
  104154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104155. "adds r5, r5, r6\n\t"
  104156. #else
  104157. "add r5, r5, r6\n\t"
  104158. #endif
  104159. "uxth r6, %[div]\n\t"
  104160. #ifdef WOLFSSL_KEIL
  104161. "muls %[d1], r6, %[d1]\n\t"
  104162. #elif defined(__clang__)
  104163. "muls %[d1], r6\n\t"
  104164. #else
  104165. "mul %[d1], r6\n\t"
  104166. #endif
  104167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104168. "lsrs r6, %[d1], #16\n\t"
  104169. #else
  104170. "lsr r6, %[d1], #16\n\t"
  104171. #endif
  104172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104173. "lsls %[d1], %[d1], #16\n\t"
  104174. #else
  104175. "lsl %[d1], %[d1], #16\n\t"
  104176. #endif
  104177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104178. "adds r4, r4, %[d1]\n\t"
  104179. #else
  104180. "add r4, r4, %[d1]\n\t"
  104181. #endif
  104182. #ifdef WOLFSSL_KEIL
  104183. "adcs r5, r5, r6\n\t"
  104184. #elif defined(__clang__)
  104185. "adcs r5, r6\n\t"
  104186. #else
  104187. "adc r5, r6\n\t"
  104188. #endif
  104189. "# r * div - Done\n\t"
  104190. "mov %[d1], r8\n\t"
  104191. "mov r6, r9\n\t"
  104192. #ifdef WOLFSSL_KEIL
  104193. "subs r4, %[d1], r4\n\t"
  104194. #else
  104195. #ifdef __clang__
  104196. "subs r4, %[d1], r4\n\t"
  104197. #else
  104198. "sub r4, %[d1], r4\n\t"
  104199. #endif
  104200. #endif
  104201. #ifdef WOLFSSL_KEIL
  104202. "sbcs r6, r6, r5\n\t"
  104203. #elif defined(__clang__)
  104204. "sbcs r6, r5\n\t"
  104205. #else
  104206. "sbc r6, r5\n\t"
  104207. #endif
  104208. "movs r5, r6\n\t"
  104209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104210. "adds r3, r3, r5\n\t"
  104211. #else
  104212. "add r3, r3, r5\n\t"
  104213. #endif
  104214. "movs r6, %[div]\n\t"
  104215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104216. "subs r6, r6, r4\n\t"
  104217. #else
  104218. "sub r6, r6, r4\n\t"
  104219. #endif
  104220. #ifdef WOLFSSL_KEIL
  104221. "sbcs r6, r6, r6\n\t"
  104222. #elif defined(__clang__)
  104223. "sbcs r6, r6\n\t"
  104224. #else
  104225. "sbc r6, r6\n\t"
  104226. #endif
  104227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104228. "subs r3, r3, r6\n\t"
  104229. #else
  104230. "sub r3, r3, r6\n\t"
  104231. #endif
  104232. "movs %[d1], r3\n\t"
  104233. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  104234. :
  104235. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  104236. );
  104237. return (uint32_t)(size_t)d1;
  104238. }
  104239. /* AND m into each word of a and store in r.
  104240. *
  104241. * r A single precision integer.
  104242. * a A single precision integer.
  104243. * m Mask to AND against each digit.
  104244. */
  104245. static void sp_256_mask_8(sp_digit* r, const sp_digit* a, sp_digit m)
  104246. {
  104247. #ifdef WOLFSSL_SP_SMALL
  104248. int i;
  104249. for (i=0; i<8; i++) {
  104250. r[i] = a[i] & m;
  104251. }
  104252. #else
  104253. r[0] = a[0] & m;
  104254. r[1] = a[1] & m;
  104255. r[2] = a[2] & m;
  104256. r[3] = a[3] & m;
  104257. r[4] = a[4] & m;
  104258. r[5] = a[5] & m;
  104259. r[6] = a[6] & m;
  104260. r[7] = a[7] & m;
  104261. #endif
  104262. }
  104263. /* Divide d in a and put remainder into r (m*d + r = a)
  104264. * m is not calculated as it is not needed at this time.
  104265. *
  104266. * a Number to be divided.
  104267. * d Number to divide with.
  104268. * m Multiplier result.
  104269. * r Remainder from the division.
  104270. * returns MP_OKAY indicating success.
  104271. */
  104272. static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d, sp_digit* m,
  104273. sp_digit* r)
  104274. {
  104275. sp_digit t1[16], t2[9];
  104276. sp_digit div, r1;
  104277. int i;
  104278. (void)m;
  104279. div = d[7];
  104280. XMEMCPY(t1, a, sizeof(*t1) * 2 * 8);
  104281. r1 = sp_256_cmp_8(&t1[8], d) >= 0;
  104282. sp_256_cond_sub_8(&t1[8], &t1[8], d, (sp_digit)0 - r1);
  104283. for (i = 7; i >= 0; i--) {
  104284. sp_digit mask = 0 - (t1[8 + i] == div);
  104285. sp_digit hi = t1[8 + i] + mask;
  104286. r1 = div_256_word_8(hi, t1[8 + i - 1], div);
  104287. r1 |= mask;
  104288. sp_256_mul_d_8(t2, d, r1);
  104289. t1[8 + i] += sp_256_sub_in_place_8(&t1[i], t2);
  104290. t1[8 + i] -= t2[8];
  104291. sp_256_mask_8(t2, d, t1[8 + i]);
  104292. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  104293. sp_256_mask_8(t2, d, t1[8 + i]);
  104294. t1[8 + i] += sp_256_add_8(&t1[i], &t1[i], t2);
  104295. }
  104296. r1 = sp_256_cmp_8(t1, d) >= 0;
  104297. sp_256_cond_sub_8(r, t1, d, (sp_digit)0 - r1);
  104298. return MP_OKAY;
  104299. }
  104300. /* Reduce a modulo m into r. (r = a mod m)
  104301. *
  104302. * r A single precision number that is the reduced result.
  104303. * a A single precision number that is to be reduced.
  104304. * m A single precision number that is the modulus to reduce with.
  104305. * returns MP_OKAY indicating success.
  104306. */
  104307. static WC_INLINE int sp_256_mod_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  104308. {
  104309. int ret;
  104310. ret = sp_256_div_8(a, m, NULL, r);
  104311. return ret;
  104312. }
  104313. #endif
  104314. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  104315. /* Multiply two number mod the order of P256 curve. (r = a * b mod order)
  104316. *
  104317. * r Result of the multiplication.
  104318. * a First operand of the multiplication.
  104319. * b Second operand of the multiplication.
  104320. */
  104321. static void sp_256_mont_mul_order_8(sp_digit* r, const sp_digit* a, const sp_digit* b)
  104322. {
  104323. sp_256_mul_8(r, a, b);
  104324. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  104325. }
  104326. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  104327. #ifdef WOLFSSL_SP_SMALL
  104328. /* Order-2 for the P256 curve. */
  104329. static const uint32_t p256_order_minus_2[8] = {
  104330. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU,0xffffffffU,0xffffffffU,
  104331. 0x00000000U,0xffffffffU
  104332. };
  104333. #else
  104334. /* The low half of the order-2 of the P256 curve. */
  104335. static const sp_int_digit p256_order_low[4] = {
  104336. 0xfc63254fU,0xf3b9cac2U,0xa7179e84U,0xbce6faadU
  104337. };
  104338. #endif /* WOLFSSL_SP_SMALL */
  104339. /* Square number mod the order of P256 curve. (r = a * a mod order)
  104340. *
  104341. * r Result of the squaring.
  104342. * a Number to square.
  104343. */
  104344. static void sp_256_mont_sqr_order_8(sp_digit* r, const sp_digit* a)
  104345. {
  104346. sp_256_sqr_8(r, a);
  104347. sp_256_mont_reduce_order_8(r, p256_order, p256_mp_order);
  104348. }
  104349. #ifndef WOLFSSL_SP_SMALL
  104350. /* Square number mod the order of P256 curve a number of times.
  104351. * (r = a ^ n mod order)
  104352. *
  104353. * r Result of the squaring.
  104354. * a Number to square.
  104355. */
  104356. static void sp_256_mont_sqr_n_order_8(sp_digit* r, const sp_digit* a, int n)
  104357. {
  104358. int i;
  104359. sp_256_mont_sqr_order_8(r, a);
  104360. for (i=1; i<n; i++) {
  104361. sp_256_mont_sqr_order_8(r, r);
  104362. }
  104363. }
  104364. #endif /* !WOLFSSL_SP_SMALL */
  104365. /* Invert the number, in Montgomery form, modulo the order of the P256 curve.
  104366. * (r = 1 / a mod order)
  104367. *
  104368. * r Inverse result.
  104369. * a Number to invert.
  104370. * td Temporary data.
  104371. */
  104372. #ifdef WOLFSSL_SP_NONBLOCK
  104373. typedef struct sp_256_mont_inv_order_8_ctx {
  104374. int state;
  104375. int i;
  104376. } sp_256_mont_inv_order_8_ctx;
  104377. static int sp_256_mont_inv_order_8_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  104378. sp_digit* t)
  104379. {
  104380. int err = FP_WOULDBLOCK;
  104381. sp_256_mont_inv_order_8_ctx* ctx = (sp_256_mont_inv_order_8_ctx*)sp_ctx;
  104382. typedef char ctx_size_test[sizeof(sp_256_mont_inv_order_8_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  104383. (void)sizeof(ctx_size_test);
  104384. switch (ctx->state) {
  104385. case 0:
  104386. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  104387. ctx->i = 254;
  104388. ctx->state = 1;
  104389. break;
  104390. case 1:
  104391. sp_256_mont_sqr_order_8(t, t);
  104392. ctx->state = 2;
  104393. break;
  104394. case 2:
  104395. if ((p256_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  104396. sp_256_mont_mul_order_8(t, t, a);
  104397. }
  104398. ctx->i--;
  104399. ctx->state = (ctx->i == 0) ? 3 : 1;
  104400. break;
  104401. case 3:
  104402. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  104403. err = MP_OKAY;
  104404. break;
  104405. }
  104406. return err;
  104407. }
  104408. #endif /* WOLFSSL_SP_NONBLOCK */
  104409. static void sp_256_mont_inv_order_8(sp_digit* r, const sp_digit* a,
  104410. sp_digit* td)
  104411. {
  104412. #ifdef WOLFSSL_SP_SMALL
  104413. sp_digit* t = td;
  104414. int i;
  104415. XMEMCPY(t, a, sizeof(sp_digit) * 8);
  104416. for (i=254; i>=0; i--) {
  104417. sp_256_mont_sqr_order_8(t, t);
  104418. if ((p256_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104419. sp_256_mont_mul_order_8(t, t, a);
  104420. }
  104421. }
  104422. XMEMCPY(r, t, sizeof(sp_digit) * 8U);
  104423. #else
  104424. sp_digit* t = td;
  104425. sp_digit* t2 = td + 2 * 8;
  104426. sp_digit* t3 = td + 4 * 8;
  104427. int i;
  104428. /* t = a^2 */
  104429. sp_256_mont_sqr_order_8(t, a);
  104430. /* t = a^3 = t * a */
  104431. sp_256_mont_mul_order_8(t, t, a);
  104432. /* t2= a^c = t ^ 2 ^ 2 */
  104433. sp_256_mont_sqr_n_order_8(t2, t, 2);
  104434. /* t3= a^f = t2 * t */
  104435. sp_256_mont_mul_order_8(t3, t2, t);
  104436. /* t2= a^f0 = t3 ^ 2 ^ 4 */
  104437. sp_256_mont_sqr_n_order_8(t2, t3, 4);
  104438. /* t = a^ff = t2 * t3 */
  104439. sp_256_mont_mul_order_8(t, t2, t3);
  104440. /* t3= a^ff00 = t ^ 2 ^ 8 */
  104441. sp_256_mont_sqr_n_order_8(t2, t, 8);
  104442. /* t = a^ffff = t2 * t */
  104443. sp_256_mont_mul_order_8(t, t2, t);
  104444. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  104445. sp_256_mont_sqr_n_order_8(t2, t, 16);
  104446. /* t = a^ffffffff = t2 * t */
  104447. sp_256_mont_mul_order_8(t, t2, t);
  104448. /* t2= a^ffffffff0000000000000000 = t ^ 2 ^ 64 */
  104449. sp_256_mont_sqr_n_order_8(t2, t, 64);
  104450. /* t2= a^ffffffff00000000ffffffff = t2 * t */
  104451. sp_256_mont_mul_order_8(t2, t2, t);
  104452. /* t2= a^ffffffff00000000ffffffff00000000 = t2 ^ 2 ^ 32 */
  104453. sp_256_mont_sqr_n_order_8(t2, t2, 32);
  104454. /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */
  104455. sp_256_mont_mul_order_8(t2, t2, t);
  104456. /* t2= a^ffffffff00000000ffffffffffffffffbce6 */
  104457. for (i=127; i>=112; i--) {
  104458. sp_256_mont_sqr_order_8(t2, t2);
  104459. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104460. sp_256_mont_mul_order_8(t2, t2, a);
  104461. }
  104462. }
  104463. /* t2= a^ffffffff00000000ffffffffffffffffbce6f */
  104464. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  104465. sp_256_mont_mul_order_8(t2, t2, t3);
  104466. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */
  104467. for (i=107; i>=64; i--) {
  104468. sp_256_mont_sqr_order_8(t2, t2);
  104469. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104470. sp_256_mont_mul_order_8(t2, t2, a);
  104471. }
  104472. }
  104473. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */
  104474. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  104475. sp_256_mont_mul_order_8(t2, t2, t3);
  104476. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */
  104477. for (i=59; i>=32; i--) {
  104478. sp_256_mont_sqr_order_8(t2, t2);
  104479. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104480. sp_256_mont_mul_order_8(t2, t2, a);
  104481. }
  104482. }
  104483. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */
  104484. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  104485. sp_256_mont_mul_order_8(t2, t2, t3);
  104486. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */
  104487. for (i=27; i>=0; i--) {
  104488. sp_256_mont_sqr_order_8(t2, t2);
  104489. if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  104490. sp_256_mont_mul_order_8(t2, t2, a);
  104491. }
  104492. }
  104493. /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */
  104494. sp_256_mont_sqr_n_order_8(t2, t2, 4);
  104495. /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */
  104496. sp_256_mont_mul_order_8(r, t2, t3);
  104497. #endif /* WOLFSSL_SP_SMALL */
  104498. }
  104499. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  104500. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  104501. #ifdef HAVE_ECC_SIGN
  104502. #ifndef SP_ECC_MAX_SIG_GEN
  104503. #define SP_ECC_MAX_SIG_GEN 64
  104504. #endif
  104505. /* Calculate second signature value S from R, k and private value.
  104506. *
  104507. * s = (r * x + e) / k
  104508. *
  104509. * s Signature value.
  104510. * r First signature value.
  104511. * k Ephemeral private key.
  104512. * x Private key as a number.
  104513. * e Hash of message as a number.
  104514. * tmp Temporary storage for intermediate numbers.
  104515. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  104516. */
  104517. static int sp_256_calc_s_8(sp_digit* s, const sp_digit* r, sp_digit* k,
  104518. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  104519. {
  104520. int err;
  104521. sp_digit carry;
  104522. sp_int32 c;
  104523. sp_digit* kInv = k;
  104524. /* Conv k to Montgomery form (mod order) */
  104525. sp_256_mul_8(k, k, p256_norm_order);
  104526. err = sp_256_mod_8(k, k, p256_order);
  104527. if (err == MP_OKAY) {
  104528. sp_256_norm_8(k);
  104529. /* kInv = 1/k mod order */
  104530. sp_256_mont_inv_order_8(kInv, k, tmp);
  104531. sp_256_norm_8(kInv);
  104532. /* s = r * x + e */
  104533. sp_256_mul_8(x, x, r);
  104534. err = sp_256_mod_8(x, x, p256_order);
  104535. }
  104536. if (err == MP_OKAY) {
  104537. sp_256_norm_8(x);
  104538. carry = sp_256_add_8(s, e, x);
  104539. sp_256_cond_sub_8(s, s, p256_order, 0 - carry);
  104540. sp_256_norm_8(s);
  104541. c = sp_256_cmp_8(s, p256_order);
  104542. sp_256_cond_sub_8(s, s, p256_order,
  104543. (sp_digit)0 - (sp_digit)(c >= 0));
  104544. sp_256_norm_8(s);
  104545. /* s = s * k^-1 mod order */
  104546. sp_256_mont_mul_order_8(s, s, kInv);
  104547. sp_256_norm_8(s);
  104548. }
  104549. return err;
  104550. }
  104551. /* Sign the hash using the private key.
  104552. * e = [hash, 256 bits] from binary
  104553. * r = (k.G)->x mod order
  104554. * s = (r * x + e) / k mod order
  104555. * The hash is truncated to the first 256 bits.
  104556. *
  104557. * hash Hash to sign.
  104558. * hashLen Length of the hash data.
  104559. * rng Random number generator.
  104560. * priv Private part of key - scalar.
  104561. * rm First part of result as an mp_int.
  104562. * sm Sirst part of result as an mp_int.
  104563. * heap Heap to use for allocation.
  104564. * returns RNG failures, MEMORY_E when memory allocation fails and
  104565. * MP_OKAY on success.
  104566. */
  104567. #ifdef WOLFSSL_SP_NONBLOCK
  104568. typedef struct sp_ecc_sign_256_ctx {
  104569. int state;
  104570. union {
  104571. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  104572. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  104573. };
  104574. sp_digit e[2*8];
  104575. sp_digit x[2*8];
  104576. sp_digit k[2*8];
  104577. sp_digit r[2*8];
  104578. sp_digit tmp[3 * 2*8];
  104579. sp_point_256 point;
  104580. sp_digit* s;
  104581. sp_digit* kInv;
  104582. int i;
  104583. } sp_ecc_sign_256_ctx;
  104584. int sp_ecc_sign_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  104585. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  104586. {
  104587. int err = FP_WOULDBLOCK;
  104588. sp_ecc_sign_256_ctx* ctx = (sp_ecc_sign_256_ctx*)sp_ctx->data;
  104589. typedef char ctx_size_test[sizeof(sp_ecc_sign_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  104590. (void)sizeof(ctx_size_test);
  104591. (void)heap;
  104592. switch (ctx->state) {
  104593. case 0: /* INIT */
  104594. ctx->s = ctx->e;
  104595. ctx->kInv = ctx->k;
  104596. ctx->i = SP_ECC_MAX_SIG_GEN;
  104597. ctx->state = 1;
  104598. break;
  104599. case 1: /* GEN */
  104600. /* New random point. */
  104601. if (km == NULL || mp_iszero(km)) {
  104602. err = sp_256_ecc_gen_k_8(rng, ctx->k);
  104603. }
  104604. else {
  104605. sp_256_from_mp(ctx->k, 8, km);
  104606. mp_zero(km);
  104607. }
  104608. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  104609. ctx->state = 2;
  104610. break;
  104611. case 2: /* MULMOD */
  104612. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  104613. &ctx->point, &p256_base, ctx->k, 1, 1, heap);
  104614. if (err == MP_OKAY) {
  104615. ctx->state = 3;
  104616. }
  104617. break;
  104618. case 3: /* MODORDER */
  104619. {
  104620. sp_int32 c;
  104621. /* r = point->x mod order */
  104622. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 8U);
  104623. sp_256_norm_8(ctx->r);
  104624. c = sp_256_cmp_8(ctx->r, p256_order);
  104625. sp_256_cond_sub_8(ctx->r, ctx->r, p256_order,
  104626. (sp_digit)0 - (sp_digit)(c >= 0));
  104627. sp_256_norm_8(ctx->r);
  104628. if (hashLen > 32U) {
  104629. hashLen = 32U;
  104630. }
  104631. sp_256_from_mp(ctx->x, 8, priv);
  104632. sp_256_from_bin(ctx->e, 8, hash, (int)hashLen);
  104633. ctx->state = 4;
  104634. break;
  104635. }
  104636. case 4: /* KMODORDER */
  104637. /* Conv k to Montgomery form (mod order) */
  104638. sp_256_mul_8(ctx->k, ctx->k, p256_norm_order);
  104639. err = sp_256_mod_8(ctx->k, ctx->k, p256_order);
  104640. if (err == MP_OKAY) {
  104641. sp_256_norm_8(ctx->k);
  104642. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  104643. ctx->state = 5;
  104644. }
  104645. break;
  104646. case 5: /* KINV */
  104647. /* kInv = 1/k mod order */
  104648. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  104649. if (err == MP_OKAY) {
  104650. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  104651. ctx->state = 6;
  104652. }
  104653. break;
  104654. case 6: /* KINVNORM */
  104655. sp_256_norm_8(ctx->kInv);
  104656. ctx->state = 7;
  104657. break;
  104658. case 7: /* R */
  104659. /* s = r * x + e */
  104660. sp_256_mul_8(ctx->x, ctx->x, ctx->r);
  104661. ctx->state = 8;
  104662. break;
  104663. case 8: /* S1 */
  104664. err = sp_256_mod_8(ctx->x, ctx->x, p256_order);
  104665. if (err == MP_OKAY)
  104666. ctx->state = 9;
  104667. break;
  104668. case 9: /* S2 */
  104669. {
  104670. sp_digit carry;
  104671. sp_int32 c;
  104672. sp_256_norm_8(ctx->x);
  104673. carry = sp_256_add_8(ctx->s, ctx->e, ctx->x);
  104674. sp_256_cond_sub_8(ctx->s, ctx->s,
  104675. p256_order, 0 - carry);
  104676. sp_256_norm_8(ctx->s);
  104677. c = sp_256_cmp_8(ctx->s, p256_order);
  104678. sp_256_cond_sub_8(ctx->s, ctx->s, p256_order,
  104679. (sp_digit)0 - (sp_digit)(c >= 0));
  104680. sp_256_norm_8(ctx->s);
  104681. /* s = s * k^-1 mod order */
  104682. sp_256_mont_mul_order_8(ctx->s, ctx->s, ctx->kInv);
  104683. sp_256_norm_8(ctx->s);
  104684. /* Check that signature is usable. */
  104685. if (sp_256_iszero_8(ctx->s) == 0) {
  104686. ctx->state = 10;
  104687. break;
  104688. }
  104689. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  104690. ctx->i = 1;
  104691. #endif
  104692. /* not usable gen, try again */
  104693. ctx->i--;
  104694. if (ctx->i == 0) {
  104695. err = RNG_FAILURE_E;
  104696. }
  104697. ctx->state = 1;
  104698. break;
  104699. }
  104700. case 10: /* RES */
  104701. err = sp_256_to_mp(ctx->r, rm);
  104702. if (err == MP_OKAY) {
  104703. err = sp_256_to_mp(ctx->s, sm);
  104704. }
  104705. break;
  104706. }
  104707. if (err == MP_OKAY && ctx->state != 10) {
  104708. err = FP_WOULDBLOCK;
  104709. }
  104710. if (err != FP_WOULDBLOCK) {
  104711. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 8U);
  104712. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 8U);
  104713. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 8U);
  104714. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 8U);
  104715. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 8U);
  104716. }
  104717. return err;
  104718. }
  104719. #endif /* WOLFSSL_SP_NONBLOCK */
  104720. int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng,
  104721. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  104722. {
  104723. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  104724. sp_digit* e = NULL;
  104725. sp_point_256* point = NULL;
  104726. #else
  104727. sp_digit e[7 * 2 * 8];
  104728. sp_point_256 point[1];
  104729. #endif
  104730. sp_digit* x = NULL;
  104731. sp_digit* k = NULL;
  104732. sp_digit* r = NULL;
  104733. sp_digit* tmp = NULL;
  104734. sp_digit* s = NULL;
  104735. sp_int32 c;
  104736. int err = MP_OKAY;
  104737. int i;
  104738. (void)heap;
  104739. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  104740. if (err == MP_OKAY) {
  104741. point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap,
  104742. DYNAMIC_TYPE_ECC);
  104743. if (point == NULL)
  104744. err = MEMORY_E;
  104745. }
  104746. if (err == MP_OKAY) {
  104747. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 8, heap,
  104748. DYNAMIC_TYPE_ECC);
  104749. if (e == NULL)
  104750. err = MEMORY_E;
  104751. }
  104752. #endif
  104753. if (err == MP_OKAY) {
  104754. x = e + 2 * 8;
  104755. k = e + 4 * 8;
  104756. r = e + 6 * 8;
  104757. tmp = e + 8 * 8;
  104758. s = e;
  104759. if (hashLen > 32U) {
  104760. hashLen = 32U;
  104761. }
  104762. }
  104763. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  104764. /* New random point. */
  104765. if (km == NULL || mp_iszero(km)) {
  104766. err = sp_256_ecc_gen_k_8(rng, k);
  104767. }
  104768. else {
  104769. sp_256_from_mp(k, 8, km);
  104770. mp_zero(km);
  104771. }
  104772. if (err == MP_OKAY) {
  104773. err = sp_256_ecc_mulmod_base_8(point, k, 1, 1, heap);
  104774. }
  104775. if (err == MP_OKAY) {
  104776. /* r = point->x mod order */
  104777. XMEMCPY(r, point->x, sizeof(sp_digit) * 8U);
  104778. sp_256_norm_8(r);
  104779. c = sp_256_cmp_8(r, p256_order);
  104780. sp_256_cond_sub_8(r, r, p256_order,
  104781. (sp_digit)0 - (sp_digit)(c >= 0));
  104782. sp_256_norm_8(r);
  104783. sp_256_from_mp(x, 8, priv);
  104784. sp_256_from_bin(e, 8, hash, (int)hashLen);
  104785. err = sp_256_calc_s_8(s, r, k, x, e, tmp);
  104786. }
  104787. /* Check that signature is usable. */
  104788. if ((err == MP_OKAY) && (sp_256_iszero_8(s) == 0)) {
  104789. break;
  104790. }
  104791. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  104792. i = 1;
  104793. #endif
  104794. }
  104795. if (i == 0) {
  104796. err = RNG_FAILURE_E;
  104797. }
  104798. if (err == MP_OKAY) {
  104799. err = sp_256_to_mp(r, rm);
  104800. }
  104801. if (err == MP_OKAY) {
  104802. err = sp_256_to_mp(s, sm);
  104803. }
  104804. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  104805. if (e != NULL)
  104806. #endif
  104807. {
  104808. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 8);
  104809. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  104810. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  104811. #endif
  104812. }
  104813. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  104814. if (point != NULL)
  104815. #endif
  104816. {
  104817. ForceZero(point, sizeof(sp_point_256));
  104818. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  104819. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  104820. #endif
  104821. }
  104822. return err;
  104823. }
  104824. #endif /* HAVE_ECC_SIGN */
  104825. #ifndef WOLFSSL_SP_SMALL
  104826. /* Right shift a by 1 bit into r. (r = a >> 1)
  104827. *
  104828. * r A single precision integer.
  104829. * a A single precision integer.
  104830. */
  104831. static void sp_256_rshift1_8(sp_digit* r, const sp_digit* a)
  104832. {
  104833. __asm__ __volatile__ (
  104834. "ldr r2, [%[a]]\n\t"
  104835. "ldr r3, [%[a], #4]\n\t"
  104836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104837. "lsrs r2, r2, #1\n\t"
  104838. #else
  104839. "lsr r2, r2, #1\n\t"
  104840. #endif
  104841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104842. "lsls r5, r3, #31\n\t"
  104843. #else
  104844. "lsl r5, r3, #31\n\t"
  104845. #endif
  104846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104847. "lsrs r3, r3, #1\n\t"
  104848. #else
  104849. "lsr r3, r3, #1\n\t"
  104850. #endif
  104851. #ifdef WOLFSSL_KEIL
  104852. "orrs r2, r2, r5\n\t"
  104853. #elif defined(__clang__)
  104854. "orrs r2, r5\n\t"
  104855. #else
  104856. "orr r2, r5\n\t"
  104857. #endif
  104858. "ldr r4, [%[a], #8]\n\t"
  104859. "str r2, [%[r]]\n\t"
  104860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104861. "lsls r5, r4, #31\n\t"
  104862. #else
  104863. "lsl r5, r4, #31\n\t"
  104864. #endif
  104865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104866. "lsrs r4, r4, #1\n\t"
  104867. #else
  104868. "lsr r4, r4, #1\n\t"
  104869. #endif
  104870. #ifdef WOLFSSL_KEIL
  104871. "orrs r3, r3, r5\n\t"
  104872. #elif defined(__clang__)
  104873. "orrs r3, r5\n\t"
  104874. #else
  104875. "orr r3, r5\n\t"
  104876. #endif
  104877. "ldr r2, [%[a], #12]\n\t"
  104878. "str r3, [%[r], #4]\n\t"
  104879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104880. "lsls r5, r2, #31\n\t"
  104881. #else
  104882. "lsl r5, r2, #31\n\t"
  104883. #endif
  104884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104885. "lsrs r2, r2, #1\n\t"
  104886. #else
  104887. "lsr r2, r2, #1\n\t"
  104888. #endif
  104889. #ifdef WOLFSSL_KEIL
  104890. "orrs r4, r4, r5\n\t"
  104891. #elif defined(__clang__)
  104892. "orrs r4, r5\n\t"
  104893. #else
  104894. "orr r4, r5\n\t"
  104895. #endif
  104896. "ldr r3, [%[a], #16]\n\t"
  104897. "str r4, [%[r], #8]\n\t"
  104898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104899. "lsls r5, r3, #31\n\t"
  104900. #else
  104901. "lsl r5, r3, #31\n\t"
  104902. #endif
  104903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104904. "lsrs r3, r3, #1\n\t"
  104905. #else
  104906. "lsr r3, r3, #1\n\t"
  104907. #endif
  104908. #ifdef WOLFSSL_KEIL
  104909. "orrs r2, r2, r5\n\t"
  104910. #elif defined(__clang__)
  104911. "orrs r2, r5\n\t"
  104912. #else
  104913. "orr r2, r5\n\t"
  104914. #endif
  104915. "ldr r4, [%[a], #20]\n\t"
  104916. "str r2, [%[r], #12]\n\t"
  104917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104918. "lsls r5, r4, #31\n\t"
  104919. #else
  104920. "lsl r5, r4, #31\n\t"
  104921. #endif
  104922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104923. "lsrs r4, r4, #1\n\t"
  104924. #else
  104925. "lsr r4, r4, #1\n\t"
  104926. #endif
  104927. #ifdef WOLFSSL_KEIL
  104928. "orrs r3, r3, r5\n\t"
  104929. #elif defined(__clang__)
  104930. "orrs r3, r5\n\t"
  104931. #else
  104932. "orr r3, r5\n\t"
  104933. #endif
  104934. "ldr r2, [%[a], #24]\n\t"
  104935. "str r3, [%[r], #16]\n\t"
  104936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104937. "lsls r5, r2, #31\n\t"
  104938. #else
  104939. "lsl r5, r2, #31\n\t"
  104940. #endif
  104941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104942. "lsrs r2, r2, #1\n\t"
  104943. #else
  104944. "lsr r2, r2, #1\n\t"
  104945. #endif
  104946. #ifdef WOLFSSL_KEIL
  104947. "orrs r4, r4, r5\n\t"
  104948. #elif defined(__clang__)
  104949. "orrs r4, r5\n\t"
  104950. #else
  104951. "orr r4, r5\n\t"
  104952. #endif
  104953. "ldr r3, [%[a], #28]\n\t"
  104954. "str r4, [%[r], #20]\n\t"
  104955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104956. "lsls r5, r3, #31\n\t"
  104957. #else
  104958. "lsl r5, r3, #31\n\t"
  104959. #endif
  104960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104961. "lsrs r3, r3, #1\n\t"
  104962. #else
  104963. "lsr r3, r3, #1\n\t"
  104964. #endif
  104965. #ifdef WOLFSSL_KEIL
  104966. "orrs r2, r2, r5\n\t"
  104967. #elif defined(__clang__)
  104968. "orrs r2, r5\n\t"
  104969. #else
  104970. "orr r2, r5\n\t"
  104971. #endif
  104972. "str r2, [%[r], #24]\n\t"
  104973. "str r3, [%[r], #28]\n\t"
  104974. : [r] "+l" (r), [a] "+l" (a)
  104975. :
  104976. : "memory", "r2", "r3", "r4", "r5"
  104977. );
  104978. }
  104979. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  104980. *
  104981. * r Result of division by 2.
  104982. * a Number to divide.
  104983. * m Modulus.
  104984. */
  104985. static void sp_256_div2_mod_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  104986. {
  104987. __asm__ __volatile__ (
  104988. "ldr r7, [%[a]]\n\t"
  104989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104990. "lsls r7, r7, #31\n\t"
  104991. #else
  104992. "lsl r7, r7, #31\n\t"
  104993. #endif
  104994. "beq L_sp_256_div2_mod_8_no_add_%=\n\t"
  104995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  104996. "lsrs r7, r7, #31\n\t"
  104997. #else
  104998. "lsr r7, r7, #31\n\t"
  104999. #endif
  105000. "ldr r5, [%[m]]\n\t"
  105001. "ldr r6, [%[m], #4]\n\t"
  105002. "ldr r3, [%[a]]\n\t"
  105003. "ldr r4, [%[a], #4]\n\t"
  105004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105005. "adds r3, r3, r5\n\t"
  105006. #else
  105007. "add r3, r3, r5\n\t"
  105008. #endif
  105009. #ifdef WOLFSSL_KEIL
  105010. "adcs r4, r4, r6\n\t"
  105011. #elif defined(__clang__)
  105012. "adcs r4, r6\n\t"
  105013. #else
  105014. "adc r4, r6\n\t"
  105015. #endif
  105016. "str r3, [%[r]]\n\t"
  105017. "str r4, [%[r], #4]\n\t"
  105018. "ldr r5, [%[m], #8]\n\t"
  105019. "ldr r6, [%[m], #12]\n\t"
  105020. "ldr r3, [%[a], #8]\n\t"
  105021. "ldr r4, [%[a], #12]\n\t"
  105022. #ifdef WOLFSSL_KEIL
  105023. "adcs r3, r3, r5\n\t"
  105024. #elif defined(__clang__)
  105025. "adcs r3, r5\n\t"
  105026. #else
  105027. "adc r3, r5\n\t"
  105028. #endif
  105029. #ifdef WOLFSSL_KEIL
  105030. "adcs r4, r4, r6\n\t"
  105031. #elif defined(__clang__)
  105032. "adcs r4, r6\n\t"
  105033. #else
  105034. "adc r4, r6\n\t"
  105035. #endif
  105036. "str r3, [%[r], #8]\n\t"
  105037. "str r4, [%[r], #12]\n\t"
  105038. "ldr r5, [%[m], #16]\n\t"
  105039. "ldr r6, [%[m], #20]\n\t"
  105040. "ldr r3, [%[a], #16]\n\t"
  105041. "ldr r4, [%[a], #20]\n\t"
  105042. #ifdef WOLFSSL_KEIL
  105043. "adcs r3, r3, r5\n\t"
  105044. #elif defined(__clang__)
  105045. "adcs r3, r5\n\t"
  105046. #else
  105047. "adc r3, r5\n\t"
  105048. #endif
  105049. #ifdef WOLFSSL_KEIL
  105050. "adcs r4, r4, r6\n\t"
  105051. #elif defined(__clang__)
  105052. "adcs r4, r6\n\t"
  105053. #else
  105054. "adc r4, r6\n\t"
  105055. #endif
  105056. "str r3, [%[r], #16]\n\t"
  105057. "str r4, [%[r], #20]\n\t"
  105058. "ldr r5, [%[m], #24]\n\t"
  105059. "ldr r6, [%[m], #28]\n\t"
  105060. "ldr r3, [%[a], #24]\n\t"
  105061. "ldr r4, [%[a], #28]\n\t"
  105062. #ifdef WOLFSSL_KEIL
  105063. "adcs r3, r3, r5\n\t"
  105064. #elif defined(__clang__)
  105065. "adcs r3, r5\n\t"
  105066. #else
  105067. "adc r3, r5\n\t"
  105068. #endif
  105069. #ifdef WOLFSSL_KEIL
  105070. "adcs r4, r4, r6\n\t"
  105071. #elif defined(__clang__)
  105072. "adcs r4, r6\n\t"
  105073. #else
  105074. "adc r4, r6\n\t"
  105075. #endif
  105076. "movs r7, #0\n\t"
  105077. #ifdef WOLFSSL_KEIL
  105078. "adcs r7, r7, r7\n\t"
  105079. #elif defined(__clang__)
  105080. "adcs r7, r7\n\t"
  105081. #else
  105082. "adc r7, r7\n\t"
  105083. #endif
  105084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105085. "lsls r7, r7, #31\n\t"
  105086. #else
  105087. "lsl r7, r7, #31\n\t"
  105088. #endif
  105089. "b L_sp_256_div2_mod_8_div2_%=\n\t"
  105090. "\n"
  105091. "L_sp_256_div2_mod_8_no_add_%=:\n\t"
  105092. "ldr r3, [%[a], #24]\n\t"
  105093. "ldr r4, [%[a], #28]\n\t"
  105094. "\n"
  105095. "L_sp_256_div2_mod_8_div2_%=:\n\t"
  105096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105097. "lsrs r5, r3, #1\n\t"
  105098. #else
  105099. "lsr r5, r3, #1\n\t"
  105100. #endif
  105101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105102. "lsls r3, r3, #31\n\t"
  105103. #else
  105104. "lsl r3, r3, #31\n\t"
  105105. #endif
  105106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105107. "lsrs r6, r4, #1\n\t"
  105108. #else
  105109. "lsr r6, r4, #1\n\t"
  105110. #endif
  105111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105112. "lsls r4, r4, #31\n\t"
  105113. #else
  105114. "lsl r4, r4, #31\n\t"
  105115. #endif
  105116. #ifdef WOLFSSL_KEIL
  105117. "orrs r5, r5, r4\n\t"
  105118. #elif defined(__clang__)
  105119. "orrs r5, r4\n\t"
  105120. #else
  105121. "orr r5, r4\n\t"
  105122. #endif
  105123. #ifdef WOLFSSL_KEIL
  105124. "orrs r6, r6, r7\n\t"
  105125. #elif defined(__clang__)
  105126. "orrs r6, r7\n\t"
  105127. #else
  105128. "orr r6, r7\n\t"
  105129. #endif
  105130. "movs r7, r3\n\t"
  105131. "str r5, [%[r], #24]\n\t"
  105132. "str r6, [%[r], #28]\n\t"
  105133. "ldr r3, [%[a], #16]\n\t"
  105134. "ldr r4, [%[a], #20]\n\t"
  105135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105136. "lsrs r5, r3, #1\n\t"
  105137. #else
  105138. "lsr r5, r3, #1\n\t"
  105139. #endif
  105140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105141. "lsls r3, r3, #31\n\t"
  105142. #else
  105143. "lsl r3, r3, #31\n\t"
  105144. #endif
  105145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105146. "lsrs r6, r4, #1\n\t"
  105147. #else
  105148. "lsr r6, r4, #1\n\t"
  105149. #endif
  105150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105151. "lsls r4, r4, #31\n\t"
  105152. #else
  105153. "lsl r4, r4, #31\n\t"
  105154. #endif
  105155. #ifdef WOLFSSL_KEIL
  105156. "orrs r5, r5, r4\n\t"
  105157. #elif defined(__clang__)
  105158. "orrs r5, r4\n\t"
  105159. #else
  105160. "orr r5, r4\n\t"
  105161. #endif
  105162. #ifdef WOLFSSL_KEIL
  105163. "orrs r6, r6, r7\n\t"
  105164. #elif defined(__clang__)
  105165. "orrs r6, r7\n\t"
  105166. #else
  105167. "orr r6, r7\n\t"
  105168. #endif
  105169. "movs r7, r3\n\t"
  105170. "str r5, [%[r], #16]\n\t"
  105171. "str r6, [%[r], #20]\n\t"
  105172. "ldr r3, [%[a], #8]\n\t"
  105173. "ldr r4, [%[a], #12]\n\t"
  105174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105175. "lsrs r5, r3, #1\n\t"
  105176. #else
  105177. "lsr r5, r3, #1\n\t"
  105178. #endif
  105179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105180. "lsls r3, r3, #31\n\t"
  105181. #else
  105182. "lsl r3, r3, #31\n\t"
  105183. #endif
  105184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105185. "lsrs r6, r4, #1\n\t"
  105186. #else
  105187. "lsr r6, r4, #1\n\t"
  105188. #endif
  105189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105190. "lsls r4, r4, #31\n\t"
  105191. #else
  105192. "lsl r4, r4, #31\n\t"
  105193. #endif
  105194. #ifdef WOLFSSL_KEIL
  105195. "orrs r5, r5, r4\n\t"
  105196. #elif defined(__clang__)
  105197. "orrs r5, r4\n\t"
  105198. #else
  105199. "orr r5, r4\n\t"
  105200. #endif
  105201. #ifdef WOLFSSL_KEIL
  105202. "orrs r6, r6, r7\n\t"
  105203. #elif defined(__clang__)
  105204. "orrs r6, r7\n\t"
  105205. #else
  105206. "orr r6, r7\n\t"
  105207. #endif
  105208. "movs r7, r3\n\t"
  105209. "str r5, [%[r], #8]\n\t"
  105210. "str r6, [%[r], #12]\n\t"
  105211. "ldr r3, [%[r]]\n\t"
  105212. "ldr r4, [%[r], #4]\n\t"
  105213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105214. "lsrs r5, r3, #1\n\t"
  105215. #else
  105216. "lsr r5, r3, #1\n\t"
  105217. #endif
  105218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105219. "lsrs r6, r4, #1\n\t"
  105220. #else
  105221. "lsr r6, r4, #1\n\t"
  105222. #endif
  105223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105224. "lsls r4, r4, #31\n\t"
  105225. #else
  105226. "lsl r4, r4, #31\n\t"
  105227. #endif
  105228. #ifdef WOLFSSL_KEIL
  105229. "orrs r5, r5, r4\n\t"
  105230. #elif defined(__clang__)
  105231. "orrs r5, r4\n\t"
  105232. #else
  105233. "orr r5, r4\n\t"
  105234. #endif
  105235. #ifdef WOLFSSL_KEIL
  105236. "orrs r6, r6, r7\n\t"
  105237. #elif defined(__clang__)
  105238. "orrs r6, r7\n\t"
  105239. #else
  105240. "orr r6, r7\n\t"
  105241. #endif
  105242. "str r5, [%[r]]\n\t"
  105243. "str r6, [%[r], #4]\n\t"
  105244. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  105245. :
  105246. : "memory", "r3", "r4", "r5", "r6", "r7", "r8"
  105247. );
  105248. }
  105249. static int sp_256_num_bits_8(sp_digit* a)
  105250. {
  105251. static const byte sp_num_bits_table[256] = {
  105252. 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  105253. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  105254. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  105255. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  105256. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  105257. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  105258. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  105259. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  105260. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105261. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105262. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105263. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105264. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105265. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105266. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105267. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  105268. };
  105269. const byte* table = sp_num_bits_table;
  105270. __asm__ __volatile__ (
  105271. "movs r6, #0xff\n\t"
  105272. "ldr r3, [%[a], #28]\n\t"
  105273. "cmp r3, #0\n\t"
  105274. "beq L_sp_256_num_bits_8_7_%=\n\t"
  105275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105276. "lsrs r5, r3, #24\n\t"
  105277. #else
  105278. "lsr r5, r3, #24\n\t"
  105279. #endif
  105280. "cmp r5, #0\n\t"
  105281. "beq L_sp_256_num_bits_8_93_%=\n\t"
  105282. "movs r2, #0xf8\n\t"
  105283. "ldrb r4, [%[table], r5]\n\t"
  105284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105285. "adds r2, r2, r4\n\t"
  105286. #else
  105287. "add r2, r2, r4\n\t"
  105288. #endif
  105289. "b L_sp_256_num_bits_8_9_%=\n\t"
  105290. "\n"
  105291. "L_sp_256_num_bits_8_93_%=:\n\t"
  105292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105293. "lsrs r5, r3, #16\n\t"
  105294. #else
  105295. "lsr r5, r3, #16\n\t"
  105296. #endif
  105297. #ifdef WOLFSSL_KEIL
  105298. "ands r5, r5, r6\n\t"
  105299. #elif defined(__clang__)
  105300. "ands r5, r6\n\t"
  105301. #else
  105302. "and r5, r6\n\t"
  105303. #endif
  105304. "cmp r5, #0\n\t"
  105305. "beq L_sp_256_num_bits_8_92_%=\n\t"
  105306. "movs r2, #0xf0\n\t"
  105307. "ldrb r4, [%[table], r5]\n\t"
  105308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105309. "adds r2, r2, r4\n\t"
  105310. #else
  105311. "add r2, r2, r4\n\t"
  105312. #endif
  105313. "b L_sp_256_num_bits_8_9_%=\n\t"
  105314. "\n"
  105315. "L_sp_256_num_bits_8_92_%=:\n\t"
  105316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105317. "lsrs r5, r3, #8\n\t"
  105318. #else
  105319. "lsr r5, r3, #8\n\t"
  105320. #endif
  105321. #ifdef WOLFSSL_KEIL
  105322. "ands r5, r5, r6\n\t"
  105323. #elif defined(__clang__)
  105324. "ands r5, r6\n\t"
  105325. #else
  105326. "and r5, r6\n\t"
  105327. #endif
  105328. "cmp r5, #0\n\t"
  105329. "beq L_sp_256_num_bits_8_91_%=\n\t"
  105330. "movs r2, #0xe8\n\t"
  105331. "ldrb r4, [%[table], r5]\n\t"
  105332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105333. "adds r2, r2, r4\n\t"
  105334. #else
  105335. "add r2, r2, r4\n\t"
  105336. #endif
  105337. "b L_sp_256_num_bits_8_9_%=\n\t"
  105338. "\n"
  105339. "L_sp_256_num_bits_8_91_%=:\n\t"
  105340. "movs r5, r3\n\t"
  105341. #ifdef WOLFSSL_KEIL
  105342. "ands r5, r5, r6\n\t"
  105343. #elif defined(__clang__)
  105344. "ands r5, r6\n\t"
  105345. #else
  105346. "and r5, r6\n\t"
  105347. #endif
  105348. "cmp r5, #0\n\t"
  105349. "beq L_sp_256_num_bits_8_90_%=\n\t"
  105350. "movs r2, #0xe0\n\t"
  105351. "ldrb r4, [%[table], r5]\n\t"
  105352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105353. "adds r2, r2, r4\n\t"
  105354. #else
  105355. "add r2, r2, r4\n\t"
  105356. #endif
  105357. "b L_sp_256_num_bits_8_9_%=\n\t"
  105358. "\n"
  105359. "L_sp_256_num_bits_8_90_%=:\n\t"
  105360. "b L_sp_256_num_bits_8_9_%=\n\t"
  105361. "\n"
  105362. "L_sp_256_num_bits_8_7_%=:\n\t"
  105363. "ldr r3, [%[a], #24]\n\t"
  105364. "cmp r3, #0\n\t"
  105365. "beq L_sp_256_num_bits_8_6_%=\n\t"
  105366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105367. "lsrs r5, r3, #24\n\t"
  105368. #else
  105369. "lsr r5, r3, #24\n\t"
  105370. #endif
  105371. "cmp r5, #0\n\t"
  105372. "beq L_sp_256_num_bits_8_83_%=\n\t"
  105373. "movs r2, #0xd8\n\t"
  105374. "ldrb r4, [%[table], r5]\n\t"
  105375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105376. "adds r2, r2, r4\n\t"
  105377. #else
  105378. "add r2, r2, r4\n\t"
  105379. #endif
  105380. "b L_sp_256_num_bits_8_9_%=\n\t"
  105381. "\n"
  105382. "L_sp_256_num_bits_8_83_%=:\n\t"
  105383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105384. "lsrs r5, r3, #16\n\t"
  105385. #else
  105386. "lsr r5, r3, #16\n\t"
  105387. #endif
  105388. #ifdef WOLFSSL_KEIL
  105389. "ands r5, r5, r6\n\t"
  105390. #elif defined(__clang__)
  105391. "ands r5, r6\n\t"
  105392. #else
  105393. "and r5, r6\n\t"
  105394. #endif
  105395. "cmp r5, #0\n\t"
  105396. "beq L_sp_256_num_bits_8_82_%=\n\t"
  105397. "movs r2, #0xd0\n\t"
  105398. "ldrb r4, [%[table], r5]\n\t"
  105399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105400. "adds r2, r2, r4\n\t"
  105401. #else
  105402. "add r2, r2, r4\n\t"
  105403. #endif
  105404. "b L_sp_256_num_bits_8_9_%=\n\t"
  105405. "\n"
  105406. "L_sp_256_num_bits_8_82_%=:\n\t"
  105407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105408. "lsrs r5, r3, #8\n\t"
  105409. #else
  105410. "lsr r5, r3, #8\n\t"
  105411. #endif
  105412. #ifdef WOLFSSL_KEIL
  105413. "ands r5, r5, r6\n\t"
  105414. #elif defined(__clang__)
  105415. "ands r5, r6\n\t"
  105416. #else
  105417. "and r5, r6\n\t"
  105418. #endif
  105419. "cmp r5, #0\n\t"
  105420. "beq L_sp_256_num_bits_8_81_%=\n\t"
  105421. "movs r2, #0xc8\n\t"
  105422. "ldrb r4, [%[table], r5]\n\t"
  105423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105424. "adds r2, r2, r4\n\t"
  105425. #else
  105426. "add r2, r2, r4\n\t"
  105427. #endif
  105428. "b L_sp_256_num_bits_8_9_%=\n\t"
  105429. "\n"
  105430. "L_sp_256_num_bits_8_81_%=:\n\t"
  105431. "movs r5, r3\n\t"
  105432. #ifdef WOLFSSL_KEIL
  105433. "ands r5, r5, r6\n\t"
  105434. #elif defined(__clang__)
  105435. "ands r5, r6\n\t"
  105436. #else
  105437. "and r5, r6\n\t"
  105438. #endif
  105439. "cmp r5, #0\n\t"
  105440. "beq L_sp_256_num_bits_8_80_%=\n\t"
  105441. "movs r2, #0xc0\n\t"
  105442. "ldrb r4, [%[table], r5]\n\t"
  105443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105444. "adds r2, r2, r4\n\t"
  105445. #else
  105446. "add r2, r2, r4\n\t"
  105447. #endif
  105448. "b L_sp_256_num_bits_8_9_%=\n\t"
  105449. "\n"
  105450. "L_sp_256_num_bits_8_80_%=:\n\t"
  105451. "b L_sp_256_num_bits_8_9_%=\n\t"
  105452. "\n"
  105453. "L_sp_256_num_bits_8_6_%=:\n\t"
  105454. "ldr r3, [%[a], #20]\n\t"
  105455. "cmp r3, #0\n\t"
  105456. "beq L_sp_256_num_bits_8_5_%=\n\t"
  105457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105458. "lsrs r5, r3, #24\n\t"
  105459. #else
  105460. "lsr r5, r3, #24\n\t"
  105461. #endif
  105462. "cmp r5, #0\n\t"
  105463. "beq L_sp_256_num_bits_8_73_%=\n\t"
  105464. "movs r2, #0xb8\n\t"
  105465. "ldrb r4, [%[table], r5]\n\t"
  105466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105467. "adds r2, r2, r4\n\t"
  105468. #else
  105469. "add r2, r2, r4\n\t"
  105470. #endif
  105471. "b L_sp_256_num_bits_8_9_%=\n\t"
  105472. "\n"
  105473. "L_sp_256_num_bits_8_73_%=:\n\t"
  105474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105475. "lsrs r5, r3, #16\n\t"
  105476. #else
  105477. "lsr r5, r3, #16\n\t"
  105478. #endif
  105479. #ifdef WOLFSSL_KEIL
  105480. "ands r5, r5, r6\n\t"
  105481. #elif defined(__clang__)
  105482. "ands r5, r6\n\t"
  105483. #else
  105484. "and r5, r6\n\t"
  105485. #endif
  105486. "cmp r5, #0\n\t"
  105487. "beq L_sp_256_num_bits_8_72_%=\n\t"
  105488. "movs r2, #0xb0\n\t"
  105489. "ldrb r4, [%[table], r5]\n\t"
  105490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105491. "adds r2, r2, r4\n\t"
  105492. #else
  105493. "add r2, r2, r4\n\t"
  105494. #endif
  105495. "b L_sp_256_num_bits_8_9_%=\n\t"
  105496. "\n"
  105497. "L_sp_256_num_bits_8_72_%=:\n\t"
  105498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105499. "lsrs r5, r3, #8\n\t"
  105500. #else
  105501. "lsr r5, r3, #8\n\t"
  105502. #endif
  105503. #ifdef WOLFSSL_KEIL
  105504. "ands r5, r5, r6\n\t"
  105505. #elif defined(__clang__)
  105506. "ands r5, r6\n\t"
  105507. #else
  105508. "and r5, r6\n\t"
  105509. #endif
  105510. "cmp r5, #0\n\t"
  105511. "beq L_sp_256_num_bits_8_71_%=\n\t"
  105512. "movs r2, #0xa8\n\t"
  105513. "ldrb r4, [%[table], r5]\n\t"
  105514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105515. "adds r2, r2, r4\n\t"
  105516. #else
  105517. "add r2, r2, r4\n\t"
  105518. #endif
  105519. "b L_sp_256_num_bits_8_9_%=\n\t"
  105520. "\n"
  105521. "L_sp_256_num_bits_8_71_%=:\n\t"
  105522. "movs r5, r3\n\t"
  105523. #ifdef WOLFSSL_KEIL
  105524. "ands r5, r5, r6\n\t"
  105525. #elif defined(__clang__)
  105526. "ands r5, r6\n\t"
  105527. #else
  105528. "and r5, r6\n\t"
  105529. #endif
  105530. "cmp r5, #0\n\t"
  105531. "beq L_sp_256_num_bits_8_70_%=\n\t"
  105532. "movs r2, #0xa0\n\t"
  105533. "ldrb r4, [%[table], r5]\n\t"
  105534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105535. "adds r2, r2, r4\n\t"
  105536. #else
  105537. "add r2, r2, r4\n\t"
  105538. #endif
  105539. "b L_sp_256_num_bits_8_9_%=\n\t"
  105540. "\n"
  105541. "L_sp_256_num_bits_8_70_%=:\n\t"
  105542. "b L_sp_256_num_bits_8_9_%=\n\t"
  105543. "\n"
  105544. "L_sp_256_num_bits_8_5_%=:\n\t"
  105545. "ldr r3, [%[a], #16]\n\t"
  105546. "cmp r3, #0\n\t"
  105547. "beq L_sp_256_num_bits_8_4_%=\n\t"
  105548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105549. "lsrs r5, r3, #24\n\t"
  105550. #else
  105551. "lsr r5, r3, #24\n\t"
  105552. #endif
  105553. "cmp r5, #0\n\t"
  105554. "beq L_sp_256_num_bits_8_63_%=\n\t"
  105555. "movs r2, #0x98\n\t"
  105556. "ldrb r4, [%[table], r5]\n\t"
  105557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105558. "adds r2, r2, r4\n\t"
  105559. #else
  105560. "add r2, r2, r4\n\t"
  105561. #endif
  105562. "b L_sp_256_num_bits_8_9_%=\n\t"
  105563. "\n"
  105564. "L_sp_256_num_bits_8_63_%=:\n\t"
  105565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105566. "lsrs r5, r3, #16\n\t"
  105567. #else
  105568. "lsr r5, r3, #16\n\t"
  105569. #endif
  105570. #ifdef WOLFSSL_KEIL
  105571. "ands r5, r5, r6\n\t"
  105572. #elif defined(__clang__)
  105573. "ands r5, r6\n\t"
  105574. #else
  105575. "and r5, r6\n\t"
  105576. #endif
  105577. "cmp r5, #0\n\t"
  105578. "beq L_sp_256_num_bits_8_62_%=\n\t"
  105579. "movs r2, #0x90\n\t"
  105580. "ldrb r4, [%[table], r5]\n\t"
  105581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105582. "adds r2, r2, r4\n\t"
  105583. #else
  105584. "add r2, r2, r4\n\t"
  105585. #endif
  105586. "b L_sp_256_num_bits_8_9_%=\n\t"
  105587. "\n"
  105588. "L_sp_256_num_bits_8_62_%=:\n\t"
  105589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105590. "lsrs r5, r3, #8\n\t"
  105591. #else
  105592. "lsr r5, r3, #8\n\t"
  105593. #endif
  105594. #ifdef WOLFSSL_KEIL
  105595. "ands r5, r5, r6\n\t"
  105596. #elif defined(__clang__)
  105597. "ands r5, r6\n\t"
  105598. #else
  105599. "and r5, r6\n\t"
  105600. #endif
  105601. "cmp r5, #0\n\t"
  105602. "beq L_sp_256_num_bits_8_61_%=\n\t"
  105603. "movs r2, #0x88\n\t"
  105604. "ldrb r4, [%[table], r5]\n\t"
  105605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105606. "adds r2, r2, r4\n\t"
  105607. #else
  105608. "add r2, r2, r4\n\t"
  105609. #endif
  105610. "b L_sp_256_num_bits_8_9_%=\n\t"
  105611. "\n"
  105612. "L_sp_256_num_bits_8_61_%=:\n\t"
  105613. "movs r5, r3\n\t"
  105614. #ifdef WOLFSSL_KEIL
  105615. "ands r5, r5, r6\n\t"
  105616. #elif defined(__clang__)
  105617. "ands r5, r6\n\t"
  105618. #else
  105619. "and r5, r6\n\t"
  105620. #endif
  105621. "cmp r5, #0\n\t"
  105622. "beq L_sp_256_num_bits_8_60_%=\n\t"
  105623. "movs r2, #0x80\n\t"
  105624. "ldrb r4, [%[table], r5]\n\t"
  105625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105626. "adds r2, r2, r4\n\t"
  105627. #else
  105628. "add r2, r2, r4\n\t"
  105629. #endif
  105630. "b L_sp_256_num_bits_8_9_%=\n\t"
  105631. "\n"
  105632. "L_sp_256_num_bits_8_60_%=:\n\t"
  105633. "b L_sp_256_num_bits_8_9_%=\n\t"
  105634. "\n"
  105635. "L_sp_256_num_bits_8_4_%=:\n\t"
  105636. "ldr r3, [%[a], #12]\n\t"
  105637. "cmp r3, #0\n\t"
  105638. "beq L_sp_256_num_bits_8_3_%=\n\t"
  105639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105640. "lsrs r5, r3, #24\n\t"
  105641. #else
  105642. "lsr r5, r3, #24\n\t"
  105643. #endif
  105644. "cmp r5, #0\n\t"
  105645. "beq L_sp_256_num_bits_8_53_%=\n\t"
  105646. "movs r2, #0x78\n\t"
  105647. "ldrb r4, [%[table], r5]\n\t"
  105648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105649. "adds r2, r2, r4\n\t"
  105650. #else
  105651. "add r2, r2, r4\n\t"
  105652. #endif
  105653. "b L_sp_256_num_bits_8_9_%=\n\t"
  105654. "\n"
  105655. "L_sp_256_num_bits_8_53_%=:\n\t"
  105656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105657. "lsrs r5, r3, #16\n\t"
  105658. #else
  105659. "lsr r5, r3, #16\n\t"
  105660. #endif
  105661. #ifdef WOLFSSL_KEIL
  105662. "ands r5, r5, r6\n\t"
  105663. #elif defined(__clang__)
  105664. "ands r5, r6\n\t"
  105665. #else
  105666. "and r5, r6\n\t"
  105667. #endif
  105668. "cmp r5, #0\n\t"
  105669. "beq L_sp_256_num_bits_8_52_%=\n\t"
  105670. "movs r2, #0x70\n\t"
  105671. "ldrb r4, [%[table], r5]\n\t"
  105672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105673. "adds r2, r2, r4\n\t"
  105674. #else
  105675. "add r2, r2, r4\n\t"
  105676. #endif
  105677. "b L_sp_256_num_bits_8_9_%=\n\t"
  105678. "\n"
  105679. "L_sp_256_num_bits_8_52_%=:\n\t"
  105680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105681. "lsrs r5, r3, #8\n\t"
  105682. #else
  105683. "lsr r5, r3, #8\n\t"
  105684. #endif
  105685. #ifdef WOLFSSL_KEIL
  105686. "ands r5, r5, r6\n\t"
  105687. #elif defined(__clang__)
  105688. "ands r5, r6\n\t"
  105689. #else
  105690. "and r5, r6\n\t"
  105691. #endif
  105692. "cmp r5, #0\n\t"
  105693. "beq L_sp_256_num_bits_8_51_%=\n\t"
  105694. "movs r2, #0x68\n\t"
  105695. "ldrb r4, [%[table], r5]\n\t"
  105696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105697. "adds r2, r2, r4\n\t"
  105698. #else
  105699. "add r2, r2, r4\n\t"
  105700. #endif
  105701. "b L_sp_256_num_bits_8_9_%=\n\t"
  105702. "\n"
  105703. "L_sp_256_num_bits_8_51_%=:\n\t"
  105704. "movs r5, r3\n\t"
  105705. #ifdef WOLFSSL_KEIL
  105706. "ands r5, r5, r6\n\t"
  105707. #elif defined(__clang__)
  105708. "ands r5, r6\n\t"
  105709. #else
  105710. "and r5, r6\n\t"
  105711. #endif
  105712. "cmp r5, #0\n\t"
  105713. "beq L_sp_256_num_bits_8_50_%=\n\t"
  105714. "movs r2, #0x60\n\t"
  105715. "ldrb r4, [%[table], r5]\n\t"
  105716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105717. "adds r2, r2, r4\n\t"
  105718. #else
  105719. "add r2, r2, r4\n\t"
  105720. #endif
  105721. "b L_sp_256_num_bits_8_9_%=\n\t"
  105722. "\n"
  105723. "L_sp_256_num_bits_8_50_%=:\n\t"
  105724. "b L_sp_256_num_bits_8_9_%=\n\t"
  105725. "\n"
  105726. "L_sp_256_num_bits_8_3_%=:\n\t"
  105727. "ldr r3, [%[a], #8]\n\t"
  105728. "cmp r3, #0\n\t"
  105729. "beq L_sp_256_num_bits_8_2_%=\n\t"
  105730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105731. "lsrs r5, r3, #24\n\t"
  105732. #else
  105733. "lsr r5, r3, #24\n\t"
  105734. #endif
  105735. "cmp r5, #0\n\t"
  105736. "beq L_sp_256_num_bits_8_43_%=\n\t"
  105737. "movs r2, #0x58\n\t"
  105738. "ldrb r4, [%[table], r5]\n\t"
  105739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105740. "adds r2, r2, r4\n\t"
  105741. #else
  105742. "add r2, r2, r4\n\t"
  105743. #endif
  105744. "b L_sp_256_num_bits_8_9_%=\n\t"
  105745. "\n"
  105746. "L_sp_256_num_bits_8_43_%=:\n\t"
  105747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105748. "lsrs r5, r3, #16\n\t"
  105749. #else
  105750. "lsr r5, r3, #16\n\t"
  105751. #endif
  105752. #ifdef WOLFSSL_KEIL
  105753. "ands r5, r5, r6\n\t"
  105754. #elif defined(__clang__)
  105755. "ands r5, r6\n\t"
  105756. #else
  105757. "and r5, r6\n\t"
  105758. #endif
  105759. "cmp r5, #0\n\t"
  105760. "beq L_sp_256_num_bits_8_42_%=\n\t"
  105761. "movs r2, #0x50\n\t"
  105762. "ldrb r4, [%[table], r5]\n\t"
  105763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105764. "adds r2, r2, r4\n\t"
  105765. #else
  105766. "add r2, r2, r4\n\t"
  105767. #endif
  105768. "b L_sp_256_num_bits_8_9_%=\n\t"
  105769. "\n"
  105770. "L_sp_256_num_bits_8_42_%=:\n\t"
  105771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105772. "lsrs r5, r3, #8\n\t"
  105773. #else
  105774. "lsr r5, r3, #8\n\t"
  105775. #endif
  105776. #ifdef WOLFSSL_KEIL
  105777. "ands r5, r5, r6\n\t"
  105778. #elif defined(__clang__)
  105779. "ands r5, r6\n\t"
  105780. #else
  105781. "and r5, r6\n\t"
  105782. #endif
  105783. "cmp r5, #0\n\t"
  105784. "beq L_sp_256_num_bits_8_41_%=\n\t"
  105785. "movs r2, #0x48\n\t"
  105786. "ldrb r4, [%[table], r5]\n\t"
  105787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105788. "adds r2, r2, r4\n\t"
  105789. #else
  105790. "add r2, r2, r4\n\t"
  105791. #endif
  105792. "b L_sp_256_num_bits_8_9_%=\n\t"
  105793. "\n"
  105794. "L_sp_256_num_bits_8_41_%=:\n\t"
  105795. "movs r5, r3\n\t"
  105796. #ifdef WOLFSSL_KEIL
  105797. "ands r5, r5, r6\n\t"
  105798. #elif defined(__clang__)
  105799. "ands r5, r6\n\t"
  105800. #else
  105801. "and r5, r6\n\t"
  105802. #endif
  105803. "cmp r5, #0\n\t"
  105804. "beq L_sp_256_num_bits_8_40_%=\n\t"
  105805. "movs r2, #0x40\n\t"
  105806. "ldrb r4, [%[table], r5]\n\t"
  105807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105808. "adds r2, r2, r4\n\t"
  105809. #else
  105810. "add r2, r2, r4\n\t"
  105811. #endif
  105812. "b L_sp_256_num_bits_8_9_%=\n\t"
  105813. "\n"
  105814. "L_sp_256_num_bits_8_40_%=:\n\t"
  105815. "b L_sp_256_num_bits_8_9_%=\n\t"
  105816. "\n"
  105817. "L_sp_256_num_bits_8_2_%=:\n\t"
  105818. "ldr r3, [%[a], #4]\n\t"
  105819. "cmp r3, #0\n\t"
  105820. "beq L_sp_256_num_bits_8_1_%=\n\t"
  105821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105822. "lsrs r5, r3, #24\n\t"
  105823. #else
  105824. "lsr r5, r3, #24\n\t"
  105825. #endif
  105826. "cmp r5, #0\n\t"
  105827. "beq L_sp_256_num_bits_8_33_%=\n\t"
  105828. "movs r2, #56\n\t"
  105829. "ldrb r4, [%[table], r5]\n\t"
  105830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105831. "adds r2, r2, r4\n\t"
  105832. #else
  105833. "add r2, r2, r4\n\t"
  105834. #endif
  105835. "b L_sp_256_num_bits_8_9_%=\n\t"
  105836. "\n"
  105837. "L_sp_256_num_bits_8_33_%=:\n\t"
  105838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105839. "lsrs r5, r3, #16\n\t"
  105840. #else
  105841. "lsr r5, r3, #16\n\t"
  105842. #endif
  105843. #ifdef WOLFSSL_KEIL
  105844. "ands r5, r5, r6\n\t"
  105845. #elif defined(__clang__)
  105846. "ands r5, r6\n\t"
  105847. #else
  105848. "and r5, r6\n\t"
  105849. #endif
  105850. "cmp r5, #0\n\t"
  105851. "beq L_sp_256_num_bits_8_32_%=\n\t"
  105852. "movs r2, #48\n\t"
  105853. "ldrb r4, [%[table], r5]\n\t"
  105854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105855. "adds r2, r2, r4\n\t"
  105856. #else
  105857. "add r2, r2, r4\n\t"
  105858. #endif
  105859. "b L_sp_256_num_bits_8_9_%=\n\t"
  105860. "\n"
  105861. "L_sp_256_num_bits_8_32_%=:\n\t"
  105862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105863. "lsrs r5, r3, #8\n\t"
  105864. #else
  105865. "lsr r5, r3, #8\n\t"
  105866. #endif
  105867. #ifdef WOLFSSL_KEIL
  105868. "ands r5, r5, r6\n\t"
  105869. #elif defined(__clang__)
  105870. "ands r5, r6\n\t"
  105871. #else
  105872. "and r5, r6\n\t"
  105873. #endif
  105874. "cmp r5, #0\n\t"
  105875. "beq L_sp_256_num_bits_8_31_%=\n\t"
  105876. "movs r2, #40\n\t"
  105877. "ldrb r4, [%[table], r5]\n\t"
  105878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105879. "adds r2, r2, r4\n\t"
  105880. #else
  105881. "add r2, r2, r4\n\t"
  105882. #endif
  105883. "b L_sp_256_num_bits_8_9_%=\n\t"
  105884. "\n"
  105885. "L_sp_256_num_bits_8_31_%=:\n\t"
  105886. "movs r5, r3\n\t"
  105887. #ifdef WOLFSSL_KEIL
  105888. "ands r5, r5, r6\n\t"
  105889. #elif defined(__clang__)
  105890. "ands r5, r6\n\t"
  105891. #else
  105892. "and r5, r6\n\t"
  105893. #endif
  105894. "cmp r5, #0\n\t"
  105895. "beq L_sp_256_num_bits_8_30_%=\n\t"
  105896. "movs r2, #32\n\t"
  105897. "ldrb r4, [%[table], r5]\n\t"
  105898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105899. "adds r2, r2, r4\n\t"
  105900. #else
  105901. "add r2, r2, r4\n\t"
  105902. #endif
  105903. "b L_sp_256_num_bits_8_9_%=\n\t"
  105904. "\n"
  105905. "L_sp_256_num_bits_8_30_%=:\n\t"
  105906. "b L_sp_256_num_bits_8_9_%=\n\t"
  105907. "\n"
  105908. "L_sp_256_num_bits_8_1_%=:\n\t"
  105909. "ldr r3, [%[a]]\n\t"
  105910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105911. "lsrs r5, r3, #24\n\t"
  105912. #else
  105913. "lsr r5, r3, #24\n\t"
  105914. #endif
  105915. "cmp r5, #0\n\t"
  105916. "beq L_sp_256_num_bits_8_23_%=\n\t"
  105917. "movs r2, #24\n\t"
  105918. "ldrb r4, [%[table], r5]\n\t"
  105919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105920. "adds r2, r2, r4\n\t"
  105921. #else
  105922. "add r2, r2, r4\n\t"
  105923. #endif
  105924. "b L_sp_256_num_bits_8_9_%=\n\t"
  105925. "\n"
  105926. "L_sp_256_num_bits_8_23_%=:\n\t"
  105927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105928. "lsrs r5, r3, #16\n\t"
  105929. #else
  105930. "lsr r5, r3, #16\n\t"
  105931. #endif
  105932. #ifdef WOLFSSL_KEIL
  105933. "ands r5, r5, r6\n\t"
  105934. #elif defined(__clang__)
  105935. "ands r5, r6\n\t"
  105936. #else
  105937. "and r5, r6\n\t"
  105938. #endif
  105939. "cmp r5, #0\n\t"
  105940. "beq L_sp_256_num_bits_8_22_%=\n\t"
  105941. "movs r2, #16\n\t"
  105942. "ldrb r4, [%[table], r5]\n\t"
  105943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105944. "adds r2, r2, r4\n\t"
  105945. #else
  105946. "add r2, r2, r4\n\t"
  105947. #endif
  105948. "b L_sp_256_num_bits_8_9_%=\n\t"
  105949. "\n"
  105950. "L_sp_256_num_bits_8_22_%=:\n\t"
  105951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105952. "lsrs r5, r3, #8\n\t"
  105953. #else
  105954. "lsr r5, r3, #8\n\t"
  105955. #endif
  105956. #ifdef WOLFSSL_KEIL
  105957. "ands r5, r5, r6\n\t"
  105958. #elif defined(__clang__)
  105959. "ands r5, r6\n\t"
  105960. #else
  105961. "and r5, r6\n\t"
  105962. #endif
  105963. "cmp r5, #0\n\t"
  105964. "beq L_sp_256_num_bits_8_21_%=\n\t"
  105965. "movs r2, #8\n\t"
  105966. "ldrb r4, [%[table], r5]\n\t"
  105967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105968. "adds r2, r2, r4\n\t"
  105969. #else
  105970. "add r2, r2, r4\n\t"
  105971. #endif
  105972. "b L_sp_256_num_bits_8_9_%=\n\t"
  105973. "\n"
  105974. "L_sp_256_num_bits_8_21_%=:\n\t"
  105975. "movs r5, r3\n\t"
  105976. #ifdef WOLFSSL_KEIL
  105977. "ands r5, r5, r6\n\t"
  105978. #elif defined(__clang__)
  105979. "ands r5, r6\n\t"
  105980. #else
  105981. "and r5, r6\n\t"
  105982. #endif
  105983. "cmp r5, #0\n\t"
  105984. "beq L_sp_256_num_bits_8_20_%=\n\t"
  105985. "movs r2, #0\n\t"
  105986. "ldrb r4, [%[table], r5]\n\t"
  105987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  105988. "adds r2, r2, r4\n\t"
  105989. #else
  105990. "add r2, r2, r4\n\t"
  105991. #endif
  105992. "b L_sp_256_num_bits_8_9_%=\n\t"
  105993. "\n"
  105994. "L_sp_256_num_bits_8_20_%=:\n\t"
  105995. "\n"
  105996. "L_sp_256_num_bits_8_9_%=:\n\t"
  105997. "movs %[a], r2\n\t"
  105998. : [a] "+l" (a), [table] "+l" (table)
  105999. :
  106000. : "memory", "r2", "r3", "r4", "r5", "r6"
  106001. );
  106002. return (uint32_t)(size_t)a;
  106003. }
  106004. /* Non-constant time modular inversion.
  106005. *
  106006. * @param [out] r Resulting number.
  106007. * @param [in] a Number to invert.
  106008. * @param [in] m Modulus.
  106009. * @return MP_OKAY on success.
  106010. */
  106011. static int sp_256_mod_inv_8(sp_digit* r, const sp_digit* a, const sp_digit* m)
  106012. {
  106013. sp_digit u[8];
  106014. sp_digit v[8];
  106015. sp_digit b[8];
  106016. sp_digit d[8];
  106017. int ut, vt;
  106018. sp_digit o;
  106019. XMEMCPY(u, m, sizeof(u));
  106020. XMEMCPY(v, a, sizeof(v));
  106021. ut = sp_256_num_bits_8(u);
  106022. vt = sp_256_num_bits_8(v);
  106023. XMEMSET(b, 0, sizeof(b));
  106024. if ((v[0] & 1) == 0) {
  106025. sp_256_rshift1_8(v, v);
  106026. XMEMCPY(d, m, sizeof(u));
  106027. d[0] += 1;
  106028. sp_256_rshift1_8(d, d);
  106029. vt--;
  106030. while ((v[0] & 1) == 0) {
  106031. sp_256_rshift1_8(v, v);
  106032. sp_256_div2_mod_8(d, d, m);
  106033. vt--;
  106034. }
  106035. }
  106036. else {
  106037. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  106038. d[0] = 1;
  106039. }
  106040. while (ut > 1 && vt > 1) {
  106041. if (ut > vt || (ut == vt && sp_256_cmp_8(u, v) >= 0)) {
  106042. sp_256_sub_8(u, u, v);
  106043. o = sp_256_sub_8(b, b, d);
  106044. if (o != 0)
  106045. sp_256_add_8(b, b, m);
  106046. ut = sp_256_num_bits_8(u);
  106047. do {
  106048. sp_256_rshift1_8(u, u);
  106049. sp_256_div2_mod_8(b, b, m);
  106050. ut--;
  106051. }
  106052. while (ut > 0 && (u[0] & 1) == 0);
  106053. }
  106054. else {
  106055. sp_256_sub_8(v, v, u);
  106056. o = sp_256_sub_8(d, d, b);
  106057. if (o != 0)
  106058. sp_256_add_8(d, d, m);
  106059. vt = sp_256_num_bits_8(v);
  106060. do {
  106061. sp_256_rshift1_8(v, v);
  106062. sp_256_div2_mod_8(d, d, m);
  106063. vt--;
  106064. }
  106065. while (vt > 0 && (v[0] & 1) == 0);
  106066. }
  106067. }
  106068. if (ut == 1)
  106069. XMEMCPY(r, b, sizeof(b));
  106070. else
  106071. XMEMCPY(r, d, sizeof(d));
  106072. return MP_OKAY;
  106073. }
  106074. #endif /* WOLFSSL_SP_SMALL */
  106075. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  106076. *
  106077. * p1 First point to add and holds result.
  106078. * p2 Second point to add.
  106079. * tmp Temporary storage for intermediate numbers.
  106080. */
  106081. static void sp_256_add_points_8(sp_point_256* p1, const sp_point_256* p2,
  106082. sp_digit* tmp)
  106083. {
  106084. sp_256_proj_point_add_8(p1, p1, p2, tmp);
  106085. if (sp_256_iszero_8(p1->z)) {
  106086. if (sp_256_iszero_8(p1->x) && sp_256_iszero_8(p1->y)) {
  106087. sp_256_proj_point_dbl_8(p1, p2, tmp);
  106088. }
  106089. else {
  106090. /* Y ordinate is not used from here - don't set. */
  106091. p1->x[0] = 0;
  106092. p1->x[1] = 0;
  106093. p1->x[2] = 0;
  106094. p1->x[3] = 0;
  106095. p1->x[4] = 0;
  106096. p1->x[5] = 0;
  106097. p1->x[6] = 0;
  106098. p1->x[7] = 0;
  106099. XMEMCPY(p1->z, p256_norm_mod, sizeof(p256_norm_mod));
  106100. }
  106101. }
  106102. }
  106103. /* Calculate the verification point: [e/s]G + [r/s]Q
  106104. *
  106105. * p1 Calculated point.
  106106. * p2 Public point and temporary.
  106107. * s Second part of signature as a number.
  106108. * u1 Temporary number.
  106109. * u2 Temproray number.
  106110. * heap Heap to use for allocation.
  106111. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  106112. */
  106113. static int sp_256_calc_vfy_point_8(sp_point_256* p1, sp_point_256* p2,
  106114. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  106115. {
  106116. int err;
  106117. #ifndef WOLFSSL_SP_SMALL
  106118. err = sp_256_mod_inv_8(s, s, p256_order);
  106119. if (err == MP_OKAY)
  106120. #endif /* !WOLFSSL_SP_SMALL */
  106121. {
  106122. sp_256_mul_8(s, s, p256_norm_order);
  106123. err = sp_256_mod_8(s, s, p256_order);
  106124. }
  106125. if (err == MP_OKAY) {
  106126. sp_256_norm_8(s);
  106127. #ifdef WOLFSSL_SP_SMALL
  106128. {
  106129. sp_256_mont_inv_order_8(s, s, tmp);
  106130. sp_256_mont_mul_order_8(u1, u1, s);
  106131. sp_256_mont_mul_order_8(u2, u2, s);
  106132. }
  106133. #else
  106134. {
  106135. sp_256_mont_mul_order_8(u1, u1, s);
  106136. sp_256_mont_mul_order_8(u2, u2, s);
  106137. }
  106138. #endif /* WOLFSSL_SP_SMALL */
  106139. {
  106140. err = sp_256_ecc_mulmod_base_8(p1, u1, 0, 0, heap);
  106141. }
  106142. }
  106143. if ((err == MP_OKAY) && sp_256_iszero_8(p1->z)) {
  106144. p1->infinity = 1;
  106145. }
  106146. if (err == MP_OKAY) {
  106147. err = sp_256_ecc_mulmod_8(p2, p2, u2, 0, 0, heap);
  106148. }
  106149. if ((err == MP_OKAY) && sp_256_iszero_8(p2->z)) {
  106150. p2->infinity = 1;
  106151. }
  106152. if (err == MP_OKAY) {
  106153. sp_256_add_points_8(p1, p2, tmp);
  106154. }
  106155. return err;
  106156. }
  106157. #ifdef HAVE_ECC_VERIFY
  106158. /* Verify the signature values with the hash and public key.
  106159. * e = Truncate(hash, 256)
  106160. * u1 = e/s mod order
  106161. * u2 = r/s mod order
  106162. * r == (u1.G + u2.Q)->x mod order
  106163. * Optimization: Leave point in projective form.
  106164. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  106165. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  106166. * The hash is truncated to the first 256 bits.
  106167. *
  106168. * hash Hash to sign.
  106169. * hashLen Length of the hash data.
  106170. * rng Random number generator.
  106171. * priv Private part of key - scalar.
  106172. * rm First part of result as an mp_int.
  106173. * sm Sirst part of result as an mp_int.
  106174. * heap Heap to use for allocation.
  106175. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  106176. */
  106177. #ifdef WOLFSSL_SP_NONBLOCK
  106178. typedef struct sp_ecc_verify_256_ctx {
  106179. int state;
  106180. union {
  106181. sp_256_ecc_mulmod_8_ctx mulmod_ctx;
  106182. sp_256_mont_inv_order_8_ctx mont_inv_order_ctx;
  106183. sp_256_proj_point_dbl_8_ctx dbl_ctx;
  106184. sp_256_proj_point_add_8_ctx add_ctx;
  106185. };
  106186. sp_digit u1[2*8];
  106187. sp_digit u2[2*8];
  106188. sp_digit s[2*8];
  106189. sp_digit tmp[2*8 * 6];
  106190. sp_point_256 p1;
  106191. sp_point_256 p2;
  106192. } sp_ecc_verify_256_ctx;
  106193. int sp_ecc_verify_256_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  106194. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  106195. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  106196. {
  106197. int err = FP_WOULDBLOCK;
  106198. sp_ecc_verify_256_ctx* ctx = (sp_ecc_verify_256_ctx*)sp_ctx->data;
  106199. typedef char ctx_size_test[sizeof(sp_ecc_verify_256_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  106200. (void)sizeof(ctx_size_test);
  106201. switch (ctx->state) {
  106202. case 0: /* INIT */
  106203. if (hashLen > 32U) {
  106204. hashLen = 32U;
  106205. }
  106206. sp_256_from_bin(ctx->u1, 8, hash, (int)hashLen);
  106207. sp_256_from_mp(ctx->u2, 8, rm);
  106208. sp_256_from_mp(ctx->s, 8, sm);
  106209. sp_256_from_mp(ctx->p2.x, 8, pX);
  106210. sp_256_from_mp(ctx->p2.y, 8, pY);
  106211. sp_256_from_mp(ctx->p2.z, 8, pZ);
  106212. ctx->state = 1;
  106213. break;
  106214. case 1: /* NORMS0 */
  106215. sp_256_mul_8(ctx->s, ctx->s, p256_norm_order);
  106216. err = sp_256_mod_8(ctx->s, ctx->s, p256_order);
  106217. if (err == MP_OKAY)
  106218. ctx->state = 2;
  106219. break;
  106220. case 2: /* NORMS1 */
  106221. sp_256_norm_8(ctx->s);
  106222. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  106223. ctx->state = 3;
  106224. break;
  106225. case 3: /* NORMS2 */
  106226. err = sp_256_mont_inv_order_8_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  106227. if (err == MP_OKAY) {
  106228. ctx->state = 4;
  106229. }
  106230. break;
  106231. case 4: /* NORMS3 */
  106232. sp_256_mont_mul_order_8(ctx->u1, ctx->u1, ctx->s);
  106233. ctx->state = 5;
  106234. break;
  106235. case 5: /* NORMS4 */
  106236. sp_256_mont_mul_order_8(ctx->u2, ctx->u2, ctx->s);
  106237. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  106238. ctx->state = 6;
  106239. break;
  106240. case 6: /* MULBASE */
  106241. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p256_base, ctx->u1, 0, 0, heap);
  106242. if (err == MP_OKAY) {
  106243. if (sp_256_iszero_8(ctx->p1.z)) {
  106244. ctx->p1.infinity = 1;
  106245. }
  106246. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  106247. ctx->state = 7;
  106248. }
  106249. break;
  106250. case 7: /* MULMOD */
  106251. err = sp_256_ecc_mulmod_8_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  106252. if (err == MP_OKAY) {
  106253. if (sp_256_iszero_8(ctx->p2.z)) {
  106254. ctx->p2.infinity = 1;
  106255. }
  106256. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  106257. ctx->state = 8;
  106258. }
  106259. break;
  106260. case 8: /* ADD */
  106261. err = sp_256_proj_point_add_8_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  106262. if (err == MP_OKAY)
  106263. ctx->state = 9;
  106264. break;
  106265. case 9: /* MONT */
  106266. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  106267. /* Reload r and convert to Montgomery form. */
  106268. sp_256_from_mp(ctx->u2, 8, rm);
  106269. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  106270. if (err == MP_OKAY)
  106271. ctx->state = 10;
  106272. break;
  106273. case 10: /* SQR */
  106274. /* u1 = r.z'.z' mod prime */
  106275. sp_256_mont_sqr_8(ctx->p1.z, ctx->p1.z, p256_mod, p256_mp_mod);
  106276. ctx->state = 11;
  106277. break;
  106278. case 11: /* MUL */
  106279. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod, p256_mp_mod);
  106280. ctx->state = 12;
  106281. break;
  106282. case 12: /* RES */
  106283. {
  106284. sp_int32 c = 0;
  106285. err = MP_OKAY; /* math okay, now check result */
  106286. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  106287. if (*res == 0) {
  106288. sp_digit carry;
  106289. /* Reload r and add order. */
  106290. sp_256_from_mp(ctx->u2, 8, rm);
  106291. carry = sp_256_add_8(ctx->u2, ctx->u2, p256_order);
  106292. /* Carry means result is greater than mod and is not valid. */
  106293. if (carry == 0) {
  106294. sp_256_norm_8(ctx->u2);
  106295. /* Compare with mod and if greater or equal then not valid. */
  106296. c = sp_256_cmp_8(ctx->u2, p256_mod);
  106297. }
  106298. }
  106299. if ((*res == 0) && (c < 0)) {
  106300. /* Convert to Montogomery form */
  106301. err = sp_256_mod_mul_norm_8(ctx->u2, ctx->u2, p256_mod);
  106302. if (err == MP_OKAY) {
  106303. /* u1 = (r + 1*order).z'.z' mod prime */
  106304. sp_256_mont_mul_8(ctx->u1, ctx->u2, ctx->p1.z, p256_mod,
  106305. p256_mp_mod);
  106306. *res = (int)(sp_256_cmp_8(ctx->p1.x, ctx->u1) == 0);
  106307. }
  106308. }
  106309. break;
  106310. }
  106311. } /* switch */
  106312. if (err == MP_OKAY && ctx->state != 12) {
  106313. err = FP_WOULDBLOCK;
  106314. }
  106315. return err;
  106316. }
  106317. #endif /* WOLFSSL_SP_NONBLOCK */
  106318. int sp_ecc_verify_256(const byte* hash, word32 hashLen, const mp_int* pX,
  106319. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  106320. int* res, void* heap)
  106321. {
  106322. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106323. sp_digit* u1 = NULL;
  106324. sp_point_256* p1 = NULL;
  106325. #else
  106326. sp_digit u1[18 * 8];
  106327. sp_point_256 p1[2];
  106328. #endif
  106329. sp_digit* u2 = NULL;
  106330. sp_digit* s = NULL;
  106331. sp_digit* tmp = NULL;
  106332. sp_point_256* p2 = NULL;
  106333. sp_digit carry;
  106334. sp_int32 c = 0;
  106335. int err = MP_OKAY;
  106336. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106337. if (err == MP_OKAY) {
  106338. p1 = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  106339. DYNAMIC_TYPE_ECC);
  106340. if (p1 == NULL)
  106341. err = MEMORY_E;
  106342. }
  106343. if (err == MP_OKAY) {
  106344. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 8, heap,
  106345. DYNAMIC_TYPE_ECC);
  106346. if (u1 == NULL)
  106347. err = MEMORY_E;
  106348. }
  106349. #endif
  106350. if (err == MP_OKAY) {
  106351. u2 = u1 + 2 * 8;
  106352. s = u1 + 4 * 8;
  106353. tmp = u1 + 6 * 8;
  106354. p2 = p1 + 1;
  106355. if (hashLen > 32U) {
  106356. hashLen = 32U;
  106357. }
  106358. sp_256_from_bin(u1, 8, hash, (int)hashLen);
  106359. sp_256_from_mp(u2, 8, rm);
  106360. sp_256_from_mp(s, 8, sm);
  106361. sp_256_from_mp(p2->x, 8, pX);
  106362. sp_256_from_mp(p2->y, 8, pY);
  106363. sp_256_from_mp(p2->z, 8, pZ);
  106364. err = sp_256_calc_vfy_point_8(p1, p2, s, u1, u2, tmp, heap);
  106365. }
  106366. if (err == MP_OKAY) {
  106367. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  106368. /* Reload r and convert to Montgomery form. */
  106369. sp_256_from_mp(u2, 8, rm);
  106370. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  106371. }
  106372. if (err == MP_OKAY) {
  106373. /* u1 = r.z'.z' mod prime */
  106374. sp_256_mont_sqr_8(p1->z, p1->z, p256_mod, p256_mp_mod);
  106375. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  106376. *res = (int)(sp_256_cmp_8(p1->x, u1) == 0);
  106377. if (*res == 0) {
  106378. /* Reload r and add order. */
  106379. sp_256_from_mp(u2, 8, rm);
  106380. carry = sp_256_add_8(u2, u2, p256_order);
  106381. /* Carry means result is greater than mod and is not valid. */
  106382. if (carry == 0) {
  106383. sp_256_norm_8(u2);
  106384. /* Compare with mod and if greater or equal then not valid. */
  106385. c = sp_256_cmp_8(u2, p256_mod);
  106386. }
  106387. }
  106388. if ((*res == 0) && (c < 0)) {
  106389. /* Convert to Montogomery form */
  106390. err = sp_256_mod_mul_norm_8(u2, u2, p256_mod);
  106391. if (err == MP_OKAY) {
  106392. /* u1 = (r + 1*order).z'.z' mod prime */
  106393. {
  106394. sp_256_mont_mul_8(u1, u2, p1->z, p256_mod, p256_mp_mod);
  106395. }
  106396. *res = (sp_256_cmp_8(p1->x, u1) == 0);
  106397. }
  106398. }
  106399. }
  106400. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106401. if (u1 != NULL)
  106402. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  106403. if (p1 != NULL)
  106404. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  106405. #endif
  106406. return err;
  106407. }
  106408. #endif /* HAVE_ECC_VERIFY */
  106409. #ifdef HAVE_ECC_CHECK_KEY
  106410. /* Check that the x and y oridinates are a valid point on the curve.
  106411. *
  106412. * point EC point.
  106413. * heap Heap to use if dynamically allocating.
  106414. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  106415. * not on the curve and MP_OKAY otherwise.
  106416. */
  106417. static int sp_256_ecc_is_point_8(const sp_point_256* point,
  106418. void* heap)
  106419. {
  106420. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106421. sp_digit* t1 = NULL;
  106422. #else
  106423. sp_digit t1[8 * 4];
  106424. #endif
  106425. sp_digit* t2 = NULL;
  106426. int err = MP_OKAY;
  106427. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106428. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8 * 4, heap, DYNAMIC_TYPE_ECC);
  106429. if (t1 == NULL)
  106430. err = MEMORY_E;
  106431. #endif
  106432. (void)heap;
  106433. if (err == MP_OKAY) {
  106434. t2 = t1 + 2 * 8;
  106435. sp_256_sqr_8(t1, point->y);
  106436. (void)sp_256_mod_8(t1, t1, p256_mod);
  106437. sp_256_sqr_8(t2, point->x);
  106438. (void)sp_256_mod_8(t2, t2, p256_mod);
  106439. sp_256_mul_8(t2, t2, point->x);
  106440. (void)sp_256_mod_8(t2, t2, p256_mod);
  106441. (void)sp_256_sub_8(t2, p256_mod, t2);
  106442. sp_256_mont_add_8(t1, t1, t2, p256_mod);
  106443. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  106444. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  106445. sp_256_mont_add_8(t1, t1, point->x, p256_mod);
  106446. if (sp_256_cmp_8(t1, p256_b) != 0) {
  106447. err = MP_VAL;
  106448. }
  106449. }
  106450. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106451. if (t1 != NULL)
  106452. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  106453. #endif
  106454. return err;
  106455. }
  106456. /* Check that the x and y oridinates are a valid point on the curve.
  106457. *
  106458. * pX X ordinate of EC point.
  106459. * pY Y ordinate of EC point.
  106460. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  106461. * not on the curve and MP_OKAY otherwise.
  106462. */
  106463. int sp_ecc_is_point_256(const mp_int* pX, const mp_int* pY)
  106464. {
  106465. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106466. sp_point_256* pub = NULL;
  106467. #else
  106468. sp_point_256 pub[1];
  106469. #endif
  106470. const byte one[1] = { 1 };
  106471. int err = MP_OKAY;
  106472. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106473. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  106474. DYNAMIC_TYPE_ECC);
  106475. if (pub == NULL)
  106476. err = MEMORY_E;
  106477. #endif
  106478. if (err == MP_OKAY) {
  106479. sp_256_from_mp(pub->x, 8, pX);
  106480. sp_256_from_mp(pub->y, 8, pY);
  106481. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  106482. err = sp_256_ecc_is_point_8(pub, NULL);
  106483. }
  106484. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106485. if (pub != NULL)
  106486. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  106487. #endif
  106488. return err;
  106489. }
  106490. /* Check that the private scalar generates the EC point (px, py), the point is
  106491. * on the curve and the point has the correct order.
  106492. *
  106493. * pX X ordinate of EC point.
  106494. * pY Y ordinate of EC point.
  106495. * privm Private scalar that generates EC point.
  106496. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  106497. * not on the curve, ECC_INF_E if the point does not have the correct order,
  106498. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  106499. * MP_OKAY otherwise.
  106500. */
  106501. int sp_ecc_check_key_256(const mp_int* pX, const mp_int* pY,
  106502. const mp_int* privm, void* heap)
  106503. {
  106504. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106505. sp_digit* priv = NULL;
  106506. sp_point_256* pub = NULL;
  106507. #else
  106508. sp_digit priv[8];
  106509. sp_point_256 pub[2];
  106510. #endif
  106511. sp_point_256* p = NULL;
  106512. const byte one[1] = { 1 };
  106513. int err = MP_OKAY;
  106514. /* Quick check the lengs of public key ordinates and private key are in
  106515. * range. Proper check later.
  106516. */
  106517. if (((mp_count_bits(pX) > 256) ||
  106518. (mp_count_bits(pY) > 256) ||
  106519. ((privm != NULL) && (mp_count_bits(privm) > 256)))) {
  106520. err = ECC_OUT_OF_RANGE_E;
  106521. }
  106522. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106523. if (err == MP_OKAY) {
  106524. pub = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap,
  106525. DYNAMIC_TYPE_ECC);
  106526. if (pub == NULL)
  106527. err = MEMORY_E;
  106528. }
  106529. if (err == MP_OKAY && privm) {
  106530. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8, heap,
  106531. DYNAMIC_TYPE_ECC);
  106532. if (priv == NULL)
  106533. err = MEMORY_E;
  106534. }
  106535. #endif
  106536. if (err == MP_OKAY) {
  106537. p = pub + 1;
  106538. sp_256_from_mp(pub->x, 8, pX);
  106539. sp_256_from_mp(pub->y, 8, pY);
  106540. sp_256_from_bin(pub->z, 8, one, (int)sizeof(one));
  106541. if (privm)
  106542. sp_256_from_mp(priv, 8, privm);
  106543. /* Check point at infinitiy. */
  106544. if ((sp_256_iszero_8(pub->x) != 0) &&
  106545. (sp_256_iszero_8(pub->y) != 0)) {
  106546. err = ECC_INF_E;
  106547. }
  106548. }
  106549. /* Check range of X and Y */
  106550. if ((err == MP_OKAY) &&
  106551. ((sp_256_cmp_8(pub->x, p256_mod) >= 0) ||
  106552. (sp_256_cmp_8(pub->y, p256_mod) >= 0))) {
  106553. err = ECC_OUT_OF_RANGE_E;
  106554. }
  106555. if (err == MP_OKAY) {
  106556. /* Check point is on curve */
  106557. err = sp_256_ecc_is_point_8(pub, heap);
  106558. }
  106559. if (err == MP_OKAY) {
  106560. /* Point * order = infinity */
  106561. err = sp_256_ecc_mulmod_8(p, pub, p256_order, 1, 1, heap);
  106562. }
  106563. /* Check result is infinity */
  106564. if ((err == MP_OKAY) && ((sp_256_iszero_8(p->x) == 0) ||
  106565. (sp_256_iszero_8(p->y) == 0))) {
  106566. err = ECC_INF_E;
  106567. }
  106568. if (privm) {
  106569. if (err == MP_OKAY) {
  106570. /* Base * private = point */
  106571. err = sp_256_ecc_mulmod_base_8(p, priv, 1, 1, heap);
  106572. }
  106573. /* Check result is public key */
  106574. if ((err == MP_OKAY) &&
  106575. ((sp_256_cmp_8(p->x, pub->x) != 0) ||
  106576. (sp_256_cmp_8(p->y, pub->y) != 0))) {
  106577. err = ECC_PRIV_KEY_E;
  106578. }
  106579. }
  106580. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106581. if (pub != NULL)
  106582. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  106583. if (priv != NULL)
  106584. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  106585. #endif
  106586. return err;
  106587. }
  106588. #endif
  106589. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  106590. /* Add two projective EC points together.
  106591. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  106592. *
  106593. * pX First EC point's X ordinate.
  106594. * pY First EC point's Y ordinate.
  106595. * pZ First EC point's Z ordinate.
  106596. * qX Second EC point's X ordinate.
  106597. * qY Second EC point's Y ordinate.
  106598. * qZ Second EC point's Z ordinate.
  106599. * rX Resultant EC point's X ordinate.
  106600. * rY Resultant EC point's Y ordinate.
  106601. * rZ Resultant EC point's Z ordinate.
  106602. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106603. */
  106604. int sp_ecc_proj_add_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  106605. mp_int* qX, mp_int* qY, mp_int* qZ,
  106606. mp_int* rX, mp_int* rY, mp_int* rZ)
  106607. {
  106608. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106609. sp_digit* tmp = NULL;
  106610. sp_point_256* p = NULL;
  106611. #else
  106612. sp_digit tmp[2 * 8 * 6];
  106613. sp_point_256 p[2];
  106614. #endif
  106615. sp_point_256* q = NULL;
  106616. int err = MP_OKAY;
  106617. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106618. if (err == MP_OKAY) {
  106619. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, NULL,
  106620. DYNAMIC_TYPE_ECC);
  106621. if (p == NULL)
  106622. err = MEMORY_E;
  106623. }
  106624. if (err == MP_OKAY) {
  106625. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 6, NULL,
  106626. DYNAMIC_TYPE_ECC);
  106627. if (tmp == NULL) {
  106628. err = MEMORY_E;
  106629. }
  106630. }
  106631. #endif
  106632. if (err == MP_OKAY) {
  106633. q = p + 1;
  106634. sp_256_from_mp(p->x, 8, pX);
  106635. sp_256_from_mp(p->y, 8, pY);
  106636. sp_256_from_mp(p->z, 8, pZ);
  106637. sp_256_from_mp(q->x, 8, qX);
  106638. sp_256_from_mp(q->y, 8, qY);
  106639. sp_256_from_mp(q->z, 8, qZ);
  106640. p->infinity = sp_256_iszero_8(p->x) &
  106641. sp_256_iszero_8(p->y);
  106642. q->infinity = sp_256_iszero_8(q->x) &
  106643. sp_256_iszero_8(q->y);
  106644. sp_256_proj_point_add_8(p, p, q, tmp);
  106645. }
  106646. if (err == MP_OKAY) {
  106647. err = sp_256_to_mp(p->x, rX);
  106648. }
  106649. if (err == MP_OKAY) {
  106650. err = sp_256_to_mp(p->y, rY);
  106651. }
  106652. if (err == MP_OKAY) {
  106653. err = sp_256_to_mp(p->z, rZ);
  106654. }
  106655. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106656. if (tmp != NULL)
  106657. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  106658. if (p != NULL)
  106659. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  106660. #endif
  106661. return err;
  106662. }
  106663. /* Double a projective EC point.
  106664. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  106665. *
  106666. * pX EC point's X ordinate.
  106667. * pY EC point's Y ordinate.
  106668. * pZ EC point's Z ordinate.
  106669. * rX Resultant EC point's X ordinate.
  106670. * rY Resultant EC point's Y ordinate.
  106671. * rZ Resultant EC point's Z ordinate.
  106672. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106673. */
  106674. int sp_ecc_proj_dbl_point_256(mp_int* pX, mp_int* pY, mp_int* pZ,
  106675. mp_int* rX, mp_int* rY, mp_int* rZ)
  106676. {
  106677. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106678. sp_digit* tmp = NULL;
  106679. sp_point_256* p = NULL;
  106680. #else
  106681. sp_digit tmp[2 * 8 * 2];
  106682. sp_point_256 p[1];
  106683. #endif
  106684. int err = MP_OKAY;
  106685. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106686. if (err == MP_OKAY) {
  106687. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  106688. DYNAMIC_TYPE_ECC);
  106689. if (p == NULL)
  106690. err = MEMORY_E;
  106691. }
  106692. if (err == MP_OKAY) {
  106693. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 2, NULL,
  106694. DYNAMIC_TYPE_ECC);
  106695. if (tmp == NULL)
  106696. err = MEMORY_E;
  106697. }
  106698. #endif
  106699. if (err == MP_OKAY) {
  106700. sp_256_from_mp(p->x, 8, pX);
  106701. sp_256_from_mp(p->y, 8, pY);
  106702. sp_256_from_mp(p->z, 8, pZ);
  106703. p->infinity = sp_256_iszero_8(p->x) &
  106704. sp_256_iszero_8(p->y);
  106705. sp_256_proj_point_dbl_8(p, p, tmp);
  106706. }
  106707. if (err == MP_OKAY) {
  106708. err = sp_256_to_mp(p->x, rX);
  106709. }
  106710. if (err == MP_OKAY) {
  106711. err = sp_256_to_mp(p->y, rY);
  106712. }
  106713. if (err == MP_OKAY) {
  106714. err = sp_256_to_mp(p->z, rZ);
  106715. }
  106716. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106717. if (tmp != NULL)
  106718. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  106719. if (p != NULL)
  106720. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  106721. #endif
  106722. return err;
  106723. }
  106724. /* Map a projective EC point to affine in place.
  106725. * pZ will be one.
  106726. *
  106727. * pX EC point's X ordinate.
  106728. * pY EC point's Y ordinate.
  106729. * pZ EC point's Z ordinate.
  106730. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106731. */
  106732. int sp_ecc_map_256(mp_int* pX, mp_int* pY, mp_int* pZ)
  106733. {
  106734. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106735. sp_digit* tmp = NULL;
  106736. sp_point_256* p = NULL;
  106737. #else
  106738. sp_digit tmp[2 * 8 * 4];
  106739. sp_point_256 p[1];
  106740. #endif
  106741. int err = MP_OKAY;
  106742. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106743. if (err == MP_OKAY) {
  106744. p = (sp_point_256*)XMALLOC(sizeof(sp_point_256), NULL,
  106745. DYNAMIC_TYPE_ECC);
  106746. if (p == NULL)
  106747. err = MEMORY_E;
  106748. }
  106749. if (err == MP_OKAY) {
  106750. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 8 * 4, NULL,
  106751. DYNAMIC_TYPE_ECC);
  106752. if (tmp == NULL)
  106753. err = MEMORY_E;
  106754. }
  106755. #endif
  106756. if (err == MP_OKAY) {
  106757. sp_256_from_mp(p->x, 8, pX);
  106758. sp_256_from_mp(p->y, 8, pY);
  106759. sp_256_from_mp(p->z, 8, pZ);
  106760. p->infinity = sp_256_iszero_8(p->x) &
  106761. sp_256_iszero_8(p->y);
  106762. sp_256_map_8(p, p, tmp);
  106763. }
  106764. if (err == MP_OKAY) {
  106765. err = sp_256_to_mp(p->x, pX);
  106766. }
  106767. if (err == MP_OKAY) {
  106768. err = sp_256_to_mp(p->y, pY);
  106769. }
  106770. if (err == MP_OKAY) {
  106771. err = sp_256_to_mp(p->z, pZ);
  106772. }
  106773. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106774. if (tmp != NULL)
  106775. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  106776. if (p != NULL)
  106777. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  106778. #endif
  106779. return err;
  106780. }
  106781. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  106782. #ifdef HAVE_COMP_KEY
  106783. /* Find the square root of a number mod the prime of the curve.
  106784. *
  106785. * y The number to operate on and the result.
  106786. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106787. */
  106788. static int sp_256_mont_sqrt_8(sp_digit* y)
  106789. {
  106790. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106791. sp_digit* t1 = NULL;
  106792. #else
  106793. sp_digit t1[4 * 8];
  106794. #endif
  106795. sp_digit* t2 = NULL;
  106796. int err = MP_OKAY;
  106797. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106798. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  106799. if (t1 == NULL) {
  106800. err = MEMORY_E;
  106801. }
  106802. #endif
  106803. if (err == MP_OKAY) {
  106804. t2 = t1 + 2 * 8;
  106805. {
  106806. /* t2 = y ^ 0x2 */
  106807. sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod);
  106808. /* t1 = y ^ 0x3 */
  106809. sp_256_mont_mul_8(t1, t2, y, p256_mod, p256_mp_mod);
  106810. /* t2 = y ^ 0xc */
  106811. sp_256_mont_sqr_n_8(t2, t1, 2, p256_mod, p256_mp_mod);
  106812. /* t1 = y ^ 0xf */
  106813. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  106814. /* t2 = y ^ 0xf0 */
  106815. sp_256_mont_sqr_n_8(t2, t1, 4, p256_mod, p256_mp_mod);
  106816. /* t1 = y ^ 0xff */
  106817. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  106818. /* t2 = y ^ 0xff00 */
  106819. sp_256_mont_sqr_n_8(t2, t1, 8, p256_mod, p256_mp_mod);
  106820. /* t1 = y ^ 0xffff */
  106821. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  106822. /* t2 = y ^ 0xffff0000 */
  106823. sp_256_mont_sqr_n_8(t2, t1, 16, p256_mod, p256_mp_mod);
  106824. /* t1 = y ^ 0xffffffff */
  106825. sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod);
  106826. /* t1 = y ^ 0xffffffff00000000 */
  106827. sp_256_mont_sqr_n_8(t1, t1, 32, p256_mod, p256_mp_mod);
  106828. /* t1 = y ^ 0xffffffff00000001 */
  106829. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  106830. /* t1 = y ^ 0xffffffff00000001000000000000000000000000 */
  106831. sp_256_mont_sqr_n_8(t1, t1, 96, p256_mod, p256_mp_mod);
  106832. /* t1 = y ^ 0xffffffff00000001000000000000000000000001 */
  106833. sp_256_mont_mul_8(t1, t1, y, p256_mod, p256_mp_mod);
  106834. sp_256_mont_sqr_n_8(y, t1, 94, p256_mod, p256_mp_mod);
  106835. }
  106836. }
  106837. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106838. if (t1 != NULL)
  106839. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  106840. #endif
  106841. return err;
  106842. }
  106843. /* Uncompress the point given the X ordinate.
  106844. *
  106845. * xm X ordinate.
  106846. * odd Whether the Y ordinate is odd.
  106847. * ym Calculated Y ordinate.
  106848. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  106849. */
  106850. int sp_ecc_uncompress_256(mp_int* xm, int odd, mp_int* ym)
  106851. {
  106852. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106853. sp_digit* x = NULL;
  106854. #else
  106855. sp_digit x[4 * 8];
  106856. #endif
  106857. sp_digit* y = NULL;
  106858. int err = MP_OKAY;
  106859. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106860. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 8, NULL, DYNAMIC_TYPE_ECC);
  106861. if (x == NULL)
  106862. err = MEMORY_E;
  106863. #endif
  106864. if (err == MP_OKAY) {
  106865. y = x + 2 * 8;
  106866. sp_256_from_mp(x, 8, xm);
  106867. err = sp_256_mod_mul_norm_8(x, x, p256_mod);
  106868. }
  106869. if (err == MP_OKAY) {
  106870. /* y = x^3 */
  106871. {
  106872. sp_256_mont_sqr_8(y, x, p256_mod, p256_mp_mod);
  106873. sp_256_mont_mul_8(y, y, x, p256_mod, p256_mp_mod);
  106874. }
  106875. /* y = x^3 - 3x */
  106876. sp_256_mont_sub_8(y, y, x, p256_mod);
  106877. sp_256_mont_sub_8(y, y, x, p256_mod);
  106878. sp_256_mont_sub_8(y, y, x, p256_mod);
  106879. /* y = x^3 - 3x + b */
  106880. err = sp_256_mod_mul_norm_8(x, p256_b, p256_mod);
  106881. }
  106882. if (err == MP_OKAY) {
  106883. sp_256_mont_add_8(y, y, x, p256_mod);
  106884. /* y = sqrt(x^3 - 3x + b) */
  106885. err = sp_256_mont_sqrt_8(y);
  106886. }
  106887. if (err == MP_OKAY) {
  106888. XMEMSET(y + 8, 0, 8U * sizeof(sp_digit));
  106889. sp_256_mont_reduce_8(y, p256_mod, p256_mp_mod);
  106890. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  106891. sp_256_mont_sub_8(y, p256_mod, y, p256_mod);
  106892. }
  106893. err = sp_256_to_mp(y, ym);
  106894. }
  106895. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  106896. if (x != NULL)
  106897. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  106898. #endif
  106899. return err;
  106900. }
  106901. #endif
  106902. #endif /* !WOLFSSL_SP_NO_256 */
  106903. #ifdef WOLFSSL_SP_384
  106904. /* Point structure to use. */
  106905. typedef struct sp_point_384 {
  106906. /* X ordinate of point. */
  106907. sp_digit x[2 * 12];
  106908. /* Y ordinate of point. */
  106909. sp_digit y[2 * 12];
  106910. /* Z ordinate of point. */
  106911. sp_digit z[2 * 12];
  106912. /* Indicates point is at infinity. */
  106913. int infinity;
  106914. } sp_point_384;
  106915. /* The modulus (prime) of the curve P384. */
  106916. static const sp_digit p384_mod[12] = {
  106917. 0xffffffff,0x00000000,0x00000000,0xffffffff,0xfffffffe,0xffffffff,
  106918. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  106919. };
  106920. /* The Montgomery normalizer for modulus of the curve P384. */
  106921. static const sp_digit p384_norm_mod[12] = {
  106922. 0x00000001,0xffffffff,0xffffffff,0x00000000,0x00000001,0x00000000,
  106923. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  106924. };
  106925. /* The Montgomery multiplier for modulus of the curve P384. */
  106926. static sp_digit p384_mp_mod = 0x00000001;
  106927. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  106928. defined(HAVE_ECC_VERIFY)
  106929. /* The order of the curve P384. */
  106930. static const sp_digit p384_order[12] = {
  106931. 0xccc52973,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  106932. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  106933. };
  106934. #endif
  106935. /* The order of the curve P384 minus 2. */
  106936. static const sp_digit p384_order2[12] = {
  106937. 0xccc52971,0xecec196a,0x48b0a77a,0x581a0db2,0xf4372ddf,0xc7634d81,
  106938. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff
  106939. };
  106940. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  106941. /* The Montgomery normalizer for order of the curve P384. */
  106942. static const sp_digit p384_norm_order[12] = {
  106943. 0x333ad68d,0x1313e695,0xb74f5885,0xa7e5f24d,0x0bc8d220,0x389cb27e,
  106944. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  106945. };
  106946. #endif
  106947. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  106948. /* The Montgomery multiplier for order of the curve P384. */
  106949. static sp_digit p384_mp_order = 0xe88fdc45;
  106950. #endif
  106951. /* The base point of curve P384. */
  106952. static const sp_point_384 p384_base = {
  106953. /* X ordinate */
  106954. {
  106955. 0x72760ab7,0x3a545e38,0xbf55296c,0x5502f25d,0x82542a38,0x59f741e0,
  106956. 0x8ba79b98,0x6e1d3b62,0xf320ad74,0x8eb1c71e,0xbe8b0537,0xaa87ca22,
  106957. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  106958. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  106959. (sp_digit)0, (sp_digit)0
  106960. },
  106961. /* Y ordinate */
  106962. {
  106963. 0x90ea0e5f,0x7a431d7c,0x1d7e819d,0x0a60b1ce,0xb5f0b8c0,0xe9da3113,
  106964. 0x289a147c,0xf8f41dbd,0x9292dc29,0x5d9e98bf,0x96262c6f,0x3617de4a,
  106965. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  106966. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  106967. (sp_digit)0, (sp_digit)0
  106968. },
  106969. /* Z ordinate */
  106970. {
  106971. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  106972. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  106973. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  106974. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  106975. (sp_digit)0, (sp_digit)0
  106976. },
  106977. /* infinity */
  106978. 0
  106979. };
  106980. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  106981. static const sp_digit p384_b[12] = {
  106982. 0xd3ec2aef,0x2a85c8ed,0x8a2ed19d,0xc656398d,0x5013875a,0x0314088f,
  106983. 0xfe814112,0x181d9c6e,0xe3f82d19,0x988e056b,0xe23ee7e4,0xb3312fa7
  106984. };
  106985. #endif
  106986. /* Multiply a and b into r. (r = a * b)
  106987. *
  106988. * r A single precision integer.
  106989. * a A single precision integer.
  106990. * b A single precision integer.
  106991. */
  106992. SP_NOINLINE static void sp_384_mul_12(sp_digit* r, const sp_digit* a,
  106993. const sp_digit* b)
  106994. {
  106995. sp_digit t[12 * 2];
  106996. sp_digit* tmp = t;
  106997. __asm__ __volatile__ (
  106998. "movs r3, #0\n\t"
  106999. "movs r4, #0\n\t"
  107000. "mov r8, r3\n\t"
  107001. "mov r11, %[tmp]\n\t"
  107002. "mov r9, %[a]\n\t"
  107003. "mov r10, %[b]\n\t"
  107004. "movs r6, #48\n\t"
  107005. "add r6, r6, r9\n\t"
  107006. "mov r12, r6\n\t"
  107007. "\n"
  107008. "L_sp_384_mul_12_words_%=:\n\t"
  107009. "movs %[tmp], #0\n\t"
  107010. "movs r5, #0\n\t"
  107011. "movs r6, #44\n\t"
  107012. "mov %[a], r8\n\t"
  107013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107014. "subs %[a], %[a], r6\n\t"
  107015. #else
  107016. "sub %[a], %[a], r6\n\t"
  107017. #endif
  107018. #ifdef WOLFSSL_KEIL
  107019. "sbcs r6, r6, r6\n\t"
  107020. #elif defined(__clang__)
  107021. "sbcs r6, r6\n\t"
  107022. #else
  107023. "sbc r6, r6\n\t"
  107024. #endif
  107025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107026. "mvns r6, r6\n\t"
  107027. #else
  107028. "mvn r6, r6\n\t"
  107029. #endif
  107030. #ifdef WOLFSSL_KEIL
  107031. "ands %[a], %[a], r6\n\t"
  107032. #elif defined(__clang__)
  107033. "ands %[a], r6\n\t"
  107034. #else
  107035. "and %[a], r6\n\t"
  107036. #endif
  107037. "mov %[b], r8\n\t"
  107038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107039. "subs %[b], %[b], %[a]\n\t"
  107040. #else
  107041. "sub %[b], %[b], %[a]\n\t"
  107042. #endif
  107043. "add %[a], %[a], r9\n\t"
  107044. "add %[b], %[b], r10\n\t"
  107045. "\n"
  107046. "L_sp_384_mul_12_mul_%=:\n\t"
  107047. "# Multiply Start\n\t"
  107048. "ldrh r6, [%[a]]\n\t"
  107049. "ldrh r7, [%[b]]\n\t"
  107050. #ifdef WOLFSSL_KEIL
  107051. "muls r7, r6, r7\n\t"
  107052. #elif defined(__clang__)
  107053. "muls r7, r6\n\t"
  107054. #else
  107055. "mul r7, r6\n\t"
  107056. #endif
  107057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107058. "adds r3, r3, r7\n\t"
  107059. #else
  107060. "add r3, r3, r7\n\t"
  107061. #endif
  107062. #ifdef WOLFSSL_KEIL
  107063. "adcs r4, r4, %[tmp]\n\t"
  107064. #elif defined(__clang__)
  107065. "adcs r4, %[tmp]\n\t"
  107066. #else
  107067. "adc r4, %[tmp]\n\t"
  107068. #endif
  107069. #ifdef WOLFSSL_KEIL
  107070. "adcs r5, r5, %[tmp]\n\t"
  107071. #elif defined(__clang__)
  107072. "adcs r5, %[tmp]\n\t"
  107073. #else
  107074. "adc r5, %[tmp]\n\t"
  107075. #endif
  107076. "ldr r7, [%[b]]\n\t"
  107077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107078. "lsrs r7, r7, #16\n\t"
  107079. #else
  107080. "lsr r7, r7, #16\n\t"
  107081. #endif
  107082. #ifdef WOLFSSL_KEIL
  107083. "muls r6, r7, r6\n\t"
  107084. #elif defined(__clang__)
  107085. "muls r6, r7\n\t"
  107086. #else
  107087. "mul r6, r7\n\t"
  107088. #endif
  107089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107090. "lsrs r7, r6, #16\n\t"
  107091. #else
  107092. "lsr r7, r6, #16\n\t"
  107093. #endif
  107094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107095. "lsls r6, r6, #16\n\t"
  107096. #else
  107097. "lsl r6, r6, #16\n\t"
  107098. #endif
  107099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107100. "adds r3, r3, r6\n\t"
  107101. #else
  107102. "add r3, r3, r6\n\t"
  107103. #endif
  107104. #ifdef WOLFSSL_KEIL
  107105. "adcs r4, r4, r7\n\t"
  107106. #elif defined(__clang__)
  107107. "adcs r4, r7\n\t"
  107108. #else
  107109. "adc r4, r7\n\t"
  107110. #endif
  107111. #ifdef WOLFSSL_KEIL
  107112. "adcs r5, r5, %[tmp]\n\t"
  107113. #elif defined(__clang__)
  107114. "adcs r5, %[tmp]\n\t"
  107115. #else
  107116. "adc r5, %[tmp]\n\t"
  107117. #endif
  107118. "ldr r6, [%[a]]\n\t"
  107119. "ldr r7, [%[b]]\n\t"
  107120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107121. "lsrs r6, r6, #16\n\t"
  107122. #else
  107123. "lsr r6, r6, #16\n\t"
  107124. #endif
  107125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107126. "lsrs r7, r7, #16\n\t"
  107127. #else
  107128. "lsr r7, r7, #16\n\t"
  107129. #endif
  107130. #ifdef WOLFSSL_KEIL
  107131. "muls r7, r6, r7\n\t"
  107132. #elif defined(__clang__)
  107133. "muls r7, r6\n\t"
  107134. #else
  107135. "mul r7, r6\n\t"
  107136. #endif
  107137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107138. "adds r4, r4, r7\n\t"
  107139. #else
  107140. "add r4, r4, r7\n\t"
  107141. #endif
  107142. #ifdef WOLFSSL_KEIL
  107143. "adcs r5, r5, %[tmp]\n\t"
  107144. #elif defined(__clang__)
  107145. "adcs r5, %[tmp]\n\t"
  107146. #else
  107147. "adc r5, %[tmp]\n\t"
  107148. #endif
  107149. "ldrh r7, [%[b]]\n\t"
  107150. #ifdef WOLFSSL_KEIL
  107151. "muls r6, r7, r6\n\t"
  107152. #elif defined(__clang__)
  107153. "muls r6, r7\n\t"
  107154. #else
  107155. "mul r6, r7\n\t"
  107156. #endif
  107157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107158. "lsrs r7, r6, #16\n\t"
  107159. #else
  107160. "lsr r7, r6, #16\n\t"
  107161. #endif
  107162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107163. "lsls r6, r6, #16\n\t"
  107164. #else
  107165. "lsl r6, r6, #16\n\t"
  107166. #endif
  107167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107168. "adds r3, r3, r6\n\t"
  107169. #else
  107170. "add r3, r3, r6\n\t"
  107171. #endif
  107172. #ifdef WOLFSSL_KEIL
  107173. "adcs r4, r4, r7\n\t"
  107174. #elif defined(__clang__)
  107175. "adcs r4, r7\n\t"
  107176. #else
  107177. "adc r4, r7\n\t"
  107178. #endif
  107179. #ifdef WOLFSSL_KEIL
  107180. "adcs r5, r5, %[tmp]\n\t"
  107181. #elif defined(__clang__)
  107182. "adcs r5, %[tmp]\n\t"
  107183. #else
  107184. "adc r5, %[tmp]\n\t"
  107185. #endif
  107186. "# Multiply Done\n\t"
  107187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107188. "adds %[a], %[a], #4\n\t"
  107189. #else
  107190. "add %[a], %[a], #4\n\t"
  107191. #endif
  107192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107193. "subs %[b], %[b], #4\n\t"
  107194. #else
  107195. "sub %[b], %[b], #4\n\t"
  107196. #endif
  107197. "cmp %[a], r12\n\t"
  107198. "beq L_sp_384_mul_12_done_mul_%=\n\t"
  107199. "mov r6, r8\n\t"
  107200. "add r6, r6, r9\n\t"
  107201. "cmp %[a], r6\n\t"
  107202. "ble L_sp_384_mul_12_mul_%=\n\t"
  107203. "\n"
  107204. "L_sp_384_mul_12_done_mul_%=:\n\t"
  107205. "mov %[tmp], r11\n\t"
  107206. "mov r7, r8\n\t"
  107207. "str r3, [%[tmp], r7]\n\t"
  107208. "movs r3, r4\n\t"
  107209. "movs r4, r5\n\t"
  107210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107211. "adds r7, r7, #4\n\t"
  107212. #else
  107213. "add r7, r7, #4\n\t"
  107214. #endif
  107215. "mov r8, r7\n\t"
  107216. "movs r6, #0x58\n\t"
  107217. "cmp r7, r6\n\t"
  107218. "ble L_sp_384_mul_12_words_%=\n\t"
  107219. "str r3, [%[tmp], r7]\n\t"
  107220. "mov %[a], r9\n\t"
  107221. "mov %[b], r10\n\t"
  107222. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  107223. :
  107224. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  107225. );
  107226. XMEMCPY(r, t, sizeof(t));
  107227. }
  107228. /* Square a and put result in r. (r = a * a)
  107229. *
  107230. * r A single precision integer.
  107231. * a A single precision integer.
  107232. */
  107233. SP_NOINLINE static void sp_384_sqr_12(sp_digit* r, const sp_digit* a)
  107234. {
  107235. __asm__ __volatile__ (
  107236. "movs r3, #0\n\t"
  107237. "movs r4, #0\n\t"
  107238. "movs r5, #0\n\t"
  107239. "mov r8, r3\n\t"
  107240. "mov r11, %[r]\n\t"
  107241. "movs r6, #0x60\n\t"
  107242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107243. "negs r6, r6\n\t"
  107244. #else
  107245. "neg r6, r6\n\t"
  107246. #endif
  107247. "add sp, sp, r6\n\t"
  107248. "mov r10, sp\n\t"
  107249. "mov r9, %[a]\n\t"
  107250. "\n"
  107251. "L_sp_384_sqr_12_words_%=:\n\t"
  107252. "movs %[r], #0\n\t"
  107253. "movs r6, #44\n\t"
  107254. "mov %[a], r8\n\t"
  107255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107256. "subs %[a], %[a], r6\n\t"
  107257. #else
  107258. "sub %[a], %[a], r6\n\t"
  107259. #endif
  107260. #ifdef WOLFSSL_KEIL
  107261. "sbcs r6, r6, r6\n\t"
  107262. #elif defined(__clang__)
  107263. "sbcs r6, r6\n\t"
  107264. #else
  107265. "sbc r6, r6\n\t"
  107266. #endif
  107267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107268. "mvns r6, r6\n\t"
  107269. #else
  107270. "mvn r6, r6\n\t"
  107271. #endif
  107272. #ifdef WOLFSSL_KEIL
  107273. "ands %[a], %[a], r6\n\t"
  107274. #elif defined(__clang__)
  107275. "ands %[a], r6\n\t"
  107276. #else
  107277. "and %[a], r6\n\t"
  107278. #endif
  107279. "mov r2, r8\n\t"
  107280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107281. "subs r2, r2, %[a]\n\t"
  107282. #else
  107283. "sub r2, r2, %[a]\n\t"
  107284. #endif
  107285. "add %[a], %[a], r9\n\t"
  107286. "add r2, r2, r9\n\t"
  107287. "\n"
  107288. "L_sp_384_sqr_12_mul_%=:\n\t"
  107289. "cmp r2, %[a]\n\t"
  107290. "beq L_sp_384_sqr_12_sqr_%=\n\t"
  107291. "# Multiply * 2: Start\n\t"
  107292. "ldrh r6, [%[a]]\n\t"
  107293. "ldrh r7, [r2]\n\t"
  107294. #ifdef WOLFSSL_KEIL
  107295. "muls r7, r6, r7\n\t"
  107296. #elif defined(__clang__)
  107297. "muls r7, r6\n\t"
  107298. #else
  107299. "mul r7, r6\n\t"
  107300. #endif
  107301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107302. "adds r3, r3, r7\n\t"
  107303. #else
  107304. "add r3, r3, r7\n\t"
  107305. #endif
  107306. #ifdef WOLFSSL_KEIL
  107307. "adcs r4, r4, %[r]\n\t"
  107308. #elif defined(__clang__)
  107309. "adcs r4, %[r]\n\t"
  107310. #else
  107311. "adc r4, %[r]\n\t"
  107312. #endif
  107313. #ifdef WOLFSSL_KEIL
  107314. "adcs r5, r5, %[r]\n\t"
  107315. #elif defined(__clang__)
  107316. "adcs r5, %[r]\n\t"
  107317. #else
  107318. "adc r5, %[r]\n\t"
  107319. #endif
  107320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107321. "adds r3, r3, r7\n\t"
  107322. #else
  107323. "add r3, r3, r7\n\t"
  107324. #endif
  107325. #ifdef WOLFSSL_KEIL
  107326. "adcs r4, r4, %[r]\n\t"
  107327. #elif defined(__clang__)
  107328. "adcs r4, %[r]\n\t"
  107329. #else
  107330. "adc r4, %[r]\n\t"
  107331. #endif
  107332. #ifdef WOLFSSL_KEIL
  107333. "adcs r5, r5, %[r]\n\t"
  107334. #elif defined(__clang__)
  107335. "adcs r5, %[r]\n\t"
  107336. #else
  107337. "adc r5, %[r]\n\t"
  107338. #endif
  107339. "ldr r7, [r2]\n\t"
  107340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107341. "lsrs r7, r7, #16\n\t"
  107342. #else
  107343. "lsr r7, r7, #16\n\t"
  107344. #endif
  107345. #ifdef WOLFSSL_KEIL
  107346. "muls r6, r7, r6\n\t"
  107347. #elif defined(__clang__)
  107348. "muls r6, r7\n\t"
  107349. #else
  107350. "mul r6, r7\n\t"
  107351. #endif
  107352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107353. "lsrs r7, r6, #16\n\t"
  107354. #else
  107355. "lsr r7, r6, #16\n\t"
  107356. #endif
  107357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107358. "lsls r6, r6, #16\n\t"
  107359. #else
  107360. "lsl r6, r6, #16\n\t"
  107361. #endif
  107362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107363. "adds r3, r3, r6\n\t"
  107364. #else
  107365. "add r3, r3, r6\n\t"
  107366. #endif
  107367. #ifdef WOLFSSL_KEIL
  107368. "adcs r4, r4, r7\n\t"
  107369. #elif defined(__clang__)
  107370. "adcs r4, r7\n\t"
  107371. #else
  107372. "adc r4, r7\n\t"
  107373. #endif
  107374. #ifdef WOLFSSL_KEIL
  107375. "adcs r5, r5, %[r]\n\t"
  107376. #elif defined(__clang__)
  107377. "adcs r5, %[r]\n\t"
  107378. #else
  107379. "adc r5, %[r]\n\t"
  107380. #endif
  107381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107382. "adds r3, r3, r6\n\t"
  107383. #else
  107384. "add r3, r3, r6\n\t"
  107385. #endif
  107386. #ifdef WOLFSSL_KEIL
  107387. "adcs r4, r4, r7\n\t"
  107388. #elif defined(__clang__)
  107389. "adcs r4, r7\n\t"
  107390. #else
  107391. "adc r4, r7\n\t"
  107392. #endif
  107393. #ifdef WOLFSSL_KEIL
  107394. "adcs r5, r5, %[r]\n\t"
  107395. #elif defined(__clang__)
  107396. "adcs r5, %[r]\n\t"
  107397. #else
  107398. "adc r5, %[r]\n\t"
  107399. #endif
  107400. "ldr r6, [%[a]]\n\t"
  107401. "ldr r7, [r2]\n\t"
  107402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107403. "lsrs r6, r6, #16\n\t"
  107404. #else
  107405. "lsr r6, r6, #16\n\t"
  107406. #endif
  107407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107408. "lsrs r7, r7, #16\n\t"
  107409. #else
  107410. "lsr r7, r7, #16\n\t"
  107411. #endif
  107412. #ifdef WOLFSSL_KEIL
  107413. "muls r7, r6, r7\n\t"
  107414. #elif defined(__clang__)
  107415. "muls r7, r6\n\t"
  107416. #else
  107417. "mul r7, r6\n\t"
  107418. #endif
  107419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107420. "adds r4, r4, r7\n\t"
  107421. #else
  107422. "add r4, r4, r7\n\t"
  107423. #endif
  107424. #ifdef WOLFSSL_KEIL
  107425. "adcs r5, r5, %[r]\n\t"
  107426. #elif defined(__clang__)
  107427. "adcs r5, %[r]\n\t"
  107428. #else
  107429. "adc r5, %[r]\n\t"
  107430. #endif
  107431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107432. "adds r4, r4, r7\n\t"
  107433. #else
  107434. "add r4, r4, r7\n\t"
  107435. #endif
  107436. #ifdef WOLFSSL_KEIL
  107437. "adcs r5, r5, %[r]\n\t"
  107438. #elif defined(__clang__)
  107439. "adcs r5, %[r]\n\t"
  107440. #else
  107441. "adc r5, %[r]\n\t"
  107442. #endif
  107443. "ldrh r7, [r2]\n\t"
  107444. #ifdef WOLFSSL_KEIL
  107445. "muls r6, r7, r6\n\t"
  107446. #elif defined(__clang__)
  107447. "muls r6, r7\n\t"
  107448. #else
  107449. "mul r6, r7\n\t"
  107450. #endif
  107451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107452. "lsrs r7, r6, #16\n\t"
  107453. #else
  107454. "lsr r7, r6, #16\n\t"
  107455. #endif
  107456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107457. "lsls r6, r6, #16\n\t"
  107458. #else
  107459. "lsl r6, r6, #16\n\t"
  107460. #endif
  107461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107462. "adds r3, r3, r6\n\t"
  107463. #else
  107464. "add r3, r3, r6\n\t"
  107465. #endif
  107466. #ifdef WOLFSSL_KEIL
  107467. "adcs r4, r4, r7\n\t"
  107468. #elif defined(__clang__)
  107469. "adcs r4, r7\n\t"
  107470. #else
  107471. "adc r4, r7\n\t"
  107472. #endif
  107473. #ifdef WOLFSSL_KEIL
  107474. "adcs r5, r5, %[r]\n\t"
  107475. #elif defined(__clang__)
  107476. "adcs r5, %[r]\n\t"
  107477. #else
  107478. "adc r5, %[r]\n\t"
  107479. #endif
  107480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107481. "adds r3, r3, r6\n\t"
  107482. #else
  107483. "add r3, r3, r6\n\t"
  107484. #endif
  107485. #ifdef WOLFSSL_KEIL
  107486. "adcs r4, r4, r7\n\t"
  107487. #elif defined(__clang__)
  107488. "adcs r4, r7\n\t"
  107489. #else
  107490. "adc r4, r7\n\t"
  107491. #endif
  107492. #ifdef WOLFSSL_KEIL
  107493. "adcs r5, r5, %[r]\n\t"
  107494. #elif defined(__clang__)
  107495. "adcs r5, %[r]\n\t"
  107496. #else
  107497. "adc r5, %[r]\n\t"
  107498. #endif
  107499. "# Multiply * 2: Done\n\t"
  107500. "bal L_sp_384_sqr_12_done_sqr_%=\n\t"
  107501. "\n"
  107502. "L_sp_384_sqr_12_sqr_%=:\n\t"
  107503. "mov r12, r2\n\t"
  107504. "ldr r2, [%[a]]\n\t"
  107505. "# Square: Start\n\t"
  107506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107507. "lsrs r7, r2, #16\n\t"
  107508. #else
  107509. "lsr r7, r2, #16\n\t"
  107510. #endif
  107511. "uxth r6, r2\n\t"
  107512. #ifdef WOLFSSL_KEIL
  107513. "muls r6, r6, r6\n\t"
  107514. #elif defined(__clang__)
  107515. "muls r6, r6\n\t"
  107516. #else
  107517. "mul r6, r6\n\t"
  107518. #endif
  107519. #ifdef WOLFSSL_KEIL
  107520. "muls r7, r7, r7\n\t"
  107521. #elif defined(__clang__)
  107522. "muls r7, r7\n\t"
  107523. #else
  107524. "mul r7, r7\n\t"
  107525. #endif
  107526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107527. "adds r3, r3, r6\n\t"
  107528. #else
  107529. "add r3, r3, r6\n\t"
  107530. #endif
  107531. #ifdef WOLFSSL_KEIL
  107532. "adcs r4, r4, r7\n\t"
  107533. #elif defined(__clang__)
  107534. "adcs r4, r7\n\t"
  107535. #else
  107536. "adc r4, r7\n\t"
  107537. #endif
  107538. #ifdef WOLFSSL_KEIL
  107539. "adcs r5, r5, %[r]\n\t"
  107540. #elif defined(__clang__)
  107541. "adcs r5, %[r]\n\t"
  107542. #else
  107543. "adc r5, %[r]\n\t"
  107544. #endif
  107545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107546. "lsrs r7, r2, #16\n\t"
  107547. #else
  107548. "lsr r7, r2, #16\n\t"
  107549. #endif
  107550. "uxth r6, r2\n\t"
  107551. #ifdef WOLFSSL_KEIL
  107552. "muls r6, r7, r6\n\t"
  107553. #elif defined(__clang__)
  107554. "muls r6, r7\n\t"
  107555. #else
  107556. "mul r6, r7\n\t"
  107557. #endif
  107558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107559. "lsrs r7, r6, #15\n\t"
  107560. #else
  107561. "lsr r7, r6, #15\n\t"
  107562. #endif
  107563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107564. "lsls r6, r6, #17\n\t"
  107565. #else
  107566. "lsl r6, r6, #17\n\t"
  107567. #endif
  107568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107569. "adds r3, r3, r6\n\t"
  107570. #else
  107571. "add r3, r3, r6\n\t"
  107572. #endif
  107573. #ifdef WOLFSSL_KEIL
  107574. "adcs r4, r4, r7\n\t"
  107575. #elif defined(__clang__)
  107576. "adcs r4, r7\n\t"
  107577. #else
  107578. "adc r4, r7\n\t"
  107579. #endif
  107580. #ifdef WOLFSSL_KEIL
  107581. "adcs r5, r5, %[r]\n\t"
  107582. #elif defined(__clang__)
  107583. "adcs r5, %[r]\n\t"
  107584. #else
  107585. "adc r5, %[r]\n\t"
  107586. #endif
  107587. "# Square: Done\n\t"
  107588. "mov r2, r12\n\t"
  107589. "\n"
  107590. "L_sp_384_sqr_12_done_sqr_%=:\n\t"
  107591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107592. "adds %[a], %[a], #4\n\t"
  107593. #else
  107594. "add %[a], %[a], #4\n\t"
  107595. #endif
  107596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107597. "subs r2, r2, #4\n\t"
  107598. #else
  107599. "sub r2, r2, #4\n\t"
  107600. #endif
  107601. "movs r6, #48\n\t"
  107602. "add r6, r6, r9\n\t"
  107603. "cmp %[a], r6\n\t"
  107604. "beq L_sp_384_sqr_12_done_mul_%=\n\t"
  107605. "cmp %[a], r2\n\t"
  107606. "bgt L_sp_384_sqr_12_done_mul_%=\n\t"
  107607. "mov r7, r8\n\t"
  107608. "add r7, r7, r9\n\t"
  107609. "cmp %[a], r7\n\t"
  107610. "ble L_sp_384_sqr_12_mul_%=\n\t"
  107611. "\n"
  107612. "L_sp_384_sqr_12_done_mul_%=:\n\t"
  107613. "mov %[r], r10\n\t"
  107614. "mov r7, r8\n\t"
  107615. "str r3, [%[r], r7]\n\t"
  107616. "movs r3, r4\n\t"
  107617. "movs r4, r5\n\t"
  107618. "movs r5, #0\n\t"
  107619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107620. "adds r7, r7, #4\n\t"
  107621. #else
  107622. "add r7, r7, #4\n\t"
  107623. #endif
  107624. "mov r8, r7\n\t"
  107625. "movs r6, #0x58\n\t"
  107626. "cmp r7, r6\n\t"
  107627. "ble L_sp_384_sqr_12_words_%=\n\t"
  107628. "mov %[a], r9\n\t"
  107629. "str r3, [%[r], r7]\n\t"
  107630. "mov %[r], r11\n\t"
  107631. "mov %[a], r10\n\t"
  107632. "movs r3, #0x5c\n\t"
  107633. "\n"
  107634. "L_sp_384_sqr_12_store_%=:\n\t"
  107635. "ldr r6, [%[a], r3]\n\t"
  107636. "str r6, [%[r], r3]\n\t"
  107637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107638. "subs r3, r3, #4\n\t"
  107639. #else
  107640. "sub r3, r3, #4\n\t"
  107641. #endif
  107642. "bge L_sp_384_sqr_12_store_%=\n\t"
  107643. "movs r6, #0x60\n\t"
  107644. "add sp, sp, r6\n\t"
  107645. : [r] "+l" (r), [a] "+l" (a)
  107646. :
  107647. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  107648. );
  107649. }
  107650. #ifdef WOLFSSL_SP_SMALL
  107651. /* Add b to a into r. (r = a + b)
  107652. *
  107653. * r A single precision integer.
  107654. * a A single precision integer.
  107655. * b A single precision integer.
  107656. */
  107657. SP_NOINLINE static sp_digit sp_384_add_12(sp_digit* r, const sp_digit* a,
  107658. const sp_digit* b)
  107659. {
  107660. __asm__ __volatile__ (
  107661. "movs r6, %[a]\n\t"
  107662. "movs r7, #0\n\t"
  107663. "movs r3, #0\n\t"
  107664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107665. "adds r6, r6, #48\n\t"
  107666. #else
  107667. "add r6, r6, #48\n\t"
  107668. #endif
  107669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107670. "subs r7, r7, #1\n\t"
  107671. #else
  107672. "sub r7, r7, #1\n\t"
  107673. #endif
  107674. "\n"
  107675. "L_sp_384_add_12_word_%=:\n\t"
  107676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107677. "adds r3, r3, r7\n\t"
  107678. #else
  107679. "add r3, r3, r7\n\t"
  107680. #endif
  107681. "ldr r4, [%[a]]\n\t"
  107682. "ldr r5, [%[b]]\n\t"
  107683. #ifdef WOLFSSL_KEIL
  107684. "adcs r4, r4, r5\n\t"
  107685. #elif defined(__clang__)
  107686. "adcs r4, r5\n\t"
  107687. #else
  107688. "adc r4, r5\n\t"
  107689. #endif
  107690. "str r4, [%[r]]\n\t"
  107691. "movs r3, #0\n\t"
  107692. #ifdef WOLFSSL_KEIL
  107693. "adcs r3, r3, r3\n\t"
  107694. #elif defined(__clang__)
  107695. "adcs r3, r3\n\t"
  107696. #else
  107697. "adc r3, r3\n\t"
  107698. #endif
  107699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107700. "adds %[a], %[a], #4\n\t"
  107701. #else
  107702. "add %[a], %[a], #4\n\t"
  107703. #endif
  107704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107705. "adds %[b], %[b], #4\n\t"
  107706. #else
  107707. "add %[b], %[b], #4\n\t"
  107708. #endif
  107709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107710. "adds %[r], %[r], #4\n\t"
  107711. #else
  107712. "add %[r], %[r], #4\n\t"
  107713. #endif
  107714. "cmp %[a], r6\n\t"
  107715. "bne L_sp_384_add_12_word_%=\n\t"
  107716. "movs %[r], r3\n\t"
  107717. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  107718. :
  107719. : "memory", "r3", "r4", "r5", "r6", "r7"
  107720. );
  107721. return (uint32_t)(size_t)r;
  107722. }
  107723. #else
  107724. /* Add b to a into r. (r = a + b)
  107725. *
  107726. * r A single precision integer.
  107727. * a A single precision integer.
  107728. * b A single precision integer.
  107729. */
  107730. SP_NOINLINE static sp_digit sp_384_add_12(sp_digit* r, const sp_digit* a,
  107731. const sp_digit* b)
  107732. {
  107733. __asm__ __volatile__ (
  107734. "ldm %[b]!, {r5, r6}\n\t"
  107735. "ldm %[a]!, {r3, r4}\n\t"
  107736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107737. "adds r3, r3, r5\n\t"
  107738. #else
  107739. "add r3, r3, r5\n\t"
  107740. #endif
  107741. #ifdef WOLFSSL_KEIL
  107742. "adcs r4, r4, r6\n\t"
  107743. #elif defined(__clang__)
  107744. "adcs r4, r6\n\t"
  107745. #else
  107746. "adc r4, r6\n\t"
  107747. #endif
  107748. "stm %[r]!, {r3, r4}\n\t"
  107749. "ldm %[b]!, {r5, r6}\n\t"
  107750. "ldm %[a]!, {r3, r4}\n\t"
  107751. #ifdef WOLFSSL_KEIL
  107752. "adcs r3, r3, r5\n\t"
  107753. #elif defined(__clang__)
  107754. "adcs r3, r5\n\t"
  107755. #else
  107756. "adc r3, r5\n\t"
  107757. #endif
  107758. #ifdef WOLFSSL_KEIL
  107759. "adcs r4, r4, r6\n\t"
  107760. #elif defined(__clang__)
  107761. "adcs r4, r6\n\t"
  107762. #else
  107763. "adc r4, r6\n\t"
  107764. #endif
  107765. "stm %[r]!, {r3, r4}\n\t"
  107766. "ldm %[b]!, {r5, r6}\n\t"
  107767. "ldm %[a]!, {r3, r4}\n\t"
  107768. #ifdef WOLFSSL_KEIL
  107769. "adcs r3, r3, r5\n\t"
  107770. #elif defined(__clang__)
  107771. "adcs r3, r5\n\t"
  107772. #else
  107773. "adc r3, r5\n\t"
  107774. #endif
  107775. #ifdef WOLFSSL_KEIL
  107776. "adcs r4, r4, r6\n\t"
  107777. #elif defined(__clang__)
  107778. "adcs r4, r6\n\t"
  107779. #else
  107780. "adc r4, r6\n\t"
  107781. #endif
  107782. "stm %[r]!, {r3, r4}\n\t"
  107783. "ldm %[b]!, {r5, r6}\n\t"
  107784. "ldm %[a]!, {r3, r4}\n\t"
  107785. #ifdef WOLFSSL_KEIL
  107786. "adcs r3, r3, r5\n\t"
  107787. #elif defined(__clang__)
  107788. "adcs r3, r5\n\t"
  107789. #else
  107790. "adc r3, r5\n\t"
  107791. #endif
  107792. #ifdef WOLFSSL_KEIL
  107793. "adcs r4, r4, r6\n\t"
  107794. #elif defined(__clang__)
  107795. "adcs r4, r6\n\t"
  107796. #else
  107797. "adc r4, r6\n\t"
  107798. #endif
  107799. "stm %[r]!, {r3, r4}\n\t"
  107800. "ldm %[b]!, {r5, r6}\n\t"
  107801. "ldm %[a]!, {r3, r4}\n\t"
  107802. #ifdef WOLFSSL_KEIL
  107803. "adcs r3, r3, r5\n\t"
  107804. #elif defined(__clang__)
  107805. "adcs r3, r5\n\t"
  107806. #else
  107807. "adc r3, r5\n\t"
  107808. #endif
  107809. #ifdef WOLFSSL_KEIL
  107810. "adcs r4, r4, r6\n\t"
  107811. #elif defined(__clang__)
  107812. "adcs r4, r6\n\t"
  107813. #else
  107814. "adc r4, r6\n\t"
  107815. #endif
  107816. "stm %[r]!, {r3, r4}\n\t"
  107817. "ldm %[b]!, {r5, r6}\n\t"
  107818. "ldm %[a]!, {r3, r4}\n\t"
  107819. #ifdef WOLFSSL_KEIL
  107820. "adcs r3, r3, r5\n\t"
  107821. #elif defined(__clang__)
  107822. "adcs r3, r5\n\t"
  107823. #else
  107824. "adc r3, r5\n\t"
  107825. #endif
  107826. #ifdef WOLFSSL_KEIL
  107827. "adcs r4, r4, r6\n\t"
  107828. #elif defined(__clang__)
  107829. "adcs r4, r6\n\t"
  107830. #else
  107831. "adc r4, r6\n\t"
  107832. #endif
  107833. "stm %[r]!, {r3, r4}\n\t"
  107834. "movs %[r], #0\n\t"
  107835. #ifdef WOLFSSL_KEIL
  107836. "adcs %[r], %[r], %[r]\n\t"
  107837. #elif defined(__clang__)
  107838. "adcs %[r], %[r]\n\t"
  107839. #else
  107840. "adc %[r], %[r]\n\t"
  107841. #endif
  107842. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  107843. :
  107844. : "memory", "r3", "r4", "r5", "r6"
  107845. );
  107846. return (uint32_t)(size_t)r;
  107847. }
  107848. #endif /* WOLFSSL_SP_SMALL */
  107849. #ifdef WOLFSSL_SP_SMALL
  107850. /* Sub b from a into r. (r = a - b)
  107851. *
  107852. * r A single precision integer.
  107853. * a A single precision integer.
  107854. * b A single precision integer.
  107855. */
  107856. SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a,
  107857. const sp_digit* b)
  107858. {
  107859. __asm__ __volatile__ (
  107860. "movs r6, %[a]\n\t"
  107861. "movs r3, #0\n\t"
  107862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107863. "adds r6, r6, #48\n\t"
  107864. #else
  107865. "add r6, r6, #48\n\t"
  107866. #endif
  107867. "\n"
  107868. "L_sp_384_sub_12_word_%=:\n\t"
  107869. "movs r5, #0\n\t"
  107870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107871. "subs r5, r5, r3\n\t"
  107872. #else
  107873. "sub r5, r5, r3\n\t"
  107874. #endif
  107875. "ldr r4, [%[a]]\n\t"
  107876. "ldr r5, [%[b]]\n\t"
  107877. #ifdef WOLFSSL_KEIL
  107878. "sbcs r4, r4, r5\n\t"
  107879. #elif defined(__clang__)
  107880. "sbcs r4, r5\n\t"
  107881. #else
  107882. "sbc r4, r5\n\t"
  107883. #endif
  107884. "str r4, [%[r]]\n\t"
  107885. #ifdef WOLFSSL_KEIL
  107886. "sbcs r3, r3, r3\n\t"
  107887. #elif defined(__clang__)
  107888. "sbcs r3, r3\n\t"
  107889. #else
  107890. "sbc r3, r3\n\t"
  107891. #endif
  107892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107893. "adds %[a], %[a], #4\n\t"
  107894. #else
  107895. "add %[a], %[a], #4\n\t"
  107896. #endif
  107897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107898. "adds %[b], %[b], #4\n\t"
  107899. #else
  107900. "add %[b], %[b], #4\n\t"
  107901. #endif
  107902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107903. "adds %[r], %[r], #4\n\t"
  107904. #else
  107905. "add %[r], %[r], #4\n\t"
  107906. #endif
  107907. "cmp %[a], r6\n\t"
  107908. "bne L_sp_384_sub_12_word_%=\n\t"
  107909. "movs %[r], r3\n\t"
  107910. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  107911. :
  107912. : "memory", "r3", "r4", "r5", "r6"
  107913. );
  107914. return (uint32_t)(size_t)r;
  107915. }
  107916. #else
  107917. /* Sub b from a into r. (r = a - b)
  107918. *
  107919. * r A single precision integer.
  107920. * a A single precision integer.
  107921. * b A single precision integer.
  107922. */
  107923. SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a,
  107924. const sp_digit* b)
  107925. {
  107926. __asm__ __volatile__ (
  107927. "ldm %[b]!, {r5, r6}\n\t"
  107928. "ldm %[a]!, {r3, r4}\n\t"
  107929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  107930. "subs r3, r3, r5\n\t"
  107931. #else
  107932. "sub r3, r3, r5\n\t"
  107933. #endif
  107934. #ifdef WOLFSSL_KEIL
  107935. "sbcs r4, r4, r6\n\t"
  107936. #elif defined(__clang__)
  107937. "sbcs r4, r6\n\t"
  107938. #else
  107939. "sbc r4, r6\n\t"
  107940. #endif
  107941. "stm %[r]!, {r3, r4}\n\t"
  107942. "ldm %[b]!, {r5, r6}\n\t"
  107943. "ldm %[a]!, {r3, r4}\n\t"
  107944. #ifdef WOLFSSL_KEIL
  107945. "sbcs r3, r3, r5\n\t"
  107946. #elif defined(__clang__)
  107947. "sbcs r3, r5\n\t"
  107948. #else
  107949. "sbc r3, r5\n\t"
  107950. #endif
  107951. #ifdef WOLFSSL_KEIL
  107952. "sbcs r4, r4, r6\n\t"
  107953. #elif defined(__clang__)
  107954. "sbcs r4, r6\n\t"
  107955. #else
  107956. "sbc r4, r6\n\t"
  107957. #endif
  107958. "stm %[r]!, {r3, r4}\n\t"
  107959. "ldm %[b]!, {r5, r6}\n\t"
  107960. "ldm %[a]!, {r3, r4}\n\t"
  107961. #ifdef WOLFSSL_KEIL
  107962. "sbcs r3, r3, r5\n\t"
  107963. #elif defined(__clang__)
  107964. "sbcs r3, r5\n\t"
  107965. #else
  107966. "sbc r3, r5\n\t"
  107967. #endif
  107968. #ifdef WOLFSSL_KEIL
  107969. "sbcs r4, r4, r6\n\t"
  107970. #elif defined(__clang__)
  107971. "sbcs r4, r6\n\t"
  107972. #else
  107973. "sbc r4, r6\n\t"
  107974. #endif
  107975. "stm %[r]!, {r3, r4}\n\t"
  107976. "ldm %[b]!, {r5, r6}\n\t"
  107977. "ldm %[a]!, {r3, r4}\n\t"
  107978. #ifdef WOLFSSL_KEIL
  107979. "sbcs r3, r3, r5\n\t"
  107980. #elif defined(__clang__)
  107981. "sbcs r3, r5\n\t"
  107982. #else
  107983. "sbc r3, r5\n\t"
  107984. #endif
  107985. #ifdef WOLFSSL_KEIL
  107986. "sbcs r4, r4, r6\n\t"
  107987. #elif defined(__clang__)
  107988. "sbcs r4, r6\n\t"
  107989. #else
  107990. "sbc r4, r6\n\t"
  107991. #endif
  107992. "stm %[r]!, {r3, r4}\n\t"
  107993. "ldm %[b]!, {r5, r6}\n\t"
  107994. "ldm %[a]!, {r3, r4}\n\t"
  107995. #ifdef WOLFSSL_KEIL
  107996. "sbcs r3, r3, r5\n\t"
  107997. #elif defined(__clang__)
  107998. "sbcs r3, r5\n\t"
  107999. #else
  108000. "sbc r3, r5\n\t"
  108001. #endif
  108002. #ifdef WOLFSSL_KEIL
  108003. "sbcs r4, r4, r6\n\t"
  108004. #elif defined(__clang__)
  108005. "sbcs r4, r6\n\t"
  108006. #else
  108007. "sbc r4, r6\n\t"
  108008. #endif
  108009. "stm %[r]!, {r3, r4}\n\t"
  108010. "ldm %[b]!, {r5, r6}\n\t"
  108011. "ldm %[a]!, {r3, r4}\n\t"
  108012. #ifdef WOLFSSL_KEIL
  108013. "sbcs r3, r3, r5\n\t"
  108014. #elif defined(__clang__)
  108015. "sbcs r3, r5\n\t"
  108016. #else
  108017. "sbc r3, r5\n\t"
  108018. #endif
  108019. #ifdef WOLFSSL_KEIL
  108020. "sbcs r4, r4, r6\n\t"
  108021. #elif defined(__clang__)
  108022. "sbcs r4, r6\n\t"
  108023. #else
  108024. "sbc r4, r6\n\t"
  108025. #endif
  108026. "stm %[r]!, {r3, r4}\n\t"
  108027. #ifdef WOLFSSL_KEIL
  108028. "sbcs %[r], %[r], %[r]\n\t"
  108029. #elif defined(__clang__)
  108030. "sbcs %[r], %[r]\n\t"
  108031. #else
  108032. "sbc %[r], %[r]\n\t"
  108033. #endif
  108034. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  108035. :
  108036. : "memory", "r3", "r4", "r5", "r6"
  108037. );
  108038. return (uint32_t)(size_t)r;
  108039. }
  108040. #endif /* WOLFSSL_SP_SMALL */
  108041. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  108042. *
  108043. * r The resulting Montgomery form number.
  108044. * a The number to convert.
  108045. * m The modulus (prime).
  108046. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  108047. */
  108048. static int sp_384_mod_mul_norm_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  108049. {
  108050. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  108051. int64_t* t = NULL;
  108052. #else
  108053. int64_t t[12];
  108054. #endif
  108055. int64_t o;
  108056. int err = MP_OKAY;
  108057. (void)m;
  108058. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  108059. t = (int64_t*)XMALLOC(sizeof(int64_t) * 12, NULL, DYNAMIC_TYPE_ECC);
  108060. if (t == NULL) {
  108061. err = MEMORY_E;
  108062. }
  108063. #endif
  108064. if (err == MP_OKAY) {
  108065. /* 1 0 0 0 0 0 0 0 1 1 0 -1 */
  108066. t[0] = 0 + (int64_t)a[0] + (int64_t)a[8] + (int64_t)a[9] - (int64_t)a[11];
  108067. /* -1 1 0 0 0 0 0 0 -1 0 1 1 */
  108068. t[1] = 0 - (int64_t)a[0] + (int64_t)a[1] - (int64_t)a[8] + (int64_t)a[10] + (int64_t)a[11];
  108069. /* 0 -1 1 0 0 0 0 0 0 -1 0 1 */
  108070. t[2] = 0 - (int64_t)a[1] + (int64_t)a[2] - (int64_t)a[9] + (int64_t)a[11];
  108071. /* 1 0 -1 1 0 0 0 0 1 1 -1 -1 */
  108072. 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];
  108073. /* 1 1 0 -1 1 0 0 0 1 2 1 -2 */
  108074. 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];
  108075. /* 0 1 1 0 -1 1 0 0 0 1 2 1 */
  108076. 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];
  108077. /* 0 0 1 1 0 -1 1 0 0 0 1 2 */
  108078. 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];
  108079. /* 0 0 0 1 1 0 -1 1 0 0 0 1 */
  108080. t[7] = 0 + (int64_t)a[3] + (int64_t)a[4] - (int64_t)a[6] + (int64_t)a[7] + (int64_t)a[11];
  108081. /* 0 0 0 0 1 1 0 -1 1 0 0 0 */
  108082. t[8] = 0 + (int64_t)a[4] + (int64_t)a[5] - (int64_t)a[7] + (int64_t)a[8];
  108083. /* 0 0 0 0 0 1 1 0 -1 1 0 0 */
  108084. t[9] = 0 + (int64_t)a[5] + (int64_t)a[6] - (int64_t)a[8] + (int64_t)a[9];
  108085. /* 0 0 0 0 0 0 1 1 0 -1 1 0 */
  108086. t[10] = 0 + (int64_t)a[6] + (int64_t)a[7] - (int64_t)a[9] + (int64_t)a[10];
  108087. /* 0 0 0 0 0 0 0 1 1 0 -1 1 */
  108088. t[11] = 0 + (int64_t)a[7] + (int64_t)a[8] - (int64_t)a[10] + (int64_t)a[11];
  108089. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  108090. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  108091. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  108092. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  108093. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  108094. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  108095. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  108096. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  108097. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  108098. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  108099. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  108100. o = t[11] >> 32; t[11] &= 0xffffffff;
  108101. t[0] += o;
  108102. t[1] -= o;
  108103. t[3] += o;
  108104. t[4] += o;
  108105. t[1] += t[0] >> 32; t[0] &= 0xffffffff;
  108106. t[2] += t[1] >> 32; t[1] &= 0xffffffff;
  108107. t[3] += t[2] >> 32; t[2] &= 0xffffffff;
  108108. t[4] += t[3] >> 32; t[3] &= 0xffffffff;
  108109. t[5] += t[4] >> 32; t[4] &= 0xffffffff;
  108110. t[6] += t[5] >> 32; t[5] &= 0xffffffff;
  108111. t[7] += t[6] >> 32; t[6] &= 0xffffffff;
  108112. t[8] += t[7] >> 32; t[7] &= 0xffffffff;
  108113. t[9] += t[8] >> 32; t[8] &= 0xffffffff;
  108114. t[10] += t[9] >> 32; t[9] &= 0xffffffff;
  108115. t[11] += t[10] >> 32; t[10] &= 0xffffffff;
  108116. r[0] = t[0];
  108117. r[1] = t[1];
  108118. r[2] = t[2];
  108119. r[3] = t[3];
  108120. r[4] = t[4];
  108121. r[5] = t[5];
  108122. r[6] = t[6];
  108123. r[7] = t[7];
  108124. r[8] = t[8];
  108125. r[9] = t[9];
  108126. r[10] = t[10];
  108127. r[11] = t[11];
  108128. }
  108129. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  108130. if (t != NULL)
  108131. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  108132. #endif
  108133. return err;
  108134. }
  108135. /* Convert an mp_int to an array of sp_digit.
  108136. *
  108137. * r A single precision integer.
  108138. * size Maximum number of bytes to convert
  108139. * a A multi-precision integer.
  108140. */
  108141. static void sp_384_from_mp(sp_digit* r, int size, const mp_int* a)
  108142. {
  108143. #if DIGIT_BIT == 32
  108144. int j;
  108145. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  108146. for (j = a->used; j < size; j++) {
  108147. r[j] = 0;
  108148. }
  108149. #elif DIGIT_BIT > 32
  108150. int i;
  108151. int j = 0;
  108152. word32 s = 0;
  108153. r[0] = 0;
  108154. for (i = 0; i < a->used && j < size; i++) {
  108155. r[j] |= ((sp_digit)a->dp[i] << s);
  108156. r[j] &= 0xffffffff;
  108157. s = 32U - s;
  108158. if (j + 1 >= size) {
  108159. break;
  108160. }
  108161. /* lint allow cast of mismatch word32 and mp_digit */
  108162. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  108163. while ((s + 32U) <= (word32)DIGIT_BIT) {
  108164. s += 32U;
  108165. r[j] &= 0xffffffff;
  108166. if (j + 1 >= size) {
  108167. break;
  108168. }
  108169. if (s < (word32)DIGIT_BIT) {
  108170. /* lint allow cast of mismatch word32 and mp_digit */
  108171. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  108172. }
  108173. else {
  108174. r[++j] = (sp_digit)0;
  108175. }
  108176. }
  108177. s = (word32)DIGIT_BIT - s;
  108178. }
  108179. for (j++; j < size; j++) {
  108180. r[j] = 0;
  108181. }
  108182. #else
  108183. int i;
  108184. int j = 0;
  108185. int s = 0;
  108186. r[0] = 0;
  108187. for (i = 0; i < a->used && j < size; i++) {
  108188. r[j] |= ((sp_digit)a->dp[i]) << s;
  108189. if (s + DIGIT_BIT >= 32) {
  108190. r[j] &= 0xffffffff;
  108191. if (j + 1 >= size) {
  108192. break;
  108193. }
  108194. s = 32 - s;
  108195. if (s == DIGIT_BIT) {
  108196. r[++j] = 0;
  108197. s = 0;
  108198. }
  108199. else {
  108200. r[++j] = a->dp[i] >> s;
  108201. s = DIGIT_BIT - s;
  108202. }
  108203. }
  108204. else {
  108205. s += DIGIT_BIT;
  108206. }
  108207. }
  108208. for (j++; j < size; j++) {
  108209. r[j] = 0;
  108210. }
  108211. #endif
  108212. }
  108213. /* Convert a point of type ecc_point to type sp_point_384.
  108214. *
  108215. * p Point of type sp_point_384 (result).
  108216. * pm Point of type ecc_point.
  108217. */
  108218. static void sp_384_point_from_ecc_point_12(sp_point_384* p,
  108219. const ecc_point* pm)
  108220. {
  108221. XMEMSET(p->x, 0, sizeof(p->x));
  108222. XMEMSET(p->y, 0, sizeof(p->y));
  108223. XMEMSET(p->z, 0, sizeof(p->z));
  108224. sp_384_from_mp(p->x, 12, pm->x);
  108225. sp_384_from_mp(p->y, 12, pm->y);
  108226. sp_384_from_mp(p->z, 12, pm->z);
  108227. p->infinity = 0;
  108228. }
  108229. /* Convert an array of sp_digit to an mp_int.
  108230. *
  108231. * a A single precision integer.
  108232. * r A multi-precision integer.
  108233. */
  108234. static int sp_384_to_mp(const sp_digit* a, mp_int* r)
  108235. {
  108236. int err;
  108237. err = mp_grow(r, (384 + DIGIT_BIT - 1) / DIGIT_BIT);
  108238. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  108239. #if DIGIT_BIT == 32
  108240. XMEMCPY(r->dp, a, sizeof(sp_digit) * 12);
  108241. r->used = 12;
  108242. mp_clamp(r);
  108243. #elif DIGIT_BIT < 32
  108244. int i;
  108245. int j = 0;
  108246. int s = 0;
  108247. r->dp[0] = 0;
  108248. for (i = 0; i < 12; i++) {
  108249. r->dp[j] |= (mp_digit)(a[i] << s);
  108250. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  108251. s = DIGIT_BIT - s;
  108252. r->dp[++j] = (mp_digit)(a[i] >> s);
  108253. while (s + DIGIT_BIT <= 32) {
  108254. s += DIGIT_BIT;
  108255. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  108256. if (s == SP_WORD_SIZE) {
  108257. r->dp[j] = 0;
  108258. }
  108259. else {
  108260. r->dp[j] = (mp_digit)(a[i] >> s);
  108261. }
  108262. }
  108263. s = 32 - s;
  108264. }
  108265. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  108266. mp_clamp(r);
  108267. #else
  108268. int i;
  108269. int j = 0;
  108270. int s = 0;
  108271. r->dp[0] = 0;
  108272. for (i = 0; i < 12; i++) {
  108273. r->dp[j] |= ((mp_digit)a[i]) << s;
  108274. if (s + 32 >= DIGIT_BIT) {
  108275. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  108276. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  108277. #endif
  108278. s = DIGIT_BIT - s;
  108279. r->dp[++j] = a[i] >> s;
  108280. s = 32 - s;
  108281. }
  108282. else {
  108283. s += 32;
  108284. }
  108285. }
  108286. r->used = (384 + DIGIT_BIT - 1) / DIGIT_BIT;
  108287. mp_clamp(r);
  108288. #endif
  108289. }
  108290. return err;
  108291. }
  108292. /* Convert a point of type sp_point_384 to type ecc_point.
  108293. *
  108294. * p Point of type sp_point_384.
  108295. * pm Point of type ecc_point (result).
  108296. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  108297. * MP_OKAY.
  108298. */
  108299. static int sp_384_point_to_ecc_point_12(const sp_point_384* p, ecc_point* pm)
  108300. {
  108301. int err;
  108302. err = sp_384_to_mp(p->x, pm->x);
  108303. if (err == MP_OKAY) {
  108304. err = sp_384_to_mp(p->y, pm->y);
  108305. }
  108306. if (err == MP_OKAY) {
  108307. err = sp_384_to_mp(p->z, pm->z);
  108308. }
  108309. return err;
  108310. }
  108311. /* Conditionally subtract b from a using the mask m.
  108312. * m is -1 to subtract and 0 when not copying.
  108313. *
  108314. * r A single precision number representing condition subtract result.
  108315. * a A single precision number to subtract from.
  108316. * b A single precision number to subtract.
  108317. * m Mask value to apply.
  108318. */
  108319. SP_NOINLINE static sp_digit sp_384_cond_sub_12(sp_digit* r, const sp_digit* a,
  108320. const sp_digit* b, sp_digit m)
  108321. {
  108322. __asm__ __volatile__ (
  108323. "movs r4, #0\n\t"
  108324. "movs r5, #48\n\t"
  108325. "mov r8, r5\n\t"
  108326. "movs r7, #0\n\t"
  108327. "\n"
  108328. "L_sp_384_cond_sub_12_words_%=:\n\t"
  108329. "ldr r6, [%[b], r7]\n\t"
  108330. #ifdef WOLFSSL_KEIL
  108331. "ands r6, r6, %[m]\n\t"
  108332. #elif defined(__clang__)
  108333. "ands r6, %[m]\n\t"
  108334. #else
  108335. "and r6, %[m]\n\t"
  108336. #endif
  108337. "movs r5, #0\n\t"
  108338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108339. "subs r5, r5, r4\n\t"
  108340. #else
  108341. "sub r5, r5, r4\n\t"
  108342. #endif
  108343. "ldr r5, [%[a], r7]\n\t"
  108344. #ifdef WOLFSSL_KEIL
  108345. "sbcs r5, r5, r6\n\t"
  108346. #elif defined(__clang__)
  108347. "sbcs r5, r6\n\t"
  108348. #else
  108349. "sbc r5, r6\n\t"
  108350. #endif
  108351. #ifdef WOLFSSL_KEIL
  108352. "sbcs r4, r4, r4\n\t"
  108353. #elif defined(__clang__)
  108354. "sbcs r4, r4\n\t"
  108355. #else
  108356. "sbc r4, r4\n\t"
  108357. #endif
  108358. "str r5, [%[r], r7]\n\t"
  108359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108360. "adds r7, r7, #4\n\t"
  108361. #else
  108362. "add r7, r7, #4\n\t"
  108363. #endif
  108364. "cmp r7, r8\n\t"
  108365. "blt L_sp_384_cond_sub_12_words_%=\n\t"
  108366. "movs %[r], r4\n\t"
  108367. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  108368. :
  108369. : "memory", "r4", "r5", "r6", "r7", "r8"
  108370. );
  108371. return (uint32_t)(size_t)r;
  108372. }
  108373. #define sp_384_mont_reduce_order_12 sp_384_mont_reduce_12
  108374. /* Reduce the number back to 384 bits using Montgomery reduction.
  108375. *
  108376. * a A single precision number to reduce in place.
  108377. * m The single precision number representing the modulus.
  108378. * mp The digit representing the negative inverse of m mod 2^n.
  108379. */
  108380. SP_NOINLINE static void sp_384_mont_reduce_12(sp_digit* a, const sp_digit* m,
  108381. sp_digit mp)
  108382. {
  108383. __asm__ __volatile__ (
  108384. "movs r7, #0\n\t"
  108385. "mov r8, %[mp]\n\t"
  108386. "mov r12, r7\n\t"
  108387. "mov lr, %[m]\n\t"
  108388. "mov r9, %[a]\n\t"
  108389. "mov r11, %[a]\n\t"
  108390. "movs r5, #44\n\t"
  108391. "movs r6, #48\n\t"
  108392. "add r9, r9, r5\n\t"
  108393. "add r11, r11, r6\n\t"
  108394. "\n"
  108395. "L_sp_384_mont_reduce_12_mod_%=:\n\t"
  108396. "movs r7, #0\n\t"
  108397. "movs r4, #0\n\t"
  108398. "# a[i] += m[0] * mu\n\t"
  108399. "ldm %[m]!, {%[mp]}\n\t"
  108400. "ldm %[a]!, {r3}\n\t"
  108401. "# mu = a[i] * mp\n\t"
  108402. "mov r5, r8\n\t"
  108403. #ifdef WOLFSSL_KEIL
  108404. "muls r5, r3, r5\n\t"
  108405. #elif defined(__clang__)
  108406. "muls r5, r3\n\t"
  108407. #else
  108408. "mul r5, r3\n\t"
  108409. #endif
  108410. "mov r10, r5\n\t"
  108411. "# Multiply m[0] and mu - Start\n\t"
  108412. "mov r5, r10\n\t"
  108413. "uxth r6, %[mp]\n\t"
  108414. "uxth r5, r5\n\t"
  108415. #ifdef WOLFSSL_KEIL
  108416. "muls r6, r5, r6\n\t"
  108417. #elif defined(__clang__)
  108418. "muls r6, r5\n\t"
  108419. #else
  108420. "mul r6, r5\n\t"
  108421. #endif
  108422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108423. "adds r3, r3, r6\n\t"
  108424. #else
  108425. "add r3, r3, r6\n\t"
  108426. #endif
  108427. #ifdef WOLFSSL_KEIL
  108428. "adcs r4, r4, r7\n\t"
  108429. #elif defined(__clang__)
  108430. "adcs r4, r7\n\t"
  108431. #else
  108432. "adc r4, r7\n\t"
  108433. #endif
  108434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108435. "lsrs r6, %[mp], #16\n\t"
  108436. #else
  108437. "lsr r6, %[mp], #16\n\t"
  108438. #endif
  108439. #ifdef WOLFSSL_KEIL
  108440. "muls r5, r6, r5\n\t"
  108441. #elif defined(__clang__)
  108442. "muls r5, r6\n\t"
  108443. #else
  108444. "mul r5, r6\n\t"
  108445. #endif
  108446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108447. "lsrs r6, r5, #16\n\t"
  108448. #else
  108449. "lsr r6, r5, #16\n\t"
  108450. #endif
  108451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108452. "lsls r5, r5, #16\n\t"
  108453. #else
  108454. "lsl r5, r5, #16\n\t"
  108455. #endif
  108456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108457. "adds r3, r3, r5\n\t"
  108458. #else
  108459. "add r3, r3, r5\n\t"
  108460. #endif
  108461. #ifdef WOLFSSL_KEIL
  108462. "adcs r4, r4, r6\n\t"
  108463. #elif defined(__clang__)
  108464. "adcs r4, r6\n\t"
  108465. #else
  108466. "adc r4, r6\n\t"
  108467. #endif
  108468. "mov r5, r10\n\t"
  108469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108470. "lsrs r6, %[mp], #16\n\t"
  108471. #else
  108472. "lsr r6, %[mp], #16\n\t"
  108473. #endif
  108474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108475. "lsrs r5, r5, #16\n\t"
  108476. #else
  108477. "lsr r5, r5, #16\n\t"
  108478. #endif
  108479. #ifdef WOLFSSL_KEIL
  108480. "muls r6, r5, r6\n\t"
  108481. #elif defined(__clang__)
  108482. "muls r6, r5\n\t"
  108483. #else
  108484. "mul r6, r5\n\t"
  108485. #endif
  108486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108487. "adds r4, r4, r6\n\t"
  108488. #else
  108489. "add r4, r4, r6\n\t"
  108490. #endif
  108491. "uxth r6, %[mp]\n\t"
  108492. #ifdef WOLFSSL_KEIL
  108493. "muls r5, r6, r5\n\t"
  108494. #elif defined(__clang__)
  108495. "muls r5, r6\n\t"
  108496. #else
  108497. "mul r5, r6\n\t"
  108498. #endif
  108499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108500. "lsrs r6, r5, #16\n\t"
  108501. #else
  108502. "lsr r6, r5, #16\n\t"
  108503. #endif
  108504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108505. "lsls r5, r5, #16\n\t"
  108506. #else
  108507. "lsl r5, r5, #16\n\t"
  108508. #endif
  108509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108510. "adds r3, r3, r5\n\t"
  108511. #else
  108512. "add r3, r3, r5\n\t"
  108513. #endif
  108514. #ifdef WOLFSSL_KEIL
  108515. "adcs r4, r4, r6\n\t"
  108516. #elif defined(__clang__)
  108517. "adcs r4, r6\n\t"
  108518. #else
  108519. "adc r4, r6\n\t"
  108520. #endif
  108521. "# Multiply m[0] and mu - Done\n\t"
  108522. "\n"
  108523. "L_sp_384_mont_reduce_12_word_%=:\n\t"
  108524. "# a[i+j] += m[j] * mu\n\t"
  108525. "ldr r3, [%[a]]\n\t"
  108526. "ldm %[m]!, {%[mp]}\n\t"
  108527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108528. "adds r3, r3, r4\n\t"
  108529. #else
  108530. "add r3, r3, r4\n\t"
  108531. #endif
  108532. "movs r4, #0\n\t"
  108533. #ifdef WOLFSSL_KEIL
  108534. "adcs r4, r4, r7\n\t"
  108535. #elif defined(__clang__)
  108536. "adcs r4, r7\n\t"
  108537. #else
  108538. "adc r4, r7\n\t"
  108539. #endif
  108540. "# Multiply m[j] and mu - Start\n\t"
  108541. "mov r5, r10\n\t"
  108542. "uxth r6, %[mp]\n\t"
  108543. "uxth r5, r5\n\t"
  108544. #ifdef WOLFSSL_KEIL
  108545. "muls r6, r5, r6\n\t"
  108546. #elif defined(__clang__)
  108547. "muls r6, r5\n\t"
  108548. #else
  108549. "mul r6, r5\n\t"
  108550. #endif
  108551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108552. "adds r3, r3, r6\n\t"
  108553. #else
  108554. "add r3, r3, r6\n\t"
  108555. #endif
  108556. #ifdef WOLFSSL_KEIL
  108557. "adcs r4, r4, r7\n\t"
  108558. #elif defined(__clang__)
  108559. "adcs r4, r7\n\t"
  108560. #else
  108561. "adc r4, r7\n\t"
  108562. #endif
  108563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108564. "lsrs r6, %[mp], #16\n\t"
  108565. #else
  108566. "lsr r6, %[mp], #16\n\t"
  108567. #endif
  108568. #ifdef WOLFSSL_KEIL
  108569. "muls r5, r6, r5\n\t"
  108570. #elif defined(__clang__)
  108571. "muls r5, r6\n\t"
  108572. #else
  108573. "mul r5, r6\n\t"
  108574. #endif
  108575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108576. "lsrs r6, r5, #16\n\t"
  108577. #else
  108578. "lsr r6, r5, #16\n\t"
  108579. #endif
  108580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108581. "lsls r5, r5, #16\n\t"
  108582. #else
  108583. "lsl r5, r5, #16\n\t"
  108584. #endif
  108585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108586. "adds r3, r3, r5\n\t"
  108587. #else
  108588. "add r3, r3, r5\n\t"
  108589. #endif
  108590. #ifdef WOLFSSL_KEIL
  108591. "adcs r4, r4, r6\n\t"
  108592. #elif defined(__clang__)
  108593. "adcs r4, r6\n\t"
  108594. #else
  108595. "adc r4, r6\n\t"
  108596. #endif
  108597. "mov r5, r10\n\t"
  108598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108599. "lsrs r6, %[mp], #16\n\t"
  108600. #else
  108601. "lsr r6, %[mp], #16\n\t"
  108602. #endif
  108603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108604. "lsrs r5, r5, #16\n\t"
  108605. #else
  108606. "lsr r5, r5, #16\n\t"
  108607. #endif
  108608. #ifdef WOLFSSL_KEIL
  108609. "muls r6, r5, r6\n\t"
  108610. #elif defined(__clang__)
  108611. "muls r6, r5\n\t"
  108612. #else
  108613. "mul r6, r5\n\t"
  108614. #endif
  108615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108616. "adds r4, r4, r6\n\t"
  108617. #else
  108618. "add r4, r4, r6\n\t"
  108619. #endif
  108620. "uxth r6, %[mp]\n\t"
  108621. #ifdef WOLFSSL_KEIL
  108622. "muls r5, r6, r5\n\t"
  108623. #elif defined(__clang__)
  108624. "muls r5, r6\n\t"
  108625. #else
  108626. "mul r5, r6\n\t"
  108627. #endif
  108628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108629. "lsrs r6, r5, #16\n\t"
  108630. #else
  108631. "lsr r6, r5, #16\n\t"
  108632. #endif
  108633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108634. "lsls r5, r5, #16\n\t"
  108635. #else
  108636. "lsl r5, r5, #16\n\t"
  108637. #endif
  108638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108639. "adds r3, r3, r5\n\t"
  108640. #else
  108641. "add r3, r3, r5\n\t"
  108642. #endif
  108643. #ifdef WOLFSSL_KEIL
  108644. "adcs r4, r4, r6\n\t"
  108645. #elif defined(__clang__)
  108646. "adcs r4, r6\n\t"
  108647. #else
  108648. "adc r4, r6\n\t"
  108649. #endif
  108650. "# Multiply m[j] and mu - Done\n\t"
  108651. "stm %[a]!, {r3}\n\t"
  108652. "cmp %[a], r9\n\t"
  108653. "blt L_sp_384_mont_reduce_12_word_%=\n\t"
  108654. "# a[i+11] += m[11] * mu\n\t"
  108655. "ldr %[mp], [%[m]]\n\t"
  108656. "mov r3, r12\n\t"
  108657. "# Multiply m[11] and mu - Start\n\t"
  108658. "mov r5, r10\n\t"
  108659. "uxth r6, %[mp]\n\t"
  108660. "uxth r5, r5\n\t"
  108661. #ifdef WOLFSSL_KEIL
  108662. "muls r6, r5, r6\n\t"
  108663. #elif defined(__clang__)
  108664. "muls r6, r5\n\t"
  108665. #else
  108666. "mul r6, r5\n\t"
  108667. #endif
  108668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108669. "adds r4, r4, r6\n\t"
  108670. #else
  108671. "add r4, r4, r6\n\t"
  108672. #endif
  108673. #ifdef WOLFSSL_KEIL
  108674. "adcs r3, r3, r7\n\t"
  108675. #elif defined(__clang__)
  108676. "adcs r3, r7\n\t"
  108677. #else
  108678. "adc r3, r7\n\t"
  108679. #endif
  108680. #ifdef WOLFSSL_KEIL
  108681. "adcs r7, r7, r7\n\t"
  108682. #elif defined(__clang__)
  108683. "adcs r7, r7\n\t"
  108684. #else
  108685. "adc r7, r7\n\t"
  108686. #endif
  108687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108688. "lsrs r6, %[mp], #16\n\t"
  108689. #else
  108690. "lsr r6, %[mp], #16\n\t"
  108691. #endif
  108692. #ifdef WOLFSSL_KEIL
  108693. "muls r5, r6, r5\n\t"
  108694. #elif defined(__clang__)
  108695. "muls r5, r6\n\t"
  108696. #else
  108697. "mul r5, r6\n\t"
  108698. #endif
  108699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108700. "lsrs r6, r5, #16\n\t"
  108701. #else
  108702. "lsr r6, r5, #16\n\t"
  108703. #endif
  108704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108705. "lsls r5, r5, #16\n\t"
  108706. #else
  108707. "lsl r5, r5, #16\n\t"
  108708. #endif
  108709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108710. "adds r4, r4, r5\n\t"
  108711. #else
  108712. "add r4, r4, r5\n\t"
  108713. #endif
  108714. #ifdef WOLFSSL_KEIL
  108715. "adcs r3, r3, r6\n\t"
  108716. #elif defined(__clang__)
  108717. "adcs r3, r6\n\t"
  108718. #else
  108719. "adc r3, r6\n\t"
  108720. #endif
  108721. #ifdef WOLFSSL_KEIL
  108722. "adcs r7, r7, r7\n\t"
  108723. #elif defined(__clang__)
  108724. "adcs r7, r7\n\t"
  108725. #else
  108726. "adc r7, r7\n\t"
  108727. #endif
  108728. "mov r5, r10\n\t"
  108729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108730. "lsrs r6, %[mp], #16\n\t"
  108731. #else
  108732. "lsr r6, %[mp], #16\n\t"
  108733. #endif
  108734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108735. "lsrs r5, r5, #16\n\t"
  108736. #else
  108737. "lsr r5, r5, #16\n\t"
  108738. #endif
  108739. #ifdef WOLFSSL_KEIL
  108740. "muls r6, r5, r6\n\t"
  108741. #elif defined(__clang__)
  108742. "muls r6, r5\n\t"
  108743. #else
  108744. "mul r6, r5\n\t"
  108745. #endif
  108746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108747. "adds r3, r3, r6\n\t"
  108748. #else
  108749. "add r3, r3, r6\n\t"
  108750. #endif
  108751. #ifdef WOLFSSL_KEIL
  108752. "adcs r7, r7, r7\n\t"
  108753. #elif defined(__clang__)
  108754. "adcs r7, r7\n\t"
  108755. #else
  108756. "adc r7, r7\n\t"
  108757. #endif
  108758. "uxth r6, %[mp]\n\t"
  108759. #ifdef WOLFSSL_KEIL
  108760. "muls r5, r6, r5\n\t"
  108761. #elif defined(__clang__)
  108762. "muls r5, r6\n\t"
  108763. #else
  108764. "mul r5, r6\n\t"
  108765. #endif
  108766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108767. "lsrs r6, r5, #16\n\t"
  108768. #else
  108769. "lsr r6, r5, #16\n\t"
  108770. #endif
  108771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108772. "lsls r5, r5, #16\n\t"
  108773. #else
  108774. "lsl r5, r5, #16\n\t"
  108775. #endif
  108776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108777. "adds r4, r4, r5\n\t"
  108778. #else
  108779. "add r4, r4, r5\n\t"
  108780. #endif
  108781. #ifdef WOLFSSL_KEIL
  108782. "adcs r3, r3, r6\n\t"
  108783. #elif defined(__clang__)
  108784. "adcs r3, r6\n\t"
  108785. #else
  108786. "adc r3, r6\n\t"
  108787. #endif
  108788. #ifdef WOLFSSL_KEIL
  108789. "adcs r7, r7, r7\n\t"
  108790. #elif defined(__clang__)
  108791. "adcs r7, r7\n\t"
  108792. #else
  108793. "adc r7, r7\n\t"
  108794. #endif
  108795. "# Multiply m[11] and mu - Done\n\t"
  108796. "ldr r5, [%[a]]\n\t"
  108797. "ldr r6, [%[a], #4]\n\t"
  108798. "movs %[mp], #0\n\t"
  108799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108800. "adds r5, r5, r4\n\t"
  108801. #else
  108802. "add r5, r5, r4\n\t"
  108803. #endif
  108804. #ifdef WOLFSSL_KEIL
  108805. "adcs r6, r6, r3\n\t"
  108806. #elif defined(__clang__)
  108807. "adcs r6, r3\n\t"
  108808. #else
  108809. "adc r6, r3\n\t"
  108810. #endif
  108811. #ifdef WOLFSSL_KEIL
  108812. "adcs r7, r7, %[mp]\n\t"
  108813. #elif defined(__clang__)
  108814. "adcs r7, %[mp]\n\t"
  108815. #else
  108816. "adc r7, %[mp]\n\t"
  108817. #endif
  108818. "stm %[a]!, {r5, r6}\n\t"
  108819. "# i += 1\n\t"
  108820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108821. "subs %[a], %[a], #4\n\t"
  108822. #else
  108823. "sub %[a], %[a], #4\n\t"
  108824. #endif
  108825. "movs r3, #44\n\t"
  108826. "mov r9, %[a]\n\t"
  108827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108828. "subs %[a], %[a], r3\n\t"
  108829. #else
  108830. "sub %[a], %[a], r3\n\t"
  108831. #endif
  108832. "mov r12, r7\n\t"
  108833. "mov %[m], lr\n\t"
  108834. "cmp r11, %[a]\n\t"
  108835. "bgt L_sp_384_mont_reduce_12_mod_%=\n\t"
  108836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108837. "negs r7, r7\n\t"
  108838. #else
  108839. "neg r7, r7\n\t"
  108840. #endif
  108841. "# Subtract masked modulus\n\t"
  108842. "movs r4, #48\n\t"
  108843. "movs %[mp], #0\n\t"
  108844. "movs r3, #0\n\t"
  108845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108846. "subs %[a], %[a], r4\n\t"
  108847. #else
  108848. "sub %[a], %[a], r4\n\t"
  108849. #endif
  108850. #ifndef WOLFSSL_SP_LARGE_CODE
  108851. "\n"
  108852. "L_sp_384_mont_reduce_12_sub_mask_%=:\n\t"
  108853. "ldm %[m]!, {r6}\n\t"
  108854. "movs r5, #0\n\t"
  108855. #ifdef WOLFSSL_KEIL
  108856. "ands r6, r6, r7\n\t"
  108857. #elif defined(__clang__)
  108858. "ands r6, r7\n\t"
  108859. #else
  108860. "and r6, r7\n\t"
  108861. #endif
  108862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108863. "subs r5, r5, %[mp]\n\t"
  108864. #else
  108865. "sub r5, r5, %[mp]\n\t"
  108866. #endif
  108867. "ldr r5, [%[a], r4]\n\t"
  108868. #ifdef WOLFSSL_KEIL
  108869. "sbcs r5, r5, r6\n\t"
  108870. #elif defined(__clang__)
  108871. "sbcs r5, r6\n\t"
  108872. #else
  108873. "sbc r5, r6\n\t"
  108874. #endif
  108875. #ifdef WOLFSSL_KEIL
  108876. "sbcs %[mp], %[mp], %[mp]\n\t"
  108877. #elif defined(__clang__)
  108878. "sbcs %[mp], %[mp]\n\t"
  108879. #else
  108880. "sbc %[mp], %[mp]\n\t"
  108881. #endif
  108882. "stm %[a]!, {r5}\n\t"
  108883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108884. "adds r3, r3, #4\n\t"
  108885. #else
  108886. "add r3, r3, #4\n\t"
  108887. #endif
  108888. "cmp r3, r4\n\t"
  108889. "blt L_sp_384_mont_reduce_12_sub_mask_%=\n\t"
  108890. #else /* WOLFSSL_SP_LARGE_CODE */
  108891. "ldm %[m]!, {r6}\n\t"
  108892. #ifdef WOLFSSL_KEIL
  108893. "ands r6, r6, r7\n\t"
  108894. #elif defined(__clang__)
  108895. "ands r6, r7\n\t"
  108896. #else
  108897. "and r6, r7\n\t"
  108898. #endif
  108899. "ldr r5, [%[a], r4]\n\t"
  108900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  108901. "subs r5, r5, r6\n\t"
  108902. #else
  108903. "sub r5, r5, r6\n\t"
  108904. #endif
  108905. "stm %[a]!, {r5}\n\t"
  108906. "ldm %[m]!, {r6}\n\t"
  108907. #ifdef WOLFSSL_KEIL
  108908. "ands r6, r6, r7\n\t"
  108909. #elif defined(__clang__)
  108910. "ands r6, r7\n\t"
  108911. #else
  108912. "and r6, r7\n\t"
  108913. #endif
  108914. "ldr r5, [%[a], r4]\n\t"
  108915. #ifdef WOLFSSL_KEIL
  108916. "sbcs r5, r5, r6\n\t"
  108917. #elif defined(__clang__)
  108918. "sbcs r5, r6\n\t"
  108919. #else
  108920. "sbc r5, r6\n\t"
  108921. #endif
  108922. "stm %[a]!, {r5}\n\t"
  108923. "ldm %[m]!, {r6}\n\t"
  108924. #ifdef WOLFSSL_KEIL
  108925. "ands r6, r6, r7\n\t"
  108926. #elif defined(__clang__)
  108927. "ands r6, r7\n\t"
  108928. #else
  108929. "and r6, r7\n\t"
  108930. #endif
  108931. "ldr r5, [%[a], r4]\n\t"
  108932. #ifdef WOLFSSL_KEIL
  108933. "sbcs r5, r5, r6\n\t"
  108934. #elif defined(__clang__)
  108935. "sbcs r5, r6\n\t"
  108936. #else
  108937. "sbc r5, r6\n\t"
  108938. #endif
  108939. "stm %[a]!, {r5}\n\t"
  108940. "ldm %[m]!, {r6}\n\t"
  108941. #ifdef WOLFSSL_KEIL
  108942. "ands r6, r6, r7\n\t"
  108943. #elif defined(__clang__)
  108944. "ands r6, r7\n\t"
  108945. #else
  108946. "and r6, r7\n\t"
  108947. #endif
  108948. "ldr r5, [%[a], r4]\n\t"
  108949. #ifdef WOLFSSL_KEIL
  108950. "sbcs r5, r5, r6\n\t"
  108951. #elif defined(__clang__)
  108952. "sbcs r5, r6\n\t"
  108953. #else
  108954. "sbc r5, r6\n\t"
  108955. #endif
  108956. "stm %[a]!, {r5}\n\t"
  108957. "ldm %[m]!, {r6}\n\t"
  108958. #ifdef WOLFSSL_KEIL
  108959. "ands r6, r6, r7\n\t"
  108960. #elif defined(__clang__)
  108961. "ands r6, r7\n\t"
  108962. #else
  108963. "and r6, r7\n\t"
  108964. #endif
  108965. "ldr r5, [%[a], r4]\n\t"
  108966. #ifdef WOLFSSL_KEIL
  108967. "sbcs r5, r5, r6\n\t"
  108968. #elif defined(__clang__)
  108969. "sbcs r5, r6\n\t"
  108970. #else
  108971. "sbc r5, r6\n\t"
  108972. #endif
  108973. "stm %[a]!, {r5}\n\t"
  108974. "ldm %[m]!, {r6}\n\t"
  108975. #ifdef WOLFSSL_KEIL
  108976. "ands r6, r6, r7\n\t"
  108977. #elif defined(__clang__)
  108978. "ands r6, r7\n\t"
  108979. #else
  108980. "and r6, r7\n\t"
  108981. #endif
  108982. "ldr r5, [%[a], r4]\n\t"
  108983. #ifdef WOLFSSL_KEIL
  108984. "sbcs r5, r5, r6\n\t"
  108985. #elif defined(__clang__)
  108986. "sbcs r5, r6\n\t"
  108987. #else
  108988. "sbc r5, r6\n\t"
  108989. #endif
  108990. "stm %[a]!, {r5}\n\t"
  108991. "ldm %[m]!, {r6}\n\t"
  108992. #ifdef WOLFSSL_KEIL
  108993. "ands r6, r6, r7\n\t"
  108994. #elif defined(__clang__)
  108995. "ands r6, r7\n\t"
  108996. #else
  108997. "and r6, r7\n\t"
  108998. #endif
  108999. "ldr r5, [%[a], r4]\n\t"
  109000. #ifdef WOLFSSL_KEIL
  109001. "sbcs r5, r5, r6\n\t"
  109002. #elif defined(__clang__)
  109003. "sbcs r5, r6\n\t"
  109004. #else
  109005. "sbc r5, r6\n\t"
  109006. #endif
  109007. "stm %[a]!, {r5}\n\t"
  109008. "ldm %[m]!, {r6}\n\t"
  109009. #ifdef WOLFSSL_KEIL
  109010. "ands r6, r6, r7\n\t"
  109011. #elif defined(__clang__)
  109012. "ands r6, r7\n\t"
  109013. #else
  109014. "and r6, r7\n\t"
  109015. #endif
  109016. "ldr r5, [%[a], r4]\n\t"
  109017. #ifdef WOLFSSL_KEIL
  109018. "sbcs r5, r5, r6\n\t"
  109019. #elif defined(__clang__)
  109020. "sbcs r5, r6\n\t"
  109021. #else
  109022. "sbc r5, r6\n\t"
  109023. #endif
  109024. "stm %[a]!, {r5}\n\t"
  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. #ifdef WOLFSSL_KEIL
  109035. "sbcs r5, r5, r6\n\t"
  109036. #elif defined(__clang__)
  109037. "sbcs r5, r6\n\t"
  109038. #else
  109039. "sbc r5, r6\n\t"
  109040. #endif
  109041. "stm %[a]!, {r5}\n\t"
  109042. "ldm %[m]!, {r6}\n\t"
  109043. #ifdef WOLFSSL_KEIL
  109044. "ands r6, r6, r7\n\t"
  109045. #elif defined(__clang__)
  109046. "ands r6, r7\n\t"
  109047. #else
  109048. "and r6, r7\n\t"
  109049. #endif
  109050. "ldr r5, [%[a], r4]\n\t"
  109051. #ifdef WOLFSSL_KEIL
  109052. "sbcs r5, r5, r6\n\t"
  109053. #elif defined(__clang__)
  109054. "sbcs r5, r6\n\t"
  109055. #else
  109056. "sbc r5, r6\n\t"
  109057. #endif
  109058. "stm %[a]!, {r5}\n\t"
  109059. "ldm %[m]!, {r6}\n\t"
  109060. #ifdef WOLFSSL_KEIL
  109061. "ands r6, r6, r7\n\t"
  109062. #elif defined(__clang__)
  109063. "ands r6, r7\n\t"
  109064. #else
  109065. "and r6, r7\n\t"
  109066. #endif
  109067. "ldr r5, [%[a], r4]\n\t"
  109068. #ifdef WOLFSSL_KEIL
  109069. "sbcs r5, r5, r6\n\t"
  109070. #elif defined(__clang__)
  109071. "sbcs r5, r6\n\t"
  109072. #else
  109073. "sbc r5, r6\n\t"
  109074. #endif
  109075. "stm %[a]!, {r5}\n\t"
  109076. "ldm %[m]!, {r6}\n\t"
  109077. #ifdef WOLFSSL_KEIL
  109078. "ands r6, r6, r7\n\t"
  109079. #elif defined(__clang__)
  109080. "ands r6, r7\n\t"
  109081. #else
  109082. "and r6, r7\n\t"
  109083. #endif
  109084. "ldr r5, [%[a], r4]\n\t"
  109085. #ifdef WOLFSSL_KEIL
  109086. "sbcs r5, r5, r6\n\t"
  109087. #elif defined(__clang__)
  109088. "sbcs r5, r6\n\t"
  109089. #else
  109090. "sbc r5, r6\n\t"
  109091. #endif
  109092. "stm %[a]!, {r5}\n\t"
  109093. #endif /* WOLFSSL_SP_LARGE_CODE */
  109094. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  109095. :
  109096. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  109097. );
  109098. }
  109099. /* Multiply two Montgomery form numbers mod the modulus (prime).
  109100. * (r = a * b mod m)
  109101. *
  109102. * r Result of multiplication.
  109103. * a First number to multiply in Montgomery form.
  109104. * b Second number to multiply in Montgomery form.
  109105. * m Modulus (prime).
  109106. * mp Montgomery mulitplier.
  109107. */
  109108. SP_NOINLINE static void sp_384_mont_mul_12(sp_digit* r, const sp_digit* a,
  109109. const sp_digit* b, const sp_digit* m, sp_digit mp)
  109110. {
  109111. sp_384_mul_12(r, a, b);
  109112. sp_384_mont_reduce_12(r, m, mp);
  109113. }
  109114. /* Square the Montgomery form number. (r = a * a mod m)
  109115. *
  109116. * r Result of squaring.
  109117. * a Number to square in Montgomery form.
  109118. * m Modulus (prime).
  109119. * mp Montgomery mulitplier.
  109120. */
  109121. SP_NOINLINE static void sp_384_mont_sqr_12(sp_digit* r, const sp_digit* a,
  109122. const sp_digit* m, sp_digit mp)
  109123. {
  109124. sp_384_sqr_12(r, a);
  109125. sp_384_mont_reduce_12(r, m, mp);
  109126. }
  109127. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  109128. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  109129. *
  109130. * r Result of squaring.
  109131. * a Number to square in Montgomery form.
  109132. * n Number of times to square.
  109133. * m Modulus (prime).
  109134. * mp Montgomery mulitplier.
  109135. */
  109136. static void sp_384_mont_sqr_n_12(sp_digit* r, const sp_digit* a, int n,
  109137. const sp_digit* m, sp_digit mp)
  109138. {
  109139. sp_384_mont_sqr_12(r, a, m, mp);
  109140. for (; n > 1; n--) {
  109141. sp_384_mont_sqr_12(r, r, m, mp);
  109142. }
  109143. }
  109144. #endif /* !WOLFSSL_SP_SMALL | HAVE_COMP_KEY */
  109145. #ifdef WOLFSSL_SP_SMALL
  109146. /* Mod-2 for the P384 curve. */
  109147. static const uint32_t p384_mod_minus_2[12] = {
  109148. 0xfffffffdU,0x00000000U,0x00000000U,0xffffffffU,0xfffffffeU,0xffffffffU,
  109149. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  109150. };
  109151. #endif /* !WOLFSSL_SP_SMALL */
  109152. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  109153. * P384 curve. (r = 1 / a mod m)
  109154. *
  109155. * r Inverse result.
  109156. * a Number to invert.
  109157. * td Temporary data.
  109158. */
  109159. static void sp_384_mont_inv_12(sp_digit* r, const sp_digit* a, sp_digit* td)
  109160. {
  109161. #ifdef WOLFSSL_SP_SMALL
  109162. sp_digit* t = td;
  109163. int i;
  109164. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  109165. for (i=382; i>=0; i--) {
  109166. sp_384_mont_sqr_12(t, t, p384_mod, p384_mp_mod);
  109167. if (p384_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  109168. sp_384_mont_mul_12(t, t, a, p384_mod, p384_mp_mod);
  109169. }
  109170. XMEMCPY(r, t, sizeof(sp_digit) * 12);
  109171. #else
  109172. sp_digit* t1 = td;
  109173. sp_digit* t2 = td + 2 * 12;
  109174. sp_digit* t3 = td + 4 * 12;
  109175. sp_digit* t4 = td + 6 * 12;
  109176. sp_digit* t5 = td + 8 * 12;
  109177. /* 0x2 */
  109178. sp_384_mont_sqr_12(t1, a, p384_mod, p384_mp_mod);
  109179. /* 0x3 */
  109180. sp_384_mont_mul_12(t5, t1, a, p384_mod, p384_mp_mod);
  109181. /* 0xc */
  109182. sp_384_mont_sqr_n_12(t1, t5, 2, p384_mod, p384_mp_mod);
  109183. /* 0xf */
  109184. sp_384_mont_mul_12(t2, t5, t1, p384_mod, p384_mp_mod);
  109185. /* 0x1e */
  109186. sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod);
  109187. /* 0x1f */
  109188. sp_384_mont_mul_12(t4, t1, a, p384_mod, p384_mp_mod);
  109189. /* 0x3e0 */
  109190. sp_384_mont_sqr_n_12(t1, t4, 5, p384_mod, p384_mp_mod);
  109191. /* 0x3ff */
  109192. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  109193. /* 0x7fe0 */
  109194. sp_384_mont_sqr_n_12(t1, t2, 5, p384_mod, p384_mp_mod);
  109195. /* 0x7fff */
  109196. sp_384_mont_mul_12(t4, t4, t1, p384_mod, p384_mp_mod);
  109197. /* 0x3fff8000 */
  109198. sp_384_mont_sqr_n_12(t1, t4, 15, p384_mod, p384_mp_mod);
  109199. /* 0x3fffffff */
  109200. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  109201. /* 0xfffffffc */
  109202. sp_384_mont_sqr_n_12(t3, t2, 2, p384_mod, p384_mp_mod);
  109203. /* 0xfffffffd */
  109204. sp_384_mont_mul_12(r, t3, a, p384_mod, p384_mp_mod);
  109205. /* 0xffffffff */
  109206. sp_384_mont_mul_12(t3, t5, t3, p384_mod, p384_mp_mod);
  109207. /* 0xfffffffc0000000 */
  109208. sp_384_mont_sqr_n_12(t1, t2, 30, p384_mod, p384_mp_mod);
  109209. /* 0xfffffffffffffff */
  109210. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  109211. /* 0xfffffffffffffff000000000000000 */
  109212. sp_384_mont_sqr_n_12(t1, t2, 60, p384_mod, p384_mp_mod);
  109213. /* 0xffffffffffffffffffffffffffffff */
  109214. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  109215. /* 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  109216. sp_384_mont_sqr_n_12(t1, t2, 120, p384_mod, p384_mp_mod);
  109217. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  109218. sp_384_mont_mul_12(t2, t2, t1, p384_mod, p384_mp_mod);
  109219. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  109220. sp_384_mont_sqr_n_12(t1, t2, 15, p384_mod, p384_mp_mod);
  109221. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  109222. sp_384_mont_mul_12(t2, t4, t1, p384_mod, p384_mp_mod);
  109223. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000 */
  109224. sp_384_mont_sqr_n_12(t1, t2, 33, p384_mod, p384_mp_mod);
  109225. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff */
  109226. sp_384_mont_mul_12(t2, t3, t1, p384_mod, p384_mp_mod);
  109227. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000000000000 */
  109228. sp_384_mont_sqr_n_12(t1, t2, 96, p384_mod, p384_mp_mod);
  109229. /* 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffd */
  109230. sp_384_mont_mul_12(r, r, t1, p384_mod, p384_mp_mod);
  109231. #endif /* WOLFSSL_SP_SMALL */
  109232. }
  109233. /* Compare a with b in constant time.
  109234. *
  109235. * a A single precision integer.
  109236. * b A single precision integer.
  109237. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  109238. * respectively.
  109239. */
  109240. SP_NOINLINE static sp_int32 sp_384_cmp_12(const sp_digit* a, const sp_digit* b)
  109241. {
  109242. __asm__ __volatile__ (
  109243. "movs r2, #0\n\t"
  109244. "movs r3, #0\n\t"
  109245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109246. "mvns r3, r3\n\t"
  109247. #else
  109248. "mvn r3, r3\n\t"
  109249. #endif
  109250. "movs r6, #44\n\t"
  109251. "\n"
  109252. "L_sp_384_cmp_12_words_%=:\n\t"
  109253. "ldr r7, [%[a], r6]\n\t"
  109254. "ldr r5, [%[b], r6]\n\t"
  109255. #ifdef WOLFSSL_KEIL
  109256. "ands r7, r7, r3\n\t"
  109257. #elif defined(__clang__)
  109258. "ands r7, r3\n\t"
  109259. #else
  109260. "and r7, r3\n\t"
  109261. #endif
  109262. #ifdef WOLFSSL_KEIL
  109263. "ands r5, r5, r3\n\t"
  109264. #elif defined(__clang__)
  109265. "ands r5, r3\n\t"
  109266. #else
  109267. "and r5, r3\n\t"
  109268. #endif
  109269. "movs r4, r7\n\t"
  109270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109271. "subs r7, r7, r5\n\t"
  109272. #else
  109273. "sub r7, r7, r5\n\t"
  109274. #endif
  109275. #ifdef WOLFSSL_KEIL
  109276. "sbcs r7, r7, r7\n\t"
  109277. #elif defined(__clang__)
  109278. "sbcs r7, r7\n\t"
  109279. #else
  109280. "sbc r7, r7\n\t"
  109281. #endif
  109282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109283. "adds r2, r2, r7\n\t"
  109284. #else
  109285. "add r2, r2, r7\n\t"
  109286. #endif
  109287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109288. "mvns r7, r7\n\t"
  109289. #else
  109290. "mvn r7, r7\n\t"
  109291. #endif
  109292. #ifdef WOLFSSL_KEIL
  109293. "ands r3, r3, r7\n\t"
  109294. #elif defined(__clang__)
  109295. "ands r3, r7\n\t"
  109296. #else
  109297. "and r3, r7\n\t"
  109298. #endif
  109299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109300. "subs r5, r5, r4\n\t"
  109301. #else
  109302. "sub r5, r5, r4\n\t"
  109303. #endif
  109304. #ifdef WOLFSSL_KEIL
  109305. "sbcs r7, r7, r7\n\t"
  109306. #elif defined(__clang__)
  109307. "sbcs r7, r7\n\t"
  109308. #else
  109309. "sbc r7, r7\n\t"
  109310. #endif
  109311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109312. "subs r2, r2, r7\n\t"
  109313. #else
  109314. "sub r2, r2, r7\n\t"
  109315. #endif
  109316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109317. "mvns r7, r7\n\t"
  109318. #else
  109319. "mvn r7, r7\n\t"
  109320. #endif
  109321. #ifdef WOLFSSL_KEIL
  109322. "ands r3, r3, r7\n\t"
  109323. #elif defined(__clang__)
  109324. "ands r3, r7\n\t"
  109325. #else
  109326. "and r3, r7\n\t"
  109327. #endif
  109328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109329. "subs r6, r6, #4\n\t"
  109330. #else
  109331. "sub r6, r6, #4\n\t"
  109332. #endif
  109333. "bge L_sp_384_cmp_12_words_%=\n\t"
  109334. "movs %[a], r2\n\t"
  109335. : [a] "+l" (a), [b] "+l" (b)
  109336. :
  109337. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  109338. );
  109339. return (uint32_t)(size_t)a;
  109340. }
  109341. /* Normalize the values in each word to 32.
  109342. *
  109343. * a Array of sp_digit to normalize.
  109344. */
  109345. #define sp_384_norm_12(a)
  109346. /* Map the Montgomery form projective coordinate point to an affine point.
  109347. *
  109348. * r Resulting affine coordinate point.
  109349. * p Montgomery form projective coordinate point.
  109350. * t Temporary ordinate data.
  109351. */
  109352. static void sp_384_map_12(sp_point_384* r, const sp_point_384* p,
  109353. sp_digit* t)
  109354. {
  109355. sp_digit* t1 = t;
  109356. sp_digit* t2 = t + 2*12;
  109357. sp_int32 n;
  109358. sp_384_mont_inv_12(t1, p->z, t + 2*12);
  109359. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  109360. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  109361. /* x /= z^2 */
  109362. sp_384_mont_mul_12(r->x, p->x, t2, p384_mod, p384_mp_mod);
  109363. XMEMSET(r->x + 12, 0, sizeof(r->x) / 2U);
  109364. sp_384_mont_reduce_12(r->x, p384_mod, p384_mp_mod);
  109365. /* Reduce x to less than modulus */
  109366. n = sp_384_cmp_12(r->x, p384_mod);
  109367. sp_384_cond_sub_12(r->x, r->x, p384_mod, ~(n >> 31));
  109368. sp_384_norm_12(r->x);
  109369. /* y /= z^3 */
  109370. sp_384_mont_mul_12(r->y, p->y, t1, p384_mod, p384_mp_mod);
  109371. XMEMSET(r->y + 12, 0, sizeof(r->y) / 2U);
  109372. sp_384_mont_reduce_12(r->y, p384_mod, p384_mp_mod);
  109373. /* Reduce y to less than modulus */
  109374. n = sp_384_cmp_12(r->y, p384_mod);
  109375. sp_384_cond_sub_12(r->y, r->y, p384_mod, ~(n >> 31));
  109376. sp_384_norm_12(r->y);
  109377. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  109378. r->z[0] = 1;
  109379. }
  109380. /* Add two Montgomery form numbers (r = a + b % m).
  109381. *
  109382. * r Result of addition.
  109383. * a First number to add in Montgomery form.
  109384. * b Second number to add in Montgomery form.
  109385. * m Modulus (prime).
  109386. */
  109387. SP_NOINLINE static void sp_384_mont_add_12(sp_digit* r, const sp_digit* a,
  109388. const sp_digit* b, const sp_digit* m)
  109389. {
  109390. sp_digit o;
  109391. o = sp_384_add_12(r, a, b);
  109392. sp_384_cond_sub_12(r, r, m, 0 - o);
  109393. }
  109394. /* Double a Montgomery form number (r = a + a % m).
  109395. *
  109396. * r Result of doubling.
  109397. * a Number to double in Montgomery form.
  109398. * m Modulus (prime).
  109399. */
  109400. SP_NOINLINE static void sp_384_mont_dbl_12(sp_digit* r, const sp_digit* a,
  109401. const sp_digit* m)
  109402. {
  109403. sp_digit o;
  109404. o = sp_384_add_12(r, a, a);
  109405. sp_384_cond_sub_12(r, r, m, 0 - o);
  109406. }
  109407. /* Triple a Montgomery form number (r = a + a + a % m).
  109408. *
  109409. * r Result of Tripling.
  109410. * a Number to triple in Montgomery form.
  109411. * m Modulus (prime).
  109412. */
  109413. SP_NOINLINE static void sp_384_mont_tpl_12(sp_digit* r, const sp_digit* a,
  109414. const sp_digit* m)
  109415. {
  109416. sp_digit o;
  109417. o = sp_384_add_12(r, a, a);
  109418. sp_384_cond_sub_12(r, r, m, 0 - o);
  109419. o = sp_384_add_12(r, r, a);
  109420. sp_384_cond_sub_12(r, r, m, 0 - o);
  109421. }
  109422. /* Conditionally add a and b using the mask m.
  109423. * m is -1 to add and 0 when not.
  109424. *
  109425. * r A single precision number representing conditional add result.
  109426. * a A single precision number to add with.
  109427. * b A single precision number to add.
  109428. * m Mask value to apply.
  109429. */
  109430. SP_NOINLINE static sp_digit sp_384_cond_add_12(sp_digit* r, const sp_digit* a,
  109431. const sp_digit* b, sp_digit m)
  109432. {
  109433. __asm__ __volatile__ (
  109434. "movs r4, #0\n\t"
  109435. "movs r5, #48\n\t"
  109436. "mov r8, r5\n\t"
  109437. "movs r7, #0\n\t"
  109438. "\n"
  109439. "L_sp_384_cond_add_12_words_%=:\n\t"
  109440. "ldr r6, [%[b], r7]\n\t"
  109441. #ifdef WOLFSSL_KEIL
  109442. "ands r6, r6, %[m]\n\t"
  109443. #elif defined(__clang__)
  109444. "ands r6, %[m]\n\t"
  109445. #else
  109446. "and r6, %[m]\n\t"
  109447. #endif
  109448. "movs r5, #0\n\t"
  109449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109450. "subs r5, r5, #1\n\t"
  109451. #else
  109452. "sub r5, r5, #1\n\t"
  109453. #endif
  109454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109455. "adds r5, r5, r4\n\t"
  109456. #else
  109457. "add r5, r5, r4\n\t"
  109458. #endif
  109459. "ldr r5, [%[a], r7]\n\t"
  109460. #ifdef WOLFSSL_KEIL
  109461. "adcs r5, r5, r6\n\t"
  109462. #elif defined(__clang__)
  109463. "adcs r5, r6\n\t"
  109464. #else
  109465. "adc r5, r6\n\t"
  109466. #endif
  109467. "movs r4, #0\n\t"
  109468. #ifdef WOLFSSL_KEIL
  109469. "adcs r4, r4, r4\n\t"
  109470. #elif defined(__clang__)
  109471. "adcs r4, r4\n\t"
  109472. #else
  109473. "adc r4, r4\n\t"
  109474. #endif
  109475. "str r5, [%[r], r7]\n\t"
  109476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109477. "adds r7, r7, #4\n\t"
  109478. #else
  109479. "add r7, r7, #4\n\t"
  109480. #endif
  109481. "cmp r7, r8\n\t"
  109482. "blt L_sp_384_cond_add_12_words_%=\n\t"
  109483. "movs %[r], r4\n\t"
  109484. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  109485. :
  109486. : "memory", "r4", "r5", "r6", "r7", "r8"
  109487. );
  109488. return (uint32_t)(size_t)r;
  109489. }
  109490. /* Subtract two Montgomery form numbers (r = a - b % m).
  109491. *
  109492. * r Result of subtration.
  109493. * a Number to subtract from in Montgomery form.
  109494. * b Number to subtract with in Montgomery form.
  109495. * m Modulus (prime).
  109496. */
  109497. SP_NOINLINE static void sp_384_mont_sub_12(sp_digit* r, const sp_digit* a,
  109498. const sp_digit* b, const sp_digit* m)
  109499. {
  109500. sp_digit o;
  109501. o = sp_384_sub_12(r, a, b);
  109502. sp_384_cond_add_12(r, r, m, o);
  109503. }
  109504. #define sp_384_mont_sub_lower_12 sp_384_mont_sub_12
  109505. /* Right shift a by 1 bit into r. (r = a >> 1)
  109506. *
  109507. * r A single precision integer.
  109508. * a A single precision integer.
  109509. */
  109510. static void sp_384_rshift1_12(sp_digit* r, const sp_digit* a)
  109511. {
  109512. __asm__ __volatile__ (
  109513. "ldr r2, [%[a]]\n\t"
  109514. "ldr r3, [%[a], #4]\n\t"
  109515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109516. "lsrs r2, r2, #1\n\t"
  109517. #else
  109518. "lsr r2, r2, #1\n\t"
  109519. #endif
  109520. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109521. "lsls r5, r3, #31\n\t"
  109522. #else
  109523. "lsl r5, r3, #31\n\t"
  109524. #endif
  109525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109526. "lsrs r3, r3, #1\n\t"
  109527. #else
  109528. "lsr r3, r3, #1\n\t"
  109529. #endif
  109530. #ifdef WOLFSSL_KEIL
  109531. "orrs r2, r2, r5\n\t"
  109532. #elif defined(__clang__)
  109533. "orrs r2, r5\n\t"
  109534. #else
  109535. "orr r2, r5\n\t"
  109536. #endif
  109537. "ldr r4, [%[a], #8]\n\t"
  109538. "str r2, [%[r]]\n\t"
  109539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109540. "lsls r5, r4, #31\n\t"
  109541. #else
  109542. "lsl r5, r4, #31\n\t"
  109543. #endif
  109544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109545. "lsrs r4, r4, #1\n\t"
  109546. #else
  109547. "lsr r4, r4, #1\n\t"
  109548. #endif
  109549. #ifdef WOLFSSL_KEIL
  109550. "orrs r3, r3, r5\n\t"
  109551. #elif defined(__clang__)
  109552. "orrs r3, r5\n\t"
  109553. #else
  109554. "orr r3, r5\n\t"
  109555. #endif
  109556. "ldr r2, [%[a], #12]\n\t"
  109557. "str r3, [%[r], #4]\n\t"
  109558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109559. "lsls r5, r2, #31\n\t"
  109560. #else
  109561. "lsl r5, r2, #31\n\t"
  109562. #endif
  109563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109564. "lsrs r2, r2, #1\n\t"
  109565. #else
  109566. "lsr r2, r2, #1\n\t"
  109567. #endif
  109568. #ifdef WOLFSSL_KEIL
  109569. "orrs r4, r4, r5\n\t"
  109570. #elif defined(__clang__)
  109571. "orrs r4, r5\n\t"
  109572. #else
  109573. "orr r4, r5\n\t"
  109574. #endif
  109575. "ldr r3, [%[a], #16]\n\t"
  109576. "str r4, [%[r], #8]\n\t"
  109577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109578. "lsls r5, r3, #31\n\t"
  109579. #else
  109580. "lsl r5, r3, #31\n\t"
  109581. #endif
  109582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109583. "lsrs r3, r3, #1\n\t"
  109584. #else
  109585. "lsr r3, r3, #1\n\t"
  109586. #endif
  109587. #ifdef WOLFSSL_KEIL
  109588. "orrs r2, r2, r5\n\t"
  109589. #elif defined(__clang__)
  109590. "orrs r2, r5\n\t"
  109591. #else
  109592. "orr r2, r5\n\t"
  109593. #endif
  109594. "ldr r4, [%[a], #20]\n\t"
  109595. "str r2, [%[r], #12]\n\t"
  109596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109597. "lsls r5, r4, #31\n\t"
  109598. #else
  109599. "lsl r5, r4, #31\n\t"
  109600. #endif
  109601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109602. "lsrs r4, r4, #1\n\t"
  109603. #else
  109604. "lsr r4, r4, #1\n\t"
  109605. #endif
  109606. #ifdef WOLFSSL_KEIL
  109607. "orrs r3, r3, r5\n\t"
  109608. #elif defined(__clang__)
  109609. "orrs r3, r5\n\t"
  109610. #else
  109611. "orr r3, r5\n\t"
  109612. #endif
  109613. "ldr r2, [%[a], #24]\n\t"
  109614. "str r3, [%[r], #16]\n\t"
  109615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109616. "lsls r5, r2, #31\n\t"
  109617. #else
  109618. "lsl r5, r2, #31\n\t"
  109619. #endif
  109620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109621. "lsrs r2, r2, #1\n\t"
  109622. #else
  109623. "lsr r2, r2, #1\n\t"
  109624. #endif
  109625. #ifdef WOLFSSL_KEIL
  109626. "orrs r4, r4, r5\n\t"
  109627. #elif defined(__clang__)
  109628. "orrs r4, r5\n\t"
  109629. #else
  109630. "orr r4, r5\n\t"
  109631. #endif
  109632. "ldr r3, [%[a], #28]\n\t"
  109633. "str r4, [%[r], #20]\n\t"
  109634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109635. "lsls r5, r3, #31\n\t"
  109636. #else
  109637. "lsl r5, r3, #31\n\t"
  109638. #endif
  109639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109640. "lsrs r3, r3, #1\n\t"
  109641. #else
  109642. "lsr r3, r3, #1\n\t"
  109643. #endif
  109644. #ifdef WOLFSSL_KEIL
  109645. "orrs r2, r2, r5\n\t"
  109646. #elif defined(__clang__)
  109647. "orrs r2, r5\n\t"
  109648. #else
  109649. "orr r2, r5\n\t"
  109650. #endif
  109651. "ldr r4, [%[a], #32]\n\t"
  109652. "str r2, [%[r], #24]\n\t"
  109653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109654. "lsls r5, r4, #31\n\t"
  109655. #else
  109656. "lsl r5, r4, #31\n\t"
  109657. #endif
  109658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109659. "lsrs r4, r4, #1\n\t"
  109660. #else
  109661. "lsr r4, r4, #1\n\t"
  109662. #endif
  109663. #ifdef WOLFSSL_KEIL
  109664. "orrs r3, r3, r5\n\t"
  109665. #elif defined(__clang__)
  109666. "orrs r3, r5\n\t"
  109667. #else
  109668. "orr r3, r5\n\t"
  109669. #endif
  109670. "ldr r2, [%[a], #36]\n\t"
  109671. "str r3, [%[r], #28]\n\t"
  109672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109673. "lsls r5, r2, #31\n\t"
  109674. #else
  109675. "lsl r5, r2, #31\n\t"
  109676. #endif
  109677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109678. "lsrs r2, r2, #1\n\t"
  109679. #else
  109680. "lsr r2, r2, #1\n\t"
  109681. #endif
  109682. #ifdef WOLFSSL_KEIL
  109683. "orrs r4, r4, r5\n\t"
  109684. #elif defined(__clang__)
  109685. "orrs r4, r5\n\t"
  109686. #else
  109687. "orr r4, r5\n\t"
  109688. #endif
  109689. "ldr r3, [%[a], #40]\n\t"
  109690. "str r4, [%[r], #32]\n\t"
  109691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109692. "lsls r5, r3, #31\n\t"
  109693. #else
  109694. "lsl r5, r3, #31\n\t"
  109695. #endif
  109696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109697. "lsrs r3, r3, #1\n\t"
  109698. #else
  109699. "lsr r3, r3, #1\n\t"
  109700. #endif
  109701. #ifdef WOLFSSL_KEIL
  109702. "orrs r2, r2, r5\n\t"
  109703. #elif defined(__clang__)
  109704. "orrs r2, r5\n\t"
  109705. #else
  109706. "orr r2, r5\n\t"
  109707. #endif
  109708. "ldr r4, [%[a], #44]\n\t"
  109709. "str r2, [%[r], #36]\n\t"
  109710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109711. "lsls r5, r4, #31\n\t"
  109712. #else
  109713. "lsl r5, r4, #31\n\t"
  109714. #endif
  109715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  109716. "lsrs r4, r4, #1\n\t"
  109717. #else
  109718. "lsr r4, r4, #1\n\t"
  109719. #endif
  109720. #ifdef WOLFSSL_KEIL
  109721. "orrs r3, r3, r5\n\t"
  109722. #elif defined(__clang__)
  109723. "orrs r3, r5\n\t"
  109724. #else
  109725. "orr r3, r5\n\t"
  109726. #endif
  109727. "str r3, [%[r], #40]\n\t"
  109728. "str r4, [%[r], #44]\n\t"
  109729. : [r] "+l" (r), [a] "+l" (a)
  109730. :
  109731. : "memory", "r2", "r3", "r4", "r5"
  109732. );
  109733. }
  109734. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  109735. *
  109736. * r Result of division by 2.
  109737. * a Number to divide.
  109738. * m Modulus (prime).
  109739. */
  109740. SP_NOINLINE static void sp_384_div2_12(sp_digit* r, const sp_digit* a,
  109741. const sp_digit* m)
  109742. {
  109743. sp_digit o;
  109744. o = sp_384_cond_add_12(r, a, m, 0 - (a[0] & 1));
  109745. sp_384_rshift1_12(r, r);
  109746. r[11] |= o << 31;
  109747. }
  109748. /* Double the Montgomery form projective point p.
  109749. *
  109750. * r Result of doubling point.
  109751. * p Point to double.
  109752. * t Temporary ordinate data.
  109753. */
  109754. #ifdef WOLFSSL_SP_NONBLOCK
  109755. typedef struct sp_384_proj_point_dbl_12_ctx {
  109756. int state;
  109757. sp_digit* t1;
  109758. sp_digit* t2;
  109759. sp_digit* x;
  109760. sp_digit* y;
  109761. sp_digit* z;
  109762. } sp_384_proj_point_dbl_12_ctx;
  109763. 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)
  109764. {
  109765. int err = FP_WOULDBLOCK;
  109766. sp_384_proj_point_dbl_12_ctx* ctx = (sp_384_proj_point_dbl_12_ctx*)sp_ctx->data;
  109767. typedef char ctx_size_test[sizeof(sp_384_proj_point_dbl_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  109768. (void)sizeof(ctx_size_test);
  109769. switch (ctx->state) {
  109770. case 0:
  109771. ctx->t1 = t;
  109772. ctx->t2 = t + 2*12;
  109773. ctx->x = r->x;
  109774. ctx->y = r->y;
  109775. ctx->z = r->z;
  109776. /* Put infinity into result. */
  109777. if (r != p) {
  109778. r->infinity = p->infinity;
  109779. }
  109780. ctx->state = 1;
  109781. break;
  109782. case 1:
  109783. /* T1 = Z * Z */
  109784. sp_384_mont_sqr_12(ctx->t1, p->z, p384_mod, p384_mp_mod);
  109785. ctx->state = 2;
  109786. break;
  109787. case 2:
  109788. /* Z = Y * Z */
  109789. sp_384_mont_mul_12(ctx->z, p->y, p->z, p384_mod, p384_mp_mod);
  109790. ctx->state = 3;
  109791. break;
  109792. case 3:
  109793. /* Z = 2Z */
  109794. sp_384_mont_dbl_12(ctx->z, ctx->z, p384_mod);
  109795. ctx->state = 4;
  109796. break;
  109797. case 4:
  109798. /* T2 = X - T1 */
  109799. sp_384_mont_sub_12(ctx->t2, p->x, ctx->t1, p384_mod);
  109800. ctx->state = 5;
  109801. break;
  109802. case 5:
  109803. /* T1 = X + T1 */
  109804. sp_384_mont_add_12(ctx->t1, p->x, ctx->t1, p384_mod);
  109805. ctx->state = 6;
  109806. break;
  109807. case 6:
  109808. /* T2 = T1 * T2 */
  109809. sp_384_mont_mul_12(ctx->t2, ctx->t1, ctx->t2, p384_mod, p384_mp_mod);
  109810. ctx->state = 7;
  109811. break;
  109812. case 7:
  109813. /* T1 = 3T2 */
  109814. sp_384_mont_tpl_12(ctx->t1, ctx->t2, p384_mod);
  109815. ctx->state = 8;
  109816. break;
  109817. case 8:
  109818. /* Y = 2Y */
  109819. sp_384_mont_dbl_12(ctx->y, p->y, p384_mod);
  109820. ctx->state = 9;
  109821. break;
  109822. case 9:
  109823. /* Y = Y * Y */
  109824. sp_384_mont_sqr_12(ctx->y, ctx->y, p384_mod, p384_mp_mod);
  109825. ctx->state = 10;
  109826. break;
  109827. case 10:
  109828. /* T2 = Y * Y */
  109829. sp_384_mont_sqr_12(ctx->t2, ctx->y, p384_mod, p384_mp_mod);
  109830. ctx->state = 11;
  109831. break;
  109832. case 11:
  109833. /* T2 = T2/2 */
  109834. sp_384_div2_12(ctx->t2, ctx->t2, p384_mod);
  109835. ctx->state = 12;
  109836. break;
  109837. case 12:
  109838. /* Y = Y * X */
  109839. sp_384_mont_mul_12(ctx->y, ctx->y, p->x, p384_mod, p384_mp_mod);
  109840. ctx->state = 13;
  109841. break;
  109842. case 13:
  109843. /* X = T1 * T1 */
  109844. sp_384_mont_sqr_12(ctx->x, ctx->t1, p384_mod, p384_mp_mod);
  109845. ctx->state = 14;
  109846. break;
  109847. case 14:
  109848. /* X = X - Y */
  109849. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  109850. ctx->state = 15;
  109851. break;
  109852. case 15:
  109853. /* X = X - Y */
  109854. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->y, p384_mod);
  109855. ctx->state = 16;
  109856. break;
  109857. case 16:
  109858. /* Y = Y - X */
  109859. sp_384_mont_sub_lower_12(ctx->y, ctx->y, ctx->x, p384_mod);
  109860. ctx->state = 17;
  109861. break;
  109862. case 17:
  109863. /* Y = Y * T1 */
  109864. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t1, p384_mod, p384_mp_mod);
  109865. ctx->state = 18;
  109866. break;
  109867. case 18:
  109868. /* Y = Y - T2 */
  109869. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t2, p384_mod);
  109870. ctx->state = 19;
  109871. /* fall-through */
  109872. case 19:
  109873. err = MP_OKAY;
  109874. break;
  109875. }
  109876. if (err == MP_OKAY && ctx->state != 19) {
  109877. err = FP_WOULDBLOCK;
  109878. }
  109879. return err;
  109880. }
  109881. #endif /* WOLFSSL_SP_NONBLOCK */
  109882. static void sp_384_proj_point_dbl_12(sp_point_384* r, const sp_point_384* p,
  109883. sp_digit* t)
  109884. {
  109885. sp_digit* t1 = t;
  109886. sp_digit* t2 = t + 2*12;
  109887. sp_digit* x;
  109888. sp_digit* y;
  109889. sp_digit* z;
  109890. x = r->x;
  109891. y = r->y;
  109892. z = r->z;
  109893. /* Put infinity into result. */
  109894. if (r != p) {
  109895. r->infinity = p->infinity;
  109896. }
  109897. /* T1 = Z * Z */
  109898. sp_384_mont_sqr_12(t1, p->z, p384_mod, p384_mp_mod);
  109899. /* Z = Y * Z */
  109900. sp_384_mont_mul_12(z, p->y, p->z, p384_mod, p384_mp_mod);
  109901. /* Z = 2Z */
  109902. sp_384_mont_dbl_12(z, z, p384_mod);
  109903. /* T2 = X - T1 */
  109904. sp_384_mont_sub_12(t2, p->x, t1, p384_mod);
  109905. /* T1 = X + T1 */
  109906. sp_384_mont_add_12(t1, p->x, t1, p384_mod);
  109907. /* T2 = T1 * T2 */
  109908. sp_384_mont_mul_12(t2, t1, t2, p384_mod, p384_mp_mod);
  109909. /* T1 = 3T2 */
  109910. sp_384_mont_tpl_12(t1, t2, p384_mod);
  109911. /* Y = 2Y */
  109912. sp_384_mont_dbl_12(y, p->y, p384_mod);
  109913. /* Y = Y * Y */
  109914. sp_384_mont_sqr_12(y, y, p384_mod, p384_mp_mod);
  109915. /* T2 = Y * Y */
  109916. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  109917. /* T2 = T2/2 */
  109918. sp_384_div2_12(t2, t2, p384_mod);
  109919. /* Y = Y * X */
  109920. sp_384_mont_mul_12(y, y, p->x, p384_mod, p384_mp_mod);
  109921. /* X = T1 * T1 */
  109922. sp_384_mont_sqr_12(x, t1, p384_mod, p384_mp_mod);
  109923. /* X = X - Y */
  109924. sp_384_mont_sub_12(x, x, y, p384_mod);
  109925. /* X = X - Y */
  109926. sp_384_mont_sub_12(x, x, y, p384_mod);
  109927. /* Y = Y - X */
  109928. sp_384_mont_sub_lower_12(y, y, x, p384_mod);
  109929. /* Y = Y * T1 */
  109930. sp_384_mont_mul_12(y, y, t1, p384_mod, p384_mp_mod);
  109931. /* Y = Y - T2 */
  109932. sp_384_mont_sub_12(y, y, t2, p384_mod);
  109933. }
  109934. /* Compare two numbers to determine if they are equal.
  109935. * Constant time implementation.
  109936. *
  109937. * a First number to compare.
  109938. * b Second number to compare.
  109939. * returns 1 when equal and 0 otherwise.
  109940. */
  109941. static int sp_384_cmp_equal_12(const sp_digit* a, const sp_digit* b)
  109942. {
  109943. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  109944. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  109945. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  109946. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11])) == 0;
  109947. }
  109948. /* Returns 1 if the number of zero.
  109949. * Implementation is constant time.
  109950. *
  109951. * a Number to check.
  109952. * returns 1 if the number is zero and 0 otherwise.
  109953. */
  109954. static int sp_384_iszero_12(const sp_digit* a)
  109955. {
  109956. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  109957. a[8] | a[9] | a[10] | a[11]) == 0;
  109958. }
  109959. /* Add two Montgomery form projective points.
  109960. *
  109961. * r Result of addition.
  109962. * p First point to add.
  109963. * q Second point to add.
  109964. * t Temporary ordinate data.
  109965. */
  109966. #ifdef WOLFSSL_SP_NONBLOCK
  109967. typedef struct sp_384_proj_point_add_12_ctx {
  109968. int state;
  109969. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  109970. const sp_point_384* ap[2];
  109971. sp_point_384* rp[2];
  109972. sp_digit* t1;
  109973. sp_digit* t2;
  109974. sp_digit* t3;
  109975. sp_digit* t4;
  109976. sp_digit* t5;
  109977. sp_digit* t6;
  109978. sp_digit* x;
  109979. sp_digit* y;
  109980. sp_digit* z;
  109981. } sp_384_proj_point_add_12_ctx;
  109982. static int sp_384_proj_point_add_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r,
  109983. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  109984. {
  109985. int err = FP_WOULDBLOCK;
  109986. sp_384_proj_point_add_12_ctx* ctx = (sp_384_proj_point_add_12_ctx*)sp_ctx->data;
  109987. /* Ensure only the first point is the same as the result. */
  109988. if (q == r) {
  109989. const sp_point_384* a = p;
  109990. p = q;
  109991. q = a;
  109992. }
  109993. typedef char ctx_size_test[sizeof(sp_384_proj_point_add_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  109994. (void)sizeof(ctx_size_test);
  109995. switch (ctx->state) {
  109996. case 0: /* INIT */
  109997. ctx->t1 = t;
  109998. ctx->t2 = t + 2*12;
  109999. ctx->t3 = t + 4*12;
  110000. ctx->t4 = t + 6*12;
  110001. ctx->t5 = t + 8*12;
  110002. ctx->t6 = t + 10*12;
  110003. ctx->x = ctx->t6;
  110004. ctx->y = ctx->t1;
  110005. ctx->z = ctx->t2;
  110006. ctx->state = 1;
  110007. break;
  110008. case 1:
  110009. /* Check double */
  110010. (void)sp_384_sub_12(ctx->t1, p384_mod, q->y);
  110011. sp_384_norm_12(ctx->t1);
  110012. if ((~p->infinity & ~q->infinity &
  110013. sp_384_cmp_equal_12(p->x, q->x) & sp_384_cmp_equal_12(p->z, q->z) &
  110014. (sp_384_cmp_equal_12(p->y, q->y) | sp_384_cmp_equal_12(p->y, ctx->t1))) != 0)
  110015. {
  110016. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  110017. ctx->state = 2;
  110018. }
  110019. else {
  110020. ctx->state = 3;
  110021. }
  110022. break;
  110023. case 2:
  110024. err = sp_384_proj_point_dbl_12_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  110025. if (err == MP_OKAY)
  110026. ctx->state = 27; /* done */
  110027. break;
  110028. case 3:
  110029. {
  110030. ctx->state = 4;
  110031. break;
  110032. }
  110033. case 4:
  110034. /* U1 = X1*Z2^2 */
  110035. sp_384_mont_sqr_12(ctx->t1, q->z, p384_mod, p384_mp_mod);
  110036. ctx->state = 5;
  110037. break;
  110038. case 5:
  110039. sp_384_mont_mul_12(ctx->t3, ctx->t1, q->z, p384_mod, p384_mp_mod);
  110040. ctx->state = 6;
  110041. break;
  110042. case 6:
  110043. sp_384_mont_mul_12(ctx->t1, ctx->t1, p->x, p384_mod, p384_mp_mod);
  110044. ctx->state = 7;
  110045. break;
  110046. case 7:
  110047. /* U2 = X2*Z1^2 */
  110048. sp_384_mont_sqr_12(ctx->t2, p->z, p384_mod, p384_mp_mod);
  110049. ctx->state = 8;
  110050. break;
  110051. case 8:
  110052. sp_384_mont_mul_12(ctx->t4, ctx->t2, p->z, p384_mod, p384_mp_mod);
  110053. ctx->state = 9;
  110054. break;
  110055. case 9:
  110056. sp_384_mont_mul_12(ctx->t2, ctx->t2, q->x, p384_mod, p384_mp_mod);
  110057. ctx->state = 10;
  110058. break;
  110059. case 10:
  110060. /* S1 = Y1*Z2^3 */
  110061. sp_384_mont_mul_12(ctx->t3, ctx->t3, p->y, p384_mod, p384_mp_mod);
  110062. ctx->state = 11;
  110063. break;
  110064. case 11:
  110065. /* S2 = Y2*Z1^3 */
  110066. sp_384_mont_mul_12(ctx->t4, ctx->t4, q->y, p384_mod, p384_mp_mod);
  110067. ctx->state = 12;
  110068. break;
  110069. case 12:
  110070. /* H = U2 - U1 */
  110071. sp_384_mont_sub_12(ctx->t2, ctx->t2, ctx->t1, p384_mod);
  110072. ctx->state = 13;
  110073. break;
  110074. case 13:
  110075. /* R = S2 - S1 */
  110076. sp_384_mont_sub_12(ctx->t4, ctx->t4, ctx->t3, p384_mod);
  110077. ctx->state = 14;
  110078. break;
  110079. case 14:
  110080. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  110081. sp_384_mont_sqr_12(ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  110082. ctx->state = 15;
  110083. break;
  110084. case 15:
  110085. sp_384_mont_mul_12(ctx->y, ctx->t1, ctx->t5, p384_mod, p384_mp_mod);
  110086. ctx->state = 16;
  110087. break;
  110088. case 16:
  110089. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t2, p384_mod, p384_mp_mod);
  110090. ctx->state = 17;
  110091. break;
  110092. case 17:
  110093. /* Z3 = H*Z1*Z2 */
  110094. sp_384_mont_mul_12(ctx->z, p->z, ctx->t2, p384_mod, p384_mp_mod);
  110095. ctx->state = 18;
  110096. break;
  110097. case 18:
  110098. sp_384_mont_mul_12(ctx->z, ctx->z, q->z, p384_mod, p384_mp_mod);
  110099. ctx->state = 19;
  110100. break;
  110101. case 19:
  110102. sp_384_mont_sqr_12(ctx->x, ctx->t4, p384_mod, p384_mp_mod);
  110103. ctx->state = 20;
  110104. break;
  110105. case 20:
  110106. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t5, p384_mod);
  110107. ctx->state = 21;
  110108. break;
  110109. case 21:
  110110. sp_384_mont_mul_12(ctx->t5, ctx->t5, ctx->t3, p384_mod, p384_mp_mod);
  110111. ctx->state = 22;
  110112. break;
  110113. case 22:
  110114. sp_384_mont_dbl_12(ctx->t3, ctx->y, p384_mod);
  110115. ctx->state = 23;
  110116. break;
  110117. case 23:
  110118. sp_384_mont_sub_12(ctx->x, ctx->x, ctx->t3, p384_mod);
  110119. ctx->state = 24;
  110120. break;
  110121. case 24:
  110122. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  110123. sp_384_mont_sub_lower_12(ctx->y, ctx->y, ctx->x, p384_mod);
  110124. ctx->state = 25;
  110125. break;
  110126. case 25:
  110127. sp_384_mont_mul_12(ctx->y, ctx->y, ctx->t4, p384_mod, p384_mp_mod);
  110128. ctx->state = 26;
  110129. break;
  110130. case 26:
  110131. sp_384_mont_sub_12(ctx->y, ctx->y, ctx->t5, p384_mod);
  110132. ctx->state = 27;
  110133. /* fall-through */
  110134. case 27:
  110135. {
  110136. int i;
  110137. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  110138. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  110139. sp_digit maskt = ~(maskp | maskq);
  110140. for (i = 0; i < 12; i++) {
  110141. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  110142. (ctx->x[i] & maskt);
  110143. }
  110144. for (i = 0; i < 12; i++) {
  110145. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  110146. (ctx->y[i] & maskt);
  110147. }
  110148. for (i = 0; i < 12; i++) {
  110149. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  110150. (ctx->z[i] & maskt);
  110151. }
  110152. r->z[0] |= p->infinity & q->infinity;
  110153. r->infinity = p->infinity & q->infinity;
  110154. err = MP_OKAY;
  110155. break;
  110156. }
  110157. }
  110158. if (err == MP_OKAY && ctx->state != 27) {
  110159. err = FP_WOULDBLOCK;
  110160. }
  110161. return err;
  110162. }
  110163. #endif /* WOLFSSL_SP_NONBLOCK */
  110164. static void sp_384_proj_point_add_12(sp_point_384* r,
  110165. const sp_point_384* p, const sp_point_384* q, sp_digit* t)
  110166. {
  110167. sp_digit* t1 = t;
  110168. sp_digit* t2 = t + 2*12;
  110169. sp_digit* t3 = t + 4*12;
  110170. sp_digit* t4 = t + 6*12;
  110171. sp_digit* t5 = t + 8*12;
  110172. sp_digit* t6 = t + 10*12;
  110173. /* Check double */
  110174. (void)sp_384_sub_12(t1, p384_mod, q->y);
  110175. sp_384_norm_12(t1);
  110176. if ((~p->infinity & ~q->infinity &
  110177. sp_384_cmp_equal_12(p->x, q->x) & sp_384_cmp_equal_12(p->z, q->z) &
  110178. (sp_384_cmp_equal_12(p->y, q->y) | sp_384_cmp_equal_12(p->y, t1))) != 0) {
  110179. sp_384_proj_point_dbl_12(r, p, t);
  110180. }
  110181. else {
  110182. sp_digit maskp;
  110183. sp_digit maskq;
  110184. sp_digit maskt;
  110185. sp_digit* x = t6;
  110186. sp_digit* y = t1;
  110187. sp_digit* z = t2;
  110188. int i;
  110189. maskp = 0 - (q->infinity & (!p->infinity));
  110190. maskq = 0 - (p->infinity & (!q->infinity));
  110191. maskt = ~(maskp | maskq);
  110192. /* U1 = X1*Z2^2 */
  110193. sp_384_mont_sqr_12(t1, q->z, p384_mod, p384_mp_mod);
  110194. sp_384_mont_mul_12(t3, t1, q->z, p384_mod, p384_mp_mod);
  110195. sp_384_mont_mul_12(t1, t1, p->x, p384_mod, p384_mp_mod);
  110196. /* U2 = X2*Z1^2 */
  110197. sp_384_mont_sqr_12(t2, p->z, p384_mod, p384_mp_mod);
  110198. sp_384_mont_mul_12(t4, t2, p->z, p384_mod, p384_mp_mod);
  110199. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  110200. /* S1 = Y1*Z2^3 */
  110201. sp_384_mont_mul_12(t3, t3, p->y, p384_mod, p384_mp_mod);
  110202. /* S2 = Y2*Z1^3 */
  110203. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  110204. /* H = U2 - U1 */
  110205. sp_384_mont_sub_12(t2, t2, t1, p384_mod);
  110206. /* R = S2 - S1 */
  110207. sp_384_mont_sub_12(t4, t4, t3, p384_mod);
  110208. if (~p->infinity & ~q->infinity &
  110209. sp_384_iszero_12(t2) & sp_384_iszero_12(t4) & maskt) {
  110210. sp_384_proj_point_dbl_12(r, p, t);
  110211. }
  110212. else {
  110213. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  110214. sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod);
  110215. sp_384_mont_mul_12(y, t1, t5, p384_mod, p384_mp_mod);
  110216. sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod);
  110217. /* Z3 = H*Z1*Z2 */
  110218. sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod);
  110219. sp_384_mont_mul_12(z, z, q->z, p384_mod, p384_mp_mod);
  110220. sp_384_mont_sqr_12(x, t4, p384_mod, p384_mp_mod);
  110221. sp_384_mont_sub_12(x, x, t5, p384_mod);
  110222. sp_384_mont_mul_12(t5, t5, t3, p384_mod, p384_mp_mod);
  110223. sp_384_mont_dbl_12(t3, y, p384_mod);
  110224. sp_384_mont_sub_12(x, x, t3, p384_mod);
  110225. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  110226. sp_384_mont_sub_lower_12(y, y, x, p384_mod);
  110227. sp_384_mont_mul_12(y, y, t4, p384_mod, p384_mp_mod);
  110228. sp_384_mont_sub_12(y, y, t5, p384_mod);
  110229. for (i = 0; i < 12; i++) {
  110230. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  110231. (x[i] & maskt);
  110232. }
  110233. for (i = 0; i < 12; i++) {
  110234. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  110235. (y[i] & maskt);
  110236. }
  110237. for (i = 0; i < 12; i++) {
  110238. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  110239. (z[i] & maskt);
  110240. }
  110241. r->z[0] |= p->infinity & q->infinity;
  110242. r->infinity = p->infinity & q->infinity;
  110243. }
  110244. }
  110245. }
  110246. #ifndef WC_NO_CACHE_RESISTANT
  110247. /* Touch each possible point that could be being copied.
  110248. *
  110249. * r Point to copy into.
  110250. * table Table - start of the entires to access
  110251. * idx Index of entry to retrieve.
  110252. */
  110253. static void sp_384_get_point_16_12(sp_point_384* r, const sp_point_384* table,
  110254. int idx)
  110255. {
  110256. int i;
  110257. sp_digit mask;
  110258. r->x[0] = 0;
  110259. r->x[1] = 0;
  110260. r->x[2] = 0;
  110261. r->x[3] = 0;
  110262. r->x[4] = 0;
  110263. r->x[5] = 0;
  110264. r->x[6] = 0;
  110265. r->x[7] = 0;
  110266. r->x[8] = 0;
  110267. r->x[9] = 0;
  110268. r->x[10] = 0;
  110269. r->x[11] = 0;
  110270. r->y[0] = 0;
  110271. r->y[1] = 0;
  110272. r->y[2] = 0;
  110273. r->y[3] = 0;
  110274. r->y[4] = 0;
  110275. r->y[5] = 0;
  110276. r->y[6] = 0;
  110277. r->y[7] = 0;
  110278. r->y[8] = 0;
  110279. r->y[9] = 0;
  110280. r->y[10] = 0;
  110281. r->y[11] = 0;
  110282. r->z[0] = 0;
  110283. r->z[1] = 0;
  110284. r->z[2] = 0;
  110285. r->z[3] = 0;
  110286. r->z[4] = 0;
  110287. r->z[5] = 0;
  110288. r->z[6] = 0;
  110289. r->z[7] = 0;
  110290. r->z[8] = 0;
  110291. r->z[9] = 0;
  110292. r->z[10] = 0;
  110293. r->z[11] = 0;
  110294. for (i = 1; i < 16; i++) {
  110295. mask = 0 - (i == idx);
  110296. r->x[0] |= mask & table[i].x[0];
  110297. r->x[1] |= mask & table[i].x[1];
  110298. r->x[2] |= mask & table[i].x[2];
  110299. r->x[3] |= mask & table[i].x[3];
  110300. r->x[4] |= mask & table[i].x[4];
  110301. r->x[5] |= mask & table[i].x[5];
  110302. r->x[6] |= mask & table[i].x[6];
  110303. r->x[7] |= mask & table[i].x[7];
  110304. r->x[8] |= mask & table[i].x[8];
  110305. r->x[9] |= mask & table[i].x[9];
  110306. r->x[10] |= mask & table[i].x[10];
  110307. r->x[11] |= mask & table[i].x[11];
  110308. r->y[0] |= mask & table[i].y[0];
  110309. r->y[1] |= mask & table[i].y[1];
  110310. r->y[2] |= mask & table[i].y[2];
  110311. r->y[3] |= mask & table[i].y[3];
  110312. r->y[4] |= mask & table[i].y[4];
  110313. r->y[5] |= mask & table[i].y[5];
  110314. r->y[6] |= mask & table[i].y[6];
  110315. r->y[7] |= mask & table[i].y[7];
  110316. r->y[8] |= mask & table[i].y[8];
  110317. r->y[9] |= mask & table[i].y[9];
  110318. r->y[10] |= mask & table[i].y[10];
  110319. r->y[11] |= mask & table[i].y[11];
  110320. r->z[0] |= mask & table[i].z[0];
  110321. r->z[1] |= mask & table[i].z[1];
  110322. r->z[2] |= mask & table[i].z[2];
  110323. r->z[3] |= mask & table[i].z[3];
  110324. r->z[4] |= mask & table[i].z[4];
  110325. r->z[5] |= mask & table[i].z[5];
  110326. r->z[6] |= mask & table[i].z[6];
  110327. r->z[7] |= mask & table[i].z[7];
  110328. r->z[8] |= mask & table[i].z[8];
  110329. r->z[9] |= mask & table[i].z[9];
  110330. r->z[10] |= mask & table[i].z[10];
  110331. r->z[11] |= mask & table[i].z[11];
  110332. }
  110333. }
  110334. #endif /* !WC_NO_CACHE_RESISTANT */
  110335. /* Multiply the point by the scalar and return the result.
  110336. * If map is true then convert result to affine coordinates.
  110337. *
  110338. * Fast implementation that generates a pre-computation table.
  110339. * 4 bits of window (no sliding!).
  110340. * Uses add and double for calculating table.
  110341. * 384 doubles.
  110342. * 108 adds.
  110343. *
  110344. * r Resulting point.
  110345. * g Point to multiply.
  110346. * k Scalar to multiply by.
  110347. * map Indicates whether to convert result to affine.
  110348. * ct Constant time required.
  110349. * heap Heap to use for allocation.
  110350. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  110351. */
  110352. static int sp_384_ecc_mulmod_fast_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  110353. int map, int ct, void* heap)
  110354. {
  110355. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110356. sp_point_384* t = NULL;
  110357. sp_digit* tmp = NULL;
  110358. #else
  110359. sp_point_384 t[16 + 1];
  110360. sp_digit tmp[2 * 12 * 6];
  110361. #endif
  110362. sp_point_384* rt = NULL;
  110363. #ifndef WC_NO_CACHE_RESISTANT
  110364. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110365. sp_point_384* p = NULL;
  110366. #else
  110367. sp_point_384 p[1];
  110368. #endif
  110369. #endif /* !WC_NO_CACHE_RESISTANT */
  110370. sp_digit n;
  110371. int i;
  110372. int c;
  110373. int y;
  110374. int err = MP_OKAY;
  110375. /* Constant time used for cache attack resistance implementation. */
  110376. (void)ct;
  110377. (void)heap;
  110378. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110379. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * (16 + 1),
  110380. heap, DYNAMIC_TYPE_ECC);
  110381. if (t == NULL)
  110382. err = MEMORY_E;
  110383. #ifndef WC_NO_CACHE_RESISTANT
  110384. if (err == MP_OKAY) {
  110385. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384),
  110386. heap, DYNAMIC_TYPE_ECC);
  110387. if (p == NULL)
  110388. err = MEMORY_E;
  110389. }
  110390. #endif
  110391. if (err == MP_OKAY) {
  110392. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  110393. DYNAMIC_TYPE_ECC);
  110394. if (tmp == NULL)
  110395. err = MEMORY_E;
  110396. }
  110397. #endif
  110398. if (err == MP_OKAY) {
  110399. rt = t + 16;
  110400. /* t[0] = {0, 0, 1} * norm */
  110401. XMEMSET(&t[0], 0, sizeof(t[0]));
  110402. t[0].infinity = 1;
  110403. /* t[1] = {g->x, g->y, g->z} * norm */
  110404. (void)sp_384_mod_mul_norm_12(t[1].x, g->x, p384_mod);
  110405. (void)sp_384_mod_mul_norm_12(t[1].y, g->y, p384_mod);
  110406. (void)sp_384_mod_mul_norm_12(t[1].z, g->z, p384_mod);
  110407. t[1].infinity = 0;
  110408. sp_384_proj_point_dbl_12(&t[ 2], &t[ 1], tmp);
  110409. t[ 2].infinity = 0;
  110410. sp_384_proj_point_add_12(&t[ 3], &t[ 2], &t[ 1], tmp);
  110411. t[ 3].infinity = 0;
  110412. sp_384_proj_point_dbl_12(&t[ 4], &t[ 2], tmp);
  110413. t[ 4].infinity = 0;
  110414. sp_384_proj_point_add_12(&t[ 5], &t[ 3], &t[ 2], tmp);
  110415. t[ 5].infinity = 0;
  110416. sp_384_proj_point_dbl_12(&t[ 6], &t[ 3], tmp);
  110417. t[ 6].infinity = 0;
  110418. sp_384_proj_point_add_12(&t[ 7], &t[ 4], &t[ 3], tmp);
  110419. t[ 7].infinity = 0;
  110420. sp_384_proj_point_dbl_12(&t[ 8], &t[ 4], tmp);
  110421. t[ 8].infinity = 0;
  110422. sp_384_proj_point_add_12(&t[ 9], &t[ 5], &t[ 4], tmp);
  110423. t[ 9].infinity = 0;
  110424. sp_384_proj_point_dbl_12(&t[10], &t[ 5], tmp);
  110425. t[10].infinity = 0;
  110426. sp_384_proj_point_add_12(&t[11], &t[ 6], &t[ 5], tmp);
  110427. t[11].infinity = 0;
  110428. sp_384_proj_point_dbl_12(&t[12], &t[ 6], tmp);
  110429. t[12].infinity = 0;
  110430. sp_384_proj_point_add_12(&t[13], &t[ 7], &t[ 6], tmp);
  110431. t[13].infinity = 0;
  110432. sp_384_proj_point_dbl_12(&t[14], &t[ 7], tmp);
  110433. t[14].infinity = 0;
  110434. sp_384_proj_point_add_12(&t[15], &t[ 8], &t[ 7], tmp);
  110435. t[15].infinity = 0;
  110436. i = 10;
  110437. n = k[i+1] << 0;
  110438. c = 28;
  110439. y = (int)(n >> 28);
  110440. #ifndef WC_NO_CACHE_RESISTANT
  110441. if (ct) {
  110442. sp_384_get_point_16_12(rt, t, y);
  110443. rt->infinity = !y;
  110444. }
  110445. else
  110446. #endif
  110447. {
  110448. XMEMCPY(rt, &t[y], sizeof(sp_point_384));
  110449. }
  110450. n <<= 4;
  110451. for (; i>=0 || c>=4; ) {
  110452. if (c < 4) {
  110453. n |= k[i--];
  110454. c += 32;
  110455. }
  110456. y = (n >> 28) & 0xf;
  110457. n <<= 4;
  110458. c -= 4;
  110459. sp_384_proj_point_dbl_12(rt, rt, tmp);
  110460. sp_384_proj_point_dbl_12(rt, rt, tmp);
  110461. sp_384_proj_point_dbl_12(rt, rt, tmp);
  110462. sp_384_proj_point_dbl_12(rt, rt, tmp);
  110463. #ifndef WC_NO_CACHE_RESISTANT
  110464. if (ct) {
  110465. sp_384_get_point_16_12(p, t, y);
  110466. p->infinity = !y;
  110467. sp_384_proj_point_add_12(rt, rt, p, tmp);
  110468. }
  110469. else
  110470. #endif
  110471. {
  110472. sp_384_proj_point_add_12(rt, rt, &t[y], tmp);
  110473. }
  110474. }
  110475. if (map != 0) {
  110476. sp_384_map_12(r, rt, tmp);
  110477. }
  110478. else {
  110479. XMEMCPY(r, rt, sizeof(sp_point_384));
  110480. }
  110481. }
  110482. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110483. if (tmp != NULL)
  110484. #endif
  110485. {
  110486. ForceZero(tmp, sizeof(sp_digit) * 2 * 12 * 6);
  110487. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110488. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  110489. #endif
  110490. }
  110491. #ifndef WC_NO_CACHE_RESISTANT
  110492. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110493. if (p != NULL)
  110494. #endif
  110495. {
  110496. ForceZero(p, sizeof(sp_point_384));
  110497. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110498. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  110499. #endif
  110500. }
  110501. #endif /* !WC_NO_CACHE_RESISTANT */
  110502. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110503. if (t != NULL)
  110504. #endif
  110505. {
  110506. ForceZero(t, sizeof(sp_point_384) * 17);
  110507. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110508. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  110509. #endif
  110510. }
  110511. return err;
  110512. }
  110513. #ifdef FP_ECC
  110514. #define sp_384_mont_dbl_lower_12 sp_384_mont_dbl_12
  110515. #define sp_384_mont_tpl_lower_12 sp_384_mont_tpl_12
  110516. /* Double the Montgomery form projective point p a number of times.
  110517. *
  110518. * r Result of repeated doubling of point.
  110519. * p Point to double.
  110520. * n Number of times to double
  110521. * t Temporary ordinate data.
  110522. */
  110523. static void sp_384_proj_point_dbl_n_12(sp_point_384* p, int i,
  110524. sp_digit* t)
  110525. {
  110526. sp_digit* w = t;
  110527. sp_digit* a = t + 2*12;
  110528. sp_digit* b = t + 4*12;
  110529. sp_digit* t1 = t + 6*12;
  110530. sp_digit* t2 = t + 8*12;
  110531. sp_digit* x;
  110532. sp_digit* y;
  110533. sp_digit* z;
  110534. volatile int n = i;
  110535. x = p->x;
  110536. y = p->y;
  110537. z = p->z;
  110538. /* Y = 2*Y */
  110539. sp_384_mont_dbl_12(y, y, p384_mod);
  110540. /* W = Z^4 */
  110541. sp_384_mont_sqr_12(w, z, p384_mod, p384_mp_mod);
  110542. sp_384_mont_sqr_12(w, w, p384_mod, p384_mp_mod);
  110543. #ifndef WOLFSSL_SP_SMALL
  110544. while (--n > 0)
  110545. #else
  110546. while (--n >= 0)
  110547. #endif
  110548. {
  110549. /* A = 3*(X^2 - W) */
  110550. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  110551. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  110552. sp_384_mont_tpl_lower_12(a, t1, p384_mod);
  110553. /* B = X*Y^2 */
  110554. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  110555. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  110556. /* X = A^2 - 2B */
  110557. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  110558. sp_384_mont_dbl_12(t2, b, p384_mod);
  110559. sp_384_mont_sub_12(x, x, t2, p384_mod);
  110560. /* b = 2.(B - X) */
  110561. sp_384_mont_sub_lower_12(t2, b, x, p384_mod);
  110562. sp_384_mont_dbl_lower_12(b, t2, p384_mod);
  110563. /* Z = Z*Y */
  110564. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  110565. /* t1 = Y^4 */
  110566. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  110567. #ifdef WOLFSSL_SP_SMALL
  110568. if (n != 0)
  110569. #endif
  110570. {
  110571. /* W = W*Y^4 */
  110572. sp_384_mont_mul_12(w, w, t1, p384_mod, p384_mp_mod);
  110573. }
  110574. /* y = 2*A*(B - X) - Y^4 */
  110575. sp_384_mont_mul_12(y, b, a, p384_mod, p384_mp_mod);
  110576. sp_384_mont_sub_12(y, y, t1, p384_mod);
  110577. }
  110578. #ifndef WOLFSSL_SP_SMALL
  110579. /* A = 3*(X^2 - W) */
  110580. sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod);
  110581. sp_384_mont_sub_12(t1, t1, w, p384_mod);
  110582. sp_384_mont_tpl_lower_12(a, t1, p384_mod);
  110583. /* B = X*Y^2 */
  110584. sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod);
  110585. sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod);
  110586. /* X = A^2 - 2B */
  110587. sp_384_mont_sqr_12(x, a, p384_mod, p384_mp_mod);
  110588. sp_384_mont_dbl_12(t2, b, p384_mod);
  110589. sp_384_mont_sub_12(x, x, t2, p384_mod);
  110590. /* b = 2.(B - X) */
  110591. sp_384_mont_sub_lower_12(t2, b, x, p384_mod);
  110592. sp_384_mont_dbl_lower_12(b, t2, p384_mod);
  110593. /* Z = Z*Y */
  110594. sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod);
  110595. /* t1 = Y^4 */
  110596. sp_384_mont_sqr_12(t1, t1, p384_mod, p384_mp_mod);
  110597. /* y = 2*A*(B - X) - Y^4 */
  110598. sp_384_mont_mul_12(y, b, a, p384_mod, p384_mp_mod);
  110599. sp_384_mont_sub_12(y, y, t1, p384_mod);
  110600. #endif
  110601. /* Y = Y/2 */
  110602. sp_384_div2_12(y, y, p384_mod);
  110603. }
  110604. /* Convert the projective point to affine.
  110605. * Ordinates are in Montgomery form.
  110606. *
  110607. * a Point to convert.
  110608. * t Temporary data.
  110609. */
  110610. static void sp_384_proj_to_affine_12(sp_point_384* a, sp_digit* t)
  110611. {
  110612. sp_digit* t1 = t;
  110613. sp_digit* t2 = t + 2 * 12;
  110614. sp_digit* tmp = t + 4 * 12;
  110615. sp_384_mont_inv_12(t1, a->z, tmp);
  110616. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  110617. sp_384_mont_mul_12(t1, t2, t1, p384_mod, p384_mp_mod);
  110618. sp_384_mont_mul_12(a->x, a->x, t2, p384_mod, p384_mp_mod);
  110619. sp_384_mont_mul_12(a->y, a->y, t1, p384_mod, p384_mp_mod);
  110620. XMEMCPY(a->z, p384_norm_mod, sizeof(p384_norm_mod));
  110621. }
  110622. #endif /* FP_ECC */
  110623. /* A table entry for pre-computed points. */
  110624. typedef struct sp_table_entry_384 {
  110625. sp_digit x[12];
  110626. sp_digit y[12];
  110627. } sp_table_entry_384;
  110628. #ifdef FP_ECC
  110629. #endif /* FP_ECC */
  110630. /* Add two Montgomery form projective points. The second point has a q value of
  110631. * one.
  110632. * Only the first point can be the same pointer as the result point.
  110633. *
  110634. * r Result of addition.
  110635. * p First point to add.
  110636. * q Second point to add.
  110637. * t Temporary ordinate data.
  110638. */
  110639. static void sp_384_proj_point_add_qz1_12(sp_point_384* r, const sp_point_384* p,
  110640. const sp_point_384* q, sp_digit* t)
  110641. {
  110642. sp_digit* t1 = t;
  110643. sp_digit* t2 = t + 2*12;
  110644. sp_digit* t3 = t + 4*12;
  110645. sp_digit* t4 = t + 6*12;
  110646. sp_digit* t5 = t + 8*12;
  110647. sp_digit* t6 = t + 10*12;
  110648. /* Check double */
  110649. (void)sp_384_sub_12(t1, p384_mod, q->y);
  110650. sp_384_norm_12(t1);
  110651. if ((~p->infinity & ~q->infinity &
  110652. sp_384_cmp_equal_12(p->x, q->x) & sp_384_cmp_equal_12(p->z, q->z) &
  110653. (sp_384_cmp_equal_12(p->y, q->y) | sp_384_cmp_equal_12(p->y, t1))) != 0) {
  110654. sp_384_proj_point_dbl_12(r, p, t);
  110655. }
  110656. else {
  110657. sp_digit maskp;
  110658. sp_digit maskq;
  110659. sp_digit maskt;
  110660. sp_digit* x = t2;
  110661. sp_digit* y = t5;
  110662. sp_digit* z = t6;
  110663. int i;
  110664. /* U2 = X2*Z1^2 */
  110665. sp_384_mont_sqr_12(t2, p->z, p384_mod, p384_mp_mod);
  110666. sp_384_mont_mul_12(t4, t2, p->z, p384_mod, p384_mp_mod);
  110667. sp_384_mont_mul_12(t2, t2, q->x, p384_mod, p384_mp_mod);
  110668. /* S2 = Y2*Z1^3 */
  110669. sp_384_mont_mul_12(t4, t4, q->y, p384_mod, p384_mp_mod);
  110670. /* H = U2 - X1 */
  110671. sp_384_mont_sub_12(t2, t2, p->x, p384_mod);
  110672. /* R = S2 - Y1 */
  110673. sp_384_mont_sub_12(t4, t4, p->y, p384_mod);
  110674. /* Z3 = H*Z1 */
  110675. sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod);
  110676. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  110677. sp_384_mont_sqr_12(t1, t4, p384_mod, p384_mp_mod);
  110678. sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod);
  110679. sp_384_mont_mul_12(t3, p->x, t5, p384_mod, p384_mp_mod);
  110680. sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod);
  110681. sp_384_mont_sub_12(x, t1, t5, p384_mod);
  110682. sp_384_mont_dbl_12(t1, t3, p384_mod);
  110683. sp_384_mont_sub_12(x, x, t1, p384_mod);
  110684. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  110685. sp_384_mont_sub_lower_12(t3, t3, x, p384_mod);
  110686. sp_384_mont_mul_12(t3, t3, t4, p384_mod, p384_mp_mod);
  110687. sp_384_mont_mul_12(t5, t5, p->y, p384_mod, p384_mp_mod);
  110688. sp_384_mont_sub_12(y, t3, t5, p384_mod);
  110689. maskp = 0 - (q->infinity & (!p->infinity));
  110690. maskq = 0 - (p->infinity & (!q->infinity));
  110691. maskt = ~(maskp | maskq);
  110692. for (i = 0; i < 12; i++) {
  110693. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt);
  110694. }
  110695. for (i = 0; i < 12; i++) {
  110696. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt);
  110697. }
  110698. for (i = 0; i < 12; i++) {
  110699. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt);
  110700. }
  110701. r->z[0] |= p->infinity & q->infinity;
  110702. r->infinity = p->infinity & q->infinity;
  110703. }
  110704. }
  110705. #ifdef WOLFSSL_SP_SMALL
  110706. #ifdef FP_ECC
  110707. /* Generate the pre-computed table of points for the base point.
  110708. *
  110709. * width = 4
  110710. * 16 entries
  110711. * 96 bits between
  110712. *
  110713. * a The base point.
  110714. * table Place to store generated point data.
  110715. * tmp Temporary data.
  110716. * heap Heap to use for allocation.
  110717. */
  110718. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  110719. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  110720. {
  110721. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110722. sp_point_384* t = NULL;
  110723. #else
  110724. sp_point_384 t[3];
  110725. #endif
  110726. sp_point_384* s1 = NULL;
  110727. sp_point_384* s2 = NULL;
  110728. int i;
  110729. int j;
  110730. int err = MP_OKAY;
  110731. (void)heap;
  110732. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110733. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  110734. DYNAMIC_TYPE_ECC);
  110735. if (t == NULL)
  110736. err = MEMORY_E;
  110737. #endif
  110738. if (err == MP_OKAY) {
  110739. s1 = t + 1;
  110740. s2 = t + 2;
  110741. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  110742. }
  110743. if (err == MP_OKAY) {
  110744. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  110745. }
  110746. if (err == MP_OKAY) {
  110747. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  110748. }
  110749. if (err == MP_OKAY) {
  110750. t->infinity = 0;
  110751. sp_384_proj_to_affine_12(t, tmp);
  110752. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  110753. s1->infinity = 0;
  110754. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  110755. s2->infinity = 0;
  110756. /* table[0] = {0, 0, infinity} */
  110757. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  110758. /* table[1] = Affine version of 'a' in Montgomery form */
  110759. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  110760. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  110761. for (i=1; i<4; i++) {
  110762. sp_384_proj_point_dbl_n_12(t, 96, tmp);
  110763. sp_384_proj_to_affine_12(t, tmp);
  110764. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  110765. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  110766. }
  110767. for (i=1; i<4; i++) {
  110768. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  110769. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  110770. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  110771. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  110772. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  110773. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  110774. sp_384_proj_to_affine_12(t, tmp);
  110775. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  110776. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  110777. }
  110778. }
  110779. }
  110780. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110781. if (t != NULL)
  110782. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  110783. #endif
  110784. return err;
  110785. }
  110786. #endif /* FP_ECC */
  110787. #ifndef WC_NO_CACHE_RESISTANT
  110788. /* Touch each possible entry that could be being copied.
  110789. *
  110790. * r Point to copy into.
  110791. * table Table - start of the entires to access
  110792. * idx Index of entry to retrieve.
  110793. */
  110794. static void sp_384_get_entry_16_12(sp_point_384* r,
  110795. const sp_table_entry_384* table, int idx)
  110796. {
  110797. int i;
  110798. sp_digit mask;
  110799. r->x[0] = 0;
  110800. r->x[1] = 0;
  110801. r->x[2] = 0;
  110802. r->x[3] = 0;
  110803. r->x[4] = 0;
  110804. r->x[5] = 0;
  110805. r->x[6] = 0;
  110806. r->x[7] = 0;
  110807. r->x[8] = 0;
  110808. r->x[9] = 0;
  110809. r->x[10] = 0;
  110810. r->x[11] = 0;
  110811. r->y[0] = 0;
  110812. r->y[1] = 0;
  110813. r->y[2] = 0;
  110814. r->y[3] = 0;
  110815. r->y[4] = 0;
  110816. r->y[5] = 0;
  110817. r->y[6] = 0;
  110818. r->y[7] = 0;
  110819. r->y[8] = 0;
  110820. r->y[9] = 0;
  110821. r->y[10] = 0;
  110822. r->y[11] = 0;
  110823. for (i = 1; i < 16; i++) {
  110824. mask = 0 - (i == idx);
  110825. r->x[0] |= mask & table[i].x[0];
  110826. r->x[1] |= mask & table[i].x[1];
  110827. r->x[2] |= mask & table[i].x[2];
  110828. r->x[3] |= mask & table[i].x[3];
  110829. r->x[4] |= mask & table[i].x[4];
  110830. r->x[5] |= mask & table[i].x[5];
  110831. r->x[6] |= mask & table[i].x[6];
  110832. r->x[7] |= mask & table[i].x[7];
  110833. r->x[8] |= mask & table[i].x[8];
  110834. r->x[9] |= mask & table[i].x[9];
  110835. r->x[10] |= mask & table[i].x[10];
  110836. r->x[11] |= mask & table[i].x[11];
  110837. r->y[0] |= mask & table[i].y[0];
  110838. r->y[1] |= mask & table[i].y[1];
  110839. r->y[2] |= mask & table[i].y[2];
  110840. r->y[3] |= mask & table[i].y[3];
  110841. r->y[4] |= mask & table[i].y[4];
  110842. r->y[5] |= mask & table[i].y[5];
  110843. r->y[6] |= mask & table[i].y[6];
  110844. r->y[7] |= mask & table[i].y[7];
  110845. r->y[8] |= mask & table[i].y[8];
  110846. r->y[9] |= mask & table[i].y[9];
  110847. r->y[10] |= mask & table[i].y[10];
  110848. r->y[11] |= mask & table[i].y[11];
  110849. }
  110850. }
  110851. #endif /* !WC_NO_CACHE_RESISTANT */
  110852. /* Multiply the point by the scalar and return the result.
  110853. * If map is true then convert result to affine coordinates.
  110854. *
  110855. * Stripe implementation.
  110856. * Pre-generated: 2^0, 2^96, ...
  110857. * Pre-generated: products of all combinations of above.
  110858. * 4 doubles and adds (with qz=1)
  110859. *
  110860. * r Resulting point.
  110861. * k Scalar to multiply by.
  110862. * table Pre-computed table.
  110863. * map Indicates whether to convert result to affine.
  110864. * ct Constant time required.
  110865. * heap Heap to use for allocation.
  110866. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  110867. */
  110868. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  110869. const sp_table_entry_384* table, const sp_digit* k, int map,
  110870. int ct, void* heap)
  110871. {
  110872. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110873. sp_point_384* rt = NULL;
  110874. sp_digit* t = NULL;
  110875. #else
  110876. sp_point_384 rt[2];
  110877. sp_digit t[2 * 12 * 6];
  110878. #endif
  110879. sp_point_384* p = NULL;
  110880. int i;
  110881. int j;
  110882. int y;
  110883. int x;
  110884. int err = MP_OKAY;
  110885. (void)g;
  110886. /* Constant time used for cache attack resistance implementation. */
  110887. (void)ct;
  110888. (void)heap;
  110889. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110890. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  110891. DYNAMIC_TYPE_ECC);
  110892. if (rt == NULL)
  110893. err = MEMORY_E;
  110894. if (err == MP_OKAY) {
  110895. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  110896. DYNAMIC_TYPE_ECC);
  110897. if (t == NULL)
  110898. err = MEMORY_E;
  110899. }
  110900. #endif
  110901. if (err == MP_OKAY) {
  110902. p = rt + 1;
  110903. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  110904. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  110905. y = 0;
  110906. x = 95;
  110907. for (j=0; j<4; j++) {
  110908. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  110909. x += 96;
  110910. }
  110911. #ifndef WC_NO_CACHE_RESISTANT
  110912. if (ct) {
  110913. sp_384_get_entry_16_12(rt, table, y);
  110914. } else
  110915. #endif
  110916. {
  110917. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  110918. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  110919. }
  110920. rt->infinity = !y;
  110921. for (i=94; i>=0; i--) {
  110922. y = 0;
  110923. x = i;
  110924. for (j=0; j<4; j++) {
  110925. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  110926. x += 96;
  110927. }
  110928. sp_384_proj_point_dbl_12(rt, rt, t);
  110929. #ifndef WC_NO_CACHE_RESISTANT
  110930. if (ct) {
  110931. sp_384_get_entry_16_12(p, table, y);
  110932. }
  110933. else
  110934. #endif
  110935. {
  110936. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  110937. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  110938. }
  110939. p->infinity = !y;
  110940. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  110941. }
  110942. if (map != 0) {
  110943. sp_384_map_12(r, rt, t);
  110944. }
  110945. else {
  110946. XMEMCPY(r, rt, sizeof(sp_point_384));
  110947. }
  110948. }
  110949. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  110950. if (t != NULL)
  110951. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  110952. if (rt != NULL)
  110953. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  110954. #endif
  110955. return err;
  110956. }
  110957. #ifdef FP_ECC
  110958. #ifndef FP_ENTRIES
  110959. #define FP_ENTRIES 16
  110960. #endif
  110961. /* Cache entry - holds precomputation tables for a point. */
  110962. typedef struct sp_cache_384_t {
  110963. /* X ordinate of point that table was generated from. */
  110964. sp_digit x[12];
  110965. /* Y ordinate of point that table was generated from. */
  110966. sp_digit y[12];
  110967. /* Precomputation table for point. */
  110968. sp_table_entry_384 table[16];
  110969. /* Count of entries in table. */
  110970. uint32_t cnt;
  110971. /* Point and table set in entry. */
  110972. int set;
  110973. } sp_cache_384_t;
  110974. /* Cache of tables. */
  110975. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  110976. /* Index of last entry in cache. */
  110977. static THREAD_LS_T int sp_cache_384_last = -1;
  110978. /* Cache has been initialized. */
  110979. static THREAD_LS_T int sp_cache_384_inited = 0;
  110980. #ifndef HAVE_THREAD_LS
  110981. static volatile int initCacheMutex_384 = 0;
  110982. static wolfSSL_Mutex sp_cache_384_lock;
  110983. #endif
  110984. /* Get the cache entry for the point.
  110985. *
  110986. * g [in] Point scalar multipling.
  110987. * cache [out] Cache table to use.
  110988. */
  110989. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  110990. {
  110991. int i;
  110992. int j;
  110993. uint32_t least;
  110994. if (sp_cache_384_inited == 0) {
  110995. for (i=0; i<FP_ENTRIES; i++) {
  110996. sp_cache_384[i].set = 0;
  110997. }
  110998. sp_cache_384_inited = 1;
  110999. }
  111000. /* Compare point with those in cache. */
  111001. for (i=0; i<FP_ENTRIES; i++) {
  111002. if (!sp_cache_384[i].set)
  111003. continue;
  111004. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  111005. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  111006. sp_cache_384[i].cnt++;
  111007. break;
  111008. }
  111009. }
  111010. /* No match. */
  111011. if (i == FP_ENTRIES) {
  111012. /* Find empty entry. */
  111013. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  111014. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  111015. if (!sp_cache_384[i].set) {
  111016. break;
  111017. }
  111018. }
  111019. /* Evict least used. */
  111020. if (i == sp_cache_384_last) {
  111021. least = sp_cache_384[0].cnt;
  111022. for (j=1; j<FP_ENTRIES; j++) {
  111023. if (sp_cache_384[j].cnt < least) {
  111024. i = j;
  111025. least = sp_cache_384[i].cnt;
  111026. }
  111027. }
  111028. }
  111029. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  111030. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  111031. sp_cache_384[i].set = 1;
  111032. sp_cache_384[i].cnt = 1;
  111033. }
  111034. *cache = &sp_cache_384[i];
  111035. sp_cache_384_last = i;
  111036. }
  111037. #endif /* FP_ECC */
  111038. /* Multiply the base point of P384 by the scalar and return the result.
  111039. * If map is true then convert result to affine coordinates.
  111040. *
  111041. * r Resulting point.
  111042. * g Point to multiply.
  111043. * k Scalar to multiply by.
  111044. * map Indicates whether to convert result to affine.
  111045. * ct Constant time required.
  111046. * heap Heap to use for allocation.
  111047. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111048. */
  111049. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  111050. int map, int ct, void* heap)
  111051. {
  111052. #ifndef FP_ECC
  111053. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  111054. #else
  111055. sp_digit tmp[2 * 12 * 7];
  111056. sp_cache_384_t* cache;
  111057. int err = MP_OKAY;
  111058. #ifndef HAVE_THREAD_LS
  111059. if (initCacheMutex_384 == 0) {
  111060. wc_InitMutex(&sp_cache_384_lock);
  111061. initCacheMutex_384 = 1;
  111062. }
  111063. if (wc_LockMutex(&sp_cache_384_lock) != 0)
  111064. err = BAD_MUTEX_E;
  111065. #endif /* HAVE_THREAD_LS */
  111066. if (err == MP_OKAY) {
  111067. sp_ecc_get_cache_384(g, &cache);
  111068. if (cache->cnt == 2)
  111069. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  111070. #ifndef HAVE_THREAD_LS
  111071. wc_UnLockMutex(&sp_cache_384_lock);
  111072. #endif /* HAVE_THREAD_LS */
  111073. if (cache->cnt < 2) {
  111074. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  111075. }
  111076. else {
  111077. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  111078. map, ct, heap);
  111079. }
  111080. }
  111081. return err;
  111082. #endif
  111083. }
  111084. #else
  111085. #ifdef FP_ECC
  111086. /* Generate the pre-computed table of points for the base point.
  111087. *
  111088. * width = 8
  111089. * 256 entries
  111090. * 48 bits between
  111091. *
  111092. * a The base point.
  111093. * table Place to store generated point data.
  111094. * tmp Temporary data.
  111095. * heap Heap to use for allocation.
  111096. */
  111097. static int sp_384_gen_stripe_table_12(const sp_point_384* a,
  111098. sp_table_entry_384* table, sp_digit* tmp, void* heap)
  111099. {
  111100. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111101. sp_point_384* t = NULL;
  111102. #else
  111103. sp_point_384 t[3];
  111104. #endif
  111105. sp_point_384* s1 = NULL;
  111106. sp_point_384* s2 = NULL;
  111107. int i;
  111108. int j;
  111109. int err = MP_OKAY;
  111110. (void)heap;
  111111. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111112. t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 3, heap,
  111113. DYNAMIC_TYPE_ECC);
  111114. if (t == NULL)
  111115. err = MEMORY_E;
  111116. #endif
  111117. if (err == MP_OKAY) {
  111118. s1 = t + 1;
  111119. s2 = t + 2;
  111120. err = sp_384_mod_mul_norm_12(t->x, a->x, p384_mod);
  111121. }
  111122. if (err == MP_OKAY) {
  111123. err = sp_384_mod_mul_norm_12(t->y, a->y, p384_mod);
  111124. }
  111125. if (err == MP_OKAY) {
  111126. err = sp_384_mod_mul_norm_12(t->z, a->z, p384_mod);
  111127. }
  111128. if (err == MP_OKAY) {
  111129. t->infinity = 0;
  111130. sp_384_proj_to_affine_12(t, tmp);
  111131. XMEMCPY(s1->z, p384_norm_mod, sizeof(p384_norm_mod));
  111132. s1->infinity = 0;
  111133. XMEMCPY(s2->z, p384_norm_mod, sizeof(p384_norm_mod));
  111134. s2->infinity = 0;
  111135. /* table[0] = {0, 0, infinity} */
  111136. XMEMSET(&table[0], 0, sizeof(sp_table_entry_384));
  111137. /* table[1] = Affine version of 'a' in Montgomery form */
  111138. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  111139. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  111140. for (i=1; i<8; i++) {
  111141. sp_384_proj_point_dbl_n_12(t, 48, tmp);
  111142. sp_384_proj_to_affine_12(t, tmp);
  111143. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  111144. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  111145. }
  111146. for (i=1; i<8; i++) {
  111147. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  111148. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  111149. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  111150. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  111151. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  111152. sp_384_proj_point_add_qz1_12(t, s1, s2, tmp);
  111153. sp_384_proj_to_affine_12(t, tmp);
  111154. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  111155. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  111156. }
  111157. }
  111158. }
  111159. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111160. if (t != NULL)
  111161. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  111162. #endif
  111163. return err;
  111164. }
  111165. #endif /* FP_ECC */
  111166. #ifndef WC_NO_CACHE_RESISTANT
  111167. /* Touch each possible entry that could be being copied.
  111168. *
  111169. * r Point to copy into.
  111170. * table Table - start of the entires to access
  111171. * idx Index of entry to retrieve.
  111172. */
  111173. static void sp_384_get_entry_256_12(sp_point_384* r,
  111174. const sp_table_entry_384* table, int idx)
  111175. {
  111176. int i;
  111177. sp_digit mask;
  111178. r->x[0] = 0;
  111179. r->x[1] = 0;
  111180. r->x[2] = 0;
  111181. r->x[3] = 0;
  111182. r->x[4] = 0;
  111183. r->x[5] = 0;
  111184. r->x[6] = 0;
  111185. r->x[7] = 0;
  111186. r->x[8] = 0;
  111187. r->x[9] = 0;
  111188. r->x[10] = 0;
  111189. r->x[11] = 0;
  111190. r->y[0] = 0;
  111191. r->y[1] = 0;
  111192. r->y[2] = 0;
  111193. r->y[3] = 0;
  111194. r->y[4] = 0;
  111195. r->y[5] = 0;
  111196. r->y[6] = 0;
  111197. r->y[7] = 0;
  111198. r->y[8] = 0;
  111199. r->y[9] = 0;
  111200. r->y[10] = 0;
  111201. r->y[11] = 0;
  111202. for (i = 1; i < 256; i++) {
  111203. mask = 0 - (i == idx);
  111204. r->x[0] |= mask & table[i].x[0];
  111205. r->x[1] |= mask & table[i].x[1];
  111206. r->x[2] |= mask & table[i].x[2];
  111207. r->x[3] |= mask & table[i].x[3];
  111208. r->x[4] |= mask & table[i].x[4];
  111209. r->x[5] |= mask & table[i].x[5];
  111210. r->x[6] |= mask & table[i].x[6];
  111211. r->x[7] |= mask & table[i].x[7];
  111212. r->x[8] |= mask & table[i].x[8];
  111213. r->x[9] |= mask & table[i].x[9];
  111214. r->x[10] |= mask & table[i].x[10];
  111215. r->x[11] |= mask & table[i].x[11];
  111216. r->y[0] |= mask & table[i].y[0];
  111217. r->y[1] |= mask & table[i].y[1];
  111218. r->y[2] |= mask & table[i].y[2];
  111219. r->y[3] |= mask & table[i].y[3];
  111220. r->y[4] |= mask & table[i].y[4];
  111221. r->y[5] |= mask & table[i].y[5];
  111222. r->y[6] |= mask & table[i].y[6];
  111223. r->y[7] |= mask & table[i].y[7];
  111224. r->y[8] |= mask & table[i].y[8];
  111225. r->y[9] |= mask & table[i].y[9];
  111226. r->y[10] |= mask & table[i].y[10];
  111227. r->y[11] |= mask & table[i].y[11];
  111228. }
  111229. }
  111230. #endif /* !WC_NO_CACHE_RESISTANT */
  111231. /* Multiply the point by the scalar and return the result.
  111232. * If map is true then convert result to affine coordinates.
  111233. *
  111234. * Stripe implementation.
  111235. * Pre-generated: 2^0, 2^48, ...
  111236. * Pre-generated: products of all combinations of above.
  111237. * 8 doubles and adds (with qz=1)
  111238. *
  111239. * r Resulting point.
  111240. * k Scalar to multiply by.
  111241. * table Pre-computed table.
  111242. * map Indicates whether to convert result to affine.
  111243. * ct Constant time required.
  111244. * heap Heap to use for allocation.
  111245. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111246. */
  111247. static int sp_384_ecc_mulmod_stripe_12(sp_point_384* r, const sp_point_384* g,
  111248. const sp_table_entry_384* table, const sp_digit* k, int map,
  111249. int ct, void* heap)
  111250. {
  111251. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111252. sp_point_384* rt = NULL;
  111253. sp_digit* t = NULL;
  111254. #else
  111255. sp_point_384 rt[2];
  111256. sp_digit t[2 * 12 * 6];
  111257. #endif
  111258. sp_point_384* p = NULL;
  111259. int i;
  111260. int j;
  111261. int y;
  111262. int x;
  111263. int err = MP_OKAY;
  111264. (void)g;
  111265. /* Constant time used for cache attack resistance implementation. */
  111266. (void)ct;
  111267. (void)heap;
  111268. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111269. rt = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  111270. DYNAMIC_TYPE_ECC);
  111271. if (rt == NULL)
  111272. err = MEMORY_E;
  111273. if (err == MP_OKAY) {
  111274. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, heap,
  111275. DYNAMIC_TYPE_ECC);
  111276. if (t == NULL)
  111277. err = MEMORY_E;
  111278. }
  111279. #endif
  111280. if (err == MP_OKAY) {
  111281. p = rt + 1;
  111282. XMEMCPY(p->z, p384_norm_mod, sizeof(p384_norm_mod));
  111283. XMEMCPY(rt->z, p384_norm_mod, sizeof(p384_norm_mod));
  111284. y = 0;
  111285. x = 47;
  111286. for (j=0; j<8; j++) {
  111287. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  111288. x += 48;
  111289. }
  111290. #ifndef WC_NO_CACHE_RESISTANT
  111291. if (ct) {
  111292. sp_384_get_entry_256_12(rt, table, y);
  111293. } else
  111294. #endif
  111295. {
  111296. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  111297. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  111298. }
  111299. rt->infinity = !y;
  111300. for (i=46; i>=0; i--) {
  111301. y = 0;
  111302. x = i;
  111303. for (j=0; j<8; j++) {
  111304. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  111305. x += 48;
  111306. }
  111307. sp_384_proj_point_dbl_12(rt, rt, t);
  111308. #ifndef WC_NO_CACHE_RESISTANT
  111309. if (ct) {
  111310. sp_384_get_entry_256_12(p, table, y);
  111311. }
  111312. else
  111313. #endif
  111314. {
  111315. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  111316. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  111317. }
  111318. p->infinity = !y;
  111319. sp_384_proj_point_add_qz1_12(rt, rt, p, t);
  111320. }
  111321. if (map != 0) {
  111322. sp_384_map_12(r, rt, t);
  111323. }
  111324. else {
  111325. XMEMCPY(r, rt, sizeof(sp_point_384));
  111326. }
  111327. }
  111328. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111329. if (t != NULL)
  111330. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  111331. if (rt != NULL)
  111332. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  111333. #endif
  111334. return err;
  111335. }
  111336. #ifdef FP_ECC
  111337. #ifndef FP_ENTRIES
  111338. #define FP_ENTRIES 16
  111339. #endif
  111340. /* Cache entry - holds precomputation tables for a point. */
  111341. typedef struct sp_cache_384_t {
  111342. /* X ordinate of point that table was generated from. */
  111343. sp_digit x[12];
  111344. /* Y ordinate of point that table was generated from. */
  111345. sp_digit y[12];
  111346. /* Precomputation table for point. */
  111347. sp_table_entry_384 table[256];
  111348. /* Count of entries in table. */
  111349. uint32_t cnt;
  111350. /* Point and table set in entry. */
  111351. int set;
  111352. } sp_cache_384_t;
  111353. /* Cache of tables. */
  111354. static THREAD_LS_T sp_cache_384_t sp_cache_384[FP_ENTRIES];
  111355. /* Index of last entry in cache. */
  111356. static THREAD_LS_T int sp_cache_384_last = -1;
  111357. /* Cache has been initialized. */
  111358. static THREAD_LS_T int sp_cache_384_inited = 0;
  111359. #ifndef HAVE_THREAD_LS
  111360. static volatile int initCacheMutex_384 = 0;
  111361. static wolfSSL_Mutex sp_cache_384_lock;
  111362. #endif
  111363. /* Get the cache entry for the point.
  111364. *
  111365. * g [in] Point scalar multipling.
  111366. * cache [out] Cache table to use.
  111367. */
  111368. static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache)
  111369. {
  111370. int i;
  111371. int j;
  111372. uint32_t least;
  111373. if (sp_cache_384_inited == 0) {
  111374. for (i=0; i<FP_ENTRIES; i++) {
  111375. sp_cache_384[i].set = 0;
  111376. }
  111377. sp_cache_384_inited = 1;
  111378. }
  111379. /* Compare point with those in cache. */
  111380. for (i=0; i<FP_ENTRIES; i++) {
  111381. if (!sp_cache_384[i].set)
  111382. continue;
  111383. if (sp_384_cmp_equal_12(g->x, sp_cache_384[i].x) &
  111384. sp_384_cmp_equal_12(g->y, sp_cache_384[i].y)) {
  111385. sp_cache_384[i].cnt++;
  111386. break;
  111387. }
  111388. }
  111389. /* No match. */
  111390. if (i == FP_ENTRIES) {
  111391. /* Find empty entry. */
  111392. i = (sp_cache_384_last + 1) % FP_ENTRIES;
  111393. for (; i != sp_cache_384_last; i=(i+1)%FP_ENTRIES) {
  111394. if (!sp_cache_384[i].set) {
  111395. break;
  111396. }
  111397. }
  111398. /* Evict least used. */
  111399. if (i == sp_cache_384_last) {
  111400. least = sp_cache_384[0].cnt;
  111401. for (j=1; j<FP_ENTRIES; j++) {
  111402. if (sp_cache_384[j].cnt < least) {
  111403. i = j;
  111404. least = sp_cache_384[i].cnt;
  111405. }
  111406. }
  111407. }
  111408. XMEMCPY(sp_cache_384[i].x, g->x, sizeof(sp_cache_384[i].x));
  111409. XMEMCPY(sp_cache_384[i].y, g->y, sizeof(sp_cache_384[i].y));
  111410. sp_cache_384[i].set = 1;
  111411. sp_cache_384[i].cnt = 1;
  111412. }
  111413. *cache = &sp_cache_384[i];
  111414. sp_cache_384_last = i;
  111415. }
  111416. #endif /* FP_ECC */
  111417. /* Multiply the base point of P384 by the scalar and return the result.
  111418. * If map is true then convert result to affine coordinates.
  111419. *
  111420. * r Resulting point.
  111421. * g Point to multiply.
  111422. * k Scalar to multiply by.
  111423. * map Indicates whether to convert result to affine.
  111424. * ct Constant time required.
  111425. * heap Heap to use for allocation.
  111426. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111427. */
  111428. static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k,
  111429. int map, int ct, void* heap)
  111430. {
  111431. #ifndef FP_ECC
  111432. return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  111433. #else
  111434. sp_digit tmp[2 * 12 * 7];
  111435. sp_cache_384_t* cache;
  111436. int err = MP_OKAY;
  111437. #ifndef HAVE_THREAD_LS
  111438. if (initCacheMutex_384 == 0) {
  111439. wc_InitMutex(&sp_cache_384_lock);
  111440. initCacheMutex_384 = 1;
  111441. }
  111442. if (wc_LockMutex(&sp_cache_384_lock) != 0)
  111443. err = BAD_MUTEX_E;
  111444. #endif /* HAVE_THREAD_LS */
  111445. if (err == MP_OKAY) {
  111446. sp_ecc_get_cache_384(g, &cache);
  111447. if (cache->cnt == 2)
  111448. sp_384_gen_stripe_table_12(g, cache->table, tmp, heap);
  111449. #ifndef HAVE_THREAD_LS
  111450. wc_UnLockMutex(&sp_cache_384_lock);
  111451. #endif /* HAVE_THREAD_LS */
  111452. if (cache->cnt < 2) {
  111453. err = sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap);
  111454. }
  111455. else {
  111456. err = sp_384_ecc_mulmod_stripe_12(r, g, cache->table, k,
  111457. map, ct, heap);
  111458. }
  111459. }
  111460. return err;
  111461. #endif
  111462. }
  111463. #endif /* WOLFSSL_SP_SMALL */
  111464. /* Multiply the point by the scalar and return the result.
  111465. * If map is true then convert result to affine coordinates.
  111466. *
  111467. * km Scalar to multiply by.
  111468. * p Point to multiply.
  111469. * r Resulting point.
  111470. * map Indicates whether to convert result to affine.
  111471. * heap Heap to use for allocation.
  111472. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111473. */
  111474. int sp_ecc_mulmod_384(const mp_int* km, const ecc_point* gm, ecc_point* r,
  111475. int map, void* heap)
  111476. {
  111477. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111478. sp_point_384* point = NULL;
  111479. sp_digit* k = NULL;
  111480. #else
  111481. sp_point_384 point[1];
  111482. sp_digit k[12];
  111483. #endif
  111484. int err = MP_OKAY;
  111485. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111486. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  111487. DYNAMIC_TYPE_ECC);
  111488. if (point == NULL)
  111489. err = MEMORY_E;
  111490. if (err == MP_OKAY) {
  111491. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  111492. DYNAMIC_TYPE_ECC);
  111493. if (k == NULL)
  111494. err = MEMORY_E;
  111495. }
  111496. #endif
  111497. if (err == MP_OKAY) {
  111498. sp_384_from_mp(k, 12, km);
  111499. sp_384_point_from_ecc_point_12(point, gm);
  111500. err = sp_384_ecc_mulmod_12(point, point, k, map, 1, heap);
  111501. }
  111502. if (err == MP_OKAY) {
  111503. err = sp_384_point_to_ecc_point_12(point, r);
  111504. }
  111505. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111506. if (k != NULL)
  111507. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  111508. if (point != NULL)
  111509. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  111510. #endif
  111511. return err;
  111512. }
  111513. /* Multiply the point by the scalar, add point a and return the result.
  111514. * If map is true then convert result to affine coordinates.
  111515. *
  111516. * km Scalar to multiply by.
  111517. * p Point to multiply.
  111518. * am Point to add to scalar mulitply result.
  111519. * inMont Point to add is in montgomery form.
  111520. * r Resulting point.
  111521. * map Indicates whether to convert result to affine.
  111522. * heap Heap to use for allocation.
  111523. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111524. */
  111525. int sp_ecc_mulmod_add_384(const mp_int* km, const ecc_point* gm,
  111526. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  111527. {
  111528. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111529. sp_point_384* point = NULL;
  111530. sp_digit* k = NULL;
  111531. #else
  111532. sp_point_384 point[2];
  111533. sp_digit k[12 + 12 * 2 * 6];
  111534. #endif
  111535. sp_point_384* addP = NULL;
  111536. sp_digit* tmp = NULL;
  111537. int err = MP_OKAY;
  111538. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111539. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  111540. DYNAMIC_TYPE_ECC);
  111541. if (point == NULL)
  111542. err = MEMORY_E;
  111543. if (err == MP_OKAY) {
  111544. k = (sp_digit*)XMALLOC(
  111545. sizeof(sp_digit) * (12 + 12 * 2 * 6), heap,
  111546. DYNAMIC_TYPE_ECC);
  111547. if (k == NULL)
  111548. err = MEMORY_E;
  111549. }
  111550. #endif
  111551. if (err == MP_OKAY) {
  111552. addP = point + 1;
  111553. tmp = k + 12;
  111554. sp_384_from_mp(k, 12, km);
  111555. sp_384_point_from_ecc_point_12(point, gm);
  111556. sp_384_point_from_ecc_point_12(addP, am);
  111557. }
  111558. if ((err == MP_OKAY) && (!inMont)) {
  111559. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  111560. }
  111561. if ((err == MP_OKAY) && (!inMont)) {
  111562. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  111563. }
  111564. if ((err == MP_OKAY) && (!inMont)) {
  111565. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  111566. }
  111567. if (err == MP_OKAY) {
  111568. err = sp_384_ecc_mulmod_12(point, point, k, 0, 0, heap);
  111569. }
  111570. if (err == MP_OKAY) {
  111571. sp_384_proj_point_add_12(point, point, addP, tmp);
  111572. if (map) {
  111573. sp_384_map_12(point, point, tmp);
  111574. }
  111575. err = sp_384_point_to_ecc_point_12(point, r);
  111576. }
  111577. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  111578. if (k != NULL)
  111579. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  111580. if (point != NULL)
  111581. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  111582. #endif
  111583. return err;
  111584. }
  111585. #ifdef WOLFSSL_SP_SMALL
  111586. /* Striping precomputation table.
  111587. * 4 points combined into a table of 16 points.
  111588. * Distance of 96 between points.
  111589. */
  111590. static const sp_table_entry_384 p384_table[16] = {
  111591. /* 0 */
  111592. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  111593. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  111594. /* 1 */
  111595. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  111596. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  111597. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  111598. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  111599. /* 2 */
  111600. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  111601. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  111602. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  111603. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  111604. /* 3 */
  111605. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  111606. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  111607. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  111608. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  111609. /* 4 */
  111610. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  111611. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  111612. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  111613. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  111614. /* 5 */
  111615. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  111616. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  111617. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  111618. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  111619. /* 6 */
  111620. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  111621. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  111622. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  111623. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  111624. /* 7 */
  111625. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  111626. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  111627. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  111628. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  111629. /* 8 */
  111630. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  111631. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  111632. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  111633. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  111634. /* 9 */
  111635. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  111636. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  111637. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  111638. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  111639. /* 10 */
  111640. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  111641. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  111642. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  111643. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  111644. /* 11 */
  111645. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  111646. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  111647. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  111648. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  111649. /* 12 */
  111650. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  111651. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  111652. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  111653. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  111654. /* 13 */
  111655. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  111656. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  111657. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  111658. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  111659. /* 14 */
  111660. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  111661. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  111662. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  111663. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  111664. /* 15 */
  111665. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  111666. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  111667. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  111668. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  111669. };
  111670. /* Multiply the base point of P384 by the scalar and return the result.
  111671. * If map is true then convert result to affine coordinates.
  111672. *
  111673. * Stripe implementation.
  111674. * Pre-generated: 2^0, 2^96, ...
  111675. * Pre-generated: products of all combinations of above.
  111676. * 4 doubles and adds (with qz=1)
  111677. *
  111678. * r Resulting point.
  111679. * k Scalar to multiply by.
  111680. * map Indicates whether to convert result to affine.
  111681. * ct Constant time required.
  111682. * heap Heap to use for allocation.
  111683. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  111684. */
  111685. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  111686. int map, int ct, void* heap)
  111687. {
  111688. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  111689. k, map, ct, heap);
  111690. }
  111691. #else
  111692. /* Striping precomputation table.
  111693. * 8 points combined into a table of 256 points.
  111694. * Distance of 48 between points.
  111695. */
  111696. static const sp_table_entry_384 p384_table[256] = {
  111697. /* 0 */
  111698. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  111699. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  111700. /* 1 */
  111701. { { 0x49c0b528,0x3dd07566,0xa0d6ce38,0x20e378e2,0x541b4d6e,0x879c3afc,
  111702. 0x59a30eff,0x64548684,0x614ede2b,0x812ff723,0x299e1513,0x4d3aadc2 },
  111703. { 0x4b03a4fe,0x23043dad,0x7bb4a9ac,0xa1bfa8bf,0x2e83b050,0x8bade756,
  111704. 0x68f4ffd9,0xc6c35219,0x3969a840,0xdd800226,0x5a15c5e9,0x2b78abc2 } },
  111705. /* 2 */
  111706. { { 0x2b0c535b,0x29864753,0x70506296,0x90dd6953,0x216ab9ac,0x038cd6b4,
  111707. 0xbe12d76a,0x3df9b7b7,0x5f347bdb,0x13f4d978,0x13e94489,0x222c5c9c },
  111708. { 0x2680dc64,0x5f8e796f,0x58352417,0x120e7cb7,0xd10740b8,0x254b5d8a,
  111709. 0x5337dee6,0xc38b8efb,0x94f02247,0xf688c2e1,0x6c25bc4c,0x7b5c75f3 } },
  111710. /* 3 */
  111711. { { 0x9edffea5,0xe26a3cc3,0x37d7e9fc,0x35bbfd1c,0x9bde3ef6,0xf0e7700d,
  111712. 0x1a538f5a,0x0380eb47,0x05bf9eb3,0x2e9da8bb,0x1a460c3e,0xdbb93c73 },
  111713. { 0xf526b605,0x37dba260,0xfd785537,0x95d4978e,0xed72a04a,0x24ed793a,
  111714. 0x76005b1a,0x26948377,0x9e681f82,0x99f557b9,0xd64954ef,0xae5f9557 } },
  111715. /* 4 */
  111716. { { 0xf26feef9,0x24480c57,0x3a0e1240,0xc31a2694,0x273e2bc7,0x735002c3,
  111717. 0x3ef1ed4c,0x8c42e9c5,0x7f4948e8,0x028babf6,0x8a978632,0x6a502f43 },
  111718. { 0xb74536fe,0xf5f13a46,0xd8a9f0eb,0x1d218bab,0x37232768,0x30f36bcc,
  111719. 0x576e8c18,0xc5317b31,0x9bbcb766,0xef1d57a6,0xb3e3d4dc,0x917c4930 } },
  111720. /* 5 */
  111721. { { 0xe349ddd0,0x11426e2e,0x9b2fc250,0x9f117ef9,0xec0174a6,0xff36b480,
  111722. 0x18458466,0x4f4bde76,0x05806049,0x2f2edb6d,0x19dfca92,0x8adc75d1 },
  111723. { 0xb7d5a7ce,0xa619d097,0xa34411e9,0x874275e5,0x0da4b4ef,0x5403e047,
  111724. 0x77901d8f,0x2ebaafd9,0xa747170f,0x5e63ebce,0x7f9d8036,0x12a36944 } },
  111725. /* 6 */
  111726. { { 0x4fc52870,0x28f9c07a,0x1a53a961,0xce0b3748,0x0e1828d9,0xd550fa18,
  111727. 0x6adb225a,0xa24abaf7,0x6e58a348,0xd11ed0a5,0x948acb62,0xf3d811e6 },
  111728. { 0x4c61ed22,0x8618dd77,0x80b47c9d,0x0bb747f9,0xde6b8559,0x22bf796f,
  111729. 0x680a21e9,0xfdfd1c6d,0x2af2c9dd,0xc0db1577,0xc1e90f3d,0xa09379e6 } },
  111730. /* 7 */
  111731. { { 0xe085c629,0x386c66ef,0x095bc89a,0x5fc2a461,0x203f4b41,0x1353d631,
  111732. 0x7e4bd8f5,0x7ca1972b,0xa7df8ce9,0xb077380a,0xee7e4ea3,0xd8a90389 },
  111733. { 0xe7b14461,0x1bc74dc7,0x0c9c4f78,0xdc2cb014,0x84ef0a10,0x52b4b3a6,
  111734. 0x20327fe2,0xbde6ea5d,0x660f9615,0xb71ec435,0xb8ad8173,0xeede5a04 } },
  111735. /* 8 */
  111736. { { 0x893b9a2d,0x5584cbb3,0x00850c5d,0x820c660b,0x7df2d43d,0x4126d826,
  111737. 0x0109e801,0xdd5bbbf0,0x38172f1c,0x85b92ee3,0xf31430d9,0x609d4f93 },
  111738. { 0xeadaf9d6,0x1e059a07,0x0f125fb0,0x70e6536c,0x560f20e7,0xd6220751,
  111739. 0x7aaf3a9a,0xa59489ae,0x64bae14e,0x7b70e2f6,0x76d08249,0x0dd03701 } },
  111740. /* 9 */
  111741. { { 0x8510521f,0x4cc13be8,0xf724cc17,0x87315ba9,0x353dc263,0xb49d83bb,
  111742. 0x0c279257,0x8b677efe,0xc93c9537,0x510a1c1c,0xa4702c99,0x33e30cd8 },
  111743. { 0x2208353f,0xf0ffc89d,0xced42b2b,0x0170fa8d,0x26e2a5f5,0x090851ed,
  111744. 0xecb52c96,0x81276455,0x7fe1adf4,0x0646c4e1,0xb0868eab,0x513f047e } },
  111745. /* 10 */
  111746. { { 0xdf5bdf53,0xc07611f4,0x58b11a6d,0x45d331a7,0x1c4ee394,0x58965daf,
  111747. 0x5a5878d1,0xba8bebe7,0x82dd3025,0xaecc0a18,0xa923eb8b,0xcf2a3899 },
  111748. { 0xd24fd048,0xf98c9281,0x8bbb025d,0x841bfb59,0xc9ab9d53,0xb8ddf8ce,
  111749. 0x7fef044e,0x538a4cb6,0x23236662,0x092ac21f,0x0b66f065,0xa919d385 } },
  111750. /* 11 */
  111751. { { 0x85d480d8,0x3db03b40,0x1b287a7d,0x8cd9f479,0x4a8f3bae,0x8f24dc75,
  111752. 0x3db41892,0x482eb800,0x9c56e0f5,0x38bf9eb3,0x9a91dc6f,0x8b977320 },
  111753. { 0x7209cfc2,0xa31b05b2,0x05b2db70,0x4c49bf85,0xd619527b,0x56462498,
  111754. 0x1fac51ba,0x3fe51039,0xab4b8342,0xfb04f55e,0x04c6eabf,0xc07c10dc } },
  111755. /* 12 */
  111756. { { 0xdb32f048,0xad22fe4c,0x475ed6df,0x5f23bf91,0xaa66b6cb,0xa50ce0c0,
  111757. 0xf03405c0,0xdf627a89,0xf95e2d6a,0x3674837d,0xba42e64e,0x081c95b6 },
  111758. { 0xe71d6ceb,0xeba3e036,0x6c6b0271,0xb45bcccf,0x0684701d,0x67b47e63,
  111759. 0xe712523f,0x60f8f942,0x5cd47adc,0x82423472,0x87649cbb,0x83027d79 } },
  111760. /* 13 */
  111761. { { 0x3615b0b8,0xb3929ea6,0xa54dac41,0xb41441fd,0xb5b6a368,0x8995d556,
  111762. 0x167ef05e,0xa80d4529,0x6d25a27f,0xf6bcb4a1,0x7bd55b68,0x210d6a4c },
  111763. { 0x25351130,0xf3804abb,0x903e37eb,0x1d2df699,0x084c25c8,0x5f201efc,
  111764. 0xa1c68e91,0x31a28c87,0x563f62a5,0x81dad253,0xd6c415d4,0x5dd6de70 } },
  111765. /* 14 */
  111766. { { 0x846612ce,0x29f470fd,0xda18d997,0x986f3eec,0x2f34af86,0x6b84c161,
  111767. 0x46ddaf8b,0x5ef0a408,0xe49e795f,0x14405a00,0xaa2f7a37,0x5f491b16 },
  111768. { 0xdb41b38d,0xc7f07ae4,0x18fbfcaa,0xef7d119e,0x14443b19,0x3a18e076,
  111769. 0x79a19926,0x4356841a,0xe2226fbe,0x91f4a91c,0x3cc88721,0xdc77248c } },
  111770. /* 15 */
  111771. { { 0xe4b1ec9d,0xd570ff1a,0xe7eef706,0x21d23e0e,0xca19e086,0x3cde40f4,
  111772. 0xcd4bb270,0x7d6523c4,0xbf13aa6c,0x16c1f06c,0xd14c4b60,0x5aa7245a },
  111773. { 0x44b74de8,0x37f81467,0x620a934e,0x839e7a17,0xde8b1aa1,0xf74d14e8,
  111774. 0xf30d75e2,0x8789fa51,0xc81c261e,0x09b24052,0x33c565ee,0x654e2678 } },
  111775. /* 16 */
  111776. { { 0x2f9fbe67,0x378205de,0x7f728e44,0xc4afcb83,0x682e00f1,0xdbcec06c,
  111777. 0x114d5423,0xf2a145c3,0x7a52463e,0xa01d9874,0x7d717b0a,0xfc0935b1 },
  111778. { 0xd4d01f95,0x9653bc4f,0x9560ad34,0x9aa83ea8,0xaf8e3f3f,0xf77943dc,
  111779. 0xe86fe16e,0x70774a10,0xbf9ffdcf,0x6b62e6f1,0x588745c9,0x8a72f39e } },
  111780. /* 17 */
  111781. { { 0x2341c342,0x73ade4da,0xea704422,0xdd326e54,0x3741cef3,0x336c7d98,
  111782. 0x59e61549,0x1eafa00d,0xbd9a3efd,0xcd3ed892,0xc5c6c7e4,0x03faf26c },
  111783. { 0x3045f8ac,0x087e2fcf,0x174f1e73,0x14a65532,0xfe0af9a7,0x2cf84f28,
  111784. 0x2cdc935b,0xddfd7a84,0x6929c895,0x4c0f117b,0x4c8bcfcc,0x356572d6 } },
  111785. /* 18 */
  111786. { { 0x7d8c1bba,0x7ecbac01,0x90b0f3d5,0x6058f9c3,0xf6197d0f,0xaee116e3,
  111787. 0x4033b128,0xc4dd7068,0xc209b983,0xf084dba6,0x831dbc4a,0x97c7c2cf },
  111788. { 0xf96010e8,0x2f4e61dd,0x529faa17,0xd97e4e20,0x69d37f20,0x4ee66660,
  111789. 0x3d366d72,0xccc139ed,0x13488e0f,0x690b6ee2,0xf3a6d533,0x7cad1dc5 } },
  111790. /* 19 */
  111791. { { 0xda57a41f,0x660a9a81,0xec0039b6,0xe74a0412,0x5e1dad15,0x42343c6b,
  111792. 0x46681d4c,0x284f3ff5,0x63749e89,0xb51087f1,0x6f9f2f13,0x070f23cc },
  111793. { 0x5d186e14,0x542211da,0xfddb0dff,0x84748f37,0xdb1f4180,0x41a3aab4,
  111794. 0xa6402d0e,0x25ed667b,0x02f58355,0x2f2924a9,0xfa44a689,0x5844ee7c } },
  111795. /* 20 */
  111796. { { 0x3f3b236f,0xfab08607,0x81e221da,0x19e9d41d,0x3927b428,0xf3f6571e,
  111797. 0x7550f1f6,0x4348a933,0xa85e62f0,0x7167b996,0x7f5452bf,0x62d43759 },
  111798. { 0xf2955926,0xd85feb9e,0x6df78353,0x440a561f,0x9ca36b59,0x389668ec,
  111799. 0xa22da016,0x052bf1a1,0xf6093254,0xbdfbff72,0xe22209f3,0x94e50f28 } },
  111800. /* 21 */
  111801. { { 0x3062e8af,0x90b2e5b3,0xe8a3d369,0xa8572375,0x201db7b1,0x3fe1b00b,
  111802. 0xee651aa2,0xe926def0,0xb9b10ad7,0x6542c9be,0xa2fcbe74,0x098e309b },
  111803. { 0xfff1d63f,0x779deeb3,0x20bfd374,0x23d0e80a,0x8768f797,0x8452bb3b,
  111804. 0x1f952856,0xcf75bb4d,0x29ea3faa,0x8fe6b400,0x81373a53,0x12bd3e40 } },
  111805. /* 22 */
  111806. { { 0x104cbba5,0xc023780d,0xfa35dd4c,0x6207e747,0x1ca9b6a3,0x35c23928,
  111807. 0x97987b10,0x4ff19be8,0x8022eee8,0xb8476bbf,0xd3bbe74d,0xaa0a4a14 },
  111808. { 0x187d4543,0x20f94331,0x79f6e066,0x32153870,0xac7e82e1,0x83b0f74e,
  111809. 0x828f06ab,0xa7748ba2,0xc26ef35f,0xc5f0298a,0x8e9a7dbd,0x0f0c5070 } },
  111810. /* 23 */
  111811. { { 0xdef029dd,0x0c5c244c,0x850661b8,0x3dabc687,0xfe11d981,0x9992b865,
  111812. 0x6274dbad,0xe9801b8f,0x098da242,0xe54e6319,0x91a53d08,0x9929a91a },
  111813. { 0x35285887,0x37bffd72,0xf1418102,0xbc759425,0xfd2e6e20,0x9280cc35,
  111814. 0xfbc42ee5,0x735c600c,0x8837619a,0xb7ad2864,0xa778c57b,0xa3627231 } },
  111815. /* 24 */
  111816. { { 0x91361ed8,0xae799b5c,0x6c63366c,0x47d71b75,0x1b265a6a,0x54cdd521,
  111817. 0x98d77b74,0xe0215a59,0xbab29db0,0x4424d9b7,0x7fd9e536,0x8b0ffacc },
  111818. { 0x37b5d9ef,0x46d85d12,0xbfa91747,0x5b106d62,0x5f99ba2d,0xed0479f8,
  111819. 0x1d104de4,0x0e6f3923,0x25e8983f,0x83a84c84,0xf8105a70,0xa9507e0a } },
  111820. /* 25 */
  111821. { { 0x14cf381c,0xf6c68a6e,0xc22e31cc,0xaf9d27bd,0xaa8a5ccb,0x23568d4d,
  111822. 0xe338e4d2,0xe431eec0,0x8f52ad1f,0xf1a828fe,0xe86acd80,0xdb6a0579 },
  111823. { 0x4507832a,0x2885672e,0x887e5289,0x73fc275f,0x05610d08,0x65f80278,
  111824. 0x075ff5b0,0x8d9b4554,0x09f712b5,0x3a8e8fb1,0x2ebe9cf2,0x39f0ac86 } },
  111825. /* 26 */
  111826. { { 0x4c52edf5,0xd8fabf78,0xa589ae53,0xdcd737e5,0xd791ab17,0x94918bf0,
  111827. 0xbcff06c9,0xb5fbd956,0xdca46d45,0xf6d3032e,0x41a3e486,0x2cdff7e1 },
  111828. { 0x61f47ec8,0x6674b3ba,0xeef84608,0x8a882163,0x4c687f90,0xa257c705,
  111829. 0xf6cdf227,0xe30cb2ed,0x7f6ea846,0x2c4c64ca,0xcc6bcd3c,0x186fa17c } },
  111830. /* 27 */
  111831. { { 0x1dfcb91e,0x48a3f536,0x646d358a,0x83595e13,0x91128798,0xbd15827b,
  111832. 0x2187757a,0x3ce612b8,0x61bd7372,0x873150a1,0xb662f568,0xf4684530 },
  111833. { 0x401896f6,0x8833950b,0x77f3e090,0xe11cb89a,0x48e7f4a5,0xb2f12cac,
  111834. 0xf606677e,0x313dd769,0x16579f93,0xfdcf08b3,0x46b8f22b,0x6429cec9 } },
  111835. /* 28 */
  111836. { { 0xbb75f9a4,0x4984dd54,0x29d3b570,0x4aef06b9,0x3d6e4c1e,0xb5f84ca2,
  111837. 0xb083ef35,0x24c61c11,0x392ca9ff,0xce4a7392,0x6730a800,0x865d6517 },
  111838. { 0x722b4a2b,0xca3dfe76,0x7b083e0e,0x12c04bf9,0x1b86b8a5,0x803ce5b5,
  111839. 0x6a7e3e0c,0x3fc7632d,0xc81adbe4,0xc89970c2,0x120e16b1,0x3cbcd3ad } },
  111840. /* 29 */
  111841. { { 0xec30ce93,0xfbfb4cc7,0xb72720a2,0x10ed6c7d,0x47b55500,0xec675bf7,
  111842. 0x333ff7c3,0x90725903,0x5075bfc0,0xc7c3973e,0x07acf31b,0xb049ecb0 },
  111843. { 0x4f58839c,0xb4076eaf,0xa2b05e4f,0x101896da,0xab40c66e,0x3f6033b0,
  111844. 0xc8d864ba,0x19ee9eeb,0x47bf6d2a,0xeb6cf155,0xf826477d,0x8e5a9663 } },
  111845. /* 30 */
  111846. { { 0xf7fbd5e1,0x69e62fdd,0x76912b1d,0x38ecfe54,0xd1da3bfb,0x845a3d56,
  111847. 0x1c86f0d4,0x0494950e,0x3bc36ce8,0x83cadbf9,0x4fccc8d1,0x41fce572 },
  111848. { 0x8332c144,0x05f939c2,0x0871e46e,0xb17f248b,0x66e8aff6,0x3d8534e2,
  111849. 0x3b85c629,0x1d06f1dc,0xa3131b73,0xdb06a32e,0x8b3f64e5,0xf295184d } },
  111850. /* 31 */
  111851. { { 0x36ddc103,0xd9653ff7,0x95ef606f,0x25f43e37,0xfe06dce8,0x09e301fc,
  111852. 0x30b6eebf,0x85af2341,0x0ff56b20,0x79b12b53,0xfe9a3c6b,0x9b4fb499 },
  111853. { 0x51d27ac2,0x0154f892,0x56ca5389,0xd33167e3,0xafc065a6,0x7828ec1f,
  111854. 0x7f746c9b,0x0959a258,0x0c44f837,0xb18f1be3,0xc4132fdb,0xa7946117 } },
  111855. /* 32 */
  111856. { { 0x5e3c647b,0xc0426b77,0x8cf05348,0xbfcbd939,0x172c0d3d,0x31d312e3,
  111857. 0xee754737,0x5f49fde6,0x6da7ee61,0x895530f0,0xe8b3a5fb,0xcf281b0a },
  111858. { 0x41b8a543,0xfd149735,0x3080dd30,0x41a625a7,0x653908cf,0xe2baae07,
  111859. 0xba02a278,0xc3d01436,0x7b21b8f8,0xa0d0222e,0xd7ec1297,0xfdc270e9 } },
  111860. /* 33 */
  111861. { { 0xbc7f41d6,0x00873c0c,0x1b7ad641,0xd976113e,0x238443fb,0x2a536ff4,
  111862. 0x41e62e45,0x030d00e2,0x5f545fc6,0x532e9867,0x8e91208c,0xcd033108 },
  111863. { 0x9797612c,0xd1a04c99,0xeea674e2,0xd4393e02,0xe19742a1,0xd56fa69e,
  111864. 0x85f0590e,0xdd2ab480,0x48a2243d,0xa5cefc52,0x54383f41,0x48cc67b6 } },
  111865. /* 34 */
  111866. { { 0xfc14ab48,0x4e50430e,0x26706a74,0x195b7f4f,0xcc881ff6,0x2fe8a228,
  111867. 0xd945013d,0xb1b968e2,0x4b92162b,0x936aa579,0x364e754a,0x4fb766b7 },
  111868. { 0x31e1ff7f,0x13f93bca,0xce4f2691,0x696eb5ca,0xa2b09e02,0xff754bf8,
  111869. 0xe58e3ff8,0x58f13c9c,0x1678c0b0,0xb757346f,0xa86692b3,0xd54200db } },
  111870. /* 35 */
  111871. { { 0x6dda1265,0x9a030bbd,0xe89718dd,0xf7b4f3fc,0x936065b8,0xa6a4931f,
  111872. 0x5f72241c,0xbce72d87,0x65775857,0x6cbb51cb,0x4e993675,0xc7161815 },
  111873. { 0x2ee32189,0xe81a0f79,0x277dc0b2,0xef2fab26,0xb71f469f,0x9e64f6fe,
  111874. 0xdfdaf859,0xb448ce33,0xbe6b5df1,0x3f5c1c4c,0x1de45f7b,0xfb8dfb00 } },
  111875. /* 36 */
  111876. { { 0x4d5bb921,0xc7345fa7,0x4d2b667e,0x5c7e04be,0x282d7a3e,0x47ed3a80,
  111877. 0x7e47b2a4,0x5c2777f8,0x08488e2e,0x89b3b100,0xb2eb5b45,0x9aad77c2 },
  111878. { 0xdaac34ae,0xd681bca7,0x26afb326,0x2452e4e5,0x41a1ee14,0x0c887924,
  111879. 0xc2407ade,0x743b04d4,0xfc17a2ac,0xcb5e999b,0x4a701a06,0x4dca2f82 } },
  111880. /* 37 */
  111881. { { 0x1127bc1a,0x68e31ca6,0x17ead3be,0xa3edd59b,0xe25f5a15,0x67b6b645,
  111882. 0xa420e15e,0x76221794,0x4b1e872e,0x794fd83b,0xb2dece1b,0x7cab3f03 },
  111883. { 0xca9b3586,0x7119bf15,0x4d250bd7,0xa5545924,0xcc6bcf24,0x173633ea,
  111884. 0xb1b6f884,0x9bd308c2,0x447d38c3,0x3bae06f5,0xf341fe1c,0x54dcc135 } },
  111885. /* 38 */
  111886. { { 0x943caf0d,0x56d3598d,0x225ff133,0xce044ea9,0x563fadea,0x9edf6a7c,
  111887. 0x73e8dc27,0x632eb944,0x3190dcab,0x814b467e,0x6dbb1e31,0x2d4f4f31 },
  111888. { 0xa143b7ca,0x8d69811c,0xde7cf950,0x4ec1ac32,0x37b5fe82,0x223ab5fd,
  111889. 0x9390f1d9,0xe82616e4,0x75804610,0xabff4b20,0x875b08f0,0x11b9be15 } },
  111890. /* 39 */
  111891. { { 0x3bbe682c,0x4ae31a3d,0x74eef2dd,0xbc7c5d26,0x3c47dd40,0x92afd10a,
  111892. 0xc14ab9e1,0xec7e0a3b,0xb2e495e4,0x6a6c3dd1,0x309bcd85,0x085ee5e9 },
  111893. { 0x8c2e67fd,0xf381a908,0xe261eaf2,0x32083a80,0x96deee15,0x0fcd6a49,
  111894. 0x5e524c79,0xe3b8fb03,0x1d5b08b9,0x8dc360d9,0x7f26719f,0x3a06e2c8 } },
  111895. /* 40 */
  111896. { { 0x7237cac0,0x5cd9f5a8,0x43586794,0x93f0b59d,0xe94f6c4e,0x4384a764,
  111897. 0xb62782d3,0x8304ed2b,0xcde06015,0x0b8db8b3,0x5dbe190f,0x4336dd53 },
  111898. { 0x92ab473a,0x57443553,0xbe5ed046,0x031c7275,0x21909aa4,0x3e78678c,
  111899. 0x99202ddb,0x4ab7e04f,0x6977e635,0x2648d206,0x093198be,0xd427d184 } },
  111900. /* 41 */
  111901. { { 0x0f9b5a31,0x822848f5,0xbaadb62a,0xbb003468,0x3357559c,0x233a0472,
  111902. 0x79aee843,0x49ef6880,0xaeb9e1e3,0xa89867a0,0x1f6f9a55,0xc151931b },
  111903. { 0xad74251e,0xd264eb0b,0x4abf295e,0x37b9b263,0x04960d10,0xb600921b,
  111904. 0x4da77dc0,0x0de53dbc,0xd2b18697,0x01d9bab3,0xf7156ddf,0xad54ec7a } },
  111905. /* 42 */
  111906. { { 0x79efdc58,0x8e74dc35,0x4ff68ddb,0x456bd369,0xd32096a5,0x724e74cc,
  111907. 0x386783d0,0xe41cff42,0x7c70d8a4,0xa04c7f21,0xe61a19a2,0x41199d2f },
  111908. { 0x29c05dd2,0xd389a3e0,0xe7e3fda9,0x535f2a6b,0x7c2b4df8,0x26ecf72d,
  111909. 0xfe745294,0x678275f4,0x9d23f519,0x6319c9cc,0x88048fc4,0x1e05a02d } },
  111910. /* 43 */
  111911. { { 0xd4d5ffe8,0x75cc8e2e,0xdbea17f2,0xf8bb4896,0xcee3cb4a,0x35059790,
  111912. 0xa47c6165,0x4c06ee85,0x92935d2f,0xf98fff25,0x32ffd7c7,0x34c4a572 },
  111913. { 0xea0376a2,0xc4b14806,0x4f115e02,0x2ea5e750,0x1e55d7c0,0x532d76e2,
  111914. 0xf31044da,0x68dc9411,0x71b77993,0x9272e465,0x93a8cfd5,0xadaa38bb } },
  111915. /* 44 */
  111916. { { 0x7d4ed72a,0x4bf0c712,0xba1f79a3,0xda0e9264,0xf4c39ea4,0x48c0258b,
  111917. 0x2a715138,0xa5394ed8,0xbf06c660,0x4af511ce,0xec5c37cd,0xfcebceef },
  111918. { 0x779ae8c1,0xf23b75aa,0xad1e606e,0xdeff59cc,0x22755c82,0xf3f526fd,
  111919. 0xbb32cefd,0x64c5ab44,0x915bdefd,0xa96e11a2,0x1143813e,0xab19746a } },
  111920. /* 45 */
  111921. { { 0xec837d7d,0x43c78585,0xb8ee0ba4,0xca5b6fbc,0xd5dbb5ee,0x34e924d9,
  111922. 0xbb4f1ca5,0x3f4fa104,0x398640f7,0x15458b72,0xd7f407ea,0x4231faa9 },
  111923. { 0xf96e6896,0x53e0661e,0xd03b0f9d,0x554e4c69,0x9c7858d1,0xd4fcb07b,
  111924. 0x52cb04fa,0x7e952793,0x8974e7f7,0x5f5f1574,0x6b6d57c8,0x2e3fa558 } },
  111925. /* 46 */
  111926. { { 0x6a9951a8,0x42cd4803,0x42792ad0,0xa8b15b88,0xabb29a73,0x18e8bcf9,
  111927. 0x409933e8,0xbfd9a092,0xefb88dc4,0x760a3594,0x40724458,0x14418863 },
  111928. { 0x99caedc7,0x162a56ee,0x91d101c9,0x8fb12ecd,0x393202da,0xea671967,
  111929. 0xa4ccd796,0x1aac8c4a,0x1cf185a8,0x7db05036,0x8cfd095a,0x0c9f86cd } },
  111930. /* 47 */
  111931. { { 0x10b2a556,0x9a728147,0x327b70b2,0x767ca964,0x5e3799b7,0x04ed9e12,
  111932. 0x22a3eb2a,0x6781d2dc,0x0d9450ac,0x5bd116eb,0xa7ebe08a,0xeccac1fc },
  111933. { 0xdc2d6e94,0xde68444f,0x35ecf21b,0x3621f429,0x29e03a2c,0x14e2d543,
  111934. 0x7d3e7f0a,0x53e42cd5,0x73ed00b9,0xbba26c09,0xc57d2272,0x00297c39 } },
  111935. /* 48 */
  111936. { { 0xb8243a7d,0x3aaaab10,0x8fa58c5b,0x6eeef93e,0x9ae7f764,0xf866fca3,
  111937. 0x61ab04d3,0x64105a26,0x03945d66,0xa3578d8a,0x791b848c,0xb08cd3e4 },
  111938. { 0x756d2411,0x45edc5f8,0xa755128c,0xd4a790d9,0x49e5f6a0,0xc2cf0963,
  111939. 0xf649beaa,0xc66d267d,0x8467039e,0x3ce6d968,0x42f7816f,0x50046c6b } },
  111940. /* 49 */
  111941. { { 0x66425043,0x92ae1602,0xf08db890,0x1ff66afd,0x8f162ce5,0x386f5a7f,
  111942. 0xfcf5598f,0x18d2dea0,0x1a8ca18e,0x78372b3a,0x8cd0e6f7,0xdf0d20eb },
  111943. { 0x75bb4045,0x7edd5e1d,0xb96d94b7,0x252a47ce,0x2c626776,0xbdb29358,
  111944. 0x40dd1031,0x853c3943,0x7d5f47fd,0x9dc9becf,0xbae4044a,0x27c2302f } },
  111945. /* 50 */
  111946. { { 0x8f2d49ce,0x2d1d208a,0x162df0a2,0x0d91aa02,0x09a07f65,0x9c5cce87,
  111947. 0x84339012,0xdf07238b,0x419442cd,0x5028e2c8,0x72062aba,0x2dcbd358 },
  111948. { 0xe4680967,0xb5fbc3cb,0x9f92d72c,0x2a7bc645,0x116c369d,0x806c76e1,
  111949. 0x3177e8d8,0x5c50677a,0x4569df57,0x753739eb,0x36c3f40b,0x2d481ef6 } },
  111950. /* 51 */
  111951. { { 0xfea1103e,0x1a2d39fd,0x95f81b17,0xeaae5592,0xf59b264a,0xdbd0aa18,
  111952. 0xcb592ee0,0x90c39c1a,0x9750cca3,0xdf62f80d,0xdf97cc6c,0xda4d8283 },
  111953. { 0x1e201067,0x0a6dd346,0x69fb1f6b,0x1531f859,0x1d60121f,0x4895e552,
  111954. 0x4c041c91,0x0b21aab0,0xbcc1ccf8,0x9d896c46,0x3141bde7,0xd24da3b3 } },
  111955. /* 52 */
  111956. { { 0x53b0a354,0x575a0537,0x0c6ddcd8,0x392ff2f4,0x56157b94,0x0b8e8cff,
  111957. 0x3b1b80d1,0x073e57bd,0x3fedee15,0x2a75e0f0,0xaa8e6f19,0x752380e4 },
  111958. { 0x6558ffe9,0x1f4e227c,0x19ec5415,0x3a348618,0xf7997085,0xab382d5e,
  111959. 0xddc46ac2,0x5e6deaff,0xfc8d094c,0xe5144078,0xf60e37c6,0xf674fe51 } },
  111960. /* 53 */
  111961. { { 0xaf63408f,0x6fb87ae5,0xcd75a737,0xa39c36a9,0xcf4c618d,0x7833313f,
  111962. 0xf034c88d,0xfbcd4482,0x39b35288,0x4469a761,0x66b5d9c9,0x77a711c5 },
  111963. { 0x944f8d65,0x4a695dc7,0x161aaba8,0xe6da5f65,0x24601669,0x8654e9c3,
  111964. 0x28ae7491,0xbc8b93f5,0x8f5580d8,0x5f1d1e83,0xcea32cc8,0x8ccf9a1a } },
  111965. /* 54 */
  111966. { { 0x7196fee2,0x28ab110c,0x874c8945,0x75799d63,0x29aedadd,0xa2629348,
  111967. 0x2be88ff4,0x9714cc7b,0xd58d60d6,0xf71293cf,0x32a564e9,0xda6b6cb3 },
  111968. { 0x3dd821c2,0xf43fddb1,0x90dd323d,0xf2f2785f,0x048489f8,0x91246419,
  111969. 0xd24c6749,0x61660f26,0xc803c15c,0x961d9e8c,0xfaadc4c9,0x631c6158 } },
  111970. /* 55 */
  111971. { { 0xfd752366,0xacf2ebe0,0x139be88b,0xb93c340e,0x0f20179e,0x98f66485,
  111972. 0xff1da785,0x14820254,0x4f85c16e,0x5278e276,0x7aab1913,0xa246ee45 },
  111973. { 0x53763b33,0x43861eb4,0x45c0bc0d,0xc49f03fc,0xad6b1ea1,0xafff16bc,
  111974. 0x6fd49c99,0xce33908b,0xf7fde8c3,0x5c51e9bf,0xff142c5e,0x076a7a39 } },
  111975. /* 56 */
  111976. { { 0x9e338d10,0x04639dfe,0xf42b411b,0x8ee6996f,0xa875cef2,0x960461d1,
  111977. 0x95b4d0ba,0x1057b6d6,0xa906e0bc,0x27639252,0xe1c20f8a,0x2c19f09a },
  111978. { 0xeef4c43d,0x5b8fc3f0,0x07a84aa9,0xe2e1b1a8,0x835d2bdb,0x5f455528,
  111979. 0x207132dd,0x0f4aee4d,0x3907f675,0xe9f8338c,0x0e0531f0,0x7a874dc9 } },
  111980. /* 57 */
  111981. { { 0x97c27050,0x84b22d45,0x59e70bf8,0xbd0b8df7,0x79738b9b,0xb4d67405,
  111982. 0xcd917c4f,0x47f4d5f5,0x13ce6e33,0x9099c4ce,0x521d0f8b,0x942bfd39 },
  111983. { 0xa43b566d,0x5028f0f6,0x21bff7de,0xaf6e8669,0xc44232cd,0x83f6f856,
  111984. 0xf915069a,0x65680579,0xecfecb85,0xd12095a2,0xdb01ba16,0xcf7f06ae } },
  111985. /* 58 */
  111986. { { 0x8ef96c80,0x0f56e3c4,0x3ddb609c,0xd521f2b3,0x7dc1450d,0x2be94102,
  111987. 0x02a91fe2,0x2d21a071,0x1efa37de,0x2e6f74fa,0x156c28a1,0x9a9a90b8 },
  111988. { 0x9dc7dfcb,0xc54ea9ea,0x2c2c1d62,0xc74e66fc,0x49d3e067,0x9f23f967,
  111989. 0x54dd38ad,0x1c7c3a46,0x5946cee3,0xc7005884,0x45cc045d,0x89856368 } },
  111990. /* 59 */
  111991. { { 0xfce73946,0x29da7cd4,0x23168563,0x8f697db5,0xcba92ec6,0x8e235e9c,
  111992. 0x9f91d3ea,0x55d4655f,0xaa50a6cd,0xf3689f23,0x21e6a1a0,0xdcf21c26 },
  111993. { 0x61b818bf,0xcffbc82e,0xda47a243,0xc74a2f96,0x8bc1a0cf,0x234e980a,
  111994. 0x7929cb6d,0xf35fd6b5,0xefe17d6c,0x81468e12,0x58b2dafb,0xddea6ae5 } },
  111995. /* 60 */
  111996. { { 0x7e787b2e,0x294de887,0x39a9310d,0x258acc1f,0xac14265d,0x92d9714a,
  111997. 0x708b48a0,0x18b5591c,0xe1abbf71,0x27cc6bb0,0x568307b9,0xc0581fa3 },
  111998. { 0xf24d4d58,0x9e0f58a3,0xe0ce2327,0xfebe9bb8,0x9d1be702,0x91fd6a41,
  111999. 0xfacac993,0x9a7d8a45,0x9e50d66d,0xabc0a08c,0x06498201,0x02c342f7 } },
  112000. /* 61 */
  112001. { { 0x157bdbc2,0xccd71407,0xad0e1605,0x72fa89c6,0xb92a015f,0xb1d3da2b,
  112002. 0xa0a3fe56,0x8ad9e7cd,0x24f06737,0x160edcbd,0x61275be6,0x79d4db33 },
  112003. { 0x5f3497c4,0xd3d31fd9,0x04192fb0,0x8cafeaee,0x13a50af3,0xe13ca745,
  112004. 0x8c85aae5,0x18826167,0x9eb556ff,0xce06cea8,0xbdb549f3,0x2eef1995 } },
  112005. /* 62 */
  112006. { { 0x50596edc,0x8ed7d3eb,0x905243a2,0xaa359362,0xa4b6d02b,0xa212c2c2,
  112007. 0xc4fbec68,0x611fd727,0xb84f733d,0x8a0b8ff7,0x5f0daf0e,0xd85a6b90 },
  112008. { 0xd4091cf7,0x60e899f5,0x2eff2768,0x4fef2b67,0x10c33964,0xc1f195cb,
  112009. 0x93626a8f,0x8275d369,0x0d6c840a,0xc77904f4,0x7a868acd,0x88d8b7fd } },
  112010. /* 63 */
  112011. { { 0x7bd98425,0x85f23723,0xc70b154e,0xd4463992,0x96687a2e,0xcbb00ee2,
  112012. 0xc83214fd,0x905fdbf7,0x13593684,0x2019d293,0xef51218e,0x0428c393 },
  112013. { 0x981e909a,0x40c7623f,0x7be192da,0x92513385,0x4010907e,0x48fe480f,
  112014. 0x3120b459,0xdd7a187c,0xa1fd8f3c,0xc9d7702d,0xe358efc5,0x66e4753b } },
  112015. /* 64 */
  112016. { { 0x16973cf4,0x070d34e1,0x7e4f34f7,0x20aee08b,0x5eb8ad29,0x269af9b9,
  112017. 0xa6a45dda,0xdde0a036,0x63df41e0,0xa18b528e,0xa260df2a,0x03cc71b2 },
  112018. { 0xa06b1dd7,0x24a6770a,0x9d2675d3,0x5bfa9c11,0x96844432,0x73c1e2a1,
  112019. 0x131a6cf0,0x3660558d,0x2ee79454,0xb0289c83,0xc6d8ddcd,0xa6aefb01 } },
  112020. /* 65 */
  112021. { { 0x01ab5245,0xba1464b4,0xc48d93ff,0x9b8d0b6d,0x93ad272c,0x939867dc,
  112022. 0xae9fdc77,0xbebe085e,0x894ea8bd,0x73ae5103,0x39ac22e1,0x740fc89a },
  112023. { 0x28e23b23,0x5e28b0a3,0xe13104d0,0x2352722e,0xb0a2640d,0xf4667a18,
  112024. 0x49bb37c3,0xac74a72e,0xe81e183a,0x79f734f0,0x3fd9c0eb,0xbffe5b6c } },
  112025. /* 66 */
  112026. { { 0xc6a2123f,0xb1a358f5,0xfe28df6d,0x927b2d95,0xf199d2f9,0x89702753,
  112027. 0x1a3f82dc,0x0a73754c,0x777affe1,0x063d029d,0xdae6d34d,0x5439817e },
  112028. { 0x6b8b83c4,0xf7979eef,0x9d945682,0x615cb214,0xc5e57eae,0x8f0e4fac,
  112029. 0x113047dd,0x042b89b8,0x93f36508,0x888356dc,0x5fd1f32f,0xbf008d18 } },
  112030. /* 67 */
  112031. { { 0x4e8068db,0x8012aa24,0xa5729a47,0xc72cc641,0x43f0691d,0x3c33df2c,
  112032. 0x1d92145f,0xfa057347,0xb97f7946,0xaefc0f2f,0x2f8121bf,0x813d75cb },
  112033. { 0x4383bba6,0x05613c72,0xa4224b3f,0xa924ce70,0x5f2179a6,0xe59cecbe,
  112034. 0x79f62b61,0x78e2e8aa,0x53ad8079,0x3ac2cc3b,0xd8f4fa96,0x55518d71 } },
  112035. /* 68 */
  112036. { { 0x00623f3b,0x03cf2922,0x5f29ebff,0x095c7111,0x80aa6823,0x42d72247,
  112037. 0x7458c0b0,0x044c7ba1,0x0959ec20,0xca62f7ef,0xf8ca929f,0x40ae2ab7 },
  112038. { 0xa927b102,0xb8c5377a,0xdc031771,0x398a86a0,0xc216a406,0x04908f9d,
  112039. 0x918d3300,0xb423a73a,0xe0b94739,0x634b0ff1,0x2d69f697,0xe29de725 } },
  112040. /* 69 */
  112041. { { 0x8435af04,0x744d1400,0xfec192da,0x5f255b1d,0x336dc542,0x1f17dc12,
  112042. 0x636a68a8,0x5c90c2a7,0x7704ca1e,0x960c9eb7,0x6fb3d65a,0x9de8cf1e },
  112043. { 0x511d3d06,0xc60fee0d,0xf9eb52c7,0x466e2313,0x206b0914,0x743c0f5f,
  112044. 0x2191aa4d,0x42f55bac,0xffebdbc2,0xcefc7c8f,0xe6e8ed1c,0xd4fa6081 } },
  112045. /* 70 */
  112046. { { 0xb0ab9645,0xb5e405d3,0xd5f1f711,0xaeec7f98,0x585c2a6e,0x8ad42311,
  112047. 0x512c6944,0x045acb9e,0xa90db1c6,0xae106c4e,0x898e6563,0xb89f33d5 },
  112048. { 0x7fed2ce4,0x43b07cd9,0xdd815b20,0xf9934e17,0x0a81a349,0x6778d4d5,
  112049. 0x52918061,0x9e616ade,0xd7e67112,0xfa06db06,0x88488091,0x1da23cf1 } },
  112050. /* 71 */
  112051. { { 0x42f2c4b5,0x821c46b3,0x66059e47,0x931513ef,0x66f50cd1,0x7030ae43,
  112052. 0x43e7b127,0x43b536c9,0x5fca5360,0x006258cf,0x6b557abf,0xe4e3ee79 },
  112053. { 0x24c8b22f,0xbb6b3900,0xfcbf1054,0x2eb5e2c1,0x567492af,0x937b18c9,
  112054. 0xacf53957,0xf09432e4,0x1dbf3a56,0x585f5a9d,0xbe0887cf,0xf86751fd } },
  112055. /* 72 */
  112056. { { 0x9d10e0b2,0x157399cb,0x60dc51b7,0x1c0d5956,0x1f583090,0x1d496b8a,
  112057. 0x88590484,0x6658bc26,0x03213f28,0x88c08ab7,0x7ae58de4,0x8d2e0f73 },
  112058. { 0x486cfee6,0x9b79bc95,0xe9e5bc57,0x036a26c7,0xcd8ae97a,0x1ad03601,
  112059. 0xff3a0494,0x06907f87,0x2c7eb584,0x078f4bbf,0x7e8d0a5a,0xe3731bf5 } },
  112060. /* 73 */
  112061. { { 0xe1cd0abe,0x72f2282b,0x87efefa2,0xd4f9015e,0x6c3834bd,0x9d189806,
  112062. 0xb8a29ced,0x9c8cdcc1,0xfee82ebc,0x0601b9f4,0x7206a756,0x371052bc },
  112063. { 0x46f32562,0x76fa1092,0x17351bb4,0xdaad534c,0xb3636bb5,0xc3d64c37,
  112064. 0x45d54e00,0x038a8c51,0x32c09e7c,0x301e6180,0x95735151,0x9764eae7 } },
  112065. /* 74 */
  112066. { { 0xcbd5256a,0x8791b19f,0x6ca13a3b,0x4007e0f2,0x4cf06904,0x03b79460,
  112067. 0xb6c17589,0xb18a9c22,0x81d45908,0xa1cb7d7d,0x21bb68f1,0x6e13fa9d },
  112068. { 0xa71e6e16,0x47183c62,0xe18749ed,0x5cf0ef8e,0x2e5ed409,0x2c9c7f9b,
  112069. 0xe6e117e1,0x042eeacc,0x13fb5a7f,0xb86d4816,0xc9e5feb1,0xea1cf0ed } },
  112070. /* 75 */
  112071. { { 0xcea4cc9b,0x6e6573c9,0xafcec8f3,0x5417961d,0xa438b6f6,0x804bf02a,
  112072. 0xdcd4ea88,0xb894b03c,0x3799571f,0xd0f807e9,0x862156e8,0x3466a7f5 },
  112073. { 0x56515664,0x51e59acd,0xa3c5eb0b,0x55b0f93c,0x6a4279db,0x84a06b02,
  112074. 0xc5fae08e,0x5c850579,0xa663a1a2,0xcf07b8db,0xf46ffc8d,0x49a36bbc } },
  112075. /* 76 */
  112076. { { 0x46d93106,0xe47f5acc,0xaa897c9c,0x65b7ade0,0x12d7e4be,0x37cf4c94,
  112077. 0xd4b2caa9,0xa2ae9b80,0xe60357a3,0x5e7ce09c,0xc8ecd5f9,0x29f77667 },
  112078. { 0xa8a0b1c5,0xdf6868f5,0x62978ad8,0x240858cf,0xdc0002a1,0x0f7ac101,
  112079. 0xffe9aa05,0x1d28a9d7,0x5b962c97,0x744984d6,0x3d28c8b2,0xa8a7c00b } },
  112080. /* 77 */
  112081. { { 0xae11a338,0x7c58a852,0xd1af96e7,0xa78613f1,0x5355cc73,0x7e9767d2,
  112082. 0x792a2de6,0x6ba37009,0x124386b2,0x7d60f618,0x11157674,0xab09b531 },
  112083. { 0x98eb9dd0,0x95a04841,0x15070328,0xe6c17acc,0x489c6e49,0xafc6da45,
  112084. 0xbb211530,0xab45a60a,0x7d7ea933,0xc58d6592,0x095642c6,0xa3ef3c65 } },
  112085. /* 78 */
  112086. { { 0xdf010879,0x89d420e9,0x39576179,0x9d25255d,0xe39513b6,0x9cdefd50,
  112087. 0xd5d1c313,0xe4efe45b,0x3f7af771,0xc0149de7,0x340ab06b,0x55a6b4f4 },
  112088. { 0xebeaf771,0xf1325251,0x878d4288,0x2ab44128,0x18e05afe,0xfcd5832e,
  112089. 0xcc1fb62b,0xef52a348,0xc1c4792a,0x2bd08274,0x877c6dc7,0x345c5846 } },
  112090. /* 79 */
  112091. { { 0xbea65e90,0xde15ceb0,0x2416d99c,0x0987f72b,0xfd863dec,0x44db578d,
  112092. 0xac6a3578,0xf617b74b,0xdb48e999,0x9e62bd7a,0xeab1a1be,0x877cae61 },
  112093. { 0x3a358610,0x23adddaa,0x325e2b07,0x2fc4d6d1,0x1585754e,0x897198f5,
  112094. 0xb392b584,0xf741852c,0xb55f7de1,0x9927804c,0x1aa8efae,0xe9e6c4ed } },
  112095. /* 80 */
  112096. { { 0x98683186,0x867db639,0xddcc4ea9,0xfb5cf424,0xd4f0e7bd,0xcc9a7ffe,
  112097. 0x7a779f7e,0x7c57f71c,0xd6b25ef2,0x90774079,0xb4081680,0x90eae903 },
  112098. { 0x0ee1fceb,0xdf2aae5e,0xe86c1a1f,0x3ff1da24,0xca193edf,0x80f587d6,
  112099. 0xdc9b9d6a,0xa5695523,0x85920303,0x7b840900,0xba6dbdef,0x1efa4dfc } },
  112100. /* 81 */
  112101. { { 0xe0540015,0xfbd838f9,0xc39077dc,0x2c323946,0xad619124,0x8b1fb9e6,
  112102. 0x0ca62ea8,0x9612440c,0x2dbe00ff,0x9ad9b52c,0xae197643,0xf52abaa1 },
  112103. { 0x2cac32ad,0xd0e89894,0x62a98f91,0xdfb79e42,0x276f55cb,0x65452ecf,
  112104. 0x7ad23e12,0xdb1ac0d2,0xde4986f0,0xf68c5f6a,0x82ce327d,0x389ac37b } },
  112105. /* 82 */
  112106. { { 0xf8e60f5b,0x511188b4,0x48aa2ada,0x7fe67015,0x381abca2,0xdb333cb8,
  112107. 0xdaf3fc97,0xb15e6d9d,0x36aabc03,0x4b24f6eb,0x72a748b4,0xc59789df },
  112108. { 0x29cf5279,0x26fcb8a5,0x01ad9a6c,0x7a3c6bfc,0x4b8bac9b,0x866cf88d,
  112109. 0x9c80d041,0xf4c89989,0x70add148,0xf0a04241,0x45d81a41,0x5a02f479 } },
  112110. /* 83 */
  112111. { { 0xc1c90202,0xfa5c877c,0xf8ac7570,0xd099d440,0xd17881f7,0x428a5b1b,
  112112. 0x5b2501d7,0x61e267db,0xf2e4465b,0xf889bf04,0x76aa4cb8,0x4da3ae08 },
  112113. { 0xe3e66861,0x3ef0fe26,0x3318b86d,0x5e772953,0x747396df,0xc3c35fbc,
  112114. 0x439ffd37,0x5115a29c,0xb2d70374,0xbfc4bd97,0x56246b9d,0x088630ea } },
  112115. /* 84 */
  112116. { { 0xb8a9e8c9,0xcd96866d,0x5bb8091e,0xa11963b8,0x045b3cd2,0xc7f90d53,
  112117. 0x80f36504,0x755a72b5,0x21d3751c,0x46f8b399,0x53c193de,0x4bffdc91 },
  112118. { 0xb89554e7,0xcd15c049,0xf7a26be6,0x353c6754,0xbd41d970,0x79602370,
  112119. 0x12b176c0,0xde16470b,0x40c8809d,0x56ba1175,0xe435fb1e,0xe2db35c3 } },
  112120. /* 85 */
  112121. { { 0x6328e33f,0xd71e4aab,0xaf8136d1,0x5486782b,0x86d57231,0x07a4995f,
  112122. 0x1651a968,0xf1f0a5bd,0x76803b6d,0xa5dc5b24,0x42dda935,0x5c587cbc },
  112123. { 0xbae8b4c0,0x2b6cdb32,0xb1331138,0x66d1598b,0x5d7e9614,0x4a23b2d2,
  112124. 0x74a8c05d,0x93e402a6,0xda7ce82e,0x45ac94e6,0xe463d465,0xeb9f8281 } },
  112125. /* 86 */
  112126. { { 0xfecf5b9b,0x34e0f9d1,0xf206966a,0xa115b12b,0x1eaa0534,0x5591cf3b,
  112127. 0xfb1558f9,0x5f0293cb,0x1bc703a5,0x1c8507a4,0x862c1f81,0x92e6b81c },
  112128. { 0xcdaf24e3,0xcc9ebc66,0x72fcfc70,0x68917ecd,0x8157ba48,0x6dc9a930,
  112129. 0xb06ab2b2,0x5d425c08,0x36e929c4,0x362f8ce7,0x62e89324,0x09f6f57c } },
  112130. /* 87 */
  112131. { { 0xd29375fb,0x1c7d6b78,0xe35d1157,0xfabd851e,0x4243ea47,0xf6f62dcd,
  112132. 0x8fe30b0f,0x1dd92460,0xffc6e709,0x08166dfa,0x0881e6a7,0xc6c4c693 },
  112133. { 0xd6a53fb0,0x20368f87,0x9eb4d1f9,0x38718e9f,0xafd7e790,0x03f08acd,
  112134. 0x72fe2a1c,0x0835eb44,0x88076e5d,0x7e050903,0xa638e731,0x538f765e } },
  112135. /* 88 */
  112136. { { 0xc2663b4b,0x0e0249d9,0x47cd38dd,0xe700ab5b,0x2c46559f,0xb192559d,
  112137. 0x4bcde66d,0x8f9f74a8,0x3e2aced5,0xad161523,0x3dd03a5b,0xc155c047 },
  112138. { 0x3be454eb,0x346a8799,0x83b7dccd,0x66ee94db,0xab9d2abe,0x1f6d8378,
  112139. 0x7733f355,0x4a396dd2,0xf53553c2,0x419bd40a,0x731dd943,0xd0ead98d } },
  112140. /* 89 */
  112141. { { 0xec142408,0x908e0b0e,0x4114b310,0x98943cb9,0x1742b1d7,0x03dbf7d8,
  112142. 0x693412f4,0xd270df6b,0x8f69e20c,0xc5065494,0x697e43a1,0xa76a90c3 },
  112143. { 0x4624825a,0xe0fa3384,0x8acc34c2,0x82e48c0b,0xe9a14f2b,0x7b24bd14,
  112144. 0x4db30803,0x4f5dd5e2,0x932da0a3,0x0c77a9e7,0x74c653dc,0x20db90f2 } },
  112145. /* 90 */
  112146. { { 0x0e6c5fd9,0x261179b7,0x6c982eea,0xf8bec123,0xd4957b7e,0x47683338,
  112147. 0x0a72f66a,0xcc47e664,0x1bad9350,0xbd54bf6a,0xf454e95a,0xdfbf4c6a },
  112148. { 0x6907f4fa,0x3f7a7afa,0x865ca735,0x7311fae0,0x2a496ada,0x24737ab8,
  112149. 0x15feb79b,0x13e425f1,0xa1b93c21,0xe9e97c50,0x4ddd3eb5,0xb26b6eac } },
  112150. /* 91 */
  112151. { { 0x2a2e5f2b,0x81cab9f5,0xbf385ac4,0xf93caf29,0xc909963a,0xf4bf35c3,
  112152. 0x74c9143c,0x081e7300,0xc281b4c5,0x3ea57fa8,0x9b340741,0xe497905c },
  112153. { 0x55ab3cfb,0xf556dd8a,0x518db6ad,0xd444b96b,0x5ef4b955,0x34f5425a,
  112154. 0xecd26aa3,0xdda7a3ac,0xda655e97,0xb57da11b,0xc2024c70,0x02da3eff } },
  112155. /* 92 */
  112156. { { 0x6481d0d9,0xe24b0036,0x818fdfe2,0x3740dbe5,0x190fda00,0xc1fc1f45,
  112157. 0x3cf27fde,0x329c9280,0x6934f43e,0x7435cb53,0x7884e8fe,0x2b505a5d },
  112158. { 0x711adcc9,0x6cfcc6a6,0x531e21e1,0xf034325c,0x9b2a8a99,0xa2f4a967,
  112159. 0x3c21bdff,0x9d5f3842,0x31b57d66,0xb25c7811,0x0b8093b9,0xdb5344d8 } },
  112160. /* 93 */
  112161. { { 0xae50a2f5,0x0d72e667,0xe4a861d1,0x9b7f8d8a,0x330df1cb,0xa129f70f,
  112162. 0xe04fefc3,0xe90aa5d7,0xe72c3ae1,0xff561ecb,0xcdb955fa,0x0d8fb428 },
  112163. { 0xd7663784,0xd2235f73,0x7e2c456a,0xc05baec6,0x2adbfccc,0xe5c292e4,
  112164. 0xefb110d5,0x4fd17988,0xd19d49f3,0x27e57734,0x84f679fe,0x188ac4ce } },
  112165. /* 94 */
  112166. { { 0xa796c53e,0x7ee344cf,0x0868009b,0xbbf6074d,0x474a1295,0x1f1594f7,
  112167. 0xac11632d,0x66776edc,0x04e2fa5a,0x1862278b,0xc854a89a,0x52665cf2 },
  112168. { 0x8104ab58,0x7e376464,0x7204fd6d,0x16775913,0x44ea1199,0x86ca06a5,
  112169. 0x1c9240dd,0xaa3f765b,0x24746149,0x5f8501a9,0xdcd251d7,0x7b982e30 } },
  112170. /* 95 */
  112171. { { 0xc15f3060,0xe44e9efc,0xa87ebbe6,0x5ad62f2e,0xc79500d4,0x36499d41,
  112172. 0x336fa9d1,0xa66d6dc0,0x5afd3b1f,0xf8afc495,0xe5c9822b,0x1d8ccb24 },
  112173. { 0x79d7584b,0x4031422b,0xea3f20dd,0xc54a0580,0x958468c5,0x3f837c8f,
  112174. 0xfbea7735,0x3d82f110,0x7dffe2fc,0x679a8778,0x20704803,0x48eba63b } },
  112175. /* 96 */
  112176. { { 0xdf46e2f6,0x89b10d41,0x19514367,0x13ab57f8,0x1d469c87,0x067372b9,
  112177. 0x4f6c5798,0x0c195afa,0x272c9acf,0xea43a12a,0x678abdac,0x9dadd8cb },
  112178. { 0xe182579a,0xcce56c6b,0x2d26c2d8,0x86febadb,0x2a44745c,0x1c668ee1,
  112179. 0x98dc047a,0x580acd86,0x51b9ec2d,0x5a2b79cc,0x4054f6a0,0x007da608 } },
  112180. /* 97 */
  112181. { { 0x17b00dd0,0x9e3ca352,0x0e81a7a6,0x046779cb,0xd482d871,0xb999fef3,
  112182. 0xd9233fbc,0xe6f38134,0xf48cd0e0,0x112c3001,0x3c6c66ae,0x934e7576 },
  112183. { 0xd73234dc,0xb44d4fc3,0x864eafc1,0xfcae2062,0x26bef21a,0x843afe25,
  112184. 0xf3b75fdf,0x61355107,0x794c2e6b,0x8367a5aa,0x8548a372,0x3d2629b1 } },
  112185. /* 98 */
  112186. { { 0x437cfaf8,0x6230618f,0x2032c299,0x5b8742cb,0x2293643a,0x949f7247,
  112187. 0x09464f79,0xb8040f1a,0x4f254143,0x049462d2,0x366c7e76,0xabd6b522 },
  112188. { 0xd5338f55,0x119b392b,0x01495a0c,0x1a80a9ce,0xf8d7537e,0xf3118ca7,
  112189. 0x6bf4b762,0xb715adc2,0xa8482b6c,0x24506165,0x96a7c84d,0xd958d7c6 } },
  112190. /* 99 */
  112191. { { 0xbdc21f31,0x9ad8aa87,0x8063e58c,0xadb3cab4,0xb07dd7b8,0xefd86283,
  112192. 0x1be7c6b4,0xc7b9b762,0x015582de,0x2ef58741,0x299addf3,0xc970c52e },
  112193. { 0x22f24d66,0x78f02e2a,0x74cc100a,0xefec1d10,0x09316e1a,0xaf2a6a39,
  112194. 0x5849dd49,0xce7c2205,0x96bffc4c,0x9c1fe75c,0x7ba06ec0,0xcad98fd2 } },
  112195. /* 100 */
  112196. { { 0xb648b73e,0xed76e2d0,0x1cfd285e,0xa9f92ce5,0x2ed13de1,0xa8c86c06,
  112197. 0xa5191a93,0x1d3a574e,0x1ad1b8bf,0x385cdf8b,0x47d2cfe3,0xbbecc28a },
  112198. { 0x69cec548,0x98d326c0,0xf240a0b2,0x4f5bc1dd,0x29057236,0x241a7062,
  112199. 0xc68294a4,0x0fc6e9c5,0xa319f17a,0x4d04838b,0x9ffc1c6f,0x8b612cf1 } },
  112200. /* 101 */
  112201. { { 0x4c3830eb,0x9bb0b501,0x8ee0d0c5,0x3d08f83c,0x79ba9389,0xa4a62642,
  112202. 0x9cbc2914,0x5d5d4044,0x074c46f0,0xae9eb83e,0x74ead7d6,0x63bb758f },
  112203. { 0xc6bb29e0,0x1c40d2ea,0x4b02f41e,0x95aa2d87,0x53cb199a,0x92989175,
  112204. 0x51584f6d,0xdd91bafe,0x31a1aaec,0x3715efb9,0x46780f9e,0xc1b6ae5b } },
  112205. /* 102 */
  112206. { { 0x42772f41,0xcded3e4b,0x3bcb79d1,0x3a700d5d,0x80feee60,0x4430d50e,
  112207. 0xf5e5d4bb,0x444ef1fc,0xe6e358ff,0xc660194f,0x6a91b43c,0xe68a2f32 },
  112208. { 0x977fe4d2,0x5842775c,0x7e2a41eb,0x78fdef5c,0xff8df00e,0x5f3bec02,
  112209. 0x5852525d,0xf4b840cd,0x4e6988bd,0x0870483a,0xcc64b837,0x39499e39 } },
  112210. /* 103 */
  112211. { { 0xb08df5fe,0xfc05de80,0x63ba0362,0x0c12957c,0xd5cf1428,0xea379414,
  112212. 0x54ef6216,0xc559132a,0xb9e65cf8,0x33d5f12f,0x1695d663,0x09c60278 },
  112213. { 0x61f7a2fb,0x3ac1ced4,0xd4f5eeb8,0xdd838444,0x8318fcad,0x82a38c6c,
  112214. 0xe9f1a864,0x315be2e5,0x442daf47,0x317b5771,0x95aa5f9e,0x81b5904a } },
  112215. /* 104 */
  112216. { { 0x8b21d232,0x6b6b1c50,0x8c2cba75,0x87f3dbc0,0xae9f0faf,0xa7e74b46,
  112217. 0xbb7b8079,0x036a0985,0x8d974a25,0x4f185b90,0xd9af5ec9,0x5aa7cef0 },
  112218. { 0x57dcfffc,0xe0566a70,0xb8453225,0x6ea311da,0x23368aa9,0x72ea1a8d,
  112219. 0x48cd552d,0xed9b2083,0xc80ea435,0xb987967c,0x6c104173,0xad735c75 } },
  112220. /* 105 */
  112221. { { 0xcee76ef4,0xaea85ab3,0xaf1d2b93,0x44997444,0xeacb923f,0x0851929b,
  112222. 0x51e3bc0c,0xb080b590,0x59be68a2,0xc4ee1d86,0x64b26cda,0xf00de219 },
  112223. { 0xf2e90d4d,0x8d7fb5c0,0x77d9ec64,0x00e219a7,0x5d1c491c,0xc4e6febd,
  112224. 0x1a8f4585,0x080e3754,0x48d2af9c,0x4a9b86c8,0xb6679851,0x2ed70db6 } },
  112225. /* 106 */
  112226. { { 0x586f25cb,0xaee44116,0xa0fcf70f,0xf7b6861f,0x18a350e8,0x55d2cd20,
  112227. 0x92dc286f,0x861bf3e5,0x6226aba7,0x9ab18ffa,0xa9857b03,0xd15827be },
  112228. { 0x92e6acef,0x26c1f547,0xac1fbac3,0x422c63c8,0xfcbfd71d,0xa2d8760d,
  112229. 0xb2511224,0x35f6a539,0x048d1a21,0xbaa88fa1,0xebf999db,0x49f1abe9 } },
  112230. /* 107 */
  112231. { { 0xf7492b73,0x16f9f4f4,0xcb392b1a,0xcf28ec1e,0x69ca6ffc,0x45b130d4,
  112232. 0xb72efa58,0x28ba8d40,0x5ca066f5,0xace987c7,0x4ad022eb,0x3e399246 },
  112233. { 0x752555bb,0x63a2d84e,0x9c2ae394,0xaaa93b4a,0xc89539ca,0xcd80424e,
  112234. 0xaa119a99,0x6d6b5a6d,0x379f2629,0xbd50334c,0xef3cc7d3,0x899e925e } },
  112235. /* 108 */
  112236. { { 0xbf825dc4,0xb7ff3651,0x40b9c462,0x0f741cc4,0x5cc4fb5b,0x771ff5a9,
  112237. 0x47fd56fe,0xcb9e9c9b,0x5626c0d3,0xbdf053db,0xf7e14098,0xa97ce675 },
  112238. { 0x6c934f5e,0x68afe5a3,0xccefc46f,0x6cd5e148,0xd7a88586,0xc7758570,
  112239. 0xdd558d40,0x49978f5e,0x64ae00c1,0xa1d5088a,0xf1d65bb2,0x58f2a720 } },
  112240. /* 109 */
  112241. { { 0x3e4daedb,0x66fdda4a,0x65d1b052,0x38318c12,0x4c4bbf5c,0x28d910a2,
  112242. 0x78a9cd14,0x762fe5c4,0xd2cc0aee,0x08e5ebaa,0xca0c654c,0xd2cdf257 },
  112243. { 0x08b717d2,0x48f7c58b,0x386cd07a,0x3807184a,0xae7d0112,0x3240f626,
  112244. 0xc43917b0,0x03e9361b,0x20aea018,0xf261a876,0x7e1e6372,0x53f556a4 } },
  112245. /* 110 */
  112246. { { 0x2f512a90,0xc84cee56,0x1b0ea9f1,0x24b3c004,0xe26cc1ea,0x0ee15d2d,
  112247. 0xf0c9ef7d,0xd848762c,0xd5341435,0x1026e9c5,0xfdb16b31,0x8f5b73dc },
  112248. { 0xd2c75d95,0x1f69bef2,0xbe064dda,0x8d33d581,0x57ed35e6,0x8c024c12,
  112249. 0xc309c281,0xf8d435f9,0xd6960193,0xfd295061,0xe9e49541,0x66618d78 } },
  112250. /* 111 */
  112251. { { 0x8ce382de,0x571cfd45,0xde900dde,0x175806ee,0x34aba3b5,0x61849965,
  112252. 0xde7aec95,0xe899778a,0xff4aa97f,0xe8f00f6e,0x010b0c6d,0xae971cb5 },
  112253. { 0x3af788f1,0x1827eebc,0xe413fe2d,0xd46229ff,0x4741c9b4,0x8a15455b,
  112254. 0xf8e424eb,0x5f02e690,0xdae87712,0x40a1202e,0x64944f6d,0x49b3bda2 } },
  112255. /* 112 */
  112256. { { 0x035b2d69,0xd63c6067,0x6bed91b0,0xb507150d,0x7afb39b2,0x1f35f82f,
  112257. 0x16012b66,0xb9bd9c01,0xed0a5f50,0x00d97960,0x2716f7c9,0xed705451 },
  112258. { 0x127abdb4,0x1576eff4,0xf01e701c,0x6850d698,0x3fc87e2f,0x9fa7d749,
  112259. 0xb0ce3e48,0x0b6bcc6f,0xf7d8c1c0,0xf4fbe1f5,0x02719cc6,0xcf75230e } },
  112260. /* 113 */
  112261. { { 0x722d94ed,0x6761d6c2,0x3718820e,0xd1ec3f21,0x25d0e7c6,0x65a40b70,
  112262. 0xbaf3cf31,0xd67f830e,0xb93ea430,0x633b3807,0x0bc96c69,0x17faa0ea },
  112263. { 0xdf866b98,0xe6bf3482,0xa9db52d4,0x205c1ee9,0xff9ab869,0x51ef9bbd,
  112264. 0x75eeb985,0x3863dad1,0xd3cf442a,0xef216c3b,0xf9c8e321,0x3fb228e3 } },
  112265. /* 114 */
  112266. { { 0x0760ac07,0x94f9b70c,0x9d79bf4d,0xf3c9ccae,0xc5ffc83d,0x73cea084,
  112267. 0xdc49c38e,0xef50f943,0xbc9e7330,0xf467a2ae,0x44ea7fba,0x5ee534b6 },
  112268. { 0x03609e7f,0x20cb6272,0x62fdc9f0,0x09844355,0x0f1457f7,0xaf5c8e58,
  112269. 0xb4b25941,0xd1f50a6c,0x2ec82395,0x77cb247c,0xda3dca33,0xa5f3e1e5 } },
  112270. /* 115 */
  112271. { { 0x7d85fa94,0x023489d6,0x2db9ce47,0x0ba40537,0xaed7aad1,0x0fdf7a1f,
  112272. 0x9a4ccb40,0xa57b0d73,0x5b18967c,0x48fcec99,0xb7274d24,0xf30b5b6e },
  112273. { 0xc81c5338,0x7ccb4773,0xa3ed6bd0,0xb85639e6,0x1d56eada,0x7d9df95f,
  112274. 0x0a1607ad,0xe256d57f,0x957574d6,0x6da7ffdc,0x01c7a8c4,0x65f84046 } },
  112275. /* 116 */
  112276. { { 0xcba1e7f1,0x8d45d0cb,0x02b55f64,0xef0a08c0,0x17e19892,0x771ca31b,
  112277. 0x4885907e,0xe1843ecb,0x364ce16a,0x67797ebc,0x8df4b338,0x816d2b2d },
  112278. { 0x39aa8671,0xe870b0e5,0xc102b5f5,0x9f0db3e4,0x1720c697,0x34296659,
  112279. 0x613c0d2a,0x0ad4c89e,0x418ddd61,0x1af900b2,0xd336e20e,0xe087ca72 } },
  112280. /* 117 */
  112281. { { 0xaba10079,0x222831ff,0x6d64fff2,0x0dc5f87b,0x3e8cb330,0x44547907,
  112282. 0x702a33fb,0xe815aaa2,0x5fba3215,0x338d6b2e,0x79f549c8,0x0f7535cb },
  112283. { 0x2ee95923,0x471ecd97,0xc6d1c09f,0x1e868b37,0xc666ef4e,0x2bc7b8ec,
  112284. 0x808a4bfc,0xf5416589,0x3fbc4d2e,0xf23e9ee2,0x2d75125b,0x4357236c } },
  112285. /* 118 */
  112286. { { 0xba9cdb1b,0xfe176d95,0x2f82791e,0x45a1ca01,0x4de4cca2,0x97654af2,
  112287. 0x5cc4bcb9,0xbdbf9d0e,0xad97ac0a,0xf6a7df50,0x61359fd6,0xc52112b0 },
  112288. { 0x4f05eae3,0x696d9ce3,0xe943ac2b,0x903adc02,0x0848be17,0xa9075347,
  112289. 0x2a3973e5,0x1e20f170,0x6feb67e9,0xe1aacc1c,0xe16bc6b9,0x2ca0ac32 } },
  112290. /* 119 */
  112291. { { 0xef871eb5,0xffea12e4,0xa8bf0a7a,0x94c2f25d,0x78134eaa,0x4d1e4c2a,
  112292. 0x0360fb10,0x11ed16fb,0x85fc11be,0x4029b6db,0xf4d390fa,0x5e9f7ab7 },
  112293. { 0x30646612,0x5076d72f,0xdda1d0d8,0xa0afed1d,0x85a1d103,0x29022257,
  112294. 0x4e276bcd,0xcb499e17,0x51246c3d,0x16d1da71,0x589a0443,0xc72d56d3 } },
  112295. /* 120 */
  112296. { { 0xdae5bb45,0xdf5ffc74,0x261bd6dc,0x99068c4a,0xaa98ec7b,0xdc0afa7a,
  112297. 0xf121e96d,0xedd2ee00,0x1414045c,0x163cc7be,0x335af50e,0xb0b1bbce },
  112298. { 0x01a06293,0xd440d785,0x6552e644,0xcdebab7c,0x8c757e46,0x48cb8dbc,
  112299. 0x3cabe3cb,0x81f9cf78,0xb123f59a,0xddd02611,0xeeb3784d,0x3dc7b88e } },
  112300. /* 121 */
  112301. { { 0xc4741456,0xe1b8d398,0x6032a121,0xa9dfa902,0x1263245b,0x1cbfc86d,
  112302. 0x5244718c,0xf411c762,0x05b0fc54,0x96521d54,0xdbaa4985,0x1afab46e },
  112303. { 0x8674b4ad,0xa75902ba,0x5ad87d12,0x486b43ad,0x36e0d099,0x72b1c736,
  112304. 0xbb6cd6d6,0x39890e07,0x59bace4e,0x8128999c,0x7b535e33,0xd8da430b } },
  112305. /* 122 */
  112306. { { 0xc6b75791,0x39f65642,0x21806bfb,0x050947a6,0x1362ef84,0x0ca3e370,
  112307. 0x8c3d2391,0x9bc60aed,0x732e1ddc,0x9b488671,0xa98ee077,0x12d10d9e },
  112308. { 0x3651b7dc,0xb6f2822d,0x80abd138,0x6345a5ba,0x472d3c84,0x62033262,
  112309. 0xacc57527,0xd54a1d40,0x424447cb,0x6ea46b3a,0x2fb1a496,0x5bc41057 } },
  112310. /* 123 */
  112311. { { 0xa751cd0e,0xe70c57a3,0xeba3c7d6,0x190d8419,0x9d47d55a,0xb1c3bee7,
  112312. 0xf912c6d8,0xda941266,0x407a6ad6,0x12e9aacc,0x6e838911,0xd6ce5f11 },
  112313. { 0x70e1f2ce,0x063ca97b,0x8213d434,0xa3e47c72,0x84df810a,0xa016e241,
  112314. 0xdfd881a4,0x688ad7b0,0xa89bf0ad,0xa37d99fc,0xa23c2d23,0xd8e3f339 } },
  112315. /* 124 */
  112316. { { 0x750bed6f,0xbdf53163,0x83e68b0a,0x808abc32,0x5bb08a33,0x85a36627,
  112317. 0x6b0e4abe,0xf72a3a0f,0xfaf0c6ad,0xf7716d19,0x5379b25f,0x22dcc020 },
  112318. { 0xf9a56e11,0x7400bf8d,0x56a47f21,0x6cb8bad7,0x7a6eb644,0x7c97176f,
  112319. 0xd1f5b646,0xe8fd84f7,0x44ddb054,0x98320a94,0x1dde86f5,0x07071ba3 } },
  112320. /* 125 */
  112321. { { 0x98f8fcb9,0x6fdfa0e5,0x94d0d70c,0x89cec8e0,0x106d20a8,0xa0899397,
  112322. 0xba8acc9c,0x915bfb9a,0x5507e01c,0x1370c94b,0x8a821ffb,0x83246a60 },
  112323. { 0xbe3c378f,0xa8273a9f,0x35a25be9,0x7e544789,0x4dd929d7,0x6cfa4972,
  112324. 0x365bd878,0x987fed9d,0x5c29a7ae,0x4982ac94,0x5ddd7ec5,0x4589a5d7 } },
  112325. /* 126 */
  112326. { { 0xa95540a9,0x9fabb174,0x0162c5b0,0x7cfb886f,0xea3dee18,0x17be766b,
  112327. 0xe88e624c,0xff7da41f,0x8b919c38,0xad0b71eb,0xf31ff9a9,0x86a522e0 },
  112328. { 0x868bc259,0xbc8e6f72,0x3ccef9e4,0x6130c638,0x9a466555,0x09f1f454,
  112329. 0x19b2bfb4,0x8e6c0f09,0x0ca7bb22,0x945c46c9,0x4dafb67b,0xacd87168 } },
  112330. /* 127 */
  112331. { { 0x10c53841,0x090c72ca,0x55a4fced,0xc20ae01b,0xe10234ad,0x03f7ebd5,
  112332. 0x85892064,0xb3f42a6a,0xb4a14722,0xbdbc30c0,0x8ca124cc,0x971bc437 },
  112333. { 0x517ff2ff,0x6f79f46d,0xecba947b,0x6a9c96e2,0x62925122,0x5e79f2f4,
  112334. 0x6a4e91f1,0x30a96bb1,0x2d4c72da,0x1147c923,0x5811e4df,0x65bc311f } },
  112335. /* 128 */
  112336. { { 0x139b3239,0x87c7dd7d,0x4d833bae,0x8b57824e,0x9fff0015,0xbcbc4878,
  112337. 0x909eaf1a,0x8ffcef8b,0xf1443a78,0x9905f4ee,0xe15cbfed,0x020dd4a2 },
  112338. { 0xa306d695,0xca2969ec,0xb93caf60,0xdf940cad,0x87ea6e39,0x67f7fab7,
  112339. 0xf98c4fe5,0x0d0ee10f,0xc19cb91e,0xc646879a,0x7d1d7ab4,0x4b4ea50c } },
  112340. /* 129 */
  112341. { { 0x7a0db57e,0x19e40945,0x9a8c9702,0xe6017cad,0x1be5cff9,0xdbf739e5,
  112342. 0xa7a938a2,0x3646b3cd,0x68350dfc,0x04511085,0x56e098b5,0xad3bd6f3 },
  112343. { 0xee2e3e3e,0x935ebabf,0x473926cb,0xfbd01702,0x9e9fb5aa,0x7c735b02,
  112344. 0x2e3feff0,0xc52a1b85,0x046b405a,0x9199abd3,0x39039971,0xe306fcec } },
  112345. /* 130 */
  112346. { { 0x23e4712c,0xd6d9aec8,0xc3c198ee,0x7ca8376c,0x31bebd8a,0xe6d83187,
  112347. 0xd88bfef3,0xed57aff3,0xcf44edc7,0x72a645ee,0x5cbb1517,0xd4e63d0b },
  112348. { 0xceee0ecf,0x98ce7a1c,0x5383ee8e,0x8f012633,0xa6b455e8,0x3b879078,
  112349. 0xc7658c06,0xcbcd3d96,0x0783336a,0x721d6fe7,0x5a677136,0xf21a7263 } },
  112350. /* 131 */
  112351. { { 0x9586ba11,0x19d8b3cd,0x8a5c0480,0xd9e0aeb2,0x2230ef5c,0xe4261dbf,
  112352. 0x02e6bf09,0x095a9dee,0x80dc7784,0x8963723c,0x145157b1,0x5c97dbaf },
  112353. { 0x4bc4503e,0x97e74434,0x85a6b370,0x0fb1cb31,0xcd205d4b,0x3e8df2be,
  112354. 0xf8f765da,0x497dd1bc,0x6c988a1a,0x92ef95c7,0x64dc4cfa,0x3f924baa } },
  112355. /* 132 */
  112356. { { 0x7268b448,0x6bf1b8dd,0xefd79b94,0xd4c28ba1,0xe4e3551f,0x2fa1f8c8,
  112357. 0x5c9187a9,0x769e3ad4,0x40326c0d,0x28843b4d,0x50d5d669,0xfefc8094 },
  112358. { 0x90339366,0x30c85bfd,0x5ccf6c3a,0x4eeb56f1,0x28ccd1dc,0x0e72b149,
  112359. 0xf2ce978e,0x73ee85b5,0x3165bb23,0xcdeb2bf3,0x4e410abf,0x8106c923 } },
  112360. /* 133 */
  112361. { { 0x7d02f4ee,0xc8df0161,0x18e21225,0x8a781547,0x6acf9e40,0x4ea895eb,
  112362. 0x6e5a633d,0x8b000cb5,0x7e981ffb,0xf31d86d5,0x4475bc32,0xf5c8029c },
  112363. { 0x1b568973,0x764561ce,0xa62996ec,0x2f809b81,0xda085408,0x9e513d64,
  112364. 0xe61ce309,0xc27d815d,0x272999e0,0x0da6ff99,0xfead73f7,0xbd284779 } },
  112365. /* 134 */
  112366. { { 0x9b1cdf2b,0x6033c2f9,0xbc5fa151,0x2a99cf06,0x12177b3b,0x7d27d259,
  112367. 0xc4485483,0xb1f15273,0x102e2297,0x5fd57d81,0xc7f6acb7,0x3d43e017 },
  112368. { 0x3a70eb28,0x41a8bb0b,0x3e80b06b,0x67de2d8e,0x70c28de5,0x09245a41,
  112369. 0xa7b26023,0xad7dbcb1,0x2cbc6c1e,0x70b08a35,0x9b33041f,0xb504fb66 } },
  112370. /* 135 */
  112371. { { 0xf97a27c2,0xa8e85ab5,0xc10a011b,0x6ac5ec8b,0xffbcf161,0x55745533,
  112372. 0x65790a60,0x01780e85,0x99ee75b0,0xe451bf85,0x39c29881,0x8907a63b },
  112373. { 0x260189ed,0x76d46738,0x47bd35cb,0x284a4436,0x20cab61e,0xd74e8c40,
  112374. 0x416cf20a,0x6264bf8c,0x5fd820ce,0xfa5a6c95,0xf24bb5fc,0xfa7154d0 } },
  112375. /* 136 */
  112376. { { 0x9b3f5034,0x18482cec,0xcd9e68fd,0x962d445a,0x95746f23,0x266fb1d6,
  112377. 0x58c94a4b,0xc66ade5a,0xed68a5b6,0xdbbda826,0x7ab0d6ae,0x05664a4d },
  112378. { 0x025e32fc,0xbcd4fe51,0xa96df252,0x61a5aebf,0x31592a31,0xd88a07e2,
  112379. 0x98905517,0x5d9d94de,0x5fd440e7,0x96bb4010,0xe807db4c,0x1b0c47a2 } },
  112380. /* 137 */
  112381. { { 0x08223878,0x5c2a6ac8,0xe65a5558,0xba08c269,0x9bbc27fd,0xd22b1b9b,
  112382. 0x72b9607d,0x919171bf,0xe588dc58,0x9ab455f9,0x23662d93,0x6d54916e },
  112383. { 0x3b1de0c1,0x8da8e938,0x804f278f,0xa84d186a,0xd3461695,0xbf4988cc,
  112384. 0xe10eb0cb,0xf5eae3be,0xbf2a66ed,0x1ff8b68f,0xc305b570,0xa68daf67 } },
  112385. /* 138 */
  112386. { { 0x44b2e045,0xc1004cff,0x4b1c05d4,0x91b5e136,0x88a48a07,0x53ae4090,
  112387. 0xea11bb1a,0x73fb2995,0x3d93a4ea,0x32048570,0x3bfc8a5f,0xcce45de8 },
  112388. { 0xc2b3106e,0xaff4a97e,0xb6848b4f,0x9069c630,0xed76241c,0xeda837a6,
  112389. 0x6cc3f6cf,0x8a0daf13,0x3da018a8,0x199d049d,0xd9093ba3,0xf867c6b1 } },
  112390. /* 139 */
  112391. { { 0x56527296,0xe4d42a56,0xce71178d,0xae26c73d,0x6c251664,0x70a0adac,
  112392. 0x5dc0ae1d,0x813483ae,0xdaab2daf,0x7574eacd,0xc2d55f4f,0xc56b52dc },
  112393. { 0x95f32923,0x872bc167,0x5bdd2a89,0x4be17581,0xa7699f00,0x9b57f1e7,
  112394. 0x3ac2de02,0x5fcd9c72,0x92377739,0x83af3ba1,0xfc50b97f,0xa64d4e2b } },
  112395. /* 140 */
  112396. { { 0x0e552b40,0x2172dae2,0xd34d52e8,0x62f49725,0x07958f98,0x7930ee40,
  112397. 0x751fdd74,0x56da2a90,0xf53e48c3,0xf1192834,0x8e53c343,0x34d2ac26 },
  112398. { 0x13111286,0x1073c218,0xda9d9827,0x201dac14,0xee95d378,0xec2c29db,
  112399. 0x1f3ee0b1,0x9316f119,0x544ce71c,0x7890c9f0,0x27612127,0xd77138af } },
  112400. /* 141 */
  112401. { { 0x3b4ad1cd,0x78045e6d,0x4aa49bc1,0xcd86b94e,0xfd677a16,0x57e51f1d,
  112402. 0xfa613697,0xd9290935,0x34f4d893,0x7a3f9593,0x5d5fcf9b,0x8c9c248b },
  112403. { 0x6f70d4e9,0x9f23a482,0x63190ae9,0x17273454,0x5b081a48,0x4bdd7c13,
  112404. 0x28d65271,0x1e2de389,0xe5841d1f,0x0bbaaa25,0x746772e5,0xc4c18a79 } },
  112405. /* 142 */
  112406. { { 0x593375ac,0x10ee2681,0x7dd5e113,0x4f3288be,0x240f3538,0x9a97b2fb,
  112407. 0x1de6b1e2,0xfa11089f,0x1351bc58,0x516da562,0x2dfa85b5,0x573b6119 },
  112408. { 0x6cba7df5,0x89e96683,0x8c28ab40,0xf299be15,0xad43fcbf,0xe91c9348,
  112409. 0x9a1cefb3,0xe9bbc7cc,0x738b2775,0xc8add876,0x775eaa01,0x6e3b1f2e } },
  112410. /* 143 */
  112411. { { 0xb677788b,0x0365a888,0x3fd6173c,0x634ae8c4,0x9e498dbe,0x30498761,
  112412. 0xc8f779ab,0x08c43e6d,0x4c09aca9,0x068ae384,0x2018d170,0x2380c70b },
  112413. { 0xa297c5ec,0xcf77fbc3,0xca457948,0xdacbc853,0x336bec7e,0x3690de04,
  112414. 0x14eec461,0x26bbac64,0x1f713abf,0xd1c23c7e,0xe6fd569e,0xf08bbfcd } },
  112415. /* 144 */
  112416. { { 0x84770ee3,0x5f8163f4,0x744a1706,0x0e0c7f94,0xe1b2d46d,0x9c8f05f7,
  112417. 0xd01fd99a,0x417eafe7,0x11440e5b,0x2ba15df5,0x91a6fbcf,0xdc5c552a },
  112418. { 0xa270f721,0x86271d74,0xa004485b,0x32c0a075,0x8defa075,0x9d1a87e3,
  112419. 0xbf0d20fe,0xb590a7ac,0x8feda1f5,0x430c41c2,0x58f6ec24,0x454d2879 } },
  112420. /* 145 */
  112421. { { 0x7c525435,0x52b7a635,0x37c4bdbc,0x3d9ef57f,0xdffcc475,0x2bb93e9e,
  112422. 0x7710f3be,0xf7b8ba98,0x21b727de,0x42ee86da,0x2e490d01,0x55ac3f19 },
  112423. { 0xc0c1c390,0x487e3a6e,0x446cde7b,0x036fb345,0x496ae951,0x089eb276,
  112424. 0x71ed1234,0xedfed4d9,0x900f0b46,0x661b0dd5,0x8582f0d3,0x11bd6f1b } },
  112425. /* 146 */
  112426. { { 0x076bc9d1,0x5cf9350f,0xcf3cd2c3,0x15d903be,0x25af031c,0x21cfc8c2,
  112427. 0x8b1cc657,0xe0ad3248,0x70014e87,0xdd9fb963,0x297f1658,0xf0f3a5a1 },
  112428. { 0xf1f703aa,0xbb908fba,0x2f6760ba,0x2f9cc420,0x66a38b51,0x00ceec66,
  112429. 0x05d645da,0x4deda330,0xf7de3394,0xb9cf5c72,0x1ad4c906,0xaeef6502 } },
  112430. /* 147 */
  112431. { { 0x7a19045d,0x0583c8b1,0xd052824c,0xae7c3102,0xff6cfa58,0x2a234979,
  112432. 0x62c733c0,0xfe9dffc9,0x9c0c4b09,0x3a7fa250,0x4fe21805,0x516437bb },
  112433. { 0xc2a23ddb,0x9454e3d5,0x289c104e,0x0726d887,0x4fd15243,0x8977d918,
  112434. 0x6d7790ba,0xc559e73f,0x465af85f,0x8fd3e87d,0x5feee46b,0xa2615c74 } },
  112435. /* 148 */
  112436. { { 0x4335167d,0xc8d607a8,0xe0f5c887,0x8b42d804,0x398d11f9,0x5f9f13df,
  112437. 0x20740c67,0x5aaa5087,0xa3d9234b,0x83da9a6a,0x2a54bad1,0xbd3a5c4e },
  112438. { 0x2db0f658,0xdd13914c,0x5a3f373a,0x29dcb66e,0x5245a72b,0xbfd62df5,
  112439. 0x91e40847,0x19d18023,0xb136b1ae,0xd9df74db,0x3f93bc5b,0x72a06b6b } },
  112440. /* 149 */
  112441. { { 0xad19d96f,0x6da19ec3,0xfb2a4099,0xb342daa4,0x662271ea,0x0e61633a,
  112442. 0xce8c054b,0x3bcece81,0x8bd62dc6,0x7cc8e061,0xee578d8b,0xae189e19 },
  112443. { 0xdced1eed,0x73e7a25d,0x7875d3ab,0xc1257f0a,0x1cfef026,0x2cb2d5a2,
  112444. 0xb1fdf61c,0xd98ef39b,0x24e83e6c,0xcd8e6f69,0xc7b7088b,0xd71e7076 } },
  112445. /* 150 */
  112446. { { 0x9d4245bf,0x33936830,0x2ac2953b,0x22d96217,0x56c3c3cd,0xb3bf5a82,
  112447. 0x0d0699e8,0x50c9be91,0x8f366459,0xec094463,0x513b7c35,0x6c056dba },
  112448. { 0x045ab0e3,0x687a6a83,0x445c9295,0x8d40b57f,0xa16f5954,0x0f345048,
  112449. 0x3d8f0a87,0x64b5c639,0x9f71c5e2,0x106353a2,0x874f0dd4,0xdd58b475 } },
  112450. /* 151 */
  112451. { { 0x62230c72,0x67ec084f,0x481385e3,0xf14f6cca,0x4cda7774,0xf58bb407,
  112452. 0xaa2dbb6b,0xe15011b1,0x0c035ab1,0xd488369d,0x8245f2fd,0xef83c24a },
  112453. { 0x9fdc2538,0xfb57328f,0x191fe46a,0x79808293,0x32ede548,0xe28f5c44,
  112454. 0xea1a022c,0x1b3cda99,0x3df2ec7f,0x39e639b7,0x760e9a18,0x77b6272b } },
  112455. /* 152 */
  112456. { { 0xa65d56d5,0x2b1d51bd,0x7ea696e0,0x3a9b71f9,0x9904f4c4,0x95250ecc,
  112457. 0xe75774b7,0x8bc4d6eb,0xeaeeb9aa,0x0e343f8a,0x930e04cb,0xc473c1d1 },
  112458. { 0x064cd8ae,0x282321b1,0x5562221c,0xf4b4371e,0xd1bf1221,0xc1cc81ec,
  112459. 0xe2c8082f,0xa52a07a9,0xba64a958,0x350d8e59,0x6fb32c9a,0x29e4f3de } },
  112460. /* 153 */
  112461. { { 0xba89aaa5,0x0aa9d56c,0xc4c6059e,0xf0208ac0,0xbd6ddca4,0x7400d9c6,
  112462. 0xf2c2f74a,0xb384e475,0xb1562dd3,0x4c1061fc,0x2e153b8d,0x3924e248 },
  112463. { 0x849808ab,0xf38b8d98,0xa491aa36,0x29bf3260,0x88220ede,0x85159ada,
  112464. 0xbe5bc422,0x8b47915b,0xd7300967,0xa934d72e,0x2e515d0d,0xc4f30398 } },
  112465. /* 154 */
  112466. { { 0x1b1de38b,0xe3e9ee42,0x42636760,0xa124e25a,0x90165b1a,0x90bf73c0,
  112467. 0x146434c5,0x21802a34,0x2e1fa109,0x54aa83f2,0xed9c51e9,0x1d4bd03c },
  112468. { 0x798751e6,0xc2d96a38,0x8c3507f5,0xed27235f,0xc8c24f88,0xb5fb80e2,
  112469. 0xd37f4f78,0xf873eefa,0xf224ba96,0x7229fd74,0x9edd7149,0x9dcd9199 } },
  112470. /* 155 */
  112471. { { 0x4e94f22a,0xee9f81a6,0xf71ec341,0xe5609892,0xa998284e,0x6c818ddd,
  112472. 0x3b54b098,0x9fd47295,0x0e8a7cc9,0x47a6ac03,0xb207a382,0xde684e5e },
  112473. { 0x2b6b956b,0x4bdd1ecd,0xf01b3583,0x09084414,0x55233b14,0xe2f80b32,
  112474. 0xef5ebc5e,0x5a0fec54,0xbf8b29a2,0x74cf25e6,0x7f29e014,0x1c757fa0 } },
  112475. /* 156 */
  112476. { { 0xeb0fdfe4,0x1bcb5c4a,0xf0899367,0xd7c649b3,0x05bc083b,0xaef68e3f,
  112477. 0xa78aa607,0x57a06e46,0x21223a44,0xa2136ecc,0x52f5a50b,0x89bd6484 },
  112478. { 0x4455f15a,0x724411b9,0x08a9c0fd,0x23dfa970,0x6db63bef,0x7b0da4d1,
  112479. 0xfb162443,0x6f8a7ec1,0xe98284fb,0xc1ac9cee,0x33566022,0x085a582b } },
  112480. /* 157 */
  112481. { { 0xec1f138a,0x15cb61f9,0x668f0c28,0x11c9a230,0xdf93f38f,0xac829729,
  112482. 0x4048848d,0xcef25698,0x2bba8fbf,0x3f686da0,0x111c619a,0xed5fea78 },
  112483. { 0xd6d1c833,0x9b4f73bc,0x86e7bf80,0x50951606,0x042b1d51,0xa2a73508,
  112484. 0x5fb89ec2,0x9ef6ea49,0x5ef8b892,0xf1008ce9,0x9ae8568b,0x78a7e684 } },
  112485. /* 158 */
  112486. { { 0x10470cd8,0x3fe83a7c,0xf86df000,0x92734682,0xda9409b5,0xb5dac06b,
  112487. 0x94939c5f,0x1e7a9660,0x5cc116dc,0xdec6c150,0x66bac8cc,0x1a52b408 },
  112488. { 0x6e864045,0x5303a365,0x9139efc1,0x45eae72a,0x6f31d54f,0x83bec646,
  112489. 0x6e958a6d,0x2fb4a86f,0x4ff44030,0x6760718e,0xe91ae0df,0x008117e3 } },
  112490. /* 159 */
  112491. { { 0x384310a2,0x5d5833ba,0x1fd6c9fc,0xbdfb4edc,0x849c4fb8,0xb9a4f102,
  112492. 0x581c1e1f,0xe5fb239a,0xd0a9746d,0xba44b2e7,0x3bd942b9,0x78f7b768 },
  112493. { 0xc87607ae,0x076c8ca1,0xd5caaa7e,0x82b23c2e,0x2763e461,0x6a581f39,
  112494. 0x3886df11,0xca8a5e4a,0x264e7f22,0xc87e90cf,0x215cfcfc,0x04f74870 } },
  112495. /* 160 */
  112496. { { 0x141d161c,0x5285d116,0x93c4ed17,0x67cd2e0e,0x7c36187e,0x12c62a64,
  112497. 0xed2584ca,0xf5329539,0x42fbbd69,0xc4c777c4,0x1bdfc50a,0x107de776 },
  112498. { 0xe96beebd,0x9976dcc5,0xa865a151,0xbe2aff95,0x9d8872af,0x0e0a9da1,
  112499. 0xa63c17cc,0x5e357a3d,0xe15cc67c,0xd31fdfd8,0x7970c6d8,0xc44bbefd } },
  112500. /* 161 */
  112501. { { 0x4c0c62f1,0x703f83e2,0x4e195572,0x9b1e28ee,0xfe26cced,0x6a82858b,
  112502. 0xc43638fa,0xd381c84b,0xa5ba43d8,0x94f72867,0x10b82743,0x3b4a783d },
  112503. { 0x7576451e,0xee1ad7b5,0x14b6b5c8,0xc3d0b597,0xfcacc1b8,0x3dc30954,
  112504. 0x472c9d7b,0x55df110e,0x02f8a328,0x97c86ed7,0x88dc098f,0xd0433413 } },
  112505. /* 162 */
  112506. { { 0x2ca8f2fe,0x1a60d152,0x491bd41f,0x61640948,0x58dfe035,0x6dae29a5,
  112507. 0x278e4863,0x9a615bea,0x9ad7c8e5,0xbbdb4477,0x2ceac2fc,0x1c706630 },
  112508. { 0x99699b4b,0x5e2b54c6,0x239e17e8,0xb509ca6d,0xea063a82,0x728165fe,
  112509. 0xb6a22e02,0x6b5e609d,0xb26ee1df,0x12813905,0x439491fa,0x07b9f722 } },
  112510. /* 163 */
  112511. { { 0x48ff4e49,0x1592ec14,0x6d644129,0x3e4e9f17,0x1156acc0,0x7acf8288,
  112512. 0xbb092b0b,0x5aa34ba8,0x7d38393d,0xcd0f9022,0xea4f8187,0x416724dd },
  112513. { 0xc0139e73,0x3c4e641c,0x91e4d87d,0xe0fe46cf,0xcab61f8a,0xedb3c792,
  112514. 0xd3868753,0x4cb46de4,0x20f1098a,0xe449c21d,0xf5b8ea6e,0x5e5fd059 } },
  112515. /* 164 */
  112516. { { 0x75856031,0x7fcadd46,0xeaf2fbd0,0x89c7a4cd,0x7a87c480,0x1af523ce,
  112517. 0x61d9ae90,0xe5fc1095,0xbcdb95f5,0x3fb5864f,0xbb5b2c7d,0xbeb5188e },
  112518. { 0x3ae65825,0x3d1563c3,0x0e57d641,0x116854c4,0x1942ebd3,0x11f73d34,
  112519. 0xc06955b3,0x24dc5904,0x995a0a62,0x8a0d4c83,0x5d577b7d,0xfb26b86d } },
  112520. /* 165 */
  112521. { { 0xc686ae17,0xc53108e7,0xd1c1da56,0x9090d739,0x9aec50ae,0x4583b013,
  112522. 0xa49a6ab2,0xdd9a088b,0xf382f850,0x28192eea,0xf5fe910e,0xcc8df756 },
  112523. { 0x9cab7630,0x877823a3,0xfb8e7fc1,0x64984a9a,0x364bfc16,0x5448ef9c,
  112524. 0xc44e2a9a,0xbbb4f871,0x435c95e9,0x901a41ab,0xaaa50a06,0xc6c23e5f } },
  112525. /* 166 */
  112526. { { 0x9034d8dd,0xb78016c1,0x0b13e79b,0x856bb44b,0xb3241a05,0x85c6409a,
  112527. 0x2d78ed21,0x8d2fe19a,0x726eddf2,0xdcc7c26d,0x25104f04,0x3ccaff5f },
  112528. { 0x6b21f843,0x397d7edc,0xe975de4c,0xda88e4dd,0x4f5ab69e,0x5273d396,
  112529. 0x9aae6cc0,0x537680e3,0x3e6f9461,0xf749cce5,0x957bffd3,0x021ddbd9 } },
  112530. /* 167 */
  112531. { { 0x777233cf,0x7b64585f,0x0942a6f0,0xfe6771f6,0xdfe6eef0,0x636aba7a,
  112532. 0x86038029,0x63bbeb56,0xde8fcf36,0xacee5842,0xd4a20524,0x48d9aa99 },
  112533. { 0x0da5e57a,0xcff7a74c,0xe549d6c9,0xc232593c,0xf0f2287b,0x68504bcc,
  112534. 0xbc8360b5,0x6d7d098d,0x5b402f41,0xeac5f149,0xb87d1bf1,0x61936f11 } },
  112535. /* 168 */
  112536. { { 0xb8153a9d,0xaa9da167,0x9e83ecf0,0xa49fe3ac,0x1b661384,0x14c18f8e,
  112537. 0x38434de1,0x61c24dab,0x283dae96,0x3d973c3a,0x82754fc9,0xc99baa01 },
  112538. { 0x4c26b1e3,0x477d198f,0xa7516202,0x12e8e186,0x362addfa,0x386e52f6,
  112539. 0xc3962853,0x31e8f695,0x6aaedb60,0xdec2af13,0x29cf74ac,0xfcfdb4c6 } },
  112540. /* 169 */
  112541. { { 0xcca40298,0x6b3ee958,0xf2f5d195,0xc3878153,0xed2eae5b,0x0c565630,
  112542. 0x3a697cf2,0xd089b37e,0xad5029ea,0xc2ed2ac7,0x0f0dda6a,0x7e5cdfad },
  112543. { 0xd9b86202,0xf98426df,0x4335e054,0xed1960b1,0x3f14639e,0x1fdb0246,
  112544. 0x0db6c670,0x17f709c3,0x773421e1,0xbfc687ae,0x26c1a8ac,0x13fefc4a } },
  112545. /* 170 */
  112546. { { 0x7ffa0a5f,0xe361a198,0xc63fe109,0xf4b26102,0x6c74e111,0x264acbc5,
  112547. 0x77abebaf,0x4af445fa,0x24cddb75,0x448c4fdd,0x44506eea,0x0b13157d },
  112548. { 0x72e9993d,0x22a6b159,0x85e5ecbe,0x2c3c57e4,0xfd83e1a1,0xa673560b,
  112549. 0xc3b8c83b,0x6be23f82,0x40bbe38e,0x40b13a96,0xad17399b,0x66eea033 } },
  112550. /* 171 */
  112551. { { 0xb4c6c693,0x49fc6e95,0x36af7d38,0xefc735de,0x35fe42fc,0xe053343d,
  112552. 0x6a9ab7c3,0xf0aa427c,0x4a0fcb24,0xc79f0436,0x93ebbc50,0x16287243 },
  112553. { 0x16927e1e,0x5c3d6bd0,0x673b984c,0x40158ed2,0x4cd48b9a,0xa7f86fc8,
  112554. 0x60ea282d,0x1643eda6,0xe2a1beed,0x45b393ea,0x19571a94,0x664c839e } },
  112555. /* 172 */
  112556. { { 0x27eeaf94,0x57745750,0xea99e1e7,0x2875c925,0x5086adea,0xc127e7ba,
  112557. 0x86fe424f,0x765252a0,0x2b6c0281,0x1143cc6c,0xd671312d,0xc9bb2989 },
  112558. { 0x51acb0a5,0x880c337c,0xd3c60f78,0xa3710915,0x9262b6ed,0x496113c0,
  112559. 0x9ce48182,0x5d25d9f8,0xb3813586,0x53b6ad72,0x4c0e159c,0x0ea3bebc } },
  112560. /* 173 */
  112561. { { 0xc5e49bea,0xcaba450a,0x7c05da59,0x684e5415,0xde7ac36c,0xa2e9cab9,
  112562. 0x2e6f957b,0x4ca79b5f,0x09b817b1,0xef7b0247,0x7d89df0f,0xeb304990 },
  112563. { 0x46fe5096,0x508f7307,0x2e04eaaf,0x695810e8,0x3512f76c,0x88ef1bd9,
  112564. 0x3ebca06b,0x77661351,0xccf158b7,0xf7d4863a,0x94ee57da,0xb2a81e44 } },
  112565. /* 174 */
  112566. { { 0x6d53e6ba,0xff288e5b,0x14484ea2,0xa90de1a9,0xed33c8ec,0x2fadb60c,
  112567. 0x28b66a40,0x579d6ef3,0xec24372d,0x4f2dd6dd,0x1d66ec7d,0xe9e33fc9 },
  112568. { 0x039eab6e,0x110899d2,0x3e97bb5e,0xa31a667a,0xcfdce68e,0x6200166d,
  112569. 0x5137d54b,0xbe83ebae,0x4800acdf,0x085f7d87,0x0c6f8c86,0xcf4ab133 } },
  112570. /* 175 */
  112571. { { 0x931e08fb,0x03f65845,0x1506e2c0,0x6438551e,0x9c36961f,0x5791f0dc,
  112572. 0xe3dcc916,0x68107b29,0xf495d2ca,0x83242374,0x6ee5895b,0xd8cfb663 },
  112573. { 0xa0349b1b,0x525e0f16,0x4a0fab86,0x33cd2c6c,0x2af8dda9,0x46c12ee8,
  112574. 0x71e97ad3,0x7cc424ba,0x37621eb0,0x69766ddf,0xa5f0d390,0x95565f56 } },
  112575. /* 176 */
  112576. { { 0x1a0f5e94,0xe0e7bbf2,0x1d82d327,0xf771e115,0xceb111fa,0x10033e3d,
  112577. 0xd3426638,0xd269744d,0x00d01ef6,0xbdf2d9da,0xa049ceaf,0x1cb80c71 },
  112578. { 0x9e21c677,0x17f18328,0x19c8f98b,0x6452af05,0x80b67997,0x35b9c5f7,
  112579. 0x40f8f3d4,0x5c2e1cbe,0x66d667ca,0x43f91656,0xcf9d6e79,0x9faaa059 } },
  112580. /* 177 */
  112581. { { 0x0a078fe6,0x8ad24618,0x464fd1dd,0xf6cc73e6,0xc3e37448,0x4d2ce34d,
  112582. 0xe3271b5f,0x624950c5,0xefc5af72,0x62910f5e,0xaa132bc6,0x8b585bf8 },
  112583. { 0xa839327f,0x11723985,0x4aac252f,0x34e2d27d,0x6296cc4e,0x402f59ef,
  112584. 0x47053de9,0x00ae055c,0x28b4f09b,0xfc22a972,0xfa0c180e,0xa9e86264 } },
  112585. /* 178 */
  112586. { { 0xbc310ecc,0x0b7b6224,0x67fa14ed,0x8a1a74f1,0x7214395c,0x87dd0960,
  112587. 0xf5c91128,0xdf1b3d09,0x86b264a8,0x39ff23c6,0x3e58d4c5,0xdc2d49d0 },
  112588. { 0xa9d6f501,0x2152b7d3,0xc04094f7,0xf4c32e24,0xd938990f,0xc6366596,
  112589. 0x94fb207f,0x084d078f,0x328594cb,0xfd99f1d7,0xcb2d96b3,0x36defa64 } },
  112590. /* 179 */
  112591. { { 0x13ed7cbe,0x4619b781,0x9784bd0e,0x95e50015,0x2c7705fe,0x2a32251c,
  112592. 0x5f0dd083,0xa376af99,0x0361a45b,0x55425c6c,0x1f291e7b,0x812d2cef },
  112593. { 0x5fd94972,0xccf581a0,0xe56dc383,0x26e20e39,0x63dbfbf0,0x0093685d,
  112594. 0x36b8c575,0x1fc164cc,0x390ef5e7,0xb9c5ab81,0x26908c66,0x40086beb } },
  112595. /* 180 */
  112596. { { 0x37e3c115,0xe5e54f79,0xc1445a8a,0x69b8ee8c,0xb7659709,0x79aedff2,
  112597. 0x1b46fbe6,0xe288e163,0xd18d7bb7,0xdb4844f0,0x48aa6424,0xe0ea23d0 },
  112598. { 0xf3d80a73,0x714c0e4e,0x3bd64f98,0x87a0aa9e,0x2ec63080,0x8844b8a8,
  112599. 0x255d81a3,0xe0ac9c30,0x455397fc,0x86151237,0x2f820155,0x0b979464 } },
  112600. /* 181 */
  112601. { { 0x4ae03080,0x127a255a,0x580a89fb,0x232306b4,0x6416f539,0x04e8cd6a,
  112602. 0x13b02a0e,0xaeb70dee,0x4c09684a,0xa3038cf8,0x28e433ee,0xa710ec3c },
  112603. { 0x681b1f7d,0x77a72567,0x2fc28170,0x86fbce95,0xf5735ac8,0xd3408683,
  112604. 0x6bd68e93,0x3a324e2a,0xc027d155,0x7ec74353,0xd4427177,0xab60354c } },
  112605. /* 182 */
  112606. { { 0xef4c209d,0x32a5342a,0x08d62704,0x2ba75274,0xc825d5fe,0x4bb4af6f,
  112607. 0xd28e7ff1,0x1c3919ce,0xde0340f6,0x1dfc2fdc,0x29f33ba9,0xc6580baf },
  112608. { 0x41d442cb,0xae121e75,0x3a4724e4,0x4c7727fd,0x524f3474,0xe556d6a4,
  112609. 0x785642a2,0x87e13cc7,0xa17845fd,0x182efbb1,0x4e144857,0xdcec0cf1 } },
  112610. /* 183 */
  112611. { { 0xe9539819,0x1cb89541,0x9d94dbf1,0xc8cb3b4f,0x417da578,0x1d353f63,
  112612. 0x8053a09e,0xb7a697fb,0xc35d8b78,0x8d841731,0xb656a7a9,0x85748d6f },
  112613. { 0xc1859c5d,0x1fd03947,0x535d22a2,0x6ce965c1,0x0ca3aadc,0x1966a13e,
  112614. 0x4fb14eff,0x9802e41d,0x76dd3fcd,0xa9048cbb,0xe9455bba,0x89b182b5 } },
  112615. /* 184 */
  112616. { { 0x43360710,0xd777ad6a,0x55e9936b,0x841287ef,0x04a21b24,0xbaf5c670,
  112617. 0x35ad86f1,0xf2c0725f,0xc707e72e,0x338fa650,0xd8883e52,0x2bf8ed2e },
  112618. { 0xb56e0d6a,0xb0212cf4,0x6843290c,0x50537e12,0x98b3dc6f,0xd8b184a1,
  112619. 0x0210b722,0xd2be9a35,0x559781ee,0x407406db,0x0bc18534,0x5a78d591 } },
  112620. /* 185 */
  112621. { { 0xd748b02c,0x4d57aa2a,0xa12b3b95,0xbe5b3451,0x64711258,0xadca7a45,
  112622. 0x322153db,0x597e091a,0x32eb1eab,0xf3271006,0x2873f301,0xbd9adcba },
  112623. { 0x38543f7f,0xd1dc79d1,0x921b1fef,0x00022092,0x1e5df8ed,0x86db3ef5,
  112624. 0x9e6b944a,0x888cae04,0x791a32b4,0x71bd29ec,0xa6d1c13e,0xd3516206 } },
  112625. /* 186 */
  112626. { { 0x55924f43,0x2ef6b952,0x4f9de8d5,0xd2f401ae,0xadc68042,0xfc73e8d7,
  112627. 0x0d9d1bb4,0x627ea70c,0xbbf35679,0xc3bb3e3e,0xd882dee4,0x7e8a254a },
  112628. { 0xb5924407,0x08906f50,0xa1ad444a,0xf14a0e61,0x65f3738e,0xaa0efa21,
  112629. 0xae71f161,0xd60c7dd6,0xf175894d,0x9e8390fa,0x149f4c00,0xd115cd20 } },
  112630. /* 187 */
  112631. { { 0xa52abf77,0x2f2e2c1d,0x54232568,0xc2a0dca5,0x54966dcc,0xed423ea2,
  112632. 0xcd0dd039,0xe48c93c7,0x176405c7,0x1e54a225,0x70d58f2e,0x1efb5b16 },
  112633. { 0x94fb1471,0xa751f9d9,0x67d2941d,0xfdb31e1f,0x53733698,0xa6c74eb2,
  112634. 0x89a0f64a,0xd3155d11,0xa4b8d2b6,0x4414cfe4,0xf7a8e9e3,0x8d5a4be8 } },
  112635. /* 188 */
  112636. { { 0x52669e98,0x5c96b4d4,0x8fd42a03,0x4547f922,0xd285174e,0xcf5c1319,
  112637. 0x064bffa0,0x805cd1ae,0x246d27e7,0x50e8bc4f,0xd5781e11,0xf89ef98f },
  112638. { 0xdee0b63f,0xb4ff95f6,0x222663a4,0xad850047,0x4d23ce9c,0x02691860,
  112639. 0x50019f59,0x3e5309ce,0x69a508ae,0x27e6f722,0x267ba52c,0xe9376652 } },
  112640. /* 189 */
  112641. { { 0xc0368708,0xa04d289c,0x5e306e1d,0xc458872f,0x33112fea,0x76fa23de,
  112642. 0x6efde42e,0x718e3974,0x1d206091,0xf0c98cdc,0x14a71987,0x5fa3ca62 },
  112643. { 0xdcaa9f2a,0xeee8188b,0x589a860d,0x312cc732,0xc63aeb1f,0xf9808dd6,
  112644. 0x4ea62b53,0x70fd43db,0x890b6e97,0x2c2bfe34,0xfa426aa6,0x105f863c } },
  112645. /* 190 */
  112646. { { 0xb38059ad,0x0b29795d,0x90647ea0,0x5686b77e,0xdb473a3e,0xeff0470e,
  112647. 0xf9b6d1e2,0x278d2340,0xbd594ec7,0xebbff95b,0xd3a7f23d,0xf4b72334 },
  112648. { 0xa5a83f0b,0x2a285980,0x9716a8b3,0x0786c41a,0x22511812,0x138901bd,
  112649. 0xe2fede6e,0xd1b55221,0xdf4eb590,0x0806e264,0x762e462e,0x6c4c897e } },
  112650. /* 191 */
  112651. { { 0xb4b41d9d,0xd10b905f,0x4523a65b,0x826ca466,0xb699fa37,0x535bbd13,
  112652. 0x73bc8f90,0x5b9933d7,0xcd2118ad,0x9332d61f,0xd4a65fd0,0x158c693e },
  112653. { 0xe6806e63,0x4ddfb2a8,0xb5de651b,0xe31ed3ec,0x819bc69a,0xf9460e51,
  112654. 0x2c76b1f8,0x6229c0d6,0x901970a3,0xbb78f231,0x9cee72b8,0x31f3820f } },
  112655. /* 192 */
  112656. { { 0xc09e1c72,0xe931caf2,0x12990cf4,0x0715f298,0x943262d8,0x33aad81d,
  112657. 0x73048d3f,0x5d292b7a,0xdc7415f6,0xb152aaa4,0x0fd19587,0xc3d10fd9 },
  112658. { 0x75ddadd0,0xf76b35c5,0x1e7b694c,0x9f5f4a51,0xc0663025,0x2f1ab7eb,
  112659. 0x920260b0,0x01c9cc87,0x05d39da6,0xc4b1f61a,0xeb4a9c4e,0x6dcd76c4 } },
  112660. /* 193 */
  112661. { { 0xfdc83f01,0x0ba0916f,0x9553e4f9,0x354c8b44,0xffc5e622,0xa6cc511a,
  112662. 0xe95be787,0xb954726a,0x75b41a62,0xcb048115,0xebfde989,0xfa2ae6cd },
  112663. { 0x0f24659a,0x6376bbc7,0x4c289c43,0x13a999fd,0xec9abd8b,0xc7134184,
  112664. 0xa789ab04,0x28c02bf6,0xd3e526ec,0xff841ebc,0x640893a8,0x442b191e } },
  112665. /* 194 */
  112666. { { 0xfa2b6e20,0x4cac6c62,0xf6d69861,0x97f29e9b,0xbc96d12d,0x228ab1db,
  112667. 0x5e8e108d,0x6eb91327,0x40771245,0xd4b3d4d1,0xca8a803a,0x61b20623 },
  112668. { 0xa6a560b1,0x2c2f3b41,0x3859fcf4,0x879e1d40,0x024dbfc3,0x7cdb5145,
  112669. 0x3bfa5315,0x55d08f15,0xaa93823a,0x2f57d773,0xc6a2c9a2,0xa97f259c } },
  112670. /* 195 */
  112671. { { 0xe58edbbb,0xc306317b,0x79dfdf13,0x25ade51c,0x16d83dd6,0x6b5beaf1,
  112672. 0x1dd8f925,0xe8038a44,0xb2a87b6b,0x7f00143c,0xf5b438de,0xa885d00d },
  112673. { 0xcf9e48bd,0xe9f76790,0xa5162768,0xf0bdf9f0,0xad7b57cb,0x0436709f,
  112674. 0xf7c15db7,0x7e151c12,0x5d90ee3b,0x3514f022,0x2c361a8d,0x2e84e803 } },
  112675. /* 196 */
  112676. { { 0x563ec8d8,0x2277607d,0xe3934cb7,0xa661811f,0xf58fd5de,0x3ca72e7a,
  112677. 0x62294c6a,0x7989da04,0xf6bbefe9,0x88b3708b,0x53ed7c82,0x0d524cf7 },
  112678. { 0x2f30c073,0x69f699ca,0x9dc1dcf3,0xf0fa264b,0x05f0aaf6,0x44ca4568,
  112679. 0xd19b9baf,0x0f5b23c7,0xeabd1107,0x39193f41,0x2a7c9b83,0x9e3e10ad } },
  112680. /* 197 */
  112681. { { 0xd4ae972f,0xa90824f0,0xc6e846e7,0x43eef02b,0x29d2160a,0x7e460612,
  112682. 0xfe604e91,0x29a178ac,0x4eb184b2,0x23056f04,0xeb54cdf4,0x4fcad55f },
  112683. { 0xae728d15,0xa0ff96f3,0xc6a00331,0x8a2680c6,0x7ee52556,0x5f84cae0,
  112684. 0xc5a65dad,0x5e462c3a,0xe2d23f4f,0x5d2b81df,0xc5b1eb07,0x6e47301b } },
  112685. /* 198 */
  112686. { { 0xaf8219b9,0x77411d68,0x51b1907a,0xcb883ce6,0x101383b5,0x25c87e57,
  112687. 0x982f970d,0x9c7d9859,0x118305d2,0xaa6abca5,0x9013a5db,0x725fed2f },
  112688. { 0xababd109,0x487cdbaf,0x87586528,0xc0f8cf56,0x8ad58254,0xa02591e6,
  112689. 0xdebbd526,0xc071b1d1,0x961e7e31,0x927dfe8b,0x9263dfe1,0x55f895f9 } },
  112690. /* 199 */
  112691. { { 0xb175645b,0xf899b00d,0xb65b4b92,0x51f3a627,0xb67399ef,0xa2f3ac8d,
  112692. 0xe400bc20,0xe717867f,0x1967b952,0x42cc9020,0x3ecd1de1,0x3d596751 },
  112693. { 0xdb979775,0xd41ebcde,0x6a2e7e88,0x99ba61bc,0x321504f2,0x039149a5,
  112694. 0x27ba2fad,0xe7dc2314,0xb57d8368,0x9f556308,0x57da80a7,0x2b6d16c9 } },
  112695. /* 200 */
  112696. { { 0x279ad982,0x84af5e76,0x9c8b81a6,0x9bb4c92d,0x0e698e67,0xd79ad44e,
  112697. 0x265fc167,0xe8be9048,0x0c3a4ccc,0xf135f7e6,0xb8863a33,0xa0a10d38 },
  112698. { 0xd386efd9,0xe197247c,0xb52346c2,0x0eefd3f9,0x78607bc8,0xc22415f9,
  112699. 0x508674ce,0xa2a8f862,0xc8c9d607,0xa72ad09e,0x50fa764f,0xcd9f0ede } },
  112700. /* 201 */
  112701. { { 0xd1a46d4d,0x063391c7,0x9eb01693,0x2df51c11,0x849e83de,0xc5849800,
  112702. 0x8ad08382,0x48fd09aa,0xaa742736,0xa405d873,0xe1f9600c,0xee49e61e },
  112703. { 0x48c76f73,0xd76676be,0x01274b2a,0xd9c100f6,0x83f8718d,0x110bb67c,
  112704. 0x02fc0d73,0xec85a420,0x744656ad,0xc0449e1e,0x37d9939b,0x28ce7376 } },
  112705. /* 202 */
  112706. { { 0x44544ac7,0x97e9af72,0xba010426,0xf2c658d5,0xfb3adfbd,0x732dec39,
  112707. 0xa2df0b07,0xd12faf91,0x2171e208,0x8ac26725,0x5b24fa54,0xf820cdc8 },
  112708. { 0x94f4cf77,0x307a6eea,0x944a33c6,0x18c783d2,0x0b741ac5,0x4b939d4c,
  112709. 0x3ffbb6e4,0x1d7acd15,0x7a255e44,0x06a24858,0xce336d50,0x14fbc494 } },
  112710. /* 203 */
  112711. { { 0x51584e3c,0x9b920c0c,0xf7e54027,0xc7733c59,0x88422bbe,0xe24ce139,
  112712. 0x523bd6ab,0x11ada812,0xb88e6def,0xde068800,0xfe8c582d,0x7b872671 },
  112713. { 0x7de53510,0x4e746f28,0xf7971968,0x492f8b99,0x7d928ac2,0x1ec80bc7,
  112714. 0x432eb1b5,0xb3913e48,0x32028f6e,0xad084866,0x8fc2f38b,0x122bb835 } },
  112715. /* 204 */
  112716. { { 0x3b0b29c3,0x0a9f3b1e,0x4fa44151,0x837b6432,0x17b28ea7,0xb9905c92,
  112717. 0x98451750,0xf39bc937,0xce8b6da1,0xcd383c24,0x010620b2,0x299f57db },
  112718. { 0x58afdce3,0x7b6ac396,0x3d05ef47,0xa15206b3,0xb9bb02ff,0xa0ae37e2,
  112719. 0x9db3964c,0x107760ab,0x67954bea,0xe29de9a0,0x431c3f82,0x446a1ad8 } },
  112720. /* 205 */
  112721. { { 0x5c6b8195,0xc6fecea0,0xf49e71b9,0xd744a7c5,0x177a7ae7,0xa8e96acc,
  112722. 0x358773a7,0x1a05746c,0x37567369,0xa4162146,0x87d1c971,0xaa0217f7 },
  112723. { 0x77fd3226,0x61e9d158,0xe4f600be,0x0f6f2304,0x7a6dff07,0xa9c4cebc,
  112724. 0x09f12a24,0xd15afa01,0x8c863ee9,0x2bbadb22,0xe5eb8c78,0xa28290e4 } },
  112725. /* 206 */
  112726. { { 0x3e9de330,0x55b87fa0,0x195c145b,0x12b26066,0xa920bef0,0xe08536e0,
  112727. 0x4d195adc,0x7bff6f2c,0x945f4187,0x7f319e9d,0xf892ce47,0xf9848863 },
  112728. { 0x4fe37657,0xd0efc1d3,0x5cf0e45a,0x3c58de82,0x8b0ccbbe,0x626ad21a,
  112729. 0xaf952fc5,0xd2a31208,0xeb437357,0x81791995,0x98e95d4f,0x5f19d30f } },
  112730. /* 207 */
  112731. { { 0x0e6865bb,0x72e83d9a,0xf63456a6,0x22f5af3b,0x463c8d9e,0x409e9c73,
  112732. 0xdfe6970e,0x40e9e578,0x711b91ca,0x876b6efa,0x942625a3,0x895512cf },
  112733. { 0xcb4e462b,0x84c8eda8,0x4412e7c8,0x84c0154a,0xceb7b71f,0x04325db1,
  112734. 0x66f70877,0x1537dde3,0x1992b9ac,0xf3a09399,0xd498ae77,0xa7316606 } },
  112735. /* 208 */
  112736. { { 0xcad260f5,0x13990d2f,0xeec0e8c0,0x76c3be29,0x0f7bd7d5,0x7dc5bee0,
  112737. 0xefebda4b,0x9be167d2,0x9122b87e,0xcce3dde6,0x82b5415c,0x75a28b09 },
  112738. { 0xe84607a6,0xf6810bcd,0x6f4dbf0d,0xc6d58128,0x1b4dafeb,0xfead577d,
  112739. 0x066b28eb,0x9bc440b2,0x8b17e84b,0x53f1da97,0xcda9a575,0x0459504b } },
  112740. /* 209 */
  112741. { { 0x329e5836,0x13e39a02,0xf717269d,0x2c9e7d51,0xf26c963b,0xc5ac58d6,
  112742. 0x79967bf5,0x3b0c6c43,0x55908d9d,0x60bbea3f,0xf07c9ad1,0xd84811e7 },
  112743. { 0x5bd20e4a,0xfe7609a7,0x0a70baa8,0xe4325dd2,0xb3600386,0x3711f370,
  112744. 0xd0924302,0x97f9562f,0x4acc4436,0x040dc0c3,0xde79cdd4,0xfd6d725c } },
  112745. /* 210 */
  112746. { { 0xcf13eafb,0xb3efd0e3,0x5aa0ae5f,0x21009cbb,0x79022279,0xe480c553,
  112747. 0xb2fc9a6d,0x755cf334,0x07096ae7,0x8564a5bf,0xbd238139,0xddd649d0 },
  112748. { 0x8a045041,0xd0de10b1,0xc957d572,0x6e05b413,0x4e0fb25c,0x5c5ff806,
  112749. 0x641162fb,0xd933179b,0xe57439f9,0x42d48485,0x8a8d72aa,0x70c5bd0a } },
  112750. /* 211 */
  112751. { { 0x97bdf646,0xa7671738,0xab329f7c,0xaa1485b4,0xf8f25fdf,0xce3e11d6,
  112752. 0xc6221824,0x76a3fc7e,0xf3924740,0x045f281f,0x96d13a9a,0x24557d4e },
  112753. { 0xdd4c27cd,0x875c804b,0x0f5c7fea,0x11c5f0f4,0xdc55ff7e,0xac8c880b,
  112754. 0x1103f101,0x2acddec5,0xf99faa89,0x38341a21,0xce9d6b57,0xc7b67a2c } },
  112755. /* 212 */
  112756. { { 0x8e357586,0x9a0d724f,0xdf648da0,0x1d7f4ff5,0xfdee62a5,0x9c3e6c9b,
  112757. 0x0389b372,0x0499cef0,0x98eab879,0xe904050d,0x6c051617,0xe8eef1b6 },
  112758. { 0xc37e3ca9,0xebf5bfeb,0xa4e0b91d,0x7c5e946d,0x2c4bea28,0x79097314,
  112759. 0xee67b2b7,0x81f6c109,0xdafc5ede,0xaf237d9b,0x2abb04c7,0xd2e60201 } },
  112760. /* 213 */
  112761. { { 0x8a4f57bf,0x6156060c,0xff11182a,0xf9758696,0x6296ef00,0x8336773c,
  112762. 0xff666899,0x9c054bce,0x719cd11c,0xd6a11611,0xdbe1acfa,0x9824a641 },
  112763. { 0xba89fd01,0x0b7b7a5f,0x889f79d8,0xf8d3b809,0xf578285c,0xc5e1ea08,
  112764. 0xae6d8288,0x7ac74536,0x7521ef5f,0x5d37a200,0xb260a25d,0x5ecc4184 } },
  112765. /* 214 */
  112766. { { 0xa708c8d3,0xddcebb19,0xc63f81ec,0xe63ed04f,0x11873f95,0xd045f5a0,
  112767. 0x79f276d5,0x3b5ad544,0x425ae5b3,0x81272a3d,0x10ce1605,0x8bfeb501 },
  112768. { 0x888228bf,0x4233809c,0xb2aff7df,0x4bd82acf,0x0cbd4a7f,0x9c68f180,
  112769. 0x6b44323d,0xfcd77124,0x891db957,0x60c0fcf6,0x04da8f7f,0xcfbb4d89 } },
  112770. /* 215 */
  112771. { { 0x3b26139a,0x9a6a5df9,0xb2cc7eb8,0x3e076a83,0x5a964bcd,0x47a8e82d,
  112772. 0xb9278d6b,0x8a4e2a39,0xe4443549,0x93506c98,0xf1e0d566,0x06497a8f },
  112773. { 0x2b1efa05,0x3dee8d99,0x45393e33,0x2da63ca8,0xcf0579ad,0xa4af7277,
  112774. 0x3236d8ea,0xaf4b4639,0x32b617f5,0x6ccad95b,0xb88bb124,0xce76d8b8 } },
  112775. /* 216 */
  112776. { { 0x083843dc,0x63d2537a,0x1e4153b4,0x89eb3514,0xea9afc94,0x5175ebc4,
  112777. 0x8ed1aed7,0x7a652580,0xd85e8297,0x67295611,0xb584b73d,0x8dd2d68b },
  112778. { 0x0133c3a4,0x237139e6,0x4bd278ea,0x9de838ab,0xc062fcd9,0xe829b072,
  112779. 0x63ba8706,0x70730d4f,0xd3cd05ec,0x6080483f,0x0c85f84d,0x872ab5b8 } },
  112780. /* 217 */
  112781. { { 0x999d4d49,0xfc0776d3,0xec3f45e7,0xa3eb59de,0x0dae1fc1,0xbc990e44,
  112782. 0xa15371ff,0x33596b1e,0x9bc7ab25,0xd447dcb2,0x35979582,0xcd5b63e9 },
  112783. { 0x77d1ff11,0xae3366fa,0xedee6903,0x59f28f05,0xa4433bf2,0x6f43fed1,
  112784. 0xdf9ce00e,0x15409c9b,0xaca9c5dc,0x21b5cded,0x82d7bdb4,0xf9f33595 } },
  112785. /* 218 */
  112786. { { 0x9422c792,0x95944378,0xc958b8bf,0x239ea923,0xdf076541,0x4b61a247,
  112787. 0xbb9fc544,0x4d29ce85,0x0b424559,0x9a692a67,0x0e486900,0x6e0ca5a0 },
  112788. { 0x85b3bece,0x6b79a782,0xc61f9892,0x41f35e39,0xae747f82,0xff82099a,
  112789. 0xd0ca59d6,0x58c8ae3f,0x99406b5f,0x4ac930e2,0x9df24243,0x2ce04eb9 } },
  112790. /* 219 */
  112791. { { 0x1ac37b82,0x4366b994,0x25b04d83,0xff0c728d,0x19c47b7c,0x1f551361,
  112792. 0xbeff13e7,0xdbf2d5ed,0xe12a683d,0xf78efd51,0x989cf9c4,0x82cd85b9 },
  112793. { 0xe0cb5d37,0xe23c6db6,0x72ee1a15,0x818aeebd,0x28771b14,0x8212aafd,
  112794. 0x1def817d,0x7bc221d9,0x9445c51f,0xdac403a2,0x12c3746b,0x711b0517 } },
  112795. /* 220 */
  112796. { { 0x5ea99ecc,0x0ed9ed48,0xb8cab5e1,0xf799500d,0xb570cbdc,0xa8ec87dc,
  112797. 0xd35dfaec,0x52cfb2c2,0x6e4d80a4,0x8d31fae2,0xdcdeabe5,0xe6a37dc9 },
  112798. { 0x1deca452,0x5d365a34,0x0d68b44e,0x09a5f8a5,0xa60744b1,0x59238ea5,
  112799. 0xbb4249e9,0xf2fedc0d,0xa909b2e3,0xe395c74e,0x39388250,0xe156d1a5 } },
  112800. /* 221 */
  112801. { { 0x47181ae9,0xd796b3d0,0x44197808,0xbaf44ba8,0x34cf3fac,0xe6933094,
  112802. 0xc3bd5c46,0x41aa6ade,0xeed947c6,0x4fda75d8,0x9ea5a525,0xacd9d412 },
  112803. { 0xd430301b,0x65cc55a3,0x7b52ea49,0x3c9a5bcf,0x159507f0,0x22d319cf,
  112804. 0xde74a8dd,0x2ee0b9b5,0x877ac2b6,0x20c26a1e,0x92e7c314,0x387d73da } },
  112805. /* 222 */
  112806. { { 0x8cd3fdac,0x13c4833e,0x332e5b8e,0x76fcd473,0xe2fe1fd3,0xff671b4b,
  112807. 0x5d98d8ec,0x4d734e8b,0x514bbc11,0xb1ead3c6,0x7b390494,0xd14ca858 },
  112808. { 0x5d2d37e9,0x95a443af,0x00464622,0x73c6ea73,0x15755044,0xa44aeb4b,
  112809. 0xfab58fee,0xba3f8575,0xdc680a6f,0x9779dbc9,0x7b37ddfc,0xe1ee5f5a } },
  112810. /* 223 */
  112811. { { 0x12d29f46,0xcd0b4648,0x0ed53137,0x93295b0b,0x80bef6c9,0xbfe26094,
  112812. 0x54248b00,0xa6565788,0x80e7f9c4,0x69c43fca,0xbe141ea1,0x2190837b },
  112813. { 0xa1b26cfb,0x875e159a,0x7affe852,0x90ca9f87,0x92ca598e,0x15e6550d,
  112814. 0x1938ad11,0xe3e0945d,0x366ef937,0xef7636bb,0xb39869e5,0xb6034d0b } },
  112815. /* 224 */
  112816. { { 0x26d8356e,0x4d255e30,0xd314626f,0xf83666ed,0xd0c8ed64,0x421ddf61,
  112817. 0x26677b61,0x96e473c5,0x9e9b18b3,0xdad4af7e,0xa9393f75,0xfceffd4a },
  112818. { 0x11c731d5,0x843138a1,0xb2f141d9,0x05bcb3a1,0x617b7671,0x20e1fa95,
  112819. 0x88ccec7b,0xbefce812,0x90f1b568,0x582073dc,0x1f055cb7,0xf572261a } },
  112820. /* 225 */
  112821. { { 0x36973088,0xf3148277,0x86a9f980,0xc008e708,0xe046c261,0x1b795947,
  112822. 0xca76bca0,0xdf1e6a7d,0x71acddf0,0xabafd886,0x1364d8f4,0xff7054d9 },
  112823. { 0xe2260594,0x2cf63547,0xd73b277e,0x468a5372,0xef9bd35e,0xc7419e24,
  112824. 0x24043cc3,0x2b4a1c20,0x890b39cd,0xa28f047a,0x46f9a2e3,0xdca2cea1 } },
  112825. /* 226 */
  112826. { { 0x53277538,0xab788736,0xcf697738,0xa734e225,0x6b22e2c1,0x66ee1d1e,
  112827. 0xebe1d212,0x2c615389,0x02bb0766,0xf36cad40,0x3e64f207,0x120885c3 },
  112828. { 0x90fbfec2,0x59e77d56,0xd7a574ae,0xf9e781aa,0x5d045e53,0x801410b0,
  112829. 0xa91b5f0e,0xd3b5f0aa,0x7fbb3521,0xb3d1df00,0xc72bee9a,0x11c4b33e } },
  112830. /* 227 */
  112831. { { 0x83c3a7f3,0xd32b9832,0x88d8a354,0x8083abcf,0x50f4ec5a,0xdeb16404,
  112832. 0x641e2907,0x18d747f0,0xf1bbf03e,0x4e8978ae,0x88a0cd89,0x932447dc },
  112833. { 0xcf3d5897,0x561e0feb,0x13600e6d,0xfc3a682f,0xd16a6b73,0xc78b9d73,
  112834. 0xd29bf580,0xe713fede,0x08d69e5c,0x0a225223,0x1ff7fda4,0x3a924a57 } },
  112835. /* 228 */
  112836. { { 0xb4093bee,0xfb64554c,0xa58c6ec0,0xa6d65a25,0x43d0ed37,0x4126994d,
  112837. 0x55152d44,0xa5689a51,0x284caa8d,0xb8e5ea8c,0xd1f25538,0x33f05d4f },
  112838. { 0x1b615d6e,0xe0fdfe09,0x705507da,0x2ded7e8f,0x17bbcc80,0xdd5631e5,
  112839. 0x267fd11f,0x4f87453e,0xff89d62d,0xc6da723f,0xe3cda21d,0x55cbcae2 } },
  112840. /* 229 */
  112841. { { 0x6b4e84f3,0x336bc94e,0x4ef72c35,0x72863031,0xeeb57f99,0x6d85fdee,
  112842. 0xa42ece1b,0x7f4e3272,0x36f0320a,0x7f86cbb5,0x923331e6,0xf09b6a2b },
  112843. { 0x56778435,0x21d3ecf1,0x8323b2d2,0x2977ba99,0x1704bc0f,0x6a1b57fb,
  112844. 0x389f048a,0xd777cf8b,0xac6b42cd,0x9ce2174f,0x09e6c55a,0x404e2bff } },
  112845. /* 230 */
  112846. { { 0x204c5ddb,0x9b9b135e,0x3eff550e,0x9dbfe044,0xec3be0f6,0x35eab4bf,
  112847. 0x0a43e56f,0x8b4c3f0d,0x0e73f9b3,0x4c1c6673,0x2c78c905,0x92ed38bd },
  112848. { 0xa386e27c,0xc7003f6a,0xaced8507,0xb9c4f46f,0x59df5464,0xea024ec8,
  112849. 0x429572ea,0x4af96152,0xe1fc1194,0x279cd5e2,0x281e358c,0xaa376a03 } },
  112850. /* 231 */
  112851. { { 0x3cdbc95c,0x07859223,0xef2e337a,0xaae1aa6a,0x472a8544,0xc040108d,
  112852. 0x8d037b7d,0x80c853e6,0x8c7eee24,0xd221315c,0x8ee47752,0x195d3856 },
  112853. { 0xdacd7fbe,0xd4b1ba03,0xd3e0c52b,0x4b5ac61e,0x6aab7b52,0x68d3c052,
  112854. 0x660e3fea,0xf0d7248c,0x3145efb4,0xafdb3f89,0x8f40936d,0xa73fd9a3 } },
  112855. /* 232 */
  112856. { { 0xbb1b17ce,0x891b9ef3,0xc6127f31,0x14023667,0x305521fd,0x12b2e58d,
  112857. 0xe3508088,0x3a47e449,0xff751507,0xe49fc84b,0x5310d16e,0x4023f722 },
  112858. { 0xb73399fa,0xa608e5ed,0xd532aa3e,0xf12632d8,0x845e8415,0x13a2758e,
  112859. 0x1fc2d861,0xae4b6f85,0x339d02f2,0x3879f5b1,0x80d99ebd,0x446d22a6 } },
  112860. /* 233 */
  112861. { { 0x4be164f1,0x0f502302,0x88b81920,0x8d09d2d6,0x984aceff,0x514056f1,
  112862. 0x75e9e80d,0xa5c4ddf0,0xdf496a93,0x38cb47e6,0x38df6bf7,0x899e1d6b },
  112863. { 0xb59eb2a6,0x69e87e88,0x9b47f38b,0x280d9d63,0x3654e955,0x599411ea,
  112864. 0x969aa581,0xcf8dd4fd,0x530742a7,0xff5c2baf,0x1a373085,0xa4391536 } },
  112865. /* 234 */
  112866. { { 0xa8a4bdd2,0x6ace72a3,0xb68ef702,0xc656cdd1,0x90c4dad8,0xd4a33e7e,
  112867. 0x9d951c50,0x4aece08a,0x085d68e6,0xea8005ae,0x6f7502b8,0xfdd7a7d7 },
  112868. { 0x98d6fa45,0xce6fb0a6,0x1104eb8c,0x228f8672,0xda09d7dc,0xd23d8787,
  112869. 0x2ae93065,0x5521428b,0xea56c366,0x95faba3d,0x0a88aca5,0xedbe5039 } },
  112870. /* 235 */
  112871. { { 0xbfb26c82,0xd64da0ad,0x952c2f9c,0xe5d70b3c,0xf7e77f68,0xf5e8f365,
  112872. 0x08f2d695,0x7234e002,0xd12e7be6,0xfaf900ee,0x4acf734e,0x27dc6934 },
  112873. { 0xc260a46a,0x80e4ff5e,0x2dc31c28,0x7da5ebce,0xca69f552,0x485c5d73,
  112874. 0x69cc84c2,0xcdfb6b29,0xed6d4eca,0x031c5afe,0x22247637,0xc7bbf4c8 } },
  112875. /* 236 */
  112876. { { 0x49fe01b2,0x9d5b72c7,0x793a91b8,0x34785186,0xcf460438,0xa3ba3c54,
  112877. 0x3ab21b6f,0x73e8e43d,0xbe57b8ab,0x50cde8e0,0xdd204264,0x6488b3a7 },
  112878. { 0xdddc4582,0xa9e398b3,0x5bec46fe,0x1698c1a9,0x156d3843,0x7f1446ef,
  112879. 0x770329a2,0x3fd25dd8,0x2c710668,0x05b1221a,0xa72ee6cf,0x65b2dc2a } },
  112880. /* 237 */
  112881. { { 0xcd021d63,0x21a885f7,0xfea61f08,0x3f344b15,0xc5cf73e6,0xad5ba6dd,
  112882. 0x227a8b23,0x154d0d8f,0xdc559311,0x9b74373c,0x98620fa1,0x4feab715 },
  112883. { 0x7d9ec924,0x5098938e,0x6d47e550,0x84d54a5e,0x1b617506,0x1a2d1bdc,
  112884. 0x615868a4,0x99fe1782,0x3005a924,0x171da780,0x7d8f79b6,0xa70bf5ed } },
  112885. /* 238 */
  112886. { { 0xfe2216c5,0x0bc1250d,0x7601b351,0x2c37e250,0xd6f06b7e,0xb6300175,
  112887. 0x8bfeb9b7,0x4dde8ca1,0xb82f843d,0x4f210432,0xb1ac0afd,0x8d70e2f9 },
  112888. { 0xaae91abb,0x25c73b78,0x863028f2,0x0230dca3,0xe5cf30b7,0x8b923ecf,
  112889. 0x5506f265,0xed754ec2,0x729a5e39,0x8e41b88c,0xbabf889b,0xee67cec2 } },
  112890. /* 239 */
  112891. { { 0x1be46c65,0xe183acf5,0xe7565d7a,0x9789538f,0xd9627b4e,0x87873391,
  112892. 0x9f1d9187,0xbf4ac4c1,0x4691f5c8,0x5db99f63,0x74a1fb98,0xa68df803 },
  112893. { 0xbf92b5fa,0x3c448ed1,0x3e0bdc32,0xa098c841,0x79bf016c,0x8e74cd55,
  112894. 0x115e244d,0x5df0d09c,0x3410b66e,0x9418ad01,0x17a02130,0x8b6124cb } },
  112895. /* 240 */
  112896. { { 0xc26e3392,0x425ec3af,0xa1722e00,0xc07f8470,0xe2356b43,0xdcc28190,
  112897. 0xb1ef59a6,0x4ed97dff,0xc63028c1,0xc22b3ad1,0x68c18988,0x070723c2 },
  112898. { 0x4cf49e7d,0x70da302f,0x3f12a522,0xc5e87c93,0x18594148,0x74acdd1d,
  112899. 0xca74124c,0xad5f73ab,0xd69fd478,0xe72e4a3e,0x7b117cc3,0x61593868 } },
  112900. /* 241 */
  112901. { { 0xa9aa0486,0x7b7b9577,0xa063d557,0x6e41fb35,0xda9047d7,0xb017d5c7,
  112902. 0x68a87ba9,0x8c748280,0xdf08ad93,0xab45fa5c,0x4c288a28,0xcd9fb217 },
  112903. { 0x5747843d,0x59544642,0xa56111e3,0x34d64c6c,0x4bfce8d5,0x12e47ea1,
  112904. 0x6169267f,0x17740e05,0xeed03fb5,0x5c49438e,0x4fc3f513,0x9da30add } },
  112905. /* 242 */
  112906. { { 0xccfa5200,0xc4e85282,0x6a19b13d,0x2707608f,0xf5726e2f,0xdcb9a53d,
  112907. 0xe9427de5,0x612407c9,0xd54d582a,0x3e5a17e1,0x655ae118,0xb99877de },
  112908. { 0x015254de,0x6f0e972b,0xf0a6f7c5,0x92a56db1,0xa656f8b2,0xd297e4e1,
  112909. 0xad981983,0x99fe0052,0x07cfed84,0xd3652d2f,0x843c1738,0xc784352e } },
  112910. /* 243 */
  112911. { { 0x7e9b2d8a,0x6ee90af0,0x57cf1964,0xac8d7018,0x71f28efc,0xf6ed9031,
  112912. 0x6812b20e,0x7f70d5a9,0xf1c61eee,0x27b557f4,0xc6263758,0xf1c9bd57 },
  112913. { 0x2a1a6194,0x5cf7d014,0x1890ab84,0xdd614e0b,0x0e93c2a6,0x3ef9de10,
  112914. 0xe0cd91c5,0xf98cf575,0x14befc32,0x504ec0c6,0x6279d68c,0xd0513a66 } },
  112915. /* 244 */
  112916. { { 0xa859fb6a,0xa8eadbad,0xdb283666,0xcf8346e7,0x3e22e355,0x7b35e61a,
  112917. 0x99639c6b,0x293ece2c,0x56f241c8,0xfa0162e2,0xbf7a1dda,0xd2e6c7b9 },
  112918. { 0x40075e63,0xd0de6253,0xf9ec8286,0x2405aa61,0x8fe45494,0x2237830a,
  112919. 0x364e9c8c,0x4fd01ac7,0x904ba750,0x4d9c3d21,0xaf1b520b,0xd589be14 } },
  112920. /* 245 */
  112921. { { 0x4662e53b,0x13576a4f,0xf9077676,0x35ec2f51,0x97c0af97,0x66297d13,
  112922. 0x9e598b58,0xed3201fe,0x5e70f604,0x49bc752a,0xbb12d951,0xb54af535 },
  112923. { 0x212c1c76,0x36ea4c2b,0xeb250dfd,0x18f5bbc7,0x9a0a1a46,0xa0d466cc,
  112924. 0xdac2d917,0x52564da4,0x8e95fab5,0x206559f4,0x9ca67a33,0x7487c190 } },
  112925. /* 246 */
  112926. { { 0xdde98e9c,0x75abfe37,0x2a411199,0x99b90b26,0xdcdb1f7c,0x1b410996,
  112927. 0x8b3b5675,0xab346f11,0xf1f8ae1e,0x04852193,0x6b8b98c1,0x1ec4d227 },
  112928. { 0x45452baa,0xba3bc926,0xacc4a572,0x387d1858,0xe51f171e,0x9478eff6,
  112929. 0x931e1c00,0xf357077d,0xe54c8ca8,0xffee77cd,0x551dc9a4,0xfb4892ff } },
  112930. /* 247 */
  112931. { { 0x2db8dff8,0x5b1bdad0,0x5a2285a2,0xd462f4fd,0xda00b461,0x1d6aad8e,
  112932. 0x41306d1b,0x43fbefcf,0x6a13fe19,0x428e86f3,0x17f89404,0xc8b2f118 },
  112933. { 0xf0d51afb,0x762528aa,0x549b1d06,0xa3e2fea4,0xea3ddf66,0x86fad8f2,
  112934. 0x4fbdd206,0x0d9ccc4b,0xc189ff5a,0xcde97d4c,0x199f19a6,0xc36793d6 } },
  112935. /* 248 */
  112936. { { 0x51b85197,0xea38909b,0xb4c92895,0xffb17dd0,0x1ddb3f3f,0x0eb0878b,
  112937. 0xc57cf0f2,0xb05d28ff,0x1abd57e2,0xd8bde2e7,0xc40c1b20,0x7f2be28d },
  112938. { 0x299a2d48,0x6554dca2,0x8377982d,0x5130ba2e,0x1071971a,0x8863205f,
  112939. 0x7cf2825d,0x15ee6282,0x03748f2b,0xd4b6c57f,0x430385a0,0xa9e3f4da } },
  112940. /* 249 */
  112941. { { 0x83fbc9c6,0x33eb7cec,0x4541777e,0x24a311c7,0x4f0767fc,0xc81377f7,
  112942. 0x4ab702da,0x12adae36,0x2a779696,0xb7fcb6db,0x01cea6ad,0x4a6fb284 },
  112943. { 0xcdfc73de,0x5e8b1d2a,0x1b02fd32,0xd0efae8d,0xd81d8519,0x3f99c190,
  112944. 0xfc808971,0x3c18f7fa,0x51b7ae7b,0x41f713e7,0xf07fc3f8,0x0a4b3435 } },
  112945. /* 250 */
  112946. { { 0x019b7d2e,0x7dda3c4c,0xd4dc4b89,0x631c8d1a,0x1cdb313c,0x5489cd6e,
  112947. 0x4c07bb06,0xd44aed10,0x75f000d1,0x8f97e13a,0xdda5df4d,0x0e9ee64f },
  112948. { 0x3e346910,0xeaa99f3b,0xfa294ad7,0x622f6921,0x0d0b2fe9,0x22aaa20d,
  112949. 0x1e5881ba,0x4fed2f99,0xc1571802,0x9af3b2d6,0xdc7ee17c,0x919e67a8 } },
  112950. /* 251 */
  112951. { { 0x76250533,0xc724fe4c,0x7d817ef8,0x8a2080e5,0x172c9751,0xa2afb0f4,
  112952. 0x17c0702e,0x9b10cdeb,0xc9b7e3e9,0xbf3975e3,0x1cd0cdc5,0x206117df },
  112953. { 0xbe05ebd5,0xfb049e61,0x16c782c0,0xeb0bb55c,0xab7fed09,0x13a331b8,
  112954. 0x632863f0,0xf6c58b1d,0x4d3b6195,0x6264ef6e,0x9a53f116,0x92c51b63 } },
  112955. /* 252 */
  112956. { { 0x288b364d,0xa57c7bc8,0x7b41e5c4,0x4a562e08,0x698a9a11,0x699d21c6,
  112957. 0xf3f849b9,0xa4ed9581,0x9eb726ba,0xa223eef3,0xcc2884f9,0x13159c23 },
  112958. { 0x3a3f4963,0x73931e58,0x0ada6a81,0x96500389,0x5ab2950b,0x3ee8a1c6,
  112959. 0x775fab52,0xeedf4949,0x4f2671b6,0x63d652e1,0x3c4e2f55,0xfed4491c } },
  112960. /* 253 */
  112961. { { 0xf4eb453e,0x335eadc3,0xcadd1a5b,0x5ff74b63,0x5d84a91a,0x6933d0d7,
  112962. 0xb49ba337,0x9ca3eeb9,0xc04c15b8,0x1f6facce,0xdc09a7e4,0x4ef19326 },
  112963. { 0x3dca3233,0x53d2d324,0xa2259d4b,0x0ee40590,0x5546f002,0x18c22edb,
  112964. 0x09ea6b71,0x92429801,0xb0e91e61,0xaada0add,0x99963c50,0x5fe53ef4 } },
  112965. /* 254 */
  112966. { { 0x90c28c65,0x372dd06b,0x119ce47d,0x1765242c,0x6b22fc82,0xc041fb80,
  112967. 0xb0a7ccc1,0x667edf07,0x1261bece,0xc79599e7,0x19cff22a,0xbc69d9ba },
  112968. { 0x13c06819,0x009d77cd,0xe282b79d,0x635a66ae,0x225b1be8,0x4edac4a6,
  112969. 0x524008f9,0x57d4f4e4,0xb056af84,0xee299ac5,0x3a0bc386,0xcc38444c } },
  112970. /* 255 */
  112971. { { 0xcd4c2356,0x490643b1,0x750547be,0x740a4851,0xd4944c04,0x643eaf29,
  112972. 0x299a98a0,0xba572479,0xee05fdf9,0x48b29f16,0x089b2d7b,0x33fb4f61 },
  112973. { 0xa950f955,0x86704902,0xfedc3ddf,0x97e1034d,0x05fbb6a2,0x211320b6,
  112974. 0x432299bb,0x23d7b93f,0x8590e4a3,0x1fe1a057,0xf58c0ce6,0x8e1d0586 } },
  112975. };
  112976. /* Multiply the base point of P384 by the scalar and return the result.
  112977. * If map is true then convert result to affine coordinates.
  112978. *
  112979. * Stripe implementation.
  112980. * Pre-generated: 2^0, 2^48, ...
  112981. * Pre-generated: products of all combinations of above.
  112982. * 8 doubles and adds (with qz=1)
  112983. *
  112984. * r Resulting point.
  112985. * k Scalar to multiply by.
  112986. * map Indicates whether to convert result to affine.
  112987. * ct Constant time required.
  112988. * heap Heap to use for allocation.
  112989. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  112990. */
  112991. static int sp_384_ecc_mulmod_base_12(sp_point_384* r, const sp_digit* k,
  112992. int map, int ct, void* heap)
  112993. {
  112994. return sp_384_ecc_mulmod_stripe_12(r, &p384_base, p384_table,
  112995. k, map, ct, heap);
  112996. }
  112997. #endif
  112998. /* Multiply the base point of P384 by the scalar and return the result.
  112999. * If map is true then convert result to affine coordinates.
  113000. *
  113001. * km Scalar to multiply by.
  113002. * r Resulting point.
  113003. * map Indicates whether to convert result to affine.
  113004. * heap Heap to use for allocation.
  113005. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  113006. */
  113007. int sp_ecc_mulmod_base_384(const mp_int* km, ecc_point* r, int map, void* heap)
  113008. {
  113009. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113010. sp_point_384* point = NULL;
  113011. sp_digit* k = NULL;
  113012. #else
  113013. sp_point_384 point[1];
  113014. sp_digit k[12];
  113015. #endif
  113016. int err = MP_OKAY;
  113017. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113018. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  113019. DYNAMIC_TYPE_ECC);
  113020. if (point == NULL)
  113021. err = MEMORY_E;
  113022. if (err == MP_OKAY) {
  113023. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  113024. DYNAMIC_TYPE_ECC);
  113025. if (k == NULL)
  113026. err = MEMORY_E;
  113027. }
  113028. #endif
  113029. if (err == MP_OKAY) {
  113030. sp_384_from_mp(k, 12, km);
  113031. err = sp_384_ecc_mulmod_base_12(point, k, map, 1, heap);
  113032. }
  113033. if (err == MP_OKAY) {
  113034. err = sp_384_point_to_ecc_point_12(point, r);
  113035. }
  113036. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113037. if (k != NULL)
  113038. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  113039. if (point != NULL)
  113040. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113041. #endif
  113042. return err;
  113043. }
  113044. /* Multiply the base point of P384 by the scalar, add point a and return
  113045. * the result. If map is true then convert result to affine coordinates.
  113046. *
  113047. * km Scalar to multiply by.
  113048. * am Point to add to scalar mulitply result.
  113049. * inMont Point to add is in montgomery form.
  113050. * r Resulting point.
  113051. * map Indicates whether to convert result to affine.
  113052. * heap Heap to use for allocation.
  113053. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  113054. */
  113055. int sp_ecc_mulmod_base_add_384(const mp_int* km, const ecc_point* am,
  113056. int inMont, ecc_point* r, int map, void* heap)
  113057. {
  113058. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113059. sp_point_384* point = NULL;
  113060. sp_digit* k = NULL;
  113061. #else
  113062. sp_point_384 point[2];
  113063. sp_digit k[12 + 12 * 2 * 6];
  113064. #endif
  113065. sp_point_384* addP = NULL;
  113066. sp_digit* tmp = NULL;
  113067. int err = MP_OKAY;
  113068. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113069. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  113070. DYNAMIC_TYPE_ECC);
  113071. if (point == NULL)
  113072. err = MEMORY_E;
  113073. if (err == MP_OKAY) {
  113074. k = (sp_digit*)XMALLOC(
  113075. sizeof(sp_digit) * (12 + 12 * 2 * 6),
  113076. heap, DYNAMIC_TYPE_ECC);
  113077. if (k == NULL)
  113078. err = MEMORY_E;
  113079. }
  113080. #endif
  113081. if (err == MP_OKAY) {
  113082. addP = point + 1;
  113083. tmp = k + 12;
  113084. sp_384_from_mp(k, 12, km);
  113085. sp_384_point_from_ecc_point_12(addP, am);
  113086. }
  113087. if ((err == MP_OKAY) && (!inMont)) {
  113088. err = sp_384_mod_mul_norm_12(addP->x, addP->x, p384_mod);
  113089. }
  113090. if ((err == MP_OKAY) && (!inMont)) {
  113091. err = sp_384_mod_mul_norm_12(addP->y, addP->y, p384_mod);
  113092. }
  113093. if ((err == MP_OKAY) && (!inMont)) {
  113094. err = sp_384_mod_mul_norm_12(addP->z, addP->z, p384_mod);
  113095. }
  113096. if (err == MP_OKAY) {
  113097. err = sp_384_ecc_mulmod_base_12(point, k, 0, 0, heap);
  113098. }
  113099. if (err == MP_OKAY) {
  113100. sp_384_proj_point_add_12(point, point, addP, tmp);
  113101. if (map) {
  113102. sp_384_map_12(point, point, tmp);
  113103. }
  113104. err = sp_384_point_to_ecc_point_12(point, r);
  113105. }
  113106. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113107. if (k != NULL)
  113108. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  113109. if (point)
  113110. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113111. #endif
  113112. return err;
  113113. }
  113114. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  113115. defined(HAVE_ECC_VERIFY)
  113116. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  113117. /* Add 1 to a. (a = a + 1)
  113118. *
  113119. * a A single precision integer.
  113120. */
  113121. SP_NOINLINE static void sp_384_add_one_12(sp_digit* a)
  113122. {
  113123. __asm__ __volatile__ (
  113124. "movs r2, #1\n\t"
  113125. "ldr r1, [%[a]]\n\t"
  113126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113127. "adds r1, r1, r2\n\t"
  113128. #else
  113129. "add r1, r1, r2\n\t"
  113130. #endif
  113131. "movs r2, #0\n\t"
  113132. "str r1, [%[a]]\n\t"
  113133. "ldr r1, [%[a], #4]\n\t"
  113134. #ifdef WOLFSSL_KEIL
  113135. "adcs r1, r1, r2\n\t"
  113136. #elif defined(__clang__)
  113137. "adcs r1, r2\n\t"
  113138. #else
  113139. "adc r1, r2\n\t"
  113140. #endif
  113141. "str r1, [%[a], #4]\n\t"
  113142. "ldr r1, [%[a], #8]\n\t"
  113143. #ifdef WOLFSSL_KEIL
  113144. "adcs r1, r1, r2\n\t"
  113145. #elif defined(__clang__)
  113146. "adcs r1, r2\n\t"
  113147. #else
  113148. "adc r1, r2\n\t"
  113149. #endif
  113150. "str r1, [%[a], #8]\n\t"
  113151. "ldr r1, [%[a], #12]\n\t"
  113152. #ifdef WOLFSSL_KEIL
  113153. "adcs r1, r1, r2\n\t"
  113154. #elif defined(__clang__)
  113155. "adcs r1, r2\n\t"
  113156. #else
  113157. "adc r1, r2\n\t"
  113158. #endif
  113159. "str r1, [%[a], #12]\n\t"
  113160. "ldr r1, [%[a], #16]\n\t"
  113161. #ifdef WOLFSSL_KEIL
  113162. "adcs r1, r1, r2\n\t"
  113163. #elif defined(__clang__)
  113164. "adcs r1, r2\n\t"
  113165. #else
  113166. "adc r1, r2\n\t"
  113167. #endif
  113168. "str r1, [%[a], #16]\n\t"
  113169. "ldr r1, [%[a], #20]\n\t"
  113170. #ifdef WOLFSSL_KEIL
  113171. "adcs r1, r1, r2\n\t"
  113172. #elif defined(__clang__)
  113173. "adcs r1, r2\n\t"
  113174. #else
  113175. "adc r1, r2\n\t"
  113176. #endif
  113177. "str r1, [%[a], #20]\n\t"
  113178. "ldr r1, [%[a], #24]\n\t"
  113179. #ifdef WOLFSSL_KEIL
  113180. "adcs r1, r1, r2\n\t"
  113181. #elif defined(__clang__)
  113182. "adcs r1, r2\n\t"
  113183. #else
  113184. "adc r1, r2\n\t"
  113185. #endif
  113186. "str r1, [%[a], #24]\n\t"
  113187. "ldr r1, [%[a], #28]\n\t"
  113188. #ifdef WOLFSSL_KEIL
  113189. "adcs r1, r1, r2\n\t"
  113190. #elif defined(__clang__)
  113191. "adcs r1, r2\n\t"
  113192. #else
  113193. "adc r1, r2\n\t"
  113194. #endif
  113195. "str r1, [%[a], #28]\n\t"
  113196. "ldr r1, [%[a], #32]\n\t"
  113197. #ifdef WOLFSSL_KEIL
  113198. "adcs r1, r1, r2\n\t"
  113199. #elif defined(__clang__)
  113200. "adcs r1, r2\n\t"
  113201. #else
  113202. "adc r1, r2\n\t"
  113203. #endif
  113204. "str r1, [%[a], #32]\n\t"
  113205. "ldr r1, [%[a], #36]\n\t"
  113206. #ifdef WOLFSSL_KEIL
  113207. "adcs r1, r1, r2\n\t"
  113208. #elif defined(__clang__)
  113209. "adcs r1, r2\n\t"
  113210. #else
  113211. "adc r1, r2\n\t"
  113212. #endif
  113213. "str r1, [%[a], #36]\n\t"
  113214. "ldr r1, [%[a], #40]\n\t"
  113215. #ifdef WOLFSSL_KEIL
  113216. "adcs r1, r1, r2\n\t"
  113217. #elif defined(__clang__)
  113218. "adcs r1, r2\n\t"
  113219. #else
  113220. "adc r1, r2\n\t"
  113221. #endif
  113222. "str r1, [%[a], #40]\n\t"
  113223. "ldr r1, [%[a], #44]\n\t"
  113224. #ifdef WOLFSSL_KEIL
  113225. "adcs r1, r1, r2\n\t"
  113226. #elif defined(__clang__)
  113227. "adcs r1, r2\n\t"
  113228. #else
  113229. "adc r1, r2\n\t"
  113230. #endif
  113231. "str r1, [%[a], #44]\n\t"
  113232. : [a] "+l" (a)
  113233. :
  113234. : "memory", "r1", "r2"
  113235. );
  113236. }
  113237. /* Read big endian unsigned byte array into r.
  113238. *
  113239. * r A single precision integer.
  113240. * size Maximum number of bytes to convert
  113241. * a Byte array.
  113242. * n Number of bytes in array to read.
  113243. */
  113244. static void sp_384_from_bin(sp_digit* r, int size, const byte* a, int n)
  113245. {
  113246. int i;
  113247. int j;
  113248. byte* d;
  113249. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  113250. r[j] = ((sp_digit)a[i - 0] << 0) |
  113251. ((sp_digit)a[i - 1] << 8) |
  113252. ((sp_digit)a[i - 2] << 16) |
  113253. ((sp_digit)a[i - 3] << 24);
  113254. j++;
  113255. }
  113256. if (i >= 0) {
  113257. r[j] = 0;
  113258. d = (byte*)r;
  113259. switch (i) {
  113260. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  113261. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  113262. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  113263. }
  113264. j++;
  113265. }
  113266. for (; j < size; j++) {
  113267. r[j] = 0;
  113268. }
  113269. }
  113270. /* Generates a scalar that is in the range 1..order-1.
  113271. *
  113272. * rng Random number generator.
  113273. * k Scalar value.
  113274. * returns RNG failures, MEMORY_E when memory allocation fails and
  113275. * MP_OKAY on success.
  113276. */
  113277. static int sp_384_ecc_gen_k_12(WC_RNG* rng, sp_digit* k)
  113278. {
  113279. int err;
  113280. byte buf[48];
  113281. do {
  113282. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  113283. if (err == 0) {
  113284. sp_384_from_bin(k, 12, buf, (int)sizeof(buf));
  113285. if (sp_384_cmp_12(k, p384_order2) <= 0) {
  113286. sp_384_add_one_12(k);
  113287. break;
  113288. }
  113289. }
  113290. }
  113291. while (err == 0);
  113292. return err;
  113293. }
  113294. /* Makes a random EC key pair.
  113295. *
  113296. * rng Random number generator.
  113297. * priv Generated private value.
  113298. * pub Generated public point.
  113299. * heap Heap to use for allocation.
  113300. * returns ECC_INF_E when the point does not have the correct order, RNG
  113301. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  113302. */
  113303. int sp_ecc_make_key_384(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  113304. {
  113305. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113306. sp_point_384* point = NULL;
  113307. sp_digit* k = NULL;
  113308. #else
  113309. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113310. sp_point_384 point[2];
  113311. #else
  113312. sp_point_384 point[1];
  113313. #endif
  113314. sp_digit k[12];
  113315. #endif
  113316. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113317. sp_point_384* infinity = NULL;
  113318. #endif
  113319. int err = MP_OKAY;
  113320. (void)heap;
  113321. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113322. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113323. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC);
  113324. #else
  113325. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC);
  113326. #endif
  113327. if (point == NULL)
  113328. err = MEMORY_E;
  113329. if (err == MP_OKAY) {
  113330. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  113331. DYNAMIC_TYPE_ECC);
  113332. if (k == NULL)
  113333. err = MEMORY_E;
  113334. }
  113335. #endif
  113336. if (err == MP_OKAY) {
  113337. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113338. infinity = point + 1;
  113339. #endif
  113340. err = sp_384_ecc_gen_k_12(rng, k);
  113341. }
  113342. if (err == MP_OKAY) {
  113343. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, NULL);
  113344. }
  113345. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  113346. if (err == MP_OKAY) {
  113347. err = sp_384_ecc_mulmod_12(infinity, point, p384_order, 1, 1, NULL);
  113348. }
  113349. if (err == MP_OKAY) {
  113350. if (sp_384_iszero_12(point->x) || sp_384_iszero_12(point->y)) {
  113351. err = ECC_INF_E;
  113352. }
  113353. }
  113354. #endif
  113355. if (err == MP_OKAY) {
  113356. err = sp_384_to_mp(k, priv);
  113357. }
  113358. if (err == MP_OKAY) {
  113359. err = sp_384_point_to_ecc_point_12(point, pub);
  113360. }
  113361. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113362. if (k != NULL)
  113363. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  113364. if (point != NULL) {
  113365. /* point is not sensitive, so no need to zeroize */
  113366. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113367. }
  113368. #endif
  113369. return err;
  113370. }
  113371. #ifdef HAVE_ECC_DHE
  113372. /* Write r as big endian to byte array.
  113373. * Fixed length number of bytes written: 48
  113374. *
  113375. * r A single precision integer.
  113376. * a Byte array.
  113377. */
  113378. static void sp_384_to_bin_12(sp_digit* r, byte* a)
  113379. {
  113380. int i;
  113381. int j = 0;
  113382. for (i = 11; i >= 0; i--) {
  113383. a[j++] = r[i] >> 24;
  113384. a[j++] = r[i] >> 16;
  113385. a[j++] = r[i] >> 8;
  113386. a[j++] = r[i] >> 0;
  113387. }
  113388. }
  113389. /* Multiply the point by the scalar and serialize the X ordinate.
  113390. * The number is 0 padded to maximum size on output.
  113391. *
  113392. * priv Scalar to multiply the point by.
  113393. * pub Point to multiply.
  113394. * out Buffer to hold X ordinate.
  113395. * outLen On entry, size of the buffer in bytes.
  113396. * On exit, length of data in buffer in bytes.
  113397. * heap Heap to use for allocation.
  113398. * returns BUFFER_E if the buffer is to small for output size,
  113399. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  113400. */
  113401. int sp_ecc_secret_gen_384(const mp_int* priv, const ecc_point* pub, byte* out,
  113402. word32* outLen, void* heap)
  113403. {
  113404. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113405. sp_point_384* point = NULL;
  113406. sp_digit* k = NULL;
  113407. #else
  113408. sp_point_384 point[1];
  113409. sp_digit k[12];
  113410. #endif
  113411. int err = MP_OKAY;
  113412. if (*outLen < 48U) {
  113413. err = BUFFER_E;
  113414. }
  113415. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113416. if (err == MP_OKAY) {
  113417. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  113418. DYNAMIC_TYPE_ECC);
  113419. if (point == NULL)
  113420. err = MEMORY_E;
  113421. }
  113422. if (err == MP_OKAY) {
  113423. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  113424. DYNAMIC_TYPE_ECC);
  113425. if (k == NULL)
  113426. err = MEMORY_E;
  113427. }
  113428. #endif
  113429. if (err == MP_OKAY) {
  113430. sp_384_from_mp(k, 12, priv);
  113431. sp_384_point_from_ecc_point_12(point, pub);
  113432. err = sp_384_ecc_mulmod_12(point, point, k, 1, 1, heap);
  113433. }
  113434. if (err == MP_OKAY) {
  113435. sp_384_to_bin_12(point->x, out);
  113436. *outLen = 48;
  113437. }
  113438. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  113439. if (k != NULL)
  113440. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  113441. if (point != NULL)
  113442. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  113443. #endif
  113444. return err;
  113445. }
  113446. #endif /* HAVE_ECC_DHE */
  113447. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  113448. #endif
  113449. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  113450. #endif
  113451. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  113452. #ifdef WOLFSSL_SP_SMALL
  113453. /* Sub b from a into a. (a -= b)
  113454. *
  113455. * a A single precision integer.
  113456. * b A single precision integer.
  113457. */
  113458. SP_NOINLINE static sp_digit sp_384_sub_in_place_12(sp_digit* a,
  113459. const sp_digit* b)
  113460. {
  113461. __asm__ __volatile__ (
  113462. "movs r7, %[a]\n\t"
  113463. "movs r2, #0\n\t"
  113464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113465. "adds r7, r7, #48\n\t"
  113466. #else
  113467. "add r7, r7, #48\n\t"
  113468. #endif
  113469. "\n"
  113470. "L_sp_384_sub_in_place_12_words_%=:\n\t"
  113471. "movs r5, #0\n\t"
  113472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113473. "subs r5, r5, r2\n\t"
  113474. #else
  113475. "sub r5, r5, r2\n\t"
  113476. #endif
  113477. "ldr r3, [%[a]]\n\t"
  113478. "ldr r4, [%[a], #4]\n\t"
  113479. "ldr r5, [%[b]]\n\t"
  113480. "ldr r6, [%[b], #4]\n\t"
  113481. #ifdef WOLFSSL_KEIL
  113482. "sbcs r3, r3, r5\n\t"
  113483. #elif defined(__clang__)
  113484. "sbcs r3, r5\n\t"
  113485. #else
  113486. "sbc r3, r5\n\t"
  113487. #endif
  113488. #ifdef WOLFSSL_KEIL
  113489. "sbcs r4, r4, r6\n\t"
  113490. #elif defined(__clang__)
  113491. "sbcs r4, r6\n\t"
  113492. #else
  113493. "sbc r4, r6\n\t"
  113494. #endif
  113495. "str r3, [%[a]]\n\t"
  113496. "str r4, [%[a], #4]\n\t"
  113497. #ifdef WOLFSSL_KEIL
  113498. "sbcs r2, r2, r2\n\t"
  113499. #elif defined(__clang__)
  113500. "sbcs r2, r2\n\t"
  113501. #else
  113502. "sbc r2, r2\n\t"
  113503. #endif
  113504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113505. "adds %[a], %[a], #8\n\t"
  113506. #else
  113507. "add %[a], %[a], #8\n\t"
  113508. #endif
  113509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113510. "adds %[b], %[b], #8\n\t"
  113511. #else
  113512. "add %[b], %[b], #8\n\t"
  113513. #endif
  113514. "cmp %[a], r7\n\t"
  113515. "bne L_sp_384_sub_in_place_12_words_%=\n\t"
  113516. "movs %[a], r2\n\t"
  113517. : [a] "+l" (a), [b] "+l" (b)
  113518. :
  113519. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  113520. );
  113521. return (uint32_t)(size_t)a;
  113522. }
  113523. #else
  113524. /* Sub b from a into a. (a -= b)
  113525. *
  113526. * a A single precision integer.
  113527. * b A single precision integer.
  113528. */
  113529. SP_NOINLINE static sp_digit sp_384_sub_in_place_12(sp_digit* a,
  113530. const sp_digit* b)
  113531. {
  113532. __asm__ __volatile__ (
  113533. "ldm %[b]!, {r4, r5}\n\t"
  113534. "ldr r2, [%[a]]\n\t"
  113535. "ldr r3, [%[a], #4]\n\t"
  113536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113537. "subs r2, r2, r4\n\t"
  113538. #else
  113539. "sub r2, r2, r4\n\t"
  113540. #endif
  113541. #ifdef WOLFSSL_KEIL
  113542. "sbcs r3, r3, r5\n\t"
  113543. #elif defined(__clang__)
  113544. "sbcs r3, r5\n\t"
  113545. #else
  113546. "sbc r3, r5\n\t"
  113547. #endif
  113548. "stm %[a]!, {r2, r3}\n\t"
  113549. "ldm %[b]!, {r4, r5}\n\t"
  113550. "ldr r2, [%[a]]\n\t"
  113551. "ldr r3, [%[a], #4]\n\t"
  113552. #ifdef WOLFSSL_KEIL
  113553. "sbcs r2, r2, r4\n\t"
  113554. #elif defined(__clang__)
  113555. "sbcs r2, r4\n\t"
  113556. #else
  113557. "sbc r2, r4\n\t"
  113558. #endif
  113559. #ifdef WOLFSSL_KEIL
  113560. "sbcs r3, r3, r5\n\t"
  113561. #elif defined(__clang__)
  113562. "sbcs r3, r5\n\t"
  113563. #else
  113564. "sbc r3, r5\n\t"
  113565. #endif
  113566. "stm %[a]!, {r2, r3}\n\t"
  113567. "ldm %[b]!, {r4, r5}\n\t"
  113568. "ldr r2, [%[a]]\n\t"
  113569. "ldr r3, [%[a], #4]\n\t"
  113570. #ifdef WOLFSSL_KEIL
  113571. "sbcs r2, r2, r4\n\t"
  113572. #elif defined(__clang__)
  113573. "sbcs r2, r4\n\t"
  113574. #else
  113575. "sbc r2, r4\n\t"
  113576. #endif
  113577. #ifdef WOLFSSL_KEIL
  113578. "sbcs r3, r3, r5\n\t"
  113579. #elif defined(__clang__)
  113580. "sbcs r3, r5\n\t"
  113581. #else
  113582. "sbc r3, r5\n\t"
  113583. #endif
  113584. "stm %[a]!, {r2, r3}\n\t"
  113585. "ldm %[b]!, {r4, r5}\n\t"
  113586. "ldr r2, [%[a]]\n\t"
  113587. "ldr r3, [%[a], #4]\n\t"
  113588. #ifdef WOLFSSL_KEIL
  113589. "sbcs r2, r2, r4\n\t"
  113590. #elif defined(__clang__)
  113591. "sbcs r2, r4\n\t"
  113592. #else
  113593. "sbc r2, r4\n\t"
  113594. #endif
  113595. #ifdef WOLFSSL_KEIL
  113596. "sbcs r3, r3, r5\n\t"
  113597. #elif defined(__clang__)
  113598. "sbcs r3, r5\n\t"
  113599. #else
  113600. "sbc r3, r5\n\t"
  113601. #endif
  113602. "stm %[a]!, {r2, r3}\n\t"
  113603. "ldm %[b]!, {r4, r5}\n\t"
  113604. "ldr r2, [%[a]]\n\t"
  113605. "ldr r3, [%[a], #4]\n\t"
  113606. #ifdef WOLFSSL_KEIL
  113607. "sbcs r2, r2, r4\n\t"
  113608. #elif defined(__clang__)
  113609. "sbcs r2, r4\n\t"
  113610. #else
  113611. "sbc r2, r4\n\t"
  113612. #endif
  113613. #ifdef WOLFSSL_KEIL
  113614. "sbcs r3, r3, r5\n\t"
  113615. #elif defined(__clang__)
  113616. "sbcs r3, r5\n\t"
  113617. #else
  113618. "sbc r3, r5\n\t"
  113619. #endif
  113620. "stm %[a]!, {r2, r3}\n\t"
  113621. "ldm %[b]!, {r4, r5}\n\t"
  113622. "ldr r2, [%[a]]\n\t"
  113623. "ldr r3, [%[a], #4]\n\t"
  113624. #ifdef WOLFSSL_KEIL
  113625. "sbcs r2, r2, r4\n\t"
  113626. #elif defined(__clang__)
  113627. "sbcs r2, r4\n\t"
  113628. #else
  113629. "sbc r2, r4\n\t"
  113630. #endif
  113631. #ifdef WOLFSSL_KEIL
  113632. "sbcs r3, r3, r5\n\t"
  113633. #elif defined(__clang__)
  113634. "sbcs r3, r5\n\t"
  113635. #else
  113636. "sbc r3, r5\n\t"
  113637. #endif
  113638. "stm %[a]!, {r2, r3}\n\t"
  113639. #ifdef WOLFSSL_KEIL
  113640. "sbcs %[a], %[a], %[a]\n\t"
  113641. #elif defined(__clang__)
  113642. "sbcs %[a], %[a]\n\t"
  113643. #else
  113644. "sbc %[a], %[a]\n\t"
  113645. #endif
  113646. : [a] "+l" (a), [b] "+l" (b)
  113647. :
  113648. : "memory", "r2", "r3", "r4", "r5"
  113649. );
  113650. return (uint32_t)(size_t)a;
  113651. }
  113652. #endif /* WOLFSSL_SP_SMALL */
  113653. /* Mul a by digit b into r. (r = a * b)
  113654. *
  113655. * r A single precision integer.
  113656. * a A single precision integer.
  113657. * b A single precision digit.
  113658. */
  113659. SP_NOINLINE static void sp_384_mul_d_12(sp_digit* r, const sp_digit* a,
  113660. sp_digit b)
  113661. {
  113662. __asm__ __volatile__ (
  113663. "movs r6, #48\n\t"
  113664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113665. "adds r6, r6, %[a]\n\t"
  113666. #else
  113667. "add r6, r6, %[a]\n\t"
  113668. #endif
  113669. "mov r8, %[r]\n\t"
  113670. "mov r9, r6\n\t"
  113671. "movs r3, #0\n\t"
  113672. "movs r4, #0\n\t"
  113673. "\n"
  113674. "L_sp_384_mul_d_12_%=:\n\t"
  113675. "movs %[r], #0\n\t"
  113676. "movs r5, #0\n\t"
  113677. "# A[] * B\n\t"
  113678. "ldrh r6, [%[a]]\n\t"
  113679. "uxth r7, %[b]\n\t"
  113680. #ifdef WOLFSSL_KEIL
  113681. "muls r7, r6, r7\n\t"
  113682. #elif defined(__clang__)
  113683. "muls r7, r6\n\t"
  113684. #else
  113685. "mul r7, r6\n\t"
  113686. #endif
  113687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113688. "adds r3, r3, r7\n\t"
  113689. #else
  113690. "add r3, r3, r7\n\t"
  113691. #endif
  113692. #ifdef WOLFSSL_KEIL
  113693. "adcs r4, r4, %[r]\n\t"
  113694. #elif defined(__clang__)
  113695. "adcs r4, %[r]\n\t"
  113696. #else
  113697. "adc r4, %[r]\n\t"
  113698. #endif
  113699. #ifdef WOLFSSL_KEIL
  113700. "adcs r5, r5, %[r]\n\t"
  113701. #elif defined(__clang__)
  113702. "adcs r5, %[r]\n\t"
  113703. #else
  113704. "adc r5, %[r]\n\t"
  113705. #endif
  113706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113707. "lsrs r7, %[b], #16\n\t"
  113708. #else
  113709. "lsr r7, %[b], #16\n\t"
  113710. #endif
  113711. #ifdef WOLFSSL_KEIL
  113712. "muls r6, r7, r6\n\t"
  113713. #elif defined(__clang__)
  113714. "muls r6, r7\n\t"
  113715. #else
  113716. "mul r6, r7\n\t"
  113717. #endif
  113718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113719. "lsrs r7, r6, #16\n\t"
  113720. #else
  113721. "lsr r7, r6, #16\n\t"
  113722. #endif
  113723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113724. "lsls r6, r6, #16\n\t"
  113725. #else
  113726. "lsl r6, r6, #16\n\t"
  113727. #endif
  113728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113729. "adds r3, r3, r6\n\t"
  113730. #else
  113731. "add r3, r3, r6\n\t"
  113732. #endif
  113733. #ifdef WOLFSSL_KEIL
  113734. "adcs r4, r4, r7\n\t"
  113735. #elif defined(__clang__)
  113736. "adcs r4, r7\n\t"
  113737. #else
  113738. "adc r4, r7\n\t"
  113739. #endif
  113740. #ifdef WOLFSSL_KEIL
  113741. "adcs r5, r5, %[r]\n\t"
  113742. #elif defined(__clang__)
  113743. "adcs r5, %[r]\n\t"
  113744. #else
  113745. "adc r5, %[r]\n\t"
  113746. #endif
  113747. "ldr r6, [%[a]]\n\t"
  113748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113749. "lsrs r6, r6, #16\n\t"
  113750. #else
  113751. "lsr r6, r6, #16\n\t"
  113752. #endif
  113753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113754. "lsrs r7, %[b], #16\n\t"
  113755. #else
  113756. "lsr r7, %[b], #16\n\t"
  113757. #endif
  113758. #ifdef WOLFSSL_KEIL
  113759. "muls r7, r6, r7\n\t"
  113760. #elif defined(__clang__)
  113761. "muls r7, r6\n\t"
  113762. #else
  113763. "mul r7, r6\n\t"
  113764. #endif
  113765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113766. "adds r4, r4, r7\n\t"
  113767. #else
  113768. "add r4, r4, r7\n\t"
  113769. #endif
  113770. #ifdef WOLFSSL_KEIL
  113771. "adcs r5, r5, %[r]\n\t"
  113772. #elif defined(__clang__)
  113773. "adcs r5, %[r]\n\t"
  113774. #else
  113775. "adc r5, %[r]\n\t"
  113776. #endif
  113777. "uxth r7, %[b]\n\t"
  113778. #ifdef WOLFSSL_KEIL
  113779. "muls r6, r7, r6\n\t"
  113780. #elif defined(__clang__)
  113781. "muls r6, r7\n\t"
  113782. #else
  113783. "mul r6, r7\n\t"
  113784. #endif
  113785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113786. "lsrs r7, r6, #16\n\t"
  113787. #else
  113788. "lsr r7, r6, #16\n\t"
  113789. #endif
  113790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113791. "lsls r6, r6, #16\n\t"
  113792. #else
  113793. "lsl r6, r6, #16\n\t"
  113794. #endif
  113795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113796. "adds r3, r3, r6\n\t"
  113797. #else
  113798. "add r3, r3, r6\n\t"
  113799. #endif
  113800. #ifdef WOLFSSL_KEIL
  113801. "adcs r4, r4, r7\n\t"
  113802. #elif defined(__clang__)
  113803. "adcs r4, r7\n\t"
  113804. #else
  113805. "adc r4, r7\n\t"
  113806. #endif
  113807. #ifdef WOLFSSL_KEIL
  113808. "adcs r5, r5, %[r]\n\t"
  113809. #elif defined(__clang__)
  113810. "adcs r5, %[r]\n\t"
  113811. #else
  113812. "adc r5, %[r]\n\t"
  113813. #endif
  113814. "# A[] * B - Done\n\t"
  113815. "mov %[r], r8\n\t"
  113816. "str r3, [%[r]]\n\t"
  113817. "movs r3, r4\n\t"
  113818. "movs r4, r5\n\t"
  113819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113820. "adds %[r], %[r], #4\n\t"
  113821. #else
  113822. "add %[r], %[r], #4\n\t"
  113823. #endif
  113824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113825. "adds %[a], %[a], #4\n\t"
  113826. #else
  113827. "add %[a], %[a], #4\n\t"
  113828. #endif
  113829. "mov r8, %[r]\n\t"
  113830. "cmp %[a], r9\n\t"
  113831. "blt L_sp_384_mul_d_12_%=\n\t"
  113832. "str r3, [%[r]]\n\t"
  113833. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  113834. :
  113835. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  113836. );
  113837. }
  113838. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  113839. *
  113840. * d1 The high order half of the number to divide.
  113841. * d0 The low order half of the number to divide.
  113842. * div The divisor.
  113843. * returns the result of the division.
  113844. *
  113845. * Note that this is an approximate div. It may give an answer 1 larger.
  113846. */
  113847. SP_NOINLINE static sp_digit div_384_word_12(sp_digit d1, sp_digit d0,
  113848. sp_digit div)
  113849. {
  113850. __asm__ __volatile__ (
  113851. "movs r3, #0\n\t"
  113852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113853. "lsrs r5, %[div], #1\n\t"
  113854. #else
  113855. "lsr r5, %[div], #1\n\t"
  113856. #endif
  113857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113858. "adds r5, r5, #1\n\t"
  113859. #else
  113860. "add r5, r5, #1\n\t"
  113861. #endif
  113862. "mov r8, %[d0]\n\t"
  113863. "mov r9, %[d1]\n\t"
  113864. "# Do top 32\n\t"
  113865. "movs r6, r5\n\t"
  113866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113867. "subs r6, r6, %[d1]\n\t"
  113868. #else
  113869. "sub r6, r6, %[d1]\n\t"
  113870. #endif
  113871. #ifdef WOLFSSL_KEIL
  113872. "sbcs r6, r6, r6\n\t"
  113873. #elif defined(__clang__)
  113874. "sbcs r6, r6\n\t"
  113875. #else
  113876. "sbc r6, r6\n\t"
  113877. #endif
  113878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113879. "adds r3, r3, r3\n\t"
  113880. #else
  113881. "add r3, r3, r3\n\t"
  113882. #endif
  113883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113884. "subs r3, r3, r6\n\t"
  113885. #else
  113886. "sub r3, r3, r6\n\t"
  113887. #endif
  113888. #ifdef WOLFSSL_KEIL
  113889. "ands r6, r6, r5\n\t"
  113890. #elif defined(__clang__)
  113891. "ands r6, r5\n\t"
  113892. #else
  113893. "and r6, r5\n\t"
  113894. #endif
  113895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113896. "subs %[d1], %[d1], r6\n\t"
  113897. #else
  113898. "sub %[d1], %[d1], r6\n\t"
  113899. #endif
  113900. "movs r4, #29\n\t"
  113901. "\n"
  113902. "L_div_384_word_12_loop_%=:\n\t"
  113903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113904. "lsls %[d0], %[d0], #1\n\t"
  113905. #else
  113906. "lsl %[d0], %[d0], #1\n\t"
  113907. #endif
  113908. #ifdef WOLFSSL_KEIL
  113909. "adcs %[d1], %[d1], %[d1]\n\t"
  113910. #elif defined(__clang__)
  113911. "adcs %[d1], %[d1]\n\t"
  113912. #else
  113913. "adc %[d1], %[d1]\n\t"
  113914. #endif
  113915. "movs r6, r5\n\t"
  113916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113917. "subs r6, r6, %[d1]\n\t"
  113918. #else
  113919. "sub r6, r6, %[d1]\n\t"
  113920. #endif
  113921. #ifdef WOLFSSL_KEIL
  113922. "sbcs r6, r6, r6\n\t"
  113923. #elif defined(__clang__)
  113924. "sbcs r6, r6\n\t"
  113925. #else
  113926. "sbc r6, r6\n\t"
  113927. #endif
  113928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113929. "adds r3, r3, r3\n\t"
  113930. #else
  113931. "add r3, r3, r3\n\t"
  113932. #endif
  113933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113934. "subs r3, r3, r6\n\t"
  113935. #else
  113936. "sub r3, r3, r6\n\t"
  113937. #endif
  113938. #ifdef WOLFSSL_KEIL
  113939. "ands r6, r6, r5\n\t"
  113940. #elif defined(__clang__)
  113941. "ands r6, r5\n\t"
  113942. #else
  113943. "and r6, r5\n\t"
  113944. #endif
  113945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113946. "subs %[d1], %[d1], r6\n\t"
  113947. #else
  113948. "sub %[d1], %[d1], r6\n\t"
  113949. #endif
  113950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113951. "subs r4, r4, #1\n\t"
  113952. #else
  113953. "sub r4, r4, #1\n\t"
  113954. #endif
  113955. "bpl L_div_384_word_12_loop_%=\n\t"
  113956. "movs r7, #0\n\t"
  113957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113958. "adds r3, r3, r3\n\t"
  113959. #else
  113960. "add r3, r3, r3\n\t"
  113961. #endif
  113962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113963. "adds r3, r3, #1\n\t"
  113964. #else
  113965. "add r3, r3, #1\n\t"
  113966. #endif
  113967. "# r * div - Start\n\t"
  113968. "uxth %[d1], r3\n\t"
  113969. "uxth r4, %[div]\n\t"
  113970. #ifdef WOLFSSL_KEIL
  113971. "muls r4, %[d1], r4\n\t"
  113972. #elif defined(__clang__)
  113973. "muls r4, %[d1]\n\t"
  113974. #else
  113975. "mul r4, %[d1]\n\t"
  113976. #endif
  113977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113978. "lsrs r6, %[div], #16\n\t"
  113979. #else
  113980. "lsr r6, %[div], #16\n\t"
  113981. #endif
  113982. #ifdef WOLFSSL_KEIL
  113983. "muls %[d1], r6, %[d1]\n\t"
  113984. #elif defined(__clang__)
  113985. "muls %[d1], r6\n\t"
  113986. #else
  113987. "mul %[d1], r6\n\t"
  113988. #endif
  113989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113990. "lsrs r5, %[d1], #16\n\t"
  113991. #else
  113992. "lsr r5, %[d1], #16\n\t"
  113993. #endif
  113994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  113995. "lsls %[d1], %[d1], #16\n\t"
  113996. #else
  113997. "lsl %[d1], %[d1], #16\n\t"
  113998. #endif
  113999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114000. "adds r4, r4, %[d1]\n\t"
  114001. #else
  114002. "add r4, r4, %[d1]\n\t"
  114003. #endif
  114004. #ifdef WOLFSSL_KEIL
  114005. "adcs r5, r5, r7\n\t"
  114006. #elif defined(__clang__)
  114007. "adcs r5, r7\n\t"
  114008. #else
  114009. "adc r5, r7\n\t"
  114010. #endif
  114011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114012. "lsrs %[d1], r3, #16\n\t"
  114013. #else
  114014. "lsr %[d1], r3, #16\n\t"
  114015. #endif
  114016. #ifdef WOLFSSL_KEIL
  114017. "muls r6, %[d1], r6\n\t"
  114018. #elif defined(__clang__)
  114019. "muls r6, %[d1]\n\t"
  114020. #else
  114021. "mul r6, %[d1]\n\t"
  114022. #endif
  114023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114024. "adds r5, r5, r6\n\t"
  114025. #else
  114026. "add r5, r5, r6\n\t"
  114027. #endif
  114028. "uxth r6, %[div]\n\t"
  114029. #ifdef WOLFSSL_KEIL
  114030. "muls %[d1], r6, %[d1]\n\t"
  114031. #elif defined(__clang__)
  114032. "muls %[d1], r6\n\t"
  114033. #else
  114034. "mul %[d1], r6\n\t"
  114035. #endif
  114036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114037. "lsrs r6, %[d1], #16\n\t"
  114038. #else
  114039. "lsr r6, %[d1], #16\n\t"
  114040. #endif
  114041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114042. "lsls %[d1], %[d1], #16\n\t"
  114043. #else
  114044. "lsl %[d1], %[d1], #16\n\t"
  114045. #endif
  114046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114047. "adds r4, r4, %[d1]\n\t"
  114048. #else
  114049. "add r4, r4, %[d1]\n\t"
  114050. #endif
  114051. #ifdef WOLFSSL_KEIL
  114052. "adcs r5, r5, r6\n\t"
  114053. #elif defined(__clang__)
  114054. "adcs r5, r6\n\t"
  114055. #else
  114056. "adc r5, r6\n\t"
  114057. #endif
  114058. "# r * div - Done\n\t"
  114059. "mov %[d1], r8\n\t"
  114060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114061. "subs %[d1], %[d1], r4\n\t"
  114062. #else
  114063. "sub %[d1], %[d1], r4\n\t"
  114064. #endif
  114065. "movs r4, %[d1]\n\t"
  114066. "mov %[d1], r9\n\t"
  114067. #ifdef WOLFSSL_KEIL
  114068. "sbcs %[d1], %[d1], r5\n\t"
  114069. #elif defined(__clang__)
  114070. "sbcs %[d1], r5\n\t"
  114071. #else
  114072. "sbc %[d1], r5\n\t"
  114073. #endif
  114074. "movs r5, %[d1]\n\t"
  114075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114076. "adds r3, r3, r5\n\t"
  114077. #else
  114078. "add r3, r3, r5\n\t"
  114079. #endif
  114080. "# r * div - Start\n\t"
  114081. "uxth %[d1], r3\n\t"
  114082. "uxth r4, %[div]\n\t"
  114083. #ifdef WOLFSSL_KEIL
  114084. "muls r4, %[d1], r4\n\t"
  114085. #elif defined(__clang__)
  114086. "muls r4, %[d1]\n\t"
  114087. #else
  114088. "mul r4, %[d1]\n\t"
  114089. #endif
  114090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114091. "lsrs r6, %[div], #16\n\t"
  114092. #else
  114093. "lsr r6, %[div], #16\n\t"
  114094. #endif
  114095. #ifdef WOLFSSL_KEIL
  114096. "muls %[d1], r6, %[d1]\n\t"
  114097. #elif defined(__clang__)
  114098. "muls %[d1], r6\n\t"
  114099. #else
  114100. "mul %[d1], r6\n\t"
  114101. #endif
  114102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114103. "lsrs r5, %[d1], #16\n\t"
  114104. #else
  114105. "lsr r5, %[d1], #16\n\t"
  114106. #endif
  114107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114108. "lsls %[d1], %[d1], #16\n\t"
  114109. #else
  114110. "lsl %[d1], %[d1], #16\n\t"
  114111. #endif
  114112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114113. "adds r4, r4, %[d1]\n\t"
  114114. #else
  114115. "add r4, r4, %[d1]\n\t"
  114116. #endif
  114117. #ifdef WOLFSSL_KEIL
  114118. "adcs r5, r5, r7\n\t"
  114119. #elif defined(__clang__)
  114120. "adcs r5, r7\n\t"
  114121. #else
  114122. "adc r5, r7\n\t"
  114123. #endif
  114124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114125. "lsrs %[d1], r3, #16\n\t"
  114126. #else
  114127. "lsr %[d1], r3, #16\n\t"
  114128. #endif
  114129. #ifdef WOLFSSL_KEIL
  114130. "muls r6, %[d1], r6\n\t"
  114131. #elif defined(__clang__)
  114132. "muls r6, %[d1]\n\t"
  114133. #else
  114134. "mul r6, %[d1]\n\t"
  114135. #endif
  114136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114137. "adds r5, r5, r6\n\t"
  114138. #else
  114139. "add r5, r5, r6\n\t"
  114140. #endif
  114141. "uxth r6, %[div]\n\t"
  114142. #ifdef WOLFSSL_KEIL
  114143. "muls %[d1], r6, %[d1]\n\t"
  114144. #elif defined(__clang__)
  114145. "muls %[d1], r6\n\t"
  114146. #else
  114147. "mul %[d1], r6\n\t"
  114148. #endif
  114149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114150. "lsrs r6, %[d1], #16\n\t"
  114151. #else
  114152. "lsr r6, %[d1], #16\n\t"
  114153. #endif
  114154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114155. "lsls %[d1], %[d1], #16\n\t"
  114156. #else
  114157. "lsl %[d1], %[d1], #16\n\t"
  114158. #endif
  114159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114160. "adds r4, r4, %[d1]\n\t"
  114161. #else
  114162. "add r4, r4, %[d1]\n\t"
  114163. #endif
  114164. #ifdef WOLFSSL_KEIL
  114165. "adcs r5, r5, r6\n\t"
  114166. #elif defined(__clang__)
  114167. "adcs r5, r6\n\t"
  114168. #else
  114169. "adc r5, r6\n\t"
  114170. #endif
  114171. "# r * div - Done\n\t"
  114172. "mov %[d1], r8\n\t"
  114173. "mov r6, r9\n\t"
  114174. #ifdef WOLFSSL_KEIL
  114175. "subs r4, %[d1], r4\n\t"
  114176. #else
  114177. #ifdef __clang__
  114178. "subs r4, %[d1], r4\n\t"
  114179. #else
  114180. "sub r4, %[d1], r4\n\t"
  114181. #endif
  114182. #endif
  114183. #ifdef WOLFSSL_KEIL
  114184. "sbcs r6, r6, r5\n\t"
  114185. #elif defined(__clang__)
  114186. "sbcs r6, r5\n\t"
  114187. #else
  114188. "sbc r6, r5\n\t"
  114189. #endif
  114190. "movs r5, r6\n\t"
  114191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114192. "adds r3, r3, r5\n\t"
  114193. #else
  114194. "add r3, r3, r5\n\t"
  114195. #endif
  114196. "# r * div - Start\n\t"
  114197. "uxth %[d1], r3\n\t"
  114198. "uxth r4, %[div]\n\t"
  114199. #ifdef WOLFSSL_KEIL
  114200. "muls r4, %[d1], r4\n\t"
  114201. #elif defined(__clang__)
  114202. "muls r4, %[d1]\n\t"
  114203. #else
  114204. "mul r4, %[d1]\n\t"
  114205. #endif
  114206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114207. "lsrs r6, %[div], #16\n\t"
  114208. #else
  114209. "lsr r6, %[div], #16\n\t"
  114210. #endif
  114211. #ifdef WOLFSSL_KEIL
  114212. "muls %[d1], r6, %[d1]\n\t"
  114213. #elif defined(__clang__)
  114214. "muls %[d1], r6\n\t"
  114215. #else
  114216. "mul %[d1], r6\n\t"
  114217. #endif
  114218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114219. "lsrs r5, %[d1], #16\n\t"
  114220. #else
  114221. "lsr r5, %[d1], #16\n\t"
  114222. #endif
  114223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114224. "lsls %[d1], %[d1], #16\n\t"
  114225. #else
  114226. "lsl %[d1], %[d1], #16\n\t"
  114227. #endif
  114228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114229. "adds r4, r4, %[d1]\n\t"
  114230. #else
  114231. "add r4, r4, %[d1]\n\t"
  114232. #endif
  114233. #ifdef WOLFSSL_KEIL
  114234. "adcs r5, r5, r7\n\t"
  114235. #elif defined(__clang__)
  114236. "adcs r5, r7\n\t"
  114237. #else
  114238. "adc r5, r7\n\t"
  114239. #endif
  114240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114241. "lsrs %[d1], r3, #16\n\t"
  114242. #else
  114243. "lsr %[d1], r3, #16\n\t"
  114244. #endif
  114245. #ifdef WOLFSSL_KEIL
  114246. "muls r6, %[d1], r6\n\t"
  114247. #elif defined(__clang__)
  114248. "muls r6, %[d1]\n\t"
  114249. #else
  114250. "mul r6, %[d1]\n\t"
  114251. #endif
  114252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114253. "adds r5, r5, r6\n\t"
  114254. #else
  114255. "add r5, r5, r6\n\t"
  114256. #endif
  114257. "uxth r6, %[div]\n\t"
  114258. #ifdef WOLFSSL_KEIL
  114259. "muls %[d1], r6, %[d1]\n\t"
  114260. #elif defined(__clang__)
  114261. "muls %[d1], r6\n\t"
  114262. #else
  114263. "mul %[d1], r6\n\t"
  114264. #endif
  114265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114266. "lsrs r6, %[d1], #16\n\t"
  114267. #else
  114268. "lsr r6, %[d1], #16\n\t"
  114269. #endif
  114270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114271. "lsls %[d1], %[d1], #16\n\t"
  114272. #else
  114273. "lsl %[d1], %[d1], #16\n\t"
  114274. #endif
  114275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114276. "adds r4, r4, %[d1]\n\t"
  114277. #else
  114278. "add r4, r4, %[d1]\n\t"
  114279. #endif
  114280. #ifdef WOLFSSL_KEIL
  114281. "adcs r5, r5, r6\n\t"
  114282. #elif defined(__clang__)
  114283. "adcs r5, r6\n\t"
  114284. #else
  114285. "adc r5, r6\n\t"
  114286. #endif
  114287. "# r * div - Done\n\t"
  114288. "mov %[d1], r8\n\t"
  114289. "mov r6, r9\n\t"
  114290. #ifdef WOLFSSL_KEIL
  114291. "subs r4, %[d1], r4\n\t"
  114292. #else
  114293. #ifdef __clang__
  114294. "subs r4, %[d1], r4\n\t"
  114295. #else
  114296. "sub r4, %[d1], r4\n\t"
  114297. #endif
  114298. #endif
  114299. #ifdef WOLFSSL_KEIL
  114300. "sbcs r6, r6, r5\n\t"
  114301. #elif defined(__clang__)
  114302. "sbcs r6, r5\n\t"
  114303. #else
  114304. "sbc r6, r5\n\t"
  114305. #endif
  114306. "movs r5, r6\n\t"
  114307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114308. "adds r3, r3, r5\n\t"
  114309. #else
  114310. "add r3, r3, r5\n\t"
  114311. #endif
  114312. "# r * div - Start\n\t"
  114313. "uxth %[d1], r3\n\t"
  114314. "uxth r4, %[div]\n\t"
  114315. #ifdef WOLFSSL_KEIL
  114316. "muls r4, %[d1], r4\n\t"
  114317. #elif defined(__clang__)
  114318. "muls r4, %[d1]\n\t"
  114319. #else
  114320. "mul r4, %[d1]\n\t"
  114321. #endif
  114322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114323. "lsrs r6, %[div], #16\n\t"
  114324. #else
  114325. "lsr r6, %[div], #16\n\t"
  114326. #endif
  114327. #ifdef WOLFSSL_KEIL
  114328. "muls %[d1], r6, %[d1]\n\t"
  114329. #elif defined(__clang__)
  114330. "muls %[d1], r6\n\t"
  114331. #else
  114332. "mul %[d1], r6\n\t"
  114333. #endif
  114334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114335. "lsrs r5, %[d1], #16\n\t"
  114336. #else
  114337. "lsr r5, %[d1], #16\n\t"
  114338. #endif
  114339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114340. "lsls %[d1], %[d1], #16\n\t"
  114341. #else
  114342. "lsl %[d1], %[d1], #16\n\t"
  114343. #endif
  114344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114345. "adds r4, r4, %[d1]\n\t"
  114346. #else
  114347. "add r4, r4, %[d1]\n\t"
  114348. #endif
  114349. #ifdef WOLFSSL_KEIL
  114350. "adcs r5, r5, r7\n\t"
  114351. #elif defined(__clang__)
  114352. "adcs r5, r7\n\t"
  114353. #else
  114354. "adc r5, r7\n\t"
  114355. #endif
  114356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114357. "lsrs %[d1], r3, #16\n\t"
  114358. #else
  114359. "lsr %[d1], r3, #16\n\t"
  114360. #endif
  114361. #ifdef WOLFSSL_KEIL
  114362. "muls r6, %[d1], r6\n\t"
  114363. #elif defined(__clang__)
  114364. "muls r6, %[d1]\n\t"
  114365. #else
  114366. "mul r6, %[d1]\n\t"
  114367. #endif
  114368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114369. "adds r5, r5, r6\n\t"
  114370. #else
  114371. "add r5, r5, r6\n\t"
  114372. #endif
  114373. "uxth r6, %[div]\n\t"
  114374. #ifdef WOLFSSL_KEIL
  114375. "muls %[d1], r6, %[d1]\n\t"
  114376. #elif defined(__clang__)
  114377. "muls %[d1], r6\n\t"
  114378. #else
  114379. "mul %[d1], r6\n\t"
  114380. #endif
  114381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114382. "lsrs r6, %[d1], #16\n\t"
  114383. #else
  114384. "lsr r6, %[d1], #16\n\t"
  114385. #endif
  114386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114387. "lsls %[d1], %[d1], #16\n\t"
  114388. #else
  114389. "lsl %[d1], %[d1], #16\n\t"
  114390. #endif
  114391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114392. "adds r4, r4, %[d1]\n\t"
  114393. #else
  114394. "add r4, r4, %[d1]\n\t"
  114395. #endif
  114396. #ifdef WOLFSSL_KEIL
  114397. "adcs r5, r5, r6\n\t"
  114398. #elif defined(__clang__)
  114399. "adcs r5, r6\n\t"
  114400. #else
  114401. "adc r5, r6\n\t"
  114402. #endif
  114403. "# r * div - Done\n\t"
  114404. "mov %[d1], r8\n\t"
  114405. "mov r6, r9\n\t"
  114406. #ifdef WOLFSSL_KEIL
  114407. "subs r4, %[d1], r4\n\t"
  114408. #else
  114409. #ifdef __clang__
  114410. "subs r4, %[d1], r4\n\t"
  114411. #else
  114412. "sub r4, %[d1], r4\n\t"
  114413. #endif
  114414. #endif
  114415. #ifdef WOLFSSL_KEIL
  114416. "sbcs r6, r6, r5\n\t"
  114417. #elif defined(__clang__)
  114418. "sbcs r6, r5\n\t"
  114419. #else
  114420. "sbc r6, r5\n\t"
  114421. #endif
  114422. "movs r5, r6\n\t"
  114423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114424. "adds r3, r3, r5\n\t"
  114425. #else
  114426. "add r3, r3, r5\n\t"
  114427. #endif
  114428. "movs r6, %[div]\n\t"
  114429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114430. "subs r6, r6, r4\n\t"
  114431. #else
  114432. "sub r6, r6, r4\n\t"
  114433. #endif
  114434. #ifdef WOLFSSL_KEIL
  114435. "sbcs r6, r6, r6\n\t"
  114436. #elif defined(__clang__)
  114437. "sbcs r6, r6\n\t"
  114438. #else
  114439. "sbc r6, r6\n\t"
  114440. #endif
  114441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  114442. "subs r3, r3, r6\n\t"
  114443. #else
  114444. "sub r3, r3, r6\n\t"
  114445. #endif
  114446. "movs %[d1], r3\n\t"
  114447. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  114448. :
  114449. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  114450. );
  114451. return (uint32_t)(size_t)d1;
  114452. }
  114453. /* AND m into each word of a and store in r.
  114454. *
  114455. * r A single precision integer.
  114456. * a A single precision integer.
  114457. * m Mask to AND against each digit.
  114458. */
  114459. static void sp_384_mask_12(sp_digit* r, const sp_digit* a, sp_digit m)
  114460. {
  114461. #ifdef WOLFSSL_SP_SMALL
  114462. int i;
  114463. for (i=0; i<12; i++) {
  114464. r[i] = a[i] & m;
  114465. }
  114466. #else
  114467. r[0] = a[0] & m;
  114468. r[1] = a[1] & m;
  114469. r[2] = a[2] & m;
  114470. r[3] = a[3] & m;
  114471. r[4] = a[4] & m;
  114472. r[5] = a[5] & m;
  114473. r[6] = a[6] & m;
  114474. r[7] = a[7] & m;
  114475. r[8] = a[8] & m;
  114476. r[9] = a[9] & m;
  114477. r[10] = a[10] & m;
  114478. r[11] = a[11] & m;
  114479. #endif
  114480. }
  114481. /* Divide d in a and put remainder into r (m*d + r = a)
  114482. * m is not calculated as it is not needed at this time.
  114483. *
  114484. * a Number to be divided.
  114485. * d Number to divide with.
  114486. * m Multiplier result.
  114487. * r Remainder from the division.
  114488. * returns MP_OKAY indicating success.
  114489. */
  114490. static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d, sp_digit* m,
  114491. sp_digit* r)
  114492. {
  114493. sp_digit t1[24], t2[13];
  114494. sp_digit div, r1;
  114495. int i;
  114496. (void)m;
  114497. div = d[11];
  114498. XMEMCPY(t1, a, sizeof(*t1) * 2 * 12);
  114499. r1 = sp_384_cmp_12(&t1[12], d) >= 0;
  114500. sp_384_cond_sub_12(&t1[12], &t1[12], d, (sp_digit)0 - r1);
  114501. for (i = 11; i >= 0; i--) {
  114502. sp_digit mask = 0 - (t1[12 + i] == div);
  114503. sp_digit hi = t1[12 + i] + mask;
  114504. r1 = div_384_word_12(hi, t1[12 + i - 1], div);
  114505. r1 |= mask;
  114506. sp_384_mul_d_12(t2, d, r1);
  114507. t1[12 + i] += sp_384_sub_in_place_12(&t1[i], t2);
  114508. t1[12 + i] -= t2[12];
  114509. sp_384_mask_12(t2, d, t1[12 + i]);
  114510. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  114511. sp_384_mask_12(t2, d, t1[12 + i]);
  114512. t1[12 + i] += sp_384_add_12(&t1[i], &t1[i], t2);
  114513. }
  114514. r1 = sp_384_cmp_12(t1, d) >= 0;
  114515. sp_384_cond_sub_12(r, t1, d, (sp_digit)0 - r1);
  114516. return MP_OKAY;
  114517. }
  114518. /* Reduce a modulo m into r. (r = a mod m)
  114519. *
  114520. * r A single precision number that is the reduced result.
  114521. * a A single precision number that is to be reduced.
  114522. * m A single precision number that is the modulus to reduce with.
  114523. * returns MP_OKAY indicating success.
  114524. */
  114525. static WC_INLINE int sp_384_mod_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  114526. {
  114527. int ret;
  114528. ret = sp_384_div_12(a, m, NULL, r);
  114529. return ret;
  114530. }
  114531. #endif
  114532. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  114533. /* Multiply two number mod the order of P384 curve. (r = a * b mod order)
  114534. *
  114535. * r Result of the multiplication.
  114536. * a First operand of the multiplication.
  114537. * b Second operand of the multiplication.
  114538. */
  114539. static void sp_384_mont_mul_order_12(sp_digit* r, const sp_digit* a, const sp_digit* b)
  114540. {
  114541. sp_384_mul_12(r, a, b);
  114542. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  114543. }
  114544. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  114545. #ifdef WOLFSSL_SP_SMALL
  114546. /* Order-2 for the P384 curve. */
  114547. static const uint32_t p384_order_minus_2[12] = {
  114548. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U,
  114549. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU
  114550. };
  114551. #else
  114552. /* The low half of the order-2 of the P384 curve. */
  114553. static const uint32_t p384_order_low[6] = {
  114554. 0xccc52971U,0xecec196aU,0x48b0a77aU,0x581a0db2U,0xf4372ddfU,0xc7634d81U
  114555. };
  114556. #endif /* WOLFSSL_SP_SMALL */
  114557. /* Square number mod the order of P384 curve. (r = a * a mod order)
  114558. *
  114559. * r Result of the squaring.
  114560. * a Number to square.
  114561. */
  114562. static void sp_384_mont_sqr_order_12(sp_digit* r, const sp_digit* a)
  114563. {
  114564. sp_384_sqr_12(r, a);
  114565. sp_384_mont_reduce_order_12(r, p384_order, p384_mp_order);
  114566. }
  114567. #ifndef WOLFSSL_SP_SMALL
  114568. /* Square number mod the order of P384 curve a number of times.
  114569. * (r = a ^ n mod order)
  114570. *
  114571. * r Result of the squaring.
  114572. * a Number to square.
  114573. */
  114574. static void sp_384_mont_sqr_n_order_12(sp_digit* r, const sp_digit* a, int n)
  114575. {
  114576. int i;
  114577. sp_384_mont_sqr_order_12(r, a);
  114578. for (i=1; i<n; i++) {
  114579. sp_384_mont_sqr_order_12(r, r);
  114580. }
  114581. }
  114582. #endif /* !WOLFSSL_SP_SMALL */
  114583. /* Invert the number, in Montgomery form, modulo the order of the P384 curve.
  114584. * (r = 1 / a mod order)
  114585. *
  114586. * r Inverse result.
  114587. * a Number to invert.
  114588. * td Temporary data.
  114589. */
  114590. #ifdef WOLFSSL_SP_NONBLOCK
  114591. typedef struct sp_384_mont_inv_order_12_ctx {
  114592. int state;
  114593. int i;
  114594. } sp_384_mont_inv_order_12_ctx;
  114595. static int sp_384_mont_inv_order_12_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  114596. sp_digit* t)
  114597. {
  114598. int err = FP_WOULDBLOCK;
  114599. sp_384_mont_inv_order_12_ctx* ctx = (sp_384_mont_inv_order_12_ctx*)sp_ctx;
  114600. typedef char ctx_size_test[sizeof(sp_384_mont_inv_order_12_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  114601. (void)sizeof(ctx_size_test);
  114602. switch (ctx->state) {
  114603. case 0:
  114604. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  114605. ctx->i = 382;
  114606. ctx->state = 1;
  114607. break;
  114608. case 1:
  114609. sp_384_mont_sqr_order_12(t, t);
  114610. ctx->state = 2;
  114611. break;
  114612. case 2:
  114613. if ((p384_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  114614. sp_384_mont_mul_order_12(t, t, a);
  114615. }
  114616. ctx->i--;
  114617. ctx->state = (ctx->i == 0) ? 3 : 1;
  114618. break;
  114619. case 3:
  114620. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  114621. err = MP_OKAY;
  114622. break;
  114623. }
  114624. return err;
  114625. }
  114626. #endif /* WOLFSSL_SP_NONBLOCK */
  114627. static void sp_384_mont_inv_order_12(sp_digit* r, const sp_digit* a,
  114628. sp_digit* td)
  114629. {
  114630. #ifdef WOLFSSL_SP_SMALL
  114631. sp_digit* t = td;
  114632. int i;
  114633. XMEMCPY(t, a, sizeof(sp_digit) * 12);
  114634. for (i=382; i>=0; i--) {
  114635. sp_384_mont_sqr_order_12(t, t);
  114636. if ((p384_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  114637. sp_384_mont_mul_order_12(t, t, a);
  114638. }
  114639. }
  114640. XMEMCPY(r, t, sizeof(sp_digit) * 12U);
  114641. #else
  114642. sp_digit* t = td;
  114643. sp_digit* t2 = td + 2 * 12;
  114644. sp_digit* t3 = td + 4 * 12;
  114645. int i;
  114646. /* t = a^2 */
  114647. sp_384_mont_sqr_order_12(t, a);
  114648. /* t = a^3 = t * a */
  114649. sp_384_mont_mul_order_12(t, t, a);
  114650. /* t2= a^c = t ^ 2 ^ 2 */
  114651. sp_384_mont_sqr_n_order_12(t2, t, 2);
  114652. /* t = a^f = t2 * t */
  114653. sp_384_mont_mul_order_12(t, t2, t);
  114654. /* t2= a^f0 = t ^ 2 ^ 4 */
  114655. sp_384_mont_sqr_n_order_12(t2, t, 4);
  114656. /* t = a^ff = t2 * t */
  114657. sp_384_mont_mul_order_12(t, t2, t);
  114658. /* t2= a^ff00 = t ^ 2 ^ 8 */
  114659. sp_384_mont_sqr_n_order_12(t2, t, 8);
  114660. /* t3= a^ffff = t2 * t */
  114661. sp_384_mont_mul_order_12(t3, t2, t);
  114662. /* t2= a^ffff0000 = t3 ^ 2 ^ 16 */
  114663. sp_384_mont_sqr_n_order_12(t2, t3, 16);
  114664. /* t = a^ffffffff = t2 * t3 */
  114665. sp_384_mont_mul_order_12(t, t2, t3);
  114666. /* t2= a^ffffffff0000 = t ^ 2 ^ 16 */
  114667. sp_384_mont_sqr_n_order_12(t2, t, 16);
  114668. /* t = a^ffffffffffff = t2 * t3 */
  114669. sp_384_mont_mul_order_12(t, t2, t3);
  114670. /* t2= a^ffffffffffff000000000000 = t ^ 2 ^ 48 */
  114671. sp_384_mont_sqr_n_order_12(t2, t, 48);
  114672. /* t= a^fffffffffffffffffffffffff = t2 * t */
  114673. sp_384_mont_mul_order_12(t, t2, t);
  114674. /* t2= a^ffffffffffffffffffffffff000000000000000000000000 */
  114675. sp_384_mont_sqr_n_order_12(t2, t, 96);
  114676. /* t2= a^ffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  114677. sp_384_mont_mul_order_12(t2, t2, t);
  114678. for (i=191; i>=1; i--) {
  114679. sp_384_mont_sqr_order_12(t2, t2);
  114680. if ((p384_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  114681. sp_384_mont_mul_order_12(t2, t2, a);
  114682. }
  114683. }
  114684. sp_384_mont_sqr_order_12(t2, t2);
  114685. sp_384_mont_mul_order_12(r, t2, a);
  114686. #endif /* WOLFSSL_SP_SMALL */
  114687. }
  114688. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  114689. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  114690. #ifdef HAVE_ECC_SIGN
  114691. #ifndef SP_ECC_MAX_SIG_GEN
  114692. #define SP_ECC_MAX_SIG_GEN 64
  114693. #endif
  114694. /* Calculate second signature value S from R, k and private value.
  114695. *
  114696. * s = (r * x + e) / k
  114697. *
  114698. * s Signature value.
  114699. * r First signature value.
  114700. * k Ephemeral private key.
  114701. * x Private key as a number.
  114702. * e Hash of message as a number.
  114703. * tmp Temporary storage for intermediate numbers.
  114704. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  114705. */
  114706. static int sp_384_calc_s_12(sp_digit* s, const sp_digit* r, sp_digit* k,
  114707. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  114708. {
  114709. int err;
  114710. sp_digit carry;
  114711. sp_int32 c;
  114712. sp_digit* kInv = k;
  114713. /* Conv k to Montgomery form (mod order) */
  114714. sp_384_mul_12(k, k, p384_norm_order);
  114715. err = sp_384_mod_12(k, k, p384_order);
  114716. if (err == MP_OKAY) {
  114717. sp_384_norm_12(k);
  114718. /* kInv = 1/k mod order */
  114719. sp_384_mont_inv_order_12(kInv, k, tmp);
  114720. sp_384_norm_12(kInv);
  114721. /* s = r * x + e */
  114722. sp_384_mul_12(x, x, r);
  114723. err = sp_384_mod_12(x, x, p384_order);
  114724. }
  114725. if (err == MP_OKAY) {
  114726. sp_384_norm_12(x);
  114727. carry = sp_384_add_12(s, e, x);
  114728. sp_384_cond_sub_12(s, s, p384_order, 0 - carry);
  114729. sp_384_norm_12(s);
  114730. c = sp_384_cmp_12(s, p384_order);
  114731. sp_384_cond_sub_12(s, s, p384_order,
  114732. (sp_digit)0 - (sp_digit)(c >= 0));
  114733. sp_384_norm_12(s);
  114734. /* s = s * k^-1 mod order */
  114735. sp_384_mont_mul_order_12(s, s, kInv);
  114736. sp_384_norm_12(s);
  114737. }
  114738. return err;
  114739. }
  114740. /* Sign the hash using the private key.
  114741. * e = [hash, 384 bits] from binary
  114742. * r = (k.G)->x mod order
  114743. * s = (r * x + e) / k mod order
  114744. * The hash is truncated to the first 384 bits.
  114745. *
  114746. * hash Hash to sign.
  114747. * hashLen Length of the hash data.
  114748. * rng Random number generator.
  114749. * priv Private part of key - scalar.
  114750. * rm First part of result as an mp_int.
  114751. * sm Sirst part of result as an mp_int.
  114752. * heap Heap to use for allocation.
  114753. * returns RNG failures, MEMORY_E when memory allocation fails and
  114754. * MP_OKAY on success.
  114755. */
  114756. #ifdef WOLFSSL_SP_NONBLOCK
  114757. typedef struct sp_ecc_sign_384_ctx {
  114758. int state;
  114759. union {
  114760. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  114761. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  114762. };
  114763. sp_digit e[2*12];
  114764. sp_digit x[2*12];
  114765. sp_digit k[2*12];
  114766. sp_digit r[2*12];
  114767. sp_digit tmp[3 * 2*12];
  114768. sp_point_384 point;
  114769. sp_digit* s;
  114770. sp_digit* kInv;
  114771. int i;
  114772. } sp_ecc_sign_384_ctx;
  114773. int sp_ecc_sign_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  114774. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  114775. {
  114776. int err = FP_WOULDBLOCK;
  114777. sp_ecc_sign_384_ctx* ctx = (sp_ecc_sign_384_ctx*)sp_ctx->data;
  114778. typedef char ctx_size_test[sizeof(sp_ecc_sign_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  114779. (void)sizeof(ctx_size_test);
  114780. (void)heap;
  114781. switch (ctx->state) {
  114782. case 0: /* INIT */
  114783. ctx->s = ctx->e;
  114784. ctx->kInv = ctx->k;
  114785. ctx->i = SP_ECC_MAX_SIG_GEN;
  114786. ctx->state = 1;
  114787. break;
  114788. case 1: /* GEN */
  114789. /* New random point. */
  114790. if (km == NULL || mp_iszero(km)) {
  114791. err = sp_384_ecc_gen_k_12(rng, ctx->k);
  114792. }
  114793. else {
  114794. sp_384_from_mp(ctx->k, 12, km);
  114795. mp_zero(km);
  114796. }
  114797. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  114798. ctx->state = 2;
  114799. break;
  114800. case 2: /* MULMOD */
  114801. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  114802. &ctx->point, &p384_base, ctx->k, 1, 1, heap);
  114803. if (err == MP_OKAY) {
  114804. ctx->state = 3;
  114805. }
  114806. break;
  114807. case 3: /* MODORDER */
  114808. {
  114809. sp_int32 c;
  114810. /* r = point->x mod order */
  114811. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 12U);
  114812. sp_384_norm_12(ctx->r);
  114813. c = sp_384_cmp_12(ctx->r, p384_order);
  114814. sp_384_cond_sub_12(ctx->r, ctx->r, p384_order,
  114815. (sp_digit)0 - (sp_digit)(c >= 0));
  114816. sp_384_norm_12(ctx->r);
  114817. if (hashLen > 48U) {
  114818. hashLen = 48U;
  114819. }
  114820. sp_384_from_mp(ctx->x, 12, priv);
  114821. sp_384_from_bin(ctx->e, 12, hash, (int)hashLen);
  114822. ctx->state = 4;
  114823. break;
  114824. }
  114825. case 4: /* KMODORDER */
  114826. /* Conv k to Montgomery form (mod order) */
  114827. sp_384_mul_12(ctx->k, ctx->k, p384_norm_order);
  114828. err = sp_384_mod_12(ctx->k, ctx->k, p384_order);
  114829. if (err == MP_OKAY) {
  114830. sp_384_norm_12(ctx->k);
  114831. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  114832. ctx->state = 5;
  114833. }
  114834. break;
  114835. case 5: /* KINV */
  114836. /* kInv = 1/k mod order */
  114837. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  114838. if (err == MP_OKAY) {
  114839. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  114840. ctx->state = 6;
  114841. }
  114842. break;
  114843. case 6: /* KINVNORM */
  114844. sp_384_norm_12(ctx->kInv);
  114845. ctx->state = 7;
  114846. break;
  114847. case 7: /* R */
  114848. /* s = r * x + e */
  114849. sp_384_mul_12(ctx->x, ctx->x, ctx->r);
  114850. ctx->state = 8;
  114851. break;
  114852. case 8: /* S1 */
  114853. err = sp_384_mod_12(ctx->x, ctx->x, p384_order);
  114854. if (err == MP_OKAY)
  114855. ctx->state = 9;
  114856. break;
  114857. case 9: /* S2 */
  114858. {
  114859. sp_digit carry;
  114860. sp_int32 c;
  114861. sp_384_norm_12(ctx->x);
  114862. carry = sp_384_add_12(ctx->s, ctx->e, ctx->x);
  114863. sp_384_cond_sub_12(ctx->s, ctx->s,
  114864. p384_order, 0 - carry);
  114865. sp_384_norm_12(ctx->s);
  114866. c = sp_384_cmp_12(ctx->s, p384_order);
  114867. sp_384_cond_sub_12(ctx->s, ctx->s, p384_order,
  114868. (sp_digit)0 - (sp_digit)(c >= 0));
  114869. sp_384_norm_12(ctx->s);
  114870. /* s = s * k^-1 mod order */
  114871. sp_384_mont_mul_order_12(ctx->s, ctx->s, ctx->kInv);
  114872. sp_384_norm_12(ctx->s);
  114873. /* Check that signature is usable. */
  114874. if (sp_384_iszero_12(ctx->s) == 0) {
  114875. ctx->state = 10;
  114876. break;
  114877. }
  114878. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  114879. ctx->i = 1;
  114880. #endif
  114881. /* not usable gen, try again */
  114882. ctx->i--;
  114883. if (ctx->i == 0) {
  114884. err = RNG_FAILURE_E;
  114885. }
  114886. ctx->state = 1;
  114887. break;
  114888. }
  114889. case 10: /* RES */
  114890. err = sp_384_to_mp(ctx->r, rm);
  114891. if (err == MP_OKAY) {
  114892. err = sp_384_to_mp(ctx->s, sm);
  114893. }
  114894. break;
  114895. }
  114896. if (err == MP_OKAY && ctx->state != 10) {
  114897. err = FP_WOULDBLOCK;
  114898. }
  114899. if (err != FP_WOULDBLOCK) {
  114900. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 12U);
  114901. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 12U);
  114902. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 12U);
  114903. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 12U);
  114904. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 12U);
  114905. }
  114906. return err;
  114907. }
  114908. #endif /* WOLFSSL_SP_NONBLOCK */
  114909. int sp_ecc_sign_384(const byte* hash, word32 hashLen, WC_RNG* rng,
  114910. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  114911. {
  114912. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114913. sp_digit* e = NULL;
  114914. sp_point_384* point = NULL;
  114915. #else
  114916. sp_digit e[7 * 2 * 12];
  114917. sp_point_384 point[1];
  114918. #endif
  114919. sp_digit* x = NULL;
  114920. sp_digit* k = NULL;
  114921. sp_digit* r = NULL;
  114922. sp_digit* tmp = NULL;
  114923. sp_digit* s = NULL;
  114924. sp_int32 c;
  114925. int err = MP_OKAY;
  114926. int i;
  114927. (void)heap;
  114928. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114929. if (err == MP_OKAY) {
  114930. point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap,
  114931. DYNAMIC_TYPE_ECC);
  114932. if (point == NULL)
  114933. err = MEMORY_E;
  114934. }
  114935. if (err == MP_OKAY) {
  114936. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 12, heap,
  114937. DYNAMIC_TYPE_ECC);
  114938. if (e == NULL)
  114939. err = MEMORY_E;
  114940. }
  114941. #endif
  114942. if (err == MP_OKAY) {
  114943. x = e + 2 * 12;
  114944. k = e + 4 * 12;
  114945. r = e + 6 * 12;
  114946. tmp = e + 8 * 12;
  114947. s = e;
  114948. if (hashLen > 48U) {
  114949. hashLen = 48U;
  114950. }
  114951. }
  114952. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  114953. /* New random point. */
  114954. if (km == NULL || mp_iszero(km)) {
  114955. err = sp_384_ecc_gen_k_12(rng, k);
  114956. }
  114957. else {
  114958. sp_384_from_mp(k, 12, km);
  114959. mp_zero(km);
  114960. }
  114961. if (err == MP_OKAY) {
  114962. err = sp_384_ecc_mulmod_base_12(point, k, 1, 1, heap);
  114963. }
  114964. if (err == MP_OKAY) {
  114965. /* r = point->x mod order */
  114966. XMEMCPY(r, point->x, sizeof(sp_digit) * 12U);
  114967. sp_384_norm_12(r);
  114968. c = sp_384_cmp_12(r, p384_order);
  114969. sp_384_cond_sub_12(r, r, p384_order,
  114970. (sp_digit)0 - (sp_digit)(c >= 0));
  114971. sp_384_norm_12(r);
  114972. sp_384_from_mp(x, 12, priv);
  114973. sp_384_from_bin(e, 12, hash, (int)hashLen);
  114974. err = sp_384_calc_s_12(s, r, k, x, e, tmp);
  114975. }
  114976. /* Check that signature is usable. */
  114977. if ((err == MP_OKAY) && (sp_384_iszero_12(s) == 0)) {
  114978. break;
  114979. }
  114980. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  114981. i = 1;
  114982. #endif
  114983. }
  114984. if (i == 0) {
  114985. err = RNG_FAILURE_E;
  114986. }
  114987. if (err == MP_OKAY) {
  114988. err = sp_384_to_mp(r, rm);
  114989. }
  114990. if (err == MP_OKAY) {
  114991. err = sp_384_to_mp(s, sm);
  114992. }
  114993. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114994. if (e != NULL)
  114995. #endif
  114996. {
  114997. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 12);
  114998. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  114999. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  115000. #endif
  115001. }
  115002. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115003. if (point != NULL)
  115004. #endif
  115005. {
  115006. ForceZero(point, sizeof(sp_point_384));
  115007. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  115008. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  115009. #endif
  115010. }
  115011. return err;
  115012. }
  115013. #endif /* HAVE_ECC_SIGN */
  115014. #ifndef WOLFSSL_SP_SMALL
  115015. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  115016. *
  115017. * r Result of division by 2.
  115018. * a Number to divide.
  115019. * m Modulus.
  115020. */
  115021. static void sp_384_div2_mod_12(sp_digit* r, const sp_digit* a,
  115022. const sp_digit* m)
  115023. {
  115024. __asm__ __volatile__ (
  115025. "ldr r3, [%[a]]\n\t"
  115026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115027. "lsls r3, r3, #31\n\t"
  115028. #else
  115029. "lsl r3, r3, #31\n\t"
  115030. #endif
  115031. "beq L_sp_384_div2_mod_12_no_add_%=\n\t"
  115032. "ldr r4, [%[a]]\n\t"
  115033. "ldr r5, [%[a], #4]\n\t"
  115034. "ldr r6, [%[m]]\n\t"
  115035. "ldr r7, [%[m], #4]\n\t"
  115036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115037. "adds r4, r4, r6\n\t"
  115038. #else
  115039. "add r4, r4, r6\n\t"
  115040. #endif
  115041. #ifdef WOLFSSL_KEIL
  115042. "adcs r5, r5, r7\n\t"
  115043. #elif defined(__clang__)
  115044. "adcs r5, r7\n\t"
  115045. #else
  115046. "adc r5, r7\n\t"
  115047. #endif
  115048. "str r4, [%[r]]\n\t"
  115049. "str r5, [%[r], #4]\n\t"
  115050. "ldr r4, [%[a], #8]\n\t"
  115051. "ldr r5, [%[a], #12]\n\t"
  115052. "ldr r6, [%[m], #8]\n\t"
  115053. "ldr r7, [%[m], #12]\n\t"
  115054. #ifdef WOLFSSL_KEIL
  115055. "adcs r4, r4, r6\n\t"
  115056. #elif defined(__clang__)
  115057. "adcs r4, r6\n\t"
  115058. #else
  115059. "adc r4, r6\n\t"
  115060. #endif
  115061. #ifdef WOLFSSL_KEIL
  115062. "adcs r5, r5, r7\n\t"
  115063. #elif defined(__clang__)
  115064. "adcs r5, r7\n\t"
  115065. #else
  115066. "adc r5, r7\n\t"
  115067. #endif
  115068. "str r4, [%[r], #8]\n\t"
  115069. "str r5, [%[r], #12]\n\t"
  115070. "ldr r4, [%[a], #16]\n\t"
  115071. "ldr r5, [%[a], #20]\n\t"
  115072. "ldr r6, [%[m], #16]\n\t"
  115073. "ldr r7, [%[m], #20]\n\t"
  115074. #ifdef WOLFSSL_KEIL
  115075. "adcs r4, r4, r6\n\t"
  115076. #elif defined(__clang__)
  115077. "adcs r4, r6\n\t"
  115078. #else
  115079. "adc r4, r6\n\t"
  115080. #endif
  115081. #ifdef WOLFSSL_KEIL
  115082. "adcs r5, r5, r7\n\t"
  115083. #elif defined(__clang__)
  115084. "adcs r5, r7\n\t"
  115085. #else
  115086. "adc r5, r7\n\t"
  115087. #endif
  115088. "str r4, [%[r], #16]\n\t"
  115089. "str r5, [%[r], #20]\n\t"
  115090. "ldr r4, [%[a], #24]\n\t"
  115091. "ldr r5, [%[a], #28]\n\t"
  115092. "ldr r6, [%[m], #24]\n\t"
  115093. "ldr r7, [%[m], #28]\n\t"
  115094. #ifdef WOLFSSL_KEIL
  115095. "adcs r4, r4, r6\n\t"
  115096. #elif defined(__clang__)
  115097. "adcs r4, r6\n\t"
  115098. #else
  115099. "adc r4, r6\n\t"
  115100. #endif
  115101. #ifdef WOLFSSL_KEIL
  115102. "adcs r5, r5, r7\n\t"
  115103. #elif defined(__clang__)
  115104. "adcs r5, r7\n\t"
  115105. #else
  115106. "adc r5, r7\n\t"
  115107. #endif
  115108. "str r4, [%[r], #24]\n\t"
  115109. "str r5, [%[r], #28]\n\t"
  115110. "ldr r4, [%[a], #32]\n\t"
  115111. "ldr r5, [%[a], #36]\n\t"
  115112. "ldr r6, [%[m], #32]\n\t"
  115113. "ldr r7, [%[m], #36]\n\t"
  115114. #ifdef WOLFSSL_KEIL
  115115. "adcs r4, r4, r6\n\t"
  115116. #elif defined(__clang__)
  115117. "adcs r4, r6\n\t"
  115118. #else
  115119. "adc r4, r6\n\t"
  115120. #endif
  115121. #ifdef WOLFSSL_KEIL
  115122. "adcs r5, r5, r7\n\t"
  115123. #elif defined(__clang__)
  115124. "adcs r5, r7\n\t"
  115125. #else
  115126. "adc r5, r7\n\t"
  115127. #endif
  115128. "str r4, [%[r], #32]\n\t"
  115129. "str r5, [%[r], #36]\n\t"
  115130. "ldr r4, [%[a], #40]\n\t"
  115131. "ldr r5, [%[a], #44]\n\t"
  115132. "ldr r6, [%[m], #40]\n\t"
  115133. "ldr r7, [%[m], #44]\n\t"
  115134. #ifdef WOLFSSL_KEIL
  115135. "adcs r4, r4, r6\n\t"
  115136. #elif defined(__clang__)
  115137. "adcs r4, r6\n\t"
  115138. #else
  115139. "adc r4, r6\n\t"
  115140. #endif
  115141. #ifdef WOLFSSL_KEIL
  115142. "adcs r5, r5, r7\n\t"
  115143. #elif defined(__clang__)
  115144. "adcs r5, r7\n\t"
  115145. #else
  115146. "adc r5, r7\n\t"
  115147. #endif
  115148. "str r4, [%[r], #40]\n\t"
  115149. "str r5, [%[r], #44]\n\t"
  115150. "movs r3, #0\n\t"
  115151. #ifdef WOLFSSL_KEIL
  115152. "adcs r3, r3, r3\n\t"
  115153. #elif defined(__clang__)
  115154. "adcs r3, r3\n\t"
  115155. #else
  115156. "adc r3, r3\n\t"
  115157. #endif
  115158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115159. "lsls r3, r3, #31\n\t"
  115160. #else
  115161. "lsl r3, r3, #31\n\t"
  115162. #endif
  115163. "b L_sp_384_div2_mod_12_div2_%=\n\t"
  115164. "\n"
  115165. "L_sp_384_div2_mod_12_no_add_%=:\n\t"
  115166. "ldr r4, [%[a]]\n\t"
  115167. "ldr r5, [%[a], #4]\n\t"
  115168. "str r4, [%[r]]\n\t"
  115169. "str r5, [%[r], #4]\n\t"
  115170. "ldr r4, [%[a], #8]\n\t"
  115171. "ldr r5, [%[a], #12]\n\t"
  115172. "str r4, [%[r], #8]\n\t"
  115173. "str r5, [%[r], #12]\n\t"
  115174. "ldr r4, [%[a], #16]\n\t"
  115175. "ldr r5, [%[a], #20]\n\t"
  115176. "str r4, [%[r], #16]\n\t"
  115177. "str r5, [%[r], #20]\n\t"
  115178. "ldr r4, [%[a], #24]\n\t"
  115179. "ldr r5, [%[a], #28]\n\t"
  115180. "str r4, [%[r], #24]\n\t"
  115181. "str r5, [%[r], #28]\n\t"
  115182. "ldr r4, [%[a], #32]\n\t"
  115183. "ldr r5, [%[a], #36]\n\t"
  115184. "str r4, [%[r], #32]\n\t"
  115185. "str r5, [%[r], #36]\n\t"
  115186. "ldr r4, [%[a], #40]\n\t"
  115187. "ldr r5, [%[a], #44]\n\t"
  115188. "str r4, [%[r], #40]\n\t"
  115189. "str r5, [%[r], #44]\n\t"
  115190. "\n"
  115191. "L_sp_384_div2_mod_12_div2_%=:\n\t"
  115192. "ldr r4, [%[r]]\n\t"
  115193. "ldr r5, [%[r], #4]\n\t"
  115194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115195. "lsrs r4, r4, #1\n\t"
  115196. #else
  115197. "lsr r4, r4, #1\n\t"
  115198. #endif
  115199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115200. "lsls r6, r5, #31\n\t"
  115201. #else
  115202. "lsl r6, r5, #31\n\t"
  115203. #endif
  115204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115205. "lsrs r5, r5, #1\n\t"
  115206. #else
  115207. "lsr r5, r5, #1\n\t"
  115208. #endif
  115209. #ifdef WOLFSSL_KEIL
  115210. "orrs r4, r4, r6\n\t"
  115211. #elif defined(__clang__)
  115212. "orrs r4, r6\n\t"
  115213. #else
  115214. "orr r4, r6\n\t"
  115215. #endif
  115216. "ldr r7, [%[r], #8]\n\t"
  115217. "str r4, [%[r]]\n\t"
  115218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115219. "lsls r6, r7, #31\n\t"
  115220. #else
  115221. "lsl r6, r7, #31\n\t"
  115222. #endif
  115223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115224. "lsrs r7, r7, #1\n\t"
  115225. #else
  115226. "lsr r7, r7, #1\n\t"
  115227. #endif
  115228. #ifdef WOLFSSL_KEIL
  115229. "orrs r5, r5, r6\n\t"
  115230. #elif defined(__clang__)
  115231. "orrs r5, r6\n\t"
  115232. #else
  115233. "orr r5, r6\n\t"
  115234. #endif
  115235. "ldr r4, [%[r], #12]\n\t"
  115236. "str r5, [%[r], #4]\n\t"
  115237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115238. "lsls r6, r4, #31\n\t"
  115239. #else
  115240. "lsl r6, r4, #31\n\t"
  115241. #endif
  115242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115243. "lsrs r4, r4, #1\n\t"
  115244. #else
  115245. "lsr r4, r4, #1\n\t"
  115246. #endif
  115247. #ifdef WOLFSSL_KEIL
  115248. "orrs r7, r7, r6\n\t"
  115249. #elif defined(__clang__)
  115250. "orrs r7, r6\n\t"
  115251. #else
  115252. "orr r7, r6\n\t"
  115253. #endif
  115254. "ldr r5, [%[r], #16]\n\t"
  115255. "str r7, [%[r], #8]\n\t"
  115256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115257. "lsls r6, r5, #31\n\t"
  115258. #else
  115259. "lsl r6, r5, #31\n\t"
  115260. #endif
  115261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115262. "lsrs r5, r5, #1\n\t"
  115263. #else
  115264. "lsr r5, r5, #1\n\t"
  115265. #endif
  115266. #ifdef WOLFSSL_KEIL
  115267. "orrs r4, r4, r6\n\t"
  115268. #elif defined(__clang__)
  115269. "orrs r4, r6\n\t"
  115270. #else
  115271. "orr r4, r6\n\t"
  115272. #endif
  115273. "ldr r7, [%[r], #20]\n\t"
  115274. "str r4, [%[r], #12]\n\t"
  115275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115276. "lsls r6, r7, #31\n\t"
  115277. #else
  115278. "lsl r6, r7, #31\n\t"
  115279. #endif
  115280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115281. "lsrs r7, r7, #1\n\t"
  115282. #else
  115283. "lsr r7, r7, #1\n\t"
  115284. #endif
  115285. #ifdef WOLFSSL_KEIL
  115286. "orrs r5, r5, r6\n\t"
  115287. #elif defined(__clang__)
  115288. "orrs r5, r6\n\t"
  115289. #else
  115290. "orr r5, r6\n\t"
  115291. #endif
  115292. "ldr r4, [%[r], #24]\n\t"
  115293. "str r5, [%[r], #16]\n\t"
  115294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115295. "lsls r6, r4, #31\n\t"
  115296. #else
  115297. "lsl r6, r4, #31\n\t"
  115298. #endif
  115299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115300. "lsrs r4, r4, #1\n\t"
  115301. #else
  115302. "lsr r4, r4, #1\n\t"
  115303. #endif
  115304. #ifdef WOLFSSL_KEIL
  115305. "orrs r7, r7, r6\n\t"
  115306. #elif defined(__clang__)
  115307. "orrs r7, r6\n\t"
  115308. #else
  115309. "orr r7, r6\n\t"
  115310. #endif
  115311. "ldr r5, [%[r], #28]\n\t"
  115312. "str r7, [%[r], #20]\n\t"
  115313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115314. "lsls r6, r5, #31\n\t"
  115315. #else
  115316. "lsl r6, r5, #31\n\t"
  115317. #endif
  115318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115319. "lsrs r5, r5, #1\n\t"
  115320. #else
  115321. "lsr r5, r5, #1\n\t"
  115322. #endif
  115323. #ifdef WOLFSSL_KEIL
  115324. "orrs r4, r4, r6\n\t"
  115325. #elif defined(__clang__)
  115326. "orrs r4, r6\n\t"
  115327. #else
  115328. "orr r4, r6\n\t"
  115329. #endif
  115330. "ldr r7, [%[r], #32]\n\t"
  115331. "str r4, [%[r], #24]\n\t"
  115332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115333. "lsls r6, r7, #31\n\t"
  115334. #else
  115335. "lsl r6, r7, #31\n\t"
  115336. #endif
  115337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115338. "lsrs r7, r7, #1\n\t"
  115339. #else
  115340. "lsr r7, r7, #1\n\t"
  115341. #endif
  115342. #ifdef WOLFSSL_KEIL
  115343. "orrs r5, r5, r6\n\t"
  115344. #elif defined(__clang__)
  115345. "orrs r5, r6\n\t"
  115346. #else
  115347. "orr r5, r6\n\t"
  115348. #endif
  115349. "ldr r4, [%[r], #36]\n\t"
  115350. "str r5, [%[r], #28]\n\t"
  115351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115352. "lsls r6, r4, #31\n\t"
  115353. #else
  115354. "lsl r6, r4, #31\n\t"
  115355. #endif
  115356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115357. "lsrs r4, r4, #1\n\t"
  115358. #else
  115359. "lsr r4, r4, #1\n\t"
  115360. #endif
  115361. #ifdef WOLFSSL_KEIL
  115362. "orrs r7, r7, r6\n\t"
  115363. #elif defined(__clang__)
  115364. "orrs r7, r6\n\t"
  115365. #else
  115366. "orr r7, r6\n\t"
  115367. #endif
  115368. "ldr r5, [%[r], #40]\n\t"
  115369. "str r7, [%[r], #32]\n\t"
  115370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115371. "lsls r6, r5, #31\n\t"
  115372. #else
  115373. "lsl r6, r5, #31\n\t"
  115374. #endif
  115375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115376. "lsrs r5, r5, #1\n\t"
  115377. #else
  115378. "lsr r5, r5, #1\n\t"
  115379. #endif
  115380. #ifdef WOLFSSL_KEIL
  115381. "orrs r4, r4, r6\n\t"
  115382. #elif defined(__clang__)
  115383. "orrs r4, r6\n\t"
  115384. #else
  115385. "orr r4, r6\n\t"
  115386. #endif
  115387. "ldr r7, [%[r], #44]\n\t"
  115388. "str r4, [%[r], #36]\n\t"
  115389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115390. "lsls r6, r7, #31\n\t"
  115391. #else
  115392. "lsl r6, r7, #31\n\t"
  115393. #endif
  115394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115395. "lsrs r7, r7, #1\n\t"
  115396. #else
  115397. "lsr r7, r7, #1\n\t"
  115398. #endif
  115399. #ifdef WOLFSSL_KEIL
  115400. "orrs r5, r5, r6\n\t"
  115401. #elif defined(__clang__)
  115402. "orrs r5, r6\n\t"
  115403. #else
  115404. "orr r5, r6\n\t"
  115405. #endif
  115406. #ifdef WOLFSSL_KEIL
  115407. "orrs r7, r7, r3\n\t"
  115408. #elif defined(__clang__)
  115409. "orrs r7, r3\n\t"
  115410. #else
  115411. "orr r7, r3\n\t"
  115412. #endif
  115413. "str r5, [%[r], #40]\n\t"
  115414. "str r7, [%[r], #44]\n\t"
  115415. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  115416. :
  115417. : "memory", "r3", "r4", "r5", "r6", "r7"
  115418. );
  115419. }
  115420. static int sp_384_num_bits_12(sp_digit* a)
  115421. {
  115422. static const byte sp_num_bits_table[256] = {
  115423. 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  115424. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  115425. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  115426. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  115427. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  115428. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  115429. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  115430. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  115431. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115432. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115433. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115434. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115435. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115436. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115437. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115438. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  115439. };
  115440. const byte* table = sp_num_bits_table;
  115441. __asm__ __volatile__ (
  115442. "movs r6, #0xff\n\t"
  115443. "ldr r3, [%[a], #44]\n\t"
  115444. "cmp r3, #0\n\t"
  115445. "beq L_sp_384_num_bits_12_11_%=\n\t"
  115446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115447. "lsrs r5, r3, #24\n\t"
  115448. #else
  115449. "lsr r5, r3, #24\n\t"
  115450. #endif
  115451. "cmp r5, #0\n\t"
  115452. "beq L_sp_384_num_bits_12_133_%=\n\t"
  115453. "movs r2, #0xff\n\t"
  115454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115455. "adds r2, r2, #0x79\n\t"
  115456. #else
  115457. "add r2, r2, #0x79\n\t"
  115458. #endif
  115459. "ldrb r4, [%[table], r5]\n\t"
  115460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115461. "adds r2, r2, r4\n\t"
  115462. #else
  115463. "add r2, r2, r4\n\t"
  115464. #endif
  115465. "b L_sp_384_num_bits_12_13_%=\n\t"
  115466. "\n"
  115467. "L_sp_384_num_bits_12_133_%=:\n\t"
  115468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115469. "lsrs r5, r3, #16\n\t"
  115470. #else
  115471. "lsr r5, r3, #16\n\t"
  115472. #endif
  115473. #ifdef WOLFSSL_KEIL
  115474. "ands r5, r5, r6\n\t"
  115475. #elif defined(__clang__)
  115476. "ands r5, r6\n\t"
  115477. #else
  115478. "and r5, r6\n\t"
  115479. #endif
  115480. "cmp r5, #0\n\t"
  115481. "beq L_sp_384_num_bits_12_132_%=\n\t"
  115482. "movs r2, #0xff\n\t"
  115483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115484. "adds r2, r2, #0x71\n\t"
  115485. #else
  115486. "add r2, r2, #0x71\n\t"
  115487. #endif
  115488. "ldrb r4, [%[table], r5]\n\t"
  115489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115490. "adds r2, r2, r4\n\t"
  115491. #else
  115492. "add r2, r2, r4\n\t"
  115493. #endif
  115494. "b L_sp_384_num_bits_12_13_%=\n\t"
  115495. "\n"
  115496. "L_sp_384_num_bits_12_132_%=:\n\t"
  115497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115498. "lsrs r5, r3, #8\n\t"
  115499. #else
  115500. "lsr r5, r3, #8\n\t"
  115501. #endif
  115502. #ifdef WOLFSSL_KEIL
  115503. "ands r5, r5, r6\n\t"
  115504. #elif defined(__clang__)
  115505. "ands r5, r6\n\t"
  115506. #else
  115507. "and r5, r6\n\t"
  115508. #endif
  115509. "cmp r5, #0\n\t"
  115510. "beq L_sp_384_num_bits_12_131_%=\n\t"
  115511. "movs r2, #0xff\n\t"
  115512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115513. "adds r2, r2, #0x69\n\t"
  115514. #else
  115515. "add r2, r2, #0x69\n\t"
  115516. #endif
  115517. "ldrb r4, [%[table], r5]\n\t"
  115518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115519. "adds r2, r2, r4\n\t"
  115520. #else
  115521. "add r2, r2, r4\n\t"
  115522. #endif
  115523. "b L_sp_384_num_bits_12_13_%=\n\t"
  115524. "\n"
  115525. "L_sp_384_num_bits_12_131_%=:\n\t"
  115526. "movs r5, r3\n\t"
  115527. #ifdef WOLFSSL_KEIL
  115528. "ands r5, r5, r6\n\t"
  115529. #elif defined(__clang__)
  115530. "ands r5, r6\n\t"
  115531. #else
  115532. "and r5, r6\n\t"
  115533. #endif
  115534. "cmp r5, #0\n\t"
  115535. "beq L_sp_384_num_bits_12_130_%=\n\t"
  115536. "movs r2, #0xff\n\t"
  115537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115538. "adds r2, r2, #0x61\n\t"
  115539. #else
  115540. "add r2, r2, #0x61\n\t"
  115541. #endif
  115542. "ldrb r4, [%[table], r5]\n\t"
  115543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115544. "adds r2, r2, r4\n\t"
  115545. #else
  115546. "add r2, r2, r4\n\t"
  115547. #endif
  115548. "b L_sp_384_num_bits_12_13_%=\n\t"
  115549. "\n"
  115550. "L_sp_384_num_bits_12_130_%=:\n\t"
  115551. "b L_sp_384_num_bits_12_13_%=\n\t"
  115552. "\n"
  115553. "L_sp_384_num_bits_12_11_%=:\n\t"
  115554. "ldr r3, [%[a], #40]\n\t"
  115555. "cmp r3, #0\n\t"
  115556. "beq L_sp_384_num_bits_12_10_%=\n\t"
  115557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115558. "lsrs r5, r3, #24\n\t"
  115559. #else
  115560. "lsr r5, r3, #24\n\t"
  115561. #endif
  115562. "cmp r5, #0\n\t"
  115563. "beq L_sp_384_num_bits_12_123_%=\n\t"
  115564. "movs r2, #0xff\n\t"
  115565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115566. "adds r2, r2, #0x59\n\t"
  115567. #else
  115568. "add r2, r2, #0x59\n\t"
  115569. #endif
  115570. "ldrb r4, [%[table], r5]\n\t"
  115571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115572. "adds r2, r2, r4\n\t"
  115573. #else
  115574. "add r2, r2, r4\n\t"
  115575. #endif
  115576. "b L_sp_384_num_bits_12_13_%=\n\t"
  115577. "\n"
  115578. "L_sp_384_num_bits_12_123_%=:\n\t"
  115579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115580. "lsrs r5, r3, #16\n\t"
  115581. #else
  115582. "lsr r5, r3, #16\n\t"
  115583. #endif
  115584. #ifdef WOLFSSL_KEIL
  115585. "ands r5, r5, r6\n\t"
  115586. #elif defined(__clang__)
  115587. "ands r5, r6\n\t"
  115588. #else
  115589. "and r5, r6\n\t"
  115590. #endif
  115591. "cmp r5, #0\n\t"
  115592. "beq L_sp_384_num_bits_12_122_%=\n\t"
  115593. "movs r2, #0xff\n\t"
  115594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115595. "adds r2, r2, #0x51\n\t"
  115596. #else
  115597. "add r2, r2, #0x51\n\t"
  115598. #endif
  115599. "ldrb r4, [%[table], r5]\n\t"
  115600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115601. "adds r2, r2, r4\n\t"
  115602. #else
  115603. "add r2, r2, r4\n\t"
  115604. #endif
  115605. "b L_sp_384_num_bits_12_13_%=\n\t"
  115606. "\n"
  115607. "L_sp_384_num_bits_12_122_%=:\n\t"
  115608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115609. "lsrs r5, r3, #8\n\t"
  115610. #else
  115611. "lsr r5, r3, #8\n\t"
  115612. #endif
  115613. #ifdef WOLFSSL_KEIL
  115614. "ands r5, r5, r6\n\t"
  115615. #elif defined(__clang__)
  115616. "ands r5, r6\n\t"
  115617. #else
  115618. "and r5, r6\n\t"
  115619. #endif
  115620. "cmp r5, #0\n\t"
  115621. "beq L_sp_384_num_bits_12_121_%=\n\t"
  115622. "movs r2, #0xff\n\t"
  115623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115624. "adds r2, r2, #0x49\n\t"
  115625. #else
  115626. "add r2, r2, #0x49\n\t"
  115627. #endif
  115628. "ldrb r4, [%[table], r5]\n\t"
  115629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115630. "adds r2, r2, r4\n\t"
  115631. #else
  115632. "add r2, r2, r4\n\t"
  115633. #endif
  115634. "b L_sp_384_num_bits_12_13_%=\n\t"
  115635. "\n"
  115636. "L_sp_384_num_bits_12_121_%=:\n\t"
  115637. "movs r5, r3\n\t"
  115638. #ifdef WOLFSSL_KEIL
  115639. "ands r5, r5, r6\n\t"
  115640. #elif defined(__clang__)
  115641. "ands r5, r6\n\t"
  115642. #else
  115643. "and r5, r6\n\t"
  115644. #endif
  115645. "cmp r5, #0\n\t"
  115646. "beq L_sp_384_num_bits_12_120_%=\n\t"
  115647. "movs r2, #0xff\n\t"
  115648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115649. "adds r2, r2, #0x41\n\t"
  115650. #else
  115651. "add r2, r2, #0x41\n\t"
  115652. #endif
  115653. "ldrb r4, [%[table], r5]\n\t"
  115654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115655. "adds r2, r2, r4\n\t"
  115656. #else
  115657. "add r2, r2, r4\n\t"
  115658. #endif
  115659. "b L_sp_384_num_bits_12_13_%=\n\t"
  115660. "\n"
  115661. "L_sp_384_num_bits_12_120_%=:\n\t"
  115662. "b L_sp_384_num_bits_12_13_%=\n\t"
  115663. "\n"
  115664. "L_sp_384_num_bits_12_10_%=:\n\t"
  115665. "ldr r3, [%[a], #36]\n\t"
  115666. "cmp r3, #0\n\t"
  115667. "beq L_sp_384_num_bits_12_9_%=\n\t"
  115668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115669. "lsrs r5, r3, #24\n\t"
  115670. #else
  115671. "lsr r5, r3, #24\n\t"
  115672. #endif
  115673. "cmp r5, #0\n\t"
  115674. "beq L_sp_384_num_bits_12_113_%=\n\t"
  115675. "movs r2, #0xff\n\t"
  115676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115677. "adds r2, r2, #57\n\t"
  115678. #else
  115679. "add r2, r2, #57\n\t"
  115680. #endif
  115681. "ldrb r4, [%[table], r5]\n\t"
  115682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115683. "adds r2, r2, r4\n\t"
  115684. #else
  115685. "add r2, r2, r4\n\t"
  115686. #endif
  115687. "b L_sp_384_num_bits_12_13_%=\n\t"
  115688. "\n"
  115689. "L_sp_384_num_bits_12_113_%=:\n\t"
  115690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115691. "lsrs r5, r3, #16\n\t"
  115692. #else
  115693. "lsr r5, r3, #16\n\t"
  115694. #endif
  115695. #ifdef WOLFSSL_KEIL
  115696. "ands r5, r5, r6\n\t"
  115697. #elif defined(__clang__)
  115698. "ands r5, r6\n\t"
  115699. #else
  115700. "and r5, r6\n\t"
  115701. #endif
  115702. "cmp r5, #0\n\t"
  115703. "beq L_sp_384_num_bits_12_112_%=\n\t"
  115704. "movs r2, #0xff\n\t"
  115705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115706. "adds r2, r2, #49\n\t"
  115707. #else
  115708. "add r2, r2, #49\n\t"
  115709. #endif
  115710. "ldrb r4, [%[table], r5]\n\t"
  115711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115712. "adds r2, r2, r4\n\t"
  115713. #else
  115714. "add r2, r2, r4\n\t"
  115715. #endif
  115716. "b L_sp_384_num_bits_12_13_%=\n\t"
  115717. "\n"
  115718. "L_sp_384_num_bits_12_112_%=:\n\t"
  115719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115720. "lsrs r5, r3, #8\n\t"
  115721. #else
  115722. "lsr r5, r3, #8\n\t"
  115723. #endif
  115724. #ifdef WOLFSSL_KEIL
  115725. "ands r5, r5, r6\n\t"
  115726. #elif defined(__clang__)
  115727. "ands r5, r6\n\t"
  115728. #else
  115729. "and r5, r6\n\t"
  115730. #endif
  115731. "cmp r5, #0\n\t"
  115732. "beq L_sp_384_num_bits_12_111_%=\n\t"
  115733. "movs r2, #0xff\n\t"
  115734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115735. "adds r2, r2, #41\n\t"
  115736. #else
  115737. "add r2, r2, #41\n\t"
  115738. #endif
  115739. "ldrb r4, [%[table], r5]\n\t"
  115740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115741. "adds r2, r2, r4\n\t"
  115742. #else
  115743. "add r2, r2, r4\n\t"
  115744. #endif
  115745. "b L_sp_384_num_bits_12_13_%=\n\t"
  115746. "\n"
  115747. "L_sp_384_num_bits_12_111_%=:\n\t"
  115748. "movs r5, r3\n\t"
  115749. #ifdef WOLFSSL_KEIL
  115750. "ands r5, r5, r6\n\t"
  115751. #elif defined(__clang__)
  115752. "ands r5, r6\n\t"
  115753. #else
  115754. "and r5, r6\n\t"
  115755. #endif
  115756. "cmp r5, #0\n\t"
  115757. "beq L_sp_384_num_bits_12_110_%=\n\t"
  115758. "movs r2, #0xff\n\t"
  115759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115760. "adds r2, r2, #33\n\t"
  115761. #else
  115762. "add r2, r2, #33\n\t"
  115763. #endif
  115764. "ldrb r4, [%[table], r5]\n\t"
  115765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115766. "adds r2, r2, r4\n\t"
  115767. #else
  115768. "add r2, r2, r4\n\t"
  115769. #endif
  115770. "b L_sp_384_num_bits_12_13_%=\n\t"
  115771. "\n"
  115772. "L_sp_384_num_bits_12_110_%=:\n\t"
  115773. "b L_sp_384_num_bits_12_13_%=\n\t"
  115774. "\n"
  115775. "L_sp_384_num_bits_12_9_%=:\n\t"
  115776. "ldr r3, [%[a], #32]\n\t"
  115777. "cmp r3, #0\n\t"
  115778. "beq L_sp_384_num_bits_12_8_%=\n\t"
  115779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115780. "lsrs r5, r3, #24\n\t"
  115781. #else
  115782. "lsr r5, r3, #24\n\t"
  115783. #endif
  115784. "cmp r5, #0\n\t"
  115785. "beq L_sp_384_num_bits_12_103_%=\n\t"
  115786. "movs r2, #0xff\n\t"
  115787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115788. "adds r2, r2, #25\n\t"
  115789. #else
  115790. "add r2, r2, #25\n\t"
  115791. #endif
  115792. "ldrb r4, [%[table], r5]\n\t"
  115793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115794. "adds r2, r2, r4\n\t"
  115795. #else
  115796. "add r2, r2, r4\n\t"
  115797. #endif
  115798. "b L_sp_384_num_bits_12_13_%=\n\t"
  115799. "\n"
  115800. "L_sp_384_num_bits_12_103_%=:\n\t"
  115801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115802. "lsrs r5, r3, #16\n\t"
  115803. #else
  115804. "lsr r5, r3, #16\n\t"
  115805. #endif
  115806. #ifdef WOLFSSL_KEIL
  115807. "ands r5, r5, r6\n\t"
  115808. #elif defined(__clang__)
  115809. "ands r5, r6\n\t"
  115810. #else
  115811. "and r5, r6\n\t"
  115812. #endif
  115813. "cmp r5, #0\n\t"
  115814. "beq L_sp_384_num_bits_12_102_%=\n\t"
  115815. "movs r2, #0xff\n\t"
  115816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115817. "adds r2, r2, #17\n\t"
  115818. #else
  115819. "add r2, r2, #17\n\t"
  115820. #endif
  115821. "ldrb r4, [%[table], r5]\n\t"
  115822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115823. "adds r2, r2, r4\n\t"
  115824. #else
  115825. "add r2, r2, r4\n\t"
  115826. #endif
  115827. "b L_sp_384_num_bits_12_13_%=\n\t"
  115828. "\n"
  115829. "L_sp_384_num_bits_12_102_%=:\n\t"
  115830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115831. "lsrs r5, r3, #8\n\t"
  115832. #else
  115833. "lsr r5, r3, #8\n\t"
  115834. #endif
  115835. #ifdef WOLFSSL_KEIL
  115836. "ands r5, r5, r6\n\t"
  115837. #elif defined(__clang__)
  115838. "ands r5, r6\n\t"
  115839. #else
  115840. "and r5, r6\n\t"
  115841. #endif
  115842. "cmp r5, #0\n\t"
  115843. "beq L_sp_384_num_bits_12_101_%=\n\t"
  115844. "movs r2, #0xff\n\t"
  115845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115846. "adds r2, r2, #9\n\t"
  115847. #else
  115848. "add r2, r2, #9\n\t"
  115849. #endif
  115850. "ldrb r4, [%[table], r5]\n\t"
  115851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115852. "adds r2, r2, r4\n\t"
  115853. #else
  115854. "add r2, r2, r4\n\t"
  115855. #endif
  115856. "b L_sp_384_num_bits_12_13_%=\n\t"
  115857. "\n"
  115858. "L_sp_384_num_bits_12_101_%=:\n\t"
  115859. "movs r5, r3\n\t"
  115860. #ifdef WOLFSSL_KEIL
  115861. "ands r5, r5, r6\n\t"
  115862. #elif defined(__clang__)
  115863. "ands r5, r6\n\t"
  115864. #else
  115865. "and r5, r6\n\t"
  115866. #endif
  115867. "cmp r5, #0\n\t"
  115868. "beq L_sp_384_num_bits_12_100_%=\n\t"
  115869. "movs r2, #0xff\n\t"
  115870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115871. "adds r2, r2, #1\n\t"
  115872. #else
  115873. "add r2, r2, #1\n\t"
  115874. #endif
  115875. "ldrb r4, [%[table], r5]\n\t"
  115876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115877. "adds r2, r2, r4\n\t"
  115878. #else
  115879. "add r2, r2, r4\n\t"
  115880. #endif
  115881. "b L_sp_384_num_bits_12_13_%=\n\t"
  115882. "\n"
  115883. "L_sp_384_num_bits_12_100_%=:\n\t"
  115884. "b L_sp_384_num_bits_12_13_%=\n\t"
  115885. "\n"
  115886. "L_sp_384_num_bits_12_8_%=:\n\t"
  115887. "ldr r3, [%[a], #28]\n\t"
  115888. "cmp r3, #0\n\t"
  115889. "beq L_sp_384_num_bits_12_7_%=\n\t"
  115890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115891. "lsrs r5, r3, #24\n\t"
  115892. #else
  115893. "lsr r5, r3, #24\n\t"
  115894. #endif
  115895. "cmp r5, #0\n\t"
  115896. "beq L_sp_384_num_bits_12_93_%=\n\t"
  115897. "movs r2, #0xf8\n\t"
  115898. "ldrb r4, [%[table], r5]\n\t"
  115899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115900. "adds r2, r2, r4\n\t"
  115901. #else
  115902. "add r2, r2, r4\n\t"
  115903. #endif
  115904. "b L_sp_384_num_bits_12_13_%=\n\t"
  115905. "\n"
  115906. "L_sp_384_num_bits_12_93_%=:\n\t"
  115907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115908. "lsrs r5, r3, #16\n\t"
  115909. #else
  115910. "lsr r5, r3, #16\n\t"
  115911. #endif
  115912. #ifdef WOLFSSL_KEIL
  115913. "ands r5, r5, r6\n\t"
  115914. #elif defined(__clang__)
  115915. "ands r5, r6\n\t"
  115916. #else
  115917. "and r5, r6\n\t"
  115918. #endif
  115919. "cmp r5, #0\n\t"
  115920. "beq L_sp_384_num_bits_12_92_%=\n\t"
  115921. "movs r2, #0xf0\n\t"
  115922. "ldrb r4, [%[table], r5]\n\t"
  115923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115924. "adds r2, r2, r4\n\t"
  115925. #else
  115926. "add r2, r2, r4\n\t"
  115927. #endif
  115928. "b L_sp_384_num_bits_12_13_%=\n\t"
  115929. "\n"
  115930. "L_sp_384_num_bits_12_92_%=:\n\t"
  115931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115932. "lsrs r5, r3, #8\n\t"
  115933. #else
  115934. "lsr r5, r3, #8\n\t"
  115935. #endif
  115936. #ifdef WOLFSSL_KEIL
  115937. "ands r5, r5, r6\n\t"
  115938. #elif defined(__clang__)
  115939. "ands r5, r6\n\t"
  115940. #else
  115941. "and r5, r6\n\t"
  115942. #endif
  115943. "cmp r5, #0\n\t"
  115944. "beq L_sp_384_num_bits_12_91_%=\n\t"
  115945. "movs r2, #0xe8\n\t"
  115946. "ldrb r4, [%[table], r5]\n\t"
  115947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115948. "adds r2, r2, r4\n\t"
  115949. #else
  115950. "add r2, r2, r4\n\t"
  115951. #endif
  115952. "b L_sp_384_num_bits_12_13_%=\n\t"
  115953. "\n"
  115954. "L_sp_384_num_bits_12_91_%=:\n\t"
  115955. "movs r5, r3\n\t"
  115956. #ifdef WOLFSSL_KEIL
  115957. "ands r5, r5, r6\n\t"
  115958. #elif defined(__clang__)
  115959. "ands r5, r6\n\t"
  115960. #else
  115961. "and r5, r6\n\t"
  115962. #endif
  115963. "cmp r5, #0\n\t"
  115964. "beq L_sp_384_num_bits_12_90_%=\n\t"
  115965. "movs r2, #0xe0\n\t"
  115966. "ldrb r4, [%[table], r5]\n\t"
  115967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115968. "adds r2, r2, r4\n\t"
  115969. #else
  115970. "add r2, r2, r4\n\t"
  115971. #endif
  115972. "b L_sp_384_num_bits_12_13_%=\n\t"
  115973. "\n"
  115974. "L_sp_384_num_bits_12_90_%=:\n\t"
  115975. "b L_sp_384_num_bits_12_13_%=\n\t"
  115976. "\n"
  115977. "L_sp_384_num_bits_12_7_%=:\n\t"
  115978. "ldr r3, [%[a], #24]\n\t"
  115979. "cmp r3, #0\n\t"
  115980. "beq L_sp_384_num_bits_12_6_%=\n\t"
  115981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115982. "lsrs r5, r3, #24\n\t"
  115983. #else
  115984. "lsr r5, r3, #24\n\t"
  115985. #endif
  115986. "cmp r5, #0\n\t"
  115987. "beq L_sp_384_num_bits_12_83_%=\n\t"
  115988. "movs r2, #0xd8\n\t"
  115989. "ldrb r4, [%[table], r5]\n\t"
  115990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115991. "adds r2, r2, r4\n\t"
  115992. #else
  115993. "add r2, r2, r4\n\t"
  115994. #endif
  115995. "b L_sp_384_num_bits_12_13_%=\n\t"
  115996. "\n"
  115997. "L_sp_384_num_bits_12_83_%=:\n\t"
  115998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  115999. "lsrs r5, r3, #16\n\t"
  116000. #else
  116001. "lsr r5, r3, #16\n\t"
  116002. #endif
  116003. #ifdef WOLFSSL_KEIL
  116004. "ands r5, r5, r6\n\t"
  116005. #elif defined(__clang__)
  116006. "ands r5, r6\n\t"
  116007. #else
  116008. "and r5, r6\n\t"
  116009. #endif
  116010. "cmp r5, #0\n\t"
  116011. "beq L_sp_384_num_bits_12_82_%=\n\t"
  116012. "movs r2, #0xd0\n\t"
  116013. "ldrb r4, [%[table], r5]\n\t"
  116014. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116015. "adds r2, r2, r4\n\t"
  116016. #else
  116017. "add r2, r2, r4\n\t"
  116018. #endif
  116019. "b L_sp_384_num_bits_12_13_%=\n\t"
  116020. "\n"
  116021. "L_sp_384_num_bits_12_82_%=:\n\t"
  116022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116023. "lsrs r5, r3, #8\n\t"
  116024. #else
  116025. "lsr r5, r3, #8\n\t"
  116026. #endif
  116027. #ifdef WOLFSSL_KEIL
  116028. "ands r5, r5, r6\n\t"
  116029. #elif defined(__clang__)
  116030. "ands r5, r6\n\t"
  116031. #else
  116032. "and r5, r6\n\t"
  116033. #endif
  116034. "cmp r5, #0\n\t"
  116035. "beq L_sp_384_num_bits_12_81_%=\n\t"
  116036. "movs r2, #0xc8\n\t"
  116037. "ldrb r4, [%[table], r5]\n\t"
  116038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116039. "adds r2, r2, r4\n\t"
  116040. #else
  116041. "add r2, r2, r4\n\t"
  116042. #endif
  116043. "b L_sp_384_num_bits_12_13_%=\n\t"
  116044. "\n"
  116045. "L_sp_384_num_bits_12_81_%=:\n\t"
  116046. "movs r5, r3\n\t"
  116047. #ifdef WOLFSSL_KEIL
  116048. "ands r5, r5, r6\n\t"
  116049. #elif defined(__clang__)
  116050. "ands r5, r6\n\t"
  116051. #else
  116052. "and r5, r6\n\t"
  116053. #endif
  116054. "cmp r5, #0\n\t"
  116055. "beq L_sp_384_num_bits_12_80_%=\n\t"
  116056. "movs r2, #0xc0\n\t"
  116057. "ldrb r4, [%[table], r5]\n\t"
  116058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116059. "adds r2, r2, r4\n\t"
  116060. #else
  116061. "add r2, r2, r4\n\t"
  116062. #endif
  116063. "b L_sp_384_num_bits_12_13_%=\n\t"
  116064. "\n"
  116065. "L_sp_384_num_bits_12_80_%=:\n\t"
  116066. "b L_sp_384_num_bits_12_13_%=\n\t"
  116067. "\n"
  116068. "L_sp_384_num_bits_12_6_%=:\n\t"
  116069. "ldr r3, [%[a], #20]\n\t"
  116070. "cmp r3, #0\n\t"
  116071. "beq L_sp_384_num_bits_12_5_%=\n\t"
  116072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116073. "lsrs r5, r3, #24\n\t"
  116074. #else
  116075. "lsr r5, r3, #24\n\t"
  116076. #endif
  116077. "cmp r5, #0\n\t"
  116078. "beq L_sp_384_num_bits_12_73_%=\n\t"
  116079. "movs r2, #0xb8\n\t"
  116080. "ldrb r4, [%[table], r5]\n\t"
  116081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116082. "adds r2, r2, r4\n\t"
  116083. #else
  116084. "add r2, r2, r4\n\t"
  116085. #endif
  116086. "b L_sp_384_num_bits_12_13_%=\n\t"
  116087. "\n"
  116088. "L_sp_384_num_bits_12_73_%=:\n\t"
  116089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116090. "lsrs r5, r3, #16\n\t"
  116091. #else
  116092. "lsr r5, r3, #16\n\t"
  116093. #endif
  116094. #ifdef WOLFSSL_KEIL
  116095. "ands r5, r5, r6\n\t"
  116096. #elif defined(__clang__)
  116097. "ands r5, r6\n\t"
  116098. #else
  116099. "and r5, r6\n\t"
  116100. #endif
  116101. "cmp r5, #0\n\t"
  116102. "beq L_sp_384_num_bits_12_72_%=\n\t"
  116103. "movs r2, #0xb0\n\t"
  116104. "ldrb r4, [%[table], r5]\n\t"
  116105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116106. "adds r2, r2, r4\n\t"
  116107. #else
  116108. "add r2, r2, r4\n\t"
  116109. #endif
  116110. "b L_sp_384_num_bits_12_13_%=\n\t"
  116111. "\n"
  116112. "L_sp_384_num_bits_12_72_%=:\n\t"
  116113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116114. "lsrs r5, r3, #8\n\t"
  116115. #else
  116116. "lsr r5, r3, #8\n\t"
  116117. #endif
  116118. #ifdef WOLFSSL_KEIL
  116119. "ands r5, r5, r6\n\t"
  116120. #elif defined(__clang__)
  116121. "ands r5, r6\n\t"
  116122. #else
  116123. "and r5, r6\n\t"
  116124. #endif
  116125. "cmp r5, #0\n\t"
  116126. "beq L_sp_384_num_bits_12_71_%=\n\t"
  116127. "movs r2, #0xa8\n\t"
  116128. "ldrb r4, [%[table], r5]\n\t"
  116129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116130. "adds r2, r2, r4\n\t"
  116131. #else
  116132. "add r2, r2, r4\n\t"
  116133. #endif
  116134. "b L_sp_384_num_bits_12_13_%=\n\t"
  116135. "\n"
  116136. "L_sp_384_num_bits_12_71_%=:\n\t"
  116137. "movs r5, r3\n\t"
  116138. #ifdef WOLFSSL_KEIL
  116139. "ands r5, r5, r6\n\t"
  116140. #elif defined(__clang__)
  116141. "ands r5, r6\n\t"
  116142. #else
  116143. "and r5, r6\n\t"
  116144. #endif
  116145. "cmp r5, #0\n\t"
  116146. "beq L_sp_384_num_bits_12_70_%=\n\t"
  116147. "movs r2, #0xa0\n\t"
  116148. "ldrb r4, [%[table], r5]\n\t"
  116149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116150. "adds r2, r2, r4\n\t"
  116151. #else
  116152. "add r2, r2, r4\n\t"
  116153. #endif
  116154. "b L_sp_384_num_bits_12_13_%=\n\t"
  116155. "\n"
  116156. "L_sp_384_num_bits_12_70_%=:\n\t"
  116157. "b L_sp_384_num_bits_12_13_%=\n\t"
  116158. "\n"
  116159. "L_sp_384_num_bits_12_5_%=:\n\t"
  116160. "ldr r3, [%[a], #16]\n\t"
  116161. "cmp r3, #0\n\t"
  116162. "beq L_sp_384_num_bits_12_4_%=\n\t"
  116163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116164. "lsrs r5, r3, #24\n\t"
  116165. #else
  116166. "lsr r5, r3, #24\n\t"
  116167. #endif
  116168. "cmp r5, #0\n\t"
  116169. "beq L_sp_384_num_bits_12_63_%=\n\t"
  116170. "movs r2, #0x98\n\t"
  116171. "ldrb r4, [%[table], r5]\n\t"
  116172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116173. "adds r2, r2, r4\n\t"
  116174. #else
  116175. "add r2, r2, r4\n\t"
  116176. #endif
  116177. "b L_sp_384_num_bits_12_13_%=\n\t"
  116178. "\n"
  116179. "L_sp_384_num_bits_12_63_%=:\n\t"
  116180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116181. "lsrs r5, r3, #16\n\t"
  116182. #else
  116183. "lsr r5, r3, #16\n\t"
  116184. #endif
  116185. #ifdef WOLFSSL_KEIL
  116186. "ands r5, r5, r6\n\t"
  116187. #elif defined(__clang__)
  116188. "ands r5, r6\n\t"
  116189. #else
  116190. "and r5, r6\n\t"
  116191. #endif
  116192. "cmp r5, #0\n\t"
  116193. "beq L_sp_384_num_bits_12_62_%=\n\t"
  116194. "movs r2, #0x90\n\t"
  116195. "ldrb r4, [%[table], r5]\n\t"
  116196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116197. "adds r2, r2, r4\n\t"
  116198. #else
  116199. "add r2, r2, r4\n\t"
  116200. #endif
  116201. "b L_sp_384_num_bits_12_13_%=\n\t"
  116202. "\n"
  116203. "L_sp_384_num_bits_12_62_%=:\n\t"
  116204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116205. "lsrs r5, r3, #8\n\t"
  116206. #else
  116207. "lsr r5, r3, #8\n\t"
  116208. #endif
  116209. #ifdef WOLFSSL_KEIL
  116210. "ands r5, r5, r6\n\t"
  116211. #elif defined(__clang__)
  116212. "ands r5, r6\n\t"
  116213. #else
  116214. "and r5, r6\n\t"
  116215. #endif
  116216. "cmp r5, #0\n\t"
  116217. "beq L_sp_384_num_bits_12_61_%=\n\t"
  116218. "movs r2, #0x88\n\t"
  116219. "ldrb r4, [%[table], r5]\n\t"
  116220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116221. "adds r2, r2, r4\n\t"
  116222. #else
  116223. "add r2, r2, r4\n\t"
  116224. #endif
  116225. "b L_sp_384_num_bits_12_13_%=\n\t"
  116226. "\n"
  116227. "L_sp_384_num_bits_12_61_%=:\n\t"
  116228. "movs r5, r3\n\t"
  116229. #ifdef WOLFSSL_KEIL
  116230. "ands r5, r5, r6\n\t"
  116231. #elif defined(__clang__)
  116232. "ands r5, r6\n\t"
  116233. #else
  116234. "and r5, r6\n\t"
  116235. #endif
  116236. "cmp r5, #0\n\t"
  116237. "beq L_sp_384_num_bits_12_60_%=\n\t"
  116238. "movs r2, #0x80\n\t"
  116239. "ldrb r4, [%[table], r5]\n\t"
  116240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116241. "adds r2, r2, r4\n\t"
  116242. #else
  116243. "add r2, r2, r4\n\t"
  116244. #endif
  116245. "b L_sp_384_num_bits_12_13_%=\n\t"
  116246. "\n"
  116247. "L_sp_384_num_bits_12_60_%=:\n\t"
  116248. "b L_sp_384_num_bits_12_13_%=\n\t"
  116249. "\n"
  116250. "L_sp_384_num_bits_12_4_%=:\n\t"
  116251. "ldr r3, [%[a], #12]\n\t"
  116252. "cmp r3, #0\n\t"
  116253. "beq L_sp_384_num_bits_12_3_%=\n\t"
  116254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116255. "lsrs r5, r3, #24\n\t"
  116256. #else
  116257. "lsr r5, r3, #24\n\t"
  116258. #endif
  116259. "cmp r5, #0\n\t"
  116260. "beq L_sp_384_num_bits_12_53_%=\n\t"
  116261. "movs r2, #0x78\n\t"
  116262. "ldrb r4, [%[table], r5]\n\t"
  116263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116264. "adds r2, r2, r4\n\t"
  116265. #else
  116266. "add r2, r2, r4\n\t"
  116267. #endif
  116268. "b L_sp_384_num_bits_12_13_%=\n\t"
  116269. "\n"
  116270. "L_sp_384_num_bits_12_53_%=:\n\t"
  116271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116272. "lsrs r5, r3, #16\n\t"
  116273. #else
  116274. "lsr r5, r3, #16\n\t"
  116275. #endif
  116276. #ifdef WOLFSSL_KEIL
  116277. "ands r5, r5, r6\n\t"
  116278. #elif defined(__clang__)
  116279. "ands r5, r6\n\t"
  116280. #else
  116281. "and r5, r6\n\t"
  116282. #endif
  116283. "cmp r5, #0\n\t"
  116284. "beq L_sp_384_num_bits_12_52_%=\n\t"
  116285. "movs r2, #0x70\n\t"
  116286. "ldrb r4, [%[table], r5]\n\t"
  116287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116288. "adds r2, r2, r4\n\t"
  116289. #else
  116290. "add r2, r2, r4\n\t"
  116291. #endif
  116292. "b L_sp_384_num_bits_12_13_%=\n\t"
  116293. "\n"
  116294. "L_sp_384_num_bits_12_52_%=:\n\t"
  116295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116296. "lsrs r5, r3, #8\n\t"
  116297. #else
  116298. "lsr r5, r3, #8\n\t"
  116299. #endif
  116300. #ifdef WOLFSSL_KEIL
  116301. "ands r5, r5, r6\n\t"
  116302. #elif defined(__clang__)
  116303. "ands r5, r6\n\t"
  116304. #else
  116305. "and r5, r6\n\t"
  116306. #endif
  116307. "cmp r5, #0\n\t"
  116308. "beq L_sp_384_num_bits_12_51_%=\n\t"
  116309. "movs r2, #0x68\n\t"
  116310. "ldrb r4, [%[table], r5]\n\t"
  116311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116312. "adds r2, r2, r4\n\t"
  116313. #else
  116314. "add r2, r2, r4\n\t"
  116315. #endif
  116316. "b L_sp_384_num_bits_12_13_%=\n\t"
  116317. "\n"
  116318. "L_sp_384_num_bits_12_51_%=:\n\t"
  116319. "movs r5, r3\n\t"
  116320. #ifdef WOLFSSL_KEIL
  116321. "ands r5, r5, r6\n\t"
  116322. #elif defined(__clang__)
  116323. "ands r5, r6\n\t"
  116324. #else
  116325. "and r5, r6\n\t"
  116326. #endif
  116327. "cmp r5, #0\n\t"
  116328. "beq L_sp_384_num_bits_12_50_%=\n\t"
  116329. "movs r2, #0x60\n\t"
  116330. "ldrb r4, [%[table], r5]\n\t"
  116331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116332. "adds r2, r2, r4\n\t"
  116333. #else
  116334. "add r2, r2, r4\n\t"
  116335. #endif
  116336. "b L_sp_384_num_bits_12_13_%=\n\t"
  116337. "\n"
  116338. "L_sp_384_num_bits_12_50_%=:\n\t"
  116339. "b L_sp_384_num_bits_12_13_%=\n\t"
  116340. "\n"
  116341. "L_sp_384_num_bits_12_3_%=:\n\t"
  116342. "ldr r3, [%[a], #8]\n\t"
  116343. "cmp r3, #0\n\t"
  116344. "beq L_sp_384_num_bits_12_2_%=\n\t"
  116345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116346. "lsrs r5, r3, #24\n\t"
  116347. #else
  116348. "lsr r5, r3, #24\n\t"
  116349. #endif
  116350. "cmp r5, #0\n\t"
  116351. "beq L_sp_384_num_bits_12_43_%=\n\t"
  116352. "movs r2, #0x58\n\t"
  116353. "ldrb r4, [%[table], r5]\n\t"
  116354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116355. "adds r2, r2, r4\n\t"
  116356. #else
  116357. "add r2, r2, r4\n\t"
  116358. #endif
  116359. "b L_sp_384_num_bits_12_13_%=\n\t"
  116360. "\n"
  116361. "L_sp_384_num_bits_12_43_%=:\n\t"
  116362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116363. "lsrs r5, r3, #16\n\t"
  116364. #else
  116365. "lsr r5, r3, #16\n\t"
  116366. #endif
  116367. #ifdef WOLFSSL_KEIL
  116368. "ands r5, r5, r6\n\t"
  116369. #elif defined(__clang__)
  116370. "ands r5, r6\n\t"
  116371. #else
  116372. "and r5, r6\n\t"
  116373. #endif
  116374. "cmp r5, #0\n\t"
  116375. "beq L_sp_384_num_bits_12_42_%=\n\t"
  116376. "movs r2, #0x50\n\t"
  116377. "ldrb r4, [%[table], r5]\n\t"
  116378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116379. "adds r2, r2, r4\n\t"
  116380. #else
  116381. "add r2, r2, r4\n\t"
  116382. #endif
  116383. "b L_sp_384_num_bits_12_13_%=\n\t"
  116384. "\n"
  116385. "L_sp_384_num_bits_12_42_%=:\n\t"
  116386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116387. "lsrs r5, r3, #8\n\t"
  116388. #else
  116389. "lsr r5, r3, #8\n\t"
  116390. #endif
  116391. #ifdef WOLFSSL_KEIL
  116392. "ands r5, r5, r6\n\t"
  116393. #elif defined(__clang__)
  116394. "ands r5, r6\n\t"
  116395. #else
  116396. "and r5, r6\n\t"
  116397. #endif
  116398. "cmp r5, #0\n\t"
  116399. "beq L_sp_384_num_bits_12_41_%=\n\t"
  116400. "movs r2, #0x48\n\t"
  116401. "ldrb r4, [%[table], r5]\n\t"
  116402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116403. "adds r2, r2, r4\n\t"
  116404. #else
  116405. "add r2, r2, r4\n\t"
  116406. #endif
  116407. "b L_sp_384_num_bits_12_13_%=\n\t"
  116408. "\n"
  116409. "L_sp_384_num_bits_12_41_%=:\n\t"
  116410. "movs r5, r3\n\t"
  116411. #ifdef WOLFSSL_KEIL
  116412. "ands r5, r5, r6\n\t"
  116413. #elif defined(__clang__)
  116414. "ands r5, r6\n\t"
  116415. #else
  116416. "and r5, r6\n\t"
  116417. #endif
  116418. "cmp r5, #0\n\t"
  116419. "beq L_sp_384_num_bits_12_40_%=\n\t"
  116420. "movs r2, #0x40\n\t"
  116421. "ldrb r4, [%[table], r5]\n\t"
  116422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116423. "adds r2, r2, r4\n\t"
  116424. #else
  116425. "add r2, r2, r4\n\t"
  116426. #endif
  116427. "b L_sp_384_num_bits_12_13_%=\n\t"
  116428. "\n"
  116429. "L_sp_384_num_bits_12_40_%=:\n\t"
  116430. "b L_sp_384_num_bits_12_13_%=\n\t"
  116431. "\n"
  116432. "L_sp_384_num_bits_12_2_%=:\n\t"
  116433. "ldr r3, [%[a], #4]\n\t"
  116434. "cmp r3, #0\n\t"
  116435. "beq L_sp_384_num_bits_12_1_%=\n\t"
  116436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116437. "lsrs r5, r3, #24\n\t"
  116438. #else
  116439. "lsr r5, r3, #24\n\t"
  116440. #endif
  116441. "cmp r5, #0\n\t"
  116442. "beq L_sp_384_num_bits_12_33_%=\n\t"
  116443. "movs r2, #56\n\t"
  116444. "ldrb r4, [%[table], r5]\n\t"
  116445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116446. "adds r2, r2, r4\n\t"
  116447. #else
  116448. "add r2, r2, r4\n\t"
  116449. #endif
  116450. "b L_sp_384_num_bits_12_13_%=\n\t"
  116451. "\n"
  116452. "L_sp_384_num_bits_12_33_%=:\n\t"
  116453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116454. "lsrs r5, r3, #16\n\t"
  116455. #else
  116456. "lsr r5, r3, #16\n\t"
  116457. #endif
  116458. #ifdef WOLFSSL_KEIL
  116459. "ands r5, r5, r6\n\t"
  116460. #elif defined(__clang__)
  116461. "ands r5, r6\n\t"
  116462. #else
  116463. "and r5, r6\n\t"
  116464. #endif
  116465. "cmp r5, #0\n\t"
  116466. "beq L_sp_384_num_bits_12_32_%=\n\t"
  116467. "movs r2, #48\n\t"
  116468. "ldrb r4, [%[table], r5]\n\t"
  116469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116470. "adds r2, r2, r4\n\t"
  116471. #else
  116472. "add r2, r2, r4\n\t"
  116473. #endif
  116474. "b L_sp_384_num_bits_12_13_%=\n\t"
  116475. "\n"
  116476. "L_sp_384_num_bits_12_32_%=:\n\t"
  116477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116478. "lsrs r5, r3, #8\n\t"
  116479. #else
  116480. "lsr r5, r3, #8\n\t"
  116481. #endif
  116482. #ifdef WOLFSSL_KEIL
  116483. "ands r5, r5, r6\n\t"
  116484. #elif defined(__clang__)
  116485. "ands r5, r6\n\t"
  116486. #else
  116487. "and r5, r6\n\t"
  116488. #endif
  116489. "cmp r5, #0\n\t"
  116490. "beq L_sp_384_num_bits_12_31_%=\n\t"
  116491. "movs r2, #40\n\t"
  116492. "ldrb r4, [%[table], r5]\n\t"
  116493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116494. "adds r2, r2, r4\n\t"
  116495. #else
  116496. "add r2, r2, r4\n\t"
  116497. #endif
  116498. "b L_sp_384_num_bits_12_13_%=\n\t"
  116499. "\n"
  116500. "L_sp_384_num_bits_12_31_%=:\n\t"
  116501. "movs r5, r3\n\t"
  116502. #ifdef WOLFSSL_KEIL
  116503. "ands r5, r5, r6\n\t"
  116504. #elif defined(__clang__)
  116505. "ands r5, r6\n\t"
  116506. #else
  116507. "and r5, r6\n\t"
  116508. #endif
  116509. "cmp r5, #0\n\t"
  116510. "beq L_sp_384_num_bits_12_30_%=\n\t"
  116511. "movs r2, #32\n\t"
  116512. "ldrb r4, [%[table], r5]\n\t"
  116513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116514. "adds r2, r2, r4\n\t"
  116515. #else
  116516. "add r2, r2, r4\n\t"
  116517. #endif
  116518. "b L_sp_384_num_bits_12_13_%=\n\t"
  116519. "\n"
  116520. "L_sp_384_num_bits_12_30_%=:\n\t"
  116521. "b L_sp_384_num_bits_12_13_%=\n\t"
  116522. "\n"
  116523. "L_sp_384_num_bits_12_1_%=:\n\t"
  116524. "ldr r3, [%[a]]\n\t"
  116525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116526. "lsrs r5, r3, #24\n\t"
  116527. #else
  116528. "lsr r5, r3, #24\n\t"
  116529. #endif
  116530. "cmp r5, #0\n\t"
  116531. "beq L_sp_384_num_bits_12_23_%=\n\t"
  116532. "movs r2, #24\n\t"
  116533. "ldrb r4, [%[table], r5]\n\t"
  116534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116535. "adds r2, r2, r4\n\t"
  116536. #else
  116537. "add r2, r2, r4\n\t"
  116538. #endif
  116539. "b L_sp_384_num_bits_12_13_%=\n\t"
  116540. "\n"
  116541. "L_sp_384_num_bits_12_23_%=:\n\t"
  116542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116543. "lsrs r5, r3, #16\n\t"
  116544. #else
  116545. "lsr r5, r3, #16\n\t"
  116546. #endif
  116547. #ifdef WOLFSSL_KEIL
  116548. "ands r5, r5, r6\n\t"
  116549. #elif defined(__clang__)
  116550. "ands r5, r6\n\t"
  116551. #else
  116552. "and r5, r6\n\t"
  116553. #endif
  116554. "cmp r5, #0\n\t"
  116555. "beq L_sp_384_num_bits_12_22_%=\n\t"
  116556. "movs r2, #16\n\t"
  116557. "ldrb r4, [%[table], r5]\n\t"
  116558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116559. "adds r2, r2, r4\n\t"
  116560. #else
  116561. "add r2, r2, r4\n\t"
  116562. #endif
  116563. "b L_sp_384_num_bits_12_13_%=\n\t"
  116564. "\n"
  116565. "L_sp_384_num_bits_12_22_%=:\n\t"
  116566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116567. "lsrs r5, r3, #8\n\t"
  116568. #else
  116569. "lsr r5, r3, #8\n\t"
  116570. #endif
  116571. #ifdef WOLFSSL_KEIL
  116572. "ands r5, r5, r6\n\t"
  116573. #elif defined(__clang__)
  116574. "ands r5, r6\n\t"
  116575. #else
  116576. "and r5, r6\n\t"
  116577. #endif
  116578. "cmp r5, #0\n\t"
  116579. "beq L_sp_384_num_bits_12_21_%=\n\t"
  116580. "movs r2, #8\n\t"
  116581. "ldrb r4, [%[table], r5]\n\t"
  116582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  116583. "adds r2, r2, r4\n\t"
  116584. #else
  116585. "add r2, r2, r4\n\t"
  116586. #endif
  116587. "b L_sp_384_num_bits_12_13_%=\n\t"
  116588. "\n"
  116589. "L_sp_384_num_bits_12_21_%=:\n\t"
  116590. "movs r5, r3\n\t"
  116591. #ifdef WOLFSSL_KEIL
  116592. "ands r5, r5, r6\n\t"
  116593. #elif defined(__clang__)
  116594. "ands r5, r6\n\t"
  116595. #else
  116596. "and r5, r6\n\t"
  116597. #endif
  116598. "cmp r5, #0\n\t"
  116599. "beq L_sp_384_num_bits_12_20_%=\n\t"
  116600. "movs r2, #0\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_20_%=:\n\t"
  116610. "\n"
  116611. "L_sp_384_num_bits_12_13_%=:\n\t"
  116612. "movs %[a], r2\n\t"
  116613. : [a] "+l" (a), [table] "+l" (table)
  116614. :
  116615. : "memory", "r2", "r3", "r4", "r5", "r6"
  116616. );
  116617. return (uint32_t)(size_t)a;
  116618. }
  116619. /* Non-constant time modular inversion.
  116620. *
  116621. * @param [out] r Resulting number.
  116622. * @param [in] a Number to invert.
  116623. * @param [in] m Modulus.
  116624. * @return MP_OKAY on success.
  116625. */
  116626. static int sp_384_mod_inv_12(sp_digit* r, const sp_digit* a, const sp_digit* m)
  116627. {
  116628. sp_digit u[12];
  116629. sp_digit v[12];
  116630. sp_digit b[12];
  116631. sp_digit d[12];
  116632. int ut, vt;
  116633. sp_digit o;
  116634. XMEMCPY(u, m, sizeof(u));
  116635. XMEMCPY(v, a, sizeof(v));
  116636. ut = sp_384_num_bits_12(u);
  116637. vt = sp_384_num_bits_12(v);
  116638. XMEMSET(b, 0, sizeof(b));
  116639. if ((v[0] & 1) == 0) {
  116640. sp_384_rshift1_12(v, v);
  116641. XMEMCPY(d, m, sizeof(u));
  116642. d[0] += 1;
  116643. sp_384_rshift1_12(d, d);
  116644. vt--;
  116645. while ((v[0] & 1) == 0) {
  116646. sp_384_rshift1_12(v, v);
  116647. sp_384_div2_mod_12(d, d, m);
  116648. vt--;
  116649. }
  116650. }
  116651. else {
  116652. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  116653. d[0] = 1;
  116654. }
  116655. while (ut > 1 && vt > 1) {
  116656. if (ut > vt || (ut == vt && sp_384_cmp_12(u, v) >= 0)) {
  116657. sp_384_sub_12(u, u, v);
  116658. o = sp_384_sub_12(b, b, d);
  116659. if (o != 0)
  116660. sp_384_add_12(b, b, m);
  116661. ut = sp_384_num_bits_12(u);
  116662. do {
  116663. sp_384_rshift1_12(u, u);
  116664. sp_384_div2_mod_12(b, b, m);
  116665. ut--;
  116666. }
  116667. while (ut > 0 && (u[0] & 1) == 0);
  116668. }
  116669. else {
  116670. sp_384_sub_12(v, v, u);
  116671. o = sp_384_sub_12(d, d, b);
  116672. if (o != 0)
  116673. sp_384_add_12(d, d, m);
  116674. vt = sp_384_num_bits_12(v);
  116675. do {
  116676. sp_384_rshift1_12(v, v);
  116677. sp_384_div2_mod_12(d, d, m);
  116678. vt--;
  116679. }
  116680. while (vt > 0 && (v[0] & 1) == 0);
  116681. }
  116682. }
  116683. if (ut == 1)
  116684. XMEMCPY(r, b, sizeof(b));
  116685. else
  116686. XMEMCPY(r, d, sizeof(d));
  116687. return MP_OKAY;
  116688. }
  116689. #endif /* WOLFSSL_SP_SMALL */
  116690. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  116691. *
  116692. * p1 First point to add and holds result.
  116693. * p2 Second point to add.
  116694. * tmp Temporary storage for intermediate numbers.
  116695. */
  116696. static void sp_384_add_points_12(sp_point_384* p1, const sp_point_384* p2,
  116697. sp_digit* tmp)
  116698. {
  116699. sp_384_proj_point_add_12(p1, p1, p2, tmp);
  116700. if (sp_384_iszero_12(p1->z)) {
  116701. if (sp_384_iszero_12(p1->x) && sp_384_iszero_12(p1->y)) {
  116702. sp_384_proj_point_dbl_12(p1, p2, tmp);
  116703. }
  116704. else {
  116705. /* Y ordinate is not used from here - don't set. */
  116706. p1->x[0] = 0;
  116707. p1->x[1] = 0;
  116708. p1->x[2] = 0;
  116709. p1->x[3] = 0;
  116710. p1->x[4] = 0;
  116711. p1->x[5] = 0;
  116712. p1->x[6] = 0;
  116713. p1->x[7] = 0;
  116714. p1->x[8] = 0;
  116715. p1->x[9] = 0;
  116716. p1->x[10] = 0;
  116717. p1->x[11] = 0;
  116718. XMEMCPY(p1->z, p384_norm_mod, sizeof(p384_norm_mod));
  116719. }
  116720. }
  116721. }
  116722. /* Calculate the verification point: [e/s]G + [r/s]Q
  116723. *
  116724. * p1 Calculated point.
  116725. * p2 Public point and temporary.
  116726. * s Second part of signature as a number.
  116727. * u1 Temporary number.
  116728. * u2 Temproray number.
  116729. * heap Heap to use for allocation.
  116730. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  116731. */
  116732. static int sp_384_calc_vfy_point_12(sp_point_384* p1, sp_point_384* p2,
  116733. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  116734. {
  116735. int err;
  116736. #ifndef WOLFSSL_SP_SMALL
  116737. err = sp_384_mod_inv_12(s, s, p384_order);
  116738. if (err == MP_OKAY)
  116739. #endif /* !WOLFSSL_SP_SMALL */
  116740. {
  116741. sp_384_mul_12(s, s, p384_norm_order);
  116742. err = sp_384_mod_12(s, s, p384_order);
  116743. }
  116744. if (err == MP_OKAY) {
  116745. sp_384_norm_12(s);
  116746. #ifdef WOLFSSL_SP_SMALL
  116747. {
  116748. sp_384_mont_inv_order_12(s, s, tmp);
  116749. sp_384_mont_mul_order_12(u1, u1, s);
  116750. sp_384_mont_mul_order_12(u2, u2, s);
  116751. }
  116752. #else
  116753. {
  116754. sp_384_mont_mul_order_12(u1, u1, s);
  116755. sp_384_mont_mul_order_12(u2, u2, s);
  116756. }
  116757. #endif /* WOLFSSL_SP_SMALL */
  116758. {
  116759. err = sp_384_ecc_mulmod_base_12(p1, u1, 0, 0, heap);
  116760. }
  116761. }
  116762. if ((err == MP_OKAY) && sp_384_iszero_12(p1->z)) {
  116763. p1->infinity = 1;
  116764. }
  116765. if (err == MP_OKAY) {
  116766. err = sp_384_ecc_mulmod_12(p2, p2, u2, 0, 0, heap);
  116767. }
  116768. if ((err == MP_OKAY) && sp_384_iszero_12(p2->z)) {
  116769. p2->infinity = 1;
  116770. }
  116771. if (err == MP_OKAY) {
  116772. sp_384_add_points_12(p1, p2, tmp);
  116773. }
  116774. return err;
  116775. }
  116776. #ifdef HAVE_ECC_VERIFY
  116777. /* Verify the signature values with the hash and public key.
  116778. * e = Truncate(hash, 384)
  116779. * u1 = e/s mod order
  116780. * u2 = r/s mod order
  116781. * r == (u1.G + u2.Q)->x mod order
  116782. * Optimization: Leave point in projective form.
  116783. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  116784. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  116785. * The hash is truncated to the first 384 bits.
  116786. *
  116787. * hash Hash to sign.
  116788. * hashLen Length of the hash data.
  116789. * rng Random number generator.
  116790. * priv Private part of key - scalar.
  116791. * rm First part of result as an mp_int.
  116792. * sm Sirst part of result as an mp_int.
  116793. * heap Heap to use for allocation.
  116794. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  116795. */
  116796. #ifdef WOLFSSL_SP_NONBLOCK
  116797. typedef struct sp_ecc_verify_384_ctx {
  116798. int state;
  116799. union {
  116800. sp_384_ecc_mulmod_12_ctx mulmod_ctx;
  116801. sp_384_mont_inv_order_12_ctx mont_inv_order_ctx;
  116802. sp_384_proj_point_dbl_12_ctx dbl_ctx;
  116803. sp_384_proj_point_add_12_ctx add_ctx;
  116804. };
  116805. sp_digit u1[2*12];
  116806. sp_digit u2[2*12];
  116807. sp_digit s[2*12];
  116808. sp_digit tmp[2*12 * 6];
  116809. sp_point_384 p1;
  116810. sp_point_384 p2;
  116811. } sp_ecc_verify_384_ctx;
  116812. int sp_ecc_verify_384_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  116813. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  116814. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  116815. {
  116816. int err = FP_WOULDBLOCK;
  116817. sp_ecc_verify_384_ctx* ctx = (sp_ecc_verify_384_ctx*)sp_ctx->data;
  116818. typedef char ctx_size_test[sizeof(sp_ecc_verify_384_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  116819. (void)sizeof(ctx_size_test);
  116820. switch (ctx->state) {
  116821. case 0: /* INIT */
  116822. if (hashLen > 48U) {
  116823. hashLen = 48U;
  116824. }
  116825. sp_384_from_bin(ctx->u1, 12, hash, (int)hashLen);
  116826. sp_384_from_mp(ctx->u2, 12, rm);
  116827. sp_384_from_mp(ctx->s, 12, sm);
  116828. sp_384_from_mp(ctx->p2.x, 12, pX);
  116829. sp_384_from_mp(ctx->p2.y, 12, pY);
  116830. sp_384_from_mp(ctx->p2.z, 12, pZ);
  116831. ctx->state = 1;
  116832. break;
  116833. case 1: /* NORMS0 */
  116834. sp_384_mul_12(ctx->s, ctx->s, p384_norm_order);
  116835. err = sp_384_mod_12(ctx->s, ctx->s, p384_order);
  116836. if (err == MP_OKAY)
  116837. ctx->state = 2;
  116838. break;
  116839. case 2: /* NORMS1 */
  116840. sp_384_norm_12(ctx->s);
  116841. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  116842. ctx->state = 3;
  116843. break;
  116844. case 3: /* NORMS2 */
  116845. err = sp_384_mont_inv_order_12_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  116846. if (err == MP_OKAY) {
  116847. ctx->state = 4;
  116848. }
  116849. break;
  116850. case 4: /* NORMS3 */
  116851. sp_384_mont_mul_order_12(ctx->u1, ctx->u1, ctx->s);
  116852. ctx->state = 5;
  116853. break;
  116854. case 5: /* NORMS4 */
  116855. sp_384_mont_mul_order_12(ctx->u2, ctx->u2, ctx->s);
  116856. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  116857. ctx->state = 6;
  116858. break;
  116859. case 6: /* MULBASE */
  116860. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p384_base, ctx->u1, 0, 0, heap);
  116861. if (err == MP_OKAY) {
  116862. if (sp_384_iszero_12(ctx->p1.z)) {
  116863. ctx->p1.infinity = 1;
  116864. }
  116865. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  116866. ctx->state = 7;
  116867. }
  116868. break;
  116869. case 7: /* MULMOD */
  116870. err = sp_384_ecc_mulmod_12_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  116871. if (err == MP_OKAY) {
  116872. if (sp_384_iszero_12(ctx->p2.z)) {
  116873. ctx->p2.infinity = 1;
  116874. }
  116875. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  116876. ctx->state = 8;
  116877. }
  116878. break;
  116879. case 8: /* ADD */
  116880. err = sp_384_proj_point_add_12_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  116881. if (err == MP_OKAY)
  116882. ctx->state = 9;
  116883. break;
  116884. case 9: /* MONT */
  116885. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  116886. /* Reload r and convert to Montgomery form. */
  116887. sp_384_from_mp(ctx->u2, 12, rm);
  116888. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  116889. if (err == MP_OKAY)
  116890. ctx->state = 10;
  116891. break;
  116892. case 10: /* SQR */
  116893. /* u1 = r.z'.z' mod prime */
  116894. sp_384_mont_sqr_12(ctx->p1.z, ctx->p1.z, p384_mod, p384_mp_mod);
  116895. ctx->state = 11;
  116896. break;
  116897. case 11: /* MUL */
  116898. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod, p384_mp_mod);
  116899. ctx->state = 12;
  116900. break;
  116901. case 12: /* RES */
  116902. {
  116903. sp_int32 c = 0;
  116904. err = MP_OKAY; /* math okay, now check result */
  116905. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  116906. if (*res == 0) {
  116907. sp_digit carry;
  116908. /* Reload r and add order. */
  116909. sp_384_from_mp(ctx->u2, 12, rm);
  116910. carry = sp_384_add_12(ctx->u2, ctx->u2, p384_order);
  116911. /* Carry means result is greater than mod and is not valid. */
  116912. if (carry == 0) {
  116913. sp_384_norm_12(ctx->u2);
  116914. /* Compare with mod and if greater or equal then not valid. */
  116915. c = sp_384_cmp_12(ctx->u2, p384_mod);
  116916. }
  116917. }
  116918. if ((*res == 0) && (c < 0)) {
  116919. /* Convert to Montogomery form */
  116920. err = sp_384_mod_mul_norm_12(ctx->u2, ctx->u2, p384_mod);
  116921. if (err == MP_OKAY) {
  116922. /* u1 = (r + 1*order).z'.z' mod prime */
  116923. sp_384_mont_mul_12(ctx->u1, ctx->u2, ctx->p1.z, p384_mod,
  116924. p384_mp_mod);
  116925. *res = (int)(sp_384_cmp_12(ctx->p1.x, ctx->u1) == 0);
  116926. }
  116927. }
  116928. break;
  116929. }
  116930. } /* switch */
  116931. if (err == MP_OKAY && ctx->state != 12) {
  116932. err = FP_WOULDBLOCK;
  116933. }
  116934. return err;
  116935. }
  116936. #endif /* WOLFSSL_SP_NONBLOCK */
  116937. int sp_ecc_verify_384(const byte* hash, word32 hashLen, const mp_int* pX,
  116938. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  116939. int* res, void* heap)
  116940. {
  116941. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116942. sp_digit* u1 = NULL;
  116943. sp_point_384* p1 = NULL;
  116944. #else
  116945. sp_digit u1[18 * 12];
  116946. sp_point_384 p1[2];
  116947. #endif
  116948. sp_digit* u2 = NULL;
  116949. sp_digit* s = NULL;
  116950. sp_digit* tmp = NULL;
  116951. sp_point_384* p2 = NULL;
  116952. sp_digit carry;
  116953. sp_int32 c = 0;
  116954. int err = MP_OKAY;
  116955. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  116956. if (err == MP_OKAY) {
  116957. p1 = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  116958. DYNAMIC_TYPE_ECC);
  116959. if (p1 == NULL)
  116960. err = MEMORY_E;
  116961. }
  116962. if (err == MP_OKAY) {
  116963. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 12, heap,
  116964. DYNAMIC_TYPE_ECC);
  116965. if (u1 == NULL)
  116966. err = MEMORY_E;
  116967. }
  116968. #endif
  116969. if (err == MP_OKAY) {
  116970. u2 = u1 + 2 * 12;
  116971. s = u1 + 4 * 12;
  116972. tmp = u1 + 6 * 12;
  116973. p2 = p1 + 1;
  116974. if (hashLen > 48U) {
  116975. hashLen = 48U;
  116976. }
  116977. sp_384_from_bin(u1, 12, hash, (int)hashLen);
  116978. sp_384_from_mp(u2, 12, rm);
  116979. sp_384_from_mp(s, 12, sm);
  116980. sp_384_from_mp(p2->x, 12, pX);
  116981. sp_384_from_mp(p2->y, 12, pY);
  116982. sp_384_from_mp(p2->z, 12, pZ);
  116983. err = sp_384_calc_vfy_point_12(p1, p2, s, u1, u2, tmp, heap);
  116984. }
  116985. if (err == MP_OKAY) {
  116986. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  116987. /* Reload r and convert to Montgomery form. */
  116988. sp_384_from_mp(u2, 12, rm);
  116989. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  116990. }
  116991. if (err == MP_OKAY) {
  116992. /* u1 = r.z'.z' mod prime */
  116993. sp_384_mont_sqr_12(p1->z, p1->z, p384_mod, p384_mp_mod);
  116994. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  116995. *res = (int)(sp_384_cmp_12(p1->x, u1) == 0);
  116996. if (*res == 0) {
  116997. /* Reload r and add order. */
  116998. sp_384_from_mp(u2, 12, rm);
  116999. carry = sp_384_add_12(u2, u2, p384_order);
  117000. /* Carry means result is greater than mod and is not valid. */
  117001. if (carry == 0) {
  117002. sp_384_norm_12(u2);
  117003. /* Compare with mod and if greater or equal then not valid. */
  117004. c = sp_384_cmp_12(u2, p384_mod);
  117005. }
  117006. }
  117007. if ((*res == 0) && (c < 0)) {
  117008. /* Convert to Montogomery form */
  117009. err = sp_384_mod_mul_norm_12(u2, u2, p384_mod);
  117010. if (err == MP_OKAY) {
  117011. /* u1 = (r + 1*order).z'.z' mod prime */
  117012. {
  117013. sp_384_mont_mul_12(u1, u2, p1->z, p384_mod, p384_mp_mod);
  117014. }
  117015. *res = (sp_384_cmp_12(p1->x, u1) == 0);
  117016. }
  117017. }
  117018. }
  117019. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117020. if (u1 != NULL)
  117021. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  117022. if (p1 != NULL)
  117023. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  117024. #endif
  117025. return err;
  117026. }
  117027. #endif /* HAVE_ECC_VERIFY */
  117028. #ifdef HAVE_ECC_CHECK_KEY
  117029. /* Check that the x and y oridinates are a valid point on the curve.
  117030. *
  117031. * point EC point.
  117032. * heap Heap to use if dynamically allocating.
  117033. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  117034. * not on the curve and MP_OKAY otherwise.
  117035. */
  117036. static int sp_384_ecc_is_point_12(const sp_point_384* point,
  117037. void* heap)
  117038. {
  117039. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117040. sp_digit* t1 = NULL;
  117041. #else
  117042. sp_digit t1[12 * 4];
  117043. #endif
  117044. sp_digit* t2 = NULL;
  117045. int err = MP_OKAY;
  117046. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117047. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12 * 4, heap, DYNAMIC_TYPE_ECC);
  117048. if (t1 == NULL)
  117049. err = MEMORY_E;
  117050. #endif
  117051. (void)heap;
  117052. if (err == MP_OKAY) {
  117053. t2 = t1 + 2 * 12;
  117054. sp_384_sqr_12(t1, point->y);
  117055. (void)sp_384_mod_12(t1, t1, p384_mod);
  117056. sp_384_sqr_12(t2, point->x);
  117057. (void)sp_384_mod_12(t2, t2, p384_mod);
  117058. sp_384_mul_12(t2, t2, point->x);
  117059. (void)sp_384_mod_12(t2, t2, p384_mod);
  117060. (void)sp_384_sub_12(t2, p384_mod, t2);
  117061. sp_384_mont_add_12(t1, t1, t2, p384_mod);
  117062. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  117063. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  117064. sp_384_mont_add_12(t1, t1, point->x, p384_mod);
  117065. if (sp_384_cmp_12(t1, p384_b) != 0) {
  117066. err = MP_VAL;
  117067. }
  117068. }
  117069. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117070. if (t1 != NULL)
  117071. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  117072. #endif
  117073. return err;
  117074. }
  117075. /* Check that the x and y oridinates are a valid point on the curve.
  117076. *
  117077. * pX X ordinate of EC point.
  117078. * pY Y ordinate of EC point.
  117079. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  117080. * not on the curve and MP_OKAY otherwise.
  117081. */
  117082. int sp_ecc_is_point_384(const mp_int* pX, const mp_int* pY)
  117083. {
  117084. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117085. sp_point_384* pub = NULL;
  117086. #else
  117087. sp_point_384 pub[1];
  117088. #endif
  117089. const byte one[1] = { 1 };
  117090. int err = MP_OKAY;
  117091. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117092. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  117093. DYNAMIC_TYPE_ECC);
  117094. if (pub == NULL)
  117095. err = MEMORY_E;
  117096. #endif
  117097. if (err == MP_OKAY) {
  117098. sp_384_from_mp(pub->x, 12, pX);
  117099. sp_384_from_mp(pub->y, 12, pY);
  117100. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  117101. err = sp_384_ecc_is_point_12(pub, NULL);
  117102. }
  117103. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117104. if (pub != NULL)
  117105. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  117106. #endif
  117107. return err;
  117108. }
  117109. /* Check that the private scalar generates the EC point (px, py), the point is
  117110. * on the curve and the point has the correct order.
  117111. *
  117112. * pX X ordinate of EC point.
  117113. * pY Y ordinate of EC point.
  117114. * privm Private scalar that generates EC point.
  117115. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  117116. * not on the curve, ECC_INF_E if the point does not have the correct order,
  117117. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  117118. * MP_OKAY otherwise.
  117119. */
  117120. int sp_ecc_check_key_384(const mp_int* pX, const mp_int* pY,
  117121. const mp_int* privm, void* heap)
  117122. {
  117123. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117124. sp_digit* priv = NULL;
  117125. sp_point_384* pub = NULL;
  117126. #else
  117127. sp_digit priv[12];
  117128. sp_point_384 pub[2];
  117129. #endif
  117130. sp_point_384* p = NULL;
  117131. const byte one[1] = { 1 };
  117132. int err = MP_OKAY;
  117133. /* Quick check the lengs of public key ordinates and private key are in
  117134. * range. Proper check later.
  117135. */
  117136. if (((mp_count_bits(pX) > 384) ||
  117137. (mp_count_bits(pY) > 384) ||
  117138. ((privm != NULL) && (mp_count_bits(privm) > 384)))) {
  117139. err = ECC_OUT_OF_RANGE_E;
  117140. }
  117141. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117142. if (err == MP_OKAY) {
  117143. pub = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap,
  117144. DYNAMIC_TYPE_ECC);
  117145. if (pub == NULL)
  117146. err = MEMORY_E;
  117147. }
  117148. if (err == MP_OKAY && privm) {
  117149. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 12, heap,
  117150. DYNAMIC_TYPE_ECC);
  117151. if (priv == NULL)
  117152. err = MEMORY_E;
  117153. }
  117154. #endif
  117155. if (err == MP_OKAY) {
  117156. p = pub + 1;
  117157. sp_384_from_mp(pub->x, 12, pX);
  117158. sp_384_from_mp(pub->y, 12, pY);
  117159. sp_384_from_bin(pub->z, 12, one, (int)sizeof(one));
  117160. if (privm)
  117161. sp_384_from_mp(priv, 12, privm);
  117162. /* Check point at infinitiy. */
  117163. if ((sp_384_iszero_12(pub->x) != 0) &&
  117164. (sp_384_iszero_12(pub->y) != 0)) {
  117165. err = ECC_INF_E;
  117166. }
  117167. }
  117168. /* Check range of X and Y */
  117169. if ((err == MP_OKAY) &&
  117170. ((sp_384_cmp_12(pub->x, p384_mod) >= 0) ||
  117171. (sp_384_cmp_12(pub->y, p384_mod) >= 0))) {
  117172. err = ECC_OUT_OF_RANGE_E;
  117173. }
  117174. if (err == MP_OKAY) {
  117175. /* Check point is on curve */
  117176. err = sp_384_ecc_is_point_12(pub, heap);
  117177. }
  117178. if (err == MP_OKAY) {
  117179. /* Point * order = infinity */
  117180. err = sp_384_ecc_mulmod_12(p, pub, p384_order, 1, 1, heap);
  117181. }
  117182. /* Check result is infinity */
  117183. if ((err == MP_OKAY) && ((sp_384_iszero_12(p->x) == 0) ||
  117184. (sp_384_iszero_12(p->y) == 0))) {
  117185. err = ECC_INF_E;
  117186. }
  117187. if (privm) {
  117188. if (err == MP_OKAY) {
  117189. /* Base * private = point */
  117190. err = sp_384_ecc_mulmod_base_12(p, priv, 1, 1, heap);
  117191. }
  117192. /* Check result is public key */
  117193. if ((err == MP_OKAY) &&
  117194. ((sp_384_cmp_12(p->x, pub->x) != 0) ||
  117195. (sp_384_cmp_12(p->y, pub->y) != 0))) {
  117196. err = ECC_PRIV_KEY_E;
  117197. }
  117198. }
  117199. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117200. if (pub != NULL)
  117201. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  117202. if (priv != NULL)
  117203. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  117204. #endif
  117205. return err;
  117206. }
  117207. #endif
  117208. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  117209. /* Add two projective EC points together.
  117210. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  117211. *
  117212. * pX First EC point's X ordinate.
  117213. * pY First EC point's Y ordinate.
  117214. * pZ First EC point's Z ordinate.
  117215. * qX Second EC point's X ordinate.
  117216. * qY Second EC point's Y ordinate.
  117217. * qZ Second EC point's Z ordinate.
  117218. * rX Resultant EC point's X ordinate.
  117219. * rY Resultant EC point's Y ordinate.
  117220. * rZ Resultant EC point's Z ordinate.
  117221. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117222. */
  117223. int sp_ecc_proj_add_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  117224. mp_int* qX, mp_int* qY, mp_int* qZ,
  117225. mp_int* rX, mp_int* rY, mp_int* rZ)
  117226. {
  117227. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117228. sp_digit* tmp = NULL;
  117229. sp_point_384* p = NULL;
  117230. #else
  117231. sp_digit tmp[2 * 12 * 6];
  117232. sp_point_384 p[2];
  117233. #endif
  117234. sp_point_384* q = NULL;
  117235. int err = MP_OKAY;
  117236. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117237. if (err == MP_OKAY) {
  117238. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, NULL,
  117239. DYNAMIC_TYPE_ECC);
  117240. if (p == NULL)
  117241. err = MEMORY_E;
  117242. }
  117243. if (err == MP_OKAY) {
  117244. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  117245. DYNAMIC_TYPE_ECC);
  117246. if (tmp == NULL) {
  117247. err = MEMORY_E;
  117248. }
  117249. }
  117250. #endif
  117251. if (err == MP_OKAY) {
  117252. q = p + 1;
  117253. sp_384_from_mp(p->x, 12, pX);
  117254. sp_384_from_mp(p->y, 12, pY);
  117255. sp_384_from_mp(p->z, 12, pZ);
  117256. sp_384_from_mp(q->x, 12, qX);
  117257. sp_384_from_mp(q->y, 12, qY);
  117258. sp_384_from_mp(q->z, 12, qZ);
  117259. p->infinity = sp_384_iszero_12(p->x) &
  117260. sp_384_iszero_12(p->y);
  117261. q->infinity = sp_384_iszero_12(q->x) &
  117262. sp_384_iszero_12(q->y);
  117263. sp_384_proj_point_add_12(p, p, q, tmp);
  117264. }
  117265. if (err == MP_OKAY) {
  117266. err = sp_384_to_mp(p->x, rX);
  117267. }
  117268. if (err == MP_OKAY) {
  117269. err = sp_384_to_mp(p->y, rY);
  117270. }
  117271. if (err == MP_OKAY) {
  117272. err = sp_384_to_mp(p->z, rZ);
  117273. }
  117274. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117275. if (tmp != NULL)
  117276. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  117277. if (p != NULL)
  117278. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  117279. #endif
  117280. return err;
  117281. }
  117282. /* Double a projective EC point.
  117283. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  117284. *
  117285. * pX EC point's X ordinate.
  117286. * pY EC point's Y ordinate.
  117287. * pZ EC point's Z ordinate.
  117288. * rX Resultant EC point's X ordinate.
  117289. * rY Resultant EC point's Y ordinate.
  117290. * rZ Resultant EC point's Z ordinate.
  117291. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117292. */
  117293. int sp_ecc_proj_dbl_point_384(mp_int* pX, mp_int* pY, mp_int* pZ,
  117294. mp_int* rX, mp_int* rY, mp_int* rZ)
  117295. {
  117296. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117297. sp_digit* tmp = NULL;
  117298. sp_point_384* p = NULL;
  117299. #else
  117300. sp_digit tmp[2 * 12 * 2];
  117301. sp_point_384 p[1];
  117302. #endif
  117303. int err = MP_OKAY;
  117304. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117305. if (err == MP_OKAY) {
  117306. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  117307. DYNAMIC_TYPE_ECC);
  117308. if (p == NULL)
  117309. err = MEMORY_E;
  117310. }
  117311. if (err == MP_OKAY) {
  117312. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 2, NULL,
  117313. DYNAMIC_TYPE_ECC);
  117314. if (tmp == NULL)
  117315. err = MEMORY_E;
  117316. }
  117317. #endif
  117318. if (err == MP_OKAY) {
  117319. sp_384_from_mp(p->x, 12, pX);
  117320. sp_384_from_mp(p->y, 12, pY);
  117321. sp_384_from_mp(p->z, 12, pZ);
  117322. p->infinity = sp_384_iszero_12(p->x) &
  117323. sp_384_iszero_12(p->y);
  117324. sp_384_proj_point_dbl_12(p, p, tmp);
  117325. }
  117326. if (err == MP_OKAY) {
  117327. err = sp_384_to_mp(p->x, rX);
  117328. }
  117329. if (err == MP_OKAY) {
  117330. err = sp_384_to_mp(p->y, rY);
  117331. }
  117332. if (err == MP_OKAY) {
  117333. err = sp_384_to_mp(p->z, rZ);
  117334. }
  117335. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117336. if (tmp != NULL)
  117337. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  117338. if (p != NULL)
  117339. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  117340. #endif
  117341. return err;
  117342. }
  117343. /* Map a projective EC point to affine in place.
  117344. * pZ will be one.
  117345. *
  117346. * pX EC point's X ordinate.
  117347. * pY EC point's Y ordinate.
  117348. * pZ EC point's Z ordinate.
  117349. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117350. */
  117351. int sp_ecc_map_384(mp_int* pX, mp_int* pY, mp_int* pZ)
  117352. {
  117353. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117354. sp_digit* tmp = NULL;
  117355. sp_point_384* p = NULL;
  117356. #else
  117357. sp_digit tmp[2 * 12 * 6];
  117358. sp_point_384 p[1];
  117359. #endif
  117360. int err = MP_OKAY;
  117361. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117362. if (err == MP_OKAY) {
  117363. p = (sp_point_384*)XMALLOC(sizeof(sp_point_384), NULL,
  117364. DYNAMIC_TYPE_ECC);
  117365. if (p == NULL)
  117366. err = MEMORY_E;
  117367. }
  117368. if (err == MP_OKAY) {
  117369. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 12 * 6, NULL,
  117370. DYNAMIC_TYPE_ECC);
  117371. if (tmp == NULL)
  117372. err = MEMORY_E;
  117373. }
  117374. #endif
  117375. if (err == MP_OKAY) {
  117376. sp_384_from_mp(p->x, 12, pX);
  117377. sp_384_from_mp(p->y, 12, pY);
  117378. sp_384_from_mp(p->z, 12, pZ);
  117379. p->infinity = sp_384_iszero_12(p->x) &
  117380. sp_384_iszero_12(p->y);
  117381. sp_384_map_12(p, p, tmp);
  117382. }
  117383. if (err == MP_OKAY) {
  117384. err = sp_384_to_mp(p->x, pX);
  117385. }
  117386. if (err == MP_OKAY) {
  117387. err = sp_384_to_mp(p->y, pY);
  117388. }
  117389. if (err == MP_OKAY) {
  117390. err = sp_384_to_mp(p->z, pZ);
  117391. }
  117392. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117393. if (tmp != NULL)
  117394. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  117395. if (p != NULL)
  117396. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  117397. #endif
  117398. return err;
  117399. }
  117400. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  117401. #ifdef HAVE_COMP_KEY
  117402. /* Find the square root of a number mod the prime of the curve.
  117403. *
  117404. * y The number to operate on and the result.
  117405. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117406. */
  117407. static int sp_384_mont_sqrt_12(sp_digit* y)
  117408. {
  117409. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117410. sp_digit* t1 = NULL;
  117411. #else
  117412. sp_digit t1[5 * 2 * 12];
  117413. #endif
  117414. sp_digit* t2 = NULL;
  117415. sp_digit* t3 = NULL;
  117416. sp_digit* t4 = NULL;
  117417. sp_digit* t5 = NULL;
  117418. int err = MP_OKAY;
  117419. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117420. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 5 * 2 * 12, NULL, DYNAMIC_TYPE_ECC);
  117421. if (t1 == NULL)
  117422. err = MEMORY_E;
  117423. #endif
  117424. if (err == MP_OKAY) {
  117425. t2 = t1 + 2 * 12;
  117426. t3 = t1 + 4 * 12;
  117427. t4 = t1 + 6 * 12;
  117428. t5 = t1 + 8 * 12;
  117429. {
  117430. /* t2 = y ^ 0x2 */
  117431. sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod);
  117432. /* t1 = y ^ 0x3 */
  117433. sp_384_mont_mul_12(t1, t2, y, p384_mod, p384_mp_mod);
  117434. /* t5 = y ^ 0xc */
  117435. sp_384_mont_sqr_n_12(t5, t1, 2, p384_mod, p384_mp_mod);
  117436. /* t1 = y ^ 0xf */
  117437. sp_384_mont_mul_12(t1, t1, t5, p384_mod, p384_mp_mod);
  117438. /* t2 = y ^ 0x1e */
  117439. sp_384_mont_sqr_12(t2, t1, p384_mod, p384_mp_mod);
  117440. /* t3 = y ^ 0x1f */
  117441. sp_384_mont_mul_12(t3, t2, y, p384_mod, p384_mp_mod);
  117442. /* t2 = y ^ 0x3e0 */
  117443. sp_384_mont_sqr_n_12(t2, t3, 5, p384_mod, p384_mp_mod);
  117444. /* t1 = y ^ 0x3ff */
  117445. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  117446. /* t2 = y ^ 0x7fe0 */
  117447. sp_384_mont_sqr_n_12(t2, t1, 5, p384_mod, p384_mp_mod);
  117448. /* t3 = y ^ 0x7fff */
  117449. sp_384_mont_mul_12(t3, t3, t2, p384_mod, p384_mp_mod);
  117450. /* t2 = y ^ 0x3fff800 */
  117451. sp_384_mont_sqr_n_12(t2, t3, 15, p384_mod, p384_mp_mod);
  117452. /* t4 = y ^ 0x3ffffff */
  117453. sp_384_mont_mul_12(t4, t3, t2, p384_mod, p384_mp_mod);
  117454. /* t2 = y ^ 0xffffffc000000 */
  117455. sp_384_mont_sqr_n_12(t2, t4, 30, p384_mod, p384_mp_mod);
  117456. /* t1 = y ^ 0xfffffffffffff */
  117457. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  117458. /* t2 = y ^ 0xfffffffffffffff000000000000000 */
  117459. sp_384_mont_sqr_n_12(t2, t1, 60, p384_mod, p384_mp_mod);
  117460. /* t1 = y ^ 0xffffffffffffffffffffffffffffff */
  117461. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  117462. /* t2 = y ^ 0xffffffffffffffffffffffffffffff000000000000000000000000000000 */
  117463. sp_384_mont_sqr_n_12(t2, t1, 120, p384_mod, p384_mp_mod);
  117464. /* t1 = y ^ 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  117465. sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod);
  117466. /* t2 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000 */
  117467. sp_384_mont_sqr_n_12(t2, t1, 15, p384_mod, p384_mp_mod);
  117468. /* t1 = y ^ 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  117469. sp_384_mont_mul_12(t1, t3, t2, p384_mod, p384_mp_mod);
  117470. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000 */
  117471. sp_384_mont_sqr_n_12(t2, t1, 31, p384_mod, p384_mp_mod);
  117472. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff */
  117473. sp_384_mont_mul_12(t1, t4, t2, p384_mod, p384_mp_mod);
  117474. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffff0 */
  117475. sp_384_mont_sqr_n_12(t2, t1, 4, p384_mod, p384_mp_mod);
  117476. /* t1 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc */
  117477. sp_384_mont_mul_12(t1, t5, t2, p384_mod, p384_mp_mod);
  117478. /* t2 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000 */
  117479. sp_384_mont_sqr_n_12(t2, t1, 62, p384_mod, p384_mp_mod);
  117480. /* t1 = y ^ 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001 */
  117481. sp_384_mont_mul_12(t1, y, t2, p384_mod, p384_mp_mod);
  117482. /* t2 = y ^ 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc00000000000000040000000 */
  117483. sp_384_mont_sqr_n_12(y, t1, 30, p384_mod, p384_mp_mod);
  117484. }
  117485. }
  117486. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117487. if (t1 != NULL)
  117488. XFREE(t1, NULL, DYNAMIC_TYPE_ECC);
  117489. #endif
  117490. return err;
  117491. }
  117492. /* Uncompress the point given the X ordinate.
  117493. *
  117494. * xm X ordinate.
  117495. * odd Whether the Y ordinate is odd.
  117496. * ym Calculated Y ordinate.
  117497. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  117498. */
  117499. int sp_ecc_uncompress_384(mp_int* xm, int odd, mp_int* ym)
  117500. {
  117501. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117502. sp_digit* x = NULL;
  117503. #else
  117504. sp_digit x[4 * 12];
  117505. #endif
  117506. sp_digit* y = NULL;
  117507. int err = MP_OKAY;
  117508. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117509. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 12, NULL, DYNAMIC_TYPE_ECC);
  117510. if (x == NULL)
  117511. err = MEMORY_E;
  117512. #endif
  117513. if (err == MP_OKAY) {
  117514. y = x + 2 * 12;
  117515. sp_384_from_mp(x, 12, xm);
  117516. err = sp_384_mod_mul_norm_12(x, x, p384_mod);
  117517. }
  117518. if (err == MP_OKAY) {
  117519. /* y = x^3 */
  117520. {
  117521. sp_384_mont_sqr_12(y, x, p384_mod, p384_mp_mod);
  117522. sp_384_mont_mul_12(y, y, x, p384_mod, p384_mp_mod);
  117523. }
  117524. /* y = x^3 - 3x */
  117525. sp_384_mont_sub_12(y, y, x, p384_mod);
  117526. sp_384_mont_sub_12(y, y, x, p384_mod);
  117527. sp_384_mont_sub_12(y, y, x, p384_mod);
  117528. /* y = x^3 - 3x + b */
  117529. err = sp_384_mod_mul_norm_12(x, p384_b, p384_mod);
  117530. }
  117531. if (err == MP_OKAY) {
  117532. sp_384_mont_add_12(y, y, x, p384_mod);
  117533. /* y = sqrt(x^3 - 3x + b) */
  117534. err = sp_384_mont_sqrt_12(y);
  117535. }
  117536. if (err == MP_OKAY) {
  117537. XMEMSET(y + 12, 0, 12U * sizeof(sp_digit));
  117538. sp_384_mont_reduce_12(y, p384_mod, p384_mp_mod);
  117539. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  117540. sp_384_mont_sub_12(y, p384_mod, y, p384_mod);
  117541. }
  117542. err = sp_384_to_mp(y, ym);
  117543. }
  117544. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  117545. if (x != NULL)
  117546. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  117547. #endif
  117548. return err;
  117549. }
  117550. #endif
  117551. #endif /* WOLFSSL_SP_384 */
  117552. #ifdef WOLFSSL_SP_521
  117553. /* Point structure to use. */
  117554. typedef struct sp_point_521 {
  117555. /* X ordinate of point. */
  117556. sp_digit x[2 * 17];
  117557. /* Y ordinate of point. */
  117558. sp_digit y[2 * 17];
  117559. /* Z ordinate of point. */
  117560. sp_digit z[2 * 17];
  117561. /* Indicates point is at infinity. */
  117562. int infinity;
  117563. } sp_point_521;
  117564. /* The modulus (prime) of the curve P521. */
  117565. static const sp_digit p521_mod[17] = {
  117566. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  117567. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
  117568. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  117569. };
  117570. /* The Montgomery normalizer for modulus of the curve P521. */
  117571. static const sp_digit p521_norm_mod[17] = {
  117572. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117573. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117574. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  117575. };
  117576. /* The Montgomery multiplier for modulus of the curve P521. */
  117577. static sp_digit p521_mp_mod = 0x00000001;
  117578. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  117579. defined(HAVE_ECC_VERIFY)
  117580. /* The order of the curve P521. */
  117581. static const sp_digit p521_order[17] = {
  117582. 0x91386409,0xbb6fb71e,0x899c47ae,0x3bb5c9b8,0xf709a5d0,0x7fcc0148,
  117583. 0xbf2f966b,0x51868783,0xfffffffa,0xffffffff,0xffffffff,0xffffffff,
  117584. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  117585. };
  117586. #endif
  117587. /* The order of the curve P521 minus 2. */
  117588. static const sp_digit p521_order2[17] = {
  117589. 0x91386407,0xbb6fb71e,0x899c47ae,0x3bb5c9b8,0xf709a5d0,0x7fcc0148,
  117590. 0xbf2f966b,0x51868783,0xfffffffa,0xffffffff,0xffffffff,0xffffffff,
  117591. 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x000001ff
  117592. };
  117593. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  117594. /* The Montgomery normalizer for order of the curve P521. */
  117595. static const sp_digit p521_norm_order[17] = {
  117596. 0x6ec79bf7,0x449048e1,0x7663b851,0xc44a3647,0x08f65a2f,0x8033feb7,
  117597. 0x40d06994,0xae79787c,0x00000005,0x00000000,0x00000000,0x00000000,
  117598. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
  117599. };
  117600. #endif
  117601. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  117602. /* The Montgomery multiplier for order of the curve P521. */
  117603. static sp_digit p521_mp_order = 0x79a995c7;
  117604. #endif
  117605. /* The base point of curve P521. */
  117606. static const sp_point_521 p521_base = {
  117607. /* X ordinate */
  117608. {
  117609. 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  117610. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  117611. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6,
  117612. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117613. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117614. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117615. (sp_digit)0, (sp_digit)0
  117616. },
  117617. /* Y ordinate */
  117618. {
  117619. 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  117620. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  117621. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118,
  117622. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117623. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117624. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117625. (sp_digit)0, (sp_digit)0
  117626. },
  117627. /* Z ordinate */
  117628. {
  117629. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117630. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117631. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  117632. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117633. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117634. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  117635. (sp_digit)0, (sp_digit)0
  117636. },
  117637. /* infinity */
  117638. 0
  117639. };
  117640. #if defined(HAVE_ECC_CHECK_KEY) || defined(HAVE_COMP_KEY)
  117641. static const sp_digit p521_b[17] = {
  117642. 0x6b503f00,0xef451fd4,0x3d2c34f1,0x3573df88,0x3bb1bf07,0x1652c0bd,
  117643. 0xec7e937b,0x56193951,0x8ef109e1,0xb8b48991,0x99b315f3,0xa2da725b,
  117644. 0xb68540ee,0x929a21a0,0x8e1c9a1f,0x953eb961,0x00000051
  117645. };
  117646. #endif
  117647. /* Multiply a and b into r. (r = a * b)
  117648. *
  117649. * r A single precision integer.
  117650. * a A single precision integer.
  117651. * b A single precision integer.
  117652. */
  117653. SP_NOINLINE static void sp_521_mul_17(sp_digit* r, const sp_digit* a,
  117654. const sp_digit* b)
  117655. {
  117656. sp_digit t[17 * 2];
  117657. sp_digit* tmp = t;
  117658. __asm__ __volatile__ (
  117659. "movs r3, #0\n\t"
  117660. "movs r4, #0\n\t"
  117661. "mov r8, r3\n\t"
  117662. "mov r11, %[tmp]\n\t"
  117663. "mov r9, %[a]\n\t"
  117664. "mov r10, %[b]\n\t"
  117665. "movs r6, #0x44\n\t"
  117666. "add r6, r6, r9\n\t"
  117667. "mov r12, r6\n\t"
  117668. "\n"
  117669. "L_sp_521_mul_17_words_%=:\n\t"
  117670. "movs %[tmp], #0\n\t"
  117671. "movs r5, #0\n\t"
  117672. "movs r6, #0x40\n\t"
  117673. "mov %[a], r8\n\t"
  117674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117675. "subs %[a], %[a], r6\n\t"
  117676. #else
  117677. "sub %[a], %[a], r6\n\t"
  117678. #endif
  117679. #ifdef WOLFSSL_KEIL
  117680. "sbcs r6, r6, r6\n\t"
  117681. #elif defined(__clang__)
  117682. "sbcs r6, r6\n\t"
  117683. #else
  117684. "sbc r6, r6\n\t"
  117685. #endif
  117686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117687. "mvns r6, r6\n\t"
  117688. #else
  117689. "mvn r6, r6\n\t"
  117690. #endif
  117691. #ifdef WOLFSSL_KEIL
  117692. "ands %[a], %[a], r6\n\t"
  117693. #elif defined(__clang__)
  117694. "ands %[a], r6\n\t"
  117695. #else
  117696. "and %[a], r6\n\t"
  117697. #endif
  117698. "mov %[b], r8\n\t"
  117699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117700. "subs %[b], %[b], %[a]\n\t"
  117701. #else
  117702. "sub %[b], %[b], %[a]\n\t"
  117703. #endif
  117704. "add %[a], %[a], r9\n\t"
  117705. "add %[b], %[b], r10\n\t"
  117706. "\n"
  117707. "L_sp_521_mul_17_mul_%=:\n\t"
  117708. "# Multiply Start\n\t"
  117709. "ldrh r6, [%[a]]\n\t"
  117710. "ldrh r7, [%[b]]\n\t"
  117711. #ifdef WOLFSSL_KEIL
  117712. "muls r7, r6, r7\n\t"
  117713. #elif defined(__clang__)
  117714. "muls r7, r6\n\t"
  117715. #else
  117716. "mul r7, r6\n\t"
  117717. #endif
  117718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117719. "adds r3, r3, r7\n\t"
  117720. #else
  117721. "add r3, r3, r7\n\t"
  117722. #endif
  117723. #ifdef WOLFSSL_KEIL
  117724. "adcs r4, r4, %[tmp]\n\t"
  117725. #elif defined(__clang__)
  117726. "adcs r4, %[tmp]\n\t"
  117727. #else
  117728. "adc r4, %[tmp]\n\t"
  117729. #endif
  117730. #ifdef WOLFSSL_KEIL
  117731. "adcs r5, r5, %[tmp]\n\t"
  117732. #elif defined(__clang__)
  117733. "adcs r5, %[tmp]\n\t"
  117734. #else
  117735. "adc r5, %[tmp]\n\t"
  117736. #endif
  117737. "ldr r7, [%[b]]\n\t"
  117738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117739. "lsrs r7, r7, #16\n\t"
  117740. #else
  117741. "lsr r7, r7, #16\n\t"
  117742. #endif
  117743. #ifdef WOLFSSL_KEIL
  117744. "muls r6, r7, r6\n\t"
  117745. #elif defined(__clang__)
  117746. "muls r6, r7\n\t"
  117747. #else
  117748. "mul r6, r7\n\t"
  117749. #endif
  117750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117751. "lsrs r7, r6, #16\n\t"
  117752. #else
  117753. "lsr r7, r6, #16\n\t"
  117754. #endif
  117755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117756. "lsls r6, r6, #16\n\t"
  117757. #else
  117758. "lsl r6, r6, #16\n\t"
  117759. #endif
  117760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117761. "adds r3, r3, r6\n\t"
  117762. #else
  117763. "add r3, r3, r6\n\t"
  117764. #endif
  117765. #ifdef WOLFSSL_KEIL
  117766. "adcs r4, r4, r7\n\t"
  117767. #elif defined(__clang__)
  117768. "adcs r4, r7\n\t"
  117769. #else
  117770. "adc r4, r7\n\t"
  117771. #endif
  117772. #ifdef WOLFSSL_KEIL
  117773. "adcs r5, r5, %[tmp]\n\t"
  117774. #elif defined(__clang__)
  117775. "adcs r5, %[tmp]\n\t"
  117776. #else
  117777. "adc r5, %[tmp]\n\t"
  117778. #endif
  117779. "ldr r6, [%[a]]\n\t"
  117780. "ldr r7, [%[b]]\n\t"
  117781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117782. "lsrs r6, r6, #16\n\t"
  117783. #else
  117784. "lsr r6, r6, #16\n\t"
  117785. #endif
  117786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117787. "lsrs r7, r7, #16\n\t"
  117788. #else
  117789. "lsr r7, r7, #16\n\t"
  117790. #endif
  117791. #ifdef WOLFSSL_KEIL
  117792. "muls r7, r6, r7\n\t"
  117793. #elif defined(__clang__)
  117794. "muls r7, r6\n\t"
  117795. #else
  117796. "mul r7, r6\n\t"
  117797. #endif
  117798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117799. "adds r4, r4, r7\n\t"
  117800. #else
  117801. "add r4, r4, r7\n\t"
  117802. #endif
  117803. #ifdef WOLFSSL_KEIL
  117804. "adcs r5, r5, %[tmp]\n\t"
  117805. #elif defined(__clang__)
  117806. "adcs r5, %[tmp]\n\t"
  117807. #else
  117808. "adc r5, %[tmp]\n\t"
  117809. #endif
  117810. "ldrh r7, [%[b]]\n\t"
  117811. #ifdef WOLFSSL_KEIL
  117812. "muls r6, r7, r6\n\t"
  117813. #elif defined(__clang__)
  117814. "muls r6, r7\n\t"
  117815. #else
  117816. "mul r6, r7\n\t"
  117817. #endif
  117818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117819. "lsrs r7, r6, #16\n\t"
  117820. #else
  117821. "lsr r7, r6, #16\n\t"
  117822. #endif
  117823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117824. "lsls r6, r6, #16\n\t"
  117825. #else
  117826. "lsl r6, r6, #16\n\t"
  117827. #endif
  117828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117829. "adds r3, r3, r6\n\t"
  117830. #else
  117831. "add r3, r3, r6\n\t"
  117832. #endif
  117833. #ifdef WOLFSSL_KEIL
  117834. "adcs r4, r4, r7\n\t"
  117835. #elif defined(__clang__)
  117836. "adcs r4, r7\n\t"
  117837. #else
  117838. "adc r4, r7\n\t"
  117839. #endif
  117840. #ifdef WOLFSSL_KEIL
  117841. "adcs r5, r5, %[tmp]\n\t"
  117842. #elif defined(__clang__)
  117843. "adcs r5, %[tmp]\n\t"
  117844. #else
  117845. "adc r5, %[tmp]\n\t"
  117846. #endif
  117847. "# Multiply Done\n\t"
  117848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117849. "adds %[a], %[a], #4\n\t"
  117850. #else
  117851. "add %[a], %[a], #4\n\t"
  117852. #endif
  117853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117854. "subs %[b], %[b], #4\n\t"
  117855. #else
  117856. "sub %[b], %[b], #4\n\t"
  117857. #endif
  117858. "cmp %[a], r12\n\t"
  117859. "beq L_sp_521_mul_17_done_mul_%=\n\t"
  117860. "mov r6, r8\n\t"
  117861. "add r6, r6, r9\n\t"
  117862. "cmp %[a], r6\n\t"
  117863. "ble L_sp_521_mul_17_mul_%=\n\t"
  117864. "\n"
  117865. "L_sp_521_mul_17_done_mul_%=:\n\t"
  117866. "mov %[tmp], r11\n\t"
  117867. "mov r7, r8\n\t"
  117868. "str r3, [%[tmp], r7]\n\t"
  117869. "movs r3, r4\n\t"
  117870. "movs r4, r5\n\t"
  117871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117872. "adds r7, r7, #4\n\t"
  117873. #else
  117874. "add r7, r7, #4\n\t"
  117875. #endif
  117876. "mov r8, r7\n\t"
  117877. "movs r6, #0x80\n\t"
  117878. "cmp r7, r6\n\t"
  117879. "ble L_sp_521_mul_17_words_%=\n\t"
  117880. "str r3, [%[tmp], r7]\n\t"
  117881. "mov %[a], r9\n\t"
  117882. "mov %[b], r10\n\t"
  117883. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  117884. :
  117885. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  117886. );
  117887. XMEMCPY(r, t, sizeof(t));
  117888. }
  117889. /* Square a and put result in r. (r = a * a)
  117890. *
  117891. * r A single precision integer.
  117892. * a A single precision integer.
  117893. */
  117894. SP_NOINLINE static void sp_521_sqr_17(sp_digit* r, const sp_digit* a)
  117895. {
  117896. __asm__ __volatile__ (
  117897. "movs r3, #0\n\t"
  117898. "movs r4, #0\n\t"
  117899. "movs r5, #0\n\t"
  117900. "mov r8, r3\n\t"
  117901. "mov r11, %[r]\n\t"
  117902. "movs r6, #0x88\n\t"
  117903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117904. "negs r6, r6\n\t"
  117905. #else
  117906. "neg r6, r6\n\t"
  117907. #endif
  117908. "add sp, sp, r6\n\t"
  117909. "mov r10, sp\n\t"
  117910. "mov r9, %[a]\n\t"
  117911. "\n"
  117912. "L_sp_521_sqr_17_words_%=:\n\t"
  117913. "movs %[r], #0\n\t"
  117914. "movs r6, #0x40\n\t"
  117915. "mov %[a], r8\n\t"
  117916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117917. "subs %[a], %[a], r6\n\t"
  117918. #else
  117919. "sub %[a], %[a], r6\n\t"
  117920. #endif
  117921. #ifdef WOLFSSL_KEIL
  117922. "sbcs r6, r6, r6\n\t"
  117923. #elif defined(__clang__)
  117924. "sbcs r6, r6\n\t"
  117925. #else
  117926. "sbc r6, r6\n\t"
  117927. #endif
  117928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117929. "mvns r6, r6\n\t"
  117930. #else
  117931. "mvn r6, r6\n\t"
  117932. #endif
  117933. #ifdef WOLFSSL_KEIL
  117934. "ands %[a], %[a], r6\n\t"
  117935. #elif defined(__clang__)
  117936. "ands %[a], r6\n\t"
  117937. #else
  117938. "and %[a], r6\n\t"
  117939. #endif
  117940. "mov r2, r8\n\t"
  117941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117942. "subs r2, r2, %[a]\n\t"
  117943. #else
  117944. "sub r2, r2, %[a]\n\t"
  117945. #endif
  117946. "add %[a], %[a], r9\n\t"
  117947. "add r2, r2, r9\n\t"
  117948. "\n"
  117949. "L_sp_521_sqr_17_mul_%=:\n\t"
  117950. "cmp r2, %[a]\n\t"
  117951. "beq L_sp_521_sqr_17_sqr_%=\n\t"
  117952. "# Multiply * 2: Start\n\t"
  117953. "ldrh r6, [%[a]]\n\t"
  117954. "ldrh r7, [r2]\n\t"
  117955. #ifdef WOLFSSL_KEIL
  117956. "muls r7, r6, r7\n\t"
  117957. #elif defined(__clang__)
  117958. "muls r7, r6\n\t"
  117959. #else
  117960. "mul r7, r6\n\t"
  117961. #endif
  117962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117963. "adds r3, r3, r7\n\t"
  117964. #else
  117965. "add r3, r3, r7\n\t"
  117966. #endif
  117967. #ifdef WOLFSSL_KEIL
  117968. "adcs r4, r4, %[r]\n\t"
  117969. #elif defined(__clang__)
  117970. "adcs r4, %[r]\n\t"
  117971. #else
  117972. "adc r4, %[r]\n\t"
  117973. #endif
  117974. #ifdef WOLFSSL_KEIL
  117975. "adcs r5, r5, %[r]\n\t"
  117976. #elif defined(__clang__)
  117977. "adcs r5, %[r]\n\t"
  117978. #else
  117979. "adc r5, %[r]\n\t"
  117980. #endif
  117981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  117982. "adds r3, r3, r7\n\t"
  117983. #else
  117984. "add r3, r3, r7\n\t"
  117985. #endif
  117986. #ifdef WOLFSSL_KEIL
  117987. "adcs r4, r4, %[r]\n\t"
  117988. #elif defined(__clang__)
  117989. "adcs r4, %[r]\n\t"
  117990. #else
  117991. "adc r4, %[r]\n\t"
  117992. #endif
  117993. #ifdef WOLFSSL_KEIL
  117994. "adcs r5, r5, %[r]\n\t"
  117995. #elif defined(__clang__)
  117996. "adcs r5, %[r]\n\t"
  117997. #else
  117998. "adc r5, %[r]\n\t"
  117999. #endif
  118000. "ldr r7, [r2]\n\t"
  118001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118002. "lsrs r7, r7, #16\n\t"
  118003. #else
  118004. "lsr r7, r7, #16\n\t"
  118005. #endif
  118006. #ifdef WOLFSSL_KEIL
  118007. "muls r6, r7, r6\n\t"
  118008. #elif defined(__clang__)
  118009. "muls r6, r7\n\t"
  118010. #else
  118011. "mul r6, r7\n\t"
  118012. #endif
  118013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118014. "lsrs r7, r6, #16\n\t"
  118015. #else
  118016. "lsr r7, r6, #16\n\t"
  118017. #endif
  118018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118019. "lsls r6, r6, #16\n\t"
  118020. #else
  118021. "lsl r6, r6, #16\n\t"
  118022. #endif
  118023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118024. "adds r3, r3, r6\n\t"
  118025. #else
  118026. "add r3, r3, r6\n\t"
  118027. #endif
  118028. #ifdef WOLFSSL_KEIL
  118029. "adcs r4, r4, r7\n\t"
  118030. #elif defined(__clang__)
  118031. "adcs r4, r7\n\t"
  118032. #else
  118033. "adc r4, r7\n\t"
  118034. #endif
  118035. #ifdef WOLFSSL_KEIL
  118036. "adcs r5, r5, %[r]\n\t"
  118037. #elif defined(__clang__)
  118038. "adcs r5, %[r]\n\t"
  118039. #else
  118040. "adc r5, %[r]\n\t"
  118041. #endif
  118042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118043. "adds r3, r3, r6\n\t"
  118044. #else
  118045. "add r3, r3, r6\n\t"
  118046. #endif
  118047. #ifdef WOLFSSL_KEIL
  118048. "adcs r4, r4, r7\n\t"
  118049. #elif defined(__clang__)
  118050. "adcs r4, r7\n\t"
  118051. #else
  118052. "adc r4, r7\n\t"
  118053. #endif
  118054. #ifdef WOLFSSL_KEIL
  118055. "adcs r5, r5, %[r]\n\t"
  118056. #elif defined(__clang__)
  118057. "adcs r5, %[r]\n\t"
  118058. #else
  118059. "adc r5, %[r]\n\t"
  118060. #endif
  118061. "ldr r6, [%[a]]\n\t"
  118062. "ldr r7, [r2]\n\t"
  118063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118064. "lsrs r6, r6, #16\n\t"
  118065. #else
  118066. "lsr r6, r6, #16\n\t"
  118067. #endif
  118068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118069. "lsrs r7, r7, #16\n\t"
  118070. #else
  118071. "lsr r7, r7, #16\n\t"
  118072. #endif
  118073. #ifdef WOLFSSL_KEIL
  118074. "muls r7, r6, r7\n\t"
  118075. #elif defined(__clang__)
  118076. "muls r7, r6\n\t"
  118077. #else
  118078. "mul r7, r6\n\t"
  118079. #endif
  118080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118081. "adds r4, r4, r7\n\t"
  118082. #else
  118083. "add r4, r4, r7\n\t"
  118084. #endif
  118085. #ifdef WOLFSSL_KEIL
  118086. "adcs r5, r5, %[r]\n\t"
  118087. #elif defined(__clang__)
  118088. "adcs r5, %[r]\n\t"
  118089. #else
  118090. "adc r5, %[r]\n\t"
  118091. #endif
  118092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118093. "adds r4, r4, r7\n\t"
  118094. #else
  118095. "add r4, r4, r7\n\t"
  118096. #endif
  118097. #ifdef WOLFSSL_KEIL
  118098. "adcs r5, r5, %[r]\n\t"
  118099. #elif defined(__clang__)
  118100. "adcs r5, %[r]\n\t"
  118101. #else
  118102. "adc r5, %[r]\n\t"
  118103. #endif
  118104. "ldrh r7, [r2]\n\t"
  118105. #ifdef WOLFSSL_KEIL
  118106. "muls r6, r7, r6\n\t"
  118107. #elif defined(__clang__)
  118108. "muls r6, r7\n\t"
  118109. #else
  118110. "mul r6, r7\n\t"
  118111. #endif
  118112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118113. "lsrs r7, r6, #16\n\t"
  118114. #else
  118115. "lsr r7, r6, #16\n\t"
  118116. #endif
  118117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118118. "lsls r6, r6, #16\n\t"
  118119. #else
  118120. "lsl r6, r6, #16\n\t"
  118121. #endif
  118122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118123. "adds r3, r3, r6\n\t"
  118124. #else
  118125. "add r3, r3, r6\n\t"
  118126. #endif
  118127. #ifdef WOLFSSL_KEIL
  118128. "adcs r4, r4, r7\n\t"
  118129. #elif defined(__clang__)
  118130. "adcs r4, r7\n\t"
  118131. #else
  118132. "adc r4, r7\n\t"
  118133. #endif
  118134. #ifdef WOLFSSL_KEIL
  118135. "adcs r5, r5, %[r]\n\t"
  118136. #elif defined(__clang__)
  118137. "adcs r5, %[r]\n\t"
  118138. #else
  118139. "adc r5, %[r]\n\t"
  118140. #endif
  118141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118142. "adds r3, r3, r6\n\t"
  118143. #else
  118144. "add r3, r3, r6\n\t"
  118145. #endif
  118146. #ifdef WOLFSSL_KEIL
  118147. "adcs r4, r4, r7\n\t"
  118148. #elif defined(__clang__)
  118149. "adcs r4, r7\n\t"
  118150. #else
  118151. "adc r4, r7\n\t"
  118152. #endif
  118153. #ifdef WOLFSSL_KEIL
  118154. "adcs r5, r5, %[r]\n\t"
  118155. #elif defined(__clang__)
  118156. "adcs r5, %[r]\n\t"
  118157. #else
  118158. "adc r5, %[r]\n\t"
  118159. #endif
  118160. "# Multiply * 2: Done\n\t"
  118161. "bal L_sp_521_sqr_17_done_sqr_%=\n\t"
  118162. "\n"
  118163. "L_sp_521_sqr_17_sqr_%=:\n\t"
  118164. "mov r12, r2\n\t"
  118165. "ldr r2, [%[a]]\n\t"
  118166. "# Square: Start\n\t"
  118167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118168. "lsrs r7, r2, #16\n\t"
  118169. #else
  118170. "lsr r7, r2, #16\n\t"
  118171. #endif
  118172. "uxth r6, r2\n\t"
  118173. #ifdef WOLFSSL_KEIL
  118174. "muls r6, r6, r6\n\t"
  118175. #elif defined(__clang__)
  118176. "muls r6, r6\n\t"
  118177. #else
  118178. "mul r6, r6\n\t"
  118179. #endif
  118180. #ifdef WOLFSSL_KEIL
  118181. "muls r7, r7, r7\n\t"
  118182. #elif defined(__clang__)
  118183. "muls r7, r7\n\t"
  118184. #else
  118185. "mul r7, r7\n\t"
  118186. #endif
  118187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118188. "adds r3, r3, r6\n\t"
  118189. #else
  118190. "add r3, r3, r6\n\t"
  118191. #endif
  118192. #ifdef WOLFSSL_KEIL
  118193. "adcs r4, r4, r7\n\t"
  118194. #elif defined(__clang__)
  118195. "adcs r4, r7\n\t"
  118196. #else
  118197. "adc r4, r7\n\t"
  118198. #endif
  118199. #ifdef WOLFSSL_KEIL
  118200. "adcs r5, r5, %[r]\n\t"
  118201. #elif defined(__clang__)
  118202. "adcs r5, %[r]\n\t"
  118203. #else
  118204. "adc r5, %[r]\n\t"
  118205. #endif
  118206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118207. "lsrs r7, r2, #16\n\t"
  118208. #else
  118209. "lsr r7, r2, #16\n\t"
  118210. #endif
  118211. "uxth r6, r2\n\t"
  118212. #ifdef WOLFSSL_KEIL
  118213. "muls r6, r7, r6\n\t"
  118214. #elif defined(__clang__)
  118215. "muls r6, r7\n\t"
  118216. #else
  118217. "mul r6, r7\n\t"
  118218. #endif
  118219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118220. "lsrs r7, r6, #15\n\t"
  118221. #else
  118222. "lsr r7, r6, #15\n\t"
  118223. #endif
  118224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118225. "lsls r6, r6, #17\n\t"
  118226. #else
  118227. "lsl r6, r6, #17\n\t"
  118228. #endif
  118229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118230. "adds r3, r3, r6\n\t"
  118231. #else
  118232. "add r3, r3, r6\n\t"
  118233. #endif
  118234. #ifdef WOLFSSL_KEIL
  118235. "adcs r4, r4, r7\n\t"
  118236. #elif defined(__clang__)
  118237. "adcs r4, r7\n\t"
  118238. #else
  118239. "adc r4, r7\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. "# Square: Done\n\t"
  118249. "mov r2, r12\n\t"
  118250. "\n"
  118251. "L_sp_521_sqr_17_done_sqr_%=:\n\t"
  118252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118253. "adds %[a], %[a], #4\n\t"
  118254. #else
  118255. "add %[a], %[a], #4\n\t"
  118256. #endif
  118257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118258. "subs r2, r2, #4\n\t"
  118259. #else
  118260. "sub r2, r2, #4\n\t"
  118261. #endif
  118262. "movs r6, #0x44\n\t"
  118263. "add r6, r6, r9\n\t"
  118264. "cmp %[a], r6\n\t"
  118265. "beq L_sp_521_sqr_17_done_mul_%=\n\t"
  118266. "cmp %[a], r2\n\t"
  118267. "bgt L_sp_521_sqr_17_done_mul_%=\n\t"
  118268. "mov r7, r8\n\t"
  118269. "add r7, r7, r9\n\t"
  118270. "cmp %[a], r7\n\t"
  118271. "ble L_sp_521_sqr_17_mul_%=\n\t"
  118272. "\n"
  118273. "L_sp_521_sqr_17_done_mul_%=:\n\t"
  118274. "mov %[r], r10\n\t"
  118275. "mov r7, r8\n\t"
  118276. "str r3, [%[r], r7]\n\t"
  118277. "movs r3, r4\n\t"
  118278. "movs r4, r5\n\t"
  118279. "movs r5, #0\n\t"
  118280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118281. "adds r7, r7, #4\n\t"
  118282. #else
  118283. "add r7, r7, #4\n\t"
  118284. #endif
  118285. "mov r8, r7\n\t"
  118286. "movs r6, #0x80\n\t"
  118287. "cmp r7, r6\n\t"
  118288. "ble L_sp_521_sqr_17_words_%=\n\t"
  118289. "mov %[a], r9\n\t"
  118290. "str r3, [%[r], r7]\n\t"
  118291. "mov %[r], r11\n\t"
  118292. "mov %[a], r10\n\t"
  118293. "movs r3, #0x84\n\t"
  118294. "\n"
  118295. "L_sp_521_sqr_17_store_%=:\n\t"
  118296. "ldr r6, [%[a], r3]\n\t"
  118297. "str r6, [%[r], r3]\n\t"
  118298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118299. "subs r3, r3, #4\n\t"
  118300. #else
  118301. "sub r3, r3, #4\n\t"
  118302. #endif
  118303. "bge L_sp_521_sqr_17_store_%=\n\t"
  118304. "movs r6, #0x88\n\t"
  118305. "add sp, sp, r6\n\t"
  118306. : [r] "+l" (r), [a] "+l" (a)
  118307. :
  118308. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  118309. );
  118310. }
  118311. #ifdef WOLFSSL_SP_SMALL
  118312. /* Add b to a into r. (r = a + b)
  118313. *
  118314. * r A single precision integer.
  118315. * a A single precision integer.
  118316. * b A single precision integer.
  118317. */
  118318. SP_NOINLINE static sp_digit sp_521_add_17(sp_digit* r, const sp_digit* a,
  118319. const sp_digit* b)
  118320. {
  118321. __asm__ __volatile__ (
  118322. "movs r6, %[a]\n\t"
  118323. "movs r7, #0\n\t"
  118324. "movs r3, #0\n\t"
  118325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118326. "adds r6, r6, #0x44\n\t"
  118327. #else
  118328. "add r6, r6, #0x44\n\t"
  118329. #endif
  118330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118331. "subs r7, r7, #1\n\t"
  118332. #else
  118333. "sub r7, r7, #1\n\t"
  118334. #endif
  118335. "\n"
  118336. "L_sp_521_add_17_word_%=:\n\t"
  118337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118338. "adds r3, r3, r7\n\t"
  118339. #else
  118340. "add r3, r3, r7\n\t"
  118341. #endif
  118342. "ldr r4, [%[a]]\n\t"
  118343. "ldr r5, [%[b]]\n\t"
  118344. #ifdef WOLFSSL_KEIL
  118345. "adcs r4, r4, r5\n\t"
  118346. #elif defined(__clang__)
  118347. "adcs r4, r5\n\t"
  118348. #else
  118349. "adc r4, r5\n\t"
  118350. #endif
  118351. "str r4, [%[r]]\n\t"
  118352. "movs r3, #0\n\t"
  118353. #ifdef WOLFSSL_KEIL
  118354. "adcs r3, r3, r3\n\t"
  118355. #elif defined(__clang__)
  118356. "adcs r3, r3\n\t"
  118357. #else
  118358. "adc r3, r3\n\t"
  118359. #endif
  118360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118361. "adds %[a], %[a], #4\n\t"
  118362. #else
  118363. "add %[a], %[a], #4\n\t"
  118364. #endif
  118365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118366. "adds %[b], %[b], #4\n\t"
  118367. #else
  118368. "add %[b], %[b], #4\n\t"
  118369. #endif
  118370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118371. "adds %[r], %[r], #4\n\t"
  118372. #else
  118373. "add %[r], %[r], #4\n\t"
  118374. #endif
  118375. "cmp %[a], r6\n\t"
  118376. "bne L_sp_521_add_17_word_%=\n\t"
  118377. "movs %[r], r3\n\t"
  118378. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  118379. :
  118380. : "memory", "r3", "r4", "r5", "r6", "r7"
  118381. );
  118382. return (uint32_t)(size_t)r;
  118383. }
  118384. #else
  118385. /* Add b to a into r. (r = a + b)
  118386. *
  118387. * r A single precision integer.
  118388. * a A single precision integer.
  118389. * b A single precision integer.
  118390. */
  118391. SP_NOINLINE static sp_digit sp_521_add_17(sp_digit* r, const sp_digit* a,
  118392. const sp_digit* b)
  118393. {
  118394. __asm__ __volatile__ (
  118395. "ldm %[b]!, {r5, r6}\n\t"
  118396. "ldm %[a]!, {r3, r4}\n\t"
  118397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118398. "adds r3, r3, r5\n\t"
  118399. #else
  118400. "add r3, r3, r5\n\t"
  118401. #endif
  118402. #ifdef WOLFSSL_KEIL
  118403. "adcs r4, r4, r6\n\t"
  118404. #elif defined(__clang__)
  118405. "adcs r4, r6\n\t"
  118406. #else
  118407. "adc r4, r6\n\t"
  118408. #endif
  118409. "stm %[r]!, {r3, r4}\n\t"
  118410. "ldm %[b]!, {r5, r6}\n\t"
  118411. "ldm %[a]!, {r3, r4}\n\t"
  118412. #ifdef WOLFSSL_KEIL
  118413. "adcs r3, r3, r5\n\t"
  118414. #elif defined(__clang__)
  118415. "adcs r3, r5\n\t"
  118416. #else
  118417. "adc r3, r5\n\t"
  118418. #endif
  118419. #ifdef WOLFSSL_KEIL
  118420. "adcs r4, r4, r6\n\t"
  118421. #elif defined(__clang__)
  118422. "adcs r4, r6\n\t"
  118423. #else
  118424. "adc r4, r6\n\t"
  118425. #endif
  118426. "stm %[r]!, {r3, r4}\n\t"
  118427. "ldm %[b]!, {r5, r6}\n\t"
  118428. "ldm %[a]!, {r3, r4}\n\t"
  118429. #ifdef WOLFSSL_KEIL
  118430. "adcs r3, r3, r5\n\t"
  118431. #elif defined(__clang__)
  118432. "adcs r3, r5\n\t"
  118433. #else
  118434. "adc r3, r5\n\t"
  118435. #endif
  118436. #ifdef WOLFSSL_KEIL
  118437. "adcs r4, r4, r6\n\t"
  118438. #elif defined(__clang__)
  118439. "adcs r4, r6\n\t"
  118440. #else
  118441. "adc r4, r6\n\t"
  118442. #endif
  118443. "stm %[r]!, {r3, r4}\n\t"
  118444. "ldm %[b]!, {r5, r6}\n\t"
  118445. "ldm %[a]!, {r3, r4}\n\t"
  118446. #ifdef WOLFSSL_KEIL
  118447. "adcs r3, r3, r5\n\t"
  118448. #elif defined(__clang__)
  118449. "adcs r3, r5\n\t"
  118450. #else
  118451. "adc r3, r5\n\t"
  118452. #endif
  118453. #ifdef WOLFSSL_KEIL
  118454. "adcs r4, r4, r6\n\t"
  118455. #elif defined(__clang__)
  118456. "adcs r4, r6\n\t"
  118457. #else
  118458. "adc r4, r6\n\t"
  118459. #endif
  118460. "stm %[r]!, {r3, r4}\n\t"
  118461. "ldm %[b]!, {r5, r6}\n\t"
  118462. "ldm %[a]!, {r3, r4}\n\t"
  118463. #ifdef WOLFSSL_KEIL
  118464. "adcs r3, r3, r5\n\t"
  118465. #elif defined(__clang__)
  118466. "adcs r3, r5\n\t"
  118467. #else
  118468. "adc r3, r5\n\t"
  118469. #endif
  118470. #ifdef WOLFSSL_KEIL
  118471. "adcs r4, r4, r6\n\t"
  118472. #elif defined(__clang__)
  118473. "adcs r4, r6\n\t"
  118474. #else
  118475. "adc r4, r6\n\t"
  118476. #endif
  118477. "stm %[r]!, {r3, r4}\n\t"
  118478. "ldm %[b]!, {r5, r6}\n\t"
  118479. "ldm %[a]!, {r3, r4}\n\t"
  118480. #ifdef WOLFSSL_KEIL
  118481. "adcs r3, r3, r5\n\t"
  118482. #elif defined(__clang__)
  118483. "adcs r3, r5\n\t"
  118484. #else
  118485. "adc r3, r5\n\t"
  118486. #endif
  118487. #ifdef WOLFSSL_KEIL
  118488. "adcs r4, r4, r6\n\t"
  118489. #elif defined(__clang__)
  118490. "adcs r4, r6\n\t"
  118491. #else
  118492. "adc r4, r6\n\t"
  118493. #endif
  118494. "stm %[r]!, {r3, r4}\n\t"
  118495. "ldm %[b]!, {r5, r6}\n\t"
  118496. "ldm %[a]!, {r3, r4}\n\t"
  118497. #ifdef WOLFSSL_KEIL
  118498. "adcs r3, r3, r5\n\t"
  118499. #elif defined(__clang__)
  118500. "adcs r3, r5\n\t"
  118501. #else
  118502. "adc r3, r5\n\t"
  118503. #endif
  118504. #ifdef WOLFSSL_KEIL
  118505. "adcs r4, r4, r6\n\t"
  118506. #elif defined(__clang__)
  118507. "adcs r4, r6\n\t"
  118508. #else
  118509. "adc r4, r6\n\t"
  118510. #endif
  118511. "stm %[r]!, {r3, r4}\n\t"
  118512. "ldm %[b]!, {r5, r6}\n\t"
  118513. "ldm %[a]!, {r3, r4}\n\t"
  118514. #ifdef WOLFSSL_KEIL
  118515. "adcs r3, r3, r5\n\t"
  118516. #elif defined(__clang__)
  118517. "adcs r3, r5\n\t"
  118518. #else
  118519. "adc r3, r5\n\t"
  118520. #endif
  118521. #ifdef WOLFSSL_KEIL
  118522. "adcs r4, r4, r6\n\t"
  118523. #elif defined(__clang__)
  118524. "adcs r4, r6\n\t"
  118525. #else
  118526. "adc r4, r6\n\t"
  118527. #endif
  118528. "stm %[r]!, {r3, r4}\n\t"
  118529. "ldr r5, [%[b]]\n\t"
  118530. "ldr r3, [%[a]]\n\t"
  118531. #ifdef WOLFSSL_KEIL
  118532. "adcs r3, r3, r5\n\t"
  118533. #elif defined(__clang__)
  118534. "adcs r3, r5\n\t"
  118535. #else
  118536. "adc r3, r5\n\t"
  118537. #endif
  118538. "str r3, [%[r]]\n\t"
  118539. "movs %[r], #0\n\t"
  118540. #ifdef WOLFSSL_KEIL
  118541. "adcs %[r], %[r], %[r]\n\t"
  118542. #elif defined(__clang__)
  118543. "adcs %[r], %[r]\n\t"
  118544. #else
  118545. "adc %[r], %[r]\n\t"
  118546. #endif
  118547. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  118548. :
  118549. : "memory", "r3", "r4", "r5", "r6"
  118550. );
  118551. return (uint32_t)(size_t)r;
  118552. }
  118553. #endif /* WOLFSSL_SP_SMALL */
  118554. #ifdef WOLFSSL_SP_SMALL
  118555. /* Sub b from a into r. (r = a - b)
  118556. *
  118557. * r A single precision integer.
  118558. * a A single precision integer.
  118559. * b A single precision integer.
  118560. */
  118561. SP_NOINLINE static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a,
  118562. const sp_digit* b)
  118563. {
  118564. __asm__ __volatile__ (
  118565. "movs r6, %[a]\n\t"
  118566. "movs r3, #0\n\t"
  118567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118568. "adds r6, r6, #0x44\n\t"
  118569. #else
  118570. "add r6, r6, #0x44\n\t"
  118571. #endif
  118572. "\n"
  118573. "L_sp_521_sub_17_word_%=:\n\t"
  118574. "movs r5, #0\n\t"
  118575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118576. "subs r5, r5, r3\n\t"
  118577. #else
  118578. "sub r5, r5, r3\n\t"
  118579. #endif
  118580. "ldr r4, [%[a]]\n\t"
  118581. "ldr r5, [%[b]]\n\t"
  118582. #ifdef WOLFSSL_KEIL
  118583. "sbcs r4, r4, r5\n\t"
  118584. #elif defined(__clang__)
  118585. "sbcs r4, r5\n\t"
  118586. #else
  118587. "sbc r4, r5\n\t"
  118588. #endif
  118589. "str r4, [%[r]]\n\t"
  118590. #ifdef WOLFSSL_KEIL
  118591. "sbcs r3, r3, r3\n\t"
  118592. #elif defined(__clang__)
  118593. "sbcs r3, r3\n\t"
  118594. #else
  118595. "sbc r3, r3\n\t"
  118596. #endif
  118597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118598. "adds %[a], %[a], #4\n\t"
  118599. #else
  118600. "add %[a], %[a], #4\n\t"
  118601. #endif
  118602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118603. "adds %[b], %[b], #4\n\t"
  118604. #else
  118605. "add %[b], %[b], #4\n\t"
  118606. #endif
  118607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118608. "adds %[r], %[r], #4\n\t"
  118609. #else
  118610. "add %[r], %[r], #4\n\t"
  118611. #endif
  118612. "cmp %[a], r6\n\t"
  118613. "bne L_sp_521_sub_17_word_%=\n\t"
  118614. "movs %[r], r3\n\t"
  118615. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  118616. :
  118617. : "memory", "r3", "r4", "r5", "r6"
  118618. );
  118619. return (uint32_t)(size_t)r;
  118620. }
  118621. #else
  118622. /* Sub b from a into r. (r = a - b)
  118623. *
  118624. * r A single precision integer.
  118625. * a A single precision integer.
  118626. * b A single precision integer.
  118627. */
  118628. SP_NOINLINE static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a,
  118629. const sp_digit* b)
  118630. {
  118631. __asm__ __volatile__ (
  118632. "ldm %[b]!, {r5, r6}\n\t"
  118633. "ldm %[a]!, {r3, r4}\n\t"
  118634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  118635. "subs r3, r3, r5\n\t"
  118636. #else
  118637. "sub r3, r3, r5\n\t"
  118638. #endif
  118639. #ifdef WOLFSSL_KEIL
  118640. "sbcs r4, r4, r6\n\t"
  118641. #elif defined(__clang__)
  118642. "sbcs r4, r6\n\t"
  118643. #else
  118644. "sbc r4, r6\n\t"
  118645. #endif
  118646. "stm %[r]!, {r3, r4}\n\t"
  118647. "ldm %[b]!, {r5, r6}\n\t"
  118648. "ldm %[a]!, {r3, r4}\n\t"
  118649. #ifdef WOLFSSL_KEIL
  118650. "sbcs r3, r3, r5\n\t"
  118651. #elif defined(__clang__)
  118652. "sbcs r3, r5\n\t"
  118653. #else
  118654. "sbc r3, r5\n\t"
  118655. #endif
  118656. #ifdef WOLFSSL_KEIL
  118657. "sbcs r4, r4, r6\n\t"
  118658. #elif defined(__clang__)
  118659. "sbcs r4, r6\n\t"
  118660. #else
  118661. "sbc r4, r6\n\t"
  118662. #endif
  118663. "stm %[r]!, {r3, r4}\n\t"
  118664. "ldm %[b]!, {r5, r6}\n\t"
  118665. "ldm %[a]!, {r3, r4}\n\t"
  118666. #ifdef WOLFSSL_KEIL
  118667. "sbcs r3, r3, r5\n\t"
  118668. #elif defined(__clang__)
  118669. "sbcs r3, r5\n\t"
  118670. #else
  118671. "sbc r3, r5\n\t"
  118672. #endif
  118673. #ifdef WOLFSSL_KEIL
  118674. "sbcs r4, r4, r6\n\t"
  118675. #elif defined(__clang__)
  118676. "sbcs r4, r6\n\t"
  118677. #else
  118678. "sbc r4, r6\n\t"
  118679. #endif
  118680. "stm %[r]!, {r3, r4}\n\t"
  118681. "ldm %[b]!, {r5, r6}\n\t"
  118682. "ldm %[a]!, {r3, r4}\n\t"
  118683. #ifdef WOLFSSL_KEIL
  118684. "sbcs r3, r3, r5\n\t"
  118685. #elif defined(__clang__)
  118686. "sbcs r3, r5\n\t"
  118687. #else
  118688. "sbc r3, r5\n\t"
  118689. #endif
  118690. #ifdef WOLFSSL_KEIL
  118691. "sbcs r4, r4, r6\n\t"
  118692. #elif defined(__clang__)
  118693. "sbcs r4, r6\n\t"
  118694. #else
  118695. "sbc r4, r6\n\t"
  118696. #endif
  118697. "stm %[r]!, {r3, r4}\n\t"
  118698. "ldm %[b]!, {r5, r6}\n\t"
  118699. "ldm %[a]!, {r3, r4}\n\t"
  118700. #ifdef WOLFSSL_KEIL
  118701. "sbcs r3, r3, r5\n\t"
  118702. #elif defined(__clang__)
  118703. "sbcs r3, r5\n\t"
  118704. #else
  118705. "sbc r3, r5\n\t"
  118706. #endif
  118707. #ifdef WOLFSSL_KEIL
  118708. "sbcs r4, r4, r6\n\t"
  118709. #elif defined(__clang__)
  118710. "sbcs r4, r6\n\t"
  118711. #else
  118712. "sbc r4, r6\n\t"
  118713. #endif
  118714. "stm %[r]!, {r3, r4}\n\t"
  118715. "ldm %[b]!, {r5, r6}\n\t"
  118716. "ldm %[a]!, {r3, r4}\n\t"
  118717. #ifdef WOLFSSL_KEIL
  118718. "sbcs r3, r3, r5\n\t"
  118719. #elif defined(__clang__)
  118720. "sbcs r3, r5\n\t"
  118721. #else
  118722. "sbc r3, r5\n\t"
  118723. #endif
  118724. #ifdef WOLFSSL_KEIL
  118725. "sbcs r4, r4, r6\n\t"
  118726. #elif defined(__clang__)
  118727. "sbcs r4, r6\n\t"
  118728. #else
  118729. "sbc r4, r6\n\t"
  118730. #endif
  118731. "stm %[r]!, {r3, r4}\n\t"
  118732. "ldm %[b]!, {r5, r6}\n\t"
  118733. "ldm %[a]!, {r3, r4}\n\t"
  118734. #ifdef WOLFSSL_KEIL
  118735. "sbcs r3, r3, r5\n\t"
  118736. #elif defined(__clang__)
  118737. "sbcs r3, r5\n\t"
  118738. #else
  118739. "sbc r3, r5\n\t"
  118740. #endif
  118741. #ifdef WOLFSSL_KEIL
  118742. "sbcs r4, r4, r6\n\t"
  118743. #elif defined(__clang__)
  118744. "sbcs r4, r6\n\t"
  118745. #else
  118746. "sbc r4, r6\n\t"
  118747. #endif
  118748. "stm %[r]!, {r3, r4}\n\t"
  118749. "ldm %[b]!, {r5, r6}\n\t"
  118750. "ldm %[a]!, {r3, r4}\n\t"
  118751. #ifdef WOLFSSL_KEIL
  118752. "sbcs r3, r3, r5\n\t"
  118753. #elif defined(__clang__)
  118754. "sbcs r3, r5\n\t"
  118755. #else
  118756. "sbc r3, r5\n\t"
  118757. #endif
  118758. #ifdef WOLFSSL_KEIL
  118759. "sbcs r4, r4, r6\n\t"
  118760. #elif defined(__clang__)
  118761. "sbcs r4, r6\n\t"
  118762. #else
  118763. "sbc r4, r6\n\t"
  118764. #endif
  118765. "stm %[r]!, {r3, r4}\n\t"
  118766. "ldr r5, [%[b]]\n\t"
  118767. "ldr r3, [%[a]]\n\t"
  118768. #ifdef WOLFSSL_KEIL
  118769. "sbcs r3, r3, r5\n\t"
  118770. #elif defined(__clang__)
  118771. "sbcs r3, r5\n\t"
  118772. #else
  118773. "sbc r3, r5\n\t"
  118774. #endif
  118775. "str r3, [%[r]]\n\t"
  118776. #ifdef WOLFSSL_KEIL
  118777. "sbcs %[r], %[r], %[r]\n\t"
  118778. #elif defined(__clang__)
  118779. "sbcs %[r], %[r]\n\t"
  118780. #else
  118781. "sbc %[r], %[r]\n\t"
  118782. #endif
  118783. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  118784. :
  118785. : "memory", "r3", "r4", "r5", "r6"
  118786. );
  118787. return (uint32_t)(size_t)r;
  118788. }
  118789. #endif /* WOLFSSL_SP_SMALL */
  118790. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  118791. *
  118792. * r The resulting Montgomery form number.
  118793. * a The number to convert.
  118794. * m The modulus (prime).
  118795. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  118796. */
  118797. static int sp_521_mod_mul_norm_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  118798. {
  118799. (void)m;
  118800. if (r != a) {
  118801. XMEMCPY(r, a, 17 * sizeof(sp_digit));
  118802. }
  118803. return MP_OKAY;
  118804. }
  118805. /* Convert an mp_int to an array of sp_digit.
  118806. *
  118807. * r A single precision integer.
  118808. * size Maximum number of bytes to convert
  118809. * a A multi-precision integer.
  118810. */
  118811. static void sp_521_from_mp(sp_digit* r, int size, const mp_int* a)
  118812. {
  118813. #if DIGIT_BIT == 32
  118814. int j;
  118815. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  118816. for (j = a->used; j < size; j++) {
  118817. r[j] = 0;
  118818. }
  118819. #elif DIGIT_BIT > 32
  118820. int i;
  118821. int j = 0;
  118822. word32 s = 0;
  118823. r[0] = 0;
  118824. for (i = 0; i < a->used && j < size; i++) {
  118825. r[j] |= ((sp_digit)a->dp[i] << s);
  118826. r[j] &= 0xffffffff;
  118827. s = 32U - s;
  118828. if (j + 1 >= size) {
  118829. break;
  118830. }
  118831. /* lint allow cast of mismatch word32 and mp_digit */
  118832. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  118833. while ((s + 32U) <= (word32)DIGIT_BIT) {
  118834. s += 32U;
  118835. r[j] &= 0xffffffff;
  118836. if (j + 1 >= size) {
  118837. break;
  118838. }
  118839. if (s < (word32)DIGIT_BIT) {
  118840. /* lint allow cast of mismatch word32 and mp_digit */
  118841. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  118842. }
  118843. else {
  118844. r[++j] = (sp_digit)0;
  118845. }
  118846. }
  118847. s = (word32)DIGIT_BIT - s;
  118848. }
  118849. for (j++; j < size; j++) {
  118850. r[j] = 0;
  118851. }
  118852. #else
  118853. int i;
  118854. int j = 0;
  118855. int s = 0;
  118856. r[0] = 0;
  118857. for (i = 0; i < a->used && j < size; i++) {
  118858. r[j] |= ((sp_digit)a->dp[i]) << s;
  118859. if (s + DIGIT_BIT >= 32) {
  118860. r[j] &= 0xffffffff;
  118861. if (j + 1 >= size) {
  118862. break;
  118863. }
  118864. s = 32 - s;
  118865. if (s == DIGIT_BIT) {
  118866. r[++j] = 0;
  118867. s = 0;
  118868. }
  118869. else {
  118870. r[++j] = a->dp[i] >> s;
  118871. s = DIGIT_BIT - s;
  118872. }
  118873. }
  118874. else {
  118875. s += DIGIT_BIT;
  118876. }
  118877. }
  118878. for (j++; j < size; j++) {
  118879. r[j] = 0;
  118880. }
  118881. #endif
  118882. }
  118883. /* Convert a point of type ecc_point to type sp_point_521.
  118884. *
  118885. * p Point of type sp_point_521 (result).
  118886. * pm Point of type ecc_point.
  118887. */
  118888. static void sp_521_point_from_ecc_point_17(sp_point_521* p,
  118889. const ecc_point* pm)
  118890. {
  118891. XMEMSET(p->x, 0, sizeof(p->x));
  118892. XMEMSET(p->y, 0, sizeof(p->y));
  118893. XMEMSET(p->z, 0, sizeof(p->z));
  118894. sp_521_from_mp(p->x, 17, pm->x);
  118895. sp_521_from_mp(p->y, 17, pm->y);
  118896. sp_521_from_mp(p->z, 17, pm->z);
  118897. p->infinity = 0;
  118898. }
  118899. /* Convert an array of sp_digit to an mp_int.
  118900. *
  118901. * a A single precision integer.
  118902. * r A multi-precision integer.
  118903. */
  118904. static int sp_521_to_mp(const sp_digit* a, mp_int* r)
  118905. {
  118906. int err;
  118907. err = mp_grow(r, (521 + DIGIT_BIT - 1) / DIGIT_BIT);
  118908. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  118909. #if DIGIT_BIT == 32
  118910. XMEMCPY(r->dp, a, sizeof(sp_digit) * 17);
  118911. r->used = 17;
  118912. mp_clamp(r);
  118913. #elif DIGIT_BIT < 32
  118914. int i;
  118915. int j = 0;
  118916. int s = 0;
  118917. r->dp[0] = 0;
  118918. for (i = 0; i < 17; i++) {
  118919. r->dp[j] |= (mp_digit)(a[i] << s);
  118920. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  118921. s = DIGIT_BIT - s;
  118922. r->dp[++j] = (mp_digit)(a[i] >> s);
  118923. while (s + DIGIT_BIT <= 32) {
  118924. s += DIGIT_BIT;
  118925. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  118926. if (s == SP_WORD_SIZE) {
  118927. r->dp[j] = 0;
  118928. }
  118929. else {
  118930. r->dp[j] = (mp_digit)(a[i] >> s);
  118931. }
  118932. }
  118933. s = 32 - s;
  118934. }
  118935. r->used = (521 + DIGIT_BIT - 1) / DIGIT_BIT;
  118936. mp_clamp(r);
  118937. #else
  118938. int i;
  118939. int j = 0;
  118940. int s = 0;
  118941. r->dp[0] = 0;
  118942. for (i = 0; i < 17; i++) {
  118943. r->dp[j] |= ((mp_digit)a[i]) << s;
  118944. if (s + 32 >= DIGIT_BIT) {
  118945. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  118946. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  118947. #endif
  118948. s = DIGIT_BIT - s;
  118949. r->dp[++j] = a[i] >> s;
  118950. s = 32 - s;
  118951. }
  118952. else {
  118953. s += 32;
  118954. }
  118955. }
  118956. r->used = (521 + DIGIT_BIT - 1) / DIGIT_BIT;
  118957. mp_clamp(r);
  118958. #endif
  118959. }
  118960. return err;
  118961. }
  118962. /* Convert a point of type sp_point_521 to type ecc_point.
  118963. *
  118964. * p Point of type sp_point_521.
  118965. * pm Point of type ecc_point (result).
  118966. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  118967. * MP_OKAY.
  118968. */
  118969. static int sp_521_point_to_ecc_point_17(const sp_point_521* p, ecc_point* pm)
  118970. {
  118971. int err;
  118972. err = sp_521_to_mp(p->x, pm->x);
  118973. if (err == MP_OKAY) {
  118974. err = sp_521_to_mp(p->y, pm->y);
  118975. }
  118976. if (err == MP_OKAY) {
  118977. err = sp_521_to_mp(p->z, pm->z);
  118978. }
  118979. return err;
  118980. }
  118981. /* Conditionally subtract b from a using the mask m.
  118982. * m is -1 to subtract and 0 when not copying.
  118983. *
  118984. * r A single precision number representing condition subtract result.
  118985. * a A single precision number to subtract from.
  118986. * b A single precision number to subtract.
  118987. * m Mask value to apply.
  118988. */
  118989. SP_NOINLINE static sp_digit sp_521_cond_sub_17(sp_digit* r, const sp_digit* a,
  118990. const sp_digit* b, sp_digit m)
  118991. {
  118992. __asm__ __volatile__ (
  118993. "movs r4, #0\n\t"
  118994. "movs r5, #0x44\n\t"
  118995. "mov r8, r5\n\t"
  118996. "movs r7, #0\n\t"
  118997. "\n"
  118998. "L_sp_521_cond_sub_17_words_%=:\n\t"
  118999. "ldr r6, [%[b], r7]\n\t"
  119000. #ifdef WOLFSSL_KEIL
  119001. "ands r6, r6, %[m]\n\t"
  119002. #elif defined(__clang__)
  119003. "ands r6, %[m]\n\t"
  119004. #else
  119005. "and r6, %[m]\n\t"
  119006. #endif
  119007. "movs r5, #0\n\t"
  119008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119009. "subs r5, r5, r4\n\t"
  119010. #else
  119011. "sub r5, r5, r4\n\t"
  119012. #endif
  119013. "ldr r5, [%[a], r7]\n\t"
  119014. #ifdef WOLFSSL_KEIL
  119015. "sbcs r5, r5, r6\n\t"
  119016. #elif defined(__clang__)
  119017. "sbcs r5, r6\n\t"
  119018. #else
  119019. "sbc r5, r6\n\t"
  119020. #endif
  119021. #ifdef WOLFSSL_KEIL
  119022. "sbcs r4, r4, r4\n\t"
  119023. #elif defined(__clang__)
  119024. "sbcs r4, r4\n\t"
  119025. #else
  119026. "sbc r4, r4\n\t"
  119027. #endif
  119028. "str r5, [%[r], r7]\n\t"
  119029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119030. "adds r7, r7, #4\n\t"
  119031. #else
  119032. "add r7, r7, #4\n\t"
  119033. #endif
  119034. "cmp r7, r8\n\t"
  119035. "blt L_sp_521_cond_sub_17_words_%=\n\t"
  119036. "movs %[r], r4\n\t"
  119037. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  119038. :
  119039. : "memory", "r4", "r5", "r6", "r7", "r8"
  119040. );
  119041. return (uint32_t)(size_t)r;
  119042. }
  119043. /* Reduce the number back to 521 bits using Montgomery reduction.
  119044. *
  119045. * a A single precision number to reduce in place.
  119046. * m The single precision number representing the modulus.
  119047. * mp The digit representing the negative inverse of m mod 2^n.
  119048. */
  119049. SP_NOINLINE static void sp_521_mont_reduce_17(sp_digit* a, const sp_digit* m,
  119050. sp_digit mp)
  119051. {
  119052. (void)mp;
  119053. (void)m;
  119054. __asm__ __volatile__ (
  119055. "sub sp, sp, #0x44\n\t"
  119056. "mov r6, sp\n\t"
  119057. "movs r5, #0x40\n\t"
  119058. "movs r7, %[a]\n\t"
  119059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119060. "adds r7, r7, r5\n\t"
  119061. #else
  119062. "add r7, r7, r5\n\t"
  119063. #endif
  119064. "ldm r7!, {r1, r2, r3, r4}\n\t"
  119065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119066. "lsls r5, r2, #23\n\t"
  119067. #else
  119068. "lsl r5, r2, #23\n\t"
  119069. #endif
  119070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119071. "lsrs r1, r1, #9\n\t"
  119072. #else
  119073. "lsr r1, r1, #9\n\t"
  119074. #endif
  119075. #ifdef WOLFSSL_KEIL
  119076. "orrs r1, r1, r5\n\t"
  119077. #elif defined(__clang__)
  119078. "orrs r1, r5\n\t"
  119079. #else
  119080. "orr r1, r5\n\t"
  119081. #endif
  119082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119083. "lsls r5, r3, #23\n\t"
  119084. #else
  119085. "lsl r5, r3, #23\n\t"
  119086. #endif
  119087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119088. "lsrs r2, r2, #9\n\t"
  119089. #else
  119090. "lsr r2, r2, #9\n\t"
  119091. #endif
  119092. #ifdef WOLFSSL_KEIL
  119093. "orrs r2, r2, r5\n\t"
  119094. #elif defined(__clang__)
  119095. "orrs r2, r5\n\t"
  119096. #else
  119097. "orr r2, r5\n\t"
  119098. #endif
  119099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119100. "lsls r5, r4, #23\n\t"
  119101. #else
  119102. "lsl r5, r4, #23\n\t"
  119103. #endif
  119104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119105. "lsrs r3, r3, #9\n\t"
  119106. #else
  119107. "lsr r3, r3, #9\n\t"
  119108. #endif
  119109. #ifdef WOLFSSL_KEIL
  119110. "orrs r3, r3, r5\n\t"
  119111. #elif defined(__clang__)
  119112. "orrs r3, r5\n\t"
  119113. #else
  119114. "orr r3, r5\n\t"
  119115. #endif
  119116. "stm r6!, {r1, r2, r3}\n\t"
  119117. "movs r1, r4\n\t"
  119118. "ldm r7!, {r2, r3, r4}\n\t"
  119119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119120. "lsls r5, r2, #23\n\t"
  119121. #else
  119122. "lsl r5, r2, #23\n\t"
  119123. #endif
  119124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119125. "lsrs r1, r1, #9\n\t"
  119126. #else
  119127. "lsr r1, r1, #9\n\t"
  119128. #endif
  119129. #ifdef WOLFSSL_KEIL
  119130. "orrs r1, r1, r5\n\t"
  119131. #elif defined(__clang__)
  119132. "orrs r1, r5\n\t"
  119133. #else
  119134. "orr r1, r5\n\t"
  119135. #endif
  119136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119137. "lsls r5, r3, #23\n\t"
  119138. #else
  119139. "lsl r5, r3, #23\n\t"
  119140. #endif
  119141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119142. "lsrs r2, r2, #9\n\t"
  119143. #else
  119144. "lsr r2, r2, #9\n\t"
  119145. #endif
  119146. #ifdef WOLFSSL_KEIL
  119147. "orrs r2, r2, r5\n\t"
  119148. #elif defined(__clang__)
  119149. "orrs r2, r5\n\t"
  119150. #else
  119151. "orr r2, r5\n\t"
  119152. #endif
  119153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119154. "lsls r5, r4, #23\n\t"
  119155. #else
  119156. "lsl r5, r4, #23\n\t"
  119157. #endif
  119158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119159. "lsrs r3, r3, #9\n\t"
  119160. #else
  119161. "lsr r3, r3, #9\n\t"
  119162. #endif
  119163. #ifdef WOLFSSL_KEIL
  119164. "orrs r3, r3, r5\n\t"
  119165. #elif defined(__clang__)
  119166. "orrs r3, r5\n\t"
  119167. #else
  119168. "orr r3, r5\n\t"
  119169. #endif
  119170. "stm r6!, {r1, r2, r3}\n\t"
  119171. "movs r1, r4\n\t"
  119172. "ldm r7!, {r2, r3, r4}\n\t"
  119173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119174. "lsls r5, r2, #23\n\t"
  119175. #else
  119176. "lsl r5, r2, #23\n\t"
  119177. #endif
  119178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119179. "lsrs r1, r1, #9\n\t"
  119180. #else
  119181. "lsr r1, r1, #9\n\t"
  119182. #endif
  119183. #ifdef WOLFSSL_KEIL
  119184. "orrs r1, r1, r5\n\t"
  119185. #elif defined(__clang__)
  119186. "orrs r1, r5\n\t"
  119187. #else
  119188. "orr r1, r5\n\t"
  119189. #endif
  119190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119191. "lsls r5, r3, #23\n\t"
  119192. #else
  119193. "lsl r5, r3, #23\n\t"
  119194. #endif
  119195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119196. "lsrs r2, r2, #9\n\t"
  119197. #else
  119198. "lsr r2, r2, #9\n\t"
  119199. #endif
  119200. #ifdef WOLFSSL_KEIL
  119201. "orrs r2, r2, r5\n\t"
  119202. #elif defined(__clang__)
  119203. "orrs r2, r5\n\t"
  119204. #else
  119205. "orr r2, r5\n\t"
  119206. #endif
  119207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119208. "lsls r5, r4, #23\n\t"
  119209. #else
  119210. "lsl r5, r4, #23\n\t"
  119211. #endif
  119212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119213. "lsrs r3, r3, #9\n\t"
  119214. #else
  119215. "lsr r3, r3, #9\n\t"
  119216. #endif
  119217. #ifdef WOLFSSL_KEIL
  119218. "orrs r3, r3, r5\n\t"
  119219. #elif defined(__clang__)
  119220. "orrs r3, r5\n\t"
  119221. #else
  119222. "orr r3, r5\n\t"
  119223. #endif
  119224. "stm r6!, {r1, r2, r3}\n\t"
  119225. "movs r1, r4\n\t"
  119226. "ldm r7!, {r2, r3, r4}\n\t"
  119227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119228. "lsls r5, r2, #23\n\t"
  119229. #else
  119230. "lsl r5, r2, #23\n\t"
  119231. #endif
  119232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119233. "lsrs r1, r1, #9\n\t"
  119234. #else
  119235. "lsr r1, r1, #9\n\t"
  119236. #endif
  119237. #ifdef WOLFSSL_KEIL
  119238. "orrs r1, r1, r5\n\t"
  119239. #elif defined(__clang__)
  119240. "orrs r1, r5\n\t"
  119241. #else
  119242. "orr r1, r5\n\t"
  119243. #endif
  119244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119245. "lsls r5, r3, #23\n\t"
  119246. #else
  119247. "lsl r5, r3, #23\n\t"
  119248. #endif
  119249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119250. "lsrs r2, r2, #9\n\t"
  119251. #else
  119252. "lsr r2, r2, #9\n\t"
  119253. #endif
  119254. #ifdef WOLFSSL_KEIL
  119255. "orrs r2, r2, r5\n\t"
  119256. #elif defined(__clang__)
  119257. "orrs r2, r5\n\t"
  119258. #else
  119259. "orr r2, r5\n\t"
  119260. #endif
  119261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119262. "lsls r5, r4, #23\n\t"
  119263. #else
  119264. "lsl r5, r4, #23\n\t"
  119265. #endif
  119266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119267. "lsrs r3, r3, #9\n\t"
  119268. #else
  119269. "lsr r3, r3, #9\n\t"
  119270. #endif
  119271. #ifdef WOLFSSL_KEIL
  119272. "orrs r3, r3, r5\n\t"
  119273. #elif defined(__clang__)
  119274. "orrs r3, r5\n\t"
  119275. #else
  119276. "orr r3, r5\n\t"
  119277. #endif
  119278. "stm r6!, {r1, r2, r3}\n\t"
  119279. "movs r1, r4\n\t"
  119280. "ldm r7!, {r2, r3, r4}\n\t"
  119281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119282. "lsls r5, r2, #23\n\t"
  119283. #else
  119284. "lsl r5, r2, #23\n\t"
  119285. #endif
  119286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119287. "lsrs r1, r1, #9\n\t"
  119288. #else
  119289. "lsr r1, r1, #9\n\t"
  119290. #endif
  119291. #ifdef WOLFSSL_KEIL
  119292. "orrs r1, r1, r5\n\t"
  119293. #elif defined(__clang__)
  119294. "orrs r1, r5\n\t"
  119295. #else
  119296. "orr r1, r5\n\t"
  119297. #endif
  119298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119299. "lsls r5, r3, #23\n\t"
  119300. #else
  119301. "lsl r5, r3, #23\n\t"
  119302. #endif
  119303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119304. "lsrs r2, r2, #9\n\t"
  119305. #else
  119306. "lsr r2, r2, #9\n\t"
  119307. #endif
  119308. #ifdef WOLFSSL_KEIL
  119309. "orrs r2, r2, r5\n\t"
  119310. #elif defined(__clang__)
  119311. "orrs r2, r5\n\t"
  119312. #else
  119313. "orr r2, r5\n\t"
  119314. #endif
  119315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119316. "lsls r5, r4, #23\n\t"
  119317. #else
  119318. "lsl r5, r4, #23\n\t"
  119319. #endif
  119320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119321. "lsrs r3, r3, #9\n\t"
  119322. #else
  119323. "lsr r3, r3, #9\n\t"
  119324. #endif
  119325. #ifdef WOLFSSL_KEIL
  119326. "orrs r3, r3, r5\n\t"
  119327. #elif defined(__clang__)
  119328. "orrs r3, r5\n\t"
  119329. #else
  119330. "orr r3, r5\n\t"
  119331. #endif
  119332. "stm r6!, {r1, r2, r3}\n\t"
  119333. "movs r1, r4\n\t"
  119334. "ldm r7!, {r2}\n\t"
  119335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119336. "lsls r5, r2, #23\n\t"
  119337. #else
  119338. "lsl r5, r2, #23\n\t"
  119339. #endif
  119340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119341. "lsrs r1, r1, #9\n\t"
  119342. #else
  119343. "lsr r1, r1, #9\n\t"
  119344. #endif
  119345. #ifdef WOLFSSL_KEIL
  119346. "orrs r1, r1, r5\n\t"
  119347. #elif defined(__clang__)
  119348. "orrs r1, r5\n\t"
  119349. #else
  119350. "orr r1, r5\n\t"
  119351. #endif
  119352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119353. "lsrs r2, r2, #9\n\t"
  119354. #else
  119355. "lsr r2, r2, #9\n\t"
  119356. #endif
  119357. "stm r6!, {r1, r2}\n\t"
  119358. "ldr r1, [%[a], #64]\n\t"
  119359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119360. "lsls r1, r1, #23\n\t"
  119361. #else
  119362. "lsl r1, r1, #23\n\t"
  119363. #endif
  119364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119365. "lsrs r1, r1, #23\n\t"
  119366. #else
  119367. "lsr r1, r1, #23\n\t"
  119368. #endif
  119369. "mov r8, r1\n\t"
  119370. "mov r7, sp\n\t"
  119371. "ldr r1, [%[a]]\n\t"
  119372. "ldr r2, [%[a], #4]\n\t"
  119373. "ldr r3, [%[a], #8]\n\t"
  119374. "ldm r7!, {r4, r5, r6}\n\t"
  119375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119376. "adds r1, r1, r4\n\t"
  119377. #else
  119378. "add r1, r1, r4\n\t"
  119379. #endif
  119380. #ifdef WOLFSSL_KEIL
  119381. "adcs r2, r2, r5\n\t"
  119382. #elif defined(__clang__)
  119383. "adcs r2, r5\n\t"
  119384. #else
  119385. "adc r2, r5\n\t"
  119386. #endif
  119387. #ifdef WOLFSSL_KEIL
  119388. "adcs r3, r3, r6\n\t"
  119389. #elif defined(__clang__)
  119390. "adcs r3, r6\n\t"
  119391. #else
  119392. "adc r3, r6\n\t"
  119393. #endif
  119394. "stm %[a]!, {r1, r2, r3}\n\t"
  119395. "ldr r1, [%[a]]\n\t"
  119396. "ldr r2, [%[a], #4]\n\t"
  119397. "ldr r3, [%[a], #8]\n\t"
  119398. "ldm r7!, {r4, r5, r6}\n\t"
  119399. #ifdef WOLFSSL_KEIL
  119400. "adcs r1, r1, r4\n\t"
  119401. #elif defined(__clang__)
  119402. "adcs r1, r4\n\t"
  119403. #else
  119404. "adc r1, r4\n\t"
  119405. #endif
  119406. #ifdef WOLFSSL_KEIL
  119407. "adcs r2, r2, r5\n\t"
  119408. #elif defined(__clang__)
  119409. "adcs r2, r5\n\t"
  119410. #else
  119411. "adc r2, r5\n\t"
  119412. #endif
  119413. #ifdef WOLFSSL_KEIL
  119414. "adcs r3, r3, r6\n\t"
  119415. #elif defined(__clang__)
  119416. "adcs r3, r6\n\t"
  119417. #else
  119418. "adc r3, r6\n\t"
  119419. #endif
  119420. "stm %[a]!, {r1, r2, r3}\n\t"
  119421. "ldr r1, [%[a]]\n\t"
  119422. "ldr r2, [%[a], #4]\n\t"
  119423. "ldr r3, [%[a], #8]\n\t"
  119424. "ldm r7!, {r4, r5, r6}\n\t"
  119425. #ifdef WOLFSSL_KEIL
  119426. "adcs r1, r1, r4\n\t"
  119427. #elif defined(__clang__)
  119428. "adcs r1, r4\n\t"
  119429. #else
  119430. "adc r1, r4\n\t"
  119431. #endif
  119432. #ifdef WOLFSSL_KEIL
  119433. "adcs r2, r2, r5\n\t"
  119434. #elif defined(__clang__)
  119435. "adcs r2, r5\n\t"
  119436. #else
  119437. "adc r2, r5\n\t"
  119438. #endif
  119439. #ifdef WOLFSSL_KEIL
  119440. "adcs r3, r3, r6\n\t"
  119441. #elif defined(__clang__)
  119442. "adcs r3, r6\n\t"
  119443. #else
  119444. "adc r3, r6\n\t"
  119445. #endif
  119446. "stm %[a]!, {r1, r2, r3}\n\t"
  119447. "ldr r1, [%[a]]\n\t"
  119448. "ldr r2, [%[a], #4]\n\t"
  119449. "ldr r3, [%[a], #8]\n\t"
  119450. "ldm r7!, {r4, r5, r6}\n\t"
  119451. #ifdef WOLFSSL_KEIL
  119452. "adcs r1, r1, r4\n\t"
  119453. #elif defined(__clang__)
  119454. "adcs r1, r4\n\t"
  119455. #else
  119456. "adc r1, r4\n\t"
  119457. #endif
  119458. #ifdef WOLFSSL_KEIL
  119459. "adcs r2, r2, r5\n\t"
  119460. #elif defined(__clang__)
  119461. "adcs r2, r5\n\t"
  119462. #else
  119463. "adc r2, r5\n\t"
  119464. #endif
  119465. #ifdef WOLFSSL_KEIL
  119466. "adcs r3, r3, r6\n\t"
  119467. #elif defined(__clang__)
  119468. "adcs r3, r6\n\t"
  119469. #else
  119470. "adc r3, r6\n\t"
  119471. #endif
  119472. "stm %[a]!, {r1, r2, r3}\n\t"
  119473. "ldr r1, [%[a]]\n\t"
  119474. "ldr r2, [%[a], #4]\n\t"
  119475. "ldr r3, [%[a], #8]\n\t"
  119476. "ldm r7!, {r4, r5, r6}\n\t"
  119477. #ifdef WOLFSSL_KEIL
  119478. "adcs r1, r1, r4\n\t"
  119479. #elif defined(__clang__)
  119480. "adcs r1, r4\n\t"
  119481. #else
  119482. "adc r1, r4\n\t"
  119483. #endif
  119484. #ifdef WOLFSSL_KEIL
  119485. "adcs r2, r2, r5\n\t"
  119486. #elif defined(__clang__)
  119487. "adcs r2, r5\n\t"
  119488. #else
  119489. "adc r2, r5\n\t"
  119490. #endif
  119491. #ifdef WOLFSSL_KEIL
  119492. "adcs r3, r3, r6\n\t"
  119493. #elif defined(__clang__)
  119494. "adcs r3, r6\n\t"
  119495. #else
  119496. "adc r3, r6\n\t"
  119497. #endif
  119498. "stm %[a]!, {r1, r2, r3}\n\t"
  119499. "ldr r1, [%[a]]\n\t"
  119500. "ldm r7!, {r4, r5}\n\t"
  119501. "mov r2, r8\n\t"
  119502. #ifdef WOLFSSL_KEIL
  119503. "adcs r1, r1, r4\n\t"
  119504. #elif defined(__clang__)
  119505. "adcs r1, r4\n\t"
  119506. #else
  119507. "adc r1, r4\n\t"
  119508. #endif
  119509. #ifdef WOLFSSL_KEIL
  119510. "adcs r2, r2, r5\n\t"
  119511. #elif defined(__clang__)
  119512. "adcs r2, r5\n\t"
  119513. #else
  119514. "adc r2, r5\n\t"
  119515. #endif
  119516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119517. "lsrs r6, r2, #9\n\t"
  119518. #else
  119519. "lsr r6, r2, #9\n\t"
  119520. #endif
  119521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119522. "lsls r2, r2, #23\n\t"
  119523. #else
  119524. "lsl r2, r2, #23\n\t"
  119525. #endif
  119526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119527. "lsrs r2, r2, #23\n\t"
  119528. #else
  119529. "lsr r2, r2, #23\n\t"
  119530. #endif
  119531. "stm %[a]!, {r1, r2}\n\t"
  119532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119533. "subs %[a], %[a], #0x44\n\t"
  119534. #else
  119535. "sub %[a], %[a], #0x44\n\t"
  119536. #endif
  119537. "movs r5, #0\n\t"
  119538. "ldr r1, [%[a]]\n\t"
  119539. "ldr r2, [%[a], #4]\n\t"
  119540. "ldr r3, [%[a], #8]\n\t"
  119541. "ldr r4, [%[a], #12]\n\t"
  119542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119543. "adds r1, r1, r6\n\t"
  119544. #else
  119545. "add r1, r1, r6\n\t"
  119546. #endif
  119547. #ifdef WOLFSSL_KEIL
  119548. "adcs r2, r2, r5\n\t"
  119549. #elif defined(__clang__)
  119550. "adcs r2, r5\n\t"
  119551. #else
  119552. "adc r2, r5\n\t"
  119553. #endif
  119554. #ifdef WOLFSSL_KEIL
  119555. "adcs r3, r3, r5\n\t"
  119556. #elif defined(__clang__)
  119557. "adcs r3, r5\n\t"
  119558. #else
  119559. "adc r3, r5\n\t"
  119560. #endif
  119561. #ifdef WOLFSSL_KEIL
  119562. "adcs r4, r4, r5\n\t"
  119563. #elif defined(__clang__)
  119564. "adcs r4, r5\n\t"
  119565. #else
  119566. "adc r4, r5\n\t"
  119567. #endif
  119568. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119569. "ldr r1, [%[a]]\n\t"
  119570. "ldr r2, [%[a], #4]\n\t"
  119571. "ldr r3, [%[a], #8]\n\t"
  119572. "ldr r4, [%[a], #12]\n\t"
  119573. #ifdef WOLFSSL_KEIL
  119574. "adcs r1, r1, r5\n\t"
  119575. #elif defined(__clang__)
  119576. "adcs r1, r5\n\t"
  119577. #else
  119578. "adc r1, r5\n\t"
  119579. #endif
  119580. #ifdef WOLFSSL_KEIL
  119581. "adcs r2, r2, r5\n\t"
  119582. #elif defined(__clang__)
  119583. "adcs r2, r5\n\t"
  119584. #else
  119585. "adc r2, r5\n\t"
  119586. #endif
  119587. #ifdef WOLFSSL_KEIL
  119588. "adcs r3, r3, r5\n\t"
  119589. #elif defined(__clang__)
  119590. "adcs r3, r5\n\t"
  119591. #else
  119592. "adc r3, r5\n\t"
  119593. #endif
  119594. #ifdef WOLFSSL_KEIL
  119595. "adcs r4, r4, r5\n\t"
  119596. #elif defined(__clang__)
  119597. "adcs r4, r5\n\t"
  119598. #else
  119599. "adc r4, r5\n\t"
  119600. #endif
  119601. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119602. "ldr r1, [%[a]]\n\t"
  119603. "ldr r2, [%[a], #4]\n\t"
  119604. "ldr r3, [%[a], #8]\n\t"
  119605. "ldr r4, [%[a], #12]\n\t"
  119606. #ifdef WOLFSSL_KEIL
  119607. "adcs r1, r1, r5\n\t"
  119608. #elif defined(__clang__)
  119609. "adcs r1, r5\n\t"
  119610. #else
  119611. "adc r1, r5\n\t"
  119612. #endif
  119613. #ifdef WOLFSSL_KEIL
  119614. "adcs r2, r2, r5\n\t"
  119615. #elif defined(__clang__)
  119616. "adcs r2, r5\n\t"
  119617. #else
  119618. "adc r2, r5\n\t"
  119619. #endif
  119620. #ifdef WOLFSSL_KEIL
  119621. "adcs r3, r3, r5\n\t"
  119622. #elif defined(__clang__)
  119623. "adcs r3, r5\n\t"
  119624. #else
  119625. "adc r3, r5\n\t"
  119626. #endif
  119627. #ifdef WOLFSSL_KEIL
  119628. "adcs r4, r4, r5\n\t"
  119629. #elif defined(__clang__)
  119630. "adcs r4, r5\n\t"
  119631. #else
  119632. "adc r4, r5\n\t"
  119633. #endif
  119634. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119635. "ldr r1, [%[a]]\n\t"
  119636. "ldr r2, [%[a], #4]\n\t"
  119637. "ldr r3, [%[a], #8]\n\t"
  119638. "ldr r4, [%[a], #12]\n\t"
  119639. #ifdef WOLFSSL_KEIL
  119640. "adcs r1, r1, r5\n\t"
  119641. #elif defined(__clang__)
  119642. "adcs r1, r5\n\t"
  119643. #else
  119644. "adc r1, r5\n\t"
  119645. #endif
  119646. #ifdef WOLFSSL_KEIL
  119647. "adcs r2, r2, r5\n\t"
  119648. #elif defined(__clang__)
  119649. "adcs r2, r5\n\t"
  119650. #else
  119651. "adc r2, r5\n\t"
  119652. #endif
  119653. #ifdef WOLFSSL_KEIL
  119654. "adcs r3, r3, r5\n\t"
  119655. #elif defined(__clang__)
  119656. "adcs r3, r5\n\t"
  119657. #else
  119658. "adc r3, r5\n\t"
  119659. #endif
  119660. #ifdef WOLFSSL_KEIL
  119661. "adcs r4, r4, r5\n\t"
  119662. #elif defined(__clang__)
  119663. "adcs r4, r5\n\t"
  119664. #else
  119665. "adc r4, r5\n\t"
  119666. #endif
  119667. "stm %[a]!, {r1, r2, r3, r4}\n\t"
  119668. "ldr r1, [%[a]]\n\t"
  119669. #ifdef WOLFSSL_KEIL
  119670. "adcs r1, r1, r5\n\t"
  119671. #elif defined(__clang__)
  119672. "adcs r1, r5\n\t"
  119673. #else
  119674. "adc r1, r5\n\t"
  119675. #endif
  119676. "stm %[a]!, {r1}\n\t"
  119677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119678. "subs %[a], %[a], #0x44\n\t"
  119679. #else
  119680. "sub %[a], %[a], #0x44\n\t"
  119681. #endif
  119682. "add sp, sp, #0x44\n\t"
  119683. : [a] "+l" (a)
  119684. :
  119685. : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8"
  119686. );
  119687. }
  119688. /* Reduce the number back to 521 bits using Montgomery reduction.
  119689. *
  119690. * a A single precision number to reduce in place.
  119691. * m The single precision number representing the modulus.
  119692. * mp The digit representing the negative inverse of m mod 2^n.
  119693. */
  119694. SP_NOINLINE static void sp_521_mont_reduce_order_17(sp_digit* a,
  119695. const sp_digit* m, sp_digit mp)
  119696. {
  119697. __asm__ __volatile__ (
  119698. "movs r7, #0\n\t"
  119699. "mov r8, %[mp]\n\t"
  119700. "mov r12, r7\n\t"
  119701. "mov lr, %[m]\n\t"
  119702. "mov r9, %[a]\n\t"
  119703. "mov r11, %[a]\n\t"
  119704. "movs r5, #0x40\n\t"
  119705. "movs r6, #0x44\n\t"
  119706. "add r9, r9, r5\n\t"
  119707. "add r11, r11, r6\n\t"
  119708. "\n"
  119709. "L_sp_521_mont_reduce_order_17_mod_%=:\n\t"
  119710. "movs r7, #0\n\t"
  119711. "movs r4, #0\n\t"
  119712. "# a[i] += m[0] * mu\n\t"
  119713. "ldm %[m]!, {%[mp]}\n\t"
  119714. "ldr r3, [%[a]]\n\t"
  119715. "# mu = a[i] * mp\n\t"
  119716. "mov r5, r8\n\t"
  119717. #ifdef WOLFSSL_KEIL
  119718. "muls r5, r3, r5\n\t"
  119719. #elif defined(__clang__)
  119720. "muls r5, r3\n\t"
  119721. #else
  119722. "mul r5, r3\n\t"
  119723. #endif
  119724. "mov r6, r11\n\t"
  119725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119726. "subs r6, r6, #4\n\t"
  119727. #else
  119728. "sub r6, r6, #4\n\t"
  119729. #endif
  119730. "cmp %[a], r6\n\t"
  119731. "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t"
  119732. "movs r6, #1\n\t"
  119733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119734. "lsls r6, r6, #8\n\t"
  119735. #else
  119736. "lsl r6, r6, #8\n\t"
  119737. #endif
  119738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119739. "adds r6, r6, #0xff\n\t"
  119740. #else
  119741. "add r6, r6, #0xff\n\t"
  119742. #endif
  119743. #ifdef WOLFSSL_KEIL
  119744. "ands r5, r5, r6\n\t"
  119745. #elif defined(__clang__)
  119746. "ands r5, r6\n\t"
  119747. #else
  119748. "and r5, r6\n\t"
  119749. #endif
  119750. "\n"
  119751. "L_sp_521_mont_reduce_order_17_nomask_%=:\n\t"
  119752. "mov r10, r5\n\t"
  119753. "# Multiply m[0] and mu - Start\n\t"
  119754. "mov r5, r10\n\t"
  119755. "uxth r6, %[mp]\n\t"
  119756. "uxth r5, r5\n\t"
  119757. #ifdef WOLFSSL_KEIL
  119758. "muls r6, r5, r6\n\t"
  119759. #elif defined(__clang__)
  119760. "muls r6, r5\n\t"
  119761. #else
  119762. "mul r6, r5\n\t"
  119763. #endif
  119764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119765. "adds r3, r3, r6\n\t"
  119766. #else
  119767. "add r3, r3, r6\n\t"
  119768. #endif
  119769. #ifdef WOLFSSL_KEIL
  119770. "adcs r4, r4, r7\n\t"
  119771. #elif defined(__clang__)
  119772. "adcs r4, r7\n\t"
  119773. #else
  119774. "adc r4, r7\n\t"
  119775. #endif
  119776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119777. "lsrs r6, %[mp], #16\n\t"
  119778. #else
  119779. "lsr r6, %[mp], #16\n\t"
  119780. #endif
  119781. #ifdef WOLFSSL_KEIL
  119782. "muls r5, r6, r5\n\t"
  119783. #elif defined(__clang__)
  119784. "muls r5, r6\n\t"
  119785. #else
  119786. "mul r5, r6\n\t"
  119787. #endif
  119788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119789. "lsrs r6, r5, #16\n\t"
  119790. #else
  119791. "lsr r6, r5, #16\n\t"
  119792. #endif
  119793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119794. "lsls r5, r5, #16\n\t"
  119795. #else
  119796. "lsl r5, r5, #16\n\t"
  119797. #endif
  119798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119799. "adds r3, r3, r5\n\t"
  119800. #else
  119801. "add r3, r3, r5\n\t"
  119802. #endif
  119803. #ifdef WOLFSSL_KEIL
  119804. "adcs r4, r4, r6\n\t"
  119805. #elif defined(__clang__)
  119806. "adcs r4, r6\n\t"
  119807. #else
  119808. "adc r4, r6\n\t"
  119809. #endif
  119810. "mov r5, r10\n\t"
  119811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119812. "lsrs r6, %[mp], #16\n\t"
  119813. #else
  119814. "lsr r6, %[mp], #16\n\t"
  119815. #endif
  119816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119817. "lsrs r5, r5, #16\n\t"
  119818. #else
  119819. "lsr r5, r5, #16\n\t"
  119820. #endif
  119821. #ifdef WOLFSSL_KEIL
  119822. "muls r6, r5, r6\n\t"
  119823. #elif defined(__clang__)
  119824. "muls r6, r5\n\t"
  119825. #else
  119826. "mul r6, r5\n\t"
  119827. #endif
  119828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119829. "adds r4, r4, r6\n\t"
  119830. #else
  119831. "add r4, r4, r6\n\t"
  119832. #endif
  119833. "uxth r6, %[mp]\n\t"
  119834. #ifdef WOLFSSL_KEIL
  119835. "muls r5, r6, r5\n\t"
  119836. #elif defined(__clang__)
  119837. "muls r5, r6\n\t"
  119838. #else
  119839. "mul r5, r6\n\t"
  119840. #endif
  119841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119842. "lsrs r6, r5, #16\n\t"
  119843. #else
  119844. "lsr r6, r5, #16\n\t"
  119845. #endif
  119846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119847. "lsls r5, r5, #16\n\t"
  119848. #else
  119849. "lsl r5, r5, #16\n\t"
  119850. #endif
  119851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119852. "adds r3, r3, r5\n\t"
  119853. #else
  119854. "add r3, r3, r5\n\t"
  119855. #endif
  119856. #ifdef WOLFSSL_KEIL
  119857. "adcs r4, r4, r6\n\t"
  119858. #elif defined(__clang__)
  119859. "adcs r4, r6\n\t"
  119860. #else
  119861. "adc r4, r6\n\t"
  119862. #endif
  119863. "# Multiply m[0] and mu - Done\n\t"
  119864. "stm %[a]!, {r3}\n\t"
  119865. "\n"
  119866. "L_sp_521_mont_reduce_order_17_word_%=:\n\t"
  119867. "# a[i+j] += m[j] * mu\n\t"
  119868. "ldr r3, [%[a]]\n\t"
  119869. "ldm %[m]!, {%[mp]}\n\t"
  119870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119871. "adds r3, r3, r4\n\t"
  119872. #else
  119873. "add r3, r3, r4\n\t"
  119874. #endif
  119875. "movs r4, #0\n\t"
  119876. #ifdef WOLFSSL_KEIL
  119877. "adcs r4, r4, r7\n\t"
  119878. #elif defined(__clang__)
  119879. "adcs r4, r7\n\t"
  119880. #else
  119881. "adc r4, r7\n\t"
  119882. #endif
  119883. "# Multiply m[j] and mu - Start\n\t"
  119884. "mov r5, r10\n\t"
  119885. "uxth r6, %[mp]\n\t"
  119886. "uxth r5, r5\n\t"
  119887. #ifdef WOLFSSL_KEIL
  119888. "muls r6, r5, r6\n\t"
  119889. #elif defined(__clang__)
  119890. "muls r6, r5\n\t"
  119891. #else
  119892. "mul r6, r5\n\t"
  119893. #endif
  119894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119895. "adds r3, r3, r6\n\t"
  119896. #else
  119897. "add r3, r3, r6\n\t"
  119898. #endif
  119899. #ifdef WOLFSSL_KEIL
  119900. "adcs r4, r4, r7\n\t"
  119901. #elif defined(__clang__)
  119902. "adcs r4, r7\n\t"
  119903. #else
  119904. "adc r4, r7\n\t"
  119905. #endif
  119906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119907. "lsrs r6, %[mp], #16\n\t"
  119908. #else
  119909. "lsr r6, %[mp], #16\n\t"
  119910. #endif
  119911. #ifdef WOLFSSL_KEIL
  119912. "muls r5, r6, r5\n\t"
  119913. #elif defined(__clang__)
  119914. "muls r5, r6\n\t"
  119915. #else
  119916. "mul r5, r6\n\t"
  119917. #endif
  119918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119919. "lsrs r6, r5, #16\n\t"
  119920. #else
  119921. "lsr r6, r5, #16\n\t"
  119922. #endif
  119923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119924. "lsls r5, r5, #16\n\t"
  119925. #else
  119926. "lsl r5, r5, #16\n\t"
  119927. #endif
  119928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119929. "adds r3, r3, r5\n\t"
  119930. #else
  119931. "add r3, r3, r5\n\t"
  119932. #endif
  119933. #ifdef WOLFSSL_KEIL
  119934. "adcs r4, r4, r6\n\t"
  119935. #elif defined(__clang__)
  119936. "adcs r4, r6\n\t"
  119937. #else
  119938. "adc r4, r6\n\t"
  119939. #endif
  119940. "mov r5, r10\n\t"
  119941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119942. "lsrs r6, %[mp], #16\n\t"
  119943. #else
  119944. "lsr r6, %[mp], #16\n\t"
  119945. #endif
  119946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119947. "lsrs r5, r5, #16\n\t"
  119948. #else
  119949. "lsr r5, r5, #16\n\t"
  119950. #endif
  119951. #ifdef WOLFSSL_KEIL
  119952. "muls r6, r5, r6\n\t"
  119953. #elif defined(__clang__)
  119954. "muls r6, r5\n\t"
  119955. #else
  119956. "mul r6, r5\n\t"
  119957. #endif
  119958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119959. "adds r4, r4, r6\n\t"
  119960. #else
  119961. "add r4, r4, r6\n\t"
  119962. #endif
  119963. "uxth r6, %[mp]\n\t"
  119964. #ifdef WOLFSSL_KEIL
  119965. "muls r5, r6, r5\n\t"
  119966. #elif defined(__clang__)
  119967. "muls r5, r6\n\t"
  119968. #else
  119969. "mul r5, r6\n\t"
  119970. #endif
  119971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119972. "lsrs r6, r5, #16\n\t"
  119973. #else
  119974. "lsr r6, r5, #16\n\t"
  119975. #endif
  119976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119977. "lsls r5, r5, #16\n\t"
  119978. #else
  119979. "lsl r5, r5, #16\n\t"
  119980. #endif
  119981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  119982. "adds r3, r3, r5\n\t"
  119983. #else
  119984. "add r3, r3, r5\n\t"
  119985. #endif
  119986. #ifdef WOLFSSL_KEIL
  119987. "adcs r4, r4, r6\n\t"
  119988. #elif defined(__clang__)
  119989. "adcs r4, r6\n\t"
  119990. #else
  119991. "adc r4, r6\n\t"
  119992. #endif
  119993. "# Multiply m[j] and mu - Done\n\t"
  119994. "stm %[a]!, {r3}\n\t"
  119995. "cmp %[a], r9\n\t"
  119996. "blt L_sp_521_mont_reduce_order_17_word_%=\n\t"
  119997. "# a[i+16] += m[16] * mu\n\t"
  119998. "ldr %[mp], [%[m]]\n\t"
  119999. "mov r3, r12\n\t"
  120000. "# Multiply m[16] and mu - Start\n\t"
  120001. "mov r5, r10\n\t"
  120002. "uxth r6, %[mp]\n\t"
  120003. "uxth r5, r5\n\t"
  120004. #ifdef WOLFSSL_KEIL
  120005. "muls r6, r5, r6\n\t"
  120006. #elif defined(__clang__)
  120007. "muls r6, r5\n\t"
  120008. #else
  120009. "mul r6, r5\n\t"
  120010. #endif
  120011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120012. "adds r4, r4, r6\n\t"
  120013. #else
  120014. "add r4, r4, r6\n\t"
  120015. #endif
  120016. #ifdef WOLFSSL_KEIL
  120017. "adcs r3, r3, r7\n\t"
  120018. #elif defined(__clang__)
  120019. "adcs r3, r7\n\t"
  120020. #else
  120021. "adc r3, r7\n\t"
  120022. #endif
  120023. #ifdef WOLFSSL_KEIL
  120024. "adcs r7, r7, r7\n\t"
  120025. #elif defined(__clang__)
  120026. "adcs r7, r7\n\t"
  120027. #else
  120028. "adc r7, r7\n\t"
  120029. #endif
  120030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120031. "lsrs r6, %[mp], #16\n\t"
  120032. #else
  120033. "lsr r6, %[mp], #16\n\t"
  120034. #endif
  120035. #ifdef WOLFSSL_KEIL
  120036. "muls r5, r6, r5\n\t"
  120037. #elif defined(__clang__)
  120038. "muls r5, r6\n\t"
  120039. #else
  120040. "mul r5, r6\n\t"
  120041. #endif
  120042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120043. "lsrs r6, r5, #16\n\t"
  120044. #else
  120045. "lsr r6, r5, #16\n\t"
  120046. #endif
  120047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120048. "lsls r5, r5, #16\n\t"
  120049. #else
  120050. "lsl r5, r5, #16\n\t"
  120051. #endif
  120052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120053. "adds r4, r4, r5\n\t"
  120054. #else
  120055. "add r4, r4, r5\n\t"
  120056. #endif
  120057. #ifdef WOLFSSL_KEIL
  120058. "adcs r3, r3, r6\n\t"
  120059. #elif defined(__clang__)
  120060. "adcs r3, r6\n\t"
  120061. #else
  120062. "adc r3, r6\n\t"
  120063. #endif
  120064. #ifdef WOLFSSL_KEIL
  120065. "adcs r7, r7, r7\n\t"
  120066. #elif defined(__clang__)
  120067. "adcs r7, r7\n\t"
  120068. #else
  120069. "adc r7, r7\n\t"
  120070. #endif
  120071. "mov r5, r10\n\t"
  120072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120073. "lsrs r6, %[mp], #16\n\t"
  120074. #else
  120075. "lsr r6, %[mp], #16\n\t"
  120076. #endif
  120077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120078. "lsrs r5, r5, #16\n\t"
  120079. #else
  120080. "lsr r5, r5, #16\n\t"
  120081. #endif
  120082. #ifdef WOLFSSL_KEIL
  120083. "muls r6, r5, r6\n\t"
  120084. #elif defined(__clang__)
  120085. "muls r6, r5\n\t"
  120086. #else
  120087. "mul r6, r5\n\t"
  120088. #endif
  120089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120090. "adds r3, r3, r6\n\t"
  120091. #else
  120092. "add r3, r3, r6\n\t"
  120093. #endif
  120094. #ifdef WOLFSSL_KEIL
  120095. "adcs r7, r7, r7\n\t"
  120096. #elif defined(__clang__)
  120097. "adcs r7, r7\n\t"
  120098. #else
  120099. "adc r7, r7\n\t"
  120100. #endif
  120101. "uxth r6, %[mp]\n\t"
  120102. #ifdef WOLFSSL_KEIL
  120103. "muls r5, r6, r5\n\t"
  120104. #elif defined(__clang__)
  120105. "muls r5, r6\n\t"
  120106. #else
  120107. "mul r5, r6\n\t"
  120108. #endif
  120109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120110. "lsrs r6, r5, #16\n\t"
  120111. #else
  120112. "lsr r6, r5, #16\n\t"
  120113. #endif
  120114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120115. "lsls r5, r5, #16\n\t"
  120116. #else
  120117. "lsl r5, r5, #16\n\t"
  120118. #endif
  120119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120120. "adds r4, r4, r5\n\t"
  120121. #else
  120122. "add r4, r4, r5\n\t"
  120123. #endif
  120124. #ifdef WOLFSSL_KEIL
  120125. "adcs r3, r3, r6\n\t"
  120126. #elif defined(__clang__)
  120127. "adcs r3, r6\n\t"
  120128. #else
  120129. "adc r3, r6\n\t"
  120130. #endif
  120131. #ifdef WOLFSSL_KEIL
  120132. "adcs r7, r7, r7\n\t"
  120133. #elif defined(__clang__)
  120134. "adcs r7, r7\n\t"
  120135. #else
  120136. "adc r7, r7\n\t"
  120137. #endif
  120138. "# Multiply m[16] and mu - Done\n\t"
  120139. "ldr r5, [%[a]]\n\t"
  120140. "ldr r6, [%[a], #4]\n\t"
  120141. "movs %[mp], #0\n\t"
  120142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120143. "adds r5, r5, r4\n\t"
  120144. #else
  120145. "add r5, r5, r4\n\t"
  120146. #endif
  120147. #ifdef WOLFSSL_KEIL
  120148. "adcs r6, r6, r3\n\t"
  120149. #elif defined(__clang__)
  120150. "adcs r6, r3\n\t"
  120151. #else
  120152. "adc r6, r3\n\t"
  120153. #endif
  120154. #ifdef WOLFSSL_KEIL
  120155. "adcs r7, r7, %[mp]\n\t"
  120156. #elif defined(__clang__)
  120157. "adcs r7, %[mp]\n\t"
  120158. #else
  120159. "adc r7, %[mp]\n\t"
  120160. #endif
  120161. "stm %[a]!, {r5, r6}\n\t"
  120162. "# i += 1\n\t"
  120163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120164. "subs %[a], %[a], #4\n\t"
  120165. #else
  120166. "sub %[a], %[a], #4\n\t"
  120167. #endif
  120168. "movs r3, #0x40\n\t"
  120169. "mov r9, %[a]\n\t"
  120170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120171. "subs %[a], %[a], r3\n\t"
  120172. #else
  120173. "sub %[a], %[a], r3\n\t"
  120174. #endif
  120175. "mov r12, r7\n\t"
  120176. "mov %[m], lr\n\t"
  120177. "cmp r11, %[a]\n\t"
  120178. "bgt L_sp_521_mont_reduce_order_17_mod_%=\n\t"
  120179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120180. "subs %[a], %[a], #4\n\t"
  120181. #else
  120182. "sub %[a], %[a], #4\n\t"
  120183. #endif
  120184. "ldr r3, [%[a]]\n\t"
  120185. "ldr r4, [%[a], #4]\n\t"
  120186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120187. "lsrs r3, r3, #9\n\t"
  120188. #else
  120189. "lsr r3, r3, #9\n\t"
  120190. #endif
  120191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120192. "lsls r6, r4, #23\n\t"
  120193. #else
  120194. "lsl r6, r4, #23\n\t"
  120195. #endif
  120196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120197. "lsrs r4, r4, #9\n\t"
  120198. #else
  120199. "lsr r4, r4, #9\n\t"
  120200. #endif
  120201. #ifdef WOLFSSL_KEIL
  120202. "orrs r3, r3, r6\n\t"
  120203. #elif defined(__clang__)
  120204. "orrs r3, r6\n\t"
  120205. #else
  120206. "orr r3, r6\n\t"
  120207. #endif
  120208. "ldr r5, [%[a], #8]\n\t"
  120209. "str r3, [%[a], #4]\n\t"
  120210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120211. "lsls r6, r5, #23\n\t"
  120212. #else
  120213. "lsl r6, r5, #23\n\t"
  120214. #endif
  120215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120216. "lsrs r5, r5, #9\n\t"
  120217. #else
  120218. "lsr r5, r5, #9\n\t"
  120219. #endif
  120220. #ifdef WOLFSSL_KEIL
  120221. "orrs r4, r4, r6\n\t"
  120222. #elif defined(__clang__)
  120223. "orrs r4, r6\n\t"
  120224. #else
  120225. "orr r4, r6\n\t"
  120226. #endif
  120227. "ldr r3, [%[a], #12]\n\t"
  120228. "str r4, [%[a], #8]\n\t"
  120229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120230. "lsls r6, r3, #23\n\t"
  120231. #else
  120232. "lsl r6, r3, #23\n\t"
  120233. #endif
  120234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120235. "lsrs r3, r3, #9\n\t"
  120236. #else
  120237. "lsr r3, r3, #9\n\t"
  120238. #endif
  120239. #ifdef WOLFSSL_KEIL
  120240. "orrs r5, r5, r6\n\t"
  120241. #elif defined(__clang__)
  120242. "orrs r5, r6\n\t"
  120243. #else
  120244. "orr r5, r6\n\t"
  120245. #endif
  120246. "ldr r4, [%[a], #16]\n\t"
  120247. "str r5, [%[a], #12]\n\t"
  120248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120249. "lsls r6, r4, #23\n\t"
  120250. #else
  120251. "lsl r6, r4, #23\n\t"
  120252. #endif
  120253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120254. "lsrs r4, r4, #9\n\t"
  120255. #else
  120256. "lsr r4, r4, #9\n\t"
  120257. #endif
  120258. #ifdef WOLFSSL_KEIL
  120259. "orrs r3, r3, r6\n\t"
  120260. #elif defined(__clang__)
  120261. "orrs r3, r6\n\t"
  120262. #else
  120263. "orr r3, r6\n\t"
  120264. #endif
  120265. "ldr r5, [%[a], #20]\n\t"
  120266. "str r3, [%[a], #16]\n\t"
  120267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120268. "lsls r6, r5, #23\n\t"
  120269. #else
  120270. "lsl r6, r5, #23\n\t"
  120271. #endif
  120272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120273. "lsrs r5, r5, #9\n\t"
  120274. #else
  120275. "lsr r5, r5, #9\n\t"
  120276. #endif
  120277. #ifdef WOLFSSL_KEIL
  120278. "orrs r4, r4, r6\n\t"
  120279. #elif defined(__clang__)
  120280. "orrs r4, r6\n\t"
  120281. #else
  120282. "orr r4, r6\n\t"
  120283. #endif
  120284. "ldr r3, [%[a], #24]\n\t"
  120285. "str r4, [%[a], #20]\n\t"
  120286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120287. "lsls r6, r3, #23\n\t"
  120288. #else
  120289. "lsl r6, r3, #23\n\t"
  120290. #endif
  120291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120292. "lsrs r3, r3, #9\n\t"
  120293. #else
  120294. "lsr r3, r3, #9\n\t"
  120295. #endif
  120296. #ifdef WOLFSSL_KEIL
  120297. "orrs r5, r5, r6\n\t"
  120298. #elif defined(__clang__)
  120299. "orrs r5, r6\n\t"
  120300. #else
  120301. "orr r5, r6\n\t"
  120302. #endif
  120303. "ldr r4, [%[a], #28]\n\t"
  120304. "str r5, [%[a], #24]\n\t"
  120305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120306. "lsls r6, r4, #23\n\t"
  120307. #else
  120308. "lsl r6, r4, #23\n\t"
  120309. #endif
  120310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120311. "lsrs r4, r4, #9\n\t"
  120312. #else
  120313. "lsr r4, r4, #9\n\t"
  120314. #endif
  120315. #ifdef WOLFSSL_KEIL
  120316. "orrs r3, r3, r6\n\t"
  120317. #elif defined(__clang__)
  120318. "orrs r3, r6\n\t"
  120319. #else
  120320. "orr r3, r6\n\t"
  120321. #endif
  120322. "ldr r5, [%[a], #32]\n\t"
  120323. "str r3, [%[a], #28]\n\t"
  120324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120325. "lsls r6, r5, #23\n\t"
  120326. #else
  120327. "lsl r6, r5, #23\n\t"
  120328. #endif
  120329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120330. "lsrs r5, r5, #9\n\t"
  120331. #else
  120332. "lsr r5, r5, #9\n\t"
  120333. #endif
  120334. #ifdef WOLFSSL_KEIL
  120335. "orrs r4, r4, r6\n\t"
  120336. #elif defined(__clang__)
  120337. "orrs r4, r6\n\t"
  120338. #else
  120339. "orr r4, r6\n\t"
  120340. #endif
  120341. "ldr r3, [%[a], #36]\n\t"
  120342. "str r4, [%[a], #32]\n\t"
  120343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120344. "lsls r6, r3, #23\n\t"
  120345. #else
  120346. "lsl r6, r3, #23\n\t"
  120347. #endif
  120348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120349. "lsrs r3, r3, #9\n\t"
  120350. #else
  120351. "lsr r3, r3, #9\n\t"
  120352. #endif
  120353. #ifdef WOLFSSL_KEIL
  120354. "orrs r5, r5, r6\n\t"
  120355. #elif defined(__clang__)
  120356. "orrs r5, r6\n\t"
  120357. #else
  120358. "orr r5, r6\n\t"
  120359. #endif
  120360. "ldr r4, [%[a], #40]\n\t"
  120361. "str r5, [%[a], #36]\n\t"
  120362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120363. "lsls r6, r4, #23\n\t"
  120364. #else
  120365. "lsl r6, r4, #23\n\t"
  120366. #endif
  120367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120368. "lsrs r4, r4, #9\n\t"
  120369. #else
  120370. "lsr r4, r4, #9\n\t"
  120371. #endif
  120372. #ifdef WOLFSSL_KEIL
  120373. "orrs r3, r3, r6\n\t"
  120374. #elif defined(__clang__)
  120375. "orrs r3, r6\n\t"
  120376. #else
  120377. "orr r3, r6\n\t"
  120378. #endif
  120379. "ldr r5, [%[a], #44]\n\t"
  120380. "str r3, [%[a], #40]\n\t"
  120381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120382. "lsls r6, r5, #23\n\t"
  120383. #else
  120384. "lsl r6, r5, #23\n\t"
  120385. #endif
  120386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120387. "lsrs r5, r5, #9\n\t"
  120388. #else
  120389. "lsr r5, r5, #9\n\t"
  120390. #endif
  120391. #ifdef WOLFSSL_KEIL
  120392. "orrs r4, r4, r6\n\t"
  120393. #elif defined(__clang__)
  120394. "orrs r4, r6\n\t"
  120395. #else
  120396. "orr r4, r6\n\t"
  120397. #endif
  120398. "ldr r3, [%[a], #48]\n\t"
  120399. "str r4, [%[a], #44]\n\t"
  120400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120401. "lsls r6, r3, #23\n\t"
  120402. #else
  120403. "lsl r6, r3, #23\n\t"
  120404. #endif
  120405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120406. "lsrs r3, r3, #9\n\t"
  120407. #else
  120408. "lsr r3, r3, #9\n\t"
  120409. #endif
  120410. #ifdef WOLFSSL_KEIL
  120411. "orrs r5, r5, r6\n\t"
  120412. #elif defined(__clang__)
  120413. "orrs r5, r6\n\t"
  120414. #else
  120415. "orr r5, r6\n\t"
  120416. #endif
  120417. "ldr r4, [%[a], #52]\n\t"
  120418. "str r5, [%[a], #48]\n\t"
  120419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120420. "lsls r6, r4, #23\n\t"
  120421. #else
  120422. "lsl r6, r4, #23\n\t"
  120423. #endif
  120424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120425. "lsrs r4, r4, #9\n\t"
  120426. #else
  120427. "lsr r4, r4, #9\n\t"
  120428. #endif
  120429. #ifdef WOLFSSL_KEIL
  120430. "orrs r3, r3, r6\n\t"
  120431. #elif defined(__clang__)
  120432. "orrs r3, r6\n\t"
  120433. #else
  120434. "orr r3, r6\n\t"
  120435. #endif
  120436. "ldr r5, [%[a], #56]\n\t"
  120437. "str r3, [%[a], #52]\n\t"
  120438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120439. "lsls r6, r5, #23\n\t"
  120440. #else
  120441. "lsl r6, r5, #23\n\t"
  120442. #endif
  120443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120444. "lsrs r5, r5, #9\n\t"
  120445. #else
  120446. "lsr r5, r5, #9\n\t"
  120447. #endif
  120448. #ifdef WOLFSSL_KEIL
  120449. "orrs r4, r4, r6\n\t"
  120450. #elif defined(__clang__)
  120451. "orrs r4, r6\n\t"
  120452. #else
  120453. "orr r4, r6\n\t"
  120454. #endif
  120455. "ldr r3, [%[a], #60]\n\t"
  120456. "str r4, [%[a], #56]\n\t"
  120457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120458. "lsls r6, r3, #23\n\t"
  120459. #else
  120460. "lsl r6, r3, #23\n\t"
  120461. #endif
  120462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120463. "lsrs r3, r3, #9\n\t"
  120464. #else
  120465. "lsr r3, r3, #9\n\t"
  120466. #endif
  120467. #ifdef WOLFSSL_KEIL
  120468. "orrs r5, r5, r6\n\t"
  120469. #elif defined(__clang__)
  120470. "orrs r5, r6\n\t"
  120471. #else
  120472. "orr r5, r6\n\t"
  120473. #endif
  120474. "ldr r4, [%[a], #64]\n\t"
  120475. "str r5, [%[a], #60]\n\t"
  120476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120477. "lsls r6, r4, #23\n\t"
  120478. #else
  120479. "lsl r6, r4, #23\n\t"
  120480. #endif
  120481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120482. "lsrs r4, r4, #9\n\t"
  120483. #else
  120484. "lsr r4, r4, #9\n\t"
  120485. #endif
  120486. #ifdef WOLFSSL_KEIL
  120487. "orrs r3, r3, r6\n\t"
  120488. #elif defined(__clang__)
  120489. "orrs r3, r6\n\t"
  120490. #else
  120491. "orr r3, r6\n\t"
  120492. #endif
  120493. "str r3, [%[a], #64]\n\t"
  120494. "movs r7, r4\n\t"
  120495. "str r4, [%[a], #68]\n\t"
  120496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120497. "lsrs r7, r7, #9\n\t"
  120498. #else
  120499. "lsr r7, r7, #9\n\t"
  120500. #endif
  120501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120502. "adds %[a], %[a], #4\n\t"
  120503. #else
  120504. "add %[a], %[a], #4\n\t"
  120505. #endif
  120506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120507. "negs r7, r7\n\t"
  120508. #else
  120509. "neg r7, r7\n\t"
  120510. #endif
  120511. "# Subtract masked modulus\n\t"
  120512. "movs r4, #0x44\n\t"
  120513. "movs %[mp], #0\n\t"
  120514. "movs r3, #0\n\t"
  120515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120516. "subs %[a], %[a], r4\n\t"
  120517. #else
  120518. "sub %[a], %[a], r4\n\t"
  120519. #endif
  120520. #ifndef WOLFSSL_SP_LARGE_CODE
  120521. "\n"
  120522. "L_sp_521_mont_reduce_order_17_sub_mask_%=:\n\t"
  120523. "ldm %[m]!, {r6}\n\t"
  120524. "movs r5, #0\n\t"
  120525. #ifdef WOLFSSL_KEIL
  120526. "ands r6, r6, r7\n\t"
  120527. #elif defined(__clang__)
  120528. "ands r6, r7\n\t"
  120529. #else
  120530. "and r6, r7\n\t"
  120531. #endif
  120532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120533. "subs r5, r5, %[mp]\n\t"
  120534. #else
  120535. "sub r5, r5, %[mp]\n\t"
  120536. #endif
  120537. "ldr r5, [%[a], r4]\n\t"
  120538. #ifdef WOLFSSL_KEIL
  120539. "sbcs r5, r5, r6\n\t"
  120540. #elif defined(__clang__)
  120541. "sbcs r5, r6\n\t"
  120542. #else
  120543. "sbc r5, r6\n\t"
  120544. #endif
  120545. #ifdef WOLFSSL_KEIL
  120546. "sbcs %[mp], %[mp], %[mp]\n\t"
  120547. #elif defined(__clang__)
  120548. "sbcs %[mp], %[mp]\n\t"
  120549. #else
  120550. "sbc %[mp], %[mp]\n\t"
  120551. #endif
  120552. "stm %[a]!, {r5}\n\t"
  120553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120554. "adds r3, r3, #4\n\t"
  120555. #else
  120556. "add r3, r3, #4\n\t"
  120557. #endif
  120558. "cmp r3, r4\n\t"
  120559. "blt L_sp_521_mont_reduce_order_17_sub_mask_%=\n\t"
  120560. #else /* WOLFSSL_SP_LARGE_CODE */
  120561. "ldm %[m]!, {r6}\n\t"
  120562. #ifdef WOLFSSL_KEIL
  120563. "ands r6, r6, r7\n\t"
  120564. #elif defined(__clang__)
  120565. "ands r6, r7\n\t"
  120566. #else
  120567. "and r6, r7\n\t"
  120568. #endif
  120569. "ldr r5, [%[a], r4]\n\t"
  120570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120571. "subs r5, r5, r6\n\t"
  120572. #else
  120573. "sub r5, r5, r6\n\t"
  120574. #endif
  120575. "stm %[a]!, {r5}\n\t"
  120576. "ldm %[m]!, {r6}\n\t"
  120577. #ifdef WOLFSSL_KEIL
  120578. "ands r6, r6, r7\n\t"
  120579. #elif defined(__clang__)
  120580. "ands r6, r7\n\t"
  120581. #else
  120582. "and r6, r7\n\t"
  120583. #endif
  120584. "ldr r5, [%[a], r4]\n\t"
  120585. #ifdef WOLFSSL_KEIL
  120586. "sbcs r5, r5, r6\n\t"
  120587. #elif defined(__clang__)
  120588. "sbcs r5, r6\n\t"
  120589. #else
  120590. "sbc r5, r6\n\t"
  120591. #endif
  120592. "stm %[a]!, {r5}\n\t"
  120593. "ldm %[m]!, {r6}\n\t"
  120594. #ifdef WOLFSSL_KEIL
  120595. "ands r6, r6, r7\n\t"
  120596. #elif defined(__clang__)
  120597. "ands r6, r7\n\t"
  120598. #else
  120599. "and r6, r7\n\t"
  120600. #endif
  120601. "ldr r5, [%[a], r4]\n\t"
  120602. #ifdef WOLFSSL_KEIL
  120603. "sbcs r5, r5, r6\n\t"
  120604. #elif defined(__clang__)
  120605. "sbcs r5, r6\n\t"
  120606. #else
  120607. "sbc r5, r6\n\t"
  120608. #endif
  120609. "stm %[a]!, {r5}\n\t"
  120610. "ldm %[m]!, {r6}\n\t"
  120611. #ifdef WOLFSSL_KEIL
  120612. "ands r6, r6, r7\n\t"
  120613. #elif defined(__clang__)
  120614. "ands r6, r7\n\t"
  120615. #else
  120616. "and r6, r7\n\t"
  120617. #endif
  120618. "ldr r5, [%[a], r4]\n\t"
  120619. #ifdef WOLFSSL_KEIL
  120620. "sbcs r5, r5, r6\n\t"
  120621. #elif defined(__clang__)
  120622. "sbcs r5, r6\n\t"
  120623. #else
  120624. "sbc r5, r6\n\t"
  120625. #endif
  120626. "stm %[a]!, {r5}\n\t"
  120627. "ldm %[m]!, {r6}\n\t"
  120628. #ifdef WOLFSSL_KEIL
  120629. "ands r6, r6, r7\n\t"
  120630. #elif defined(__clang__)
  120631. "ands r6, r7\n\t"
  120632. #else
  120633. "and r6, r7\n\t"
  120634. #endif
  120635. "ldr r5, [%[a], r4]\n\t"
  120636. #ifdef WOLFSSL_KEIL
  120637. "sbcs r5, r5, r6\n\t"
  120638. #elif defined(__clang__)
  120639. "sbcs r5, r6\n\t"
  120640. #else
  120641. "sbc r5, r6\n\t"
  120642. #endif
  120643. "stm %[a]!, {r5}\n\t"
  120644. "ldm %[m]!, {r6}\n\t"
  120645. #ifdef WOLFSSL_KEIL
  120646. "ands r6, r6, r7\n\t"
  120647. #elif defined(__clang__)
  120648. "ands r6, r7\n\t"
  120649. #else
  120650. "and r6, r7\n\t"
  120651. #endif
  120652. "ldr r5, [%[a], r4]\n\t"
  120653. #ifdef WOLFSSL_KEIL
  120654. "sbcs r5, r5, r6\n\t"
  120655. #elif defined(__clang__)
  120656. "sbcs r5, r6\n\t"
  120657. #else
  120658. "sbc r5, r6\n\t"
  120659. #endif
  120660. "stm %[a]!, {r5}\n\t"
  120661. "ldm %[m]!, {r6}\n\t"
  120662. #ifdef WOLFSSL_KEIL
  120663. "ands r6, r6, r7\n\t"
  120664. #elif defined(__clang__)
  120665. "ands r6, r7\n\t"
  120666. #else
  120667. "and r6, r7\n\t"
  120668. #endif
  120669. "ldr r5, [%[a], r4]\n\t"
  120670. #ifdef WOLFSSL_KEIL
  120671. "sbcs r5, r5, r6\n\t"
  120672. #elif defined(__clang__)
  120673. "sbcs r5, r6\n\t"
  120674. #else
  120675. "sbc r5, r6\n\t"
  120676. #endif
  120677. "stm %[a]!, {r5}\n\t"
  120678. "ldm %[m]!, {r6}\n\t"
  120679. #ifdef WOLFSSL_KEIL
  120680. "ands r6, r6, r7\n\t"
  120681. #elif defined(__clang__)
  120682. "ands r6, r7\n\t"
  120683. #else
  120684. "and r6, r7\n\t"
  120685. #endif
  120686. "ldr r5, [%[a], r4]\n\t"
  120687. #ifdef WOLFSSL_KEIL
  120688. "sbcs r5, r5, r6\n\t"
  120689. #elif defined(__clang__)
  120690. "sbcs r5, r6\n\t"
  120691. #else
  120692. "sbc r5, r6\n\t"
  120693. #endif
  120694. "stm %[a]!, {r5}\n\t"
  120695. "ldm %[m]!, {r6}\n\t"
  120696. #ifdef WOLFSSL_KEIL
  120697. "ands r6, r6, r7\n\t"
  120698. #elif defined(__clang__)
  120699. "ands r6, r7\n\t"
  120700. #else
  120701. "and r6, r7\n\t"
  120702. #endif
  120703. "ldr r5, [%[a], r4]\n\t"
  120704. #ifdef WOLFSSL_KEIL
  120705. "sbcs r5, r5, r6\n\t"
  120706. #elif defined(__clang__)
  120707. "sbcs r5, r6\n\t"
  120708. #else
  120709. "sbc r5, r6\n\t"
  120710. #endif
  120711. "stm %[a]!, {r5}\n\t"
  120712. "ldm %[m]!, {r6}\n\t"
  120713. #ifdef WOLFSSL_KEIL
  120714. "ands r6, r6, r7\n\t"
  120715. #elif defined(__clang__)
  120716. "ands r6, r7\n\t"
  120717. #else
  120718. "and r6, r7\n\t"
  120719. #endif
  120720. "ldr r5, [%[a], r4]\n\t"
  120721. #ifdef WOLFSSL_KEIL
  120722. "sbcs r5, r5, r6\n\t"
  120723. #elif defined(__clang__)
  120724. "sbcs r5, r6\n\t"
  120725. #else
  120726. "sbc r5, r6\n\t"
  120727. #endif
  120728. "stm %[a]!, {r5}\n\t"
  120729. "ldm %[m]!, {r6}\n\t"
  120730. #ifdef WOLFSSL_KEIL
  120731. "ands r6, r6, r7\n\t"
  120732. #elif defined(__clang__)
  120733. "ands r6, r7\n\t"
  120734. #else
  120735. "and r6, r7\n\t"
  120736. #endif
  120737. "ldr r5, [%[a], r4]\n\t"
  120738. #ifdef WOLFSSL_KEIL
  120739. "sbcs r5, r5, r6\n\t"
  120740. #elif defined(__clang__)
  120741. "sbcs r5, r6\n\t"
  120742. #else
  120743. "sbc r5, r6\n\t"
  120744. #endif
  120745. "stm %[a]!, {r5}\n\t"
  120746. "ldm %[m]!, {r6}\n\t"
  120747. #ifdef WOLFSSL_KEIL
  120748. "ands r6, r6, r7\n\t"
  120749. #elif defined(__clang__)
  120750. "ands r6, r7\n\t"
  120751. #else
  120752. "and r6, r7\n\t"
  120753. #endif
  120754. "ldr r5, [%[a], r4]\n\t"
  120755. #ifdef WOLFSSL_KEIL
  120756. "sbcs r5, r5, r6\n\t"
  120757. #elif defined(__clang__)
  120758. "sbcs r5, r6\n\t"
  120759. #else
  120760. "sbc r5, r6\n\t"
  120761. #endif
  120762. "stm %[a]!, {r5}\n\t"
  120763. "ldm %[m]!, {r6}\n\t"
  120764. #ifdef WOLFSSL_KEIL
  120765. "ands r6, r6, r7\n\t"
  120766. #elif defined(__clang__)
  120767. "ands r6, r7\n\t"
  120768. #else
  120769. "and r6, r7\n\t"
  120770. #endif
  120771. "ldr r5, [%[a], r4]\n\t"
  120772. #ifdef WOLFSSL_KEIL
  120773. "sbcs r5, r5, r6\n\t"
  120774. #elif defined(__clang__)
  120775. "sbcs r5, r6\n\t"
  120776. #else
  120777. "sbc r5, r6\n\t"
  120778. #endif
  120779. "stm %[a]!, {r5}\n\t"
  120780. "ldm %[m]!, {r6}\n\t"
  120781. #ifdef WOLFSSL_KEIL
  120782. "ands r6, r6, r7\n\t"
  120783. #elif defined(__clang__)
  120784. "ands r6, r7\n\t"
  120785. #else
  120786. "and r6, r7\n\t"
  120787. #endif
  120788. "ldr r5, [%[a], r4]\n\t"
  120789. #ifdef WOLFSSL_KEIL
  120790. "sbcs r5, r5, r6\n\t"
  120791. #elif defined(__clang__)
  120792. "sbcs r5, r6\n\t"
  120793. #else
  120794. "sbc r5, r6\n\t"
  120795. #endif
  120796. "stm %[a]!, {r5}\n\t"
  120797. "ldm %[m]!, {r6}\n\t"
  120798. #ifdef WOLFSSL_KEIL
  120799. "ands r6, r6, r7\n\t"
  120800. #elif defined(__clang__)
  120801. "ands r6, r7\n\t"
  120802. #else
  120803. "and r6, r7\n\t"
  120804. #endif
  120805. "ldr r5, [%[a], r4]\n\t"
  120806. #ifdef WOLFSSL_KEIL
  120807. "sbcs r5, r5, r6\n\t"
  120808. #elif defined(__clang__)
  120809. "sbcs r5, r6\n\t"
  120810. #else
  120811. "sbc r5, r6\n\t"
  120812. #endif
  120813. "stm %[a]!, {r5}\n\t"
  120814. "ldm %[m]!, {r6}\n\t"
  120815. #ifdef WOLFSSL_KEIL
  120816. "ands r6, r6, r7\n\t"
  120817. #elif defined(__clang__)
  120818. "ands r6, r7\n\t"
  120819. #else
  120820. "and r6, r7\n\t"
  120821. #endif
  120822. "ldr r5, [%[a], r4]\n\t"
  120823. #ifdef WOLFSSL_KEIL
  120824. "sbcs r5, r5, r6\n\t"
  120825. #elif defined(__clang__)
  120826. "sbcs r5, r6\n\t"
  120827. #else
  120828. "sbc r5, r6\n\t"
  120829. #endif
  120830. "stm %[a]!, {r5}\n\t"
  120831. "ldm %[m]!, {r6}\n\t"
  120832. #ifdef WOLFSSL_KEIL
  120833. "ands r6, r6, r7\n\t"
  120834. #elif defined(__clang__)
  120835. "ands r6, r7\n\t"
  120836. #else
  120837. "and r6, r7\n\t"
  120838. #endif
  120839. "ldr r5, [%[a], r4]\n\t"
  120840. #ifdef WOLFSSL_KEIL
  120841. "sbcs r5, r5, r6\n\t"
  120842. #elif defined(__clang__)
  120843. "sbcs r5, r6\n\t"
  120844. #else
  120845. "sbc r5, r6\n\t"
  120846. #endif
  120847. "stm %[a]!, {r5}\n\t"
  120848. #endif /* WOLFSSL_SP_LARGE_CODE */
  120849. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  120850. :
  120851. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  120852. );
  120853. }
  120854. /* Multiply two Montgomery form numbers mod the modulus (prime).
  120855. * (r = a * b mod m)
  120856. *
  120857. * r Result of multiplication.
  120858. * a First number to multiply in Montgomery form.
  120859. * b Second number to multiply in Montgomery form.
  120860. * m Modulus (prime).
  120861. * mp Montgomery mulitplier.
  120862. */
  120863. SP_NOINLINE static void sp_521_mont_mul_17(sp_digit* r, const sp_digit* a,
  120864. const sp_digit* b, const sp_digit* m, sp_digit mp)
  120865. {
  120866. sp_521_mul_17(r, a, b);
  120867. sp_521_mont_reduce_17(r, m, mp);
  120868. }
  120869. /* Square the Montgomery form number. (r = a * a mod m)
  120870. *
  120871. * r Result of squaring.
  120872. * a Number to square in Montgomery form.
  120873. * m Modulus (prime).
  120874. * mp Montgomery mulitplier.
  120875. */
  120876. SP_NOINLINE static void sp_521_mont_sqr_17(sp_digit* r, const sp_digit* a,
  120877. const sp_digit* m, sp_digit mp)
  120878. {
  120879. sp_521_sqr_17(r, a);
  120880. sp_521_mont_reduce_17(r, m, mp);
  120881. }
  120882. #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY)
  120883. /* Square the Montgomery form number a number of times. (r = a ^ n mod m)
  120884. *
  120885. * r Result of squaring.
  120886. * a Number to square in Montgomery form.
  120887. * n Number of times to square.
  120888. * m Modulus (prime).
  120889. * mp Montgomery mulitplier.
  120890. */
  120891. static void sp_521_mont_sqr_n_17(sp_digit* r, const sp_digit* a, int n,
  120892. const sp_digit* m, sp_digit mp)
  120893. {
  120894. sp_521_mont_sqr_17(r, a, m, mp);
  120895. for (; n > 1; n--) {
  120896. sp_521_mont_sqr_17(r, r, m, mp);
  120897. }
  120898. }
  120899. #endif /* !WOLFSSL_SP_SMALL | HAVE_COMP_KEY */
  120900. #ifdef WOLFSSL_SP_SMALL
  120901. /* Mod-2 for the P521 curve. */
  120902. static const uint32_t p521_mod_minus_2[17] = {
  120903. 0xfffffffdU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,
  120904. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,
  120905. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0x000001ffU
  120906. };
  120907. #endif /* !WOLFSSL_SP_SMALL */
  120908. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  120909. * P521 curve. (r = 1 / a mod m)
  120910. *
  120911. * r Inverse result.
  120912. * a Number to invert.
  120913. * td Temporary data.
  120914. */
  120915. static void sp_521_mont_inv_17(sp_digit* r, const sp_digit* a, sp_digit* td)
  120916. {
  120917. #ifdef WOLFSSL_SP_SMALL
  120918. sp_digit* t = td;
  120919. int i;
  120920. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  120921. for (i=519; i>=0; i--) {
  120922. sp_521_mont_sqr_17(t, t, p521_mod, p521_mp_mod);
  120923. if (p521_mod_minus_2[i / 32] & ((sp_digit)1 << (i % 32)))
  120924. sp_521_mont_mul_17(t, t, a, p521_mod, p521_mp_mod);
  120925. }
  120926. XMEMCPY(r, t, sizeof(sp_digit) * 17);
  120927. #else
  120928. sp_digit* t1 = td;
  120929. sp_digit* t2 = td + 2 * 17;
  120930. sp_digit* t3 = td + 4 * 17;
  120931. /* 0x2 */
  120932. sp_521_mont_sqr_17(t1, a, p521_mod, p521_mp_mod);
  120933. /* 0x3 */
  120934. sp_521_mont_mul_17(t2, t1, a, p521_mod, p521_mp_mod);
  120935. /* 0x6 */
  120936. sp_521_mont_sqr_17(t1, t2, p521_mod, p521_mp_mod);
  120937. /* 0x7 */
  120938. sp_521_mont_mul_17(t3, t1, a, p521_mod, p521_mp_mod);
  120939. /* 0xc */
  120940. sp_521_mont_sqr_n_17(t1, t2, 2, p521_mod, p521_mp_mod);
  120941. /* 0xf */
  120942. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  120943. /* 0x78 */
  120944. sp_521_mont_sqr_n_17(t1, t2, 3, p521_mod, p521_mp_mod);
  120945. /* 0x7f */
  120946. sp_521_mont_mul_17(t3, t3, t1, p521_mod, p521_mp_mod);
  120947. /* 0xf0 */
  120948. sp_521_mont_sqr_n_17(t1, t2, 4, p521_mod, p521_mp_mod);
  120949. /* 0xff */
  120950. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  120951. /* 0xff00 */
  120952. sp_521_mont_sqr_n_17(t1, t2, 8, p521_mod, p521_mp_mod);
  120953. /* 0xffff */
  120954. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  120955. /* 0xffff0000 */
  120956. sp_521_mont_sqr_n_17(t1, t2, 16, p521_mod, p521_mp_mod);
  120957. /* 0xffffffff */
  120958. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  120959. /* 0xffffffff00000000 */
  120960. sp_521_mont_sqr_n_17(t1, t2, 32, p521_mod, p521_mp_mod);
  120961. /* 0xffffffffffffffff */
  120962. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  120963. /* 0xffffffffffffffff0000000000000000 */
  120964. sp_521_mont_sqr_n_17(t1, t2, 64, p521_mod, p521_mp_mod);
  120965. /* 0xffffffffffffffffffffffffffffffff */
  120966. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  120967. /* 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000 */
  120968. sp_521_mont_sqr_n_17(t1, t2, 128, p521_mod, p521_mp_mod);
  120969. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  120970. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  120971. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000 */
  120972. sp_521_mont_sqr_n_17(t1, t2, 256, p521_mod, p521_mp_mod);
  120973. /* 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  120974. sp_521_mont_mul_17(t2, t2, t1, p521_mod, p521_mp_mod);
  120975. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80 */
  120976. sp_521_mont_sqr_n_17(t1, t2, 7, p521_mod, p521_mp_mod);
  120977. /* 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff */
  120978. sp_521_mont_mul_17(t2, t3, t1, p521_mod, p521_mp_mod);
  120979. /* 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc */
  120980. sp_521_mont_sqr_n_17(t1, t2, 2, p521_mod, p521_mp_mod);
  120981. /* 0x1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd */
  120982. sp_521_mont_mul_17(r, t1, a, p521_mod, p521_mp_mod);
  120983. #endif /* WOLFSSL_SP_SMALL */
  120984. }
  120985. /* Compare a with b in constant time.
  120986. *
  120987. * a A single precision integer.
  120988. * b A single precision integer.
  120989. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  120990. * respectively.
  120991. */
  120992. SP_NOINLINE static sp_int32 sp_521_cmp_17(const sp_digit* a, const sp_digit* b)
  120993. {
  120994. __asm__ __volatile__ (
  120995. "movs r2, #0\n\t"
  120996. "movs r3, #0\n\t"
  120997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  120998. "mvns r3, r3\n\t"
  120999. #else
  121000. "mvn r3, r3\n\t"
  121001. #endif
  121002. "movs r6, #0x40\n\t"
  121003. "\n"
  121004. "L_sp_521_cmp_17_words_%=:\n\t"
  121005. "ldr r7, [%[a], r6]\n\t"
  121006. "ldr r5, [%[b], r6]\n\t"
  121007. #ifdef WOLFSSL_KEIL
  121008. "ands r7, r7, r3\n\t"
  121009. #elif defined(__clang__)
  121010. "ands r7, r3\n\t"
  121011. #else
  121012. "and r7, r3\n\t"
  121013. #endif
  121014. #ifdef WOLFSSL_KEIL
  121015. "ands r5, r5, r3\n\t"
  121016. #elif defined(__clang__)
  121017. "ands r5, r3\n\t"
  121018. #else
  121019. "and r5, r3\n\t"
  121020. #endif
  121021. "movs r4, r7\n\t"
  121022. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121023. "subs r7, r7, r5\n\t"
  121024. #else
  121025. "sub r7, r7, r5\n\t"
  121026. #endif
  121027. #ifdef WOLFSSL_KEIL
  121028. "sbcs r7, r7, r7\n\t"
  121029. #elif defined(__clang__)
  121030. "sbcs r7, r7\n\t"
  121031. #else
  121032. "sbc r7, r7\n\t"
  121033. #endif
  121034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121035. "adds r2, r2, r7\n\t"
  121036. #else
  121037. "add r2, r2, r7\n\t"
  121038. #endif
  121039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121040. "mvns r7, r7\n\t"
  121041. #else
  121042. "mvn r7, r7\n\t"
  121043. #endif
  121044. #ifdef WOLFSSL_KEIL
  121045. "ands r3, r3, r7\n\t"
  121046. #elif defined(__clang__)
  121047. "ands r3, r7\n\t"
  121048. #else
  121049. "and r3, r7\n\t"
  121050. #endif
  121051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121052. "subs r5, r5, r4\n\t"
  121053. #else
  121054. "sub r5, r5, r4\n\t"
  121055. #endif
  121056. #ifdef WOLFSSL_KEIL
  121057. "sbcs r7, r7, r7\n\t"
  121058. #elif defined(__clang__)
  121059. "sbcs r7, r7\n\t"
  121060. #else
  121061. "sbc r7, r7\n\t"
  121062. #endif
  121063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121064. "subs r2, r2, r7\n\t"
  121065. #else
  121066. "sub r2, r2, r7\n\t"
  121067. #endif
  121068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121069. "mvns r7, r7\n\t"
  121070. #else
  121071. "mvn r7, r7\n\t"
  121072. #endif
  121073. #ifdef WOLFSSL_KEIL
  121074. "ands r3, r3, r7\n\t"
  121075. #elif defined(__clang__)
  121076. "ands r3, r7\n\t"
  121077. #else
  121078. "and r3, r7\n\t"
  121079. #endif
  121080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121081. "subs r6, r6, #4\n\t"
  121082. #else
  121083. "sub r6, r6, #4\n\t"
  121084. #endif
  121085. "bge L_sp_521_cmp_17_words_%=\n\t"
  121086. "movs %[a], r2\n\t"
  121087. : [a] "+l" (a), [b] "+l" (b)
  121088. :
  121089. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  121090. );
  121091. return (uint32_t)(size_t)a;
  121092. }
  121093. /* Normalize the values in each word to 32.
  121094. *
  121095. * a Array of sp_digit to normalize.
  121096. */
  121097. #define sp_521_norm_17(a)
  121098. /* Map the Montgomery form projective coordinate point to an affine point.
  121099. *
  121100. * r Resulting affine coordinate point.
  121101. * p Montgomery form projective coordinate point.
  121102. * t Temporary ordinate data.
  121103. */
  121104. static void sp_521_map_17(sp_point_521* r, const sp_point_521* p,
  121105. sp_digit* t)
  121106. {
  121107. sp_digit* t1 = t;
  121108. sp_digit* t2 = t + 2*17;
  121109. sp_int32 n;
  121110. sp_521_mont_inv_17(t1, p->z, t + 2*17);
  121111. sp_521_mont_sqr_17(t2, t1, p521_mod, p521_mp_mod);
  121112. sp_521_mont_mul_17(t1, t2, t1, p521_mod, p521_mp_mod);
  121113. /* x /= z^2 */
  121114. sp_521_mont_mul_17(r->x, p->x, t2, p521_mod, p521_mp_mod);
  121115. XMEMSET(r->x + 17, 0, sizeof(r->x) / 2U);
  121116. sp_521_mont_reduce_17(r->x, p521_mod, p521_mp_mod);
  121117. /* Reduce x to less than modulus */
  121118. n = sp_521_cmp_17(r->x, p521_mod);
  121119. sp_521_cond_sub_17(r->x, r->x, p521_mod, ~(n >> 31));
  121120. sp_521_norm_17(r->x);
  121121. /* y /= z^3 */
  121122. sp_521_mont_mul_17(r->y, p->y, t1, p521_mod, p521_mp_mod);
  121123. XMEMSET(r->y + 17, 0, sizeof(r->y) / 2U);
  121124. sp_521_mont_reduce_17(r->y, p521_mod, p521_mp_mod);
  121125. /* Reduce y to less than modulus */
  121126. n = sp_521_cmp_17(r->y, p521_mod);
  121127. sp_521_cond_sub_17(r->y, r->y, p521_mod, ~(n >> 31));
  121128. sp_521_norm_17(r->y);
  121129. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  121130. r->z[0] = 1;
  121131. }
  121132. /* Add two Montgomery form numbers (r = a + b % m).
  121133. *
  121134. * r Result of addition.
  121135. * a First number to add in Montgomery form.
  121136. * b Second number to add in Montgomery form.
  121137. * m Modulus (prime).
  121138. */
  121139. SP_NOINLINE static void sp_521_mont_add_17(sp_digit* r, const sp_digit* a,
  121140. const sp_digit* b, const sp_digit* m)
  121141. {
  121142. __asm__ __volatile__ (
  121143. "ldm %[a]!, {r4, r5}\n\t"
  121144. "ldm %[b]!, {r6, r7}\n\t"
  121145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121146. "adds r4, r4, r6\n\t"
  121147. #else
  121148. "add r4, r4, r6\n\t"
  121149. #endif
  121150. #ifdef WOLFSSL_KEIL
  121151. "adcs r5, r5, r7\n\t"
  121152. #elif defined(__clang__)
  121153. "adcs r5, r7\n\t"
  121154. #else
  121155. "adc r5, r7\n\t"
  121156. #endif
  121157. "stm %[r]!, {r4, r5}\n\t"
  121158. "ldm %[a]!, {r4, r5}\n\t"
  121159. "ldm %[b]!, {r6, r7}\n\t"
  121160. #ifdef WOLFSSL_KEIL
  121161. "adcs r4, r4, r6\n\t"
  121162. #elif defined(__clang__)
  121163. "adcs r4, r6\n\t"
  121164. #else
  121165. "adc r4, r6\n\t"
  121166. #endif
  121167. #ifdef WOLFSSL_KEIL
  121168. "adcs r5, r5, r7\n\t"
  121169. #elif defined(__clang__)
  121170. "adcs r5, r7\n\t"
  121171. #else
  121172. "adc r5, r7\n\t"
  121173. #endif
  121174. "stm %[r]!, {r4, r5}\n\t"
  121175. "ldm %[a]!, {r4, r5}\n\t"
  121176. "ldm %[b]!, {r6, r7}\n\t"
  121177. #ifdef WOLFSSL_KEIL
  121178. "adcs r4, r4, r6\n\t"
  121179. #elif defined(__clang__)
  121180. "adcs r4, r6\n\t"
  121181. #else
  121182. "adc r4, r6\n\t"
  121183. #endif
  121184. #ifdef WOLFSSL_KEIL
  121185. "adcs r5, r5, r7\n\t"
  121186. #elif defined(__clang__)
  121187. "adcs r5, r7\n\t"
  121188. #else
  121189. "adc r5, r7\n\t"
  121190. #endif
  121191. "stm %[r]!, {r4, r5}\n\t"
  121192. "ldm %[a]!, {r4, r5}\n\t"
  121193. "ldm %[b]!, {r6, r7}\n\t"
  121194. #ifdef WOLFSSL_KEIL
  121195. "adcs r4, r4, r6\n\t"
  121196. #elif defined(__clang__)
  121197. "adcs r4, r6\n\t"
  121198. #else
  121199. "adc r4, r6\n\t"
  121200. #endif
  121201. #ifdef WOLFSSL_KEIL
  121202. "adcs r5, r5, r7\n\t"
  121203. #elif defined(__clang__)
  121204. "adcs r5, r7\n\t"
  121205. #else
  121206. "adc r5, r7\n\t"
  121207. #endif
  121208. "stm %[r]!, {r4, r5}\n\t"
  121209. "ldm %[a]!, {r4, r5}\n\t"
  121210. "ldm %[b]!, {r6, r7}\n\t"
  121211. #ifdef WOLFSSL_KEIL
  121212. "adcs r4, r4, r6\n\t"
  121213. #elif defined(__clang__)
  121214. "adcs r4, r6\n\t"
  121215. #else
  121216. "adc r4, r6\n\t"
  121217. #endif
  121218. #ifdef WOLFSSL_KEIL
  121219. "adcs r5, r5, r7\n\t"
  121220. #elif defined(__clang__)
  121221. "adcs r5, r7\n\t"
  121222. #else
  121223. "adc r5, r7\n\t"
  121224. #endif
  121225. "stm %[r]!, {r4, r5}\n\t"
  121226. "ldm %[a]!, {r4, r5}\n\t"
  121227. "ldm %[b]!, {r6, r7}\n\t"
  121228. #ifdef WOLFSSL_KEIL
  121229. "adcs r4, r4, r6\n\t"
  121230. #elif defined(__clang__)
  121231. "adcs r4, r6\n\t"
  121232. #else
  121233. "adc r4, r6\n\t"
  121234. #endif
  121235. #ifdef WOLFSSL_KEIL
  121236. "adcs r5, r5, r7\n\t"
  121237. #elif defined(__clang__)
  121238. "adcs r5, r7\n\t"
  121239. #else
  121240. "adc r5, r7\n\t"
  121241. #endif
  121242. "stm %[r]!, {r4, r5}\n\t"
  121243. "ldm %[a]!, {r4, r5}\n\t"
  121244. "ldm %[b]!, {r6, r7}\n\t"
  121245. #ifdef WOLFSSL_KEIL
  121246. "adcs r4, r4, r6\n\t"
  121247. #elif defined(__clang__)
  121248. "adcs r4, r6\n\t"
  121249. #else
  121250. "adc r4, r6\n\t"
  121251. #endif
  121252. #ifdef WOLFSSL_KEIL
  121253. "adcs r5, r5, r7\n\t"
  121254. #elif defined(__clang__)
  121255. "adcs r5, r7\n\t"
  121256. #else
  121257. "adc r5, r7\n\t"
  121258. #endif
  121259. "stm %[r]!, {r4, r5}\n\t"
  121260. "ldm %[a]!, {r4, r5}\n\t"
  121261. "ldm %[b]!, {r6, r7}\n\t"
  121262. #ifdef WOLFSSL_KEIL
  121263. "adcs r4, r4, r6\n\t"
  121264. #elif defined(__clang__)
  121265. "adcs r4, r6\n\t"
  121266. #else
  121267. "adc r4, r6\n\t"
  121268. #endif
  121269. #ifdef WOLFSSL_KEIL
  121270. "adcs r5, r5, r7\n\t"
  121271. #elif defined(__clang__)
  121272. "adcs r5, r7\n\t"
  121273. #else
  121274. "adc r5, r7\n\t"
  121275. #endif
  121276. "stm %[r]!, {r4, r5}\n\t"
  121277. "ldm %[a]!, {r4}\n\t"
  121278. "ldm %[b]!, {r6}\n\t"
  121279. #ifdef WOLFSSL_KEIL
  121280. "adcs r4, r4, r6\n\t"
  121281. #elif defined(__clang__)
  121282. "adcs r4, r6\n\t"
  121283. #else
  121284. "adc r4, r6\n\t"
  121285. #endif
  121286. "movs r7, #1\n\t"
  121287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121288. "lsls r7, r7, #8\n\t"
  121289. #else
  121290. "lsl r7, r7, #8\n\t"
  121291. #endif
  121292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121293. "adds r7, r7, #0xff\n\t"
  121294. #else
  121295. "add r7, r7, #0xff\n\t"
  121296. #endif
  121297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121298. "lsrs %[m], r4, #9\n\t"
  121299. #else
  121300. "lsr %[m], r4, #9\n\t"
  121301. #endif
  121302. #ifdef WOLFSSL_KEIL
  121303. "ands r4, r4, r7\n\t"
  121304. #elif defined(__clang__)
  121305. "ands r4, r7\n\t"
  121306. #else
  121307. "and r4, r7\n\t"
  121308. #endif
  121309. "stm %[r]!, {r4}\n\t"
  121310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121311. "subs %[r], %[r], #0x44\n\t"
  121312. #else
  121313. "sub %[r], %[r], #0x44\n\t"
  121314. #endif
  121315. "ldr r4, [%[r]]\n\t"
  121316. "ldr r5, [%[r], #4]\n\t"
  121317. "ldr r6, [%[r], #8]\n\t"
  121318. "ldr r7, [%[r], #12]\n\t"
  121319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121320. "adds r4, r4, %[m]\n\t"
  121321. #else
  121322. "add r4, r4, %[m]\n\t"
  121323. #endif
  121324. "movs %[m], #0\n\t"
  121325. #ifdef WOLFSSL_KEIL
  121326. "adcs r5, r5, %[m]\n\t"
  121327. #elif defined(__clang__)
  121328. "adcs r5, %[m]\n\t"
  121329. #else
  121330. "adc r5, %[m]\n\t"
  121331. #endif
  121332. #ifdef WOLFSSL_KEIL
  121333. "adcs r6, r6, %[m]\n\t"
  121334. #elif defined(__clang__)
  121335. "adcs r6, %[m]\n\t"
  121336. #else
  121337. "adc r6, %[m]\n\t"
  121338. #endif
  121339. #ifdef WOLFSSL_KEIL
  121340. "adcs r7, r7, %[m]\n\t"
  121341. #elif defined(__clang__)
  121342. "adcs r7, %[m]\n\t"
  121343. #else
  121344. "adc r7, %[m]\n\t"
  121345. #endif
  121346. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  121347. "ldr r4, [%[r]]\n\t"
  121348. "ldr r5, [%[r], #4]\n\t"
  121349. "ldr r6, [%[r], #8]\n\t"
  121350. "ldr r7, [%[r], #12]\n\t"
  121351. #ifdef WOLFSSL_KEIL
  121352. "adcs r4, r4, %[m]\n\t"
  121353. #elif defined(__clang__)
  121354. "adcs r4, %[m]\n\t"
  121355. #else
  121356. "adc r4, %[m]\n\t"
  121357. #endif
  121358. #ifdef WOLFSSL_KEIL
  121359. "adcs r5, r5, %[m]\n\t"
  121360. #elif defined(__clang__)
  121361. "adcs r5, %[m]\n\t"
  121362. #else
  121363. "adc r5, %[m]\n\t"
  121364. #endif
  121365. #ifdef WOLFSSL_KEIL
  121366. "adcs r6, r6, %[m]\n\t"
  121367. #elif defined(__clang__)
  121368. "adcs r6, %[m]\n\t"
  121369. #else
  121370. "adc r6, %[m]\n\t"
  121371. #endif
  121372. #ifdef WOLFSSL_KEIL
  121373. "adcs r7, r7, %[m]\n\t"
  121374. #elif defined(__clang__)
  121375. "adcs r7, %[m]\n\t"
  121376. #else
  121377. "adc r7, %[m]\n\t"
  121378. #endif
  121379. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  121380. "ldr r4, [%[r]]\n\t"
  121381. "ldr r5, [%[r], #4]\n\t"
  121382. "ldr r6, [%[r], #8]\n\t"
  121383. "ldr r7, [%[r], #12]\n\t"
  121384. #ifdef WOLFSSL_KEIL
  121385. "adcs r4, r4, %[m]\n\t"
  121386. #elif defined(__clang__)
  121387. "adcs r4, %[m]\n\t"
  121388. #else
  121389. "adc r4, %[m]\n\t"
  121390. #endif
  121391. #ifdef WOLFSSL_KEIL
  121392. "adcs r5, r5, %[m]\n\t"
  121393. #elif defined(__clang__)
  121394. "adcs r5, %[m]\n\t"
  121395. #else
  121396. "adc r5, %[m]\n\t"
  121397. #endif
  121398. #ifdef WOLFSSL_KEIL
  121399. "adcs r6, r6, %[m]\n\t"
  121400. #elif defined(__clang__)
  121401. "adcs r6, %[m]\n\t"
  121402. #else
  121403. "adc r6, %[m]\n\t"
  121404. #endif
  121405. #ifdef WOLFSSL_KEIL
  121406. "adcs r7, r7, %[m]\n\t"
  121407. #elif defined(__clang__)
  121408. "adcs r7, %[m]\n\t"
  121409. #else
  121410. "adc r7, %[m]\n\t"
  121411. #endif
  121412. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  121413. "ldr r4, [%[r]]\n\t"
  121414. "ldr r5, [%[r], #4]\n\t"
  121415. "ldr r6, [%[r], #8]\n\t"
  121416. "ldr r7, [%[r], #12]\n\t"
  121417. #ifdef WOLFSSL_KEIL
  121418. "adcs r4, r4, %[m]\n\t"
  121419. #elif defined(__clang__)
  121420. "adcs r4, %[m]\n\t"
  121421. #else
  121422. "adc r4, %[m]\n\t"
  121423. #endif
  121424. #ifdef WOLFSSL_KEIL
  121425. "adcs r5, r5, %[m]\n\t"
  121426. #elif defined(__clang__)
  121427. "adcs r5, %[m]\n\t"
  121428. #else
  121429. "adc r5, %[m]\n\t"
  121430. #endif
  121431. #ifdef WOLFSSL_KEIL
  121432. "adcs r6, r6, %[m]\n\t"
  121433. #elif defined(__clang__)
  121434. "adcs r6, %[m]\n\t"
  121435. #else
  121436. "adc r6, %[m]\n\t"
  121437. #endif
  121438. #ifdef WOLFSSL_KEIL
  121439. "adcs r7, r7, %[m]\n\t"
  121440. #elif defined(__clang__)
  121441. "adcs r7, %[m]\n\t"
  121442. #else
  121443. "adc r7, %[m]\n\t"
  121444. #endif
  121445. "stm %[r]!, {r4, r5, r6, r7}\n\t"
  121446. "ldr r4, [%[r]]\n\t"
  121447. #ifdef WOLFSSL_KEIL
  121448. "adcs r4, r4, %[m]\n\t"
  121449. #elif defined(__clang__)
  121450. "adcs r4, %[m]\n\t"
  121451. #else
  121452. "adc r4, %[m]\n\t"
  121453. #endif
  121454. "stm %[r]!, {r4}\n\t"
  121455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121456. "subs %[r], %[r], #0x44\n\t"
  121457. #else
  121458. "sub %[r], %[r], #0x44\n\t"
  121459. #endif
  121460. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  121461. :
  121462. : "memory", "r4", "r5", "r6", "r7"
  121463. );
  121464. }
  121465. /* Double a Montgomery form number (r = a + a % m).
  121466. *
  121467. * r Result of doubling.
  121468. * a Number to double in Montgomery form.
  121469. * m Modulus (prime).
  121470. */
  121471. SP_NOINLINE static void sp_521_mont_dbl_17(sp_digit* r, const sp_digit* a,
  121472. const sp_digit* m)
  121473. {
  121474. __asm__ __volatile__ (
  121475. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121477. "adds r3, r3, r3\n\t"
  121478. #else
  121479. "add r3, r3, r3\n\t"
  121480. #endif
  121481. #ifdef WOLFSSL_KEIL
  121482. "adcs r4, r4, r4\n\t"
  121483. #elif defined(__clang__)
  121484. "adcs r4, r4\n\t"
  121485. #else
  121486. "adc r4, r4\n\t"
  121487. #endif
  121488. #ifdef WOLFSSL_KEIL
  121489. "adcs r5, r5, r5\n\t"
  121490. #elif defined(__clang__)
  121491. "adcs r5, r5\n\t"
  121492. #else
  121493. "adc r5, r5\n\t"
  121494. #endif
  121495. #ifdef WOLFSSL_KEIL
  121496. "adcs r6, r6, r6\n\t"
  121497. #elif defined(__clang__)
  121498. "adcs r6, r6\n\t"
  121499. #else
  121500. "adc r6, r6\n\t"
  121501. #endif
  121502. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121503. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121504. #ifdef WOLFSSL_KEIL
  121505. "adcs r3, r3, r3\n\t"
  121506. #elif defined(__clang__)
  121507. "adcs r3, r3\n\t"
  121508. #else
  121509. "adc r3, r3\n\t"
  121510. #endif
  121511. #ifdef WOLFSSL_KEIL
  121512. "adcs r4, r4, r4\n\t"
  121513. #elif defined(__clang__)
  121514. "adcs r4, r4\n\t"
  121515. #else
  121516. "adc r4, r4\n\t"
  121517. #endif
  121518. #ifdef WOLFSSL_KEIL
  121519. "adcs r5, r5, r5\n\t"
  121520. #elif defined(__clang__)
  121521. "adcs r5, r5\n\t"
  121522. #else
  121523. "adc r5, r5\n\t"
  121524. #endif
  121525. #ifdef WOLFSSL_KEIL
  121526. "adcs r6, r6, r6\n\t"
  121527. #elif defined(__clang__)
  121528. "adcs r6, r6\n\t"
  121529. #else
  121530. "adc r6, r6\n\t"
  121531. #endif
  121532. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121533. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121534. #ifdef WOLFSSL_KEIL
  121535. "adcs r3, r3, r3\n\t"
  121536. #elif defined(__clang__)
  121537. "adcs r3, r3\n\t"
  121538. #else
  121539. "adc r3, r3\n\t"
  121540. #endif
  121541. #ifdef WOLFSSL_KEIL
  121542. "adcs r4, r4, r4\n\t"
  121543. #elif defined(__clang__)
  121544. "adcs r4, r4\n\t"
  121545. #else
  121546. "adc r4, r4\n\t"
  121547. #endif
  121548. #ifdef WOLFSSL_KEIL
  121549. "adcs r5, r5, r5\n\t"
  121550. #elif defined(__clang__)
  121551. "adcs r5, r5\n\t"
  121552. #else
  121553. "adc r5, r5\n\t"
  121554. #endif
  121555. #ifdef WOLFSSL_KEIL
  121556. "adcs r6, r6, r6\n\t"
  121557. #elif defined(__clang__)
  121558. "adcs r6, r6\n\t"
  121559. #else
  121560. "adc r6, r6\n\t"
  121561. #endif
  121562. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121563. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121564. #ifdef WOLFSSL_KEIL
  121565. "adcs r3, r3, r3\n\t"
  121566. #elif defined(__clang__)
  121567. "adcs r3, r3\n\t"
  121568. #else
  121569. "adc r3, r3\n\t"
  121570. #endif
  121571. #ifdef WOLFSSL_KEIL
  121572. "adcs r4, r4, r4\n\t"
  121573. #elif defined(__clang__)
  121574. "adcs r4, r4\n\t"
  121575. #else
  121576. "adc r4, r4\n\t"
  121577. #endif
  121578. #ifdef WOLFSSL_KEIL
  121579. "adcs r5, r5, r5\n\t"
  121580. #elif defined(__clang__)
  121581. "adcs r5, r5\n\t"
  121582. #else
  121583. "adc r5, r5\n\t"
  121584. #endif
  121585. #ifdef WOLFSSL_KEIL
  121586. "adcs r6, r6, r6\n\t"
  121587. #elif defined(__clang__)
  121588. "adcs r6, r6\n\t"
  121589. #else
  121590. "adc r6, r6\n\t"
  121591. #endif
  121592. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121593. "ldm %[a]!, {r3}\n\t"
  121594. #ifdef WOLFSSL_KEIL
  121595. "adcs r3, r3, r3\n\t"
  121596. #elif defined(__clang__)
  121597. "adcs r3, r3\n\t"
  121598. #else
  121599. "adc r3, r3\n\t"
  121600. #endif
  121601. "movs r7, #1\n\t"
  121602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121603. "lsls r7, r7, #8\n\t"
  121604. #else
  121605. "lsl r7, r7, #8\n\t"
  121606. #endif
  121607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121608. "adds r7, r7, #0xff\n\t"
  121609. #else
  121610. "add r7, r7, #0xff\n\t"
  121611. #endif
  121612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121613. "lsrs %[m], r3, #9\n\t"
  121614. #else
  121615. "lsr %[m], r3, #9\n\t"
  121616. #endif
  121617. #ifdef WOLFSSL_KEIL
  121618. "ands r3, r3, r7\n\t"
  121619. #elif defined(__clang__)
  121620. "ands r3, r7\n\t"
  121621. #else
  121622. "and r3, r7\n\t"
  121623. #endif
  121624. "stm %[r]!, {r3}\n\t"
  121625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121626. "subs %[r], %[r], #0x44\n\t"
  121627. #else
  121628. "sub %[r], %[r], #0x44\n\t"
  121629. #endif
  121630. "movs r7, #0\n\t"
  121631. "ldr r3, [%[r]]\n\t"
  121632. "ldr r4, [%[r], #4]\n\t"
  121633. "ldr r5, [%[r], #8]\n\t"
  121634. "ldr r6, [%[r], #12]\n\t"
  121635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121636. "adds r3, r3, %[m]\n\t"
  121637. #else
  121638. "add r3, r3, %[m]\n\t"
  121639. #endif
  121640. #ifdef WOLFSSL_KEIL
  121641. "adcs r4, r4, r7\n\t"
  121642. #elif defined(__clang__)
  121643. "adcs r4, r7\n\t"
  121644. #else
  121645. "adc r4, r7\n\t"
  121646. #endif
  121647. #ifdef WOLFSSL_KEIL
  121648. "adcs r5, r5, r7\n\t"
  121649. #elif defined(__clang__)
  121650. "adcs r5, r7\n\t"
  121651. #else
  121652. "adc r5, r7\n\t"
  121653. #endif
  121654. #ifdef WOLFSSL_KEIL
  121655. "adcs r6, r6, r7\n\t"
  121656. #elif defined(__clang__)
  121657. "adcs r6, r7\n\t"
  121658. #else
  121659. "adc r6, r7\n\t"
  121660. #endif
  121661. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121662. "ldr r3, [%[r]]\n\t"
  121663. "ldr r4, [%[r], #4]\n\t"
  121664. "ldr r5, [%[r], #8]\n\t"
  121665. "ldr r6, [%[r], #12]\n\t"
  121666. #ifdef WOLFSSL_KEIL
  121667. "adcs r3, r3, r7\n\t"
  121668. #elif defined(__clang__)
  121669. "adcs r3, r7\n\t"
  121670. #else
  121671. "adc r3, r7\n\t"
  121672. #endif
  121673. #ifdef WOLFSSL_KEIL
  121674. "adcs r4, r4, r7\n\t"
  121675. #elif defined(__clang__)
  121676. "adcs r4, r7\n\t"
  121677. #else
  121678. "adc r4, r7\n\t"
  121679. #endif
  121680. #ifdef WOLFSSL_KEIL
  121681. "adcs r5, r5, r7\n\t"
  121682. #elif defined(__clang__)
  121683. "adcs r5, r7\n\t"
  121684. #else
  121685. "adc r5, r7\n\t"
  121686. #endif
  121687. #ifdef WOLFSSL_KEIL
  121688. "adcs r6, r6, r7\n\t"
  121689. #elif defined(__clang__)
  121690. "adcs r6, r7\n\t"
  121691. #else
  121692. "adc r6, r7\n\t"
  121693. #endif
  121694. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121695. "ldr r3, [%[r]]\n\t"
  121696. "ldr r4, [%[r], #4]\n\t"
  121697. "ldr r5, [%[r], #8]\n\t"
  121698. "ldr r6, [%[r], #12]\n\t"
  121699. #ifdef WOLFSSL_KEIL
  121700. "adcs r3, r3, r7\n\t"
  121701. #elif defined(__clang__)
  121702. "adcs r3, r7\n\t"
  121703. #else
  121704. "adc r3, r7\n\t"
  121705. #endif
  121706. #ifdef WOLFSSL_KEIL
  121707. "adcs r4, r4, r7\n\t"
  121708. #elif defined(__clang__)
  121709. "adcs r4, r7\n\t"
  121710. #else
  121711. "adc r4, r7\n\t"
  121712. #endif
  121713. #ifdef WOLFSSL_KEIL
  121714. "adcs r5, r5, r7\n\t"
  121715. #elif defined(__clang__)
  121716. "adcs r5, r7\n\t"
  121717. #else
  121718. "adc r5, r7\n\t"
  121719. #endif
  121720. #ifdef WOLFSSL_KEIL
  121721. "adcs r6, r6, r7\n\t"
  121722. #elif defined(__clang__)
  121723. "adcs r6, r7\n\t"
  121724. #else
  121725. "adc r6, r7\n\t"
  121726. #endif
  121727. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121728. "ldr r3, [%[r]]\n\t"
  121729. "ldr r4, [%[r], #4]\n\t"
  121730. "ldr r5, [%[r], #8]\n\t"
  121731. "ldr r6, [%[r], #12]\n\t"
  121732. #ifdef WOLFSSL_KEIL
  121733. "adcs r3, r3, r7\n\t"
  121734. #elif defined(__clang__)
  121735. "adcs r3, r7\n\t"
  121736. #else
  121737. "adc r3, r7\n\t"
  121738. #endif
  121739. #ifdef WOLFSSL_KEIL
  121740. "adcs r4, r4, r7\n\t"
  121741. #elif defined(__clang__)
  121742. "adcs r4, r7\n\t"
  121743. #else
  121744. "adc r4, r7\n\t"
  121745. #endif
  121746. #ifdef WOLFSSL_KEIL
  121747. "adcs r5, r5, r7\n\t"
  121748. #elif defined(__clang__)
  121749. "adcs r5, r7\n\t"
  121750. #else
  121751. "adc r5, r7\n\t"
  121752. #endif
  121753. #ifdef WOLFSSL_KEIL
  121754. "adcs r6, r6, r7\n\t"
  121755. #elif defined(__clang__)
  121756. "adcs r6, r7\n\t"
  121757. #else
  121758. "adc r6, r7\n\t"
  121759. #endif
  121760. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121761. "ldr r3, [%[r]]\n\t"
  121762. #ifdef WOLFSSL_KEIL
  121763. "adcs r3, r3, r7\n\t"
  121764. #elif defined(__clang__)
  121765. "adcs r3, r7\n\t"
  121766. #else
  121767. "adc r3, r7\n\t"
  121768. #endif
  121769. "stm %[r]!, {r3}\n\t"
  121770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121771. "subs %[r], %[r], #0x44\n\t"
  121772. #else
  121773. "sub %[r], %[r], #0x44\n\t"
  121774. #endif
  121775. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  121776. :
  121777. : "memory", "r3", "r4", "r5", "r6", "r7"
  121778. );
  121779. }
  121780. /* Triple a Montgomery form number (r = a + a + a % m).
  121781. *
  121782. * r Result of Tripling.
  121783. * a Number to triple in Montgomery form.
  121784. * m Modulus (prime).
  121785. */
  121786. SP_NOINLINE static void sp_521_mont_tpl_17(sp_digit* r, const sp_digit* a,
  121787. const sp_digit* m)
  121788. {
  121789. __asm__ __volatile__ (
  121790. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121792. "adds r3, r3, r3\n\t"
  121793. #else
  121794. "add r3, r3, r3\n\t"
  121795. #endif
  121796. #ifdef WOLFSSL_KEIL
  121797. "adcs r4, r4, r4\n\t"
  121798. #elif defined(__clang__)
  121799. "adcs r4, r4\n\t"
  121800. #else
  121801. "adc r4, r4\n\t"
  121802. #endif
  121803. #ifdef WOLFSSL_KEIL
  121804. "adcs r5, r5, r5\n\t"
  121805. #elif defined(__clang__)
  121806. "adcs r5, r5\n\t"
  121807. #else
  121808. "adc r5, r5\n\t"
  121809. #endif
  121810. #ifdef WOLFSSL_KEIL
  121811. "adcs r6, r6, r6\n\t"
  121812. #elif defined(__clang__)
  121813. "adcs r6, r6\n\t"
  121814. #else
  121815. "adc r6, r6\n\t"
  121816. #endif
  121817. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121818. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121819. #ifdef WOLFSSL_KEIL
  121820. "adcs r3, r3, r3\n\t"
  121821. #elif defined(__clang__)
  121822. "adcs r3, r3\n\t"
  121823. #else
  121824. "adc r3, r3\n\t"
  121825. #endif
  121826. #ifdef WOLFSSL_KEIL
  121827. "adcs r4, r4, r4\n\t"
  121828. #elif defined(__clang__)
  121829. "adcs r4, r4\n\t"
  121830. #else
  121831. "adc r4, r4\n\t"
  121832. #endif
  121833. #ifdef WOLFSSL_KEIL
  121834. "adcs r5, r5, r5\n\t"
  121835. #elif defined(__clang__)
  121836. "adcs r5, r5\n\t"
  121837. #else
  121838. "adc r5, r5\n\t"
  121839. #endif
  121840. #ifdef WOLFSSL_KEIL
  121841. "adcs r6, r6, r6\n\t"
  121842. #elif defined(__clang__)
  121843. "adcs r6, r6\n\t"
  121844. #else
  121845. "adc r6, r6\n\t"
  121846. #endif
  121847. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121848. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121849. #ifdef WOLFSSL_KEIL
  121850. "adcs r3, r3, r3\n\t"
  121851. #elif defined(__clang__)
  121852. "adcs r3, r3\n\t"
  121853. #else
  121854. "adc r3, r3\n\t"
  121855. #endif
  121856. #ifdef WOLFSSL_KEIL
  121857. "adcs r4, r4, r4\n\t"
  121858. #elif defined(__clang__)
  121859. "adcs r4, r4\n\t"
  121860. #else
  121861. "adc r4, r4\n\t"
  121862. #endif
  121863. #ifdef WOLFSSL_KEIL
  121864. "adcs r5, r5, r5\n\t"
  121865. #elif defined(__clang__)
  121866. "adcs r5, r5\n\t"
  121867. #else
  121868. "adc r5, r5\n\t"
  121869. #endif
  121870. #ifdef WOLFSSL_KEIL
  121871. "adcs r6, r6, r6\n\t"
  121872. #elif defined(__clang__)
  121873. "adcs r6, r6\n\t"
  121874. #else
  121875. "adc r6, r6\n\t"
  121876. #endif
  121877. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121878. "ldm %[a]!, {r3, r4, r5, r6}\n\t"
  121879. #ifdef WOLFSSL_KEIL
  121880. "adcs r3, r3, r3\n\t"
  121881. #elif defined(__clang__)
  121882. "adcs r3, r3\n\t"
  121883. #else
  121884. "adc r3, r3\n\t"
  121885. #endif
  121886. #ifdef WOLFSSL_KEIL
  121887. "adcs r4, r4, r4\n\t"
  121888. #elif defined(__clang__)
  121889. "adcs r4, r4\n\t"
  121890. #else
  121891. "adc r4, r4\n\t"
  121892. #endif
  121893. #ifdef WOLFSSL_KEIL
  121894. "adcs r5, r5, r5\n\t"
  121895. #elif defined(__clang__)
  121896. "adcs r5, r5\n\t"
  121897. #else
  121898. "adc r5, r5\n\t"
  121899. #endif
  121900. #ifdef WOLFSSL_KEIL
  121901. "adcs r6, r6, r6\n\t"
  121902. #elif defined(__clang__)
  121903. "adcs r6, r6\n\t"
  121904. #else
  121905. "adc r6, r6\n\t"
  121906. #endif
  121907. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  121908. "ldm %[a]!, {r3}\n\t"
  121909. #ifdef WOLFSSL_KEIL
  121910. "adcs r3, r3, r3\n\t"
  121911. #elif defined(__clang__)
  121912. "adcs r3, r3\n\t"
  121913. #else
  121914. "adc r3, r3\n\t"
  121915. #endif
  121916. "stm %[r]!, {r3}\n\t"
  121917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121918. "subs %[r], %[r], #0x44\n\t"
  121919. #else
  121920. "sub %[r], %[r], #0x44\n\t"
  121921. #endif
  121922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121923. "subs %[a], %[a], #0x44\n\t"
  121924. #else
  121925. "sub %[a], %[a], #0x44\n\t"
  121926. #endif
  121927. "ldm %[a]!, {r3, r4}\n\t"
  121928. "ldr r5, [%[r]]\n\t"
  121929. "ldr r6, [%[r], #4]\n\t"
  121930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  121931. "adds r5, r5, r3\n\t"
  121932. #else
  121933. "add r5, r5, r3\n\t"
  121934. #endif
  121935. #ifdef WOLFSSL_KEIL
  121936. "adcs r6, r6, r4\n\t"
  121937. #elif defined(__clang__)
  121938. "adcs r6, r4\n\t"
  121939. #else
  121940. "adc r6, r4\n\t"
  121941. #endif
  121942. "stm %[r]!, {r5, r6}\n\t"
  121943. "ldm %[a]!, {r3, r4}\n\t"
  121944. "ldr r5, [%[r]]\n\t"
  121945. "ldr r6, [%[r], #4]\n\t"
  121946. #ifdef WOLFSSL_KEIL
  121947. "adcs r5, r5, r3\n\t"
  121948. #elif defined(__clang__)
  121949. "adcs r5, r3\n\t"
  121950. #else
  121951. "adc r5, r3\n\t"
  121952. #endif
  121953. #ifdef WOLFSSL_KEIL
  121954. "adcs r6, r6, r4\n\t"
  121955. #elif defined(__clang__)
  121956. "adcs r6, r4\n\t"
  121957. #else
  121958. "adc r6, r4\n\t"
  121959. #endif
  121960. "stm %[r]!, {r5, r6}\n\t"
  121961. "ldm %[a]!, {r3, r4}\n\t"
  121962. "ldr r5, [%[r]]\n\t"
  121963. "ldr r6, [%[r], #4]\n\t"
  121964. #ifdef WOLFSSL_KEIL
  121965. "adcs r5, r5, r3\n\t"
  121966. #elif defined(__clang__)
  121967. "adcs r5, r3\n\t"
  121968. #else
  121969. "adc r5, r3\n\t"
  121970. #endif
  121971. #ifdef WOLFSSL_KEIL
  121972. "adcs r6, r6, r4\n\t"
  121973. #elif defined(__clang__)
  121974. "adcs r6, r4\n\t"
  121975. #else
  121976. "adc r6, r4\n\t"
  121977. #endif
  121978. "stm %[r]!, {r5, r6}\n\t"
  121979. "ldm %[a]!, {r3, r4}\n\t"
  121980. "ldr r5, [%[r]]\n\t"
  121981. "ldr r6, [%[r], #4]\n\t"
  121982. #ifdef WOLFSSL_KEIL
  121983. "adcs r5, r5, r3\n\t"
  121984. #elif defined(__clang__)
  121985. "adcs r5, r3\n\t"
  121986. #else
  121987. "adc r5, r3\n\t"
  121988. #endif
  121989. #ifdef WOLFSSL_KEIL
  121990. "adcs r6, r6, r4\n\t"
  121991. #elif defined(__clang__)
  121992. "adcs r6, r4\n\t"
  121993. #else
  121994. "adc r6, r4\n\t"
  121995. #endif
  121996. "stm %[r]!, {r5, r6}\n\t"
  121997. "ldm %[a]!, {r3, r4}\n\t"
  121998. "ldr r5, [%[r]]\n\t"
  121999. "ldr r6, [%[r], #4]\n\t"
  122000. #ifdef WOLFSSL_KEIL
  122001. "adcs r5, r5, r3\n\t"
  122002. #elif defined(__clang__)
  122003. "adcs r5, r3\n\t"
  122004. #else
  122005. "adc r5, r3\n\t"
  122006. #endif
  122007. #ifdef WOLFSSL_KEIL
  122008. "adcs r6, r6, r4\n\t"
  122009. #elif defined(__clang__)
  122010. "adcs r6, r4\n\t"
  122011. #else
  122012. "adc r6, r4\n\t"
  122013. #endif
  122014. "stm %[r]!, {r5, r6}\n\t"
  122015. "ldm %[a]!, {r3, r4}\n\t"
  122016. "ldr r5, [%[r]]\n\t"
  122017. "ldr r6, [%[r], #4]\n\t"
  122018. #ifdef WOLFSSL_KEIL
  122019. "adcs r5, r5, r3\n\t"
  122020. #elif defined(__clang__)
  122021. "adcs r5, r3\n\t"
  122022. #else
  122023. "adc r5, r3\n\t"
  122024. #endif
  122025. #ifdef WOLFSSL_KEIL
  122026. "adcs r6, r6, r4\n\t"
  122027. #elif defined(__clang__)
  122028. "adcs r6, r4\n\t"
  122029. #else
  122030. "adc r6, r4\n\t"
  122031. #endif
  122032. "stm %[r]!, {r5, r6}\n\t"
  122033. "ldm %[a]!, {r3, r4}\n\t"
  122034. "ldr r5, [%[r]]\n\t"
  122035. "ldr r6, [%[r], #4]\n\t"
  122036. #ifdef WOLFSSL_KEIL
  122037. "adcs r5, r5, r3\n\t"
  122038. #elif defined(__clang__)
  122039. "adcs r5, r3\n\t"
  122040. #else
  122041. "adc r5, r3\n\t"
  122042. #endif
  122043. #ifdef WOLFSSL_KEIL
  122044. "adcs r6, r6, r4\n\t"
  122045. #elif defined(__clang__)
  122046. "adcs r6, r4\n\t"
  122047. #else
  122048. "adc r6, r4\n\t"
  122049. #endif
  122050. "stm %[r]!, {r5, r6}\n\t"
  122051. "ldm %[a]!, {r3, r4}\n\t"
  122052. "ldr r5, [%[r]]\n\t"
  122053. "ldr r6, [%[r], #4]\n\t"
  122054. #ifdef WOLFSSL_KEIL
  122055. "adcs r5, r5, r3\n\t"
  122056. #elif defined(__clang__)
  122057. "adcs r5, r3\n\t"
  122058. #else
  122059. "adc r5, r3\n\t"
  122060. #endif
  122061. #ifdef WOLFSSL_KEIL
  122062. "adcs r6, r6, r4\n\t"
  122063. #elif defined(__clang__)
  122064. "adcs r6, r4\n\t"
  122065. #else
  122066. "adc r6, r4\n\t"
  122067. #endif
  122068. "stm %[r]!, {r5, r6}\n\t"
  122069. "ldm %[a]!, {r3}\n\t"
  122070. "ldr r5, [%[r]]\n\t"
  122071. #ifdef WOLFSSL_KEIL
  122072. "adcs r5, r5, r3\n\t"
  122073. #elif defined(__clang__)
  122074. "adcs r5, r3\n\t"
  122075. #else
  122076. "adc r5, r3\n\t"
  122077. #endif
  122078. "movs r7, #1\n\t"
  122079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122080. "lsls r7, r7, #8\n\t"
  122081. #else
  122082. "lsl r7, r7, #8\n\t"
  122083. #endif
  122084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122085. "adds r7, r7, #0xff\n\t"
  122086. #else
  122087. "add r7, r7, #0xff\n\t"
  122088. #endif
  122089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122090. "lsrs %[m], r5, #9\n\t"
  122091. #else
  122092. "lsr %[m], r5, #9\n\t"
  122093. #endif
  122094. #ifdef WOLFSSL_KEIL
  122095. "ands r5, r5, r7\n\t"
  122096. #elif defined(__clang__)
  122097. "ands r5, r7\n\t"
  122098. #else
  122099. "and r5, r7\n\t"
  122100. #endif
  122101. "stm %[r]!, {r5}\n\t"
  122102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122103. "subs %[r], %[r], #0x44\n\t"
  122104. #else
  122105. "sub %[r], %[r], #0x44\n\t"
  122106. #endif
  122107. "movs r7, #0\n\t"
  122108. "ldr r3, [%[r]]\n\t"
  122109. "ldr r4, [%[r], #4]\n\t"
  122110. "ldr r5, [%[r], #8]\n\t"
  122111. "ldr r6, [%[r], #12]\n\t"
  122112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122113. "adds r3, r3, %[m]\n\t"
  122114. #else
  122115. "add r3, r3, %[m]\n\t"
  122116. #endif
  122117. #ifdef WOLFSSL_KEIL
  122118. "adcs r4, r4, r7\n\t"
  122119. #elif defined(__clang__)
  122120. "adcs r4, r7\n\t"
  122121. #else
  122122. "adc r4, r7\n\t"
  122123. #endif
  122124. #ifdef WOLFSSL_KEIL
  122125. "adcs r5, r5, r7\n\t"
  122126. #elif defined(__clang__)
  122127. "adcs r5, r7\n\t"
  122128. #else
  122129. "adc r5, r7\n\t"
  122130. #endif
  122131. #ifdef WOLFSSL_KEIL
  122132. "adcs r6, r6, r7\n\t"
  122133. #elif defined(__clang__)
  122134. "adcs r6, r7\n\t"
  122135. #else
  122136. "adc r6, r7\n\t"
  122137. #endif
  122138. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122139. "ldr r3, [%[r]]\n\t"
  122140. "ldr r4, [%[r], #4]\n\t"
  122141. "ldr r5, [%[r], #8]\n\t"
  122142. "ldr r6, [%[r], #12]\n\t"
  122143. #ifdef WOLFSSL_KEIL
  122144. "adcs r3, r3, r7\n\t"
  122145. #elif defined(__clang__)
  122146. "adcs r3, r7\n\t"
  122147. #else
  122148. "adc r3, r7\n\t"
  122149. #endif
  122150. #ifdef WOLFSSL_KEIL
  122151. "adcs r4, r4, r7\n\t"
  122152. #elif defined(__clang__)
  122153. "adcs r4, r7\n\t"
  122154. #else
  122155. "adc r4, r7\n\t"
  122156. #endif
  122157. #ifdef WOLFSSL_KEIL
  122158. "adcs r5, r5, r7\n\t"
  122159. #elif defined(__clang__)
  122160. "adcs r5, r7\n\t"
  122161. #else
  122162. "adc r5, r7\n\t"
  122163. #endif
  122164. #ifdef WOLFSSL_KEIL
  122165. "adcs r6, r6, r7\n\t"
  122166. #elif defined(__clang__)
  122167. "adcs r6, r7\n\t"
  122168. #else
  122169. "adc r6, r7\n\t"
  122170. #endif
  122171. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122172. "ldr r3, [%[r]]\n\t"
  122173. "ldr r4, [%[r], #4]\n\t"
  122174. "ldr r5, [%[r], #8]\n\t"
  122175. "ldr r6, [%[r], #12]\n\t"
  122176. #ifdef WOLFSSL_KEIL
  122177. "adcs r3, r3, r7\n\t"
  122178. #elif defined(__clang__)
  122179. "adcs r3, r7\n\t"
  122180. #else
  122181. "adc r3, r7\n\t"
  122182. #endif
  122183. #ifdef WOLFSSL_KEIL
  122184. "adcs r4, r4, r7\n\t"
  122185. #elif defined(__clang__)
  122186. "adcs r4, r7\n\t"
  122187. #else
  122188. "adc r4, r7\n\t"
  122189. #endif
  122190. #ifdef WOLFSSL_KEIL
  122191. "adcs r5, r5, r7\n\t"
  122192. #elif defined(__clang__)
  122193. "adcs r5, r7\n\t"
  122194. #else
  122195. "adc r5, r7\n\t"
  122196. #endif
  122197. #ifdef WOLFSSL_KEIL
  122198. "adcs r6, r6, r7\n\t"
  122199. #elif defined(__clang__)
  122200. "adcs r6, r7\n\t"
  122201. #else
  122202. "adc r6, r7\n\t"
  122203. #endif
  122204. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122205. "ldr r3, [%[r]]\n\t"
  122206. "ldr r4, [%[r], #4]\n\t"
  122207. "ldr r5, [%[r], #8]\n\t"
  122208. "ldr r6, [%[r], #12]\n\t"
  122209. #ifdef WOLFSSL_KEIL
  122210. "adcs r3, r3, r7\n\t"
  122211. #elif defined(__clang__)
  122212. "adcs r3, r7\n\t"
  122213. #else
  122214. "adc r3, r7\n\t"
  122215. #endif
  122216. #ifdef WOLFSSL_KEIL
  122217. "adcs r4, r4, r7\n\t"
  122218. #elif defined(__clang__)
  122219. "adcs r4, r7\n\t"
  122220. #else
  122221. "adc r4, r7\n\t"
  122222. #endif
  122223. #ifdef WOLFSSL_KEIL
  122224. "adcs r5, r5, r7\n\t"
  122225. #elif defined(__clang__)
  122226. "adcs r5, r7\n\t"
  122227. #else
  122228. "adc r5, r7\n\t"
  122229. #endif
  122230. #ifdef WOLFSSL_KEIL
  122231. "adcs r6, r6, r7\n\t"
  122232. #elif defined(__clang__)
  122233. "adcs r6, r7\n\t"
  122234. #else
  122235. "adc r6, r7\n\t"
  122236. #endif
  122237. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  122238. "ldr r3, [%[r]]\n\t"
  122239. #ifdef WOLFSSL_KEIL
  122240. "adcs r3, r3, r7\n\t"
  122241. #elif defined(__clang__)
  122242. "adcs r3, r7\n\t"
  122243. #else
  122244. "adc r3, r7\n\t"
  122245. #endif
  122246. "stm %[r]!, {r3}\n\t"
  122247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122248. "subs %[r], %[r], #0x44\n\t"
  122249. #else
  122250. "sub %[r], %[r], #0x44\n\t"
  122251. #endif
  122252. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  122253. :
  122254. : "memory", "r3", "r4", "r5", "r6", "r7"
  122255. );
  122256. }
  122257. /* Conditionally add a and b using the mask m.
  122258. * m is -1 to add and 0 when not.
  122259. *
  122260. * r A single precision number representing conditional add result.
  122261. * a A single precision number to add with.
  122262. * b A single precision number to add.
  122263. * m Mask value to apply.
  122264. */
  122265. SP_NOINLINE static sp_digit sp_521_cond_add_17(sp_digit* r, const sp_digit* a,
  122266. const sp_digit* b, sp_digit m)
  122267. {
  122268. __asm__ __volatile__ (
  122269. "movs r4, #0\n\t"
  122270. "movs r5, #0x44\n\t"
  122271. "mov r8, r5\n\t"
  122272. "movs r7, #0\n\t"
  122273. "\n"
  122274. "L_sp_521_cond_add_17_words_%=:\n\t"
  122275. "ldr r6, [%[b], r7]\n\t"
  122276. #ifdef WOLFSSL_KEIL
  122277. "ands r6, r6, %[m]\n\t"
  122278. #elif defined(__clang__)
  122279. "ands r6, %[m]\n\t"
  122280. #else
  122281. "and r6, %[m]\n\t"
  122282. #endif
  122283. "movs r5, #0\n\t"
  122284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122285. "subs r5, r5, #1\n\t"
  122286. #else
  122287. "sub r5, r5, #1\n\t"
  122288. #endif
  122289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122290. "adds r5, r5, r4\n\t"
  122291. #else
  122292. "add r5, r5, r4\n\t"
  122293. #endif
  122294. "ldr r5, [%[a], r7]\n\t"
  122295. #ifdef WOLFSSL_KEIL
  122296. "adcs r5, r5, r6\n\t"
  122297. #elif defined(__clang__)
  122298. "adcs r5, r6\n\t"
  122299. #else
  122300. "adc r5, r6\n\t"
  122301. #endif
  122302. "movs r4, #0\n\t"
  122303. #ifdef WOLFSSL_KEIL
  122304. "adcs r4, r4, r4\n\t"
  122305. #elif defined(__clang__)
  122306. "adcs r4, r4\n\t"
  122307. #else
  122308. "adc r4, r4\n\t"
  122309. #endif
  122310. "str r5, [%[r], r7]\n\t"
  122311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122312. "adds r7, r7, #4\n\t"
  122313. #else
  122314. "add r7, r7, #4\n\t"
  122315. #endif
  122316. "cmp r7, r8\n\t"
  122317. "blt L_sp_521_cond_add_17_words_%=\n\t"
  122318. "movs %[r], r4\n\t"
  122319. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  122320. :
  122321. : "memory", "r4", "r5", "r6", "r7", "r8"
  122322. );
  122323. return (uint32_t)(size_t)r;
  122324. }
  122325. /* Subtract two Montgomery form numbers (r = a - b % m).
  122326. *
  122327. * r Result of subtration.
  122328. * a Number to subtract from in Montgomery form.
  122329. * b Number to subtract with in Montgomery form.
  122330. * m Modulus (prime).
  122331. */
  122332. SP_NOINLINE static void sp_521_mont_sub_17(sp_digit* r, const sp_digit* a,
  122333. const sp_digit* b, const sp_digit* m)
  122334. {
  122335. __asm__ __volatile__ (
  122336. "ldm %[a]!, {r4, r5}\n\t"
  122337. "ldm %[b]!, {r6, r7}\n\t"
  122338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122339. "subs r4, r4, r6\n\t"
  122340. #else
  122341. "sub r4, r4, r6\n\t"
  122342. #endif
  122343. #ifdef WOLFSSL_KEIL
  122344. "sbcs r5, r5, r7\n\t"
  122345. #elif defined(__clang__)
  122346. "sbcs r5, r7\n\t"
  122347. #else
  122348. "sbc r5, r7\n\t"
  122349. #endif
  122350. "stm %[r]!, {r4, r5}\n\t"
  122351. "ldm %[a]!, {r4, r5}\n\t"
  122352. "ldm %[b]!, {r6, r7}\n\t"
  122353. #ifdef WOLFSSL_KEIL
  122354. "sbcs r4, r4, r6\n\t"
  122355. #elif defined(__clang__)
  122356. "sbcs r4, r6\n\t"
  122357. #else
  122358. "sbc r4, r6\n\t"
  122359. #endif
  122360. #ifdef WOLFSSL_KEIL
  122361. "sbcs r5, r5, r7\n\t"
  122362. #elif defined(__clang__)
  122363. "sbcs r5, r7\n\t"
  122364. #else
  122365. "sbc r5, r7\n\t"
  122366. #endif
  122367. "stm %[r]!, {r4, r5}\n\t"
  122368. "ldm %[a]!, {r4, r5}\n\t"
  122369. "ldm %[b]!, {r6, r7}\n\t"
  122370. #ifdef WOLFSSL_KEIL
  122371. "sbcs r4, r4, r6\n\t"
  122372. #elif defined(__clang__)
  122373. "sbcs r4, r6\n\t"
  122374. #else
  122375. "sbc r4, r6\n\t"
  122376. #endif
  122377. #ifdef WOLFSSL_KEIL
  122378. "sbcs r5, r5, r7\n\t"
  122379. #elif defined(__clang__)
  122380. "sbcs r5, r7\n\t"
  122381. #else
  122382. "sbc r5, r7\n\t"
  122383. #endif
  122384. "stm %[r]!, {r4, r5}\n\t"
  122385. "ldm %[a]!, {r4, r5}\n\t"
  122386. "ldm %[b]!, {r6, r7}\n\t"
  122387. #ifdef WOLFSSL_KEIL
  122388. "sbcs r4, r4, r6\n\t"
  122389. #elif defined(__clang__)
  122390. "sbcs r4, r6\n\t"
  122391. #else
  122392. "sbc r4, r6\n\t"
  122393. #endif
  122394. #ifdef WOLFSSL_KEIL
  122395. "sbcs r5, r5, r7\n\t"
  122396. #elif defined(__clang__)
  122397. "sbcs r5, r7\n\t"
  122398. #else
  122399. "sbc r5, r7\n\t"
  122400. #endif
  122401. "stm %[r]!, {r4, r5}\n\t"
  122402. "ldm %[a]!, {r4, r5}\n\t"
  122403. "ldm %[b]!, {r6, r7}\n\t"
  122404. #ifdef WOLFSSL_KEIL
  122405. "sbcs r4, r4, r6\n\t"
  122406. #elif defined(__clang__)
  122407. "sbcs r4, r6\n\t"
  122408. #else
  122409. "sbc r4, r6\n\t"
  122410. #endif
  122411. #ifdef WOLFSSL_KEIL
  122412. "sbcs r5, r5, r7\n\t"
  122413. #elif defined(__clang__)
  122414. "sbcs r5, r7\n\t"
  122415. #else
  122416. "sbc r5, r7\n\t"
  122417. #endif
  122418. "stm %[r]!, {r4, r5}\n\t"
  122419. "ldm %[a]!, {r4, r5}\n\t"
  122420. "ldm %[b]!, {r6, r7}\n\t"
  122421. #ifdef WOLFSSL_KEIL
  122422. "sbcs r4, r4, r6\n\t"
  122423. #elif defined(__clang__)
  122424. "sbcs r4, r6\n\t"
  122425. #else
  122426. "sbc r4, r6\n\t"
  122427. #endif
  122428. #ifdef WOLFSSL_KEIL
  122429. "sbcs r5, r5, r7\n\t"
  122430. #elif defined(__clang__)
  122431. "sbcs r5, r7\n\t"
  122432. #else
  122433. "sbc r5, r7\n\t"
  122434. #endif
  122435. "stm %[r]!, {r4, r5}\n\t"
  122436. "ldm %[a]!, {r4, r5}\n\t"
  122437. "ldm %[b]!, {r6, r7}\n\t"
  122438. #ifdef WOLFSSL_KEIL
  122439. "sbcs r4, r4, r6\n\t"
  122440. #elif defined(__clang__)
  122441. "sbcs r4, r6\n\t"
  122442. #else
  122443. "sbc r4, r6\n\t"
  122444. #endif
  122445. #ifdef WOLFSSL_KEIL
  122446. "sbcs r5, r5, r7\n\t"
  122447. #elif defined(__clang__)
  122448. "sbcs r5, r7\n\t"
  122449. #else
  122450. "sbc r5, r7\n\t"
  122451. #endif
  122452. "stm %[r]!, {r4, r5}\n\t"
  122453. "ldm %[a]!, {r4, r5}\n\t"
  122454. "ldm %[b]!, {r6, r7}\n\t"
  122455. #ifdef WOLFSSL_KEIL
  122456. "sbcs r4, r4, r6\n\t"
  122457. #elif defined(__clang__)
  122458. "sbcs r4, r6\n\t"
  122459. #else
  122460. "sbc r4, r6\n\t"
  122461. #endif
  122462. #ifdef WOLFSSL_KEIL
  122463. "sbcs r5, r5, r7\n\t"
  122464. #elif defined(__clang__)
  122465. "sbcs r5, r7\n\t"
  122466. #else
  122467. "sbc r5, r7\n\t"
  122468. #endif
  122469. "stm %[r]!, {r4, r5}\n\t"
  122470. "ldm %[a]!, {r4}\n\t"
  122471. "ldm %[b]!, {r6}\n\t"
  122472. #ifdef WOLFSSL_KEIL
  122473. "sbcs r4, r4, r6\n\t"
  122474. #elif defined(__clang__)
  122475. "sbcs r4, r6\n\t"
  122476. #else
  122477. "sbc r4, r6\n\t"
  122478. #endif
  122479. "movs r7, #1\n\t"
  122480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122481. "lsls r7, r7, #8\n\t"
  122482. #else
  122483. "lsl r7, r7, #8\n\t"
  122484. #endif
  122485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122486. "adds r7, r7, #0xff\n\t"
  122487. #else
  122488. "add r7, r7, #0xff\n\t"
  122489. #endif
  122490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122491. "asrs %[m], r4, #9\n\t"
  122492. #else
  122493. "asr %[m], r4, #9\n\t"
  122494. #endif
  122495. #ifdef WOLFSSL_KEIL
  122496. "ands r4, r4, r7\n\t"
  122497. #elif defined(__clang__)
  122498. "ands r4, r7\n\t"
  122499. #else
  122500. "and r4, r7\n\t"
  122501. #endif
  122502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122503. "negs %[m], %[m]\n\t"
  122504. #else
  122505. "neg %[m], %[m]\n\t"
  122506. #endif
  122507. "stm %[r]!, {r4}\n\t"
  122508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122509. "subs %[r], %[r], #0x44\n\t"
  122510. #else
  122511. "sub %[r], %[r], #0x44\n\t"
  122512. #endif
  122513. "movs r7, #0\n\t"
  122514. "ldr r4, [%[r]]\n\t"
  122515. "ldr r5, [%[r], #4]\n\t"
  122516. "ldr r6, [%[r], #8]\n\t"
  122517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122518. "subs r4, r4, %[m]\n\t"
  122519. #else
  122520. "sub r4, r4, %[m]\n\t"
  122521. #endif
  122522. #ifdef WOLFSSL_KEIL
  122523. "sbcs r5, r5, r7\n\t"
  122524. #elif defined(__clang__)
  122525. "sbcs r5, r7\n\t"
  122526. #else
  122527. "sbc r5, r7\n\t"
  122528. #endif
  122529. #ifdef WOLFSSL_KEIL
  122530. "sbcs r6, r6, r7\n\t"
  122531. #elif defined(__clang__)
  122532. "sbcs r6, r7\n\t"
  122533. #else
  122534. "sbc r6, r7\n\t"
  122535. #endif
  122536. "stm %[r]!, {r4, r5, r6}\n\t"
  122537. "ldr r4, [%[r]]\n\t"
  122538. "ldr r5, [%[r], #4]\n\t"
  122539. "ldr r6, [%[r], #8]\n\t"
  122540. #ifdef WOLFSSL_KEIL
  122541. "sbcs r4, r4, r7\n\t"
  122542. #elif defined(__clang__)
  122543. "sbcs r4, r7\n\t"
  122544. #else
  122545. "sbc r4, r7\n\t"
  122546. #endif
  122547. #ifdef WOLFSSL_KEIL
  122548. "sbcs r5, r5, r7\n\t"
  122549. #elif defined(__clang__)
  122550. "sbcs r5, r7\n\t"
  122551. #else
  122552. "sbc r5, r7\n\t"
  122553. #endif
  122554. #ifdef WOLFSSL_KEIL
  122555. "sbcs r6, r6, r7\n\t"
  122556. #elif defined(__clang__)
  122557. "sbcs r6, r7\n\t"
  122558. #else
  122559. "sbc r6, r7\n\t"
  122560. #endif
  122561. "stm %[r]!, {r4, r5, r6}\n\t"
  122562. "ldr r4, [%[r]]\n\t"
  122563. "ldr r5, [%[r], #4]\n\t"
  122564. "ldr r6, [%[r], #8]\n\t"
  122565. #ifdef WOLFSSL_KEIL
  122566. "sbcs r4, r4, r7\n\t"
  122567. #elif defined(__clang__)
  122568. "sbcs r4, r7\n\t"
  122569. #else
  122570. "sbc r4, r7\n\t"
  122571. #endif
  122572. #ifdef WOLFSSL_KEIL
  122573. "sbcs r5, r5, r7\n\t"
  122574. #elif defined(__clang__)
  122575. "sbcs r5, r7\n\t"
  122576. #else
  122577. "sbc r5, r7\n\t"
  122578. #endif
  122579. #ifdef WOLFSSL_KEIL
  122580. "sbcs r6, r6, r7\n\t"
  122581. #elif defined(__clang__)
  122582. "sbcs r6, r7\n\t"
  122583. #else
  122584. "sbc r6, r7\n\t"
  122585. #endif
  122586. "stm %[r]!, {r4, r5, r6}\n\t"
  122587. "ldr r4, [%[r]]\n\t"
  122588. "ldr r5, [%[r], #4]\n\t"
  122589. "ldr r6, [%[r], #8]\n\t"
  122590. #ifdef WOLFSSL_KEIL
  122591. "sbcs r4, r4, r7\n\t"
  122592. #elif defined(__clang__)
  122593. "sbcs r4, r7\n\t"
  122594. #else
  122595. "sbc r4, r7\n\t"
  122596. #endif
  122597. #ifdef WOLFSSL_KEIL
  122598. "sbcs r5, r5, r7\n\t"
  122599. #elif defined(__clang__)
  122600. "sbcs r5, r7\n\t"
  122601. #else
  122602. "sbc r5, r7\n\t"
  122603. #endif
  122604. #ifdef WOLFSSL_KEIL
  122605. "sbcs r6, r6, r7\n\t"
  122606. #elif defined(__clang__)
  122607. "sbcs r6, r7\n\t"
  122608. #else
  122609. "sbc r6, r7\n\t"
  122610. #endif
  122611. "stm %[r]!, {r4, r5, r6}\n\t"
  122612. "ldr r4, [%[r]]\n\t"
  122613. "ldr r5, [%[r], #4]\n\t"
  122614. "ldr r6, [%[r], #8]\n\t"
  122615. #ifdef WOLFSSL_KEIL
  122616. "sbcs r4, r4, r7\n\t"
  122617. #elif defined(__clang__)
  122618. "sbcs r4, r7\n\t"
  122619. #else
  122620. "sbc r4, r7\n\t"
  122621. #endif
  122622. #ifdef WOLFSSL_KEIL
  122623. "sbcs r5, r5, r7\n\t"
  122624. #elif defined(__clang__)
  122625. "sbcs r5, r7\n\t"
  122626. #else
  122627. "sbc r5, r7\n\t"
  122628. #endif
  122629. #ifdef WOLFSSL_KEIL
  122630. "sbcs r6, r6, r7\n\t"
  122631. #elif defined(__clang__)
  122632. "sbcs r6, r7\n\t"
  122633. #else
  122634. "sbc r6, r7\n\t"
  122635. #endif
  122636. "stm %[r]!, {r4, r5, r6}\n\t"
  122637. "ldr r4, [%[r]]\n\t"
  122638. "ldr r5, [%[r], #4]\n\t"
  122639. #ifdef WOLFSSL_KEIL
  122640. "sbcs r4, r4, r7\n\t"
  122641. #elif defined(__clang__)
  122642. "sbcs r4, r7\n\t"
  122643. #else
  122644. "sbc r4, r7\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. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122655. "subs %[r], %[r], #0x44\n\t"
  122656. #else
  122657. "sub %[r], %[r], #0x44\n\t"
  122658. #endif
  122659. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  122660. :
  122661. : "memory", "r4", "r5", "r6", "r7"
  122662. );
  122663. }
  122664. #define sp_521_mont_sub_lower_17 sp_521_mont_sub_17
  122665. /* Right shift a by 1 bit into r. (r = a >> 1)
  122666. *
  122667. * r A single precision integer.
  122668. * a A single precision integer.
  122669. */
  122670. static void sp_521_rshift1_17(sp_digit* r, const sp_digit* a)
  122671. {
  122672. __asm__ __volatile__ (
  122673. "ldr r2, [%[a]]\n\t"
  122674. "ldr r3, [%[a], #4]\n\t"
  122675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122676. "lsrs r2, r2, #1\n\t"
  122677. #else
  122678. "lsr r2, r2, #1\n\t"
  122679. #endif
  122680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122681. "lsls r5, r3, #31\n\t"
  122682. #else
  122683. "lsl r5, r3, #31\n\t"
  122684. #endif
  122685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122686. "lsrs r3, r3, #1\n\t"
  122687. #else
  122688. "lsr r3, r3, #1\n\t"
  122689. #endif
  122690. #ifdef WOLFSSL_KEIL
  122691. "orrs r2, r2, r5\n\t"
  122692. #elif defined(__clang__)
  122693. "orrs r2, r5\n\t"
  122694. #else
  122695. "orr r2, r5\n\t"
  122696. #endif
  122697. "ldr r4, [%[a], #8]\n\t"
  122698. "str r2, [%[r]]\n\t"
  122699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122700. "lsls r5, r4, #31\n\t"
  122701. #else
  122702. "lsl r5, r4, #31\n\t"
  122703. #endif
  122704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122705. "lsrs r4, r4, #1\n\t"
  122706. #else
  122707. "lsr r4, r4, #1\n\t"
  122708. #endif
  122709. #ifdef WOLFSSL_KEIL
  122710. "orrs r3, r3, r5\n\t"
  122711. #elif defined(__clang__)
  122712. "orrs r3, r5\n\t"
  122713. #else
  122714. "orr r3, r5\n\t"
  122715. #endif
  122716. "ldr r2, [%[a], #12]\n\t"
  122717. "str r3, [%[r], #4]\n\t"
  122718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122719. "lsls r5, r2, #31\n\t"
  122720. #else
  122721. "lsl r5, r2, #31\n\t"
  122722. #endif
  122723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122724. "lsrs r2, r2, #1\n\t"
  122725. #else
  122726. "lsr r2, r2, #1\n\t"
  122727. #endif
  122728. #ifdef WOLFSSL_KEIL
  122729. "orrs r4, r4, r5\n\t"
  122730. #elif defined(__clang__)
  122731. "orrs r4, r5\n\t"
  122732. #else
  122733. "orr r4, r5\n\t"
  122734. #endif
  122735. "ldr r3, [%[a], #16]\n\t"
  122736. "str r4, [%[r], #8]\n\t"
  122737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122738. "lsls r5, r3, #31\n\t"
  122739. #else
  122740. "lsl r5, r3, #31\n\t"
  122741. #endif
  122742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122743. "lsrs r3, r3, #1\n\t"
  122744. #else
  122745. "lsr r3, r3, #1\n\t"
  122746. #endif
  122747. #ifdef WOLFSSL_KEIL
  122748. "orrs r2, r2, r5\n\t"
  122749. #elif defined(__clang__)
  122750. "orrs r2, r5\n\t"
  122751. #else
  122752. "orr r2, r5\n\t"
  122753. #endif
  122754. "ldr r4, [%[a], #20]\n\t"
  122755. "str r2, [%[r], #12]\n\t"
  122756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122757. "lsls r5, r4, #31\n\t"
  122758. #else
  122759. "lsl r5, r4, #31\n\t"
  122760. #endif
  122761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122762. "lsrs r4, r4, #1\n\t"
  122763. #else
  122764. "lsr r4, r4, #1\n\t"
  122765. #endif
  122766. #ifdef WOLFSSL_KEIL
  122767. "orrs r3, r3, r5\n\t"
  122768. #elif defined(__clang__)
  122769. "orrs r3, r5\n\t"
  122770. #else
  122771. "orr r3, r5\n\t"
  122772. #endif
  122773. "ldr r2, [%[a], #24]\n\t"
  122774. "str r3, [%[r], #16]\n\t"
  122775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122776. "lsls r5, r2, #31\n\t"
  122777. #else
  122778. "lsl r5, r2, #31\n\t"
  122779. #endif
  122780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122781. "lsrs r2, r2, #1\n\t"
  122782. #else
  122783. "lsr r2, r2, #1\n\t"
  122784. #endif
  122785. #ifdef WOLFSSL_KEIL
  122786. "orrs r4, r4, r5\n\t"
  122787. #elif defined(__clang__)
  122788. "orrs r4, r5\n\t"
  122789. #else
  122790. "orr r4, r5\n\t"
  122791. #endif
  122792. "ldr r3, [%[a], #28]\n\t"
  122793. "str r4, [%[r], #20]\n\t"
  122794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122795. "lsls r5, r3, #31\n\t"
  122796. #else
  122797. "lsl r5, r3, #31\n\t"
  122798. #endif
  122799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122800. "lsrs r3, r3, #1\n\t"
  122801. #else
  122802. "lsr r3, r3, #1\n\t"
  122803. #endif
  122804. #ifdef WOLFSSL_KEIL
  122805. "orrs r2, r2, r5\n\t"
  122806. #elif defined(__clang__)
  122807. "orrs r2, r5\n\t"
  122808. #else
  122809. "orr r2, r5\n\t"
  122810. #endif
  122811. "ldr r4, [%[a], #32]\n\t"
  122812. "str r2, [%[r], #24]\n\t"
  122813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122814. "lsls r5, r4, #31\n\t"
  122815. #else
  122816. "lsl r5, r4, #31\n\t"
  122817. #endif
  122818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122819. "lsrs r4, r4, #1\n\t"
  122820. #else
  122821. "lsr r4, r4, #1\n\t"
  122822. #endif
  122823. #ifdef WOLFSSL_KEIL
  122824. "orrs r3, r3, r5\n\t"
  122825. #elif defined(__clang__)
  122826. "orrs r3, r5\n\t"
  122827. #else
  122828. "orr r3, r5\n\t"
  122829. #endif
  122830. "ldr r2, [%[a], #36]\n\t"
  122831. "str r3, [%[r], #28]\n\t"
  122832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122833. "lsls r5, r2, #31\n\t"
  122834. #else
  122835. "lsl r5, r2, #31\n\t"
  122836. #endif
  122837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122838. "lsrs r2, r2, #1\n\t"
  122839. #else
  122840. "lsr r2, r2, #1\n\t"
  122841. #endif
  122842. #ifdef WOLFSSL_KEIL
  122843. "orrs r4, r4, r5\n\t"
  122844. #elif defined(__clang__)
  122845. "orrs r4, r5\n\t"
  122846. #else
  122847. "orr r4, r5\n\t"
  122848. #endif
  122849. "ldr r3, [%[a], #40]\n\t"
  122850. "str r4, [%[r], #32]\n\t"
  122851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122852. "lsls r5, r3, #31\n\t"
  122853. #else
  122854. "lsl r5, r3, #31\n\t"
  122855. #endif
  122856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122857. "lsrs r3, r3, #1\n\t"
  122858. #else
  122859. "lsr r3, r3, #1\n\t"
  122860. #endif
  122861. #ifdef WOLFSSL_KEIL
  122862. "orrs r2, r2, r5\n\t"
  122863. #elif defined(__clang__)
  122864. "orrs r2, r5\n\t"
  122865. #else
  122866. "orr r2, r5\n\t"
  122867. #endif
  122868. "ldr r4, [%[a], #44]\n\t"
  122869. "str r2, [%[r], #36]\n\t"
  122870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122871. "lsls r5, r4, #31\n\t"
  122872. #else
  122873. "lsl r5, r4, #31\n\t"
  122874. #endif
  122875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122876. "lsrs r4, r4, #1\n\t"
  122877. #else
  122878. "lsr r4, r4, #1\n\t"
  122879. #endif
  122880. #ifdef WOLFSSL_KEIL
  122881. "orrs r3, r3, r5\n\t"
  122882. #elif defined(__clang__)
  122883. "orrs r3, r5\n\t"
  122884. #else
  122885. "orr r3, r5\n\t"
  122886. #endif
  122887. "ldr r2, [%[a], #48]\n\t"
  122888. "str r3, [%[r], #40]\n\t"
  122889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122890. "lsls r5, r2, #31\n\t"
  122891. #else
  122892. "lsl r5, r2, #31\n\t"
  122893. #endif
  122894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122895. "lsrs r2, r2, #1\n\t"
  122896. #else
  122897. "lsr r2, r2, #1\n\t"
  122898. #endif
  122899. #ifdef WOLFSSL_KEIL
  122900. "orrs r4, r4, r5\n\t"
  122901. #elif defined(__clang__)
  122902. "orrs r4, r5\n\t"
  122903. #else
  122904. "orr r4, r5\n\t"
  122905. #endif
  122906. "ldr r3, [%[a], #52]\n\t"
  122907. "str r4, [%[r], #44]\n\t"
  122908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122909. "lsls r5, r3, #31\n\t"
  122910. #else
  122911. "lsl r5, r3, #31\n\t"
  122912. #endif
  122913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122914. "lsrs r3, r3, #1\n\t"
  122915. #else
  122916. "lsr r3, r3, #1\n\t"
  122917. #endif
  122918. #ifdef WOLFSSL_KEIL
  122919. "orrs r2, r2, r5\n\t"
  122920. #elif defined(__clang__)
  122921. "orrs r2, r5\n\t"
  122922. #else
  122923. "orr r2, r5\n\t"
  122924. #endif
  122925. "ldr r4, [%[a], #56]\n\t"
  122926. "str r2, [%[r], #48]\n\t"
  122927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122928. "lsls r5, r4, #31\n\t"
  122929. #else
  122930. "lsl r5, r4, #31\n\t"
  122931. #endif
  122932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122933. "lsrs r4, r4, #1\n\t"
  122934. #else
  122935. "lsr r4, r4, #1\n\t"
  122936. #endif
  122937. #ifdef WOLFSSL_KEIL
  122938. "orrs r3, r3, r5\n\t"
  122939. #elif defined(__clang__)
  122940. "orrs r3, r5\n\t"
  122941. #else
  122942. "orr r3, r5\n\t"
  122943. #endif
  122944. "ldr r2, [%[a], #60]\n\t"
  122945. "str r3, [%[r], #52]\n\t"
  122946. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122947. "lsls r5, r2, #31\n\t"
  122948. #else
  122949. "lsl r5, r2, #31\n\t"
  122950. #endif
  122951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122952. "lsrs r2, r2, #1\n\t"
  122953. #else
  122954. "lsr r2, r2, #1\n\t"
  122955. #endif
  122956. #ifdef WOLFSSL_KEIL
  122957. "orrs r4, r4, r5\n\t"
  122958. #elif defined(__clang__)
  122959. "orrs r4, r5\n\t"
  122960. #else
  122961. "orr r4, r5\n\t"
  122962. #endif
  122963. "ldr r3, [%[a], #64]\n\t"
  122964. "str r4, [%[r], #56]\n\t"
  122965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122966. "lsls r5, r3, #31\n\t"
  122967. #else
  122968. "lsl r5, r3, #31\n\t"
  122969. #endif
  122970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  122971. "lsrs r3, r3, #1\n\t"
  122972. #else
  122973. "lsr r3, r3, #1\n\t"
  122974. #endif
  122975. #ifdef WOLFSSL_KEIL
  122976. "orrs r2, r2, r5\n\t"
  122977. #elif defined(__clang__)
  122978. "orrs r2, r5\n\t"
  122979. #else
  122980. "orr r2, r5\n\t"
  122981. #endif
  122982. "str r2, [%[r], #60]\n\t"
  122983. "str r3, [%[r], #64]\n\t"
  122984. : [r] "+l" (r), [a] "+l" (a)
  122985. :
  122986. : "memory", "r2", "r3", "r4", "r5"
  122987. );
  122988. }
  122989. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  122990. *
  122991. * r Result of division by 2.
  122992. * a Number to divide.
  122993. * m Modulus (prime).
  122994. */
  122995. SP_NOINLINE static void sp_521_div2_17(sp_digit* r, const sp_digit* a,
  122996. const sp_digit* m)
  122997. {
  122998. sp_digit o;
  122999. o = sp_521_cond_add_17(r, a, m, 0 - (a[0] & 1));
  123000. sp_521_rshift1_17(r, r);
  123001. r[16] |= o << 31;
  123002. }
  123003. /* Double the Montgomery form projective point p.
  123004. *
  123005. * r Result of doubling point.
  123006. * p Point to double.
  123007. * t Temporary ordinate data.
  123008. */
  123009. #ifdef WOLFSSL_SP_NONBLOCK
  123010. typedef struct sp_521_proj_point_dbl_17_ctx {
  123011. int state;
  123012. sp_digit* t1;
  123013. sp_digit* t2;
  123014. sp_digit* x;
  123015. sp_digit* y;
  123016. sp_digit* z;
  123017. } sp_521_proj_point_dbl_17_ctx;
  123018. 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)
  123019. {
  123020. int err = FP_WOULDBLOCK;
  123021. sp_521_proj_point_dbl_17_ctx* ctx = (sp_521_proj_point_dbl_17_ctx*)sp_ctx->data;
  123022. typedef char ctx_size_test[sizeof(sp_521_proj_point_dbl_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  123023. (void)sizeof(ctx_size_test);
  123024. switch (ctx->state) {
  123025. case 0:
  123026. ctx->t1 = t;
  123027. ctx->t2 = t + 2*17;
  123028. ctx->x = r->x;
  123029. ctx->y = r->y;
  123030. ctx->z = r->z;
  123031. /* Put infinity into result. */
  123032. if (r != p) {
  123033. r->infinity = p->infinity;
  123034. }
  123035. ctx->state = 1;
  123036. break;
  123037. case 1:
  123038. /* T1 = Z * Z */
  123039. sp_521_mont_sqr_17(ctx->t1, p->z, p521_mod, p521_mp_mod);
  123040. ctx->state = 2;
  123041. break;
  123042. case 2:
  123043. /* Z = Y * Z */
  123044. sp_521_mont_mul_17(ctx->z, p->y, p->z, p521_mod, p521_mp_mod);
  123045. ctx->state = 3;
  123046. break;
  123047. case 3:
  123048. /* Z = 2Z */
  123049. sp_521_mont_dbl_17(ctx->z, ctx->z, p521_mod);
  123050. ctx->state = 4;
  123051. break;
  123052. case 4:
  123053. /* T2 = X - T1 */
  123054. sp_521_mont_sub_17(ctx->t2, p->x, ctx->t1, p521_mod);
  123055. ctx->state = 5;
  123056. break;
  123057. case 5:
  123058. /* T1 = X + T1 */
  123059. sp_521_mont_add_17(ctx->t1, p->x, ctx->t1, p521_mod);
  123060. ctx->state = 6;
  123061. break;
  123062. case 6:
  123063. /* T2 = T1 * T2 */
  123064. sp_521_mont_mul_17(ctx->t2, ctx->t1, ctx->t2, p521_mod, p521_mp_mod);
  123065. ctx->state = 7;
  123066. break;
  123067. case 7:
  123068. /* T1 = 3T2 */
  123069. sp_521_mont_tpl_17(ctx->t1, ctx->t2, p521_mod);
  123070. ctx->state = 8;
  123071. break;
  123072. case 8:
  123073. /* Y = 2Y */
  123074. sp_521_mont_dbl_17(ctx->y, p->y, p521_mod);
  123075. ctx->state = 9;
  123076. break;
  123077. case 9:
  123078. /* Y = Y * Y */
  123079. sp_521_mont_sqr_17(ctx->y, ctx->y, p521_mod, p521_mp_mod);
  123080. ctx->state = 10;
  123081. break;
  123082. case 10:
  123083. /* T2 = Y * Y */
  123084. sp_521_mont_sqr_17(ctx->t2, ctx->y, p521_mod, p521_mp_mod);
  123085. ctx->state = 11;
  123086. break;
  123087. case 11:
  123088. /* T2 = T2/2 */
  123089. sp_521_div2_17(ctx->t2, ctx->t2, p521_mod);
  123090. ctx->state = 12;
  123091. break;
  123092. case 12:
  123093. /* Y = Y * X */
  123094. sp_521_mont_mul_17(ctx->y, ctx->y, p->x, p521_mod, p521_mp_mod);
  123095. ctx->state = 13;
  123096. break;
  123097. case 13:
  123098. /* X = T1 * T1 */
  123099. sp_521_mont_sqr_17(ctx->x, ctx->t1, p521_mod, p521_mp_mod);
  123100. ctx->state = 14;
  123101. break;
  123102. case 14:
  123103. /* X = X - Y */
  123104. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->y, p521_mod);
  123105. ctx->state = 15;
  123106. break;
  123107. case 15:
  123108. /* X = X - Y */
  123109. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->y, p521_mod);
  123110. ctx->state = 16;
  123111. break;
  123112. case 16:
  123113. /* Y = Y - X */
  123114. sp_521_mont_sub_lower_17(ctx->y, ctx->y, ctx->x, p521_mod);
  123115. ctx->state = 17;
  123116. break;
  123117. case 17:
  123118. /* Y = Y * T1 */
  123119. sp_521_mont_mul_17(ctx->y, ctx->y, ctx->t1, p521_mod, p521_mp_mod);
  123120. ctx->state = 18;
  123121. break;
  123122. case 18:
  123123. /* Y = Y - T2 */
  123124. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->t2, p521_mod);
  123125. ctx->state = 19;
  123126. /* fall-through */
  123127. case 19:
  123128. err = MP_OKAY;
  123129. break;
  123130. }
  123131. if (err == MP_OKAY && ctx->state != 19) {
  123132. err = FP_WOULDBLOCK;
  123133. }
  123134. return err;
  123135. }
  123136. #endif /* WOLFSSL_SP_NONBLOCK */
  123137. static void sp_521_proj_point_dbl_17(sp_point_521* r, const sp_point_521* p,
  123138. sp_digit* t)
  123139. {
  123140. sp_digit* t1 = t;
  123141. sp_digit* t2 = t + 2*17;
  123142. sp_digit* x;
  123143. sp_digit* y;
  123144. sp_digit* z;
  123145. x = r->x;
  123146. y = r->y;
  123147. z = r->z;
  123148. /* Put infinity into result. */
  123149. if (r != p) {
  123150. r->infinity = p->infinity;
  123151. }
  123152. /* T1 = Z * Z */
  123153. sp_521_mont_sqr_17(t1, p->z, p521_mod, p521_mp_mod);
  123154. /* Z = Y * Z */
  123155. sp_521_mont_mul_17(z, p->y, p->z, p521_mod, p521_mp_mod);
  123156. /* Z = 2Z */
  123157. sp_521_mont_dbl_17(z, z, p521_mod);
  123158. /* T2 = X - T1 */
  123159. sp_521_mont_sub_17(t2, p->x, t1, p521_mod);
  123160. /* T1 = X + T1 */
  123161. sp_521_mont_add_17(t1, p->x, t1, p521_mod);
  123162. /* T2 = T1 * T2 */
  123163. sp_521_mont_mul_17(t2, t1, t2, p521_mod, p521_mp_mod);
  123164. /* T1 = 3T2 */
  123165. sp_521_mont_tpl_17(t1, t2, p521_mod);
  123166. /* Y = 2Y */
  123167. sp_521_mont_dbl_17(y, p->y, p521_mod);
  123168. /* Y = Y * Y */
  123169. sp_521_mont_sqr_17(y, y, p521_mod, p521_mp_mod);
  123170. /* T2 = Y * Y */
  123171. sp_521_mont_sqr_17(t2, y, p521_mod, p521_mp_mod);
  123172. /* T2 = T2/2 */
  123173. sp_521_div2_17(t2, t2, p521_mod);
  123174. /* Y = Y * X */
  123175. sp_521_mont_mul_17(y, y, p->x, p521_mod, p521_mp_mod);
  123176. /* X = T1 * T1 */
  123177. sp_521_mont_sqr_17(x, t1, p521_mod, p521_mp_mod);
  123178. /* X = X - Y */
  123179. sp_521_mont_sub_17(x, x, y, p521_mod);
  123180. /* X = X - Y */
  123181. sp_521_mont_sub_17(x, x, y, p521_mod);
  123182. /* Y = Y - X */
  123183. sp_521_mont_sub_lower_17(y, y, x, p521_mod);
  123184. /* Y = Y * T1 */
  123185. sp_521_mont_mul_17(y, y, t1, p521_mod, p521_mp_mod);
  123186. /* Y = Y - T2 */
  123187. sp_521_mont_sub_17(y, y, t2, p521_mod);
  123188. }
  123189. /* Compare two numbers to determine if they are equal.
  123190. * Constant time implementation.
  123191. *
  123192. * a First number to compare.
  123193. * b Second number to compare.
  123194. * returns 1 when equal and 0 otherwise.
  123195. */
  123196. static int sp_521_cmp_equal_17(const sp_digit* a, const sp_digit* b)
  123197. {
  123198. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  123199. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  123200. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  123201. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  123202. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  123203. (a[15] ^ b[15]) | (a[16] ^ b[16])) == 0;
  123204. }
  123205. /* Returns 1 if the number of zero.
  123206. * Implementation is constant time.
  123207. *
  123208. * a Number to check.
  123209. * returns 1 if the number is zero and 0 otherwise.
  123210. */
  123211. static int sp_521_iszero_17(const sp_digit* a)
  123212. {
  123213. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  123214. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  123215. a[16]) == 0;
  123216. }
  123217. /* Add two Montgomery form projective points.
  123218. *
  123219. * r Result of addition.
  123220. * p First point to add.
  123221. * q Second point to add.
  123222. * t Temporary ordinate data.
  123223. */
  123224. #ifdef WOLFSSL_SP_NONBLOCK
  123225. typedef struct sp_521_proj_point_add_17_ctx {
  123226. int state;
  123227. sp_521_proj_point_dbl_17_ctx dbl_ctx;
  123228. const sp_point_521* ap[2];
  123229. sp_point_521* rp[2];
  123230. sp_digit* t1;
  123231. sp_digit* t2;
  123232. sp_digit* t3;
  123233. sp_digit* t4;
  123234. sp_digit* t5;
  123235. sp_digit* t6;
  123236. sp_digit* x;
  123237. sp_digit* y;
  123238. sp_digit* z;
  123239. } sp_521_proj_point_add_17_ctx;
  123240. static int sp_521_proj_point_add_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r,
  123241. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  123242. {
  123243. int err = FP_WOULDBLOCK;
  123244. sp_521_proj_point_add_17_ctx* ctx = (sp_521_proj_point_add_17_ctx*)sp_ctx->data;
  123245. /* Ensure only the first point is the same as the result. */
  123246. if (q == r) {
  123247. const sp_point_521* a = p;
  123248. p = q;
  123249. q = a;
  123250. }
  123251. typedef char ctx_size_test[sizeof(sp_521_proj_point_add_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  123252. (void)sizeof(ctx_size_test);
  123253. switch (ctx->state) {
  123254. case 0: /* INIT */
  123255. ctx->t1 = t;
  123256. ctx->t2 = t + 2*17;
  123257. ctx->t3 = t + 4*17;
  123258. ctx->t4 = t + 6*17;
  123259. ctx->t5 = t + 8*17;
  123260. ctx->t6 = t + 10*17;
  123261. ctx->x = ctx->t6;
  123262. ctx->y = ctx->t1;
  123263. ctx->z = ctx->t2;
  123264. ctx->state = 1;
  123265. break;
  123266. case 1:
  123267. /* Check double */
  123268. (void)sp_521_sub_17(ctx->t1, p521_mod, q->y);
  123269. sp_521_norm_17(ctx->t1);
  123270. if ((~p->infinity & ~q->infinity &
  123271. sp_521_cmp_equal_17(p->x, q->x) & sp_521_cmp_equal_17(p->z, q->z) &
  123272. (sp_521_cmp_equal_17(p->y, q->y) | sp_521_cmp_equal_17(p->y, ctx->t1))) != 0)
  123273. {
  123274. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  123275. ctx->state = 2;
  123276. }
  123277. else {
  123278. ctx->state = 3;
  123279. }
  123280. break;
  123281. case 2:
  123282. err = sp_521_proj_point_dbl_17_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  123283. if (err == MP_OKAY)
  123284. ctx->state = 27; /* done */
  123285. break;
  123286. case 3:
  123287. {
  123288. ctx->state = 4;
  123289. break;
  123290. }
  123291. case 4:
  123292. /* U1 = X1*Z2^2 */
  123293. sp_521_mont_sqr_17(ctx->t1, q->z, p521_mod, p521_mp_mod);
  123294. ctx->state = 5;
  123295. break;
  123296. case 5:
  123297. sp_521_mont_mul_17(ctx->t3, ctx->t1, q->z, p521_mod, p521_mp_mod);
  123298. ctx->state = 6;
  123299. break;
  123300. case 6:
  123301. sp_521_mont_mul_17(ctx->t1, ctx->t1, p->x, p521_mod, p521_mp_mod);
  123302. ctx->state = 7;
  123303. break;
  123304. case 7:
  123305. /* U2 = X2*Z1^2 */
  123306. sp_521_mont_sqr_17(ctx->t2, p->z, p521_mod, p521_mp_mod);
  123307. ctx->state = 8;
  123308. break;
  123309. case 8:
  123310. sp_521_mont_mul_17(ctx->t4, ctx->t2, p->z, p521_mod, p521_mp_mod);
  123311. ctx->state = 9;
  123312. break;
  123313. case 9:
  123314. sp_521_mont_mul_17(ctx->t2, ctx->t2, q->x, p521_mod, p521_mp_mod);
  123315. ctx->state = 10;
  123316. break;
  123317. case 10:
  123318. /* S1 = Y1*Z2^3 */
  123319. sp_521_mont_mul_17(ctx->t3, ctx->t3, p->y, p521_mod, p521_mp_mod);
  123320. ctx->state = 11;
  123321. break;
  123322. case 11:
  123323. /* S2 = Y2*Z1^3 */
  123324. sp_521_mont_mul_17(ctx->t4, ctx->t4, q->y, p521_mod, p521_mp_mod);
  123325. ctx->state = 12;
  123326. break;
  123327. case 12:
  123328. /* H = U2 - U1 */
  123329. sp_521_mont_sub_17(ctx->t2, ctx->t2, ctx->t1, p521_mod);
  123330. ctx->state = 13;
  123331. break;
  123332. case 13:
  123333. /* R = S2 - S1 */
  123334. sp_521_mont_sub_17(ctx->t4, ctx->t4, ctx->t3, p521_mod);
  123335. ctx->state = 14;
  123336. break;
  123337. case 14:
  123338. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  123339. sp_521_mont_sqr_17(ctx->t5, ctx->t2, p521_mod, p521_mp_mod);
  123340. ctx->state = 15;
  123341. break;
  123342. case 15:
  123343. sp_521_mont_mul_17(ctx->y, ctx->t1, ctx->t5, p521_mod, p521_mp_mod);
  123344. ctx->state = 16;
  123345. break;
  123346. case 16:
  123347. sp_521_mont_mul_17(ctx->t5, ctx->t5, ctx->t2, p521_mod, p521_mp_mod);
  123348. ctx->state = 17;
  123349. break;
  123350. case 17:
  123351. /* Z3 = H*Z1*Z2 */
  123352. sp_521_mont_mul_17(ctx->z, p->z, ctx->t2, p521_mod, p521_mp_mod);
  123353. ctx->state = 18;
  123354. break;
  123355. case 18:
  123356. sp_521_mont_mul_17(ctx->z, ctx->z, q->z, p521_mod, p521_mp_mod);
  123357. ctx->state = 19;
  123358. break;
  123359. case 19:
  123360. sp_521_mont_sqr_17(ctx->x, ctx->t4, p521_mod, p521_mp_mod);
  123361. ctx->state = 20;
  123362. break;
  123363. case 20:
  123364. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->t5, p521_mod);
  123365. ctx->state = 21;
  123366. break;
  123367. case 21:
  123368. sp_521_mont_mul_17(ctx->t5, ctx->t5, ctx->t3, p521_mod, p521_mp_mod);
  123369. ctx->state = 22;
  123370. break;
  123371. case 22:
  123372. sp_521_mont_dbl_17(ctx->t3, ctx->y, p521_mod);
  123373. ctx->state = 23;
  123374. break;
  123375. case 23:
  123376. sp_521_mont_sub_17(ctx->x, ctx->x, ctx->t3, p521_mod);
  123377. ctx->state = 24;
  123378. break;
  123379. case 24:
  123380. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  123381. sp_521_mont_sub_lower_17(ctx->y, ctx->y, ctx->x, p521_mod);
  123382. ctx->state = 25;
  123383. break;
  123384. case 25:
  123385. sp_521_mont_mul_17(ctx->y, ctx->y, ctx->t4, p521_mod, p521_mp_mod);
  123386. ctx->state = 26;
  123387. break;
  123388. case 26:
  123389. sp_521_mont_sub_17(ctx->y, ctx->y, ctx->t5, p521_mod);
  123390. ctx->state = 27;
  123391. /* fall-through */
  123392. case 27:
  123393. {
  123394. int i;
  123395. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  123396. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  123397. sp_digit maskt = ~(maskp | maskq);
  123398. for (i = 0; i < 17; i++) {
  123399. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  123400. (ctx->x[i] & maskt);
  123401. }
  123402. for (i = 0; i < 17; i++) {
  123403. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  123404. (ctx->y[i] & maskt);
  123405. }
  123406. for (i = 0; i < 17; i++) {
  123407. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  123408. (ctx->z[i] & maskt);
  123409. }
  123410. r->z[0] |= p->infinity & q->infinity;
  123411. r->infinity = p->infinity & q->infinity;
  123412. err = MP_OKAY;
  123413. break;
  123414. }
  123415. }
  123416. if (err == MP_OKAY && ctx->state != 27) {
  123417. err = FP_WOULDBLOCK;
  123418. }
  123419. return err;
  123420. }
  123421. #endif /* WOLFSSL_SP_NONBLOCK */
  123422. static void sp_521_proj_point_add_17(sp_point_521* r,
  123423. const sp_point_521* p, const sp_point_521* q, sp_digit* t)
  123424. {
  123425. sp_digit* t1 = t;
  123426. sp_digit* t2 = t + 2*17;
  123427. sp_digit* t3 = t + 4*17;
  123428. sp_digit* t4 = t + 6*17;
  123429. sp_digit* t5 = t + 8*17;
  123430. sp_digit* t6 = t + 10*17;
  123431. /* Check double */
  123432. (void)sp_521_sub_17(t1, p521_mod, q->y);
  123433. sp_521_norm_17(t1);
  123434. if ((~p->infinity & ~q->infinity &
  123435. sp_521_cmp_equal_17(p->x, q->x) & sp_521_cmp_equal_17(p->z, q->z) &
  123436. (sp_521_cmp_equal_17(p->y, q->y) | sp_521_cmp_equal_17(p->y, t1))) != 0) {
  123437. sp_521_proj_point_dbl_17(r, p, t);
  123438. }
  123439. else {
  123440. sp_digit maskp;
  123441. sp_digit maskq;
  123442. sp_digit maskt;
  123443. sp_digit* x = t6;
  123444. sp_digit* y = t1;
  123445. sp_digit* z = t2;
  123446. int i;
  123447. maskp = 0 - (q->infinity & (!p->infinity));
  123448. maskq = 0 - (p->infinity & (!q->infinity));
  123449. maskt = ~(maskp | maskq);
  123450. /* U1 = X1*Z2^2 */
  123451. sp_521_mont_sqr_17(t1, q->z, p521_mod, p521_mp_mod);
  123452. sp_521_mont_mul_17(t3, t1, q->z, p521_mod, p521_mp_mod);
  123453. sp_521_mont_mul_17(t1, t1, p->x, p521_mod, p521_mp_mod);
  123454. /* U2 = X2*Z1^2 */
  123455. sp_521_mont_sqr_17(t2, p->z, p521_mod, p521_mp_mod);
  123456. sp_521_mont_mul_17(t4, t2, p->z, p521_mod, p521_mp_mod);
  123457. sp_521_mont_mul_17(t2, t2, q->x, p521_mod, p521_mp_mod);
  123458. /* S1 = Y1*Z2^3 */
  123459. sp_521_mont_mul_17(t3, t3, p->y, p521_mod, p521_mp_mod);
  123460. /* S2 = Y2*Z1^3 */
  123461. sp_521_mont_mul_17(t4, t4, q->y, p521_mod, p521_mp_mod);
  123462. /* H = U2 - U1 */
  123463. sp_521_mont_sub_17(t2, t2, t1, p521_mod);
  123464. /* R = S2 - S1 */
  123465. sp_521_mont_sub_17(t4, t4, t3, p521_mod);
  123466. if (~p->infinity & ~q->infinity &
  123467. sp_521_iszero_17(t2) & sp_521_iszero_17(t4) & maskt) {
  123468. sp_521_proj_point_dbl_17(r, p, t);
  123469. }
  123470. else {
  123471. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  123472. sp_521_mont_sqr_17(t5, t2, p521_mod, p521_mp_mod);
  123473. sp_521_mont_mul_17(y, t1, t5, p521_mod, p521_mp_mod);
  123474. sp_521_mont_mul_17(t5, t5, t2, p521_mod, p521_mp_mod);
  123475. /* Z3 = H*Z1*Z2 */
  123476. sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod);
  123477. sp_521_mont_mul_17(z, z, q->z, p521_mod, p521_mp_mod);
  123478. sp_521_mont_sqr_17(x, t4, p521_mod, p521_mp_mod);
  123479. sp_521_mont_sub_17(x, x, t5, p521_mod);
  123480. sp_521_mont_mul_17(t5, t5, t3, p521_mod, p521_mp_mod);
  123481. sp_521_mont_dbl_17(t3, y, p521_mod);
  123482. sp_521_mont_sub_17(x, x, t3, p521_mod);
  123483. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  123484. sp_521_mont_sub_lower_17(y, y, x, p521_mod);
  123485. sp_521_mont_mul_17(y, y, t4, p521_mod, p521_mp_mod);
  123486. sp_521_mont_sub_17(y, y, t5, p521_mod);
  123487. for (i = 0; i < 17; i++) {
  123488. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  123489. (x[i] & maskt);
  123490. }
  123491. for (i = 0; i < 17; i++) {
  123492. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  123493. (y[i] & maskt);
  123494. }
  123495. for (i = 0; i < 17; i++) {
  123496. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  123497. (z[i] & maskt);
  123498. }
  123499. r->z[0] |= p->infinity & q->infinity;
  123500. r->infinity = p->infinity & q->infinity;
  123501. }
  123502. }
  123503. }
  123504. #ifndef WC_NO_CACHE_RESISTANT
  123505. /* Touch each possible point that could be being copied.
  123506. *
  123507. * r Point to copy into.
  123508. * table Table - start of the entires to access
  123509. * idx Index of entry to retrieve.
  123510. */
  123511. static void sp_521_get_point_16_17(sp_point_521* r, const sp_point_521* table,
  123512. int idx)
  123513. {
  123514. int i;
  123515. sp_digit mask;
  123516. r->x[0] = 0;
  123517. r->x[1] = 0;
  123518. r->x[2] = 0;
  123519. r->x[3] = 0;
  123520. r->x[4] = 0;
  123521. r->x[5] = 0;
  123522. r->x[6] = 0;
  123523. r->x[7] = 0;
  123524. r->x[8] = 0;
  123525. r->x[9] = 0;
  123526. r->x[10] = 0;
  123527. r->x[11] = 0;
  123528. r->x[12] = 0;
  123529. r->x[13] = 0;
  123530. r->x[14] = 0;
  123531. r->x[15] = 0;
  123532. r->x[16] = 0;
  123533. r->y[0] = 0;
  123534. r->y[1] = 0;
  123535. r->y[2] = 0;
  123536. r->y[3] = 0;
  123537. r->y[4] = 0;
  123538. r->y[5] = 0;
  123539. r->y[6] = 0;
  123540. r->y[7] = 0;
  123541. r->y[8] = 0;
  123542. r->y[9] = 0;
  123543. r->y[10] = 0;
  123544. r->y[11] = 0;
  123545. r->y[12] = 0;
  123546. r->y[13] = 0;
  123547. r->y[14] = 0;
  123548. r->y[15] = 0;
  123549. r->y[16] = 0;
  123550. r->z[0] = 0;
  123551. r->z[1] = 0;
  123552. r->z[2] = 0;
  123553. r->z[3] = 0;
  123554. r->z[4] = 0;
  123555. r->z[5] = 0;
  123556. r->z[6] = 0;
  123557. r->z[7] = 0;
  123558. r->z[8] = 0;
  123559. r->z[9] = 0;
  123560. r->z[10] = 0;
  123561. r->z[11] = 0;
  123562. r->z[12] = 0;
  123563. r->z[13] = 0;
  123564. r->z[14] = 0;
  123565. r->z[15] = 0;
  123566. r->z[16] = 0;
  123567. for (i = 1; i < 16; i++) {
  123568. mask = 0 - (i == idx);
  123569. r->x[0] |= mask & table[i].x[0];
  123570. r->x[1] |= mask & table[i].x[1];
  123571. r->x[2] |= mask & table[i].x[2];
  123572. r->x[3] |= mask & table[i].x[3];
  123573. r->x[4] |= mask & table[i].x[4];
  123574. r->x[5] |= mask & table[i].x[5];
  123575. r->x[6] |= mask & table[i].x[6];
  123576. r->x[7] |= mask & table[i].x[7];
  123577. r->x[8] |= mask & table[i].x[8];
  123578. r->x[9] |= mask & table[i].x[9];
  123579. r->x[10] |= mask & table[i].x[10];
  123580. r->x[11] |= mask & table[i].x[11];
  123581. r->x[12] |= mask & table[i].x[12];
  123582. r->x[13] |= mask & table[i].x[13];
  123583. r->x[14] |= mask & table[i].x[14];
  123584. r->x[15] |= mask & table[i].x[15];
  123585. r->x[16] |= mask & table[i].x[16];
  123586. r->y[0] |= mask & table[i].y[0];
  123587. r->y[1] |= mask & table[i].y[1];
  123588. r->y[2] |= mask & table[i].y[2];
  123589. r->y[3] |= mask & table[i].y[3];
  123590. r->y[4] |= mask & table[i].y[4];
  123591. r->y[5] |= mask & table[i].y[5];
  123592. r->y[6] |= mask & table[i].y[6];
  123593. r->y[7] |= mask & table[i].y[7];
  123594. r->y[8] |= mask & table[i].y[8];
  123595. r->y[9] |= mask & table[i].y[9];
  123596. r->y[10] |= mask & table[i].y[10];
  123597. r->y[11] |= mask & table[i].y[11];
  123598. r->y[12] |= mask & table[i].y[12];
  123599. r->y[13] |= mask & table[i].y[13];
  123600. r->y[14] |= mask & table[i].y[14];
  123601. r->y[15] |= mask & table[i].y[15];
  123602. r->y[16] |= mask & table[i].y[16];
  123603. r->z[0] |= mask & table[i].z[0];
  123604. r->z[1] |= mask & table[i].z[1];
  123605. r->z[2] |= mask & table[i].z[2];
  123606. r->z[3] |= mask & table[i].z[3];
  123607. r->z[4] |= mask & table[i].z[4];
  123608. r->z[5] |= mask & table[i].z[5];
  123609. r->z[6] |= mask & table[i].z[6];
  123610. r->z[7] |= mask & table[i].z[7];
  123611. r->z[8] |= mask & table[i].z[8];
  123612. r->z[9] |= mask & table[i].z[9];
  123613. r->z[10] |= mask & table[i].z[10];
  123614. r->z[11] |= mask & table[i].z[11];
  123615. r->z[12] |= mask & table[i].z[12];
  123616. r->z[13] |= mask & table[i].z[13];
  123617. r->z[14] |= mask & table[i].z[14];
  123618. r->z[15] |= mask & table[i].z[15];
  123619. r->z[16] |= mask & table[i].z[16];
  123620. }
  123621. }
  123622. #endif /* !WC_NO_CACHE_RESISTANT */
  123623. /* Multiply the point by the scalar and return the result.
  123624. * If map is true then convert result to affine coordinates.
  123625. *
  123626. * Fast implementation that generates a pre-computation table.
  123627. * 4 bits of window (no sliding!).
  123628. * Uses add and double for calculating table.
  123629. * 521 doubles.
  123630. * 143 adds.
  123631. *
  123632. * r Resulting point.
  123633. * g Point to multiply.
  123634. * k Scalar to multiply by.
  123635. * map Indicates whether to convert result to affine.
  123636. * ct Constant time required.
  123637. * heap Heap to use for allocation.
  123638. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  123639. */
  123640. static int sp_521_ecc_mulmod_fast_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k,
  123641. int map, int ct, void* heap)
  123642. {
  123643. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  123644. sp_point_521* t = NULL;
  123645. sp_digit* tmp = NULL;
  123646. #else
  123647. sp_point_521 t[16 + 1];
  123648. sp_digit tmp[2 * 17 * 6];
  123649. #endif
  123650. sp_point_521* rt = NULL;
  123651. #ifndef WC_NO_CACHE_RESISTANT
  123652. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  123653. sp_point_521* p = NULL;
  123654. #else
  123655. sp_point_521 p[1];
  123656. #endif
  123657. #endif /* !WC_NO_CACHE_RESISTANT */
  123658. sp_digit n;
  123659. int i;
  123660. int c;
  123661. int y;
  123662. int err = MP_OKAY;
  123663. /* Constant time used for cache attack resistance implementation. */
  123664. (void)ct;
  123665. (void)heap;
  123666. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  123667. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * (16 + 1),
  123668. heap, DYNAMIC_TYPE_ECC);
  123669. if (t == NULL)
  123670. err = MEMORY_E;
  123671. #ifndef WC_NO_CACHE_RESISTANT
  123672. if (err == MP_OKAY) {
  123673. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521),
  123674. heap, DYNAMIC_TYPE_ECC);
  123675. if (p == NULL)
  123676. err = MEMORY_E;
  123677. }
  123678. #endif
  123679. if (err == MP_OKAY) {
  123680. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  123681. DYNAMIC_TYPE_ECC);
  123682. if (tmp == NULL)
  123683. err = MEMORY_E;
  123684. }
  123685. #endif
  123686. if (err == MP_OKAY) {
  123687. rt = t + 16;
  123688. /* t[0] = {0, 0, 1} * norm */
  123689. XMEMSET(&t[0], 0, sizeof(t[0]));
  123690. t[0].infinity = 1;
  123691. /* t[1] = {g->x, g->y, g->z} * norm */
  123692. (void)sp_521_mod_mul_norm_17(t[1].x, g->x, p521_mod);
  123693. (void)sp_521_mod_mul_norm_17(t[1].y, g->y, p521_mod);
  123694. (void)sp_521_mod_mul_norm_17(t[1].z, g->z, p521_mod);
  123695. t[1].infinity = 0;
  123696. sp_521_proj_point_dbl_17(&t[ 2], &t[ 1], tmp);
  123697. t[ 2].infinity = 0;
  123698. sp_521_proj_point_add_17(&t[ 3], &t[ 2], &t[ 1], tmp);
  123699. t[ 3].infinity = 0;
  123700. sp_521_proj_point_dbl_17(&t[ 4], &t[ 2], tmp);
  123701. t[ 4].infinity = 0;
  123702. sp_521_proj_point_add_17(&t[ 5], &t[ 3], &t[ 2], tmp);
  123703. t[ 5].infinity = 0;
  123704. sp_521_proj_point_dbl_17(&t[ 6], &t[ 3], tmp);
  123705. t[ 6].infinity = 0;
  123706. sp_521_proj_point_add_17(&t[ 7], &t[ 4], &t[ 3], tmp);
  123707. t[ 7].infinity = 0;
  123708. sp_521_proj_point_dbl_17(&t[ 8], &t[ 4], tmp);
  123709. t[ 8].infinity = 0;
  123710. sp_521_proj_point_add_17(&t[ 9], &t[ 5], &t[ 4], tmp);
  123711. t[ 9].infinity = 0;
  123712. sp_521_proj_point_dbl_17(&t[10], &t[ 5], tmp);
  123713. t[10].infinity = 0;
  123714. sp_521_proj_point_add_17(&t[11], &t[ 6], &t[ 5], tmp);
  123715. t[11].infinity = 0;
  123716. sp_521_proj_point_dbl_17(&t[12], &t[ 6], tmp);
  123717. t[12].infinity = 0;
  123718. sp_521_proj_point_add_17(&t[13], &t[ 7], &t[ 6], tmp);
  123719. t[13].infinity = 0;
  123720. sp_521_proj_point_dbl_17(&t[14], &t[ 7], tmp);
  123721. t[14].infinity = 0;
  123722. sp_521_proj_point_add_17(&t[15], &t[ 8], &t[ 7], tmp);
  123723. t[15].infinity = 0;
  123724. i = 15;
  123725. n = k[i+1] << 0;
  123726. c = 5;
  123727. y = (int)(n >> 5);
  123728. #ifndef WC_NO_CACHE_RESISTANT
  123729. if (ct) {
  123730. sp_521_get_point_16_17(rt, t, y);
  123731. rt->infinity = !y;
  123732. }
  123733. else
  123734. #endif
  123735. {
  123736. XMEMCPY(rt, &t[y], sizeof(sp_point_521));
  123737. }
  123738. n <<= 27;
  123739. for (; i>=0 || c>=4; ) {
  123740. if (c < 4) {
  123741. n = (k[i+1] << 31) | (k[i] >> 1);
  123742. i--;
  123743. c += 32;
  123744. }
  123745. y = (n >> 28) & 0xf;
  123746. n <<= 4;
  123747. c -= 4;
  123748. sp_521_proj_point_dbl_17(rt, rt, tmp);
  123749. sp_521_proj_point_dbl_17(rt, rt, tmp);
  123750. sp_521_proj_point_dbl_17(rt, rt, tmp);
  123751. sp_521_proj_point_dbl_17(rt, rt, tmp);
  123752. #ifndef WC_NO_CACHE_RESISTANT
  123753. if (ct) {
  123754. sp_521_get_point_16_17(p, t, y);
  123755. p->infinity = !y;
  123756. sp_521_proj_point_add_17(rt, rt, p, tmp);
  123757. }
  123758. else
  123759. #endif
  123760. {
  123761. sp_521_proj_point_add_17(rt, rt, &t[y], tmp);
  123762. }
  123763. }
  123764. y = k[0] & 0x1;
  123765. sp_521_proj_point_dbl_17(rt, rt, tmp);
  123766. sp_521_proj_point_add_17(rt, rt, &t[y], tmp);
  123767. if (map != 0) {
  123768. sp_521_map_17(r, rt, tmp);
  123769. }
  123770. else {
  123771. XMEMCPY(r, rt, sizeof(sp_point_521));
  123772. }
  123773. }
  123774. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  123775. if (tmp != NULL)
  123776. #endif
  123777. {
  123778. ForceZero(tmp, sizeof(sp_digit) * 2 * 17 * 6);
  123779. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  123780. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  123781. #endif
  123782. }
  123783. #ifndef WC_NO_CACHE_RESISTANT
  123784. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  123785. if (p != NULL)
  123786. #endif
  123787. {
  123788. ForceZero(p, sizeof(sp_point_521));
  123789. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  123790. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  123791. #endif
  123792. }
  123793. #endif /* !WC_NO_CACHE_RESISTANT */
  123794. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  123795. if (t != NULL)
  123796. #endif
  123797. {
  123798. ForceZero(t, sizeof(sp_point_521) * 17);
  123799. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  123800. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  123801. #endif
  123802. }
  123803. return err;
  123804. }
  123805. #ifdef FP_ECC
  123806. #define sp_521_mont_dbl_lower_17 sp_521_mont_dbl_17
  123807. #define sp_521_mont_tpl_lower_17 sp_521_mont_tpl_17
  123808. /* Double the Montgomery form projective point p a number of times.
  123809. *
  123810. * r Result of repeated doubling of point.
  123811. * p Point to double.
  123812. * n Number of times to double
  123813. * t Temporary ordinate data.
  123814. */
  123815. static void sp_521_proj_point_dbl_n_17(sp_point_521* p, int i,
  123816. sp_digit* t)
  123817. {
  123818. sp_digit* w = t;
  123819. sp_digit* a = t + 2*17;
  123820. sp_digit* b = t + 4*17;
  123821. sp_digit* t1 = t + 6*17;
  123822. sp_digit* t2 = t + 8*17;
  123823. sp_digit* x;
  123824. sp_digit* y;
  123825. sp_digit* z;
  123826. volatile int n = i;
  123827. x = p->x;
  123828. y = p->y;
  123829. z = p->z;
  123830. /* Y = 2*Y */
  123831. sp_521_mont_dbl_17(y, y, p521_mod);
  123832. /* W = Z^4 */
  123833. sp_521_mont_sqr_17(w, z, p521_mod, p521_mp_mod);
  123834. sp_521_mont_sqr_17(w, w, p521_mod, p521_mp_mod);
  123835. #ifndef WOLFSSL_SP_SMALL
  123836. while (--n > 0)
  123837. #else
  123838. while (--n >= 0)
  123839. #endif
  123840. {
  123841. /* A = 3*(X^2 - W) */
  123842. sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod);
  123843. sp_521_mont_sub_17(t1, t1, w, p521_mod);
  123844. sp_521_mont_tpl_lower_17(a, t1, p521_mod);
  123845. /* B = X*Y^2 */
  123846. sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod);
  123847. sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod);
  123848. /* X = A^2 - 2B */
  123849. sp_521_mont_sqr_17(x, a, p521_mod, p521_mp_mod);
  123850. sp_521_mont_dbl_17(t2, b, p521_mod);
  123851. sp_521_mont_sub_17(x, x, t2, p521_mod);
  123852. /* b = 2.(B - X) */
  123853. sp_521_mont_sub_lower_17(t2, b, x, p521_mod);
  123854. sp_521_mont_dbl_lower_17(b, t2, p521_mod);
  123855. /* Z = Z*Y */
  123856. sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod);
  123857. /* t1 = Y^4 */
  123858. sp_521_mont_sqr_17(t1, t1, p521_mod, p521_mp_mod);
  123859. #ifdef WOLFSSL_SP_SMALL
  123860. if (n != 0)
  123861. #endif
  123862. {
  123863. /* W = W*Y^4 */
  123864. sp_521_mont_mul_17(w, w, t1, p521_mod, p521_mp_mod);
  123865. }
  123866. /* y = 2*A*(B - X) - Y^4 */
  123867. sp_521_mont_mul_17(y, b, a, p521_mod, p521_mp_mod);
  123868. sp_521_mont_sub_17(y, y, t1, p521_mod);
  123869. }
  123870. #ifndef WOLFSSL_SP_SMALL
  123871. /* A = 3*(X^2 - W) */
  123872. sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod);
  123873. sp_521_mont_sub_17(t1, t1, w, p521_mod);
  123874. sp_521_mont_tpl_lower_17(a, t1, p521_mod);
  123875. /* B = X*Y^2 */
  123876. sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod);
  123877. sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod);
  123878. /* X = A^2 - 2B */
  123879. sp_521_mont_sqr_17(x, a, p521_mod, p521_mp_mod);
  123880. sp_521_mont_dbl_17(t2, b, p521_mod);
  123881. sp_521_mont_sub_17(x, x, t2, p521_mod);
  123882. /* b = 2.(B - X) */
  123883. sp_521_mont_sub_lower_17(t2, b, x, p521_mod);
  123884. sp_521_mont_dbl_lower_17(b, t2, p521_mod);
  123885. /* Z = Z*Y */
  123886. sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod);
  123887. /* t1 = Y^4 */
  123888. sp_521_mont_sqr_17(t1, t1, p521_mod, p521_mp_mod);
  123889. /* y = 2*A*(B - X) - Y^4 */
  123890. sp_521_mont_mul_17(y, b, a, p521_mod, p521_mp_mod);
  123891. sp_521_mont_sub_17(y, y, t1, p521_mod);
  123892. #endif
  123893. /* Y = Y/2 */
  123894. sp_521_div2_17(y, y, p521_mod);
  123895. }
  123896. /* Convert the projective point to affine.
  123897. * Ordinates are in Montgomery form.
  123898. *
  123899. * a Point to convert.
  123900. * t Temporary data.
  123901. */
  123902. static void sp_521_proj_to_affine_17(sp_point_521* a, sp_digit* t)
  123903. {
  123904. sp_digit* t1 = t;
  123905. sp_digit* t2 = t + 2 * 17;
  123906. sp_digit* tmp = t + 4 * 17;
  123907. sp_521_mont_inv_17(t1, a->z, tmp);
  123908. sp_521_mont_sqr_17(t2, t1, p521_mod, p521_mp_mod);
  123909. sp_521_mont_mul_17(t1, t2, t1, p521_mod, p521_mp_mod);
  123910. sp_521_mont_mul_17(a->x, a->x, t2, p521_mod, p521_mp_mod);
  123911. sp_521_mont_mul_17(a->y, a->y, t1, p521_mod, p521_mp_mod);
  123912. XMEMCPY(a->z, p521_norm_mod, sizeof(p521_norm_mod));
  123913. }
  123914. #endif /* FP_ECC */
  123915. /* A table entry for pre-computed points. */
  123916. typedef struct sp_table_entry_521 {
  123917. sp_digit x[17];
  123918. sp_digit y[17];
  123919. } sp_table_entry_521;
  123920. #ifdef FP_ECC
  123921. #endif /* FP_ECC */
  123922. /* Add two Montgomery form projective points. The second point has a q value of
  123923. * one.
  123924. * Only the first point can be the same pointer as the result point.
  123925. *
  123926. * r Result of addition.
  123927. * p First point to add.
  123928. * q Second point to add.
  123929. * t Temporary ordinate data.
  123930. */
  123931. static void sp_521_proj_point_add_qz1_17(sp_point_521* r, const sp_point_521* p,
  123932. const sp_point_521* q, sp_digit* t)
  123933. {
  123934. sp_digit* t1 = t;
  123935. sp_digit* t2 = t + 2*17;
  123936. sp_digit* t3 = t + 4*17;
  123937. sp_digit* t4 = t + 6*17;
  123938. sp_digit* t5 = t + 8*17;
  123939. sp_digit* t6 = t + 10*17;
  123940. /* Check double */
  123941. (void)sp_521_sub_17(t1, p521_mod, q->y);
  123942. sp_521_norm_17(t1);
  123943. if ((~p->infinity & ~q->infinity &
  123944. sp_521_cmp_equal_17(p->x, q->x) & sp_521_cmp_equal_17(p->z, q->z) &
  123945. (sp_521_cmp_equal_17(p->y, q->y) | sp_521_cmp_equal_17(p->y, t1))) != 0) {
  123946. sp_521_proj_point_dbl_17(r, p, t);
  123947. }
  123948. else {
  123949. sp_digit maskp;
  123950. sp_digit maskq;
  123951. sp_digit maskt;
  123952. sp_digit* x = t2;
  123953. sp_digit* y = t5;
  123954. sp_digit* z = t6;
  123955. int i;
  123956. /* U2 = X2*Z1^2 */
  123957. sp_521_mont_sqr_17(t2, p->z, p521_mod, p521_mp_mod);
  123958. sp_521_mont_mul_17(t4, t2, p->z, p521_mod, p521_mp_mod);
  123959. sp_521_mont_mul_17(t2, t2, q->x, p521_mod, p521_mp_mod);
  123960. /* S2 = Y2*Z1^3 */
  123961. sp_521_mont_mul_17(t4, t4, q->y, p521_mod, p521_mp_mod);
  123962. /* H = U2 - X1 */
  123963. sp_521_mont_sub_17(t2, t2, p->x, p521_mod);
  123964. /* R = S2 - Y1 */
  123965. sp_521_mont_sub_17(t4, t4, p->y, p521_mod);
  123966. /* Z3 = H*Z1 */
  123967. sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod);
  123968. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  123969. sp_521_mont_sqr_17(t1, t4, p521_mod, p521_mp_mod);
  123970. sp_521_mont_sqr_17(t5, t2, p521_mod, p521_mp_mod);
  123971. sp_521_mont_mul_17(t3, p->x, t5, p521_mod, p521_mp_mod);
  123972. sp_521_mont_mul_17(t5, t5, t2, p521_mod, p521_mp_mod);
  123973. sp_521_mont_sub_17(x, t1, t5, p521_mod);
  123974. sp_521_mont_dbl_17(t1, t3, p521_mod);
  123975. sp_521_mont_sub_17(x, x, t1, p521_mod);
  123976. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  123977. sp_521_mont_sub_lower_17(t3, t3, x, p521_mod);
  123978. sp_521_mont_mul_17(t3, t3, t4, p521_mod, p521_mp_mod);
  123979. sp_521_mont_mul_17(t5, t5, p->y, p521_mod, p521_mp_mod);
  123980. sp_521_mont_sub_17(y, t3, t5, p521_mod);
  123981. maskp = 0 - (q->infinity & (!p->infinity));
  123982. maskq = 0 - (p->infinity & (!q->infinity));
  123983. maskt = ~(maskp | maskq);
  123984. for (i = 0; i < 17; i++) {
  123985. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt);
  123986. }
  123987. for (i = 0; i < 17; i++) {
  123988. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt);
  123989. }
  123990. for (i = 0; i < 17; i++) {
  123991. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt);
  123992. }
  123993. r->z[0] |= p->infinity & q->infinity;
  123994. r->infinity = p->infinity & q->infinity;
  123995. }
  123996. }
  123997. #ifdef WOLFSSL_SP_SMALL
  123998. #ifdef FP_ECC
  123999. /* Generate the pre-computed table of points for the base point.
  124000. *
  124001. * width = 4
  124002. * 16 entries
  124003. * 130 bits between
  124004. *
  124005. * a The base point.
  124006. * table Place to store generated point data.
  124007. * tmp Temporary data.
  124008. * heap Heap to use for allocation.
  124009. */
  124010. static int sp_521_gen_stripe_table_17(const sp_point_521* a,
  124011. sp_table_entry_521* table, sp_digit* tmp, void* heap)
  124012. {
  124013. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124014. sp_point_521* t = NULL;
  124015. #else
  124016. sp_point_521 t[3];
  124017. #endif
  124018. sp_point_521* s1 = NULL;
  124019. sp_point_521* s2 = NULL;
  124020. int i;
  124021. int j;
  124022. int err = MP_OKAY;
  124023. (void)heap;
  124024. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124025. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 3, heap,
  124026. DYNAMIC_TYPE_ECC);
  124027. if (t == NULL)
  124028. err = MEMORY_E;
  124029. #endif
  124030. if (err == MP_OKAY) {
  124031. s1 = t + 1;
  124032. s2 = t + 2;
  124033. err = sp_521_mod_mul_norm_17(t->x, a->x, p521_mod);
  124034. }
  124035. if (err == MP_OKAY) {
  124036. err = sp_521_mod_mul_norm_17(t->y, a->y, p521_mod);
  124037. }
  124038. if (err == MP_OKAY) {
  124039. err = sp_521_mod_mul_norm_17(t->z, a->z, p521_mod);
  124040. }
  124041. if (err == MP_OKAY) {
  124042. t->infinity = 0;
  124043. sp_521_proj_to_affine_17(t, tmp);
  124044. XMEMCPY(s1->z, p521_norm_mod, sizeof(p521_norm_mod));
  124045. s1->infinity = 0;
  124046. XMEMCPY(s2->z, p521_norm_mod, sizeof(p521_norm_mod));
  124047. s2->infinity = 0;
  124048. /* table[0] = {0, 0, infinity} */
  124049. XMEMSET(&table[0], 0, sizeof(sp_table_entry_521));
  124050. /* table[1] = Affine version of 'a' in Montgomery form */
  124051. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  124052. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  124053. for (i=1; i<4; i++) {
  124054. sp_521_proj_point_dbl_n_17(t, 131, tmp);
  124055. sp_521_proj_to_affine_17(t, tmp);
  124056. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  124057. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  124058. }
  124059. for (i=1; i<4; i++) {
  124060. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  124061. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  124062. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  124063. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  124064. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  124065. sp_521_proj_point_add_qz1_17(t, s1, s2, tmp);
  124066. sp_521_proj_to_affine_17(t, tmp);
  124067. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  124068. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  124069. }
  124070. }
  124071. }
  124072. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124073. if (t != NULL)
  124074. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124075. #endif
  124076. return err;
  124077. }
  124078. #endif /* FP_ECC */
  124079. #ifndef WC_NO_CACHE_RESISTANT
  124080. /* Touch each possible entry that could be being copied.
  124081. *
  124082. * r Point to copy into.
  124083. * table Table - start of the entires to access
  124084. * idx Index of entry to retrieve.
  124085. */
  124086. static void sp_521_get_entry_16_17(sp_point_521* r,
  124087. const sp_table_entry_521* table, int idx)
  124088. {
  124089. int i;
  124090. sp_digit mask;
  124091. r->x[0] = 0;
  124092. r->x[1] = 0;
  124093. r->x[2] = 0;
  124094. r->x[3] = 0;
  124095. r->x[4] = 0;
  124096. r->x[5] = 0;
  124097. r->x[6] = 0;
  124098. r->x[7] = 0;
  124099. r->x[8] = 0;
  124100. r->x[9] = 0;
  124101. r->x[10] = 0;
  124102. r->x[11] = 0;
  124103. r->x[12] = 0;
  124104. r->x[13] = 0;
  124105. r->x[14] = 0;
  124106. r->x[15] = 0;
  124107. r->x[16] = 0;
  124108. r->y[0] = 0;
  124109. r->y[1] = 0;
  124110. r->y[2] = 0;
  124111. r->y[3] = 0;
  124112. r->y[4] = 0;
  124113. r->y[5] = 0;
  124114. r->y[6] = 0;
  124115. r->y[7] = 0;
  124116. r->y[8] = 0;
  124117. r->y[9] = 0;
  124118. r->y[10] = 0;
  124119. r->y[11] = 0;
  124120. r->y[12] = 0;
  124121. r->y[13] = 0;
  124122. r->y[14] = 0;
  124123. r->y[15] = 0;
  124124. r->y[16] = 0;
  124125. for (i = 1; i < 16; i++) {
  124126. mask = 0 - (i == idx);
  124127. r->x[0] |= mask & table[i].x[0];
  124128. r->x[1] |= mask & table[i].x[1];
  124129. r->x[2] |= mask & table[i].x[2];
  124130. r->x[3] |= mask & table[i].x[3];
  124131. r->x[4] |= mask & table[i].x[4];
  124132. r->x[5] |= mask & table[i].x[5];
  124133. r->x[6] |= mask & table[i].x[6];
  124134. r->x[7] |= mask & table[i].x[7];
  124135. r->x[8] |= mask & table[i].x[8];
  124136. r->x[9] |= mask & table[i].x[9];
  124137. r->x[10] |= mask & table[i].x[10];
  124138. r->x[11] |= mask & table[i].x[11];
  124139. r->x[12] |= mask & table[i].x[12];
  124140. r->x[13] |= mask & table[i].x[13];
  124141. r->x[14] |= mask & table[i].x[14];
  124142. r->x[15] |= mask & table[i].x[15];
  124143. r->x[16] |= mask & table[i].x[16];
  124144. r->y[0] |= mask & table[i].y[0];
  124145. r->y[1] |= mask & table[i].y[1];
  124146. r->y[2] |= mask & table[i].y[2];
  124147. r->y[3] |= mask & table[i].y[3];
  124148. r->y[4] |= mask & table[i].y[4];
  124149. r->y[5] |= mask & table[i].y[5];
  124150. r->y[6] |= mask & table[i].y[6];
  124151. r->y[7] |= mask & table[i].y[7];
  124152. r->y[8] |= mask & table[i].y[8];
  124153. r->y[9] |= mask & table[i].y[9];
  124154. r->y[10] |= mask & table[i].y[10];
  124155. r->y[11] |= mask & table[i].y[11];
  124156. r->y[12] |= mask & table[i].y[12];
  124157. r->y[13] |= mask & table[i].y[13];
  124158. r->y[14] |= mask & table[i].y[14];
  124159. r->y[15] |= mask & table[i].y[15];
  124160. r->y[16] |= mask & table[i].y[16];
  124161. }
  124162. }
  124163. #endif /* !WC_NO_CACHE_RESISTANT */
  124164. /* Multiply the point by the scalar and return the result.
  124165. * If map is true then convert result to affine coordinates.
  124166. *
  124167. * Stripe implementation.
  124168. * Pre-generated: 2^0, 2^130, ...
  124169. * Pre-generated: products of all combinations of above.
  124170. * 4 doubles and adds (with qz=1)
  124171. *
  124172. * r Resulting point.
  124173. * k Scalar to multiply by.
  124174. * table Pre-computed table.
  124175. * map Indicates whether to convert result to affine.
  124176. * ct Constant time required.
  124177. * heap Heap to use for allocation.
  124178. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124179. */
  124180. static int sp_521_ecc_mulmod_stripe_17(sp_point_521* r, const sp_point_521* g,
  124181. const sp_table_entry_521* table, const sp_digit* k, int map,
  124182. int ct, void* heap)
  124183. {
  124184. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124185. sp_point_521* rt = NULL;
  124186. sp_digit* t = NULL;
  124187. #else
  124188. sp_point_521 rt[2];
  124189. sp_digit t[2 * 17 * 6];
  124190. #endif
  124191. sp_point_521* p = NULL;
  124192. int i;
  124193. int j;
  124194. int y;
  124195. int x;
  124196. int err = MP_OKAY;
  124197. (void)g;
  124198. /* Constant time used for cache attack resistance implementation. */
  124199. (void)ct;
  124200. (void)heap;
  124201. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124202. rt = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  124203. DYNAMIC_TYPE_ECC);
  124204. if (rt == NULL)
  124205. err = MEMORY_E;
  124206. if (err == MP_OKAY) {
  124207. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  124208. DYNAMIC_TYPE_ECC);
  124209. if (t == NULL)
  124210. err = MEMORY_E;
  124211. }
  124212. #endif
  124213. if (err == MP_OKAY) {
  124214. p = rt + 1;
  124215. XMEMCPY(p->z, p521_norm_mod, sizeof(p521_norm_mod));
  124216. XMEMCPY(rt->z, p521_norm_mod, sizeof(p521_norm_mod));
  124217. y = 0;
  124218. x = 130;
  124219. for (j=0; j<4 && x<521; j++) {
  124220. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  124221. x += 131;
  124222. }
  124223. #ifndef WC_NO_CACHE_RESISTANT
  124224. if (ct) {
  124225. sp_521_get_entry_16_17(rt, table, y);
  124226. } else
  124227. #endif
  124228. {
  124229. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  124230. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  124231. }
  124232. rt->infinity = !y;
  124233. for (i=129; i>=0; i--) {
  124234. y = 0;
  124235. x = i;
  124236. for (j=0; j<4 && x<521; j++) {
  124237. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  124238. x += 131;
  124239. }
  124240. sp_521_proj_point_dbl_17(rt, rt, t);
  124241. #ifndef WC_NO_CACHE_RESISTANT
  124242. if (ct) {
  124243. sp_521_get_entry_16_17(p, table, y);
  124244. }
  124245. else
  124246. #endif
  124247. {
  124248. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  124249. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  124250. }
  124251. p->infinity = !y;
  124252. sp_521_proj_point_add_qz1_17(rt, rt, p, t);
  124253. }
  124254. if (map != 0) {
  124255. sp_521_map_17(r, rt, t);
  124256. }
  124257. else {
  124258. XMEMCPY(r, rt, sizeof(sp_point_521));
  124259. }
  124260. }
  124261. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124262. if (t != NULL)
  124263. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124264. if (rt != NULL)
  124265. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  124266. #endif
  124267. return err;
  124268. }
  124269. #ifdef FP_ECC
  124270. #ifndef FP_ENTRIES
  124271. #define FP_ENTRIES 16
  124272. #endif
  124273. /* Cache entry - holds precomputation tables for a point. */
  124274. typedef struct sp_cache_521_t {
  124275. /* X ordinate of point that table was generated from. */
  124276. sp_digit x[17];
  124277. /* Y ordinate of point that table was generated from. */
  124278. sp_digit y[17];
  124279. /* Precomputation table for point. */
  124280. sp_table_entry_521 table[16];
  124281. /* Count of entries in table. */
  124282. uint32_t cnt;
  124283. /* Point and table set in entry. */
  124284. int set;
  124285. } sp_cache_521_t;
  124286. /* Cache of tables. */
  124287. static THREAD_LS_T sp_cache_521_t sp_cache_521[FP_ENTRIES];
  124288. /* Index of last entry in cache. */
  124289. static THREAD_LS_T int sp_cache_521_last = -1;
  124290. /* Cache has been initialized. */
  124291. static THREAD_LS_T int sp_cache_521_inited = 0;
  124292. #ifndef HAVE_THREAD_LS
  124293. static volatile int initCacheMutex_521 = 0;
  124294. static wolfSSL_Mutex sp_cache_521_lock;
  124295. #endif
  124296. /* Get the cache entry for the point.
  124297. *
  124298. * g [in] Point scalar multipling.
  124299. * cache [out] Cache table to use.
  124300. */
  124301. static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache)
  124302. {
  124303. int i;
  124304. int j;
  124305. uint32_t least;
  124306. if (sp_cache_521_inited == 0) {
  124307. for (i=0; i<FP_ENTRIES; i++) {
  124308. sp_cache_521[i].set = 0;
  124309. }
  124310. sp_cache_521_inited = 1;
  124311. }
  124312. /* Compare point with those in cache. */
  124313. for (i=0; i<FP_ENTRIES; i++) {
  124314. if (!sp_cache_521[i].set)
  124315. continue;
  124316. if (sp_521_cmp_equal_17(g->x, sp_cache_521[i].x) &
  124317. sp_521_cmp_equal_17(g->y, sp_cache_521[i].y)) {
  124318. sp_cache_521[i].cnt++;
  124319. break;
  124320. }
  124321. }
  124322. /* No match. */
  124323. if (i == FP_ENTRIES) {
  124324. /* Find empty entry. */
  124325. i = (sp_cache_521_last + 1) % FP_ENTRIES;
  124326. for (; i != sp_cache_521_last; i=(i+1)%FP_ENTRIES) {
  124327. if (!sp_cache_521[i].set) {
  124328. break;
  124329. }
  124330. }
  124331. /* Evict least used. */
  124332. if (i == sp_cache_521_last) {
  124333. least = sp_cache_521[0].cnt;
  124334. for (j=1; j<FP_ENTRIES; j++) {
  124335. if (sp_cache_521[j].cnt < least) {
  124336. i = j;
  124337. least = sp_cache_521[i].cnt;
  124338. }
  124339. }
  124340. }
  124341. XMEMCPY(sp_cache_521[i].x, g->x, sizeof(sp_cache_521[i].x));
  124342. XMEMCPY(sp_cache_521[i].y, g->y, sizeof(sp_cache_521[i].y));
  124343. sp_cache_521[i].set = 1;
  124344. sp_cache_521[i].cnt = 1;
  124345. }
  124346. *cache = &sp_cache_521[i];
  124347. sp_cache_521_last = i;
  124348. }
  124349. #endif /* FP_ECC */
  124350. /* Multiply the base point of P521 by the scalar and return the result.
  124351. * If map is true then convert result to affine coordinates.
  124352. *
  124353. * r Resulting point.
  124354. * g Point to multiply.
  124355. * k Scalar to multiply by.
  124356. * map Indicates whether to convert result to affine.
  124357. * ct Constant time required.
  124358. * heap Heap to use for allocation.
  124359. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124360. */
  124361. static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k,
  124362. int map, int ct, void* heap)
  124363. {
  124364. #ifndef FP_ECC
  124365. return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  124366. #else
  124367. sp_digit tmp[2 * 17 * 6];
  124368. sp_cache_521_t* cache;
  124369. int err = MP_OKAY;
  124370. #ifndef HAVE_THREAD_LS
  124371. if (initCacheMutex_521 == 0) {
  124372. wc_InitMutex(&sp_cache_521_lock);
  124373. initCacheMutex_521 = 1;
  124374. }
  124375. if (wc_LockMutex(&sp_cache_521_lock) != 0)
  124376. err = BAD_MUTEX_E;
  124377. #endif /* HAVE_THREAD_LS */
  124378. if (err == MP_OKAY) {
  124379. sp_ecc_get_cache_521(g, &cache);
  124380. if (cache->cnt == 2)
  124381. sp_521_gen_stripe_table_17(g, cache->table, tmp, heap);
  124382. #ifndef HAVE_THREAD_LS
  124383. wc_UnLockMutex(&sp_cache_521_lock);
  124384. #endif /* HAVE_THREAD_LS */
  124385. if (cache->cnt < 2) {
  124386. err = sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  124387. }
  124388. else {
  124389. err = sp_521_ecc_mulmod_stripe_17(r, g, cache->table, k,
  124390. map, ct, heap);
  124391. }
  124392. }
  124393. return err;
  124394. #endif
  124395. }
  124396. #else
  124397. #ifdef FP_ECC
  124398. /* Generate the pre-computed table of points for the base point.
  124399. *
  124400. * width = 8
  124401. * 256 entries
  124402. * 65 bits between
  124403. *
  124404. * a The base point.
  124405. * table Place to store generated point data.
  124406. * tmp Temporary data.
  124407. * heap Heap to use for allocation.
  124408. */
  124409. static int sp_521_gen_stripe_table_17(const sp_point_521* a,
  124410. sp_table_entry_521* table, sp_digit* tmp, void* heap)
  124411. {
  124412. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124413. sp_point_521* t = NULL;
  124414. #else
  124415. sp_point_521 t[3];
  124416. #endif
  124417. sp_point_521* s1 = NULL;
  124418. sp_point_521* s2 = NULL;
  124419. int i;
  124420. int j;
  124421. int err = MP_OKAY;
  124422. (void)heap;
  124423. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124424. t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 3, heap,
  124425. DYNAMIC_TYPE_ECC);
  124426. if (t == NULL)
  124427. err = MEMORY_E;
  124428. #endif
  124429. if (err == MP_OKAY) {
  124430. s1 = t + 1;
  124431. s2 = t + 2;
  124432. err = sp_521_mod_mul_norm_17(t->x, a->x, p521_mod);
  124433. }
  124434. if (err == MP_OKAY) {
  124435. err = sp_521_mod_mul_norm_17(t->y, a->y, p521_mod);
  124436. }
  124437. if (err == MP_OKAY) {
  124438. err = sp_521_mod_mul_norm_17(t->z, a->z, p521_mod);
  124439. }
  124440. if (err == MP_OKAY) {
  124441. t->infinity = 0;
  124442. sp_521_proj_to_affine_17(t, tmp);
  124443. XMEMCPY(s1->z, p521_norm_mod, sizeof(p521_norm_mod));
  124444. s1->infinity = 0;
  124445. XMEMCPY(s2->z, p521_norm_mod, sizeof(p521_norm_mod));
  124446. s2->infinity = 0;
  124447. /* table[0] = {0, 0, infinity} */
  124448. XMEMSET(&table[0], 0, sizeof(sp_table_entry_521));
  124449. /* table[1] = Affine version of 'a' in Montgomery form */
  124450. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  124451. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  124452. for (i=1; i<8; i++) {
  124453. sp_521_proj_point_dbl_n_17(t, 66, tmp);
  124454. sp_521_proj_to_affine_17(t, tmp);
  124455. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  124456. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  124457. }
  124458. for (i=1; i<8; i++) {
  124459. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  124460. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  124461. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  124462. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  124463. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  124464. sp_521_proj_point_add_qz1_17(t, s1, s2, tmp);
  124465. sp_521_proj_to_affine_17(t, tmp);
  124466. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  124467. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  124468. }
  124469. }
  124470. }
  124471. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124472. if (t != NULL)
  124473. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124474. #endif
  124475. return err;
  124476. }
  124477. #endif /* FP_ECC */
  124478. #ifndef WC_NO_CACHE_RESISTANT
  124479. /* Touch each possible entry that could be being copied.
  124480. *
  124481. * r Point to copy into.
  124482. * table Table - start of the entires to access
  124483. * idx Index of entry to retrieve.
  124484. */
  124485. static void sp_521_get_entry_256_17(sp_point_521* r,
  124486. const sp_table_entry_521* table, int idx)
  124487. {
  124488. int i;
  124489. sp_digit mask;
  124490. r->x[0] = 0;
  124491. r->x[1] = 0;
  124492. r->x[2] = 0;
  124493. r->x[3] = 0;
  124494. r->x[4] = 0;
  124495. r->x[5] = 0;
  124496. r->x[6] = 0;
  124497. r->x[7] = 0;
  124498. r->x[8] = 0;
  124499. r->x[9] = 0;
  124500. r->x[10] = 0;
  124501. r->x[11] = 0;
  124502. r->x[12] = 0;
  124503. r->x[13] = 0;
  124504. r->x[14] = 0;
  124505. r->x[15] = 0;
  124506. r->x[16] = 0;
  124507. r->y[0] = 0;
  124508. r->y[1] = 0;
  124509. r->y[2] = 0;
  124510. r->y[3] = 0;
  124511. r->y[4] = 0;
  124512. r->y[5] = 0;
  124513. r->y[6] = 0;
  124514. r->y[7] = 0;
  124515. r->y[8] = 0;
  124516. r->y[9] = 0;
  124517. r->y[10] = 0;
  124518. r->y[11] = 0;
  124519. r->y[12] = 0;
  124520. r->y[13] = 0;
  124521. r->y[14] = 0;
  124522. r->y[15] = 0;
  124523. r->y[16] = 0;
  124524. for (i = 1; i < 256; i++) {
  124525. mask = 0 - (i == idx);
  124526. r->x[0] |= mask & table[i].x[0];
  124527. r->x[1] |= mask & table[i].x[1];
  124528. r->x[2] |= mask & table[i].x[2];
  124529. r->x[3] |= mask & table[i].x[3];
  124530. r->x[4] |= mask & table[i].x[4];
  124531. r->x[5] |= mask & table[i].x[5];
  124532. r->x[6] |= mask & table[i].x[6];
  124533. r->x[7] |= mask & table[i].x[7];
  124534. r->x[8] |= mask & table[i].x[8];
  124535. r->x[9] |= mask & table[i].x[9];
  124536. r->x[10] |= mask & table[i].x[10];
  124537. r->x[11] |= mask & table[i].x[11];
  124538. r->x[12] |= mask & table[i].x[12];
  124539. r->x[13] |= mask & table[i].x[13];
  124540. r->x[14] |= mask & table[i].x[14];
  124541. r->x[15] |= mask & table[i].x[15];
  124542. r->x[16] |= mask & table[i].x[16];
  124543. r->y[0] |= mask & table[i].y[0];
  124544. r->y[1] |= mask & table[i].y[1];
  124545. r->y[2] |= mask & table[i].y[2];
  124546. r->y[3] |= mask & table[i].y[3];
  124547. r->y[4] |= mask & table[i].y[4];
  124548. r->y[5] |= mask & table[i].y[5];
  124549. r->y[6] |= mask & table[i].y[6];
  124550. r->y[7] |= mask & table[i].y[7];
  124551. r->y[8] |= mask & table[i].y[8];
  124552. r->y[9] |= mask & table[i].y[9];
  124553. r->y[10] |= mask & table[i].y[10];
  124554. r->y[11] |= mask & table[i].y[11];
  124555. r->y[12] |= mask & table[i].y[12];
  124556. r->y[13] |= mask & table[i].y[13];
  124557. r->y[14] |= mask & table[i].y[14];
  124558. r->y[15] |= mask & table[i].y[15];
  124559. r->y[16] |= mask & table[i].y[16];
  124560. }
  124561. }
  124562. #endif /* !WC_NO_CACHE_RESISTANT */
  124563. /* Multiply the point by the scalar and return the result.
  124564. * If map is true then convert result to affine coordinates.
  124565. *
  124566. * Stripe implementation.
  124567. * Pre-generated: 2^0, 2^65, ...
  124568. * Pre-generated: products of all combinations of above.
  124569. * 8 doubles and adds (with qz=1)
  124570. *
  124571. * r Resulting point.
  124572. * k Scalar to multiply by.
  124573. * table Pre-computed table.
  124574. * map Indicates whether to convert result to affine.
  124575. * ct Constant time required.
  124576. * heap Heap to use for allocation.
  124577. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124578. */
  124579. static int sp_521_ecc_mulmod_stripe_17(sp_point_521* r, const sp_point_521* g,
  124580. const sp_table_entry_521* table, const sp_digit* k, int map,
  124581. int ct, void* heap)
  124582. {
  124583. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124584. sp_point_521* rt = NULL;
  124585. sp_digit* t = NULL;
  124586. #else
  124587. sp_point_521 rt[2];
  124588. sp_digit t[2 * 17 * 6];
  124589. #endif
  124590. sp_point_521* p = NULL;
  124591. int i;
  124592. int j;
  124593. int y;
  124594. int x;
  124595. int err = MP_OKAY;
  124596. (void)g;
  124597. /* Constant time used for cache attack resistance implementation. */
  124598. (void)ct;
  124599. (void)heap;
  124600. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124601. rt = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  124602. DYNAMIC_TYPE_ECC);
  124603. if (rt == NULL)
  124604. err = MEMORY_E;
  124605. if (err == MP_OKAY) {
  124606. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, heap,
  124607. DYNAMIC_TYPE_ECC);
  124608. if (t == NULL)
  124609. err = MEMORY_E;
  124610. }
  124611. #endif
  124612. if (err == MP_OKAY) {
  124613. p = rt + 1;
  124614. XMEMCPY(p->z, p521_norm_mod, sizeof(p521_norm_mod));
  124615. XMEMCPY(rt->z, p521_norm_mod, sizeof(p521_norm_mod));
  124616. y = 0;
  124617. x = 65;
  124618. for (j=0; j<8 && x<521; j++) {
  124619. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  124620. x += 66;
  124621. }
  124622. #ifndef WC_NO_CACHE_RESISTANT
  124623. if (ct) {
  124624. sp_521_get_entry_256_17(rt, table, y);
  124625. } else
  124626. #endif
  124627. {
  124628. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  124629. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  124630. }
  124631. rt->infinity = !y;
  124632. for (i=64; i>=0; i--) {
  124633. y = 0;
  124634. x = i;
  124635. for (j=0; j<8 && x<521; j++) {
  124636. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  124637. x += 66;
  124638. }
  124639. sp_521_proj_point_dbl_17(rt, rt, t);
  124640. #ifndef WC_NO_CACHE_RESISTANT
  124641. if (ct) {
  124642. sp_521_get_entry_256_17(p, table, y);
  124643. }
  124644. else
  124645. #endif
  124646. {
  124647. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  124648. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  124649. }
  124650. p->infinity = !y;
  124651. sp_521_proj_point_add_qz1_17(rt, rt, p, t);
  124652. }
  124653. if (map != 0) {
  124654. sp_521_map_17(r, rt, t);
  124655. }
  124656. else {
  124657. XMEMCPY(r, rt, sizeof(sp_point_521));
  124658. }
  124659. }
  124660. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124661. if (t != NULL)
  124662. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  124663. if (rt != NULL)
  124664. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  124665. #endif
  124666. return err;
  124667. }
  124668. #ifdef FP_ECC
  124669. #ifndef FP_ENTRIES
  124670. #define FP_ENTRIES 16
  124671. #endif
  124672. /* Cache entry - holds precomputation tables for a point. */
  124673. typedef struct sp_cache_521_t {
  124674. /* X ordinate of point that table was generated from. */
  124675. sp_digit x[17];
  124676. /* Y ordinate of point that table was generated from. */
  124677. sp_digit y[17];
  124678. /* Precomputation table for point. */
  124679. sp_table_entry_521 table[256];
  124680. /* Count of entries in table. */
  124681. uint32_t cnt;
  124682. /* Point and table set in entry. */
  124683. int set;
  124684. } sp_cache_521_t;
  124685. /* Cache of tables. */
  124686. static THREAD_LS_T sp_cache_521_t sp_cache_521[FP_ENTRIES];
  124687. /* Index of last entry in cache. */
  124688. static THREAD_LS_T int sp_cache_521_last = -1;
  124689. /* Cache has been initialized. */
  124690. static THREAD_LS_T int sp_cache_521_inited = 0;
  124691. #ifndef HAVE_THREAD_LS
  124692. static volatile int initCacheMutex_521 = 0;
  124693. static wolfSSL_Mutex sp_cache_521_lock;
  124694. #endif
  124695. /* Get the cache entry for the point.
  124696. *
  124697. * g [in] Point scalar multipling.
  124698. * cache [out] Cache table to use.
  124699. */
  124700. static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache)
  124701. {
  124702. int i;
  124703. int j;
  124704. uint32_t least;
  124705. if (sp_cache_521_inited == 0) {
  124706. for (i=0; i<FP_ENTRIES; i++) {
  124707. sp_cache_521[i].set = 0;
  124708. }
  124709. sp_cache_521_inited = 1;
  124710. }
  124711. /* Compare point with those in cache. */
  124712. for (i=0; i<FP_ENTRIES; i++) {
  124713. if (!sp_cache_521[i].set)
  124714. continue;
  124715. if (sp_521_cmp_equal_17(g->x, sp_cache_521[i].x) &
  124716. sp_521_cmp_equal_17(g->y, sp_cache_521[i].y)) {
  124717. sp_cache_521[i].cnt++;
  124718. break;
  124719. }
  124720. }
  124721. /* No match. */
  124722. if (i == FP_ENTRIES) {
  124723. /* Find empty entry. */
  124724. i = (sp_cache_521_last + 1) % FP_ENTRIES;
  124725. for (; i != sp_cache_521_last; i=(i+1)%FP_ENTRIES) {
  124726. if (!sp_cache_521[i].set) {
  124727. break;
  124728. }
  124729. }
  124730. /* Evict least used. */
  124731. if (i == sp_cache_521_last) {
  124732. least = sp_cache_521[0].cnt;
  124733. for (j=1; j<FP_ENTRIES; j++) {
  124734. if (sp_cache_521[j].cnt < least) {
  124735. i = j;
  124736. least = sp_cache_521[i].cnt;
  124737. }
  124738. }
  124739. }
  124740. XMEMCPY(sp_cache_521[i].x, g->x, sizeof(sp_cache_521[i].x));
  124741. XMEMCPY(sp_cache_521[i].y, g->y, sizeof(sp_cache_521[i].y));
  124742. sp_cache_521[i].set = 1;
  124743. sp_cache_521[i].cnt = 1;
  124744. }
  124745. *cache = &sp_cache_521[i];
  124746. sp_cache_521_last = i;
  124747. }
  124748. #endif /* FP_ECC */
  124749. /* Multiply the base point of P521 by the scalar and return the result.
  124750. * If map is true then convert result to affine coordinates.
  124751. *
  124752. * r Resulting point.
  124753. * g Point to multiply.
  124754. * k Scalar to multiply by.
  124755. * map Indicates whether to convert result to affine.
  124756. * ct Constant time required.
  124757. * heap Heap to use for allocation.
  124758. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124759. */
  124760. static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k,
  124761. int map, int ct, void* heap)
  124762. {
  124763. #ifndef FP_ECC
  124764. return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  124765. #else
  124766. sp_digit tmp[2 * 17 * 6];
  124767. sp_cache_521_t* cache;
  124768. int err = MP_OKAY;
  124769. #ifndef HAVE_THREAD_LS
  124770. if (initCacheMutex_521 == 0) {
  124771. wc_InitMutex(&sp_cache_521_lock);
  124772. initCacheMutex_521 = 1;
  124773. }
  124774. if (wc_LockMutex(&sp_cache_521_lock) != 0)
  124775. err = BAD_MUTEX_E;
  124776. #endif /* HAVE_THREAD_LS */
  124777. if (err == MP_OKAY) {
  124778. sp_ecc_get_cache_521(g, &cache);
  124779. if (cache->cnt == 2)
  124780. sp_521_gen_stripe_table_17(g, cache->table, tmp, heap);
  124781. #ifndef HAVE_THREAD_LS
  124782. wc_UnLockMutex(&sp_cache_521_lock);
  124783. #endif /* HAVE_THREAD_LS */
  124784. if (cache->cnt < 2) {
  124785. err = sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap);
  124786. }
  124787. else {
  124788. err = sp_521_ecc_mulmod_stripe_17(r, g, cache->table, k,
  124789. map, ct, heap);
  124790. }
  124791. }
  124792. return err;
  124793. #endif
  124794. }
  124795. #endif /* WOLFSSL_SP_SMALL */
  124796. /* Multiply the point by the scalar and return the result.
  124797. * If map is true then convert result to affine coordinates.
  124798. *
  124799. * km Scalar to multiply by.
  124800. * p Point to multiply.
  124801. * r Resulting point.
  124802. * map Indicates whether to convert result to affine.
  124803. * heap Heap to use for allocation.
  124804. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124805. */
  124806. int sp_ecc_mulmod_521(const mp_int* km, const ecc_point* gm, ecc_point* r,
  124807. int map, void* heap)
  124808. {
  124809. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124810. sp_point_521* point = NULL;
  124811. sp_digit* k = NULL;
  124812. #else
  124813. sp_point_521 point[1];
  124814. sp_digit k[17];
  124815. #endif
  124816. int err = MP_OKAY;
  124817. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124818. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  124819. DYNAMIC_TYPE_ECC);
  124820. if (point == NULL)
  124821. err = MEMORY_E;
  124822. if (err == MP_OKAY) {
  124823. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  124824. DYNAMIC_TYPE_ECC);
  124825. if (k == NULL)
  124826. err = MEMORY_E;
  124827. }
  124828. #endif
  124829. if (err == MP_OKAY) {
  124830. sp_521_from_mp(k, 17, km);
  124831. sp_521_point_from_ecc_point_17(point, gm);
  124832. err = sp_521_ecc_mulmod_17(point, point, k, map, 1, heap);
  124833. }
  124834. if (err == MP_OKAY) {
  124835. err = sp_521_point_to_ecc_point_17(point, r);
  124836. }
  124837. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124838. if (k != NULL)
  124839. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  124840. if (point != NULL)
  124841. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  124842. #endif
  124843. return err;
  124844. }
  124845. /* Multiply the point by the scalar, add point a and return the result.
  124846. * If map is true then convert result to affine coordinates.
  124847. *
  124848. * km Scalar to multiply by.
  124849. * p Point to multiply.
  124850. * am Point to add to scalar mulitply result.
  124851. * inMont Point to add is in montgomery form.
  124852. * r Resulting point.
  124853. * map Indicates whether to convert result to affine.
  124854. * heap Heap to use for allocation.
  124855. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  124856. */
  124857. int sp_ecc_mulmod_add_521(const mp_int* km, const ecc_point* gm,
  124858. const ecc_point* am, int inMont, ecc_point* r, int map, void* heap)
  124859. {
  124860. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124861. sp_point_521* point = NULL;
  124862. sp_digit* k = NULL;
  124863. #else
  124864. sp_point_521 point[2];
  124865. sp_digit k[17 + 17 * 2 * 6];
  124866. #endif
  124867. sp_point_521* addP = NULL;
  124868. sp_digit* tmp = NULL;
  124869. int err = MP_OKAY;
  124870. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124871. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  124872. DYNAMIC_TYPE_ECC);
  124873. if (point == NULL)
  124874. err = MEMORY_E;
  124875. if (err == MP_OKAY) {
  124876. k = (sp_digit*)XMALLOC(
  124877. sizeof(sp_digit) * (17 + 17 * 2 * 6), heap,
  124878. DYNAMIC_TYPE_ECC);
  124879. if (k == NULL)
  124880. err = MEMORY_E;
  124881. }
  124882. #endif
  124883. if (err == MP_OKAY) {
  124884. addP = point + 1;
  124885. tmp = k + 17;
  124886. sp_521_from_mp(k, 17, km);
  124887. sp_521_point_from_ecc_point_17(point, gm);
  124888. sp_521_point_from_ecc_point_17(addP, am);
  124889. }
  124890. if ((err == MP_OKAY) && (!inMont)) {
  124891. err = sp_521_mod_mul_norm_17(addP->x, addP->x, p521_mod);
  124892. }
  124893. if ((err == MP_OKAY) && (!inMont)) {
  124894. err = sp_521_mod_mul_norm_17(addP->y, addP->y, p521_mod);
  124895. }
  124896. if ((err == MP_OKAY) && (!inMont)) {
  124897. err = sp_521_mod_mul_norm_17(addP->z, addP->z, p521_mod);
  124898. }
  124899. if (err == MP_OKAY) {
  124900. err = sp_521_ecc_mulmod_17(point, point, k, 0, 0, heap);
  124901. }
  124902. if (err == MP_OKAY) {
  124903. sp_521_proj_point_add_17(point, point, addP, tmp);
  124904. if (map) {
  124905. sp_521_map_17(point, point, tmp);
  124906. }
  124907. err = sp_521_point_to_ecc_point_17(point, r);
  124908. }
  124909. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  124910. if (k != NULL)
  124911. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  124912. if (point != NULL)
  124913. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  124914. #endif
  124915. return err;
  124916. }
  124917. #ifdef WOLFSSL_SP_SMALL
  124918. /* Striping precomputation table.
  124919. * 4 points combined into a table of 16 points.
  124920. * Distance of 131 between points.
  124921. */
  124922. static const sp_table_entry_521 p521_table[16] = {
  124923. /* 0 */
  124924. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  124925. 0x00, 0x00, 0x00, 0x00, 0x00 },
  124926. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  124927. 0x00, 0x00, 0x00, 0x00, 0x00 } },
  124928. /* 1 */
  124929. { { 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  124930. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  124931. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6 },
  124932. { 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  124933. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  124934. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118 } },
  124935. /* 2 */
  124936. { { 0x66fd07ca,0x1036eb9b,0x6b7fb490,0x6ca52cc1,0xd3e0c270,0x512e973e,
  124937. 0x73d92d11,0x889980bf,0xa4005eea,0x38b4cfe4,0x8ceb4313,0xb6f992cc,
  124938. 0x6daf7c23,0xd0ac2f8d,0xe32a93cb,0x1ccfbf17,0x000000c2 },
  124939. { 0x2f508cca,0x7bd9d6f1,0x595a72af,0xe82d7171,0x97512873,0x25d02976,
  124940. 0x8cf39fbc,0xefc1de8b,0x9a1237f4,0x25e6b77f,0xd4d98b5d,0x9f3b73e7,
  124941. 0xeccb07fe,0xe1fda62b,0x625350cf,0xdb813b03,0x00000014 } },
  124942. /* 3 */
  124943. { { 0x9b27bd61,0x415a1c9b,0x606854d6,0x74522753,0x92e73538,0x9e331ef4,
  124944. 0x817e7a6d,0x0b3dba85,0x49ac273b,0x55c4bd53,0xfcb5417f,0xad42c78d,
  124945. 0x92e08d38,0x528998b9,0xcc1914cc,0x14c2fff6,0x000000c1 },
  124946. { 0x767e9645,0x35b26fb0,0xc5e5a659,0x162b512f,0xcc47fbb8,0xa6e03696,
  124947. 0x0a29a69b,0x732db065,0xd56bdf5d,0x058a74ed,0x25c858d9,0x4b7b60a0,
  124948. 0xbd43373d,0x17f8a6d4,0xedf610b4,0x7b968f51,0x0000011f } },
  124949. /* 4 */
  124950. { { 0x1bc0fa77,0x5f56b5a4,0x64fd36f5,0x6cdd6bb5,0x8a5b7c7f,0xd0ac68b5,
  124951. 0x09919ef9,0x4a92d9bf,0x71c3c520,0xc305e12b,0xdb699aee,0x554a9d1c,
  124952. 0x61f54643,0x7fde0077,0x479115ce,0x99c13124,0x00000039 },
  124953. { 0xc271ac2d,0x25f890e1,0x94b370ac,0x1353ccd3,0x744d4011,0xc7b5adf6,
  124954. 0xbe378127,0x9ccd7687,0x06c4e3cd,0xa8489b5c,0x305505f9,0x1945580a,
  124955. 0x4ab3b12b,0x07190a20,0x1534ea4d,0x0ff53eb1,0x00000159 } },
  124956. /* 5 */
  124957. { { 0x91798548,0x877d4edd,0x031d657a,0xc43c7b25,0xfab18a04,0x47603671,
  124958. 0xf670b476,0x7e39e7f2,0xb02fcc03,0xf7b76431,0x877f46f5,0x7c5662f3,
  124959. 0x1c8b0c61,0x5bf8327e,0x4a8be322,0xe9cdb353,0x000001ae },
  124960. { 0x9d264420,0xa2d7092e,0x533ff3db,0x1f970352,0x99b5b52e,0x31dd232b,
  124961. 0x850f45e9,0x8a9ce16b,0xc3011849,0x01c99023,0xc8e9301e,0x4bc30989,
  124962. 0xcd95f64c,0x77a4de70,0x1026f289,0xbc8797bb,0x000000d7 } },
  124963. /* 6 */
  124964. { { 0x2be9edf8,0x98ea0934,0xfcb98199,0x6c2f3132,0xfaf83aeb,0xf579893d,
  124965. 0xc73fda0f,0x858e87bb,0x7a0b9d1c,0xd3c0b3fb,0x71ee68b1,0x21fe6305,
  124966. 0x66aa6f16,0x5bf8f01f,0xbca825ed,0x30934c99,0x000000d1 },
  124967. { 0x913022f2,0xe4309850,0xde5b80ce,0xfdc336c9,0x8b6130ef,0xb716d689,
  124968. 0xa758d2f4,0x8a58b405,0xaa5cbc1c,0x98879df8,0xc12ce0bb,0x847cfd06,
  124969. 0x8c02ff3c,0xa1006360,0x3438695b,0x836e906a,0x00000136 } },
  124970. /* 7 */
  124971. { { 0x259ce02d,0xac8fe351,0xdae5e0f7,0xa506da0c,0xf043421d,0x77b56e98,
  124972. 0xa1647490,0xe0d041c7,0x9cb90101,0xe41f0789,0xda3e72e6,0x29bbf572,
  124973. 0x04a14df0,0x6b635c47,0xe81ef5d3,0x56873f58,0x000001dd },
  124974. { 0x5cf9e33f,0x77abe79e,0x0a1117fd,0x91aab581,0xcbac2fe1,0x11edf3b1,
  124975. 0xd72113b7,0xef43e017,0x06b74002,0xf9ad685c,0x8fbd3b1a,0x7e6370ce,
  124976. 0x42f73a82,0x550dd50b,0xc5e64a9b,0x8f2146be,0x000001f2 } },
  124977. /* 8 */
  124978. { { 0x2934ed82,0x05a704cc,0x989edd8c,0x647089fb,0x0ce7c62d,0xe0b239d4,
  124979. 0x105a5eff,0x4c892ea6,0xd5ed6b04,0xa519395f,0x509ed794,0x806c7003,
  124980. 0xe70ce5c4,0x882e9886,0xff01f6a9,0x50730ca1,0x00000088 },
  124981. { 0xdbcc5484,0x90a78a16,0xfd454b50,0xc1ab078c,0xcb09e525,0x6f488252,
  124982. 0xe19b2ed7,0xdd663f53,0xa67bf59c,0x16b10da1,0x36bb770a,0xb47f6b95,
  124983. 0x777b2bce,0x6bdc8428,0x561553f8,0xcd02ae3d,0x00000017 } },
  124984. /* 9 */
  124985. { { 0x1579d15a,0x1e3633a0,0x3e98cd1f,0x574f0c23,0xc60f4f99,0x45969dca,
  124986. 0x49fb9f24,0x10062c93,0xd378f640,0xd29a29d7,0xd7d48c2f,0xec941760,
  124987. 0x31fbea5c,0xf0591c59,0xb40f9ebf,0xd6173e6b,0x00000063 },
  124988. { 0x5a984a72,0x220f4f39,0x32510f26,0x9a3f82ce,0x8c069a1d,0xf3d04c76,
  124989. 0x69a21e57,0xf1d6d891,0xdc4db601,0x6b96b30b,0x64dcf3e0,0x71eeb728,
  124990. 0xc7caaff3,0x6f80c483,0x571b66e4,0x45533092,0x000000b0 } },
  124991. /* 10 */
  124992. { { 0x87140dad,0x49ae4521,0x57e2803e,0xda73032b,0x026ea20a,0x13f5e5eb,
  124993. 0x6e00afb9,0x2d54c4b0,0x7a150474,0x4393b92b,0x13f1a7da,0xb5b41bf8,
  124994. 0x02b5867a,0x6d786907,0xaf2ea4d1,0x5193a9ac,0x000001b3 },
  124995. { 0xa6b186cb,0x2a1563f7,0xe28e57b6,0x73a70a44,0x78fc8a1d,0xd7c4fc6d,
  124996. 0xdf3d6d99,0x4c9b4581,0x1e373aab,0x544f5249,0xe913498e,0xe99434a2,
  124997. 0xc4700f4c,0x30159749,0xe5142766,0xb8ef02cc,0x000001d0 } },
  124998. /* 11 */
  124999. { { 0xb9e6ffc9,0xe99805a6,0xf74d977b,0x1a357f05,0x5c9941bc,0xc8ddef31,
  125000. 0xcbe842e7,0x4b6d66ca,0xa20dc12d,0x84e1f75f,0x5f0c02fc,0x8b1b2c50,
  125001. 0x037b493d,0x3fa1889e,0x95705046,0x720bd9e0,0x000001c2 },
  125002. { 0x93ab9309,0x1a1f3378,0x226a8f94,0xe05a30a2,0x4045f1bd,0x2c01a52d,
  125003. 0xab5f5115,0xf42e8fd5,0x0c05fecf,0x954d1d09,0x8d0650d3,0x47e964d1,
  125004. 0x3c860801,0x6866fa5d,0x5abbb4af,0xac2fecbf,0x0000012c } },
  125005. /* 12 */
  125006. { { 0xe5537747,0x846dc3d2,0x1f5f9f46,0xe28e00df,0x3f31e42d,0x041af624,
  125007. 0x256af225,0x4948947f,0xff4f9550,0x3896c61a,0x34bb5a3e,0xcb40c773,
  125008. 0xeceafacc,0xb9becb07,0x4d45e83e,0xfe29f049,0x000001aa },
  125009. { 0x6b5578db,0x83fb71b3,0x0a710526,0x3017f115,0x5f220d77,0x189ec946,
  125010. 0x48465e68,0xba87ae07,0x70e0cbea,0x1da474d5,0x2b2ba7c5,0xb92cb0a6,
  125011. 0x8b1fb7e2,0x35cb356d,0x2cc8cb18,0x1155296a,0x0000000f } },
  125012. /* 13 */
  125013. { { 0x6ed0f604,0x7f9c9d9b,0xcb49c6d7,0x765e43e9,0xae9be5ca,0x03c4dd67,
  125014. 0x405aed36,0x5480888b,0x920ccddb,0x3a69ebb2,0x03f0c7cc,0x44ec0573,
  125015. 0xce89b026,0x158e2437,0x4f179a17,0x86795029,0x0000003a },
  125016. { 0x9f193dd9,0xf7854032,0xdcc158a9,0x531e4068,0x3642b1a5,0x774171bf,
  125017. 0xc1e53aa3,0x12b4920f,0xfd87478d,0xd1c5fb53,0xa7cba7ca,0x48958c58,
  125018. 0x3f66f2c7,0x375b2cb2,0x598899bd,0x1b510d0f,0x000001b8 } },
  125019. /* 14 */
  125020. { { 0x52007e41,0xfe96299d,0xcd708dcd,0x997140b5,0xf655f6fa,0xe9294eed,
  125021. 0xd58b839d,0x7701d45d,0xb6f77cdb,0x5dbdf5ad,0x95a572f0,0x265189f4,
  125022. 0xb3515e7b,0xc162794e,0x72655e0b,0xbfb571e0,0x00000168 },
  125023. { 0xbda82a6b,0xf0d2b863,0x390a9cc7,0x3df5b283,0x700fcd7b,0xbab9995a,
  125024. 0xfa4e6c06,0xc01ef0af,0x76a392d4,0x10a98513,0x955392f0,0xa7e3fc72,
  125025. 0x1d7a8550,0x8e3c0128,0x361898a8,0xcbca551a,0x0000010f } },
  125026. /* 15 */
  125027. { { 0x3ab71115,0xc8a4cd40,0xbcb9b55b,0xb783170d,0xabd9b426,0x1be20f6a,
  125028. 0x5377b714,0x32d2ea64,0x6b358bbf,0xda342480,0x6e202211,0x782bc800,
  125029. 0xaa27c499,0xf80974c4,0x50341cde,0xc2e66fa9,0x0000004e },
  125030. { 0x24ae60c3,0x082cb95b,0x83ad7484,0xd4b80af4,0x6205256b,0x84b739ce,
  125031. 0xae1fe063,0x616f505e,0x342f218f,0xef14ea68,0x64a01186,0x2b17d66c,
  125032. 0x50858bce,0x60e889ce,0xd5881005,0xdb046c59,0x000001e1 } },
  125033. };
  125034. /* Multiply the base point of P521 by the scalar and return the result.
  125035. * If map is true then convert result to affine coordinates.
  125036. *
  125037. * Stripe implementation.
  125038. * Pre-generated: 2^0, 2^130, ...
  125039. * Pre-generated: products of all combinations of above.
  125040. * 4 doubles and adds (with qz=1)
  125041. *
  125042. * r Resulting point.
  125043. * k Scalar to multiply by.
  125044. * map Indicates whether to convert result to affine.
  125045. * ct Constant time required.
  125046. * heap Heap to use for allocation.
  125047. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  125048. */
  125049. static int sp_521_ecc_mulmod_base_17(sp_point_521* r, const sp_digit* k,
  125050. int map, int ct, void* heap)
  125051. {
  125052. return sp_521_ecc_mulmod_stripe_17(r, &p521_base, p521_table,
  125053. k, map, ct, heap);
  125054. }
  125055. #else
  125056. /* Striping precomputation table.
  125057. * 8 points combined into a table of 256 points.
  125058. * Distance of 66 between points.
  125059. */
  125060. static const sp_table_entry_521 p521_table[256] = {
  125061. /* 0 */
  125062. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  125063. 0x00, 0x00, 0x00, 0x00, 0x00 },
  125064. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  125065. 0x00, 0x00, 0x00, 0x00, 0x00 } },
  125066. /* 1 */
  125067. { { 0xc2e5bd66,0xf97e7e31,0x856a429b,0x3348b3c1,0xa2ffa8de,0xfe1dc127,
  125068. 0xefe75928,0xa14b5e77,0x6b4d3dba,0xf828af60,0x053fb521,0x9c648139,
  125069. 0x2395b442,0x9e3ecb66,0x0404e9cd,0x858e06b7,0x000000c6 },
  125070. { 0x9fd16650,0x88be9476,0xa272c240,0x353c7086,0x3fad0761,0xc550b901,
  125071. 0x5ef42640,0x97ee7299,0x273e662c,0x17afbd17,0x579b4468,0x98f54449,
  125072. 0x2c7d1bd9,0x5c8a5fb4,0x9a3bc004,0x39296a78,0x00000118 } },
  125073. /* 2 */
  125074. { { 0x0f0ccb51,0x80398667,0x3654974a,0xb87e1d01,0xb2b29ed9,0x7f58cf21,
  125075. 0xa3add337,0x06c0e9aa,0xe9d08ffb,0xf13b35d0,0x96761627,0xdd8bf44c,
  125076. 0x758a3ef4,0xa4a18c14,0xa0043adb,0x96a576dd,0x0000013e },
  125077. { 0x632d95a3,0x2bde24f8,0x4c524829,0x79f15ef1,0x9bdaba19,0xaadd863e,
  125078. 0xa962b707,0xdde053f4,0x14258d98,0xc598a2de,0x061c235c,0x9fa5a19d,
  125079. 0xe8ffd32c,0x0ed46510,0xef78ceac,0x2aea9dd1,0x00000185 } },
  125080. /* 3 */
  125081. { { 0xeaaf1fe3,0xd0a91dd8,0x4400b52b,0x0db38662,0x21abf0d2,0xff6a06a9,
  125082. 0xa768c940,0x9412879a,0x9a1eec37,0xf3791abc,0x2738343c,0xc913fbe6,
  125083. 0xe222abc1,0x728b42ab,0x2b9ef313,0x874c0a86,0x00000157 },
  125084. { 0xe6f03d49,0x0ac8f184,0x1e48be03,0xa9c357e4,0x815cbdef,0x02ce5ef3,
  125085. 0x5fd8dc3c,0x7a41c7ab,0xfaeb109d,0x4bef67c9,0xa84f4d38,0x2f98cca1,
  125086. 0x672f0aae,0x7e03d47d,0x1d58968b,0x24b1ab58,0x00000007 } },
  125087. /* 4 */
  125088. { { 0xdf9314e0,0x904f2d4b,0xe7a00aac,0xdaae850d,0x582efb03,0x79231083,
  125089. 0xec7fe6d2,0x80f1c283,0x199d74a8,0x2d5b3996,0x395007e7,0x5f120b9b,
  125090. 0x4773f03e,0x30d23773,0x3b78b686,0xf4c19273,0x00000121 },
  125091. { 0xfa8b51f0,0xf103ff6d,0x40e2bdf0,0xae7afb51,0x83254171,0x1130380e,
  125092. 0xcda10d95,0xe83501b8,0x4f3a8c01,0x1057771e,0xac807069,0x8f52196a,
  125093. 0xa5623821,0x3609b0aa,0x94a0a7f1,0x8c257906,0x000001db } },
  125094. /* 5 */
  125095. { { 0xb2c0958d,0x300370cc,0x69a7b387,0x89aef166,0x480c9b38,0x2792f3cf,
  125096. 0xfab3e149,0x0b2984f2,0x50748967,0x9751e436,0xad33db2a,0x9cab99d5,
  125097. 0xb44a4daa,0x4d945d32,0x16c77325,0xa26cca52,0x0000000a },
  125098. { 0xf9e66d18,0xcdbe1d41,0xaa117e7a,0x80aeef96,0xddb0d24b,0x053214a2,
  125099. 0x5c98b7bf,0x6dcfb227,0xdfd3c848,0x613e7436,0x3ca4d52c,0x6e703fa1,
  125100. 0x18551e64,0x0c8e2977,0xbfa8527d,0xf5e90eac,0x000001c6 } },
  125101. /* 6 */
  125102. { { 0x4ab2d58f,0xa2c2f1e7,0x2a097802,0xc1bbf82c,0x770bb76a,0x6583eb24,
  125103. 0x5667f7bd,0x8e4ed9ed,0xfd96897e,0xd8c01d86,0x3fbe0f15,0x66395a13,
  125104. 0xd99cdcb1,0x51e4f39d,0x720deb25,0xde08424a,0x00000082 },
  125105. { 0x60ea91af,0x97aa53b2,0x7a31dfdd,0xa4384af7,0x5cd09bbe,0xcd82f239,
  125106. 0xf30058e1,0x997c19da,0xe5c78e97,0x443b60c6,0x575b1845,0xfaae9b5f,
  125107. 0x08c2ce16,0x5ce86f33,0x4f63fa86,0x983ce58f,0x00000073 } },
  125108. /* 7 */
  125109. { { 0x8217609d,0xaee93131,0x2412fc00,0x7f8a9dd4,0x286c6329,0xe117e64c,
  125110. 0x7bf1c65e,0xcc3782d6,0x8d03eee5,0xe8c144db,0x9ab93799,0x01acacb2,
  125111. 0xb07784c7,0x215eb1b5,0x1affcd87,0x2c409fa8,0x000000f8 },
  125112. { 0x378139a4,0x007d3766,0xb55bea93,0xc6d969eb,0x68c8bc9d,0xc7c60d6f,
  125113. 0x5f93f242,0x844e8461,0x741717d9,0x8461ca2a,0xf0bf120e,0x8e930e79,
  125114. 0x6b5699d7,0xe1554a02,0x6a4fb6de,0xe69c7702,0x0000007d } },
  125115. /* 8 */
  125116. { { 0x4bee80d7,0x61b51bb0,0x7692de69,0x0e1f6a1f,0xa0ebc3bd,0x8379e46c,
  125117. 0x930644f0,0x1c0bffa7,0x390db077,0x97c67b87,0xfada1ce9,0x095c33e1,
  125118. 0xac54b512,0x3c500add,0xd3118656,0xc231d360,0x000000b0 },
  125119. { 0x39bcab2f,0x06289298,0x64dd220a,0xc0c06780,0x763dc2a0,0x062f6084,
  125120. 0x1938c3e3,0x88e9da73,0x52e46eb9,0x69be8f2d,0x6a5de0fd,0xe55c8d2d,
  125121. 0xdb2c0e26,0xf3a3fd63,0x1e4bff57,0x899c6d9f,0x0000014a } },
  125122. /* 9 */
  125123. { { 0xec05ce88,0x9ff6e3a1,0xb6afd202,0xf8fc2496,0x6fbeb007,0x0b9d2077,
  125124. 0xeebded40,0xb50ec0bd,0x693700f7,0xaef97742,0x3f7b030e,0x806e37a1,
  125125. 0x1b901f77,0x5cf17d17,0xca95ae0f,0x9036e5df,0x00000159 },
  125126. { 0x000e8e0c,0x00af64b5,0x06fb4df9,0xd3f2ae04,0x449f23ba,0x5f61da67,
  125127. 0x255b25a9,0x0ca91842,0x8e33c650,0xfa6af3e6,0xc2c027c1,0x14373c00,
  125128. 0x972840a5,0x99f3cda1,0xd0e84240,0x98c62b79,0x000000e7 } },
  125129. /* 10 */
  125130. { { 0xae4d0f28,0xe8c7c4a8,0x566d006e,0x3a8a55ef,0x066e4023,0x37985f65,
  125131. 0x5d321b76,0x8deccab5,0xb8351b07,0x38b966d6,0x57d548ab,0x2e889e53,
  125132. 0xe631ab0b,0x7a9e8e2f,0xe75c537b,0x45c60f95,0x00000059 },
  125133. { 0x7867d79c,0xbca27d34,0x81c81980,0x7f460b15,0x976b8c51,0x7ec2d9ab,
  125134. 0x61b91ed9,0xfcd04486,0xd9c1d15f,0x730a7a25,0xf94c9db9,0x8a2cf259,
  125135. 0x5dec5a3b,0x8e784b87,0x3e5131ee,0x06252607,0x00000004 } },
  125136. /* 11 */
  125137. { { 0xf1631bba,0xdee04e5c,0x156f4524,0x40e6c1df,0xe4c30990,0x06603f30,
  125138. 0x6b6abec7,0xdb649a43,0xf6b94f6e,0x354f509c,0x36b7e0b5,0x7fecf469,
  125139. 0xba1e6dd2,0xa7a7107e,0x689450ca,0x889edac5,0x00000022 },
  125140. { 0xd05596f2,0x9012916e,0xb023cb8b,0xe3901dac,0xe7d4abe1,0x2501d3ec,
  125141. 0xa9c90313,0xb2815040,0xc6d146d0,0x9dbcd3f1,0x74ee1896,0x6fa1d5b1,
  125142. 0xa91226fb,0x49aea161,0xb8a80984,0x754ceedf,0x00000154 } },
  125143. /* 12 */
  125144. { { 0x4270b2f0,0xb64e27b0,0xbf4d74d7,0x84b34e48,0x0c2722ba,0xb186be8b,
  125145. 0x9ff9b71c,0xf54a589d,0x34fd6bc4,0x9887e4df,0x7412f49d,0xb7c669fd,
  125146. 0x77f89d16,0x4008d9bb,0xc902e074,0xafb9426b,0x000001cf },
  125147. { 0x662935ca,0xcca4f2d1,0x997dcc46,0x2847c703,0x353c79f8,0xc089e9e5,
  125148. 0x5215f0f4,0x9ed8d989,0x80911b9d,0x59cf08bc,0x6de27aa3,0x4b03540e,
  125149. 0xf69e320d,0x52f4d63e,0x94ef193b,0xa0217fd6,0x000000e6 } },
  125150. /* 13 */
  125151. { { 0x74214780,0xb77de627,0x207459ea,0xca066817,0xe9c7fb01,0xf78579b7,
  125152. 0xd6d4b7c7,0xe55548c1,0xa66caa39,0x45756190,0x98505a4f,0xf8141b03,
  125153. 0x4c8864eb,0xa5ca0d7c,0x9e129d3f,0xbf8af950,0x00000053 },
  125154. { 0x85285092,0xbc9b29d8,0x8eed5e5f,0x82f31daa,0xf618aab9,0x9c33690e,
  125155. 0xd2626ed1,0x0eee14f4,0x07ed8e09,0x4229570b,0x8736d040,0x1977920e,
  125156. 0xede7d01d,0x47ee25ff,0xbc7ab73b,0x3c921c3a,0x000001b9 } },
  125157. /* 14 */
  125158. { { 0xa08b2b14,0x0b6a07cc,0xbf174c7f,0xaa978deb,0xc40cb2a4,0x291cb828,
  125159. 0x90adc838,0x95c78272,0x8c1edde6,0x08da8b2a,0x90fbd220,0x741ceb2f,
  125160. 0x322db94e,0x5f89c9e5,0xb73c548e,0x18266085,0x0000007d },
  125161. { 0x2defd012,0x69ebf82a,0x5a1537ef,0x01ecb094,0x3ef0811d,0x3c557535,
  125162. 0xb2bd4dea,0x59c882a7,0x7bf969c8,0x00a1f972,0x0b25ad1b,0x063adf5e,
  125163. 0xf2536005,0x4c1ff306,0x4112fe18,0x8e515bec,0x00000117 } },
  125164. /* 15 */
  125165. { { 0xefe3d3d5,0x9314787f,0x9d897227,0x29e76f65,0xe0b6acf5,0x15c77ed1,
  125166. 0x1c5e8dd9,0x9c2b7b20,0x5f5667af,0x788038f1,0xf3576ef4,0xf38c766f,
  125167. 0x0040154a,0x9f0623c8,0xde883b53,0x47d3c44b,0x00000096 },
  125168. { 0xde1b21a4,0x32075638,0x571081c1,0xbb6399c1,0x75c03599,0x322e6067,
  125169. 0xade60cf5,0x5c7fde7f,0xefc19059,0x1b195440,0xdd7b3960,0x7e70ac8c,
  125170. 0x6a6fa73e,0x4aa5a83d,0x63080764,0x34f8cfac,0x00000042 } },
  125171. /* 16 */
  125172. { { 0x286492ad,0xee31e71a,0x65f86ac4,0x08f3de44,0xda713cb4,0xe89700d4,
  125173. 0xa86b7104,0x7ad0f5e9,0x2572c161,0xd9a62e4f,0x25cc1c99,0x77d223ef,
  125174. 0x3b962e0c,0xedff6961,0x81d8b205,0x818d28f3,0x0000008e },
  125175. { 0x8cdf1f60,0x721231cf,0x6717760f,0x8b640f2b,0xe045a403,0xbe726f8c,
  125176. 0x0370689f,0x422285dc,0x72ea0dcb,0x7196bf8f,0xc8086623,0xa16f7855,
  125177. 0xc326fe48,0xd4e19fc7,0x8f68bf44,0xfdbc856e,0x0000013e } },
  125178. /* 17 */
  125179. { { 0xe6a3ace5,0xde34d04f,0x896191c1,0x0dbb603e,0xf75ed0f4,0xb4dc0007,
  125180. 0x95b259b5,0x15e0e6bc,0x2615f020,0xdfbcba66,0xd31ea3f8,0xb2ec5433,
  125181. 0x103ff824,0x42b0b0e4,0xc480332e,0x19315060,0x00000111 },
  125182. { 0x045452f1,0x9997ea28,0x71f3f73b,0x80b678cf,0x41e9328e,0x4a52bddc,
  125183. 0xe6af1c23,0xb7f2656e,0xb44215e7,0xc43805b9,0xf0a4028b,0x3aa734f2,
  125184. 0x422476e2,0xe3c72479,0x68c60cf7,0x6dc2e8b0,0x000001f1 } },
  125185. /* 18 */
  125186. { { 0xfffc0de5,0xbcdfae6f,0xab4a5f24,0xa801814f,0xea2aa8dd,0x19013658,
  125187. 0xda4f0441,0xf3b1caf5,0x34100611,0xf24b9cdb,0x96e0cf88,0x48c324ed,
  125188. 0x23055c82,0x4b7ea334,0x89092e29,0x6e835b64,0x000001d3 },
  125189. { 0x07372f27,0x7eb77ae7,0x83bae19a,0x4779b4fa,0x65429ebb,0xa175dae1,
  125190. 0xfc03ef3f,0x942ec266,0x6991c7c4,0x0e5fc6a9,0x56253d3c,0xa0f61e4f,
  125191. 0xde74e738,0x7a11ff58,0x624de919,0x60524cd4,0x00000002 } },
  125192. /* 19 */
  125193. { { 0x01342e08,0x45b5d0ca,0xb749f0af,0x509ed4f0,0x6529d804,0xeb5502d9,
  125194. 0x6d80359c,0x5eb087db,0x4c384800,0xeaa66a87,0xc75a8784,0xe972c7a0,
  125195. 0x6874317e,0x8c169e21,0xe5c9fbf4,0x81c556e0,0x0000014f },
  125196. { 0xe120674d,0x26b0b12b,0x219f00ac,0xc6bf09b9,0xd658caa6,0x1e1e732d,
  125197. 0x8292d99e,0xc771c5af,0x25fdbf80,0x5d813529,0x3666c37d,0xe61bd798,
  125198. 0x1d0df680,0x8dac946a,0xc39f0983,0x58dcf684,0x0000009f } },
  125199. /* 20 */
  125200. { { 0x7b7dc837,0x14169102,0xb50eb1c4,0x2d719754,0xd7e6741b,0x04f4092a,
  125201. 0xbc824a38,0x1d0a7f1d,0xc8e20bcf,0x570b2056,0xda181db0,0x6732e3b9,
  125202. 0x0a7b508a,0x7880636e,0xc9f70492,0x11af502c,0x00000045 },
  125203. { 0xc56f4ffa,0x0b820d94,0xc4f0c0fa,0x1c6205a2,0xa1a0606a,0x99f33d4e,
  125204. 0x79b316fb,0x1bab6466,0xe4f240fc,0x05aa0852,0x92d7dc43,0x22539b78,
  125205. 0x06e3c073,0x03657f12,0xcedb6633,0x28405280,0x00000059 } },
  125206. /* 21 */
  125207. { { 0x4397760c,0x90d08711,0x1c9fcd06,0xb9020b76,0x987e24f7,0xc7fec7fa,
  125208. 0x522335a0,0x0e33b8a0,0xae21ca10,0x73dbeafd,0x3b032220,0x458c060a,
  125209. 0xee145da6,0x9b9c73b8,0x27ff62ef,0x31c661e5,0x000000aa },
  125210. { 0x81430b5e,0xaf518eb0,0x50ee0d69,0xb32f9cea,0xaa6ebe8b,0x0ecdb0b5,
  125211. 0x9fe1d689,0x1f15f7f2,0x1a59cc9a,0xce5d68f3,0x08ab2a63,0xf4d67994,
  125212. 0x4347ce54,0xe85b1cef,0x286d0776,0x8ff423c0,0x00000176 } },
  125213. /* 22 */
  125214. { { 0x33dcec23,0x8564104c,0xcdd07519,0xbaf0d61b,0x4c4f309a,0x486daf51,
  125215. 0xde488715,0xf01bc8f5,0xd3539ba3,0xddd6baf1,0x3a3be8ec,0xbb7e665d,
  125216. 0xcb5d865f,0xf919dac3,0xf12149a0,0xfe203da3,0x00000173 },
  125217. { 0x78d4a3d1,0x043ae9a1,0x865316d8,0xa4d5cf58,0x41176463,0xeaf026c0,
  125218. 0xf84afa44,0x316c638f,0xffea422d,0x512f2397,0x6622b613,0x691eaa04,
  125219. 0x97e7068d,0x48856ea3,0xf4a1b33c,0x42d1b2e3,0x000001b5 } },
  125220. /* 23 */
  125221. { { 0x1f487402,0xf51b2d5e,0x7aaf1dd5,0xe36016e6,0x6da9c20a,0x1eb3f1f5,
  125222. 0xece45bfd,0x25b7d361,0x027a9e18,0x42db0633,0xe8411649,0xbf228777,
  125223. 0x458773d0,0xf5fce0c4,0x2dd7a5f0,0xb2b3151d,0x0000001f },
  125224. { 0xfbaa096a,0x102773e8,0xe093a878,0x152726eb,0x2c7f1781,0x5c53cd07,
  125225. 0xab5dca76,0x38d3dfd0,0x87ef2d4a,0xbb4a7d85,0xb7eb11c2,0x5c9c2013,
  125226. 0x0b6da22f,0x5e353c34,0xa325ecad,0x846d50a5,0x00000039 } },
  125227. /* 24 */
  125228. { { 0x1677df58,0x76da7736,0x1cb50d6c,0x364bd567,0x0a080ff2,0x0443c7d7,
  125229. 0x86532430,0xa0a85429,0xc35101e7,0x82002dd2,0x48c5cd76,0xbebc6143,
  125230. 0xca6cf13f,0xff1591ae,0x98bf8dc0,0x91c7c2e6,0x000000fb },
  125231. { 0x12de14d5,0x6a7c5cad,0x6561c822,0xbc448c5f,0x7cdbb3da,0x9f8de430,
  125232. 0xc76811d7,0x9c58f011,0x75462049,0x1e89806e,0xc9a74e49,0xe52ad0a2,
  125233. 0xb2be37c3,0x2034685c,0x0a0bc72d,0x7a863245,0x000000ec } },
  125234. /* 25 */
  125235. { { 0x8a86786e,0x33818c21,0x2137e2c8,0xed537f74,0xa7e6eb20,0x5d9690d1,
  125236. 0x5cdc4803,0x9790ec70,0x24f7bd75,0x469162c8,0x4e1f0f14,0x09e7ef9d,
  125237. 0xce9915ca,0xd30c128b,0x6c71226f,0x810145f6,0x0000002d },
  125238. { 0xb71d87e5,0x312749f5,0x7b02ceda,0x25f3b141,0xe0baff16,0x02456d2e,
  125239. 0xfcae6627,0x97f7b3a9,0x37bd985f,0x0d6ebf8f,0x7fa6d0c1,0x20aa81b9,
  125240. 0x21f2f137,0xb29f1a01,0x5cc0ddb1,0xe326a2f8,0x0000003d } },
  125241. /* 26 */
  125242. { { 0x38c2ee78,0x26f3398b,0xa75a0bee,0x40c3d101,0x565a7f8e,0x35a31706,
  125243. 0x04019e5d,0xd12985e3,0xb8174b6e,0x21e2a642,0xaf80a52a,0x25a15ee8,
  125244. 0x8518d80e,0x5d1e0fe6,0x04f6ea9a,0x8cbbc138,0x00000084 },
  125245. { 0xdfd45169,0x76828690,0x59d3e8d0,0x38d7e098,0xcdb8bfc2,0x23758811,
  125246. 0x162cf648,0x8499547a,0xb4d15b8c,0x494bab3b,0xc60499a6,0x822cbc57,
  125247. 0xa8a1cfed,0xac43224e,0x57c6598b,0x43563469,0x000000d9 } },
  125248. /* 27 */
  125249. { { 0x68271323,0x2b069253,0x49cd04d7,0x24d9e0a8,0x2b31cc7d,0xaae35fbf,
  125250. 0x57a3e361,0x44f64b4f,0x0294e856,0x14904686,0x43ced4ae,0xddc82ee7,
  125251. 0x7e2cda47,0xcb92a6a5,0xbfc1f968,0x989c42ef,0x0000013f },
  125252. { 0xb8651600,0xbed98bdf,0x7a3cfaee,0x8c363434,0x35b1a226,0x93a12543,
  125253. 0xd5825507,0x558da7dd,0x852eb1e9,0xa5173b23,0x2295f545,0xdf5ae585,
  125254. 0x6646d101,0xe546e2ef,0x5d89f862,0xf7e16a2c,0x000001fa } },
  125255. /* 28 */
  125256. { { 0xc7ec136d,0x0d746c8e,0xcd11351b,0xf8e1d827,0xf187a116,0x764a3ad3,
  125257. 0x136e8465,0x2f1b968f,0x850983c2,0xd41aa294,0xbe717259,0x2123ecc4,
  125258. 0x763c149c,0xdcdcab52,0x1022b82d,0xa7f50b18,0x0000016d },
  125259. { 0x0ca5e258,0xf99e532d,0x97b62a7b,0xa148ad17,0xc77fddef,0x8d0a242e,
  125260. 0x74f9b6c4,0x58518bcd,0x7fd122d4,0xc53b30b8,0xfb50b2d7,0xbb8cd193,
  125261. 0xbc01aae9,0x1a169aee,0x1de26e09,0x7e49b10a,0x000001c5 } },
  125262. /* 29 */
  125263. { { 0x21210716,0x2cabe675,0x07e02400,0x81a296a3,0x8c83795b,0x94afc11d,
  125264. 0xdd9efa6a,0x68f20334,0x677d686f,0x5be2f9eb,0xbf5ce275,0x6a13f277,
  125265. 0xb9757c5c,0xf7d92241,0xc74f4b8c,0x70c3d2f4,0x00000132 },
  125266. { 0x8d209aa4,0xf9c8609c,0xdb2b5436,0x46f413a2,0x2992345d,0x96b72d1a,
  125267. 0x9487c34f,0x186f2aeb,0xb440a375,0x4fa72176,0x7da5358e,0x3a420936,
  125268. 0xff25b310,0xf11eade3,0x505d60b8,0x9a570153,0x000001a9 } },
  125269. /* 30 */
  125270. { { 0x6e7495bb,0xae151393,0x490879d1,0xebd2fd28,0x29fd76fc,0x9c232b0b,
  125271. 0xc60e721c,0xa1a0d49b,0x517a09e2,0x9f582b83,0x9d8badf8,0xac37809e,
  125272. 0x0ad48bb4,0x4aa4de9e,0xcb6cc487,0xfd041312,0x00000027 },
  125273. { 0xead4fb6d,0xc05502ee,0x0a602cbe,0x760c25ed,0xbd7f4a07,0x58ba6841,
  125274. 0x54edce14,0xc28b6032,0x0397614c,0xb9d41e39,0x181eed93,0x4221b71d,
  125275. 0x332d4b0b,0xd010e3c2,0xdab0e419,0xdfe58a27,0x00000096 } },
  125276. /* 31 */
  125277. { { 0x7debd24e,0x4cd6fcd6,0x9ae2b075,0xbe3fca60,0xf217c26c,0xa7d8c22e,
  125278. 0xb9620e3f,0xd42d03e0,0xc7f9f87d,0x634bf216,0x8972ffee,0x22b1ec53,
  125279. 0xd60d3e77,0x83a957c1,0x0f6a537e,0xedfe5f86,0x00000162 },
  125280. { 0xf0ea20b8,0x40a05400,0x1d796900,0x2872ac7e,0x0edb0cac,0x7765a5c9,
  125281. 0xb62939a7,0x9df5b930,0xaf2cb708,0xf78a676e,0x52febc12,0x030732bf,
  125282. 0xba190ad3,0x3a6640de,0x93e7e341,0x36eae15f,0x000000d5 } },
  125283. /* 32 */
  125284. { { 0xa1c88f3c,0x6c6119f6,0x2ec6944a,0x924e5fec,0x5742ff2a,0x4c8aac60,
  125285. 0xddb22c7c,0x60adde1e,0xfa5d25bb,0x9728938c,0xec117de0,0xfa5ac4f7,
  125286. 0x482929c1,0x41f35ab7,0x0afd95f5,0xd1c4e8f9,0x00000180 },
  125287. { 0xa7cd8358,0x2fc4e73d,0xf2a1c920,0x39361a57,0xad94d288,0xf6f2f130,
  125288. 0x2b6a78e2,0xe37e2466,0x79c262cd,0x0babff8b,0x61b597b9,0x6cae01ef,
  125289. 0xa60d4e64,0x9c1e33f0,0xdd01f845,0x52a42280,0x0000000e } },
  125290. /* 33 */
  125291. { { 0x0f013755,0x72d640a4,0xfb8380e9,0x0b6dce77,0x7eb64b31,0x2789ce79,
  125292. 0x93ca5a36,0x8e704b0b,0x58bdffc9,0x18c360ff,0xb230c372,0x53b1f323,
  125293. 0x5a7385d1,0xd6b39088,0x56b93bf7,0x071130f5,0x0000004a },
  125294. { 0xfeef3f88,0x29a2096b,0xb82b3945,0x22eba869,0x872664a7,0x7fe2184a,
  125295. 0x858ff942,0xa0dc0ba1,0x7490c9da,0x33799eb5,0x81588ce8,0x1d356f62,
  125296. 0xa7b2cee2,0x7dd9bc7f,0xa3cfaee9,0x1e61a4e8,0x000000d2 } },
  125297. /* 34 */
  125298. { { 0xe9068656,0xec5db629,0x9fede4df,0x623bd70c,0xfcd45546,0xc78ad5bd,
  125299. 0x6291a741,0xf7981dd2,0x761e688e,0x3ac53d92,0x55b9272f,0x6a96892a,
  125300. 0x06546fec,0x4217e7b8,0xab9e2f56,0x793c03cb,0x0000015e },
  125301. { 0x6eff39be,0x08fd9543,0xdbff4f68,0x5a1af07e,0xb0241616,0x83d47abd,
  125302. 0xd4798029,0x37c5d2fd,0x60b2e6fb,0x9d86d978,0xce8db998,0xe3e3284e,
  125303. 0xd868b9bb,0x9f049eb5,0x9dad18b3,0x3b3e8a78,0x0000018e } },
  125304. /* 35 */
  125305. { { 0xe51e61f0,0x57026c56,0x307f2757,0xdddbcaa3,0xb1aeaf41,0x92a026eb,
  125306. 0xe2d7f5ba,0xa33e937c,0xbc5ead91,0x1f7cc01e,0x2e46807d,0x90ab665d,
  125307. 0x53419519,0xc2a44f55,0x79664049,0x099c1ca6,0x000000aa },
  125308. { 0x8f97e387,0xb561a909,0x45e1dd69,0xf6051778,0x7ff1d6ab,0x1ffa512b,
  125309. 0xd09a9c89,0x42da55a4,0xd2282e2b,0x5e5a7c71,0xe74185ad,0xdfa5a203,
  125310. 0xea0baeff,0x19b1369d,0x1ecc0a16,0xa5eef914,0x000001a3 } },
  125311. /* 36 */
  125312. { { 0x7a573b81,0x2af20d0a,0x66194cef,0x7eac1ca8,0x0b711c34,0xef0d2d8d,
  125313. 0xba099d42,0x6aea016c,0x5067a8ca,0xa6609d28,0x7a1351ef,0x6a52c600,
  125314. 0xb11c2634,0xdab85818,0xbb1c033c,0xf17fa45d,0x00000121 },
  125315. { 0xfc3279d6,0x9fb8b87a,0xc201f1e1,0xe30e76ab,0x806c21dd,0x02af6a83,
  125316. 0xc63f824f,0xeafd7e2b,0x46bd1a53,0x7b074e26,0xa2139164,0xcd6f4931,
  125317. 0xc172d9bf,0xab2cfd39,0x4db59cf1,0x62f3eb4b,0x0000010a } },
  125318. /* 37 */
  125319. { { 0xe0689a1b,0xe402de36,0x7dcafe72,0x9dccc9fd,0x255d0bfb,0xe4dead7e,
  125320. 0x4ada04d9,0xd7ee87ee,0xbfd2e774,0x5a85039e,0x770b2b9b,0x282c6657,
  125321. 0xba103bba,0xa7aca826,0xc7cd5071,0xac7028ba,0x0000011a },
  125322. { 0x680c8f04,0x2e61d39c,0xb48b3b5e,0x2f09c4cc,0x95744f3c,0x131609bd,
  125323. 0xaaccb593,0x6d72e4b4,0x5adfb209,0xdb7060ca,0x1fd3eccf,0xc67d9e43,
  125324. 0xe1752a73,0x1487a26f,0x64d0857c,0x3d953663,0x000001e3 } },
  125325. /* 38 */
  125326. { { 0x4cec9e7f,0xe664506b,0x30aab98f,0xa44564b4,0x173fa284,0x5e1b501f,
  125327. 0x15c97472,0xe7b7bd7e,0x82dec033,0xd6cc67a8,0x0a63b762,0x1fe2e934,
  125328. 0x3f8e2fcd,0x3a084e1b,0x9ae6e752,0xccce4da8,0x000000fd },
  125329. { 0xc12fd820,0x0797f8ee,0x96da4733,0x325f892a,0x55997bf4,0x597d241d,
  125330. 0x02b753cf,0x3aef35ac,0xf677ceba,0x8a73f95d,0xd1bbac6c,0x5b2892b7,
  125331. 0xcc5278b0,0x90751583,0xa47f45f6,0x2f5ed53f,0x0000001c } },
  125332. /* 39 */
  125333. { { 0xab40b79c,0x3914165e,0x25b489a8,0xbfb6eed8,0x8a6c107f,0xda136b7d,
  125334. 0x8e01f28b,0xd431db8b,0xa4d79907,0x84e5d0dd,0xa471e685,0x69a91472,
  125335. 0x98376ff8,0x58d06969,0xc46311fd,0xce369b74,0x00000006 },
  125336. { 0x1add1452,0x6c0773d1,0xed8e9a2a,0x2e4e9c95,0xca15a40c,0xe8ff8e32,
  125337. 0xaf62f18f,0x3fcb7d36,0xeec9484b,0x2ca336ee,0x3b20405b,0xa4d6e7a9,
  125338. 0x956d8352,0x6d90d031,0xd9ca03e7,0xdd375603,0x000000e5 } },
  125339. /* 40 */
  125340. { { 0x8b481bf7,0xcc5f297d,0x2a13383c,0x06a2a3e4,0xdc40b96c,0x9e14528c,
  125341. 0x1189da3c,0x9a2bf35f,0x6cd57fa7,0xb8adb989,0x9357d32b,0xc1a4935c,
  125342. 0xc2d76fad,0x51fb2580,0x24f23de1,0x98721eb4,0x000001ba },
  125343. { 0x52a4b397,0x8c02daaf,0x0d0b4e54,0xc3c5f4cc,0x7b7e79cd,0x29be4db3,
  125344. 0xb33970b6,0xf34336ec,0x92808c7f,0xed3dcb7c,0x02288db1,0xec290eff,
  125345. 0xe96ed59a,0x2a479d51,0x76d8fa5f,0x9d7ed870,0x00000092 } },
  125346. /* 41 */
  125347. { { 0xe660043c,0xd8edaf0b,0x016e074d,0x84aa2ccb,0xe2cc3b3d,0x9d2368e7,
  125348. 0x5c269fc4,0x47b50130,0x3de33e36,0xd0194ee1,0x789ca504,0xdb3361b9,
  125349. 0x984db11d,0x8cd51833,0xc8ec92f0,0xd5b801ec,0x000000c6 },
  125350. { 0x47ab9887,0x33f91c15,0x6b5ab011,0x2f285e2a,0x133fc818,0x9b734e5a,
  125351. 0x38d8692c,0x5c435a74,0x43282e81,0x3c92b47c,0x9c7bcdaa,0x191231f5,
  125352. 0x4d158c86,0x3ae425c3,0xc5a23cca,0x7f568feb,0x00000011 } },
  125353. /* 42 */
  125354. { { 0xbf5caa87,0x8ccbd9d5,0x68dd8c9d,0x17bfc60f,0xc7d4dede,0x63eb4dbb,
  125355. 0x8270b5bf,0xbf6e5945,0xcc098fe7,0x887137a5,0x05d7b8f5,0xca5eb687,
  125356. 0x4b25a533,0x4b7deeee,0x4a700a6c,0x8e045c32,0x000000ef },
  125357. { 0x70cf52bc,0x160c1c92,0x90cc6298,0x4bf3f63a,0xbf3028fb,0x5fff421c,
  125358. 0x523beff1,0x0a8102d7,0x8b9ce105,0xff3309a3,0x06621b1e,0x8e9da4d0,
  125359. 0xcc0a7807,0x9775f89f,0x00178612,0x59044865,0x000000eb } },
  125360. /* 43 */
  125361. { { 0xebbd33ec,0x8a6664fd,0xce5ad579,0x0cf9a660,0x50fb56ed,0xecd06c05,
  125362. 0x1d5aaa6e,0xb4ca5fad,0x948a7f07,0x36daee5b,0xefe1c11a,0xd2e37887,
  125363. 0x91d2544b,0x41f61ac4,0x2bffd8ea,0x49df7071,0x000000be },
  125364. { 0x65acdb56,0x60e2f1f5,0x5e5e5bde,0xf2f13c84,0xe17a0412,0xb97fd354,
  125365. 0xd9c93bef,0x8a2867cf,0x25a957e4,0x9ca9d16b,0x4a18635f,0x1f55c19b,
  125366. 0x8d26ae71,0x9b3868f5,0x4c94541d,0xac448041,0x00000000 } },
  125367. /* 44 */
  125368. { { 0xd4ad38db,0x6c1bcf89,0x3d714511,0x1180f381,0xcb70243a,0x5b4c2759,
  125369. 0x163a716c,0x5dd64d63,0x13648bdb,0xbbd2efea,0xe4de9969,0xa47187f9,
  125370. 0xe2de8c45,0x65de6912,0x4bdad0a7,0xe075f29c,0x00000048 },
  125371. { 0x5e4dd88d,0x00335474,0x80577afc,0x18283638,0x227288f7,0xe4b35c01,
  125372. 0xe68989de,0xd008fd91,0xcd3f71ba,0x42142315,0x3e4da1e2,0x5cb023ff,
  125373. 0xb5662bb1,0x7e6b9c35,0x7fb04fe5,0x143f4165,0x00000072 } },
  125374. /* 45 */
  125375. { { 0x26f40f2c,0xb06b046c,0x6cd7c31d,0xbd5d246c,0x1953a9b7,0xaaa56270,
  125376. 0x8f00436f,0x5ac929b8,0x21d0660d,0x1937392c,0x9bd6dbe6,0xd279ed15,
  125377. 0xd17c43f9,0x377c4d5a,0xb8fcd025,0x800eda50,0x00000179 },
  125378. { 0x36132f31,0xb88ddc0b,0x2ade73a3,0x6f8f4f01,0x203de2b9,0x38859ec3,
  125379. 0x231b6533,0xedb03814,0xa14093ca,0xad08cd20,0x5c2be2f9,0xb9f86d44,
  125380. 0xf6ebc09f,0xfd3d9532,0x1aef478d,0x757b5899,0x0000013d } },
  125381. /* 46 */
  125382. { { 0x580f894b,0x7d9ad100,0xd925e46f,0xb612488a,0x2e5a6865,0x45497e14,
  125383. 0x17f9a813,0xc86e1053,0xf8a33541,0xd8aa820a,0x7a66d578,0xa6790660,
  125384. 0x5f758e23,0x47df60ae,0xa7f8ab5c,0xcadd4c90,0x00000107 },
  125385. { 0x6764ad0e,0x356b044f,0x250189b3,0xf69fe0e1,0x5f14db6a,0x2deaca62,
  125386. 0x1bd77d54,0xe9f2779f,0x5cfa895c,0x979911f2,0xb6f19ac3,0xd4e94ced,
  125387. 0x01af44b1,0xc3533417,0x50c727f5,0xcac43fff,0x0000003b } },
  125388. /* 47 */
  125389. { { 0x83c1d4cf,0x1742951c,0xb245c34f,0xe03791d0,0x9c2dcc71,0xea8f8ef6,
  125390. 0x2a310767,0x2ea57a29,0xb12948bd,0x255b46bb,0x0feaeb83,0x2adc1e09,
  125391. 0x449abf59,0xa0d2d18c,0xc4a8a689,0x9e8c9ff5,0x00000019 },
  125392. { 0xeb28171a,0xc9f7b9cd,0xd576987b,0xefd78403,0x22ff824c,0x58b4f3bf,
  125393. 0xbf333cc5,0xee09b393,0xb01ceb72,0xebff83a2,0x220299cd,0x5bb34c45,
  125394. 0x66ebf751,0xa3c3e8a0,0x49d05cf3,0x5dee07bb,0x000001a6 } },
  125395. /* 48 */
  125396. { { 0xb114257b,0x09a958d6,0xd4975e30,0x729afd41,0x3aae7b11,0x072879b5,
  125397. 0xedd1ac83,0x0791b093,0x1eb67975,0xcfefc7d1,0xe2675b4a,0x0e54bd37,
  125398. 0x8d69517f,0x89a62d7e,0x202109a3,0x96f805d8,0x0000006b },
  125399. { 0x57b5f9f4,0x4815d517,0x405b44d1,0xe5c9e436,0xe4870160,0x3442dde0,
  125400. 0x1ef6b3f8,0x953fef95,0xf7497faf,0x919e4cf5,0x016ef0b7,0x24e3cc4d,
  125401. 0x2512eeed,0xfc5caa87,0xa3bd1703,0xf1ba4029,0x000001b6 } },
  125402. /* 49 */
  125403. { { 0x529252ac,0x2a668435,0x74e7b0d8,0x3da626c0,0xe0be86ab,0x55080cc1,
  125404. 0x4ed5dc53,0x534a53f7,0x0cd41fd0,0xa9eff140,0x5674891c,0x0e7c945c,
  125405. 0xec53b5ad,0xdea4b895,0x15150988,0xefc67bef,0x000001ff },
  125406. { 0x306033fd,0x988dc109,0xf36875d9,0x1b287979,0xe3c335c5,0x4d39af26,
  125407. 0x124e29d6,0xa47259fd,0xc41dbdfc,0x5d60c570,0x0cc0d895,0x06224b61,
  125408. 0xeea8ff86,0xa041d4e5,0xae4d8707,0x2920e15c,0x000001fd } },
  125409. /* 50 */
  125410. { { 0xcd67da85,0x66d15f0c,0x5ac54a15,0xae98b6f4,0xf1ac71c3,0x2f05e021,
  125411. 0x47559224,0x1feb2226,0x66e856dc,0x2a2f1561,0x6fb4ba47,0x65eb1456,
  125412. 0xa29d920b,0x34688bd2,0xf9d4cb9b,0x943ce86e,0x00000061 },
  125413. { 0xaac91174,0xb4696218,0x41dd9234,0x85b519ec,0x9f0763a4,0xb7efadf2,
  125414. 0x712c8b33,0x98517f27,0xb0538630,0xa02e7ec3,0x1ff3e3e4,0x46bc45bb,
  125415. 0x29496486,0x46ae896f,0xebd2b93f,0x2aeb1649,0x00000146 } },
  125416. /* 51 */
  125417. { { 0xe8e4d3c3,0x1f34f41f,0x5bb7e9db,0xc80d87ff,0xd910b579,0xf0216c0a,
  125418. 0xb87349ae,0x2a24b761,0x2b0a6cc0,0x054bc528,0xaf2d1957,0x3b4c7029,
  125419. 0xadbe6cdd,0x0e4b90e2,0x26060a34,0x8e774f81,0x000000cf },
  125420. { 0x2e229950,0x3c7f9dbc,0xd9f82b70,0xab11f846,0xf10c05f3,0x2b7ad9a3,
  125421. 0x0f1820ca,0x203ead4f,0xccbfb332,0x51dbcbc8,0x066706f1,0x3bd9caf0,
  125422. 0x06059d5e,0x5a39be25,0xdcafe64e,0x984387c8,0x0000014c } },
  125423. /* 52 */
  125424. { { 0x8e011531,0x708a757f,0xc3dcd57c,0x7f45b172,0xc2d99e29,0xa8eac9fd,
  125425. 0xb93b6415,0x9d4ee81f,0xa5488e86,0xa5833b54,0x0bb7ab70,0xddd561c3,
  125426. 0xb3bdf3a9,0xb5bda384,0x1ddf332b,0xf909f8e0,0x00000124 },
  125427. { 0xab41e782,0xc5b8aa84,0x851ddb87,0x1de20126,0x99482bd2,0xf49baa7d,
  125428. 0xf4b6413b,0x05963deb,0x7cd1e224,0xed369fbb,0x1bad60ee,0xdcf495dd,
  125429. 0x892e30ed,0xeb475693,0xaf0a212d,0xaaf11bd8,0x0000010b } },
  125430. /* 53 */
  125431. { { 0x16ec64e2,0x71460174,0x7d7c6ebe,0xbfd14acf,0x668b7176,0x1e3504a3,
  125432. 0x741b041c,0x72e3f3f3,0x2d3b67b0,0x651fa54a,0xe57d928d,0x623edca3,
  125433. 0x72c8f419,0x29b74e8b,0x327abaef,0x3d99cb47,0x00000038 },
  125434. { 0xda342a3f,0x808dd0b3,0xdef4a954,0x12002462,0xeab5a860,0x1b1c642e,
  125435. 0x06e54b6d,0x5e1e2a05,0x10c6cf1a,0x9ba1710f,0x0f903cd0,0x334fc366,
  125436. 0x134166f5,0x969e0001,0x155c4353,0xfaa26074,0x000000fa } },
  125437. /* 54 */
  125438. { { 0x712de285,0xc85cd0e6,0x869f5dc5,0xcd2ff8b0,0xdf4ed389,0x372a2b92,
  125439. 0x55b99c84,0x63524d30,0xe07a0033,0x46fef5a2,0xd6e09493,0x0a2c82da,
  125440. 0x72a8952b,0xb3626621,0xaf217eb6,0x9afcb188,0x0000002c },
  125441. { 0x9a64c5b5,0xd3b9d476,0x44c4cfe1,0xa0d8d5de,0x11c6dbff,0x560858ef,
  125442. 0x41c14aed,0xce1d978f,0x35efe854,0x251f9e72,0x0474575d,0xf9d0c14c,
  125443. 0xbda89c03,0x0d2c838e,0x36cc9dc0,0xa25f040b,0x0000016f } },
  125444. /* 55 */
  125445. { { 0x9cad682d,0xb23d9dea,0x46369391,0x87acb1b3,0x5c0f24d7,0x9f5c1988,
  125446. 0xd41883ce,0xdff62fc7,0x53555e46,0xd1ab29df,0x891cda05,0x569b1cb2,
  125447. 0x52c633ed,0xdb14dbc4,0x2a345428,0x1acbb86c,0x00000194 },
  125448. { 0x24db8127,0xd86a70c8,0x41b7cf5b,0x84a6563f,0xb908d9b4,0x8d84dabe,
  125449. 0x899c260a,0xaaeaae63,0x44436957,0x13ed6b2b,0xd0a92c8d,0x3bc94f99,
  125450. 0xd04bcb97,0x978f2e2b,0x716a565f,0x56a388ef,0x00000074 } },
  125451. /* 56 */
  125452. { { 0x96fc1f77,0x6082dfe4,0x1347ad6a,0xb04c435f,0x25ebe457,0xf42694dc,
  125453. 0xb6f764aa,0x64a17069,0x04d83da1,0xe03873d5,0xe0c82330,0xb0b9db52,
  125454. 0xd4239b3e,0x9886b34e,0x598814da,0x76587f2a,0x0000016a },
  125455. { 0xebc71a5d,0x6918f8e8,0x85405233,0x49141a42,0xc182cbcc,0xd63f09cc,
  125456. 0xe09057a7,0x4afe59d3,0xe239d8eb,0xe633db0d,0xfd9494b2,0xbac8582d,
  125457. 0x4704fd61,0x8b915a41,0xfceaefd9,0xe0866a9d,0x0000010e } },
  125458. /* 57 */
  125459. { { 0x52e07a4d,0x2b50c470,0xe5d745d0,0x7f6d38b8,0xe1af1226,0xb414c47c,
  125460. 0x39c505f7,0x03e4b44b,0x86f739be,0x59f3d795,0xe7c2f1bc,0xca19bca7,
  125461. 0xc063fad4,0x1c51c01e,0x7f428afb,0xda3937a5,0x00000080 },
  125462. { 0x102369fa,0xe9d8ca9d,0x706c0e35,0xe009bffb,0x96b55d80,0x2e0a19a7,
  125463. 0xac0d094c,0xda0e42de,0x787c187a,0x6c1be2c5,0x9cfa04b6,0x6d4ae2cc,
  125464. 0x76577340,0x5b0cea60,0xc7c96285,0x2d525245,0x000000d8 } },
  125465. /* 58 */
  125466. { { 0xae93de69,0x6dcb238c,0x3bfdae9b,0x4963c833,0xe8b79836,0x33c81f4d,
  125467. 0xae8bf8ae,0xe13a2244,0x4c3ebacc,0x0bc6e786,0x555a5ad6,0xa837a53c,
  125468. 0xbc7e9459,0x875d8d35,0xf9f46fcd,0xb3705534,0x0000001f },
  125469. { 0x7fb974a1,0x78e9270c,0xe9ed2481,0x23448fa0,0x64bffbd4,0x14166c3d,
  125470. 0xd79f4b3c,0xa05aa443,0x3b9f32a0,0xd855a4f1,0xac90235e,0x4bebcf8d,
  125471. 0x8db52b48,0x65849987,0xe48d09d1,0xaa4d59f1,0x00000183 } },
  125472. /* 59 */
  125473. { { 0xdbffad9f,0xee585d75,0xf419d8fc,0x64df6174,0xe6c69345,0x6f73bf59,
  125474. 0x83d59b0c,0xb80793d1,0x929c8950,0x6baf4fc3,0x29962bab,0xbd445a95,
  125475. 0xeaa91273,0x52b61945,0x3d1c785b,0x4fccdfff,0x000001be },
  125476. { 0x7cb2857f,0x05c384d9,0x06b7abf4,0x4cf83058,0x43ace6b2,0xf528dd17,
  125477. 0xbc43d6b6,0x2c7b8fa2,0x14e564b9,0x8f0e28bf,0xd2b9f01a,0x1b69bc73,
  125478. 0x3dd383e6,0xab8beb40,0x9791946b,0xaccea0c5,0x000000ae } },
  125479. /* 60 */
  125480. { { 0x0163c2de,0x9a68baee,0xeb2768a4,0xc42d0b2b,0xffdae767,0x5686f124,
  125481. 0x0aaca943,0x926da5d5,0xe01091cf,0x699c34ce,0x5324becd,0x3d254540,
  125482. 0x4193a0a9,0x1b6b58f1,0xd611cc9d,0xf144925e,0x0000014f },
  125483. { 0xc1ed9259,0x7f61a60c,0x2f1d5a7f,0x1be37aa3,0x07aef431,0x0384713d,
  125484. 0x4e6fa7ba,0x99f33d49,0x8bd3730c,0x43928c16,0x5b9557dc,0x73cf8ccf,
  125485. 0xd1a2bee5,0x0bc6d460,0x83b15610,0x27cd1943,0x00000145 } },
  125486. /* 61 */
  125487. { { 0x3427af4e,0x4be65135,0x310d937d,0x2e6c0bb1,0xcaa671c3,0xbd8ea76a,
  125488. 0xd3a9c376,0x9d7b3fd4,0x471709aa,0x124ce863,0x018051c0,0x225ce41d,
  125489. 0xf9e8ee1c,0x5489284f,0x535c4ec8,0x22d829c9,0x0000013d },
  125490. { 0xa1b15e02,0x6b01ed9d,0x301e5868,0x1d092bac,0x5764135b,0xbfa7a183,
  125491. 0x6f7159a4,0xc0ee59b7,0x18090d0d,0x9171a051,0xb8052196,0x5c1531bb,
  125492. 0x20927904,0x740930fc,0x76337685,0x963b48cc,0x00000008 } },
  125493. /* 62 */
  125494. { { 0xf4aaaed5,0x0fe8b620,0xfe871ee8,0x1068de7d,0xfebfcb4b,0x2b22030f,
  125495. 0xc3a2155b,0xd4dfbee7,0x2769b805,0xa7a26a8c,0x6d39eaf0,0x377de770,
  125496. 0xf615f032,0xf1a92447,0x42d9b731,0xa1b81a84,0x0000012a },
  125497. { 0xb1152e8f,0x299e67d0,0x92b5e14c,0x2e773d97,0xf1cb57a2,0xe0d81073,
  125498. 0xbf1da4a2,0x03af0a9c,0xc22b449a,0x169b160e,0xdd2d7d1d,0xb82c1ac8,
  125499. 0xbfc98ee4,0x7508aca6,0xe3cbea15,0x54992440,0x00000150 } },
  125500. /* 63 */
  125501. { { 0xa13a4602,0x70004a0a,0xd0d2c60e,0x505c71a3,0xa6d79bc5,0xa4fe2463,
  125502. 0xd54d9df4,0xe878eb3a,0x73d3c7b8,0x7ecca907,0x244ecfa5,0x5b3bb278,
  125503. 0xb124d179,0x8a30f61f,0x4f632af0,0x5b7e5001,0x00000115 },
  125504. { 0x9ef0021a,0x62c42ecc,0xf856c9d4,0x58017fd7,0x2e6478bc,0x10e243b8,
  125505. 0x1505a4db,0xaf074669,0x4cd7eea5,0xd9bb0a1c,0xd52aed0a,0xe8ba39a2,
  125506. 0xb549f09d,0x0747449a,0x9e57fa64,0xd5c8f7bd,0x0000013f } },
  125507. /* 64 */
  125508. { { 0x5a53c22b,0x1bd8ce7b,0x7cab446a,0x78733fcd,0x48acb394,0xc44ca4e2,
  125509. 0xa38c790f,0xa9888b1e,0x15c34237,0x36afb6eb,0xfb702063,0xb913b8a8,
  125510. 0x917508fa,0x34b77cc5,0xf9e4732b,0xa931d7a7,0x00000050 },
  125511. { 0x56d21d18,0xa90a4290,0x55b410a1,0x82666307,0x894a6b05,0xb4684a8b,
  125512. 0x828cf75c,0x8a1ade63,0x127702a3,0x4fb2f85a,0xadf7b709,0x83ff7d05,
  125513. 0xa68d1db6,0x1d3f5a92,0xc093cd5c,0x243ce1db,0x000000f5 } },
  125514. /* 65 */
  125515. { { 0xd37d7891,0x8fc183c3,0xfd865eca,0x17b50149,0x8f218441,0x0f6e43d6,
  125516. 0x5a07f658,0xaf51ec25,0xad303202,0x8fe5a6cb,0x10676ef5,0x95de68f3,
  125517. 0xca4e000c,0x7508e31f,0x77735254,0x783e5a95,0x00000159 },
  125518. { 0x2e537ad9,0xbc1db571,0x35be9cf7,0x5e87112d,0xd57f9bcb,0xbb522b48,
  125519. 0xa8b3cbc7,0x1eff7890,0xe5ecdb5c,0x4f306e11,0x3387e7ed,0x30da8392,
  125520. 0x72321e3d,0x4d91fcf4,0xe412a67c,0x8487bb62,0x0000009f } },
  125521. /* 66 */
  125522. { { 0x8cb8e08e,0x86f5f80f,0x2496fed6,0x7cfd2c41,0x60b7dcdf,0x0061b743,
  125523. 0x57f4d05f,0x4dbaffdf,0x458061f2,0xb1993c2a,0x9de994c4,0x6c6ca8d0,
  125524. 0x2747e062,0xef70d24d,0xb9995cbc,0xd4e5d4e3,0x000000ff },
  125525. { 0xc6f40077,0x3171e245,0x0723e506,0x1592e045,0x6a6bfd88,0x35c86f7e,
  125526. 0x6d9d9ce0,0xba0959d1,0x3eb5770c,0x2e7f8fe8,0xc40d63dd,0x58eb0881,
  125527. 0xeb9e4419,0x56333bda,0x3afd1f4d,0xfb0397df,0x00000034 } },
  125528. /* 67 */
  125529. { { 0xb358815c,0x7b84e05e,0xe41087d9,0x3abcb2d4,0x07f05d7a,0x87a75889,
  125530. 0x7a9d481c,0x350778d5,0x42d64cbd,0x9d34cff8,0xccf289fe,0x0859cd5a,
  125531. 0xdd2b2c6e,0x8372d591,0x18b40b62,0xc06d482e,0x0000006b },
  125532. { 0xda4ed375,0xd10695a0,0x298daaea,0x51baf588,0xf4b7092c,0xb028a1b4,
  125533. 0x7a335b35,0x8ab87dae,0x0567efd8,0xa7359362,0x3320c374,0x7a49fc10,
  125534. 0xa3558b30,0x737acac4,0x4c0fce9b,0xd30696a3,0x0000001e } },
  125535. /* 68 */
  125536. { { 0xbd3902fe,0xd9550ab0,0x86a9d3b3,0x9bba4b4b,0x975cac37,0x3a59e0a9,
  125537. 0x333605dc,0x045e8731,0x1afc2c58,0xf2c598c2,0xeef9cbf1,0x81ff8d6f,
  125538. 0x9bf83c42,0x82bed5d0,0x528131d5,0x9d1d9d5b,0x00000157 },
  125539. { 0x5519258e,0x687da305,0x027de2a8,0x73f539f9,0xd6a230d6,0x69fa9747,
  125540. 0x5f5d1684,0xab1aeb23,0x5f7e41f5,0x5bbfe947,0x16a7feb3,0xbd546abb,
  125541. 0xe16d5187,0x2afbd4e8,0xbcc953dd,0x7437be13,0x00000160 } },
  125542. /* 69 */
  125543. { { 0xee9755a3,0x55f165a9,0xb82c9ab1,0x0c8d5a1a,0xab6b97e6,0x65a1e45a,
  125544. 0xab05e271,0x3004cdb0,0x6db0830f,0x9e0c3b52,0x75acbdeb,0xaae1ec1a,
  125545. 0x761e8498,0x413d4484,0xb1b9c62e,0x589e09bb,0x000001e9 },
  125546. { 0x9c72258d,0x67512081,0x5c1593d4,0x61dcd734,0x91c11fdb,0x6c627a7b,
  125547. 0x8857908e,0xd1d3e9bf,0x530bc68e,0x9aac06fe,0x6b5b44ff,0x125c16bb,
  125548. 0xdb90edd5,0x38860bb6,0xfbbedb5c,0x96fe8b08,0x000001aa } },
  125549. /* 70 */
  125550. { { 0xf257c0f8,0x323a5dd8,0xdd3a10d9,0x4884dc92,0xbbb8ce03,0x03f379ce,
  125551. 0xa47262a9,0x6217ad53,0x52e06c6d,0xa1df2017,0xc32428cd,0xf5b723e0,
  125552. 0x2c30c62c,0x1e5d3889,0x477f82cc,0xd9a90f1f,0x000001fd },
  125553. { 0x1763ab59,0x830d27ba,0x723783e9,0xcf27d93e,0x945968aa,0x81558264,
  125554. 0x1700d5d5,0x63251a32,0x03146d9f,0xcf6bbe73,0xe65bf0f2,0x6cdcf455,
  125555. 0x632323fb,0x80aa00ce,0xd96a4744,0x6e49e62c,0x00000149 } },
  125556. /* 71 */
  125557. { { 0x40574c09,0xbeff0b7e,0x3fe80e96,0xb76f2643,0xeb237d91,0x0b3bd352,
  125558. 0x7edc3102,0x3c0c62b7,0x424a36dc,0xf989394b,0x7c6c435e,0xe9ea64c2,
  125559. 0xe388d076,0x2dfc21c4,0xa4e69e4b,0xcc3852f6,0x00000139 },
  125560. { 0xbb096b91,0x5238a3ff,0x73d8d43e,0xee72c9e5,0x8c577558,0xc116db11,
  125561. 0xdc47d4b4,0x54ec89d2,0x42e1955f,0x2006dd35,0x7437475c,0x004aed6a,
  125562. 0x2bee9041,0xc1ddc32a,0xed9332c9,0x597417a2,0x000001fb } },
  125563. /* 72 */
  125564. { { 0x859bae66,0x3c0f1981,0x845d7c1b,0xab48e9b1,0x452a3c1e,0xc6ce9c03,
  125565. 0xff810339,0x2384a00c,0x5f98d6fe,0xcd7ede11,0x38a0dd5b,0xf7a00e3d,
  125566. 0x3c7e1c06,0x56dd948a,0x8e53a61f,0x9d21a7d1,0x000000d0 },
  125567. { 0x880eb3fb,0xf9cfdbaf,0x5e83f7c9,0x64cfd297,0xa28a74b4,0x61ba7d6f,
  125568. 0xdfb13e03,0xb8200d5f,0x232a6128,0x03bc8f4b,0x81a8d86e,0xd1fb92c2,
  125569. 0x706d6ea7,0x68675fae,0xefab18c2,0x9b08608a,0x0000011d } },
  125570. /* 73 */
  125571. { { 0xbbd2f539,0x17cf6146,0x76e26ba2,0x96052fc0,0xd4be4a67,0x36821d18,
  125572. 0x9f3f39a8,0x8f823422,0x433f873a,0x68b846b9,0x716f4568,0x7a1d3f36,
  125573. 0x2fd47750,0xdf603e28,0x6975e226,0x77cb02c5,0x00000003 },
  125574. { 0x8c01dd59,0xf275add3,0xb9c1a37a,0x9c213a9e,0x4dfc5403,0x690ad104,
  125575. 0x07ee0d86,0x202ee206,0x661fc40e,0x896ede95,0xd0b02f56,0x6b4d7398,
  125576. 0xe5af1a24,0xccb96991,0xc13f7125,0xd5c281af,0x0000009f } },
  125577. /* 74 */
  125578. { { 0xd7073a5a,0xc858c54b,0x861eac7d,0x87c81a5c,0xe720201a,0x51f84a39,
  125579. 0x40e003ce,0x952a9f8e,0x58f199de,0x76bdc4ab,0xd56cc02b,0x1cf12322,
  125580. 0x83f162f3,0xb6634e63,0x8f969e11,0x84c017ee,0x00000169 },
  125581. { 0x5c89f1fa,0xf1f43362,0xb697b078,0x4a02a630,0x4b05b7f4,0x33311e5c,
  125582. 0x4fede4cc,0xa7ccae51,0x4b025aa4,0x0d26e874,0xf84db7ad,0x7d5b77bb,
  125583. 0xf571c1fe,0x39ef1aa8,0x418ccd20,0x65eba928,0x0000018d } },
  125584. /* 75 */
  125585. { { 0x8abb2537,0xa37866ab,0x65b3096f,0x14ac4cbb,0x2a428ad3,0x827fa7ed,
  125586. 0x10e9e196,0x95d19f62,0x89801b4e,0x31eb97a0,0xaae8b823,0xaae77a62,
  125587. 0x5f5c9642,0x9693d62a,0x3e368b84,0xff5bfe97,0x000000ad },
  125588. { 0x492b0dee,0xa3efae21,0x9602c2ce,0x2143e9ee,0x6f3b99e5,0x21367c99,
  125589. 0xe93b8f59,0xdd78b2b0,0x1064c13e,0x8d541c38,0xf5738e7a,0xe6b970da,
  125590. 0x8373b1a4,0xaf6ecc16,0x74ae208f,0xdbfa3f4f,0x00000180 } },
  125591. /* 76 */
  125592. { { 0x907a6aa0,0xb024621a,0x407879f6,0xef56cb68,0x8168a934,0x44c38b68,
  125593. 0x9b9a9048,0x70d638d3,0x82541f20,0x6968caa0,0x1fc88b50,0x0c597053,
  125594. 0xaf635784,0x5564ded5,0xc4d494cf,0xe7e898c7,0x00000097 },
  125595. { 0x6b6ebb2f,0xe1dc98d9,0x7aa9e126,0x292a17fc,0xfa2a2c68,0xb60f0fdb,
  125596. 0xb2e1851b,0x9c63270c,0x81ca4cfe,0x898db265,0xb11959d5,0x94082638,
  125597. 0xa54b8d19,0xe44f308e,0x44e63094,0x96399eb8,0x000000d6 } },
  125598. /* 77 */
  125599. { { 0xb83769ee,0xfa00f362,0x3efc4cb3,0x72d040ac,0x57abd687,0xc3933889,
  125600. 0x940a7128,0x62264425,0xec242a31,0x909c4c8f,0x65a1a551,0xd1e48f1e,
  125601. 0x049c2172,0x68bd70f1,0x709b7fd4,0xc8692d2b,0x00000041 },
  125602. { 0xdf816784,0x4e388aa1,0x01be75ce,0x4a58c8a5,0x02a67812,0x9b49dffb,
  125603. 0xeda721e0,0xa73299e0,0xe67a65ec,0x8a0bd1f5,0x856c71b6,0xd81e91e8,
  125604. 0xc005aa30,0x37aee2f4,0x0595bbf2,0xd9400750,0x00000073 } },
  125605. /* 78 */
  125606. { { 0x010c0ef3,0xa912ac4a,0x4e81b1a0,0x0e654bd8,0x4f353509,0x8f0563dc,
  125607. 0xb47d189a,0x10dc41f3,0xf238c09c,0x122edd06,0xc41acf67,0x224c16af,
  125608. 0x83758520,0x1ccb9334,0x2275ae6f,0x1a4b5f29,0x00000127 },
  125609. { 0x3ce688b5,0x792fd473,0xdca9c68b,0x14566d37,0x541711d0,0xfce9326e,
  125610. 0x3cc341a8,0xe3ba14ee,0x2122c11f,0x6b8ab4cc,0xf5d379b5,0xc0fa763b,
  125611. 0xf1522f91,0x95e2d2ae,0x31cf95a5,0xd4e21b3d,0x000000ac } },
  125612. /* 79 */
  125613. { { 0x1d8e061a,0x4013a779,0xacc84a30,0x62707e70,0xeb2f636a,0x6ac08266,
  125614. 0x77b25c9d,0xe917ea21,0x70ff35cf,0xddb78bbd,0x041898be,0x5008db2b,
  125615. 0xce0ae445,0x0f58a4fc,0x2257d0e7,0xed092397,0x00000043 },
  125616. { 0xe2e129e6,0x2cad77b3,0x0f1be4d7,0xfb8c4a87,0x20056333,0xaee50dff,
  125617. 0x2a691543,0xbc2658c1,0xb8fe2640,0x95dc0cca,0x1965a0af,0x694eb584,
  125618. 0xedd1d99e,0x7d3baa53,0x8a1edc87,0x2df13b20,0x00000083 } },
  125619. /* 80 */
  125620. { { 0xd181c3f2,0xfead2247,0xf337b23f,0x915d35be,0x74890672,0xdb4cfcba,
  125621. 0xfda7a3a1,0xe4f70d8f,0x79275686,0x226b6419,0x6ff1f79e,0xe8040863,
  125622. 0xcf5fa4e8,0x98e84b39,0xd8a09f60,0x57aa0be9,0x000000da },
  125623. { 0x4efcea66,0xd40cecf5,0xafc76fae,0x98df2aec,0xc91585a8,0x63f19a48,
  125624. 0x13f00aa5,0xb111bda7,0x44b5cb9f,0x6687afab,0x652620d1,0xc6d5fb12,
  125625. 0xbacb35ab,0xaf953f1b,0xff94c4d2,0x99709370,0x000000ed } },
  125626. /* 81 */
  125627. { { 0x68b54c89,0xac9f56e0,0xce737c22,0x08ecc17d,0xab089b53,0x208ee83f,
  125628. 0x543fbd1b,0xb0f3a129,0x844dd706,0x1b204cf8,0xdec2e40d,0x80975c89,
  125629. 0x9399914a,0x08b011ae,0x74674df7,0x6b4ba170,0x00000017 },
  125630. { 0x8fdfc175,0x71216ea9,0x7e0f5b0c,0x77b7fc63,0xceb33a34,0x88d0285f,
  125631. 0x0223eab7,0xb679814f,0x51c6d922,0x9078720b,0x9c13f51d,0x5859d5a4,
  125632. 0xfaed60b5,0xe69f850b,0x6d0ccab2,0x2499a844,0x0000005c } },
  125633. /* 82 */
  125634. { { 0x73e7bcf1,0x41d581fb,0xdd3c17be,0x16dde61c,0xfa199fd9,0xc62997ec,
  125635. 0xc159db97,0x1a758873,0x64132830,0x4ed77896,0x2942a918,0x9672ce89,
  125636. 0x816ba4bb,0xf3ee4587,0xce54dd7f,0x4fb7a148,0x00000123 },
  125637. { 0xf009be8c,0xf05d80af,0x78df1ba1,0x62e938d7,0x312de620,0xa7e22e84,
  125638. 0x6070c4b9,0x48d29e7f,0xa1b5da37,0x5cd9c3eb,0xa4717453,0x1e51bd2f,
  125639. 0x56ab9e67,0x94098ab0,0x49f7c6a1,0xbb584abc,0x00000049 } },
  125640. /* 83 */
  125641. { { 0x1ea470f7,0xa9f25530,0xe9254e30,0xa01bf808,0x71a0038d,0x098569ea,
  125642. 0x5913ca87,0x0d2b2ee1,0xb8281fdb,0xae17004b,0x118e5c2a,0xdb5c6eb0,
  125643. 0x1fa943ab,0xa56ac64c,0x1a92d501,0x1aaf6477,0x00000053 },
  125644. { 0x06345730,0x9679ef49,0x846f37c2,0x946aaa4e,0x1a7c3aab,0xf81726b0,
  125645. 0x8166df4e,0xcb808da2,0x4e04dc3e,0xe9fb3fc2,0x76ec19b4,0x9e0b61db,
  125646. 0xeed6d13e,0x6e7f665e,0x86a75384,0x70ed8c07,0x000000e5 } },
  125647. /* 84 */
  125648. { { 0x108ce13f,0x66456e58,0x0e397813,0xb5bfc58d,0xea3949e9,0x04b6a84b,
  125649. 0x75af667d,0xea9b66bc,0xa891566b,0x7cb4d6dc,0xbf61595a,0x1b3cecf0,
  125650. 0x002e2520,0x4312c73d,0x6135a5fa,0x81d76898,0x0000014b },
  125651. { 0x841078ec,0x4047bc25,0x179c454d,0x75aa9c96,0x4851f8fc,0x6a160609,
  125652. 0xce34091f,0x998d4e3e,0x88e54102,0x9a9f6704,0x5da8ac5e,0xbf280f88,
  125653. 0x8fec230c,0xc64caca0,0x5094b775,0x0ac864b0,0x0000002b } },
  125654. /* 85 */
  125655. { { 0x8f5daf7f,0x6b606e39,0x10927506,0x48385489,0x08c58a72,0xa2255c5c,
  125656. 0xc90f3ee3,0x2f362fd0,0x08795f02,0xc9633af4,0x0425f5aa,0x71710bd1,
  125657. 0xec06dbfb,0xc2017e05,0xc1b8bbcd,0xd9c7dc82,0x000001c8 },
  125658. { 0x18b8bed9,0x7db41fdf,0xe3a23125,0xe9483308,0x7291c4bb,0xbcf91de7,
  125659. 0x41448aaf,0x9b0b972b,0xc44da462,0x95dfc633,0x01bf50a2,0x90b9c463,
  125660. 0x869e3131,0x18b66f77,0x121baad9,0xa8a4e2fa,0x000000f5 } },
  125661. /* 86 */
  125662. { { 0xca0251ea,0x8ca55109,0x27a6c9b0,0xf2aeed8b,0x5620f528,0x901a8beb,
  125663. 0xae13fc56,0x9a8421e8,0x85993c07,0x1349f1c4,0x0d1ab0d7,0x29e08359,
  125664. 0xaeb5d909,0x96e2929b,0xf599a66f,0x96c2f1f8,0x000000ce },
  125665. { 0x12be8bd7,0xe4bc4b51,0x3c67e99b,0xf4846a0f,0x4d3a3864,0xd89cc7d3,
  125666. 0x73f43981,0x1f647112,0x26dce567,0xc32bc324,0xf02b096b,0xf7134ebf,
  125667. 0x0d0682b7,0x5604f00b,0xe3ce8b59,0xfd23d7ea,0x0000011c } },
  125668. /* 87 */
  125669. { { 0xa27689a6,0xf89646cc,0x5564172b,0xd6a7dc43,0xb57cbfcc,0x30bda48e,
  125670. 0x5b1adfe5,0x9b11fffb,0x711d8bf4,0x9f2d80db,0xb70e5a5b,0xe879fdf0,
  125671. 0x6bd18a1d,0x97534183,0x8cbfd504,0xc8c526bd,0x00000114 },
  125672. { 0xef7388bd,0xd5fe725b,0xe7ffaea7,0xf1c3dbdf,0x7e6de2ac,0x78395b89,
  125673. 0x9ebf1bfb,0x81a72c9a,0x69785146,0x65265707,0xf52670af,0x3925ecd9,
  125674. 0x83d57d48,0x437bcdd2,0xc80ecb02,0xb5d732a7,0x000001ce } },
  125675. /* 88 */
  125676. { { 0xcfd376d7,0xa7f9fcce,0xa66b084d,0x6b4eab3e,0xd5b91bd8,0x6ac90d08,
  125677. 0x8aa304d8,0xaa3d5b7e,0x7f866a4f,0x27f3d42b,0xbb813ae1,0x95d19fa8,
  125678. 0xe34a9206,0xd38798d7,0xa32c1cdd,0xdf7c0a69,0x00000073 },
  125679. { 0x38315b16,0xbe2c01bb,0x9e18c8f9,0x1daa7c89,0x08b6b853,0xa3d43fb4,
  125680. 0x68092a81,0xb159e48c,0x836faad4,0x77e93d9e,0xa4699730,0xd4ed6361,
  125681. 0x6297e476,0x569cb3f6,0xe7811fa6,0xb69d8183,0x00000185 } },
  125682. /* 89 */
  125683. { { 0xab9cb764,0x18f27eb3,0x8ebc1d6d,0xbbbefc21,0x0479aa79,0x47760ddb,
  125684. 0x09e542f5,0xb4d16d24,0xbc699b96,0xe35c38d1,0x8c8d8c8a,0x13b2ae25,
  125685. 0x67a3a45d,0x8579c152,0x6c554c04,0x773b7357,0x000000d9 },
  125686. { 0x0218c299,0x9620a473,0x99f78a33,0x69be29b3,0x484f414f,0x4684a009,
  125687. 0x9a2ca4d4,0xb2c74937,0x68db7ab3,0x09c0773e,0x935c357f,0x6181f059,
  125688. 0x8b7de3f2,0x0931303d,0xe0fb6e08,0xf3effcd0,0x00000060 } },
  125689. /* 90 */
  125690. { { 0xb25d6530,0x723c14be,0x9a97d40f,0x5e015b39,0xfbf7f622,0x209c3c4b,
  125691. 0x14b4f0f1,0x83d8c59c,0x3f7e8ecf,0xcf002fde,0x1eb1ef0f,0x35d353c9,
  125692. 0x201f0c60,0x394c42a5,0x7be8ee34,0x787128ab,0x000001b5 },
  125693. { 0xb70110cd,0xa0937d3a,0x477911b5,0xe0fa4efc,0xc53a4c19,0xc6acaf5b,
  125694. 0x38d509f2,0xbd3010f3,0xe54ac1c6,0x3ee2a82b,0xe4f2a3bf,0x31ea67c3,
  125695. 0xf089c7b9,0x7a4ca66e,0x34a2362f,0x5bda2c4f,0x000000b0 } },
  125696. /* 91 */
  125697. { { 0xd1f575cd,0xb424a071,0xa5237182,0x15693b01,0x9a2c9d40,0x14133602,
  125698. 0x9c914a60,0x50c4348b,0x095b31c1,0x9024573d,0x22fd4962,0x6f975fd2,
  125699. 0xe210b277,0xa1704886,0x6dba937b,0xac29b813,0x000001f6 },
  125700. { 0x775da491,0x09edef55,0x2b6aad82,0x25953f9e,0x1bb40d5b,0x6696a106,
  125701. 0x4d5127d8,0xcfc45311,0x81ead062,0x2f21dca9,0xaf3b7123,0x3f3e4f07,
  125702. 0x9646f20d,0x12cd06b8,0x6910f5bb,0x24136369,0x0000015e } },
  125703. /* 92 */
  125704. { { 0x3ecfc44e,0x0c844fd0,0x5043b3d5,0x4095f2c8,0xc9bd059a,0x9a5fe7db,
  125705. 0xf65becdf,0x239328fa,0xa67961cd,0xe3102471,0xbbb5dfdd,0xea9e39bf,
  125706. 0x133dc5ba,0x8022b6d0,0x5f12c379,0xbed7aa9b,0x00000141 },
  125707. { 0xfd94d941,0x096f0059,0x7d4ff018,0xfc6e9f00,0x779f05e3,0xe63af598,
  125708. 0x00483c99,0x4c40f0b3,0x72a19870,0x04d2feef,0x464a4a71,0xdb773b5b,
  125709. 0x49367f1e,0x00b6770f,0x2a9fbd2a,0x4f7e0301,0x00000169 } },
  125710. /* 93 */
  125711. { { 0x8a9095fd,0x0df5dd73,0xd3ce857a,0xc4b7a021,0xe5edc767,0x90aa796b,
  125712. 0x180a0808,0x56497eff,0x66f10aab,0xb9856e1f,0x39879766,0x31298824,
  125713. 0x3ba80601,0x61748cf7,0x555da929,0x07d9076c,0x00000012 },
  125714. { 0x1c44394d,0x0b049a01,0x0ce49e45,0xf5f25ef7,0xb1694265,0x1e3a09f0,
  125715. 0x109b33f8,0x2c5bd9fe,0xa30932e4,0x07f2a43f,0xc6cf8af2,0x736abfca,
  125716. 0xf3366722,0xadf7fa04,0xfa9d26b0,0x2f1e92fb,0x000000e0 } },
  125717. /* 94 */
  125718. { { 0x63be4d4a,0x9524e4a6,0x66f3cc91,0x1fa57bed,0x7e7a7ccd,0xdd7c93fa,
  125719. 0x88c5d1d3,0x70e8cf6a,0x3f251f1e,0xb257997a,0xe3554cf5,0x0a5ec58e,
  125720. 0x065a7109,0x68d268d7,0x085089ea,0x7c23d4d2,0x0000004c },
  125721. { 0xbd52d132,0x63ae575b,0x38c81cc5,0x0fb8daa7,0xe4e63b99,0x096a6e51,
  125722. 0xb239d387,0x51d6b366,0xa5d49fed,0xed5f8874,0x43a8c07a,0x025091d9,
  125723. 0xe4686ae2,0x100f845a,0x7eb4ef5a,0x1af59d74,0x000001c2 } },
  125724. /* 95 */
  125725. { { 0xdd441308,0x5f7bc01e,0x86308890,0x0dc34944,0x759611cd,0x2af38a74,
  125726. 0x4c23ce66,0x11a71261,0xf8bafed2,0x37f317b5,0x4c93e079,0x4efbb9ff,
  125727. 0x8ecc52cf,0x880f0edd,0xddc9d82a,0x480cdd2c,0x00000028 },
  125728. { 0xc3f807ac,0xe8f1ca0d,0xbd070549,0x6a3e4fc2,0x91f8bb6c,0xad3d0a14,
  125729. 0x3d6dfacd,0xe3ee1cfd,0x5fb46ffb,0xee46b1b9,0x7dd5cfbc,0x5207b3ac,
  125730. 0xb1b8e8b7,0xd580c0d9,0xc7bdd11a,0x52c669f4,0x00000084 } },
  125731. /* 96 */
  125732. { { 0xc0ace6d5,0xa42b4747,0xbe7287ad,0xd5acb64b,0x89bc2614,0xf3304899,
  125733. 0xff05c71e,0x817fe836,0xd35ac450,0x772eb246,0x375a9c3c,0x7f5fc216,
  125734. 0xcbc0d6fd,0xfb6f9e1a,0x720e9733,0x7643c315,0x0000009a },
  125735. { 0xf3845ccf,0x4b2216b4,0x90bc05bd,0x9c174e80,0xd6049037,0x7a550c74,
  125736. 0x6358c806,0xbd7220a1,0xaa677b6d,0x838f9c41,0x66e2e08e,0x37332c19,
  125737. 0x496f6da5,0xb032875e,0x9c30630d,0x52b274cf,0x0000000c } },
  125738. /* 97 */
  125739. { { 0x8ea58beb,0x6ec2e782,0x3665fa48,0x2b404c1d,0x20b40ff0,0x546d5fad,
  125740. 0x29d3e6a5,0xfb5df7b6,0x66c81991,0xf186846d,0x6e2cfe3e,0xbe690bde,
  125741. 0x1410d16b,0x97aeb9a0,0xbacc8e92,0x59d81548,0x000000cb },
  125742. { 0xbaf66a23,0xd905d3ad,0x40dfb081,0xc3337387,0x4b00f432,0x6d5535de,
  125743. 0x07d3a03e,0xe17fe8e8,0x066bca80,0x29544ff7,0xbadffa55,0x60c2b96c,
  125744. 0x45a26ea4,0x9f018d94,0x24a34ffc,0xd5438167,0x0000011e } },
  125745. /* 98 */
  125746. { { 0xbd7f8a61,0x62a873fb,0xbbe580bb,0x5e18cd71,0x667f6980,0xfd5c9eb3,
  125747. 0x571d3dc0,0xab8d4f61,0x783f9bc8,0xe2e45215,0x24398b14,0x36c3774b,
  125748. 0x74d811b5,0x2db4a363,0x2debe3c3,0x9f7f1297,0x00000138 },
  125749. { 0x798fefb2,0xbb97f21c,0x107baa72,0x9c76fcb5,0xfadbb568,0x12fbf760,
  125750. 0xd33ea6c5,0x1a648be7,0x236134a5,0x412a2993,0x8985893b,0x4a3d8169,
  125751. 0x3e66ada4,0x6144958f,0x7687b457,0xb4dfc79b,0x00000140 } },
  125752. /* 99 */
  125753. { { 0x7abe5bb9,0x83b14570,0xe51d81be,0xae0cbfd8,0xc9827aff,0x20dadf49,
  125754. 0xa687b554,0xc3a72548,0xeeb41733,0x080263fb,0xd3827c63,0x7014fdc3,
  125755. 0xb5e3b70e,0x7d018f84,0xfbcf7168,0x1d483e00,0x00000015 },
  125756. { 0x6b578aa3,0x154e3c7c,0xd3043dae,0x511ce9b5,0xb6008101,0x55f89e9b,
  125757. 0xf405ac6f,0x4ec31112,0x2008ac7b,0x7e66a4d8,0x25c52fa6,0x73c00d39,
  125758. 0x8acac2eb,0xee1b9998,0x60b57453,0xdfa31d95,0x0000008f } },
  125759. /* 100 */
  125760. { { 0x251cf8d8,0xcc74a0e0,0x041f2bd2,0xd4d8949d,0x33ebce52,0x0b734a49,
  125761. 0x5c5bcdae,0xe1ac5f51,0x16200b93,0xd3ecdfcc,0xa793736e,0x2506a266,
  125762. 0xea6e6940,0x585a1c8b,0x9190f935,0x081cdd53,0x0000000e },
  125763. { 0x53e28412,0x055f9956,0xdb27164b,0x0d1526f2,0x1df3adc7,0xcd5625eb,
  125764. 0xdd35dedd,0xd2c453ca,0xa838ffe2,0xed442849,0x5c0ce589,0xad20c137,
  125765. 0xbd99b609,0x2d5fba81,0x622efb07,0x5be41dcc,0x000001ad } },
  125766. /* 101 */
  125767. { { 0x8f850756,0x563af667,0x52f3b597,0x86d37aae,0x796842f5,0x10d38a53,
  125768. 0xf743f997,0xcdaaf99f,0x93f1a8ba,0x2fa755e5,0x409f7cd9,0x1af04e15,
  125769. 0xd6d0650b,0x63bf9a0a,0x55abfd9a,0x67b1cead,0x0000000e },
  125770. { 0xb5f43178,0x3660a8e0,0x9cc35b33,0x56bd412d,0x880f6808,0x3d7bfa63,
  125771. 0x2e622c71,0x7f372d66,0x6ff82445,0xad7b7be7,0x8db04e51,0x0f2bde80,
  125772. 0x4bd15c8d,0xe1e781fe,0xb8e502f2,0x1f475bfb,0x00000194 } },
  125773. /* 102 */
  125774. { { 0xd63543ec,0x79482bf9,0xa117ef3e,0x985cb67c,0x160ccc63,0x8ac50638,
  125775. 0x729bdc1e,0x556cbed5,0xa22686df,0xd62ed97d,0xc81eb77c,0xb124cb5f,
  125776. 0x72fa2ed9,0x4d7b4f66,0x78335b96,0x60b29aa7,0x00000172 },
  125777. { 0xa43df7c6,0x21bfc7b6,0xbc20706c,0x85acac23,0x345d9580,0xeb6f37bc,
  125778. 0xa32a08bc,0x9d8f20d2,0xd1953c5e,0xf08924f6,0xc4f680d0,0x7d25d7c6,
  125779. 0x2de9912c,0x64e6a237,0x52ce644c,0xda1c06c4,0x000000eb } },
  125780. /* 103 */
  125781. { { 0x411dd110,0x26677c5c,0x2c991c4a,0x0d6787aa,0xa45666d6,0x53be6a41,
  125782. 0xc15f9f15,0x73e716aa,0x0e0cc7b2,0xa93b863f,0x2a624ab0,0xa4057117,
  125783. 0x1a39c260,0xe5e7656e,0x2ef6f130,0xaf8d78b5,0x00000046 },
  125784. { 0x70f38dff,0x796214b1,0x123a1105,0x3e35d828,0x957ed812,0x046a44d4,
  125785. 0x0da60161,0x618fa9ba,0x54f84413,0xe7cdd2a5,0x19ea95ab,0xf1c2563e,
  125786. 0xcb2a30b4,0xc4459e14,0x61ff9aa9,0xc748add6,0x00000183 } },
  125787. /* 104 */
  125788. { { 0x9de58caf,0x32981f39,0x8753ea64,0x05bb80fd,0x2d119486,0xc83f9f24,
  125789. 0x03eeb00a,0xf490cf06,0x7c73d79c,0x4037f251,0x724d461b,0x844209fd,
  125790. 0x272420cf,0x6b03f6d2,0xb3438fa2,0x6f4bd29e,0x00000152 },
  125791. { 0xc389e51c,0x964d034a,0x6db7d98e,0xacda55e9,0xe913c583,0xb2ae97de,
  125792. 0xfeb03440,0x0793077b,0x9d461e29,0xaa16e378,0x043bf8be,0xb0a67533,
  125793. 0xba7d8c3f,0x9d749a42,0x6bb925dc,0x7c41e6d6,0x000000ec } },
  125794. /* 105 */
  125795. { { 0xc5da8398,0x2e9b345d,0xbb38c430,0xbc66841f,0x7c3bb47a,0xce3ac562,
  125796. 0x738d2cdd,0x8fbeb12b,0x68731185,0xd4bc2ad7,0xbbd4f4f4,0x9521db1c,
  125797. 0xfe4e1b0e,0x2a690cae,0x7bfebe3e,0x375215eb,0x00000194 },
  125798. { 0x2edfd661,0x4cb234f1,0xed52c1f4,0x0149984e,0xd8f8f98c,0x32d27260,
  125799. 0x7be38590,0xfe76e4e4,0x95e8b672,0x5435873d,0xf2b00e82,0x916c397f,
  125800. 0xbad61eb8,0x3b9bf705,0xae131bbe,0x7ee90182,0x00000000 } },
  125801. /* 106 */
  125802. { { 0x93fbcb5c,0xd36fea9e,0x9fa8529b,0x382be583,0xfd611ba0,0x0b243125,
  125803. 0xcd8a2637,0xa59ae37f,0x3d8d4704,0xab78c60e,0x44c41b79,0x1bac243d,
  125804. 0xeda49cc5,0xc4001fea,0x83dc7e9f,0x988ea44a,0x000000f6 },
  125805. { 0xf077f79e,0x4d90caa4,0xd9e2590d,0xf4d17601,0xd21b4b77,0x11debbb3,
  125806. 0x9037e1b6,0x031b3f60,0x135becf0,0xf113ed82,0xf2903dda,0xf6c01379,
  125807. 0xa6f19296,0x36bde7ca,0x9dbbad85,0x57d3b684,0x0000006c } },
  125808. /* 107 */
  125809. { { 0x9abfccb0,0x963fee38,0xb9676e63,0x6c6e2a24,0x84ba6d27,0xf8768f02,
  125810. 0x465853d1,0xc38ba3ba,0x1b8ab9b6,0x6e3ab36d,0x47a07331,0x01fc9742,
  125811. 0x25233f32,0xfdd41718,0xac61de7a,0x4dacfa81,0x00000021 },
  125812. { 0xeaa3198c,0x365a9f37,0xfc8b99d5,0xcbe8a345,0xd4f5ecbc,0xa427f12a,
  125813. 0x0c237514,0xe841ff60,0x28a27b05,0x5d9e8c5a,0x62859ff3,0x2d377444,
  125814. 0xea8bde37,0x1c0460ff,0x29cf5bf8,0x0a0e49a1,0x00000181 } },
  125815. /* 108 */
  125816. { { 0x45843c3e,0x688203af,0xaabebae7,0x4601e303,0x624df62b,0x397b08f3,
  125817. 0xd21e5aa8,0x5687348a,0x9a242b0e,0x2cf12c73,0x32a76c6d,0xc848ed01,
  125818. 0xf52751a2,0xb72aa1c2,0x92c02d05,0xb63296c3,0x000000f3 },
  125819. { 0xc6f3d1f0,0xce4b42ad,0x2f532b94,0x2f0dcc53,0x83443d9c,0x57813335,
  125820. 0xdc8dd9cb,0xb50118ee,0xee87192f,0x3039e1a5,0x557419c2,0x9977267d,
  125821. 0x30f96b0c,0x462efa4c,0x3cd3c35a,0x454fb796,0x000001f7 } },
  125822. /* 109 */
  125823. { { 0x9d153926,0x10f28194,0x82b57548,0x42e28c91,0x509e94c9,0x4b423b30,
  125824. 0xde9d6b57,0xc5acc52a,0x8b3ca314,0xaa746c39,0xc63d5bc5,0x0f4ea307,
  125825. 0xe1ccc989,0x425553a2,0xf76d9194,0x271198bf,0x0000008e },
  125826. { 0x3c8e672b,0xc7900e46,0x3f2dfc27,0x703675cd,0xaf2163c9,0x704951f7,
  125827. 0x7aceaab0,0x74d69908,0x7e8d2369,0x482f21a9,0x813dc115,0xdcfbc1dc,
  125828. 0x04f6cd13,0x0ce2bc80,0x82bfaff2,0x2a54662c,0x0000003f } },
  125829. /* 110 */
  125830. { { 0x1588a8bc,0x0dcf41e6,0x210c52cb,0x6f48cd0e,0x758e7a45,0x338562bd,
  125831. 0x48b9b957,0x1600d54b,0xa6b89b9e,0x461df80b,0x098cc82f,0xf7fd4f17,
  125832. 0x14977147,0x167f01cd,0x6116c5f9,0xb1338511,0x00000048 },
  125833. { 0x5d2617f0,0xdeb76333,0x6ecb8606,0x3f9a5772,0x1b91fce9,0xa93c032d,
  125834. 0x6c84b997,0xf7a4388b,0x823ca5be,0xbfe80225,0x35a32f6b,0x6f19c028,
  125835. 0xe3cb5c58,0xf26cd5ad,0x6d0c1dd9,0x7f5ddc77,0x000001e7 } },
  125836. /* 111 */
  125837. { { 0x6ee764c9,0x3c9feec8,0xb07c82cc,0xd1bec836,0xa005b142,0x6bf1b2e6,
  125838. 0x29e8a5ea,0x70ef51a3,0x3ffe241c,0x517d298e,0x72966c28,0xbb389e28,
  125839. 0x2c7acc76,0x3a2da8a9,0x732a21b5,0x902c9126,0x0000004a },
  125840. { 0x8f7ce110,0x96c51b9c,0xaeb036f1,0xdcc33a87,0x0a6a59e2,0x82695098,
  125841. 0xe78db500,0xceaf26a7,0xc95bb030,0x82f3c384,0x24c42f42,0x6dd6e9f7,
  125842. 0x70ac4a0a,0x768dde29,0x03d22efc,0x4aedce4b,0x0000016f } },
  125843. /* 112 */
  125844. { { 0xeded03c0,0x077f032a,0x588ddd4d,0x2684a052,0x9a85be0f,0x6d09bc4f,
  125845. 0xe0b9b6bb,0xbdda0c7f,0xf2fb5887,0x19689c7e,0xec3cce7e,0xf8a96960,
  125846. 0x768d2ae5,0xb043d9d5,0xdb21219a,0x29c8081b,0x00000068 },
  125847. { 0xde59f006,0x6bf872fa,0xcb97ef5a,0xc2b9ffc6,0x58ae7ef8,0x371915db,
  125848. 0xf4ccaa1f,0xc2e23ca1,0x89c27cc4,0x1af8c60e,0xc86bdcc6,0xeee5d7e7,
  125849. 0x9bd8de43,0x9225b47f,0x4b24f08b,0x53e7f463,0x000000b4 } },
  125850. /* 113 */
  125851. { { 0xe3048bda,0x54c496d0,0x43c3de4e,0xe2b67499,0x4c2d509e,0xac2049f7,
  125852. 0x543c5089,0xb01f691e,0x105a365b,0xcd9960a3,0x78b17049,0x34d93ffe,
  125853. 0xf82c9467,0x029f99b3,0x0161a755,0x785c5ea2,0x00000091 },
  125854. { 0x953dbdb6,0xb455f978,0x97eca19f,0xea9e84d9,0x36d4d75a,0x473bd029,
  125855. 0xc15276fa,0xa9c17ca8,0x47c76356,0x9cf66133,0x039738d2,0x4a68360b,
  125856. 0x69733609,0xd3e430a8,0xe2b27f21,0x0ae532de,0x000001b4 } },
  125857. /* 114 */
  125858. { { 0x5164cb8b,0x68110e82,0x2552a67d,0x6979af4f,0x8d185527,0xe10d6d0e,
  125859. 0xfb64eac4,0xcf6c5787,0xac424592,0x8408163b,0xfce0d810,0x5d8fff37,
  125860. 0xda84c15c,0x8b284e49,0x32663ec9,0xed805567,0x00000010 },
  125861. { 0x51f3ee9e,0x106f4030,0xb38adf1e,0x2e8e3ee9,0xa13d6449,0xd3c87a6e,
  125862. 0x80e1abb1,0x27b49f45,0x0bfd7298,0xc283d179,0xafc7a35f,0x8fe50fa5,
  125863. 0xade3ad4f,0x773da545,0xd9a21df2,0x78bfaae4,0x000001f8 } },
  125864. /* 115 */
  125865. { { 0xabad5678,0xae60d8e8,0xe600c25b,0x0afa72ce,0x4c288e21,0xb9d4e0b4,
  125866. 0xd254cf9f,0x64447f76,0x959e2ba5,0x1fb36bc4,0x2961132c,0x393c44d7,
  125867. 0xfc140f19,0xd7a8881f,0x8d096648,0x27a86128,0x00000091 },
  125868. { 0x8a9e690c,0xb536c021,0xeab4fa15,0x85dcc521,0xb00ee54c,0x09af4423,
  125869. 0xaf3a8e48,0xb3793525,0xb7731d85,0xe1f36308,0x141cfb55,0xb5361d78,
  125870. 0xeffc4529,0xea41f29e,0x9f7d2634,0xcf5755b1,0x000000e8 } },
  125871. /* 116 */
  125872. { { 0xd212b398,0x01edb80d,0xd53dd373,0xd0396181,0x8a52fa95,0x0e086047,
  125873. 0xa7825e6d,0xad1e6432,0x330ece4f,0xe0185bc5,0xb078936f,0x508f7313,
  125874. 0x9e7f6ea3,0x1dc982fd,0xd5556b60,0xdbf3a602,0x000000e8 },
  125875. { 0x279e05bc,0xc3763234,0xf44453d3,0x7f5f40ec,0x7fa30793,0x310c5f4d,
  125876. 0x108d7e22,0x5cffad36,0xc2a98bbc,0xf2f01ef3,0xd7d47f80,0x30ab1719,
  125877. 0xa9b22e1c,0x7bc9f918,0xe834df94,0xf53dc52a,0x000001f9 } },
  125878. /* 117 */
  125879. { { 0xc183f89b,0xf266b49e,0x5f5806d4,0xd3fb5f02,0x94ec3080,0xd30a42b5,
  125880. 0x371cd917,0x4b6b1940,0xb7f7e26d,0xf7541aab,0x2d5b7b64,0xe55269eb,
  125881. 0x7f8036c5,0x0e1a85c1,0xda5f2675,0xa0ff0f22,0x000001ce },
  125882. { 0x3a8e11f8,0x602bd56a,0xf5f9ab54,0x29864021,0x0ccc92d7,0xc6742c5a,
  125883. 0x523f650b,0xd64569e6,0xf7fabfb4,0xc8e4681b,0xc3c9e6cb,0xb4275947,
  125884. 0x38f5ff20,0x2b3952d5,0x1f04aea2,0x818f8e38,0x000001b0 } },
  125885. /* 118 */
  125886. { { 0xe50d90f0,0x3be5bffa,0xf5011cdc,0x4cb3b11b,0xa691dfac,0xe10ca711,
  125887. 0x4ea1a773,0x62ec211d,0xe586eeb6,0x5a979ebb,0xa0c2f1fd,0x4df16ab1,
  125888. 0xc57bbfea,0xfe9e3f7e,0x5ae526f6,0x1b05960e,0x0000015e },
  125889. { 0x8630e62e,0x1c8e04a5,0x6447e1b7,0x3d00310e,0x43b4447a,0xcf1e6b61,
  125890. 0x7462e7a3,0x92abb851,0x0002724d,0x8309ea08,0xe45296df,0x1d805d70,
  125891. 0x3d4ed812,0x0f3849b3,0x6834d44e,0x2d6bffbc,0x00000096 } },
  125892. /* 119 */
  125893. { { 0x48e07711,0xd13fe58d,0xd270a3b2,0x70f83648,0x8cdff04c,0x1517892d,
  125894. 0x51411f14,0x15bb6578,0x3e4f8a55,0x6c31cd90,0x0413362f,0x73f87152,
  125895. 0xeca06d4d,0x2fe025ee,0x954e317f,0x32a6e417,0x000000ad },
  125896. { 0x69d147df,0x7e38c63f,0x710bf37b,0xb69bb06e,0x28d514de,0xb94debef,
  125897. 0x8d11c3d9,0x4b2307fb,0x0385c604,0x3b369df9,0xe7800e83,0x68ea2f49,
  125898. 0x7d501c1c,0xf028b258,0x5cef7818,0x97078221,0x00000055 } },
  125899. /* 120 */
  125900. { { 0x54c1d751,0x10c351db,0xba0f9512,0x81445301,0xbfdc8bed,0xa77eb34f,
  125901. 0xcf23680a,0x498d8138,0xe04f2860,0x928c14a4,0x16a5b6da,0x96192dba,
  125902. 0x5f9a9103,0x49dea95b,0x01724102,0x80dd4578,0x00000085 },
  125903. { 0x0e09221c,0xe9072500,0xf21de056,0x62e05b21,0xe0e60950,0x448cafa1,
  125904. 0x6f775129,0x657fb97b,0xf1f34aca,0x5d2991bd,0x49ff15d6,0xa66cd5ac,
  125905. 0xd049ec79,0xdc1d6897,0xe72baea8,0x388fca84,0x00000067 } },
  125906. /* 121 */
  125907. { { 0xa6ef1dd3,0x6520b49d,0x3ba6cd76,0x391a045e,0xf33d5f48,0x9c84980a,
  125908. 0xef07474a,0xe53cf5b2,0x78bfb1ea,0xa35b2e9a,0xeda906fa,0xeca97fd6,
  125909. 0x1b9f2cf4,0xf1a93789,0x3ab28589,0x66753369,0x0000010d },
  125910. { 0x73691faf,0x5b510496,0xd57ec618,0xdc73d3a9,0x930a8525,0x7e2921bb,
  125911. 0x40b05b69,0x094f571e,0x413bedca,0x5e96a017,0x8d1a6b98,0x9e7d4f72,
  125912. 0x3eade8b7,0x55143fda,0xd16e454d,0x859b8444,0x000000fb } },
  125913. /* 122 */
  125914. { { 0x7c667aaf,0x7c22083e,0x4a91ccba,0x33545cb9,0x8ca0e94a,0xca1e9931,
  125915. 0xe4eaa0c7,0xc3afff23,0x42f56844,0xa21ac436,0x60d52d0b,0xfcc68a8b,
  125916. 0x6a9301d4,0x401a585b,0x907abce1,0x547f762c,0x000000a3 },
  125917. { 0xfbe260ce,0x63dd3ed3,0x80dc01fa,0x2717752d,0x6f1da3e4,0xd5fab75d,
  125918. 0x5261f10e,0x5f16864a,0xd20cd6bb,0xbe7b1f63,0x221ac656,0x9d638c10,
  125919. 0x673b918e,0x3137b8f6,0x4ada2fb8,0x23eb4438,0x00000174 } },
  125920. /* 123 */
  125921. { { 0x2a1fbcf4,0x194e27c4,0x5facd5ee,0x4c0d285b,0x915e6607,0x75c2ebdd,
  125922. 0xef0a6a9a,0x1e696510,0x067cf458,0x13c5afa1,0x7bee1fba,0x2be013c1,
  125923. 0xdad279e7,0x85a406d6,0x5142cf59,0x0042951d,0x00000031 },
  125924. { 0xa22bbc45,0x6a735ec1,0x7f56f4d8,0x4ee5391a,0x236001de,0x305af9d0,
  125925. 0xaa2f8d25,0xa8b21851,0x187db78a,0x0e2c36d8,0xa1a888c3,0xcfcc083f,
  125926. 0xbd3e7d5b,0xb91dab7f,0xf4fdd023,0x62d85460,0x000000f4 } },
  125927. /* 124 */
  125928. { { 0x4972d703,0xf568ba02,0x39098a03,0xfc44ca1d,0xae28c855,0xe9b8e542,
  125929. 0x5b1b4536,0x4fd4f360,0x4c7f7e48,0x2e08b07b,0x2230823d,0x042f3b98,
  125930. 0x1889fd13,0xc9ffd313,0xc6c68359,0x56af0652,0x000001bb },
  125931. { 0x06e0f16a,0xedbf05e2,0xd74644a5,0xfc1ac2fa,0x0f92c71a,0xe59a0a98,
  125932. 0x36c800a1,0x13ae37d7,0x236178dc,0x5f20efc6,0x2b46ef10,0x443a58b8,
  125933. 0x442509e4,0xc9517dcf,0x640ed9b0,0x7d0bb415,0x00000166 } },
  125934. /* 125 */
  125935. { { 0x3d22842d,0x3aa30a61,0xb3c4ece0,0x8c6e00f5,0x6df82b79,0x8764cf87,
  125936. 0x78d208c5,0xda92d86d,0xe788854a,0x0a52d391,0xa59b0994,0x499b26fb,
  125937. 0x04c5fc9a,0x5dc133ad,0x34e3f134,0xa5c09269,0x000001dd },
  125938. { 0xfad6d673,0x6f0dcac2,0x00f3b3fe,0x6d8fdf05,0x631756e9,0xece71941,
  125939. 0x0a4d80e3,0x3990f493,0x31d13001,0xf2aca936,0x75581638,0xee91966c,
  125940. 0xe6dd5679,0x6df0f574,0xccd71cda,0xbe124868,0x00000111 } },
  125941. /* 126 */
  125942. { { 0x475cc1b4,0xf644c726,0x2b73978c,0x915fc2f9,0x0e3d7eb7,0x65a7e6d1,
  125943. 0xf40c38e0,0xbb44e21a,0xe1ad24fc,0x988662b9,0xc35606e5,0x270ba4dd,
  125944. 0x1a4f93f7,0xc3834a2c,0x3362a4d7,0x93d0c9a2,0x00000021 },
  125945. { 0xf769fd7f,0xe2cb7b8c,0x89a213b9,0x1815da97,0x6b910fef,0x7b4f8c56,
  125946. 0x26931438,0x2088b309,0x925b37c0,0x477b71bd,0x26a640e5,0xa049a921,
  125947. 0xfd21c6ef,0xd3ddf1bd,0x232a56b2,0x9b5f9d7d,0x00000064 } },
  125948. /* 127 */
  125949. { { 0x679a9c35,0xd640adf8,0xcb74d796,0xcdad98e3,0x5f8e9daf,0x464b8ebb,
  125950. 0xad4a073c,0x4738614e,0x2edde557,0xbd86c0ee,0x576ce0b9,0x77331738,
  125951. 0x4095fb96,0x9b5d3327,0xee09aead,0x72f0aeb3,0x00000136 },
  125952. { 0x64e54ba5,0xa388c76d,0xdc474d21,0x63fe7af1,0xb2a77081,0x7fa3e9d1,
  125953. 0xde1240ad,0x0447b49e,0xc720303a,0xd9f64b66,0xe6bd0213,0xb1c78029,
  125954. 0x0aa03ea5,0x1caf1c70,0x3bb85d2b,0x179180eb,0x00000103 } },
  125955. /* 128 */
  125956. { { 0xaf2ed12f,0xadbf4f9f,0xf380fd8a,0xce1d19e4,0xa39e81ae,0x0957bdb5,
  125957. 0x626ef6bc,0xf9833321,0x0cf5b28d,0x110ae5ea,0x20392cd4,0xab159450,
  125958. 0x6bc67855,0x67c49887,0xa3fd61c6,0xce7e5938,0x0000004a },
  125959. { 0x28c7dea9,0x59c5b9ef,0x0a6a7184,0xd02f95ba,0x8202769c,0x034dc257,
  125960. 0x94dd6896,0x213b0b08,0xb5dea95a,0x03730b7f,0x617ca889,0xfe243ed0,
  125961. 0xfb1ba052,0x16cf4d17,0x226f96da,0xd8691d6b,0x000001c0 } },
  125962. /* 129 */
  125963. { { 0xbf8015c2,0xaa2edf3f,0xc49502d8,0xe7f8236d,0xa6a43157,0xe890f6e0,
  125964. 0xa2d04b0c,0x318ef325,0xa809dbab,0x9cc0668d,0xda67ca21,0xdd26937a,
  125965. 0x83febc49,0x8f27c12c,0x3c9b9844,0x87b3db2f,0x00000029 },
  125966. { 0xfd2e3dc7,0x37e7aed0,0x7415fd55,0x498e8bdb,0x58a45f25,0xfc0d6c9a,
  125967. 0x209c85d0,0x83d5baba,0xd579e1ee,0x31ec8dc6,0xa502bfed,0x1f4cad0b,
  125968. 0x1f41bef1,0xc432e6ce,0xbbffca65,0x3b10afaa,0x00000191 } },
  125969. /* 130 */
  125970. { { 0x53053af7,0xbd9f7df0,0xb28a1cf4,0x60304765,0x7ce90438,0x441778fc,
  125971. 0xac8c5ddd,0x8fbed36e,0xfb59ec61,0x27b1313b,0xa1b1becf,0x9d2656ff,
  125972. 0x945973a9,0x334e1345,0xc362b595,0x3261888c,0x0000018c },
  125973. { 0xaa7f6ff8,0xf413a414,0x3fab7c7a,0x092aeb88,0x7cc307ba,0xfa1d886b,
  125974. 0x2346100e,0xdc81c125,0x02140c93,0x93d4d273,0xe6104835,0xa1ed7e3c,
  125975. 0xdf1795f3,0xe2b91ecf,0x369ed416,0x160dc11a,0x00000191 } },
  125976. /* 131 */
  125977. { { 0x8b57d7cc,0x9a72f46e,0x4bf02386,0x3140b0e5,0x05b3a91d,0x886c396e,
  125978. 0xa4ec26e0,0x1b9ab3a9,0xc50f58e9,0x742feaeb,0x55e26af0,0x1592c608,
  125979. 0xbb1cd9f7,0x943cd476,0xc7f02c89,0x3ed97fd4,0x0000017c },
  125980. { 0xe6d54964,0x53b02503,0xc6a318c0,0xd9bd1162,0x9cc28c22,0x18ff6cf4,
  125981. 0x03534640,0xa45c7840,0xb4cc0668,0x8ea3335e,0xf42dbe03,0x7ad727f8,
  125982. 0xfdf6c3cd,0xb157e911,0xec992d76,0xa7f894c9,0x000001b3 } },
  125983. /* 132 */
  125984. { { 0xaf09ea77,0x91e6e397,0x75dc25c5,0x26a760b9,0xb94a197b,0x8c040c08,
  125985. 0xb68ce619,0x041baca8,0x5bd23564,0xa19a0d15,0xd977b33f,0x86ca5b94,
  125986. 0xe5fbd029,0xf31f87f8,0xb1901f99,0xf76c55a6,0x000000b8 },
  125987. { 0x3846ec9f,0x175bf8c3,0x9deaca46,0xf462205c,0xa3108df0,0x92cb5ec0,
  125988. 0xcfaed928,0x879db283,0x65049fb2,0x477dc004,0x96ee5031,0x48d24bac,
  125989. 0x56adce45,0xa7db6b16,0xab1c684f,0x0110cdab,0x000000fc } },
  125990. /* 133 */
  125991. { { 0x4d308bf2,0x151b66d8,0xd6638004,0x99013c9f,0xfd383bf9,0x6892df92,
  125992. 0x3ffc8efc,0xa10efd84,0x313ea287,0x527e316c,0x3a0df740,0x8ef6e3cd,
  125993. 0xf6ebd2a1,0xcb96e430,0xa70ee4ce,0xc1ebecf2,0x0000018c },
  125994. { 0x1a70404c,0x80d14ad7,0xf9ce2a30,0x6ad21dd0,0x3aa3e072,0xb94cbcde,
  125995. 0x6363a690,0x0ab59611,0xc6b1e2b4,0xe70bff45,0x66ceec5b,0x1296dd0b,
  125996. 0x747757c0,0xd4cb2a74,0x3d7d91e8,0x08988ca6,0x000000aa } },
  125997. /* 134 */
  125998. { { 0xf8db0396,0xaa2dcfca,0xb422da76,0xe8ae8f37,0x96485724,0x652f8349,
  125999. 0x7bf1493f,0xf647c3c4,0xb0247a4e,0x8b600b46,0x7aebda8e,0xabf3e439,
  126000. 0xa7958df0,0x2e1d231f,0xf881bab2,0x38e692b1,0x000000ef },
  126001. { 0x26cf3047,0x1f3c1689,0x59539858,0xdad14f94,0x293f20b6,0xfde85d1c,
  126002. 0xf57abb17,0x2ea5436e,0x1794de38,0x0d1a8ffc,0x2bfecd2f,0x9ba508e2,
  126003. 0xdb786042,0x110f0a7f,0x7cde31f8,0x2ade6f64,0x00000196 } },
  126004. /* 135 */
  126005. { { 0xfec78898,0xc996a537,0xde0fa77f,0x0b39de72,0xd34cb08f,0xf6d076ac,
  126006. 0xda78d353,0xacd8bb82,0xa0392cc1,0x5fe804d3,0xe581549d,0xab7adede,
  126007. 0xc067c6d9,0x883901a0,0x4ed93f37,0x5855ffa2,0x00000191 },
  126008. { 0xbf9ebef3,0x29570e36,0xdf4b3177,0xe21046a5,0xa6816b5c,0xf9b89a95,
  126009. 0x288d0e11,0xadf39281,0x3979159a,0xd6baabe5,0x5c8fabb2,0x411afee0,
  126010. 0xe5c7af10,0xf192c3af,0xd7dce37b,0xaa72e81c,0x000000f7 } },
  126011. /* 136 */
  126012. { { 0x16c386ee,0x20fa3c0f,0xd4c09839,0xb33b0469,0x876a3136,0x79e0d722,
  126013. 0x3c406c06,0x343c0a92,0x4debe27d,0xef220e3e,0x196f00ea,0x09d7b1e1,
  126014. 0x24a9dcff,0x4a0f5dd8,0x99c1d085,0x53582ec5,0x000001e2 },
  126015. { 0x5138c7ed,0xcc8ef262,0x6547f88d,0xdec43194,0xdd0a9488,0x2b6e53ad,
  126016. 0x8257ebdc,0xeb9f1efa,0x1f08c989,0xc583c6eb,0x40163768,0xf1736911,
  126017. 0xdbc20e3d,0x6282ff8b,0x9cbd514e,0x26b81005,0x000000d5 } },
  126018. /* 137 */
  126019. { { 0xa0025949,0x2449522f,0x0bbd8945,0xb26d888f,0xe637216f,0x33442f5f,
  126020. 0x472827f6,0xd8ec3b64,0x99fc2681,0x91d8a1a3,0x68c7710d,0x6d232ead,
  126021. 0xe51b2762,0x8e5bfe2f,0xfd109fa7,0x0f9f4fed,0x00000004 },
  126022. { 0x6b4a05e0,0x1952ea51,0xf21c78eb,0xcb0d48ee,0x1997dfdb,0x64d36619,
  126023. 0x8b4c21fd,0x0d11b204,0xbe92303a,0xa6f569b6,0x78c5e809,0x2b8f6096,
  126024. 0x36805d8e,0x7226b5ab,0xdb349ca2,0xd6cff180,0x000001bd } },
  126025. /* 138 */
  126026. { { 0x943cc612,0xa49f8576,0x832b31c7,0xc914319e,0xcccadebd,0x9225e297,
  126027. 0xb0619821,0x4918fb42,0x25b1cc7c,0xaccb3084,0xa646e5f0,0x751d3347,
  126028. 0x590e3e22,0xeafb4aae,0x2c4a0008,0x82146038,0x00000151 },
  126029. { 0xbf96a461,0x3c2481db,0xb52a3ba4,0x51c122e9,0x464db08b,0x21c2858e,
  126030. 0x6d6a081d,0xb1014b78,0xf533cef7,0x167d3ed4,0x81545f7c,0x6cfb3294,
  126031. 0x449b7b9f,0xea46d31c,0x9621c299,0xcfad7613,0x00000081 } },
  126032. /* 139 */
  126033. { { 0x478a7f0e,0xef796327,0xde17705d,0x914183e2,0x572117e8,0xd24a26df,
  126034. 0xb7cd52cf,0x3cdb1b09,0xad83c160,0x9e42b9fb,0x709ef8c9,0x6971d2ea,
  126035. 0x8ee54ccd,0x1894fc5b,0x34a520fc,0xf757b4e5,0x000000fc },
  126036. { 0x86b62347,0x5a5518cc,0x7bc2a928,0xec51c9d2,0x2966727f,0x2eea2b05,
  126037. 0x0ae43e6f,0xbc8a8e3a,0x05ca066b,0x80535b5e,0x8833986d,0x91ffcdb1,
  126038. 0x32374cdd,0x2f4a5bba,0x0d202243,0x08763a49,0x00000124 } },
  126039. /* 140 */
  126040. { { 0x4efac14d,0xe498b972,0xa79a9d3c,0xb6f4bf8d,0xd6e07c29,0x0f1e8dbd,
  126041. 0x71771538,0xfac30cfd,0x71b03263,0x4c91ed22,0x19b455f5,0xbf938335,
  126042. 0x127092bf,0x76a5e789,0xb4813bd9,0xa97674e1,0x00000128 },
  126043. { 0x583e5924,0x29b63c41,0x8f171d06,0x61f9aff1,0xab227a28,0x2b45b3cd,
  126044. 0x8a11ab70,0x939d5dda,0xe8db6971,0x2bfb47b0,0x0ec10805,0x562379df,
  126045. 0x24ce1801,0xaf5a6481,0x34f94aba,0x8d98c434,0x00000150 } },
  126046. /* 141 */
  126047. { { 0xcfffc80f,0xdea9fe73,0xd43473f6,0xe23e2e9b,0xc9d37ba7,0x27fb3ed3,
  126048. 0x7a3fc357,0x733766d2,0x8e04a03d,0xd0db4cf3,0x2bbe0f43,0x8ce01752,
  126049. 0xda986f4f,0xd87eb719,0x2fe6b037,0x6d1b50ae,0x00000153 },
  126050. { 0xda40bab1,0x371f5def,0x9b2bda63,0x07d6a8af,0x0d4aca87,0x5e8a5c89,
  126051. 0x643ff8ab,0x4d72f0ff,0x4bf8ec2f,0x9c4c10d9,0x0eb93e22,0x36b0eaba,
  126052. 0x1d2dfd01,0xbc4b0e8f,0x9d34a082,0x9f252e5a,0x00000142 } },
  126053. /* 142 */
  126054. { { 0x7d0e7020,0x4affd4c1,0xb5482168,0x9b169aaa,0x588f348f,0xdbe01708,
  126055. 0x885986bb,0xdaebf6ff,0x15f9c381,0xb33987f5,0x04a94a7b,0x7e455f2c,
  126056. 0xa0ed6849,0x39a41442,0x1ef7798c,0x1c1ad4a6,0x00000154 },
  126057. { 0x072709c4,0x7647b628,0x8810e5fe,0xb330d68b,0xe92e0f63,0xd1bd8874,
  126058. 0xf8bea9ba,0x144e4fb9,0x8318981a,0xc15afc18,0xb68c6a07,0xe19c5c82,
  126059. 0x36e00b66,0x858c57a2,0x07cb7aec,0x9b255110,0x00000011 } },
  126060. /* 143 */
  126061. { { 0xc887027d,0x121ced27,0x2bfab286,0x6050f335,0x19d511e2,0x6e373c1c,
  126062. 0x7f4c69f5,0x02d4c3a9,0x25226bb4,0xe6f356af,0x83e7ac30,0x3b9011c3,
  126063. 0x33d8fdfb,0x43b0c23d,0xaf2ea363,0xa8c390f7,0x0000000b },
  126064. { 0x7e851bac,0xc430c3d6,0xa5f544fc,0x8991c389,0x67fba061,0x006bbc64,
  126065. 0x97cbdbf4,0xd49d024e,0x7734adad,0x4539b7dd,0x28cb6d2a,0x90ba8f9f,
  126066. 0x4de4b3ad,0x7a921830,0xa7b96928,0xb28732ef,0x0000006a } },
  126067. /* 144 */
  126068. { { 0x22ed5986,0x71dab52d,0x58533e06,0xdeee627a,0xcf155fe3,0xe8fee37a,
  126069. 0x7ae8b132,0xcd61490d,0x34a08b94,0x2706e185,0xf9c15c30,0xa85ffd52,
  126070. 0x51a5ad46,0xd5a224f3,0x54d700bb,0x44d1b6d5,0x000001e6 },
  126071. { 0x862e4e9c,0x96830686,0x48763fe4,0xfe5cd76c,0xc0839caa,0x60309679,
  126072. 0x8d83d62d,0xc0e4cbeb,0x11bc4ae2,0x911e254e,0x64fca062,0x96a0d7c8,
  126073. 0xe9a27045,0xf5785dd5,0xf3e0412c,0x2f4677d0,0x000001be } },
  126074. /* 145 */
  126075. { { 0xab01a6dc,0x4c0012dd,0xae1adb69,0x391bd6c1,0xb9b05079,0x3ae7daec,
  126076. 0x62a1061f,0xc2714f9e,0xa96536b7,0x71978ee7,0x5e17654b,0xeec11bd0,
  126077. 0xefab3dd4,0xc71166e0,0x87edbf61,0x0f7aa572,0x000001d7 },
  126078. { 0x51eb5932,0x26ea6f7d,0x5f882ca4,0x354ea0aa,0x7739f7dc,0x175b6097,
  126079. 0x9be57934,0xd335192a,0x78545ecc,0x9801f423,0x7b643c9d,0x32b8e256,
  126080. 0x23e3abec,0xb9411dd7,0xcf1c6509,0x656dea68,0x000000ee } },
  126081. /* 146 */
  126082. { { 0xa0890deb,0x4d38e140,0xbceb84bd,0xbf7bd87d,0xba041dec,0x51f0ff72,
  126083. 0xa6820be9,0xafeec70a,0x8c486298,0x755190a3,0xe7010ec4,0xecdba558,
  126084. 0x8c7879b1,0xced91db8,0xef5e215c,0x08de3e4c,0x0000014c },
  126085. { 0x16266da2,0x9c1534ed,0x7b4c9009,0x9ce322eb,0x69927688,0x37decaef,
  126086. 0x05c2844d,0x6525097f,0x1ac519ab,0xd23b7e13,0x65a3cc86,0x682ebb72,
  126087. 0x628c4575,0x0c531db9,0x73805373,0x2e00e8b8,0x000000be } },
  126088. /* 147 */
  126089. { { 0x57ed32e9,0x3807c800,0x7c024997,0x427e40cf,0xabb54830,0x58506abb,
  126090. 0xce820bf4,0x5649776f,0xb2c43e81,0xb5353293,0xcfef6648,0x671e8353,
  126091. 0x903bdca5,0x27217d3f,0xa813fd79,0x40a9c109,0x000001dc },
  126092. { 0x3db21a38,0x6beaa6c3,0xd73ef7e4,0xcae222e1,0xbd1d507f,0x1ff684e7,
  126093. 0x587a77ab,0xf5bac664,0x0c64a4d6,0x58c74f62,0x6a7c378a,0x4ca837d9,
  126094. 0x3e42e409,0xf43df531,0xfb49e14f,0x8a9a4347,0x0000013f } },
  126095. /* 148 */
  126096. { { 0x992f8923,0x85ab4edf,0x6fd209f3,0xe24aa5e0,0x1b1340ee,0x27be9b87,
  126097. 0x91e0bb40,0x2957d11f,0xf3d4c62c,0x425afad2,0xc7ff7aaf,0x2d231286,
  126098. 0x0114cbe9,0x96412b2b,0xc3e23529,0x6706a231,0x0000019f },
  126099. { 0x225c02af,0x06b3bbd2,0x3fa3e98d,0x53ebc166,0xb84f482e,0xa6df2b75,
  126100. 0x2bfc55df,0x912b4521,0x512a73da,0x30bdbd40,0x3d53eaa4,0xac0f43d9,
  126101. 0x0c27fd53,0xfc358fe4,0x919424b4,0x2cb183be,0x000000a3 } },
  126102. /* 149 */
  126103. { { 0x3fa6a746,0xe39b0c2d,0x1d5a24a8,0xe84a7922,0x78cdf2b5,0x70a58914,
  126104. 0x30666cb3,0x8a88067d,0xf6d71d06,0xb09a709e,0x0065d184,0x50007a3e,
  126105. 0xb8dc9448,0x7046af4b,0xc65493ac,0x2b6a3129,0x000001fd },
  126106. { 0xe45f2771,0xd3d5d5bd,0xf432ed95,0x8542b08a,0xf232a6bb,0x2ecd40fb,
  126107. 0xe8beccb2,0x0fcb6143,0xbf8e247f,0xcecc513a,0x8da3039b,0x955d56f7,
  126108. 0x56c2a0df,0x9157c619,0x3031fe2a,0xa6d35cbf,0x0000018c } },
  126109. /* 150 */
  126110. { { 0xbe0c4923,0xdd800b1b,0x6902907b,0x046ae740,0x957bd0c7,0x2398b37f,
  126111. 0x9655f8b8,0xaa8e1a9d,0x500f4150,0xcd2927fa,0x202e7aee,0x826a9c6d,
  126112. 0x9f29692e,0xb4cf58b3,0xbf41577c,0x3093868c,0x0000011f },
  126113. { 0x333ed442,0xadcb5e7a,0x906fef7b,0xae5c8e2f,0x3d98f228,0x2d9b0123,
  126114. 0x7ffe125c,0x4632f2da,0xba231835,0x59487731,0x12d2c512,0xa0caae5b,
  126115. 0x9857d9c4,0xbf00e658,0x54f200f6,0xc5d10086,0x00000172 } },
  126116. /* 151 */
  126117. { { 0x2fc283e0,0x58954046,0x7ee0880e,0xf7633984,0xb7fd1622,0xfaf1b40e,
  126118. 0xf598c5ed,0xecf5151e,0x7e00d9bb,0x6b4d92f7,0xa8c43fd4,0x7543e3b3,
  126119. 0x6511d1d2,0x3994e12c,0xaf05b6d3,0xdd841a1d,0x000000c6 },
  126120. { 0x23b991ad,0x23da17e0,0x71fba514,0xaab2b213,0x0ddc1879,0xb417ec5a,
  126121. 0x5f63acdc,0x173bc8ad,0x1e2a7d50,0x2fcf5210,0x6106d008,0x63373fd0,
  126122. 0x7db012cf,0x1e8211de,0x576545ef,0xa07766d9,0x0000018c } },
  126123. /* 152 */
  126124. { { 0xaf80dfaf,0x8e4347b9,0x9c4667f3,0xa80b631f,0x6ddbc238,0x6ff1db26,
  126125. 0xaa8718a0,0x6161e365,0xaf31c35f,0xe7f7ac90,0xfc6846e8,0xc03831d1,
  126126. 0x684175b4,0x1e669d10,0x934b731a,0x6da9d620,0x000000c7 },
  126127. { 0xa3e4e78b,0x981f597b,0x55099f9a,0x2c14dedc,0x93088c61,0xbf373995,
  126128. 0x9b207458,0x7c568307,0xa2276900,0xc4440c47,0xf7e6daf3,0xb6df23c8,
  126129. 0x42929103,0x4f662c25,0x8b3b7963,0xf4ea6db1,0x000000f9 } },
  126130. /* 153 */
  126131. { { 0xced36049,0xc669eb88,0xf41b99f8,0x87a4ffe1,0x6a72e108,0x690b7563,
  126132. 0x65a0bb8a,0x67dd6a8c,0x96e42955,0x42cf8c58,0x1aabffad,0x5286b5f3,
  126133. 0x8f6f26a4,0x1f7dfaf2,0x0e1ae503,0xc5d9e0ac,0x00000120 },
  126134. { 0xacc10da7,0xafbee3ff,0x944946e5,0x67e2d5f9,0x3c4220ff,0x8ec17e86,
  126135. 0xbd6f632e,0xfe6f7414,0xc3fc9ef4,0x4a9e3c0f,0x03bfb870,0x25ff3cba,
  126136. 0xbb03342d,0x18fd3600,0x0050cd2e,0x1e63e753,0x000001ac } },
  126137. /* 154 */
  126138. { { 0x8f3d6a02,0xdd83d07c,0x7ef4d0d1,0x71fc143c,0xd4c7af61,0xca994bf0,
  126139. 0x827c5cf0,0xc8a93e98,0x2b697882,0x4a102c7b,0x8a55e8ba,0x633c87d5,
  126140. 0xcc2d64f0,0x1ae8822f,0x986d01fc,0x2ce9b53f,0x000001c1 },
  126141. { 0x95dc1b79,0x859639fd,0x3f4e616a,0x2728f754,0xede2fb9f,0x6e703c4c,
  126142. 0xd50fae9e,0x042f7680,0xc2d530ed,0x0546bc3b,0xcdd598ac,0x00a4006b,
  126143. 0xe1294910,0x3f3286c9,0xb6bf9629,0x77782255,0x00000146 } },
  126144. /* 155 */
  126145. { { 0xe30c98fe,0xaf81421e,0xfc2cd705,0xdeb0feb0,0x14df6ad2,0x9b2c4ca6,
  126146. 0x9ba314e8,0xd38134de,0x4f04b16d,0xa443deb8,0xf07f8ca8,0xfc556ee0,
  126147. 0x3a4f3917,0x3c1c83bb,0xb1adcd41,0x8397dd24,0x00000199 },
  126148. { 0xdf4781e6,0xca01e17e,0x46f1f901,0x32d7c319,0xb53090da,0xa227a613,
  126149. 0xa7c8c607,0x2495b1dc,0xddc69709,0x1cf2fbee,0x45608098,0x1d3d82bb,
  126150. 0x085134d7,0xcfcddda3,0x96798c41,0x3dd171b5,0x000000d2 } },
  126151. /* 156 */
  126152. { { 0xd4dd7e96,0x97a40f84,0x8409fc0c,0x7114c8ea,0xa9d11393,0xc56f29e6,
  126153. 0x8fd8c6d6,0x3b606621,0x00269e7c,0xad3baa86,0x05929d5f,0x1413c6b0,
  126154. 0x222e365b,0xc1ad7e40,0x4798aaec,0x6a82621a,0x000001d3 },
  126155. { 0xc1003c81,0xaeac45c4,0xf43d8602,0x9ef9ef5a,0x60f77469,0x36a65f5e,
  126156. 0xbf5d2858,0xf312e7ab,0xc84acef1,0x2f53ec81,0x9d248b52,0x63e32ca2,
  126157. 0x81e65c60,0xfe9aa7c5,0x52841973,0xe3686c9a,0x00000017 } },
  126158. /* 157 */
  126159. { { 0x9e90de99,0x0b2efe65,0xad05ab63,0xbe4485bc,0xe14e4892,0xc48a6a52,
  126160. 0x22628687,0x2ad85430,0x5eb3db54,0x261f0e95,0xd45e5841,0x48e81863,
  126161. 0x8ed75739,0xcfe1ce0f,0x7d84ade4,0xbd6f1ff5,0x0000003f },
  126162. { 0xd1bf968c,0xd43711dd,0x48dfa472,0xd558d7cd,0xe425a566,0x49f09223,
  126163. 0x5c26d041,0x0cf83338,0x7c2c1743,0xbe7b81f1,0x5143d9d9,0xe3bdc33e,
  126164. 0x94fd3fae,0xf385ac35,0x9fd1811a,0x7551cf42,0x00000113 } },
  126165. /* 158 */
  126166. { { 0x20193bb2,0x4928f55b,0x7310b872,0x96e579d0,0xd345d276,0x5ee06309,
  126167. 0xa871868a,0x9a43e432,0x11038683,0x28c113e1,0xa332f108,0x8286ecf3,
  126168. 0x0385cbb4,0x3348aa37,0xef158daf,0x698ffcaa,0x000000c6 },
  126169. { 0xf6908745,0xa044c54a,0x6a3353fb,0xa6b336e4,0xd561e821,0x694c2852,
  126170. 0x3634917f,0x1b297970,0x81f61315,0x6e1023b9,0xef46a5ef,0x6817dc2b,
  126171. 0x8e114f7f,0x93dea0af,0xed72c5bf,0xc3cf3cd5,0x00000136 } },
  126172. /* 159 */
  126173. { { 0x7b080de4,0xbb8799ab,0xd69d8396,0x3b8f781d,0x986f8f63,0x76b42aaa,
  126174. 0xa54bc5ca,0x5d74c038,0xa9c2fbb9,0x76fcb605,0x80178930,0x8451b440,
  126175. 0x9d286f0d,0x40f00c38,0x0c543263,0x3038e952,0x0000014c },
  126176. { 0x6977aad9,0xc94bc381,0xd7087be3,0xadbfd082,0x875fed08,0x06d0820c,
  126177. 0x345656fc,0xe1ce84d4,0x0fd6dd4e,0x71c4d8e0,0x6a5fab40,0x23338b22,
  126178. 0x0baeeb6f,0xd477eac1,0x5f80c26c,0xe4db08bb,0x00000078 } },
  126179. /* 160 */
  126180. { { 0x1078342a,0x0111d12a,0x559a1064,0x0534725e,0x0fd3ffdd,0xea459d59,
  126181. 0x06f0ac1f,0xcf694a9f,0x3e19bc69,0xf6d24adb,0xb9ddcd00,0x3ce38f5e,
  126182. 0xb632dd4e,0x38400f66,0xe15e1c55,0xcab8fdfb,0x00000085 },
  126183. { 0x8d09422f,0x0a943f6b,0x0f988c3b,0x17d29756,0x2ef2e4d9,0x55a441fa,
  126184. 0x35f7c13f,0x6743523b,0xedaad3ff,0x274d3407,0x9347242d,0x59411435,
  126185. 0x3bb8615d,0x1cb27301,0xbd7794cd,0xa0437004,0x0000007d } },
  126186. /* 161 */
  126187. { { 0x2d712c44,0x824b99a6,0xa6962577,0x148368f8,0xd65e2287,0x8ed68432,
  126188. 0x6f5bc5f8,0x14028306,0x4ec3479d,0xe6cf3121,0x9326db70,0x96db6f44,
  126189. 0xca32936b,0xca5ac098,0x2fea21af,0x69e248c7,0x0000004d },
  126190. { 0xa71269fb,0x0aa89092,0x18650b60,0x2f6bdba8,0x9fb55db2,0x1d9cc2a3,
  126191. 0x6311e9d0,0x0fceb0df,0x90ac2c1d,0x6faeb79c,0xcb1f372a,0x2393b222,
  126192. 0xbc8c4193,0x62a6f3df,0x2fe8e674,0x9dea30b2,0x00000001 } },
  126193. /* 162 */
  126194. { { 0x12b3118b,0x7df689ac,0x6cb6ea56,0xd06ee39d,0x187cd978,0xcfcc22c2,
  126195. 0x8d537d87,0xb985b681,0xe9f56db2,0x75845152,0x5e098c15,0x0f839871,
  126196. 0x3b212cd2,0xbe96a5c8,0xd9ac1c47,0x3dda0338,0x000001fb },
  126197. { 0xcfa0a9b8,0xf06b7fe0,0xe22dcf75,0x9478bac7,0x136887c8,0xf3815e04,
  126198. 0x914c54bc,0xed811dde,0x0f51ea64,0xc8c24160,0x4c870577,0x63914d83,
  126199. 0xa8abbcb4,0xed24e552,0x2644f52e,0x9e5eb9e8,0x00000001 } },
  126200. /* 163 */
  126201. { { 0x66d52313,0x1f65a04e,0x4d3f72bd,0xfd694545,0xa6b7ae11,0x2bc0ddaf,
  126202. 0x571ab247,0x921f79d8,0xae5a8d68,0xd4c5f966,0xaec5ce13,0xfde17716,
  126203. 0xb764bd39,0x70e6eda4,0x990d6783,0xffe94085,0x000001ef },
  126204. { 0xd88f92e8,0xf3fa0e27,0x9c77123c,0xa21ef0fd,0x89274dba,0x6259974c,
  126205. 0xb9ba2762,0xd4cfa4a5,0x46ebcaf6,0x10c909d2,0x8f8e2870,0x0317a10d,
  126206. 0x453aeea2,0xb0771de1,0x68c6b0a3,0xdf0c4791,0x000000ea } },
  126207. /* 164 */
  126208. { { 0x4c854477,0x11bc1e48,0x8638e47c,0x2bec25b4,0x869c54d9,0x43d4e02b,
  126209. 0xbe1e7ed2,0xe318de32,0x6b460c4a,0xf5471eb0,0xaa426afe,0x38ae7bf3,
  126210. 0xd8452dc1,0x23ae26dd,0x5782de9d,0x9d3fc1d5,0x00000164 },
  126211. { 0x0ade1979,0xd87cae31,0x3b4bc728,0xa847041d,0x56c3c9be,0x38923c40,
  126212. 0xd74ae467,0x36fe182a,0xecbe49ae,0x92bff6f4,0xdc41f9f5,0x6680db80,
  126213. 0xe4630715,0x35bac06f,0xd6d07307,0x6d68b4c7,0x000000c0 } },
  126214. /* 165 */
  126215. { { 0x854dfcf2,0xdbe22be7,0xa6ae3bd0,0xee21a7df,0xa521ec46,0xf4633ad1,
  126216. 0x41a9484c,0xee94527a,0x2aa123f3,0x1145eb9b,0xcae3ca92,0x5634a82a,
  126217. 0xfc85d925,0xe176aca0,0x19082d8c,0x504cf7fc,0x00000078 },
  126218. { 0x3799793c,0xd74ce7c4,0xb5519fb5,0x74ddd618,0x95ff9808,0x2cf6df93,
  126219. 0xb8bf61e6,0x00ea45d1,0xdcfcf54f,0x26863613,0x030035b0,0x67423b76,
  126220. 0x4028a9cb,0x9fbc7534,0x051a077e,0x7b52ce37,0x000000f4 } },
  126221. /* 166 */
  126222. { { 0x96bec962,0xebf7d8ad,0x17e0107a,0xd1cc81f6,0x214e1058,0x64c44509,
  126223. 0x42394c9f,0x6c298c43,0x1a660513,0xd910052d,0x90df8243,0xc3643754,
  126224. 0xfe5cdea4,0x2313be1e,0xd27fb7b1,0x249a60f7,0x00000076 },
  126225. { 0x1cf593a0,0x74975838,0x8364c59e,0x0c9ceefb,0xe05c9991,0x2f5a1333,
  126226. 0x421808e3,0x30ea5e1f,0x4f5e8f4f,0x56fb3a4f,0xb6c0cb47,0x2cae6e2e,
  126227. 0x08bdcc6a,0x60b307fd,0x0ff8c117,0xee17901c,0x0000001a } },
  126228. /* 167 */
  126229. { { 0x89aa9e14,0xc048336b,0xf676700f,0x66634271,0x906b6980,0x4daa0433,
  126230. 0xebb7ab23,0x30247ee1,0xeb59a053,0x969b4aa7,0x8000f4d5,0xd78ef825,
  126231. 0x46026b5b,0xe5db38eb,0x7d6856c4,0x06a43e5d,0x0000003b },
  126232. { 0xed2a0ee7,0xaa0ae838,0xf16e8813,0x04bbe528,0x4ea64137,0x8ab6df5c,
  126233. 0x06e29867,0x5be80cb6,0xf459ed2b,0xf19b1b72,0x1761521a,0x7a9cce4d,
  126234. 0xaa516f3b,0x39aff994,0xb3416925,0x97d92e86,0x00000007 } },
  126235. /* 168 */
  126236. { { 0x5af3a8ca,0x25aeede1,0xa5c351ec,0x33924782,0xf93ec080,0x41e7a3fb,
  126237. 0xe6f425b4,0xb04f93c4,0x81e76009,0xe4ec12ec,0x5180ffc6,0x797366d4,
  126238. 0x0e0aef3a,0xd293cbb5,0x68d71d91,0xa1496944,0x00000061 },
  126239. { 0x675a67a1,0xf52c541c,0x8f5fe906,0x67d38d30,0xf6be988e,0x2a70bccc,
  126240. 0x18589886,0xae03ecbe,0x7067045b,0xecd02616,0x10ca8d96,0x1facdd99,
  126241. 0x30c0735d,0x7aa10a82,0x3328f21c,0x2a27e554,0x00000015 } },
  126242. /* 169 */
  126243. { { 0xe6057e27,0x3dd609e0,0xc7a454da,0x87e8b6a7,0x1f32dd5b,0xff599145,
  126244. 0xd0ef51e2,0xea397a88,0x25567546,0xc49866a1,0x3228b480,0xea45c8b1,
  126245. 0xdd01997a,0x3dbe0e77,0xc51867d2,0x0e2ea28f,0x000001f8 },
  126246. { 0x69d0820b,0x6295412d,0x1ea65a18,0x03173127,0xeb06380d,0xc27c8221,
  126247. 0x75fe9706,0x7ffd4efc,0x5a71d250,0x7b396a57,0xc7cb7543,0x61c80051,
  126248. 0xad4dbee3,0xe07db4d7,0x9b192d45,0x1c7481f4,0x00000143 } },
  126249. /* 170 */
  126250. { { 0x08e1cc4d,0x5eab2d04,0xad2dc1ee,0xe93758d3,0x5c9c7393,0x0ceb7dfe,
  126251. 0xd3379683,0x530d86a9,0xe24f86d7,0xef5283ca,0xf0b1bb0b,0xab5d1a64,
  126252. 0x54db4e3c,0x96aabc1f,0x3bc00c59,0x3e3d87cc,0x00000144 },
  126253. { 0x1d60e7b0,0xe50a8213,0x5d33d018,0xfc9b629b,0xfd05338d,0xc54aee42,
  126254. 0xe821c6ea,0x0678f2c0,0x06ac09cb,0xe5c9d75f,0x53018df6,0x83357513,
  126255. 0x0bf8c667,0x81ca6fac,0x9d0ae2dd,0x7fc8020e,0x000000e1 } },
  126256. /* 171 */
  126257. { { 0x1baaa5eb,0x8add4741,0x79bd8036,0x02cbb759,0xcdffed22,0xd8680c40,
  126258. 0x4e091141,0x1c23a8f0,0x20748b87,0x65d141ed,0x659e9289,0x586a1575,
  126259. 0x5006dbfe,0x7c68d7cd,0x22569a74,0xda0ad0df,0x00000148 },
  126260. { 0x7f9069d7,0xc8fcc5db,0x5c0531a4,0x2487d245,0xe9a2db3a,0xc5ab4899,
  126261. 0xb4fe9720,0x52bfd538,0xd27f35e4,0x73a04ca4,0xee2dac93,0x7cbbc549,
  126262. 0xff3ee7e2,0x0287229d,0x28da9360,0x3179878d,0x000000d0 } },
  126263. /* 172 */
  126264. { { 0x3b66c047,0x89b7e9bb,0x602a3e1d,0x22e65869,0xc8db9c00,0x44f82297,
  126265. 0xd08a74a3,0x0e76aca3,0xfcd398de,0xfbf1a71d,0x8320e66a,0x2fbb6eaa,
  126266. 0x179c9fc5,0xa82d0ebc,0x4e7ab2b4,0x4e00cf6f,0x0000000f },
  126267. { 0x4890c439,0x424c0e9a,0xbc35a6b2,0x37564a2b,0xd9b7497d,0x95a4479d,
  126268. 0x612de942,0xa1ff3f0d,0xe60d0033,0x358627fc,0x522417da,0x815da8c0,
  126269. 0xef6b8385,0x506104d4,0xf16e96aa,0x800728d2,0x00000120 } },
  126270. /* 173 */
  126271. { { 0xab039042,0x976f2372,0x9fa084ed,0x10e6978c,0x58bec143,0xd03fdd2f,
  126272. 0xfe2045c3,0x3200c101,0xb0a5a928,0xe6868f7a,0xe61faff8,0x26c95d1d,
  126273. 0xb7b12265,0xa1e20127,0xc2a5ed17,0x8e63dd78,0x00000089 },
  126274. { 0x22bba4ee,0xbb6533da,0xf496a574,0x3eff6397,0x14f2a6b9,0x409329f7,
  126275. 0x1dfdd73f,0xa08248bd,0x69bca1b1,0x62f33f2e,0xba2e0327,0x9a177e64,
  126276. 0x75ddf741,0xbc50e993,0x4a56bd1c,0xb87a979f,0x00000095 } },
  126277. /* 174 */
  126278. { { 0x67c1f177,0xe83736a9,0x600133c9,0x1b6d3508,0x6eac9a5b,0x9424bb92,
  126279. 0xc27ef31c,0x7a9c01a6,0x122b4870,0xad93bba5,0x9d1ac985,0x9eb94e2a,
  126280. 0xd53f175b,0x511c0206,0x5102d914,0xd13eb252,0x000000b1 },
  126281. { 0x675a1171,0xcfe7dbeb,0x16c0d2b1,0xb228295c,0x057c88ca,0x8db25b5a,
  126282. 0xd300e9cf,0x73ea9e96,0x269552eb,0xb0e0037f,0x9e0f98df,0xea9d035c,
  126283. 0xd290480f,0x860e49b8,0xc036b319,0xa35e9512,0x00000037 } },
  126284. /* 175 */
  126285. { { 0x8f00df48,0xc56729ee,0x11ac8304,0xb89ca7b6,0x8b3a8123,0x497a57f9,
  126286. 0xc21ca3ea,0xe0431b19,0xe2bb3ce7,0x45a73deb,0xadc77819,0x2f86cc2b,
  126287. 0xe5eb3df1,0x5ff005e4,0xdd27dcf0,0xf955dd7a,0x0000005e },
  126288. { 0x00ee402f,0xe0c22ffa,0x3b30bb4c,0x5b335e2a,0x643cb101,0x542551d0,
  126289. 0x3cd19688,0xc6183f45,0xf0be54b4,0xc6664f22,0x4c20cde4,0xa5f4cfee,
  126290. 0x80a4c475,0xdcaa972f,0x59111ed9,0xde4af200,0x0000019c } },
  126291. /* 176 */
  126292. { { 0xd771f428,0x9e9d0bc8,0xe43ca382,0x3ac1ecd9,0xeb93acf0,0x8d5ee480,
  126293. 0x065a2a3f,0x16232f81,0x2f0b8a73,0x1fc04faa,0x025474a2,0x4a8df7e7,
  126294. 0x3bb15f6f,0x51ac4ff2,0xe0950e52,0x66e21b73,0x0000006b },
  126295. { 0x67a41dee,0x59c98480,0x7b3e2b3f,0x2cfa95ae,0x891454e1,0x54d98386,
  126296. 0xeefca6a4,0xf0dddbdf,0x11e9cb75,0x5f691b24,0xfef208c3,0xa9b9e766,
  126297. 0x18b33cf6,0xe8df1000,0xd1c174a9,0xb8a55ac9,0x000001c4 } },
  126298. /* 177 */
  126299. { { 0x5c4cccb8,0xa99f5862,0x2ef4d3ef,0x70bf5209,0x89efc878,0x28f4e576,
  126300. 0xda14206e,0xa2366f96,0x7c52107d,0x90331a00,0xd4a0f0f0,0x478d4cea,
  126301. 0x472a47b0,0xb2899ee2,0x64207549,0xae96534e,0x00000110 },
  126302. { 0xcced05b0,0x2cc1d655,0x01759543,0xabac3f09,0x8e577cd7,0xbaeb70a4,
  126303. 0x40e98d6d,0x84b00893,0x603d24f1,0x26983653,0x2572173d,0x6e145883,
  126304. 0x611141de,0x1d348b26,0xefa27f34,0xe52257dc,0x0000006b } },
  126305. /* 178 */
  126306. { { 0xc947e655,0x92678f33,0x08923795,0xff0fb76a,0x790239d1,0xb2dfe745,
  126307. 0x3cdbb7ce,0xea087492,0x05f6d41c,0x21326db9,0x79dc5588,0x5b1ae9ae,
  126308. 0xe9c31702,0xe145340c,0xa2c38a9c,0x07502c29,0x000000c3 },
  126309. { 0xc156ace2,0x0c124f11,0x79ff2529,0x2c170fe7,0x6e1171b2,0x60df9a81,
  126310. 0x55de2797,0xa19bca83,0x7c6cc79d,0x1ad927ea,0x1d61f770,0x28590112,
  126311. 0x261c06bb,0xfe80c826,0xaa2642bb,0x4050d338,0x0000015e } },
  126312. /* 179 */
  126313. { { 0xeaad87bc,0xc9397829,0x81e84cbd,0xe0ac9367,0x6ade4fde,0xb579c24d,
  126314. 0x690d7f56,0x50b9aba5,0xd14fb0b9,0xf09b29d3,0x25a0e7b6,0xd0684f23,
  126315. 0x606f4ff3,0x0514e9d3,0xe8ad733b,0xe63bdd26,0x00000077 },
  126316. { 0xe0d25c6d,0x0afd06ec,0x00ba2dcf,0xdd90021a,0x8c5bb398,0x1b025770,
  126317. 0x198ff8fc,0x077f06d8,0xb7e2cd68,0x87d50ff1,0x263a3572,0xef75e057,
  126318. 0xfa925a9a,0xbf257892,0x739d0e95,0x847d3df0,0x00000111 } },
  126319. /* 180 */
  126320. { { 0xfec82924,0x52ab9cc7,0xa7220d69,0x1c76dd69,0xa06ef0e2,0xa63527de,
  126321. 0x27183904,0xab3e51c2,0x716807c8,0xf4db35ea,0x748f1246,0x8f3ede0a,
  126322. 0x41156095,0xf1493644,0x874b38de,0x5f6583d1,0x000000f7 },
  126323. { 0x0b927eb7,0xa39189e1,0xc2e2f127,0xa87c6359,0x7fe966f4,0x0b72c233,
  126324. 0x105e5585,0x102b8382,0xe58c39f9,0x63fee006,0x991b5329,0x3f052ee3,
  126325. 0xcbaff97b,0x7f5b854c,0x5f805060,0x935e5f6c,0x0000016a } },
  126326. /* 181 */
  126327. { { 0xdfd88d38,0xf19a0355,0xc549df40,0x555cd8e3,0x04d006e1,0x322729e3,
  126328. 0xfd0b0ce6,0xf16b706c,0x35f2ad31,0xf156dc09,0xf7a3df9f,0xb30c5213,
  126329. 0xa55e5fb5,0x9f29cc92,0x2b858da2,0xa0ecfdd4,0x00000144 },
  126330. { 0x52658a92,0xb5c115df,0xc4281616,0xbce3ed17,0x7fd92a91,0xa5595f70,
  126331. 0x9cd5d896,0x663c8bfd,0x5a9472b1,0x0776343f,0xb033e1bd,0x14e44ca8,
  126332. 0x1e5c02fb,0x27a1c986,0xcc4ffb32,0xece0f2c4,0x000001b5 } },
  126333. /* 182 */
  126334. { { 0x31211943,0x17127bab,0x5684325c,0x44a8cac6,0xd855fc3e,0xd2fe0b88,
  126335. 0xce91eea5,0x47abab0c,0x78ec7d12,0x5d23ddc4,0x0cd9fefa,0xa3986de7,
  126336. 0x82655766,0x32c7b867,0xeeaec7fa,0x3e54018b,0x00000087 },
  126337. { 0xb38d17c1,0xc96e86f2,0x71fa040d,0x9cbfbd0c,0xf88499cb,0xe111ab79,
  126338. 0xf71ec80b,0x1d47c5ce,0x46c89692,0xacaa3bc1,0x3d316331,0x5f921c0e,
  126339. 0xe768765b,0x31fa081e,0x41eff270,0xd5dafd5f,0x000000fe } },
  126340. /* 183 */
  126341. { { 0x4cda1348,0x8af10b9d,0x25c3013a,0xb0769fd2,0x8957c22b,0x450aa5b1,
  126342. 0xf5acf1c4,0x5cafd6c7,0x9fef8029,0xcf71a140,0xee089f5d,0xe12029f5,
  126343. 0x0fbd2ba8,0x9752a8fb,0x6f70cb58,0x61e2275f,0x00000090 },
  126344. { 0x1fbda16a,0xb70a4ac5,0xf1dfa2a2,0x79910e79,0xd9945f6f,0xba2ce132,
  126345. 0xeb4ba4ef,0x450d59ae,0x4bf2d53d,0x6a8e09b3,0xe620c7a8,0x76010204,
  126346. 0x0a53c6f4,0x63f8943d,0x87eaf56a,0x14c91d19,0x00000132 } },
  126347. /* 184 */
  126348. { { 0x490d66c3,0xe54fb120,0xa0dc8204,0xeaed7328,0x04b4294d,0xba014c38,
  126349. 0x31ddc467,0x3f2fa2ab,0x8342ed11,0x70ff55ea,0x23034e0e,0xb18da72f,
  126350. 0xbd8ae3c1,0xadc30dbe,0x3e945a02,0x179bdf6f,0x0000009c },
  126351. { 0x7484c26f,0x46c928ef,0xef2adbb1,0x206b7db1,0x3f58dda7,0x0887f548,
  126352. 0x4bc7edb6,0xfde4e20c,0x975cafdc,0x484d121d,0x86beec20,0xc5b59670,
  126353. 0xa6d6db67,0xb579aa88,0x41187488,0x22c6d87e,0x00000015 } },
  126354. /* 185 */
  126355. { { 0xc471d4ae,0x0a890757,0x43a1da76,0xfef4b1a5,0x6aa701a1,0xb892b182,
  126356. 0x59c65f93,0xbf4d4e52,0xd789df35,0x923af929,0x0b79c3f2,0x3ccb46c6,
  126357. 0xcf4cf130,0x95582ce7,0x257f0ec4,0x7da081b4,0x0000011c },
  126358. { 0x9aeef274,0xf92c6ae5,0x1437c083,0xe6c5bf4f,0xe13c86af,0xaa74b023,
  126359. 0x2a225360,0xd21dace6,0x22589fa5,0xb3d572b8,0xdfa74b0f,0x3d4a3916,
  126360. 0xb12891a9,0xe76cd8dc,0x59f4cfbd,0xa0391a3f,0x0000019a } },
  126361. /* 186 */
  126362. { { 0x203fc3f1,0x054ba69e,0x62106a29,0x09168ccb,0xaad5fa9f,0xb0818540,
  126363. 0xbff7ed6f,0xecb8f20e,0xbef94afd,0x2c80a618,0xb0abd1db,0xe25d8ca0,
  126364. 0x028e0a7c,0x75e67a41,0xd6e95b9a,0xdd7662dd,0x000001b2 },
  126365. { 0xf289d7ee,0x87dff279,0xeea2205c,0x4d755d59,0xc18adac6,0xaeb0fd54,
  126366. 0x7ec01019,0x3a8c46cf,0xb48d70a4,0x6fc90e7e,0x10b39ef8,0x965c53c1,
  126367. 0x38545a20,0x455777cc,0x57dd023e,0xa33430f7,0x0000016e } },
  126368. /* 187 */
  126369. { { 0x0ff53d2c,0xfa9f3949,0xb00349b9,0x8dc91596,0xd5997967,0xf10a5014,
  126370. 0xa8a6b78a,0x4dd72dab,0x8b517b10,0xef5de540,0xa6d39be0,0x142b90bc,
  126371. 0xeda17f70,0xcaeaa3e9,0x06b31118,0xa01689d6,0x0000016d },
  126372. { 0xf46afff7,0xea6ca563,0x34a5e5f3,0x3945c7ba,0xaa998fd8,0xc1ffe4c8,
  126373. 0xb63f535e,0x42a60146,0xd1f509e5,0x50816888,0x9f8cd0db,0xd1918daa,
  126374. 0x78a36772,0x6505e6bb,0x9cc6dc66,0x4ab03a81,0x000001ef } },
  126375. /* 188 */
  126376. { { 0xd376d986,0x06089d14,0xa2dc35b0,0xd0f4e077,0x53ff2c86,0x1c11709a,
  126377. 0x123c3fc8,0xfef4ba45,0x1b656fc2,0x852cd5a7,0x1fefa8bb,0xb57c7489,
  126378. 0x48110b77,0x8f05383e,0x52c5a129,0x4b55d3ad,0x0000004c },
  126379. { 0xf3827633,0x5110cff3,0xe00afe96,0x086784d5,0x3ead32fa,0xcb387882,
  126380. 0x2b91cd86,0x3dcf4d16,0xe6f3638a,0x078b6a58,0xe8b7fd42,0x33792112,
  126381. 0xee5683e7,0x6964044d,0x28e28433,0x3b84210f,0x00000122 } },
  126382. /* 189 */
  126383. { { 0xc3ebeb27,0x6c28a9a9,0x3ef590f8,0xd7bcdcb5,0x4dae7f37,0xe88a2e11,
  126384. 0x726ea7c9,0x033522e4,0x8c141388,0x99d50386,0x61621575,0x59b1aeca,
  126385. 0xfcc564d8,0x719fcfeb,0x1aeb8e36,0x3a577af1,0x00000043 },
  126386. { 0x6feba922,0xc3f26ce0,0x475a5693,0x5f6c83ee,0x28bf378e,0x7f796740,
  126387. 0xbdc3f6f1,0xd2a5e368,0xa6ed90ae,0x3d034a0a,0x4a47cbd5,0x3b1c3a4c,
  126388. 0x4dce2bc8,0xa4f0aa6e,0x74ca00eb,0x97c7af43,0x000001c0 } },
  126389. /* 190 */
  126390. { { 0x79c28de7,0x00377178,0xab9c330c,0x617aa2aa,0x66bc61eb,0x43081826,
  126391. 0x4d78b504,0xe0b5b5cf,0x9870fc72,0xd76a752d,0xd40b7bc5,0x3b4689f5,
  126392. 0x87f2d03a,0xa97fd867,0xfd6060a9,0x6ab7b5ee,0x000001c0 },
  126393. { 0xffb71704,0xe99eadb1,0x390fe3b1,0x436e58bb,0xab4f19aa,0xeecab82c,
  126394. 0xe0f3d9dc,0xda492dfa,0x6e20ad12,0x2a0f54bd,0x7dbbd262,0xaf89fa0f,
  126395. 0xe8d2eb54,0xdcc50a1a,0xef7d0758,0x9799f816,0x000000b7 } },
  126396. /* 191 */
  126397. { { 0x104f98cc,0x9ec46462,0x72aedeae,0x45115922,0x7e62186f,0x7ae93dd0,
  126398. 0x8d6d69b6,0xd17ce026,0xfd43a8f3,0xb5347608,0x7c0ab797,0xe87f1c13,
  126399. 0x139f991d,0x3bf597a8,0xe547e0d6,0xe293a85b,0x0000008d },
  126400. { 0x8ef668b1,0x0982add3,0x611c9764,0xc54e6b2d,0x1c1d4263,0x3ce76b12,
  126401. 0xeff64e73,0x3134b28e,0x2871612a,0xaf71a9ac,0xba093594,0x31c88af2,
  126402. 0xba9108e8,0x0b649112,0x5cf437da,0x8febc5c5,0x00000113 } },
  126403. /* 192 */
  126404. { { 0xc4a2daa2,0x7e9ca589,0x400f608c,0x18ea703c,0xd5175103,0x6f8cd058,
  126405. 0x4abb6f29,0x26493472,0x94296ab4,0x0be553e1,0xac51657d,0x9af9398f,
  126406. 0x4f880ea8,0xe232deec,0x67b1e1b1,0x2f81761e,0x00000137 },
  126407. { 0x3a20f662,0x51014bc7,0x49ed9502,0x1fb7e77c,0xb62b9652,0x89f5096f,
  126408. 0xa2e8d37e,0x3a659c67,0x5804170e,0x0f2b2a26,0x9ed50a34,0x1674fce6,
  126409. 0xfdc3c00f,0xaaa4537e,0x4ce99d93,0xf3c3bfda,0x00000198 } },
  126410. /* 193 */
  126411. { { 0x81614189,0xbab1f5cd,0x24b259f7,0xc7d56c45,0x45fb415e,0xc7baa4b2,
  126412. 0x7af6bef9,0x302bc8dc,0x74b48e82,0x91b770e0,0x9b6d1b1f,0x4a1336e0,
  126413. 0xe6680c97,0x285c1357,0xc7ccb625,0x59bcb813,0x0000012d },
  126414. { 0x7c019927,0xddad83b4,0x630dfd5b,0xe10f2667,0x31e05d23,0x15dbec5a,
  126415. 0x456ac460,0x2aa6e5fa,0x243cac82,0x46956529,0x4dc8c9e9,0xc69c9c7f,
  126416. 0xe24a4065,0xadb27e09,0xae41301b,0xdfa7a34e,0x000001cc } },
  126417. /* 194 */
  126418. { { 0x59cb1a7d,0x176a864d,0x6aefb8ee,0x4d864ca3,0x1c22b0d8,0x0ee83acb,
  126419. 0xd980df1d,0x7e80a6eb,0x7f94ced9,0xf582acc4,0x3a72c115,0xa29cd123,
  126420. 0xc7107bb7,0xce12a2a8,0x4ed80a30,0x0229ca56,0x00000150 },
  126421. { 0x2f1c180b,0x9774bad5,0xd749aa10,0xd08be998,0x56dbd1ba,0x978c48ab,
  126422. 0x0afbea9a,0x6ed3e3e4,0x153dc5fc,0x8a8be97b,0x9be93ed0,0xadc7f095,
  126423. 0x2cee23bd,0x8d242908,0xdc2729de,0x417523c6,0x00000016 } },
  126424. /* 195 */
  126425. { { 0x6c14a31e,0x74eeccf1,0xb2de3c2d,0x488e2534,0x7cec43c3,0xf9bb3599,
  126426. 0x916ac936,0x4210459d,0x9f7e4400,0x71d15c02,0x44553583,0x8c9c7c12,
  126427. 0xec94a467,0xcc97548d,0x3167bad9,0x4ca67818,0x0000014e },
  126428. { 0x8d0312bf,0x033af055,0x54161e66,0xbd1bf4f5,0xfa41781d,0x259945a7,
  126429. 0x00eef1d5,0x33494da8,0x79c3b8d0,0x6c505ec0,0x1c9f6e69,0x70ae1ade,
  126430. 0x76830aaa,0x0288f0c1,0xa62a060c,0x7f4cfe3b,0x0000000c } },
  126431. /* 196 */
  126432. { { 0x057d6006,0x0d8b447d,0xfd71c8b0,0x38b976e6,0xabcf40f5,0x5e77e029,
  126433. 0xf103a783,0x13bee386,0x5e472c4b,0x20a6ac20,0x31fcb194,0x43b045f6,
  126434. 0xc00abf49,0xe5dc1d9f,0xa5556b79,0x28c0bc70,0x000001b5 },
  126435. { 0x8a8640b8,0xba9d07ee,0xd0e34012,0x25611023,0xbe24ae89,0xc7ce655b,
  126436. 0xfa579dcd,0xe358e524,0x377bbfe5,0x57ce2715,0x3c0947e4,0x64651c6c,
  126437. 0xf4a97826,0x5fbd8d50,0xe2e1c15a,0x6fcdd28f,0x0000008d } },
  126438. /* 197 */
  126439. { { 0x5c7202c8,0xb564a2f6,0x5a54b0d8,0x7d634052,0x1434fbf5,0x8414d672,
  126440. 0x1d9830a3,0x8114215e,0x5ef0fbe1,0xc7a758d5,0xe6f57f9f,0x5705dcf8,
  126441. 0xd92269d3,0x5dd49a56,0xbdb49f97,0x8f015d7a,0x000000f1 },
  126442. { 0xb4799ce6,0x07131110,0x2cbcb7db,0x35bbfb99,0xf7ba21e2,0xc1f00c9f,
  126443. 0xb18f49fe,0x009d6913,0xabcf959b,0x8da61951,0x0d42146e,0x0e687213,
  126444. 0xae5f23f1,0x55832817,0x9ae7386b,0xc9b5bb68,0x00000143 } },
  126445. /* 198 */
  126446. { { 0x48c74424,0x423328db,0xd19cb2eb,0x32616e11,0x40d6e217,0xe534192a,
  126447. 0x0cbdc752,0xdd83a94c,0xd733bb01,0x5c623050,0x5b7a4520,0xcd0d631a,
  126448. 0x9a4011c8,0xccdc0a25,0x646e7cd5,0x22f112cc,0x000001e6 },
  126449. { 0x3e1e4c4b,0x47d6e29a,0x9fb1548a,0xd5f82538,0x4fd3e319,0x7e3705b5,
  126450. 0x0a08b966,0x8c4ce59a,0xd8cbe8db,0xbca749e7,0xaeec3d75,0xcc4496ea,
  126451. 0x8a1a313d,0x17dc723a,0x8ceb9360,0x250ff77a,0x000001a5 } },
  126452. /* 199 */
  126453. { { 0xfe29bd79,0xa55a0726,0x4f990b34,0x6574a810,0xaad56983,0x6906946d,
  126454. 0x50d41fef,0x0e580ab9,0x6e6f7f45,0xbc75b514,0xf0f3718a,0x508cc97b,
  126455. 0xa5634087,0x51ba2ca4,0xe64d8910,0x75c39077,0x00000172 },
  126456. { 0xf77ca6bd,0xf37cccaf,0xbdb18df5,0xe0a0df41,0x019e01f7,0x9f46cff8,
  126457. 0xaa65d72b,0xbe4f3d44,0x6e3663e9,0x7822d8ac,0x3ef9db6d,0x5f37f922,
  126458. 0xabe4a9aa,0x7f0ad39d,0xf69cc8ba,0xa0a57c70,0x00000098 } },
  126459. /* 200 */
  126460. { { 0x00fd5286,0xd9c50cf4,0x72a4b03c,0x1ea5b9d5,0x051ae73e,0xf5e60f9e,
  126461. 0x951b3824,0xfe9b5142,0x9fb4d667,0xb034b2d0,0xedc50856,0x4b537a80,
  126462. 0x8cb0022e,0x69ee1012,0x6a548aee,0x7c8b9e5c,0x000000ed },
  126463. { 0xd933619b,0x746007bc,0x2b9dfe19,0x0ce7668e,0xcc6e2a2e,0xa9eed5d3,
  126464. 0x7eebf32f,0x35a14f5f,0x67cc4f64,0x75cb898d,0x7850c16c,0xcb2185fc,
  126465. 0x45f79c96,0x09874a76,0x27db4744,0x7468f8ae,0x00000139 } },
  126466. /* 201 */
  126467. { { 0xc88684f6,0xc5de68ad,0x619a7dbf,0x7c1edaab,0xb27a18f5,0x258d1735,
  126468. 0x8ecd89eb,0xb27e7b65,0xd879f7ea,0x3d8889c6,0x67d5befb,0xa8fdc96d,
  126469. 0x37bad73c,0xc84d86ae,0xce8e56d7,0xc7e91976,0x000001a4 },
  126470. { 0x6319ffa6,0x5001a540,0x134ec04c,0x0cae64ec,0xd541242c,0x1f69a96c,
  126471. 0xbf2caeee,0x9da259ee,0x28bee805,0x88e7978c,0xb8e890e4,0xe9484beb,
  126472. 0xfb227fd9,0x0e5246d0,0x625d6318,0x8be2a54a,0x000001b7 } },
  126473. /* 202 */
  126474. { { 0xf472f13a,0xa223554a,0x5733e91c,0xfac993b7,0x96c168a2,0x26afe9f0,
  126475. 0x4b127535,0x7cfe761d,0xe77070ca,0x84301873,0xc7e7cdf6,0x66b6aaad,
  126476. 0xa1562ed4,0xda2dd5ea,0x39faf8d8,0xa81a2e00,0x00000016 },
  126477. { 0x4e3de3bf,0xa880759c,0x52f3088a,0x0c1e2e11,0xaa7eba5b,0xcb2ded9a,
  126478. 0x9f9c11ca,0x4c65d553,0xb0dc5c19,0x0ab9bd87,0xca3f4b61,0xd32f8c96,
  126479. 0x28cb5f9f,0x49842fcc,0xb90e21df,0x31ae27cc,0x000000f4 } },
  126480. /* 203 */
  126481. { { 0x6a0ccd0a,0x3b2a0a0d,0x5993b555,0xa3eeec82,0x9de672a6,0xb13486fd,
  126482. 0x0da05dcf,0x8d9c5148,0x6739874d,0xc4aa444d,0xe29a35c9,0xd9cf35b2,
  126483. 0x89177ead,0xd6bd9b5f,0x2a0470a1,0x9af0f59d,0x000001d6 },
  126484. { 0xba7535fd,0xb2f844c7,0xa842ff39,0x45bd4c3d,0xe951974b,0x5fe149ed,
  126485. 0xfd4453ec,0x6982e997,0xe6c37c0e,0xa63f705d,0xd2c3ef6a,0x09b0f6a9,
  126486. 0x1776a8d6,0xbedd3586,0xede11b78,0x4048a46a,0x00000176 } },
  126487. /* 204 */
  126488. { { 0x51a251d1,0xa47c6ee5,0x0d279dfd,0xbef4bf12,0xec518a28,0x4c2d538c,
  126489. 0x3880be6e,0x1b2b7887,0x1be9b20b,0xc69ccf8e,0x3796a19e,0xe41dfeae,
  126490. 0xfb50bdea,0x25676fc9,0x03e180c0,0x8b815a05,0x0000016a },
  126491. { 0x53f5ef65,0x2ca085f6,0x77b25105,0x61dfbbf9,0xa3346fe6,0x88ea87e3,
  126492. 0x1b95f7ef,0x25ddfdee,0x5b65eaec,0x22074e69,0x4c2e023b,0x11869a15,
  126493. 0x42e83bb5,0x8601b577,0xfa877e7d,0x1464652c,0x00000015 } },
  126494. /* 205 */
  126495. { { 0x57fa58f1,0x250853c8,0x4ca4c670,0xb58a4e68,0x1b81f40d,0x07b96d0a,
  126496. 0x558e8cbd,0xa4651e10,0x42e388cf,0x1a64046e,0x44436088,0x51b0d539,
  126497. 0xe26b8fd0,0xc2bf35b3,0x5702cfce,0x4ae78709,0x000000fd },
  126498. { 0xdf53d498,0x3c79bc29,0x1137f624,0x4cf31c4e,0x17a3cedf,0x93b6856c,
  126499. 0x6cd9115d,0x2461131c,0x9228cddb,0xab30a453,0x8d202bf1,0xe97757b6,
  126500. 0xe6108612,0xa666de7c,0x4f6026b4,0xc200fe65,0x00000051 } },
  126501. /* 206 */
  126502. { { 0xb1a2b4b5,0xea96103c,0x843c0968,0x98dccbfe,0x986ffb5b,0x6a37072d,
  126503. 0x169d3ac2,0x2fa07af2,0x771371f1,0x8bb85b9a,0xe7c299ef,0xeae10d34,
  126504. 0xe2372efc,0x3d4bdc69,0x8dd856f1,0x378df75d,0x00000039 },
  126505. { 0xde7ff5d9,0x31e902ff,0x325a09ca,0x0e9a85d2,0xf4192fcd,0xd71b93a6,
  126506. 0x15b076b3,0xf52a5737,0x6e711d1c,0xd726aa86,0x2c292819,0x0b61b1df,
  126507. 0xc8015de6,0x224e575c,0x18b79e47,0x68e893e1,0x000001dc } },
  126508. /* 207 */
  126509. { { 0x6ffeda73,0xb7924ff9,0xa0da2018,0xe709f406,0xf89584df,0x368e20ea,
  126510. 0x8355a040,0x0095112e,0xfd777d7c,0x259d4528,0x2bf8f2c8,0xb0c49565,
  126511. 0x44c5311b,0x7f631928,0x8466d9d5,0x698d0e4f,0x000000d5 },
  126512. { 0x015d204d,0xe10d64fa,0x6dd10c53,0x7b626bfa,0xa7698c94,0x087f8e63,
  126513. 0x05337a56,0x525a6547,0xdf5c782f,0x558e2244,0x855fbaff,0x48aa1e41,
  126514. 0x47ee3830,0x48f2218e,0x138463d3,0xf2523959,0x0000004d } },
  126515. /* 208 */
  126516. { { 0xd8695310,0x76f4fd69,0x7e8768ea,0xe28eb09f,0xe0d532a8,0x039c1812,
  126517. 0xc572ac79,0xdda67744,0x785d6293,0x1f9800e0,0x3da76bb2,0x2bfe2a5a,
  126518. 0xa2bc7217,0x6ed15b90,0xd1788a8e,0xd80e61bf,0x0000004c },
  126519. { 0x16730056,0xb9f40370,0xdced3d43,0x46f45fef,0x1aa50742,0x0afd763c,
  126520. 0xff92ae73,0x21e5c652,0x1bb2063f,0x6ef0830d,0x12d22540,0x18306ecc,
  126521. 0x1f15001c,0x4edd9b3a,0xc0cc5424,0xe4eb25b8,0x000001f4 } },
  126522. /* 209 */
  126523. { { 0xa1db5c18,0xed61a714,0x7677074c,0x9454e61e,0x7bf685de,0xe970fbe5,
  126524. 0xd2145be5,0x221b0c53,0xee49a5f2,0xb931881b,0x14b11d03,0x00b91afa,
  126525. 0x3ec22137,0xc6aefe49,0x526200af,0x50554e94,0x0000013c },
  126526. { 0x7364c92e,0xd42c45e7,0x735218e8,0xe0500265,0x84d3f3c5,0xd281da02,
  126527. 0xdbf7646b,0x312f8424,0x485f304f,0xe1a88f2a,0x1127a513,0x583f5631,
  126528. 0x1a60e0bc,0xed7950c7,0x4b7b70a4,0x92855e10,0x000000c6 } },
  126529. /* 210 */
  126530. { { 0x644614e7,0x8d06185c,0x4749a424,0x2e906cae,0x2587e528,0x585412ea,
  126531. 0xd12857cd,0x3763990a,0xba5593b5,0x770c7f70,0xdd5d2a46,0xc2cf6dc4,
  126532. 0x3b69a1ba,0x564da456,0x187895da,0x639f7e14,0x000001c8 },
  126533. { 0xf8589620,0x05c96b02,0x41e44054,0x2fe468a3,0x096ad09c,0xbf22da11,
  126534. 0x9c652aee,0xbc73c298,0x547e1b8f,0xcdef9f8b,0x977dbf73,0x7073785a,
  126535. 0x7e13552d,0x0a92a1aa,0x3a393d3f,0x22761140,0x0000015b } },
  126536. /* 211 */
  126537. { { 0x1fbfaf32,0x89a5a7b0,0xbe661d21,0x5c5a62d0,0xf5e3b44d,0x47970f5e,
  126538. 0xf43bbf62,0x3ea001ed,0x260ae5a0,0xa8e74285,0x2697c62c,0xeb899ebd,
  126539. 0x751a7643,0x36a003e6,0xba0725a6,0xef178c51,0x000000ea },
  126540. { 0x9bd51f28,0xaacf8e9f,0xa8712044,0x39febbdb,0x5bfc8365,0x8780ad3a,
  126541. 0x10e6f08f,0x408a34cd,0x8241ab0e,0x8104ca10,0x98a662a1,0x843e71ce,
  126542. 0x232048d6,0x9dce8514,0x1cf3d187,0x5cba23be,0x000001fa } },
  126543. /* 212 */
  126544. { { 0x2973a15c,0x2fe8c9d2,0xd42979f3,0x66fec8dd,0x0b6afb3e,0x39af4a39,
  126545. 0xab65ef22,0x0bb1e436,0x66c5fcdb,0x8f26201e,0x5af4870b,0x3cffe8a3,
  126546. 0x2bb44e24,0x65ae286f,0x51dd1722,0xda2e283a,0x00000114 },
  126547. { 0xc1e3d708,0x4a9c9a56,0x1cb0efa6,0x4fe62d3f,0x97e87540,0xf0702984,
  126548. 0x3cea46fa,0x138b7d6b,0x83886263,0x0780634e,0x71c30909,0x27e84280,
  126549. 0xe5838647,0xf0af79d7,0xb236a267,0xc1b86582,0x00000104 } },
  126550. /* 213 */
  126551. { { 0xa526c894,0x32ff09ed,0x14ac7d23,0x95abf120,0x3cd92934,0xb6f94dcd,
  126552. 0x92e6b556,0xffaaeb12,0x1036c31b,0x193796ea,0x707ff32e,0xa9d237e7,
  126553. 0x829d67b8,0xd65a5b0d,0xdb29248b,0x48edb556,0x000001b3 },
  126554. { 0xded46575,0x6ee9f9b2,0xffa69acf,0x496ca08a,0xf16d37d1,0xd5aeb3a1,
  126555. 0x789e5d01,0x4a507db1,0xc827cc45,0x05e2ce29,0x2964e677,0x29b6e4a5,
  126556. 0x4c0e46f2,0x0563b0ba,0x4bc46485,0xe75c2448,0x000000a3 } },
  126557. /* 214 */
  126558. { { 0xd2f6615d,0x0fcb476f,0xd98da9a9,0x4b7f9b78,0xd2bdf107,0xe2fddf1c,
  126559. 0x9b956f31,0x2bda3086,0xb596eadf,0xf3cca2f7,0x355b2538,0x91c09f8b,
  126560. 0xc6c846db,0x46f3f6f3,0x2a14642e,0x9bb9398e,0x000001ff },
  126561. { 0xa17bd645,0x5118d4f5,0xdbd6d552,0x57033eab,0x734d0957,0x007e86fc,
  126562. 0x5f53c435,0x98ca065f,0xfd27dd19,0x9949d9bf,0x6952d1ca,0xddc4e304,
  126563. 0x81ac101c,0x84cab4fb,0x4a56b007,0x46d079f9,0x00000003 } },
  126564. /* 215 */
  126565. { { 0xa6bfdedd,0x95eb8e4f,0x7a74c6f9,0x993a285e,0x3d09a252,0x8bd5d4d1,
  126566. 0x19a5f767,0xeaa10be6,0x0cebb340,0xd3db083e,0x1dbf7a83,0xc633a78b,
  126567. 0xc30f23e1,0x2664bc3e,0x07a08379,0x6630f8f1,0x000001c9 },
  126568. { 0xdef86a80,0xbbf4cb4b,0x3f8259ab,0x1fa4ec78,0x609532c8,0xa4bf7604,
  126569. 0x8b909e92,0x71bb7acc,0x17884160,0xca1d7317,0xca1ab928,0x7f7f14be,
  126570. 0x5f8455a5,0xbfea016e,0xbf21e899,0x7b8c76b9,0x0000002d } },
  126571. /* 216 */
  126572. { { 0x4b9f8e7d,0x46860563,0x63fc58a8,0x201176b7,0x2feed68a,0xe7a5da7e,
  126573. 0x65183190,0xcc67763e,0xe9377ad6,0x7d7d0102,0x77032321,0xccfc4720,
  126574. 0x534bb505,0x573ee031,0x0f1a2769,0x1bf1ef8c,0x000000f3 },
  126575. { 0x0c935667,0x635f5c4b,0x060d2b8b,0x74152c39,0x37c3a574,0xeffaac2e,
  126576. 0x0b72e0cd,0xfd5fcc4c,0xf4f60247,0xb743f9b9,0x79e16f33,0x05c2e354,
  126577. 0x3074ef9c,0xa2234c47,0x495aace3,0x4092f279,0x00000124 } },
  126578. /* 217 */
  126579. { { 0xb30f9170,0x5bfd7851,0x37fce5b1,0x715aa1e9,0x928437b9,0xcffd55e0,
  126580. 0xc32f1273,0x88acd259,0x48be1e34,0x5a145cf2,0x7a5bc62b,0x3a340860,
  126581. 0x18156f46,0x6296eb15,0x2774e1c3,0x397fad19,0x000001e7 },
  126582. { 0x9c8225b5,0x362f99f4,0x46b77c4d,0x33efce49,0x8541e91b,0x451df530,
  126583. 0x38f3d693,0x0bd2d934,0xe727b54e,0x0b5de2d6,0x7622d940,0x42d929c2,
  126584. 0x56f6a94b,0x36ace723,0xfccaf205,0x64a18cd5,0x00000044 } },
  126585. /* 218 */
  126586. { { 0xaba95d63,0x8dbe0aab,0x7b4b346d,0x92780c61,0x0e0d8142,0x6430f863,
  126587. 0xb56ef04c,0x875be02a,0x785e3633,0xc28feb95,0xc12c93e4,0xd5401795,
  126588. 0xe36f82a3,0x89ff51c1,0x10eeafd6,0x3c48c895,0x0000016b },
  126589. { 0xd4f064be,0x79287eba,0x54ebda99,0x1a77d555,0x623727ea,0x46745ef2,
  126590. 0x89f366c6,0xa911f591,0xc59d6ebd,0x7e5435cd,0x7524d213,0x3a84daea,
  126591. 0x4395b38d,0xc7b1dd1c,0x1a823c49,0xca13e704,0x0000001c } },
  126592. /* 219 */
  126593. { { 0x874d64b0,0x6399860c,0x1653ce0c,0x3375b092,0xeaa11986,0x16700000,
  126594. 0x621cd15d,0x62c67909,0x77d70dcd,0xbe1d7dd6,0x305bd4cd,0xeff0f270,
  126595. 0x362f8f30,0x076ec621,0x7e445b78,0x81204816,0x000001d8 },
  126596. { 0x161f9758,0x81749a0e,0xa3c4fce2,0xe60915fe,0x911dd8af,0xf537ce41,
  126597. 0x79a51a09,0xfe36a8ac,0x2ca5cf8e,0x67fb54b4,0xe49057f5,0x1bdcae07,
  126598. 0xa4244b64,0xb71ff0c5,0x4b606583,0x4815a536,0x00000106 } },
  126599. /* 220 */
  126600. { { 0xef39cc39,0x78c69c3e,0xfa6356d1,0x98304564,0x412fb990,0xbd3c3542,
  126601. 0x79dbb2a5,0xa1d531d3,0xe7e75e3d,0x4865f188,0x0b0147b1,0x2dac4e22,
  126602. 0x33d29ab0,0xf59e51ca,0x37b074ef,0xc964f7fe,0x000000f1 },
  126603. { 0x0e301262,0x7080c0a6,0x5390a22d,0x9a458060,0xcc8a9029,0xda677f9a,
  126604. 0x14c0f1c2,0xdfae9057,0x6e66d9f7,0x3665ff16,0x47846924,0xc866dd8c,
  126605. 0xc4cc307c,0xc5afe98f,0xe0bf50e4,0x60e3ba63,0x00000039 } },
  126606. /* 221 */
  126607. { { 0x959ecdb3,0x1a785136,0xf9e959be,0x289af617,0xcde0dc88,0x5145b2b8,
  126608. 0x7c079e15,0xfe9070b0,0x50e22415,0xf77f04d3,0x358d6d42,0xb3ab7372,
  126609. 0xba7b629a,0x14fd41b9,0x7400fd25,0x7b32d80e,0x00000193 },
  126610. { 0x7147886f,0xe5d80d4d,0x576c81ca,0xe08ced61,0x642717bb,0xe14e8692,
  126611. 0xabb4bd21,0x9dcdf198,0x6530308b,0x658be646,0xd99d19c7,0xfbf192da,
  126612. 0x304ab126,0x55a3d1b3,0xfa24de31,0x943f4be5,0x0000000e } },
  126613. /* 222 */
  126614. { { 0x7fe9ea48,0xc5424058,0x61b57486,0xaf24f825,0x78719740,0x9d2c413c,
  126615. 0x70eb874d,0x27a9be79,0xb62ba3aa,0x43fef8e0,0x2c1bf0ac,0x0a23f286,
  126616. 0x4af130e1,0x51c276f3,0xae55cebf,0xf6cd1e9a,0x00000185 },
  126617. { 0x40369093,0x24defa7f,0x58581e0a,0x11f1d9d6,0xe512ed9e,0x9900bf33,
  126618. 0xed120896,0xbf8a8459,0x8b73c399,0x8324555e,0x8f6f54fe,0x54a30569,
  126619. 0x3c252355,0x2a9d6da5,0x2a093b31,0xe6a6f904,0x0000016a } },
  126620. /* 223 */
  126621. { { 0x152cdd35,0xb2e123c9,0x86402ef1,0xae6e43a8,0xb9ce5bd5,0x892bf0df,
  126622. 0x75804914,0xb4acb84a,0xf502eec2,0x8c7f55ff,0xaa33ef4e,0x9c8a7b93,
  126623. 0xfd9d2001,0x06b10357,0x0ba3bceb,0x3e319ff0,0x00000027 },
  126624. { 0xabe360a3,0x182c2f77,0xadfefca6,0x57ef5c84,0x650b6fcc,0x9a4f0ca6,
  126625. 0xaaf0b202,0x3f4f8e56,0xa24ef156,0x5c8508a0,0x1ea45f13,0xd8f62fd9,
  126626. 0x28036dbe,0xf2c923a0,0x1a4d103b,0x4a9ca4c0,0x0000018a } },
  126627. /* 224 */
  126628. { { 0x5448e339,0x2a3fb798,0x18a39976,0xde8770cf,0x7a69170c,0x1160574d,
  126629. 0x2b6067ac,0x4bb05c59,0x848138ab,0xde0d2db0,0x4909e794,0x149dab92,
  126630. 0x790315f7,0x83a336b6,0xa335a258,0xcd9074d9,0x0000013c },
  126631. { 0xac1b784d,0xe839c5e0,0xee527ae1,0xab65c8c6,0xa1c88ec0,0xd3c86146,
  126632. 0x46c1bf58,0x2201f790,0x3fda502a,0x71cec627,0x225b9065,0xff3f88eb,
  126633. 0xc556dfcd,0x6c1f0c98,0x484fa5cc,0xaa3222aa,0x000000ac } },
  126634. /* 225 */
  126635. { { 0xc9b4dfd6,0x17e74bc3,0xf8e76293,0x25ba8053,0x9d8c3520,0x0307dc05,
  126636. 0xb85a20b4,0x1c9036cc,0x23871359,0xf2c63f0a,0xca95fb4e,0x1a99d9d8,
  126637. 0x9850c6c6,0x3d7c4f39,0x68299668,0x162969c9,0x00000169 },
  126638. { 0xcb63ee53,0x7d13c267,0x75eac353,0x67b12e61,0x191abfca,0xb3369a11,
  126639. 0xee1af69f,0x5ad0649d,0x11dc11e7,0x4d7a6f00,0xdb9f9765,0x80f030b8,
  126640. 0xf0ab1332,0xa20001a3,0x39d8cc62,0xe17c98d2,0x00000194 } },
  126641. /* 226 */
  126642. { { 0x1d8fe898,0x720d80b4,0x32184534,0x8d7a28b7,0x04f21740,0xf1f3c385,
  126643. 0x166aa6af,0x5d381cd5,0xcc560e35,0x9cde6084,0x5e61e2cd,0xcb041f0a,
  126644. 0xd9b4951a,0x621116f5,0x7ee2ac2c,0x509e16d3,0x000000c4 },
  126645. { 0x2c6fd79e,0xb82a20c4,0x3af78b0e,0x95b7ee4e,0xbad819ca,0x3d9b63c1,
  126646. 0x98552569,0x10d674de,0xf9c19d0f,0x17de64b2,0x47c5e6a9,0xa03fabaf,
  126647. 0x2ce2db6f,0x858bc4ad,0x1fc9d18e,0x76c2380a,0x000000c9 } },
  126648. /* 227 */
  126649. { { 0xb064f114,0x91171ef8,0x4f2f0f4c,0x83cb1565,0x57b262b7,0x30525854,
  126650. 0x0f34936c,0x468c6701,0x99a41fed,0xef26d2fe,0xa7f7f6a9,0xf6da2267,
  126651. 0xa01bfc1b,0x2563b8db,0xc340ed40,0x14b36c85,0x0000000e },
  126652. { 0x25db67e6,0x5e57e264,0x7f2e905f,0x85df4e89,0x026c4268,0x7832e514,
  126653. 0x3e875093,0x312be262,0x3c538691,0x856b5bd8,0x95734f9d,0x5b1cae55,
  126654. 0xd5aa4861,0x5a07bfe2,0xce8abb58,0x7a4c96f0,0x000001d0 } },
  126655. /* 228 */
  126656. { { 0x523aa2e9,0x7bf54d05,0xed3d0860,0xc8841e0c,0x7f9bfb69,0x5683f6e2,
  126657. 0x162bdf85,0xdcb07f44,0x07b0dcc9,0x62d17839,0x657a536e,0xa2cbb8ab,
  126658. 0x7cf47d3c,0x98b9a0d2,0x5eea6370,0xff154d68,0x000001f2 },
  126659. { 0x56b232ac,0x568b768a,0x3f2a52ab,0x4e8d6e36,0x8837fc60,0xbae87a16,
  126660. 0xd10a7691,0xebc58a83,0xf9455fbe,0xad5e4af0,0x7d654e2e,0x1a20d6c3,
  126661. 0xda7c8255,0x8c40fcb9,0x60d9b931,0x6d7b3cd7,0x000000b2 } },
  126662. /* 229 */
  126663. { { 0xbb2eaf45,0x7b090c3e,0x62ffb92f,0xed24d91c,0xa736f23d,0xbf2a3ea4,
  126664. 0x6ff0fde3,0xb5b99ebd,0xca1102f5,0xbca2b55d,0x07e032a8,0xf6203cd8,
  126665. 0xa8bf17a8,0x5410b448,0xe1dc55b1,0xb86660a7,0x00000109 },
  126666. { 0x02a2fbd8,0xb148b1da,0x3b22e8a5,0xfed85e8b,0x8712b509,0x1378a0e4,
  126667. 0xc6a3e516,0x68560148,0x1633b503,0x7100921c,0x25512711,0x93925143,
  126668. 0x07d31047,0x7b4931d2,0x8542e0bb,0x623e722b,0x000000ea } },
  126669. /* 230 */
  126670. { { 0x24972688,0x084823d3,0x003f5762,0x58b83c12,0x6d0d4528,0x194d6690,
  126671. 0x2c6f747e,0x84219584,0x0146d89a,0xc8f8a2e9,0x7451bbc2,0x29ec1de7,
  126672. 0xf7f284fa,0xf622b6b8,0x7b71e44f,0x83f1dbe9,0x00000060 },
  126673. { 0x999dd56b,0x99649333,0x97a47de9,0x2cfac0ba,0xbbe8fb20,0x6660d8ae,
  126674. 0xf61d7bca,0x47c29dd8,0x85adc14d,0x6f5fb51d,0x4f9fd41c,0xe65ac788,
  126675. 0xff513e6c,0x1ce69dd4,0xffe59d3e,0x1ace591e,0x00000023 } },
  126676. /* 231 */
  126677. { { 0xa9fda771,0x2e67a438,0x8663100e,0x626f652c,0xe133f23b,0xdfb19e48,
  126678. 0x035d2d1f,0x599f88f2,0x8d13e878,0x1723a112,0xfb51ce07,0x890aa292,
  126679. 0xbbd9ba82,0xe5f3a70e,0x374514b4,0xdde82673,0x00000155 },
  126680. { 0xd6f59a95,0x08b2b77e,0x02020420,0x93f853e3,0xebac7797,0x52252ac1,
  126681. 0xb56b6676,0x6ecdcb99,0x9722a500,0x4abdb9f9,0x04e2bad0,0x26210f3f,
  126682. 0x3034dd4d,0x0ca5a0ff,0xdac0b80d,0x333d8080,0x00000041 } },
  126683. /* 232 */
  126684. { { 0x35a85a06,0xe8510709,0x42ef1b44,0x4e166e76,0xa07b3a6d,0x84a90b71,
  126685. 0x30329e6a,0xd6dd6c00,0x3d555259,0x20c4ba65,0x6f8ad05e,0xee3b26af,
  126686. 0x2ab4cccd,0x20e3d541,0xa9406424,0x79798934,0x000001bd },
  126687. { 0x8e0c7ff0,0xf2a1d184,0x9543b340,0xbae85efc,0xf51d318b,0xe96431ae,
  126688. 0x75878fa6,0xe5d3ed4e,0xc2895f52,0x4d2a29db,0x1f11067c,0x3af27877,
  126689. 0x9e7f4ee5,0x6ccde964,0xa56d74da,0x35188da1,0x00000192 } },
  126690. /* 233 */
  126691. { { 0x03d310ed,0xb0832120,0x987b0311,0xd20ee8cc,0x84c558a8,0x9e549d26,
  126692. 0xb7167ec8,0x5e25f3ce,0x4bf55bb5,0xacf114f4,0x061c9017,0x819edc77,
  126693. 0xdeb343c0,0x759a44e6,0x04c9b5ed,0x58df9f7e,0x00000078 },
  126694. { 0x3bf13222,0x4fa47ebb,0xea07da11,0x1e451dcd,0xc0d8242f,0x1be9fac3,
  126695. 0x36eb871e,0x93257d4d,0xbea3190d,0xf49e775a,0x4ebe2b33,0x406d191f,
  126696. 0x0c110096,0x67aac53c,0xd381ac78,0x5215cf8b,0x000001f4 } },
  126697. /* 234 */
  126698. { { 0xfa493b79,0x387e8a8e,0x4eb1c2ac,0xb20e270b,0x9ff22320,0x9f393fa0,
  126699. 0xa91c393d,0x5ee1baae,0x138a8d96,0xdeda961a,0x97bd50e4,0x69ab238c,
  126700. 0x2363c8e0,0xff68d48a,0xce4c4c16,0xaf8e00e5,0x00000158 },
  126701. { 0xcfc509a1,0x6ccdcf06,0xc26cc075,0x60f411ef,0x4d9c57f0,0x6d0cdfd6,
  126702. 0x32e99cac,0xa9514853,0x8b8e9510,0x58f9ab3d,0xb10dc3fd,0xa7e98709,
  126703. 0x75ef3509,0x8390843d,0x5a9312c7,0x28ccc9d0,0x000001b6 } },
  126704. /* 235 */
  126705. { { 0xe341463f,0x1d934f00,0x150da7a0,0x14c8a6ce,0x4109553f,0xdb4860fc,
  126706. 0xa93f4a91,0xc23bde5a,0x2cd58067,0x9f47c787,0x8433dc80,0x1d330054,
  126707. 0x75a32a7d,0x0c0be7f9,0x88c75da9,0x08b777d5,0x0000012e },
  126708. { 0x61a10d37,0xdfc12817,0x5c50f5a5,0xed7b6181,0x79477c60,0x28af95db,
  126709. 0x33c5310b,0xa0aa2b77,0x53118267,0x905faab8,0x6b41959f,0xf40e9816,
  126710. 0x16b37784,0x9ccb4252,0x69866acc,0x6835d77c,0x000000c5 } },
  126711. /* 236 */
  126712. { { 0x2b450a66,0xe9d714cb,0x7dbfdc14,0x1318885c,0xb466a0c0,0x655a8d85,
  126713. 0x5bdfc1a6,0x02a21e99,0xe67792d1,0x7a0d7c98,0xb550a797,0x2a01bb57,
  126714. 0x5d74d337,0x42c46233,0x88dad495,0x7be4e1c0,0x0000008b },
  126715. { 0x95812273,0x1873b03f,0xee3f757f,0x2e26ed32,0x6da6217a,0x2c710eae,
  126716. 0x261d9f4f,0x9b50b574,0xb7c1da2d,0x43971fa9,0xc4a85de7,0x22c4fb87,
  126717. 0xec22137b,0xf72c3451,0x77ba1926,0x1345668c,0x00000173 } },
  126718. /* 237 */
  126719. { { 0x8a3ba183,0x3e3e8c7a,0xfe389fa7,0x4e8cebbb,0x0f9ba60f,0x8ea44687,
  126720. 0xcb601a83,0x55176e35,0x12e52db4,0xf90bdc26,0x8f712bf1,0x95f9e459,
  126721. 0xbea054cd,0x9bd3200f,0xdd5fd40b,0x2cf19bf6,0x0000017a },
  126722. { 0x66736feb,0x71cf6ca2,0xde7cfe2f,0xbde86f49,0xfc290563,0xc60abce8,
  126723. 0x726b6e4f,0xaae8a3ce,0x3f29235b,0xd2382445,0x650ffa5e,0xa4b557f5,
  126724. 0x113ef744,0xa1453e54,0x3e426dd2,0x7c676a53,0x000001b0 } },
  126725. /* 238 */
  126726. { { 0x35d96872,0xf5e603f2,0x3fa5b8ca,0xab1a23cc,0xe988dc5f,0x5459871b,
  126727. 0xd430c0bd,0xe32e8489,0x764d9cc3,0x7ec269e0,0xf2c0c40d,0xf7238212,
  126728. 0x887b83b4,0x2d946183,0x2f18a411,0x281fa671,0x00000010 },
  126729. { 0x64858b37,0x8028048f,0x357de5d9,0xe0e149af,0x619ebb18,0xb2218791,
  126730. 0x9f2b0ba0,0x210200b3,0x1039cbae,0x5a87eae6,0x39579d1d,0x4efdcddb,
  126731. 0x2788515e,0x1b388eaa,0xc81878aa,0x1a552c3c,0x0000002c } },
  126732. /* 239 */
  126733. { { 0x0ea723dc,0x7ac7f500,0x42b15231,0x0a5f04f4,0xbe885c86,0x63d49445,
  126734. 0xff119702,0x61f9993f,0xc4c58cea,0xc3fba45c,0xb9cd6036,0xe6d151e6,
  126735. 0x57b923bb,0x75a3ab15,0xceb2fd46,0x4ec07c52,0x00000147 },
  126736. { 0xed88239d,0xc46a3d32,0x835ae694,0x0d1b8ae6,0x9feeb2e7,0xf4fde325,
  126737. 0x43bc0bb5,0x223bf71c,0x8f62a705,0x3cd220b7,0x9fe799a5,0x2224860e,
  126738. 0x24ab7f93,0xd8558703,0xb594958b,0x8e0f7330,0x0000010f } },
  126739. /* 240 */
  126740. { { 0x3c67d520,0xaf35c7bb,0x23fca9ec,0xd8f4958b,0x8bbaa808,0x0778f194,
  126741. 0x2135e8ae,0x418c30ce,0xc888eff7,0xcdd8d9a9,0xf73144ab,0x72075df0,
  126742. 0x4506a534,0xb549c895,0x5fbb7fc5,0x4ef38979,0x0000011c },
  126743. { 0x43f5e698,0x3fe2c9ac,0xe38a5e3a,0xce77fcbc,0x3089c2e1,0x6d05c90e,
  126744. 0xac1d5801,0x5a74f3ff,0x381b9d2a,0xaeeda220,0xf5f3960b,0xd958b143,
  126745. 0x0db7abbe,0x65ffd051,0x7a05b718,0x8e97e680,0x000000ce } },
  126746. /* 241 */
  126747. { { 0x8ce86a83,0x2251e61b,0xbf7e7160,0x8604159f,0x48f03377,0xfc127dd7,
  126748. 0x45052242,0x87cb2c37,0x934ea09b,0xbd4950f4,0xc4679441,0x5146c403,
  126749. 0x23ba416a,0xe8ad4710,0xaf638eb1,0x89b81a60,0x000001b3 },
  126750. { 0xe8150c69,0xe699934e,0xe27c14bc,0x74f75908,0x6a0194ff,0x5dc0a891,
  126751. 0x1bd51b76,0x38f49d32,0x18779630,0x6bc3305e,0xfd3b4a68,0xfe2f3fbf,
  126752. 0xd7caf189,0x1409b377,0x9b8f109b,0x029ea13b,0x000001b3 } },
  126753. /* 242 */
  126754. { { 0x25a2fd88,0xef7938d2,0xceba0603,0x890f2f7c,0xd7a6dff4,0x4c3e1c80,
  126755. 0x2883f986,0x00c78f36,0x998e5305,0xed92b592,0x325ddc73,0x018a8f1b,
  126756. 0xd5d3708a,0x6dffd987,0x0d1f28bb,0xdcd3554f,0x00000059 },
  126757. { 0x23a74e7d,0x17c6e41d,0x5db32df6,0x94b61ebe,0x9e7ffa0b,0x3c2fffa7,
  126758. 0x2ebb7a0d,0x473662b7,0x01adf9c3,0xa86415ee,0x54679264,0x1502c326,
  126759. 0x2fa09c57,0x16911349,0x24749086,0x897f34aa,0x00000195 } },
  126760. /* 243 */
  126761. { { 0xabadc253,0x4845d359,0xc797c95e,0xe054b92c,0x9a218212,0x22a9b5bd,
  126762. 0xa52b8827,0x9bb80a5e,0x2e61c676,0xea38e78e,0x08b0f8b3,0xfb274b1a,
  126763. 0xdb9d854c,0xb6aa42e3,0x56012d73,0x8ba22523,0x00000163 },
  126764. { 0x75c8c576,0x7cec0e6f,0xe4bc7dd2,0xabb20e7c,0x69d80726,0x0958a0c8,
  126765. 0x8a023eb7,0xa908c66a,0x76110b15,0xca9f50ea,0x186f61a6,0x668c9994,
  126766. 0x2a0a69d8,0x9ddf22ed,0xbbf8a10f,0xbfee1897,0x000001e0 } },
  126767. /* 244 */
  126768. { { 0x48319e4f,0x26d86818,0x5a586fa0,0x6be6f6b5,0x26713265,0xbef5d886,
  126769. 0x98529cfa,0xac252ac5,0x62b29cfb,0xe7cc45f1,0xa2a6358d,0xee050609,
  126770. 0x2940ac70,0xf7cb9ca4,0xa885b1f0,0xfb44aaec,0x000001ad },
  126771. { 0xe798678e,0x66b7a936,0x99540438,0xca01e103,0x816860b7,0xf2491e37,
  126772. 0xb745d857,0xeeffd483,0xa4705ed6,0x5dbb3628,0xb2a5d0f7,0x57d68d49,
  126773. 0x2389fee3,0xd1a8529a,0x1a7fd686,0xdbbc2549,0x000001ad } },
  126774. /* 245 */
  126775. { { 0x969686a3,0xe10cba20,0xe3c053f5,0x308b1c55,0x26f47102,0x1712b134,
  126776. 0x49033038,0x1f9165b1,0x2d01527b,0x45b72017,0xaa9a34e2,0x6fcf6647,
  126777. 0xb0be35c8,0x51f54b94,0x5a15e382,0xfccb22a5,0x000000e3 },
  126778. { 0x5b4dc0be,0xaa71e4ec,0xdb1cd5c4,0xbb136248,0x046e1007,0xf36bff43,
  126779. 0xda9c99a3,0x5a6806d7,0x8349bc50,0x9cbfc6ee,0xe13e0850,0x26871e73,
  126780. 0x67f448c1,0x5e6aa227,0x2da7baf9,0xba77787c,0x000001b9 } },
  126781. /* 246 */
  126782. { { 0xc5a73375,0x1abe58ee,0x7a8ac438,0x175df69d,0xceca835a,0x2cf3150a,
  126783. 0xf507d30f,0xb87b0609,0xc60b0424,0x9ae53a2b,0x410f90ec,0x4931e182,
  126784. 0xadd689bb,0x452c7d0f,0x47631a8e,0xab453491,0x00000013 },
  126785. { 0x8c84f3af,0xaf2dd856,0x1baae33e,0x829dc092,0x8b96b070,0x46542a85,
  126786. 0xe8a82516,0x42260d40,0x5c35322b,0xb9e5edac,0x39eda0d2,0xbca79560,
  126787. 0xb962b90a,0x86bd07c6,0xb1ec5302,0x2e22dac7,0x0000010a } },
  126788. /* 247 */
  126789. { { 0x239d8f0a,0x665fc09d,0xab8a1021,0x92b2e03c,0x0173477b,0xe4369768,
  126790. 0x8e361604,0xab38ed9f,0x9eb061be,0x79b0091d,0x3e845670,0xcd422654,
  126791. 0x2fe1a2e0,0xa0f77ec7,0x760a030f,0x1d242162,0x00000093 },
  126792. { 0xf8646bc3,0xfa9f834c,0x40ae96f9,0x7df94a52,0x379177d1,0x901c3890,
  126793. 0xffeb66cd,0x9dfd0644,0x77b92465,0x81aec2ec,0xcd981d4f,0x2df3b7f2,
  126794. 0xf377b093,0xc9bc3f69,0xdd859d8b,0xdaef34f3,0x00000125 } },
  126795. /* 248 */
  126796. { { 0xa2c123bc,0xac08451b,0x0818fa54,0xd1e83a68,0x98957b8a,0x56dd5702,
  126797. 0xf0f12f16,0xcc7f2e34,0x0a9fa14d,0x1f6a9c33,0xb2fe782c,0xefc9a2bb,
  126798. 0x709f54dd,0xd319c697,0xd6460a53,0x0b8238cb,0x000001dc },
  126799. { 0x44dfb6f6,0xf6492901,0x6e401d26,0x270d7cb4,0x48537ad8,0x1a70a40e,
  126800. 0x70d8dbd9,0x84d661b5,0xf170d58b,0xca27223a,0x6344e1d2,0xeeb4cf14,
  126801. 0xab9de1fa,0x2255fc95,0xdbdc5ea7,0xcd6e110a,0x000001f8 } },
  126802. /* 249 */
  126803. { { 0x78b8a0a7,0x2a57c6b9,0xe833edea,0x24b4aeb6,0x4bd13fe7,0x9e4617c1,
  126804. 0xfc2e8ee4,0xc4186888,0xfb147eef,0x8d398a49,0x2e662cfb,0xe9f191f1,
  126805. 0x958ba2ec,0x61872289,0x00b8d50d,0xbd6d0f1b,0x0000002d },
  126806. { 0x24c93cc9,0x895cfdfe,0xb9e718e7,0x29ed7780,0x38baf7eb,0x01c8ba58,
  126807. 0x4ddcbf69,0x0225387e,0xa180d6bb,0x64b250bf,0xc947c7c2,0x6d68e548,
  126808. 0x9923f3cd,0x82a7b632,0x2d103cd2,0xb8f03613,0x0000000f } },
  126809. /* 250 */
  126810. { { 0x8cd9d494,0x8198b3f0,0x94f4f9f3,0x9b2065b9,0x3c738fa9,0x7664a220,
  126811. 0xd8d229cb,0x199f4c14,0xc51c54b3,0xddad75c4,0xd213a332,0x9a32ce0b,
  126812. 0x888c7b2f,0xf3a21085,0x5b1ff20a,0x6defa362,0x000000d1 },
  126813. { 0x19a296eb,0x44e00548,0xd1a91313,0x1d94ff15,0xfeaa454f,0xd7dead2b,
  126814. 0x4d40bd7f,0xae65a803,0x1801a4af,0x604f147e,0xa5e0de77,0x983048f9,
  126815. 0xff572ca0,0xa3b19ca5,0x1821d117,0xa237dba7,0x000000e0 } },
  126816. /* 251 */
  126817. { { 0x91630ee8,0xedbabf84,0x05eb5301,0xde6589c2,0xa051f47b,0x9f7d2b2d,
  126818. 0x212bbe81,0xaeaa9f96,0x94292124,0xdced3d5e,0xf4435e5b,0x691f5b89,
  126819. 0x9411f66f,0x19604c33,0x4356f0da,0xb7fc09ca,0x000000e6 },
  126820. { 0xf74f811c,0x1294e413,0xdf8d8ddb,0x1a42d831,0x963418c9,0x27f57217,
  126821. 0x88ebcdec,0x5fde5218,0xea305bc9,0xfdd5e06e,0xac668b61,0xed1e6088,
  126822. 0xeb811861,0x333af016,0x15ddcebc,0x5ecb192d,0x000001c9 } },
  126823. /* 252 */
  126824. { { 0xe0bde442,0x927b37a3,0x66f7a73e,0xe0543fe8,0x8ed10c2e,0xd30d9d20,
  126825. 0xa6617a32,0xaf79c341,0xd1d5cf8b,0xe7367870,0xe3abcf8b,0x02d0dce9,
  126826. 0x772b5e7b,0xfe23d2dd,0x1ffc70c5,0x29fceea0,0x0000010b },
  126827. { 0x62d803ff,0x31bcae4d,0xdbc306a9,0x93ee913f,0xd8c10662,0xaf1de7ab,
  126828. 0xe7a6d658,0xd485782a,0x102f4e06,0x9126592e,0x136fafe6,0x91a3127f,
  126829. 0x88371213,0x46b93440,0xa31e1634,0x53bb4380,0x000000ba } },
  126830. /* 253 */
  126831. { { 0xca5636b0,0x62e517fc,0x6aba15c7,0x4296e021,0x212e7b2d,0x5aa8fd7c,
  126832. 0x5717ad84,0x9517ce6d,0x98b2f357,0xe762b85b,0xdf59b07c,0x42f996b5,
  126833. 0xf37ef6f0,0xf3732abb,0x4542b489,0xa5d145ea,0x0000015d },
  126834. { 0xaa7f6e3f,0x1e77c55e,0xaa4a05bc,0x3f4d99a7,0x45828227,0xa56d7d77,
  126835. 0x77b748fb,0xdb0895fb,0x0629f5d1,0x1c484cce,0x359803fb,0xf5b1c90a,
  126836. 0x1720b8d0,0x43ac4f29,0x72ac13f2,0x8c10bfe8,0x000000e9 } },
  126837. /* 254 */
  126838. { { 0xc06c4fd6,0x9d1c4785,0xd25c2b9d,0xbf4b9025,0xd4982f24,0x04135eb1,
  126839. 0xba4fef2b,0x3ab3edc2,0x98de07ab,0x55a5239f,0x096f4b7d,0xd5fc49ab,
  126840. 0x3844c815,0xc50a2960,0x15676b2b,0xdb1148d0,0x00000047 },
  126841. { 0x10f3bad9,0xc49f9cc5,0x022901d4,0x490888fc,0xc47b44df,0x917a55eb,
  126842. 0xf39f2b68,0x20b2ebc6,0x04e9962a,0x0c58e3af,0x573dd5b7,0x52ab7c1b,
  126843. 0xa329f76c,0x2b54add6,0x82f4ca3b,0x59dad1eb,0x00000108 } },
  126844. /* 255 */
  126845. { { 0xa182d1ad,0x662c4128,0x20916c45,0x7751796e,0xba681647,0xa7704272,
  126846. 0xb92c85c1,0xfac8b0fa,0xaefb2e07,0x207ab2df,0x7861b32d,0xc73530a0,
  126847. 0x88aed145,0x63dbed65,0x0a53a49d,0x547bcdca,0x000000bd },
  126848. { 0x87056b51,0xa7c1382f,0x130f9912,0xc3d91edb,0xd3805b42,0xf7c7de46,
  126849. 0xfd31a995,0x456101eb,0xcd3fb8aa,0x1efd22b4,0x9eb17bce,0xfe391df7,
  126850. 0x616c0c32,0xb4d4c0c6,0x711beef4,0x19f023be,0x00000112 } },
  126851. };
  126852. /* Multiply the base point of P521 by the scalar and return the result.
  126853. * If map is true then convert result to affine coordinates.
  126854. *
  126855. * Stripe implementation.
  126856. * Pre-generated: 2^0, 2^65, ...
  126857. * Pre-generated: products of all combinations of above.
  126858. * 8 doubles and adds (with qz=1)
  126859. *
  126860. * r Resulting point.
  126861. * k Scalar to multiply by.
  126862. * map Indicates whether to convert result to affine.
  126863. * ct Constant time required.
  126864. * heap Heap to use for allocation.
  126865. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  126866. */
  126867. static int sp_521_ecc_mulmod_base_17(sp_point_521* r, const sp_digit* k,
  126868. int map, int ct, void* heap)
  126869. {
  126870. return sp_521_ecc_mulmod_stripe_17(r, &p521_base, p521_table,
  126871. k, map, ct, heap);
  126872. }
  126873. #endif
  126874. /* Multiply the base point of P521 by the scalar and return the result.
  126875. * If map is true then convert result to affine coordinates.
  126876. *
  126877. * km Scalar to multiply by.
  126878. * r Resulting point.
  126879. * map Indicates whether to convert result to affine.
  126880. * heap Heap to use for allocation.
  126881. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  126882. */
  126883. int sp_ecc_mulmod_base_521(const mp_int* km, ecc_point* r, int map, void* heap)
  126884. {
  126885. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  126886. sp_point_521* point = NULL;
  126887. sp_digit* k = NULL;
  126888. #else
  126889. sp_point_521 point[1];
  126890. sp_digit k[17];
  126891. #endif
  126892. int err = MP_OKAY;
  126893. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  126894. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  126895. DYNAMIC_TYPE_ECC);
  126896. if (point == NULL)
  126897. err = MEMORY_E;
  126898. if (err == MP_OKAY) {
  126899. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  126900. DYNAMIC_TYPE_ECC);
  126901. if (k == NULL)
  126902. err = MEMORY_E;
  126903. }
  126904. #endif
  126905. if (err == MP_OKAY) {
  126906. sp_521_from_mp(k, 17, km);
  126907. err = sp_521_ecc_mulmod_base_17(point, k, map, 1, heap);
  126908. }
  126909. if (err == MP_OKAY) {
  126910. err = sp_521_point_to_ecc_point_17(point, r);
  126911. }
  126912. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  126913. if (k != NULL)
  126914. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  126915. if (point != NULL)
  126916. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  126917. #endif
  126918. return err;
  126919. }
  126920. /* Multiply the base point of P521 by the scalar, add point a and return
  126921. * the result. If map is true then convert result to affine coordinates.
  126922. *
  126923. * km Scalar to multiply by.
  126924. * am Point to add to scalar mulitply result.
  126925. * inMont Point to add is in montgomery form.
  126926. * r Resulting point.
  126927. * map Indicates whether to convert result to affine.
  126928. * heap Heap to use for allocation.
  126929. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  126930. */
  126931. int sp_ecc_mulmod_base_add_521(const mp_int* km, const ecc_point* am,
  126932. int inMont, ecc_point* r, int map, void* heap)
  126933. {
  126934. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  126935. sp_point_521* point = NULL;
  126936. sp_digit* k = NULL;
  126937. #else
  126938. sp_point_521 point[2];
  126939. sp_digit k[17 + 17 * 2 * 6];
  126940. #endif
  126941. sp_point_521* addP = NULL;
  126942. sp_digit* tmp = NULL;
  126943. int err = MP_OKAY;
  126944. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  126945. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  126946. DYNAMIC_TYPE_ECC);
  126947. if (point == NULL)
  126948. err = MEMORY_E;
  126949. if (err == MP_OKAY) {
  126950. k = (sp_digit*)XMALLOC(
  126951. sizeof(sp_digit) * (17 + 17 * 2 * 6),
  126952. heap, DYNAMIC_TYPE_ECC);
  126953. if (k == NULL)
  126954. err = MEMORY_E;
  126955. }
  126956. #endif
  126957. if (err == MP_OKAY) {
  126958. addP = point + 1;
  126959. tmp = k + 17;
  126960. sp_521_from_mp(k, 17, km);
  126961. sp_521_point_from_ecc_point_17(addP, am);
  126962. }
  126963. if ((err == MP_OKAY) && (!inMont)) {
  126964. err = sp_521_mod_mul_norm_17(addP->x, addP->x, p521_mod);
  126965. }
  126966. if ((err == MP_OKAY) && (!inMont)) {
  126967. err = sp_521_mod_mul_norm_17(addP->y, addP->y, p521_mod);
  126968. }
  126969. if ((err == MP_OKAY) && (!inMont)) {
  126970. err = sp_521_mod_mul_norm_17(addP->z, addP->z, p521_mod);
  126971. }
  126972. if (err == MP_OKAY) {
  126973. err = sp_521_ecc_mulmod_base_17(point, k, 0, 0, heap);
  126974. }
  126975. if (err == MP_OKAY) {
  126976. sp_521_proj_point_add_17(point, point, addP, tmp);
  126977. if (map) {
  126978. sp_521_map_17(point, point, tmp);
  126979. }
  126980. err = sp_521_point_to_ecc_point_17(point, r);
  126981. }
  126982. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  126983. if (k != NULL)
  126984. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  126985. if (point)
  126986. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  126987. #endif
  126988. return err;
  126989. }
  126990. #if defined(WOLFSSL_VALIDATE_ECC_KEYGEN) || defined(HAVE_ECC_SIGN) || \
  126991. defined(HAVE_ECC_VERIFY)
  126992. #endif /* WOLFSSL_VALIDATE_ECC_KEYGEN | HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  126993. /* Add 1 to a. (a = a + 1)
  126994. *
  126995. * a A single precision integer.
  126996. */
  126997. SP_NOINLINE static void sp_521_add_one_17(sp_digit* a)
  126998. {
  126999. __asm__ __volatile__ (
  127000. "movs r2, #1\n\t"
  127001. "ldr r1, [%[a]]\n\t"
  127002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127003. "adds r1, r1, r2\n\t"
  127004. #else
  127005. "add r1, r1, r2\n\t"
  127006. #endif
  127007. "movs r2, #0\n\t"
  127008. "str r1, [%[a]]\n\t"
  127009. "ldr r1, [%[a], #4]\n\t"
  127010. #ifdef WOLFSSL_KEIL
  127011. "adcs r1, r1, r2\n\t"
  127012. #elif defined(__clang__)
  127013. "adcs r1, r2\n\t"
  127014. #else
  127015. "adc r1, r2\n\t"
  127016. #endif
  127017. "str r1, [%[a], #4]\n\t"
  127018. "ldr r1, [%[a], #8]\n\t"
  127019. #ifdef WOLFSSL_KEIL
  127020. "adcs r1, r1, r2\n\t"
  127021. #elif defined(__clang__)
  127022. "adcs r1, r2\n\t"
  127023. #else
  127024. "adc r1, r2\n\t"
  127025. #endif
  127026. "str r1, [%[a], #8]\n\t"
  127027. "ldr r1, [%[a], #12]\n\t"
  127028. #ifdef WOLFSSL_KEIL
  127029. "adcs r1, r1, r2\n\t"
  127030. #elif defined(__clang__)
  127031. "adcs r1, r2\n\t"
  127032. #else
  127033. "adc r1, r2\n\t"
  127034. #endif
  127035. "str r1, [%[a], #12]\n\t"
  127036. "ldr r1, [%[a], #16]\n\t"
  127037. #ifdef WOLFSSL_KEIL
  127038. "adcs r1, r1, r2\n\t"
  127039. #elif defined(__clang__)
  127040. "adcs r1, r2\n\t"
  127041. #else
  127042. "adc r1, r2\n\t"
  127043. #endif
  127044. "str r1, [%[a], #16]\n\t"
  127045. "ldr r1, [%[a], #20]\n\t"
  127046. #ifdef WOLFSSL_KEIL
  127047. "adcs r1, r1, r2\n\t"
  127048. #elif defined(__clang__)
  127049. "adcs r1, r2\n\t"
  127050. #else
  127051. "adc r1, r2\n\t"
  127052. #endif
  127053. "str r1, [%[a], #20]\n\t"
  127054. "ldr r1, [%[a], #24]\n\t"
  127055. #ifdef WOLFSSL_KEIL
  127056. "adcs r1, r1, r2\n\t"
  127057. #elif defined(__clang__)
  127058. "adcs r1, r2\n\t"
  127059. #else
  127060. "adc r1, r2\n\t"
  127061. #endif
  127062. "str r1, [%[a], #24]\n\t"
  127063. "ldr r1, [%[a], #28]\n\t"
  127064. #ifdef WOLFSSL_KEIL
  127065. "adcs r1, r1, r2\n\t"
  127066. #elif defined(__clang__)
  127067. "adcs r1, r2\n\t"
  127068. #else
  127069. "adc r1, r2\n\t"
  127070. #endif
  127071. "str r1, [%[a], #28]\n\t"
  127072. "ldr r1, [%[a], #32]\n\t"
  127073. #ifdef WOLFSSL_KEIL
  127074. "adcs r1, r1, r2\n\t"
  127075. #elif defined(__clang__)
  127076. "adcs r1, r2\n\t"
  127077. #else
  127078. "adc r1, r2\n\t"
  127079. #endif
  127080. "str r1, [%[a], #32]\n\t"
  127081. "ldr r1, [%[a], #36]\n\t"
  127082. #ifdef WOLFSSL_KEIL
  127083. "adcs r1, r1, r2\n\t"
  127084. #elif defined(__clang__)
  127085. "adcs r1, r2\n\t"
  127086. #else
  127087. "adc r1, r2\n\t"
  127088. #endif
  127089. "str r1, [%[a], #36]\n\t"
  127090. "ldr r1, [%[a], #40]\n\t"
  127091. #ifdef WOLFSSL_KEIL
  127092. "adcs r1, r1, r2\n\t"
  127093. #elif defined(__clang__)
  127094. "adcs r1, r2\n\t"
  127095. #else
  127096. "adc r1, r2\n\t"
  127097. #endif
  127098. "str r1, [%[a], #40]\n\t"
  127099. "ldr r1, [%[a], #44]\n\t"
  127100. #ifdef WOLFSSL_KEIL
  127101. "adcs r1, r1, r2\n\t"
  127102. #elif defined(__clang__)
  127103. "adcs r1, r2\n\t"
  127104. #else
  127105. "adc r1, r2\n\t"
  127106. #endif
  127107. "str r1, [%[a], #44]\n\t"
  127108. "ldr r1, [%[a], #48]\n\t"
  127109. #ifdef WOLFSSL_KEIL
  127110. "adcs r1, r1, r2\n\t"
  127111. #elif defined(__clang__)
  127112. "adcs r1, r2\n\t"
  127113. #else
  127114. "adc r1, r2\n\t"
  127115. #endif
  127116. "str r1, [%[a], #48]\n\t"
  127117. "ldr r1, [%[a], #52]\n\t"
  127118. #ifdef WOLFSSL_KEIL
  127119. "adcs r1, r1, r2\n\t"
  127120. #elif defined(__clang__)
  127121. "adcs r1, r2\n\t"
  127122. #else
  127123. "adc r1, r2\n\t"
  127124. #endif
  127125. "str r1, [%[a], #52]\n\t"
  127126. "ldr r1, [%[a], #56]\n\t"
  127127. #ifdef WOLFSSL_KEIL
  127128. "adcs r1, r1, r2\n\t"
  127129. #elif defined(__clang__)
  127130. "adcs r1, r2\n\t"
  127131. #else
  127132. "adc r1, r2\n\t"
  127133. #endif
  127134. "str r1, [%[a], #56]\n\t"
  127135. "ldr r1, [%[a], #60]\n\t"
  127136. #ifdef WOLFSSL_KEIL
  127137. "adcs r1, r1, r2\n\t"
  127138. #elif defined(__clang__)
  127139. "adcs r1, r2\n\t"
  127140. #else
  127141. "adc r1, r2\n\t"
  127142. #endif
  127143. "str r1, [%[a], #60]\n\t"
  127144. "ldr r1, [%[a], #64]\n\t"
  127145. #ifdef WOLFSSL_KEIL
  127146. "adcs r1, r1, r2\n\t"
  127147. #elif defined(__clang__)
  127148. "adcs r1, r2\n\t"
  127149. #else
  127150. "adc r1, r2\n\t"
  127151. #endif
  127152. "str r1, [%[a], #64]\n\t"
  127153. : [a] "+l" (a)
  127154. :
  127155. : "memory", "r1", "r2"
  127156. );
  127157. }
  127158. /* Read big endian unsigned byte array into r.
  127159. *
  127160. * r A single precision integer.
  127161. * size Maximum number of bytes to convert
  127162. * a Byte array.
  127163. * n Number of bytes in array to read.
  127164. */
  127165. static void sp_521_from_bin(sp_digit* r, int size, const byte* a, int n)
  127166. {
  127167. int i;
  127168. int j;
  127169. byte* d;
  127170. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  127171. r[j] = ((sp_digit)a[i - 0] << 0) |
  127172. ((sp_digit)a[i - 1] << 8) |
  127173. ((sp_digit)a[i - 2] << 16) |
  127174. ((sp_digit)a[i - 3] << 24);
  127175. j++;
  127176. }
  127177. if (i >= 0) {
  127178. r[j] = 0;
  127179. d = (byte*)r;
  127180. switch (i) {
  127181. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  127182. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  127183. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  127184. }
  127185. j++;
  127186. }
  127187. for (; j < size; j++) {
  127188. r[j] = 0;
  127189. }
  127190. }
  127191. /* Generates a scalar that is in the range 1..order-1.
  127192. *
  127193. * rng Random number generator.
  127194. * k Scalar value.
  127195. * returns RNG failures, MEMORY_E when memory allocation fails and
  127196. * MP_OKAY on success.
  127197. */
  127198. static int sp_521_ecc_gen_k_17(WC_RNG* rng, sp_digit* k)
  127199. {
  127200. int err;
  127201. byte buf[66];
  127202. do {
  127203. err = wc_RNG_GenerateBlock(rng, buf, sizeof(buf));
  127204. if (err == 0) {
  127205. buf[0] &= 0x1;
  127206. sp_521_from_bin(k, 17, buf, (int)sizeof(buf));
  127207. if (sp_521_cmp_17(k, p521_order2) <= 0) {
  127208. sp_521_add_one_17(k);
  127209. break;
  127210. }
  127211. }
  127212. }
  127213. while (err == 0);
  127214. return err;
  127215. }
  127216. /* Makes a random EC key pair.
  127217. *
  127218. * rng Random number generator.
  127219. * priv Generated private value.
  127220. * pub Generated public point.
  127221. * heap Heap to use for allocation.
  127222. * returns ECC_INF_E when the point does not have the correct order, RNG
  127223. * failures, MEMORY_E when memory allocation fails and MP_OKAY on success.
  127224. */
  127225. int sp_ecc_make_key_521(WC_RNG* rng, mp_int* priv, ecc_point* pub, void* heap)
  127226. {
  127227. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127228. sp_point_521* point = NULL;
  127229. sp_digit* k = NULL;
  127230. #else
  127231. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127232. sp_point_521 point[2];
  127233. #else
  127234. sp_point_521 point[1];
  127235. #endif
  127236. sp_digit k[17];
  127237. #endif
  127238. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127239. sp_point_521* infinity = NULL;
  127240. #endif
  127241. int err = MP_OKAY;
  127242. (void)heap;
  127243. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127244. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127245. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC);
  127246. #else
  127247. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC);
  127248. #endif
  127249. if (point == NULL)
  127250. err = MEMORY_E;
  127251. if (err == MP_OKAY) {
  127252. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  127253. DYNAMIC_TYPE_ECC);
  127254. if (k == NULL)
  127255. err = MEMORY_E;
  127256. }
  127257. #endif
  127258. if (err == MP_OKAY) {
  127259. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127260. infinity = point + 1;
  127261. #endif
  127262. err = sp_521_ecc_gen_k_17(rng, k);
  127263. }
  127264. if (err == MP_OKAY) {
  127265. err = sp_521_ecc_mulmod_base_17(point, k, 1, 1, NULL);
  127266. }
  127267. #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN
  127268. if (err == MP_OKAY) {
  127269. err = sp_521_ecc_mulmod_17(infinity, point, p521_order, 1, 1, NULL);
  127270. }
  127271. if (err == MP_OKAY) {
  127272. if (sp_521_iszero_17(point->x) || sp_521_iszero_17(point->y)) {
  127273. err = ECC_INF_E;
  127274. }
  127275. }
  127276. #endif
  127277. if (err == MP_OKAY) {
  127278. err = sp_521_to_mp(k, priv);
  127279. }
  127280. if (err == MP_OKAY) {
  127281. err = sp_521_point_to_ecc_point_17(point, pub);
  127282. }
  127283. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127284. if (k != NULL)
  127285. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  127286. if (point != NULL) {
  127287. /* point is not sensitive, so no need to zeroize */
  127288. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  127289. }
  127290. #endif
  127291. return err;
  127292. }
  127293. #ifdef HAVE_ECC_DHE
  127294. /* Write r as big endian to byte array.
  127295. * Fixed length number of bytes written: 66
  127296. *
  127297. * r A single precision integer.
  127298. * a Byte array.
  127299. */
  127300. static void sp_521_to_bin_17(sp_digit* r, byte* a)
  127301. {
  127302. int i;
  127303. int j = 0;
  127304. a[j++] = r[16] >> 8;
  127305. a[j++] = r[16] >> 0;
  127306. for (i = 15; i >= 0; i--) {
  127307. a[j++] = r[i] >> 24;
  127308. a[j++] = r[i] >> 16;
  127309. a[j++] = r[i] >> 8;
  127310. a[j++] = r[i] >> 0;
  127311. }
  127312. }
  127313. /* Multiply the point by the scalar and serialize the X ordinate.
  127314. * The number is 0 padded to maximum size on output.
  127315. *
  127316. * priv Scalar to multiply the point by.
  127317. * pub Point to multiply.
  127318. * out Buffer to hold X ordinate.
  127319. * outLen On entry, size of the buffer in bytes.
  127320. * On exit, length of data in buffer in bytes.
  127321. * heap Heap to use for allocation.
  127322. * returns BUFFER_E if the buffer is to small for output size,
  127323. * MEMORY_E when memory allocation fails and MP_OKAY on success.
  127324. */
  127325. int sp_ecc_secret_gen_521(const mp_int* priv, const ecc_point* pub, byte* out,
  127326. word32* outLen, void* heap)
  127327. {
  127328. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127329. sp_point_521* point = NULL;
  127330. sp_digit* k = NULL;
  127331. #else
  127332. sp_point_521 point[1];
  127333. sp_digit k[17];
  127334. #endif
  127335. int err = MP_OKAY;
  127336. if (*outLen < 65U) {
  127337. err = BUFFER_E;
  127338. }
  127339. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127340. if (err == MP_OKAY) {
  127341. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  127342. DYNAMIC_TYPE_ECC);
  127343. if (point == NULL)
  127344. err = MEMORY_E;
  127345. }
  127346. if (err == MP_OKAY) {
  127347. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  127348. DYNAMIC_TYPE_ECC);
  127349. if (k == NULL)
  127350. err = MEMORY_E;
  127351. }
  127352. #endif
  127353. if (err == MP_OKAY) {
  127354. sp_521_from_mp(k, 17, priv);
  127355. sp_521_point_from_ecc_point_17(point, pub);
  127356. err = sp_521_ecc_mulmod_17(point, point, k, 1, 1, heap);
  127357. }
  127358. if (err == MP_OKAY) {
  127359. sp_521_to_bin_17(point->x, out);
  127360. *outLen = 66;
  127361. }
  127362. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  127363. if (k != NULL)
  127364. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  127365. if (point != NULL)
  127366. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  127367. #endif
  127368. return err;
  127369. }
  127370. #endif /* HAVE_ECC_DHE */
  127371. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  127372. /* Right shift a by n bits into r. (r = a >> n)
  127373. *
  127374. * r A single precision integer.
  127375. * a A single precision integer.
  127376. * n Integer representing number of bits to shift.
  127377. */
  127378. static void sp_521_rshift_17(sp_digit* r, const sp_digit* a, byte n)
  127379. {
  127380. __asm__ __volatile__ (
  127381. "movs r7, #32\n\t"
  127382. #ifdef WOLFSSL_KEIL
  127383. "subs r7, r7, %[n]\n\t"
  127384. #else
  127385. #ifdef __clang__
  127386. "subs r7, r7, %[n]\n\t"
  127387. #else
  127388. "sub r7, r7, %[n]\n\t"
  127389. #endif
  127390. #endif
  127391. "ldr r3, [%[a]]\n\t"
  127392. "ldr r4, [%[a], #4]\n\t"
  127393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127394. "lsrs r3, r3, %[n]\n\t"
  127395. #else
  127396. "lsr r3, r3, %[n]\n\t"
  127397. #endif
  127398. "movs r6, r4\n\t"
  127399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127400. "lsrs r4, r4, %[n]\n\t"
  127401. #else
  127402. "lsr r4, r4, %[n]\n\t"
  127403. #endif
  127404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127405. "lsls r6, r6, r7\n\t"
  127406. #else
  127407. "lsl r6, r6, r7\n\t"
  127408. #endif
  127409. #ifdef WOLFSSL_KEIL
  127410. "orrs r3, r3, r6\n\t"
  127411. #elif defined(__clang__)
  127412. "orrs r3, r6\n\t"
  127413. #else
  127414. "orr r3, r6\n\t"
  127415. #endif
  127416. "ldr r5, [%[a], #8]\n\t"
  127417. "str r3, [%[r]]\n\t"
  127418. "movs r6, r5\n\t"
  127419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127420. "lsrs r5, r5, %[n]\n\t"
  127421. #else
  127422. "lsr r5, r5, %[n]\n\t"
  127423. #endif
  127424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127425. "lsls r6, r6, r7\n\t"
  127426. #else
  127427. "lsl r6, r6, r7\n\t"
  127428. #endif
  127429. #ifdef WOLFSSL_KEIL
  127430. "orrs r4, r4, r6\n\t"
  127431. #elif defined(__clang__)
  127432. "orrs r4, r6\n\t"
  127433. #else
  127434. "orr r4, r6\n\t"
  127435. #endif
  127436. "ldr r3, [%[a], #12]\n\t"
  127437. "str r4, [%[r], #4]\n\t"
  127438. "movs r6, r3\n\t"
  127439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127440. "lsrs r3, r3, %[n]\n\t"
  127441. #else
  127442. "lsr r3, r3, %[n]\n\t"
  127443. #endif
  127444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127445. "lsls r6, r6, r7\n\t"
  127446. #else
  127447. "lsl r6, r6, r7\n\t"
  127448. #endif
  127449. #ifdef WOLFSSL_KEIL
  127450. "orrs r5, r5, r6\n\t"
  127451. #elif defined(__clang__)
  127452. "orrs r5, r6\n\t"
  127453. #else
  127454. "orr r5, r6\n\t"
  127455. #endif
  127456. "ldr r4, [%[a], #16]\n\t"
  127457. "str r5, [%[r], #8]\n\t"
  127458. "movs r6, r4\n\t"
  127459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127460. "lsrs r4, r4, %[n]\n\t"
  127461. #else
  127462. "lsr r4, r4, %[n]\n\t"
  127463. #endif
  127464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127465. "lsls r6, r6, r7\n\t"
  127466. #else
  127467. "lsl r6, r6, r7\n\t"
  127468. #endif
  127469. #ifdef WOLFSSL_KEIL
  127470. "orrs r3, r3, r6\n\t"
  127471. #elif defined(__clang__)
  127472. "orrs r3, r6\n\t"
  127473. #else
  127474. "orr r3, r6\n\t"
  127475. #endif
  127476. "ldr r5, [%[a], #20]\n\t"
  127477. "str r3, [%[r], #12]\n\t"
  127478. "movs r6, r5\n\t"
  127479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127480. "lsrs r5, r5, %[n]\n\t"
  127481. #else
  127482. "lsr r5, r5, %[n]\n\t"
  127483. #endif
  127484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127485. "lsls r6, r6, r7\n\t"
  127486. #else
  127487. "lsl r6, r6, r7\n\t"
  127488. #endif
  127489. #ifdef WOLFSSL_KEIL
  127490. "orrs r4, r4, r6\n\t"
  127491. #elif defined(__clang__)
  127492. "orrs r4, r6\n\t"
  127493. #else
  127494. "orr r4, r6\n\t"
  127495. #endif
  127496. "ldr r3, [%[a], #24]\n\t"
  127497. "str r4, [%[r], #16]\n\t"
  127498. "movs r6, r3\n\t"
  127499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127500. "lsrs r3, r3, %[n]\n\t"
  127501. #else
  127502. "lsr r3, r3, %[n]\n\t"
  127503. #endif
  127504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127505. "lsls r6, r6, r7\n\t"
  127506. #else
  127507. "lsl r6, r6, r7\n\t"
  127508. #endif
  127509. #ifdef WOLFSSL_KEIL
  127510. "orrs r5, r5, r6\n\t"
  127511. #elif defined(__clang__)
  127512. "orrs r5, r6\n\t"
  127513. #else
  127514. "orr r5, r6\n\t"
  127515. #endif
  127516. "ldr r4, [%[a], #28]\n\t"
  127517. "str r5, [%[r], #20]\n\t"
  127518. "movs r6, r4\n\t"
  127519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127520. "lsrs r4, r4, %[n]\n\t"
  127521. #else
  127522. "lsr r4, r4, %[n]\n\t"
  127523. #endif
  127524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127525. "lsls r6, r6, r7\n\t"
  127526. #else
  127527. "lsl r6, r6, r7\n\t"
  127528. #endif
  127529. #ifdef WOLFSSL_KEIL
  127530. "orrs r3, r3, r6\n\t"
  127531. #elif defined(__clang__)
  127532. "orrs r3, r6\n\t"
  127533. #else
  127534. "orr r3, r6\n\t"
  127535. #endif
  127536. "ldr r5, [%[a], #32]\n\t"
  127537. "str r3, [%[r], #24]\n\t"
  127538. "movs r6, r5\n\t"
  127539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127540. "lsrs r5, r5, %[n]\n\t"
  127541. #else
  127542. "lsr r5, r5, %[n]\n\t"
  127543. #endif
  127544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127545. "lsls r6, r6, r7\n\t"
  127546. #else
  127547. "lsl r6, r6, r7\n\t"
  127548. #endif
  127549. #ifdef WOLFSSL_KEIL
  127550. "orrs r4, r4, r6\n\t"
  127551. #elif defined(__clang__)
  127552. "orrs r4, r6\n\t"
  127553. #else
  127554. "orr r4, r6\n\t"
  127555. #endif
  127556. "ldr r3, [%[a], #36]\n\t"
  127557. "str r4, [%[r], #28]\n\t"
  127558. "movs r6, r3\n\t"
  127559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127560. "lsrs r3, r3, %[n]\n\t"
  127561. #else
  127562. "lsr r3, r3, %[n]\n\t"
  127563. #endif
  127564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127565. "lsls r6, r6, r7\n\t"
  127566. #else
  127567. "lsl r6, r6, r7\n\t"
  127568. #endif
  127569. #ifdef WOLFSSL_KEIL
  127570. "orrs r5, r5, r6\n\t"
  127571. #elif defined(__clang__)
  127572. "orrs r5, r6\n\t"
  127573. #else
  127574. "orr r5, r6\n\t"
  127575. #endif
  127576. "ldr r4, [%[a], #40]\n\t"
  127577. "str r5, [%[r], #32]\n\t"
  127578. "movs r6, r4\n\t"
  127579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127580. "lsrs r4, r4, %[n]\n\t"
  127581. #else
  127582. "lsr r4, r4, %[n]\n\t"
  127583. #endif
  127584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127585. "lsls r6, r6, r7\n\t"
  127586. #else
  127587. "lsl r6, r6, r7\n\t"
  127588. #endif
  127589. #ifdef WOLFSSL_KEIL
  127590. "orrs r3, r3, r6\n\t"
  127591. #elif defined(__clang__)
  127592. "orrs r3, r6\n\t"
  127593. #else
  127594. "orr r3, r6\n\t"
  127595. #endif
  127596. "ldr r5, [%[a], #44]\n\t"
  127597. "str r3, [%[r], #36]\n\t"
  127598. "movs r6, r5\n\t"
  127599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127600. "lsrs r5, r5, %[n]\n\t"
  127601. #else
  127602. "lsr r5, r5, %[n]\n\t"
  127603. #endif
  127604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127605. "lsls r6, r6, r7\n\t"
  127606. #else
  127607. "lsl r6, r6, r7\n\t"
  127608. #endif
  127609. #ifdef WOLFSSL_KEIL
  127610. "orrs r4, r4, r6\n\t"
  127611. #elif defined(__clang__)
  127612. "orrs r4, r6\n\t"
  127613. #else
  127614. "orr r4, r6\n\t"
  127615. #endif
  127616. "ldr r3, [%[a], #48]\n\t"
  127617. "str r4, [%[r], #40]\n\t"
  127618. "movs r6, r3\n\t"
  127619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127620. "lsrs r3, r3, %[n]\n\t"
  127621. #else
  127622. "lsr r3, r3, %[n]\n\t"
  127623. #endif
  127624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127625. "lsls r6, r6, r7\n\t"
  127626. #else
  127627. "lsl r6, r6, r7\n\t"
  127628. #endif
  127629. #ifdef WOLFSSL_KEIL
  127630. "orrs r5, r5, r6\n\t"
  127631. #elif defined(__clang__)
  127632. "orrs r5, r6\n\t"
  127633. #else
  127634. "orr r5, r6\n\t"
  127635. #endif
  127636. "ldr r4, [%[a], #52]\n\t"
  127637. "str r5, [%[r], #44]\n\t"
  127638. "movs r6, r4\n\t"
  127639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127640. "lsrs r4, r4, %[n]\n\t"
  127641. #else
  127642. "lsr r4, r4, %[n]\n\t"
  127643. #endif
  127644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127645. "lsls r6, r6, r7\n\t"
  127646. #else
  127647. "lsl r6, r6, r7\n\t"
  127648. #endif
  127649. #ifdef WOLFSSL_KEIL
  127650. "orrs r3, r3, r6\n\t"
  127651. #elif defined(__clang__)
  127652. "orrs r3, r6\n\t"
  127653. #else
  127654. "orr r3, r6\n\t"
  127655. #endif
  127656. "ldr r5, [%[a], #56]\n\t"
  127657. "str r3, [%[r], #48]\n\t"
  127658. "movs r6, r5\n\t"
  127659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127660. "lsrs r5, r5, %[n]\n\t"
  127661. #else
  127662. "lsr r5, r5, %[n]\n\t"
  127663. #endif
  127664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127665. "lsls r6, r6, r7\n\t"
  127666. #else
  127667. "lsl r6, r6, r7\n\t"
  127668. #endif
  127669. #ifdef WOLFSSL_KEIL
  127670. "orrs r4, r4, r6\n\t"
  127671. #elif defined(__clang__)
  127672. "orrs r4, r6\n\t"
  127673. #else
  127674. "orr r4, r6\n\t"
  127675. #endif
  127676. "ldr r3, [%[a], #60]\n\t"
  127677. "str r4, [%[r], #52]\n\t"
  127678. "movs r6, r3\n\t"
  127679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127680. "lsrs r3, r3, %[n]\n\t"
  127681. #else
  127682. "lsr r3, r3, %[n]\n\t"
  127683. #endif
  127684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127685. "lsls r6, r6, r7\n\t"
  127686. #else
  127687. "lsl r6, r6, r7\n\t"
  127688. #endif
  127689. #ifdef WOLFSSL_KEIL
  127690. "orrs r5, r5, r6\n\t"
  127691. #elif defined(__clang__)
  127692. "orrs r5, r6\n\t"
  127693. #else
  127694. "orr r5, r6\n\t"
  127695. #endif
  127696. "ldr r4, [%[a], #64]\n\t"
  127697. "str r5, [%[r], #56]\n\t"
  127698. "movs r6, r4\n\t"
  127699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127700. "lsrs r4, r4, %[n]\n\t"
  127701. #else
  127702. "lsr r4, r4, %[n]\n\t"
  127703. #endif
  127704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127705. "lsls r6, r6, r7\n\t"
  127706. #else
  127707. "lsl r6, r6, r7\n\t"
  127708. #endif
  127709. #ifdef WOLFSSL_KEIL
  127710. "orrs r3, r3, r6\n\t"
  127711. #elif defined(__clang__)
  127712. "orrs r3, r6\n\t"
  127713. #else
  127714. "orr r3, r6\n\t"
  127715. #endif
  127716. "str r3, [%[r], #60]\n\t"
  127717. "str r4, [%[r], #64]\n\t"
  127718. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  127719. :
  127720. : "memory", "r3", "r4", "r5", "r6", "r7"
  127721. );
  127722. }
  127723. #endif
  127724. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  127725. #endif
  127726. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  127727. /* Lefy shift a by n bits into r. (r = a << n)
  127728. *
  127729. * r A single precision integer.
  127730. * a A single precision integer.
  127731. * n Integer representing number of bits to shift.
  127732. */
  127733. static void sp_521_lshift_17(sp_digit* r, const sp_digit* a, byte n)
  127734. {
  127735. __asm__ __volatile__ (
  127736. "movs r7, #31\n\t"
  127737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127738. "subs r7, r7, %[n]\n\t"
  127739. #else
  127740. "sub r7, r7, %[n]\n\t"
  127741. #endif
  127742. "ldr r4, [%[a], #64]\n\t"
  127743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127744. "lsrs r5, r4, #1\n\t"
  127745. #else
  127746. "lsr r5, r4, #1\n\t"
  127747. #endif
  127748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127749. "lsls r4, r4, %[n]\n\t"
  127750. #else
  127751. "lsl r4, r4, %[n]\n\t"
  127752. #endif
  127753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127754. "lsrs r5, r5, r7\n\t"
  127755. #else
  127756. "lsr r5, r5, r7\n\t"
  127757. #endif
  127758. "ldr r3, [%[a], #60]\n\t"
  127759. "str r5, [%[r], #68]\n\t"
  127760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127761. "lsrs r6, r3, #1\n\t"
  127762. #else
  127763. "lsr r6, r3, #1\n\t"
  127764. #endif
  127765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127766. "lsls r3, r3, %[n]\n\t"
  127767. #else
  127768. "lsl r3, r3, %[n]\n\t"
  127769. #endif
  127770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127771. "lsrs r6, r6, r7\n\t"
  127772. #else
  127773. "lsr r6, r6, r7\n\t"
  127774. #endif
  127775. #ifdef WOLFSSL_KEIL
  127776. "orrs r4, r4, r6\n\t"
  127777. #elif defined(__clang__)
  127778. "orrs r4, r6\n\t"
  127779. #else
  127780. "orr r4, r6\n\t"
  127781. #endif
  127782. "ldr r5, [%[a], #56]\n\t"
  127783. "str r4, [%[r], #64]\n\t"
  127784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127785. "lsrs r6, r5, #1\n\t"
  127786. #else
  127787. "lsr r6, r5, #1\n\t"
  127788. #endif
  127789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127790. "lsls r5, r5, %[n]\n\t"
  127791. #else
  127792. "lsl r5, r5, %[n]\n\t"
  127793. #endif
  127794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127795. "lsrs r6, r6, r7\n\t"
  127796. #else
  127797. "lsr r6, r6, r7\n\t"
  127798. #endif
  127799. #ifdef WOLFSSL_KEIL
  127800. "orrs r3, r3, r6\n\t"
  127801. #elif defined(__clang__)
  127802. "orrs r3, r6\n\t"
  127803. #else
  127804. "orr r3, r6\n\t"
  127805. #endif
  127806. "ldr r4, [%[a], #52]\n\t"
  127807. "str r3, [%[r], #60]\n\t"
  127808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127809. "lsrs r6, r4, #1\n\t"
  127810. #else
  127811. "lsr r6, r4, #1\n\t"
  127812. #endif
  127813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127814. "lsls r4, r4, %[n]\n\t"
  127815. #else
  127816. "lsl r4, r4, %[n]\n\t"
  127817. #endif
  127818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127819. "lsrs r6, r6, r7\n\t"
  127820. #else
  127821. "lsr r6, r6, r7\n\t"
  127822. #endif
  127823. #ifdef WOLFSSL_KEIL
  127824. "orrs r5, r5, r6\n\t"
  127825. #elif defined(__clang__)
  127826. "orrs r5, r6\n\t"
  127827. #else
  127828. "orr r5, r6\n\t"
  127829. #endif
  127830. "ldr r3, [%[a], #48]\n\t"
  127831. "str r5, [%[r], #56]\n\t"
  127832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127833. "lsrs r6, r3, #1\n\t"
  127834. #else
  127835. "lsr r6, r3, #1\n\t"
  127836. #endif
  127837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127838. "lsls r3, r3, %[n]\n\t"
  127839. #else
  127840. "lsl r3, r3, %[n]\n\t"
  127841. #endif
  127842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127843. "lsrs r6, r6, r7\n\t"
  127844. #else
  127845. "lsr r6, r6, r7\n\t"
  127846. #endif
  127847. #ifdef WOLFSSL_KEIL
  127848. "orrs r4, r4, r6\n\t"
  127849. #elif defined(__clang__)
  127850. "orrs r4, r6\n\t"
  127851. #else
  127852. "orr r4, r6\n\t"
  127853. #endif
  127854. "ldr r5, [%[a], #44]\n\t"
  127855. "str r4, [%[r], #52]\n\t"
  127856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127857. "lsrs r6, r5, #1\n\t"
  127858. #else
  127859. "lsr r6, r5, #1\n\t"
  127860. #endif
  127861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127862. "lsls r5, r5, %[n]\n\t"
  127863. #else
  127864. "lsl r5, r5, %[n]\n\t"
  127865. #endif
  127866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127867. "lsrs r6, r6, r7\n\t"
  127868. #else
  127869. "lsr r6, r6, r7\n\t"
  127870. #endif
  127871. #ifdef WOLFSSL_KEIL
  127872. "orrs r3, r3, r6\n\t"
  127873. #elif defined(__clang__)
  127874. "orrs r3, r6\n\t"
  127875. #else
  127876. "orr r3, r6\n\t"
  127877. #endif
  127878. "ldr r4, [%[a], #40]\n\t"
  127879. "str r3, [%[r], #48]\n\t"
  127880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127881. "lsrs r6, r4, #1\n\t"
  127882. #else
  127883. "lsr r6, r4, #1\n\t"
  127884. #endif
  127885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127886. "lsls r4, r4, %[n]\n\t"
  127887. #else
  127888. "lsl r4, r4, %[n]\n\t"
  127889. #endif
  127890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127891. "lsrs r6, r6, r7\n\t"
  127892. #else
  127893. "lsr r6, r6, r7\n\t"
  127894. #endif
  127895. #ifdef WOLFSSL_KEIL
  127896. "orrs r5, r5, r6\n\t"
  127897. #elif defined(__clang__)
  127898. "orrs r5, r6\n\t"
  127899. #else
  127900. "orr r5, r6\n\t"
  127901. #endif
  127902. "ldr r3, [%[a], #36]\n\t"
  127903. "str r5, [%[r], #44]\n\t"
  127904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127905. "lsrs r6, r3, #1\n\t"
  127906. #else
  127907. "lsr r6, r3, #1\n\t"
  127908. #endif
  127909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127910. "lsls r3, r3, %[n]\n\t"
  127911. #else
  127912. "lsl r3, r3, %[n]\n\t"
  127913. #endif
  127914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127915. "lsrs r6, r6, r7\n\t"
  127916. #else
  127917. "lsr r6, r6, r7\n\t"
  127918. #endif
  127919. #ifdef WOLFSSL_KEIL
  127920. "orrs r4, r4, r6\n\t"
  127921. #elif defined(__clang__)
  127922. "orrs r4, r6\n\t"
  127923. #else
  127924. "orr r4, r6\n\t"
  127925. #endif
  127926. "ldr r5, [%[a], #32]\n\t"
  127927. "str r4, [%[r], #40]\n\t"
  127928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127929. "lsrs r6, r5, #1\n\t"
  127930. #else
  127931. "lsr r6, r5, #1\n\t"
  127932. #endif
  127933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127934. "lsls r5, r5, %[n]\n\t"
  127935. #else
  127936. "lsl r5, r5, %[n]\n\t"
  127937. #endif
  127938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127939. "lsrs r6, r6, r7\n\t"
  127940. #else
  127941. "lsr r6, r6, r7\n\t"
  127942. #endif
  127943. #ifdef WOLFSSL_KEIL
  127944. "orrs r3, r3, r6\n\t"
  127945. #elif defined(__clang__)
  127946. "orrs r3, r6\n\t"
  127947. #else
  127948. "orr r3, r6\n\t"
  127949. #endif
  127950. "ldr r4, [%[a], #28]\n\t"
  127951. "str r3, [%[r], #36]\n\t"
  127952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127953. "lsrs r6, r4, #1\n\t"
  127954. #else
  127955. "lsr r6, r4, #1\n\t"
  127956. #endif
  127957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127958. "lsls r4, r4, %[n]\n\t"
  127959. #else
  127960. "lsl r4, r4, %[n]\n\t"
  127961. #endif
  127962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127963. "lsrs r6, r6, r7\n\t"
  127964. #else
  127965. "lsr r6, r6, r7\n\t"
  127966. #endif
  127967. #ifdef WOLFSSL_KEIL
  127968. "orrs r5, r5, r6\n\t"
  127969. #elif defined(__clang__)
  127970. "orrs r5, r6\n\t"
  127971. #else
  127972. "orr r5, r6\n\t"
  127973. #endif
  127974. "ldr r3, [%[a], #24]\n\t"
  127975. "str r5, [%[r], #32]\n\t"
  127976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127977. "lsrs r6, r3, #1\n\t"
  127978. #else
  127979. "lsr r6, r3, #1\n\t"
  127980. #endif
  127981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127982. "lsls r3, r3, %[n]\n\t"
  127983. #else
  127984. "lsl r3, r3, %[n]\n\t"
  127985. #endif
  127986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  127987. "lsrs r6, r6, r7\n\t"
  127988. #else
  127989. "lsr r6, r6, r7\n\t"
  127990. #endif
  127991. #ifdef WOLFSSL_KEIL
  127992. "orrs r4, r4, r6\n\t"
  127993. #elif defined(__clang__)
  127994. "orrs r4, r6\n\t"
  127995. #else
  127996. "orr r4, r6\n\t"
  127997. #endif
  127998. "ldr r5, [%[a], #20]\n\t"
  127999. "str r4, [%[r], #28]\n\t"
  128000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128001. "lsrs r6, r5, #1\n\t"
  128002. #else
  128003. "lsr r6, r5, #1\n\t"
  128004. #endif
  128005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128006. "lsls r5, r5, %[n]\n\t"
  128007. #else
  128008. "lsl r5, r5, %[n]\n\t"
  128009. #endif
  128010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128011. "lsrs r6, r6, r7\n\t"
  128012. #else
  128013. "lsr r6, r6, r7\n\t"
  128014. #endif
  128015. #ifdef WOLFSSL_KEIL
  128016. "orrs r3, r3, r6\n\t"
  128017. #elif defined(__clang__)
  128018. "orrs r3, r6\n\t"
  128019. #else
  128020. "orr r3, r6\n\t"
  128021. #endif
  128022. "ldr r4, [%[a], #16]\n\t"
  128023. "str r3, [%[r], #24]\n\t"
  128024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128025. "lsrs r6, r4, #1\n\t"
  128026. #else
  128027. "lsr r6, r4, #1\n\t"
  128028. #endif
  128029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128030. "lsls r4, r4, %[n]\n\t"
  128031. #else
  128032. "lsl r4, r4, %[n]\n\t"
  128033. #endif
  128034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128035. "lsrs r6, r6, r7\n\t"
  128036. #else
  128037. "lsr r6, r6, r7\n\t"
  128038. #endif
  128039. #ifdef WOLFSSL_KEIL
  128040. "orrs r5, r5, r6\n\t"
  128041. #elif defined(__clang__)
  128042. "orrs r5, r6\n\t"
  128043. #else
  128044. "orr r5, r6\n\t"
  128045. #endif
  128046. "ldr r3, [%[a], #12]\n\t"
  128047. "str r5, [%[r], #20]\n\t"
  128048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128049. "lsrs r6, r3, #1\n\t"
  128050. #else
  128051. "lsr r6, r3, #1\n\t"
  128052. #endif
  128053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128054. "lsls r3, r3, %[n]\n\t"
  128055. #else
  128056. "lsl r3, r3, %[n]\n\t"
  128057. #endif
  128058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128059. "lsrs r6, r6, r7\n\t"
  128060. #else
  128061. "lsr r6, r6, r7\n\t"
  128062. #endif
  128063. #ifdef WOLFSSL_KEIL
  128064. "orrs r4, r4, r6\n\t"
  128065. #elif defined(__clang__)
  128066. "orrs r4, r6\n\t"
  128067. #else
  128068. "orr r4, r6\n\t"
  128069. #endif
  128070. "ldr r5, [%[a], #8]\n\t"
  128071. "str r4, [%[r], #16]\n\t"
  128072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128073. "lsrs r6, r5, #1\n\t"
  128074. #else
  128075. "lsr r6, r5, #1\n\t"
  128076. #endif
  128077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128078. "lsls r5, r5, %[n]\n\t"
  128079. #else
  128080. "lsl r5, r5, %[n]\n\t"
  128081. #endif
  128082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128083. "lsrs r6, r6, r7\n\t"
  128084. #else
  128085. "lsr r6, r6, r7\n\t"
  128086. #endif
  128087. #ifdef WOLFSSL_KEIL
  128088. "orrs r3, r3, r6\n\t"
  128089. #elif defined(__clang__)
  128090. "orrs r3, r6\n\t"
  128091. #else
  128092. "orr r3, r6\n\t"
  128093. #endif
  128094. "ldr r4, [%[a], #4]\n\t"
  128095. "str r3, [%[r], #12]\n\t"
  128096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128097. "lsrs r6, r4, #1\n\t"
  128098. #else
  128099. "lsr r6, r4, #1\n\t"
  128100. #endif
  128101. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128102. "lsls r4, r4, %[n]\n\t"
  128103. #else
  128104. "lsl r4, r4, %[n]\n\t"
  128105. #endif
  128106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128107. "lsrs r6, r6, r7\n\t"
  128108. #else
  128109. "lsr r6, r6, r7\n\t"
  128110. #endif
  128111. #ifdef WOLFSSL_KEIL
  128112. "orrs r5, r5, r6\n\t"
  128113. #elif defined(__clang__)
  128114. "orrs r5, r6\n\t"
  128115. #else
  128116. "orr r5, r6\n\t"
  128117. #endif
  128118. "ldr r3, [%[a]]\n\t"
  128119. "str r5, [%[r], #8]\n\t"
  128120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128121. "lsrs r6, r3, #1\n\t"
  128122. #else
  128123. "lsr r6, r3, #1\n\t"
  128124. #endif
  128125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128126. "lsls r3, r3, %[n]\n\t"
  128127. #else
  128128. "lsl r3, r3, %[n]\n\t"
  128129. #endif
  128130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128131. "lsrs r6, r6, r7\n\t"
  128132. #else
  128133. "lsr r6, r6, r7\n\t"
  128134. #endif
  128135. #ifdef WOLFSSL_KEIL
  128136. "orrs r4, r4, r6\n\t"
  128137. #elif defined(__clang__)
  128138. "orrs r4, r6\n\t"
  128139. #else
  128140. "orr r4, r6\n\t"
  128141. #endif
  128142. "str r3, [%[r]]\n\t"
  128143. "str r4, [%[r], #4]\n\t"
  128144. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  128145. :
  128146. : "memory", "r3", "r4", "r5", "r6", "r7"
  128147. );
  128148. }
  128149. /* Lefy shift a by n bits into r. (r = a << n)
  128150. *
  128151. * r A single precision integer.
  128152. * a A single precision integer.
  128153. * n Integer representing number of bits to shift.
  128154. */
  128155. static void sp_521_lshift_34(sp_digit* r, const sp_digit* a, byte n)
  128156. {
  128157. __asm__ __volatile__ (
  128158. "movs r7, #31\n\t"
  128159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128160. "subs r7, r7, %[n]\n\t"
  128161. #else
  128162. "sub r7, r7, %[n]\n\t"
  128163. #endif
  128164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128165. "adds %[a], %[a], #0x80\n\t"
  128166. #else
  128167. "add %[a], %[a], #0x80\n\t"
  128168. #endif
  128169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128170. "adds %[r], %[r], #0x80\n\t"
  128171. #else
  128172. "add %[r], %[r], #0x80\n\t"
  128173. #endif
  128174. "ldr r4, [%[a], #4]\n\t"
  128175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128176. "lsrs r5, r4, #1\n\t"
  128177. #else
  128178. "lsr r5, 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 r5, r5, r7\n\t"
  128187. #else
  128188. "lsr r5, r5, r7\n\t"
  128189. #endif
  128190. "ldr r3, [%[a]]\n\t"
  128191. "str r5, [%[r], #8]\n\t"
  128192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128193. "lsrs r6, r3, #1\n\t"
  128194. #else
  128195. "lsr r6, r3, #1\n\t"
  128196. #endif
  128197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128198. "lsls r3, r3, %[n]\n\t"
  128199. #else
  128200. "lsl r3, r3, %[n]\n\t"
  128201. #endif
  128202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128203. "lsrs r6, r6, r7\n\t"
  128204. #else
  128205. "lsr r6, r6, r7\n\t"
  128206. #endif
  128207. #ifdef WOLFSSL_KEIL
  128208. "orrs r4, r4, r6\n\t"
  128209. #elif defined(__clang__)
  128210. "orrs r4, r6\n\t"
  128211. #else
  128212. "orr r4, r6\n\t"
  128213. #endif
  128214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128215. "subs %[a], %[a], #0x40\n\t"
  128216. #else
  128217. "sub %[a], %[a], #0x40\n\t"
  128218. #endif
  128219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128220. "subs %[r], %[r], #0x40\n\t"
  128221. #else
  128222. "sub %[r], %[r], #0x40\n\t"
  128223. #endif
  128224. "ldr r5, [%[a], #60]\n\t"
  128225. "str r4, [%[r], #68]\n\t"
  128226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128227. "lsrs r6, r5, #1\n\t"
  128228. #else
  128229. "lsr r6, r5, #1\n\t"
  128230. #endif
  128231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128232. "lsls r5, r5, %[n]\n\t"
  128233. #else
  128234. "lsl r5, r5, %[n]\n\t"
  128235. #endif
  128236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128237. "lsrs r6, r6, r7\n\t"
  128238. #else
  128239. "lsr r6, r6, r7\n\t"
  128240. #endif
  128241. #ifdef WOLFSSL_KEIL
  128242. "orrs r3, r3, r6\n\t"
  128243. #elif defined(__clang__)
  128244. "orrs r3, r6\n\t"
  128245. #else
  128246. "orr r3, r6\n\t"
  128247. #endif
  128248. "ldr r4, [%[a], #56]\n\t"
  128249. "str r3, [%[r], #64]\n\t"
  128250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128251. "lsrs r6, r4, #1\n\t"
  128252. #else
  128253. "lsr r6, r4, #1\n\t"
  128254. #endif
  128255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128256. "lsls r4, r4, %[n]\n\t"
  128257. #else
  128258. "lsl r4, r4, %[n]\n\t"
  128259. #endif
  128260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128261. "lsrs r6, r6, r7\n\t"
  128262. #else
  128263. "lsr r6, r6, r7\n\t"
  128264. #endif
  128265. #ifdef WOLFSSL_KEIL
  128266. "orrs r5, r5, r6\n\t"
  128267. #elif defined(__clang__)
  128268. "orrs r5, r6\n\t"
  128269. #else
  128270. "orr r5, r6\n\t"
  128271. #endif
  128272. "ldr r3, [%[a], #52]\n\t"
  128273. "str r5, [%[r], #60]\n\t"
  128274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128275. "lsrs r6, r3, #1\n\t"
  128276. #else
  128277. "lsr r6, r3, #1\n\t"
  128278. #endif
  128279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128280. "lsls r3, r3, %[n]\n\t"
  128281. #else
  128282. "lsl r3, r3, %[n]\n\t"
  128283. #endif
  128284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128285. "lsrs r6, r6, r7\n\t"
  128286. #else
  128287. "lsr r6, r6, r7\n\t"
  128288. #endif
  128289. #ifdef WOLFSSL_KEIL
  128290. "orrs r4, r4, r6\n\t"
  128291. #elif defined(__clang__)
  128292. "orrs r4, r6\n\t"
  128293. #else
  128294. "orr r4, r6\n\t"
  128295. #endif
  128296. "ldr r5, [%[a], #48]\n\t"
  128297. "str r4, [%[r], #56]\n\t"
  128298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128299. "lsrs r6, r5, #1\n\t"
  128300. #else
  128301. "lsr r6, r5, #1\n\t"
  128302. #endif
  128303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128304. "lsls r5, r5, %[n]\n\t"
  128305. #else
  128306. "lsl r5, r5, %[n]\n\t"
  128307. #endif
  128308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128309. "lsrs r6, r6, r7\n\t"
  128310. #else
  128311. "lsr r6, r6, r7\n\t"
  128312. #endif
  128313. #ifdef WOLFSSL_KEIL
  128314. "orrs r3, r3, r6\n\t"
  128315. #elif defined(__clang__)
  128316. "orrs r3, r6\n\t"
  128317. #else
  128318. "orr r3, r6\n\t"
  128319. #endif
  128320. "ldr r4, [%[a], #44]\n\t"
  128321. "str r3, [%[r], #52]\n\t"
  128322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128323. "lsrs r6, r4, #1\n\t"
  128324. #else
  128325. "lsr r6, r4, #1\n\t"
  128326. #endif
  128327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128328. "lsls r4, r4, %[n]\n\t"
  128329. #else
  128330. "lsl r4, r4, %[n]\n\t"
  128331. #endif
  128332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128333. "lsrs r6, r6, r7\n\t"
  128334. #else
  128335. "lsr r6, r6, r7\n\t"
  128336. #endif
  128337. #ifdef WOLFSSL_KEIL
  128338. "orrs r5, r5, r6\n\t"
  128339. #elif defined(__clang__)
  128340. "orrs r5, r6\n\t"
  128341. #else
  128342. "orr r5, r6\n\t"
  128343. #endif
  128344. "ldr r3, [%[a], #40]\n\t"
  128345. "str r5, [%[r], #48]\n\t"
  128346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128347. "lsrs r6, r3, #1\n\t"
  128348. #else
  128349. "lsr r6, r3, #1\n\t"
  128350. #endif
  128351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128352. "lsls r3, r3, %[n]\n\t"
  128353. #else
  128354. "lsl r3, r3, %[n]\n\t"
  128355. #endif
  128356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128357. "lsrs r6, r6, r7\n\t"
  128358. #else
  128359. "lsr r6, r6, r7\n\t"
  128360. #endif
  128361. #ifdef WOLFSSL_KEIL
  128362. "orrs r4, r4, r6\n\t"
  128363. #elif defined(__clang__)
  128364. "orrs r4, r6\n\t"
  128365. #else
  128366. "orr r4, r6\n\t"
  128367. #endif
  128368. "ldr r5, [%[a], #36]\n\t"
  128369. "str r4, [%[r], #44]\n\t"
  128370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128371. "lsrs r6, r5, #1\n\t"
  128372. #else
  128373. "lsr r6, r5, #1\n\t"
  128374. #endif
  128375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128376. "lsls r5, r5, %[n]\n\t"
  128377. #else
  128378. "lsl r5, r5, %[n]\n\t"
  128379. #endif
  128380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128381. "lsrs r6, r6, r7\n\t"
  128382. #else
  128383. "lsr r6, r6, r7\n\t"
  128384. #endif
  128385. #ifdef WOLFSSL_KEIL
  128386. "orrs r3, r3, r6\n\t"
  128387. #elif defined(__clang__)
  128388. "orrs r3, r6\n\t"
  128389. #else
  128390. "orr r3, r6\n\t"
  128391. #endif
  128392. "ldr r4, [%[a], #32]\n\t"
  128393. "str r3, [%[r], #40]\n\t"
  128394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128395. "lsrs r6, r4, #1\n\t"
  128396. #else
  128397. "lsr r6, r4, #1\n\t"
  128398. #endif
  128399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128400. "lsls r4, r4, %[n]\n\t"
  128401. #else
  128402. "lsl r4, r4, %[n]\n\t"
  128403. #endif
  128404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128405. "lsrs r6, r6, r7\n\t"
  128406. #else
  128407. "lsr r6, r6, r7\n\t"
  128408. #endif
  128409. #ifdef WOLFSSL_KEIL
  128410. "orrs r5, r5, r6\n\t"
  128411. #elif defined(__clang__)
  128412. "orrs r5, r6\n\t"
  128413. #else
  128414. "orr r5, r6\n\t"
  128415. #endif
  128416. "ldr r3, [%[a], #28]\n\t"
  128417. "str r5, [%[r], #36]\n\t"
  128418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128419. "lsrs r6, r3, #1\n\t"
  128420. #else
  128421. "lsr r6, r3, #1\n\t"
  128422. #endif
  128423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128424. "lsls r3, r3, %[n]\n\t"
  128425. #else
  128426. "lsl r3, r3, %[n]\n\t"
  128427. #endif
  128428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128429. "lsrs r6, r6, r7\n\t"
  128430. #else
  128431. "lsr r6, r6, r7\n\t"
  128432. #endif
  128433. #ifdef WOLFSSL_KEIL
  128434. "orrs r4, r4, r6\n\t"
  128435. #elif defined(__clang__)
  128436. "orrs r4, r6\n\t"
  128437. #else
  128438. "orr r4, r6\n\t"
  128439. #endif
  128440. "ldr r5, [%[a], #24]\n\t"
  128441. "str r4, [%[r], #32]\n\t"
  128442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128443. "lsrs r6, r5, #1\n\t"
  128444. #else
  128445. "lsr r6, r5, #1\n\t"
  128446. #endif
  128447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128448. "lsls r5, r5, %[n]\n\t"
  128449. #else
  128450. "lsl r5, r5, %[n]\n\t"
  128451. #endif
  128452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128453. "lsrs r6, r6, r7\n\t"
  128454. #else
  128455. "lsr r6, r6, r7\n\t"
  128456. #endif
  128457. #ifdef WOLFSSL_KEIL
  128458. "orrs r3, r3, r6\n\t"
  128459. #elif defined(__clang__)
  128460. "orrs r3, r6\n\t"
  128461. #else
  128462. "orr r3, r6\n\t"
  128463. #endif
  128464. "ldr r4, [%[a], #20]\n\t"
  128465. "str r3, [%[r], #28]\n\t"
  128466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128467. "lsrs r6, r4, #1\n\t"
  128468. #else
  128469. "lsr r6, r4, #1\n\t"
  128470. #endif
  128471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128472. "lsls r4, r4, %[n]\n\t"
  128473. #else
  128474. "lsl r4, r4, %[n]\n\t"
  128475. #endif
  128476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128477. "lsrs r6, r6, r7\n\t"
  128478. #else
  128479. "lsr r6, r6, r7\n\t"
  128480. #endif
  128481. #ifdef WOLFSSL_KEIL
  128482. "orrs r5, r5, r6\n\t"
  128483. #elif defined(__clang__)
  128484. "orrs r5, r6\n\t"
  128485. #else
  128486. "orr r5, r6\n\t"
  128487. #endif
  128488. "ldr r3, [%[a], #16]\n\t"
  128489. "str r5, [%[r], #24]\n\t"
  128490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128491. "lsrs r6, r3, #1\n\t"
  128492. #else
  128493. "lsr r6, r3, #1\n\t"
  128494. #endif
  128495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128496. "lsls r3, r3, %[n]\n\t"
  128497. #else
  128498. "lsl r3, r3, %[n]\n\t"
  128499. #endif
  128500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128501. "lsrs r6, r6, r7\n\t"
  128502. #else
  128503. "lsr r6, r6, r7\n\t"
  128504. #endif
  128505. #ifdef WOLFSSL_KEIL
  128506. "orrs r4, r4, r6\n\t"
  128507. #elif defined(__clang__)
  128508. "orrs r4, r6\n\t"
  128509. #else
  128510. "orr r4, r6\n\t"
  128511. #endif
  128512. "ldr r5, [%[a], #12]\n\t"
  128513. "str r4, [%[r], #20]\n\t"
  128514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128515. "lsrs r6, r5, #1\n\t"
  128516. #else
  128517. "lsr r6, r5, #1\n\t"
  128518. #endif
  128519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128520. "lsls r5, r5, %[n]\n\t"
  128521. #else
  128522. "lsl r5, r5, %[n]\n\t"
  128523. #endif
  128524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128525. "lsrs r6, r6, r7\n\t"
  128526. #else
  128527. "lsr r6, r6, r7\n\t"
  128528. #endif
  128529. #ifdef WOLFSSL_KEIL
  128530. "orrs r3, r3, r6\n\t"
  128531. #elif defined(__clang__)
  128532. "orrs r3, r6\n\t"
  128533. #else
  128534. "orr r3, r6\n\t"
  128535. #endif
  128536. "ldr r4, [%[a], #8]\n\t"
  128537. "str r3, [%[r], #16]\n\t"
  128538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128539. "lsrs r6, r4, #1\n\t"
  128540. #else
  128541. "lsr r6, r4, #1\n\t"
  128542. #endif
  128543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128544. "lsls r4, r4, %[n]\n\t"
  128545. #else
  128546. "lsl r4, r4, %[n]\n\t"
  128547. #endif
  128548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128549. "lsrs r6, r6, r7\n\t"
  128550. #else
  128551. "lsr r6, r6, r7\n\t"
  128552. #endif
  128553. #ifdef WOLFSSL_KEIL
  128554. "orrs r5, r5, r6\n\t"
  128555. #elif defined(__clang__)
  128556. "orrs r5, r6\n\t"
  128557. #else
  128558. "orr r5, r6\n\t"
  128559. #endif
  128560. "ldr r3, [%[a], #4]\n\t"
  128561. "str r5, [%[r], #12]\n\t"
  128562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128563. "lsrs r6, r3, #1\n\t"
  128564. #else
  128565. "lsr r6, r3, #1\n\t"
  128566. #endif
  128567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128568. "lsls r3, r3, %[n]\n\t"
  128569. #else
  128570. "lsl r3, r3, %[n]\n\t"
  128571. #endif
  128572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128573. "lsrs r6, r6, r7\n\t"
  128574. #else
  128575. "lsr r6, r6, r7\n\t"
  128576. #endif
  128577. #ifdef WOLFSSL_KEIL
  128578. "orrs r4, r4, r6\n\t"
  128579. #elif defined(__clang__)
  128580. "orrs r4, r6\n\t"
  128581. #else
  128582. "orr r4, r6\n\t"
  128583. #endif
  128584. "ldr r5, [%[a]]\n\t"
  128585. "str r4, [%[r], #8]\n\t"
  128586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128587. "lsrs r6, r5, #1\n\t"
  128588. #else
  128589. "lsr r6, r5, #1\n\t"
  128590. #endif
  128591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128592. "lsls r5, r5, %[n]\n\t"
  128593. #else
  128594. "lsl r5, r5, %[n]\n\t"
  128595. #endif
  128596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128597. "lsrs r6, r6, r7\n\t"
  128598. #else
  128599. "lsr r6, r6, r7\n\t"
  128600. #endif
  128601. #ifdef WOLFSSL_KEIL
  128602. "orrs r3, r3, r6\n\t"
  128603. #elif defined(__clang__)
  128604. "orrs r3, r6\n\t"
  128605. #else
  128606. "orr r3, r6\n\t"
  128607. #endif
  128608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128609. "subs %[a], %[a], #0x40\n\t"
  128610. #else
  128611. "sub %[a], %[a], #0x40\n\t"
  128612. #endif
  128613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128614. "subs %[r], %[r], #0x40\n\t"
  128615. #else
  128616. "sub %[r], %[r], #0x40\n\t"
  128617. #endif
  128618. "ldr r4, [%[a], #60]\n\t"
  128619. "str r3, [%[r], #68]\n\t"
  128620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128621. "lsrs r6, r4, #1\n\t"
  128622. #else
  128623. "lsr r6, r4, #1\n\t"
  128624. #endif
  128625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128626. "lsls r4, r4, %[n]\n\t"
  128627. #else
  128628. "lsl r4, r4, %[n]\n\t"
  128629. #endif
  128630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128631. "lsrs r6, r6, r7\n\t"
  128632. #else
  128633. "lsr r6, r6, r7\n\t"
  128634. #endif
  128635. #ifdef WOLFSSL_KEIL
  128636. "orrs r5, r5, r6\n\t"
  128637. #elif defined(__clang__)
  128638. "orrs r5, r6\n\t"
  128639. #else
  128640. "orr r5, r6\n\t"
  128641. #endif
  128642. "ldr r3, [%[a], #56]\n\t"
  128643. "str r5, [%[r], #64]\n\t"
  128644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128645. "lsrs r6, r3, #1\n\t"
  128646. #else
  128647. "lsr r6, r3, #1\n\t"
  128648. #endif
  128649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128650. "lsls r3, r3, %[n]\n\t"
  128651. #else
  128652. "lsl r3, r3, %[n]\n\t"
  128653. #endif
  128654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128655. "lsrs r6, r6, r7\n\t"
  128656. #else
  128657. "lsr r6, r6, r7\n\t"
  128658. #endif
  128659. #ifdef WOLFSSL_KEIL
  128660. "orrs r4, r4, r6\n\t"
  128661. #elif defined(__clang__)
  128662. "orrs r4, r6\n\t"
  128663. #else
  128664. "orr r4, r6\n\t"
  128665. #endif
  128666. "ldr r5, [%[a], #52]\n\t"
  128667. "str r4, [%[r], #60]\n\t"
  128668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128669. "lsrs r6, r5, #1\n\t"
  128670. #else
  128671. "lsr r6, r5, #1\n\t"
  128672. #endif
  128673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128674. "lsls r5, r5, %[n]\n\t"
  128675. #else
  128676. "lsl r5, r5, %[n]\n\t"
  128677. #endif
  128678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128679. "lsrs r6, r6, r7\n\t"
  128680. #else
  128681. "lsr r6, r6, r7\n\t"
  128682. #endif
  128683. #ifdef WOLFSSL_KEIL
  128684. "orrs r3, r3, r6\n\t"
  128685. #elif defined(__clang__)
  128686. "orrs r3, r6\n\t"
  128687. #else
  128688. "orr r3, r6\n\t"
  128689. #endif
  128690. "ldr r4, [%[a], #48]\n\t"
  128691. "str r3, [%[r], #56]\n\t"
  128692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128693. "lsrs r6, r4, #1\n\t"
  128694. #else
  128695. "lsr r6, r4, #1\n\t"
  128696. #endif
  128697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128698. "lsls r4, r4, %[n]\n\t"
  128699. #else
  128700. "lsl r4, r4, %[n]\n\t"
  128701. #endif
  128702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128703. "lsrs r6, r6, r7\n\t"
  128704. #else
  128705. "lsr r6, r6, r7\n\t"
  128706. #endif
  128707. #ifdef WOLFSSL_KEIL
  128708. "orrs r5, r5, r6\n\t"
  128709. #elif defined(__clang__)
  128710. "orrs r5, r6\n\t"
  128711. #else
  128712. "orr r5, r6\n\t"
  128713. #endif
  128714. "ldr r3, [%[a], #44]\n\t"
  128715. "str r5, [%[r], #52]\n\t"
  128716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128717. "lsrs r6, r3, #1\n\t"
  128718. #else
  128719. "lsr r6, r3, #1\n\t"
  128720. #endif
  128721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128722. "lsls r3, r3, %[n]\n\t"
  128723. #else
  128724. "lsl r3, r3, %[n]\n\t"
  128725. #endif
  128726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128727. "lsrs r6, r6, r7\n\t"
  128728. #else
  128729. "lsr r6, r6, r7\n\t"
  128730. #endif
  128731. #ifdef WOLFSSL_KEIL
  128732. "orrs r4, r4, r6\n\t"
  128733. #elif defined(__clang__)
  128734. "orrs r4, r6\n\t"
  128735. #else
  128736. "orr r4, r6\n\t"
  128737. #endif
  128738. "ldr r5, [%[a], #40]\n\t"
  128739. "str r4, [%[r], #48]\n\t"
  128740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128741. "lsrs r6, r5, #1\n\t"
  128742. #else
  128743. "lsr r6, r5, #1\n\t"
  128744. #endif
  128745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128746. "lsls r5, r5, %[n]\n\t"
  128747. #else
  128748. "lsl r5, r5, %[n]\n\t"
  128749. #endif
  128750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128751. "lsrs r6, r6, r7\n\t"
  128752. #else
  128753. "lsr r6, r6, r7\n\t"
  128754. #endif
  128755. #ifdef WOLFSSL_KEIL
  128756. "orrs r3, r3, r6\n\t"
  128757. #elif defined(__clang__)
  128758. "orrs r3, r6\n\t"
  128759. #else
  128760. "orr r3, r6\n\t"
  128761. #endif
  128762. "ldr r4, [%[a], #36]\n\t"
  128763. "str r3, [%[r], #44]\n\t"
  128764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128765. "lsrs r6, r4, #1\n\t"
  128766. #else
  128767. "lsr r6, r4, #1\n\t"
  128768. #endif
  128769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128770. "lsls r4, r4, %[n]\n\t"
  128771. #else
  128772. "lsl r4, r4, %[n]\n\t"
  128773. #endif
  128774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128775. "lsrs r6, r6, r7\n\t"
  128776. #else
  128777. "lsr r6, r6, r7\n\t"
  128778. #endif
  128779. #ifdef WOLFSSL_KEIL
  128780. "orrs r5, r5, r6\n\t"
  128781. #elif defined(__clang__)
  128782. "orrs r5, r6\n\t"
  128783. #else
  128784. "orr r5, r6\n\t"
  128785. #endif
  128786. "ldr r3, [%[a], #32]\n\t"
  128787. "str r5, [%[r], #40]\n\t"
  128788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128789. "lsrs r6, r3, #1\n\t"
  128790. #else
  128791. "lsr r6, r3, #1\n\t"
  128792. #endif
  128793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128794. "lsls r3, r3, %[n]\n\t"
  128795. #else
  128796. "lsl r3, r3, %[n]\n\t"
  128797. #endif
  128798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128799. "lsrs r6, r6, r7\n\t"
  128800. #else
  128801. "lsr r6, r6, r7\n\t"
  128802. #endif
  128803. #ifdef WOLFSSL_KEIL
  128804. "orrs r4, r4, r6\n\t"
  128805. #elif defined(__clang__)
  128806. "orrs r4, r6\n\t"
  128807. #else
  128808. "orr r4, r6\n\t"
  128809. #endif
  128810. "ldr r5, [%[a], #28]\n\t"
  128811. "str r4, [%[r], #36]\n\t"
  128812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128813. "lsrs r6, r5, #1\n\t"
  128814. #else
  128815. "lsr r6, r5, #1\n\t"
  128816. #endif
  128817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128818. "lsls r5, r5, %[n]\n\t"
  128819. #else
  128820. "lsl r5, r5, %[n]\n\t"
  128821. #endif
  128822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128823. "lsrs r6, r6, r7\n\t"
  128824. #else
  128825. "lsr r6, r6, r7\n\t"
  128826. #endif
  128827. #ifdef WOLFSSL_KEIL
  128828. "orrs r3, r3, r6\n\t"
  128829. #elif defined(__clang__)
  128830. "orrs r3, r6\n\t"
  128831. #else
  128832. "orr r3, r6\n\t"
  128833. #endif
  128834. "ldr r4, [%[a], #24]\n\t"
  128835. "str r3, [%[r], #32]\n\t"
  128836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128837. "lsrs r6, r4, #1\n\t"
  128838. #else
  128839. "lsr r6, r4, #1\n\t"
  128840. #endif
  128841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128842. "lsls r4, r4, %[n]\n\t"
  128843. #else
  128844. "lsl r4, r4, %[n]\n\t"
  128845. #endif
  128846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128847. "lsrs r6, r6, r7\n\t"
  128848. #else
  128849. "lsr r6, r6, r7\n\t"
  128850. #endif
  128851. #ifdef WOLFSSL_KEIL
  128852. "orrs r5, r5, r6\n\t"
  128853. #elif defined(__clang__)
  128854. "orrs r5, r6\n\t"
  128855. #else
  128856. "orr r5, r6\n\t"
  128857. #endif
  128858. "ldr r3, [%[a], #20]\n\t"
  128859. "str r5, [%[r], #28]\n\t"
  128860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128861. "lsrs r6, r3, #1\n\t"
  128862. #else
  128863. "lsr r6, r3, #1\n\t"
  128864. #endif
  128865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128866. "lsls r3, r3, %[n]\n\t"
  128867. #else
  128868. "lsl r3, r3, %[n]\n\t"
  128869. #endif
  128870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128871. "lsrs r6, r6, r7\n\t"
  128872. #else
  128873. "lsr r6, r6, r7\n\t"
  128874. #endif
  128875. #ifdef WOLFSSL_KEIL
  128876. "orrs r4, r4, r6\n\t"
  128877. #elif defined(__clang__)
  128878. "orrs r4, r6\n\t"
  128879. #else
  128880. "orr r4, r6\n\t"
  128881. #endif
  128882. "ldr r5, [%[a], #16]\n\t"
  128883. "str r4, [%[r], #24]\n\t"
  128884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128885. "lsrs r6, r5, #1\n\t"
  128886. #else
  128887. "lsr r6, r5, #1\n\t"
  128888. #endif
  128889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128890. "lsls r5, r5, %[n]\n\t"
  128891. #else
  128892. "lsl r5, r5, %[n]\n\t"
  128893. #endif
  128894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128895. "lsrs r6, r6, r7\n\t"
  128896. #else
  128897. "lsr r6, r6, r7\n\t"
  128898. #endif
  128899. #ifdef WOLFSSL_KEIL
  128900. "orrs r3, r3, r6\n\t"
  128901. #elif defined(__clang__)
  128902. "orrs r3, r6\n\t"
  128903. #else
  128904. "orr r3, r6\n\t"
  128905. #endif
  128906. "ldr r4, [%[a], #12]\n\t"
  128907. "str r3, [%[r], #20]\n\t"
  128908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128909. "lsrs r6, r4, #1\n\t"
  128910. #else
  128911. "lsr r6, r4, #1\n\t"
  128912. #endif
  128913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128914. "lsls r4, r4, %[n]\n\t"
  128915. #else
  128916. "lsl r4, r4, %[n]\n\t"
  128917. #endif
  128918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128919. "lsrs r6, r6, r7\n\t"
  128920. #else
  128921. "lsr r6, r6, r7\n\t"
  128922. #endif
  128923. #ifdef WOLFSSL_KEIL
  128924. "orrs r5, r5, r6\n\t"
  128925. #elif defined(__clang__)
  128926. "orrs r5, r6\n\t"
  128927. #else
  128928. "orr r5, r6\n\t"
  128929. #endif
  128930. "ldr r3, [%[a], #8]\n\t"
  128931. "str r5, [%[r], #16]\n\t"
  128932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128933. "lsrs r6, r3, #1\n\t"
  128934. #else
  128935. "lsr r6, r3, #1\n\t"
  128936. #endif
  128937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128938. "lsls r3, r3, %[n]\n\t"
  128939. #else
  128940. "lsl r3, r3, %[n]\n\t"
  128941. #endif
  128942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128943. "lsrs r6, r6, r7\n\t"
  128944. #else
  128945. "lsr r6, r6, r7\n\t"
  128946. #endif
  128947. #ifdef WOLFSSL_KEIL
  128948. "orrs r4, r4, r6\n\t"
  128949. #elif defined(__clang__)
  128950. "orrs r4, r6\n\t"
  128951. #else
  128952. "orr r4, r6\n\t"
  128953. #endif
  128954. "ldr r5, [%[a], #4]\n\t"
  128955. "str r4, [%[r], #12]\n\t"
  128956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128957. "lsrs r6, r5, #1\n\t"
  128958. #else
  128959. "lsr r6, r5, #1\n\t"
  128960. #endif
  128961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128962. "lsls r5, r5, %[n]\n\t"
  128963. #else
  128964. "lsl r5, r5, %[n]\n\t"
  128965. #endif
  128966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128967. "lsrs r6, r6, r7\n\t"
  128968. #else
  128969. "lsr r6, r6, r7\n\t"
  128970. #endif
  128971. #ifdef WOLFSSL_KEIL
  128972. "orrs r3, r3, r6\n\t"
  128973. #elif defined(__clang__)
  128974. "orrs r3, r6\n\t"
  128975. #else
  128976. "orr r3, r6\n\t"
  128977. #endif
  128978. "ldr r4, [%[a]]\n\t"
  128979. "str r3, [%[r], #8]\n\t"
  128980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128981. "lsrs r6, r4, #1\n\t"
  128982. #else
  128983. "lsr r6, r4, #1\n\t"
  128984. #endif
  128985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128986. "lsls r4, r4, %[n]\n\t"
  128987. #else
  128988. "lsl r4, r4, %[n]\n\t"
  128989. #endif
  128990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  128991. "lsrs r6, r6, r7\n\t"
  128992. #else
  128993. "lsr r6, r6, r7\n\t"
  128994. #endif
  128995. #ifdef WOLFSSL_KEIL
  128996. "orrs r5, r5, r6\n\t"
  128997. #elif defined(__clang__)
  128998. "orrs r5, r6\n\t"
  128999. #else
  129000. "orr r5, r6\n\t"
  129001. #endif
  129002. "str r4, [%[r]]\n\t"
  129003. "str r5, [%[r], #4]\n\t"
  129004. : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n)
  129005. :
  129006. : "memory", "r3", "r4", "r5", "r6", "r7"
  129007. );
  129008. }
  129009. #ifdef WOLFSSL_SP_SMALL
  129010. /* Sub b from a into a. (a -= b)
  129011. *
  129012. * a A single precision integer.
  129013. * b A single precision integer.
  129014. */
  129015. SP_NOINLINE static sp_digit sp_521_sub_in_place_17(sp_digit* a,
  129016. const sp_digit* b)
  129017. {
  129018. __asm__ __volatile__ (
  129019. "movs r7, %[a]\n\t"
  129020. "movs r2, #0\n\t"
  129021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129022. "adds r7, r7, #0x40\n\t"
  129023. #else
  129024. "add r7, r7, #0x40\n\t"
  129025. #endif
  129026. "\n"
  129027. "L_sp_521_sub_in_place_17_words_%=:\n\t"
  129028. "movs r5, #0\n\t"
  129029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129030. "subs r5, r5, r2\n\t"
  129031. #else
  129032. "sub r5, r5, r2\n\t"
  129033. #endif
  129034. "ldr r3, [%[a]]\n\t"
  129035. "ldr r4, [%[a], #4]\n\t"
  129036. "ldr r5, [%[b]]\n\t"
  129037. "ldr r6, [%[b], #4]\n\t"
  129038. #ifdef WOLFSSL_KEIL
  129039. "sbcs r3, r3, r5\n\t"
  129040. #elif defined(__clang__)
  129041. "sbcs r3, r5\n\t"
  129042. #else
  129043. "sbc r3, r5\n\t"
  129044. #endif
  129045. #ifdef WOLFSSL_KEIL
  129046. "sbcs r4, r4, r6\n\t"
  129047. #elif defined(__clang__)
  129048. "sbcs r4, r6\n\t"
  129049. #else
  129050. "sbc r4, r6\n\t"
  129051. #endif
  129052. "str r3, [%[a]]\n\t"
  129053. "str r4, [%[a], #4]\n\t"
  129054. #ifdef WOLFSSL_KEIL
  129055. "sbcs r2, r2, r2\n\t"
  129056. #elif defined(__clang__)
  129057. "sbcs r2, r2\n\t"
  129058. #else
  129059. "sbc r2, r2\n\t"
  129060. #endif
  129061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129062. "adds %[a], %[a], #8\n\t"
  129063. #else
  129064. "add %[a], %[a], #8\n\t"
  129065. #endif
  129066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129067. "adds %[b], %[b], #8\n\t"
  129068. #else
  129069. "add %[b], %[b], #8\n\t"
  129070. #endif
  129071. "cmp %[a], r7\n\t"
  129072. "bne L_sp_521_sub_in_place_17_words_%=\n\t"
  129073. "movs %[a], r2\n\t"
  129074. : [a] "+l" (a), [b] "+l" (b)
  129075. :
  129076. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  129077. );
  129078. return (uint32_t)(size_t)a;
  129079. }
  129080. #else
  129081. /* Sub b from a into a. (a -= b)
  129082. *
  129083. * a A single precision integer.
  129084. * b A single precision integer.
  129085. */
  129086. SP_NOINLINE static sp_digit sp_521_sub_in_place_17(sp_digit* a,
  129087. const sp_digit* b)
  129088. {
  129089. __asm__ __volatile__ (
  129090. "ldm %[b]!, {r4, r5}\n\t"
  129091. "ldr r2, [%[a]]\n\t"
  129092. "ldr r3, [%[a], #4]\n\t"
  129093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129094. "subs r2, r2, r4\n\t"
  129095. #else
  129096. "sub r2, r2, r4\n\t"
  129097. #endif
  129098. #ifdef WOLFSSL_KEIL
  129099. "sbcs r3, r3, r5\n\t"
  129100. #elif defined(__clang__)
  129101. "sbcs r3, r5\n\t"
  129102. #else
  129103. "sbc r3, r5\n\t"
  129104. #endif
  129105. "stm %[a]!, {r2, r3}\n\t"
  129106. "ldm %[b]!, {r4, r5}\n\t"
  129107. "ldr r2, [%[a]]\n\t"
  129108. "ldr r3, [%[a], #4]\n\t"
  129109. #ifdef WOLFSSL_KEIL
  129110. "sbcs r2, r2, r4\n\t"
  129111. #elif defined(__clang__)
  129112. "sbcs r2, r4\n\t"
  129113. #else
  129114. "sbc r2, r4\n\t"
  129115. #endif
  129116. #ifdef WOLFSSL_KEIL
  129117. "sbcs r3, r3, r5\n\t"
  129118. #elif defined(__clang__)
  129119. "sbcs r3, r5\n\t"
  129120. #else
  129121. "sbc r3, r5\n\t"
  129122. #endif
  129123. "stm %[a]!, {r2, r3}\n\t"
  129124. "ldm %[b]!, {r4, r5}\n\t"
  129125. "ldr r2, [%[a]]\n\t"
  129126. "ldr r3, [%[a], #4]\n\t"
  129127. #ifdef WOLFSSL_KEIL
  129128. "sbcs r2, r2, r4\n\t"
  129129. #elif defined(__clang__)
  129130. "sbcs r2, r4\n\t"
  129131. #else
  129132. "sbc r2, r4\n\t"
  129133. #endif
  129134. #ifdef WOLFSSL_KEIL
  129135. "sbcs r3, r3, r5\n\t"
  129136. #elif defined(__clang__)
  129137. "sbcs r3, r5\n\t"
  129138. #else
  129139. "sbc r3, r5\n\t"
  129140. #endif
  129141. "stm %[a]!, {r2, r3}\n\t"
  129142. "ldm %[b]!, {r4, r5}\n\t"
  129143. "ldr r2, [%[a]]\n\t"
  129144. "ldr r3, [%[a], #4]\n\t"
  129145. #ifdef WOLFSSL_KEIL
  129146. "sbcs r2, r2, r4\n\t"
  129147. #elif defined(__clang__)
  129148. "sbcs r2, r4\n\t"
  129149. #else
  129150. "sbc r2, r4\n\t"
  129151. #endif
  129152. #ifdef WOLFSSL_KEIL
  129153. "sbcs r3, r3, r5\n\t"
  129154. #elif defined(__clang__)
  129155. "sbcs r3, r5\n\t"
  129156. #else
  129157. "sbc r3, r5\n\t"
  129158. #endif
  129159. "stm %[a]!, {r2, r3}\n\t"
  129160. "ldm %[b]!, {r4, r5}\n\t"
  129161. "ldr r2, [%[a]]\n\t"
  129162. "ldr r3, [%[a], #4]\n\t"
  129163. #ifdef WOLFSSL_KEIL
  129164. "sbcs r2, r2, r4\n\t"
  129165. #elif defined(__clang__)
  129166. "sbcs r2, r4\n\t"
  129167. #else
  129168. "sbc r2, r4\n\t"
  129169. #endif
  129170. #ifdef WOLFSSL_KEIL
  129171. "sbcs r3, r3, r5\n\t"
  129172. #elif defined(__clang__)
  129173. "sbcs r3, r5\n\t"
  129174. #else
  129175. "sbc r3, r5\n\t"
  129176. #endif
  129177. "stm %[a]!, {r2, r3}\n\t"
  129178. "ldm %[b]!, {r4, r5}\n\t"
  129179. "ldr r2, [%[a]]\n\t"
  129180. "ldr r3, [%[a], #4]\n\t"
  129181. #ifdef WOLFSSL_KEIL
  129182. "sbcs r2, r2, r4\n\t"
  129183. #elif defined(__clang__)
  129184. "sbcs r2, r4\n\t"
  129185. #else
  129186. "sbc r2, r4\n\t"
  129187. #endif
  129188. #ifdef WOLFSSL_KEIL
  129189. "sbcs r3, r3, r5\n\t"
  129190. #elif defined(__clang__)
  129191. "sbcs r3, r5\n\t"
  129192. #else
  129193. "sbc r3, r5\n\t"
  129194. #endif
  129195. "stm %[a]!, {r2, r3}\n\t"
  129196. "ldm %[b]!, {r4, r5}\n\t"
  129197. "ldr r2, [%[a]]\n\t"
  129198. "ldr r3, [%[a], #4]\n\t"
  129199. #ifdef WOLFSSL_KEIL
  129200. "sbcs r2, r2, r4\n\t"
  129201. #elif defined(__clang__)
  129202. "sbcs r2, r4\n\t"
  129203. #else
  129204. "sbc r2, r4\n\t"
  129205. #endif
  129206. #ifdef WOLFSSL_KEIL
  129207. "sbcs r3, r3, r5\n\t"
  129208. #elif defined(__clang__)
  129209. "sbcs r3, r5\n\t"
  129210. #else
  129211. "sbc r3, r5\n\t"
  129212. #endif
  129213. "stm %[a]!, {r2, r3}\n\t"
  129214. "ldm %[b]!, {r4, r5}\n\t"
  129215. "ldr r2, [%[a]]\n\t"
  129216. "ldr r3, [%[a], #4]\n\t"
  129217. #ifdef WOLFSSL_KEIL
  129218. "sbcs r2, r2, r4\n\t"
  129219. #elif defined(__clang__)
  129220. "sbcs r2, r4\n\t"
  129221. #else
  129222. "sbc r2, r4\n\t"
  129223. #endif
  129224. #ifdef WOLFSSL_KEIL
  129225. "sbcs r3, r3, r5\n\t"
  129226. #elif defined(__clang__)
  129227. "sbcs r3, r5\n\t"
  129228. #else
  129229. "sbc r3, r5\n\t"
  129230. #endif
  129231. "stm %[a]!, {r2, r3}\n\t"
  129232. "ldr r4, [%[b]]\n\t"
  129233. "ldr r2, [%[a]]\n\t"
  129234. #ifdef WOLFSSL_KEIL
  129235. "sbcs r2, r2, r4\n\t"
  129236. #elif defined(__clang__)
  129237. "sbcs r2, r4\n\t"
  129238. #else
  129239. "sbc r2, r4\n\t"
  129240. #endif
  129241. "str r2, [%[a]]\n\t"
  129242. #ifdef WOLFSSL_KEIL
  129243. "sbcs %[a], %[a], %[a]\n\t"
  129244. #elif defined(__clang__)
  129245. "sbcs %[a], %[a]\n\t"
  129246. #else
  129247. "sbc %[a], %[a]\n\t"
  129248. #endif
  129249. : [a] "+l" (a), [b] "+l" (b)
  129250. :
  129251. : "memory", "r2", "r3", "r4", "r5"
  129252. );
  129253. return (uint32_t)(size_t)a;
  129254. }
  129255. #endif /* WOLFSSL_SP_SMALL */
  129256. /* Mul a by digit b into r. (r = a * b)
  129257. *
  129258. * r A single precision integer.
  129259. * a A single precision integer.
  129260. * b A single precision digit.
  129261. */
  129262. SP_NOINLINE static void sp_521_mul_d_17(sp_digit* r, const sp_digit* a,
  129263. sp_digit b)
  129264. {
  129265. __asm__ __volatile__ (
  129266. "movs r6, #0x44\n\t"
  129267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129268. "adds r6, r6, %[a]\n\t"
  129269. #else
  129270. "add r6, r6, %[a]\n\t"
  129271. #endif
  129272. "mov r8, %[r]\n\t"
  129273. "mov r9, r6\n\t"
  129274. "movs r3, #0\n\t"
  129275. "movs r4, #0\n\t"
  129276. "\n"
  129277. "L_sp_521_mul_d_17_%=:\n\t"
  129278. "movs %[r], #0\n\t"
  129279. "movs r5, #0\n\t"
  129280. "# A[] * B\n\t"
  129281. "ldrh r6, [%[a]]\n\t"
  129282. "uxth r7, %[b]\n\t"
  129283. #ifdef WOLFSSL_KEIL
  129284. "muls r7, r6, r7\n\t"
  129285. #elif defined(__clang__)
  129286. "muls r7, r6\n\t"
  129287. #else
  129288. "mul r7, r6\n\t"
  129289. #endif
  129290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129291. "adds r3, r3, r7\n\t"
  129292. #else
  129293. "add r3, r3, r7\n\t"
  129294. #endif
  129295. #ifdef WOLFSSL_KEIL
  129296. "adcs r4, r4, %[r]\n\t"
  129297. #elif defined(__clang__)
  129298. "adcs r4, %[r]\n\t"
  129299. #else
  129300. "adc r4, %[r]\n\t"
  129301. #endif
  129302. #ifdef WOLFSSL_KEIL
  129303. "adcs r5, r5, %[r]\n\t"
  129304. #elif defined(__clang__)
  129305. "adcs r5, %[r]\n\t"
  129306. #else
  129307. "adc r5, %[r]\n\t"
  129308. #endif
  129309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129310. "lsrs r7, %[b], #16\n\t"
  129311. #else
  129312. "lsr r7, %[b], #16\n\t"
  129313. #endif
  129314. #ifdef WOLFSSL_KEIL
  129315. "muls r6, r7, r6\n\t"
  129316. #elif defined(__clang__)
  129317. "muls r6, r7\n\t"
  129318. #else
  129319. "mul r6, r7\n\t"
  129320. #endif
  129321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129322. "lsrs r7, r6, #16\n\t"
  129323. #else
  129324. "lsr r7, r6, #16\n\t"
  129325. #endif
  129326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129327. "lsls r6, r6, #16\n\t"
  129328. #else
  129329. "lsl r6, r6, #16\n\t"
  129330. #endif
  129331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129332. "adds r3, r3, r6\n\t"
  129333. #else
  129334. "add r3, r3, r6\n\t"
  129335. #endif
  129336. #ifdef WOLFSSL_KEIL
  129337. "adcs r4, r4, r7\n\t"
  129338. #elif defined(__clang__)
  129339. "adcs r4, r7\n\t"
  129340. #else
  129341. "adc r4, r7\n\t"
  129342. #endif
  129343. #ifdef WOLFSSL_KEIL
  129344. "adcs r5, r5, %[r]\n\t"
  129345. #elif defined(__clang__)
  129346. "adcs r5, %[r]\n\t"
  129347. #else
  129348. "adc r5, %[r]\n\t"
  129349. #endif
  129350. "ldr r6, [%[a]]\n\t"
  129351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129352. "lsrs r6, r6, #16\n\t"
  129353. #else
  129354. "lsr r6, r6, #16\n\t"
  129355. #endif
  129356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129357. "lsrs r7, %[b], #16\n\t"
  129358. #else
  129359. "lsr r7, %[b], #16\n\t"
  129360. #endif
  129361. #ifdef WOLFSSL_KEIL
  129362. "muls r7, r6, r7\n\t"
  129363. #elif defined(__clang__)
  129364. "muls r7, r6\n\t"
  129365. #else
  129366. "mul r7, r6\n\t"
  129367. #endif
  129368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129369. "adds r4, r4, r7\n\t"
  129370. #else
  129371. "add r4, r4, r7\n\t"
  129372. #endif
  129373. #ifdef WOLFSSL_KEIL
  129374. "adcs r5, r5, %[r]\n\t"
  129375. #elif defined(__clang__)
  129376. "adcs r5, %[r]\n\t"
  129377. #else
  129378. "adc r5, %[r]\n\t"
  129379. #endif
  129380. "uxth r7, %[b]\n\t"
  129381. #ifdef WOLFSSL_KEIL
  129382. "muls r6, r7, r6\n\t"
  129383. #elif defined(__clang__)
  129384. "muls r6, r7\n\t"
  129385. #else
  129386. "mul r6, r7\n\t"
  129387. #endif
  129388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129389. "lsrs r7, r6, #16\n\t"
  129390. #else
  129391. "lsr r7, r6, #16\n\t"
  129392. #endif
  129393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129394. "lsls r6, r6, #16\n\t"
  129395. #else
  129396. "lsl r6, r6, #16\n\t"
  129397. #endif
  129398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129399. "adds r3, r3, r6\n\t"
  129400. #else
  129401. "add r3, r3, r6\n\t"
  129402. #endif
  129403. #ifdef WOLFSSL_KEIL
  129404. "adcs r4, r4, r7\n\t"
  129405. #elif defined(__clang__)
  129406. "adcs r4, r7\n\t"
  129407. #else
  129408. "adc r4, r7\n\t"
  129409. #endif
  129410. #ifdef WOLFSSL_KEIL
  129411. "adcs r5, r5, %[r]\n\t"
  129412. #elif defined(__clang__)
  129413. "adcs r5, %[r]\n\t"
  129414. #else
  129415. "adc r5, %[r]\n\t"
  129416. #endif
  129417. "# A[] * B - Done\n\t"
  129418. "mov %[r], r8\n\t"
  129419. "str r3, [%[r]]\n\t"
  129420. "movs r3, r4\n\t"
  129421. "movs r4, r5\n\t"
  129422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129423. "adds %[r], %[r], #4\n\t"
  129424. #else
  129425. "add %[r], %[r], #4\n\t"
  129426. #endif
  129427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129428. "adds %[a], %[a], #4\n\t"
  129429. #else
  129430. "add %[a], %[a], #4\n\t"
  129431. #endif
  129432. "mov r8, %[r]\n\t"
  129433. "cmp %[a], r9\n\t"
  129434. "blt L_sp_521_mul_d_17_%=\n\t"
  129435. "str r3, [%[r]]\n\t"
  129436. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  129437. :
  129438. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  129439. );
  129440. }
  129441. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  129442. *
  129443. * d1 The high order half of the number to divide.
  129444. * d0 The low order half of the number to divide.
  129445. * div The divisor.
  129446. * returns the result of the division.
  129447. *
  129448. * Note that this is an approximate div. It may give an answer 1 larger.
  129449. */
  129450. SP_NOINLINE static sp_digit div_521_word_17(sp_digit d1, sp_digit d0,
  129451. sp_digit div)
  129452. {
  129453. __asm__ __volatile__ (
  129454. "movs r3, #0\n\t"
  129455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129456. "lsrs r5, %[div], #1\n\t"
  129457. #else
  129458. "lsr r5, %[div], #1\n\t"
  129459. #endif
  129460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129461. "adds r5, r5, #1\n\t"
  129462. #else
  129463. "add r5, r5, #1\n\t"
  129464. #endif
  129465. "mov r8, %[d0]\n\t"
  129466. "mov r9, %[d1]\n\t"
  129467. "# Do top 32\n\t"
  129468. "movs r6, r5\n\t"
  129469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129470. "subs r6, r6, %[d1]\n\t"
  129471. #else
  129472. "sub r6, r6, %[d1]\n\t"
  129473. #endif
  129474. #ifdef WOLFSSL_KEIL
  129475. "sbcs r6, r6, r6\n\t"
  129476. #elif defined(__clang__)
  129477. "sbcs r6, r6\n\t"
  129478. #else
  129479. "sbc r6, r6\n\t"
  129480. #endif
  129481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129482. "adds r3, r3, r3\n\t"
  129483. #else
  129484. "add r3, r3, r3\n\t"
  129485. #endif
  129486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129487. "subs r3, r3, r6\n\t"
  129488. #else
  129489. "sub r3, r3, r6\n\t"
  129490. #endif
  129491. #ifdef WOLFSSL_KEIL
  129492. "ands r6, r6, r5\n\t"
  129493. #elif defined(__clang__)
  129494. "ands r6, r5\n\t"
  129495. #else
  129496. "and r6, r5\n\t"
  129497. #endif
  129498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129499. "subs %[d1], %[d1], r6\n\t"
  129500. #else
  129501. "sub %[d1], %[d1], r6\n\t"
  129502. #endif
  129503. "movs r4, #29\n\t"
  129504. "\n"
  129505. "L_div_521_word_17_loop_%=:\n\t"
  129506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129507. "lsls %[d0], %[d0], #1\n\t"
  129508. #else
  129509. "lsl %[d0], %[d0], #1\n\t"
  129510. #endif
  129511. #ifdef WOLFSSL_KEIL
  129512. "adcs %[d1], %[d1], %[d1]\n\t"
  129513. #elif defined(__clang__)
  129514. "adcs %[d1], %[d1]\n\t"
  129515. #else
  129516. "adc %[d1], %[d1]\n\t"
  129517. #endif
  129518. "movs r6, r5\n\t"
  129519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129520. "subs r6, r6, %[d1]\n\t"
  129521. #else
  129522. "sub r6, r6, %[d1]\n\t"
  129523. #endif
  129524. #ifdef WOLFSSL_KEIL
  129525. "sbcs r6, r6, r6\n\t"
  129526. #elif defined(__clang__)
  129527. "sbcs r6, r6\n\t"
  129528. #else
  129529. "sbc r6, r6\n\t"
  129530. #endif
  129531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129532. "adds r3, r3, r3\n\t"
  129533. #else
  129534. "add r3, r3, r3\n\t"
  129535. #endif
  129536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129537. "subs r3, r3, r6\n\t"
  129538. #else
  129539. "sub r3, r3, r6\n\t"
  129540. #endif
  129541. #ifdef WOLFSSL_KEIL
  129542. "ands r6, r6, r5\n\t"
  129543. #elif defined(__clang__)
  129544. "ands r6, r5\n\t"
  129545. #else
  129546. "and r6, r5\n\t"
  129547. #endif
  129548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129549. "subs %[d1], %[d1], r6\n\t"
  129550. #else
  129551. "sub %[d1], %[d1], r6\n\t"
  129552. #endif
  129553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129554. "subs r4, r4, #1\n\t"
  129555. #else
  129556. "sub r4, r4, #1\n\t"
  129557. #endif
  129558. "bpl L_div_521_word_17_loop_%=\n\t"
  129559. "movs r7, #0\n\t"
  129560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129561. "adds r3, r3, r3\n\t"
  129562. #else
  129563. "add r3, r3, r3\n\t"
  129564. #endif
  129565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129566. "adds r3, r3, #1\n\t"
  129567. #else
  129568. "add r3, r3, #1\n\t"
  129569. #endif
  129570. "# r * div - Start\n\t"
  129571. "uxth %[d1], r3\n\t"
  129572. "uxth r4, %[div]\n\t"
  129573. #ifdef WOLFSSL_KEIL
  129574. "muls r4, %[d1], r4\n\t"
  129575. #elif defined(__clang__)
  129576. "muls r4, %[d1]\n\t"
  129577. #else
  129578. "mul r4, %[d1]\n\t"
  129579. #endif
  129580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129581. "lsrs r6, %[div], #16\n\t"
  129582. #else
  129583. "lsr r6, %[div], #16\n\t"
  129584. #endif
  129585. #ifdef WOLFSSL_KEIL
  129586. "muls %[d1], r6, %[d1]\n\t"
  129587. #elif defined(__clang__)
  129588. "muls %[d1], r6\n\t"
  129589. #else
  129590. "mul %[d1], r6\n\t"
  129591. #endif
  129592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129593. "lsrs r5, %[d1], #16\n\t"
  129594. #else
  129595. "lsr r5, %[d1], #16\n\t"
  129596. #endif
  129597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129598. "lsls %[d1], %[d1], #16\n\t"
  129599. #else
  129600. "lsl %[d1], %[d1], #16\n\t"
  129601. #endif
  129602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129603. "adds r4, r4, %[d1]\n\t"
  129604. #else
  129605. "add r4, r4, %[d1]\n\t"
  129606. #endif
  129607. #ifdef WOLFSSL_KEIL
  129608. "adcs r5, r5, r7\n\t"
  129609. #elif defined(__clang__)
  129610. "adcs r5, r7\n\t"
  129611. #else
  129612. "adc r5, r7\n\t"
  129613. #endif
  129614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129615. "lsrs %[d1], r3, #16\n\t"
  129616. #else
  129617. "lsr %[d1], r3, #16\n\t"
  129618. #endif
  129619. #ifdef WOLFSSL_KEIL
  129620. "muls r6, %[d1], r6\n\t"
  129621. #elif defined(__clang__)
  129622. "muls r6, %[d1]\n\t"
  129623. #else
  129624. "mul r6, %[d1]\n\t"
  129625. #endif
  129626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129627. "adds r5, r5, r6\n\t"
  129628. #else
  129629. "add r5, r5, r6\n\t"
  129630. #endif
  129631. "uxth r6, %[div]\n\t"
  129632. #ifdef WOLFSSL_KEIL
  129633. "muls %[d1], r6, %[d1]\n\t"
  129634. #elif defined(__clang__)
  129635. "muls %[d1], r6\n\t"
  129636. #else
  129637. "mul %[d1], r6\n\t"
  129638. #endif
  129639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129640. "lsrs r6, %[d1], #16\n\t"
  129641. #else
  129642. "lsr r6, %[d1], #16\n\t"
  129643. #endif
  129644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129645. "lsls %[d1], %[d1], #16\n\t"
  129646. #else
  129647. "lsl %[d1], %[d1], #16\n\t"
  129648. #endif
  129649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129650. "adds r4, r4, %[d1]\n\t"
  129651. #else
  129652. "add r4, r4, %[d1]\n\t"
  129653. #endif
  129654. #ifdef WOLFSSL_KEIL
  129655. "adcs r5, r5, r6\n\t"
  129656. #elif defined(__clang__)
  129657. "adcs r5, r6\n\t"
  129658. #else
  129659. "adc r5, r6\n\t"
  129660. #endif
  129661. "# r * div - Done\n\t"
  129662. "mov %[d1], r8\n\t"
  129663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129664. "subs %[d1], %[d1], r4\n\t"
  129665. #else
  129666. "sub %[d1], %[d1], r4\n\t"
  129667. #endif
  129668. "movs r4, %[d1]\n\t"
  129669. "mov %[d1], r9\n\t"
  129670. #ifdef WOLFSSL_KEIL
  129671. "sbcs %[d1], %[d1], r5\n\t"
  129672. #elif defined(__clang__)
  129673. "sbcs %[d1], r5\n\t"
  129674. #else
  129675. "sbc %[d1], r5\n\t"
  129676. #endif
  129677. "movs r5, %[d1]\n\t"
  129678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129679. "adds r3, r3, r5\n\t"
  129680. #else
  129681. "add r3, r3, r5\n\t"
  129682. #endif
  129683. "# r * div - Start\n\t"
  129684. "uxth %[d1], r3\n\t"
  129685. "uxth r4, %[div]\n\t"
  129686. #ifdef WOLFSSL_KEIL
  129687. "muls r4, %[d1], r4\n\t"
  129688. #elif defined(__clang__)
  129689. "muls r4, %[d1]\n\t"
  129690. #else
  129691. "mul r4, %[d1]\n\t"
  129692. #endif
  129693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129694. "lsrs r6, %[div], #16\n\t"
  129695. #else
  129696. "lsr r6, %[div], #16\n\t"
  129697. #endif
  129698. #ifdef WOLFSSL_KEIL
  129699. "muls %[d1], r6, %[d1]\n\t"
  129700. #elif defined(__clang__)
  129701. "muls %[d1], r6\n\t"
  129702. #else
  129703. "mul %[d1], r6\n\t"
  129704. #endif
  129705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129706. "lsrs r5, %[d1], #16\n\t"
  129707. #else
  129708. "lsr r5, %[d1], #16\n\t"
  129709. #endif
  129710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129711. "lsls %[d1], %[d1], #16\n\t"
  129712. #else
  129713. "lsl %[d1], %[d1], #16\n\t"
  129714. #endif
  129715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129716. "adds r4, r4, %[d1]\n\t"
  129717. #else
  129718. "add r4, r4, %[d1]\n\t"
  129719. #endif
  129720. #ifdef WOLFSSL_KEIL
  129721. "adcs r5, r5, r7\n\t"
  129722. #elif defined(__clang__)
  129723. "adcs r5, r7\n\t"
  129724. #else
  129725. "adc r5, r7\n\t"
  129726. #endif
  129727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129728. "lsrs %[d1], r3, #16\n\t"
  129729. #else
  129730. "lsr %[d1], r3, #16\n\t"
  129731. #endif
  129732. #ifdef WOLFSSL_KEIL
  129733. "muls r6, %[d1], r6\n\t"
  129734. #elif defined(__clang__)
  129735. "muls r6, %[d1]\n\t"
  129736. #else
  129737. "mul r6, %[d1]\n\t"
  129738. #endif
  129739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129740. "adds r5, r5, r6\n\t"
  129741. #else
  129742. "add r5, r5, r6\n\t"
  129743. #endif
  129744. "uxth r6, %[div]\n\t"
  129745. #ifdef WOLFSSL_KEIL
  129746. "muls %[d1], r6, %[d1]\n\t"
  129747. #elif defined(__clang__)
  129748. "muls %[d1], r6\n\t"
  129749. #else
  129750. "mul %[d1], r6\n\t"
  129751. #endif
  129752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129753. "lsrs r6, %[d1], #16\n\t"
  129754. #else
  129755. "lsr r6, %[d1], #16\n\t"
  129756. #endif
  129757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129758. "lsls %[d1], %[d1], #16\n\t"
  129759. #else
  129760. "lsl %[d1], %[d1], #16\n\t"
  129761. #endif
  129762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129763. "adds r4, r4, %[d1]\n\t"
  129764. #else
  129765. "add r4, r4, %[d1]\n\t"
  129766. #endif
  129767. #ifdef WOLFSSL_KEIL
  129768. "adcs r5, r5, r6\n\t"
  129769. #elif defined(__clang__)
  129770. "adcs r5, r6\n\t"
  129771. #else
  129772. "adc r5, r6\n\t"
  129773. #endif
  129774. "# r * div - Done\n\t"
  129775. "mov %[d1], r8\n\t"
  129776. "mov r6, r9\n\t"
  129777. #ifdef WOLFSSL_KEIL
  129778. "subs r4, %[d1], r4\n\t"
  129779. #else
  129780. #ifdef __clang__
  129781. "subs r4, %[d1], r4\n\t"
  129782. #else
  129783. "sub r4, %[d1], r4\n\t"
  129784. #endif
  129785. #endif
  129786. #ifdef WOLFSSL_KEIL
  129787. "sbcs r6, r6, r5\n\t"
  129788. #elif defined(__clang__)
  129789. "sbcs r6, r5\n\t"
  129790. #else
  129791. "sbc r6, r5\n\t"
  129792. #endif
  129793. "movs r5, r6\n\t"
  129794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129795. "adds r3, r3, r5\n\t"
  129796. #else
  129797. "add r3, r3, r5\n\t"
  129798. #endif
  129799. "# r * div - Start\n\t"
  129800. "uxth %[d1], r3\n\t"
  129801. "uxth r4, %[div]\n\t"
  129802. #ifdef WOLFSSL_KEIL
  129803. "muls r4, %[d1], r4\n\t"
  129804. #elif defined(__clang__)
  129805. "muls r4, %[d1]\n\t"
  129806. #else
  129807. "mul r4, %[d1]\n\t"
  129808. #endif
  129809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129810. "lsrs r6, %[div], #16\n\t"
  129811. #else
  129812. "lsr r6, %[div], #16\n\t"
  129813. #endif
  129814. #ifdef WOLFSSL_KEIL
  129815. "muls %[d1], r6, %[d1]\n\t"
  129816. #elif defined(__clang__)
  129817. "muls %[d1], r6\n\t"
  129818. #else
  129819. "mul %[d1], r6\n\t"
  129820. #endif
  129821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129822. "lsrs r5, %[d1], #16\n\t"
  129823. #else
  129824. "lsr r5, %[d1], #16\n\t"
  129825. #endif
  129826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129827. "lsls %[d1], %[d1], #16\n\t"
  129828. #else
  129829. "lsl %[d1], %[d1], #16\n\t"
  129830. #endif
  129831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129832. "adds r4, r4, %[d1]\n\t"
  129833. #else
  129834. "add r4, r4, %[d1]\n\t"
  129835. #endif
  129836. #ifdef WOLFSSL_KEIL
  129837. "adcs r5, r5, r7\n\t"
  129838. #elif defined(__clang__)
  129839. "adcs r5, r7\n\t"
  129840. #else
  129841. "adc r5, r7\n\t"
  129842. #endif
  129843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129844. "lsrs %[d1], r3, #16\n\t"
  129845. #else
  129846. "lsr %[d1], r3, #16\n\t"
  129847. #endif
  129848. #ifdef WOLFSSL_KEIL
  129849. "muls r6, %[d1], r6\n\t"
  129850. #elif defined(__clang__)
  129851. "muls r6, %[d1]\n\t"
  129852. #else
  129853. "mul r6, %[d1]\n\t"
  129854. #endif
  129855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129856. "adds r5, r5, r6\n\t"
  129857. #else
  129858. "add r5, r5, r6\n\t"
  129859. #endif
  129860. "uxth r6, %[div]\n\t"
  129861. #ifdef WOLFSSL_KEIL
  129862. "muls %[d1], r6, %[d1]\n\t"
  129863. #elif defined(__clang__)
  129864. "muls %[d1], r6\n\t"
  129865. #else
  129866. "mul %[d1], r6\n\t"
  129867. #endif
  129868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129869. "lsrs r6, %[d1], #16\n\t"
  129870. #else
  129871. "lsr r6, %[d1], #16\n\t"
  129872. #endif
  129873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129874. "lsls %[d1], %[d1], #16\n\t"
  129875. #else
  129876. "lsl %[d1], %[d1], #16\n\t"
  129877. #endif
  129878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129879. "adds r4, r4, %[d1]\n\t"
  129880. #else
  129881. "add r4, r4, %[d1]\n\t"
  129882. #endif
  129883. #ifdef WOLFSSL_KEIL
  129884. "adcs r5, r5, r6\n\t"
  129885. #elif defined(__clang__)
  129886. "adcs r5, r6\n\t"
  129887. #else
  129888. "adc r5, r6\n\t"
  129889. #endif
  129890. "# r * div - Done\n\t"
  129891. "mov %[d1], r8\n\t"
  129892. "mov r6, r9\n\t"
  129893. #ifdef WOLFSSL_KEIL
  129894. "subs r4, %[d1], r4\n\t"
  129895. #else
  129896. #ifdef __clang__
  129897. "subs r4, %[d1], r4\n\t"
  129898. #else
  129899. "sub r4, %[d1], r4\n\t"
  129900. #endif
  129901. #endif
  129902. #ifdef WOLFSSL_KEIL
  129903. "sbcs r6, r6, r5\n\t"
  129904. #elif defined(__clang__)
  129905. "sbcs r6, r5\n\t"
  129906. #else
  129907. "sbc r6, r5\n\t"
  129908. #endif
  129909. "movs r5, r6\n\t"
  129910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129911. "adds r3, r3, r5\n\t"
  129912. #else
  129913. "add r3, r3, r5\n\t"
  129914. #endif
  129915. "# r * div - Start\n\t"
  129916. "uxth %[d1], r3\n\t"
  129917. "uxth r4, %[div]\n\t"
  129918. #ifdef WOLFSSL_KEIL
  129919. "muls r4, %[d1], r4\n\t"
  129920. #elif defined(__clang__)
  129921. "muls r4, %[d1]\n\t"
  129922. #else
  129923. "mul r4, %[d1]\n\t"
  129924. #endif
  129925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129926. "lsrs r6, %[div], #16\n\t"
  129927. #else
  129928. "lsr r6, %[div], #16\n\t"
  129929. #endif
  129930. #ifdef WOLFSSL_KEIL
  129931. "muls %[d1], r6, %[d1]\n\t"
  129932. #elif defined(__clang__)
  129933. "muls %[d1], r6\n\t"
  129934. #else
  129935. "mul %[d1], r6\n\t"
  129936. #endif
  129937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129938. "lsrs r5, %[d1], #16\n\t"
  129939. #else
  129940. "lsr r5, %[d1], #16\n\t"
  129941. #endif
  129942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129943. "lsls %[d1], %[d1], #16\n\t"
  129944. #else
  129945. "lsl %[d1], %[d1], #16\n\t"
  129946. #endif
  129947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129948. "adds r4, r4, %[d1]\n\t"
  129949. #else
  129950. "add r4, r4, %[d1]\n\t"
  129951. #endif
  129952. #ifdef WOLFSSL_KEIL
  129953. "adcs r5, r5, r7\n\t"
  129954. #elif defined(__clang__)
  129955. "adcs r5, r7\n\t"
  129956. #else
  129957. "adc r5, r7\n\t"
  129958. #endif
  129959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129960. "lsrs %[d1], r3, #16\n\t"
  129961. #else
  129962. "lsr %[d1], r3, #16\n\t"
  129963. #endif
  129964. #ifdef WOLFSSL_KEIL
  129965. "muls r6, %[d1], r6\n\t"
  129966. #elif defined(__clang__)
  129967. "muls r6, %[d1]\n\t"
  129968. #else
  129969. "mul r6, %[d1]\n\t"
  129970. #endif
  129971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129972. "adds r5, r5, r6\n\t"
  129973. #else
  129974. "add r5, r5, r6\n\t"
  129975. #endif
  129976. "uxth r6, %[div]\n\t"
  129977. #ifdef WOLFSSL_KEIL
  129978. "muls %[d1], r6, %[d1]\n\t"
  129979. #elif defined(__clang__)
  129980. "muls %[d1], r6\n\t"
  129981. #else
  129982. "mul %[d1], r6\n\t"
  129983. #endif
  129984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129985. "lsrs r6, %[d1], #16\n\t"
  129986. #else
  129987. "lsr r6, %[d1], #16\n\t"
  129988. #endif
  129989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129990. "lsls %[d1], %[d1], #16\n\t"
  129991. #else
  129992. "lsl %[d1], %[d1], #16\n\t"
  129993. #endif
  129994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  129995. "adds r4, r4, %[d1]\n\t"
  129996. #else
  129997. "add r4, r4, %[d1]\n\t"
  129998. #endif
  129999. #ifdef WOLFSSL_KEIL
  130000. "adcs r5, r5, r6\n\t"
  130001. #elif defined(__clang__)
  130002. "adcs r5, r6\n\t"
  130003. #else
  130004. "adc r5, r6\n\t"
  130005. #endif
  130006. "# r * div - Done\n\t"
  130007. "mov %[d1], r8\n\t"
  130008. "mov r6, r9\n\t"
  130009. #ifdef WOLFSSL_KEIL
  130010. "subs r4, %[d1], r4\n\t"
  130011. #else
  130012. #ifdef __clang__
  130013. "subs r4, %[d1], r4\n\t"
  130014. #else
  130015. "sub r4, %[d1], r4\n\t"
  130016. #endif
  130017. #endif
  130018. #ifdef WOLFSSL_KEIL
  130019. "sbcs r6, r6, r5\n\t"
  130020. #elif defined(__clang__)
  130021. "sbcs r6, r5\n\t"
  130022. #else
  130023. "sbc r6, r5\n\t"
  130024. #endif
  130025. "movs r5, r6\n\t"
  130026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130027. "adds r3, r3, r5\n\t"
  130028. #else
  130029. "add r3, r3, r5\n\t"
  130030. #endif
  130031. "movs r6, %[div]\n\t"
  130032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130033. "subs r6, r6, r4\n\t"
  130034. #else
  130035. "sub r6, r6, r4\n\t"
  130036. #endif
  130037. #ifdef WOLFSSL_KEIL
  130038. "sbcs r6, r6, r6\n\t"
  130039. #elif defined(__clang__)
  130040. "sbcs r6, r6\n\t"
  130041. #else
  130042. "sbc r6, r6\n\t"
  130043. #endif
  130044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130045. "subs r3, r3, r6\n\t"
  130046. #else
  130047. "sub r3, r3, r6\n\t"
  130048. #endif
  130049. "movs %[d1], r3\n\t"
  130050. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  130051. :
  130052. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  130053. );
  130054. return (uint32_t)(size_t)d1;
  130055. }
  130056. /* AND m into each word of a and store in r.
  130057. *
  130058. * r A single precision integer.
  130059. * a A single precision integer.
  130060. * m Mask to AND against each digit.
  130061. */
  130062. static void sp_521_mask_17(sp_digit* r, const sp_digit* a, sp_digit m)
  130063. {
  130064. #ifdef WOLFSSL_SP_SMALL
  130065. int i;
  130066. for (i=0; i<17; i++) {
  130067. r[i] = a[i] & m;
  130068. }
  130069. #else
  130070. int i;
  130071. for (i = 0; i < 16; i += 8) {
  130072. r[i+0] = a[i+0] & m;
  130073. r[i+1] = a[i+1] & m;
  130074. r[i+2] = a[i+2] & m;
  130075. r[i+3] = a[i+3] & m;
  130076. r[i+4] = a[i+4] & m;
  130077. r[i+5] = a[i+5] & m;
  130078. r[i+6] = a[i+6] & m;
  130079. r[i+7] = a[i+7] & m;
  130080. }
  130081. r[16] = a[16] & m;
  130082. #endif
  130083. }
  130084. /* Divide d in a and put remainder into r (m*d + r = a)
  130085. * m is not calculated as it is not needed at this time.
  130086. *
  130087. * a Number to be divided.
  130088. * d Number to divide with.
  130089. * m Multiplier result.
  130090. * r Remainder from the division.
  130091. * returns MP_OKAY indicating success.
  130092. */
  130093. static WC_INLINE int sp_521_div_17(const sp_digit* a, const sp_digit* d, sp_digit* m,
  130094. sp_digit* r)
  130095. {
  130096. sp_digit t1[35];
  130097. sp_digit t2[18];
  130098. sp_digit sd[18];
  130099. sp_digit div;
  130100. sp_digit r1;
  130101. int i;
  130102. ASSERT_SAVED_VECTOR_REGISTERS();
  130103. (void)m;
  130104. div = (d[16] << 23) | (d[15] >> 9);
  130105. XMEMCPY(t1, a, sizeof(*t1) * 2 * 17);
  130106. r1 = sp_521_cmp_17(&t1[17], d) >= 0;
  130107. sp_521_cond_sub_17(&t1[17], &t1[17], d, (sp_digit)0 - r1);
  130108. sp_521_lshift_17(sd, d, 23);
  130109. sp_521_lshift_34(t1, t1, 23);
  130110. for (i = 16; i >= 0; i--) {
  130111. sp_digit hi = t1[17 + i] - (t1[17 + i] == div);
  130112. r1 = div_521_word_17(hi, t1[17 + i - 1], div);
  130113. sp_521_mul_d_17(t2, sd, r1);
  130114. t1[17 + i] += sp_521_sub_in_place_17(&t1[i], t2);
  130115. t1[17 + i] -= t2[17];
  130116. sp_521_mask_17(t2, sd, t1[17 + i]);
  130117. t1[17 + i] += sp_521_add_17(&t1[i], &t1[i], t2);
  130118. sp_521_mask_17(t2, sd, t1[17 + i]);
  130119. t1[17 + i] += sp_521_add_17(&t1[i], &t1[i], t2);
  130120. }
  130121. r1 = sp_521_cmp_17(t1, sd) >= 0;
  130122. sp_521_cond_sub_17(r, t1, sd, (sp_digit)0 - r1);
  130123. sp_521_rshift_17(r, r, 23);
  130124. return MP_OKAY;
  130125. }
  130126. /* Reduce a modulo m into r. (r = a mod m)
  130127. *
  130128. * r A single precision number that is the reduced result.
  130129. * a A single precision number that is to be reduced.
  130130. * m A single precision number that is the modulus to reduce with.
  130131. * returns MP_OKAY indicating success.
  130132. */
  130133. static WC_INLINE int sp_521_mod_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  130134. {
  130135. int ret;
  130136. ret = sp_521_div_17(a, m, NULL, r);
  130137. return ret;
  130138. }
  130139. #endif
  130140. #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY)
  130141. /* Multiply two number mod the order of P521 curve. (r = a * b mod order)
  130142. *
  130143. * r Result of the multiplication.
  130144. * a First operand of the multiplication.
  130145. * b Second operand of the multiplication.
  130146. */
  130147. static void sp_521_mont_mul_order_17(sp_digit* r, const sp_digit* a, const sp_digit* b)
  130148. {
  130149. sp_521_mul_17(r, a, b);
  130150. sp_521_mont_reduce_order_17(r, p521_order, p521_mp_order);
  130151. }
  130152. #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL))
  130153. #ifdef WOLFSSL_SP_SMALL
  130154. /* Order-2 for the P521 curve. */
  130155. static const uint32_t p521_order_minus_2[17] = {
  130156. 0x91386407U,0xbb6fb71eU,0x899c47aeU,0x3bb5c9b8U,0xf709a5d0U,0x7fcc0148U,
  130157. 0xbf2f966bU,0x51868783U,0xfffffffaU,0xffffffffU,0xffffffffU,0xffffffffU,
  130158. 0xffffffffU,0xffffffffU,0xffffffffU,0xffffffffU,0x000001ffU
  130159. };
  130160. #else
  130161. /* The low half of the order-2 of the P521 curve. */
  130162. static const uint32_t p521_order_low[9] = {
  130163. 0x91386407U,0xbb6fb71eU,0x899c47aeU,0x3bb5c9b8U,0xf709a5d0U,0x7fcc0148U,
  130164. 0xbf2f966bU,0x51868783U,0xfffffffaU
  130165. };
  130166. #endif /* WOLFSSL_SP_SMALL */
  130167. /* Square number mod the order of P521 curve. (r = a * a mod order)
  130168. *
  130169. * r Result of the squaring.
  130170. * a Number to square.
  130171. */
  130172. static void sp_521_mont_sqr_order_17(sp_digit* r, const sp_digit* a)
  130173. {
  130174. sp_521_sqr_17(r, a);
  130175. sp_521_mont_reduce_order_17(r, p521_order, p521_mp_order);
  130176. }
  130177. #ifndef WOLFSSL_SP_SMALL
  130178. /* Square number mod the order of P521 curve a number of times.
  130179. * (r = a ^ n mod order)
  130180. *
  130181. * r Result of the squaring.
  130182. * a Number to square.
  130183. */
  130184. static void sp_521_mont_sqr_n_order_17(sp_digit* r, const sp_digit* a, int n)
  130185. {
  130186. int i;
  130187. sp_521_mont_sqr_order_17(r, a);
  130188. for (i=1; i<n; i++) {
  130189. sp_521_mont_sqr_order_17(r, r);
  130190. }
  130191. }
  130192. #endif /* !WOLFSSL_SP_SMALL */
  130193. /* Invert the number, in Montgomery form, modulo the order of the P521 curve.
  130194. * (r = 1 / a mod order)
  130195. *
  130196. * r Inverse result.
  130197. * a Number to invert.
  130198. * td Temporary data.
  130199. */
  130200. #ifdef WOLFSSL_SP_NONBLOCK
  130201. typedef struct sp_521_mont_inv_order_17_ctx {
  130202. int state;
  130203. int i;
  130204. } sp_521_mont_inv_order_17_ctx;
  130205. static int sp_521_mont_inv_order_17_nb(sp_ecc_ctx_t* sp_ctx, sp_digit* r, const sp_digit* a,
  130206. sp_digit* t)
  130207. {
  130208. int err = FP_WOULDBLOCK;
  130209. sp_521_mont_inv_order_17_ctx* ctx = (sp_521_mont_inv_order_17_ctx*)sp_ctx;
  130210. typedef char ctx_size_test[sizeof(sp_521_mont_inv_order_17_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  130211. (void)sizeof(ctx_size_test);
  130212. switch (ctx->state) {
  130213. case 0:
  130214. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  130215. ctx->i = 519;
  130216. ctx->state = 1;
  130217. break;
  130218. case 1:
  130219. sp_521_mont_sqr_order_17(t, t);
  130220. ctx->state = 2;
  130221. break;
  130222. case 2:
  130223. if ((p521_order_minus_2[ctx->i / 32] & ((sp_int_digit)1 << (ctx->i % 32))) != 0) {
  130224. sp_521_mont_mul_order_17(t, t, a);
  130225. }
  130226. ctx->i--;
  130227. ctx->state = (ctx->i == 0) ? 3 : 1;
  130228. break;
  130229. case 3:
  130230. XMEMCPY(r, t, sizeof(sp_digit) * 17U);
  130231. err = MP_OKAY;
  130232. break;
  130233. }
  130234. return err;
  130235. }
  130236. #endif /* WOLFSSL_SP_NONBLOCK */
  130237. static void sp_521_mont_inv_order_17(sp_digit* r, const sp_digit* a,
  130238. sp_digit* td)
  130239. {
  130240. #ifdef WOLFSSL_SP_SMALL
  130241. sp_digit* t = td;
  130242. int i;
  130243. XMEMCPY(t, a, sizeof(sp_digit) * 17);
  130244. for (i=519; i>=0; i--) {
  130245. sp_521_mont_sqr_order_17(t, t);
  130246. if ((p521_order_minus_2[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  130247. sp_521_mont_mul_order_17(t, t, a);
  130248. }
  130249. }
  130250. XMEMCPY(r, t, sizeof(sp_digit) * 17U);
  130251. #else
  130252. sp_digit* t = td;
  130253. sp_digit* t2 = td + 2 * 17;
  130254. sp_digit* t3 = td + 4 * 17;
  130255. int i;
  130256. /* t = a^2 */
  130257. sp_521_mont_sqr_order_17(t, a);
  130258. /* t = a^3 = t * a */
  130259. sp_521_mont_mul_order_17(t, t, a);
  130260. /* t= a^c = t ^ 2 ^ 2 */
  130261. sp_521_mont_sqr_n_order_17(t2, t, 2);
  130262. /* t = a^f = t2 * t */
  130263. sp_521_mont_mul_order_17(t, t2, t);
  130264. /* t3 = a^1e */
  130265. sp_521_mont_sqr_order_17(t3, t);
  130266. /* t3 = a^1f = t3 * a */
  130267. sp_521_mont_mul_order_17(t3, t3, a);
  130268. /* t2= a^f0 = t ^ 2 ^ 4 */
  130269. sp_521_mont_sqr_n_order_17(t2, t, 4);
  130270. /* t = a^ff = t2 * t */
  130271. sp_521_mont_mul_order_17(t, t2, t);
  130272. /* t2= a^ff00 = t ^ 2 ^ 8 */
  130273. sp_521_mont_sqr_n_order_17(t2, t, 8);
  130274. /* t3= a^ffff = t2 * t */
  130275. sp_521_mont_mul_order_17(t, t2, t);
  130276. /* t2= a^ffff0000 = t ^ 2 ^ 16 */
  130277. sp_521_mont_sqr_n_order_17(t2, t, 16);
  130278. /* t = a^ffffffff = t2 * t */
  130279. sp_521_mont_mul_order_17(t, t2, t);
  130280. /* t2= a^ffffffff00000000 = t ^ 2 ^ 32 */
  130281. sp_521_mont_sqr_n_order_17(t2, t, 32);
  130282. /* t = a^ffffffffffffffff = t2 * t */
  130283. sp_521_mont_mul_order_17(t, t2, t);
  130284. /* t2= a^ffffffffffffffff0000000000000000 = t ^ 2 ^ 64 */
  130285. sp_521_mont_sqr_n_order_17(t2, t, 64);
  130286. /* t = a^ffffffffffffffffffffffffffffffff = t2 * t */
  130287. sp_521_mont_mul_order_17(t, t2, t);
  130288. /* t2= a^ffffffffffffffffffffffffffffffff00000000000000000000000000000000 = t ^ 2 ^ 128 */
  130289. sp_521_mont_sqr_n_order_17(t2, t, 128);
  130290. /* t = a^ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff = t2 * t */
  130291. sp_521_mont_mul_order_17(t, t2, t);
  130292. /* t2 = a^1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0 */
  130293. sp_521_mont_sqr_n_order_17(t2, t, 5);
  130294. /* t2 = a^1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff = t * t3 */
  130295. sp_521_mont_mul_order_17(t2, t2, t3);
  130296. for (i=259; i>=1; i--) {
  130297. sp_521_mont_sqr_order_17(t2, t2);
  130298. if ((p521_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) {
  130299. sp_521_mont_mul_order_17(t2, t2, a);
  130300. }
  130301. }
  130302. sp_521_mont_sqr_order_17(t2, t2);
  130303. sp_521_mont_mul_order_17(r, t2, a);
  130304. #endif /* WOLFSSL_SP_SMALL */
  130305. }
  130306. #endif /* HAVE_ECC_SIGN || (HAVE_ECC_VERIFY && WOLFSSL_SP_SMALL) */
  130307. #endif /* HAVE_ECC_SIGN | HAVE_ECC_VERIFY */
  130308. #ifdef HAVE_ECC_SIGN
  130309. #ifndef SP_ECC_MAX_SIG_GEN
  130310. #define SP_ECC_MAX_SIG_GEN 64
  130311. #endif
  130312. /* Calculate second signature value S from R, k and private value.
  130313. *
  130314. * s = (r * x + e) / k
  130315. *
  130316. * s Signature value.
  130317. * r First signature value.
  130318. * k Ephemeral private key.
  130319. * x Private key as a number.
  130320. * e Hash of message as a number.
  130321. * tmp Temporary storage for intermediate numbers.
  130322. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  130323. */
  130324. static int sp_521_calc_s_17(sp_digit* s, const sp_digit* r, sp_digit* k,
  130325. sp_digit* x, const sp_digit* e, sp_digit* tmp)
  130326. {
  130327. int err;
  130328. sp_digit carry;
  130329. sp_int32 c;
  130330. sp_digit* kInv = k;
  130331. /* Conv k to Montgomery form (mod order) */
  130332. sp_521_mul_17(k, k, p521_norm_order);
  130333. err = sp_521_mod_17(k, k, p521_order);
  130334. if (err == MP_OKAY) {
  130335. sp_521_norm_17(k);
  130336. /* kInv = 1/k mod order */
  130337. sp_521_mont_inv_order_17(kInv, k, tmp);
  130338. sp_521_norm_17(kInv);
  130339. /* s = r * x + e */
  130340. sp_521_mul_17(x, x, r);
  130341. err = sp_521_mod_17(x, x, p521_order);
  130342. }
  130343. if (err == MP_OKAY) {
  130344. sp_521_norm_17(x);
  130345. carry = sp_521_add_17(s, e, x);
  130346. sp_521_cond_sub_17(s, s, p521_order, 0 - carry);
  130347. sp_521_norm_17(s);
  130348. c = sp_521_cmp_17(s, p521_order);
  130349. sp_521_cond_sub_17(s, s, p521_order,
  130350. (sp_digit)0 - (sp_digit)(c >= 0));
  130351. sp_521_norm_17(s);
  130352. /* s = s * k^-1 mod order */
  130353. sp_521_mont_mul_order_17(s, s, kInv);
  130354. sp_521_norm_17(s);
  130355. }
  130356. return err;
  130357. }
  130358. /* Sign the hash using the private key.
  130359. * e = [hash, 521 bits] from binary
  130360. * r = (k.G)->x mod order
  130361. * s = (r * x + e) / k mod order
  130362. * The hash is truncated to the first 521 bits.
  130363. *
  130364. * hash Hash to sign.
  130365. * hashLen Length of the hash data.
  130366. * rng Random number generator.
  130367. * priv Private part of key - scalar.
  130368. * rm First part of result as an mp_int.
  130369. * sm Sirst part of result as an mp_int.
  130370. * heap Heap to use for allocation.
  130371. * returns RNG failures, MEMORY_E when memory allocation fails and
  130372. * MP_OKAY on success.
  130373. */
  130374. #ifdef WOLFSSL_SP_NONBLOCK
  130375. typedef struct sp_ecc_sign_521_ctx {
  130376. int state;
  130377. union {
  130378. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  130379. sp_521_mont_inv_order_17_ctx mont_inv_order_ctx;
  130380. };
  130381. sp_digit e[2*17];
  130382. sp_digit x[2*17];
  130383. sp_digit k[2*17];
  130384. sp_digit r[2*17];
  130385. sp_digit tmp[3 * 2*17];
  130386. sp_point_521 point;
  130387. sp_digit* s;
  130388. sp_digit* kInv;
  130389. int i;
  130390. } sp_ecc_sign_521_ctx;
  130391. int sp_ecc_sign_521_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash, word32 hashLen, WC_RNG* rng,
  130392. mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  130393. {
  130394. int err = FP_WOULDBLOCK;
  130395. sp_ecc_sign_521_ctx* ctx = (sp_ecc_sign_521_ctx*)sp_ctx->data;
  130396. typedef char ctx_size_test[sizeof(sp_ecc_sign_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  130397. (void)sizeof(ctx_size_test);
  130398. (void)heap;
  130399. switch (ctx->state) {
  130400. case 0: /* INIT */
  130401. ctx->s = ctx->e;
  130402. ctx->kInv = ctx->k;
  130403. ctx->i = SP_ECC_MAX_SIG_GEN;
  130404. ctx->state = 1;
  130405. break;
  130406. case 1: /* GEN */
  130407. /* New random point. */
  130408. if (km == NULL || mp_iszero(km)) {
  130409. err = sp_521_ecc_gen_k_17(rng, ctx->k);
  130410. }
  130411. else {
  130412. sp_521_from_mp(ctx->k, 17, km);
  130413. mp_zero(km);
  130414. }
  130415. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  130416. ctx->state = 2;
  130417. break;
  130418. case 2: /* MULMOD */
  130419. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx,
  130420. &ctx->point, &p521_base, ctx->k, 1, 1, heap);
  130421. if (err == MP_OKAY) {
  130422. ctx->state = 3;
  130423. }
  130424. break;
  130425. case 3: /* MODORDER */
  130426. {
  130427. sp_int32 c;
  130428. /* r = point->x mod order */
  130429. XMEMCPY(ctx->r, ctx->point.x, sizeof(sp_digit) * 17U);
  130430. sp_521_norm_17(ctx->r);
  130431. c = sp_521_cmp_17(ctx->r, p521_order);
  130432. sp_521_cond_sub_17(ctx->r, ctx->r, p521_order,
  130433. (sp_digit)0 - (sp_digit)(c >= 0));
  130434. sp_521_norm_17(ctx->r);
  130435. if (hashLen > 66U) {
  130436. hashLen = 66U;
  130437. }
  130438. sp_521_from_mp(ctx->x, 17, priv);
  130439. sp_521_from_bin(ctx->e, 17, hash, (int)hashLen);
  130440. if (hashLen == 66U) {
  130441. sp_521_rshift_17(ctx->e, ctx->e, 7);
  130442. }
  130443. ctx->state = 4;
  130444. break;
  130445. }
  130446. case 4: /* KMODORDER */
  130447. /* Conv k to Montgomery form (mod order) */
  130448. sp_521_mul_17(ctx->k, ctx->k, p521_norm_order);
  130449. err = sp_521_mod_17(ctx->k, ctx->k, p521_order);
  130450. if (err == MP_OKAY) {
  130451. sp_521_norm_17(ctx->k);
  130452. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  130453. ctx->state = 5;
  130454. }
  130455. break;
  130456. case 5: /* KINV */
  130457. /* kInv = 1/k mod order */
  130458. err = sp_521_mont_inv_order_17_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->kInv, ctx->k, ctx->tmp);
  130459. if (err == MP_OKAY) {
  130460. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  130461. ctx->state = 6;
  130462. }
  130463. break;
  130464. case 6: /* KINVNORM */
  130465. sp_521_norm_17(ctx->kInv);
  130466. ctx->state = 7;
  130467. break;
  130468. case 7: /* R */
  130469. /* s = r * x + e */
  130470. sp_521_mul_17(ctx->x, ctx->x, ctx->r);
  130471. ctx->state = 8;
  130472. break;
  130473. case 8: /* S1 */
  130474. err = sp_521_mod_17(ctx->x, ctx->x, p521_order);
  130475. if (err == MP_OKAY)
  130476. ctx->state = 9;
  130477. break;
  130478. case 9: /* S2 */
  130479. {
  130480. sp_digit carry;
  130481. sp_int32 c;
  130482. sp_521_norm_17(ctx->x);
  130483. carry = sp_521_add_17(ctx->s, ctx->e, ctx->x);
  130484. sp_521_cond_sub_17(ctx->s, ctx->s,
  130485. p521_order, 0 - carry);
  130486. sp_521_norm_17(ctx->s);
  130487. c = sp_521_cmp_17(ctx->s, p521_order);
  130488. sp_521_cond_sub_17(ctx->s, ctx->s, p521_order,
  130489. (sp_digit)0 - (sp_digit)(c >= 0));
  130490. sp_521_norm_17(ctx->s);
  130491. /* s = s * k^-1 mod order */
  130492. sp_521_mont_mul_order_17(ctx->s, ctx->s, ctx->kInv);
  130493. sp_521_norm_17(ctx->s);
  130494. /* Check that signature is usable. */
  130495. if (sp_521_iszero_17(ctx->s) == 0) {
  130496. ctx->state = 10;
  130497. break;
  130498. }
  130499. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  130500. ctx->i = 1;
  130501. #endif
  130502. /* not usable gen, try again */
  130503. ctx->i--;
  130504. if (ctx->i == 0) {
  130505. err = RNG_FAILURE_E;
  130506. }
  130507. ctx->state = 1;
  130508. break;
  130509. }
  130510. case 10: /* RES */
  130511. err = sp_521_to_mp(ctx->r, rm);
  130512. if (err == MP_OKAY) {
  130513. err = sp_521_to_mp(ctx->s, sm);
  130514. }
  130515. break;
  130516. }
  130517. if (err == MP_OKAY && ctx->state != 10) {
  130518. err = FP_WOULDBLOCK;
  130519. }
  130520. if (err != FP_WOULDBLOCK) {
  130521. XMEMSET(ctx->e, 0, sizeof(sp_digit) * 2U * 17U);
  130522. XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 17U);
  130523. XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 17U);
  130524. XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 17U);
  130525. XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 17U);
  130526. }
  130527. return err;
  130528. }
  130529. #endif /* WOLFSSL_SP_NONBLOCK */
  130530. int sp_ecc_sign_521(const byte* hash, word32 hashLen, WC_RNG* rng,
  130531. const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap)
  130532. {
  130533. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  130534. sp_digit* e = NULL;
  130535. sp_point_521* point = NULL;
  130536. #else
  130537. sp_digit e[7 * 2 * 17];
  130538. sp_point_521 point[1];
  130539. #endif
  130540. sp_digit* x = NULL;
  130541. sp_digit* k = NULL;
  130542. sp_digit* r = NULL;
  130543. sp_digit* tmp = NULL;
  130544. sp_digit* s = NULL;
  130545. sp_int32 c;
  130546. int err = MP_OKAY;
  130547. int i;
  130548. (void)heap;
  130549. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  130550. if (err == MP_OKAY) {
  130551. point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap,
  130552. DYNAMIC_TYPE_ECC);
  130553. if (point == NULL)
  130554. err = MEMORY_E;
  130555. }
  130556. if (err == MP_OKAY) {
  130557. e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 17, heap,
  130558. DYNAMIC_TYPE_ECC);
  130559. if (e == NULL)
  130560. err = MEMORY_E;
  130561. }
  130562. #endif
  130563. if (err == MP_OKAY) {
  130564. x = e + 2 * 17;
  130565. k = e + 4 * 17;
  130566. r = e + 6 * 17;
  130567. tmp = e + 8 * 17;
  130568. s = e;
  130569. if (hashLen > 66U) {
  130570. hashLen = 66U;
  130571. }
  130572. }
  130573. for (i = SP_ECC_MAX_SIG_GEN; err == MP_OKAY && i > 0; i--) {
  130574. /* New random point. */
  130575. if (km == NULL || mp_iszero(km)) {
  130576. err = sp_521_ecc_gen_k_17(rng, k);
  130577. }
  130578. else {
  130579. sp_521_from_mp(k, 17, km);
  130580. mp_zero(km);
  130581. }
  130582. if (err == MP_OKAY) {
  130583. err = sp_521_ecc_mulmod_base_17(point, k, 1, 1, heap);
  130584. }
  130585. if (err == MP_OKAY) {
  130586. /* r = point->x mod order */
  130587. XMEMCPY(r, point->x, sizeof(sp_digit) * 17U);
  130588. sp_521_norm_17(r);
  130589. c = sp_521_cmp_17(r, p521_order);
  130590. sp_521_cond_sub_17(r, r, p521_order,
  130591. (sp_digit)0 - (sp_digit)(c >= 0));
  130592. sp_521_norm_17(r);
  130593. sp_521_from_mp(x, 17, priv);
  130594. sp_521_from_bin(e, 17, hash, (int)hashLen);
  130595. if (hashLen == 66U) {
  130596. sp_521_rshift_17(e, e, 7);
  130597. }
  130598. err = sp_521_calc_s_17(s, r, k, x, e, tmp);
  130599. }
  130600. /* Check that signature is usable. */
  130601. if ((err == MP_OKAY) && (sp_521_iszero_17(s) == 0)) {
  130602. break;
  130603. }
  130604. #ifdef WOLFSSL_ECDSA_SET_K_ONE_LOOP
  130605. i = 1;
  130606. #endif
  130607. }
  130608. if (i == 0) {
  130609. err = RNG_FAILURE_E;
  130610. }
  130611. if (err == MP_OKAY) {
  130612. err = sp_521_to_mp(r, rm);
  130613. }
  130614. if (err == MP_OKAY) {
  130615. err = sp_521_to_mp(s, sm);
  130616. }
  130617. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  130618. if (e != NULL)
  130619. #endif
  130620. {
  130621. ForceZero(e, sizeof(sp_digit) * 7 * 2 * 17);
  130622. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  130623. XFREE(e, heap, DYNAMIC_TYPE_ECC);
  130624. #endif
  130625. }
  130626. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  130627. if (point != NULL)
  130628. #endif
  130629. {
  130630. ForceZero(point, sizeof(sp_point_521));
  130631. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  130632. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  130633. #endif
  130634. }
  130635. return err;
  130636. }
  130637. #endif /* HAVE_ECC_SIGN */
  130638. #ifndef WOLFSSL_SP_SMALL
  130639. /* Divide the number by 2 mod the modulus. (r = a / 2 % m)
  130640. *
  130641. * r Result of division by 2.
  130642. * a Number to divide.
  130643. * m Modulus.
  130644. */
  130645. static void sp_521_div2_mod_17(sp_digit* r, const sp_digit* a,
  130646. const sp_digit* m)
  130647. {
  130648. __asm__ __volatile__ (
  130649. "ldr r3, [%[a]]\n\t"
  130650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130651. "lsls r3, r3, #31\n\t"
  130652. #else
  130653. "lsl r3, r3, #31\n\t"
  130654. #endif
  130655. "beq L_sp_521_div2_mod_17_no_add_%=\n\t"
  130656. "ldr r4, [%[a]]\n\t"
  130657. "ldr r5, [%[a], #4]\n\t"
  130658. "ldr r6, [%[m]]\n\t"
  130659. "ldr r7, [%[m], #4]\n\t"
  130660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130661. "adds r4, r4, r6\n\t"
  130662. #else
  130663. "add r4, r4, r6\n\t"
  130664. #endif
  130665. #ifdef WOLFSSL_KEIL
  130666. "adcs r5, r5, r7\n\t"
  130667. #elif defined(__clang__)
  130668. "adcs r5, r7\n\t"
  130669. #else
  130670. "adc r5, r7\n\t"
  130671. #endif
  130672. "str r4, [%[r]]\n\t"
  130673. "str r5, [%[r], #4]\n\t"
  130674. "ldr r4, [%[a], #8]\n\t"
  130675. "ldr r5, [%[a], #12]\n\t"
  130676. "ldr r6, [%[m], #8]\n\t"
  130677. "ldr r7, [%[m], #12]\n\t"
  130678. #ifdef WOLFSSL_KEIL
  130679. "adcs r4, r4, r6\n\t"
  130680. #elif defined(__clang__)
  130681. "adcs r4, r6\n\t"
  130682. #else
  130683. "adc r4, r6\n\t"
  130684. #endif
  130685. #ifdef WOLFSSL_KEIL
  130686. "adcs r5, r5, r7\n\t"
  130687. #elif defined(__clang__)
  130688. "adcs r5, r7\n\t"
  130689. #else
  130690. "adc r5, r7\n\t"
  130691. #endif
  130692. "str r4, [%[r], #8]\n\t"
  130693. "str r5, [%[r], #12]\n\t"
  130694. "ldr r4, [%[a], #16]\n\t"
  130695. "ldr r5, [%[a], #20]\n\t"
  130696. "ldr r6, [%[m], #16]\n\t"
  130697. "ldr r7, [%[m], #20]\n\t"
  130698. #ifdef WOLFSSL_KEIL
  130699. "adcs r4, r4, r6\n\t"
  130700. #elif defined(__clang__)
  130701. "adcs r4, r6\n\t"
  130702. #else
  130703. "adc r4, r6\n\t"
  130704. #endif
  130705. #ifdef WOLFSSL_KEIL
  130706. "adcs r5, r5, r7\n\t"
  130707. #elif defined(__clang__)
  130708. "adcs r5, r7\n\t"
  130709. #else
  130710. "adc r5, r7\n\t"
  130711. #endif
  130712. "str r4, [%[r], #16]\n\t"
  130713. "str r5, [%[r], #20]\n\t"
  130714. "ldr r4, [%[a], #24]\n\t"
  130715. "ldr r5, [%[a], #28]\n\t"
  130716. "ldr r6, [%[m], #24]\n\t"
  130717. "ldr r7, [%[m], #28]\n\t"
  130718. #ifdef WOLFSSL_KEIL
  130719. "adcs r4, r4, r6\n\t"
  130720. #elif defined(__clang__)
  130721. "adcs r4, r6\n\t"
  130722. #else
  130723. "adc r4, r6\n\t"
  130724. #endif
  130725. #ifdef WOLFSSL_KEIL
  130726. "adcs r5, r5, r7\n\t"
  130727. #elif defined(__clang__)
  130728. "adcs r5, r7\n\t"
  130729. #else
  130730. "adc r5, r7\n\t"
  130731. #endif
  130732. "str r4, [%[r], #24]\n\t"
  130733. "str r5, [%[r], #28]\n\t"
  130734. "ldr r4, [%[a], #32]\n\t"
  130735. "ldr r5, [%[a], #36]\n\t"
  130736. "ldr r6, [%[m], #32]\n\t"
  130737. "ldr r7, [%[m], #36]\n\t"
  130738. #ifdef WOLFSSL_KEIL
  130739. "adcs r4, r4, r6\n\t"
  130740. #elif defined(__clang__)
  130741. "adcs r4, r6\n\t"
  130742. #else
  130743. "adc r4, r6\n\t"
  130744. #endif
  130745. #ifdef WOLFSSL_KEIL
  130746. "adcs r5, r5, r7\n\t"
  130747. #elif defined(__clang__)
  130748. "adcs r5, r7\n\t"
  130749. #else
  130750. "adc r5, r7\n\t"
  130751. #endif
  130752. "str r4, [%[r], #32]\n\t"
  130753. "str r5, [%[r], #36]\n\t"
  130754. "ldr r4, [%[a], #40]\n\t"
  130755. "ldr r5, [%[a], #44]\n\t"
  130756. "ldr r6, [%[m], #40]\n\t"
  130757. "ldr r7, [%[m], #44]\n\t"
  130758. #ifdef WOLFSSL_KEIL
  130759. "adcs r4, r4, r6\n\t"
  130760. #elif defined(__clang__)
  130761. "adcs r4, r6\n\t"
  130762. #else
  130763. "adc r4, r6\n\t"
  130764. #endif
  130765. #ifdef WOLFSSL_KEIL
  130766. "adcs r5, r5, r7\n\t"
  130767. #elif defined(__clang__)
  130768. "adcs r5, r7\n\t"
  130769. #else
  130770. "adc r5, r7\n\t"
  130771. #endif
  130772. "str r4, [%[r], #40]\n\t"
  130773. "str r5, [%[r], #44]\n\t"
  130774. "ldr r4, [%[a], #48]\n\t"
  130775. "ldr r5, [%[a], #52]\n\t"
  130776. "ldr r6, [%[m], #48]\n\t"
  130777. "ldr r7, [%[m], #52]\n\t"
  130778. #ifdef WOLFSSL_KEIL
  130779. "adcs r4, r4, r6\n\t"
  130780. #elif defined(__clang__)
  130781. "adcs r4, r6\n\t"
  130782. #else
  130783. "adc r4, r6\n\t"
  130784. #endif
  130785. #ifdef WOLFSSL_KEIL
  130786. "adcs r5, r5, r7\n\t"
  130787. #elif defined(__clang__)
  130788. "adcs r5, r7\n\t"
  130789. #else
  130790. "adc r5, r7\n\t"
  130791. #endif
  130792. "str r4, [%[r], #48]\n\t"
  130793. "str r5, [%[r], #52]\n\t"
  130794. "ldr r4, [%[a], #56]\n\t"
  130795. "ldr r5, [%[a], #60]\n\t"
  130796. "ldr r6, [%[m], #56]\n\t"
  130797. "ldr r7, [%[m], #60]\n\t"
  130798. #ifdef WOLFSSL_KEIL
  130799. "adcs r4, r4, r6\n\t"
  130800. #elif defined(__clang__)
  130801. "adcs r4, r6\n\t"
  130802. #else
  130803. "adc r4, r6\n\t"
  130804. #endif
  130805. #ifdef WOLFSSL_KEIL
  130806. "adcs r5, r5, r7\n\t"
  130807. #elif defined(__clang__)
  130808. "adcs r5, r7\n\t"
  130809. #else
  130810. "adc r5, r7\n\t"
  130811. #endif
  130812. "str r4, [%[r], #56]\n\t"
  130813. "str r5, [%[r], #60]\n\t"
  130814. "ldr r4, [%[a], #64]\n\t"
  130815. "ldr r6, [%[m], #64]\n\t"
  130816. #ifdef WOLFSSL_KEIL
  130817. "adcs r4, r4, r6\n\t"
  130818. #elif defined(__clang__)
  130819. "adcs r4, r6\n\t"
  130820. #else
  130821. "adc r4, r6\n\t"
  130822. #endif
  130823. "str r4, [%[r], #64]\n\t"
  130824. "movs r3, #0\n\t"
  130825. #ifdef WOLFSSL_KEIL
  130826. "adcs r3, r3, r3\n\t"
  130827. #elif defined(__clang__)
  130828. "adcs r3, r3\n\t"
  130829. #else
  130830. "adc r3, r3\n\t"
  130831. #endif
  130832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130833. "lsls r3, r3, #31\n\t"
  130834. #else
  130835. "lsl r3, r3, #31\n\t"
  130836. #endif
  130837. "b L_sp_521_div2_mod_17_div2_%=\n\t"
  130838. "\n"
  130839. "L_sp_521_div2_mod_17_no_add_%=:\n\t"
  130840. "ldr r4, [%[a]]\n\t"
  130841. "ldr r5, [%[a], #4]\n\t"
  130842. "str r4, [%[r]]\n\t"
  130843. "str r5, [%[r], #4]\n\t"
  130844. "ldr r4, [%[a], #8]\n\t"
  130845. "ldr r5, [%[a], #12]\n\t"
  130846. "str r4, [%[r], #8]\n\t"
  130847. "str r5, [%[r], #12]\n\t"
  130848. "ldr r4, [%[a], #16]\n\t"
  130849. "ldr r5, [%[a], #20]\n\t"
  130850. "str r4, [%[r], #16]\n\t"
  130851. "str r5, [%[r], #20]\n\t"
  130852. "ldr r4, [%[a], #24]\n\t"
  130853. "ldr r5, [%[a], #28]\n\t"
  130854. "str r4, [%[r], #24]\n\t"
  130855. "str r5, [%[r], #28]\n\t"
  130856. "ldr r4, [%[a], #32]\n\t"
  130857. "ldr r5, [%[a], #36]\n\t"
  130858. "str r4, [%[r], #32]\n\t"
  130859. "str r5, [%[r], #36]\n\t"
  130860. "ldr r4, [%[a], #40]\n\t"
  130861. "ldr r5, [%[a], #44]\n\t"
  130862. "str r4, [%[r], #40]\n\t"
  130863. "str r5, [%[r], #44]\n\t"
  130864. "ldr r4, [%[a], #48]\n\t"
  130865. "ldr r5, [%[a], #52]\n\t"
  130866. "str r4, [%[r], #48]\n\t"
  130867. "str r5, [%[r], #52]\n\t"
  130868. "ldr r4, [%[a], #56]\n\t"
  130869. "ldr r5, [%[a], #60]\n\t"
  130870. "str r4, [%[r], #56]\n\t"
  130871. "str r5, [%[r], #60]\n\t"
  130872. "ldr r4, [%[a], #64]\n\t"
  130873. "str r4, [%[r], #64]\n\t"
  130874. "\n"
  130875. "L_sp_521_div2_mod_17_div2_%=:\n\t"
  130876. "ldr r4, [%[r]]\n\t"
  130877. "ldr r5, [%[r], #4]\n\t"
  130878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130879. "lsrs r4, r4, #1\n\t"
  130880. #else
  130881. "lsr r4, r4, #1\n\t"
  130882. #endif
  130883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130884. "lsls r6, r5, #31\n\t"
  130885. #else
  130886. "lsl r6, r5, #31\n\t"
  130887. #endif
  130888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130889. "lsrs r5, r5, #1\n\t"
  130890. #else
  130891. "lsr r5, r5, #1\n\t"
  130892. #endif
  130893. #ifdef WOLFSSL_KEIL
  130894. "orrs r4, r4, r6\n\t"
  130895. #elif defined(__clang__)
  130896. "orrs r4, r6\n\t"
  130897. #else
  130898. "orr r4, r6\n\t"
  130899. #endif
  130900. "ldr r7, [%[r], #8]\n\t"
  130901. "str r4, [%[r]]\n\t"
  130902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130903. "lsls r6, r7, #31\n\t"
  130904. #else
  130905. "lsl r6, r7, #31\n\t"
  130906. #endif
  130907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130908. "lsrs r7, r7, #1\n\t"
  130909. #else
  130910. "lsr r7, r7, #1\n\t"
  130911. #endif
  130912. #ifdef WOLFSSL_KEIL
  130913. "orrs r5, r5, r6\n\t"
  130914. #elif defined(__clang__)
  130915. "orrs r5, r6\n\t"
  130916. #else
  130917. "orr r5, r6\n\t"
  130918. #endif
  130919. "ldr r4, [%[r], #12]\n\t"
  130920. "str r5, [%[r], #4]\n\t"
  130921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130922. "lsls r6, r4, #31\n\t"
  130923. #else
  130924. "lsl r6, r4, #31\n\t"
  130925. #endif
  130926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130927. "lsrs r4, r4, #1\n\t"
  130928. #else
  130929. "lsr r4, r4, #1\n\t"
  130930. #endif
  130931. #ifdef WOLFSSL_KEIL
  130932. "orrs r7, r7, r6\n\t"
  130933. #elif defined(__clang__)
  130934. "orrs r7, r6\n\t"
  130935. #else
  130936. "orr r7, r6\n\t"
  130937. #endif
  130938. "ldr r5, [%[r], #16]\n\t"
  130939. "str r7, [%[r], #8]\n\t"
  130940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130941. "lsls r6, r5, #31\n\t"
  130942. #else
  130943. "lsl r6, r5, #31\n\t"
  130944. #endif
  130945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130946. "lsrs r5, r5, #1\n\t"
  130947. #else
  130948. "lsr r5, r5, #1\n\t"
  130949. #endif
  130950. #ifdef WOLFSSL_KEIL
  130951. "orrs r4, r4, r6\n\t"
  130952. #elif defined(__clang__)
  130953. "orrs r4, r6\n\t"
  130954. #else
  130955. "orr r4, r6\n\t"
  130956. #endif
  130957. "ldr r7, [%[r], #20]\n\t"
  130958. "str r4, [%[r], #12]\n\t"
  130959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130960. "lsls r6, r7, #31\n\t"
  130961. #else
  130962. "lsl r6, r7, #31\n\t"
  130963. #endif
  130964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130965. "lsrs r7, r7, #1\n\t"
  130966. #else
  130967. "lsr r7, r7, #1\n\t"
  130968. #endif
  130969. #ifdef WOLFSSL_KEIL
  130970. "orrs r5, r5, r6\n\t"
  130971. #elif defined(__clang__)
  130972. "orrs r5, r6\n\t"
  130973. #else
  130974. "orr r5, r6\n\t"
  130975. #endif
  130976. "ldr r4, [%[r], #24]\n\t"
  130977. "str r5, [%[r], #16]\n\t"
  130978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130979. "lsls r6, r4, #31\n\t"
  130980. #else
  130981. "lsl r6, r4, #31\n\t"
  130982. #endif
  130983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130984. "lsrs r4, r4, #1\n\t"
  130985. #else
  130986. "lsr r4, r4, #1\n\t"
  130987. #endif
  130988. #ifdef WOLFSSL_KEIL
  130989. "orrs r7, r7, r6\n\t"
  130990. #elif defined(__clang__)
  130991. "orrs r7, r6\n\t"
  130992. #else
  130993. "orr r7, r6\n\t"
  130994. #endif
  130995. "ldr r5, [%[r], #28]\n\t"
  130996. "str r7, [%[r], #20]\n\t"
  130997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  130998. "lsls r6, r5, #31\n\t"
  130999. #else
  131000. "lsl r6, r5, #31\n\t"
  131001. #endif
  131002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131003. "lsrs r5, r5, #1\n\t"
  131004. #else
  131005. "lsr r5, r5, #1\n\t"
  131006. #endif
  131007. #ifdef WOLFSSL_KEIL
  131008. "orrs r4, r4, r6\n\t"
  131009. #elif defined(__clang__)
  131010. "orrs r4, r6\n\t"
  131011. #else
  131012. "orr r4, r6\n\t"
  131013. #endif
  131014. "ldr r7, [%[r], #32]\n\t"
  131015. "str r4, [%[r], #24]\n\t"
  131016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131017. "lsls r6, r7, #31\n\t"
  131018. #else
  131019. "lsl r6, r7, #31\n\t"
  131020. #endif
  131021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131022. "lsrs r7, r7, #1\n\t"
  131023. #else
  131024. "lsr r7, r7, #1\n\t"
  131025. #endif
  131026. #ifdef WOLFSSL_KEIL
  131027. "orrs r5, r5, r6\n\t"
  131028. #elif defined(__clang__)
  131029. "orrs r5, r6\n\t"
  131030. #else
  131031. "orr r5, r6\n\t"
  131032. #endif
  131033. "ldr r4, [%[r], #36]\n\t"
  131034. "str r5, [%[r], #28]\n\t"
  131035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131036. "lsls r6, r4, #31\n\t"
  131037. #else
  131038. "lsl r6, r4, #31\n\t"
  131039. #endif
  131040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131041. "lsrs r4, r4, #1\n\t"
  131042. #else
  131043. "lsr r4, r4, #1\n\t"
  131044. #endif
  131045. #ifdef WOLFSSL_KEIL
  131046. "orrs r7, r7, r6\n\t"
  131047. #elif defined(__clang__)
  131048. "orrs r7, r6\n\t"
  131049. #else
  131050. "orr r7, r6\n\t"
  131051. #endif
  131052. "ldr r5, [%[r], #40]\n\t"
  131053. "str r7, [%[r], #32]\n\t"
  131054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131055. "lsls r6, r5, #31\n\t"
  131056. #else
  131057. "lsl r6, r5, #31\n\t"
  131058. #endif
  131059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131060. "lsrs r5, r5, #1\n\t"
  131061. #else
  131062. "lsr r5, r5, #1\n\t"
  131063. #endif
  131064. #ifdef WOLFSSL_KEIL
  131065. "orrs r4, r4, r6\n\t"
  131066. #elif defined(__clang__)
  131067. "orrs r4, r6\n\t"
  131068. #else
  131069. "orr r4, r6\n\t"
  131070. #endif
  131071. "ldr r7, [%[r], #44]\n\t"
  131072. "str r4, [%[r], #36]\n\t"
  131073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131074. "lsls r6, r7, #31\n\t"
  131075. #else
  131076. "lsl r6, r7, #31\n\t"
  131077. #endif
  131078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131079. "lsrs r7, r7, #1\n\t"
  131080. #else
  131081. "lsr r7, r7, #1\n\t"
  131082. #endif
  131083. #ifdef WOLFSSL_KEIL
  131084. "orrs r5, r5, r6\n\t"
  131085. #elif defined(__clang__)
  131086. "orrs r5, r6\n\t"
  131087. #else
  131088. "orr r5, r6\n\t"
  131089. #endif
  131090. "ldr r4, [%[r], #48]\n\t"
  131091. "str r5, [%[r], #40]\n\t"
  131092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131093. "lsls r6, r4, #31\n\t"
  131094. #else
  131095. "lsl r6, r4, #31\n\t"
  131096. #endif
  131097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131098. "lsrs r4, r4, #1\n\t"
  131099. #else
  131100. "lsr r4, r4, #1\n\t"
  131101. #endif
  131102. #ifdef WOLFSSL_KEIL
  131103. "orrs r7, r7, r6\n\t"
  131104. #elif defined(__clang__)
  131105. "orrs r7, r6\n\t"
  131106. #else
  131107. "orr r7, r6\n\t"
  131108. #endif
  131109. "ldr r5, [%[r], #52]\n\t"
  131110. "str r7, [%[r], #44]\n\t"
  131111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131112. "lsls r6, r5, #31\n\t"
  131113. #else
  131114. "lsl r6, r5, #31\n\t"
  131115. #endif
  131116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131117. "lsrs r5, r5, #1\n\t"
  131118. #else
  131119. "lsr r5, r5, #1\n\t"
  131120. #endif
  131121. #ifdef WOLFSSL_KEIL
  131122. "orrs r4, r4, r6\n\t"
  131123. #elif defined(__clang__)
  131124. "orrs r4, r6\n\t"
  131125. #else
  131126. "orr r4, r6\n\t"
  131127. #endif
  131128. "ldr r7, [%[r], #56]\n\t"
  131129. "str r4, [%[r], #48]\n\t"
  131130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131131. "lsls r6, r7, #31\n\t"
  131132. #else
  131133. "lsl r6, r7, #31\n\t"
  131134. #endif
  131135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131136. "lsrs r7, r7, #1\n\t"
  131137. #else
  131138. "lsr r7, r7, #1\n\t"
  131139. #endif
  131140. #ifdef WOLFSSL_KEIL
  131141. "orrs r5, r5, r6\n\t"
  131142. #elif defined(__clang__)
  131143. "orrs r5, r6\n\t"
  131144. #else
  131145. "orr r5, r6\n\t"
  131146. #endif
  131147. "ldr r4, [%[r], #60]\n\t"
  131148. "str r5, [%[r], #52]\n\t"
  131149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131150. "lsls r6, r4, #31\n\t"
  131151. #else
  131152. "lsl r6, r4, #31\n\t"
  131153. #endif
  131154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131155. "lsrs r4, r4, #1\n\t"
  131156. #else
  131157. "lsr r4, r4, #1\n\t"
  131158. #endif
  131159. #ifdef WOLFSSL_KEIL
  131160. "orrs r7, r7, r6\n\t"
  131161. #elif defined(__clang__)
  131162. "orrs r7, r6\n\t"
  131163. #else
  131164. "orr r7, r6\n\t"
  131165. #endif
  131166. "ldr r5, [%[r], #64]\n\t"
  131167. "str r7, [%[r], #56]\n\t"
  131168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131169. "lsls r6, r5, #31\n\t"
  131170. #else
  131171. "lsl r6, r5, #31\n\t"
  131172. #endif
  131173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131174. "lsrs r5, r5, #1\n\t"
  131175. #else
  131176. "lsr r5, r5, #1\n\t"
  131177. #endif
  131178. #ifdef WOLFSSL_KEIL
  131179. "orrs r4, r4, r6\n\t"
  131180. #elif defined(__clang__)
  131181. "orrs r4, r6\n\t"
  131182. #else
  131183. "orr r4, r6\n\t"
  131184. #endif
  131185. #ifdef WOLFSSL_KEIL
  131186. "orrs r5, r5, r3\n\t"
  131187. #elif defined(__clang__)
  131188. "orrs r5, r3\n\t"
  131189. #else
  131190. "orr r5, r3\n\t"
  131191. #endif
  131192. "str r4, [%[r], #60]\n\t"
  131193. "str r5, [%[r], #64]\n\t"
  131194. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  131195. :
  131196. : "memory", "r3", "r4", "r5", "r6", "r7"
  131197. );
  131198. }
  131199. static int sp_521_num_bits_17(sp_digit* a)
  131200. {
  131201. static const byte sp_num_bits_table[256] = {
  131202. 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
  131203. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  131204. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  131205. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  131206. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  131207. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  131208. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  131209. 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  131210. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131211. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131212. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131213. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131214. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131215. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131216. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131217. 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  131218. };
  131219. const byte* table = sp_num_bits_table;
  131220. __asm__ __volatile__ (
  131221. "movs r6, #0xff\n\t"
  131222. "ldr r3, [%[a], #64]\n\t"
  131223. "cmp r3, #0\n\t"
  131224. "beq L_sp_521_num_bits_17_16_%=\n\t"
  131225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131226. "lsrs r5, r3, #24\n\t"
  131227. #else
  131228. "lsr r5, r3, #24\n\t"
  131229. #endif
  131230. "cmp r5, #0\n\t"
  131231. "beq L_sp_521_num_bits_17_183_%=\n\t"
  131232. "movs r2, #2\n\t"
  131233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131234. "lsls r2, r2, #8\n\t"
  131235. #else
  131236. "lsl r2, r2, #8\n\t"
  131237. #endif
  131238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131239. "adds r2, r2, #24\n\t"
  131240. #else
  131241. "add r2, r2, #24\n\t"
  131242. #endif
  131243. "ldrb r4, [%[table], r5]\n\t"
  131244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131245. "adds r2, r2, r4\n\t"
  131246. #else
  131247. "add r2, r2, r4\n\t"
  131248. #endif
  131249. "b L_sp_521_num_bits_17_18_%=\n\t"
  131250. "\n"
  131251. "L_sp_521_num_bits_17_183_%=:\n\t"
  131252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131253. "lsrs r5, r3, #16\n\t"
  131254. #else
  131255. "lsr r5, r3, #16\n\t"
  131256. #endif
  131257. #ifdef WOLFSSL_KEIL
  131258. "ands r5, r5, r6\n\t"
  131259. #elif defined(__clang__)
  131260. "ands r5, r6\n\t"
  131261. #else
  131262. "and r5, r6\n\t"
  131263. #endif
  131264. "cmp r5, #0\n\t"
  131265. "beq L_sp_521_num_bits_17_182_%=\n\t"
  131266. "movs r2, #2\n\t"
  131267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131268. "lsls r2, r2, #8\n\t"
  131269. #else
  131270. "lsl r2, r2, #8\n\t"
  131271. #endif
  131272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131273. "adds r2, r2, #16\n\t"
  131274. #else
  131275. "add r2, r2, #16\n\t"
  131276. #endif
  131277. "ldrb r4, [%[table], r5]\n\t"
  131278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131279. "adds r2, r2, r4\n\t"
  131280. #else
  131281. "add r2, r2, r4\n\t"
  131282. #endif
  131283. "b L_sp_521_num_bits_17_18_%=\n\t"
  131284. "\n"
  131285. "L_sp_521_num_bits_17_182_%=:\n\t"
  131286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131287. "lsrs r5, r3, #8\n\t"
  131288. #else
  131289. "lsr r5, r3, #8\n\t"
  131290. #endif
  131291. #ifdef WOLFSSL_KEIL
  131292. "ands r5, r5, r6\n\t"
  131293. #elif defined(__clang__)
  131294. "ands r5, r6\n\t"
  131295. #else
  131296. "and r5, r6\n\t"
  131297. #endif
  131298. "cmp r5, #0\n\t"
  131299. "beq L_sp_521_num_bits_17_181_%=\n\t"
  131300. "movs r2, #2\n\t"
  131301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131302. "lsls r2, r2, #8\n\t"
  131303. #else
  131304. "lsl r2, r2, #8\n\t"
  131305. #endif
  131306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131307. "adds r2, r2, #8\n\t"
  131308. #else
  131309. "add r2, r2, #8\n\t"
  131310. #endif
  131311. "ldrb r4, [%[table], r5]\n\t"
  131312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131313. "adds r2, r2, r4\n\t"
  131314. #else
  131315. "add r2, r2, r4\n\t"
  131316. #endif
  131317. "b L_sp_521_num_bits_17_18_%=\n\t"
  131318. "\n"
  131319. "L_sp_521_num_bits_17_181_%=:\n\t"
  131320. "movs r5, r3\n\t"
  131321. #ifdef WOLFSSL_KEIL
  131322. "ands r5, r5, r6\n\t"
  131323. #elif defined(__clang__)
  131324. "ands r5, r6\n\t"
  131325. #else
  131326. "and r5, r6\n\t"
  131327. #endif
  131328. "cmp r5, #0\n\t"
  131329. "beq L_sp_521_num_bits_17_180_%=\n\t"
  131330. "movs r2, #2\n\t"
  131331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131332. "lsls r2, r2, #8\n\t"
  131333. #else
  131334. "lsl r2, r2, #8\n\t"
  131335. #endif
  131336. "ldrb r4, [%[table], r5]\n\t"
  131337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131338. "adds r2, r2, r4\n\t"
  131339. #else
  131340. "add r2, r2, r4\n\t"
  131341. #endif
  131342. "b L_sp_521_num_bits_17_18_%=\n\t"
  131343. "\n"
  131344. "L_sp_521_num_bits_17_180_%=:\n\t"
  131345. "b L_sp_521_num_bits_17_18_%=\n\t"
  131346. "\n"
  131347. "L_sp_521_num_bits_17_16_%=:\n\t"
  131348. "ldr r3, [%[a], #60]\n\t"
  131349. "cmp r3, #0\n\t"
  131350. "beq L_sp_521_num_bits_17_15_%=\n\t"
  131351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131352. "lsrs r5, r3, #24\n\t"
  131353. #else
  131354. "lsr r5, r3, #24\n\t"
  131355. #endif
  131356. "cmp r5, #0\n\t"
  131357. "beq L_sp_521_num_bits_17_173_%=\n\t"
  131358. "movs r2, #0xff\n\t"
  131359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131360. "adds r2, r2, #0xf9\n\t"
  131361. #else
  131362. "add r2, r2, #0xf9\n\t"
  131363. #endif
  131364. "ldrb r4, [%[table], r5]\n\t"
  131365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131366. "adds r2, r2, r4\n\t"
  131367. #else
  131368. "add r2, r2, r4\n\t"
  131369. #endif
  131370. "b L_sp_521_num_bits_17_18_%=\n\t"
  131371. "\n"
  131372. "L_sp_521_num_bits_17_173_%=:\n\t"
  131373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131374. "lsrs r5, r3, #16\n\t"
  131375. #else
  131376. "lsr r5, r3, #16\n\t"
  131377. #endif
  131378. #ifdef WOLFSSL_KEIL
  131379. "ands r5, r5, r6\n\t"
  131380. #elif defined(__clang__)
  131381. "ands r5, r6\n\t"
  131382. #else
  131383. "and r5, r6\n\t"
  131384. #endif
  131385. "cmp r5, #0\n\t"
  131386. "beq L_sp_521_num_bits_17_172_%=\n\t"
  131387. "movs r2, #0xff\n\t"
  131388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131389. "adds r2, r2, #0xf1\n\t"
  131390. #else
  131391. "add r2, r2, #0xf1\n\t"
  131392. #endif
  131393. "ldrb r4, [%[table], r5]\n\t"
  131394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131395. "adds r2, r2, r4\n\t"
  131396. #else
  131397. "add r2, r2, r4\n\t"
  131398. #endif
  131399. "b L_sp_521_num_bits_17_18_%=\n\t"
  131400. "\n"
  131401. "L_sp_521_num_bits_17_172_%=:\n\t"
  131402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131403. "lsrs r5, r3, #8\n\t"
  131404. #else
  131405. "lsr r5, r3, #8\n\t"
  131406. #endif
  131407. #ifdef WOLFSSL_KEIL
  131408. "ands r5, r5, r6\n\t"
  131409. #elif defined(__clang__)
  131410. "ands r5, r6\n\t"
  131411. #else
  131412. "and r5, r6\n\t"
  131413. #endif
  131414. "cmp r5, #0\n\t"
  131415. "beq L_sp_521_num_bits_17_171_%=\n\t"
  131416. "movs r2, #0xff\n\t"
  131417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131418. "adds r2, r2, #0xe9\n\t"
  131419. #else
  131420. "add r2, r2, #0xe9\n\t"
  131421. #endif
  131422. "ldrb r4, [%[table], r5]\n\t"
  131423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131424. "adds r2, r2, r4\n\t"
  131425. #else
  131426. "add r2, r2, r4\n\t"
  131427. #endif
  131428. "b L_sp_521_num_bits_17_18_%=\n\t"
  131429. "\n"
  131430. "L_sp_521_num_bits_17_171_%=:\n\t"
  131431. "movs r5, r3\n\t"
  131432. #ifdef WOLFSSL_KEIL
  131433. "ands r5, r5, r6\n\t"
  131434. #elif defined(__clang__)
  131435. "ands r5, r6\n\t"
  131436. #else
  131437. "and r5, r6\n\t"
  131438. #endif
  131439. "cmp r5, #0\n\t"
  131440. "beq L_sp_521_num_bits_17_170_%=\n\t"
  131441. "movs r2, #0xff\n\t"
  131442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131443. "adds r2, r2, #0xe1\n\t"
  131444. #else
  131445. "add r2, r2, #0xe1\n\t"
  131446. #endif
  131447. "ldrb r4, [%[table], r5]\n\t"
  131448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131449. "adds r2, r2, r4\n\t"
  131450. #else
  131451. "add r2, r2, r4\n\t"
  131452. #endif
  131453. "b L_sp_521_num_bits_17_18_%=\n\t"
  131454. "\n"
  131455. "L_sp_521_num_bits_17_170_%=:\n\t"
  131456. "b L_sp_521_num_bits_17_18_%=\n\t"
  131457. "\n"
  131458. "L_sp_521_num_bits_17_15_%=:\n\t"
  131459. "ldr r3, [%[a], #56]\n\t"
  131460. "cmp r3, #0\n\t"
  131461. "beq L_sp_521_num_bits_17_14_%=\n\t"
  131462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131463. "lsrs r5, r3, #24\n\t"
  131464. #else
  131465. "lsr r5, r3, #24\n\t"
  131466. #endif
  131467. "cmp r5, #0\n\t"
  131468. "beq L_sp_521_num_bits_17_163_%=\n\t"
  131469. "movs r2, #0xff\n\t"
  131470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131471. "adds r2, r2, #0xd9\n\t"
  131472. #else
  131473. "add r2, r2, #0xd9\n\t"
  131474. #endif
  131475. "ldrb r4, [%[table], r5]\n\t"
  131476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131477. "adds r2, r2, r4\n\t"
  131478. #else
  131479. "add r2, r2, r4\n\t"
  131480. #endif
  131481. "b L_sp_521_num_bits_17_18_%=\n\t"
  131482. "\n"
  131483. "L_sp_521_num_bits_17_163_%=:\n\t"
  131484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131485. "lsrs r5, r3, #16\n\t"
  131486. #else
  131487. "lsr r5, r3, #16\n\t"
  131488. #endif
  131489. #ifdef WOLFSSL_KEIL
  131490. "ands r5, r5, r6\n\t"
  131491. #elif defined(__clang__)
  131492. "ands r5, r6\n\t"
  131493. #else
  131494. "and r5, r6\n\t"
  131495. #endif
  131496. "cmp r5, #0\n\t"
  131497. "beq L_sp_521_num_bits_17_162_%=\n\t"
  131498. "movs r2, #0xff\n\t"
  131499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131500. "adds r2, r2, #0xd1\n\t"
  131501. #else
  131502. "add r2, r2, #0xd1\n\t"
  131503. #endif
  131504. "ldrb r4, [%[table], r5]\n\t"
  131505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131506. "adds r2, r2, r4\n\t"
  131507. #else
  131508. "add r2, r2, r4\n\t"
  131509. #endif
  131510. "b L_sp_521_num_bits_17_18_%=\n\t"
  131511. "\n"
  131512. "L_sp_521_num_bits_17_162_%=:\n\t"
  131513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131514. "lsrs r5, r3, #8\n\t"
  131515. #else
  131516. "lsr r5, r3, #8\n\t"
  131517. #endif
  131518. #ifdef WOLFSSL_KEIL
  131519. "ands r5, r5, r6\n\t"
  131520. #elif defined(__clang__)
  131521. "ands r5, r6\n\t"
  131522. #else
  131523. "and r5, r6\n\t"
  131524. #endif
  131525. "cmp r5, #0\n\t"
  131526. "beq L_sp_521_num_bits_17_161_%=\n\t"
  131527. "movs r2, #0xff\n\t"
  131528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131529. "adds r2, r2, #0xc9\n\t"
  131530. #else
  131531. "add r2, r2, #0xc9\n\t"
  131532. #endif
  131533. "ldrb r4, [%[table], r5]\n\t"
  131534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131535. "adds r2, r2, r4\n\t"
  131536. #else
  131537. "add r2, r2, r4\n\t"
  131538. #endif
  131539. "b L_sp_521_num_bits_17_18_%=\n\t"
  131540. "\n"
  131541. "L_sp_521_num_bits_17_161_%=:\n\t"
  131542. "movs r5, r3\n\t"
  131543. #ifdef WOLFSSL_KEIL
  131544. "ands r5, r5, r6\n\t"
  131545. #elif defined(__clang__)
  131546. "ands r5, r6\n\t"
  131547. #else
  131548. "and r5, r6\n\t"
  131549. #endif
  131550. "cmp r5, #0\n\t"
  131551. "beq L_sp_521_num_bits_17_160_%=\n\t"
  131552. "movs r2, #0xff\n\t"
  131553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131554. "adds r2, r2, #0xc1\n\t"
  131555. #else
  131556. "add r2, r2, #0xc1\n\t"
  131557. #endif
  131558. "ldrb r4, [%[table], r5]\n\t"
  131559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131560. "adds r2, r2, r4\n\t"
  131561. #else
  131562. "add r2, r2, r4\n\t"
  131563. #endif
  131564. "b L_sp_521_num_bits_17_18_%=\n\t"
  131565. "\n"
  131566. "L_sp_521_num_bits_17_160_%=:\n\t"
  131567. "b L_sp_521_num_bits_17_18_%=\n\t"
  131568. "\n"
  131569. "L_sp_521_num_bits_17_14_%=:\n\t"
  131570. "ldr r3, [%[a], #52]\n\t"
  131571. "cmp r3, #0\n\t"
  131572. "beq L_sp_521_num_bits_17_13_%=\n\t"
  131573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131574. "lsrs r5, r3, #24\n\t"
  131575. #else
  131576. "lsr r5, r3, #24\n\t"
  131577. #endif
  131578. "cmp r5, #0\n\t"
  131579. "beq L_sp_521_num_bits_17_153_%=\n\t"
  131580. "movs r2, #0xff\n\t"
  131581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131582. "adds r2, r2, #0xb9\n\t"
  131583. #else
  131584. "add r2, r2, #0xb9\n\t"
  131585. #endif
  131586. "ldrb r4, [%[table], r5]\n\t"
  131587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131588. "adds r2, r2, r4\n\t"
  131589. #else
  131590. "add r2, r2, r4\n\t"
  131591. #endif
  131592. "b L_sp_521_num_bits_17_18_%=\n\t"
  131593. "\n"
  131594. "L_sp_521_num_bits_17_153_%=:\n\t"
  131595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131596. "lsrs r5, r3, #16\n\t"
  131597. #else
  131598. "lsr r5, r3, #16\n\t"
  131599. #endif
  131600. #ifdef WOLFSSL_KEIL
  131601. "ands r5, r5, r6\n\t"
  131602. #elif defined(__clang__)
  131603. "ands r5, r6\n\t"
  131604. #else
  131605. "and r5, r6\n\t"
  131606. #endif
  131607. "cmp r5, #0\n\t"
  131608. "beq L_sp_521_num_bits_17_152_%=\n\t"
  131609. "movs r2, #0xff\n\t"
  131610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131611. "adds r2, r2, #0xb1\n\t"
  131612. #else
  131613. "add r2, r2, #0xb1\n\t"
  131614. #endif
  131615. "ldrb r4, [%[table], r5]\n\t"
  131616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131617. "adds r2, r2, r4\n\t"
  131618. #else
  131619. "add r2, r2, r4\n\t"
  131620. #endif
  131621. "b L_sp_521_num_bits_17_18_%=\n\t"
  131622. "\n"
  131623. "L_sp_521_num_bits_17_152_%=:\n\t"
  131624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131625. "lsrs r5, r3, #8\n\t"
  131626. #else
  131627. "lsr r5, r3, #8\n\t"
  131628. #endif
  131629. #ifdef WOLFSSL_KEIL
  131630. "ands r5, r5, r6\n\t"
  131631. #elif defined(__clang__)
  131632. "ands r5, r6\n\t"
  131633. #else
  131634. "and r5, r6\n\t"
  131635. #endif
  131636. "cmp r5, #0\n\t"
  131637. "beq L_sp_521_num_bits_17_151_%=\n\t"
  131638. "movs r2, #0xff\n\t"
  131639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131640. "adds r2, r2, #0xa9\n\t"
  131641. #else
  131642. "add r2, r2, #0xa9\n\t"
  131643. #endif
  131644. "ldrb r4, [%[table], r5]\n\t"
  131645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131646. "adds r2, r2, r4\n\t"
  131647. #else
  131648. "add r2, r2, r4\n\t"
  131649. #endif
  131650. "b L_sp_521_num_bits_17_18_%=\n\t"
  131651. "\n"
  131652. "L_sp_521_num_bits_17_151_%=:\n\t"
  131653. "movs r5, r3\n\t"
  131654. #ifdef WOLFSSL_KEIL
  131655. "ands r5, r5, r6\n\t"
  131656. #elif defined(__clang__)
  131657. "ands r5, r6\n\t"
  131658. #else
  131659. "and r5, r6\n\t"
  131660. #endif
  131661. "cmp r5, #0\n\t"
  131662. "beq L_sp_521_num_bits_17_150_%=\n\t"
  131663. "movs r2, #0xff\n\t"
  131664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131665. "adds r2, r2, #0xa1\n\t"
  131666. #else
  131667. "add r2, r2, #0xa1\n\t"
  131668. #endif
  131669. "ldrb r4, [%[table], r5]\n\t"
  131670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131671. "adds r2, r2, r4\n\t"
  131672. #else
  131673. "add r2, r2, r4\n\t"
  131674. #endif
  131675. "b L_sp_521_num_bits_17_18_%=\n\t"
  131676. "\n"
  131677. "L_sp_521_num_bits_17_150_%=:\n\t"
  131678. "b L_sp_521_num_bits_17_18_%=\n\t"
  131679. "\n"
  131680. "L_sp_521_num_bits_17_13_%=:\n\t"
  131681. "ldr r3, [%[a], #48]\n\t"
  131682. "cmp r3, #0\n\t"
  131683. "beq L_sp_521_num_bits_17_12_%=\n\t"
  131684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131685. "lsrs r5, r3, #24\n\t"
  131686. #else
  131687. "lsr r5, r3, #24\n\t"
  131688. #endif
  131689. "cmp r5, #0\n\t"
  131690. "beq L_sp_521_num_bits_17_143_%=\n\t"
  131691. "movs r2, #0xff\n\t"
  131692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131693. "adds r2, r2, #0x99\n\t"
  131694. #else
  131695. "add r2, r2, #0x99\n\t"
  131696. #endif
  131697. "ldrb r4, [%[table], r5]\n\t"
  131698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131699. "adds r2, r2, r4\n\t"
  131700. #else
  131701. "add r2, r2, r4\n\t"
  131702. #endif
  131703. "b L_sp_521_num_bits_17_18_%=\n\t"
  131704. "\n"
  131705. "L_sp_521_num_bits_17_143_%=:\n\t"
  131706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131707. "lsrs r5, r3, #16\n\t"
  131708. #else
  131709. "lsr r5, r3, #16\n\t"
  131710. #endif
  131711. #ifdef WOLFSSL_KEIL
  131712. "ands r5, r5, r6\n\t"
  131713. #elif defined(__clang__)
  131714. "ands r5, r6\n\t"
  131715. #else
  131716. "and r5, r6\n\t"
  131717. #endif
  131718. "cmp r5, #0\n\t"
  131719. "beq L_sp_521_num_bits_17_142_%=\n\t"
  131720. "movs r2, #0xff\n\t"
  131721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131722. "adds r2, r2, #0x91\n\t"
  131723. #else
  131724. "add r2, r2, #0x91\n\t"
  131725. #endif
  131726. "ldrb r4, [%[table], r5]\n\t"
  131727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131728. "adds r2, r2, r4\n\t"
  131729. #else
  131730. "add r2, r2, r4\n\t"
  131731. #endif
  131732. "b L_sp_521_num_bits_17_18_%=\n\t"
  131733. "\n"
  131734. "L_sp_521_num_bits_17_142_%=:\n\t"
  131735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131736. "lsrs r5, r3, #8\n\t"
  131737. #else
  131738. "lsr r5, r3, #8\n\t"
  131739. #endif
  131740. #ifdef WOLFSSL_KEIL
  131741. "ands r5, r5, r6\n\t"
  131742. #elif defined(__clang__)
  131743. "ands r5, r6\n\t"
  131744. #else
  131745. "and r5, r6\n\t"
  131746. #endif
  131747. "cmp r5, #0\n\t"
  131748. "beq L_sp_521_num_bits_17_141_%=\n\t"
  131749. "movs r2, #0xff\n\t"
  131750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131751. "adds r2, r2, #0x89\n\t"
  131752. #else
  131753. "add r2, r2, #0x89\n\t"
  131754. #endif
  131755. "ldrb r4, [%[table], r5]\n\t"
  131756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131757. "adds r2, r2, r4\n\t"
  131758. #else
  131759. "add r2, r2, r4\n\t"
  131760. #endif
  131761. "b L_sp_521_num_bits_17_18_%=\n\t"
  131762. "\n"
  131763. "L_sp_521_num_bits_17_141_%=:\n\t"
  131764. "movs r5, r3\n\t"
  131765. #ifdef WOLFSSL_KEIL
  131766. "ands r5, r5, r6\n\t"
  131767. #elif defined(__clang__)
  131768. "ands r5, r6\n\t"
  131769. #else
  131770. "and r5, r6\n\t"
  131771. #endif
  131772. "cmp r5, #0\n\t"
  131773. "beq L_sp_521_num_bits_17_140_%=\n\t"
  131774. "movs r2, #0xff\n\t"
  131775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131776. "adds r2, r2, #0x81\n\t"
  131777. #else
  131778. "add r2, r2, #0x81\n\t"
  131779. #endif
  131780. "ldrb r4, [%[table], r5]\n\t"
  131781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131782. "adds r2, r2, r4\n\t"
  131783. #else
  131784. "add r2, r2, r4\n\t"
  131785. #endif
  131786. "b L_sp_521_num_bits_17_18_%=\n\t"
  131787. "\n"
  131788. "L_sp_521_num_bits_17_140_%=:\n\t"
  131789. "b L_sp_521_num_bits_17_18_%=\n\t"
  131790. "\n"
  131791. "L_sp_521_num_bits_17_12_%=:\n\t"
  131792. "ldr r3, [%[a], #44]\n\t"
  131793. "cmp r3, #0\n\t"
  131794. "beq L_sp_521_num_bits_17_11_%=\n\t"
  131795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131796. "lsrs r5, r3, #24\n\t"
  131797. #else
  131798. "lsr r5, r3, #24\n\t"
  131799. #endif
  131800. "cmp r5, #0\n\t"
  131801. "beq L_sp_521_num_bits_17_133_%=\n\t"
  131802. "movs r2, #0xff\n\t"
  131803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131804. "adds r2, r2, #0x79\n\t"
  131805. #else
  131806. "add r2, r2, #0x79\n\t"
  131807. #endif
  131808. "ldrb r4, [%[table], r5]\n\t"
  131809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131810. "adds r2, r2, r4\n\t"
  131811. #else
  131812. "add r2, r2, r4\n\t"
  131813. #endif
  131814. "b L_sp_521_num_bits_17_18_%=\n\t"
  131815. "\n"
  131816. "L_sp_521_num_bits_17_133_%=:\n\t"
  131817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131818. "lsrs r5, r3, #16\n\t"
  131819. #else
  131820. "lsr r5, r3, #16\n\t"
  131821. #endif
  131822. #ifdef WOLFSSL_KEIL
  131823. "ands r5, r5, r6\n\t"
  131824. #elif defined(__clang__)
  131825. "ands r5, r6\n\t"
  131826. #else
  131827. "and r5, r6\n\t"
  131828. #endif
  131829. "cmp r5, #0\n\t"
  131830. "beq L_sp_521_num_bits_17_132_%=\n\t"
  131831. "movs r2, #0xff\n\t"
  131832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131833. "adds r2, r2, #0x71\n\t"
  131834. #else
  131835. "add r2, r2, #0x71\n\t"
  131836. #endif
  131837. "ldrb r4, [%[table], r5]\n\t"
  131838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131839. "adds r2, r2, r4\n\t"
  131840. #else
  131841. "add r2, r2, r4\n\t"
  131842. #endif
  131843. "b L_sp_521_num_bits_17_18_%=\n\t"
  131844. "\n"
  131845. "L_sp_521_num_bits_17_132_%=:\n\t"
  131846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131847. "lsrs r5, r3, #8\n\t"
  131848. #else
  131849. "lsr r5, r3, #8\n\t"
  131850. #endif
  131851. #ifdef WOLFSSL_KEIL
  131852. "ands r5, r5, r6\n\t"
  131853. #elif defined(__clang__)
  131854. "ands r5, r6\n\t"
  131855. #else
  131856. "and r5, r6\n\t"
  131857. #endif
  131858. "cmp r5, #0\n\t"
  131859. "beq L_sp_521_num_bits_17_131_%=\n\t"
  131860. "movs r2, #0xff\n\t"
  131861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131862. "adds r2, r2, #0x69\n\t"
  131863. #else
  131864. "add r2, r2, #0x69\n\t"
  131865. #endif
  131866. "ldrb r4, [%[table], r5]\n\t"
  131867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131868. "adds r2, r2, r4\n\t"
  131869. #else
  131870. "add r2, r2, r4\n\t"
  131871. #endif
  131872. "b L_sp_521_num_bits_17_18_%=\n\t"
  131873. "\n"
  131874. "L_sp_521_num_bits_17_131_%=:\n\t"
  131875. "movs r5, r3\n\t"
  131876. #ifdef WOLFSSL_KEIL
  131877. "ands r5, r5, r6\n\t"
  131878. #elif defined(__clang__)
  131879. "ands r5, r6\n\t"
  131880. #else
  131881. "and r5, r6\n\t"
  131882. #endif
  131883. "cmp r5, #0\n\t"
  131884. "beq L_sp_521_num_bits_17_130_%=\n\t"
  131885. "movs r2, #0xff\n\t"
  131886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131887. "adds r2, r2, #0x61\n\t"
  131888. #else
  131889. "add r2, r2, #0x61\n\t"
  131890. #endif
  131891. "ldrb r4, [%[table], r5]\n\t"
  131892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131893. "adds r2, r2, r4\n\t"
  131894. #else
  131895. "add r2, r2, r4\n\t"
  131896. #endif
  131897. "b L_sp_521_num_bits_17_18_%=\n\t"
  131898. "\n"
  131899. "L_sp_521_num_bits_17_130_%=:\n\t"
  131900. "b L_sp_521_num_bits_17_18_%=\n\t"
  131901. "\n"
  131902. "L_sp_521_num_bits_17_11_%=:\n\t"
  131903. "ldr r3, [%[a], #40]\n\t"
  131904. "cmp r3, #0\n\t"
  131905. "beq L_sp_521_num_bits_17_10_%=\n\t"
  131906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131907. "lsrs r5, r3, #24\n\t"
  131908. #else
  131909. "lsr r5, r3, #24\n\t"
  131910. #endif
  131911. "cmp r5, #0\n\t"
  131912. "beq L_sp_521_num_bits_17_123_%=\n\t"
  131913. "movs r2, #0xff\n\t"
  131914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131915. "adds r2, r2, #0x59\n\t"
  131916. #else
  131917. "add r2, r2, #0x59\n\t"
  131918. #endif
  131919. "ldrb r4, [%[table], r5]\n\t"
  131920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131921. "adds r2, r2, r4\n\t"
  131922. #else
  131923. "add r2, r2, r4\n\t"
  131924. #endif
  131925. "b L_sp_521_num_bits_17_18_%=\n\t"
  131926. "\n"
  131927. "L_sp_521_num_bits_17_123_%=:\n\t"
  131928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131929. "lsrs r5, r3, #16\n\t"
  131930. #else
  131931. "lsr r5, r3, #16\n\t"
  131932. #endif
  131933. #ifdef WOLFSSL_KEIL
  131934. "ands r5, r5, r6\n\t"
  131935. #elif defined(__clang__)
  131936. "ands r5, r6\n\t"
  131937. #else
  131938. "and r5, r6\n\t"
  131939. #endif
  131940. "cmp r5, #0\n\t"
  131941. "beq L_sp_521_num_bits_17_122_%=\n\t"
  131942. "movs r2, #0xff\n\t"
  131943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131944. "adds r2, r2, #0x51\n\t"
  131945. #else
  131946. "add r2, r2, #0x51\n\t"
  131947. #endif
  131948. "ldrb r4, [%[table], r5]\n\t"
  131949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131950. "adds r2, r2, r4\n\t"
  131951. #else
  131952. "add r2, r2, r4\n\t"
  131953. #endif
  131954. "b L_sp_521_num_bits_17_18_%=\n\t"
  131955. "\n"
  131956. "L_sp_521_num_bits_17_122_%=:\n\t"
  131957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131958. "lsrs r5, r3, #8\n\t"
  131959. #else
  131960. "lsr r5, r3, #8\n\t"
  131961. #endif
  131962. #ifdef WOLFSSL_KEIL
  131963. "ands r5, r5, r6\n\t"
  131964. #elif defined(__clang__)
  131965. "ands r5, r6\n\t"
  131966. #else
  131967. "and r5, r6\n\t"
  131968. #endif
  131969. "cmp r5, #0\n\t"
  131970. "beq L_sp_521_num_bits_17_121_%=\n\t"
  131971. "movs r2, #0xff\n\t"
  131972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131973. "adds r2, r2, #0x49\n\t"
  131974. #else
  131975. "add r2, r2, #0x49\n\t"
  131976. #endif
  131977. "ldrb r4, [%[table], r5]\n\t"
  131978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131979. "adds r2, r2, r4\n\t"
  131980. #else
  131981. "add r2, r2, r4\n\t"
  131982. #endif
  131983. "b L_sp_521_num_bits_17_18_%=\n\t"
  131984. "\n"
  131985. "L_sp_521_num_bits_17_121_%=:\n\t"
  131986. "movs r5, r3\n\t"
  131987. #ifdef WOLFSSL_KEIL
  131988. "ands r5, r5, r6\n\t"
  131989. #elif defined(__clang__)
  131990. "ands r5, r6\n\t"
  131991. #else
  131992. "and r5, r6\n\t"
  131993. #endif
  131994. "cmp r5, #0\n\t"
  131995. "beq L_sp_521_num_bits_17_120_%=\n\t"
  131996. "movs r2, #0xff\n\t"
  131997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  131998. "adds r2, r2, #0x41\n\t"
  131999. #else
  132000. "add r2, r2, #0x41\n\t"
  132001. #endif
  132002. "ldrb r4, [%[table], r5]\n\t"
  132003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132004. "adds r2, r2, r4\n\t"
  132005. #else
  132006. "add r2, r2, r4\n\t"
  132007. #endif
  132008. "b L_sp_521_num_bits_17_18_%=\n\t"
  132009. "\n"
  132010. "L_sp_521_num_bits_17_120_%=:\n\t"
  132011. "b L_sp_521_num_bits_17_18_%=\n\t"
  132012. "\n"
  132013. "L_sp_521_num_bits_17_10_%=:\n\t"
  132014. "ldr r3, [%[a], #36]\n\t"
  132015. "cmp r3, #0\n\t"
  132016. "beq L_sp_521_num_bits_17_9_%=\n\t"
  132017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132018. "lsrs r5, r3, #24\n\t"
  132019. #else
  132020. "lsr r5, r3, #24\n\t"
  132021. #endif
  132022. "cmp r5, #0\n\t"
  132023. "beq L_sp_521_num_bits_17_113_%=\n\t"
  132024. "movs r2, #0xff\n\t"
  132025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132026. "adds r2, r2, #57\n\t"
  132027. #else
  132028. "add r2, r2, #57\n\t"
  132029. #endif
  132030. "ldrb r4, [%[table], r5]\n\t"
  132031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132032. "adds r2, r2, r4\n\t"
  132033. #else
  132034. "add r2, r2, r4\n\t"
  132035. #endif
  132036. "b L_sp_521_num_bits_17_18_%=\n\t"
  132037. "\n"
  132038. "L_sp_521_num_bits_17_113_%=:\n\t"
  132039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132040. "lsrs r5, r3, #16\n\t"
  132041. #else
  132042. "lsr r5, r3, #16\n\t"
  132043. #endif
  132044. #ifdef WOLFSSL_KEIL
  132045. "ands r5, r5, r6\n\t"
  132046. #elif defined(__clang__)
  132047. "ands r5, r6\n\t"
  132048. #else
  132049. "and r5, r6\n\t"
  132050. #endif
  132051. "cmp r5, #0\n\t"
  132052. "beq L_sp_521_num_bits_17_112_%=\n\t"
  132053. "movs r2, #0xff\n\t"
  132054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132055. "adds r2, r2, #49\n\t"
  132056. #else
  132057. "add r2, r2, #49\n\t"
  132058. #endif
  132059. "ldrb r4, [%[table], r5]\n\t"
  132060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132061. "adds r2, r2, r4\n\t"
  132062. #else
  132063. "add r2, r2, r4\n\t"
  132064. #endif
  132065. "b L_sp_521_num_bits_17_18_%=\n\t"
  132066. "\n"
  132067. "L_sp_521_num_bits_17_112_%=:\n\t"
  132068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132069. "lsrs r5, r3, #8\n\t"
  132070. #else
  132071. "lsr r5, r3, #8\n\t"
  132072. #endif
  132073. #ifdef WOLFSSL_KEIL
  132074. "ands r5, r5, r6\n\t"
  132075. #elif defined(__clang__)
  132076. "ands r5, r6\n\t"
  132077. #else
  132078. "and r5, r6\n\t"
  132079. #endif
  132080. "cmp r5, #0\n\t"
  132081. "beq L_sp_521_num_bits_17_111_%=\n\t"
  132082. "movs r2, #0xff\n\t"
  132083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132084. "adds r2, r2, #41\n\t"
  132085. #else
  132086. "add r2, r2, #41\n\t"
  132087. #endif
  132088. "ldrb r4, [%[table], r5]\n\t"
  132089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132090. "adds r2, r2, r4\n\t"
  132091. #else
  132092. "add r2, r2, r4\n\t"
  132093. #endif
  132094. "b L_sp_521_num_bits_17_18_%=\n\t"
  132095. "\n"
  132096. "L_sp_521_num_bits_17_111_%=:\n\t"
  132097. "movs r5, r3\n\t"
  132098. #ifdef WOLFSSL_KEIL
  132099. "ands r5, r5, r6\n\t"
  132100. #elif defined(__clang__)
  132101. "ands r5, r6\n\t"
  132102. #else
  132103. "and r5, r6\n\t"
  132104. #endif
  132105. "cmp r5, #0\n\t"
  132106. "beq L_sp_521_num_bits_17_110_%=\n\t"
  132107. "movs r2, #0xff\n\t"
  132108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132109. "adds r2, r2, #33\n\t"
  132110. #else
  132111. "add r2, r2, #33\n\t"
  132112. #endif
  132113. "ldrb r4, [%[table], r5]\n\t"
  132114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132115. "adds r2, r2, r4\n\t"
  132116. #else
  132117. "add r2, r2, r4\n\t"
  132118. #endif
  132119. "b L_sp_521_num_bits_17_18_%=\n\t"
  132120. "\n"
  132121. "L_sp_521_num_bits_17_110_%=:\n\t"
  132122. "b L_sp_521_num_bits_17_18_%=\n\t"
  132123. "\n"
  132124. "L_sp_521_num_bits_17_9_%=:\n\t"
  132125. "ldr r3, [%[a], #32]\n\t"
  132126. "cmp r3, #0\n\t"
  132127. "beq L_sp_521_num_bits_17_8_%=\n\t"
  132128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132129. "lsrs r5, r3, #24\n\t"
  132130. #else
  132131. "lsr r5, r3, #24\n\t"
  132132. #endif
  132133. "cmp r5, #0\n\t"
  132134. "beq L_sp_521_num_bits_17_103_%=\n\t"
  132135. "movs r2, #0xff\n\t"
  132136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132137. "adds r2, r2, #25\n\t"
  132138. #else
  132139. "add r2, r2, #25\n\t"
  132140. #endif
  132141. "ldrb r4, [%[table], r5]\n\t"
  132142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132143. "adds r2, r2, r4\n\t"
  132144. #else
  132145. "add r2, r2, r4\n\t"
  132146. #endif
  132147. "b L_sp_521_num_bits_17_18_%=\n\t"
  132148. "\n"
  132149. "L_sp_521_num_bits_17_103_%=:\n\t"
  132150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132151. "lsrs r5, r3, #16\n\t"
  132152. #else
  132153. "lsr r5, r3, #16\n\t"
  132154. #endif
  132155. #ifdef WOLFSSL_KEIL
  132156. "ands r5, r5, r6\n\t"
  132157. #elif defined(__clang__)
  132158. "ands r5, r6\n\t"
  132159. #else
  132160. "and r5, r6\n\t"
  132161. #endif
  132162. "cmp r5, #0\n\t"
  132163. "beq L_sp_521_num_bits_17_102_%=\n\t"
  132164. "movs r2, #0xff\n\t"
  132165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132166. "adds r2, r2, #17\n\t"
  132167. #else
  132168. "add r2, r2, #17\n\t"
  132169. #endif
  132170. "ldrb r4, [%[table], r5]\n\t"
  132171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132172. "adds r2, r2, r4\n\t"
  132173. #else
  132174. "add r2, r2, r4\n\t"
  132175. #endif
  132176. "b L_sp_521_num_bits_17_18_%=\n\t"
  132177. "\n"
  132178. "L_sp_521_num_bits_17_102_%=:\n\t"
  132179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132180. "lsrs r5, r3, #8\n\t"
  132181. #else
  132182. "lsr r5, r3, #8\n\t"
  132183. #endif
  132184. #ifdef WOLFSSL_KEIL
  132185. "ands r5, r5, r6\n\t"
  132186. #elif defined(__clang__)
  132187. "ands r5, r6\n\t"
  132188. #else
  132189. "and r5, r6\n\t"
  132190. #endif
  132191. "cmp r5, #0\n\t"
  132192. "beq L_sp_521_num_bits_17_101_%=\n\t"
  132193. "movs r2, #0xff\n\t"
  132194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132195. "adds r2, r2, #9\n\t"
  132196. #else
  132197. "add r2, r2, #9\n\t"
  132198. #endif
  132199. "ldrb r4, [%[table], r5]\n\t"
  132200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132201. "adds r2, r2, r4\n\t"
  132202. #else
  132203. "add r2, r2, r4\n\t"
  132204. #endif
  132205. "b L_sp_521_num_bits_17_18_%=\n\t"
  132206. "\n"
  132207. "L_sp_521_num_bits_17_101_%=:\n\t"
  132208. "movs r5, r3\n\t"
  132209. #ifdef WOLFSSL_KEIL
  132210. "ands r5, r5, r6\n\t"
  132211. #elif defined(__clang__)
  132212. "ands r5, r6\n\t"
  132213. #else
  132214. "and r5, r6\n\t"
  132215. #endif
  132216. "cmp r5, #0\n\t"
  132217. "beq L_sp_521_num_bits_17_100_%=\n\t"
  132218. "movs r2, #0xff\n\t"
  132219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132220. "adds r2, r2, #1\n\t"
  132221. #else
  132222. "add r2, r2, #1\n\t"
  132223. #endif
  132224. "ldrb r4, [%[table], r5]\n\t"
  132225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132226. "adds r2, r2, r4\n\t"
  132227. #else
  132228. "add r2, r2, r4\n\t"
  132229. #endif
  132230. "b L_sp_521_num_bits_17_18_%=\n\t"
  132231. "\n"
  132232. "L_sp_521_num_bits_17_100_%=:\n\t"
  132233. "b L_sp_521_num_bits_17_18_%=\n\t"
  132234. "\n"
  132235. "L_sp_521_num_bits_17_8_%=:\n\t"
  132236. "ldr r3, [%[a], #28]\n\t"
  132237. "cmp r3, #0\n\t"
  132238. "beq L_sp_521_num_bits_17_7_%=\n\t"
  132239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132240. "lsrs r5, r3, #24\n\t"
  132241. #else
  132242. "lsr r5, r3, #24\n\t"
  132243. #endif
  132244. "cmp r5, #0\n\t"
  132245. "beq L_sp_521_num_bits_17_93_%=\n\t"
  132246. "movs r2, #0xf8\n\t"
  132247. "ldrb r4, [%[table], r5]\n\t"
  132248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132249. "adds r2, r2, r4\n\t"
  132250. #else
  132251. "add r2, r2, r4\n\t"
  132252. #endif
  132253. "b L_sp_521_num_bits_17_18_%=\n\t"
  132254. "\n"
  132255. "L_sp_521_num_bits_17_93_%=:\n\t"
  132256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132257. "lsrs r5, r3, #16\n\t"
  132258. #else
  132259. "lsr r5, r3, #16\n\t"
  132260. #endif
  132261. #ifdef WOLFSSL_KEIL
  132262. "ands r5, r5, r6\n\t"
  132263. #elif defined(__clang__)
  132264. "ands r5, r6\n\t"
  132265. #else
  132266. "and r5, r6\n\t"
  132267. #endif
  132268. "cmp r5, #0\n\t"
  132269. "beq L_sp_521_num_bits_17_92_%=\n\t"
  132270. "movs r2, #0xf0\n\t"
  132271. "ldrb r4, [%[table], r5]\n\t"
  132272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132273. "adds r2, r2, r4\n\t"
  132274. #else
  132275. "add r2, r2, r4\n\t"
  132276. #endif
  132277. "b L_sp_521_num_bits_17_18_%=\n\t"
  132278. "\n"
  132279. "L_sp_521_num_bits_17_92_%=:\n\t"
  132280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132281. "lsrs r5, r3, #8\n\t"
  132282. #else
  132283. "lsr r5, r3, #8\n\t"
  132284. #endif
  132285. #ifdef WOLFSSL_KEIL
  132286. "ands r5, r5, r6\n\t"
  132287. #elif defined(__clang__)
  132288. "ands r5, r6\n\t"
  132289. #else
  132290. "and r5, r6\n\t"
  132291. #endif
  132292. "cmp r5, #0\n\t"
  132293. "beq L_sp_521_num_bits_17_91_%=\n\t"
  132294. "movs r2, #0xe8\n\t"
  132295. "ldrb r4, [%[table], r5]\n\t"
  132296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132297. "adds r2, r2, r4\n\t"
  132298. #else
  132299. "add r2, r2, r4\n\t"
  132300. #endif
  132301. "b L_sp_521_num_bits_17_18_%=\n\t"
  132302. "\n"
  132303. "L_sp_521_num_bits_17_91_%=:\n\t"
  132304. "movs r5, r3\n\t"
  132305. #ifdef WOLFSSL_KEIL
  132306. "ands r5, r5, r6\n\t"
  132307. #elif defined(__clang__)
  132308. "ands r5, r6\n\t"
  132309. #else
  132310. "and r5, r6\n\t"
  132311. #endif
  132312. "cmp r5, #0\n\t"
  132313. "beq L_sp_521_num_bits_17_90_%=\n\t"
  132314. "movs r2, #0xe0\n\t"
  132315. "ldrb r4, [%[table], r5]\n\t"
  132316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132317. "adds r2, r2, r4\n\t"
  132318. #else
  132319. "add r2, r2, r4\n\t"
  132320. #endif
  132321. "b L_sp_521_num_bits_17_18_%=\n\t"
  132322. "\n"
  132323. "L_sp_521_num_bits_17_90_%=:\n\t"
  132324. "b L_sp_521_num_bits_17_18_%=\n\t"
  132325. "\n"
  132326. "L_sp_521_num_bits_17_7_%=:\n\t"
  132327. "ldr r3, [%[a], #24]\n\t"
  132328. "cmp r3, #0\n\t"
  132329. "beq L_sp_521_num_bits_17_6_%=\n\t"
  132330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132331. "lsrs r5, r3, #24\n\t"
  132332. #else
  132333. "lsr r5, r3, #24\n\t"
  132334. #endif
  132335. "cmp r5, #0\n\t"
  132336. "beq L_sp_521_num_bits_17_83_%=\n\t"
  132337. "movs r2, #0xd8\n\t"
  132338. "ldrb r4, [%[table], r5]\n\t"
  132339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132340. "adds r2, r2, r4\n\t"
  132341. #else
  132342. "add r2, r2, r4\n\t"
  132343. #endif
  132344. "b L_sp_521_num_bits_17_18_%=\n\t"
  132345. "\n"
  132346. "L_sp_521_num_bits_17_83_%=:\n\t"
  132347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132348. "lsrs r5, r3, #16\n\t"
  132349. #else
  132350. "lsr r5, r3, #16\n\t"
  132351. #endif
  132352. #ifdef WOLFSSL_KEIL
  132353. "ands r5, r5, r6\n\t"
  132354. #elif defined(__clang__)
  132355. "ands r5, r6\n\t"
  132356. #else
  132357. "and r5, r6\n\t"
  132358. #endif
  132359. "cmp r5, #0\n\t"
  132360. "beq L_sp_521_num_bits_17_82_%=\n\t"
  132361. "movs r2, #0xd0\n\t"
  132362. "ldrb r4, [%[table], r5]\n\t"
  132363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132364. "adds r2, r2, r4\n\t"
  132365. #else
  132366. "add r2, r2, r4\n\t"
  132367. #endif
  132368. "b L_sp_521_num_bits_17_18_%=\n\t"
  132369. "\n"
  132370. "L_sp_521_num_bits_17_82_%=:\n\t"
  132371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132372. "lsrs r5, r3, #8\n\t"
  132373. #else
  132374. "lsr r5, r3, #8\n\t"
  132375. #endif
  132376. #ifdef WOLFSSL_KEIL
  132377. "ands r5, r5, r6\n\t"
  132378. #elif defined(__clang__)
  132379. "ands r5, r6\n\t"
  132380. #else
  132381. "and r5, r6\n\t"
  132382. #endif
  132383. "cmp r5, #0\n\t"
  132384. "beq L_sp_521_num_bits_17_81_%=\n\t"
  132385. "movs r2, #0xc8\n\t"
  132386. "ldrb r4, [%[table], r5]\n\t"
  132387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132388. "adds r2, r2, r4\n\t"
  132389. #else
  132390. "add r2, r2, r4\n\t"
  132391. #endif
  132392. "b L_sp_521_num_bits_17_18_%=\n\t"
  132393. "\n"
  132394. "L_sp_521_num_bits_17_81_%=:\n\t"
  132395. "movs r5, r3\n\t"
  132396. #ifdef WOLFSSL_KEIL
  132397. "ands r5, r5, r6\n\t"
  132398. #elif defined(__clang__)
  132399. "ands r5, r6\n\t"
  132400. #else
  132401. "and r5, r6\n\t"
  132402. #endif
  132403. "cmp r5, #0\n\t"
  132404. "beq L_sp_521_num_bits_17_80_%=\n\t"
  132405. "movs r2, #0xc0\n\t"
  132406. "ldrb r4, [%[table], r5]\n\t"
  132407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132408. "adds r2, r2, r4\n\t"
  132409. #else
  132410. "add r2, r2, r4\n\t"
  132411. #endif
  132412. "b L_sp_521_num_bits_17_18_%=\n\t"
  132413. "\n"
  132414. "L_sp_521_num_bits_17_80_%=:\n\t"
  132415. "b L_sp_521_num_bits_17_18_%=\n\t"
  132416. "\n"
  132417. "L_sp_521_num_bits_17_6_%=:\n\t"
  132418. "ldr r3, [%[a], #20]\n\t"
  132419. "cmp r3, #0\n\t"
  132420. "beq L_sp_521_num_bits_17_5_%=\n\t"
  132421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132422. "lsrs r5, r3, #24\n\t"
  132423. #else
  132424. "lsr r5, r3, #24\n\t"
  132425. #endif
  132426. "cmp r5, #0\n\t"
  132427. "beq L_sp_521_num_bits_17_73_%=\n\t"
  132428. "movs r2, #0xb8\n\t"
  132429. "ldrb r4, [%[table], r5]\n\t"
  132430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132431. "adds r2, r2, r4\n\t"
  132432. #else
  132433. "add r2, r2, r4\n\t"
  132434. #endif
  132435. "b L_sp_521_num_bits_17_18_%=\n\t"
  132436. "\n"
  132437. "L_sp_521_num_bits_17_73_%=:\n\t"
  132438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132439. "lsrs r5, r3, #16\n\t"
  132440. #else
  132441. "lsr r5, r3, #16\n\t"
  132442. #endif
  132443. #ifdef WOLFSSL_KEIL
  132444. "ands r5, r5, r6\n\t"
  132445. #elif defined(__clang__)
  132446. "ands r5, r6\n\t"
  132447. #else
  132448. "and r5, r6\n\t"
  132449. #endif
  132450. "cmp r5, #0\n\t"
  132451. "beq L_sp_521_num_bits_17_72_%=\n\t"
  132452. "movs r2, #0xb0\n\t"
  132453. "ldrb r4, [%[table], r5]\n\t"
  132454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132455. "adds r2, r2, r4\n\t"
  132456. #else
  132457. "add r2, r2, r4\n\t"
  132458. #endif
  132459. "b L_sp_521_num_bits_17_18_%=\n\t"
  132460. "\n"
  132461. "L_sp_521_num_bits_17_72_%=:\n\t"
  132462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132463. "lsrs r5, r3, #8\n\t"
  132464. #else
  132465. "lsr r5, r3, #8\n\t"
  132466. #endif
  132467. #ifdef WOLFSSL_KEIL
  132468. "ands r5, r5, r6\n\t"
  132469. #elif defined(__clang__)
  132470. "ands r5, r6\n\t"
  132471. #else
  132472. "and r5, r6\n\t"
  132473. #endif
  132474. "cmp r5, #0\n\t"
  132475. "beq L_sp_521_num_bits_17_71_%=\n\t"
  132476. "movs r2, #0xa8\n\t"
  132477. "ldrb r4, [%[table], r5]\n\t"
  132478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132479. "adds r2, r2, r4\n\t"
  132480. #else
  132481. "add r2, r2, r4\n\t"
  132482. #endif
  132483. "b L_sp_521_num_bits_17_18_%=\n\t"
  132484. "\n"
  132485. "L_sp_521_num_bits_17_71_%=:\n\t"
  132486. "movs r5, r3\n\t"
  132487. #ifdef WOLFSSL_KEIL
  132488. "ands r5, r5, r6\n\t"
  132489. #elif defined(__clang__)
  132490. "ands r5, r6\n\t"
  132491. #else
  132492. "and r5, r6\n\t"
  132493. #endif
  132494. "cmp r5, #0\n\t"
  132495. "beq L_sp_521_num_bits_17_70_%=\n\t"
  132496. "movs r2, #0xa0\n\t"
  132497. "ldrb r4, [%[table], r5]\n\t"
  132498. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132499. "adds r2, r2, r4\n\t"
  132500. #else
  132501. "add r2, r2, r4\n\t"
  132502. #endif
  132503. "b L_sp_521_num_bits_17_18_%=\n\t"
  132504. "\n"
  132505. "L_sp_521_num_bits_17_70_%=:\n\t"
  132506. "b L_sp_521_num_bits_17_18_%=\n\t"
  132507. "\n"
  132508. "L_sp_521_num_bits_17_5_%=:\n\t"
  132509. "ldr r3, [%[a], #16]\n\t"
  132510. "cmp r3, #0\n\t"
  132511. "beq L_sp_521_num_bits_17_4_%=\n\t"
  132512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132513. "lsrs r5, r3, #24\n\t"
  132514. #else
  132515. "lsr r5, r3, #24\n\t"
  132516. #endif
  132517. "cmp r5, #0\n\t"
  132518. "beq L_sp_521_num_bits_17_63_%=\n\t"
  132519. "movs r2, #0x98\n\t"
  132520. "ldrb r4, [%[table], r5]\n\t"
  132521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132522. "adds r2, r2, r4\n\t"
  132523. #else
  132524. "add r2, r2, r4\n\t"
  132525. #endif
  132526. "b L_sp_521_num_bits_17_18_%=\n\t"
  132527. "\n"
  132528. "L_sp_521_num_bits_17_63_%=:\n\t"
  132529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132530. "lsrs r5, r3, #16\n\t"
  132531. #else
  132532. "lsr r5, r3, #16\n\t"
  132533. #endif
  132534. #ifdef WOLFSSL_KEIL
  132535. "ands r5, r5, r6\n\t"
  132536. #elif defined(__clang__)
  132537. "ands r5, r6\n\t"
  132538. #else
  132539. "and r5, r6\n\t"
  132540. #endif
  132541. "cmp r5, #0\n\t"
  132542. "beq L_sp_521_num_bits_17_62_%=\n\t"
  132543. "movs r2, #0x90\n\t"
  132544. "ldrb r4, [%[table], r5]\n\t"
  132545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132546. "adds r2, r2, r4\n\t"
  132547. #else
  132548. "add r2, r2, r4\n\t"
  132549. #endif
  132550. "b L_sp_521_num_bits_17_18_%=\n\t"
  132551. "\n"
  132552. "L_sp_521_num_bits_17_62_%=:\n\t"
  132553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132554. "lsrs r5, r3, #8\n\t"
  132555. #else
  132556. "lsr r5, r3, #8\n\t"
  132557. #endif
  132558. #ifdef WOLFSSL_KEIL
  132559. "ands r5, r5, r6\n\t"
  132560. #elif defined(__clang__)
  132561. "ands r5, r6\n\t"
  132562. #else
  132563. "and r5, r6\n\t"
  132564. #endif
  132565. "cmp r5, #0\n\t"
  132566. "beq L_sp_521_num_bits_17_61_%=\n\t"
  132567. "movs r2, #0x88\n\t"
  132568. "ldrb r4, [%[table], r5]\n\t"
  132569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132570. "adds r2, r2, r4\n\t"
  132571. #else
  132572. "add r2, r2, r4\n\t"
  132573. #endif
  132574. "b L_sp_521_num_bits_17_18_%=\n\t"
  132575. "\n"
  132576. "L_sp_521_num_bits_17_61_%=:\n\t"
  132577. "movs r5, r3\n\t"
  132578. #ifdef WOLFSSL_KEIL
  132579. "ands r5, r5, r6\n\t"
  132580. #elif defined(__clang__)
  132581. "ands r5, r6\n\t"
  132582. #else
  132583. "and r5, r6\n\t"
  132584. #endif
  132585. "cmp r5, #0\n\t"
  132586. "beq L_sp_521_num_bits_17_60_%=\n\t"
  132587. "movs r2, #0x80\n\t"
  132588. "ldrb r4, [%[table], r5]\n\t"
  132589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132590. "adds r2, r2, r4\n\t"
  132591. #else
  132592. "add r2, r2, r4\n\t"
  132593. #endif
  132594. "b L_sp_521_num_bits_17_18_%=\n\t"
  132595. "\n"
  132596. "L_sp_521_num_bits_17_60_%=:\n\t"
  132597. "b L_sp_521_num_bits_17_18_%=\n\t"
  132598. "\n"
  132599. "L_sp_521_num_bits_17_4_%=:\n\t"
  132600. "ldr r3, [%[a], #12]\n\t"
  132601. "cmp r3, #0\n\t"
  132602. "beq L_sp_521_num_bits_17_3_%=\n\t"
  132603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132604. "lsrs r5, r3, #24\n\t"
  132605. #else
  132606. "lsr r5, r3, #24\n\t"
  132607. #endif
  132608. "cmp r5, #0\n\t"
  132609. "beq L_sp_521_num_bits_17_53_%=\n\t"
  132610. "movs r2, #0x78\n\t"
  132611. "ldrb r4, [%[table], r5]\n\t"
  132612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132613. "adds r2, r2, r4\n\t"
  132614. #else
  132615. "add r2, r2, r4\n\t"
  132616. #endif
  132617. "b L_sp_521_num_bits_17_18_%=\n\t"
  132618. "\n"
  132619. "L_sp_521_num_bits_17_53_%=:\n\t"
  132620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132621. "lsrs r5, r3, #16\n\t"
  132622. #else
  132623. "lsr r5, r3, #16\n\t"
  132624. #endif
  132625. #ifdef WOLFSSL_KEIL
  132626. "ands r5, r5, r6\n\t"
  132627. #elif defined(__clang__)
  132628. "ands r5, r6\n\t"
  132629. #else
  132630. "and r5, r6\n\t"
  132631. #endif
  132632. "cmp r5, #0\n\t"
  132633. "beq L_sp_521_num_bits_17_52_%=\n\t"
  132634. "movs r2, #0x70\n\t"
  132635. "ldrb r4, [%[table], r5]\n\t"
  132636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132637. "adds r2, r2, r4\n\t"
  132638. #else
  132639. "add r2, r2, r4\n\t"
  132640. #endif
  132641. "b L_sp_521_num_bits_17_18_%=\n\t"
  132642. "\n"
  132643. "L_sp_521_num_bits_17_52_%=:\n\t"
  132644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132645. "lsrs r5, r3, #8\n\t"
  132646. #else
  132647. "lsr r5, r3, #8\n\t"
  132648. #endif
  132649. #ifdef WOLFSSL_KEIL
  132650. "ands r5, r5, r6\n\t"
  132651. #elif defined(__clang__)
  132652. "ands r5, r6\n\t"
  132653. #else
  132654. "and r5, r6\n\t"
  132655. #endif
  132656. "cmp r5, #0\n\t"
  132657. "beq L_sp_521_num_bits_17_51_%=\n\t"
  132658. "movs r2, #0x68\n\t"
  132659. "ldrb r4, [%[table], r5]\n\t"
  132660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132661. "adds r2, r2, r4\n\t"
  132662. #else
  132663. "add r2, r2, r4\n\t"
  132664. #endif
  132665. "b L_sp_521_num_bits_17_18_%=\n\t"
  132666. "\n"
  132667. "L_sp_521_num_bits_17_51_%=:\n\t"
  132668. "movs r5, r3\n\t"
  132669. #ifdef WOLFSSL_KEIL
  132670. "ands r5, r5, r6\n\t"
  132671. #elif defined(__clang__)
  132672. "ands r5, r6\n\t"
  132673. #else
  132674. "and r5, r6\n\t"
  132675. #endif
  132676. "cmp r5, #0\n\t"
  132677. "beq L_sp_521_num_bits_17_50_%=\n\t"
  132678. "movs r2, #0x60\n\t"
  132679. "ldrb r4, [%[table], r5]\n\t"
  132680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132681. "adds r2, r2, r4\n\t"
  132682. #else
  132683. "add r2, r2, r4\n\t"
  132684. #endif
  132685. "b L_sp_521_num_bits_17_18_%=\n\t"
  132686. "\n"
  132687. "L_sp_521_num_bits_17_50_%=:\n\t"
  132688. "b L_sp_521_num_bits_17_18_%=\n\t"
  132689. "\n"
  132690. "L_sp_521_num_bits_17_3_%=:\n\t"
  132691. "ldr r3, [%[a], #8]\n\t"
  132692. "cmp r3, #0\n\t"
  132693. "beq L_sp_521_num_bits_17_2_%=\n\t"
  132694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132695. "lsrs r5, r3, #24\n\t"
  132696. #else
  132697. "lsr r5, r3, #24\n\t"
  132698. #endif
  132699. "cmp r5, #0\n\t"
  132700. "beq L_sp_521_num_bits_17_43_%=\n\t"
  132701. "movs r2, #0x58\n\t"
  132702. "ldrb r4, [%[table], r5]\n\t"
  132703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132704. "adds r2, r2, r4\n\t"
  132705. #else
  132706. "add r2, r2, r4\n\t"
  132707. #endif
  132708. "b L_sp_521_num_bits_17_18_%=\n\t"
  132709. "\n"
  132710. "L_sp_521_num_bits_17_43_%=:\n\t"
  132711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132712. "lsrs r5, r3, #16\n\t"
  132713. #else
  132714. "lsr r5, r3, #16\n\t"
  132715. #endif
  132716. #ifdef WOLFSSL_KEIL
  132717. "ands r5, r5, r6\n\t"
  132718. #elif defined(__clang__)
  132719. "ands r5, r6\n\t"
  132720. #else
  132721. "and r5, r6\n\t"
  132722. #endif
  132723. "cmp r5, #0\n\t"
  132724. "beq L_sp_521_num_bits_17_42_%=\n\t"
  132725. "movs r2, #0x50\n\t"
  132726. "ldrb r4, [%[table], r5]\n\t"
  132727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132728. "adds r2, r2, r4\n\t"
  132729. #else
  132730. "add r2, r2, r4\n\t"
  132731. #endif
  132732. "b L_sp_521_num_bits_17_18_%=\n\t"
  132733. "\n"
  132734. "L_sp_521_num_bits_17_42_%=:\n\t"
  132735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132736. "lsrs r5, r3, #8\n\t"
  132737. #else
  132738. "lsr r5, r3, #8\n\t"
  132739. #endif
  132740. #ifdef WOLFSSL_KEIL
  132741. "ands r5, r5, r6\n\t"
  132742. #elif defined(__clang__)
  132743. "ands r5, r6\n\t"
  132744. #else
  132745. "and r5, r6\n\t"
  132746. #endif
  132747. "cmp r5, #0\n\t"
  132748. "beq L_sp_521_num_bits_17_41_%=\n\t"
  132749. "movs r2, #0x48\n\t"
  132750. "ldrb r4, [%[table], r5]\n\t"
  132751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132752. "adds r2, r2, r4\n\t"
  132753. #else
  132754. "add r2, r2, r4\n\t"
  132755. #endif
  132756. "b L_sp_521_num_bits_17_18_%=\n\t"
  132757. "\n"
  132758. "L_sp_521_num_bits_17_41_%=:\n\t"
  132759. "movs r5, r3\n\t"
  132760. #ifdef WOLFSSL_KEIL
  132761. "ands r5, r5, r6\n\t"
  132762. #elif defined(__clang__)
  132763. "ands r5, r6\n\t"
  132764. #else
  132765. "and r5, r6\n\t"
  132766. #endif
  132767. "cmp r5, #0\n\t"
  132768. "beq L_sp_521_num_bits_17_40_%=\n\t"
  132769. "movs r2, #0x40\n\t"
  132770. "ldrb r4, [%[table], r5]\n\t"
  132771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132772. "adds r2, r2, r4\n\t"
  132773. #else
  132774. "add r2, r2, r4\n\t"
  132775. #endif
  132776. "b L_sp_521_num_bits_17_18_%=\n\t"
  132777. "\n"
  132778. "L_sp_521_num_bits_17_40_%=:\n\t"
  132779. "b L_sp_521_num_bits_17_18_%=\n\t"
  132780. "\n"
  132781. "L_sp_521_num_bits_17_2_%=:\n\t"
  132782. "ldr r3, [%[a], #4]\n\t"
  132783. "cmp r3, #0\n\t"
  132784. "beq L_sp_521_num_bits_17_1_%=\n\t"
  132785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132786. "lsrs r5, r3, #24\n\t"
  132787. #else
  132788. "lsr r5, r3, #24\n\t"
  132789. #endif
  132790. "cmp r5, #0\n\t"
  132791. "beq L_sp_521_num_bits_17_33_%=\n\t"
  132792. "movs r2, #56\n\t"
  132793. "ldrb r4, [%[table], r5]\n\t"
  132794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132795. "adds r2, r2, r4\n\t"
  132796. #else
  132797. "add r2, r2, r4\n\t"
  132798. #endif
  132799. "b L_sp_521_num_bits_17_18_%=\n\t"
  132800. "\n"
  132801. "L_sp_521_num_bits_17_33_%=:\n\t"
  132802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132803. "lsrs r5, r3, #16\n\t"
  132804. #else
  132805. "lsr r5, r3, #16\n\t"
  132806. #endif
  132807. #ifdef WOLFSSL_KEIL
  132808. "ands r5, r5, r6\n\t"
  132809. #elif defined(__clang__)
  132810. "ands r5, r6\n\t"
  132811. #else
  132812. "and r5, r6\n\t"
  132813. #endif
  132814. "cmp r5, #0\n\t"
  132815. "beq L_sp_521_num_bits_17_32_%=\n\t"
  132816. "movs r2, #48\n\t"
  132817. "ldrb r4, [%[table], r5]\n\t"
  132818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132819. "adds r2, r2, r4\n\t"
  132820. #else
  132821. "add r2, r2, r4\n\t"
  132822. #endif
  132823. "b L_sp_521_num_bits_17_18_%=\n\t"
  132824. "\n"
  132825. "L_sp_521_num_bits_17_32_%=:\n\t"
  132826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132827. "lsrs r5, r3, #8\n\t"
  132828. #else
  132829. "lsr r5, r3, #8\n\t"
  132830. #endif
  132831. #ifdef WOLFSSL_KEIL
  132832. "ands r5, r5, r6\n\t"
  132833. #elif defined(__clang__)
  132834. "ands r5, r6\n\t"
  132835. #else
  132836. "and r5, r6\n\t"
  132837. #endif
  132838. "cmp r5, #0\n\t"
  132839. "beq L_sp_521_num_bits_17_31_%=\n\t"
  132840. "movs r2, #40\n\t"
  132841. "ldrb r4, [%[table], r5]\n\t"
  132842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132843. "adds r2, r2, r4\n\t"
  132844. #else
  132845. "add r2, r2, r4\n\t"
  132846. #endif
  132847. "b L_sp_521_num_bits_17_18_%=\n\t"
  132848. "\n"
  132849. "L_sp_521_num_bits_17_31_%=:\n\t"
  132850. "movs r5, r3\n\t"
  132851. #ifdef WOLFSSL_KEIL
  132852. "ands r5, r5, r6\n\t"
  132853. #elif defined(__clang__)
  132854. "ands r5, r6\n\t"
  132855. #else
  132856. "and r5, r6\n\t"
  132857. #endif
  132858. "cmp r5, #0\n\t"
  132859. "beq L_sp_521_num_bits_17_30_%=\n\t"
  132860. "movs r2, #32\n\t"
  132861. "ldrb r4, [%[table], r5]\n\t"
  132862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132863. "adds r2, r2, r4\n\t"
  132864. #else
  132865. "add r2, r2, r4\n\t"
  132866. #endif
  132867. "b L_sp_521_num_bits_17_18_%=\n\t"
  132868. "\n"
  132869. "L_sp_521_num_bits_17_30_%=:\n\t"
  132870. "b L_sp_521_num_bits_17_18_%=\n\t"
  132871. "\n"
  132872. "L_sp_521_num_bits_17_1_%=:\n\t"
  132873. "ldr r3, [%[a]]\n\t"
  132874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132875. "lsrs r5, r3, #24\n\t"
  132876. #else
  132877. "lsr r5, r3, #24\n\t"
  132878. #endif
  132879. "cmp r5, #0\n\t"
  132880. "beq L_sp_521_num_bits_17_23_%=\n\t"
  132881. "movs r2, #24\n\t"
  132882. "ldrb r4, [%[table], r5]\n\t"
  132883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132884. "adds r2, r2, r4\n\t"
  132885. #else
  132886. "add r2, r2, r4\n\t"
  132887. #endif
  132888. "b L_sp_521_num_bits_17_18_%=\n\t"
  132889. "\n"
  132890. "L_sp_521_num_bits_17_23_%=:\n\t"
  132891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132892. "lsrs r5, r3, #16\n\t"
  132893. #else
  132894. "lsr r5, r3, #16\n\t"
  132895. #endif
  132896. #ifdef WOLFSSL_KEIL
  132897. "ands r5, r5, r6\n\t"
  132898. #elif defined(__clang__)
  132899. "ands r5, r6\n\t"
  132900. #else
  132901. "and r5, r6\n\t"
  132902. #endif
  132903. "cmp r5, #0\n\t"
  132904. "beq L_sp_521_num_bits_17_22_%=\n\t"
  132905. "movs r2, #16\n\t"
  132906. "ldrb r4, [%[table], r5]\n\t"
  132907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132908. "adds r2, r2, r4\n\t"
  132909. #else
  132910. "add r2, r2, r4\n\t"
  132911. #endif
  132912. "b L_sp_521_num_bits_17_18_%=\n\t"
  132913. "\n"
  132914. "L_sp_521_num_bits_17_22_%=:\n\t"
  132915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132916. "lsrs r5, r3, #8\n\t"
  132917. #else
  132918. "lsr r5, r3, #8\n\t"
  132919. #endif
  132920. #ifdef WOLFSSL_KEIL
  132921. "ands r5, r5, r6\n\t"
  132922. #elif defined(__clang__)
  132923. "ands r5, r6\n\t"
  132924. #else
  132925. "and r5, r6\n\t"
  132926. #endif
  132927. "cmp r5, #0\n\t"
  132928. "beq L_sp_521_num_bits_17_21_%=\n\t"
  132929. "movs r2, #8\n\t"
  132930. "ldrb r4, [%[table], r5]\n\t"
  132931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132932. "adds r2, r2, r4\n\t"
  132933. #else
  132934. "add r2, r2, r4\n\t"
  132935. #endif
  132936. "b L_sp_521_num_bits_17_18_%=\n\t"
  132937. "\n"
  132938. "L_sp_521_num_bits_17_21_%=:\n\t"
  132939. "movs r5, r3\n\t"
  132940. #ifdef WOLFSSL_KEIL
  132941. "ands r5, r5, r6\n\t"
  132942. #elif defined(__clang__)
  132943. "ands r5, r6\n\t"
  132944. #else
  132945. "and r5, r6\n\t"
  132946. #endif
  132947. "cmp r5, #0\n\t"
  132948. "beq L_sp_521_num_bits_17_20_%=\n\t"
  132949. "movs r2, #0\n\t"
  132950. "ldrb r4, [%[table], r5]\n\t"
  132951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  132952. "adds r2, r2, r4\n\t"
  132953. #else
  132954. "add r2, r2, r4\n\t"
  132955. #endif
  132956. "b L_sp_521_num_bits_17_18_%=\n\t"
  132957. "\n"
  132958. "L_sp_521_num_bits_17_20_%=:\n\t"
  132959. "\n"
  132960. "L_sp_521_num_bits_17_18_%=:\n\t"
  132961. "movs %[a], r2\n\t"
  132962. : [a] "+l" (a), [table] "+l" (table)
  132963. :
  132964. : "memory", "r2", "r3", "r4", "r5", "r6"
  132965. );
  132966. return (uint32_t)(size_t)a;
  132967. }
  132968. /* Non-constant time modular inversion.
  132969. *
  132970. * @param [out] r Resulting number.
  132971. * @param [in] a Number to invert.
  132972. * @param [in] m Modulus.
  132973. * @return MP_OKAY on success.
  132974. */
  132975. static int sp_521_mod_inv_17(sp_digit* r, const sp_digit* a, const sp_digit* m)
  132976. {
  132977. sp_digit u[17];
  132978. sp_digit v[17];
  132979. sp_digit b[17];
  132980. sp_digit d[17];
  132981. int ut, vt;
  132982. sp_digit o;
  132983. XMEMCPY(u, m, sizeof(u));
  132984. XMEMCPY(v, a, sizeof(v));
  132985. ut = sp_521_num_bits_17(u);
  132986. vt = sp_521_num_bits_17(v);
  132987. XMEMSET(b, 0, sizeof(b));
  132988. if ((v[0] & 1) == 0) {
  132989. sp_521_rshift1_17(v, v);
  132990. XMEMCPY(d, m, sizeof(u));
  132991. d[0] += 1;
  132992. sp_521_rshift1_17(d, d);
  132993. vt--;
  132994. while ((v[0] & 1) == 0) {
  132995. sp_521_rshift1_17(v, v);
  132996. sp_521_div2_mod_17(d, d, m);
  132997. vt--;
  132998. }
  132999. }
  133000. else {
  133001. XMEMSET(d+1, 0, sizeof(d)-sizeof(sp_digit));
  133002. d[0] = 1;
  133003. }
  133004. while (ut > 1 && vt > 1) {
  133005. if (ut > vt || (ut == vt && sp_521_cmp_17(u, v) >= 0)) {
  133006. sp_521_sub_17(u, u, v);
  133007. o = sp_521_sub_17(b, b, d);
  133008. if (o != 0)
  133009. sp_521_add_17(b, b, m);
  133010. ut = sp_521_num_bits_17(u);
  133011. do {
  133012. sp_521_rshift1_17(u, u);
  133013. sp_521_div2_mod_17(b, b, m);
  133014. ut--;
  133015. }
  133016. while (ut > 0 && (u[0] & 1) == 0);
  133017. }
  133018. else {
  133019. sp_521_sub_17(v, v, u);
  133020. o = sp_521_sub_17(d, d, b);
  133021. if (o != 0)
  133022. sp_521_add_17(d, d, m);
  133023. vt = sp_521_num_bits_17(v);
  133024. do {
  133025. sp_521_rshift1_17(v, v);
  133026. sp_521_div2_mod_17(d, d, m);
  133027. vt--;
  133028. }
  133029. while (vt > 0 && (v[0] & 1) == 0);
  133030. }
  133031. }
  133032. if (ut == 1)
  133033. XMEMCPY(r, b, sizeof(b));
  133034. else
  133035. XMEMCPY(r, d, sizeof(d));
  133036. return MP_OKAY;
  133037. }
  133038. #endif /* WOLFSSL_SP_SMALL */
  133039. /* Add point p1 into point p2. Handles p1 == p2 and result at infinity.
  133040. *
  133041. * p1 First point to add and holds result.
  133042. * p2 Second point to add.
  133043. * tmp Temporary storage for intermediate numbers.
  133044. */
  133045. static void sp_521_add_points_17(sp_point_521* p1, const sp_point_521* p2,
  133046. sp_digit* tmp)
  133047. {
  133048. sp_521_proj_point_add_17(p1, p1, p2, tmp);
  133049. if (sp_521_iszero_17(p1->z)) {
  133050. if (sp_521_iszero_17(p1->x) && sp_521_iszero_17(p1->y)) {
  133051. sp_521_proj_point_dbl_17(p1, p2, tmp);
  133052. }
  133053. else {
  133054. /* Y ordinate is not used from here - don't set. */
  133055. p1->x[0] = 0;
  133056. p1->x[1] = 0;
  133057. p1->x[2] = 0;
  133058. p1->x[3] = 0;
  133059. p1->x[4] = 0;
  133060. p1->x[5] = 0;
  133061. p1->x[6] = 0;
  133062. p1->x[7] = 0;
  133063. p1->x[8] = 0;
  133064. p1->x[9] = 0;
  133065. p1->x[10] = 0;
  133066. p1->x[11] = 0;
  133067. p1->x[12] = 0;
  133068. p1->x[13] = 0;
  133069. p1->x[14] = 0;
  133070. p1->x[15] = 0;
  133071. p1->x[16] = 0;
  133072. XMEMCPY(p1->z, p521_norm_mod, sizeof(p521_norm_mod));
  133073. }
  133074. }
  133075. }
  133076. /* Calculate the verification point: [e/s]G + [r/s]Q
  133077. *
  133078. * p1 Calculated point.
  133079. * p2 Public point and temporary.
  133080. * s Second part of signature as a number.
  133081. * u1 Temporary number.
  133082. * u2 Temproray number.
  133083. * heap Heap to use for allocation.
  133084. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  133085. */
  133086. static int sp_521_calc_vfy_point_17(sp_point_521* p1, sp_point_521* p2,
  133087. sp_digit* s, sp_digit* u1, sp_digit* u2, sp_digit* tmp, void* heap)
  133088. {
  133089. int err;
  133090. #ifndef WOLFSSL_SP_SMALL
  133091. err = sp_521_mod_inv_17(s, s, p521_order);
  133092. if (err == MP_OKAY)
  133093. #endif /* !WOLFSSL_SP_SMALL */
  133094. {
  133095. sp_521_mul_17(s, s, p521_norm_order);
  133096. err = sp_521_mod_17(s, s, p521_order);
  133097. }
  133098. if (err == MP_OKAY) {
  133099. sp_521_norm_17(s);
  133100. #ifdef WOLFSSL_SP_SMALL
  133101. {
  133102. sp_521_mont_inv_order_17(s, s, tmp);
  133103. sp_521_mont_mul_order_17(u1, u1, s);
  133104. sp_521_mont_mul_order_17(u2, u2, s);
  133105. }
  133106. #else
  133107. {
  133108. sp_521_mont_mul_order_17(u1, u1, s);
  133109. sp_521_mont_mul_order_17(u2, u2, s);
  133110. }
  133111. #endif /* WOLFSSL_SP_SMALL */
  133112. {
  133113. err = sp_521_ecc_mulmod_base_17(p1, u1, 0, 0, heap);
  133114. }
  133115. }
  133116. if ((err == MP_OKAY) && sp_521_iszero_17(p1->z)) {
  133117. p1->infinity = 1;
  133118. }
  133119. if (err == MP_OKAY) {
  133120. err = sp_521_ecc_mulmod_17(p2, p2, u2, 0, 0, heap);
  133121. }
  133122. if ((err == MP_OKAY) && sp_521_iszero_17(p2->z)) {
  133123. p2->infinity = 1;
  133124. }
  133125. if (err == MP_OKAY) {
  133126. sp_521_add_points_17(p1, p2, tmp);
  133127. }
  133128. return err;
  133129. }
  133130. #ifdef HAVE_ECC_VERIFY
  133131. /* Verify the signature values with the hash and public key.
  133132. * e = Truncate(hash, 521)
  133133. * u1 = e/s mod order
  133134. * u2 = r/s mod order
  133135. * r == (u1.G + u2.Q)->x mod order
  133136. * Optimization: Leave point in projective form.
  133137. * (x, y, 1) == (x' / z'*z', y' / z'*z'*z', z' / z')
  133138. * (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x'
  133139. * The hash is truncated to the first 521 bits.
  133140. *
  133141. * hash Hash to sign.
  133142. * hashLen Length of the hash data.
  133143. * rng Random number generator.
  133144. * priv Private part of key - scalar.
  133145. * rm First part of result as an mp_int.
  133146. * sm Sirst part of result as an mp_int.
  133147. * heap Heap to use for allocation.
  133148. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  133149. */
  133150. #ifdef WOLFSSL_SP_NONBLOCK
  133151. typedef struct sp_ecc_verify_521_ctx {
  133152. int state;
  133153. union {
  133154. sp_521_ecc_mulmod_17_ctx mulmod_ctx;
  133155. sp_521_mont_inv_order_17_ctx mont_inv_order_ctx;
  133156. sp_521_proj_point_dbl_17_ctx dbl_ctx;
  133157. sp_521_proj_point_add_17_ctx add_ctx;
  133158. };
  133159. sp_digit u1[2*17];
  133160. sp_digit u2[2*17];
  133161. sp_digit s[2*17];
  133162. sp_digit tmp[2*17 * 6];
  133163. sp_point_521 p1;
  133164. sp_point_521 p2;
  133165. } sp_ecc_verify_521_ctx;
  133166. int sp_ecc_verify_521_nb(sp_ecc_ctx_t* sp_ctx, const byte* hash,
  133167. word32 hashLen, const mp_int* pX, const mp_int* pY, const mp_int* pZ,
  133168. const mp_int* rm, const mp_int* sm, int* res, void* heap)
  133169. {
  133170. int err = FP_WOULDBLOCK;
  133171. sp_ecc_verify_521_ctx* ctx = (sp_ecc_verify_521_ctx*)sp_ctx->data;
  133172. typedef char ctx_size_test[sizeof(sp_ecc_verify_521_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  133173. (void)sizeof(ctx_size_test);
  133174. switch (ctx->state) {
  133175. case 0: /* INIT */
  133176. if (hashLen > 66U) {
  133177. hashLen = 66U;
  133178. }
  133179. sp_521_from_bin(ctx->u1, 17, hash, (int)hashLen);
  133180. sp_521_from_mp(ctx->u2, 17, rm);
  133181. sp_521_from_mp(ctx->s, 17, sm);
  133182. sp_521_from_mp(ctx->p2.x, 17, pX);
  133183. sp_521_from_mp(ctx->p2.y, 17, pY);
  133184. sp_521_from_mp(ctx->p2.z, 17, pZ);
  133185. if (hashLen == 66U) {
  133186. sp_521_rshift_17(ctx->u1, ctx->u1, 7);
  133187. }
  133188. ctx->state = 1;
  133189. break;
  133190. case 1: /* NORMS0 */
  133191. sp_521_mul_17(ctx->s, ctx->s, p521_norm_order);
  133192. err = sp_521_mod_17(ctx->s, ctx->s, p521_order);
  133193. if (err == MP_OKAY)
  133194. ctx->state = 2;
  133195. break;
  133196. case 2: /* NORMS1 */
  133197. sp_521_norm_17(ctx->s);
  133198. XMEMSET(&ctx->mont_inv_order_ctx, 0, sizeof(ctx->mont_inv_order_ctx));
  133199. ctx->state = 3;
  133200. break;
  133201. case 3: /* NORMS2 */
  133202. err = sp_521_mont_inv_order_17_nb((sp_ecc_ctx_t*)&ctx->mont_inv_order_ctx, ctx->s, ctx->s, ctx->tmp);
  133203. if (err == MP_OKAY) {
  133204. ctx->state = 4;
  133205. }
  133206. break;
  133207. case 4: /* NORMS3 */
  133208. sp_521_mont_mul_order_17(ctx->u1, ctx->u1, ctx->s);
  133209. ctx->state = 5;
  133210. break;
  133211. case 5: /* NORMS4 */
  133212. sp_521_mont_mul_order_17(ctx->u2, ctx->u2, ctx->s);
  133213. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  133214. ctx->state = 6;
  133215. break;
  133216. case 6: /* MULBASE */
  133217. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p1, &p521_base, ctx->u1, 0, 0, heap);
  133218. if (err == MP_OKAY) {
  133219. if (sp_521_iszero_17(ctx->p1.z)) {
  133220. ctx->p1.infinity = 1;
  133221. }
  133222. XMEMSET(&ctx->mulmod_ctx, 0, sizeof(ctx->mulmod_ctx));
  133223. ctx->state = 7;
  133224. }
  133225. break;
  133226. case 7: /* MULMOD */
  133227. err = sp_521_ecc_mulmod_17_nb((sp_ecc_ctx_t*)&ctx->mulmod_ctx, &ctx->p2, &ctx->p2, ctx->u2, 0, 0, heap);
  133228. if (err == MP_OKAY) {
  133229. if (sp_521_iszero_17(ctx->p2.z)) {
  133230. ctx->p2.infinity = 1;
  133231. }
  133232. XMEMSET(&ctx->add_ctx, 0, sizeof(ctx->add_ctx));
  133233. ctx->state = 8;
  133234. }
  133235. break;
  133236. case 8: /* ADD */
  133237. err = sp_521_proj_point_add_17_nb((sp_ecc_ctx_t*)&ctx->add_ctx, &ctx->p1, &ctx->p1, &ctx->p2, ctx->tmp);
  133238. if (err == MP_OKAY)
  133239. ctx->state = 9;
  133240. break;
  133241. case 9: /* MONT */
  133242. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  133243. /* Reload r and convert to Montgomery form. */
  133244. sp_521_from_mp(ctx->u2, 17, rm);
  133245. err = sp_521_mod_mul_norm_17(ctx->u2, ctx->u2, p521_mod);
  133246. if (err == MP_OKAY)
  133247. ctx->state = 10;
  133248. break;
  133249. case 10: /* SQR */
  133250. /* u1 = r.z'.z' mod prime */
  133251. sp_521_mont_sqr_17(ctx->p1.z, ctx->p1.z, p521_mod, p521_mp_mod);
  133252. ctx->state = 11;
  133253. break;
  133254. case 11: /* MUL */
  133255. sp_521_mont_mul_17(ctx->u1, ctx->u2, ctx->p1.z, p521_mod, p521_mp_mod);
  133256. ctx->state = 12;
  133257. break;
  133258. case 12: /* RES */
  133259. {
  133260. sp_int32 c = 0;
  133261. err = MP_OKAY; /* math okay, now check result */
  133262. *res = (int)(sp_521_cmp_17(ctx->p1.x, ctx->u1) == 0);
  133263. if (*res == 0) {
  133264. sp_digit carry;
  133265. /* Reload r and add order. */
  133266. sp_521_from_mp(ctx->u2, 17, rm);
  133267. carry = sp_521_add_17(ctx->u2, ctx->u2, p521_order);
  133268. /* Carry means result is greater than mod and is not valid. */
  133269. if (carry == 0) {
  133270. sp_521_norm_17(ctx->u2);
  133271. /* Compare with mod and if greater or equal then not valid. */
  133272. c = sp_521_cmp_17(ctx->u2, p521_mod);
  133273. }
  133274. }
  133275. if ((*res == 0) && (c < 0)) {
  133276. /* Convert to Montogomery form */
  133277. err = sp_521_mod_mul_norm_17(ctx->u2, ctx->u2, p521_mod);
  133278. if (err == MP_OKAY) {
  133279. /* u1 = (r + 1*order).z'.z' mod prime */
  133280. sp_521_mont_mul_17(ctx->u1, ctx->u2, ctx->p1.z, p521_mod,
  133281. p521_mp_mod);
  133282. *res = (int)(sp_521_cmp_17(ctx->p1.x, ctx->u1) == 0);
  133283. }
  133284. }
  133285. break;
  133286. }
  133287. } /* switch */
  133288. if (err == MP_OKAY && ctx->state != 12) {
  133289. err = FP_WOULDBLOCK;
  133290. }
  133291. return err;
  133292. }
  133293. #endif /* WOLFSSL_SP_NONBLOCK */
  133294. int sp_ecc_verify_521(const byte* hash, word32 hashLen, const mp_int* pX,
  133295. const mp_int* pY, const mp_int* pZ, const mp_int* rm, const mp_int* sm,
  133296. int* res, void* heap)
  133297. {
  133298. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133299. sp_digit* u1 = NULL;
  133300. sp_point_521* p1 = NULL;
  133301. #else
  133302. sp_digit u1[18 * 17];
  133303. sp_point_521 p1[2];
  133304. #endif
  133305. sp_digit* u2 = NULL;
  133306. sp_digit* s = NULL;
  133307. sp_digit* tmp = NULL;
  133308. sp_point_521* p2 = NULL;
  133309. sp_digit carry;
  133310. sp_int32 c = 0;
  133311. int err = MP_OKAY;
  133312. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133313. if (err == MP_OKAY) {
  133314. p1 = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  133315. DYNAMIC_TYPE_ECC);
  133316. if (p1 == NULL)
  133317. err = MEMORY_E;
  133318. }
  133319. if (err == MP_OKAY) {
  133320. u1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 18 * 17, heap,
  133321. DYNAMIC_TYPE_ECC);
  133322. if (u1 == NULL)
  133323. err = MEMORY_E;
  133324. }
  133325. #endif
  133326. if (err == MP_OKAY) {
  133327. u2 = u1 + 2 * 17;
  133328. s = u1 + 4 * 17;
  133329. tmp = u1 + 6 * 17;
  133330. p2 = p1 + 1;
  133331. if (hashLen > 66U) {
  133332. hashLen = 66U;
  133333. }
  133334. sp_521_from_bin(u1, 17, hash, (int)hashLen);
  133335. sp_521_from_mp(u2, 17, rm);
  133336. sp_521_from_mp(s, 17, sm);
  133337. sp_521_from_mp(p2->x, 17, pX);
  133338. sp_521_from_mp(p2->y, 17, pY);
  133339. sp_521_from_mp(p2->z, 17, pZ);
  133340. if (hashLen == 66U) {
  133341. sp_521_rshift_17(u1, u1, 7);
  133342. }
  133343. err = sp_521_calc_vfy_point_17(p1, p2, s, u1, u2, tmp, heap);
  133344. }
  133345. if (err == MP_OKAY) {
  133346. /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */
  133347. /* Reload r and convert to Montgomery form. */
  133348. sp_521_from_mp(u2, 17, rm);
  133349. err = sp_521_mod_mul_norm_17(u2, u2, p521_mod);
  133350. }
  133351. if (err == MP_OKAY) {
  133352. /* u1 = r.z'.z' mod prime */
  133353. sp_521_mont_sqr_17(p1->z, p1->z, p521_mod, p521_mp_mod);
  133354. sp_521_mont_mul_17(u1, u2, p1->z, p521_mod, p521_mp_mod);
  133355. *res = (int)(sp_521_cmp_17(p1->x, u1) == 0);
  133356. if (*res == 0) {
  133357. /* Reload r and add order. */
  133358. sp_521_from_mp(u2, 17, rm);
  133359. carry = sp_521_add_17(u2, u2, p521_order);
  133360. /* Carry means result is greater than mod and is not valid. */
  133361. if (carry == 0) {
  133362. sp_521_norm_17(u2);
  133363. /* Compare with mod and if greater or equal then not valid. */
  133364. c = sp_521_cmp_17(u2, p521_mod);
  133365. }
  133366. }
  133367. if ((*res == 0) && (c < 0)) {
  133368. /* Convert to Montogomery form */
  133369. err = sp_521_mod_mul_norm_17(u2, u2, p521_mod);
  133370. if (err == MP_OKAY) {
  133371. /* u1 = (r + 1*order).z'.z' mod prime */
  133372. {
  133373. sp_521_mont_mul_17(u1, u2, p1->z, p521_mod, p521_mp_mod);
  133374. }
  133375. *res = (sp_521_cmp_17(p1->x, u1) == 0);
  133376. }
  133377. }
  133378. }
  133379. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133380. if (u1 != NULL)
  133381. XFREE(u1, heap, DYNAMIC_TYPE_ECC);
  133382. if (p1 != NULL)
  133383. XFREE(p1, heap, DYNAMIC_TYPE_ECC);
  133384. #endif
  133385. return err;
  133386. }
  133387. #endif /* HAVE_ECC_VERIFY */
  133388. #ifdef HAVE_ECC_CHECK_KEY
  133389. /* Check that the x and y oridinates are a valid point on the curve.
  133390. *
  133391. * point EC point.
  133392. * heap Heap to use if dynamically allocating.
  133393. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  133394. * not on the curve and MP_OKAY otherwise.
  133395. */
  133396. static int sp_521_ecc_is_point_17(const sp_point_521* point,
  133397. void* heap)
  133398. {
  133399. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133400. sp_digit* t1 = NULL;
  133401. #else
  133402. sp_digit t1[17 * 4];
  133403. #endif
  133404. sp_digit* t2 = NULL;
  133405. int err = MP_OKAY;
  133406. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133407. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17 * 4, heap, DYNAMIC_TYPE_ECC);
  133408. if (t1 == NULL)
  133409. err = MEMORY_E;
  133410. #endif
  133411. (void)heap;
  133412. if (err == MP_OKAY) {
  133413. t2 = t1 + 2 * 17;
  133414. sp_521_sqr_17(t1, point->y);
  133415. (void)sp_521_mod_17(t1, t1, p521_mod);
  133416. sp_521_sqr_17(t2, point->x);
  133417. (void)sp_521_mod_17(t2, t2, p521_mod);
  133418. sp_521_mul_17(t2, t2, point->x);
  133419. (void)sp_521_mod_17(t2, t2, p521_mod);
  133420. (void)sp_521_sub_17(t2, p521_mod, t2);
  133421. sp_521_mont_add_17(t1, t1, t2, p521_mod);
  133422. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  133423. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  133424. sp_521_mont_add_17(t1, t1, point->x, p521_mod);
  133425. if (sp_521_cmp_17(t1, p521_b) != 0) {
  133426. err = MP_VAL;
  133427. }
  133428. }
  133429. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133430. if (t1 != NULL)
  133431. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  133432. #endif
  133433. return err;
  133434. }
  133435. /* Check that the x and y oridinates are a valid point on the curve.
  133436. *
  133437. * pX X ordinate of EC point.
  133438. * pY Y ordinate of EC point.
  133439. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  133440. * not on the curve and MP_OKAY otherwise.
  133441. */
  133442. int sp_ecc_is_point_521(const mp_int* pX, const mp_int* pY)
  133443. {
  133444. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133445. sp_point_521* pub = NULL;
  133446. #else
  133447. sp_point_521 pub[1];
  133448. #endif
  133449. const byte one[1] = { 1 };
  133450. int err = MP_OKAY;
  133451. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133452. pub = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  133453. DYNAMIC_TYPE_ECC);
  133454. if (pub == NULL)
  133455. err = MEMORY_E;
  133456. #endif
  133457. if (err == MP_OKAY) {
  133458. sp_521_from_mp(pub->x, 17, pX);
  133459. sp_521_from_mp(pub->y, 17, pY);
  133460. sp_521_from_bin(pub->z, 17, one, (int)sizeof(one));
  133461. err = sp_521_ecc_is_point_17(pub, NULL);
  133462. }
  133463. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133464. if (pub != NULL)
  133465. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  133466. #endif
  133467. return err;
  133468. }
  133469. /* Check that the private scalar generates the EC point (px, py), the point is
  133470. * on the curve and the point has the correct order.
  133471. *
  133472. * pX X ordinate of EC point.
  133473. * pY Y ordinate of EC point.
  133474. * privm Private scalar that generates EC point.
  133475. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  133476. * not on the curve, ECC_INF_E if the point does not have the correct order,
  133477. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  133478. * MP_OKAY otherwise.
  133479. */
  133480. int sp_ecc_check_key_521(const mp_int* pX, const mp_int* pY,
  133481. const mp_int* privm, void* heap)
  133482. {
  133483. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133484. sp_digit* priv = NULL;
  133485. sp_point_521* pub = NULL;
  133486. #else
  133487. sp_digit priv[17];
  133488. sp_point_521 pub[2];
  133489. #endif
  133490. sp_point_521* p = NULL;
  133491. const byte one[1] = { 1 };
  133492. int err = MP_OKAY;
  133493. /* Quick check the lengs of public key ordinates and private key are in
  133494. * range. Proper check later.
  133495. */
  133496. if (((mp_count_bits(pX) > 521) ||
  133497. (mp_count_bits(pY) > 521) ||
  133498. ((privm != NULL) && (mp_count_bits(privm) > 521)))) {
  133499. err = ECC_OUT_OF_RANGE_E;
  133500. }
  133501. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133502. if (err == MP_OKAY) {
  133503. pub = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap,
  133504. DYNAMIC_TYPE_ECC);
  133505. if (pub == NULL)
  133506. err = MEMORY_E;
  133507. }
  133508. if (err == MP_OKAY && privm) {
  133509. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 17, heap,
  133510. DYNAMIC_TYPE_ECC);
  133511. if (priv == NULL)
  133512. err = MEMORY_E;
  133513. }
  133514. #endif
  133515. if (err == MP_OKAY) {
  133516. p = pub + 1;
  133517. sp_521_from_mp(pub->x, 17, pX);
  133518. sp_521_from_mp(pub->y, 17, pY);
  133519. sp_521_from_bin(pub->z, 17, one, (int)sizeof(one));
  133520. if (privm)
  133521. sp_521_from_mp(priv, 17, privm);
  133522. /* Check point at infinitiy. */
  133523. if ((sp_521_iszero_17(pub->x) != 0) &&
  133524. (sp_521_iszero_17(pub->y) != 0)) {
  133525. err = ECC_INF_E;
  133526. }
  133527. }
  133528. /* Check range of X and Y */
  133529. if ((err == MP_OKAY) &&
  133530. ((sp_521_cmp_17(pub->x, p521_mod) >= 0) ||
  133531. (sp_521_cmp_17(pub->y, p521_mod) >= 0))) {
  133532. err = ECC_OUT_OF_RANGE_E;
  133533. }
  133534. if (err == MP_OKAY) {
  133535. /* Check point is on curve */
  133536. err = sp_521_ecc_is_point_17(pub, heap);
  133537. }
  133538. if (err == MP_OKAY) {
  133539. /* Point * order = infinity */
  133540. err = sp_521_ecc_mulmod_17(p, pub, p521_order, 1, 1, heap);
  133541. }
  133542. /* Check result is infinity */
  133543. if ((err == MP_OKAY) && ((sp_521_iszero_17(p->x) == 0) ||
  133544. (sp_521_iszero_17(p->y) == 0))) {
  133545. err = ECC_INF_E;
  133546. }
  133547. if (privm) {
  133548. if (err == MP_OKAY) {
  133549. /* Base * private = point */
  133550. err = sp_521_ecc_mulmod_base_17(p, priv, 1, 1, heap);
  133551. }
  133552. /* Check result is public key */
  133553. if ((err == MP_OKAY) &&
  133554. ((sp_521_cmp_17(p->x, pub->x) != 0) ||
  133555. (sp_521_cmp_17(p->y, pub->y) != 0))) {
  133556. err = ECC_PRIV_KEY_E;
  133557. }
  133558. }
  133559. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133560. if (pub != NULL)
  133561. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  133562. if (priv != NULL)
  133563. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  133564. #endif
  133565. return err;
  133566. }
  133567. #endif
  133568. #ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL
  133569. /* Add two projective EC points together.
  133570. * (pX, pY, pZ) + (qX, qY, qZ) = (rX, rY, rZ)
  133571. *
  133572. * pX First EC point's X ordinate.
  133573. * pY First EC point's Y ordinate.
  133574. * pZ First EC point's Z ordinate.
  133575. * qX Second EC point's X ordinate.
  133576. * qY Second EC point's Y ordinate.
  133577. * qZ Second EC point's Z ordinate.
  133578. * rX Resultant EC point's X ordinate.
  133579. * rY Resultant EC point's Y ordinate.
  133580. * rZ Resultant EC point's Z ordinate.
  133581. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  133582. */
  133583. int sp_ecc_proj_add_point_521(mp_int* pX, mp_int* pY, mp_int* pZ,
  133584. mp_int* qX, mp_int* qY, mp_int* qZ,
  133585. mp_int* rX, mp_int* rY, mp_int* rZ)
  133586. {
  133587. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133588. sp_digit* tmp = NULL;
  133589. sp_point_521* p = NULL;
  133590. #else
  133591. sp_digit tmp[2 * 17 * 6];
  133592. sp_point_521 p[2];
  133593. #endif
  133594. sp_point_521* q = NULL;
  133595. int err = MP_OKAY;
  133596. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133597. if (err == MP_OKAY) {
  133598. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, NULL,
  133599. DYNAMIC_TYPE_ECC);
  133600. if (p == NULL)
  133601. err = MEMORY_E;
  133602. }
  133603. if (err == MP_OKAY) {
  133604. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 6, NULL,
  133605. DYNAMIC_TYPE_ECC);
  133606. if (tmp == NULL) {
  133607. err = MEMORY_E;
  133608. }
  133609. }
  133610. #endif
  133611. if (err == MP_OKAY) {
  133612. q = p + 1;
  133613. sp_521_from_mp(p->x, 17, pX);
  133614. sp_521_from_mp(p->y, 17, pY);
  133615. sp_521_from_mp(p->z, 17, pZ);
  133616. sp_521_from_mp(q->x, 17, qX);
  133617. sp_521_from_mp(q->y, 17, qY);
  133618. sp_521_from_mp(q->z, 17, qZ);
  133619. p->infinity = sp_521_iszero_17(p->x) &
  133620. sp_521_iszero_17(p->y);
  133621. q->infinity = sp_521_iszero_17(q->x) &
  133622. sp_521_iszero_17(q->y);
  133623. sp_521_proj_point_add_17(p, p, q, tmp);
  133624. }
  133625. if (err == MP_OKAY) {
  133626. err = sp_521_to_mp(p->x, rX);
  133627. }
  133628. if (err == MP_OKAY) {
  133629. err = sp_521_to_mp(p->y, rY);
  133630. }
  133631. if (err == MP_OKAY) {
  133632. err = sp_521_to_mp(p->z, rZ);
  133633. }
  133634. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133635. if (tmp != NULL)
  133636. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  133637. if (p != NULL)
  133638. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  133639. #endif
  133640. return err;
  133641. }
  133642. /* Double a projective EC point.
  133643. * (pX, pY, pZ) + (pX, pY, pZ) = (rX, rY, rZ)
  133644. *
  133645. * pX EC point's X ordinate.
  133646. * pY EC point's Y ordinate.
  133647. * pZ EC point's Z ordinate.
  133648. * rX Resultant EC point's X ordinate.
  133649. * rY Resultant EC point's Y ordinate.
  133650. * rZ Resultant EC point's Z ordinate.
  133651. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  133652. */
  133653. int sp_ecc_proj_dbl_point_521(mp_int* pX, mp_int* pY, mp_int* pZ,
  133654. mp_int* rX, mp_int* rY, mp_int* rZ)
  133655. {
  133656. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133657. sp_digit* tmp = NULL;
  133658. sp_point_521* p = NULL;
  133659. #else
  133660. sp_digit tmp[2 * 17 * 2];
  133661. sp_point_521 p[1];
  133662. #endif
  133663. int err = MP_OKAY;
  133664. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133665. if (err == MP_OKAY) {
  133666. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  133667. DYNAMIC_TYPE_ECC);
  133668. if (p == NULL)
  133669. err = MEMORY_E;
  133670. }
  133671. if (err == MP_OKAY) {
  133672. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 2, NULL,
  133673. DYNAMIC_TYPE_ECC);
  133674. if (tmp == NULL)
  133675. err = MEMORY_E;
  133676. }
  133677. #endif
  133678. if (err == MP_OKAY) {
  133679. sp_521_from_mp(p->x, 17, pX);
  133680. sp_521_from_mp(p->y, 17, pY);
  133681. sp_521_from_mp(p->z, 17, pZ);
  133682. p->infinity = sp_521_iszero_17(p->x) &
  133683. sp_521_iszero_17(p->y);
  133684. sp_521_proj_point_dbl_17(p, p, tmp);
  133685. }
  133686. if (err == MP_OKAY) {
  133687. err = sp_521_to_mp(p->x, rX);
  133688. }
  133689. if (err == MP_OKAY) {
  133690. err = sp_521_to_mp(p->y, rY);
  133691. }
  133692. if (err == MP_OKAY) {
  133693. err = sp_521_to_mp(p->z, rZ);
  133694. }
  133695. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133696. if (tmp != NULL)
  133697. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  133698. if (p != NULL)
  133699. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  133700. #endif
  133701. return err;
  133702. }
  133703. /* Map a projective EC point to affine in place.
  133704. * pZ will be one.
  133705. *
  133706. * pX EC point's X ordinate.
  133707. * pY EC point's Y ordinate.
  133708. * pZ EC point's Z ordinate.
  133709. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  133710. */
  133711. int sp_ecc_map_521(mp_int* pX, mp_int* pY, mp_int* pZ)
  133712. {
  133713. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133714. sp_digit* tmp = NULL;
  133715. sp_point_521* p = NULL;
  133716. #else
  133717. sp_digit tmp[2 * 17 * 5];
  133718. sp_point_521 p[1];
  133719. #endif
  133720. int err = MP_OKAY;
  133721. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133722. if (err == MP_OKAY) {
  133723. p = (sp_point_521*)XMALLOC(sizeof(sp_point_521), NULL,
  133724. DYNAMIC_TYPE_ECC);
  133725. if (p == NULL)
  133726. err = MEMORY_E;
  133727. }
  133728. if (err == MP_OKAY) {
  133729. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17 * 5, NULL,
  133730. DYNAMIC_TYPE_ECC);
  133731. if (tmp == NULL)
  133732. err = MEMORY_E;
  133733. }
  133734. #endif
  133735. if (err == MP_OKAY) {
  133736. sp_521_from_mp(p->x, 17, pX);
  133737. sp_521_from_mp(p->y, 17, pY);
  133738. sp_521_from_mp(p->z, 17, pZ);
  133739. p->infinity = sp_521_iszero_17(p->x) &
  133740. sp_521_iszero_17(p->y);
  133741. sp_521_map_17(p, p, tmp);
  133742. }
  133743. if (err == MP_OKAY) {
  133744. err = sp_521_to_mp(p->x, pX);
  133745. }
  133746. if (err == MP_OKAY) {
  133747. err = sp_521_to_mp(p->y, pY);
  133748. }
  133749. if (err == MP_OKAY) {
  133750. err = sp_521_to_mp(p->z, pZ);
  133751. }
  133752. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133753. if (tmp != NULL)
  133754. XFREE(tmp, NULL, DYNAMIC_TYPE_ECC);
  133755. if (p != NULL)
  133756. XFREE(p, NULL, DYNAMIC_TYPE_ECC);
  133757. #endif
  133758. return err;
  133759. }
  133760. #endif /* WOLFSSL_PUBLIC_ECC_ADD_DBL */
  133761. #ifdef HAVE_COMP_KEY
  133762. /* Square root power for the P521 curve. */
  133763. static const uint32_t p521_sqrt_power[17] = {
  133764. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  133765. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  133766. 0x00000000,0x00000000,0x00000080
  133767. };
  133768. /* Find the square root of a number mod the prime of the curve.
  133769. *
  133770. * y The number to operate on and the result.
  133771. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  133772. */
  133773. static int sp_521_mont_sqrt_17(sp_digit* y)
  133774. {
  133775. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133776. sp_digit* t = NULL;
  133777. #else
  133778. sp_digit t[2 * 17];
  133779. #endif
  133780. int err = MP_OKAY;
  133781. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133782. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 17, NULL, DYNAMIC_TYPE_ECC);
  133783. if (t == NULL)
  133784. err = MEMORY_E;
  133785. #endif
  133786. if (err == MP_OKAY) {
  133787. {
  133788. int i;
  133789. XMEMCPY(t, y, sizeof(sp_digit) * 17);
  133790. for (i=518; i>=0; i--) {
  133791. sp_521_mont_sqr_17(t, t, p521_mod, p521_mp_mod);
  133792. if (p521_sqrt_power[i / 32] & ((sp_digit)1 << (i % 32)))
  133793. sp_521_mont_mul_17(t, t, y, p521_mod, p521_mp_mod);
  133794. }
  133795. XMEMCPY(y, t, sizeof(sp_digit) * 17);
  133796. }
  133797. }
  133798. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133799. if (t != NULL)
  133800. XFREE(t, NULL, DYNAMIC_TYPE_ECC);
  133801. #endif
  133802. return err;
  133803. }
  133804. /* Uncompress the point given the X ordinate.
  133805. *
  133806. * xm X ordinate.
  133807. * odd Whether the Y ordinate is odd.
  133808. * ym Calculated Y ordinate.
  133809. * returns MEMORY_E if dynamic memory allocation fails and MP_OKAY otherwise.
  133810. */
  133811. int sp_ecc_uncompress_521(mp_int* xm, int odd, mp_int* ym)
  133812. {
  133813. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133814. sp_digit* x = NULL;
  133815. #else
  133816. sp_digit x[4 * 17];
  133817. #endif
  133818. sp_digit* y = NULL;
  133819. int err = MP_OKAY;
  133820. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133821. x = (sp_digit*)XMALLOC(sizeof(sp_digit) * 4 * 17, NULL, DYNAMIC_TYPE_ECC);
  133822. if (x == NULL)
  133823. err = MEMORY_E;
  133824. #endif
  133825. if (err == MP_OKAY) {
  133826. y = x + 2 * 17;
  133827. sp_521_from_mp(x, 17, xm);
  133828. err = sp_521_mod_mul_norm_17(x, x, p521_mod);
  133829. }
  133830. if (err == MP_OKAY) {
  133831. /* y = x^3 */
  133832. {
  133833. sp_521_mont_sqr_17(y, x, p521_mod, p521_mp_mod);
  133834. sp_521_mont_mul_17(y, y, x, p521_mod, p521_mp_mod);
  133835. }
  133836. /* y = x^3 - 3x */
  133837. sp_521_mont_sub_17(y, y, x, p521_mod);
  133838. sp_521_mont_sub_17(y, y, x, p521_mod);
  133839. sp_521_mont_sub_17(y, y, x, p521_mod);
  133840. /* y = x^3 - 3x + b */
  133841. err = sp_521_mod_mul_norm_17(x, p521_b, p521_mod);
  133842. }
  133843. if (err == MP_OKAY) {
  133844. sp_521_mont_add_17(y, y, x, p521_mod);
  133845. /* y = sqrt(x^3 - 3x + b) */
  133846. err = sp_521_mont_sqrt_17(y);
  133847. }
  133848. if (err == MP_OKAY) {
  133849. XMEMSET(y + 17, 0, 17U * sizeof(sp_digit));
  133850. sp_521_mont_reduce_17(y, p521_mod, p521_mp_mod);
  133851. if ((((word32)y[0] ^ (word32)odd) & 1U) != 0U) {
  133852. sp_521_mont_sub_17(y, p521_mod, y, p521_mod);
  133853. }
  133854. err = sp_521_to_mp(y, ym);
  133855. }
  133856. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  133857. if (x != NULL)
  133858. XFREE(x, NULL, DYNAMIC_TYPE_ECC);
  133859. #endif
  133860. return err;
  133861. }
  133862. #endif
  133863. #endif /* WOLFSSL_SP_521 */
  133864. #ifdef WOLFSSL_SP_1024
  133865. /* Point structure to use. */
  133866. typedef struct sp_point_1024 {
  133867. /* X ordinate of point. */
  133868. sp_digit x[2 * 32];
  133869. /* Y ordinate of point. */
  133870. sp_digit y[2 * 32];
  133871. /* Z ordinate of point. */
  133872. sp_digit z[2 * 32];
  133873. /* Indicates point is at infinity. */
  133874. int infinity;
  133875. } sp_point_1024;
  133876. #ifndef WOLFSSL_SP_SMALL
  133877. #ifndef WOLFSSL_SP_LARGE_CODE
  133878. /* Multiply a and b into r. (r = a * b)
  133879. *
  133880. * r A single precision integer.
  133881. * a A single precision integer.
  133882. * b A single precision integer.
  133883. */
  133884. SP_NOINLINE static void sp_1024_mul_16(sp_digit* r, const sp_digit* a,
  133885. const sp_digit* b)
  133886. {
  133887. sp_digit t[16 * 2];
  133888. sp_digit* tmp = t;
  133889. __asm__ __volatile__ (
  133890. "movs r3, #0\n\t"
  133891. "movs r4, #0\n\t"
  133892. "mov r8, r3\n\t"
  133893. "mov r11, %[tmp]\n\t"
  133894. "mov r9, %[a]\n\t"
  133895. "mov r10, %[b]\n\t"
  133896. "movs r6, #0x40\n\t"
  133897. "add r6, r6, r9\n\t"
  133898. "mov r12, r6\n\t"
  133899. "\n"
  133900. "L_sp_1024_mul_16_words_%=:\n\t"
  133901. "movs %[tmp], #0\n\t"
  133902. "movs r5, #0\n\t"
  133903. "movs r6, #60\n\t"
  133904. "mov %[a], r8\n\t"
  133905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133906. "subs %[a], %[a], r6\n\t"
  133907. #else
  133908. "sub %[a], %[a], r6\n\t"
  133909. #endif
  133910. #ifdef WOLFSSL_KEIL
  133911. "sbcs r6, r6, r6\n\t"
  133912. #elif defined(__clang__)
  133913. "sbcs r6, r6\n\t"
  133914. #else
  133915. "sbc r6, r6\n\t"
  133916. #endif
  133917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133918. "mvns r6, r6\n\t"
  133919. #else
  133920. "mvn r6, r6\n\t"
  133921. #endif
  133922. #ifdef WOLFSSL_KEIL
  133923. "ands %[a], %[a], r6\n\t"
  133924. #elif defined(__clang__)
  133925. "ands %[a], r6\n\t"
  133926. #else
  133927. "and %[a], r6\n\t"
  133928. #endif
  133929. "mov %[b], r8\n\t"
  133930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133931. "subs %[b], %[b], %[a]\n\t"
  133932. #else
  133933. "sub %[b], %[b], %[a]\n\t"
  133934. #endif
  133935. "add %[a], %[a], r9\n\t"
  133936. "add %[b], %[b], r10\n\t"
  133937. "\n"
  133938. "L_sp_1024_mul_16_mul_%=:\n\t"
  133939. "# Multiply Start\n\t"
  133940. "ldrh r6, [%[a]]\n\t"
  133941. "ldrh r7, [%[b]]\n\t"
  133942. #ifdef WOLFSSL_KEIL
  133943. "muls r7, r6, r7\n\t"
  133944. #elif defined(__clang__)
  133945. "muls r7, r6\n\t"
  133946. #else
  133947. "mul r7, r6\n\t"
  133948. #endif
  133949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133950. "adds r3, r3, r7\n\t"
  133951. #else
  133952. "add r3, r3, r7\n\t"
  133953. #endif
  133954. #ifdef WOLFSSL_KEIL
  133955. "adcs r4, r4, %[tmp]\n\t"
  133956. #elif defined(__clang__)
  133957. "adcs r4, %[tmp]\n\t"
  133958. #else
  133959. "adc r4, %[tmp]\n\t"
  133960. #endif
  133961. #ifdef WOLFSSL_KEIL
  133962. "adcs r5, r5, %[tmp]\n\t"
  133963. #elif defined(__clang__)
  133964. "adcs r5, %[tmp]\n\t"
  133965. #else
  133966. "adc r5, %[tmp]\n\t"
  133967. #endif
  133968. "ldr r7, [%[b]]\n\t"
  133969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133970. "lsrs r7, r7, #16\n\t"
  133971. #else
  133972. "lsr r7, r7, #16\n\t"
  133973. #endif
  133974. #ifdef WOLFSSL_KEIL
  133975. "muls r6, r7, r6\n\t"
  133976. #elif defined(__clang__)
  133977. "muls r6, r7\n\t"
  133978. #else
  133979. "mul r6, r7\n\t"
  133980. #endif
  133981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133982. "lsrs r7, r6, #16\n\t"
  133983. #else
  133984. "lsr r7, r6, #16\n\t"
  133985. #endif
  133986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133987. "lsls r6, r6, #16\n\t"
  133988. #else
  133989. "lsl r6, r6, #16\n\t"
  133990. #endif
  133991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  133992. "adds r3, r3, r6\n\t"
  133993. #else
  133994. "add r3, r3, r6\n\t"
  133995. #endif
  133996. #ifdef WOLFSSL_KEIL
  133997. "adcs r4, r4, r7\n\t"
  133998. #elif defined(__clang__)
  133999. "adcs r4, r7\n\t"
  134000. #else
  134001. "adc r4, r7\n\t"
  134002. #endif
  134003. #ifdef WOLFSSL_KEIL
  134004. "adcs r5, r5, %[tmp]\n\t"
  134005. #elif defined(__clang__)
  134006. "adcs r5, %[tmp]\n\t"
  134007. #else
  134008. "adc r5, %[tmp]\n\t"
  134009. #endif
  134010. "ldr r6, [%[a]]\n\t"
  134011. "ldr r7, [%[b]]\n\t"
  134012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134013. "lsrs r6, r6, #16\n\t"
  134014. #else
  134015. "lsr r6, r6, #16\n\t"
  134016. #endif
  134017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134018. "lsrs r7, r7, #16\n\t"
  134019. #else
  134020. "lsr r7, r7, #16\n\t"
  134021. #endif
  134022. #ifdef WOLFSSL_KEIL
  134023. "muls r7, r6, r7\n\t"
  134024. #elif defined(__clang__)
  134025. "muls r7, r6\n\t"
  134026. #else
  134027. "mul r7, r6\n\t"
  134028. #endif
  134029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134030. "adds r4, r4, r7\n\t"
  134031. #else
  134032. "add r4, r4, r7\n\t"
  134033. #endif
  134034. #ifdef WOLFSSL_KEIL
  134035. "adcs r5, r5, %[tmp]\n\t"
  134036. #elif defined(__clang__)
  134037. "adcs r5, %[tmp]\n\t"
  134038. #else
  134039. "adc r5, %[tmp]\n\t"
  134040. #endif
  134041. "ldrh r7, [%[b]]\n\t"
  134042. #ifdef WOLFSSL_KEIL
  134043. "muls r6, r7, r6\n\t"
  134044. #elif defined(__clang__)
  134045. "muls r6, r7\n\t"
  134046. #else
  134047. "mul r6, r7\n\t"
  134048. #endif
  134049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134050. "lsrs r7, r6, #16\n\t"
  134051. #else
  134052. "lsr r7, r6, #16\n\t"
  134053. #endif
  134054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134055. "lsls r6, r6, #16\n\t"
  134056. #else
  134057. "lsl r6, r6, #16\n\t"
  134058. #endif
  134059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134060. "adds r3, r3, r6\n\t"
  134061. #else
  134062. "add r3, r3, r6\n\t"
  134063. #endif
  134064. #ifdef WOLFSSL_KEIL
  134065. "adcs r4, r4, r7\n\t"
  134066. #elif defined(__clang__)
  134067. "adcs r4, r7\n\t"
  134068. #else
  134069. "adc r4, r7\n\t"
  134070. #endif
  134071. #ifdef WOLFSSL_KEIL
  134072. "adcs r5, r5, %[tmp]\n\t"
  134073. #elif defined(__clang__)
  134074. "adcs r5, %[tmp]\n\t"
  134075. #else
  134076. "adc r5, %[tmp]\n\t"
  134077. #endif
  134078. "# Multiply Done\n\t"
  134079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134080. "adds %[a], %[a], #4\n\t"
  134081. #else
  134082. "add %[a], %[a], #4\n\t"
  134083. #endif
  134084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134085. "subs %[b], %[b], #4\n\t"
  134086. #else
  134087. "sub %[b], %[b], #4\n\t"
  134088. #endif
  134089. "cmp %[a], r12\n\t"
  134090. "beq L_sp_1024_mul_16_done_mul_%=\n\t"
  134091. "mov r6, r8\n\t"
  134092. "add r6, r6, r9\n\t"
  134093. "cmp %[a], r6\n\t"
  134094. "ble L_sp_1024_mul_16_mul_%=\n\t"
  134095. "\n"
  134096. "L_sp_1024_mul_16_done_mul_%=:\n\t"
  134097. "mov %[tmp], r11\n\t"
  134098. "mov r7, r8\n\t"
  134099. "str r3, [%[tmp], r7]\n\t"
  134100. "movs r3, r4\n\t"
  134101. "movs r4, r5\n\t"
  134102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134103. "adds r7, r7, #4\n\t"
  134104. #else
  134105. "add r7, r7, #4\n\t"
  134106. #endif
  134107. "mov r8, r7\n\t"
  134108. "movs r6, #0x78\n\t"
  134109. "cmp r7, r6\n\t"
  134110. "ble L_sp_1024_mul_16_words_%=\n\t"
  134111. "str r3, [%[tmp], r7]\n\t"
  134112. "mov %[a], r9\n\t"
  134113. "mov %[b], r10\n\t"
  134114. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  134115. :
  134116. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  134117. );
  134118. XMEMCPY(r, t, sizeof(t));
  134119. }
  134120. #else
  134121. /* Multiply a and b into r. (r = a * b)
  134122. *
  134123. * r A single precision integer.
  134124. * a A single precision integer.
  134125. * b A single precision integer.
  134126. */
  134127. SP_NOINLINE static void sp_1024_mul_16(sp_digit* r, const sp_digit* a,
  134128. const sp_digit* b)
  134129. {
  134130. __asm__ __volatile__ (
  134131. "sub sp, sp, #0x40\n\t"
  134132. "mov r8, %[r]\n\t"
  134133. "mov r9, %[a]\n\t"
  134134. "mov r10, %[b]\n\t"
  134135. "movs %[r], #0\n\t"
  134136. "# A[0] * B[0]\n\t"
  134137. "ldr %[a], [%[a]]\n\t"
  134138. "ldr %[b], [%[b]]\n\t"
  134139. "uxth r6, %[a]\n\t"
  134140. "uxth r3, %[b]\n\t"
  134141. #ifdef WOLFSSL_KEIL
  134142. "muls r3, r6, r3\n\t"
  134143. #elif defined(__clang__)
  134144. "muls r3, r6\n\t"
  134145. #else
  134146. "mul r3, r6\n\t"
  134147. #endif
  134148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134149. "lsrs r7, %[b], #16\n\t"
  134150. #else
  134151. "lsr r7, %[b], #16\n\t"
  134152. #endif
  134153. #ifdef WOLFSSL_KEIL
  134154. "muls r6, r7, r6\n\t"
  134155. #elif defined(__clang__)
  134156. "muls r6, r7\n\t"
  134157. #else
  134158. "mul r6, r7\n\t"
  134159. #endif
  134160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134161. "lsrs r4, r6, #16\n\t"
  134162. #else
  134163. "lsr r4, r6, #16\n\t"
  134164. #endif
  134165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134166. "lsls r6, r6, #16\n\t"
  134167. #else
  134168. "lsl r6, r6, #16\n\t"
  134169. #endif
  134170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134171. "adds r3, r3, r6\n\t"
  134172. #else
  134173. "add r3, r3, r6\n\t"
  134174. #endif
  134175. #ifdef WOLFSSL_KEIL
  134176. "adcs r4, r4, %[r]\n\t"
  134177. #elif defined(__clang__)
  134178. "adcs r4, %[r]\n\t"
  134179. #else
  134180. "adc r4, %[r]\n\t"
  134181. #endif
  134182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134183. "lsrs r6, %[a], #16\n\t"
  134184. #else
  134185. "lsr r6, %[a], #16\n\t"
  134186. #endif
  134187. #ifdef WOLFSSL_KEIL
  134188. "muls r7, r6, r7\n\t"
  134189. #elif defined(__clang__)
  134190. "muls r7, r6\n\t"
  134191. #else
  134192. "mul r7, r6\n\t"
  134193. #endif
  134194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134195. "adds r4, r4, r7\n\t"
  134196. #else
  134197. "add r4, r4, r7\n\t"
  134198. #endif
  134199. "uxth r7, %[b]\n\t"
  134200. #ifdef WOLFSSL_KEIL
  134201. "muls r6, r7, r6\n\t"
  134202. #elif defined(__clang__)
  134203. "muls r6, r7\n\t"
  134204. #else
  134205. "mul r6, r7\n\t"
  134206. #endif
  134207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134208. "lsrs r7, r6, #16\n\t"
  134209. #else
  134210. "lsr r7, r6, #16\n\t"
  134211. #endif
  134212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134213. "lsls r6, r6, #16\n\t"
  134214. #else
  134215. "lsl r6, r6, #16\n\t"
  134216. #endif
  134217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134218. "adds r3, r3, r6\n\t"
  134219. #else
  134220. "add r3, r3, r6\n\t"
  134221. #endif
  134222. #ifdef WOLFSSL_KEIL
  134223. "adcs r4, r4, r7\n\t"
  134224. #elif defined(__clang__)
  134225. "adcs r4, r7\n\t"
  134226. #else
  134227. "adc r4, r7\n\t"
  134228. #endif
  134229. "movs r5, #0\n\t"
  134230. "str r3, [sp]\n\t"
  134231. "# A[0] * B[1]\n\t"
  134232. "movs r3, #0\n\t"
  134233. "mov %[a], r9\n\t"
  134234. "mov %[b], r10\n\t"
  134235. "ldr %[a], [%[a]]\n\t"
  134236. "ldr %[b], [%[b], #4]\n\t"
  134237. "uxth r6, %[a]\n\t"
  134238. "uxth r7, %[b]\n\t"
  134239. #ifdef WOLFSSL_KEIL
  134240. "muls r7, r6, r7\n\t"
  134241. #elif defined(__clang__)
  134242. "muls r7, r6\n\t"
  134243. #else
  134244. "mul r7, r6\n\t"
  134245. #endif
  134246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134247. "adds r4, r4, r7\n\t"
  134248. #else
  134249. "add r4, r4, r7\n\t"
  134250. #endif
  134251. #ifdef WOLFSSL_KEIL
  134252. "adcs r5, r5, %[r]\n\t"
  134253. #elif defined(__clang__)
  134254. "adcs r5, %[r]\n\t"
  134255. #else
  134256. "adc r5, %[r]\n\t"
  134257. #endif
  134258. #ifdef WOLFSSL_KEIL
  134259. "adcs r3, r3, %[r]\n\t"
  134260. #elif defined(__clang__)
  134261. "adcs r3, %[r]\n\t"
  134262. #else
  134263. "adc r3, %[r]\n\t"
  134264. #endif
  134265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134266. "lsrs r7, %[b], #16\n\t"
  134267. #else
  134268. "lsr r7, %[b], #16\n\t"
  134269. #endif
  134270. #ifdef WOLFSSL_KEIL
  134271. "muls r6, r7, r6\n\t"
  134272. #elif defined(__clang__)
  134273. "muls r6, r7\n\t"
  134274. #else
  134275. "mul r6, r7\n\t"
  134276. #endif
  134277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134278. "lsrs r7, r6, #16\n\t"
  134279. #else
  134280. "lsr r7, r6, #16\n\t"
  134281. #endif
  134282. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134283. "lsls r6, r6, #16\n\t"
  134284. #else
  134285. "lsl r6, r6, #16\n\t"
  134286. #endif
  134287. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134288. "adds r4, r4, r6\n\t"
  134289. #else
  134290. "add r4, r4, r6\n\t"
  134291. #endif
  134292. #ifdef WOLFSSL_KEIL
  134293. "adcs r5, r5, r7\n\t"
  134294. #elif defined(__clang__)
  134295. "adcs r5, r7\n\t"
  134296. #else
  134297. "adc r5, r7\n\t"
  134298. #endif
  134299. #ifdef WOLFSSL_KEIL
  134300. "adcs r3, r3, %[r]\n\t"
  134301. #elif defined(__clang__)
  134302. "adcs r3, %[r]\n\t"
  134303. #else
  134304. "adc r3, %[r]\n\t"
  134305. #endif
  134306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134307. "lsrs r6, %[a], #16\n\t"
  134308. #else
  134309. "lsr r6, %[a], #16\n\t"
  134310. #endif
  134311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134312. "lsrs r7, %[b], #16\n\t"
  134313. #else
  134314. "lsr r7, %[b], #16\n\t"
  134315. #endif
  134316. #ifdef WOLFSSL_KEIL
  134317. "muls r7, r6, r7\n\t"
  134318. #elif defined(__clang__)
  134319. "muls r7, r6\n\t"
  134320. #else
  134321. "mul r7, r6\n\t"
  134322. #endif
  134323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134324. "adds r5, r5, r7\n\t"
  134325. #else
  134326. "add r5, r5, r7\n\t"
  134327. #endif
  134328. #ifdef WOLFSSL_KEIL
  134329. "adcs r3, r3, %[r]\n\t"
  134330. #elif defined(__clang__)
  134331. "adcs r3, %[r]\n\t"
  134332. #else
  134333. "adc r3, %[r]\n\t"
  134334. #endif
  134335. "uxth r7, %[b]\n\t"
  134336. #ifdef WOLFSSL_KEIL
  134337. "muls r6, r7, r6\n\t"
  134338. #elif defined(__clang__)
  134339. "muls r6, r7\n\t"
  134340. #else
  134341. "mul r6, r7\n\t"
  134342. #endif
  134343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134344. "lsrs r7, r6, #16\n\t"
  134345. #else
  134346. "lsr r7, r6, #16\n\t"
  134347. #endif
  134348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134349. "lsls r6, r6, #16\n\t"
  134350. #else
  134351. "lsl r6, r6, #16\n\t"
  134352. #endif
  134353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134354. "adds r4, r4, r6\n\t"
  134355. #else
  134356. "add r4, r4, r6\n\t"
  134357. #endif
  134358. #ifdef WOLFSSL_KEIL
  134359. "adcs r5, r5, r7\n\t"
  134360. #elif defined(__clang__)
  134361. "adcs r5, r7\n\t"
  134362. #else
  134363. "adc r5, r7\n\t"
  134364. #endif
  134365. #ifdef WOLFSSL_KEIL
  134366. "adcs r3, r3, %[r]\n\t"
  134367. #elif defined(__clang__)
  134368. "adcs r3, %[r]\n\t"
  134369. #else
  134370. "adc r3, %[r]\n\t"
  134371. #endif
  134372. "# A[1] * B[0]\n\t"
  134373. "mov %[a], r9\n\t"
  134374. "mov %[b], r10\n\t"
  134375. "ldr %[a], [%[a], #4]\n\t"
  134376. "ldr %[b], [%[b]]\n\t"
  134377. "uxth r6, %[a]\n\t"
  134378. "uxth r7, %[b]\n\t"
  134379. #ifdef WOLFSSL_KEIL
  134380. "muls r7, r6, r7\n\t"
  134381. #elif defined(__clang__)
  134382. "muls r7, r6\n\t"
  134383. #else
  134384. "mul r7, r6\n\t"
  134385. #endif
  134386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134387. "adds r4, r4, r7\n\t"
  134388. #else
  134389. "add r4, r4, r7\n\t"
  134390. #endif
  134391. #ifdef WOLFSSL_KEIL
  134392. "adcs r5, r5, %[r]\n\t"
  134393. #elif defined(__clang__)
  134394. "adcs r5, %[r]\n\t"
  134395. #else
  134396. "adc r5, %[r]\n\t"
  134397. #endif
  134398. #ifdef WOLFSSL_KEIL
  134399. "adcs r3, r3, %[r]\n\t"
  134400. #elif defined(__clang__)
  134401. "adcs r3, %[r]\n\t"
  134402. #else
  134403. "adc r3, %[r]\n\t"
  134404. #endif
  134405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134406. "lsrs r7, %[b], #16\n\t"
  134407. #else
  134408. "lsr r7, %[b], #16\n\t"
  134409. #endif
  134410. #ifdef WOLFSSL_KEIL
  134411. "muls r6, r7, r6\n\t"
  134412. #elif defined(__clang__)
  134413. "muls r6, r7\n\t"
  134414. #else
  134415. "mul r6, r7\n\t"
  134416. #endif
  134417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134418. "lsrs r7, r6, #16\n\t"
  134419. #else
  134420. "lsr r7, r6, #16\n\t"
  134421. #endif
  134422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134423. "lsls r6, r6, #16\n\t"
  134424. #else
  134425. "lsl r6, r6, #16\n\t"
  134426. #endif
  134427. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134428. "adds r4, r4, r6\n\t"
  134429. #else
  134430. "add r4, r4, r6\n\t"
  134431. #endif
  134432. #ifdef WOLFSSL_KEIL
  134433. "adcs r5, r5, r7\n\t"
  134434. #elif defined(__clang__)
  134435. "adcs r5, r7\n\t"
  134436. #else
  134437. "adc r5, r7\n\t"
  134438. #endif
  134439. #ifdef WOLFSSL_KEIL
  134440. "adcs r3, r3, %[r]\n\t"
  134441. #elif defined(__clang__)
  134442. "adcs r3, %[r]\n\t"
  134443. #else
  134444. "adc r3, %[r]\n\t"
  134445. #endif
  134446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134447. "lsrs r6, %[a], #16\n\t"
  134448. #else
  134449. "lsr r6, %[a], #16\n\t"
  134450. #endif
  134451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134452. "lsrs r7, %[b], #16\n\t"
  134453. #else
  134454. "lsr r7, %[b], #16\n\t"
  134455. #endif
  134456. #ifdef WOLFSSL_KEIL
  134457. "muls r7, r6, r7\n\t"
  134458. #elif defined(__clang__)
  134459. "muls r7, r6\n\t"
  134460. #else
  134461. "mul r7, r6\n\t"
  134462. #endif
  134463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134464. "adds r5, r5, r7\n\t"
  134465. #else
  134466. "add r5, r5, r7\n\t"
  134467. #endif
  134468. #ifdef WOLFSSL_KEIL
  134469. "adcs r3, r3, %[r]\n\t"
  134470. #elif defined(__clang__)
  134471. "adcs r3, %[r]\n\t"
  134472. #else
  134473. "adc r3, %[r]\n\t"
  134474. #endif
  134475. "uxth r7, %[b]\n\t"
  134476. #ifdef WOLFSSL_KEIL
  134477. "muls r6, r7, r6\n\t"
  134478. #elif defined(__clang__)
  134479. "muls r6, r7\n\t"
  134480. #else
  134481. "mul r6, r7\n\t"
  134482. #endif
  134483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134484. "lsrs r7, r6, #16\n\t"
  134485. #else
  134486. "lsr r7, r6, #16\n\t"
  134487. #endif
  134488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134489. "lsls r6, r6, #16\n\t"
  134490. #else
  134491. "lsl r6, r6, #16\n\t"
  134492. #endif
  134493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134494. "adds r4, r4, r6\n\t"
  134495. #else
  134496. "add r4, r4, r6\n\t"
  134497. #endif
  134498. #ifdef WOLFSSL_KEIL
  134499. "adcs r5, r5, r7\n\t"
  134500. #elif defined(__clang__)
  134501. "adcs r5, r7\n\t"
  134502. #else
  134503. "adc r5, r7\n\t"
  134504. #endif
  134505. #ifdef WOLFSSL_KEIL
  134506. "adcs r3, r3, %[r]\n\t"
  134507. #elif defined(__clang__)
  134508. "adcs r3, %[r]\n\t"
  134509. #else
  134510. "adc r3, %[r]\n\t"
  134511. #endif
  134512. "str r4, [sp, #4]\n\t"
  134513. "# A[2] * B[0]\n\t"
  134514. "movs r4, #0\n\t"
  134515. "mov %[a], r9\n\t"
  134516. "mov %[b], r10\n\t"
  134517. "ldr %[a], [%[a], #8]\n\t"
  134518. "ldr %[b], [%[b]]\n\t"
  134519. "uxth r6, %[a]\n\t"
  134520. "uxth r7, %[b]\n\t"
  134521. #ifdef WOLFSSL_KEIL
  134522. "muls r7, r6, r7\n\t"
  134523. #elif defined(__clang__)
  134524. "muls r7, r6\n\t"
  134525. #else
  134526. "mul r7, r6\n\t"
  134527. #endif
  134528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134529. "adds r5, r5, r7\n\t"
  134530. #else
  134531. "add r5, r5, r7\n\t"
  134532. #endif
  134533. #ifdef WOLFSSL_KEIL
  134534. "adcs r3, r3, %[r]\n\t"
  134535. #elif defined(__clang__)
  134536. "adcs r3, %[r]\n\t"
  134537. #else
  134538. "adc r3, %[r]\n\t"
  134539. #endif
  134540. #ifdef WOLFSSL_KEIL
  134541. "adcs r4, r4, %[r]\n\t"
  134542. #elif defined(__clang__)
  134543. "adcs r4, %[r]\n\t"
  134544. #else
  134545. "adc r4, %[r]\n\t"
  134546. #endif
  134547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134548. "lsrs r7, %[b], #16\n\t"
  134549. #else
  134550. "lsr r7, %[b], #16\n\t"
  134551. #endif
  134552. #ifdef WOLFSSL_KEIL
  134553. "muls r6, r7, r6\n\t"
  134554. #elif defined(__clang__)
  134555. "muls r6, r7\n\t"
  134556. #else
  134557. "mul r6, r7\n\t"
  134558. #endif
  134559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134560. "lsrs r7, r6, #16\n\t"
  134561. #else
  134562. "lsr r7, r6, #16\n\t"
  134563. #endif
  134564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134565. "lsls r6, r6, #16\n\t"
  134566. #else
  134567. "lsl r6, r6, #16\n\t"
  134568. #endif
  134569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134570. "adds r5, r5, r6\n\t"
  134571. #else
  134572. "add r5, r5, r6\n\t"
  134573. #endif
  134574. #ifdef WOLFSSL_KEIL
  134575. "adcs r3, r3, r7\n\t"
  134576. #elif defined(__clang__)
  134577. "adcs r3, r7\n\t"
  134578. #else
  134579. "adc r3, r7\n\t"
  134580. #endif
  134581. #ifdef WOLFSSL_KEIL
  134582. "adcs r4, r4, %[r]\n\t"
  134583. #elif defined(__clang__)
  134584. "adcs r4, %[r]\n\t"
  134585. #else
  134586. "adc r4, %[r]\n\t"
  134587. #endif
  134588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134589. "lsrs r6, %[a], #16\n\t"
  134590. #else
  134591. "lsr r6, %[a], #16\n\t"
  134592. #endif
  134593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134594. "lsrs r7, %[b], #16\n\t"
  134595. #else
  134596. "lsr r7, %[b], #16\n\t"
  134597. #endif
  134598. #ifdef WOLFSSL_KEIL
  134599. "muls r7, r6, r7\n\t"
  134600. #elif defined(__clang__)
  134601. "muls r7, r6\n\t"
  134602. #else
  134603. "mul r7, r6\n\t"
  134604. #endif
  134605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134606. "adds r3, r3, r7\n\t"
  134607. #else
  134608. "add r3, r3, r7\n\t"
  134609. #endif
  134610. #ifdef WOLFSSL_KEIL
  134611. "adcs r4, r4, %[r]\n\t"
  134612. #elif defined(__clang__)
  134613. "adcs r4, %[r]\n\t"
  134614. #else
  134615. "adc r4, %[r]\n\t"
  134616. #endif
  134617. "uxth r7, %[b]\n\t"
  134618. #ifdef WOLFSSL_KEIL
  134619. "muls r6, r7, r6\n\t"
  134620. #elif defined(__clang__)
  134621. "muls r6, r7\n\t"
  134622. #else
  134623. "mul r6, r7\n\t"
  134624. #endif
  134625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134626. "lsrs r7, r6, #16\n\t"
  134627. #else
  134628. "lsr r7, r6, #16\n\t"
  134629. #endif
  134630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134631. "lsls r6, r6, #16\n\t"
  134632. #else
  134633. "lsl r6, r6, #16\n\t"
  134634. #endif
  134635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134636. "adds r5, r5, r6\n\t"
  134637. #else
  134638. "add r5, r5, r6\n\t"
  134639. #endif
  134640. #ifdef WOLFSSL_KEIL
  134641. "adcs r3, r3, r7\n\t"
  134642. #elif defined(__clang__)
  134643. "adcs r3, r7\n\t"
  134644. #else
  134645. "adc r3, r7\n\t"
  134646. #endif
  134647. #ifdef WOLFSSL_KEIL
  134648. "adcs r4, r4, %[r]\n\t"
  134649. #elif defined(__clang__)
  134650. "adcs r4, %[r]\n\t"
  134651. #else
  134652. "adc r4, %[r]\n\t"
  134653. #endif
  134654. "# A[1] * B[1]\n\t"
  134655. "mov %[a], r9\n\t"
  134656. "mov %[b], r10\n\t"
  134657. "ldr %[a], [%[a], #4]\n\t"
  134658. "ldr %[b], [%[b], #4]\n\t"
  134659. "uxth r6, %[a]\n\t"
  134660. "uxth r7, %[b]\n\t"
  134661. #ifdef WOLFSSL_KEIL
  134662. "muls r7, r6, r7\n\t"
  134663. #elif defined(__clang__)
  134664. "muls r7, r6\n\t"
  134665. #else
  134666. "mul r7, r6\n\t"
  134667. #endif
  134668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134669. "adds r5, r5, r7\n\t"
  134670. #else
  134671. "add r5, r5, r7\n\t"
  134672. #endif
  134673. #ifdef WOLFSSL_KEIL
  134674. "adcs r3, r3, %[r]\n\t"
  134675. #elif defined(__clang__)
  134676. "adcs r3, %[r]\n\t"
  134677. #else
  134678. "adc r3, %[r]\n\t"
  134679. #endif
  134680. #ifdef WOLFSSL_KEIL
  134681. "adcs r4, r4, %[r]\n\t"
  134682. #elif defined(__clang__)
  134683. "adcs r4, %[r]\n\t"
  134684. #else
  134685. "adc r4, %[r]\n\t"
  134686. #endif
  134687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134688. "lsrs r7, %[b], #16\n\t"
  134689. #else
  134690. "lsr r7, %[b], #16\n\t"
  134691. #endif
  134692. #ifdef WOLFSSL_KEIL
  134693. "muls r6, r7, r6\n\t"
  134694. #elif defined(__clang__)
  134695. "muls r6, r7\n\t"
  134696. #else
  134697. "mul r6, r7\n\t"
  134698. #endif
  134699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134700. "lsrs r7, r6, #16\n\t"
  134701. #else
  134702. "lsr r7, r6, #16\n\t"
  134703. #endif
  134704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134705. "lsls r6, r6, #16\n\t"
  134706. #else
  134707. "lsl r6, r6, #16\n\t"
  134708. #endif
  134709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134710. "adds r5, r5, r6\n\t"
  134711. #else
  134712. "add r5, r5, r6\n\t"
  134713. #endif
  134714. #ifdef WOLFSSL_KEIL
  134715. "adcs r3, r3, r7\n\t"
  134716. #elif defined(__clang__)
  134717. "adcs r3, r7\n\t"
  134718. #else
  134719. "adc r3, r7\n\t"
  134720. #endif
  134721. #ifdef WOLFSSL_KEIL
  134722. "adcs r4, r4, %[r]\n\t"
  134723. #elif defined(__clang__)
  134724. "adcs r4, %[r]\n\t"
  134725. #else
  134726. "adc r4, %[r]\n\t"
  134727. #endif
  134728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134729. "lsrs r6, %[a], #16\n\t"
  134730. #else
  134731. "lsr r6, %[a], #16\n\t"
  134732. #endif
  134733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134734. "lsrs r7, %[b], #16\n\t"
  134735. #else
  134736. "lsr r7, %[b], #16\n\t"
  134737. #endif
  134738. #ifdef WOLFSSL_KEIL
  134739. "muls r7, r6, r7\n\t"
  134740. #elif defined(__clang__)
  134741. "muls r7, r6\n\t"
  134742. #else
  134743. "mul r7, r6\n\t"
  134744. #endif
  134745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134746. "adds r3, r3, r7\n\t"
  134747. #else
  134748. "add r3, r3, r7\n\t"
  134749. #endif
  134750. #ifdef WOLFSSL_KEIL
  134751. "adcs r4, r4, %[r]\n\t"
  134752. #elif defined(__clang__)
  134753. "adcs r4, %[r]\n\t"
  134754. #else
  134755. "adc r4, %[r]\n\t"
  134756. #endif
  134757. "uxth r7, %[b]\n\t"
  134758. #ifdef WOLFSSL_KEIL
  134759. "muls r6, r7, r6\n\t"
  134760. #elif defined(__clang__)
  134761. "muls r6, r7\n\t"
  134762. #else
  134763. "mul r6, r7\n\t"
  134764. #endif
  134765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134766. "lsrs r7, r6, #16\n\t"
  134767. #else
  134768. "lsr r7, r6, #16\n\t"
  134769. #endif
  134770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134771. "lsls r6, r6, #16\n\t"
  134772. #else
  134773. "lsl r6, r6, #16\n\t"
  134774. #endif
  134775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134776. "adds r5, r5, r6\n\t"
  134777. #else
  134778. "add r5, r5, r6\n\t"
  134779. #endif
  134780. #ifdef WOLFSSL_KEIL
  134781. "adcs r3, r3, r7\n\t"
  134782. #elif defined(__clang__)
  134783. "adcs r3, r7\n\t"
  134784. #else
  134785. "adc r3, r7\n\t"
  134786. #endif
  134787. #ifdef WOLFSSL_KEIL
  134788. "adcs r4, r4, %[r]\n\t"
  134789. #elif defined(__clang__)
  134790. "adcs r4, %[r]\n\t"
  134791. #else
  134792. "adc r4, %[r]\n\t"
  134793. #endif
  134794. "# A[0] * B[2]\n\t"
  134795. "mov %[a], r9\n\t"
  134796. "mov %[b], r10\n\t"
  134797. "ldr %[a], [%[a]]\n\t"
  134798. "ldr %[b], [%[b], #8]\n\t"
  134799. "uxth r6, %[a]\n\t"
  134800. "uxth r7, %[b]\n\t"
  134801. #ifdef WOLFSSL_KEIL
  134802. "muls r7, r6, r7\n\t"
  134803. #elif defined(__clang__)
  134804. "muls r7, r6\n\t"
  134805. #else
  134806. "mul r7, r6\n\t"
  134807. #endif
  134808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134809. "adds r5, r5, r7\n\t"
  134810. #else
  134811. "add r5, r5, r7\n\t"
  134812. #endif
  134813. #ifdef WOLFSSL_KEIL
  134814. "adcs r3, r3, %[r]\n\t"
  134815. #elif defined(__clang__)
  134816. "adcs r3, %[r]\n\t"
  134817. #else
  134818. "adc r3, %[r]\n\t"
  134819. #endif
  134820. #ifdef WOLFSSL_KEIL
  134821. "adcs r4, r4, %[r]\n\t"
  134822. #elif defined(__clang__)
  134823. "adcs r4, %[r]\n\t"
  134824. #else
  134825. "adc r4, %[r]\n\t"
  134826. #endif
  134827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134828. "lsrs r7, %[b], #16\n\t"
  134829. #else
  134830. "lsr r7, %[b], #16\n\t"
  134831. #endif
  134832. #ifdef WOLFSSL_KEIL
  134833. "muls r6, r7, r6\n\t"
  134834. #elif defined(__clang__)
  134835. "muls r6, r7\n\t"
  134836. #else
  134837. "mul r6, r7\n\t"
  134838. #endif
  134839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134840. "lsrs r7, r6, #16\n\t"
  134841. #else
  134842. "lsr r7, r6, #16\n\t"
  134843. #endif
  134844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134845. "lsls r6, r6, #16\n\t"
  134846. #else
  134847. "lsl r6, r6, #16\n\t"
  134848. #endif
  134849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134850. "adds r5, r5, r6\n\t"
  134851. #else
  134852. "add r5, r5, r6\n\t"
  134853. #endif
  134854. #ifdef WOLFSSL_KEIL
  134855. "adcs r3, r3, r7\n\t"
  134856. #elif defined(__clang__)
  134857. "adcs r3, r7\n\t"
  134858. #else
  134859. "adc r3, r7\n\t"
  134860. #endif
  134861. #ifdef WOLFSSL_KEIL
  134862. "adcs r4, r4, %[r]\n\t"
  134863. #elif defined(__clang__)
  134864. "adcs r4, %[r]\n\t"
  134865. #else
  134866. "adc r4, %[r]\n\t"
  134867. #endif
  134868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134869. "lsrs r6, %[a], #16\n\t"
  134870. #else
  134871. "lsr r6, %[a], #16\n\t"
  134872. #endif
  134873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134874. "lsrs r7, %[b], #16\n\t"
  134875. #else
  134876. "lsr r7, %[b], #16\n\t"
  134877. #endif
  134878. #ifdef WOLFSSL_KEIL
  134879. "muls r7, r6, r7\n\t"
  134880. #elif defined(__clang__)
  134881. "muls r7, r6\n\t"
  134882. #else
  134883. "mul r7, r6\n\t"
  134884. #endif
  134885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134886. "adds r3, r3, r7\n\t"
  134887. #else
  134888. "add r3, r3, r7\n\t"
  134889. #endif
  134890. #ifdef WOLFSSL_KEIL
  134891. "adcs r4, r4, %[r]\n\t"
  134892. #elif defined(__clang__)
  134893. "adcs r4, %[r]\n\t"
  134894. #else
  134895. "adc r4, %[r]\n\t"
  134896. #endif
  134897. "uxth r7, %[b]\n\t"
  134898. #ifdef WOLFSSL_KEIL
  134899. "muls r6, r7, r6\n\t"
  134900. #elif defined(__clang__)
  134901. "muls r6, r7\n\t"
  134902. #else
  134903. "mul r6, r7\n\t"
  134904. #endif
  134905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134906. "lsrs r7, r6, #16\n\t"
  134907. #else
  134908. "lsr r7, r6, #16\n\t"
  134909. #endif
  134910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134911. "lsls r6, r6, #16\n\t"
  134912. #else
  134913. "lsl r6, r6, #16\n\t"
  134914. #endif
  134915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134916. "adds r5, r5, r6\n\t"
  134917. #else
  134918. "add r5, r5, r6\n\t"
  134919. #endif
  134920. #ifdef WOLFSSL_KEIL
  134921. "adcs r3, r3, r7\n\t"
  134922. #elif defined(__clang__)
  134923. "adcs r3, r7\n\t"
  134924. #else
  134925. "adc r3, r7\n\t"
  134926. #endif
  134927. #ifdef WOLFSSL_KEIL
  134928. "adcs r4, r4, %[r]\n\t"
  134929. #elif defined(__clang__)
  134930. "adcs r4, %[r]\n\t"
  134931. #else
  134932. "adc r4, %[r]\n\t"
  134933. #endif
  134934. "str r5, [sp, #8]\n\t"
  134935. "# A[0] * B[3]\n\t"
  134936. "movs r5, #0\n\t"
  134937. "mov %[a], r9\n\t"
  134938. "mov %[b], r10\n\t"
  134939. "ldr %[a], [%[a]]\n\t"
  134940. "ldr %[b], [%[b], #12]\n\t"
  134941. "uxth r6, %[a]\n\t"
  134942. "uxth r7, %[b]\n\t"
  134943. #ifdef WOLFSSL_KEIL
  134944. "muls r7, r6, r7\n\t"
  134945. #elif defined(__clang__)
  134946. "muls r7, r6\n\t"
  134947. #else
  134948. "mul r7, r6\n\t"
  134949. #endif
  134950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134951. "adds r3, r3, r7\n\t"
  134952. #else
  134953. "add r3, r3, r7\n\t"
  134954. #endif
  134955. #ifdef WOLFSSL_KEIL
  134956. "adcs r4, r4, %[r]\n\t"
  134957. #elif defined(__clang__)
  134958. "adcs r4, %[r]\n\t"
  134959. #else
  134960. "adc r4, %[r]\n\t"
  134961. #endif
  134962. #ifdef WOLFSSL_KEIL
  134963. "adcs r5, r5, %[r]\n\t"
  134964. #elif defined(__clang__)
  134965. "adcs r5, %[r]\n\t"
  134966. #else
  134967. "adc r5, %[r]\n\t"
  134968. #endif
  134969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134970. "lsrs r7, %[b], #16\n\t"
  134971. #else
  134972. "lsr r7, %[b], #16\n\t"
  134973. #endif
  134974. #ifdef WOLFSSL_KEIL
  134975. "muls r6, r7, r6\n\t"
  134976. #elif defined(__clang__)
  134977. "muls r6, r7\n\t"
  134978. #else
  134979. "mul r6, r7\n\t"
  134980. #endif
  134981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134982. "lsrs r7, r6, #16\n\t"
  134983. #else
  134984. "lsr r7, r6, #16\n\t"
  134985. #endif
  134986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134987. "lsls r6, r6, #16\n\t"
  134988. #else
  134989. "lsl r6, r6, #16\n\t"
  134990. #endif
  134991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  134992. "adds r3, r3, r6\n\t"
  134993. #else
  134994. "add r3, r3, r6\n\t"
  134995. #endif
  134996. #ifdef WOLFSSL_KEIL
  134997. "adcs r4, r4, r7\n\t"
  134998. #elif defined(__clang__)
  134999. "adcs r4, r7\n\t"
  135000. #else
  135001. "adc r4, r7\n\t"
  135002. #endif
  135003. #ifdef WOLFSSL_KEIL
  135004. "adcs r5, r5, %[r]\n\t"
  135005. #elif defined(__clang__)
  135006. "adcs r5, %[r]\n\t"
  135007. #else
  135008. "adc r5, %[r]\n\t"
  135009. #endif
  135010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135011. "lsrs r6, %[a], #16\n\t"
  135012. #else
  135013. "lsr r6, %[a], #16\n\t"
  135014. #endif
  135015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135016. "lsrs r7, %[b], #16\n\t"
  135017. #else
  135018. "lsr r7, %[b], #16\n\t"
  135019. #endif
  135020. #ifdef WOLFSSL_KEIL
  135021. "muls r7, r6, r7\n\t"
  135022. #elif defined(__clang__)
  135023. "muls r7, r6\n\t"
  135024. #else
  135025. "mul r7, r6\n\t"
  135026. #endif
  135027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135028. "adds r4, r4, r7\n\t"
  135029. #else
  135030. "add r4, r4, r7\n\t"
  135031. #endif
  135032. #ifdef WOLFSSL_KEIL
  135033. "adcs r5, r5, %[r]\n\t"
  135034. #elif defined(__clang__)
  135035. "adcs r5, %[r]\n\t"
  135036. #else
  135037. "adc r5, %[r]\n\t"
  135038. #endif
  135039. "uxth r7, %[b]\n\t"
  135040. #ifdef WOLFSSL_KEIL
  135041. "muls r6, r7, r6\n\t"
  135042. #elif defined(__clang__)
  135043. "muls r6, r7\n\t"
  135044. #else
  135045. "mul r6, r7\n\t"
  135046. #endif
  135047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135048. "lsrs r7, r6, #16\n\t"
  135049. #else
  135050. "lsr r7, r6, #16\n\t"
  135051. #endif
  135052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135053. "lsls r6, r6, #16\n\t"
  135054. #else
  135055. "lsl r6, r6, #16\n\t"
  135056. #endif
  135057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135058. "adds r3, r3, r6\n\t"
  135059. #else
  135060. "add r3, r3, r6\n\t"
  135061. #endif
  135062. #ifdef WOLFSSL_KEIL
  135063. "adcs r4, r4, r7\n\t"
  135064. #elif defined(__clang__)
  135065. "adcs r4, r7\n\t"
  135066. #else
  135067. "adc r4, r7\n\t"
  135068. #endif
  135069. #ifdef WOLFSSL_KEIL
  135070. "adcs r5, r5, %[r]\n\t"
  135071. #elif defined(__clang__)
  135072. "adcs r5, %[r]\n\t"
  135073. #else
  135074. "adc r5, %[r]\n\t"
  135075. #endif
  135076. "# A[1] * B[2]\n\t"
  135077. "mov %[a], r9\n\t"
  135078. "mov %[b], r10\n\t"
  135079. "ldr %[a], [%[a], #4]\n\t"
  135080. "ldr %[b], [%[b], #8]\n\t"
  135081. "uxth r6, %[a]\n\t"
  135082. "uxth r7, %[b]\n\t"
  135083. #ifdef WOLFSSL_KEIL
  135084. "muls r7, r6, r7\n\t"
  135085. #elif defined(__clang__)
  135086. "muls r7, r6\n\t"
  135087. #else
  135088. "mul r7, r6\n\t"
  135089. #endif
  135090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135091. "adds r3, r3, r7\n\t"
  135092. #else
  135093. "add r3, r3, r7\n\t"
  135094. #endif
  135095. #ifdef WOLFSSL_KEIL
  135096. "adcs r4, r4, %[r]\n\t"
  135097. #elif defined(__clang__)
  135098. "adcs r4, %[r]\n\t"
  135099. #else
  135100. "adc r4, %[r]\n\t"
  135101. #endif
  135102. #ifdef WOLFSSL_KEIL
  135103. "adcs r5, r5, %[r]\n\t"
  135104. #elif defined(__clang__)
  135105. "adcs r5, %[r]\n\t"
  135106. #else
  135107. "adc r5, %[r]\n\t"
  135108. #endif
  135109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135110. "lsrs r7, %[b], #16\n\t"
  135111. #else
  135112. "lsr r7, %[b], #16\n\t"
  135113. #endif
  135114. #ifdef WOLFSSL_KEIL
  135115. "muls r6, r7, r6\n\t"
  135116. #elif defined(__clang__)
  135117. "muls r6, r7\n\t"
  135118. #else
  135119. "mul r6, r7\n\t"
  135120. #endif
  135121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135122. "lsrs r7, r6, #16\n\t"
  135123. #else
  135124. "lsr r7, r6, #16\n\t"
  135125. #endif
  135126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135127. "lsls r6, r6, #16\n\t"
  135128. #else
  135129. "lsl r6, r6, #16\n\t"
  135130. #endif
  135131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135132. "adds r3, r3, r6\n\t"
  135133. #else
  135134. "add r3, r3, r6\n\t"
  135135. #endif
  135136. #ifdef WOLFSSL_KEIL
  135137. "adcs r4, r4, r7\n\t"
  135138. #elif defined(__clang__)
  135139. "adcs r4, r7\n\t"
  135140. #else
  135141. "adc r4, r7\n\t"
  135142. #endif
  135143. #ifdef WOLFSSL_KEIL
  135144. "adcs r5, r5, %[r]\n\t"
  135145. #elif defined(__clang__)
  135146. "adcs r5, %[r]\n\t"
  135147. #else
  135148. "adc r5, %[r]\n\t"
  135149. #endif
  135150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135151. "lsrs r6, %[a], #16\n\t"
  135152. #else
  135153. "lsr r6, %[a], #16\n\t"
  135154. #endif
  135155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135156. "lsrs r7, %[b], #16\n\t"
  135157. #else
  135158. "lsr r7, %[b], #16\n\t"
  135159. #endif
  135160. #ifdef WOLFSSL_KEIL
  135161. "muls r7, r6, r7\n\t"
  135162. #elif defined(__clang__)
  135163. "muls r7, r6\n\t"
  135164. #else
  135165. "mul r7, r6\n\t"
  135166. #endif
  135167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135168. "adds r4, r4, r7\n\t"
  135169. #else
  135170. "add r4, r4, r7\n\t"
  135171. #endif
  135172. #ifdef WOLFSSL_KEIL
  135173. "adcs r5, r5, %[r]\n\t"
  135174. #elif defined(__clang__)
  135175. "adcs r5, %[r]\n\t"
  135176. #else
  135177. "adc r5, %[r]\n\t"
  135178. #endif
  135179. "uxth r7, %[b]\n\t"
  135180. #ifdef WOLFSSL_KEIL
  135181. "muls r6, r7, r6\n\t"
  135182. #elif defined(__clang__)
  135183. "muls r6, r7\n\t"
  135184. #else
  135185. "mul r6, r7\n\t"
  135186. #endif
  135187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135188. "lsrs r7, r6, #16\n\t"
  135189. #else
  135190. "lsr r7, r6, #16\n\t"
  135191. #endif
  135192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135193. "lsls r6, r6, #16\n\t"
  135194. #else
  135195. "lsl r6, r6, #16\n\t"
  135196. #endif
  135197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135198. "adds r3, r3, r6\n\t"
  135199. #else
  135200. "add r3, r3, r6\n\t"
  135201. #endif
  135202. #ifdef WOLFSSL_KEIL
  135203. "adcs r4, r4, r7\n\t"
  135204. #elif defined(__clang__)
  135205. "adcs r4, r7\n\t"
  135206. #else
  135207. "adc r4, r7\n\t"
  135208. #endif
  135209. #ifdef WOLFSSL_KEIL
  135210. "adcs r5, r5, %[r]\n\t"
  135211. #elif defined(__clang__)
  135212. "adcs r5, %[r]\n\t"
  135213. #else
  135214. "adc r5, %[r]\n\t"
  135215. #endif
  135216. "# A[2] * B[1]\n\t"
  135217. "mov %[a], r9\n\t"
  135218. "mov %[b], r10\n\t"
  135219. "ldr %[a], [%[a], #8]\n\t"
  135220. "ldr %[b], [%[b], #4]\n\t"
  135221. "uxth r6, %[a]\n\t"
  135222. "uxth r7, %[b]\n\t"
  135223. #ifdef WOLFSSL_KEIL
  135224. "muls r7, r6, r7\n\t"
  135225. #elif defined(__clang__)
  135226. "muls r7, r6\n\t"
  135227. #else
  135228. "mul r7, r6\n\t"
  135229. #endif
  135230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135231. "adds r3, r3, r7\n\t"
  135232. #else
  135233. "add r3, r3, r7\n\t"
  135234. #endif
  135235. #ifdef WOLFSSL_KEIL
  135236. "adcs r4, r4, %[r]\n\t"
  135237. #elif defined(__clang__)
  135238. "adcs r4, %[r]\n\t"
  135239. #else
  135240. "adc r4, %[r]\n\t"
  135241. #endif
  135242. #ifdef WOLFSSL_KEIL
  135243. "adcs r5, r5, %[r]\n\t"
  135244. #elif defined(__clang__)
  135245. "adcs r5, %[r]\n\t"
  135246. #else
  135247. "adc r5, %[r]\n\t"
  135248. #endif
  135249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135250. "lsrs r7, %[b], #16\n\t"
  135251. #else
  135252. "lsr r7, %[b], #16\n\t"
  135253. #endif
  135254. #ifdef WOLFSSL_KEIL
  135255. "muls r6, r7, r6\n\t"
  135256. #elif defined(__clang__)
  135257. "muls r6, r7\n\t"
  135258. #else
  135259. "mul r6, r7\n\t"
  135260. #endif
  135261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135262. "lsrs r7, r6, #16\n\t"
  135263. #else
  135264. "lsr r7, r6, #16\n\t"
  135265. #endif
  135266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135267. "lsls r6, r6, #16\n\t"
  135268. #else
  135269. "lsl r6, r6, #16\n\t"
  135270. #endif
  135271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135272. "adds r3, r3, r6\n\t"
  135273. #else
  135274. "add r3, r3, r6\n\t"
  135275. #endif
  135276. #ifdef WOLFSSL_KEIL
  135277. "adcs r4, r4, r7\n\t"
  135278. #elif defined(__clang__)
  135279. "adcs r4, r7\n\t"
  135280. #else
  135281. "adc r4, r7\n\t"
  135282. #endif
  135283. #ifdef WOLFSSL_KEIL
  135284. "adcs r5, r5, %[r]\n\t"
  135285. #elif defined(__clang__)
  135286. "adcs r5, %[r]\n\t"
  135287. #else
  135288. "adc r5, %[r]\n\t"
  135289. #endif
  135290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135291. "lsrs r6, %[a], #16\n\t"
  135292. #else
  135293. "lsr r6, %[a], #16\n\t"
  135294. #endif
  135295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135296. "lsrs r7, %[b], #16\n\t"
  135297. #else
  135298. "lsr r7, %[b], #16\n\t"
  135299. #endif
  135300. #ifdef WOLFSSL_KEIL
  135301. "muls r7, r6, r7\n\t"
  135302. #elif defined(__clang__)
  135303. "muls r7, r6\n\t"
  135304. #else
  135305. "mul r7, r6\n\t"
  135306. #endif
  135307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135308. "adds r4, r4, r7\n\t"
  135309. #else
  135310. "add r4, r4, r7\n\t"
  135311. #endif
  135312. #ifdef WOLFSSL_KEIL
  135313. "adcs r5, r5, %[r]\n\t"
  135314. #elif defined(__clang__)
  135315. "adcs r5, %[r]\n\t"
  135316. #else
  135317. "adc r5, %[r]\n\t"
  135318. #endif
  135319. "uxth r7, %[b]\n\t"
  135320. #ifdef WOLFSSL_KEIL
  135321. "muls r6, r7, r6\n\t"
  135322. #elif defined(__clang__)
  135323. "muls r6, r7\n\t"
  135324. #else
  135325. "mul r6, r7\n\t"
  135326. #endif
  135327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135328. "lsrs r7, r6, #16\n\t"
  135329. #else
  135330. "lsr r7, r6, #16\n\t"
  135331. #endif
  135332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135333. "lsls r6, r6, #16\n\t"
  135334. #else
  135335. "lsl r6, r6, #16\n\t"
  135336. #endif
  135337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135338. "adds r3, r3, r6\n\t"
  135339. #else
  135340. "add r3, r3, r6\n\t"
  135341. #endif
  135342. #ifdef WOLFSSL_KEIL
  135343. "adcs r4, r4, r7\n\t"
  135344. #elif defined(__clang__)
  135345. "adcs r4, r7\n\t"
  135346. #else
  135347. "adc r4, r7\n\t"
  135348. #endif
  135349. #ifdef WOLFSSL_KEIL
  135350. "adcs r5, r5, %[r]\n\t"
  135351. #elif defined(__clang__)
  135352. "adcs r5, %[r]\n\t"
  135353. #else
  135354. "adc r5, %[r]\n\t"
  135355. #endif
  135356. "# A[3] * B[0]\n\t"
  135357. "mov %[a], r9\n\t"
  135358. "mov %[b], r10\n\t"
  135359. "ldr %[a], [%[a], #12]\n\t"
  135360. "ldr %[b], [%[b]]\n\t"
  135361. "uxth r6, %[a]\n\t"
  135362. "uxth r7, %[b]\n\t"
  135363. #ifdef WOLFSSL_KEIL
  135364. "muls r7, r6, r7\n\t"
  135365. #elif defined(__clang__)
  135366. "muls r7, r6\n\t"
  135367. #else
  135368. "mul r7, r6\n\t"
  135369. #endif
  135370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135371. "adds r3, r3, r7\n\t"
  135372. #else
  135373. "add r3, r3, r7\n\t"
  135374. #endif
  135375. #ifdef WOLFSSL_KEIL
  135376. "adcs r4, r4, %[r]\n\t"
  135377. #elif defined(__clang__)
  135378. "adcs r4, %[r]\n\t"
  135379. #else
  135380. "adc r4, %[r]\n\t"
  135381. #endif
  135382. #ifdef WOLFSSL_KEIL
  135383. "adcs r5, r5, %[r]\n\t"
  135384. #elif defined(__clang__)
  135385. "adcs r5, %[r]\n\t"
  135386. #else
  135387. "adc r5, %[r]\n\t"
  135388. #endif
  135389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135390. "lsrs r7, %[b], #16\n\t"
  135391. #else
  135392. "lsr r7, %[b], #16\n\t"
  135393. #endif
  135394. #ifdef WOLFSSL_KEIL
  135395. "muls r6, r7, r6\n\t"
  135396. #elif defined(__clang__)
  135397. "muls r6, r7\n\t"
  135398. #else
  135399. "mul r6, r7\n\t"
  135400. #endif
  135401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135402. "lsrs r7, r6, #16\n\t"
  135403. #else
  135404. "lsr r7, r6, #16\n\t"
  135405. #endif
  135406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135407. "lsls r6, r6, #16\n\t"
  135408. #else
  135409. "lsl r6, r6, #16\n\t"
  135410. #endif
  135411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135412. "adds r3, r3, r6\n\t"
  135413. #else
  135414. "add r3, r3, r6\n\t"
  135415. #endif
  135416. #ifdef WOLFSSL_KEIL
  135417. "adcs r4, r4, r7\n\t"
  135418. #elif defined(__clang__)
  135419. "adcs r4, r7\n\t"
  135420. #else
  135421. "adc r4, r7\n\t"
  135422. #endif
  135423. #ifdef WOLFSSL_KEIL
  135424. "adcs r5, r5, %[r]\n\t"
  135425. #elif defined(__clang__)
  135426. "adcs r5, %[r]\n\t"
  135427. #else
  135428. "adc r5, %[r]\n\t"
  135429. #endif
  135430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135431. "lsrs r6, %[a], #16\n\t"
  135432. #else
  135433. "lsr r6, %[a], #16\n\t"
  135434. #endif
  135435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135436. "lsrs r7, %[b], #16\n\t"
  135437. #else
  135438. "lsr r7, %[b], #16\n\t"
  135439. #endif
  135440. #ifdef WOLFSSL_KEIL
  135441. "muls r7, r6, r7\n\t"
  135442. #elif defined(__clang__)
  135443. "muls r7, r6\n\t"
  135444. #else
  135445. "mul r7, r6\n\t"
  135446. #endif
  135447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135448. "adds r4, r4, r7\n\t"
  135449. #else
  135450. "add r4, r4, r7\n\t"
  135451. #endif
  135452. #ifdef WOLFSSL_KEIL
  135453. "adcs r5, r5, %[r]\n\t"
  135454. #elif defined(__clang__)
  135455. "adcs r5, %[r]\n\t"
  135456. #else
  135457. "adc r5, %[r]\n\t"
  135458. #endif
  135459. "uxth r7, %[b]\n\t"
  135460. #ifdef WOLFSSL_KEIL
  135461. "muls r6, r7, r6\n\t"
  135462. #elif defined(__clang__)
  135463. "muls r6, r7\n\t"
  135464. #else
  135465. "mul r6, r7\n\t"
  135466. #endif
  135467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135468. "lsrs r7, r6, #16\n\t"
  135469. #else
  135470. "lsr r7, r6, #16\n\t"
  135471. #endif
  135472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135473. "lsls r6, r6, #16\n\t"
  135474. #else
  135475. "lsl r6, r6, #16\n\t"
  135476. #endif
  135477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135478. "adds r3, r3, r6\n\t"
  135479. #else
  135480. "add r3, r3, r6\n\t"
  135481. #endif
  135482. #ifdef WOLFSSL_KEIL
  135483. "adcs r4, r4, r7\n\t"
  135484. #elif defined(__clang__)
  135485. "adcs r4, r7\n\t"
  135486. #else
  135487. "adc r4, r7\n\t"
  135488. #endif
  135489. #ifdef WOLFSSL_KEIL
  135490. "adcs r5, r5, %[r]\n\t"
  135491. #elif defined(__clang__)
  135492. "adcs r5, %[r]\n\t"
  135493. #else
  135494. "adc r5, %[r]\n\t"
  135495. #endif
  135496. "str r3, [sp, #12]\n\t"
  135497. "# A[4] * B[0]\n\t"
  135498. "movs r3, #0\n\t"
  135499. "mov %[a], r9\n\t"
  135500. "mov %[b], r10\n\t"
  135501. "ldr %[a], [%[a], #16]\n\t"
  135502. "ldr %[b], [%[b]]\n\t"
  135503. "uxth r6, %[a]\n\t"
  135504. "uxth r7, %[b]\n\t"
  135505. #ifdef WOLFSSL_KEIL
  135506. "muls r7, r6, r7\n\t"
  135507. #elif defined(__clang__)
  135508. "muls r7, r6\n\t"
  135509. #else
  135510. "mul r7, r6\n\t"
  135511. #endif
  135512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135513. "adds r4, r4, r7\n\t"
  135514. #else
  135515. "add r4, r4, r7\n\t"
  135516. #endif
  135517. #ifdef WOLFSSL_KEIL
  135518. "adcs r5, r5, %[r]\n\t"
  135519. #elif defined(__clang__)
  135520. "adcs r5, %[r]\n\t"
  135521. #else
  135522. "adc r5, %[r]\n\t"
  135523. #endif
  135524. #ifdef WOLFSSL_KEIL
  135525. "adcs r3, r3, %[r]\n\t"
  135526. #elif defined(__clang__)
  135527. "adcs r3, %[r]\n\t"
  135528. #else
  135529. "adc r3, %[r]\n\t"
  135530. #endif
  135531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135532. "lsrs r7, %[b], #16\n\t"
  135533. #else
  135534. "lsr r7, %[b], #16\n\t"
  135535. #endif
  135536. #ifdef WOLFSSL_KEIL
  135537. "muls r6, r7, r6\n\t"
  135538. #elif defined(__clang__)
  135539. "muls r6, r7\n\t"
  135540. #else
  135541. "mul r6, r7\n\t"
  135542. #endif
  135543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135544. "lsrs r7, r6, #16\n\t"
  135545. #else
  135546. "lsr r7, r6, #16\n\t"
  135547. #endif
  135548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135549. "lsls r6, r6, #16\n\t"
  135550. #else
  135551. "lsl r6, r6, #16\n\t"
  135552. #endif
  135553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135554. "adds r4, r4, r6\n\t"
  135555. #else
  135556. "add r4, r4, r6\n\t"
  135557. #endif
  135558. #ifdef WOLFSSL_KEIL
  135559. "adcs r5, r5, r7\n\t"
  135560. #elif defined(__clang__)
  135561. "adcs r5, r7\n\t"
  135562. #else
  135563. "adc r5, r7\n\t"
  135564. #endif
  135565. #ifdef WOLFSSL_KEIL
  135566. "adcs r3, r3, %[r]\n\t"
  135567. #elif defined(__clang__)
  135568. "adcs r3, %[r]\n\t"
  135569. #else
  135570. "adc r3, %[r]\n\t"
  135571. #endif
  135572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135573. "lsrs r6, %[a], #16\n\t"
  135574. #else
  135575. "lsr r6, %[a], #16\n\t"
  135576. #endif
  135577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135578. "lsrs r7, %[b], #16\n\t"
  135579. #else
  135580. "lsr r7, %[b], #16\n\t"
  135581. #endif
  135582. #ifdef WOLFSSL_KEIL
  135583. "muls r7, r6, r7\n\t"
  135584. #elif defined(__clang__)
  135585. "muls r7, r6\n\t"
  135586. #else
  135587. "mul r7, r6\n\t"
  135588. #endif
  135589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135590. "adds r5, r5, r7\n\t"
  135591. #else
  135592. "add r5, r5, r7\n\t"
  135593. #endif
  135594. #ifdef WOLFSSL_KEIL
  135595. "adcs r3, r3, %[r]\n\t"
  135596. #elif defined(__clang__)
  135597. "adcs r3, %[r]\n\t"
  135598. #else
  135599. "adc r3, %[r]\n\t"
  135600. #endif
  135601. "uxth r7, %[b]\n\t"
  135602. #ifdef WOLFSSL_KEIL
  135603. "muls r6, r7, r6\n\t"
  135604. #elif defined(__clang__)
  135605. "muls r6, r7\n\t"
  135606. #else
  135607. "mul r6, r7\n\t"
  135608. #endif
  135609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135610. "lsrs r7, r6, #16\n\t"
  135611. #else
  135612. "lsr r7, r6, #16\n\t"
  135613. #endif
  135614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135615. "lsls r6, r6, #16\n\t"
  135616. #else
  135617. "lsl r6, r6, #16\n\t"
  135618. #endif
  135619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135620. "adds r4, r4, r6\n\t"
  135621. #else
  135622. "add r4, r4, r6\n\t"
  135623. #endif
  135624. #ifdef WOLFSSL_KEIL
  135625. "adcs r5, r5, r7\n\t"
  135626. #elif defined(__clang__)
  135627. "adcs r5, r7\n\t"
  135628. #else
  135629. "adc r5, r7\n\t"
  135630. #endif
  135631. #ifdef WOLFSSL_KEIL
  135632. "adcs r3, r3, %[r]\n\t"
  135633. #elif defined(__clang__)
  135634. "adcs r3, %[r]\n\t"
  135635. #else
  135636. "adc r3, %[r]\n\t"
  135637. #endif
  135638. "# A[3] * B[1]\n\t"
  135639. "mov %[a], r9\n\t"
  135640. "mov %[b], r10\n\t"
  135641. "ldr %[a], [%[a], #12]\n\t"
  135642. "ldr %[b], [%[b], #4]\n\t"
  135643. "uxth r6, %[a]\n\t"
  135644. "uxth r7, %[b]\n\t"
  135645. #ifdef WOLFSSL_KEIL
  135646. "muls r7, r6, r7\n\t"
  135647. #elif defined(__clang__)
  135648. "muls r7, r6\n\t"
  135649. #else
  135650. "mul r7, r6\n\t"
  135651. #endif
  135652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135653. "adds r4, r4, r7\n\t"
  135654. #else
  135655. "add r4, r4, r7\n\t"
  135656. #endif
  135657. #ifdef WOLFSSL_KEIL
  135658. "adcs r5, r5, %[r]\n\t"
  135659. #elif defined(__clang__)
  135660. "adcs r5, %[r]\n\t"
  135661. #else
  135662. "adc r5, %[r]\n\t"
  135663. #endif
  135664. #ifdef WOLFSSL_KEIL
  135665. "adcs r3, r3, %[r]\n\t"
  135666. #elif defined(__clang__)
  135667. "adcs r3, %[r]\n\t"
  135668. #else
  135669. "adc r3, %[r]\n\t"
  135670. #endif
  135671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135672. "lsrs r7, %[b], #16\n\t"
  135673. #else
  135674. "lsr r7, %[b], #16\n\t"
  135675. #endif
  135676. #ifdef WOLFSSL_KEIL
  135677. "muls r6, r7, r6\n\t"
  135678. #elif defined(__clang__)
  135679. "muls r6, r7\n\t"
  135680. #else
  135681. "mul r6, r7\n\t"
  135682. #endif
  135683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135684. "lsrs r7, r6, #16\n\t"
  135685. #else
  135686. "lsr r7, r6, #16\n\t"
  135687. #endif
  135688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135689. "lsls r6, r6, #16\n\t"
  135690. #else
  135691. "lsl r6, r6, #16\n\t"
  135692. #endif
  135693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135694. "adds r4, r4, r6\n\t"
  135695. #else
  135696. "add r4, r4, r6\n\t"
  135697. #endif
  135698. #ifdef WOLFSSL_KEIL
  135699. "adcs r5, r5, r7\n\t"
  135700. #elif defined(__clang__)
  135701. "adcs r5, r7\n\t"
  135702. #else
  135703. "adc r5, r7\n\t"
  135704. #endif
  135705. #ifdef WOLFSSL_KEIL
  135706. "adcs r3, r3, %[r]\n\t"
  135707. #elif defined(__clang__)
  135708. "adcs r3, %[r]\n\t"
  135709. #else
  135710. "adc r3, %[r]\n\t"
  135711. #endif
  135712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135713. "lsrs r6, %[a], #16\n\t"
  135714. #else
  135715. "lsr r6, %[a], #16\n\t"
  135716. #endif
  135717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135718. "lsrs r7, %[b], #16\n\t"
  135719. #else
  135720. "lsr r7, %[b], #16\n\t"
  135721. #endif
  135722. #ifdef WOLFSSL_KEIL
  135723. "muls r7, r6, r7\n\t"
  135724. #elif defined(__clang__)
  135725. "muls r7, r6\n\t"
  135726. #else
  135727. "mul r7, r6\n\t"
  135728. #endif
  135729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135730. "adds r5, r5, r7\n\t"
  135731. #else
  135732. "add r5, r5, r7\n\t"
  135733. #endif
  135734. #ifdef WOLFSSL_KEIL
  135735. "adcs r3, r3, %[r]\n\t"
  135736. #elif defined(__clang__)
  135737. "adcs r3, %[r]\n\t"
  135738. #else
  135739. "adc r3, %[r]\n\t"
  135740. #endif
  135741. "uxth r7, %[b]\n\t"
  135742. #ifdef WOLFSSL_KEIL
  135743. "muls r6, r7, r6\n\t"
  135744. #elif defined(__clang__)
  135745. "muls r6, r7\n\t"
  135746. #else
  135747. "mul r6, r7\n\t"
  135748. #endif
  135749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135750. "lsrs r7, r6, #16\n\t"
  135751. #else
  135752. "lsr r7, r6, #16\n\t"
  135753. #endif
  135754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135755. "lsls r6, r6, #16\n\t"
  135756. #else
  135757. "lsl r6, r6, #16\n\t"
  135758. #endif
  135759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135760. "adds r4, r4, r6\n\t"
  135761. #else
  135762. "add r4, r4, r6\n\t"
  135763. #endif
  135764. #ifdef WOLFSSL_KEIL
  135765. "adcs r5, r5, r7\n\t"
  135766. #elif defined(__clang__)
  135767. "adcs r5, r7\n\t"
  135768. #else
  135769. "adc r5, r7\n\t"
  135770. #endif
  135771. #ifdef WOLFSSL_KEIL
  135772. "adcs r3, r3, %[r]\n\t"
  135773. #elif defined(__clang__)
  135774. "adcs r3, %[r]\n\t"
  135775. #else
  135776. "adc r3, %[r]\n\t"
  135777. #endif
  135778. "# A[2] * B[2]\n\t"
  135779. "mov %[a], r9\n\t"
  135780. "mov %[b], r10\n\t"
  135781. "ldr %[a], [%[a], #8]\n\t"
  135782. "ldr %[b], [%[b], #8]\n\t"
  135783. "uxth r6, %[a]\n\t"
  135784. "uxth r7, %[b]\n\t"
  135785. #ifdef WOLFSSL_KEIL
  135786. "muls r7, r6, r7\n\t"
  135787. #elif defined(__clang__)
  135788. "muls r7, r6\n\t"
  135789. #else
  135790. "mul r7, r6\n\t"
  135791. #endif
  135792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135793. "adds r4, r4, r7\n\t"
  135794. #else
  135795. "add r4, r4, r7\n\t"
  135796. #endif
  135797. #ifdef WOLFSSL_KEIL
  135798. "adcs r5, r5, %[r]\n\t"
  135799. #elif defined(__clang__)
  135800. "adcs r5, %[r]\n\t"
  135801. #else
  135802. "adc r5, %[r]\n\t"
  135803. #endif
  135804. #ifdef WOLFSSL_KEIL
  135805. "adcs r3, r3, %[r]\n\t"
  135806. #elif defined(__clang__)
  135807. "adcs r3, %[r]\n\t"
  135808. #else
  135809. "adc r3, %[r]\n\t"
  135810. #endif
  135811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135812. "lsrs r7, %[b], #16\n\t"
  135813. #else
  135814. "lsr r7, %[b], #16\n\t"
  135815. #endif
  135816. #ifdef WOLFSSL_KEIL
  135817. "muls r6, r7, r6\n\t"
  135818. #elif defined(__clang__)
  135819. "muls r6, r7\n\t"
  135820. #else
  135821. "mul r6, r7\n\t"
  135822. #endif
  135823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135824. "lsrs r7, r6, #16\n\t"
  135825. #else
  135826. "lsr r7, r6, #16\n\t"
  135827. #endif
  135828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135829. "lsls r6, r6, #16\n\t"
  135830. #else
  135831. "lsl r6, r6, #16\n\t"
  135832. #endif
  135833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135834. "adds r4, r4, r6\n\t"
  135835. #else
  135836. "add r4, r4, r6\n\t"
  135837. #endif
  135838. #ifdef WOLFSSL_KEIL
  135839. "adcs r5, r5, r7\n\t"
  135840. #elif defined(__clang__)
  135841. "adcs r5, r7\n\t"
  135842. #else
  135843. "adc r5, r7\n\t"
  135844. #endif
  135845. #ifdef WOLFSSL_KEIL
  135846. "adcs r3, r3, %[r]\n\t"
  135847. #elif defined(__clang__)
  135848. "adcs r3, %[r]\n\t"
  135849. #else
  135850. "adc r3, %[r]\n\t"
  135851. #endif
  135852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135853. "lsrs r6, %[a], #16\n\t"
  135854. #else
  135855. "lsr r6, %[a], #16\n\t"
  135856. #endif
  135857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135858. "lsrs r7, %[b], #16\n\t"
  135859. #else
  135860. "lsr r7, %[b], #16\n\t"
  135861. #endif
  135862. #ifdef WOLFSSL_KEIL
  135863. "muls r7, r6, r7\n\t"
  135864. #elif defined(__clang__)
  135865. "muls r7, r6\n\t"
  135866. #else
  135867. "mul r7, r6\n\t"
  135868. #endif
  135869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135870. "adds r5, r5, r7\n\t"
  135871. #else
  135872. "add r5, r5, r7\n\t"
  135873. #endif
  135874. #ifdef WOLFSSL_KEIL
  135875. "adcs r3, r3, %[r]\n\t"
  135876. #elif defined(__clang__)
  135877. "adcs r3, %[r]\n\t"
  135878. #else
  135879. "adc r3, %[r]\n\t"
  135880. #endif
  135881. "uxth r7, %[b]\n\t"
  135882. #ifdef WOLFSSL_KEIL
  135883. "muls r6, r7, r6\n\t"
  135884. #elif defined(__clang__)
  135885. "muls r6, r7\n\t"
  135886. #else
  135887. "mul r6, r7\n\t"
  135888. #endif
  135889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135890. "lsrs r7, r6, #16\n\t"
  135891. #else
  135892. "lsr r7, r6, #16\n\t"
  135893. #endif
  135894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135895. "lsls r6, r6, #16\n\t"
  135896. #else
  135897. "lsl r6, r6, #16\n\t"
  135898. #endif
  135899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135900. "adds r4, r4, r6\n\t"
  135901. #else
  135902. "add r4, r4, r6\n\t"
  135903. #endif
  135904. #ifdef WOLFSSL_KEIL
  135905. "adcs r5, r5, r7\n\t"
  135906. #elif defined(__clang__)
  135907. "adcs r5, r7\n\t"
  135908. #else
  135909. "adc r5, r7\n\t"
  135910. #endif
  135911. #ifdef WOLFSSL_KEIL
  135912. "adcs r3, r3, %[r]\n\t"
  135913. #elif defined(__clang__)
  135914. "adcs r3, %[r]\n\t"
  135915. #else
  135916. "adc r3, %[r]\n\t"
  135917. #endif
  135918. "# A[1] * B[3]\n\t"
  135919. "mov %[a], r9\n\t"
  135920. "mov %[b], r10\n\t"
  135921. "ldr %[a], [%[a], #4]\n\t"
  135922. "ldr %[b], [%[b], #12]\n\t"
  135923. "uxth r6, %[a]\n\t"
  135924. "uxth r7, %[b]\n\t"
  135925. #ifdef WOLFSSL_KEIL
  135926. "muls r7, r6, r7\n\t"
  135927. #elif defined(__clang__)
  135928. "muls r7, r6\n\t"
  135929. #else
  135930. "mul r7, r6\n\t"
  135931. #endif
  135932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135933. "adds r4, r4, r7\n\t"
  135934. #else
  135935. "add r4, r4, r7\n\t"
  135936. #endif
  135937. #ifdef WOLFSSL_KEIL
  135938. "adcs r5, r5, %[r]\n\t"
  135939. #elif defined(__clang__)
  135940. "adcs r5, %[r]\n\t"
  135941. #else
  135942. "adc r5, %[r]\n\t"
  135943. #endif
  135944. #ifdef WOLFSSL_KEIL
  135945. "adcs r3, r3, %[r]\n\t"
  135946. #elif defined(__clang__)
  135947. "adcs r3, %[r]\n\t"
  135948. #else
  135949. "adc r3, %[r]\n\t"
  135950. #endif
  135951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135952. "lsrs r7, %[b], #16\n\t"
  135953. #else
  135954. "lsr r7, %[b], #16\n\t"
  135955. #endif
  135956. #ifdef WOLFSSL_KEIL
  135957. "muls r6, r7, r6\n\t"
  135958. #elif defined(__clang__)
  135959. "muls r6, r7\n\t"
  135960. #else
  135961. "mul r6, r7\n\t"
  135962. #endif
  135963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135964. "lsrs r7, r6, #16\n\t"
  135965. #else
  135966. "lsr r7, r6, #16\n\t"
  135967. #endif
  135968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135969. "lsls r6, r6, #16\n\t"
  135970. #else
  135971. "lsl r6, r6, #16\n\t"
  135972. #endif
  135973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135974. "adds r4, r4, r6\n\t"
  135975. #else
  135976. "add r4, r4, r6\n\t"
  135977. #endif
  135978. #ifdef WOLFSSL_KEIL
  135979. "adcs r5, r5, r7\n\t"
  135980. #elif defined(__clang__)
  135981. "adcs r5, r7\n\t"
  135982. #else
  135983. "adc r5, r7\n\t"
  135984. #endif
  135985. #ifdef WOLFSSL_KEIL
  135986. "adcs r3, r3, %[r]\n\t"
  135987. #elif defined(__clang__)
  135988. "adcs r3, %[r]\n\t"
  135989. #else
  135990. "adc r3, %[r]\n\t"
  135991. #endif
  135992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135993. "lsrs r6, %[a], #16\n\t"
  135994. #else
  135995. "lsr r6, %[a], #16\n\t"
  135996. #endif
  135997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  135998. "lsrs r7, %[b], #16\n\t"
  135999. #else
  136000. "lsr r7, %[b], #16\n\t"
  136001. #endif
  136002. #ifdef WOLFSSL_KEIL
  136003. "muls r7, r6, r7\n\t"
  136004. #elif defined(__clang__)
  136005. "muls r7, r6\n\t"
  136006. #else
  136007. "mul r7, r6\n\t"
  136008. #endif
  136009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136010. "adds r5, r5, r7\n\t"
  136011. #else
  136012. "add r5, r5, r7\n\t"
  136013. #endif
  136014. #ifdef WOLFSSL_KEIL
  136015. "adcs r3, r3, %[r]\n\t"
  136016. #elif defined(__clang__)
  136017. "adcs r3, %[r]\n\t"
  136018. #else
  136019. "adc r3, %[r]\n\t"
  136020. #endif
  136021. "uxth r7, %[b]\n\t"
  136022. #ifdef WOLFSSL_KEIL
  136023. "muls r6, r7, r6\n\t"
  136024. #elif defined(__clang__)
  136025. "muls r6, r7\n\t"
  136026. #else
  136027. "mul r6, r7\n\t"
  136028. #endif
  136029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136030. "lsrs r7, r6, #16\n\t"
  136031. #else
  136032. "lsr r7, r6, #16\n\t"
  136033. #endif
  136034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136035. "lsls r6, r6, #16\n\t"
  136036. #else
  136037. "lsl r6, r6, #16\n\t"
  136038. #endif
  136039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136040. "adds r4, r4, r6\n\t"
  136041. #else
  136042. "add r4, r4, r6\n\t"
  136043. #endif
  136044. #ifdef WOLFSSL_KEIL
  136045. "adcs r5, r5, r7\n\t"
  136046. #elif defined(__clang__)
  136047. "adcs r5, r7\n\t"
  136048. #else
  136049. "adc r5, r7\n\t"
  136050. #endif
  136051. #ifdef WOLFSSL_KEIL
  136052. "adcs r3, r3, %[r]\n\t"
  136053. #elif defined(__clang__)
  136054. "adcs r3, %[r]\n\t"
  136055. #else
  136056. "adc r3, %[r]\n\t"
  136057. #endif
  136058. "# A[0] * B[4]\n\t"
  136059. "mov %[a], r9\n\t"
  136060. "mov %[b], r10\n\t"
  136061. "ldr %[a], [%[a]]\n\t"
  136062. "ldr %[b], [%[b], #16]\n\t"
  136063. "uxth r6, %[a]\n\t"
  136064. "uxth r7, %[b]\n\t"
  136065. #ifdef WOLFSSL_KEIL
  136066. "muls r7, r6, r7\n\t"
  136067. #elif defined(__clang__)
  136068. "muls r7, r6\n\t"
  136069. #else
  136070. "mul r7, r6\n\t"
  136071. #endif
  136072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136073. "adds r4, r4, r7\n\t"
  136074. #else
  136075. "add r4, r4, r7\n\t"
  136076. #endif
  136077. #ifdef WOLFSSL_KEIL
  136078. "adcs r5, r5, %[r]\n\t"
  136079. #elif defined(__clang__)
  136080. "adcs r5, %[r]\n\t"
  136081. #else
  136082. "adc r5, %[r]\n\t"
  136083. #endif
  136084. #ifdef WOLFSSL_KEIL
  136085. "adcs r3, r3, %[r]\n\t"
  136086. #elif defined(__clang__)
  136087. "adcs r3, %[r]\n\t"
  136088. #else
  136089. "adc r3, %[r]\n\t"
  136090. #endif
  136091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136092. "lsrs r7, %[b], #16\n\t"
  136093. #else
  136094. "lsr r7, %[b], #16\n\t"
  136095. #endif
  136096. #ifdef WOLFSSL_KEIL
  136097. "muls r6, r7, r6\n\t"
  136098. #elif defined(__clang__)
  136099. "muls r6, r7\n\t"
  136100. #else
  136101. "mul r6, r7\n\t"
  136102. #endif
  136103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136104. "lsrs r7, r6, #16\n\t"
  136105. #else
  136106. "lsr r7, r6, #16\n\t"
  136107. #endif
  136108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136109. "lsls r6, r6, #16\n\t"
  136110. #else
  136111. "lsl r6, r6, #16\n\t"
  136112. #endif
  136113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136114. "adds r4, r4, r6\n\t"
  136115. #else
  136116. "add r4, r4, r6\n\t"
  136117. #endif
  136118. #ifdef WOLFSSL_KEIL
  136119. "adcs r5, r5, r7\n\t"
  136120. #elif defined(__clang__)
  136121. "adcs r5, r7\n\t"
  136122. #else
  136123. "adc r5, r7\n\t"
  136124. #endif
  136125. #ifdef WOLFSSL_KEIL
  136126. "adcs r3, r3, %[r]\n\t"
  136127. #elif defined(__clang__)
  136128. "adcs r3, %[r]\n\t"
  136129. #else
  136130. "adc r3, %[r]\n\t"
  136131. #endif
  136132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136133. "lsrs r6, %[a], #16\n\t"
  136134. #else
  136135. "lsr r6, %[a], #16\n\t"
  136136. #endif
  136137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136138. "lsrs r7, %[b], #16\n\t"
  136139. #else
  136140. "lsr r7, %[b], #16\n\t"
  136141. #endif
  136142. #ifdef WOLFSSL_KEIL
  136143. "muls r7, r6, r7\n\t"
  136144. #elif defined(__clang__)
  136145. "muls r7, r6\n\t"
  136146. #else
  136147. "mul r7, r6\n\t"
  136148. #endif
  136149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136150. "adds r5, r5, r7\n\t"
  136151. #else
  136152. "add r5, r5, r7\n\t"
  136153. #endif
  136154. #ifdef WOLFSSL_KEIL
  136155. "adcs r3, r3, %[r]\n\t"
  136156. #elif defined(__clang__)
  136157. "adcs r3, %[r]\n\t"
  136158. #else
  136159. "adc r3, %[r]\n\t"
  136160. #endif
  136161. "uxth r7, %[b]\n\t"
  136162. #ifdef WOLFSSL_KEIL
  136163. "muls r6, r7, r6\n\t"
  136164. #elif defined(__clang__)
  136165. "muls r6, r7\n\t"
  136166. #else
  136167. "mul r6, r7\n\t"
  136168. #endif
  136169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136170. "lsrs r7, r6, #16\n\t"
  136171. #else
  136172. "lsr r7, r6, #16\n\t"
  136173. #endif
  136174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136175. "lsls r6, r6, #16\n\t"
  136176. #else
  136177. "lsl r6, r6, #16\n\t"
  136178. #endif
  136179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136180. "adds r4, r4, r6\n\t"
  136181. #else
  136182. "add r4, r4, r6\n\t"
  136183. #endif
  136184. #ifdef WOLFSSL_KEIL
  136185. "adcs r5, r5, r7\n\t"
  136186. #elif defined(__clang__)
  136187. "adcs r5, r7\n\t"
  136188. #else
  136189. "adc r5, r7\n\t"
  136190. #endif
  136191. #ifdef WOLFSSL_KEIL
  136192. "adcs r3, r3, %[r]\n\t"
  136193. #elif defined(__clang__)
  136194. "adcs r3, %[r]\n\t"
  136195. #else
  136196. "adc r3, %[r]\n\t"
  136197. #endif
  136198. "str r4, [sp, #16]\n\t"
  136199. "# A[0] * B[5]\n\t"
  136200. "movs r4, #0\n\t"
  136201. "mov %[a], r9\n\t"
  136202. "mov %[b], r10\n\t"
  136203. "ldr %[a], [%[a]]\n\t"
  136204. "ldr %[b], [%[b], #20]\n\t"
  136205. "uxth r6, %[a]\n\t"
  136206. "uxth r7, %[b]\n\t"
  136207. #ifdef WOLFSSL_KEIL
  136208. "muls r7, r6, r7\n\t"
  136209. #elif defined(__clang__)
  136210. "muls r7, r6\n\t"
  136211. #else
  136212. "mul r7, r6\n\t"
  136213. #endif
  136214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136215. "adds r5, r5, r7\n\t"
  136216. #else
  136217. "add r5, r5, r7\n\t"
  136218. #endif
  136219. #ifdef WOLFSSL_KEIL
  136220. "adcs r3, r3, %[r]\n\t"
  136221. #elif defined(__clang__)
  136222. "adcs r3, %[r]\n\t"
  136223. #else
  136224. "adc r3, %[r]\n\t"
  136225. #endif
  136226. #ifdef WOLFSSL_KEIL
  136227. "adcs r4, r4, %[r]\n\t"
  136228. #elif defined(__clang__)
  136229. "adcs r4, %[r]\n\t"
  136230. #else
  136231. "adc r4, %[r]\n\t"
  136232. #endif
  136233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136234. "lsrs r7, %[b], #16\n\t"
  136235. #else
  136236. "lsr r7, %[b], #16\n\t"
  136237. #endif
  136238. #ifdef WOLFSSL_KEIL
  136239. "muls r6, r7, r6\n\t"
  136240. #elif defined(__clang__)
  136241. "muls r6, r7\n\t"
  136242. #else
  136243. "mul r6, r7\n\t"
  136244. #endif
  136245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136246. "lsrs r7, r6, #16\n\t"
  136247. #else
  136248. "lsr r7, r6, #16\n\t"
  136249. #endif
  136250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136251. "lsls r6, r6, #16\n\t"
  136252. #else
  136253. "lsl r6, r6, #16\n\t"
  136254. #endif
  136255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136256. "adds r5, r5, r6\n\t"
  136257. #else
  136258. "add r5, r5, r6\n\t"
  136259. #endif
  136260. #ifdef WOLFSSL_KEIL
  136261. "adcs r3, r3, r7\n\t"
  136262. #elif defined(__clang__)
  136263. "adcs r3, r7\n\t"
  136264. #else
  136265. "adc r3, r7\n\t"
  136266. #endif
  136267. #ifdef WOLFSSL_KEIL
  136268. "adcs r4, r4, %[r]\n\t"
  136269. #elif defined(__clang__)
  136270. "adcs r4, %[r]\n\t"
  136271. #else
  136272. "adc r4, %[r]\n\t"
  136273. #endif
  136274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136275. "lsrs r6, %[a], #16\n\t"
  136276. #else
  136277. "lsr r6, %[a], #16\n\t"
  136278. #endif
  136279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136280. "lsrs r7, %[b], #16\n\t"
  136281. #else
  136282. "lsr r7, %[b], #16\n\t"
  136283. #endif
  136284. #ifdef WOLFSSL_KEIL
  136285. "muls r7, r6, r7\n\t"
  136286. #elif defined(__clang__)
  136287. "muls r7, r6\n\t"
  136288. #else
  136289. "mul r7, r6\n\t"
  136290. #endif
  136291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136292. "adds r3, r3, r7\n\t"
  136293. #else
  136294. "add r3, r3, r7\n\t"
  136295. #endif
  136296. #ifdef WOLFSSL_KEIL
  136297. "adcs r4, r4, %[r]\n\t"
  136298. #elif defined(__clang__)
  136299. "adcs r4, %[r]\n\t"
  136300. #else
  136301. "adc r4, %[r]\n\t"
  136302. #endif
  136303. "uxth r7, %[b]\n\t"
  136304. #ifdef WOLFSSL_KEIL
  136305. "muls r6, r7, r6\n\t"
  136306. #elif defined(__clang__)
  136307. "muls r6, r7\n\t"
  136308. #else
  136309. "mul r6, r7\n\t"
  136310. #endif
  136311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136312. "lsrs r7, r6, #16\n\t"
  136313. #else
  136314. "lsr r7, r6, #16\n\t"
  136315. #endif
  136316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136317. "lsls r6, r6, #16\n\t"
  136318. #else
  136319. "lsl r6, r6, #16\n\t"
  136320. #endif
  136321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136322. "adds r5, r5, r6\n\t"
  136323. #else
  136324. "add r5, r5, r6\n\t"
  136325. #endif
  136326. #ifdef WOLFSSL_KEIL
  136327. "adcs r3, r3, r7\n\t"
  136328. #elif defined(__clang__)
  136329. "adcs r3, r7\n\t"
  136330. #else
  136331. "adc r3, r7\n\t"
  136332. #endif
  136333. #ifdef WOLFSSL_KEIL
  136334. "adcs r4, r4, %[r]\n\t"
  136335. #elif defined(__clang__)
  136336. "adcs r4, %[r]\n\t"
  136337. #else
  136338. "adc r4, %[r]\n\t"
  136339. #endif
  136340. "# A[1] * B[4]\n\t"
  136341. "mov %[a], r9\n\t"
  136342. "mov %[b], r10\n\t"
  136343. "ldr %[a], [%[a], #4]\n\t"
  136344. "ldr %[b], [%[b], #16]\n\t"
  136345. "uxth r6, %[a]\n\t"
  136346. "uxth r7, %[b]\n\t"
  136347. #ifdef WOLFSSL_KEIL
  136348. "muls r7, r6, r7\n\t"
  136349. #elif defined(__clang__)
  136350. "muls r7, r6\n\t"
  136351. #else
  136352. "mul r7, r6\n\t"
  136353. #endif
  136354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136355. "adds r5, r5, r7\n\t"
  136356. #else
  136357. "add r5, r5, r7\n\t"
  136358. #endif
  136359. #ifdef WOLFSSL_KEIL
  136360. "adcs r3, r3, %[r]\n\t"
  136361. #elif defined(__clang__)
  136362. "adcs r3, %[r]\n\t"
  136363. #else
  136364. "adc r3, %[r]\n\t"
  136365. #endif
  136366. #ifdef WOLFSSL_KEIL
  136367. "adcs r4, r4, %[r]\n\t"
  136368. #elif defined(__clang__)
  136369. "adcs r4, %[r]\n\t"
  136370. #else
  136371. "adc r4, %[r]\n\t"
  136372. #endif
  136373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136374. "lsrs r7, %[b], #16\n\t"
  136375. #else
  136376. "lsr r7, %[b], #16\n\t"
  136377. #endif
  136378. #ifdef WOLFSSL_KEIL
  136379. "muls r6, r7, r6\n\t"
  136380. #elif defined(__clang__)
  136381. "muls r6, r7\n\t"
  136382. #else
  136383. "mul r6, r7\n\t"
  136384. #endif
  136385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136386. "lsrs r7, r6, #16\n\t"
  136387. #else
  136388. "lsr r7, r6, #16\n\t"
  136389. #endif
  136390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136391. "lsls r6, r6, #16\n\t"
  136392. #else
  136393. "lsl r6, r6, #16\n\t"
  136394. #endif
  136395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136396. "adds r5, r5, r6\n\t"
  136397. #else
  136398. "add r5, r5, r6\n\t"
  136399. #endif
  136400. #ifdef WOLFSSL_KEIL
  136401. "adcs r3, r3, r7\n\t"
  136402. #elif defined(__clang__)
  136403. "adcs r3, r7\n\t"
  136404. #else
  136405. "adc r3, r7\n\t"
  136406. #endif
  136407. #ifdef WOLFSSL_KEIL
  136408. "adcs r4, r4, %[r]\n\t"
  136409. #elif defined(__clang__)
  136410. "adcs r4, %[r]\n\t"
  136411. #else
  136412. "adc r4, %[r]\n\t"
  136413. #endif
  136414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136415. "lsrs r6, %[a], #16\n\t"
  136416. #else
  136417. "lsr r6, %[a], #16\n\t"
  136418. #endif
  136419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136420. "lsrs r7, %[b], #16\n\t"
  136421. #else
  136422. "lsr r7, %[b], #16\n\t"
  136423. #endif
  136424. #ifdef WOLFSSL_KEIL
  136425. "muls r7, r6, r7\n\t"
  136426. #elif defined(__clang__)
  136427. "muls r7, r6\n\t"
  136428. #else
  136429. "mul r7, r6\n\t"
  136430. #endif
  136431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136432. "adds r3, r3, r7\n\t"
  136433. #else
  136434. "add r3, r3, r7\n\t"
  136435. #endif
  136436. #ifdef WOLFSSL_KEIL
  136437. "adcs r4, r4, %[r]\n\t"
  136438. #elif defined(__clang__)
  136439. "adcs r4, %[r]\n\t"
  136440. #else
  136441. "adc r4, %[r]\n\t"
  136442. #endif
  136443. "uxth r7, %[b]\n\t"
  136444. #ifdef WOLFSSL_KEIL
  136445. "muls r6, r7, r6\n\t"
  136446. #elif defined(__clang__)
  136447. "muls r6, r7\n\t"
  136448. #else
  136449. "mul r6, r7\n\t"
  136450. #endif
  136451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136452. "lsrs r7, r6, #16\n\t"
  136453. #else
  136454. "lsr r7, r6, #16\n\t"
  136455. #endif
  136456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136457. "lsls r6, r6, #16\n\t"
  136458. #else
  136459. "lsl r6, r6, #16\n\t"
  136460. #endif
  136461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136462. "adds r5, r5, r6\n\t"
  136463. #else
  136464. "add r5, r5, r6\n\t"
  136465. #endif
  136466. #ifdef WOLFSSL_KEIL
  136467. "adcs r3, r3, r7\n\t"
  136468. #elif defined(__clang__)
  136469. "adcs r3, r7\n\t"
  136470. #else
  136471. "adc r3, r7\n\t"
  136472. #endif
  136473. #ifdef WOLFSSL_KEIL
  136474. "adcs r4, r4, %[r]\n\t"
  136475. #elif defined(__clang__)
  136476. "adcs r4, %[r]\n\t"
  136477. #else
  136478. "adc r4, %[r]\n\t"
  136479. #endif
  136480. "# A[2] * B[3]\n\t"
  136481. "mov %[a], r9\n\t"
  136482. "mov %[b], r10\n\t"
  136483. "ldr %[a], [%[a], #8]\n\t"
  136484. "ldr %[b], [%[b], #12]\n\t"
  136485. "uxth r6, %[a]\n\t"
  136486. "uxth r7, %[b]\n\t"
  136487. #ifdef WOLFSSL_KEIL
  136488. "muls r7, r6, r7\n\t"
  136489. #elif defined(__clang__)
  136490. "muls r7, r6\n\t"
  136491. #else
  136492. "mul r7, r6\n\t"
  136493. #endif
  136494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136495. "adds r5, r5, r7\n\t"
  136496. #else
  136497. "add r5, r5, r7\n\t"
  136498. #endif
  136499. #ifdef WOLFSSL_KEIL
  136500. "adcs r3, r3, %[r]\n\t"
  136501. #elif defined(__clang__)
  136502. "adcs r3, %[r]\n\t"
  136503. #else
  136504. "adc r3, %[r]\n\t"
  136505. #endif
  136506. #ifdef WOLFSSL_KEIL
  136507. "adcs r4, r4, %[r]\n\t"
  136508. #elif defined(__clang__)
  136509. "adcs r4, %[r]\n\t"
  136510. #else
  136511. "adc r4, %[r]\n\t"
  136512. #endif
  136513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136514. "lsrs r7, %[b], #16\n\t"
  136515. #else
  136516. "lsr r7, %[b], #16\n\t"
  136517. #endif
  136518. #ifdef WOLFSSL_KEIL
  136519. "muls r6, r7, r6\n\t"
  136520. #elif defined(__clang__)
  136521. "muls r6, r7\n\t"
  136522. #else
  136523. "mul r6, r7\n\t"
  136524. #endif
  136525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136526. "lsrs r7, r6, #16\n\t"
  136527. #else
  136528. "lsr r7, r6, #16\n\t"
  136529. #endif
  136530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136531. "lsls r6, r6, #16\n\t"
  136532. #else
  136533. "lsl r6, r6, #16\n\t"
  136534. #endif
  136535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136536. "adds r5, r5, r6\n\t"
  136537. #else
  136538. "add r5, r5, r6\n\t"
  136539. #endif
  136540. #ifdef WOLFSSL_KEIL
  136541. "adcs r3, r3, r7\n\t"
  136542. #elif defined(__clang__)
  136543. "adcs r3, r7\n\t"
  136544. #else
  136545. "adc r3, r7\n\t"
  136546. #endif
  136547. #ifdef WOLFSSL_KEIL
  136548. "adcs r4, r4, %[r]\n\t"
  136549. #elif defined(__clang__)
  136550. "adcs r4, %[r]\n\t"
  136551. #else
  136552. "adc r4, %[r]\n\t"
  136553. #endif
  136554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136555. "lsrs r6, %[a], #16\n\t"
  136556. #else
  136557. "lsr r6, %[a], #16\n\t"
  136558. #endif
  136559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136560. "lsrs r7, %[b], #16\n\t"
  136561. #else
  136562. "lsr r7, %[b], #16\n\t"
  136563. #endif
  136564. #ifdef WOLFSSL_KEIL
  136565. "muls r7, r6, r7\n\t"
  136566. #elif defined(__clang__)
  136567. "muls r7, r6\n\t"
  136568. #else
  136569. "mul r7, r6\n\t"
  136570. #endif
  136571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136572. "adds r3, r3, r7\n\t"
  136573. #else
  136574. "add r3, r3, r7\n\t"
  136575. #endif
  136576. #ifdef WOLFSSL_KEIL
  136577. "adcs r4, r4, %[r]\n\t"
  136578. #elif defined(__clang__)
  136579. "adcs r4, %[r]\n\t"
  136580. #else
  136581. "adc r4, %[r]\n\t"
  136582. #endif
  136583. "uxth r7, %[b]\n\t"
  136584. #ifdef WOLFSSL_KEIL
  136585. "muls r6, r7, r6\n\t"
  136586. #elif defined(__clang__)
  136587. "muls r6, r7\n\t"
  136588. #else
  136589. "mul r6, r7\n\t"
  136590. #endif
  136591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136592. "lsrs r7, r6, #16\n\t"
  136593. #else
  136594. "lsr r7, r6, #16\n\t"
  136595. #endif
  136596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136597. "lsls r6, r6, #16\n\t"
  136598. #else
  136599. "lsl r6, r6, #16\n\t"
  136600. #endif
  136601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136602. "adds r5, r5, r6\n\t"
  136603. #else
  136604. "add r5, r5, r6\n\t"
  136605. #endif
  136606. #ifdef WOLFSSL_KEIL
  136607. "adcs r3, r3, r7\n\t"
  136608. #elif defined(__clang__)
  136609. "adcs r3, r7\n\t"
  136610. #else
  136611. "adc r3, r7\n\t"
  136612. #endif
  136613. #ifdef WOLFSSL_KEIL
  136614. "adcs r4, r4, %[r]\n\t"
  136615. #elif defined(__clang__)
  136616. "adcs r4, %[r]\n\t"
  136617. #else
  136618. "adc r4, %[r]\n\t"
  136619. #endif
  136620. "# A[3] * B[2]\n\t"
  136621. "mov %[a], r9\n\t"
  136622. "mov %[b], r10\n\t"
  136623. "ldr %[a], [%[a], #12]\n\t"
  136624. "ldr %[b], [%[b], #8]\n\t"
  136625. "uxth r6, %[a]\n\t"
  136626. "uxth r7, %[b]\n\t"
  136627. #ifdef WOLFSSL_KEIL
  136628. "muls r7, r6, r7\n\t"
  136629. #elif defined(__clang__)
  136630. "muls r7, r6\n\t"
  136631. #else
  136632. "mul r7, r6\n\t"
  136633. #endif
  136634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136635. "adds r5, r5, r7\n\t"
  136636. #else
  136637. "add r5, r5, r7\n\t"
  136638. #endif
  136639. #ifdef WOLFSSL_KEIL
  136640. "adcs r3, r3, %[r]\n\t"
  136641. #elif defined(__clang__)
  136642. "adcs r3, %[r]\n\t"
  136643. #else
  136644. "adc r3, %[r]\n\t"
  136645. #endif
  136646. #ifdef WOLFSSL_KEIL
  136647. "adcs r4, r4, %[r]\n\t"
  136648. #elif defined(__clang__)
  136649. "adcs r4, %[r]\n\t"
  136650. #else
  136651. "adc r4, %[r]\n\t"
  136652. #endif
  136653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136654. "lsrs r7, %[b], #16\n\t"
  136655. #else
  136656. "lsr r7, %[b], #16\n\t"
  136657. #endif
  136658. #ifdef WOLFSSL_KEIL
  136659. "muls r6, r7, r6\n\t"
  136660. #elif defined(__clang__)
  136661. "muls r6, r7\n\t"
  136662. #else
  136663. "mul r6, r7\n\t"
  136664. #endif
  136665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136666. "lsrs r7, r6, #16\n\t"
  136667. #else
  136668. "lsr r7, r6, #16\n\t"
  136669. #endif
  136670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136671. "lsls r6, r6, #16\n\t"
  136672. #else
  136673. "lsl r6, r6, #16\n\t"
  136674. #endif
  136675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136676. "adds r5, r5, r6\n\t"
  136677. #else
  136678. "add r5, r5, r6\n\t"
  136679. #endif
  136680. #ifdef WOLFSSL_KEIL
  136681. "adcs r3, r3, r7\n\t"
  136682. #elif defined(__clang__)
  136683. "adcs r3, r7\n\t"
  136684. #else
  136685. "adc r3, r7\n\t"
  136686. #endif
  136687. #ifdef WOLFSSL_KEIL
  136688. "adcs r4, r4, %[r]\n\t"
  136689. #elif defined(__clang__)
  136690. "adcs r4, %[r]\n\t"
  136691. #else
  136692. "adc r4, %[r]\n\t"
  136693. #endif
  136694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136695. "lsrs r6, %[a], #16\n\t"
  136696. #else
  136697. "lsr r6, %[a], #16\n\t"
  136698. #endif
  136699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136700. "lsrs r7, %[b], #16\n\t"
  136701. #else
  136702. "lsr r7, %[b], #16\n\t"
  136703. #endif
  136704. #ifdef WOLFSSL_KEIL
  136705. "muls r7, r6, r7\n\t"
  136706. #elif defined(__clang__)
  136707. "muls r7, r6\n\t"
  136708. #else
  136709. "mul r7, r6\n\t"
  136710. #endif
  136711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136712. "adds r3, r3, r7\n\t"
  136713. #else
  136714. "add r3, r3, r7\n\t"
  136715. #endif
  136716. #ifdef WOLFSSL_KEIL
  136717. "adcs r4, r4, %[r]\n\t"
  136718. #elif defined(__clang__)
  136719. "adcs r4, %[r]\n\t"
  136720. #else
  136721. "adc r4, %[r]\n\t"
  136722. #endif
  136723. "uxth r7, %[b]\n\t"
  136724. #ifdef WOLFSSL_KEIL
  136725. "muls r6, r7, r6\n\t"
  136726. #elif defined(__clang__)
  136727. "muls r6, r7\n\t"
  136728. #else
  136729. "mul r6, r7\n\t"
  136730. #endif
  136731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136732. "lsrs r7, r6, #16\n\t"
  136733. #else
  136734. "lsr r7, r6, #16\n\t"
  136735. #endif
  136736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136737. "lsls r6, r6, #16\n\t"
  136738. #else
  136739. "lsl r6, r6, #16\n\t"
  136740. #endif
  136741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136742. "adds r5, r5, r6\n\t"
  136743. #else
  136744. "add r5, r5, r6\n\t"
  136745. #endif
  136746. #ifdef WOLFSSL_KEIL
  136747. "adcs r3, r3, r7\n\t"
  136748. #elif defined(__clang__)
  136749. "adcs r3, r7\n\t"
  136750. #else
  136751. "adc r3, r7\n\t"
  136752. #endif
  136753. #ifdef WOLFSSL_KEIL
  136754. "adcs r4, r4, %[r]\n\t"
  136755. #elif defined(__clang__)
  136756. "adcs r4, %[r]\n\t"
  136757. #else
  136758. "adc r4, %[r]\n\t"
  136759. #endif
  136760. "# A[4] * B[1]\n\t"
  136761. "mov %[a], r9\n\t"
  136762. "mov %[b], r10\n\t"
  136763. "ldr %[a], [%[a], #16]\n\t"
  136764. "ldr %[b], [%[b], #4]\n\t"
  136765. "uxth r6, %[a]\n\t"
  136766. "uxth r7, %[b]\n\t"
  136767. #ifdef WOLFSSL_KEIL
  136768. "muls r7, r6, r7\n\t"
  136769. #elif defined(__clang__)
  136770. "muls r7, r6\n\t"
  136771. #else
  136772. "mul r7, r6\n\t"
  136773. #endif
  136774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136775. "adds r5, r5, r7\n\t"
  136776. #else
  136777. "add r5, r5, r7\n\t"
  136778. #endif
  136779. #ifdef WOLFSSL_KEIL
  136780. "adcs r3, r3, %[r]\n\t"
  136781. #elif defined(__clang__)
  136782. "adcs r3, %[r]\n\t"
  136783. #else
  136784. "adc r3, %[r]\n\t"
  136785. #endif
  136786. #ifdef WOLFSSL_KEIL
  136787. "adcs r4, r4, %[r]\n\t"
  136788. #elif defined(__clang__)
  136789. "adcs r4, %[r]\n\t"
  136790. #else
  136791. "adc r4, %[r]\n\t"
  136792. #endif
  136793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136794. "lsrs r7, %[b], #16\n\t"
  136795. #else
  136796. "lsr r7, %[b], #16\n\t"
  136797. #endif
  136798. #ifdef WOLFSSL_KEIL
  136799. "muls r6, r7, r6\n\t"
  136800. #elif defined(__clang__)
  136801. "muls r6, r7\n\t"
  136802. #else
  136803. "mul r6, r7\n\t"
  136804. #endif
  136805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136806. "lsrs r7, r6, #16\n\t"
  136807. #else
  136808. "lsr r7, r6, #16\n\t"
  136809. #endif
  136810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136811. "lsls r6, r6, #16\n\t"
  136812. #else
  136813. "lsl r6, r6, #16\n\t"
  136814. #endif
  136815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136816. "adds r5, r5, r6\n\t"
  136817. #else
  136818. "add r5, r5, r6\n\t"
  136819. #endif
  136820. #ifdef WOLFSSL_KEIL
  136821. "adcs r3, r3, r7\n\t"
  136822. #elif defined(__clang__)
  136823. "adcs r3, r7\n\t"
  136824. #else
  136825. "adc r3, r7\n\t"
  136826. #endif
  136827. #ifdef WOLFSSL_KEIL
  136828. "adcs r4, r4, %[r]\n\t"
  136829. #elif defined(__clang__)
  136830. "adcs r4, %[r]\n\t"
  136831. #else
  136832. "adc r4, %[r]\n\t"
  136833. #endif
  136834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136835. "lsrs r6, %[a], #16\n\t"
  136836. #else
  136837. "lsr r6, %[a], #16\n\t"
  136838. #endif
  136839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136840. "lsrs r7, %[b], #16\n\t"
  136841. #else
  136842. "lsr r7, %[b], #16\n\t"
  136843. #endif
  136844. #ifdef WOLFSSL_KEIL
  136845. "muls r7, r6, r7\n\t"
  136846. #elif defined(__clang__)
  136847. "muls r7, r6\n\t"
  136848. #else
  136849. "mul r7, r6\n\t"
  136850. #endif
  136851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136852. "adds r3, r3, r7\n\t"
  136853. #else
  136854. "add r3, r3, r7\n\t"
  136855. #endif
  136856. #ifdef WOLFSSL_KEIL
  136857. "adcs r4, r4, %[r]\n\t"
  136858. #elif defined(__clang__)
  136859. "adcs r4, %[r]\n\t"
  136860. #else
  136861. "adc r4, %[r]\n\t"
  136862. #endif
  136863. "uxth r7, %[b]\n\t"
  136864. #ifdef WOLFSSL_KEIL
  136865. "muls r6, r7, r6\n\t"
  136866. #elif defined(__clang__)
  136867. "muls r6, r7\n\t"
  136868. #else
  136869. "mul r6, r7\n\t"
  136870. #endif
  136871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136872. "lsrs r7, r6, #16\n\t"
  136873. #else
  136874. "lsr r7, r6, #16\n\t"
  136875. #endif
  136876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136877. "lsls r6, r6, #16\n\t"
  136878. #else
  136879. "lsl r6, r6, #16\n\t"
  136880. #endif
  136881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136882. "adds r5, r5, r6\n\t"
  136883. #else
  136884. "add r5, r5, r6\n\t"
  136885. #endif
  136886. #ifdef WOLFSSL_KEIL
  136887. "adcs r3, r3, r7\n\t"
  136888. #elif defined(__clang__)
  136889. "adcs r3, r7\n\t"
  136890. #else
  136891. "adc r3, r7\n\t"
  136892. #endif
  136893. #ifdef WOLFSSL_KEIL
  136894. "adcs r4, r4, %[r]\n\t"
  136895. #elif defined(__clang__)
  136896. "adcs r4, %[r]\n\t"
  136897. #else
  136898. "adc r4, %[r]\n\t"
  136899. #endif
  136900. "# A[5] * B[0]\n\t"
  136901. "mov %[a], r9\n\t"
  136902. "mov %[b], r10\n\t"
  136903. "ldr %[a], [%[a], #20]\n\t"
  136904. "ldr %[b], [%[b]]\n\t"
  136905. "uxth r6, %[a]\n\t"
  136906. "uxth r7, %[b]\n\t"
  136907. #ifdef WOLFSSL_KEIL
  136908. "muls r7, r6, r7\n\t"
  136909. #elif defined(__clang__)
  136910. "muls r7, r6\n\t"
  136911. #else
  136912. "mul r7, r6\n\t"
  136913. #endif
  136914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136915. "adds r5, r5, r7\n\t"
  136916. #else
  136917. "add r5, r5, r7\n\t"
  136918. #endif
  136919. #ifdef WOLFSSL_KEIL
  136920. "adcs r3, r3, %[r]\n\t"
  136921. #elif defined(__clang__)
  136922. "adcs r3, %[r]\n\t"
  136923. #else
  136924. "adc r3, %[r]\n\t"
  136925. #endif
  136926. #ifdef WOLFSSL_KEIL
  136927. "adcs r4, r4, %[r]\n\t"
  136928. #elif defined(__clang__)
  136929. "adcs r4, %[r]\n\t"
  136930. #else
  136931. "adc r4, %[r]\n\t"
  136932. #endif
  136933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136934. "lsrs r7, %[b], #16\n\t"
  136935. #else
  136936. "lsr r7, %[b], #16\n\t"
  136937. #endif
  136938. #ifdef WOLFSSL_KEIL
  136939. "muls r6, r7, r6\n\t"
  136940. #elif defined(__clang__)
  136941. "muls r6, r7\n\t"
  136942. #else
  136943. "mul r6, r7\n\t"
  136944. #endif
  136945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136946. "lsrs r7, r6, #16\n\t"
  136947. #else
  136948. "lsr r7, r6, #16\n\t"
  136949. #endif
  136950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136951. "lsls r6, r6, #16\n\t"
  136952. #else
  136953. "lsl r6, r6, #16\n\t"
  136954. #endif
  136955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136956. "adds r5, r5, r6\n\t"
  136957. #else
  136958. "add r5, r5, r6\n\t"
  136959. #endif
  136960. #ifdef WOLFSSL_KEIL
  136961. "adcs r3, r3, r7\n\t"
  136962. #elif defined(__clang__)
  136963. "adcs r3, r7\n\t"
  136964. #else
  136965. "adc r3, r7\n\t"
  136966. #endif
  136967. #ifdef WOLFSSL_KEIL
  136968. "adcs r4, r4, %[r]\n\t"
  136969. #elif defined(__clang__)
  136970. "adcs r4, %[r]\n\t"
  136971. #else
  136972. "adc r4, %[r]\n\t"
  136973. #endif
  136974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136975. "lsrs r6, %[a], #16\n\t"
  136976. #else
  136977. "lsr r6, %[a], #16\n\t"
  136978. #endif
  136979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136980. "lsrs r7, %[b], #16\n\t"
  136981. #else
  136982. "lsr r7, %[b], #16\n\t"
  136983. #endif
  136984. #ifdef WOLFSSL_KEIL
  136985. "muls r7, r6, r7\n\t"
  136986. #elif defined(__clang__)
  136987. "muls r7, r6\n\t"
  136988. #else
  136989. "mul r7, r6\n\t"
  136990. #endif
  136991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  136992. "adds r3, r3, r7\n\t"
  136993. #else
  136994. "add r3, r3, r7\n\t"
  136995. #endif
  136996. #ifdef WOLFSSL_KEIL
  136997. "adcs r4, r4, %[r]\n\t"
  136998. #elif defined(__clang__)
  136999. "adcs r4, %[r]\n\t"
  137000. #else
  137001. "adc r4, %[r]\n\t"
  137002. #endif
  137003. "uxth r7, %[b]\n\t"
  137004. #ifdef WOLFSSL_KEIL
  137005. "muls r6, r7, r6\n\t"
  137006. #elif defined(__clang__)
  137007. "muls r6, r7\n\t"
  137008. #else
  137009. "mul r6, r7\n\t"
  137010. #endif
  137011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137012. "lsrs r7, r6, #16\n\t"
  137013. #else
  137014. "lsr r7, r6, #16\n\t"
  137015. #endif
  137016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137017. "lsls r6, r6, #16\n\t"
  137018. #else
  137019. "lsl r6, r6, #16\n\t"
  137020. #endif
  137021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137022. "adds r5, r5, r6\n\t"
  137023. #else
  137024. "add r5, r5, r6\n\t"
  137025. #endif
  137026. #ifdef WOLFSSL_KEIL
  137027. "adcs r3, r3, r7\n\t"
  137028. #elif defined(__clang__)
  137029. "adcs r3, r7\n\t"
  137030. #else
  137031. "adc r3, r7\n\t"
  137032. #endif
  137033. #ifdef WOLFSSL_KEIL
  137034. "adcs r4, r4, %[r]\n\t"
  137035. #elif defined(__clang__)
  137036. "adcs r4, %[r]\n\t"
  137037. #else
  137038. "adc r4, %[r]\n\t"
  137039. #endif
  137040. "str r5, [sp, #20]\n\t"
  137041. "# A[6] * B[0]\n\t"
  137042. "movs r5, #0\n\t"
  137043. "mov %[a], r9\n\t"
  137044. "mov %[b], r10\n\t"
  137045. "ldr %[a], [%[a], #24]\n\t"
  137046. "ldr %[b], [%[b]]\n\t"
  137047. "uxth r6, %[a]\n\t"
  137048. "uxth r7, %[b]\n\t"
  137049. #ifdef WOLFSSL_KEIL
  137050. "muls r7, r6, r7\n\t"
  137051. #elif defined(__clang__)
  137052. "muls r7, r6\n\t"
  137053. #else
  137054. "mul r7, r6\n\t"
  137055. #endif
  137056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137057. "adds r3, r3, r7\n\t"
  137058. #else
  137059. "add r3, r3, r7\n\t"
  137060. #endif
  137061. #ifdef WOLFSSL_KEIL
  137062. "adcs r4, r4, %[r]\n\t"
  137063. #elif defined(__clang__)
  137064. "adcs r4, %[r]\n\t"
  137065. #else
  137066. "adc r4, %[r]\n\t"
  137067. #endif
  137068. #ifdef WOLFSSL_KEIL
  137069. "adcs r5, r5, %[r]\n\t"
  137070. #elif defined(__clang__)
  137071. "adcs r5, %[r]\n\t"
  137072. #else
  137073. "adc r5, %[r]\n\t"
  137074. #endif
  137075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137076. "lsrs r7, %[b], #16\n\t"
  137077. #else
  137078. "lsr r7, %[b], #16\n\t"
  137079. #endif
  137080. #ifdef WOLFSSL_KEIL
  137081. "muls r6, r7, r6\n\t"
  137082. #elif defined(__clang__)
  137083. "muls r6, r7\n\t"
  137084. #else
  137085. "mul r6, r7\n\t"
  137086. #endif
  137087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137088. "lsrs r7, r6, #16\n\t"
  137089. #else
  137090. "lsr r7, r6, #16\n\t"
  137091. #endif
  137092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137093. "lsls r6, r6, #16\n\t"
  137094. #else
  137095. "lsl r6, r6, #16\n\t"
  137096. #endif
  137097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137098. "adds r3, r3, r6\n\t"
  137099. #else
  137100. "add r3, r3, r6\n\t"
  137101. #endif
  137102. #ifdef WOLFSSL_KEIL
  137103. "adcs r4, r4, r7\n\t"
  137104. #elif defined(__clang__)
  137105. "adcs r4, r7\n\t"
  137106. #else
  137107. "adc r4, r7\n\t"
  137108. #endif
  137109. #ifdef WOLFSSL_KEIL
  137110. "adcs r5, r5, %[r]\n\t"
  137111. #elif defined(__clang__)
  137112. "adcs r5, %[r]\n\t"
  137113. #else
  137114. "adc r5, %[r]\n\t"
  137115. #endif
  137116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137117. "lsrs r6, %[a], #16\n\t"
  137118. #else
  137119. "lsr r6, %[a], #16\n\t"
  137120. #endif
  137121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137122. "lsrs r7, %[b], #16\n\t"
  137123. #else
  137124. "lsr r7, %[b], #16\n\t"
  137125. #endif
  137126. #ifdef WOLFSSL_KEIL
  137127. "muls r7, r6, r7\n\t"
  137128. #elif defined(__clang__)
  137129. "muls r7, r6\n\t"
  137130. #else
  137131. "mul r7, r6\n\t"
  137132. #endif
  137133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137134. "adds r4, r4, r7\n\t"
  137135. #else
  137136. "add r4, r4, r7\n\t"
  137137. #endif
  137138. #ifdef WOLFSSL_KEIL
  137139. "adcs r5, r5, %[r]\n\t"
  137140. #elif defined(__clang__)
  137141. "adcs r5, %[r]\n\t"
  137142. #else
  137143. "adc r5, %[r]\n\t"
  137144. #endif
  137145. "uxth r7, %[b]\n\t"
  137146. #ifdef WOLFSSL_KEIL
  137147. "muls r6, r7, r6\n\t"
  137148. #elif defined(__clang__)
  137149. "muls r6, r7\n\t"
  137150. #else
  137151. "mul r6, r7\n\t"
  137152. #endif
  137153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137154. "lsrs r7, r6, #16\n\t"
  137155. #else
  137156. "lsr r7, r6, #16\n\t"
  137157. #endif
  137158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137159. "lsls r6, r6, #16\n\t"
  137160. #else
  137161. "lsl r6, r6, #16\n\t"
  137162. #endif
  137163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137164. "adds r3, r3, r6\n\t"
  137165. #else
  137166. "add r3, r3, r6\n\t"
  137167. #endif
  137168. #ifdef WOLFSSL_KEIL
  137169. "adcs r4, r4, r7\n\t"
  137170. #elif defined(__clang__)
  137171. "adcs r4, r7\n\t"
  137172. #else
  137173. "adc r4, r7\n\t"
  137174. #endif
  137175. #ifdef WOLFSSL_KEIL
  137176. "adcs r5, r5, %[r]\n\t"
  137177. #elif defined(__clang__)
  137178. "adcs r5, %[r]\n\t"
  137179. #else
  137180. "adc r5, %[r]\n\t"
  137181. #endif
  137182. "# A[5] * B[1]\n\t"
  137183. "mov %[a], r9\n\t"
  137184. "mov %[b], r10\n\t"
  137185. "ldr %[a], [%[a], #20]\n\t"
  137186. "ldr %[b], [%[b], #4]\n\t"
  137187. "uxth r6, %[a]\n\t"
  137188. "uxth r7, %[b]\n\t"
  137189. #ifdef WOLFSSL_KEIL
  137190. "muls r7, r6, r7\n\t"
  137191. #elif defined(__clang__)
  137192. "muls r7, r6\n\t"
  137193. #else
  137194. "mul r7, r6\n\t"
  137195. #endif
  137196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137197. "adds r3, r3, r7\n\t"
  137198. #else
  137199. "add r3, r3, r7\n\t"
  137200. #endif
  137201. #ifdef WOLFSSL_KEIL
  137202. "adcs r4, r4, %[r]\n\t"
  137203. #elif defined(__clang__)
  137204. "adcs r4, %[r]\n\t"
  137205. #else
  137206. "adc r4, %[r]\n\t"
  137207. #endif
  137208. #ifdef WOLFSSL_KEIL
  137209. "adcs r5, r5, %[r]\n\t"
  137210. #elif defined(__clang__)
  137211. "adcs r5, %[r]\n\t"
  137212. #else
  137213. "adc r5, %[r]\n\t"
  137214. #endif
  137215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137216. "lsrs r7, %[b], #16\n\t"
  137217. #else
  137218. "lsr r7, %[b], #16\n\t"
  137219. #endif
  137220. #ifdef WOLFSSL_KEIL
  137221. "muls r6, r7, r6\n\t"
  137222. #elif defined(__clang__)
  137223. "muls r6, r7\n\t"
  137224. #else
  137225. "mul r6, r7\n\t"
  137226. #endif
  137227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137228. "lsrs r7, r6, #16\n\t"
  137229. #else
  137230. "lsr r7, r6, #16\n\t"
  137231. #endif
  137232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137233. "lsls r6, r6, #16\n\t"
  137234. #else
  137235. "lsl r6, r6, #16\n\t"
  137236. #endif
  137237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137238. "adds r3, r3, r6\n\t"
  137239. #else
  137240. "add r3, r3, r6\n\t"
  137241. #endif
  137242. #ifdef WOLFSSL_KEIL
  137243. "adcs r4, r4, r7\n\t"
  137244. #elif defined(__clang__)
  137245. "adcs r4, r7\n\t"
  137246. #else
  137247. "adc r4, r7\n\t"
  137248. #endif
  137249. #ifdef WOLFSSL_KEIL
  137250. "adcs r5, r5, %[r]\n\t"
  137251. #elif defined(__clang__)
  137252. "adcs r5, %[r]\n\t"
  137253. #else
  137254. "adc r5, %[r]\n\t"
  137255. #endif
  137256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137257. "lsrs r6, %[a], #16\n\t"
  137258. #else
  137259. "lsr r6, %[a], #16\n\t"
  137260. #endif
  137261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137262. "lsrs r7, %[b], #16\n\t"
  137263. #else
  137264. "lsr r7, %[b], #16\n\t"
  137265. #endif
  137266. #ifdef WOLFSSL_KEIL
  137267. "muls r7, r6, r7\n\t"
  137268. #elif defined(__clang__)
  137269. "muls r7, r6\n\t"
  137270. #else
  137271. "mul r7, r6\n\t"
  137272. #endif
  137273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137274. "adds r4, r4, r7\n\t"
  137275. #else
  137276. "add r4, r4, r7\n\t"
  137277. #endif
  137278. #ifdef WOLFSSL_KEIL
  137279. "adcs r5, r5, %[r]\n\t"
  137280. #elif defined(__clang__)
  137281. "adcs r5, %[r]\n\t"
  137282. #else
  137283. "adc r5, %[r]\n\t"
  137284. #endif
  137285. "uxth r7, %[b]\n\t"
  137286. #ifdef WOLFSSL_KEIL
  137287. "muls r6, r7, r6\n\t"
  137288. #elif defined(__clang__)
  137289. "muls r6, r7\n\t"
  137290. #else
  137291. "mul r6, r7\n\t"
  137292. #endif
  137293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137294. "lsrs r7, r6, #16\n\t"
  137295. #else
  137296. "lsr r7, r6, #16\n\t"
  137297. #endif
  137298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137299. "lsls r6, r6, #16\n\t"
  137300. #else
  137301. "lsl r6, r6, #16\n\t"
  137302. #endif
  137303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137304. "adds r3, r3, r6\n\t"
  137305. #else
  137306. "add r3, r3, r6\n\t"
  137307. #endif
  137308. #ifdef WOLFSSL_KEIL
  137309. "adcs r4, r4, r7\n\t"
  137310. #elif defined(__clang__)
  137311. "adcs r4, r7\n\t"
  137312. #else
  137313. "adc r4, r7\n\t"
  137314. #endif
  137315. #ifdef WOLFSSL_KEIL
  137316. "adcs r5, r5, %[r]\n\t"
  137317. #elif defined(__clang__)
  137318. "adcs r5, %[r]\n\t"
  137319. #else
  137320. "adc r5, %[r]\n\t"
  137321. #endif
  137322. "# A[4] * B[2]\n\t"
  137323. "mov %[a], r9\n\t"
  137324. "mov %[b], r10\n\t"
  137325. "ldr %[a], [%[a], #16]\n\t"
  137326. "ldr %[b], [%[b], #8]\n\t"
  137327. "uxth r6, %[a]\n\t"
  137328. "uxth r7, %[b]\n\t"
  137329. #ifdef WOLFSSL_KEIL
  137330. "muls r7, r6, r7\n\t"
  137331. #elif defined(__clang__)
  137332. "muls r7, r6\n\t"
  137333. #else
  137334. "mul r7, r6\n\t"
  137335. #endif
  137336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137337. "adds r3, r3, r7\n\t"
  137338. #else
  137339. "add r3, r3, r7\n\t"
  137340. #endif
  137341. #ifdef WOLFSSL_KEIL
  137342. "adcs r4, r4, %[r]\n\t"
  137343. #elif defined(__clang__)
  137344. "adcs r4, %[r]\n\t"
  137345. #else
  137346. "adc r4, %[r]\n\t"
  137347. #endif
  137348. #ifdef WOLFSSL_KEIL
  137349. "adcs r5, r5, %[r]\n\t"
  137350. #elif defined(__clang__)
  137351. "adcs r5, %[r]\n\t"
  137352. #else
  137353. "adc r5, %[r]\n\t"
  137354. #endif
  137355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137356. "lsrs r7, %[b], #16\n\t"
  137357. #else
  137358. "lsr r7, %[b], #16\n\t"
  137359. #endif
  137360. #ifdef WOLFSSL_KEIL
  137361. "muls r6, r7, r6\n\t"
  137362. #elif defined(__clang__)
  137363. "muls r6, r7\n\t"
  137364. #else
  137365. "mul r6, r7\n\t"
  137366. #endif
  137367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137368. "lsrs r7, r6, #16\n\t"
  137369. #else
  137370. "lsr r7, r6, #16\n\t"
  137371. #endif
  137372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137373. "lsls r6, r6, #16\n\t"
  137374. #else
  137375. "lsl r6, r6, #16\n\t"
  137376. #endif
  137377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137378. "adds r3, r3, r6\n\t"
  137379. #else
  137380. "add r3, r3, r6\n\t"
  137381. #endif
  137382. #ifdef WOLFSSL_KEIL
  137383. "adcs r4, r4, r7\n\t"
  137384. #elif defined(__clang__)
  137385. "adcs r4, r7\n\t"
  137386. #else
  137387. "adc r4, r7\n\t"
  137388. #endif
  137389. #ifdef WOLFSSL_KEIL
  137390. "adcs r5, r5, %[r]\n\t"
  137391. #elif defined(__clang__)
  137392. "adcs r5, %[r]\n\t"
  137393. #else
  137394. "adc r5, %[r]\n\t"
  137395. #endif
  137396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137397. "lsrs r6, %[a], #16\n\t"
  137398. #else
  137399. "lsr r6, %[a], #16\n\t"
  137400. #endif
  137401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137402. "lsrs r7, %[b], #16\n\t"
  137403. #else
  137404. "lsr r7, %[b], #16\n\t"
  137405. #endif
  137406. #ifdef WOLFSSL_KEIL
  137407. "muls r7, r6, r7\n\t"
  137408. #elif defined(__clang__)
  137409. "muls r7, r6\n\t"
  137410. #else
  137411. "mul r7, r6\n\t"
  137412. #endif
  137413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137414. "adds r4, r4, r7\n\t"
  137415. #else
  137416. "add r4, r4, r7\n\t"
  137417. #endif
  137418. #ifdef WOLFSSL_KEIL
  137419. "adcs r5, r5, %[r]\n\t"
  137420. #elif defined(__clang__)
  137421. "adcs r5, %[r]\n\t"
  137422. #else
  137423. "adc r5, %[r]\n\t"
  137424. #endif
  137425. "uxth r7, %[b]\n\t"
  137426. #ifdef WOLFSSL_KEIL
  137427. "muls r6, r7, r6\n\t"
  137428. #elif defined(__clang__)
  137429. "muls r6, r7\n\t"
  137430. #else
  137431. "mul r6, r7\n\t"
  137432. #endif
  137433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137434. "lsrs r7, r6, #16\n\t"
  137435. #else
  137436. "lsr r7, r6, #16\n\t"
  137437. #endif
  137438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137439. "lsls r6, r6, #16\n\t"
  137440. #else
  137441. "lsl r6, r6, #16\n\t"
  137442. #endif
  137443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137444. "adds r3, r3, r6\n\t"
  137445. #else
  137446. "add r3, r3, r6\n\t"
  137447. #endif
  137448. #ifdef WOLFSSL_KEIL
  137449. "adcs r4, r4, r7\n\t"
  137450. #elif defined(__clang__)
  137451. "adcs r4, r7\n\t"
  137452. #else
  137453. "adc r4, r7\n\t"
  137454. #endif
  137455. #ifdef WOLFSSL_KEIL
  137456. "adcs r5, r5, %[r]\n\t"
  137457. #elif defined(__clang__)
  137458. "adcs r5, %[r]\n\t"
  137459. #else
  137460. "adc r5, %[r]\n\t"
  137461. #endif
  137462. "# A[3] * B[3]\n\t"
  137463. "mov %[a], r9\n\t"
  137464. "mov %[b], r10\n\t"
  137465. "ldr %[a], [%[a], #12]\n\t"
  137466. "ldr %[b], [%[b], #12]\n\t"
  137467. "uxth r6, %[a]\n\t"
  137468. "uxth r7, %[b]\n\t"
  137469. #ifdef WOLFSSL_KEIL
  137470. "muls r7, r6, r7\n\t"
  137471. #elif defined(__clang__)
  137472. "muls r7, r6\n\t"
  137473. #else
  137474. "mul r7, r6\n\t"
  137475. #endif
  137476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137477. "adds r3, r3, r7\n\t"
  137478. #else
  137479. "add r3, r3, r7\n\t"
  137480. #endif
  137481. #ifdef WOLFSSL_KEIL
  137482. "adcs r4, r4, %[r]\n\t"
  137483. #elif defined(__clang__)
  137484. "adcs r4, %[r]\n\t"
  137485. #else
  137486. "adc r4, %[r]\n\t"
  137487. #endif
  137488. #ifdef WOLFSSL_KEIL
  137489. "adcs r5, r5, %[r]\n\t"
  137490. #elif defined(__clang__)
  137491. "adcs r5, %[r]\n\t"
  137492. #else
  137493. "adc r5, %[r]\n\t"
  137494. #endif
  137495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137496. "lsrs r7, %[b], #16\n\t"
  137497. #else
  137498. "lsr r7, %[b], #16\n\t"
  137499. #endif
  137500. #ifdef WOLFSSL_KEIL
  137501. "muls r6, r7, r6\n\t"
  137502. #elif defined(__clang__)
  137503. "muls r6, r7\n\t"
  137504. #else
  137505. "mul r6, r7\n\t"
  137506. #endif
  137507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137508. "lsrs r7, r6, #16\n\t"
  137509. #else
  137510. "lsr r7, r6, #16\n\t"
  137511. #endif
  137512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137513. "lsls r6, r6, #16\n\t"
  137514. #else
  137515. "lsl r6, r6, #16\n\t"
  137516. #endif
  137517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137518. "adds r3, r3, r6\n\t"
  137519. #else
  137520. "add r3, r3, r6\n\t"
  137521. #endif
  137522. #ifdef WOLFSSL_KEIL
  137523. "adcs r4, r4, r7\n\t"
  137524. #elif defined(__clang__)
  137525. "adcs r4, r7\n\t"
  137526. #else
  137527. "adc r4, r7\n\t"
  137528. #endif
  137529. #ifdef WOLFSSL_KEIL
  137530. "adcs r5, r5, %[r]\n\t"
  137531. #elif defined(__clang__)
  137532. "adcs r5, %[r]\n\t"
  137533. #else
  137534. "adc r5, %[r]\n\t"
  137535. #endif
  137536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137537. "lsrs r6, %[a], #16\n\t"
  137538. #else
  137539. "lsr r6, %[a], #16\n\t"
  137540. #endif
  137541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137542. "lsrs r7, %[b], #16\n\t"
  137543. #else
  137544. "lsr r7, %[b], #16\n\t"
  137545. #endif
  137546. #ifdef WOLFSSL_KEIL
  137547. "muls r7, r6, r7\n\t"
  137548. #elif defined(__clang__)
  137549. "muls r7, r6\n\t"
  137550. #else
  137551. "mul r7, r6\n\t"
  137552. #endif
  137553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137554. "adds r4, r4, r7\n\t"
  137555. #else
  137556. "add r4, r4, r7\n\t"
  137557. #endif
  137558. #ifdef WOLFSSL_KEIL
  137559. "adcs r5, r5, %[r]\n\t"
  137560. #elif defined(__clang__)
  137561. "adcs r5, %[r]\n\t"
  137562. #else
  137563. "adc r5, %[r]\n\t"
  137564. #endif
  137565. "uxth r7, %[b]\n\t"
  137566. #ifdef WOLFSSL_KEIL
  137567. "muls r6, r7, r6\n\t"
  137568. #elif defined(__clang__)
  137569. "muls r6, r7\n\t"
  137570. #else
  137571. "mul r6, r7\n\t"
  137572. #endif
  137573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137574. "lsrs r7, r6, #16\n\t"
  137575. #else
  137576. "lsr r7, r6, #16\n\t"
  137577. #endif
  137578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137579. "lsls r6, r6, #16\n\t"
  137580. #else
  137581. "lsl r6, r6, #16\n\t"
  137582. #endif
  137583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137584. "adds r3, r3, r6\n\t"
  137585. #else
  137586. "add r3, r3, r6\n\t"
  137587. #endif
  137588. #ifdef WOLFSSL_KEIL
  137589. "adcs r4, r4, r7\n\t"
  137590. #elif defined(__clang__)
  137591. "adcs r4, r7\n\t"
  137592. #else
  137593. "adc r4, r7\n\t"
  137594. #endif
  137595. #ifdef WOLFSSL_KEIL
  137596. "adcs r5, r5, %[r]\n\t"
  137597. #elif defined(__clang__)
  137598. "adcs r5, %[r]\n\t"
  137599. #else
  137600. "adc r5, %[r]\n\t"
  137601. #endif
  137602. "# A[2] * B[4]\n\t"
  137603. "mov %[a], r9\n\t"
  137604. "mov %[b], r10\n\t"
  137605. "ldr %[a], [%[a], #8]\n\t"
  137606. "ldr %[b], [%[b], #16]\n\t"
  137607. "uxth r6, %[a]\n\t"
  137608. "uxth r7, %[b]\n\t"
  137609. #ifdef WOLFSSL_KEIL
  137610. "muls r7, r6, r7\n\t"
  137611. #elif defined(__clang__)
  137612. "muls r7, r6\n\t"
  137613. #else
  137614. "mul r7, r6\n\t"
  137615. #endif
  137616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137617. "adds r3, r3, r7\n\t"
  137618. #else
  137619. "add r3, r3, r7\n\t"
  137620. #endif
  137621. #ifdef WOLFSSL_KEIL
  137622. "adcs r4, r4, %[r]\n\t"
  137623. #elif defined(__clang__)
  137624. "adcs r4, %[r]\n\t"
  137625. #else
  137626. "adc r4, %[r]\n\t"
  137627. #endif
  137628. #ifdef WOLFSSL_KEIL
  137629. "adcs r5, r5, %[r]\n\t"
  137630. #elif defined(__clang__)
  137631. "adcs r5, %[r]\n\t"
  137632. #else
  137633. "adc r5, %[r]\n\t"
  137634. #endif
  137635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137636. "lsrs r7, %[b], #16\n\t"
  137637. #else
  137638. "lsr r7, %[b], #16\n\t"
  137639. #endif
  137640. #ifdef WOLFSSL_KEIL
  137641. "muls r6, r7, r6\n\t"
  137642. #elif defined(__clang__)
  137643. "muls r6, r7\n\t"
  137644. #else
  137645. "mul r6, r7\n\t"
  137646. #endif
  137647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137648. "lsrs r7, r6, #16\n\t"
  137649. #else
  137650. "lsr r7, r6, #16\n\t"
  137651. #endif
  137652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137653. "lsls r6, r6, #16\n\t"
  137654. #else
  137655. "lsl r6, r6, #16\n\t"
  137656. #endif
  137657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137658. "adds r3, r3, r6\n\t"
  137659. #else
  137660. "add r3, r3, r6\n\t"
  137661. #endif
  137662. #ifdef WOLFSSL_KEIL
  137663. "adcs r4, r4, r7\n\t"
  137664. #elif defined(__clang__)
  137665. "adcs r4, r7\n\t"
  137666. #else
  137667. "adc r4, r7\n\t"
  137668. #endif
  137669. #ifdef WOLFSSL_KEIL
  137670. "adcs r5, r5, %[r]\n\t"
  137671. #elif defined(__clang__)
  137672. "adcs r5, %[r]\n\t"
  137673. #else
  137674. "adc r5, %[r]\n\t"
  137675. #endif
  137676. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137677. "lsrs r6, %[a], #16\n\t"
  137678. #else
  137679. "lsr r6, %[a], #16\n\t"
  137680. #endif
  137681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137682. "lsrs r7, %[b], #16\n\t"
  137683. #else
  137684. "lsr r7, %[b], #16\n\t"
  137685. #endif
  137686. #ifdef WOLFSSL_KEIL
  137687. "muls r7, r6, r7\n\t"
  137688. #elif defined(__clang__)
  137689. "muls r7, r6\n\t"
  137690. #else
  137691. "mul r7, r6\n\t"
  137692. #endif
  137693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137694. "adds r4, r4, r7\n\t"
  137695. #else
  137696. "add r4, r4, r7\n\t"
  137697. #endif
  137698. #ifdef WOLFSSL_KEIL
  137699. "adcs r5, r5, %[r]\n\t"
  137700. #elif defined(__clang__)
  137701. "adcs r5, %[r]\n\t"
  137702. #else
  137703. "adc r5, %[r]\n\t"
  137704. #endif
  137705. "uxth r7, %[b]\n\t"
  137706. #ifdef WOLFSSL_KEIL
  137707. "muls r6, r7, r6\n\t"
  137708. #elif defined(__clang__)
  137709. "muls r6, r7\n\t"
  137710. #else
  137711. "mul r6, r7\n\t"
  137712. #endif
  137713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137714. "lsrs r7, r6, #16\n\t"
  137715. #else
  137716. "lsr r7, r6, #16\n\t"
  137717. #endif
  137718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137719. "lsls r6, r6, #16\n\t"
  137720. #else
  137721. "lsl r6, r6, #16\n\t"
  137722. #endif
  137723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137724. "adds r3, r3, r6\n\t"
  137725. #else
  137726. "add r3, r3, r6\n\t"
  137727. #endif
  137728. #ifdef WOLFSSL_KEIL
  137729. "adcs r4, r4, r7\n\t"
  137730. #elif defined(__clang__)
  137731. "adcs r4, r7\n\t"
  137732. #else
  137733. "adc r4, r7\n\t"
  137734. #endif
  137735. #ifdef WOLFSSL_KEIL
  137736. "adcs r5, r5, %[r]\n\t"
  137737. #elif defined(__clang__)
  137738. "adcs r5, %[r]\n\t"
  137739. #else
  137740. "adc r5, %[r]\n\t"
  137741. #endif
  137742. "# A[1] * B[5]\n\t"
  137743. "mov %[a], r9\n\t"
  137744. "mov %[b], r10\n\t"
  137745. "ldr %[a], [%[a], #4]\n\t"
  137746. "ldr %[b], [%[b], #20]\n\t"
  137747. "uxth r6, %[a]\n\t"
  137748. "uxth r7, %[b]\n\t"
  137749. #ifdef WOLFSSL_KEIL
  137750. "muls r7, r6, r7\n\t"
  137751. #elif defined(__clang__)
  137752. "muls r7, r6\n\t"
  137753. #else
  137754. "mul r7, r6\n\t"
  137755. #endif
  137756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137757. "adds r3, r3, r7\n\t"
  137758. #else
  137759. "add r3, r3, r7\n\t"
  137760. #endif
  137761. #ifdef WOLFSSL_KEIL
  137762. "adcs r4, r4, %[r]\n\t"
  137763. #elif defined(__clang__)
  137764. "adcs r4, %[r]\n\t"
  137765. #else
  137766. "adc r4, %[r]\n\t"
  137767. #endif
  137768. #ifdef WOLFSSL_KEIL
  137769. "adcs r5, r5, %[r]\n\t"
  137770. #elif defined(__clang__)
  137771. "adcs r5, %[r]\n\t"
  137772. #else
  137773. "adc r5, %[r]\n\t"
  137774. #endif
  137775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137776. "lsrs r7, %[b], #16\n\t"
  137777. #else
  137778. "lsr r7, %[b], #16\n\t"
  137779. #endif
  137780. #ifdef WOLFSSL_KEIL
  137781. "muls r6, r7, r6\n\t"
  137782. #elif defined(__clang__)
  137783. "muls r6, r7\n\t"
  137784. #else
  137785. "mul r6, r7\n\t"
  137786. #endif
  137787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137788. "lsrs r7, r6, #16\n\t"
  137789. #else
  137790. "lsr r7, r6, #16\n\t"
  137791. #endif
  137792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137793. "lsls r6, r6, #16\n\t"
  137794. #else
  137795. "lsl r6, r6, #16\n\t"
  137796. #endif
  137797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137798. "adds r3, r3, r6\n\t"
  137799. #else
  137800. "add r3, r3, r6\n\t"
  137801. #endif
  137802. #ifdef WOLFSSL_KEIL
  137803. "adcs r4, r4, r7\n\t"
  137804. #elif defined(__clang__)
  137805. "adcs r4, r7\n\t"
  137806. #else
  137807. "adc r4, r7\n\t"
  137808. #endif
  137809. #ifdef WOLFSSL_KEIL
  137810. "adcs r5, r5, %[r]\n\t"
  137811. #elif defined(__clang__)
  137812. "adcs r5, %[r]\n\t"
  137813. #else
  137814. "adc r5, %[r]\n\t"
  137815. #endif
  137816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137817. "lsrs r6, %[a], #16\n\t"
  137818. #else
  137819. "lsr r6, %[a], #16\n\t"
  137820. #endif
  137821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137822. "lsrs r7, %[b], #16\n\t"
  137823. #else
  137824. "lsr r7, %[b], #16\n\t"
  137825. #endif
  137826. #ifdef WOLFSSL_KEIL
  137827. "muls r7, r6, r7\n\t"
  137828. #elif defined(__clang__)
  137829. "muls r7, r6\n\t"
  137830. #else
  137831. "mul r7, r6\n\t"
  137832. #endif
  137833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137834. "adds r4, r4, r7\n\t"
  137835. #else
  137836. "add r4, r4, r7\n\t"
  137837. #endif
  137838. #ifdef WOLFSSL_KEIL
  137839. "adcs r5, r5, %[r]\n\t"
  137840. #elif defined(__clang__)
  137841. "adcs r5, %[r]\n\t"
  137842. #else
  137843. "adc r5, %[r]\n\t"
  137844. #endif
  137845. "uxth r7, %[b]\n\t"
  137846. #ifdef WOLFSSL_KEIL
  137847. "muls r6, r7, r6\n\t"
  137848. #elif defined(__clang__)
  137849. "muls r6, r7\n\t"
  137850. #else
  137851. "mul r6, r7\n\t"
  137852. #endif
  137853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137854. "lsrs r7, r6, #16\n\t"
  137855. #else
  137856. "lsr r7, r6, #16\n\t"
  137857. #endif
  137858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137859. "lsls r6, r6, #16\n\t"
  137860. #else
  137861. "lsl r6, r6, #16\n\t"
  137862. #endif
  137863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137864. "adds r3, r3, r6\n\t"
  137865. #else
  137866. "add r3, r3, r6\n\t"
  137867. #endif
  137868. #ifdef WOLFSSL_KEIL
  137869. "adcs r4, r4, r7\n\t"
  137870. #elif defined(__clang__)
  137871. "adcs r4, r7\n\t"
  137872. #else
  137873. "adc r4, r7\n\t"
  137874. #endif
  137875. #ifdef WOLFSSL_KEIL
  137876. "adcs r5, r5, %[r]\n\t"
  137877. #elif defined(__clang__)
  137878. "adcs r5, %[r]\n\t"
  137879. #else
  137880. "adc r5, %[r]\n\t"
  137881. #endif
  137882. "# A[0] * B[6]\n\t"
  137883. "mov %[a], r9\n\t"
  137884. "mov %[b], r10\n\t"
  137885. "ldr %[a], [%[a]]\n\t"
  137886. "ldr %[b], [%[b], #24]\n\t"
  137887. "uxth r6, %[a]\n\t"
  137888. "uxth r7, %[b]\n\t"
  137889. #ifdef WOLFSSL_KEIL
  137890. "muls r7, r6, r7\n\t"
  137891. #elif defined(__clang__)
  137892. "muls r7, r6\n\t"
  137893. #else
  137894. "mul r7, r6\n\t"
  137895. #endif
  137896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137897. "adds r3, r3, r7\n\t"
  137898. #else
  137899. "add r3, r3, r7\n\t"
  137900. #endif
  137901. #ifdef WOLFSSL_KEIL
  137902. "adcs r4, r4, %[r]\n\t"
  137903. #elif defined(__clang__)
  137904. "adcs r4, %[r]\n\t"
  137905. #else
  137906. "adc r4, %[r]\n\t"
  137907. #endif
  137908. #ifdef WOLFSSL_KEIL
  137909. "adcs r5, r5, %[r]\n\t"
  137910. #elif defined(__clang__)
  137911. "adcs r5, %[r]\n\t"
  137912. #else
  137913. "adc r5, %[r]\n\t"
  137914. #endif
  137915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137916. "lsrs r7, %[b], #16\n\t"
  137917. #else
  137918. "lsr r7, %[b], #16\n\t"
  137919. #endif
  137920. #ifdef WOLFSSL_KEIL
  137921. "muls r6, r7, r6\n\t"
  137922. #elif defined(__clang__)
  137923. "muls r6, r7\n\t"
  137924. #else
  137925. "mul r6, r7\n\t"
  137926. #endif
  137927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137928. "lsrs r7, r6, #16\n\t"
  137929. #else
  137930. "lsr r7, r6, #16\n\t"
  137931. #endif
  137932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137933. "lsls r6, r6, #16\n\t"
  137934. #else
  137935. "lsl r6, r6, #16\n\t"
  137936. #endif
  137937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137938. "adds r3, r3, r6\n\t"
  137939. #else
  137940. "add r3, r3, r6\n\t"
  137941. #endif
  137942. #ifdef WOLFSSL_KEIL
  137943. "adcs r4, r4, r7\n\t"
  137944. #elif defined(__clang__)
  137945. "adcs r4, r7\n\t"
  137946. #else
  137947. "adc r4, r7\n\t"
  137948. #endif
  137949. #ifdef WOLFSSL_KEIL
  137950. "adcs r5, r5, %[r]\n\t"
  137951. #elif defined(__clang__)
  137952. "adcs r5, %[r]\n\t"
  137953. #else
  137954. "adc r5, %[r]\n\t"
  137955. #endif
  137956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137957. "lsrs r6, %[a], #16\n\t"
  137958. #else
  137959. "lsr r6, %[a], #16\n\t"
  137960. #endif
  137961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137962. "lsrs r7, %[b], #16\n\t"
  137963. #else
  137964. "lsr r7, %[b], #16\n\t"
  137965. #endif
  137966. #ifdef WOLFSSL_KEIL
  137967. "muls r7, r6, r7\n\t"
  137968. #elif defined(__clang__)
  137969. "muls r7, r6\n\t"
  137970. #else
  137971. "mul r7, r6\n\t"
  137972. #endif
  137973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137974. "adds r4, r4, r7\n\t"
  137975. #else
  137976. "add r4, r4, r7\n\t"
  137977. #endif
  137978. #ifdef WOLFSSL_KEIL
  137979. "adcs r5, r5, %[r]\n\t"
  137980. #elif defined(__clang__)
  137981. "adcs r5, %[r]\n\t"
  137982. #else
  137983. "adc r5, %[r]\n\t"
  137984. #endif
  137985. "uxth r7, %[b]\n\t"
  137986. #ifdef WOLFSSL_KEIL
  137987. "muls r6, r7, r6\n\t"
  137988. #elif defined(__clang__)
  137989. "muls r6, r7\n\t"
  137990. #else
  137991. "mul r6, r7\n\t"
  137992. #endif
  137993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137994. "lsrs r7, r6, #16\n\t"
  137995. #else
  137996. "lsr r7, r6, #16\n\t"
  137997. #endif
  137998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  137999. "lsls r6, r6, #16\n\t"
  138000. #else
  138001. "lsl r6, r6, #16\n\t"
  138002. #endif
  138003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138004. "adds r3, r3, r6\n\t"
  138005. #else
  138006. "add r3, r3, r6\n\t"
  138007. #endif
  138008. #ifdef WOLFSSL_KEIL
  138009. "adcs r4, r4, r7\n\t"
  138010. #elif defined(__clang__)
  138011. "adcs r4, r7\n\t"
  138012. #else
  138013. "adc r4, r7\n\t"
  138014. #endif
  138015. #ifdef WOLFSSL_KEIL
  138016. "adcs r5, r5, %[r]\n\t"
  138017. #elif defined(__clang__)
  138018. "adcs r5, %[r]\n\t"
  138019. #else
  138020. "adc r5, %[r]\n\t"
  138021. #endif
  138022. "str r3, [sp, #24]\n\t"
  138023. "# A[0] * B[7]\n\t"
  138024. "movs r3, #0\n\t"
  138025. "mov %[a], r9\n\t"
  138026. "mov %[b], r10\n\t"
  138027. "ldr %[a], [%[a]]\n\t"
  138028. "ldr %[b], [%[b], #28]\n\t"
  138029. "uxth r6, %[a]\n\t"
  138030. "uxth r7, %[b]\n\t"
  138031. #ifdef WOLFSSL_KEIL
  138032. "muls r7, r6, r7\n\t"
  138033. #elif defined(__clang__)
  138034. "muls r7, r6\n\t"
  138035. #else
  138036. "mul r7, r6\n\t"
  138037. #endif
  138038. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138039. "adds r4, r4, r7\n\t"
  138040. #else
  138041. "add r4, r4, r7\n\t"
  138042. #endif
  138043. #ifdef WOLFSSL_KEIL
  138044. "adcs r5, r5, %[r]\n\t"
  138045. #elif defined(__clang__)
  138046. "adcs r5, %[r]\n\t"
  138047. #else
  138048. "adc r5, %[r]\n\t"
  138049. #endif
  138050. #ifdef WOLFSSL_KEIL
  138051. "adcs r3, r3, %[r]\n\t"
  138052. #elif defined(__clang__)
  138053. "adcs r3, %[r]\n\t"
  138054. #else
  138055. "adc r3, %[r]\n\t"
  138056. #endif
  138057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138058. "lsrs r7, %[b], #16\n\t"
  138059. #else
  138060. "lsr r7, %[b], #16\n\t"
  138061. #endif
  138062. #ifdef WOLFSSL_KEIL
  138063. "muls r6, r7, r6\n\t"
  138064. #elif defined(__clang__)
  138065. "muls r6, r7\n\t"
  138066. #else
  138067. "mul r6, r7\n\t"
  138068. #endif
  138069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138070. "lsrs r7, r6, #16\n\t"
  138071. #else
  138072. "lsr r7, r6, #16\n\t"
  138073. #endif
  138074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138075. "lsls r6, r6, #16\n\t"
  138076. #else
  138077. "lsl r6, r6, #16\n\t"
  138078. #endif
  138079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138080. "adds r4, r4, r6\n\t"
  138081. #else
  138082. "add r4, r4, r6\n\t"
  138083. #endif
  138084. #ifdef WOLFSSL_KEIL
  138085. "adcs r5, r5, r7\n\t"
  138086. #elif defined(__clang__)
  138087. "adcs r5, r7\n\t"
  138088. #else
  138089. "adc r5, r7\n\t"
  138090. #endif
  138091. #ifdef WOLFSSL_KEIL
  138092. "adcs r3, r3, %[r]\n\t"
  138093. #elif defined(__clang__)
  138094. "adcs r3, %[r]\n\t"
  138095. #else
  138096. "adc r3, %[r]\n\t"
  138097. #endif
  138098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138099. "lsrs r6, %[a], #16\n\t"
  138100. #else
  138101. "lsr r6, %[a], #16\n\t"
  138102. #endif
  138103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138104. "lsrs r7, %[b], #16\n\t"
  138105. #else
  138106. "lsr r7, %[b], #16\n\t"
  138107. #endif
  138108. #ifdef WOLFSSL_KEIL
  138109. "muls r7, r6, r7\n\t"
  138110. #elif defined(__clang__)
  138111. "muls r7, r6\n\t"
  138112. #else
  138113. "mul r7, r6\n\t"
  138114. #endif
  138115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138116. "adds r5, r5, r7\n\t"
  138117. #else
  138118. "add r5, r5, r7\n\t"
  138119. #endif
  138120. #ifdef WOLFSSL_KEIL
  138121. "adcs r3, r3, %[r]\n\t"
  138122. #elif defined(__clang__)
  138123. "adcs r3, %[r]\n\t"
  138124. #else
  138125. "adc r3, %[r]\n\t"
  138126. #endif
  138127. "uxth r7, %[b]\n\t"
  138128. #ifdef WOLFSSL_KEIL
  138129. "muls r6, r7, r6\n\t"
  138130. #elif defined(__clang__)
  138131. "muls r6, r7\n\t"
  138132. #else
  138133. "mul r6, r7\n\t"
  138134. #endif
  138135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138136. "lsrs r7, r6, #16\n\t"
  138137. #else
  138138. "lsr r7, r6, #16\n\t"
  138139. #endif
  138140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138141. "lsls r6, r6, #16\n\t"
  138142. #else
  138143. "lsl r6, r6, #16\n\t"
  138144. #endif
  138145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138146. "adds r4, r4, r6\n\t"
  138147. #else
  138148. "add r4, r4, r6\n\t"
  138149. #endif
  138150. #ifdef WOLFSSL_KEIL
  138151. "adcs r5, r5, r7\n\t"
  138152. #elif defined(__clang__)
  138153. "adcs r5, r7\n\t"
  138154. #else
  138155. "adc r5, r7\n\t"
  138156. #endif
  138157. #ifdef WOLFSSL_KEIL
  138158. "adcs r3, r3, %[r]\n\t"
  138159. #elif defined(__clang__)
  138160. "adcs r3, %[r]\n\t"
  138161. #else
  138162. "adc r3, %[r]\n\t"
  138163. #endif
  138164. "# A[1] * B[6]\n\t"
  138165. "mov %[a], r9\n\t"
  138166. "mov %[b], r10\n\t"
  138167. "ldr %[a], [%[a], #4]\n\t"
  138168. "ldr %[b], [%[b], #24]\n\t"
  138169. "uxth r6, %[a]\n\t"
  138170. "uxth r7, %[b]\n\t"
  138171. #ifdef WOLFSSL_KEIL
  138172. "muls r7, r6, r7\n\t"
  138173. #elif defined(__clang__)
  138174. "muls r7, r6\n\t"
  138175. #else
  138176. "mul r7, r6\n\t"
  138177. #endif
  138178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138179. "adds r4, r4, r7\n\t"
  138180. #else
  138181. "add r4, r4, r7\n\t"
  138182. #endif
  138183. #ifdef WOLFSSL_KEIL
  138184. "adcs r5, r5, %[r]\n\t"
  138185. #elif defined(__clang__)
  138186. "adcs r5, %[r]\n\t"
  138187. #else
  138188. "adc r5, %[r]\n\t"
  138189. #endif
  138190. #ifdef WOLFSSL_KEIL
  138191. "adcs r3, r3, %[r]\n\t"
  138192. #elif defined(__clang__)
  138193. "adcs r3, %[r]\n\t"
  138194. #else
  138195. "adc r3, %[r]\n\t"
  138196. #endif
  138197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138198. "lsrs r7, %[b], #16\n\t"
  138199. #else
  138200. "lsr r7, %[b], #16\n\t"
  138201. #endif
  138202. #ifdef WOLFSSL_KEIL
  138203. "muls r6, r7, r6\n\t"
  138204. #elif defined(__clang__)
  138205. "muls r6, r7\n\t"
  138206. #else
  138207. "mul r6, r7\n\t"
  138208. #endif
  138209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138210. "lsrs r7, r6, #16\n\t"
  138211. #else
  138212. "lsr r7, r6, #16\n\t"
  138213. #endif
  138214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138215. "lsls r6, r6, #16\n\t"
  138216. #else
  138217. "lsl r6, r6, #16\n\t"
  138218. #endif
  138219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138220. "adds r4, r4, r6\n\t"
  138221. #else
  138222. "add r4, r4, r6\n\t"
  138223. #endif
  138224. #ifdef WOLFSSL_KEIL
  138225. "adcs r5, r5, r7\n\t"
  138226. #elif defined(__clang__)
  138227. "adcs r5, r7\n\t"
  138228. #else
  138229. "adc r5, r7\n\t"
  138230. #endif
  138231. #ifdef WOLFSSL_KEIL
  138232. "adcs r3, r3, %[r]\n\t"
  138233. #elif defined(__clang__)
  138234. "adcs r3, %[r]\n\t"
  138235. #else
  138236. "adc r3, %[r]\n\t"
  138237. #endif
  138238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138239. "lsrs r6, %[a], #16\n\t"
  138240. #else
  138241. "lsr r6, %[a], #16\n\t"
  138242. #endif
  138243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138244. "lsrs r7, %[b], #16\n\t"
  138245. #else
  138246. "lsr r7, %[b], #16\n\t"
  138247. #endif
  138248. #ifdef WOLFSSL_KEIL
  138249. "muls r7, r6, r7\n\t"
  138250. #elif defined(__clang__)
  138251. "muls r7, r6\n\t"
  138252. #else
  138253. "mul r7, r6\n\t"
  138254. #endif
  138255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138256. "adds r5, r5, r7\n\t"
  138257. #else
  138258. "add r5, r5, r7\n\t"
  138259. #endif
  138260. #ifdef WOLFSSL_KEIL
  138261. "adcs r3, r3, %[r]\n\t"
  138262. #elif defined(__clang__)
  138263. "adcs r3, %[r]\n\t"
  138264. #else
  138265. "adc r3, %[r]\n\t"
  138266. #endif
  138267. "uxth r7, %[b]\n\t"
  138268. #ifdef WOLFSSL_KEIL
  138269. "muls r6, r7, r6\n\t"
  138270. #elif defined(__clang__)
  138271. "muls r6, r7\n\t"
  138272. #else
  138273. "mul r6, r7\n\t"
  138274. #endif
  138275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138276. "lsrs r7, r6, #16\n\t"
  138277. #else
  138278. "lsr r7, r6, #16\n\t"
  138279. #endif
  138280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138281. "lsls r6, r6, #16\n\t"
  138282. #else
  138283. "lsl r6, r6, #16\n\t"
  138284. #endif
  138285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138286. "adds r4, r4, r6\n\t"
  138287. #else
  138288. "add r4, r4, r6\n\t"
  138289. #endif
  138290. #ifdef WOLFSSL_KEIL
  138291. "adcs r5, r5, r7\n\t"
  138292. #elif defined(__clang__)
  138293. "adcs r5, r7\n\t"
  138294. #else
  138295. "adc r5, r7\n\t"
  138296. #endif
  138297. #ifdef WOLFSSL_KEIL
  138298. "adcs r3, r3, %[r]\n\t"
  138299. #elif defined(__clang__)
  138300. "adcs r3, %[r]\n\t"
  138301. #else
  138302. "adc r3, %[r]\n\t"
  138303. #endif
  138304. "# A[2] * B[5]\n\t"
  138305. "mov %[a], r9\n\t"
  138306. "mov %[b], r10\n\t"
  138307. "ldr %[a], [%[a], #8]\n\t"
  138308. "ldr %[b], [%[b], #20]\n\t"
  138309. "uxth r6, %[a]\n\t"
  138310. "uxth r7, %[b]\n\t"
  138311. #ifdef WOLFSSL_KEIL
  138312. "muls r7, r6, r7\n\t"
  138313. #elif defined(__clang__)
  138314. "muls r7, r6\n\t"
  138315. #else
  138316. "mul r7, r6\n\t"
  138317. #endif
  138318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138319. "adds r4, r4, r7\n\t"
  138320. #else
  138321. "add r4, r4, r7\n\t"
  138322. #endif
  138323. #ifdef WOLFSSL_KEIL
  138324. "adcs r5, r5, %[r]\n\t"
  138325. #elif defined(__clang__)
  138326. "adcs r5, %[r]\n\t"
  138327. #else
  138328. "adc r5, %[r]\n\t"
  138329. #endif
  138330. #ifdef WOLFSSL_KEIL
  138331. "adcs r3, r3, %[r]\n\t"
  138332. #elif defined(__clang__)
  138333. "adcs r3, %[r]\n\t"
  138334. #else
  138335. "adc r3, %[r]\n\t"
  138336. #endif
  138337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138338. "lsrs r7, %[b], #16\n\t"
  138339. #else
  138340. "lsr r7, %[b], #16\n\t"
  138341. #endif
  138342. #ifdef WOLFSSL_KEIL
  138343. "muls r6, r7, r6\n\t"
  138344. #elif defined(__clang__)
  138345. "muls r6, r7\n\t"
  138346. #else
  138347. "mul r6, r7\n\t"
  138348. #endif
  138349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138350. "lsrs r7, r6, #16\n\t"
  138351. #else
  138352. "lsr r7, r6, #16\n\t"
  138353. #endif
  138354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138355. "lsls r6, r6, #16\n\t"
  138356. #else
  138357. "lsl r6, r6, #16\n\t"
  138358. #endif
  138359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138360. "adds r4, r4, r6\n\t"
  138361. #else
  138362. "add r4, r4, r6\n\t"
  138363. #endif
  138364. #ifdef WOLFSSL_KEIL
  138365. "adcs r5, r5, r7\n\t"
  138366. #elif defined(__clang__)
  138367. "adcs r5, r7\n\t"
  138368. #else
  138369. "adc r5, r7\n\t"
  138370. #endif
  138371. #ifdef WOLFSSL_KEIL
  138372. "adcs r3, r3, %[r]\n\t"
  138373. #elif defined(__clang__)
  138374. "adcs r3, %[r]\n\t"
  138375. #else
  138376. "adc r3, %[r]\n\t"
  138377. #endif
  138378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138379. "lsrs r6, %[a], #16\n\t"
  138380. #else
  138381. "lsr r6, %[a], #16\n\t"
  138382. #endif
  138383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138384. "lsrs r7, %[b], #16\n\t"
  138385. #else
  138386. "lsr r7, %[b], #16\n\t"
  138387. #endif
  138388. #ifdef WOLFSSL_KEIL
  138389. "muls r7, r6, r7\n\t"
  138390. #elif defined(__clang__)
  138391. "muls r7, r6\n\t"
  138392. #else
  138393. "mul r7, r6\n\t"
  138394. #endif
  138395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138396. "adds r5, r5, r7\n\t"
  138397. #else
  138398. "add r5, r5, r7\n\t"
  138399. #endif
  138400. #ifdef WOLFSSL_KEIL
  138401. "adcs r3, r3, %[r]\n\t"
  138402. #elif defined(__clang__)
  138403. "adcs r3, %[r]\n\t"
  138404. #else
  138405. "adc r3, %[r]\n\t"
  138406. #endif
  138407. "uxth r7, %[b]\n\t"
  138408. #ifdef WOLFSSL_KEIL
  138409. "muls r6, r7, r6\n\t"
  138410. #elif defined(__clang__)
  138411. "muls r6, r7\n\t"
  138412. #else
  138413. "mul r6, r7\n\t"
  138414. #endif
  138415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138416. "lsrs r7, r6, #16\n\t"
  138417. #else
  138418. "lsr r7, r6, #16\n\t"
  138419. #endif
  138420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138421. "lsls r6, r6, #16\n\t"
  138422. #else
  138423. "lsl r6, r6, #16\n\t"
  138424. #endif
  138425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138426. "adds r4, r4, r6\n\t"
  138427. #else
  138428. "add r4, r4, r6\n\t"
  138429. #endif
  138430. #ifdef WOLFSSL_KEIL
  138431. "adcs r5, r5, r7\n\t"
  138432. #elif defined(__clang__)
  138433. "adcs r5, r7\n\t"
  138434. #else
  138435. "adc r5, r7\n\t"
  138436. #endif
  138437. #ifdef WOLFSSL_KEIL
  138438. "adcs r3, r3, %[r]\n\t"
  138439. #elif defined(__clang__)
  138440. "adcs r3, %[r]\n\t"
  138441. #else
  138442. "adc r3, %[r]\n\t"
  138443. #endif
  138444. "# A[3] * B[4]\n\t"
  138445. "mov %[a], r9\n\t"
  138446. "mov %[b], r10\n\t"
  138447. "ldr %[a], [%[a], #12]\n\t"
  138448. "ldr %[b], [%[b], #16]\n\t"
  138449. "uxth r6, %[a]\n\t"
  138450. "uxth r7, %[b]\n\t"
  138451. #ifdef WOLFSSL_KEIL
  138452. "muls r7, r6, r7\n\t"
  138453. #elif defined(__clang__)
  138454. "muls r7, r6\n\t"
  138455. #else
  138456. "mul r7, r6\n\t"
  138457. #endif
  138458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138459. "adds r4, r4, r7\n\t"
  138460. #else
  138461. "add r4, r4, r7\n\t"
  138462. #endif
  138463. #ifdef WOLFSSL_KEIL
  138464. "adcs r5, r5, %[r]\n\t"
  138465. #elif defined(__clang__)
  138466. "adcs r5, %[r]\n\t"
  138467. #else
  138468. "adc r5, %[r]\n\t"
  138469. #endif
  138470. #ifdef WOLFSSL_KEIL
  138471. "adcs r3, r3, %[r]\n\t"
  138472. #elif defined(__clang__)
  138473. "adcs r3, %[r]\n\t"
  138474. #else
  138475. "adc r3, %[r]\n\t"
  138476. #endif
  138477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138478. "lsrs r7, %[b], #16\n\t"
  138479. #else
  138480. "lsr r7, %[b], #16\n\t"
  138481. #endif
  138482. #ifdef WOLFSSL_KEIL
  138483. "muls r6, r7, r6\n\t"
  138484. #elif defined(__clang__)
  138485. "muls r6, r7\n\t"
  138486. #else
  138487. "mul r6, r7\n\t"
  138488. #endif
  138489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138490. "lsrs r7, r6, #16\n\t"
  138491. #else
  138492. "lsr r7, r6, #16\n\t"
  138493. #endif
  138494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138495. "lsls r6, r6, #16\n\t"
  138496. #else
  138497. "lsl r6, r6, #16\n\t"
  138498. #endif
  138499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138500. "adds r4, r4, r6\n\t"
  138501. #else
  138502. "add r4, r4, r6\n\t"
  138503. #endif
  138504. #ifdef WOLFSSL_KEIL
  138505. "adcs r5, r5, r7\n\t"
  138506. #elif defined(__clang__)
  138507. "adcs r5, r7\n\t"
  138508. #else
  138509. "adc r5, r7\n\t"
  138510. #endif
  138511. #ifdef WOLFSSL_KEIL
  138512. "adcs r3, r3, %[r]\n\t"
  138513. #elif defined(__clang__)
  138514. "adcs r3, %[r]\n\t"
  138515. #else
  138516. "adc r3, %[r]\n\t"
  138517. #endif
  138518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138519. "lsrs r6, %[a], #16\n\t"
  138520. #else
  138521. "lsr r6, %[a], #16\n\t"
  138522. #endif
  138523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138524. "lsrs r7, %[b], #16\n\t"
  138525. #else
  138526. "lsr r7, %[b], #16\n\t"
  138527. #endif
  138528. #ifdef WOLFSSL_KEIL
  138529. "muls r7, r6, r7\n\t"
  138530. #elif defined(__clang__)
  138531. "muls r7, r6\n\t"
  138532. #else
  138533. "mul r7, r6\n\t"
  138534. #endif
  138535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138536. "adds r5, r5, r7\n\t"
  138537. #else
  138538. "add r5, r5, r7\n\t"
  138539. #endif
  138540. #ifdef WOLFSSL_KEIL
  138541. "adcs r3, r3, %[r]\n\t"
  138542. #elif defined(__clang__)
  138543. "adcs r3, %[r]\n\t"
  138544. #else
  138545. "adc r3, %[r]\n\t"
  138546. #endif
  138547. "uxth r7, %[b]\n\t"
  138548. #ifdef WOLFSSL_KEIL
  138549. "muls r6, r7, r6\n\t"
  138550. #elif defined(__clang__)
  138551. "muls r6, r7\n\t"
  138552. #else
  138553. "mul r6, r7\n\t"
  138554. #endif
  138555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138556. "lsrs r7, r6, #16\n\t"
  138557. #else
  138558. "lsr r7, r6, #16\n\t"
  138559. #endif
  138560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138561. "lsls r6, r6, #16\n\t"
  138562. #else
  138563. "lsl r6, r6, #16\n\t"
  138564. #endif
  138565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138566. "adds r4, r4, r6\n\t"
  138567. #else
  138568. "add r4, r4, r6\n\t"
  138569. #endif
  138570. #ifdef WOLFSSL_KEIL
  138571. "adcs r5, r5, r7\n\t"
  138572. #elif defined(__clang__)
  138573. "adcs r5, r7\n\t"
  138574. #else
  138575. "adc r5, r7\n\t"
  138576. #endif
  138577. #ifdef WOLFSSL_KEIL
  138578. "adcs r3, r3, %[r]\n\t"
  138579. #elif defined(__clang__)
  138580. "adcs r3, %[r]\n\t"
  138581. #else
  138582. "adc r3, %[r]\n\t"
  138583. #endif
  138584. "# A[4] * B[3]\n\t"
  138585. "mov %[a], r9\n\t"
  138586. "mov %[b], r10\n\t"
  138587. "ldr %[a], [%[a], #16]\n\t"
  138588. "ldr %[b], [%[b], #12]\n\t"
  138589. "uxth r6, %[a]\n\t"
  138590. "uxth r7, %[b]\n\t"
  138591. #ifdef WOLFSSL_KEIL
  138592. "muls r7, r6, r7\n\t"
  138593. #elif defined(__clang__)
  138594. "muls r7, r6\n\t"
  138595. #else
  138596. "mul r7, r6\n\t"
  138597. #endif
  138598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138599. "adds r4, r4, r7\n\t"
  138600. #else
  138601. "add r4, r4, r7\n\t"
  138602. #endif
  138603. #ifdef WOLFSSL_KEIL
  138604. "adcs r5, r5, %[r]\n\t"
  138605. #elif defined(__clang__)
  138606. "adcs r5, %[r]\n\t"
  138607. #else
  138608. "adc r5, %[r]\n\t"
  138609. #endif
  138610. #ifdef WOLFSSL_KEIL
  138611. "adcs r3, r3, %[r]\n\t"
  138612. #elif defined(__clang__)
  138613. "adcs r3, %[r]\n\t"
  138614. #else
  138615. "adc r3, %[r]\n\t"
  138616. #endif
  138617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138618. "lsrs r7, %[b], #16\n\t"
  138619. #else
  138620. "lsr r7, %[b], #16\n\t"
  138621. #endif
  138622. #ifdef WOLFSSL_KEIL
  138623. "muls r6, r7, r6\n\t"
  138624. #elif defined(__clang__)
  138625. "muls r6, r7\n\t"
  138626. #else
  138627. "mul r6, r7\n\t"
  138628. #endif
  138629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138630. "lsrs r7, r6, #16\n\t"
  138631. #else
  138632. "lsr r7, r6, #16\n\t"
  138633. #endif
  138634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138635. "lsls r6, r6, #16\n\t"
  138636. #else
  138637. "lsl r6, r6, #16\n\t"
  138638. #endif
  138639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138640. "adds r4, r4, r6\n\t"
  138641. #else
  138642. "add r4, r4, r6\n\t"
  138643. #endif
  138644. #ifdef WOLFSSL_KEIL
  138645. "adcs r5, r5, r7\n\t"
  138646. #elif defined(__clang__)
  138647. "adcs r5, r7\n\t"
  138648. #else
  138649. "adc r5, r7\n\t"
  138650. #endif
  138651. #ifdef WOLFSSL_KEIL
  138652. "adcs r3, r3, %[r]\n\t"
  138653. #elif defined(__clang__)
  138654. "adcs r3, %[r]\n\t"
  138655. #else
  138656. "adc r3, %[r]\n\t"
  138657. #endif
  138658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138659. "lsrs r6, %[a], #16\n\t"
  138660. #else
  138661. "lsr r6, %[a], #16\n\t"
  138662. #endif
  138663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138664. "lsrs r7, %[b], #16\n\t"
  138665. #else
  138666. "lsr r7, %[b], #16\n\t"
  138667. #endif
  138668. #ifdef WOLFSSL_KEIL
  138669. "muls r7, r6, r7\n\t"
  138670. #elif defined(__clang__)
  138671. "muls r7, r6\n\t"
  138672. #else
  138673. "mul r7, r6\n\t"
  138674. #endif
  138675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138676. "adds r5, r5, r7\n\t"
  138677. #else
  138678. "add r5, r5, r7\n\t"
  138679. #endif
  138680. #ifdef WOLFSSL_KEIL
  138681. "adcs r3, r3, %[r]\n\t"
  138682. #elif defined(__clang__)
  138683. "adcs r3, %[r]\n\t"
  138684. #else
  138685. "adc r3, %[r]\n\t"
  138686. #endif
  138687. "uxth r7, %[b]\n\t"
  138688. #ifdef WOLFSSL_KEIL
  138689. "muls r6, r7, r6\n\t"
  138690. #elif defined(__clang__)
  138691. "muls r6, r7\n\t"
  138692. #else
  138693. "mul r6, r7\n\t"
  138694. #endif
  138695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138696. "lsrs r7, r6, #16\n\t"
  138697. #else
  138698. "lsr r7, r6, #16\n\t"
  138699. #endif
  138700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138701. "lsls r6, r6, #16\n\t"
  138702. #else
  138703. "lsl r6, r6, #16\n\t"
  138704. #endif
  138705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138706. "adds r4, r4, r6\n\t"
  138707. #else
  138708. "add r4, r4, r6\n\t"
  138709. #endif
  138710. #ifdef WOLFSSL_KEIL
  138711. "adcs r5, r5, r7\n\t"
  138712. #elif defined(__clang__)
  138713. "adcs r5, r7\n\t"
  138714. #else
  138715. "adc r5, r7\n\t"
  138716. #endif
  138717. #ifdef WOLFSSL_KEIL
  138718. "adcs r3, r3, %[r]\n\t"
  138719. #elif defined(__clang__)
  138720. "adcs r3, %[r]\n\t"
  138721. #else
  138722. "adc r3, %[r]\n\t"
  138723. #endif
  138724. "# A[5] * B[2]\n\t"
  138725. "mov %[a], r9\n\t"
  138726. "mov %[b], r10\n\t"
  138727. "ldr %[a], [%[a], #20]\n\t"
  138728. "ldr %[b], [%[b], #8]\n\t"
  138729. "uxth r6, %[a]\n\t"
  138730. "uxth r7, %[b]\n\t"
  138731. #ifdef WOLFSSL_KEIL
  138732. "muls r7, r6, r7\n\t"
  138733. #elif defined(__clang__)
  138734. "muls r7, r6\n\t"
  138735. #else
  138736. "mul r7, r6\n\t"
  138737. #endif
  138738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138739. "adds r4, r4, r7\n\t"
  138740. #else
  138741. "add r4, r4, r7\n\t"
  138742. #endif
  138743. #ifdef WOLFSSL_KEIL
  138744. "adcs r5, r5, %[r]\n\t"
  138745. #elif defined(__clang__)
  138746. "adcs r5, %[r]\n\t"
  138747. #else
  138748. "adc r5, %[r]\n\t"
  138749. #endif
  138750. #ifdef WOLFSSL_KEIL
  138751. "adcs r3, r3, %[r]\n\t"
  138752. #elif defined(__clang__)
  138753. "adcs r3, %[r]\n\t"
  138754. #else
  138755. "adc r3, %[r]\n\t"
  138756. #endif
  138757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138758. "lsrs r7, %[b], #16\n\t"
  138759. #else
  138760. "lsr r7, %[b], #16\n\t"
  138761. #endif
  138762. #ifdef WOLFSSL_KEIL
  138763. "muls r6, r7, r6\n\t"
  138764. #elif defined(__clang__)
  138765. "muls r6, r7\n\t"
  138766. #else
  138767. "mul r6, r7\n\t"
  138768. #endif
  138769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138770. "lsrs r7, r6, #16\n\t"
  138771. #else
  138772. "lsr r7, r6, #16\n\t"
  138773. #endif
  138774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138775. "lsls r6, r6, #16\n\t"
  138776. #else
  138777. "lsl r6, r6, #16\n\t"
  138778. #endif
  138779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138780. "adds r4, r4, r6\n\t"
  138781. #else
  138782. "add r4, r4, r6\n\t"
  138783. #endif
  138784. #ifdef WOLFSSL_KEIL
  138785. "adcs r5, r5, r7\n\t"
  138786. #elif defined(__clang__)
  138787. "adcs r5, r7\n\t"
  138788. #else
  138789. "adc r5, r7\n\t"
  138790. #endif
  138791. #ifdef WOLFSSL_KEIL
  138792. "adcs r3, r3, %[r]\n\t"
  138793. #elif defined(__clang__)
  138794. "adcs r3, %[r]\n\t"
  138795. #else
  138796. "adc r3, %[r]\n\t"
  138797. #endif
  138798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138799. "lsrs r6, %[a], #16\n\t"
  138800. #else
  138801. "lsr r6, %[a], #16\n\t"
  138802. #endif
  138803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138804. "lsrs r7, %[b], #16\n\t"
  138805. #else
  138806. "lsr r7, %[b], #16\n\t"
  138807. #endif
  138808. #ifdef WOLFSSL_KEIL
  138809. "muls r7, r6, r7\n\t"
  138810. #elif defined(__clang__)
  138811. "muls r7, r6\n\t"
  138812. #else
  138813. "mul r7, r6\n\t"
  138814. #endif
  138815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138816. "adds r5, r5, r7\n\t"
  138817. #else
  138818. "add r5, r5, r7\n\t"
  138819. #endif
  138820. #ifdef WOLFSSL_KEIL
  138821. "adcs r3, r3, %[r]\n\t"
  138822. #elif defined(__clang__)
  138823. "adcs r3, %[r]\n\t"
  138824. #else
  138825. "adc r3, %[r]\n\t"
  138826. #endif
  138827. "uxth r7, %[b]\n\t"
  138828. #ifdef WOLFSSL_KEIL
  138829. "muls r6, r7, r6\n\t"
  138830. #elif defined(__clang__)
  138831. "muls r6, r7\n\t"
  138832. #else
  138833. "mul r6, r7\n\t"
  138834. #endif
  138835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138836. "lsrs r7, r6, #16\n\t"
  138837. #else
  138838. "lsr r7, r6, #16\n\t"
  138839. #endif
  138840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138841. "lsls r6, r6, #16\n\t"
  138842. #else
  138843. "lsl r6, r6, #16\n\t"
  138844. #endif
  138845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138846. "adds r4, r4, r6\n\t"
  138847. #else
  138848. "add r4, r4, r6\n\t"
  138849. #endif
  138850. #ifdef WOLFSSL_KEIL
  138851. "adcs r5, r5, r7\n\t"
  138852. #elif defined(__clang__)
  138853. "adcs r5, r7\n\t"
  138854. #else
  138855. "adc r5, r7\n\t"
  138856. #endif
  138857. #ifdef WOLFSSL_KEIL
  138858. "adcs r3, r3, %[r]\n\t"
  138859. #elif defined(__clang__)
  138860. "adcs r3, %[r]\n\t"
  138861. #else
  138862. "adc r3, %[r]\n\t"
  138863. #endif
  138864. "# A[6] * B[1]\n\t"
  138865. "mov %[a], r9\n\t"
  138866. "mov %[b], r10\n\t"
  138867. "ldr %[a], [%[a], #24]\n\t"
  138868. "ldr %[b], [%[b], #4]\n\t"
  138869. "uxth r6, %[a]\n\t"
  138870. "uxth r7, %[b]\n\t"
  138871. #ifdef WOLFSSL_KEIL
  138872. "muls r7, r6, r7\n\t"
  138873. #elif defined(__clang__)
  138874. "muls r7, r6\n\t"
  138875. #else
  138876. "mul r7, r6\n\t"
  138877. #endif
  138878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138879. "adds r4, r4, r7\n\t"
  138880. #else
  138881. "add r4, r4, r7\n\t"
  138882. #endif
  138883. #ifdef WOLFSSL_KEIL
  138884. "adcs r5, r5, %[r]\n\t"
  138885. #elif defined(__clang__)
  138886. "adcs r5, %[r]\n\t"
  138887. #else
  138888. "adc r5, %[r]\n\t"
  138889. #endif
  138890. #ifdef WOLFSSL_KEIL
  138891. "adcs r3, r3, %[r]\n\t"
  138892. #elif defined(__clang__)
  138893. "adcs r3, %[r]\n\t"
  138894. #else
  138895. "adc r3, %[r]\n\t"
  138896. #endif
  138897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138898. "lsrs r7, %[b], #16\n\t"
  138899. #else
  138900. "lsr r7, %[b], #16\n\t"
  138901. #endif
  138902. #ifdef WOLFSSL_KEIL
  138903. "muls r6, r7, r6\n\t"
  138904. #elif defined(__clang__)
  138905. "muls r6, r7\n\t"
  138906. #else
  138907. "mul r6, r7\n\t"
  138908. #endif
  138909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138910. "lsrs r7, r6, #16\n\t"
  138911. #else
  138912. "lsr r7, r6, #16\n\t"
  138913. #endif
  138914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138915. "lsls r6, r6, #16\n\t"
  138916. #else
  138917. "lsl r6, r6, #16\n\t"
  138918. #endif
  138919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138920. "adds r4, r4, r6\n\t"
  138921. #else
  138922. "add r4, r4, r6\n\t"
  138923. #endif
  138924. #ifdef WOLFSSL_KEIL
  138925. "adcs r5, r5, r7\n\t"
  138926. #elif defined(__clang__)
  138927. "adcs r5, r7\n\t"
  138928. #else
  138929. "adc r5, r7\n\t"
  138930. #endif
  138931. #ifdef WOLFSSL_KEIL
  138932. "adcs r3, r3, %[r]\n\t"
  138933. #elif defined(__clang__)
  138934. "adcs r3, %[r]\n\t"
  138935. #else
  138936. "adc r3, %[r]\n\t"
  138937. #endif
  138938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138939. "lsrs r6, %[a], #16\n\t"
  138940. #else
  138941. "lsr r6, %[a], #16\n\t"
  138942. #endif
  138943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138944. "lsrs r7, %[b], #16\n\t"
  138945. #else
  138946. "lsr r7, %[b], #16\n\t"
  138947. #endif
  138948. #ifdef WOLFSSL_KEIL
  138949. "muls r7, r6, r7\n\t"
  138950. #elif defined(__clang__)
  138951. "muls r7, r6\n\t"
  138952. #else
  138953. "mul r7, r6\n\t"
  138954. #endif
  138955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138956. "adds r5, r5, r7\n\t"
  138957. #else
  138958. "add r5, r5, r7\n\t"
  138959. #endif
  138960. #ifdef WOLFSSL_KEIL
  138961. "adcs r3, r3, %[r]\n\t"
  138962. #elif defined(__clang__)
  138963. "adcs r3, %[r]\n\t"
  138964. #else
  138965. "adc r3, %[r]\n\t"
  138966. #endif
  138967. "uxth r7, %[b]\n\t"
  138968. #ifdef WOLFSSL_KEIL
  138969. "muls r6, r7, r6\n\t"
  138970. #elif defined(__clang__)
  138971. "muls r6, r7\n\t"
  138972. #else
  138973. "mul r6, r7\n\t"
  138974. #endif
  138975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138976. "lsrs r7, r6, #16\n\t"
  138977. #else
  138978. "lsr r7, r6, #16\n\t"
  138979. #endif
  138980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138981. "lsls r6, r6, #16\n\t"
  138982. #else
  138983. "lsl r6, r6, #16\n\t"
  138984. #endif
  138985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  138986. "adds r4, r4, r6\n\t"
  138987. #else
  138988. "add r4, r4, r6\n\t"
  138989. #endif
  138990. #ifdef WOLFSSL_KEIL
  138991. "adcs r5, r5, r7\n\t"
  138992. #elif defined(__clang__)
  138993. "adcs r5, r7\n\t"
  138994. #else
  138995. "adc r5, r7\n\t"
  138996. #endif
  138997. #ifdef WOLFSSL_KEIL
  138998. "adcs r3, r3, %[r]\n\t"
  138999. #elif defined(__clang__)
  139000. "adcs r3, %[r]\n\t"
  139001. #else
  139002. "adc r3, %[r]\n\t"
  139003. #endif
  139004. "# A[7] * B[0]\n\t"
  139005. "mov %[a], r9\n\t"
  139006. "mov %[b], r10\n\t"
  139007. "ldr %[a], [%[a], #28]\n\t"
  139008. "ldr %[b], [%[b]]\n\t"
  139009. "uxth r6, %[a]\n\t"
  139010. "uxth r7, %[b]\n\t"
  139011. #ifdef WOLFSSL_KEIL
  139012. "muls r7, r6, r7\n\t"
  139013. #elif defined(__clang__)
  139014. "muls r7, r6\n\t"
  139015. #else
  139016. "mul r7, r6\n\t"
  139017. #endif
  139018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139019. "adds r4, r4, r7\n\t"
  139020. #else
  139021. "add r4, r4, r7\n\t"
  139022. #endif
  139023. #ifdef WOLFSSL_KEIL
  139024. "adcs r5, r5, %[r]\n\t"
  139025. #elif defined(__clang__)
  139026. "adcs r5, %[r]\n\t"
  139027. #else
  139028. "adc r5, %[r]\n\t"
  139029. #endif
  139030. #ifdef WOLFSSL_KEIL
  139031. "adcs r3, r3, %[r]\n\t"
  139032. #elif defined(__clang__)
  139033. "adcs r3, %[r]\n\t"
  139034. #else
  139035. "adc r3, %[r]\n\t"
  139036. #endif
  139037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139038. "lsrs r7, %[b], #16\n\t"
  139039. #else
  139040. "lsr r7, %[b], #16\n\t"
  139041. #endif
  139042. #ifdef WOLFSSL_KEIL
  139043. "muls r6, r7, r6\n\t"
  139044. #elif defined(__clang__)
  139045. "muls r6, r7\n\t"
  139046. #else
  139047. "mul r6, r7\n\t"
  139048. #endif
  139049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139050. "lsrs r7, r6, #16\n\t"
  139051. #else
  139052. "lsr r7, r6, #16\n\t"
  139053. #endif
  139054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139055. "lsls r6, r6, #16\n\t"
  139056. #else
  139057. "lsl r6, r6, #16\n\t"
  139058. #endif
  139059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139060. "adds r4, r4, r6\n\t"
  139061. #else
  139062. "add r4, r4, r6\n\t"
  139063. #endif
  139064. #ifdef WOLFSSL_KEIL
  139065. "adcs r5, r5, r7\n\t"
  139066. #elif defined(__clang__)
  139067. "adcs r5, r7\n\t"
  139068. #else
  139069. "adc r5, r7\n\t"
  139070. #endif
  139071. #ifdef WOLFSSL_KEIL
  139072. "adcs r3, r3, %[r]\n\t"
  139073. #elif defined(__clang__)
  139074. "adcs r3, %[r]\n\t"
  139075. #else
  139076. "adc r3, %[r]\n\t"
  139077. #endif
  139078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139079. "lsrs r6, %[a], #16\n\t"
  139080. #else
  139081. "lsr r6, %[a], #16\n\t"
  139082. #endif
  139083. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139084. "lsrs r7, %[b], #16\n\t"
  139085. #else
  139086. "lsr r7, %[b], #16\n\t"
  139087. #endif
  139088. #ifdef WOLFSSL_KEIL
  139089. "muls r7, r6, r7\n\t"
  139090. #elif defined(__clang__)
  139091. "muls r7, r6\n\t"
  139092. #else
  139093. "mul r7, r6\n\t"
  139094. #endif
  139095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139096. "adds r5, r5, r7\n\t"
  139097. #else
  139098. "add r5, r5, r7\n\t"
  139099. #endif
  139100. #ifdef WOLFSSL_KEIL
  139101. "adcs r3, r3, %[r]\n\t"
  139102. #elif defined(__clang__)
  139103. "adcs r3, %[r]\n\t"
  139104. #else
  139105. "adc r3, %[r]\n\t"
  139106. #endif
  139107. "uxth r7, %[b]\n\t"
  139108. #ifdef WOLFSSL_KEIL
  139109. "muls r6, r7, r6\n\t"
  139110. #elif defined(__clang__)
  139111. "muls r6, r7\n\t"
  139112. #else
  139113. "mul r6, r7\n\t"
  139114. #endif
  139115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139116. "lsrs r7, r6, #16\n\t"
  139117. #else
  139118. "lsr r7, r6, #16\n\t"
  139119. #endif
  139120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139121. "lsls r6, r6, #16\n\t"
  139122. #else
  139123. "lsl r6, r6, #16\n\t"
  139124. #endif
  139125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139126. "adds r4, r4, r6\n\t"
  139127. #else
  139128. "add r4, r4, r6\n\t"
  139129. #endif
  139130. #ifdef WOLFSSL_KEIL
  139131. "adcs r5, r5, r7\n\t"
  139132. #elif defined(__clang__)
  139133. "adcs r5, r7\n\t"
  139134. #else
  139135. "adc r5, r7\n\t"
  139136. #endif
  139137. #ifdef WOLFSSL_KEIL
  139138. "adcs r3, r3, %[r]\n\t"
  139139. #elif defined(__clang__)
  139140. "adcs r3, %[r]\n\t"
  139141. #else
  139142. "adc r3, %[r]\n\t"
  139143. #endif
  139144. "str r4, [sp, #28]\n\t"
  139145. "# A[8] * B[0]\n\t"
  139146. "movs r4, #0\n\t"
  139147. "mov %[a], r9\n\t"
  139148. "mov %[b], r10\n\t"
  139149. "ldr %[a], [%[a], #32]\n\t"
  139150. "ldr %[b], [%[b]]\n\t"
  139151. "uxth r6, %[a]\n\t"
  139152. "uxth r7, %[b]\n\t"
  139153. #ifdef WOLFSSL_KEIL
  139154. "muls r7, r6, r7\n\t"
  139155. #elif defined(__clang__)
  139156. "muls r7, r6\n\t"
  139157. #else
  139158. "mul r7, r6\n\t"
  139159. #endif
  139160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139161. "adds r5, r5, r7\n\t"
  139162. #else
  139163. "add r5, r5, r7\n\t"
  139164. #endif
  139165. #ifdef WOLFSSL_KEIL
  139166. "adcs r3, r3, %[r]\n\t"
  139167. #elif defined(__clang__)
  139168. "adcs r3, %[r]\n\t"
  139169. #else
  139170. "adc r3, %[r]\n\t"
  139171. #endif
  139172. #ifdef WOLFSSL_KEIL
  139173. "adcs r4, r4, %[r]\n\t"
  139174. #elif defined(__clang__)
  139175. "adcs r4, %[r]\n\t"
  139176. #else
  139177. "adc r4, %[r]\n\t"
  139178. #endif
  139179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139180. "lsrs r7, %[b], #16\n\t"
  139181. #else
  139182. "lsr r7, %[b], #16\n\t"
  139183. #endif
  139184. #ifdef WOLFSSL_KEIL
  139185. "muls r6, r7, r6\n\t"
  139186. #elif defined(__clang__)
  139187. "muls r6, r7\n\t"
  139188. #else
  139189. "mul r6, r7\n\t"
  139190. #endif
  139191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139192. "lsrs r7, r6, #16\n\t"
  139193. #else
  139194. "lsr r7, r6, #16\n\t"
  139195. #endif
  139196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139197. "lsls r6, r6, #16\n\t"
  139198. #else
  139199. "lsl r6, r6, #16\n\t"
  139200. #endif
  139201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139202. "adds r5, r5, r6\n\t"
  139203. #else
  139204. "add r5, r5, r6\n\t"
  139205. #endif
  139206. #ifdef WOLFSSL_KEIL
  139207. "adcs r3, r3, r7\n\t"
  139208. #elif defined(__clang__)
  139209. "adcs r3, r7\n\t"
  139210. #else
  139211. "adc r3, r7\n\t"
  139212. #endif
  139213. #ifdef WOLFSSL_KEIL
  139214. "adcs r4, r4, %[r]\n\t"
  139215. #elif defined(__clang__)
  139216. "adcs r4, %[r]\n\t"
  139217. #else
  139218. "adc r4, %[r]\n\t"
  139219. #endif
  139220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139221. "lsrs r6, %[a], #16\n\t"
  139222. #else
  139223. "lsr r6, %[a], #16\n\t"
  139224. #endif
  139225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139226. "lsrs r7, %[b], #16\n\t"
  139227. #else
  139228. "lsr r7, %[b], #16\n\t"
  139229. #endif
  139230. #ifdef WOLFSSL_KEIL
  139231. "muls r7, r6, r7\n\t"
  139232. #elif defined(__clang__)
  139233. "muls r7, r6\n\t"
  139234. #else
  139235. "mul r7, r6\n\t"
  139236. #endif
  139237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139238. "adds r3, r3, r7\n\t"
  139239. #else
  139240. "add r3, r3, r7\n\t"
  139241. #endif
  139242. #ifdef WOLFSSL_KEIL
  139243. "adcs r4, r4, %[r]\n\t"
  139244. #elif defined(__clang__)
  139245. "adcs r4, %[r]\n\t"
  139246. #else
  139247. "adc r4, %[r]\n\t"
  139248. #endif
  139249. "uxth r7, %[b]\n\t"
  139250. #ifdef WOLFSSL_KEIL
  139251. "muls r6, r7, r6\n\t"
  139252. #elif defined(__clang__)
  139253. "muls r6, r7\n\t"
  139254. #else
  139255. "mul r6, r7\n\t"
  139256. #endif
  139257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139258. "lsrs r7, r6, #16\n\t"
  139259. #else
  139260. "lsr r7, r6, #16\n\t"
  139261. #endif
  139262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139263. "lsls r6, r6, #16\n\t"
  139264. #else
  139265. "lsl r6, r6, #16\n\t"
  139266. #endif
  139267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139268. "adds r5, r5, r6\n\t"
  139269. #else
  139270. "add r5, r5, r6\n\t"
  139271. #endif
  139272. #ifdef WOLFSSL_KEIL
  139273. "adcs r3, r3, r7\n\t"
  139274. #elif defined(__clang__)
  139275. "adcs r3, r7\n\t"
  139276. #else
  139277. "adc r3, r7\n\t"
  139278. #endif
  139279. #ifdef WOLFSSL_KEIL
  139280. "adcs r4, r4, %[r]\n\t"
  139281. #elif defined(__clang__)
  139282. "adcs r4, %[r]\n\t"
  139283. #else
  139284. "adc r4, %[r]\n\t"
  139285. #endif
  139286. "# A[7] * B[1]\n\t"
  139287. "mov %[a], r9\n\t"
  139288. "mov %[b], r10\n\t"
  139289. "ldr %[a], [%[a], #28]\n\t"
  139290. "ldr %[b], [%[b], #4]\n\t"
  139291. "uxth r6, %[a]\n\t"
  139292. "uxth r7, %[b]\n\t"
  139293. #ifdef WOLFSSL_KEIL
  139294. "muls r7, r6, r7\n\t"
  139295. #elif defined(__clang__)
  139296. "muls r7, r6\n\t"
  139297. #else
  139298. "mul r7, r6\n\t"
  139299. #endif
  139300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139301. "adds r5, r5, r7\n\t"
  139302. #else
  139303. "add r5, r5, r7\n\t"
  139304. #endif
  139305. #ifdef WOLFSSL_KEIL
  139306. "adcs r3, r3, %[r]\n\t"
  139307. #elif defined(__clang__)
  139308. "adcs r3, %[r]\n\t"
  139309. #else
  139310. "adc r3, %[r]\n\t"
  139311. #endif
  139312. #ifdef WOLFSSL_KEIL
  139313. "adcs r4, r4, %[r]\n\t"
  139314. #elif defined(__clang__)
  139315. "adcs r4, %[r]\n\t"
  139316. #else
  139317. "adc r4, %[r]\n\t"
  139318. #endif
  139319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139320. "lsrs r7, %[b], #16\n\t"
  139321. #else
  139322. "lsr r7, %[b], #16\n\t"
  139323. #endif
  139324. #ifdef WOLFSSL_KEIL
  139325. "muls r6, r7, r6\n\t"
  139326. #elif defined(__clang__)
  139327. "muls r6, r7\n\t"
  139328. #else
  139329. "mul r6, r7\n\t"
  139330. #endif
  139331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139332. "lsrs r7, r6, #16\n\t"
  139333. #else
  139334. "lsr r7, r6, #16\n\t"
  139335. #endif
  139336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139337. "lsls r6, r6, #16\n\t"
  139338. #else
  139339. "lsl r6, r6, #16\n\t"
  139340. #endif
  139341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139342. "adds r5, r5, r6\n\t"
  139343. #else
  139344. "add r5, r5, r6\n\t"
  139345. #endif
  139346. #ifdef WOLFSSL_KEIL
  139347. "adcs r3, r3, r7\n\t"
  139348. #elif defined(__clang__)
  139349. "adcs r3, r7\n\t"
  139350. #else
  139351. "adc r3, r7\n\t"
  139352. #endif
  139353. #ifdef WOLFSSL_KEIL
  139354. "adcs r4, r4, %[r]\n\t"
  139355. #elif defined(__clang__)
  139356. "adcs r4, %[r]\n\t"
  139357. #else
  139358. "adc r4, %[r]\n\t"
  139359. #endif
  139360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139361. "lsrs r6, %[a], #16\n\t"
  139362. #else
  139363. "lsr r6, %[a], #16\n\t"
  139364. #endif
  139365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139366. "lsrs r7, %[b], #16\n\t"
  139367. #else
  139368. "lsr r7, %[b], #16\n\t"
  139369. #endif
  139370. #ifdef WOLFSSL_KEIL
  139371. "muls r7, r6, r7\n\t"
  139372. #elif defined(__clang__)
  139373. "muls r7, r6\n\t"
  139374. #else
  139375. "mul r7, r6\n\t"
  139376. #endif
  139377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139378. "adds r3, r3, r7\n\t"
  139379. #else
  139380. "add r3, r3, r7\n\t"
  139381. #endif
  139382. #ifdef WOLFSSL_KEIL
  139383. "adcs r4, r4, %[r]\n\t"
  139384. #elif defined(__clang__)
  139385. "adcs r4, %[r]\n\t"
  139386. #else
  139387. "adc r4, %[r]\n\t"
  139388. #endif
  139389. "uxth r7, %[b]\n\t"
  139390. #ifdef WOLFSSL_KEIL
  139391. "muls r6, r7, r6\n\t"
  139392. #elif defined(__clang__)
  139393. "muls r6, r7\n\t"
  139394. #else
  139395. "mul r6, r7\n\t"
  139396. #endif
  139397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139398. "lsrs r7, r6, #16\n\t"
  139399. #else
  139400. "lsr r7, r6, #16\n\t"
  139401. #endif
  139402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139403. "lsls r6, r6, #16\n\t"
  139404. #else
  139405. "lsl r6, r6, #16\n\t"
  139406. #endif
  139407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139408. "adds r5, r5, r6\n\t"
  139409. #else
  139410. "add r5, r5, r6\n\t"
  139411. #endif
  139412. #ifdef WOLFSSL_KEIL
  139413. "adcs r3, r3, r7\n\t"
  139414. #elif defined(__clang__)
  139415. "adcs r3, r7\n\t"
  139416. #else
  139417. "adc r3, r7\n\t"
  139418. #endif
  139419. #ifdef WOLFSSL_KEIL
  139420. "adcs r4, r4, %[r]\n\t"
  139421. #elif defined(__clang__)
  139422. "adcs r4, %[r]\n\t"
  139423. #else
  139424. "adc r4, %[r]\n\t"
  139425. #endif
  139426. "# A[6] * B[2]\n\t"
  139427. "mov %[a], r9\n\t"
  139428. "mov %[b], r10\n\t"
  139429. "ldr %[a], [%[a], #24]\n\t"
  139430. "ldr %[b], [%[b], #8]\n\t"
  139431. "uxth r6, %[a]\n\t"
  139432. "uxth r7, %[b]\n\t"
  139433. #ifdef WOLFSSL_KEIL
  139434. "muls r7, r6, r7\n\t"
  139435. #elif defined(__clang__)
  139436. "muls r7, r6\n\t"
  139437. #else
  139438. "mul r7, r6\n\t"
  139439. #endif
  139440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139441. "adds r5, r5, r7\n\t"
  139442. #else
  139443. "add r5, r5, r7\n\t"
  139444. #endif
  139445. #ifdef WOLFSSL_KEIL
  139446. "adcs r3, r3, %[r]\n\t"
  139447. #elif defined(__clang__)
  139448. "adcs r3, %[r]\n\t"
  139449. #else
  139450. "adc r3, %[r]\n\t"
  139451. #endif
  139452. #ifdef WOLFSSL_KEIL
  139453. "adcs r4, r4, %[r]\n\t"
  139454. #elif defined(__clang__)
  139455. "adcs r4, %[r]\n\t"
  139456. #else
  139457. "adc r4, %[r]\n\t"
  139458. #endif
  139459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139460. "lsrs r7, %[b], #16\n\t"
  139461. #else
  139462. "lsr r7, %[b], #16\n\t"
  139463. #endif
  139464. #ifdef WOLFSSL_KEIL
  139465. "muls r6, r7, r6\n\t"
  139466. #elif defined(__clang__)
  139467. "muls r6, r7\n\t"
  139468. #else
  139469. "mul r6, r7\n\t"
  139470. #endif
  139471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139472. "lsrs r7, r6, #16\n\t"
  139473. #else
  139474. "lsr r7, r6, #16\n\t"
  139475. #endif
  139476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139477. "lsls r6, r6, #16\n\t"
  139478. #else
  139479. "lsl r6, r6, #16\n\t"
  139480. #endif
  139481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139482. "adds r5, r5, r6\n\t"
  139483. #else
  139484. "add r5, r5, r6\n\t"
  139485. #endif
  139486. #ifdef WOLFSSL_KEIL
  139487. "adcs r3, r3, r7\n\t"
  139488. #elif defined(__clang__)
  139489. "adcs r3, r7\n\t"
  139490. #else
  139491. "adc r3, r7\n\t"
  139492. #endif
  139493. #ifdef WOLFSSL_KEIL
  139494. "adcs r4, r4, %[r]\n\t"
  139495. #elif defined(__clang__)
  139496. "adcs r4, %[r]\n\t"
  139497. #else
  139498. "adc r4, %[r]\n\t"
  139499. #endif
  139500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139501. "lsrs r6, %[a], #16\n\t"
  139502. #else
  139503. "lsr r6, %[a], #16\n\t"
  139504. #endif
  139505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139506. "lsrs r7, %[b], #16\n\t"
  139507. #else
  139508. "lsr r7, %[b], #16\n\t"
  139509. #endif
  139510. #ifdef WOLFSSL_KEIL
  139511. "muls r7, r6, r7\n\t"
  139512. #elif defined(__clang__)
  139513. "muls r7, r6\n\t"
  139514. #else
  139515. "mul r7, r6\n\t"
  139516. #endif
  139517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139518. "adds r3, r3, r7\n\t"
  139519. #else
  139520. "add r3, r3, r7\n\t"
  139521. #endif
  139522. #ifdef WOLFSSL_KEIL
  139523. "adcs r4, r4, %[r]\n\t"
  139524. #elif defined(__clang__)
  139525. "adcs r4, %[r]\n\t"
  139526. #else
  139527. "adc r4, %[r]\n\t"
  139528. #endif
  139529. "uxth r7, %[b]\n\t"
  139530. #ifdef WOLFSSL_KEIL
  139531. "muls r6, r7, r6\n\t"
  139532. #elif defined(__clang__)
  139533. "muls r6, r7\n\t"
  139534. #else
  139535. "mul r6, r7\n\t"
  139536. #endif
  139537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139538. "lsrs r7, r6, #16\n\t"
  139539. #else
  139540. "lsr r7, r6, #16\n\t"
  139541. #endif
  139542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139543. "lsls r6, r6, #16\n\t"
  139544. #else
  139545. "lsl r6, r6, #16\n\t"
  139546. #endif
  139547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139548. "adds r5, r5, r6\n\t"
  139549. #else
  139550. "add r5, r5, r6\n\t"
  139551. #endif
  139552. #ifdef WOLFSSL_KEIL
  139553. "adcs r3, r3, r7\n\t"
  139554. #elif defined(__clang__)
  139555. "adcs r3, r7\n\t"
  139556. #else
  139557. "adc r3, r7\n\t"
  139558. #endif
  139559. #ifdef WOLFSSL_KEIL
  139560. "adcs r4, r4, %[r]\n\t"
  139561. #elif defined(__clang__)
  139562. "adcs r4, %[r]\n\t"
  139563. #else
  139564. "adc r4, %[r]\n\t"
  139565. #endif
  139566. "# A[5] * B[3]\n\t"
  139567. "mov %[a], r9\n\t"
  139568. "mov %[b], r10\n\t"
  139569. "ldr %[a], [%[a], #20]\n\t"
  139570. "ldr %[b], [%[b], #12]\n\t"
  139571. "uxth r6, %[a]\n\t"
  139572. "uxth r7, %[b]\n\t"
  139573. #ifdef WOLFSSL_KEIL
  139574. "muls r7, r6, r7\n\t"
  139575. #elif defined(__clang__)
  139576. "muls r7, r6\n\t"
  139577. #else
  139578. "mul r7, r6\n\t"
  139579. #endif
  139580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139581. "adds r5, r5, r7\n\t"
  139582. #else
  139583. "add r5, r5, r7\n\t"
  139584. #endif
  139585. #ifdef WOLFSSL_KEIL
  139586. "adcs r3, r3, %[r]\n\t"
  139587. #elif defined(__clang__)
  139588. "adcs r3, %[r]\n\t"
  139589. #else
  139590. "adc r3, %[r]\n\t"
  139591. #endif
  139592. #ifdef WOLFSSL_KEIL
  139593. "adcs r4, r4, %[r]\n\t"
  139594. #elif defined(__clang__)
  139595. "adcs r4, %[r]\n\t"
  139596. #else
  139597. "adc r4, %[r]\n\t"
  139598. #endif
  139599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139600. "lsrs r7, %[b], #16\n\t"
  139601. #else
  139602. "lsr r7, %[b], #16\n\t"
  139603. #endif
  139604. #ifdef WOLFSSL_KEIL
  139605. "muls r6, r7, r6\n\t"
  139606. #elif defined(__clang__)
  139607. "muls r6, r7\n\t"
  139608. #else
  139609. "mul r6, r7\n\t"
  139610. #endif
  139611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139612. "lsrs r7, r6, #16\n\t"
  139613. #else
  139614. "lsr r7, r6, #16\n\t"
  139615. #endif
  139616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139617. "lsls r6, r6, #16\n\t"
  139618. #else
  139619. "lsl r6, r6, #16\n\t"
  139620. #endif
  139621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139622. "adds r5, r5, r6\n\t"
  139623. #else
  139624. "add r5, r5, r6\n\t"
  139625. #endif
  139626. #ifdef WOLFSSL_KEIL
  139627. "adcs r3, r3, r7\n\t"
  139628. #elif defined(__clang__)
  139629. "adcs r3, r7\n\t"
  139630. #else
  139631. "adc r3, r7\n\t"
  139632. #endif
  139633. #ifdef WOLFSSL_KEIL
  139634. "adcs r4, r4, %[r]\n\t"
  139635. #elif defined(__clang__)
  139636. "adcs r4, %[r]\n\t"
  139637. #else
  139638. "adc r4, %[r]\n\t"
  139639. #endif
  139640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139641. "lsrs r6, %[a], #16\n\t"
  139642. #else
  139643. "lsr r6, %[a], #16\n\t"
  139644. #endif
  139645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139646. "lsrs r7, %[b], #16\n\t"
  139647. #else
  139648. "lsr r7, %[b], #16\n\t"
  139649. #endif
  139650. #ifdef WOLFSSL_KEIL
  139651. "muls r7, r6, r7\n\t"
  139652. #elif defined(__clang__)
  139653. "muls r7, r6\n\t"
  139654. #else
  139655. "mul r7, r6\n\t"
  139656. #endif
  139657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139658. "adds r3, r3, r7\n\t"
  139659. #else
  139660. "add r3, r3, r7\n\t"
  139661. #endif
  139662. #ifdef WOLFSSL_KEIL
  139663. "adcs r4, r4, %[r]\n\t"
  139664. #elif defined(__clang__)
  139665. "adcs r4, %[r]\n\t"
  139666. #else
  139667. "adc r4, %[r]\n\t"
  139668. #endif
  139669. "uxth r7, %[b]\n\t"
  139670. #ifdef WOLFSSL_KEIL
  139671. "muls r6, r7, r6\n\t"
  139672. #elif defined(__clang__)
  139673. "muls r6, r7\n\t"
  139674. #else
  139675. "mul r6, r7\n\t"
  139676. #endif
  139677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139678. "lsrs r7, r6, #16\n\t"
  139679. #else
  139680. "lsr r7, r6, #16\n\t"
  139681. #endif
  139682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139683. "lsls r6, r6, #16\n\t"
  139684. #else
  139685. "lsl r6, r6, #16\n\t"
  139686. #endif
  139687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139688. "adds r5, r5, r6\n\t"
  139689. #else
  139690. "add r5, r5, r6\n\t"
  139691. #endif
  139692. #ifdef WOLFSSL_KEIL
  139693. "adcs r3, r3, r7\n\t"
  139694. #elif defined(__clang__)
  139695. "adcs r3, r7\n\t"
  139696. #else
  139697. "adc r3, r7\n\t"
  139698. #endif
  139699. #ifdef WOLFSSL_KEIL
  139700. "adcs r4, r4, %[r]\n\t"
  139701. #elif defined(__clang__)
  139702. "adcs r4, %[r]\n\t"
  139703. #else
  139704. "adc r4, %[r]\n\t"
  139705. #endif
  139706. "# A[4] * B[4]\n\t"
  139707. "mov %[a], r9\n\t"
  139708. "mov %[b], r10\n\t"
  139709. "ldr %[a], [%[a], #16]\n\t"
  139710. "ldr %[b], [%[b], #16]\n\t"
  139711. "uxth r6, %[a]\n\t"
  139712. "uxth r7, %[b]\n\t"
  139713. #ifdef WOLFSSL_KEIL
  139714. "muls r7, r6, r7\n\t"
  139715. #elif defined(__clang__)
  139716. "muls r7, r6\n\t"
  139717. #else
  139718. "mul r7, r6\n\t"
  139719. #endif
  139720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139721. "adds r5, r5, r7\n\t"
  139722. #else
  139723. "add r5, r5, r7\n\t"
  139724. #endif
  139725. #ifdef WOLFSSL_KEIL
  139726. "adcs r3, r3, %[r]\n\t"
  139727. #elif defined(__clang__)
  139728. "adcs r3, %[r]\n\t"
  139729. #else
  139730. "adc r3, %[r]\n\t"
  139731. #endif
  139732. #ifdef WOLFSSL_KEIL
  139733. "adcs r4, r4, %[r]\n\t"
  139734. #elif defined(__clang__)
  139735. "adcs r4, %[r]\n\t"
  139736. #else
  139737. "adc r4, %[r]\n\t"
  139738. #endif
  139739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139740. "lsrs r7, %[b], #16\n\t"
  139741. #else
  139742. "lsr r7, %[b], #16\n\t"
  139743. #endif
  139744. #ifdef WOLFSSL_KEIL
  139745. "muls r6, r7, r6\n\t"
  139746. #elif defined(__clang__)
  139747. "muls r6, r7\n\t"
  139748. #else
  139749. "mul r6, r7\n\t"
  139750. #endif
  139751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139752. "lsrs r7, r6, #16\n\t"
  139753. #else
  139754. "lsr r7, r6, #16\n\t"
  139755. #endif
  139756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139757. "lsls r6, r6, #16\n\t"
  139758. #else
  139759. "lsl r6, r6, #16\n\t"
  139760. #endif
  139761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139762. "adds r5, r5, r6\n\t"
  139763. #else
  139764. "add r5, r5, r6\n\t"
  139765. #endif
  139766. #ifdef WOLFSSL_KEIL
  139767. "adcs r3, r3, r7\n\t"
  139768. #elif defined(__clang__)
  139769. "adcs r3, r7\n\t"
  139770. #else
  139771. "adc r3, r7\n\t"
  139772. #endif
  139773. #ifdef WOLFSSL_KEIL
  139774. "adcs r4, r4, %[r]\n\t"
  139775. #elif defined(__clang__)
  139776. "adcs r4, %[r]\n\t"
  139777. #else
  139778. "adc r4, %[r]\n\t"
  139779. #endif
  139780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139781. "lsrs r6, %[a], #16\n\t"
  139782. #else
  139783. "lsr r6, %[a], #16\n\t"
  139784. #endif
  139785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139786. "lsrs r7, %[b], #16\n\t"
  139787. #else
  139788. "lsr r7, %[b], #16\n\t"
  139789. #endif
  139790. #ifdef WOLFSSL_KEIL
  139791. "muls r7, r6, r7\n\t"
  139792. #elif defined(__clang__)
  139793. "muls r7, r6\n\t"
  139794. #else
  139795. "mul r7, r6\n\t"
  139796. #endif
  139797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139798. "adds r3, r3, r7\n\t"
  139799. #else
  139800. "add r3, r3, r7\n\t"
  139801. #endif
  139802. #ifdef WOLFSSL_KEIL
  139803. "adcs r4, r4, %[r]\n\t"
  139804. #elif defined(__clang__)
  139805. "adcs r4, %[r]\n\t"
  139806. #else
  139807. "adc r4, %[r]\n\t"
  139808. #endif
  139809. "uxth r7, %[b]\n\t"
  139810. #ifdef WOLFSSL_KEIL
  139811. "muls r6, r7, r6\n\t"
  139812. #elif defined(__clang__)
  139813. "muls r6, r7\n\t"
  139814. #else
  139815. "mul r6, r7\n\t"
  139816. #endif
  139817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139818. "lsrs r7, r6, #16\n\t"
  139819. #else
  139820. "lsr r7, r6, #16\n\t"
  139821. #endif
  139822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139823. "lsls r6, r6, #16\n\t"
  139824. #else
  139825. "lsl r6, r6, #16\n\t"
  139826. #endif
  139827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139828. "adds r5, r5, r6\n\t"
  139829. #else
  139830. "add r5, r5, r6\n\t"
  139831. #endif
  139832. #ifdef WOLFSSL_KEIL
  139833. "adcs r3, r3, r7\n\t"
  139834. #elif defined(__clang__)
  139835. "adcs r3, r7\n\t"
  139836. #else
  139837. "adc r3, r7\n\t"
  139838. #endif
  139839. #ifdef WOLFSSL_KEIL
  139840. "adcs r4, r4, %[r]\n\t"
  139841. #elif defined(__clang__)
  139842. "adcs r4, %[r]\n\t"
  139843. #else
  139844. "adc r4, %[r]\n\t"
  139845. #endif
  139846. "# A[3] * B[5]\n\t"
  139847. "mov %[a], r9\n\t"
  139848. "mov %[b], r10\n\t"
  139849. "ldr %[a], [%[a], #12]\n\t"
  139850. "ldr %[b], [%[b], #20]\n\t"
  139851. "uxth r6, %[a]\n\t"
  139852. "uxth r7, %[b]\n\t"
  139853. #ifdef WOLFSSL_KEIL
  139854. "muls r7, r6, r7\n\t"
  139855. #elif defined(__clang__)
  139856. "muls r7, r6\n\t"
  139857. #else
  139858. "mul r7, r6\n\t"
  139859. #endif
  139860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139861. "adds r5, r5, r7\n\t"
  139862. #else
  139863. "add r5, r5, r7\n\t"
  139864. #endif
  139865. #ifdef WOLFSSL_KEIL
  139866. "adcs r3, r3, %[r]\n\t"
  139867. #elif defined(__clang__)
  139868. "adcs r3, %[r]\n\t"
  139869. #else
  139870. "adc r3, %[r]\n\t"
  139871. #endif
  139872. #ifdef WOLFSSL_KEIL
  139873. "adcs r4, r4, %[r]\n\t"
  139874. #elif defined(__clang__)
  139875. "adcs r4, %[r]\n\t"
  139876. #else
  139877. "adc r4, %[r]\n\t"
  139878. #endif
  139879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139880. "lsrs r7, %[b], #16\n\t"
  139881. #else
  139882. "lsr r7, %[b], #16\n\t"
  139883. #endif
  139884. #ifdef WOLFSSL_KEIL
  139885. "muls r6, r7, r6\n\t"
  139886. #elif defined(__clang__)
  139887. "muls r6, r7\n\t"
  139888. #else
  139889. "mul r6, r7\n\t"
  139890. #endif
  139891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139892. "lsrs r7, r6, #16\n\t"
  139893. #else
  139894. "lsr r7, r6, #16\n\t"
  139895. #endif
  139896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139897. "lsls r6, r6, #16\n\t"
  139898. #else
  139899. "lsl r6, r6, #16\n\t"
  139900. #endif
  139901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139902. "adds r5, r5, r6\n\t"
  139903. #else
  139904. "add r5, r5, r6\n\t"
  139905. #endif
  139906. #ifdef WOLFSSL_KEIL
  139907. "adcs r3, r3, r7\n\t"
  139908. #elif defined(__clang__)
  139909. "adcs r3, r7\n\t"
  139910. #else
  139911. "adc r3, r7\n\t"
  139912. #endif
  139913. #ifdef WOLFSSL_KEIL
  139914. "adcs r4, r4, %[r]\n\t"
  139915. #elif defined(__clang__)
  139916. "adcs r4, %[r]\n\t"
  139917. #else
  139918. "adc r4, %[r]\n\t"
  139919. #endif
  139920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139921. "lsrs r6, %[a], #16\n\t"
  139922. #else
  139923. "lsr r6, %[a], #16\n\t"
  139924. #endif
  139925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139926. "lsrs r7, %[b], #16\n\t"
  139927. #else
  139928. "lsr r7, %[b], #16\n\t"
  139929. #endif
  139930. #ifdef WOLFSSL_KEIL
  139931. "muls r7, r6, r7\n\t"
  139932. #elif defined(__clang__)
  139933. "muls r7, r6\n\t"
  139934. #else
  139935. "mul r7, r6\n\t"
  139936. #endif
  139937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139938. "adds r3, r3, r7\n\t"
  139939. #else
  139940. "add r3, r3, r7\n\t"
  139941. #endif
  139942. #ifdef WOLFSSL_KEIL
  139943. "adcs r4, r4, %[r]\n\t"
  139944. #elif defined(__clang__)
  139945. "adcs r4, %[r]\n\t"
  139946. #else
  139947. "adc r4, %[r]\n\t"
  139948. #endif
  139949. "uxth r7, %[b]\n\t"
  139950. #ifdef WOLFSSL_KEIL
  139951. "muls r6, r7, r6\n\t"
  139952. #elif defined(__clang__)
  139953. "muls r6, r7\n\t"
  139954. #else
  139955. "mul r6, r7\n\t"
  139956. #endif
  139957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139958. "lsrs r7, r6, #16\n\t"
  139959. #else
  139960. "lsr r7, r6, #16\n\t"
  139961. #endif
  139962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139963. "lsls r6, r6, #16\n\t"
  139964. #else
  139965. "lsl r6, r6, #16\n\t"
  139966. #endif
  139967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  139968. "adds r5, r5, r6\n\t"
  139969. #else
  139970. "add r5, r5, r6\n\t"
  139971. #endif
  139972. #ifdef WOLFSSL_KEIL
  139973. "adcs r3, r3, r7\n\t"
  139974. #elif defined(__clang__)
  139975. "adcs r3, r7\n\t"
  139976. #else
  139977. "adc r3, r7\n\t"
  139978. #endif
  139979. #ifdef WOLFSSL_KEIL
  139980. "adcs r4, r4, %[r]\n\t"
  139981. #elif defined(__clang__)
  139982. "adcs r4, %[r]\n\t"
  139983. #else
  139984. "adc r4, %[r]\n\t"
  139985. #endif
  139986. "# A[2] * B[6]\n\t"
  139987. "mov %[a], r9\n\t"
  139988. "mov %[b], r10\n\t"
  139989. "ldr %[a], [%[a], #8]\n\t"
  139990. "ldr %[b], [%[b], #24]\n\t"
  139991. "uxth r6, %[a]\n\t"
  139992. "uxth r7, %[b]\n\t"
  139993. #ifdef WOLFSSL_KEIL
  139994. "muls r7, r6, r7\n\t"
  139995. #elif defined(__clang__)
  139996. "muls r7, r6\n\t"
  139997. #else
  139998. "mul r7, r6\n\t"
  139999. #endif
  140000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140001. "adds r5, r5, r7\n\t"
  140002. #else
  140003. "add r5, r5, r7\n\t"
  140004. #endif
  140005. #ifdef WOLFSSL_KEIL
  140006. "adcs r3, r3, %[r]\n\t"
  140007. #elif defined(__clang__)
  140008. "adcs r3, %[r]\n\t"
  140009. #else
  140010. "adc r3, %[r]\n\t"
  140011. #endif
  140012. #ifdef WOLFSSL_KEIL
  140013. "adcs r4, r4, %[r]\n\t"
  140014. #elif defined(__clang__)
  140015. "adcs r4, %[r]\n\t"
  140016. #else
  140017. "adc r4, %[r]\n\t"
  140018. #endif
  140019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140020. "lsrs r7, %[b], #16\n\t"
  140021. #else
  140022. "lsr r7, %[b], #16\n\t"
  140023. #endif
  140024. #ifdef WOLFSSL_KEIL
  140025. "muls r6, r7, r6\n\t"
  140026. #elif defined(__clang__)
  140027. "muls r6, r7\n\t"
  140028. #else
  140029. "mul r6, r7\n\t"
  140030. #endif
  140031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140032. "lsrs r7, r6, #16\n\t"
  140033. #else
  140034. "lsr r7, r6, #16\n\t"
  140035. #endif
  140036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140037. "lsls r6, r6, #16\n\t"
  140038. #else
  140039. "lsl r6, r6, #16\n\t"
  140040. #endif
  140041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140042. "adds r5, r5, r6\n\t"
  140043. #else
  140044. "add r5, r5, r6\n\t"
  140045. #endif
  140046. #ifdef WOLFSSL_KEIL
  140047. "adcs r3, r3, r7\n\t"
  140048. #elif defined(__clang__)
  140049. "adcs r3, r7\n\t"
  140050. #else
  140051. "adc r3, r7\n\t"
  140052. #endif
  140053. #ifdef WOLFSSL_KEIL
  140054. "adcs r4, r4, %[r]\n\t"
  140055. #elif defined(__clang__)
  140056. "adcs r4, %[r]\n\t"
  140057. #else
  140058. "adc r4, %[r]\n\t"
  140059. #endif
  140060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140061. "lsrs r6, %[a], #16\n\t"
  140062. #else
  140063. "lsr r6, %[a], #16\n\t"
  140064. #endif
  140065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140066. "lsrs r7, %[b], #16\n\t"
  140067. #else
  140068. "lsr r7, %[b], #16\n\t"
  140069. #endif
  140070. #ifdef WOLFSSL_KEIL
  140071. "muls r7, r6, r7\n\t"
  140072. #elif defined(__clang__)
  140073. "muls r7, r6\n\t"
  140074. #else
  140075. "mul r7, r6\n\t"
  140076. #endif
  140077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140078. "adds r3, r3, r7\n\t"
  140079. #else
  140080. "add r3, r3, r7\n\t"
  140081. #endif
  140082. #ifdef WOLFSSL_KEIL
  140083. "adcs r4, r4, %[r]\n\t"
  140084. #elif defined(__clang__)
  140085. "adcs r4, %[r]\n\t"
  140086. #else
  140087. "adc r4, %[r]\n\t"
  140088. #endif
  140089. "uxth r7, %[b]\n\t"
  140090. #ifdef WOLFSSL_KEIL
  140091. "muls r6, r7, r6\n\t"
  140092. #elif defined(__clang__)
  140093. "muls r6, r7\n\t"
  140094. #else
  140095. "mul r6, r7\n\t"
  140096. #endif
  140097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140098. "lsrs r7, r6, #16\n\t"
  140099. #else
  140100. "lsr r7, r6, #16\n\t"
  140101. #endif
  140102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140103. "lsls r6, r6, #16\n\t"
  140104. #else
  140105. "lsl r6, r6, #16\n\t"
  140106. #endif
  140107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140108. "adds r5, r5, r6\n\t"
  140109. #else
  140110. "add r5, r5, r6\n\t"
  140111. #endif
  140112. #ifdef WOLFSSL_KEIL
  140113. "adcs r3, r3, r7\n\t"
  140114. #elif defined(__clang__)
  140115. "adcs r3, r7\n\t"
  140116. #else
  140117. "adc r3, r7\n\t"
  140118. #endif
  140119. #ifdef WOLFSSL_KEIL
  140120. "adcs r4, r4, %[r]\n\t"
  140121. #elif defined(__clang__)
  140122. "adcs r4, %[r]\n\t"
  140123. #else
  140124. "adc r4, %[r]\n\t"
  140125. #endif
  140126. "# A[1] * B[7]\n\t"
  140127. "mov %[a], r9\n\t"
  140128. "mov %[b], r10\n\t"
  140129. "ldr %[a], [%[a], #4]\n\t"
  140130. "ldr %[b], [%[b], #28]\n\t"
  140131. "uxth r6, %[a]\n\t"
  140132. "uxth r7, %[b]\n\t"
  140133. #ifdef WOLFSSL_KEIL
  140134. "muls r7, r6, r7\n\t"
  140135. #elif defined(__clang__)
  140136. "muls r7, r6\n\t"
  140137. #else
  140138. "mul r7, r6\n\t"
  140139. #endif
  140140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140141. "adds r5, r5, r7\n\t"
  140142. #else
  140143. "add r5, r5, r7\n\t"
  140144. #endif
  140145. #ifdef WOLFSSL_KEIL
  140146. "adcs r3, r3, %[r]\n\t"
  140147. #elif defined(__clang__)
  140148. "adcs r3, %[r]\n\t"
  140149. #else
  140150. "adc r3, %[r]\n\t"
  140151. #endif
  140152. #ifdef WOLFSSL_KEIL
  140153. "adcs r4, r4, %[r]\n\t"
  140154. #elif defined(__clang__)
  140155. "adcs r4, %[r]\n\t"
  140156. #else
  140157. "adc r4, %[r]\n\t"
  140158. #endif
  140159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140160. "lsrs r7, %[b], #16\n\t"
  140161. #else
  140162. "lsr r7, %[b], #16\n\t"
  140163. #endif
  140164. #ifdef WOLFSSL_KEIL
  140165. "muls r6, r7, r6\n\t"
  140166. #elif defined(__clang__)
  140167. "muls r6, r7\n\t"
  140168. #else
  140169. "mul r6, r7\n\t"
  140170. #endif
  140171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140172. "lsrs r7, r6, #16\n\t"
  140173. #else
  140174. "lsr r7, r6, #16\n\t"
  140175. #endif
  140176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140177. "lsls r6, r6, #16\n\t"
  140178. #else
  140179. "lsl r6, r6, #16\n\t"
  140180. #endif
  140181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140182. "adds r5, r5, r6\n\t"
  140183. #else
  140184. "add r5, r5, r6\n\t"
  140185. #endif
  140186. #ifdef WOLFSSL_KEIL
  140187. "adcs r3, r3, r7\n\t"
  140188. #elif defined(__clang__)
  140189. "adcs r3, r7\n\t"
  140190. #else
  140191. "adc r3, r7\n\t"
  140192. #endif
  140193. #ifdef WOLFSSL_KEIL
  140194. "adcs r4, r4, %[r]\n\t"
  140195. #elif defined(__clang__)
  140196. "adcs r4, %[r]\n\t"
  140197. #else
  140198. "adc r4, %[r]\n\t"
  140199. #endif
  140200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140201. "lsrs r6, %[a], #16\n\t"
  140202. #else
  140203. "lsr r6, %[a], #16\n\t"
  140204. #endif
  140205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140206. "lsrs r7, %[b], #16\n\t"
  140207. #else
  140208. "lsr r7, %[b], #16\n\t"
  140209. #endif
  140210. #ifdef WOLFSSL_KEIL
  140211. "muls r7, r6, r7\n\t"
  140212. #elif defined(__clang__)
  140213. "muls r7, r6\n\t"
  140214. #else
  140215. "mul r7, r6\n\t"
  140216. #endif
  140217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140218. "adds r3, r3, r7\n\t"
  140219. #else
  140220. "add r3, r3, r7\n\t"
  140221. #endif
  140222. #ifdef WOLFSSL_KEIL
  140223. "adcs r4, r4, %[r]\n\t"
  140224. #elif defined(__clang__)
  140225. "adcs r4, %[r]\n\t"
  140226. #else
  140227. "adc r4, %[r]\n\t"
  140228. #endif
  140229. "uxth r7, %[b]\n\t"
  140230. #ifdef WOLFSSL_KEIL
  140231. "muls r6, r7, r6\n\t"
  140232. #elif defined(__clang__)
  140233. "muls r6, r7\n\t"
  140234. #else
  140235. "mul r6, r7\n\t"
  140236. #endif
  140237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140238. "lsrs r7, r6, #16\n\t"
  140239. #else
  140240. "lsr r7, r6, #16\n\t"
  140241. #endif
  140242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140243. "lsls r6, r6, #16\n\t"
  140244. #else
  140245. "lsl r6, r6, #16\n\t"
  140246. #endif
  140247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140248. "adds r5, r5, r6\n\t"
  140249. #else
  140250. "add r5, r5, r6\n\t"
  140251. #endif
  140252. #ifdef WOLFSSL_KEIL
  140253. "adcs r3, r3, r7\n\t"
  140254. #elif defined(__clang__)
  140255. "adcs r3, r7\n\t"
  140256. #else
  140257. "adc r3, r7\n\t"
  140258. #endif
  140259. #ifdef WOLFSSL_KEIL
  140260. "adcs r4, r4, %[r]\n\t"
  140261. #elif defined(__clang__)
  140262. "adcs r4, %[r]\n\t"
  140263. #else
  140264. "adc r4, %[r]\n\t"
  140265. #endif
  140266. "# A[0] * B[8]\n\t"
  140267. "mov %[a], r9\n\t"
  140268. "mov %[b], r10\n\t"
  140269. "ldr %[a], [%[a]]\n\t"
  140270. "ldr %[b], [%[b], #32]\n\t"
  140271. "uxth r6, %[a]\n\t"
  140272. "uxth r7, %[b]\n\t"
  140273. #ifdef WOLFSSL_KEIL
  140274. "muls r7, r6, r7\n\t"
  140275. #elif defined(__clang__)
  140276. "muls r7, r6\n\t"
  140277. #else
  140278. "mul r7, r6\n\t"
  140279. #endif
  140280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140281. "adds r5, r5, r7\n\t"
  140282. #else
  140283. "add r5, r5, r7\n\t"
  140284. #endif
  140285. #ifdef WOLFSSL_KEIL
  140286. "adcs r3, r3, %[r]\n\t"
  140287. #elif defined(__clang__)
  140288. "adcs r3, %[r]\n\t"
  140289. #else
  140290. "adc r3, %[r]\n\t"
  140291. #endif
  140292. #ifdef WOLFSSL_KEIL
  140293. "adcs r4, r4, %[r]\n\t"
  140294. #elif defined(__clang__)
  140295. "adcs r4, %[r]\n\t"
  140296. #else
  140297. "adc r4, %[r]\n\t"
  140298. #endif
  140299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140300. "lsrs r7, %[b], #16\n\t"
  140301. #else
  140302. "lsr r7, %[b], #16\n\t"
  140303. #endif
  140304. #ifdef WOLFSSL_KEIL
  140305. "muls r6, r7, r6\n\t"
  140306. #elif defined(__clang__)
  140307. "muls r6, r7\n\t"
  140308. #else
  140309. "mul r6, r7\n\t"
  140310. #endif
  140311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140312. "lsrs r7, r6, #16\n\t"
  140313. #else
  140314. "lsr r7, r6, #16\n\t"
  140315. #endif
  140316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140317. "lsls r6, r6, #16\n\t"
  140318. #else
  140319. "lsl r6, r6, #16\n\t"
  140320. #endif
  140321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140322. "adds r5, r5, r6\n\t"
  140323. #else
  140324. "add r5, r5, r6\n\t"
  140325. #endif
  140326. #ifdef WOLFSSL_KEIL
  140327. "adcs r3, r3, r7\n\t"
  140328. #elif defined(__clang__)
  140329. "adcs r3, r7\n\t"
  140330. #else
  140331. "adc r3, r7\n\t"
  140332. #endif
  140333. #ifdef WOLFSSL_KEIL
  140334. "adcs r4, r4, %[r]\n\t"
  140335. #elif defined(__clang__)
  140336. "adcs r4, %[r]\n\t"
  140337. #else
  140338. "adc r4, %[r]\n\t"
  140339. #endif
  140340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140341. "lsrs r6, %[a], #16\n\t"
  140342. #else
  140343. "lsr r6, %[a], #16\n\t"
  140344. #endif
  140345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140346. "lsrs r7, %[b], #16\n\t"
  140347. #else
  140348. "lsr r7, %[b], #16\n\t"
  140349. #endif
  140350. #ifdef WOLFSSL_KEIL
  140351. "muls r7, r6, r7\n\t"
  140352. #elif defined(__clang__)
  140353. "muls r7, r6\n\t"
  140354. #else
  140355. "mul r7, r6\n\t"
  140356. #endif
  140357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140358. "adds r3, r3, r7\n\t"
  140359. #else
  140360. "add r3, r3, r7\n\t"
  140361. #endif
  140362. #ifdef WOLFSSL_KEIL
  140363. "adcs r4, r4, %[r]\n\t"
  140364. #elif defined(__clang__)
  140365. "adcs r4, %[r]\n\t"
  140366. #else
  140367. "adc r4, %[r]\n\t"
  140368. #endif
  140369. "uxth r7, %[b]\n\t"
  140370. #ifdef WOLFSSL_KEIL
  140371. "muls r6, r7, r6\n\t"
  140372. #elif defined(__clang__)
  140373. "muls r6, r7\n\t"
  140374. #else
  140375. "mul r6, r7\n\t"
  140376. #endif
  140377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140378. "lsrs r7, r6, #16\n\t"
  140379. #else
  140380. "lsr r7, r6, #16\n\t"
  140381. #endif
  140382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140383. "lsls r6, r6, #16\n\t"
  140384. #else
  140385. "lsl r6, r6, #16\n\t"
  140386. #endif
  140387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140388. "adds r5, r5, r6\n\t"
  140389. #else
  140390. "add r5, r5, r6\n\t"
  140391. #endif
  140392. #ifdef WOLFSSL_KEIL
  140393. "adcs r3, r3, r7\n\t"
  140394. #elif defined(__clang__)
  140395. "adcs r3, r7\n\t"
  140396. #else
  140397. "adc r3, r7\n\t"
  140398. #endif
  140399. #ifdef WOLFSSL_KEIL
  140400. "adcs r4, r4, %[r]\n\t"
  140401. #elif defined(__clang__)
  140402. "adcs r4, %[r]\n\t"
  140403. #else
  140404. "adc r4, %[r]\n\t"
  140405. #endif
  140406. "str r5, [sp, #32]\n\t"
  140407. "# A[0] * B[9]\n\t"
  140408. "movs r5, #0\n\t"
  140409. "mov %[a], r9\n\t"
  140410. "mov %[b], r10\n\t"
  140411. "ldr %[a], [%[a]]\n\t"
  140412. "ldr %[b], [%[b], #36]\n\t"
  140413. "uxth r6, %[a]\n\t"
  140414. "uxth r7, %[b]\n\t"
  140415. #ifdef WOLFSSL_KEIL
  140416. "muls r7, r6, r7\n\t"
  140417. #elif defined(__clang__)
  140418. "muls r7, r6\n\t"
  140419. #else
  140420. "mul r7, r6\n\t"
  140421. #endif
  140422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140423. "adds r3, r3, r7\n\t"
  140424. #else
  140425. "add r3, r3, r7\n\t"
  140426. #endif
  140427. #ifdef WOLFSSL_KEIL
  140428. "adcs r4, r4, %[r]\n\t"
  140429. #elif defined(__clang__)
  140430. "adcs r4, %[r]\n\t"
  140431. #else
  140432. "adc r4, %[r]\n\t"
  140433. #endif
  140434. #ifdef WOLFSSL_KEIL
  140435. "adcs r5, r5, %[r]\n\t"
  140436. #elif defined(__clang__)
  140437. "adcs r5, %[r]\n\t"
  140438. #else
  140439. "adc r5, %[r]\n\t"
  140440. #endif
  140441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140442. "lsrs r7, %[b], #16\n\t"
  140443. #else
  140444. "lsr r7, %[b], #16\n\t"
  140445. #endif
  140446. #ifdef WOLFSSL_KEIL
  140447. "muls r6, r7, r6\n\t"
  140448. #elif defined(__clang__)
  140449. "muls r6, r7\n\t"
  140450. #else
  140451. "mul r6, r7\n\t"
  140452. #endif
  140453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140454. "lsrs r7, r6, #16\n\t"
  140455. #else
  140456. "lsr r7, r6, #16\n\t"
  140457. #endif
  140458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140459. "lsls r6, r6, #16\n\t"
  140460. #else
  140461. "lsl r6, r6, #16\n\t"
  140462. #endif
  140463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140464. "adds r3, r3, r6\n\t"
  140465. #else
  140466. "add r3, r3, r6\n\t"
  140467. #endif
  140468. #ifdef WOLFSSL_KEIL
  140469. "adcs r4, r4, r7\n\t"
  140470. #elif defined(__clang__)
  140471. "adcs r4, r7\n\t"
  140472. #else
  140473. "adc r4, r7\n\t"
  140474. #endif
  140475. #ifdef WOLFSSL_KEIL
  140476. "adcs r5, r5, %[r]\n\t"
  140477. #elif defined(__clang__)
  140478. "adcs r5, %[r]\n\t"
  140479. #else
  140480. "adc r5, %[r]\n\t"
  140481. #endif
  140482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140483. "lsrs r6, %[a], #16\n\t"
  140484. #else
  140485. "lsr r6, %[a], #16\n\t"
  140486. #endif
  140487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140488. "lsrs r7, %[b], #16\n\t"
  140489. #else
  140490. "lsr r7, %[b], #16\n\t"
  140491. #endif
  140492. #ifdef WOLFSSL_KEIL
  140493. "muls r7, r6, r7\n\t"
  140494. #elif defined(__clang__)
  140495. "muls r7, r6\n\t"
  140496. #else
  140497. "mul r7, r6\n\t"
  140498. #endif
  140499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140500. "adds r4, r4, r7\n\t"
  140501. #else
  140502. "add r4, r4, r7\n\t"
  140503. #endif
  140504. #ifdef WOLFSSL_KEIL
  140505. "adcs r5, r5, %[r]\n\t"
  140506. #elif defined(__clang__)
  140507. "adcs r5, %[r]\n\t"
  140508. #else
  140509. "adc r5, %[r]\n\t"
  140510. #endif
  140511. "uxth r7, %[b]\n\t"
  140512. #ifdef WOLFSSL_KEIL
  140513. "muls r6, r7, r6\n\t"
  140514. #elif defined(__clang__)
  140515. "muls r6, r7\n\t"
  140516. #else
  140517. "mul r6, r7\n\t"
  140518. #endif
  140519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140520. "lsrs r7, r6, #16\n\t"
  140521. #else
  140522. "lsr r7, r6, #16\n\t"
  140523. #endif
  140524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140525. "lsls r6, r6, #16\n\t"
  140526. #else
  140527. "lsl r6, r6, #16\n\t"
  140528. #endif
  140529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140530. "adds r3, r3, r6\n\t"
  140531. #else
  140532. "add r3, r3, r6\n\t"
  140533. #endif
  140534. #ifdef WOLFSSL_KEIL
  140535. "adcs r4, r4, r7\n\t"
  140536. #elif defined(__clang__)
  140537. "adcs r4, r7\n\t"
  140538. #else
  140539. "adc r4, r7\n\t"
  140540. #endif
  140541. #ifdef WOLFSSL_KEIL
  140542. "adcs r5, r5, %[r]\n\t"
  140543. #elif defined(__clang__)
  140544. "adcs r5, %[r]\n\t"
  140545. #else
  140546. "adc r5, %[r]\n\t"
  140547. #endif
  140548. "# A[1] * B[8]\n\t"
  140549. "mov %[a], r9\n\t"
  140550. "mov %[b], r10\n\t"
  140551. "ldr %[a], [%[a], #4]\n\t"
  140552. "ldr %[b], [%[b], #32]\n\t"
  140553. "uxth r6, %[a]\n\t"
  140554. "uxth r7, %[b]\n\t"
  140555. #ifdef WOLFSSL_KEIL
  140556. "muls r7, r6, r7\n\t"
  140557. #elif defined(__clang__)
  140558. "muls r7, r6\n\t"
  140559. #else
  140560. "mul r7, r6\n\t"
  140561. #endif
  140562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140563. "adds r3, r3, r7\n\t"
  140564. #else
  140565. "add r3, r3, r7\n\t"
  140566. #endif
  140567. #ifdef WOLFSSL_KEIL
  140568. "adcs r4, r4, %[r]\n\t"
  140569. #elif defined(__clang__)
  140570. "adcs r4, %[r]\n\t"
  140571. #else
  140572. "adc r4, %[r]\n\t"
  140573. #endif
  140574. #ifdef WOLFSSL_KEIL
  140575. "adcs r5, r5, %[r]\n\t"
  140576. #elif defined(__clang__)
  140577. "adcs r5, %[r]\n\t"
  140578. #else
  140579. "adc r5, %[r]\n\t"
  140580. #endif
  140581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140582. "lsrs r7, %[b], #16\n\t"
  140583. #else
  140584. "lsr r7, %[b], #16\n\t"
  140585. #endif
  140586. #ifdef WOLFSSL_KEIL
  140587. "muls r6, r7, r6\n\t"
  140588. #elif defined(__clang__)
  140589. "muls r6, r7\n\t"
  140590. #else
  140591. "mul r6, r7\n\t"
  140592. #endif
  140593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140594. "lsrs r7, r6, #16\n\t"
  140595. #else
  140596. "lsr r7, r6, #16\n\t"
  140597. #endif
  140598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140599. "lsls r6, r6, #16\n\t"
  140600. #else
  140601. "lsl r6, r6, #16\n\t"
  140602. #endif
  140603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140604. "adds r3, r3, r6\n\t"
  140605. #else
  140606. "add r3, r3, r6\n\t"
  140607. #endif
  140608. #ifdef WOLFSSL_KEIL
  140609. "adcs r4, r4, r7\n\t"
  140610. #elif defined(__clang__)
  140611. "adcs r4, r7\n\t"
  140612. #else
  140613. "adc r4, r7\n\t"
  140614. #endif
  140615. #ifdef WOLFSSL_KEIL
  140616. "adcs r5, r5, %[r]\n\t"
  140617. #elif defined(__clang__)
  140618. "adcs r5, %[r]\n\t"
  140619. #else
  140620. "adc r5, %[r]\n\t"
  140621. #endif
  140622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140623. "lsrs r6, %[a], #16\n\t"
  140624. #else
  140625. "lsr r6, %[a], #16\n\t"
  140626. #endif
  140627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140628. "lsrs r7, %[b], #16\n\t"
  140629. #else
  140630. "lsr r7, %[b], #16\n\t"
  140631. #endif
  140632. #ifdef WOLFSSL_KEIL
  140633. "muls r7, r6, r7\n\t"
  140634. #elif defined(__clang__)
  140635. "muls r7, r6\n\t"
  140636. #else
  140637. "mul r7, r6\n\t"
  140638. #endif
  140639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140640. "adds r4, r4, r7\n\t"
  140641. #else
  140642. "add r4, r4, r7\n\t"
  140643. #endif
  140644. #ifdef WOLFSSL_KEIL
  140645. "adcs r5, r5, %[r]\n\t"
  140646. #elif defined(__clang__)
  140647. "adcs r5, %[r]\n\t"
  140648. #else
  140649. "adc r5, %[r]\n\t"
  140650. #endif
  140651. "uxth r7, %[b]\n\t"
  140652. #ifdef WOLFSSL_KEIL
  140653. "muls r6, r7, r6\n\t"
  140654. #elif defined(__clang__)
  140655. "muls r6, r7\n\t"
  140656. #else
  140657. "mul r6, r7\n\t"
  140658. #endif
  140659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140660. "lsrs r7, r6, #16\n\t"
  140661. #else
  140662. "lsr r7, r6, #16\n\t"
  140663. #endif
  140664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140665. "lsls r6, r6, #16\n\t"
  140666. #else
  140667. "lsl r6, r6, #16\n\t"
  140668. #endif
  140669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140670. "adds r3, r3, r6\n\t"
  140671. #else
  140672. "add r3, r3, r6\n\t"
  140673. #endif
  140674. #ifdef WOLFSSL_KEIL
  140675. "adcs r4, r4, r7\n\t"
  140676. #elif defined(__clang__)
  140677. "adcs r4, r7\n\t"
  140678. #else
  140679. "adc r4, r7\n\t"
  140680. #endif
  140681. #ifdef WOLFSSL_KEIL
  140682. "adcs r5, r5, %[r]\n\t"
  140683. #elif defined(__clang__)
  140684. "adcs r5, %[r]\n\t"
  140685. #else
  140686. "adc r5, %[r]\n\t"
  140687. #endif
  140688. "# A[2] * B[7]\n\t"
  140689. "mov %[a], r9\n\t"
  140690. "mov %[b], r10\n\t"
  140691. "ldr %[a], [%[a], #8]\n\t"
  140692. "ldr %[b], [%[b], #28]\n\t"
  140693. "uxth r6, %[a]\n\t"
  140694. "uxth r7, %[b]\n\t"
  140695. #ifdef WOLFSSL_KEIL
  140696. "muls r7, r6, r7\n\t"
  140697. #elif defined(__clang__)
  140698. "muls r7, r6\n\t"
  140699. #else
  140700. "mul r7, r6\n\t"
  140701. #endif
  140702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140703. "adds r3, r3, r7\n\t"
  140704. #else
  140705. "add r3, r3, r7\n\t"
  140706. #endif
  140707. #ifdef WOLFSSL_KEIL
  140708. "adcs r4, r4, %[r]\n\t"
  140709. #elif defined(__clang__)
  140710. "adcs r4, %[r]\n\t"
  140711. #else
  140712. "adc r4, %[r]\n\t"
  140713. #endif
  140714. #ifdef WOLFSSL_KEIL
  140715. "adcs r5, r5, %[r]\n\t"
  140716. #elif defined(__clang__)
  140717. "adcs r5, %[r]\n\t"
  140718. #else
  140719. "adc r5, %[r]\n\t"
  140720. #endif
  140721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140722. "lsrs r7, %[b], #16\n\t"
  140723. #else
  140724. "lsr r7, %[b], #16\n\t"
  140725. #endif
  140726. #ifdef WOLFSSL_KEIL
  140727. "muls r6, r7, r6\n\t"
  140728. #elif defined(__clang__)
  140729. "muls r6, r7\n\t"
  140730. #else
  140731. "mul r6, r7\n\t"
  140732. #endif
  140733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140734. "lsrs r7, r6, #16\n\t"
  140735. #else
  140736. "lsr r7, r6, #16\n\t"
  140737. #endif
  140738. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140739. "lsls r6, r6, #16\n\t"
  140740. #else
  140741. "lsl r6, r6, #16\n\t"
  140742. #endif
  140743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140744. "adds r3, r3, r6\n\t"
  140745. #else
  140746. "add r3, r3, r6\n\t"
  140747. #endif
  140748. #ifdef WOLFSSL_KEIL
  140749. "adcs r4, r4, r7\n\t"
  140750. #elif defined(__clang__)
  140751. "adcs r4, r7\n\t"
  140752. #else
  140753. "adc r4, r7\n\t"
  140754. #endif
  140755. #ifdef WOLFSSL_KEIL
  140756. "adcs r5, r5, %[r]\n\t"
  140757. #elif defined(__clang__)
  140758. "adcs r5, %[r]\n\t"
  140759. #else
  140760. "adc r5, %[r]\n\t"
  140761. #endif
  140762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140763. "lsrs r6, %[a], #16\n\t"
  140764. #else
  140765. "lsr r6, %[a], #16\n\t"
  140766. #endif
  140767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140768. "lsrs r7, %[b], #16\n\t"
  140769. #else
  140770. "lsr r7, %[b], #16\n\t"
  140771. #endif
  140772. #ifdef WOLFSSL_KEIL
  140773. "muls r7, r6, r7\n\t"
  140774. #elif defined(__clang__)
  140775. "muls r7, r6\n\t"
  140776. #else
  140777. "mul r7, r6\n\t"
  140778. #endif
  140779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140780. "adds r4, r4, r7\n\t"
  140781. #else
  140782. "add r4, r4, r7\n\t"
  140783. #endif
  140784. #ifdef WOLFSSL_KEIL
  140785. "adcs r5, r5, %[r]\n\t"
  140786. #elif defined(__clang__)
  140787. "adcs r5, %[r]\n\t"
  140788. #else
  140789. "adc r5, %[r]\n\t"
  140790. #endif
  140791. "uxth r7, %[b]\n\t"
  140792. #ifdef WOLFSSL_KEIL
  140793. "muls r6, r7, r6\n\t"
  140794. #elif defined(__clang__)
  140795. "muls r6, r7\n\t"
  140796. #else
  140797. "mul r6, r7\n\t"
  140798. #endif
  140799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140800. "lsrs r7, r6, #16\n\t"
  140801. #else
  140802. "lsr r7, r6, #16\n\t"
  140803. #endif
  140804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140805. "lsls r6, r6, #16\n\t"
  140806. #else
  140807. "lsl r6, r6, #16\n\t"
  140808. #endif
  140809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140810. "adds r3, r3, r6\n\t"
  140811. #else
  140812. "add r3, r3, r6\n\t"
  140813. #endif
  140814. #ifdef WOLFSSL_KEIL
  140815. "adcs r4, r4, r7\n\t"
  140816. #elif defined(__clang__)
  140817. "adcs r4, r7\n\t"
  140818. #else
  140819. "adc r4, r7\n\t"
  140820. #endif
  140821. #ifdef WOLFSSL_KEIL
  140822. "adcs r5, r5, %[r]\n\t"
  140823. #elif defined(__clang__)
  140824. "adcs r5, %[r]\n\t"
  140825. #else
  140826. "adc r5, %[r]\n\t"
  140827. #endif
  140828. "# A[3] * B[6]\n\t"
  140829. "mov %[a], r9\n\t"
  140830. "mov %[b], r10\n\t"
  140831. "ldr %[a], [%[a], #12]\n\t"
  140832. "ldr %[b], [%[b], #24]\n\t"
  140833. "uxth r6, %[a]\n\t"
  140834. "uxth r7, %[b]\n\t"
  140835. #ifdef WOLFSSL_KEIL
  140836. "muls r7, r6, r7\n\t"
  140837. #elif defined(__clang__)
  140838. "muls r7, r6\n\t"
  140839. #else
  140840. "mul r7, r6\n\t"
  140841. #endif
  140842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140843. "adds r3, r3, r7\n\t"
  140844. #else
  140845. "add r3, r3, r7\n\t"
  140846. #endif
  140847. #ifdef WOLFSSL_KEIL
  140848. "adcs r4, r4, %[r]\n\t"
  140849. #elif defined(__clang__)
  140850. "adcs r4, %[r]\n\t"
  140851. #else
  140852. "adc r4, %[r]\n\t"
  140853. #endif
  140854. #ifdef WOLFSSL_KEIL
  140855. "adcs r5, r5, %[r]\n\t"
  140856. #elif defined(__clang__)
  140857. "adcs r5, %[r]\n\t"
  140858. #else
  140859. "adc r5, %[r]\n\t"
  140860. #endif
  140861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140862. "lsrs r7, %[b], #16\n\t"
  140863. #else
  140864. "lsr r7, %[b], #16\n\t"
  140865. #endif
  140866. #ifdef WOLFSSL_KEIL
  140867. "muls r6, r7, r6\n\t"
  140868. #elif defined(__clang__)
  140869. "muls r6, r7\n\t"
  140870. #else
  140871. "mul r6, r7\n\t"
  140872. #endif
  140873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140874. "lsrs r7, r6, #16\n\t"
  140875. #else
  140876. "lsr r7, r6, #16\n\t"
  140877. #endif
  140878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140879. "lsls r6, r6, #16\n\t"
  140880. #else
  140881. "lsl r6, r6, #16\n\t"
  140882. #endif
  140883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140884. "adds r3, r3, r6\n\t"
  140885. #else
  140886. "add r3, r3, r6\n\t"
  140887. #endif
  140888. #ifdef WOLFSSL_KEIL
  140889. "adcs r4, r4, r7\n\t"
  140890. #elif defined(__clang__)
  140891. "adcs r4, r7\n\t"
  140892. #else
  140893. "adc r4, r7\n\t"
  140894. #endif
  140895. #ifdef WOLFSSL_KEIL
  140896. "adcs r5, r5, %[r]\n\t"
  140897. #elif defined(__clang__)
  140898. "adcs r5, %[r]\n\t"
  140899. #else
  140900. "adc r5, %[r]\n\t"
  140901. #endif
  140902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140903. "lsrs r6, %[a], #16\n\t"
  140904. #else
  140905. "lsr r6, %[a], #16\n\t"
  140906. #endif
  140907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140908. "lsrs r7, %[b], #16\n\t"
  140909. #else
  140910. "lsr r7, %[b], #16\n\t"
  140911. #endif
  140912. #ifdef WOLFSSL_KEIL
  140913. "muls r7, r6, r7\n\t"
  140914. #elif defined(__clang__)
  140915. "muls r7, r6\n\t"
  140916. #else
  140917. "mul r7, r6\n\t"
  140918. #endif
  140919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140920. "adds r4, r4, r7\n\t"
  140921. #else
  140922. "add r4, r4, r7\n\t"
  140923. #endif
  140924. #ifdef WOLFSSL_KEIL
  140925. "adcs r5, r5, %[r]\n\t"
  140926. #elif defined(__clang__)
  140927. "adcs r5, %[r]\n\t"
  140928. #else
  140929. "adc r5, %[r]\n\t"
  140930. #endif
  140931. "uxth r7, %[b]\n\t"
  140932. #ifdef WOLFSSL_KEIL
  140933. "muls r6, r7, r6\n\t"
  140934. #elif defined(__clang__)
  140935. "muls r6, r7\n\t"
  140936. #else
  140937. "mul r6, r7\n\t"
  140938. #endif
  140939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140940. "lsrs r7, r6, #16\n\t"
  140941. #else
  140942. "lsr r7, r6, #16\n\t"
  140943. #endif
  140944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140945. "lsls r6, r6, #16\n\t"
  140946. #else
  140947. "lsl r6, r6, #16\n\t"
  140948. #endif
  140949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140950. "adds r3, r3, r6\n\t"
  140951. #else
  140952. "add r3, r3, r6\n\t"
  140953. #endif
  140954. #ifdef WOLFSSL_KEIL
  140955. "adcs r4, r4, r7\n\t"
  140956. #elif defined(__clang__)
  140957. "adcs r4, r7\n\t"
  140958. #else
  140959. "adc r4, r7\n\t"
  140960. #endif
  140961. #ifdef WOLFSSL_KEIL
  140962. "adcs r5, r5, %[r]\n\t"
  140963. #elif defined(__clang__)
  140964. "adcs r5, %[r]\n\t"
  140965. #else
  140966. "adc r5, %[r]\n\t"
  140967. #endif
  140968. "# A[4] * B[5]\n\t"
  140969. "mov %[a], r9\n\t"
  140970. "mov %[b], r10\n\t"
  140971. "ldr %[a], [%[a], #16]\n\t"
  140972. "ldr %[b], [%[b], #20]\n\t"
  140973. "uxth r6, %[a]\n\t"
  140974. "uxth r7, %[b]\n\t"
  140975. #ifdef WOLFSSL_KEIL
  140976. "muls r7, r6, r7\n\t"
  140977. #elif defined(__clang__)
  140978. "muls r7, r6\n\t"
  140979. #else
  140980. "mul r7, r6\n\t"
  140981. #endif
  140982. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  140983. "adds r3, r3, r7\n\t"
  140984. #else
  140985. "add r3, r3, r7\n\t"
  140986. #endif
  140987. #ifdef WOLFSSL_KEIL
  140988. "adcs r4, r4, %[r]\n\t"
  140989. #elif defined(__clang__)
  140990. "adcs r4, %[r]\n\t"
  140991. #else
  140992. "adc r4, %[r]\n\t"
  140993. #endif
  140994. #ifdef WOLFSSL_KEIL
  140995. "adcs r5, r5, %[r]\n\t"
  140996. #elif defined(__clang__)
  140997. "adcs r5, %[r]\n\t"
  140998. #else
  140999. "adc r5, %[r]\n\t"
  141000. #endif
  141001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141002. "lsrs r7, %[b], #16\n\t"
  141003. #else
  141004. "lsr r7, %[b], #16\n\t"
  141005. #endif
  141006. #ifdef WOLFSSL_KEIL
  141007. "muls r6, r7, r6\n\t"
  141008. #elif defined(__clang__)
  141009. "muls r6, r7\n\t"
  141010. #else
  141011. "mul r6, r7\n\t"
  141012. #endif
  141013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141014. "lsrs r7, r6, #16\n\t"
  141015. #else
  141016. "lsr r7, r6, #16\n\t"
  141017. #endif
  141018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141019. "lsls r6, r6, #16\n\t"
  141020. #else
  141021. "lsl r6, r6, #16\n\t"
  141022. #endif
  141023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141024. "adds r3, r3, r6\n\t"
  141025. #else
  141026. "add r3, r3, r6\n\t"
  141027. #endif
  141028. #ifdef WOLFSSL_KEIL
  141029. "adcs r4, r4, r7\n\t"
  141030. #elif defined(__clang__)
  141031. "adcs r4, r7\n\t"
  141032. #else
  141033. "adc r4, r7\n\t"
  141034. #endif
  141035. #ifdef WOLFSSL_KEIL
  141036. "adcs r5, r5, %[r]\n\t"
  141037. #elif defined(__clang__)
  141038. "adcs r5, %[r]\n\t"
  141039. #else
  141040. "adc r5, %[r]\n\t"
  141041. #endif
  141042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141043. "lsrs r6, %[a], #16\n\t"
  141044. #else
  141045. "lsr r6, %[a], #16\n\t"
  141046. #endif
  141047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141048. "lsrs r7, %[b], #16\n\t"
  141049. #else
  141050. "lsr r7, %[b], #16\n\t"
  141051. #endif
  141052. #ifdef WOLFSSL_KEIL
  141053. "muls r7, r6, r7\n\t"
  141054. #elif defined(__clang__)
  141055. "muls r7, r6\n\t"
  141056. #else
  141057. "mul r7, r6\n\t"
  141058. #endif
  141059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141060. "adds r4, r4, r7\n\t"
  141061. #else
  141062. "add r4, r4, r7\n\t"
  141063. #endif
  141064. #ifdef WOLFSSL_KEIL
  141065. "adcs r5, r5, %[r]\n\t"
  141066. #elif defined(__clang__)
  141067. "adcs r5, %[r]\n\t"
  141068. #else
  141069. "adc r5, %[r]\n\t"
  141070. #endif
  141071. "uxth r7, %[b]\n\t"
  141072. #ifdef WOLFSSL_KEIL
  141073. "muls r6, r7, r6\n\t"
  141074. #elif defined(__clang__)
  141075. "muls r6, r7\n\t"
  141076. #else
  141077. "mul r6, r7\n\t"
  141078. #endif
  141079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141080. "lsrs r7, r6, #16\n\t"
  141081. #else
  141082. "lsr r7, r6, #16\n\t"
  141083. #endif
  141084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141085. "lsls r6, r6, #16\n\t"
  141086. #else
  141087. "lsl r6, r6, #16\n\t"
  141088. #endif
  141089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141090. "adds r3, r3, r6\n\t"
  141091. #else
  141092. "add r3, r3, r6\n\t"
  141093. #endif
  141094. #ifdef WOLFSSL_KEIL
  141095. "adcs r4, r4, r7\n\t"
  141096. #elif defined(__clang__)
  141097. "adcs r4, r7\n\t"
  141098. #else
  141099. "adc r4, r7\n\t"
  141100. #endif
  141101. #ifdef WOLFSSL_KEIL
  141102. "adcs r5, r5, %[r]\n\t"
  141103. #elif defined(__clang__)
  141104. "adcs r5, %[r]\n\t"
  141105. #else
  141106. "adc r5, %[r]\n\t"
  141107. #endif
  141108. "# A[5] * B[4]\n\t"
  141109. "mov %[a], r9\n\t"
  141110. "mov %[b], r10\n\t"
  141111. "ldr %[a], [%[a], #20]\n\t"
  141112. "ldr %[b], [%[b], #16]\n\t"
  141113. "uxth r6, %[a]\n\t"
  141114. "uxth r7, %[b]\n\t"
  141115. #ifdef WOLFSSL_KEIL
  141116. "muls r7, r6, r7\n\t"
  141117. #elif defined(__clang__)
  141118. "muls r7, r6\n\t"
  141119. #else
  141120. "mul r7, r6\n\t"
  141121. #endif
  141122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141123. "adds r3, r3, r7\n\t"
  141124. #else
  141125. "add r3, r3, r7\n\t"
  141126. #endif
  141127. #ifdef WOLFSSL_KEIL
  141128. "adcs r4, r4, %[r]\n\t"
  141129. #elif defined(__clang__)
  141130. "adcs r4, %[r]\n\t"
  141131. #else
  141132. "adc r4, %[r]\n\t"
  141133. #endif
  141134. #ifdef WOLFSSL_KEIL
  141135. "adcs r5, r5, %[r]\n\t"
  141136. #elif defined(__clang__)
  141137. "adcs r5, %[r]\n\t"
  141138. #else
  141139. "adc r5, %[r]\n\t"
  141140. #endif
  141141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141142. "lsrs r7, %[b], #16\n\t"
  141143. #else
  141144. "lsr r7, %[b], #16\n\t"
  141145. #endif
  141146. #ifdef WOLFSSL_KEIL
  141147. "muls r6, r7, r6\n\t"
  141148. #elif defined(__clang__)
  141149. "muls r6, r7\n\t"
  141150. #else
  141151. "mul r6, r7\n\t"
  141152. #endif
  141153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141154. "lsrs r7, r6, #16\n\t"
  141155. #else
  141156. "lsr r7, r6, #16\n\t"
  141157. #endif
  141158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141159. "lsls r6, r6, #16\n\t"
  141160. #else
  141161. "lsl r6, r6, #16\n\t"
  141162. #endif
  141163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141164. "adds r3, r3, r6\n\t"
  141165. #else
  141166. "add r3, r3, r6\n\t"
  141167. #endif
  141168. #ifdef WOLFSSL_KEIL
  141169. "adcs r4, r4, r7\n\t"
  141170. #elif defined(__clang__)
  141171. "adcs r4, r7\n\t"
  141172. #else
  141173. "adc r4, r7\n\t"
  141174. #endif
  141175. #ifdef WOLFSSL_KEIL
  141176. "adcs r5, r5, %[r]\n\t"
  141177. #elif defined(__clang__)
  141178. "adcs r5, %[r]\n\t"
  141179. #else
  141180. "adc r5, %[r]\n\t"
  141181. #endif
  141182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141183. "lsrs r6, %[a], #16\n\t"
  141184. #else
  141185. "lsr r6, %[a], #16\n\t"
  141186. #endif
  141187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141188. "lsrs r7, %[b], #16\n\t"
  141189. #else
  141190. "lsr r7, %[b], #16\n\t"
  141191. #endif
  141192. #ifdef WOLFSSL_KEIL
  141193. "muls r7, r6, r7\n\t"
  141194. #elif defined(__clang__)
  141195. "muls r7, r6\n\t"
  141196. #else
  141197. "mul r7, r6\n\t"
  141198. #endif
  141199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141200. "adds r4, r4, r7\n\t"
  141201. #else
  141202. "add r4, r4, r7\n\t"
  141203. #endif
  141204. #ifdef WOLFSSL_KEIL
  141205. "adcs r5, r5, %[r]\n\t"
  141206. #elif defined(__clang__)
  141207. "adcs r5, %[r]\n\t"
  141208. #else
  141209. "adc r5, %[r]\n\t"
  141210. #endif
  141211. "uxth r7, %[b]\n\t"
  141212. #ifdef WOLFSSL_KEIL
  141213. "muls r6, r7, r6\n\t"
  141214. #elif defined(__clang__)
  141215. "muls r6, r7\n\t"
  141216. #else
  141217. "mul r6, r7\n\t"
  141218. #endif
  141219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141220. "lsrs r7, r6, #16\n\t"
  141221. #else
  141222. "lsr r7, r6, #16\n\t"
  141223. #endif
  141224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141225. "lsls r6, r6, #16\n\t"
  141226. #else
  141227. "lsl r6, r6, #16\n\t"
  141228. #endif
  141229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141230. "adds r3, r3, r6\n\t"
  141231. #else
  141232. "add r3, r3, r6\n\t"
  141233. #endif
  141234. #ifdef WOLFSSL_KEIL
  141235. "adcs r4, r4, r7\n\t"
  141236. #elif defined(__clang__)
  141237. "adcs r4, r7\n\t"
  141238. #else
  141239. "adc r4, r7\n\t"
  141240. #endif
  141241. #ifdef WOLFSSL_KEIL
  141242. "adcs r5, r5, %[r]\n\t"
  141243. #elif defined(__clang__)
  141244. "adcs r5, %[r]\n\t"
  141245. #else
  141246. "adc r5, %[r]\n\t"
  141247. #endif
  141248. "# A[6] * B[3]\n\t"
  141249. "mov %[a], r9\n\t"
  141250. "mov %[b], r10\n\t"
  141251. "ldr %[a], [%[a], #24]\n\t"
  141252. "ldr %[b], [%[b], #12]\n\t"
  141253. "uxth r6, %[a]\n\t"
  141254. "uxth r7, %[b]\n\t"
  141255. #ifdef WOLFSSL_KEIL
  141256. "muls r7, r6, r7\n\t"
  141257. #elif defined(__clang__)
  141258. "muls r7, r6\n\t"
  141259. #else
  141260. "mul r7, r6\n\t"
  141261. #endif
  141262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141263. "adds r3, r3, r7\n\t"
  141264. #else
  141265. "add r3, r3, r7\n\t"
  141266. #endif
  141267. #ifdef WOLFSSL_KEIL
  141268. "adcs r4, r4, %[r]\n\t"
  141269. #elif defined(__clang__)
  141270. "adcs r4, %[r]\n\t"
  141271. #else
  141272. "adc r4, %[r]\n\t"
  141273. #endif
  141274. #ifdef WOLFSSL_KEIL
  141275. "adcs r5, r5, %[r]\n\t"
  141276. #elif defined(__clang__)
  141277. "adcs r5, %[r]\n\t"
  141278. #else
  141279. "adc r5, %[r]\n\t"
  141280. #endif
  141281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141282. "lsrs r7, %[b], #16\n\t"
  141283. #else
  141284. "lsr r7, %[b], #16\n\t"
  141285. #endif
  141286. #ifdef WOLFSSL_KEIL
  141287. "muls r6, r7, r6\n\t"
  141288. #elif defined(__clang__)
  141289. "muls r6, r7\n\t"
  141290. #else
  141291. "mul r6, r7\n\t"
  141292. #endif
  141293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141294. "lsrs r7, r6, #16\n\t"
  141295. #else
  141296. "lsr r7, r6, #16\n\t"
  141297. #endif
  141298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141299. "lsls r6, r6, #16\n\t"
  141300. #else
  141301. "lsl r6, r6, #16\n\t"
  141302. #endif
  141303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141304. "adds r3, r3, r6\n\t"
  141305. #else
  141306. "add r3, r3, r6\n\t"
  141307. #endif
  141308. #ifdef WOLFSSL_KEIL
  141309. "adcs r4, r4, r7\n\t"
  141310. #elif defined(__clang__)
  141311. "adcs r4, r7\n\t"
  141312. #else
  141313. "adc r4, r7\n\t"
  141314. #endif
  141315. #ifdef WOLFSSL_KEIL
  141316. "adcs r5, r5, %[r]\n\t"
  141317. #elif defined(__clang__)
  141318. "adcs r5, %[r]\n\t"
  141319. #else
  141320. "adc r5, %[r]\n\t"
  141321. #endif
  141322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141323. "lsrs r6, %[a], #16\n\t"
  141324. #else
  141325. "lsr r6, %[a], #16\n\t"
  141326. #endif
  141327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141328. "lsrs r7, %[b], #16\n\t"
  141329. #else
  141330. "lsr r7, %[b], #16\n\t"
  141331. #endif
  141332. #ifdef WOLFSSL_KEIL
  141333. "muls r7, r6, r7\n\t"
  141334. #elif defined(__clang__)
  141335. "muls r7, r6\n\t"
  141336. #else
  141337. "mul r7, r6\n\t"
  141338. #endif
  141339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141340. "adds r4, r4, r7\n\t"
  141341. #else
  141342. "add r4, r4, r7\n\t"
  141343. #endif
  141344. #ifdef WOLFSSL_KEIL
  141345. "adcs r5, r5, %[r]\n\t"
  141346. #elif defined(__clang__)
  141347. "adcs r5, %[r]\n\t"
  141348. #else
  141349. "adc r5, %[r]\n\t"
  141350. #endif
  141351. "uxth r7, %[b]\n\t"
  141352. #ifdef WOLFSSL_KEIL
  141353. "muls r6, r7, r6\n\t"
  141354. #elif defined(__clang__)
  141355. "muls r6, r7\n\t"
  141356. #else
  141357. "mul r6, r7\n\t"
  141358. #endif
  141359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141360. "lsrs r7, r6, #16\n\t"
  141361. #else
  141362. "lsr r7, r6, #16\n\t"
  141363. #endif
  141364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141365. "lsls r6, r6, #16\n\t"
  141366. #else
  141367. "lsl r6, r6, #16\n\t"
  141368. #endif
  141369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141370. "adds r3, r3, r6\n\t"
  141371. #else
  141372. "add r3, r3, r6\n\t"
  141373. #endif
  141374. #ifdef WOLFSSL_KEIL
  141375. "adcs r4, r4, r7\n\t"
  141376. #elif defined(__clang__)
  141377. "adcs r4, r7\n\t"
  141378. #else
  141379. "adc r4, r7\n\t"
  141380. #endif
  141381. #ifdef WOLFSSL_KEIL
  141382. "adcs r5, r5, %[r]\n\t"
  141383. #elif defined(__clang__)
  141384. "adcs r5, %[r]\n\t"
  141385. #else
  141386. "adc r5, %[r]\n\t"
  141387. #endif
  141388. "# A[7] * B[2]\n\t"
  141389. "mov %[a], r9\n\t"
  141390. "mov %[b], r10\n\t"
  141391. "ldr %[a], [%[a], #28]\n\t"
  141392. "ldr %[b], [%[b], #8]\n\t"
  141393. "uxth r6, %[a]\n\t"
  141394. "uxth r7, %[b]\n\t"
  141395. #ifdef WOLFSSL_KEIL
  141396. "muls r7, r6, r7\n\t"
  141397. #elif defined(__clang__)
  141398. "muls r7, r6\n\t"
  141399. #else
  141400. "mul r7, r6\n\t"
  141401. #endif
  141402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141403. "adds r3, r3, r7\n\t"
  141404. #else
  141405. "add r3, r3, r7\n\t"
  141406. #endif
  141407. #ifdef WOLFSSL_KEIL
  141408. "adcs r4, r4, %[r]\n\t"
  141409. #elif defined(__clang__)
  141410. "adcs r4, %[r]\n\t"
  141411. #else
  141412. "adc r4, %[r]\n\t"
  141413. #endif
  141414. #ifdef WOLFSSL_KEIL
  141415. "adcs r5, r5, %[r]\n\t"
  141416. #elif defined(__clang__)
  141417. "adcs r5, %[r]\n\t"
  141418. #else
  141419. "adc r5, %[r]\n\t"
  141420. #endif
  141421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141422. "lsrs r7, %[b], #16\n\t"
  141423. #else
  141424. "lsr r7, %[b], #16\n\t"
  141425. #endif
  141426. #ifdef WOLFSSL_KEIL
  141427. "muls r6, r7, r6\n\t"
  141428. #elif defined(__clang__)
  141429. "muls r6, r7\n\t"
  141430. #else
  141431. "mul r6, r7\n\t"
  141432. #endif
  141433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141434. "lsrs r7, r6, #16\n\t"
  141435. #else
  141436. "lsr r7, r6, #16\n\t"
  141437. #endif
  141438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141439. "lsls r6, r6, #16\n\t"
  141440. #else
  141441. "lsl r6, r6, #16\n\t"
  141442. #endif
  141443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141444. "adds r3, r3, r6\n\t"
  141445. #else
  141446. "add r3, r3, r6\n\t"
  141447. #endif
  141448. #ifdef WOLFSSL_KEIL
  141449. "adcs r4, r4, r7\n\t"
  141450. #elif defined(__clang__)
  141451. "adcs r4, r7\n\t"
  141452. #else
  141453. "adc r4, r7\n\t"
  141454. #endif
  141455. #ifdef WOLFSSL_KEIL
  141456. "adcs r5, r5, %[r]\n\t"
  141457. #elif defined(__clang__)
  141458. "adcs r5, %[r]\n\t"
  141459. #else
  141460. "adc r5, %[r]\n\t"
  141461. #endif
  141462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141463. "lsrs r6, %[a], #16\n\t"
  141464. #else
  141465. "lsr r6, %[a], #16\n\t"
  141466. #endif
  141467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141468. "lsrs r7, %[b], #16\n\t"
  141469. #else
  141470. "lsr r7, %[b], #16\n\t"
  141471. #endif
  141472. #ifdef WOLFSSL_KEIL
  141473. "muls r7, r6, r7\n\t"
  141474. #elif defined(__clang__)
  141475. "muls r7, r6\n\t"
  141476. #else
  141477. "mul r7, r6\n\t"
  141478. #endif
  141479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141480. "adds r4, r4, r7\n\t"
  141481. #else
  141482. "add r4, r4, r7\n\t"
  141483. #endif
  141484. #ifdef WOLFSSL_KEIL
  141485. "adcs r5, r5, %[r]\n\t"
  141486. #elif defined(__clang__)
  141487. "adcs r5, %[r]\n\t"
  141488. #else
  141489. "adc r5, %[r]\n\t"
  141490. #endif
  141491. "uxth r7, %[b]\n\t"
  141492. #ifdef WOLFSSL_KEIL
  141493. "muls r6, r7, r6\n\t"
  141494. #elif defined(__clang__)
  141495. "muls r6, r7\n\t"
  141496. #else
  141497. "mul r6, r7\n\t"
  141498. #endif
  141499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141500. "lsrs r7, r6, #16\n\t"
  141501. #else
  141502. "lsr r7, r6, #16\n\t"
  141503. #endif
  141504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141505. "lsls r6, r6, #16\n\t"
  141506. #else
  141507. "lsl r6, r6, #16\n\t"
  141508. #endif
  141509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141510. "adds r3, r3, r6\n\t"
  141511. #else
  141512. "add r3, r3, r6\n\t"
  141513. #endif
  141514. #ifdef WOLFSSL_KEIL
  141515. "adcs r4, r4, r7\n\t"
  141516. #elif defined(__clang__)
  141517. "adcs r4, r7\n\t"
  141518. #else
  141519. "adc r4, r7\n\t"
  141520. #endif
  141521. #ifdef WOLFSSL_KEIL
  141522. "adcs r5, r5, %[r]\n\t"
  141523. #elif defined(__clang__)
  141524. "adcs r5, %[r]\n\t"
  141525. #else
  141526. "adc r5, %[r]\n\t"
  141527. #endif
  141528. "# A[8] * B[1]\n\t"
  141529. "mov %[a], r9\n\t"
  141530. "mov %[b], r10\n\t"
  141531. "ldr %[a], [%[a], #32]\n\t"
  141532. "ldr %[b], [%[b], #4]\n\t"
  141533. "uxth r6, %[a]\n\t"
  141534. "uxth r7, %[b]\n\t"
  141535. #ifdef WOLFSSL_KEIL
  141536. "muls r7, r6, r7\n\t"
  141537. #elif defined(__clang__)
  141538. "muls r7, r6\n\t"
  141539. #else
  141540. "mul r7, r6\n\t"
  141541. #endif
  141542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141543. "adds r3, r3, r7\n\t"
  141544. #else
  141545. "add r3, r3, r7\n\t"
  141546. #endif
  141547. #ifdef WOLFSSL_KEIL
  141548. "adcs r4, r4, %[r]\n\t"
  141549. #elif defined(__clang__)
  141550. "adcs r4, %[r]\n\t"
  141551. #else
  141552. "adc r4, %[r]\n\t"
  141553. #endif
  141554. #ifdef WOLFSSL_KEIL
  141555. "adcs r5, r5, %[r]\n\t"
  141556. #elif defined(__clang__)
  141557. "adcs r5, %[r]\n\t"
  141558. #else
  141559. "adc r5, %[r]\n\t"
  141560. #endif
  141561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141562. "lsrs r7, %[b], #16\n\t"
  141563. #else
  141564. "lsr r7, %[b], #16\n\t"
  141565. #endif
  141566. #ifdef WOLFSSL_KEIL
  141567. "muls r6, r7, r6\n\t"
  141568. #elif defined(__clang__)
  141569. "muls r6, r7\n\t"
  141570. #else
  141571. "mul r6, r7\n\t"
  141572. #endif
  141573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141574. "lsrs r7, r6, #16\n\t"
  141575. #else
  141576. "lsr r7, r6, #16\n\t"
  141577. #endif
  141578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141579. "lsls r6, r6, #16\n\t"
  141580. #else
  141581. "lsl r6, r6, #16\n\t"
  141582. #endif
  141583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141584. "adds r3, r3, r6\n\t"
  141585. #else
  141586. "add r3, r3, r6\n\t"
  141587. #endif
  141588. #ifdef WOLFSSL_KEIL
  141589. "adcs r4, r4, r7\n\t"
  141590. #elif defined(__clang__)
  141591. "adcs r4, r7\n\t"
  141592. #else
  141593. "adc r4, r7\n\t"
  141594. #endif
  141595. #ifdef WOLFSSL_KEIL
  141596. "adcs r5, r5, %[r]\n\t"
  141597. #elif defined(__clang__)
  141598. "adcs r5, %[r]\n\t"
  141599. #else
  141600. "adc r5, %[r]\n\t"
  141601. #endif
  141602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141603. "lsrs r6, %[a], #16\n\t"
  141604. #else
  141605. "lsr r6, %[a], #16\n\t"
  141606. #endif
  141607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141608. "lsrs r7, %[b], #16\n\t"
  141609. #else
  141610. "lsr r7, %[b], #16\n\t"
  141611. #endif
  141612. #ifdef WOLFSSL_KEIL
  141613. "muls r7, r6, r7\n\t"
  141614. #elif defined(__clang__)
  141615. "muls r7, r6\n\t"
  141616. #else
  141617. "mul r7, r6\n\t"
  141618. #endif
  141619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141620. "adds r4, r4, r7\n\t"
  141621. #else
  141622. "add r4, r4, r7\n\t"
  141623. #endif
  141624. #ifdef WOLFSSL_KEIL
  141625. "adcs r5, r5, %[r]\n\t"
  141626. #elif defined(__clang__)
  141627. "adcs r5, %[r]\n\t"
  141628. #else
  141629. "adc r5, %[r]\n\t"
  141630. #endif
  141631. "uxth r7, %[b]\n\t"
  141632. #ifdef WOLFSSL_KEIL
  141633. "muls r6, r7, r6\n\t"
  141634. #elif defined(__clang__)
  141635. "muls r6, r7\n\t"
  141636. #else
  141637. "mul r6, r7\n\t"
  141638. #endif
  141639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141640. "lsrs r7, r6, #16\n\t"
  141641. #else
  141642. "lsr r7, r6, #16\n\t"
  141643. #endif
  141644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141645. "lsls r6, r6, #16\n\t"
  141646. #else
  141647. "lsl r6, r6, #16\n\t"
  141648. #endif
  141649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141650. "adds r3, r3, r6\n\t"
  141651. #else
  141652. "add r3, r3, r6\n\t"
  141653. #endif
  141654. #ifdef WOLFSSL_KEIL
  141655. "adcs r4, r4, r7\n\t"
  141656. #elif defined(__clang__)
  141657. "adcs r4, r7\n\t"
  141658. #else
  141659. "adc r4, r7\n\t"
  141660. #endif
  141661. #ifdef WOLFSSL_KEIL
  141662. "adcs r5, r5, %[r]\n\t"
  141663. #elif defined(__clang__)
  141664. "adcs r5, %[r]\n\t"
  141665. #else
  141666. "adc r5, %[r]\n\t"
  141667. #endif
  141668. "# A[9] * B[0]\n\t"
  141669. "mov %[a], r9\n\t"
  141670. "mov %[b], r10\n\t"
  141671. "ldr %[a], [%[a], #36]\n\t"
  141672. "ldr %[b], [%[b]]\n\t"
  141673. "uxth r6, %[a]\n\t"
  141674. "uxth r7, %[b]\n\t"
  141675. #ifdef WOLFSSL_KEIL
  141676. "muls r7, r6, r7\n\t"
  141677. #elif defined(__clang__)
  141678. "muls r7, r6\n\t"
  141679. #else
  141680. "mul r7, r6\n\t"
  141681. #endif
  141682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141683. "adds r3, r3, r7\n\t"
  141684. #else
  141685. "add r3, r3, r7\n\t"
  141686. #endif
  141687. #ifdef WOLFSSL_KEIL
  141688. "adcs r4, r4, %[r]\n\t"
  141689. #elif defined(__clang__)
  141690. "adcs r4, %[r]\n\t"
  141691. #else
  141692. "adc r4, %[r]\n\t"
  141693. #endif
  141694. #ifdef WOLFSSL_KEIL
  141695. "adcs r5, r5, %[r]\n\t"
  141696. #elif defined(__clang__)
  141697. "adcs r5, %[r]\n\t"
  141698. #else
  141699. "adc r5, %[r]\n\t"
  141700. #endif
  141701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141702. "lsrs r7, %[b], #16\n\t"
  141703. #else
  141704. "lsr r7, %[b], #16\n\t"
  141705. #endif
  141706. #ifdef WOLFSSL_KEIL
  141707. "muls r6, r7, r6\n\t"
  141708. #elif defined(__clang__)
  141709. "muls r6, r7\n\t"
  141710. #else
  141711. "mul r6, r7\n\t"
  141712. #endif
  141713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141714. "lsrs r7, r6, #16\n\t"
  141715. #else
  141716. "lsr r7, r6, #16\n\t"
  141717. #endif
  141718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141719. "lsls r6, r6, #16\n\t"
  141720. #else
  141721. "lsl r6, r6, #16\n\t"
  141722. #endif
  141723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141724. "adds r3, r3, r6\n\t"
  141725. #else
  141726. "add r3, r3, r6\n\t"
  141727. #endif
  141728. #ifdef WOLFSSL_KEIL
  141729. "adcs r4, r4, r7\n\t"
  141730. #elif defined(__clang__)
  141731. "adcs r4, r7\n\t"
  141732. #else
  141733. "adc r4, r7\n\t"
  141734. #endif
  141735. #ifdef WOLFSSL_KEIL
  141736. "adcs r5, r5, %[r]\n\t"
  141737. #elif defined(__clang__)
  141738. "adcs r5, %[r]\n\t"
  141739. #else
  141740. "adc r5, %[r]\n\t"
  141741. #endif
  141742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141743. "lsrs r6, %[a], #16\n\t"
  141744. #else
  141745. "lsr r6, %[a], #16\n\t"
  141746. #endif
  141747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141748. "lsrs r7, %[b], #16\n\t"
  141749. #else
  141750. "lsr r7, %[b], #16\n\t"
  141751. #endif
  141752. #ifdef WOLFSSL_KEIL
  141753. "muls r7, r6, r7\n\t"
  141754. #elif defined(__clang__)
  141755. "muls r7, r6\n\t"
  141756. #else
  141757. "mul r7, r6\n\t"
  141758. #endif
  141759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141760. "adds r4, r4, r7\n\t"
  141761. #else
  141762. "add r4, r4, r7\n\t"
  141763. #endif
  141764. #ifdef WOLFSSL_KEIL
  141765. "adcs r5, r5, %[r]\n\t"
  141766. #elif defined(__clang__)
  141767. "adcs r5, %[r]\n\t"
  141768. #else
  141769. "adc r5, %[r]\n\t"
  141770. #endif
  141771. "uxth r7, %[b]\n\t"
  141772. #ifdef WOLFSSL_KEIL
  141773. "muls r6, r7, r6\n\t"
  141774. #elif defined(__clang__)
  141775. "muls r6, r7\n\t"
  141776. #else
  141777. "mul r6, r7\n\t"
  141778. #endif
  141779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141780. "lsrs r7, r6, #16\n\t"
  141781. #else
  141782. "lsr r7, r6, #16\n\t"
  141783. #endif
  141784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141785. "lsls r6, r6, #16\n\t"
  141786. #else
  141787. "lsl r6, r6, #16\n\t"
  141788. #endif
  141789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141790. "adds r3, r3, r6\n\t"
  141791. #else
  141792. "add r3, r3, r6\n\t"
  141793. #endif
  141794. #ifdef WOLFSSL_KEIL
  141795. "adcs r4, r4, r7\n\t"
  141796. #elif defined(__clang__)
  141797. "adcs r4, r7\n\t"
  141798. #else
  141799. "adc r4, r7\n\t"
  141800. #endif
  141801. #ifdef WOLFSSL_KEIL
  141802. "adcs r5, r5, %[r]\n\t"
  141803. #elif defined(__clang__)
  141804. "adcs r5, %[r]\n\t"
  141805. #else
  141806. "adc r5, %[r]\n\t"
  141807. #endif
  141808. "str r3, [sp, #36]\n\t"
  141809. "# A[10] * B[0]\n\t"
  141810. "movs r3, #0\n\t"
  141811. "mov %[a], r9\n\t"
  141812. "mov %[b], r10\n\t"
  141813. "ldr %[a], [%[a], #40]\n\t"
  141814. "ldr %[b], [%[b]]\n\t"
  141815. "uxth r6, %[a]\n\t"
  141816. "uxth r7, %[b]\n\t"
  141817. #ifdef WOLFSSL_KEIL
  141818. "muls r7, r6, r7\n\t"
  141819. #elif defined(__clang__)
  141820. "muls r7, r6\n\t"
  141821. #else
  141822. "mul r7, r6\n\t"
  141823. #endif
  141824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141825. "adds r4, r4, r7\n\t"
  141826. #else
  141827. "add r4, r4, r7\n\t"
  141828. #endif
  141829. #ifdef WOLFSSL_KEIL
  141830. "adcs r5, r5, %[r]\n\t"
  141831. #elif defined(__clang__)
  141832. "adcs r5, %[r]\n\t"
  141833. #else
  141834. "adc r5, %[r]\n\t"
  141835. #endif
  141836. #ifdef WOLFSSL_KEIL
  141837. "adcs r3, r3, %[r]\n\t"
  141838. #elif defined(__clang__)
  141839. "adcs r3, %[r]\n\t"
  141840. #else
  141841. "adc r3, %[r]\n\t"
  141842. #endif
  141843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141844. "lsrs r7, %[b], #16\n\t"
  141845. #else
  141846. "lsr r7, %[b], #16\n\t"
  141847. #endif
  141848. #ifdef WOLFSSL_KEIL
  141849. "muls r6, r7, r6\n\t"
  141850. #elif defined(__clang__)
  141851. "muls r6, r7\n\t"
  141852. #else
  141853. "mul r6, r7\n\t"
  141854. #endif
  141855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141856. "lsrs r7, r6, #16\n\t"
  141857. #else
  141858. "lsr r7, r6, #16\n\t"
  141859. #endif
  141860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141861. "lsls r6, r6, #16\n\t"
  141862. #else
  141863. "lsl r6, r6, #16\n\t"
  141864. #endif
  141865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141866. "adds r4, r4, r6\n\t"
  141867. #else
  141868. "add r4, r4, r6\n\t"
  141869. #endif
  141870. #ifdef WOLFSSL_KEIL
  141871. "adcs r5, r5, r7\n\t"
  141872. #elif defined(__clang__)
  141873. "adcs r5, r7\n\t"
  141874. #else
  141875. "adc r5, r7\n\t"
  141876. #endif
  141877. #ifdef WOLFSSL_KEIL
  141878. "adcs r3, r3, %[r]\n\t"
  141879. #elif defined(__clang__)
  141880. "adcs r3, %[r]\n\t"
  141881. #else
  141882. "adc r3, %[r]\n\t"
  141883. #endif
  141884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141885. "lsrs r6, %[a], #16\n\t"
  141886. #else
  141887. "lsr r6, %[a], #16\n\t"
  141888. #endif
  141889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141890. "lsrs r7, %[b], #16\n\t"
  141891. #else
  141892. "lsr r7, %[b], #16\n\t"
  141893. #endif
  141894. #ifdef WOLFSSL_KEIL
  141895. "muls r7, r6, r7\n\t"
  141896. #elif defined(__clang__)
  141897. "muls r7, r6\n\t"
  141898. #else
  141899. "mul r7, r6\n\t"
  141900. #endif
  141901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141902. "adds r5, r5, r7\n\t"
  141903. #else
  141904. "add r5, r5, r7\n\t"
  141905. #endif
  141906. #ifdef WOLFSSL_KEIL
  141907. "adcs r3, r3, %[r]\n\t"
  141908. #elif defined(__clang__)
  141909. "adcs r3, %[r]\n\t"
  141910. #else
  141911. "adc r3, %[r]\n\t"
  141912. #endif
  141913. "uxth r7, %[b]\n\t"
  141914. #ifdef WOLFSSL_KEIL
  141915. "muls r6, r7, r6\n\t"
  141916. #elif defined(__clang__)
  141917. "muls r6, r7\n\t"
  141918. #else
  141919. "mul r6, r7\n\t"
  141920. #endif
  141921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141922. "lsrs r7, r6, #16\n\t"
  141923. #else
  141924. "lsr r7, r6, #16\n\t"
  141925. #endif
  141926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141927. "lsls r6, r6, #16\n\t"
  141928. #else
  141929. "lsl r6, r6, #16\n\t"
  141930. #endif
  141931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141932. "adds r4, r4, r6\n\t"
  141933. #else
  141934. "add r4, r4, r6\n\t"
  141935. #endif
  141936. #ifdef WOLFSSL_KEIL
  141937. "adcs r5, r5, r7\n\t"
  141938. #elif defined(__clang__)
  141939. "adcs r5, r7\n\t"
  141940. #else
  141941. "adc r5, r7\n\t"
  141942. #endif
  141943. #ifdef WOLFSSL_KEIL
  141944. "adcs r3, r3, %[r]\n\t"
  141945. #elif defined(__clang__)
  141946. "adcs r3, %[r]\n\t"
  141947. #else
  141948. "adc r3, %[r]\n\t"
  141949. #endif
  141950. "# A[9] * B[1]\n\t"
  141951. "mov %[a], r9\n\t"
  141952. "mov %[b], r10\n\t"
  141953. "ldr %[a], [%[a], #36]\n\t"
  141954. "ldr %[b], [%[b], #4]\n\t"
  141955. "uxth r6, %[a]\n\t"
  141956. "uxth r7, %[b]\n\t"
  141957. #ifdef WOLFSSL_KEIL
  141958. "muls r7, r6, r7\n\t"
  141959. #elif defined(__clang__)
  141960. "muls r7, r6\n\t"
  141961. #else
  141962. "mul r7, r6\n\t"
  141963. #endif
  141964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141965. "adds r4, r4, r7\n\t"
  141966. #else
  141967. "add r4, r4, r7\n\t"
  141968. #endif
  141969. #ifdef WOLFSSL_KEIL
  141970. "adcs r5, r5, %[r]\n\t"
  141971. #elif defined(__clang__)
  141972. "adcs r5, %[r]\n\t"
  141973. #else
  141974. "adc r5, %[r]\n\t"
  141975. #endif
  141976. #ifdef WOLFSSL_KEIL
  141977. "adcs r3, r3, %[r]\n\t"
  141978. #elif defined(__clang__)
  141979. "adcs r3, %[r]\n\t"
  141980. #else
  141981. "adc r3, %[r]\n\t"
  141982. #endif
  141983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141984. "lsrs r7, %[b], #16\n\t"
  141985. #else
  141986. "lsr r7, %[b], #16\n\t"
  141987. #endif
  141988. #ifdef WOLFSSL_KEIL
  141989. "muls r6, r7, r6\n\t"
  141990. #elif defined(__clang__)
  141991. "muls r6, r7\n\t"
  141992. #else
  141993. "mul r6, r7\n\t"
  141994. #endif
  141995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  141996. "lsrs r7, r6, #16\n\t"
  141997. #else
  141998. "lsr r7, r6, #16\n\t"
  141999. #endif
  142000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142001. "lsls r6, r6, #16\n\t"
  142002. #else
  142003. "lsl r6, r6, #16\n\t"
  142004. #endif
  142005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142006. "adds r4, r4, r6\n\t"
  142007. #else
  142008. "add r4, r4, r6\n\t"
  142009. #endif
  142010. #ifdef WOLFSSL_KEIL
  142011. "adcs r5, r5, r7\n\t"
  142012. #elif defined(__clang__)
  142013. "adcs r5, r7\n\t"
  142014. #else
  142015. "adc r5, r7\n\t"
  142016. #endif
  142017. #ifdef WOLFSSL_KEIL
  142018. "adcs r3, r3, %[r]\n\t"
  142019. #elif defined(__clang__)
  142020. "adcs r3, %[r]\n\t"
  142021. #else
  142022. "adc r3, %[r]\n\t"
  142023. #endif
  142024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142025. "lsrs r6, %[a], #16\n\t"
  142026. #else
  142027. "lsr r6, %[a], #16\n\t"
  142028. #endif
  142029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142030. "lsrs r7, %[b], #16\n\t"
  142031. #else
  142032. "lsr r7, %[b], #16\n\t"
  142033. #endif
  142034. #ifdef WOLFSSL_KEIL
  142035. "muls r7, r6, r7\n\t"
  142036. #elif defined(__clang__)
  142037. "muls r7, r6\n\t"
  142038. #else
  142039. "mul r7, r6\n\t"
  142040. #endif
  142041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142042. "adds r5, r5, r7\n\t"
  142043. #else
  142044. "add r5, r5, r7\n\t"
  142045. #endif
  142046. #ifdef WOLFSSL_KEIL
  142047. "adcs r3, r3, %[r]\n\t"
  142048. #elif defined(__clang__)
  142049. "adcs r3, %[r]\n\t"
  142050. #else
  142051. "adc r3, %[r]\n\t"
  142052. #endif
  142053. "uxth r7, %[b]\n\t"
  142054. #ifdef WOLFSSL_KEIL
  142055. "muls r6, r7, r6\n\t"
  142056. #elif defined(__clang__)
  142057. "muls r6, r7\n\t"
  142058. #else
  142059. "mul r6, r7\n\t"
  142060. #endif
  142061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142062. "lsrs r7, r6, #16\n\t"
  142063. #else
  142064. "lsr r7, r6, #16\n\t"
  142065. #endif
  142066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142067. "lsls r6, r6, #16\n\t"
  142068. #else
  142069. "lsl r6, r6, #16\n\t"
  142070. #endif
  142071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142072. "adds r4, r4, r6\n\t"
  142073. #else
  142074. "add r4, r4, r6\n\t"
  142075. #endif
  142076. #ifdef WOLFSSL_KEIL
  142077. "adcs r5, r5, r7\n\t"
  142078. #elif defined(__clang__)
  142079. "adcs r5, r7\n\t"
  142080. #else
  142081. "adc r5, r7\n\t"
  142082. #endif
  142083. #ifdef WOLFSSL_KEIL
  142084. "adcs r3, r3, %[r]\n\t"
  142085. #elif defined(__clang__)
  142086. "adcs r3, %[r]\n\t"
  142087. #else
  142088. "adc r3, %[r]\n\t"
  142089. #endif
  142090. "# A[8] * B[2]\n\t"
  142091. "mov %[a], r9\n\t"
  142092. "mov %[b], r10\n\t"
  142093. "ldr %[a], [%[a], #32]\n\t"
  142094. "ldr %[b], [%[b], #8]\n\t"
  142095. "uxth r6, %[a]\n\t"
  142096. "uxth r7, %[b]\n\t"
  142097. #ifdef WOLFSSL_KEIL
  142098. "muls r7, r6, r7\n\t"
  142099. #elif defined(__clang__)
  142100. "muls r7, r6\n\t"
  142101. #else
  142102. "mul r7, r6\n\t"
  142103. #endif
  142104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142105. "adds r4, r4, r7\n\t"
  142106. #else
  142107. "add r4, r4, r7\n\t"
  142108. #endif
  142109. #ifdef WOLFSSL_KEIL
  142110. "adcs r5, r5, %[r]\n\t"
  142111. #elif defined(__clang__)
  142112. "adcs r5, %[r]\n\t"
  142113. #else
  142114. "adc r5, %[r]\n\t"
  142115. #endif
  142116. #ifdef WOLFSSL_KEIL
  142117. "adcs r3, r3, %[r]\n\t"
  142118. #elif defined(__clang__)
  142119. "adcs r3, %[r]\n\t"
  142120. #else
  142121. "adc r3, %[r]\n\t"
  142122. #endif
  142123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142124. "lsrs r7, %[b], #16\n\t"
  142125. #else
  142126. "lsr r7, %[b], #16\n\t"
  142127. #endif
  142128. #ifdef WOLFSSL_KEIL
  142129. "muls r6, r7, r6\n\t"
  142130. #elif defined(__clang__)
  142131. "muls r6, r7\n\t"
  142132. #else
  142133. "mul r6, r7\n\t"
  142134. #endif
  142135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142136. "lsrs r7, r6, #16\n\t"
  142137. #else
  142138. "lsr r7, r6, #16\n\t"
  142139. #endif
  142140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142141. "lsls r6, r6, #16\n\t"
  142142. #else
  142143. "lsl r6, r6, #16\n\t"
  142144. #endif
  142145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142146. "adds r4, r4, r6\n\t"
  142147. #else
  142148. "add r4, r4, r6\n\t"
  142149. #endif
  142150. #ifdef WOLFSSL_KEIL
  142151. "adcs r5, r5, r7\n\t"
  142152. #elif defined(__clang__)
  142153. "adcs r5, r7\n\t"
  142154. #else
  142155. "adc r5, r7\n\t"
  142156. #endif
  142157. #ifdef WOLFSSL_KEIL
  142158. "adcs r3, r3, %[r]\n\t"
  142159. #elif defined(__clang__)
  142160. "adcs r3, %[r]\n\t"
  142161. #else
  142162. "adc r3, %[r]\n\t"
  142163. #endif
  142164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142165. "lsrs r6, %[a], #16\n\t"
  142166. #else
  142167. "lsr r6, %[a], #16\n\t"
  142168. #endif
  142169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142170. "lsrs r7, %[b], #16\n\t"
  142171. #else
  142172. "lsr r7, %[b], #16\n\t"
  142173. #endif
  142174. #ifdef WOLFSSL_KEIL
  142175. "muls r7, r6, r7\n\t"
  142176. #elif defined(__clang__)
  142177. "muls r7, r6\n\t"
  142178. #else
  142179. "mul r7, r6\n\t"
  142180. #endif
  142181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142182. "adds r5, r5, r7\n\t"
  142183. #else
  142184. "add r5, r5, r7\n\t"
  142185. #endif
  142186. #ifdef WOLFSSL_KEIL
  142187. "adcs r3, r3, %[r]\n\t"
  142188. #elif defined(__clang__)
  142189. "adcs r3, %[r]\n\t"
  142190. #else
  142191. "adc r3, %[r]\n\t"
  142192. #endif
  142193. "uxth r7, %[b]\n\t"
  142194. #ifdef WOLFSSL_KEIL
  142195. "muls r6, r7, r6\n\t"
  142196. #elif defined(__clang__)
  142197. "muls r6, r7\n\t"
  142198. #else
  142199. "mul r6, r7\n\t"
  142200. #endif
  142201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142202. "lsrs r7, r6, #16\n\t"
  142203. #else
  142204. "lsr r7, r6, #16\n\t"
  142205. #endif
  142206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142207. "lsls r6, r6, #16\n\t"
  142208. #else
  142209. "lsl r6, r6, #16\n\t"
  142210. #endif
  142211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142212. "adds r4, r4, r6\n\t"
  142213. #else
  142214. "add r4, r4, r6\n\t"
  142215. #endif
  142216. #ifdef WOLFSSL_KEIL
  142217. "adcs r5, r5, r7\n\t"
  142218. #elif defined(__clang__)
  142219. "adcs r5, r7\n\t"
  142220. #else
  142221. "adc r5, r7\n\t"
  142222. #endif
  142223. #ifdef WOLFSSL_KEIL
  142224. "adcs r3, r3, %[r]\n\t"
  142225. #elif defined(__clang__)
  142226. "adcs r3, %[r]\n\t"
  142227. #else
  142228. "adc r3, %[r]\n\t"
  142229. #endif
  142230. "# A[7] * B[3]\n\t"
  142231. "mov %[a], r9\n\t"
  142232. "mov %[b], r10\n\t"
  142233. "ldr %[a], [%[a], #28]\n\t"
  142234. "ldr %[b], [%[b], #12]\n\t"
  142235. "uxth r6, %[a]\n\t"
  142236. "uxth r7, %[b]\n\t"
  142237. #ifdef WOLFSSL_KEIL
  142238. "muls r7, r6, r7\n\t"
  142239. #elif defined(__clang__)
  142240. "muls r7, r6\n\t"
  142241. #else
  142242. "mul r7, r6\n\t"
  142243. #endif
  142244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142245. "adds r4, r4, r7\n\t"
  142246. #else
  142247. "add r4, r4, r7\n\t"
  142248. #endif
  142249. #ifdef WOLFSSL_KEIL
  142250. "adcs r5, r5, %[r]\n\t"
  142251. #elif defined(__clang__)
  142252. "adcs r5, %[r]\n\t"
  142253. #else
  142254. "adc r5, %[r]\n\t"
  142255. #endif
  142256. #ifdef WOLFSSL_KEIL
  142257. "adcs r3, r3, %[r]\n\t"
  142258. #elif defined(__clang__)
  142259. "adcs r3, %[r]\n\t"
  142260. #else
  142261. "adc r3, %[r]\n\t"
  142262. #endif
  142263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142264. "lsrs r7, %[b], #16\n\t"
  142265. #else
  142266. "lsr r7, %[b], #16\n\t"
  142267. #endif
  142268. #ifdef WOLFSSL_KEIL
  142269. "muls r6, r7, r6\n\t"
  142270. #elif defined(__clang__)
  142271. "muls r6, r7\n\t"
  142272. #else
  142273. "mul r6, r7\n\t"
  142274. #endif
  142275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142276. "lsrs r7, r6, #16\n\t"
  142277. #else
  142278. "lsr r7, r6, #16\n\t"
  142279. #endif
  142280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142281. "lsls r6, r6, #16\n\t"
  142282. #else
  142283. "lsl r6, r6, #16\n\t"
  142284. #endif
  142285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142286. "adds r4, r4, r6\n\t"
  142287. #else
  142288. "add r4, r4, r6\n\t"
  142289. #endif
  142290. #ifdef WOLFSSL_KEIL
  142291. "adcs r5, r5, r7\n\t"
  142292. #elif defined(__clang__)
  142293. "adcs r5, r7\n\t"
  142294. #else
  142295. "adc r5, r7\n\t"
  142296. #endif
  142297. #ifdef WOLFSSL_KEIL
  142298. "adcs r3, r3, %[r]\n\t"
  142299. #elif defined(__clang__)
  142300. "adcs r3, %[r]\n\t"
  142301. #else
  142302. "adc r3, %[r]\n\t"
  142303. #endif
  142304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142305. "lsrs r6, %[a], #16\n\t"
  142306. #else
  142307. "lsr r6, %[a], #16\n\t"
  142308. #endif
  142309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142310. "lsrs r7, %[b], #16\n\t"
  142311. #else
  142312. "lsr r7, %[b], #16\n\t"
  142313. #endif
  142314. #ifdef WOLFSSL_KEIL
  142315. "muls r7, r6, r7\n\t"
  142316. #elif defined(__clang__)
  142317. "muls r7, r6\n\t"
  142318. #else
  142319. "mul r7, r6\n\t"
  142320. #endif
  142321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142322. "adds r5, r5, r7\n\t"
  142323. #else
  142324. "add r5, r5, r7\n\t"
  142325. #endif
  142326. #ifdef WOLFSSL_KEIL
  142327. "adcs r3, r3, %[r]\n\t"
  142328. #elif defined(__clang__)
  142329. "adcs r3, %[r]\n\t"
  142330. #else
  142331. "adc r3, %[r]\n\t"
  142332. #endif
  142333. "uxth r7, %[b]\n\t"
  142334. #ifdef WOLFSSL_KEIL
  142335. "muls r6, r7, r6\n\t"
  142336. #elif defined(__clang__)
  142337. "muls r6, r7\n\t"
  142338. #else
  142339. "mul r6, r7\n\t"
  142340. #endif
  142341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142342. "lsrs r7, r6, #16\n\t"
  142343. #else
  142344. "lsr r7, r6, #16\n\t"
  142345. #endif
  142346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142347. "lsls r6, r6, #16\n\t"
  142348. #else
  142349. "lsl r6, r6, #16\n\t"
  142350. #endif
  142351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142352. "adds r4, r4, r6\n\t"
  142353. #else
  142354. "add r4, r4, r6\n\t"
  142355. #endif
  142356. #ifdef WOLFSSL_KEIL
  142357. "adcs r5, r5, r7\n\t"
  142358. #elif defined(__clang__)
  142359. "adcs r5, r7\n\t"
  142360. #else
  142361. "adc r5, r7\n\t"
  142362. #endif
  142363. #ifdef WOLFSSL_KEIL
  142364. "adcs r3, r3, %[r]\n\t"
  142365. #elif defined(__clang__)
  142366. "adcs r3, %[r]\n\t"
  142367. #else
  142368. "adc r3, %[r]\n\t"
  142369. #endif
  142370. "# A[6] * B[4]\n\t"
  142371. "mov %[a], r9\n\t"
  142372. "mov %[b], r10\n\t"
  142373. "ldr %[a], [%[a], #24]\n\t"
  142374. "ldr %[b], [%[b], #16]\n\t"
  142375. "uxth r6, %[a]\n\t"
  142376. "uxth r7, %[b]\n\t"
  142377. #ifdef WOLFSSL_KEIL
  142378. "muls r7, r6, r7\n\t"
  142379. #elif defined(__clang__)
  142380. "muls r7, r6\n\t"
  142381. #else
  142382. "mul r7, r6\n\t"
  142383. #endif
  142384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142385. "adds r4, r4, r7\n\t"
  142386. #else
  142387. "add r4, r4, r7\n\t"
  142388. #endif
  142389. #ifdef WOLFSSL_KEIL
  142390. "adcs r5, r5, %[r]\n\t"
  142391. #elif defined(__clang__)
  142392. "adcs r5, %[r]\n\t"
  142393. #else
  142394. "adc r5, %[r]\n\t"
  142395. #endif
  142396. #ifdef WOLFSSL_KEIL
  142397. "adcs r3, r3, %[r]\n\t"
  142398. #elif defined(__clang__)
  142399. "adcs r3, %[r]\n\t"
  142400. #else
  142401. "adc r3, %[r]\n\t"
  142402. #endif
  142403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142404. "lsrs r7, %[b], #16\n\t"
  142405. #else
  142406. "lsr r7, %[b], #16\n\t"
  142407. #endif
  142408. #ifdef WOLFSSL_KEIL
  142409. "muls r6, r7, r6\n\t"
  142410. #elif defined(__clang__)
  142411. "muls r6, r7\n\t"
  142412. #else
  142413. "mul r6, r7\n\t"
  142414. #endif
  142415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142416. "lsrs r7, r6, #16\n\t"
  142417. #else
  142418. "lsr r7, r6, #16\n\t"
  142419. #endif
  142420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142421. "lsls r6, r6, #16\n\t"
  142422. #else
  142423. "lsl r6, r6, #16\n\t"
  142424. #endif
  142425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142426. "adds r4, r4, r6\n\t"
  142427. #else
  142428. "add r4, r4, r6\n\t"
  142429. #endif
  142430. #ifdef WOLFSSL_KEIL
  142431. "adcs r5, r5, r7\n\t"
  142432. #elif defined(__clang__)
  142433. "adcs r5, r7\n\t"
  142434. #else
  142435. "adc r5, r7\n\t"
  142436. #endif
  142437. #ifdef WOLFSSL_KEIL
  142438. "adcs r3, r3, %[r]\n\t"
  142439. #elif defined(__clang__)
  142440. "adcs r3, %[r]\n\t"
  142441. #else
  142442. "adc r3, %[r]\n\t"
  142443. #endif
  142444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142445. "lsrs r6, %[a], #16\n\t"
  142446. #else
  142447. "lsr r6, %[a], #16\n\t"
  142448. #endif
  142449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142450. "lsrs r7, %[b], #16\n\t"
  142451. #else
  142452. "lsr r7, %[b], #16\n\t"
  142453. #endif
  142454. #ifdef WOLFSSL_KEIL
  142455. "muls r7, r6, r7\n\t"
  142456. #elif defined(__clang__)
  142457. "muls r7, r6\n\t"
  142458. #else
  142459. "mul r7, r6\n\t"
  142460. #endif
  142461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142462. "adds r5, r5, r7\n\t"
  142463. #else
  142464. "add r5, r5, r7\n\t"
  142465. #endif
  142466. #ifdef WOLFSSL_KEIL
  142467. "adcs r3, r3, %[r]\n\t"
  142468. #elif defined(__clang__)
  142469. "adcs r3, %[r]\n\t"
  142470. #else
  142471. "adc r3, %[r]\n\t"
  142472. #endif
  142473. "uxth r7, %[b]\n\t"
  142474. #ifdef WOLFSSL_KEIL
  142475. "muls r6, r7, r6\n\t"
  142476. #elif defined(__clang__)
  142477. "muls r6, r7\n\t"
  142478. #else
  142479. "mul r6, r7\n\t"
  142480. #endif
  142481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142482. "lsrs r7, r6, #16\n\t"
  142483. #else
  142484. "lsr r7, r6, #16\n\t"
  142485. #endif
  142486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142487. "lsls r6, r6, #16\n\t"
  142488. #else
  142489. "lsl r6, r6, #16\n\t"
  142490. #endif
  142491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142492. "adds r4, r4, r6\n\t"
  142493. #else
  142494. "add r4, r4, r6\n\t"
  142495. #endif
  142496. #ifdef WOLFSSL_KEIL
  142497. "adcs r5, r5, r7\n\t"
  142498. #elif defined(__clang__)
  142499. "adcs r5, r7\n\t"
  142500. #else
  142501. "adc r5, r7\n\t"
  142502. #endif
  142503. #ifdef WOLFSSL_KEIL
  142504. "adcs r3, r3, %[r]\n\t"
  142505. #elif defined(__clang__)
  142506. "adcs r3, %[r]\n\t"
  142507. #else
  142508. "adc r3, %[r]\n\t"
  142509. #endif
  142510. "# A[5] * B[5]\n\t"
  142511. "mov %[a], r9\n\t"
  142512. "mov %[b], r10\n\t"
  142513. "ldr %[a], [%[a], #20]\n\t"
  142514. "ldr %[b], [%[b], #20]\n\t"
  142515. "uxth r6, %[a]\n\t"
  142516. "uxth r7, %[b]\n\t"
  142517. #ifdef WOLFSSL_KEIL
  142518. "muls r7, r6, r7\n\t"
  142519. #elif defined(__clang__)
  142520. "muls r7, r6\n\t"
  142521. #else
  142522. "mul r7, r6\n\t"
  142523. #endif
  142524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142525. "adds r4, r4, r7\n\t"
  142526. #else
  142527. "add r4, r4, r7\n\t"
  142528. #endif
  142529. #ifdef WOLFSSL_KEIL
  142530. "adcs r5, r5, %[r]\n\t"
  142531. #elif defined(__clang__)
  142532. "adcs r5, %[r]\n\t"
  142533. #else
  142534. "adc r5, %[r]\n\t"
  142535. #endif
  142536. #ifdef WOLFSSL_KEIL
  142537. "adcs r3, r3, %[r]\n\t"
  142538. #elif defined(__clang__)
  142539. "adcs r3, %[r]\n\t"
  142540. #else
  142541. "adc r3, %[r]\n\t"
  142542. #endif
  142543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142544. "lsrs r7, %[b], #16\n\t"
  142545. #else
  142546. "lsr r7, %[b], #16\n\t"
  142547. #endif
  142548. #ifdef WOLFSSL_KEIL
  142549. "muls r6, r7, r6\n\t"
  142550. #elif defined(__clang__)
  142551. "muls r6, r7\n\t"
  142552. #else
  142553. "mul r6, r7\n\t"
  142554. #endif
  142555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142556. "lsrs r7, r6, #16\n\t"
  142557. #else
  142558. "lsr r7, r6, #16\n\t"
  142559. #endif
  142560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142561. "lsls r6, r6, #16\n\t"
  142562. #else
  142563. "lsl r6, r6, #16\n\t"
  142564. #endif
  142565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142566. "adds r4, r4, r6\n\t"
  142567. #else
  142568. "add r4, r4, r6\n\t"
  142569. #endif
  142570. #ifdef WOLFSSL_KEIL
  142571. "adcs r5, r5, r7\n\t"
  142572. #elif defined(__clang__)
  142573. "adcs r5, r7\n\t"
  142574. #else
  142575. "adc r5, r7\n\t"
  142576. #endif
  142577. #ifdef WOLFSSL_KEIL
  142578. "adcs r3, r3, %[r]\n\t"
  142579. #elif defined(__clang__)
  142580. "adcs r3, %[r]\n\t"
  142581. #else
  142582. "adc r3, %[r]\n\t"
  142583. #endif
  142584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142585. "lsrs r6, %[a], #16\n\t"
  142586. #else
  142587. "lsr r6, %[a], #16\n\t"
  142588. #endif
  142589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142590. "lsrs r7, %[b], #16\n\t"
  142591. #else
  142592. "lsr r7, %[b], #16\n\t"
  142593. #endif
  142594. #ifdef WOLFSSL_KEIL
  142595. "muls r7, r6, r7\n\t"
  142596. #elif defined(__clang__)
  142597. "muls r7, r6\n\t"
  142598. #else
  142599. "mul r7, r6\n\t"
  142600. #endif
  142601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142602. "adds r5, r5, r7\n\t"
  142603. #else
  142604. "add r5, r5, r7\n\t"
  142605. #endif
  142606. #ifdef WOLFSSL_KEIL
  142607. "adcs r3, r3, %[r]\n\t"
  142608. #elif defined(__clang__)
  142609. "adcs r3, %[r]\n\t"
  142610. #else
  142611. "adc r3, %[r]\n\t"
  142612. #endif
  142613. "uxth r7, %[b]\n\t"
  142614. #ifdef WOLFSSL_KEIL
  142615. "muls r6, r7, r6\n\t"
  142616. #elif defined(__clang__)
  142617. "muls r6, r7\n\t"
  142618. #else
  142619. "mul r6, r7\n\t"
  142620. #endif
  142621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142622. "lsrs r7, r6, #16\n\t"
  142623. #else
  142624. "lsr r7, r6, #16\n\t"
  142625. #endif
  142626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142627. "lsls r6, r6, #16\n\t"
  142628. #else
  142629. "lsl r6, r6, #16\n\t"
  142630. #endif
  142631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142632. "adds r4, r4, r6\n\t"
  142633. #else
  142634. "add r4, r4, r6\n\t"
  142635. #endif
  142636. #ifdef WOLFSSL_KEIL
  142637. "adcs r5, r5, r7\n\t"
  142638. #elif defined(__clang__)
  142639. "adcs r5, r7\n\t"
  142640. #else
  142641. "adc r5, r7\n\t"
  142642. #endif
  142643. #ifdef WOLFSSL_KEIL
  142644. "adcs r3, r3, %[r]\n\t"
  142645. #elif defined(__clang__)
  142646. "adcs r3, %[r]\n\t"
  142647. #else
  142648. "adc r3, %[r]\n\t"
  142649. #endif
  142650. "# A[4] * B[6]\n\t"
  142651. "mov %[a], r9\n\t"
  142652. "mov %[b], r10\n\t"
  142653. "ldr %[a], [%[a], #16]\n\t"
  142654. "ldr %[b], [%[b], #24]\n\t"
  142655. "uxth r6, %[a]\n\t"
  142656. "uxth r7, %[b]\n\t"
  142657. #ifdef WOLFSSL_KEIL
  142658. "muls r7, r6, r7\n\t"
  142659. #elif defined(__clang__)
  142660. "muls r7, r6\n\t"
  142661. #else
  142662. "mul r7, r6\n\t"
  142663. #endif
  142664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142665. "adds r4, r4, r7\n\t"
  142666. #else
  142667. "add r4, r4, r7\n\t"
  142668. #endif
  142669. #ifdef WOLFSSL_KEIL
  142670. "adcs r5, r5, %[r]\n\t"
  142671. #elif defined(__clang__)
  142672. "adcs r5, %[r]\n\t"
  142673. #else
  142674. "adc r5, %[r]\n\t"
  142675. #endif
  142676. #ifdef WOLFSSL_KEIL
  142677. "adcs r3, r3, %[r]\n\t"
  142678. #elif defined(__clang__)
  142679. "adcs r3, %[r]\n\t"
  142680. #else
  142681. "adc r3, %[r]\n\t"
  142682. #endif
  142683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142684. "lsrs r7, %[b], #16\n\t"
  142685. #else
  142686. "lsr r7, %[b], #16\n\t"
  142687. #endif
  142688. #ifdef WOLFSSL_KEIL
  142689. "muls r6, r7, r6\n\t"
  142690. #elif defined(__clang__)
  142691. "muls r6, r7\n\t"
  142692. #else
  142693. "mul r6, r7\n\t"
  142694. #endif
  142695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142696. "lsrs r7, r6, #16\n\t"
  142697. #else
  142698. "lsr r7, r6, #16\n\t"
  142699. #endif
  142700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142701. "lsls r6, r6, #16\n\t"
  142702. #else
  142703. "lsl r6, r6, #16\n\t"
  142704. #endif
  142705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142706. "adds r4, r4, r6\n\t"
  142707. #else
  142708. "add r4, r4, r6\n\t"
  142709. #endif
  142710. #ifdef WOLFSSL_KEIL
  142711. "adcs r5, r5, r7\n\t"
  142712. #elif defined(__clang__)
  142713. "adcs r5, r7\n\t"
  142714. #else
  142715. "adc r5, r7\n\t"
  142716. #endif
  142717. #ifdef WOLFSSL_KEIL
  142718. "adcs r3, r3, %[r]\n\t"
  142719. #elif defined(__clang__)
  142720. "adcs r3, %[r]\n\t"
  142721. #else
  142722. "adc r3, %[r]\n\t"
  142723. #endif
  142724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142725. "lsrs r6, %[a], #16\n\t"
  142726. #else
  142727. "lsr r6, %[a], #16\n\t"
  142728. #endif
  142729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142730. "lsrs r7, %[b], #16\n\t"
  142731. #else
  142732. "lsr r7, %[b], #16\n\t"
  142733. #endif
  142734. #ifdef WOLFSSL_KEIL
  142735. "muls r7, r6, r7\n\t"
  142736. #elif defined(__clang__)
  142737. "muls r7, r6\n\t"
  142738. #else
  142739. "mul r7, r6\n\t"
  142740. #endif
  142741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142742. "adds r5, r5, r7\n\t"
  142743. #else
  142744. "add r5, r5, r7\n\t"
  142745. #endif
  142746. #ifdef WOLFSSL_KEIL
  142747. "adcs r3, r3, %[r]\n\t"
  142748. #elif defined(__clang__)
  142749. "adcs r3, %[r]\n\t"
  142750. #else
  142751. "adc r3, %[r]\n\t"
  142752. #endif
  142753. "uxth r7, %[b]\n\t"
  142754. #ifdef WOLFSSL_KEIL
  142755. "muls r6, r7, r6\n\t"
  142756. #elif defined(__clang__)
  142757. "muls r6, r7\n\t"
  142758. #else
  142759. "mul r6, r7\n\t"
  142760. #endif
  142761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142762. "lsrs r7, r6, #16\n\t"
  142763. #else
  142764. "lsr r7, r6, #16\n\t"
  142765. #endif
  142766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142767. "lsls r6, r6, #16\n\t"
  142768. #else
  142769. "lsl r6, r6, #16\n\t"
  142770. #endif
  142771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142772. "adds r4, r4, r6\n\t"
  142773. #else
  142774. "add r4, r4, r6\n\t"
  142775. #endif
  142776. #ifdef WOLFSSL_KEIL
  142777. "adcs r5, r5, r7\n\t"
  142778. #elif defined(__clang__)
  142779. "adcs r5, r7\n\t"
  142780. #else
  142781. "adc r5, r7\n\t"
  142782. #endif
  142783. #ifdef WOLFSSL_KEIL
  142784. "adcs r3, r3, %[r]\n\t"
  142785. #elif defined(__clang__)
  142786. "adcs r3, %[r]\n\t"
  142787. #else
  142788. "adc r3, %[r]\n\t"
  142789. #endif
  142790. "# A[3] * B[7]\n\t"
  142791. "mov %[a], r9\n\t"
  142792. "mov %[b], r10\n\t"
  142793. "ldr %[a], [%[a], #12]\n\t"
  142794. "ldr %[b], [%[b], #28]\n\t"
  142795. "uxth r6, %[a]\n\t"
  142796. "uxth r7, %[b]\n\t"
  142797. #ifdef WOLFSSL_KEIL
  142798. "muls r7, r6, r7\n\t"
  142799. #elif defined(__clang__)
  142800. "muls r7, r6\n\t"
  142801. #else
  142802. "mul r7, r6\n\t"
  142803. #endif
  142804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142805. "adds r4, r4, r7\n\t"
  142806. #else
  142807. "add r4, r4, r7\n\t"
  142808. #endif
  142809. #ifdef WOLFSSL_KEIL
  142810. "adcs r5, r5, %[r]\n\t"
  142811. #elif defined(__clang__)
  142812. "adcs r5, %[r]\n\t"
  142813. #else
  142814. "adc r5, %[r]\n\t"
  142815. #endif
  142816. #ifdef WOLFSSL_KEIL
  142817. "adcs r3, r3, %[r]\n\t"
  142818. #elif defined(__clang__)
  142819. "adcs r3, %[r]\n\t"
  142820. #else
  142821. "adc r3, %[r]\n\t"
  142822. #endif
  142823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142824. "lsrs r7, %[b], #16\n\t"
  142825. #else
  142826. "lsr r7, %[b], #16\n\t"
  142827. #endif
  142828. #ifdef WOLFSSL_KEIL
  142829. "muls r6, r7, r6\n\t"
  142830. #elif defined(__clang__)
  142831. "muls r6, r7\n\t"
  142832. #else
  142833. "mul r6, r7\n\t"
  142834. #endif
  142835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142836. "lsrs r7, r6, #16\n\t"
  142837. #else
  142838. "lsr r7, r6, #16\n\t"
  142839. #endif
  142840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142841. "lsls r6, r6, #16\n\t"
  142842. #else
  142843. "lsl r6, r6, #16\n\t"
  142844. #endif
  142845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142846. "adds r4, r4, r6\n\t"
  142847. #else
  142848. "add r4, r4, r6\n\t"
  142849. #endif
  142850. #ifdef WOLFSSL_KEIL
  142851. "adcs r5, r5, r7\n\t"
  142852. #elif defined(__clang__)
  142853. "adcs r5, r7\n\t"
  142854. #else
  142855. "adc r5, r7\n\t"
  142856. #endif
  142857. #ifdef WOLFSSL_KEIL
  142858. "adcs r3, r3, %[r]\n\t"
  142859. #elif defined(__clang__)
  142860. "adcs r3, %[r]\n\t"
  142861. #else
  142862. "adc r3, %[r]\n\t"
  142863. #endif
  142864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142865. "lsrs r6, %[a], #16\n\t"
  142866. #else
  142867. "lsr r6, %[a], #16\n\t"
  142868. #endif
  142869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142870. "lsrs r7, %[b], #16\n\t"
  142871. #else
  142872. "lsr r7, %[b], #16\n\t"
  142873. #endif
  142874. #ifdef WOLFSSL_KEIL
  142875. "muls r7, r6, r7\n\t"
  142876. #elif defined(__clang__)
  142877. "muls r7, r6\n\t"
  142878. #else
  142879. "mul r7, r6\n\t"
  142880. #endif
  142881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142882. "adds r5, r5, r7\n\t"
  142883. #else
  142884. "add r5, r5, r7\n\t"
  142885. #endif
  142886. #ifdef WOLFSSL_KEIL
  142887. "adcs r3, r3, %[r]\n\t"
  142888. #elif defined(__clang__)
  142889. "adcs r3, %[r]\n\t"
  142890. #else
  142891. "adc r3, %[r]\n\t"
  142892. #endif
  142893. "uxth r7, %[b]\n\t"
  142894. #ifdef WOLFSSL_KEIL
  142895. "muls r6, r7, r6\n\t"
  142896. #elif defined(__clang__)
  142897. "muls r6, r7\n\t"
  142898. #else
  142899. "mul r6, r7\n\t"
  142900. #endif
  142901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142902. "lsrs r7, r6, #16\n\t"
  142903. #else
  142904. "lsr r7, r6, #16\n\t"
  142905. #endif
  142906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142907. "lsls r6, r6, #16\n\t"
  142908. #else
  142909. "lsl r6, r6, #16\n\t"
  142910. #endif
  142911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142912. "adds r4, r4, r6\n\t"
  142913. #else
  142914. "add r4, r4, r6\n\t"
  142915. #endif
  142916. #ifdef WOLFSSL_KEIL
  142917. "adcs r5, r5, r7\n\t"
  142918. #elif defined(__clang__)
  142919. "adcs r5, r7\n\t"
  142920. #else
  142921. "adc r5, r7\n\t"
  142922. #endif
  142923. #ifdef WOLFSSL_KEIL
  142924. "adcs r3, r3, %[r]\n\t"
  142925. #elif defined(__clang__)
  142926. "adcs r3, %[r]\n\t"
  142927. #else
  142928. "adc r3, %[r]\n\t"
  142929. #endif
  142930. "# A[2] * B[8]\n\t"
  142931. "mov %[a], r9\n\t"
  142932. "mov %[b], r10\n\t"
  142933. "ldr %[a], [%[a], #8]\n\t"
  142934. "ldr %[b], [%[b], #32]\n\t"
  142935. "uxth r6, %[a]\n\t"
  142936. "uxth r7, %[b]\n\t"
  142937. #ifdef WOLFSSL_KEIL
  142938. "muls r7, r6, r7\n\t"
  142939. #elif defined(__clang__)
  142940. "muls r7, r6\n\t"
  142941. #else
  142942. "mul r7, r6\n\t"
  142943. #endif
  142944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142945. "adds r4, r4, r7\n\t"
  142946. #else
  142947. "add r4, r4, r7\n\t"
  142948. #endif
  142949. #ifdef WOLFSSL_KEIL
  142950. "adcs r5, r5, %[r]\n\t"
  142951. #elif defined(__clang__)
  142952. "adcs r5, %[r]\n\t"
  142953. #else
  142954. "adc r5, %[r]\n\t"
  142955. #endif
  142956. #ifdef WOLFSSL_KEIL
  142957. "adcs r3, r3, %[r]\n\t"
  142958. #elif defined(__clang__)
  142959. "adcs r3, %[r]\n\t"
  142960. #else
  142961. "adc r3, %[r]\n\t"
  142962. #endif
  142963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142964. "lsrs r7, %[b], #16\n\t"
  142965. #else
  142966. "lsr r7, %[b], #16\n\t"
  142967. #endif
  142968. #ifdef WOLFSSL_KEIL
  142969. "muls r6, r7, r6\n\t"
  142970. #elif defined(__clang__)
  142971. "muls r6, r7\n\t"
  142972. #else
  142973. "mul r6, r7\n\t"
  142974. #endif
  142975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142976. "lsrs r7, r6, #16\n\t"
  142977. #else
  142978. "lsr r7, r6, #16\n\t"
  142979. #endif
  142980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142981. "lsls r6, r6, #16\n\t"
  142982. #else
  142983. "lsl r6, r6, #16\n\t"
  142984. #endif
  142985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  142986. "adds r4, r4, r6\n\t"
  142987. #else
  142988. "add r4, r4, r6\n\t"
  142989. #endif
  142990. #ifdef WOLFSSL_KEIL
  142991. "adcs r5, r5, r7\n\t"
  142992. #elif defined(__clang__)
  142993. "adcs r5, r7\n\t"
  142994. #else
  142995. "adc r5, r7\n\t"
  142996. #endif
  142997. #ifdef WOLFSSL_KEIL
  142998. "adcs r3, r3, %[r]\n\t"
  142999. #elif defined(__clang__)
  143000. "adcs r3, %[r]\n\t"
  143001. #else
  143002. "adc r3, %[r]\n\t"
  143003. #endif
  143004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143005. "lsrs r6, %[a], #16\n\t"
  143006. #else
  143007. "lsr r6, %[a], #16\n\t"
  143008. #endif
  143009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143010. "lsrs r7, %[b], #16\n\t"
  143011. #else
  143012. "lsr r7, %[b], #16\n\t"
  143013. #endif
  143014. #ifdef WOLFSSL_KEIL
  143015. "muls r7, r6, r7\n\t"
  143016. #elif defined(__clang__)
  143017. "muls r7, r6\n\t"
  143018. #else
  143019. "mul r7, r6\n\t"
  143020. #endif
  143021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143022. "adds r5, r5, r7\n\t"
  143023. #else
  143024. "add r5, r5, r7\n\t"
  143025. #endif
  143026. #ifdef WOLFSSL_KEIL
  143027. "adcs r3, r3, %[r]\n\t"
  143028. #elif defined(__clang__)
  143029. "adcs r3, %[r]\n\t"
  143030. #else
  143031. "adc r3, %[r]\n\t"
  143032. #endif
  143033. "uxth r7, %[b]\n\t"
  143034. #ifdef WOLFSSL_KEIL
  143035. "muls r6, r7, r6\n\t"
  143036. #elif defined(__clang__)
  143037. "muls r6, r7\n\t"
  143038. #else
  143039. "mul r6, r7\n\t"
  143040. #endif
  143041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143042. "lsrs r7, r6, #16\n\t"
  143043. #else
  143044. "lsr r7, r6, #16\n\t"
  143045. #endif
  143046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143047. "lsls r6, r6, #16\n\t"
  143048. #else
  143049. "lsl r6, r6, #16\n\t"
  143050. #endif
  143051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143052. "adds r4, r4, r6\n\t"
  143053. #else
  143054. "add r4, r4, r6\n\t"
  143055. #endif
  143056. #ifdef WOLFSSL_KEIL
  143057. "adcs r5, r5, r7\n\t"
  143058. #elif defined(__clang__)
  143059. "adcs r5, r7\n\t"
  143060. #else
  143061. "adc r5, r7\n\t"
  143062. #endif
  143063. #ifdef WOLFSSL_KEIL
  143064. "adcs r3, r3, %[r]\n\t"
  143065. #elif defined(__clang__)
  143066. "adcs r3, %[r]\n\t"
  143067. #else
  143068. "adc r3, %[r]\n\t"
  143069. #endif
  143070. "# A[1] * B[9]\n\t"
  143071. "mov %[a], r9\n\t"
  143072. "mov %[b], r10\n\t"
  143073. "ldr %[a], [%[a], #4]\n\t"
  143074. "ldr %[b], [%[b], #36]\n\t"
  143075. "uxth r6, %[a]\n\t"
  143076. "uxth r7, %[b]\n\t"
  143077. #ifdef WOLFSSL_KEIL
  143078. "muls r7, r6, r7\n\t"
  143079. #elif defined(__clang__)
  143080. "muls r7, r6\n\t"
  143081. #else
  143082. "mul r7, r6\n\t"
  143083. #endif
  143084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143085. "adds r4, r4, r7\n\t"
  143086. #else
  143087. "add r4, r4, r7\n\t"
  143088. #endif
  143089. #ifdef WOLFSSL_KEIL
  143090. "adcs r5, r5, %[r]\n\t"
  143091. #elif defined(__clang__)
  143092. "adcs r5, %[r]\n\t"
  143093. #else
  143094. "adc r5, %[r]\n\t"
  143095. #endif
  143096. #ifdef WOLFSSL_KEIL
  143097. "adcs r3, r3, %[r]\n\t"
  143098. #elif defined(__clang__)
  143099. "adcs r3, %[r]\n\t"
  143100. #else
  143101. "adc r3, %[r]\n\t"
  143102. #endif
  143103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143104. "lsrs r7, %[b], #16\n\t"
  143105. #else
  143106. "lsr r7, %[b], #16\n\t"
  143107. #endif
  143108. #ifdef WOLFSSL_KEIL
  143109. "muls r6, r7, r6\n\t"
  143110. #elif defined(__clang__)
  143111. "muls r6, r7\n\t"
  143112. #else
  143113. "mul r6, r7\n\t"
  143114. #endif
  143115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143116. "lsrs r7, r6, #16\n\t"
  143117. #else
  143118. "lsr r7, r6, #16\n\t"
  143119. #endif
  143120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143121. "lsls r6, r6, #16\n\t"
  143122. #else
  143123. "lsl r6, r6, #16\n\t"
  143124. #endif
  143125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143126. "adds r4, r4, r6\n\t"
  143127. #else
  143128. "add r4, r4, r6\n\t"
  143129. #endif
  143130. #ifdef WOLFSSL_KEIL
  143131. "adcs r5, r5, r7\n\t"
  143132. #elif defined(__clang__)
  143133. "adcs r5, r7\n\t"
  143134. #else
  143135. "adc r5, r7\n\t"
  143136. #endif
  143137. #ifdef WOLFSSL_KEIL
  143138. "adcs r3, r3, %[r]\n\t"
  143139. #elif defined(__clang__)
  143140. "adcs r3, %[r]\n\t"
  143141. #else
  143142. "adc r3, %[r]\n\t"
  143143. #endif
  143144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143145. "lsrs r6, %[a], #16\n\t"
  143146. #else
  143147. "lsr r6, %[a], #16\n\t"
  143148. #endif
  143149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143150. "lsrs r7, %[b], #16\n\t"
  143151. #else
  143152. "lsr r7, %[b], #16\n\t"
  143153. #endif
  143154. #ifdef WOLFSSL_KEIL
  143155. "muls r7, r6, r7\n\t"
  143156. #elif defined(__clang__)
  143157. "muls r7, r6\n\t"
  143158. #else
  143159. "mul r7, r6\n\t"
  143160. #endif
  143161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143162. "adds r5, r5, r7\n\t"
  143163. #else
  143164. "add r5, r5, r7\n\t"
  143165. #endif
  143166. #ifdef WOLFSSL_KEIL
  143167. "adcs r3, r3, %[r]\n\t"
  143168. #elif defined(__clang__)
  143169. "adcs r3, %[r]\n\t"
  143170. #else
  143171. "adc r3, %[r]\n\t"
  143172. #endif
  143173. "uxth r7, %[b]\n\t"
  143174. #ifdef WOLFSSL_KEIL
  143175. "muls r6, r7, r6\n\t"
  143176. #elif defined(__clang__)
  143177. "muls r6, r7\n\t"
  143178. #else
  143179. "mul r6, r7\n\t"
  143180. #endif
  143181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143182. "lsrs r7, r6, #16\n\t"
  143183. #else
  143184. "lsr r7, r6, #16\n\t"
  143185. #endif
  143186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143187. "lsls r6, r6, #16\n\t"
  143188. #else
  143189. "lsl r6, r6, #16\n\t"
  143190. #endif
  143191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143192. "adds r4, r4, r6\n\t"
  143193. #else
  143194. "add r4, r4, r6\n\t"
  143195. #endif
  143196. #ifdef WOLFSSL_KEIL
  143197. "adcs r5, r5, r7\n\t"
  143198. #elif defined(__clang__)
  143199. "adcs r5, r7\n\t"
  143200. #else
  143201. "adc r5, r7\n\t"
  143202. #endif
  143203. #ifdef WOLFSSL_KEIL
  143204. "adcs r3, r3, %[r]\n\t"
  143205. #elif defined(__clang__)
  143206. "adcs r3, %[r]\n\t"
  143207. #else
  143208. "adc r3, %[r]\n\t"
  143209. #endif
  143210. "# A[0] * B[10]\n\t"
  143211. "mov %[a], r9\n\t"
  143212. "mov %[b], r10\n\t"
  143213. "ldr %[a], [%[a]]\n\t"
  143214. "ldr %[b], [%[b], #40]\n\t"
  143215. "uxth r6, %[a]\n\t"
  143216. "uxth r7, %[b]\n\t"
  143217. #ifdef WOLFSSL_KEIL
  143218. "muls r7, r6, r7\n\t"
  143219. #elif defined(__clang__)
  143220. "muls r7, r6\n\t"
  143221. #else
  143222. "mul r7, r6\n\t"
  143223. #endif
  143224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143225. "adds r4, r4, r7\n\t"
  143226. #else
  143227. "add r4, r4, r7\n\t"
  143228. #endif
  143229. #ifdef WOLFSSL_KEIL
  143230. "adcs r5, r5, %[r]\n\t"
  143231. #elif defined(__clang__)
  143232. "adcs r5, %[r]\n\t"
  143233. #else
  143234. "adc r5, %[r]\n\t"
  143235. #endif
  143236. #ifdef WOLFSSL_KEIL
  143237. "adcs r3, r3, %[r]\n\t"
  143238. #elif defined(__clang__)
  143239. "adcs r3, %[r]\n\t"
  143240. #else
  143241. "adc r3, %[r]\n\t"
  143242. #endif
  143243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143244. "lsrs r7, %[b], #16\n\t"
  143245. #else
  143246. "lsr r7, %[b], #16\n\t"
  143247. #endif
  143248. #ifdef WOLFSSL_KEIL
  143249. "muls r6, r7, r6\n\t"
  143250. #elif defined(__clang__)
  143251. "muls r6, r7\n\t"
  143252. #else
  143253. "mul r6, r7\n\t"
  143254. #endif
  143255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143256. "lsrs r7, r6, #16\n\t"
  143257. #else
  143258. "lsr r7, r6, #16\n\t"
  143259. #endif
  143260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143261. "lsls r6, r6, #16\n\t"
  143262. #else
  143263. "lsl r6, r6, #16\n\t"
  143264. #endif
  143265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143266. "adds r4, r4, r6\n\t"
  143267. #else
  143268. "add r4, r4, r6\n\t"
  143269. #endif
  143270. #ifdef WOLFSSL_KEIL
  143271. "adcs r5, r5, r7\n\t"
  143272. #elif defined(__clang__)
  143273. "adcs r5, r7\n\t"
  143274. #else
  143275. "adc r5, r7\n\t"
  143276. #endif
  143277. #ifdef WOLFSSL_KEIL
  143278. "adcs r3, r3, %[r]\n\t"
  143279. #elif defined(__clang__)
  143280. "adcs r3, %[r]\n\t"
  143281. #else
  143282. "adc r3, %[r]\n\t"
  143283. #endif
  143284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143285. "lsrs r6, %[a], #16\n\t"
  143286. #else
  143287. "lsr r6, %[a], #16\n\t"
  143288. #endif
  143289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143290. "lsrs r7, %[b], #16\n\t"
  143291. #else
  143292. "lsr r7, %[b], #16\n\t"
  143293. #endif
  143294. #ifdef WOLFSSL_KEIL
  143295. "muls r7, r6, r7\n\t"
  143296. #elif defined(__clang__)
  143297. "muls r7, r6\n\t"
  143298. #else
  143299. "mul r7, r6\n\t"
  143300. #endif
  143301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143302. "adds r5, r5, r7\n\t"
  143303. #else
  143304. "add r5, r5, r7\n\t"
  143305. #endif
  143306. #ifdef WOLFSSL_KEIL
  143307. "adcs r3, r3, %[r]\n\t"
  143308. #elif defined(__clang__)
  143309. "adcs r3, %[r]\n\t"
  143310. #else
  143311. "adc r3, %[r]\n\t"
  143312. #endif
  143313. "uxth r7, %[b]\n\t"
  143314. #ifdef WOLFSSL_KEIL
  143315. "muls r6, r7, r6\n\t"
  143316. #elif defined(__clang__)
  143317. "muls r6, r7\n\t"
  143318. #else
  143319. "mul r6, r7\n\t"
  143320. #endif
  143321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143322. "lsrs r7, r6, #16\n\t"
  143323. #else
  143324. "lsr r7, r6, #16\n\t"
  143325. #endif
  143326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143327. "lsls r6, r6, #16\n\t"
  143328. #else
  143329. "lsl r6, r6, #16\n\t"
  143330. #endif
  143331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143332. "adds r4, r4, r6\n\t"
  143333. #else
  143334. "add r4, r4, r6\n\t"
  143335. #endif
  143336. #ifdef WOLFSSL_KEIL
  143337. "adcs r5, r5, r7\n\t"
  143338. #elif defined(__clang__)
  143339. "adcs r5, r7\n\t"
  143340. #else
  143341. "adc r5, r7\n\t"
  143342. #endif
  143343. #ifdef WOLFSSL_KEIL
  143344. "adcs r3, r3, %[r]\n\t"
  143345. #elif defined(__clang__)
  143346. "adcs r3, %[r]\n\t"
  143347. #else
  143348. "adc r3, %[r]\n\t"
  143349. #endif
  143350. "str r4, [sp, #40]\n\t"
  143351. "# A[0] * B[11]\n\t"
  143352. "movs r4, #0\n\t"
  143353. "mov %[a], r9\n\t"
  143354. "mov %[b], r10\n\t"
  143355. "ldr %[a], [%[a]]\n\t"
  143356. "ldr %[b], [%[b], #44]\n\t"
  143357. "uxth r6, %[a]\n\t"
  143358. "uxth r7, %[b]\n\t"
  143359. #ifdef WOLFSSL_KEIL
  143360. "muls r7, r6, r7\n\t"
  143361. #elif defined(__clang__)
  143362. "muls r7, r6\n\t"
  143363. #else
  143364. "mul r7, r6\n\t"
  143365. #endif
  143366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143367. "adds r5, r5, r7\n\t"
  143368. #else
  143369. "add r5, r5, r7\n\t"
  143370. #endif
  143371. #ifdef WOLFSSL_KEIL
  143372. "adcs r3, r3, %[r]\n\t"
  143373. #elif defined(__clang__)
  143374. "adcs r3, %[r]\n\t"
  143375. #else
  143376. "adc r3, %[r]\n\t"
  143377. #endif
  143378. #ifdef WOLFSSL_KEIL
  143379. "adcs r4, r4, %[r]\n\t"
  143380. #elif defined(__clang__)
  143381. "adcs r4, %[r]\n\t"
  143382. #else
  143383. "adc r4, %[r]\n\t"
  143384. #endif
  143385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143386. "lsrs r7, %[b], #16\n\t"
  143387. #else
  143388. "lsr r7, %[b], #16\n\t"
  143389. #endif
  143390. #ifdef WOLFSSL_KEIL
  143391. "muls r6, r7, r6\n\t"
  143392. #elif defined(__clang__)
  143393. "muls r6, r7\n\t"
  143394. #else
  143395. "mul r6, r7\n\t"
  143396. #endif
  143397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143398. "lsrs r7, r6, #16\n\t"
  143399. #else
  143400. "lsr r7, r6, #16\n\t"
  143401. #endif
  143402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143403. "lsls r6, r6, #16\n\t"
  143404. #else
  143405. "lsl r6, r6, #16\n\t"
  143406. #endif
  143407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143408. "adds r5, r5, r6\n\t"
  143409. #else
  143410. "add r5, r5, r6\n\t"
  143411. #endif
  143412. #ifdef WOLFSSL_KEIL
  143413. "adcs r3, r3, r7\n\t"
  143414. #elif defined(__clang__)
  143415. "adcs r3, r7\n\t"
  143416. #else
  143417. "adc r3, r7\n\t"
  143418. #endif
  143419. #ifdef WOLFSSL_KEIL
  143420. "adcs r4, r4, %[r]\n\t"
  143421. #elif defined(__clang__)
  143422. "adcs r4, %[r]\n\t"
  143423. #else
  143424. "adc r4, %[r]\n\t"
  143425. #endif
  143426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143427. "lsrs r6, %[a], #16\n\t"
  143428. #else
  143429. "lsr r6, %[a], #16\n\t"
  143430. #endif
  143431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143432. "lsrs r7, %[b], #16\n\t"
  143433. #else
  143434. "lsr r7, %[b], #16\n\t"
  143435. #endif
  143436. #ifdef WOLFSSL_KEIL
  143437. "muls r7, r6, r7\n\t"
  143438. #elif defined(__clang__)
  143439. "muls r7, r6\n\t"
  143440. #else
  143441. "mul r7, r6\n\t"
  143442. #endif
  143443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143444. "adds r3, r3, r7\n\t"
  143445. #else
  143446. "add r3, r3, r7\n\t"
  143447. #endif
  143448. #ifdef WOLFSSL_KEIL
  143449. "adcs r4, r4, %[r]\n\t"
  143450. #elif defined(__clang__)
  143451. "adcs r4, %[r]\n\t"
  143452. #else
  143453. "adc r4, %[r]\n\t"
  143454. #endif
  143455. "uxth r7, %[b]\n\t"
  143456. #ifdef WOLFSSL_KEIL
  143457. "muls r6, r7, r6\n\t"
  143458. #elif defined(__clang__)
  143459. "muls r6, r7\n\t"
  143460. #else
  143461. "mul r6, r7\n\t"
  143462. #endif
  143463. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143464. "lsrs r7, r6, #16\n\t"
  143465. #else
  143466. "lsr r7, r6, #16\n\t"
  143467. #endif
  143468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143469. "lsls r6, r6, #16\n\t"
  143470. #else
  143471. "lsl r6, r6, #16\n\t"
  143472. #endif
  143473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143474. "adds r5, r5, r6\n\t"
  143475. #else
  143476. "add r5, r5, r6\n\t"
  143477. #endif
  143478. #ifdef WOLFSSL_KEIL
  143479. "adcs r3, r3, r7\n\t"
  143480. #elif defined(__clang__)
  143481. "adcs r3, r7\n\t"
  143482. #else
  143483. "adc r3, r7\n\t"
  143484. #endif
  143485. #ifdef WOLFSSL_KEIL
  143486. "adcs r4, r4, %[r]\n\t"
  143487. #elif defined(__clang__)
  143488. "adcs r4, %[r]\n\t"
  143489. #else
  143490. "adc r4, %[r]\n\t"
  143491. #endif
  143492. "# A[1] * B[10]\n\t"
  143493. "mov %[a], r9\n\t"
  143494. "mov %[b], r10\n\t"
  143495. "ldr %[a], [%[a], #4]\n\t"
  143496. "ldr %[b], [%[b], #40]\n\t"
  143497. "uxth r6, %[a]\n\t"
  143498. "uxth r7, %[b]\n\t"
  143499. #ifdef WOLFSSL_KEIL
  143500. "muls r7, r6, r7\n\t"
  143501. #elif defined(__clang__)
  143502. "muls r7, r6\n\t"
  143503. #else
  143504. "mul r7, r6\n\t"
  143505. #endif
  143506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143507. "adds r5, r5, r7\n\t"
  143508. #else
  143509. "add r5, r5, r7\n\t"
  143510. #endif
  143511. #ifdef WOLFSSL_KEIL
  143512. "adcs r3, r3, %[r]\n\t"
  143513. #elif defined(__clang__)
  143514. "adcs r3, %[r]\n\t"
  143515. #else
  143516. "adc r3, %[r]\n\t"
  143517. #endif
  143518. #ifdef WOLFSSL_KEIL
  143519. "adcs r4, r4, %[r]\n\t"
  143520. #elif defined(__clang__)
  143521. "adcs r4, %[r]\n\t"
  143522. #else
  143523. "adc r4, %[r]\n\t"
  143524. #endif
  143525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143526. "lsrs r7, %[b], #16\n\t"
  143527. #else
  143528. "lsr r7, %[b], #16\n\t"
  143529. #endif
  143530. #ifdef WOLFSSL_KEIL
  143531. "muls r6, r7, r6\n\t"
  143532. #elif defined(__clang__)
  143533. "muls r6, r7\n\t"
  143534. #else
  143535. "mul r6, r7\n\t"
  143536. #endif
  143537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143538. "lsrs r7, r6, #16\n\t"
  143539. #else
  143540. "lsr r7, r6, #16\n\t"
  143541. #endif
  143542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143543. "lsls r6, r6, #16\n\t"
  143544. #else
  143545. "lsl r6, r6, #16\n\t"
  143546. #endif
  143547. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143548. "adds r5, r5, r6\n\t"
  143549. #else
  143550. "add r5, r5, r6\n\t"
  143551. #endif
  143552. #ifdef WOLFSSL_KEIL
  143553. "adcs r3, r3, r7\n\t"
  143554. #elif defined(__clang__)
  143555. "adcs r3, r7\n\t"
  143556. #else
  143557. "adc r3, r7\n\t"
  143558. #endif
  143559. #ifdef WOLFSSL_KEIL
  143560. "adcs r4, r4, %[r]\n\t"
  143561. #elif defined(__clang__)
  143562. "adcs r4, %[r]\n\t"
  143563. #else
  143564. "adc r4, %[r]\n\t"
  143565. #endif
  143566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143567. "lsrs r6, %[a], #16\n\t"
  143568. #else
  143569. "lsr r6, %[a], #16\n\t"
  143570. #endif
  143571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143572. "lsrs r7, %[b], #16\n\t"
  143573. #else
  143574. "lsr r7, %[b], #16\n\t"
  143575. #endif
  143576. #ifdef WOLFSSL_KEIL
  143577. "muls r7, r6, r7\n\t"
  143578. #elif defined(__clang__)
  143579. "muls r7, r6\n\t"
  143580. #else
  143581. "mul r7, r6\n\t"
  143582. #endif
  143583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143584. "adds r3, r3, r7\n\t"
  143585. #else
  143586. "add r3, r3, r7\n\t"
  143587. #endif
  143588. #ifdef WOLFSSL_KEIL
  143589. "adcs r4, r4, %[r]\n\t"
  143590. #elif defined(__clang__)
  143591. "adcs r4, %[r]\n\t"
  143592. #else
  143593. "adc r4, %[r]\n\t"
  143594. #endif
  143595. "uxth r7, %[b]\n\t"
  143596. #ifdef WOLFSSL_KEIL
  143597. "muls r6, r7, r6\n\t"
  143598. #elif defined(__clang__)
  143599. "muls r6, r7\n\t"
  143600. #else
  143601. "mul r6, r7\n\t"
  143602. #endif
  143603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143604. "lsrs r7, r6, #16\n\t"
  143605. #else
  143606. "lsr r7, r6, #16\n\t"
  143607. #endif
  143608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143609. "lsls r6, r6, #16\n\t"
  143610. #else
  143611. "lsl r6, r6, #16\n\t"
  143612. #endif
  143613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143614. "adds r5, r5, r6\n\t"
  143615. #else
  143616. "add r5, r5, r6\n\t"
  143617. #endif
  143618. #ifdef WOLFSSL_KEIL
  143619. "adcs r3, r3, r7\n\t"
  143620. #elif defined(__clang__)
  143621. "adcs r3, r7\n\t"
  143622. #else
  143623. "adc r3, r7\n\t"
  143624. #endif
  143625. #ifdef WOLFSSL_KEIL
  143626. "adcs r4, r4, %[r]\n\t"
  143627. #elif defined(__clang__)
  143628. "adcs r4, %[r]\n\t"
  143629. #else
  143630. "adc r4, %[r]\n\t"
  143631. #endif
  143632. "# A[2] * B[9]\n\t"
  143633. "mov %[a], r9\n\t"
  143634. "mov %[b], r10\n\t"
  143635. "ldr %[a], [%[a], #8]\n\t"
  143636. "ldr %[b], [%[b], #36]\n\t"
  143637. "uxth r6, %[a]\n\t"
  143638. "uxth r7, %[b]\n\t"
  143639. #ifdef WOLFSSL_KEIL
  143640. "muls r7, r6, r7\n\t"
  143641. #elif defined(__clang__)
  143642. "muls r7, r6\n\t"
  143643. #else
  143644. "mul r7, r6\n\t"
  143645. #endif
  143646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143647. "adds r5, r5, r7\n\t"
  143648. #else
  143649. "add r5, r5, r7\n\t"
  143650. #endif
  143651. #ifdef WOLFSSL_KEIL
  143652. "adcs r3, r3, %[r]\n\t"
  143653. #elif defined(__clang__)
  143654. "adcs r3, %[r]\n\t"
  143655. #else
  143656. "adc r3, %[r]\n\t"
  143657. #endif
  143658. #ifdef WOLFSSL_KEIL
  143659. "adcs r4, r4, %[r]\n\t"
  143660. #elif defined(__clang__)
  143661. "adcs r4, %[r]\n\t"
  143662. #else
  143663. "adc r4, %[r]\n\t"
  143664. #endif
  143665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143666. "lsrs r7, %[b], #16\n\t"
  143667. #else
  143668. "lsr r7, %[b], #16\n\t"
  143669. #endif
  143670. #ifdef WOLFSSL_KEIL
  143671. "muls r6, r7, r6\n\t"
  143672. #elif defined(__clang__)
  143673. "muls r6, r7\n\t"
  143674. #else
  143675. "mul r6, r7\n\t"
  143676. #endif
  143677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143678. "lsrs r7, r6, #16\n\t"
  143679. #else
  143680. "lsr r7, r6, #16\n\t"
  143681. #endif
  143682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143683. "lsls r6, r6, #16\n\t"
  143684. #else
  143685. "lsl r6, r6, #16\n\t"
  143686. #endif
  143687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143688. "adds r5, r5, r6\n\t"
  143689. #else
  143690. "add r5, r5, r6\n\t"
  143691. #endif
  143692. #ifdef WOLFSSL_KEIL
  143693. "adcs r3, r3, r7\n\t"
  143694. #elif defined(__clang__)
  143695. "adcs r3, r7\n\t"
  143696. #else
  143697. "adc r3, r7\n\t"
  143698. #endif
  143699. #ifdef WOLFSSL_KEIL
  143700. "adcs r4, r4, %[r]\n\t"
  143701. #elif defined(__clang__)
  143702. "adcs r4, %[r]\n\t"
  143703. #else
  143704. "adc r4, %[r]\n\t"
  143705. #endif
  143706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143707. "lsrs r6, %[a], #16\n\t"
  143708. #else
  143709. "lsr r6, %[a], #16\n\t"
  143710. #endif
  143711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143712. "lsrs r7, %[b], #16\n\t"
  143713. #else
  143714. "lsr r7, %[b], #16\n\t"
  143715. #endif
  143716. #ifdef WOLFSSL_KEIL
  143717. "muls r7, r6, r7\n\t"
  143718. #elif defined(__clang__)
  143719. "muls r7, r6\n\t"
  143720. #else
  143721. "mul r7, r6\n\t"
  143722. #endif
  143723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143724. "adds r3, r3, r7\n\t"
  143725. #else
  143726. "add r3, r3, r7\n\t"
  143727. #endif
  143728. #ifdef WOLFSSL_KEIL
  143729. "adcs r4, r4, %[r]\n\t"
  143730. #elif defined(__clang__)
  143731. "adcs r4, %[r]\n\t"
  143732. #else
  143733. "adc r4, %[r]\n\t"
  143734. #endif
  143735. "uxth r7, %[b]\n\t"
  143736. #ifdef WOLFSSL_KEIL
  143737. "muls r6, r7, r6\n\t"
  143738. #elif defined(__clang__)
  143739. "muls r6, r7\n\t"
  143740. #else
  143741. "mul r6, r7\n\t"
  143742. #endif
  143743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143744. "lsrs r7, r6, #16\n\t"
  143745. #else
  143746. "lsr r7, r6, #16\n\t"
  143747. #endif
  143748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143749. "lsls r6, r6, #16\n\t"
  143750. #else
  143751. "lsl r6, r6, #16\n\t"
  143752. #endif
  143753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143754. "adds r5, r5, r6\n\t"
  143755. #else
  143756. "add r5, r5, r6\n\t"
  143757. #endif
  143758. #ifdef WOLFSSL_KEIL
  143759. "adcs r3, r3, r7\n\t"
  143760. #elif defined(__clang__)
  143761. "adcs r3, r7\n\t"
  143762. #else
  143763. "adc r3, r7\n\t"
  143764. #endif
  143765. #ifdef WOLFSSL_KEIL
  143766. "adcs r4, r4, %[r]\n\t"
  143767. #elif defined(__clang__)
  143768. "adcs r4, %[r]\n\t"
  143769. #else
  143770. "adc r4, %[r]\n\t"
  143771. #endif
  143772. "# A[3] * B[8]\n\t"
  143773. "mov %[a], r9\n\t"
  143774. "mov %[b], r10\n\t"
  143775. "ldr %[a], [%[a], #12]\n\t"
  143776. "ldr %[b], [%[b], #32]\n\t"
  143777. "uxth r6, %[a]\n\t"
  143778. "uxth r7, %[b]\n\t"
  143779. #ifdef WOLFSSL_KEIL
  143780. "muls r7, r6, r7\n\t"
  143781. #elif defined(__clang__)
  143782. "muls r7, r6\n\t"
  143783. #else
  143784. "mul r7, r6\n\t"
  143785. #endif
  143786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143787. "adds r5, r5, r7\n\t"
  143788. #else
  143789. "add r5, r5, r7\n\t"
  143790. #endif
  143791. #ifdef WOLFSSL_KEIL
  143792. "adcs r3, r3, %[r]\n\t"
  143793. #elif defined(__clang__)
  143794. "adcs r3, %[r]\n\t"
  143795. #else
  143796. "adc r3, %[r]\n\t"
  143797. #endif
  143798. #ifdef WOLFSSL_KEIL
  143799. "adcs r4, r4, %[r]\n\t"
  143800. #elif defined(__clang__)
  143801. "adcs r4, %[r]\n\t"
  143802. #else
  143803. "adc r4, %[r]\n\t"
  143804. #endif
  143805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143806. "lsrs r7, %[b], #16\n\t"
  143807. #else
  143808. "lsr r7, %[b], #16\n\t"
  143809. #endif
  143810. #ifdef WOLFSSL_KEIL
  143811. "muls r6, r7, r6\n\t"
  143812. #elif defined(__clang__)
  143813. "muls r6, r7\n\t"
  143814. #else
  143815. "mul r6, r7\n\t"
  143816. #endif
  143817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143818. "lsrs r7, r6, #16\n\t"
  143819. #else
  143820. "lsr r7, r6, #16\n\t"
  143821. #endif
  143822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143823. "lsls r6, r6, #16\n\t"
  143824. #else
  143825. "lsl r6, r6, #16\n\t"
  143826. #endif
  143827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143828. "adds r5, r5, r6\n\t"
  143829. #else
  143830. "add r5, r5, r6\n\t"
  143831. #endif
  143832. #ifdef WOLFSSL_KEIL
  143833. "adcs r3, r3, r7\n\t"
  143834. #elif defined(__clang__)
  143835. "adcs r3, r7\n\t"
  143836. #else
  143837. "adc r3, r7\n\t"
  143838. #endif
  143839. #ifdef WOLFSSL_KEIL
  143840. "adcs r4, r4, %[r]\n\t"
  143841. #elif defined(__clang__)
  143842. "adcs r4, %[r]\n\t"
  143843. #else
  143844. "adc r4, %[r]\n\t"
  143845. #endif
  143846. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143847. "lsrs r6, %[a], #16\n\t"
  143848. #else
  143849. "lsr r6, %[a], #16\n\t"
  143850. #endif
  143851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143852. "lsrs r7, %[b], #16\n\t"
  143853. #else
  143854. "lsr r7, %[b], #16\n\t"
  143855. #endif
  143856. #ifdef WOLFSSL_KEIL
  143857. "muls r7, r6, r7\n\t"
  143858. #elif defined(__clang__)
  143859. "muls r7, r6\n\t"
  143860. #else
  143861. "mul r7, r6\n\t"
  143862. #endif
  143863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143864. "adds r3, r3, r7\n\t"
  143865. #else
  143866. "add r3, r3, r7\n\t"
  143867. #endif
  143868. #ifdef WOLFSSL_KEIL
  143869. "adcs r4, r4, %[r]\n\t"
  143870. #elif defined(__clang__)
  143871. "adcs r4, %[r]\n\t"
  143872. #else
  143873. "adc r4, %[r]\n\t"
  143874. #endif
  143875. "uxth r7, %[b]\n\t"
  143876. #ifdef WOLFSSL_KEIL
  143877. "muls r6, r7, r6\n\t"
  143878. #elif defined(__clang__)
  143879. "muls r6, r7\n\t"
  143880. #else
  143881. "mul r6, r7\n\t"
  143882. #endif
  143883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143884. "lsrs r7, r6, #16\n\t"
  143885. #else
  143886. "lsr r7, r6, #16\n\t"
  143887. #endif
  143888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143889. "lsls r6, r6, #16\n\t"
  143890. #else
  143891. "lsl r6, r6, #16\n\t"
  143892. #endif
  143893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143894. "adds r5, r5, r6\n\t"
  143895. #else
  143896. "add r5, r5, r6\n\t"
  143897. #endif
  143898. #ifdef WOLFSSL_KEIL
  143899. "adcs r3, r3, r7\n\t"
  143900. #elif defined(__clang__)
  143901. "adcs r3, r7\n\t"
  143902. #else
  143903. "adc r3, r7\n\t"
  143904. #endif
  143905. #ifdef WOLFSSL_KEIL
  143906. "adcs r4, r4, %[r]\n\t"
  143907. #elif defined(__clang__)
  143908. "adcs r4, %[r]\n\t"
  143909. #else
  143910. "adc r4, %[r]\n\t"
  143911. #endif
  143912. "# A[4] * B[7]\n\t"
  143913. "mov %[a], r9\n\t"
  143914. "mov %[b], r10\n\t"
  143915. "ldr %[a], [%[a], #16]\n\t"
  143916. "ldr %[b], [%[b], #28]\n\t"
  143917. "uxth r6, %[a]\n\t"
  143918. "uxth r7, %[b]\n\t"
  143919. #ifdef WOLFSSL_KEIL
  143920. "muls r7, r6, r7\n\t"
  143921. #elif defined(__clang__)
  143922. "muls r7, r6\n\t"
  143923. #else
  143924. "mul r7, r6\n\t"
  143925. #endif
  143926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143927. "adds r5, r5, r7\n\t"
  143928. #else
  143929. "add r5, r5, r7\n\t"
  143930. #endif
  143931. #ifdef WOLFSSL_KEIL
  143932. "adcs r3, r3, %[r]\n\t"
  143933. #elif defined(__clang__)
  143934. "adcs r3, %[r]\n\t"
  143935. #else
  143936. "adc r3, %[r]\n\t"
  143937. #endif
  143938. #ifdef WOLFSSL_KEIL
  143939. "adcs r4, r4, %[r]\n\t"
  143940. #elif defined(__clang__)
  143941. "adcs r4, %[r]\n\t"
  143942. #else
  143943. "adc r4, %[r]\n\t"
  143944. #endif
  143945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143946. "lsrs r7, %[b], #16\n\t"
  143947. #else
  143948. "lsr r7, %[b], #16\n\t"
  143949. #endif
  143950. #ifdef WOLFSSL_KEIL
  143951. "muls r6, r7, r6\n\t"
  143952. #elif defined(__clang__)
  143953. "muls r6, r7\n\t"
  143954. #else
  143955. "mul r6, r7\n\t"
  143956. #endif
  143957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143958. "lsrs r7, r6, #16\n\t"
  143959. #else
  143960. "lsr r7, r6, #16\n\t"
  143961. #endif
  143962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143963. "lsls r6, r6, #16\n\t"
  143964. #else
  143965. "lsl r6, r6, #16\n\t"
  143966. #endif
  143967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143968. "adds r5, r5, r6\n\t"
  143969. #else
  143970. "add r5, r5, r6\n\t"
  143971. #endif
  143972. #ifdef WOLFSSL_KEIL
  143973. "adcs r3, r3, r7\n\t"
  143974. #elif defined(__clang__)
  143975. "adcs r3, r7\n\t"
  143976. #else
  143977. "adc r3, r7\n\t"
  143978. #endif
  143979. #ifdef WOLFSSL_KEIL
  143980. "adcs r4, r4, %[r]\n\t"
  143981. #elif defined(__clang__)
  143982. "adcs r4, %[r]\n\t"
  143983. #else
  143984. "adc r4, %[r]\n\t"
  143985. #endif
  143986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143987. "lsrs r6, %[a], #16\n\t"
  143988. #else
  143989. "lsr r6, %[a], #16\n\t"
  143990. #endif
  143991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  143992. "lsrs r7, %[b], #16\n\t"
  143993. #else
  143994. "lsr r7, %[b], #16\n\t"
  143995. #endif
  143996. #ifdef WOLFSSL_KEIL
  143997. "muls r7, r6, r7\n\t"
  143998. #elif defined(__clang__)
  143999. "muls r7, r6\n\t"
  144000. #else
  144001. "mul r7, r6\n\t"
  144002. #endif
  144003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144004. "adds r3, r3, r7\n\t"
  144005. #else
  144006. "add r3, r3, r7\n\t"
  144007. #endif
  144008. #ifdef WOLFSSL_KEIL
  144009. "adcs r4, r4, %[r]\n\t"
  144010. #elif defined(__clang__)
  144011. "adcs r4, %[r]\n\t"
  144012. #else
  144013. "adc r4, %[r]\n\t"
  144014. #endif
  144015. "uxth r7, %[b]\n\t"
  144016. #ifdef WOLFSSL_KEIL
  144017. "muls r6, r7, r6\n\t"
  144018. #elif defined(__clang__)
  144019. "muls r6, r7\n\t"
  144020. #else
  144021. "mul r6, r7\n\t"
  144022. #endif
  144023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144024. "lsrs r7, r6, #16\n\t"
  144025. #else
  144026. "lsr r7, r6, #16\n\t"
  144027. #endif
  144028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144029. "lsls r6, r6, #16\n\t"
  144030. #else
  144031. "lsl r6, r6, #16\n\t"
  144032. #endif
  144033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144034. "adds r5, r5, r6\n\t"
  144035. #else
  144036. "add r5, r5, r6\n\t"
  144037. #endif
  144038. #ifdef WOLFSSL_KEIL
  144039. "adcs r3, r3, r7\n\t"
  144040. #elif defined(__clang__)
  144041. "adcs r3, r7\n\t"
  144042. #else
  144043. "adc r3, r7\n\t"
  144044. #endif
  144045. #ifdef WOLFSSL_KEIL
  144046. "adcs r4, r4, %[r]\n\t"
  144047. #elif defined(__clang__)
  144048. "adcs r4, %[r]\n\t"
  144049. #else
  144050. "adc r4, %[r]\n\t"
  144051. #endif
  144052. "# A[5] * B[6]\n\t"
  144053. "mov %[a], r9\n\t"
  144054. "mov %[b], r10\n\t"
  144055. "ldr %[a], [%[a], #20]\n\t"
  144056. "ldr %[b], [%[b], #24]\n\t"
  144057. "uxth r6, %[a]\n\t"
  144058. "uxth r7, %[b]\n\t"
  144059. #ifdef WOLFSSL_KEIL
  144060. "muls r7, r6, r7\n\t"
  144061. #elif defined(__clang__)
  144062. "muls r7, r6\n\t"
  144063. #else
  144064. "mul r7, r6\n\t"
  144065. #endif
  144066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144067. "adds r5, r5, r7\n\t"
  144068. #else
  144069. "add r5, r5, r7\n\t"
  144070. #endif
  144071. #ifdef WOLFSSL_KEIL
  144072. "adcs r3, r3, %[r]\n\t"
  144073. #elif defined(__clang__)
  144074. "adcs r3, %[r]\n\t"
  144075. #else
  144076. "adc r3, %[r]\n\t"
  144077. #endif
  144078. #ifdef WOLFSSL_KEIL
  144079. "adcs r4, r4, %[r]\n\t"
  144080. #elif defined(__clang__)
  144081. "adcs r4, %[r]\n\t"
  144082. #else
  144083. "adc r4, %[r]\n\t"
  144084. #endif
  144085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144086. "lsrs r7, %[b], #16\n\t"
  144087. #else
  144088. "lsr r7, %[b], #16\n\t"
  144089. #endif
  144090. #ifdef WOLFSSL_KEIL
  144091. "muls r6, r7, r6\n\t"
  144092. #elif defined(__clang__)
  144093. "muls r6, r7\n\t"
  144094. #else
  144095. "mul r6, r7\n\t"
  144096. #endif
  144097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144098. "lsrs r7, r6, #16\n\t"
  144099. #else
  144100. "lsr r7, r6, #16\n\t"
  144101. #endif
  144102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144103. "lsls r6, r6, #16\n\t"
  144104. #else
  144105. "lsl r6, r6, #16\n\t"
  144106. #endif
  144107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144108. "adds r5, r5, r6\n\t"
  144109. #else
  144110. "add r5, r5, r6\n\t"
  144111. #endif
  144112. #ifdef WOLFSSL_KEIL
  144113. "adcs r3, r3, r7\n\t"
  144114. #elif defined(__clang__)
  144115. "adcs r3, r7\n\t"
  144116. #else
  144117. "adc r3, r7\n\t"
  144118. #endif
  144119. #ifdef WOLFSSL_KEIL
  144120. "adcs r4, r4, %[r]\n\t"
  144121. #elif defined(__clang__)
  144122. "adcs r4, %[r]\n\t"
  144123. #else
  144124. "adc r4, %[r]\n\t"
  144125. #endif
  144126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144127. "lsrs r6, %[a], #16\n\t"
  144128. #else
  144129. "lsr r6, %[a], #16\n\t"
  144130. #endif
  144131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144132. "lsrs r7, %[b], #16\n\t"
  144133. #else
  144134. "lsr r7, %[b], #16\n\t"
  144135. #endif
  144136. #ifdef WOLFSSL_KEIL
  144137. "muls r7, r6, r7\n\t"
  144138. #elif defined(__clang__)
  144139. "muls r7, r6\n\t"
  144140. #else
  144141. "mul r7, r6\n\t"
  144142. #endif
  144143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144144. "adds r3, r3, r7\n\t"
  144145. #else
  144146. "add r3, r3, r7\n\t"
  144147. #endif
  144148. #ifdef WOLFSSL_KEIL
  144149. "adcs r4, r4, %[r]\n\t"
  144150. #elif defined(__clang__)
  144151. "adcs r4, %[r]\n\t"
  144152. #else
  144153. "adc r4, %[r]\n\t"
  144154. #endif
  144155. "uxth r7, %[b]\n\t"
  144156. #ifdef WOLFSSL_KEIL
  144157. "muls r6, r7, r6\n\t"
  144158. #elif defined(__clang__)
  144159. "muls r6, r7\n\t"
  144160. #else
  144161. "mul r6, r7\n\t"
  144162. #endif
  144163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144164. "lsrs r7, r6, #16\n\t"
  144165. #else
  144166. "lsr r7, r6, #16\n\t"
  144167. #endif
  144168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144169. "lsls r6, r6, #16\n\t"
  144170. #else
  144171. "lsl r6, r6, #16\n\t"
  144172. #endif
  144173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144174. "adds r5, r5, r6\n\t"
  144175. #else
  144176. "add r5, r5, r6\n\t"
  144177. #endif
  144178. #ifdef WOLFSSL_KEIL
  144179. "adcs r3, r3, r7\n\t"
  144180. #elif defined(__clang__)
  144181. "adcs r3, r7\n\t"
  144182. #else
  144183. "adc r3, r7\n\t"
  144184. #endif
  144185. #ifdef WOLFSSL_KEIL
  144186. "adcs r4, r4, %[r]\n\t"
  144187. #elif defined(__clang__)
  144188. "adcs r4, %[r]\n\t"
  144189. #else
  144190. "adc r4, %[r]\n\t"
  144191. #endif
  144192. "# A[6] * B[5]\n\t"
  144193. "mov %[a], r9\n\t"
  144194. "mov %[b], r10\n\t"
  144195. "ldr %[a], [%[a], #24]\n\t"
  144196. "ldr %[b], [%[b], #20]\n\t"
  144197. "uxth r6, %[a]\n\t"
  144198. "uxth r7, %[b]\n\t"
  144199. #ifdef WOLFSSL_KEIL
  144200. "muls r7, r6, r7\n\t"
  144201. #elif defined(__clang__)
  144202. "muls r7, r6\n\t"
  144203. #else
  144204. "mul r7, r6\n\t"
  144205. #endif
  144206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144207. "adds r5, r5, r7\n\t"
  144208. #else
  144209. "add r5, r5, r7\n\t"
  144210. #endif
  144211. #ifdef WOLFSSL_KEIL
  144212. "adcs r3, r3, %[r]\n\t"
  144213. #elif defined(__clang__)
  144214. "adcs r3, %[r]\n\t"
  144215. #else
  144216. "adc r3, %[r]\n\t"
  144217. #endif
  144218. #ifdef WOLFSSL_KEIL
  144219. "adcs r4, r4, %[r]\n\t"
  144220. #elif defined(__clang__)
  144221. "adcs r4, %[r]\n\t"
  144222. #else
  144223. "adc r4, %[r]\n\t"
  144224. #endif
  144225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144226. "lsrs r7, %[b], #16\n\t"
  144227. #else
  144228. "lsr r7, %[b], #16\n\t"
  144229. #endif
  144230. #ifdef WOLFSSL_KEIL
  144231. "muls r6, r7, r6\n\t"
  144232. #elif defined(__clang__)
  144233. "muls r6, r7\n\t"
  144234. #else
  144235. "mul r6, r7\n\t"
  144236. #endif
  144237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144238. "lsrs r7, r6, #16\n\t"
  144239. #else
  144240. "lsr r7, r6, #16\n\t"
  144241. #endif
  144242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144243. "lsls r6, r6, #16\n\t"
  144244. #else
  144245. "lsl r6, r6, #16\n\t"
  144246. #endif
  144247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144248. "adds r5, r5, r6\n\t"
  144249. #else
  144250. "add r5, r5, r6\n\t"
  144251. #endif
  144252. #ifdef WOLFSSL_KEIL
  144253. "adcs r3, r3, r7\n\t"
  144254. #elif defined(__clang__)
  144255. "adcs r3, r7\n\t"
  144256. #else
  144257. "adc r3, r7\n\t"
  144258. #endif
  144259. #ifdef WOLFSSL_KEIL
  144260. "adcs r4, r4, %[r]\n\t"
  144261. #elif defined(__clang__)
  144262. "adcs r4, %[r]\n\t"
  144263. #else
  144264. "adc r4, %[r]\n\t"
  144265. #endif
  144266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144267. "lsrs r6, %[a], #16\n\t"
  144268. #else
  144269. "lsr r6, %[a], #16\n\t"
  144270. #endif
  144271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144272. "lsrs r7, %[b], #16\n\t"
  144273. #else
  144274. "lsr r7, %[b], #16\n\t"
  144275. #endif
  144276. #ifdef WOLFSSL_KEIL
  144277. "muls r7, r6, r7\n\t"
  144278. #elif defined(__clang__)
  144279. "muls r7, r6\n\t"
  144280. #else
  144281. "mul r7, r6\n\t"
  144282. #endif
  144283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144284. "adds r3, r3, r7\n\t"
  144285. #else
  144286. "add r3, r3, r7\n\t"
  144287. #endif
  144288. #ifdef WOLFSSL_KEIL
  144289. "adcs r4, r4, %[r]\n\t"
  144290. #elif defined(__clang__)
  144291. "adcs r4, %[r]\n\t"
  144292. #else
  144293. "adc r4, %[r]\n\t"
  144294. #endif
  144295. "uxth r7, %[b]\n\t"
  144296. #ifdef WOLFSSL_KEIL
  144297. "muls r6, r7, r6\n\t"
  144298. #elif defined(__clang__)
  144299. "muls r6, r7\n\t"
  144300. #else
  144301. "mul r6, r7\n\t"
  144302. #endif
  144303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144304. "lsrs r7, r6, #16\n\t"
  144305. #else
  144306. "lsr r7, r6, #16\n\t"
  144307. #endif
  144308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144309. "lsls r6, r6, #16\n\t"
  144310. #else
  144311. "lsl r6, r6, #16\n\t"
  144312. #endif
  144313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144314. "adds r5, r5, r6\n\t"
  144315. #else
  144316. "add r5, r5, r6\n\t"
  144317. #endif
  144318. #ifdef WOLFSSL_KEIL
  144319. "adcs r3, r3, r7\n\t"
  144320. #elif defined(__clang__)
  144321. "adcs r3, r7\n\t"
  144322. #else
  144323. "adc r3, r7\n\t"
  144324. #endif
  144325. #ifdef WOLFSSL_KEIL
  144326. "adcs r4, r4, %[r]\n\t"
  144327. #elif defined(__clang__)
  144328. "adcs r4, %[r]\n\t"
  144329. #else
  144330. "adc r4, %[r]\n\t"
  144331. #endif
  144332. "# A[7] * B[4]\n\t"
  144333. "mov %[a], r9\n\t"
  144334. "mov %[b], r10\n\t"
  144335. "ldr %[a], [%[a], #28]\n\t"
  144336. "ldr %[b], [%[b], #16]\n\t"
  144337. "uxth r6, %[a]\n\t"
  144338. "uxth r7, %[b]\n\t"
  144339. #ifdef WOLFSSL_KEIL
  144340. "muls r7, r6, r7\n\t"
  144341. #elif defined(__clang__)
  144342. "muls r7, r6\n\t"
  144343. #else
  144344. "mul r7, r6\n\t"
  144345. #endif
  144346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144347. "adds r5, r5, r7\n\t"
  144348. #else
  144349. "add r5, r5, r7\n\t"
  144350. #endif
  144351. #ifdef WOLFSSL_KEIL
  144352. "adcs r3, r3, %[r]\n\t"
  144353. #elif defined(__clang__)
  144354. "adcs r3, %[r]\n\t"
  144355. #else
  144356. "adc r3, %[r]\n\t"
  144357. #endif
  144358. #ifdef WOLFSSL_KEIL
  144359. "adcs r4, r4, %[r]\n\t"
  144360. #elif defined(__clang__)
  144361. "adcs r4, %[r]\n\t"
  144362. #else
  144363. "adc r4, %[r]\n\t"
  144364. #endif
  144365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144366. "lsrs r7, %[b], #16\n\t"
  144367. #else
  144368. "lsr r7, %[b], #16\n\t"
  144369. #endif
  144370. #ifdef WOLFSSL_KEIL
  144371. "muls r6, r7, r6\n\t"
  144372. #elif defined(__clang__)
  144373. "muls r6, r7\n\t"
  144374. #else
  144375. "mul r6, r7\n\t"
  144376. #endif
  144377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144378. "lsrs r7, r6, #16\n\t"
  144379. #else
  144380. "lsr r7, r6, #16\n\t"
  144381. #endif
  144382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144383. "lsls r6, r6, #16\n\t"
  144384. #else
  144385. "lsl r6, r6, #16\n\t"
  144386. #endif
  144387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144388. "adds r5, r5, r6\n\t"
  144389. #else
  144390. "add r5, r5, r6\n\t"
  144391. #endif
  144392. #ifdef WOLFSSL_KEIL
  144393. "adcs r3, r3, r7\n\t"
  144394. #elif defined(__clang__)
  144395. "adcs r3, r7\n\t"
  144396. #else
  144397. "adc r3, r7\n\t"
  144398. #endif
  144399. #ifdef WOLFSSL_KEIL
  144400. "adcs r4, r4, %[r]\n\t"
  144401. #elif defined(__clang__)
  144402. "adcs r4, %[r]\n\t"
  144403. #else
  144404. "adc r4, %[r]\n\t"
  144405. #endif
  144406. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144407. "lsrs r6, %[a], #16\n\t"
  144408. #else
  144409. "lsr r6, %[a], #16\n\t"
  144410. #endif
  144411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144412. "lsrs r7, %[b], #16\n\t"
  144413. #else
  144414. "lsr r7, %[b], #16\n\t"
  144415. #endif
  144416. #ifdef WOLFSSL_KEIL
  144417. "muls r7, r6, r7\n\t"
  144418. #elif defined(__clang__)
  144419. "muls r7, r6\n\t"
  144420. #else
  144421. "mul r7, r6\n\t"
  144422. #endif
  144423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144424. "adds r3, r3, r7\n\t"
  144425. #else
  144426. "add r3, r3, r7\n\t"
  144427. #endif
  144428. #ifdef WOLFSSL_KEIL
  144429. "adcs r4, r4, %[r]\n\t"
  144430. #elif defined(__clang__)
  144431. "adcs r4, %[r]\n\t"
  144432. #else
  144433. "adc r4, %[r]\n\t"
  144434. #endif
  144435. "uxth r7, %[b]\n\t"
  144436. #ifdef WOLFSSL_KEIL
  144437. "muls r6, r7, r6\n\t"
  144438. #elif defined(__clang__)
  144439. "muls r6, r7\n\t"
  144440. #else
  144441. "mul r6, r7\n\t"
  144442. #endif
  144443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144444. "lsrs r7, r6, #16\n\t"
  144445. #else
  144446. "lsr r7, r6, #16\n\t"
  144447. #endif
  144448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144449. "lsls r6, r6, #16\n\t"
  144450. #else
  144451. "lsl r6, r6, #16\n\t"
  144452. #endif
  144453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144454. "adds r5, r5, r6\n\t"
  144455. #else
  144456. "add r5, r5, r6\n\t"
  144457. #endif
  144458. #ifdef WOLFSSL_KEIL
  144459. "adcs r3, r3, r7\n\t"
  144460. #elif defined(__clang__)
  144461. "adcs r3, r7\n\t"
  144462. #else
  144463. "adc r3, r7\n\t"
  144464. #endif
  144465. #ifdef WOLFSSL_KEIL
  144466. "adcs r4, r4, %[r]\n\t"
  144467. #elif defined(__clang__)
  144468. "adcs r4, %[r]\n\t"
  144469. #else
  144470. "adc r4, %[r]\n\t"
  144471. #endif
  144472. "# A[8] * B[3]\n\t"
  144473. "mov %[a], r9\n\t"
  144474. "mov %[b], r10\n\t"
  144475. "ldr %[a], [%[a], #32]\n\t"
  144476. "ldr %[b], [%[b], #12]\n\t"
  144477. "uxth r6, %[a]\n\t"
  144478. "uxth r7, %[b]\n\t"
  144479. #ifdef WOLFSSL_KEIL
  144480. "muls r7, r6, r7\n\t"
  144481. #elif defined(__clang__)
  144482. "muls r7, r6\n\t"
  144483. #else
  144484. "mul r7, r6\n\t"
  144485. #endif
  144486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144487. "adds r5, r5, r7\n\t"
  144488. #else
  144489. "add r5, r5, r7\n\t"
  144490. #endif
  144491. #ifdef WOLFSSL_KEIL
  144492. "adcs r3, r3, %[r]\n\t"
  144493. #elif defined(__clang__)
  144494. "adcs r3, %[r]\n\t"
  144495. #else
  144496. "adc r3, %[r]\n\t"
  144497. #endif
  144498. #ifdef WOLFSSL_KEIL
  144499. "adcs r4, r4, %[r]\n\t"
  144500. #elif defined(__clang__)
  144501. "adcs r4, %[r]\n\t"
  144502. #else
  144503. "adc r4, %[r]\n\t"
  144504. #endif
  144505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144506. "lsrs r7, %[b], #16\n\t"
  144507. #else
  144508. "lsr r7, %[b], #16\n\t"
  144509. #endif
  144510. #ifdef WOLFSSL_KEIL
  144511. "muls r6, r7, r6\n\t"
  144512. #elif defined(__clang__)
  144513. "muls r6, r7\n\t"
  144514. #else
  144515. "mul r6, r7\n\t"
  144516. #endif
  144517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144518. "lsrs r7, r6, #16\n\t"
  144519. #else
  144520. "lsr r7, r6, #16\n\t"
  144521. #endif
  144522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144523. "lsls r6, r6, #16\n\t"
  144524. #else
  144525. "lsl r6, r6, #16\n\t"
  144526. #endif
  144527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144528. "adds r5, r5, r6\n\t"
  144529. #else
  144530. "add r5, r5, r6\n\t"
  144531. #endif
  144532. #ifdef WOLFSSL_KEIL
  144533. "adcs r3, r3, r7\n\t"
  144534. #elif defined(__clang__)
  144535. "adcs r3, r7\n\t"
  144536. #else
  144537. "adc r3, r7\n\t"
  144538. #endif
  144539. #ifdef WOLFSSL_KEIL
  144540. "adcs r4, r4, %[r]\n\t"
  144541. #elif defined(__clang__)
  144542. "adcs r4, %[r]\n\t"
  144543. #else
  144544. "adc r4, %[r]\n\t"
  144545. #endif
  144546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144547. "lsrs r6, %[a], #16\n\t"
  144548. #else
  144549. "lsr r6, %[a], #16\n\t"
  144550. #endif
  144551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144552. "lsrs r7, %[b], #16\n\t"
  144553. #else
  144554. "lsr r7, %[b], #16\n\t"
  144555. #endif
  144556. #ifdef WOLFSSL_KEIL
  144557. "muls r7, r6, r7\n\t"
  144558. #elif defined(__clang__)
  144559. "muls r7, r6\n\t"
  144560. #else
  144561. "mul r7, r6\n\t"
  144562. #endif
  144563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144564. "adds r3, r3, r7\n\t"
  144565. #else
  144566. "add r3, r3, r7\n\t"
  144567. #endif
  144568. #ifdef WOLFSSL_KEIL
  144569. "adcs r4, r4, %[r]\n\t"
  144570. #elif defined(__clang__)
  144571. "adcs r4, %[r]\n\t"
  144572. #else
  144573. "adc r4, %[r]\n\t"
  144574. #endif
  144575. "uxth r7, %[b]\n\t"
  144576. #ifdef WOLFSSL_KEIL
  144577. "muls r6, r7, r6\n\t"
  144578. #elif defined(__clang__)
  144579. "muls r6, r7\n\t"
  144580. #else
  144581. "mul r6, r7\n\t"
  144582. #endif
  144583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144584. "lsrs r7, r6, #16\n\t"
  144585. #else
  144586. "lsr r7, r6, #16\n\t"
  144587. #endif
  144588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144589. "lsls r6, r6, #16\n\t"
  144590. #else
  144591. "lsl r6, r6, #16\n\t"
  144592. #endif
  144593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144594. "adds r5, r5, r6\n\t"
  144595. #else
  144596. "add r5, r5, r6\n\t"
  144597. #endif
  144598. #ifdef WOLFSSL_KEIL
  144599. "adcs r3, r3, r7\n\t"
  144600. #elif defined(__clang__)
  144601. "adcs r3, r7\n\t"
  144602. #else
  144603. "adc r3, r7\n\t"
  144604. #endif
  144605. #ifdef WOLFSSL_KEIL
  144606. "adcs r4, r4, %[r]\n\t"
  144607. #elif defined(__clang__)
  144608. "adcs r4, %[r]\n\t"
  144609. #else
  144610. "adc r4, %[r]\n\t"
  144611. #endif
  144612. "# A[9] * B[2]\n\t"
  144613. "mov %[a], r9\n\t"
  144614. "mov %[b], r10\n\t"
  144615. "ldr %[a], [%[a], #36]\n\t"
  144616. "ldr %[b], [%[b], #8]\n\t"
  144617. "uxth r6, %[a]\n\t"
  144618. "uxth r7, %[b]\n\t"
  144619. #ifdef WOLFSSL_KEIL
  144620. "muls r7, r6, r7\n\t"
  144621. #elif defined(__clang__)
  144622. "muls r7, r6\n\t"
  144623. #else
  144624. "mul r7, r6\n\t"
  144625. #endif
  144626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144627. "adds r5, r5, r7\n\t"
  144628. #else
  144629. "add r5, r5, r7\n\t"
  144630. #endif
  144631. #ifdef WOLFSSL_KEIL
  144632. "adcs r3, r3, %[r]\n\t"
  144633. #elif defined(__clang__)
  144634. "adcs r3, %[r]\n\t"
  144635. #else
  144636. "adc r3, %[r]\n\t"
  144637. #endif
  144638. #ifdef WOLFSSL_KEIL
  144639. "adcs r4, r4, %[r]\n\t"
  144640. #elif defined(__clang__)
  144641. "adcs r4, %[r]\n\t"
  144642. #else
  144643. "adc r4, %[r]\n\t"
  144644. #endif
  144645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144646. "lsrs r7, %[b], #16\n\t"
  144647. #else
  144648. "lsr r7, %[b], #16\n\t"
  144649. #endif
  144650. #ifdef WOLFSSL_KEIL
  144651. "muls r6, r7, r6\n\t"
  144652. #elif defined(__clang__)
  144653. "muls r6, r7\n\t"
  144654. #else
  144655. "mul r6, r7\n\t"
  144656. #endif
  144657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144658. "lsrs r7, r6, #16\n\t"
  144659. #else
  144660. "lsr r7, r6, #16\n\t"
  144661. #endif
  144662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144663. "lsls r6, r6, #16\n\t"
  144664. #else
  144665. "lsl r6, r6, #16\n\t"
  144666. #endif
  144667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144668. "adds r5, r5, r6\n\t"
  144669. #else
  144670. "add r5, r5, r6\n\t"
  144671. #endif
  144672. #ifdef WOLFSSL_KEIL
  144673. "adcs r3, r3, r7\n\t"
  144674. #elif defined(__clang__)
  144675. "adcs r3, r7\n\t"
  144676. #else
  144677. "adc r3, r7\n\t"
  144678. #endif
  144679. #ifdef WOLFSSL_KEIL
  144680. "adcs r4, r4, %[r]\n\t"
  144681. #elif defined(__clang__)
  144682. "adcs r4, %[r]\n\t"
  144683. #else
  144684. "adc r4, %[r]\n\t"
  144685. #endif
  144686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144687. "lsrs r6, %[a], #16\n\t"
  144688. #else
  144689. "lsr r6, %[a], #16\n\t"
  144690. #endif
  144691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144692. "lsrs r7, %[b], #16\n\t"
  144693. #else
  144694. "lsr r7, %[b], #16\n\t"
  144695. #endif
  144696. #ifdef WOLFSSL_KEIL
  144697. "muls r7, r6, r7\n\t"
  144698. #elif defined(__clang__)
  144699. "muls r7, r6\n\t"
  144700. #else
  144701. "mul r7, r6\n\t"
  144702. #endif
  144703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144704. "adds r3, r3, r7\n\t"
  144705. #else
  144706. "add r3, r3, r7\n\t"
  144707. #endif
  144708. #ifdef WOLFSSL_KEIL
  144709. "adcs r4, r4, %[r]\n\t"
  144710. #elif defined(__clang__)
  144711. "adcs r4, %[r]\n\t"
  144712. #else
  144713. "adc r4, %[r]\n\t"
  144714. #endif
  144715. "uxth r7, %[b]\n\t"
  144716. #ifdef WOLFSSL_KEIL
  144717. "muls r6, r7, r6\n\t"
  144718. #elif defined(__clang__)
  144719. "muls r6, r7\n\t"
  144720. #else
  144721. "mul r6, r7\n\t"
  144722. #endif
  144723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144724. "lsrs r7, r6, #16\n\t"
  144725. #else
  144726. "lsr r7, r6, #16\n\t"
  144727. #endif
  144728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144729. "lsls r6, r6, #16\n\t"
  144730. #else
  144731. "lsl r6, r6, #16\n\t"
  144732. #endif
  144733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144734. "adds r5, r5, r6\n\t"
  144735. #else
  144736. "add r5, r5, r6\n\t"
  144737. #endif
  144738. #ifdef WOLFSSL_KEIL
  144739. "adcs r3, r3, r7\n\t"
  144740. #elif defined(__clang__)
  144741. "adcs r3, r7\n\t"
  144742. #else
  144743. "adc r3, r7\n\t"
  144744. #endif
  144745. #ifdef WOLFSSL_KEIL
  144746. "adcs r4, r4, %[r]\n\t"
  144747. #elif defined(__clang__)
  144748. "adcs r4, %[r]\n\t"
  144749. #else
  144750. "adc r4, %[r]\n\t"
  144751. #endif
  144752. "# A[10] * B[1]\n\t"
  144753. "mov %[a], r9\n\t"
  144754. "mov %[b], r10\n\t"
  144755. "ldr %[a], [%[a], #40]\n\t"
  144756. "ldr %[b], [%[b], #4]\n\t"
  144757. "uxth r6, %[a]\n\t"
  144758. "uxth r7, %[b]\n\t"
  144759. #ifdef WOLFSSL_KEIL
  144760. "muls r7, r6, r7\n\t"
  144761. #elif defined(__clang__)
  144762. "muls r7, r6\n\t"
  144763. #else
  144764. "mul r7, r6\n\t"
  144765. #endif
  144766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144767. "adds r5, r5, r7\n\t"
  144768. #else
  144769. "add r5, r5, r7\n\t"
  144770. #endif
  144771. #ifdef WOLFSSL_KEIL
  144772. "adcs r3, r3, %[r]\n\t"
  144773. #elif defined(__clang__)
  144774. "adcs r3, %[r]\n\t"
  144775. #else
  144776. "adc r3, %[r]\n\t"
  144777. #endif
  144778. #ifdef WOLFSSL_KEIL
  144779. "adcs r4, r4, %[r]\n\t"
  144780. #elif defined(__clang__)
  144781. "adcs r4, %[r]\n\t"
  144782. #else
  144783. "adc r4, %[r]\n\t"
  144784. #endif
  144785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144786. "lsrs r7, %[b], #16\n\t"
  144787. #else
  144788. "lsr r7, %[b], #16\n\t"
  144789. #endif
  144790. #ifdef WOLFSSL_KEIL
  144791. "muls r6, r7, r6\n\t"
  144792. #elif defined(__clang__)
  144793. "muls r6, r7\n\t"
  144794. #else
  144795. "mul r6, r7\n\t"
  144796. #endif
  144797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144798. "lsrs r7, r6, #16\n\t"
  144799. #else
  144800. "lsr r7, r6, #16\n\t"
  144801. #endif
  144802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144803. "lsls r6, r6, #16\n\t"
  144804. #else
  144805. "lsl r6, r6, #16\n\t"
  144806. #endif
  144807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144808. "adds r5, r5, r6\n\t"
  144809. #else
  144810. "add r5, r5, r6\n\t"
  144811. #endif
  144812. #ifdef WOLFSSL_KEIL
  144813. "adcs r3, r3, r7\n\t"
  144814. #elif defined(__clang__)
  144815. "adcs r3, r7\n\t"
  144816. #else
  144817. "adc r3, r7\n\t"
  144818. #endif
  144819. #ifdef WOLFSSL_KEIL
  144820. "adcs r4, r4, %[r]\n\t"
  144821. #elif defined(__clang__)
  144822. "adcs r4, %[r]\n\t"
  144823. #else
  144824. "adc r4, %[r]\n\t"
  144825. #endif
  144826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144827. "lsrs r6, %[a], #16\n\t"
  144828. #else
  144829. "lsr r6, %[a], #16\n\t"
  144830. #endif
  144831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144832. "lsrs r7, %[b], #16\n\t"
  144833. #else
  144834. "lsr r7, %[b], #16\n\t"
  144835. #endif
  144836. #ifdef WOLFSSL_KEIL
  144837. "muls r7, r6, r7\n\t"
  144838. #elif defined(__clang__)
  144839. "muls r7, r6\n\t"
  144840. #else
  144841. "mul r7, r6\n\t"
  144842. #endif
  144843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144844. "adds r3, r3, r7\n\t"
  144845. #else
  144846. "add r3, r3, r7\n\t"
  144847. #endif
  144848. #ifdef WOLFSSL_KEIL
  144849. "adcs r4, r4, %[r]\n\t"
  144850. #elif defined(__clang__)
  144851. "adcs r4, %[r]\n\t"
  144852. #else
  144853. "adc r4, %[r]\n\t"
  144854. #endif
  144855. "uxth r7, %[b]\n\t"
  144856. #ifdef WOLFSSL_KEIL
  144857. "muls r6, r7, r6\n\t"
  144858. #elif defined(__clang__)
  144859. "muls r6, r7\n\t"
  144860. #else
  144861. "mul r6, r7\n\t"
  144862. #endif
  144863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144864. "lsrs r7, r6, #16\n\t"
  144865. #else
  144866. "lsr r7, r6, #16\n\t"
  144867. #endif
  144868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144869. "lsls r6, r6, #16\n\t"
  144870. #else
  144871. "lsl r6, r6, #16\n\t"
  144872. #endif
  144873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144874. "adds r5, r5, r6\n\t"
  144875. #else
  144876. "add r5, r5, r6\n\t"
  144877. #endif
  144878. #ifdef WOLFSSL_KEIL
  144879. "adcs r3, r3, r7\n\t"
  144880. #elif defined(__clang__)
  144881. "adcs r3, r7\n\t"
  144882. #else
  144883. "adc r3, r7\n\t"
  144884. #endif
  144885. #ifdef WOLFSSL_KEIL
  144886. "adcs r4, r4, %[r]\n\t"
  144887. #elif defined(__clang__)
  144888. "adcs r4, %[r]\n\t"
  144889. #else
  144890. "adc r4, %[r]\n\t"
  144891. #endif
  144892. "# A[11] * B[0]\n\t"
  144893. "mov %[a], r9\n\t"
  144894. "mov %[b], r10\n\t"
  144895. "ldr %[a], [%[a], #44]\n\t"
  144896. "ldr %[b], [%[b]]\n\t"
  144897. "uxth r6, %[a]\n\t"
  144898. "uxth r7, %[b]\n\t"
  144899. #ifdef WOLFSSL_KEIL
  144900. "muls r7, r6, r7\n\t"
  144901. #elif defined(__clang__)
  144902. "muls r7, r6\n\t"
  144903. #else
  144904. "mul r7, r6\n\t"
  144905. #endif
  144906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144907. "adds r5, r5, r7\n\t"
  144908. #else
  144909. "add r5, r5, r7\n\t"
  144910. #endif
  144911. #ifdef WOLFSSL_KEIL
  144912. "adcs r3, r3, %[r]\n\t"
  144913. #elif defined(__clang__)
  144914. "adcs r3, %[r]\n\t"
  144915. #else
  144916. "adc r3, %[r]\n\t"
  144917. #endif
  144918. #ifdef WOLFSSL_KEIL
  144919. "adcs r4, r4, %[r]\n\t"
  144920. #elif defined(__clang__)
  144921. "adcs r4, %[r]\n\t"
  144922. #else
  144923. "adc r4, %[r]\n\t"
  144924. #endif
  144925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144926. "lsrs r7, %[b], #16\n\t"
  144927. #else
  144928. "lsr r7, %[b], #16\n\t"
  144929. #endif
  144930. #ifdef WOLFSSL_KEIL
  144931. "muls r6, r7, r6\n\t"
  144932. #elif defined(__clang__)
  144933. "muls r6, r7\n\t"
  144934. #else
  144935. "mul r6, r7\n\t"
  144936. #endif
  144937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144938. "lsrs r7, r6, #16\n\t"
  144939. #else
  144940. "lsr r7, r6, #16\n\t"
  144941. #endif
  144942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144943. "lsls r6, r6, #16\n\t"
  144944. #else
  144945. "lsl r6, r6, #16\n\t"
  144946. #endif
  144947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144948. "adds r5, r5, r6\n\t"
  144949. #else
  144950. "add r5, r5, r6\n\t"
  144951. #endif
  144952. #ifdef WOLFSSL_KEIL
  144953. "adcs r3, r3, r7\n\t"
  144954. #elif defined(__clang__)
  144955. "adcs r3, r7\n\t"
  144956. #else
  144957. "adc r3, r7\n\t"
  144958. #endif
  144959. #ifdef WOLFSSL_KEIL
  144960. "adcs r4, r4, %[r]\n\t"
  144961. #elif defined(__clang__)
  144962. "adcs r4, %[r]\n\t"
  144963. #else
  144964. "adc r4, %[r]\n\t"
  144965. #endif
  144966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144967. "lsrs r6, %[a], #16\n\t"
  144968. #else
  144969. "lsr r6, %[a], #16\n\t"
  144970. #endif
  144971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144972. "lsrs r7, %[b], #16\n\t"
  144973. #else
  144974. "lsr r7, %[b], #16\n\t"
  144975. #endif
  144976. #ifdef WOLFSSL_KEIL
  144977. "muls r7, r6, r7\n\t"
  144978. #elif defined(__clang__)
  144979. "muls r7, r6\n\t"
  144980. #else
  144981. "mul r7, r6\n\t"
  144982. #endif
  144983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  144984. "adds r3, r3, r7\n\t"
  144985. #else
  144986. "add r3, r3, r7\n\t"
  144987. #endif
  144988. #ifdef WOLFSSL_KEIL
  144989. "adcs r4, r4, %[r]\n\t"
  144990. #elif defined(__clang__)
  144991. "adcs r4, %[r]\n\t"
  144992. #else
  144993. "adc r4, %[r]\n\t"
  144994. #endif
  144995. "uxth r7, %[b]\n\t"
  144996. #ifdef WOLFSSL_KEIL
  144997. "muls r6, r7, r6\n\t"
  144998. #elif defined(__clang__)
  144999. "muls r6, r7\n\t"
  145000. #else
  145001. "mul r6, r7\n\t"
  145002. #endif
  145003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145004. "lsrs r7, r6, #16\n\t"
  145005. #else
  145006. "lsr r7, r6, #16\n\t"
  145007. #endif
  145008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145009. "lsls r6, r6, #16\n\t"
  145010. #else
  145011. "lsl r6, r6, #16\n\t"
  145012. #endif
  145013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145014. "adds r5, r5, r6\n\t"
  145015. #else
  145016. "add r5, r5, r6\n\t"
  145017. #endif
  145018. #ifdef WOLFSSL_KEIL
  145019. "adcs r3, r3, r7\n\t"
  145020. #elif defined(__clang__)
  145021. "adcs r3, r7\n\t"
  145022. #else
  145023. "adc r3, r7\n\t"
  145024. #endif
  145025. #ifdef WOLFSSL_KEIL
  145026. "adcs r4, r4, %[r]\n\t"
  145027. #elif defined(__clang__)
  145028. "adcs r4, %[r]\n\t"
  145029. #else
  145030. "adc r4, %[r]\n\t"
  145031. #endif
  145032. "str r5, [sp, #44]\n\t"
  145033. "# A[12] * B[0]\n\t"
  145034. "movs r5, #0\n\t"
  145035. "mov %[a], r9\n\t"
  145036. "mov %[b], r10\n\t"
  145037. "ldr %[a], [%[a], #48]\n\t"
  145038. "ldr %[b], [%[b]]\n\t"
  145039. "uxth r6, %[a]\n\t"
  145040. "uxth r7, %[b]\n\t"
  145041. #ifdef WOLFSSL_KEIL
  145042. "muls r7, r6, r7\n\t"
  145043. #elif defined(__clang__)
  145044. "muls r7, r6\n\t"
  145045. #else
  145046. "mul r7, r6\n\t"
  145047. #endif
  145048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145049. "adds r3, r3, r7\n\t"
  145050. #else
  145051. "add r3, r3, r7\n\t"
  145052. #endif
  145053. #ifdef WOLFSSL_KEIL
  145054. "adcs r4, r4, %[r]\n\t"
  145055. #elif defined(__clang__)
  145056. "adcs r4, %[r]\n\t"
  145057. #else
  145058. "adc r4, %[r]\n\t"
  145059. #endif
  145060. #ifdef WOLFSSL_KEIL
  145061. "adcs r5, r5, %[r]\n\t"
  145062. #elif defined(__clang__)
  145063. "adcs r5, %[r]\n\t"
  145064. #else
  145065. "adc r5, %[r]\n\t"
  145066. #endif
  145067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145068. "lsrs r7, %[b], #16\n\t"
  145069. #else
  145070. "lsr r7, %[b], #16\n\t"
  145071. #endif
  145072. #ifdef WOLFSSL_KEIL
  145073. "muls r6, r7, r6\n\t"
  145074. #elif defined(__clang__)
  145075. "muls r6, r7\n\t"
  145076. #else
  145077. "mul r6, r7\n\t"
  145078. #endif
  145079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145080. "lsrs r7, r6, #16\n\t"
  145081. #else
  145082. "lsr r7, r6, #16\n\t"
  145083. #endif
  145084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145085. "lsls r6, r6, #16\n\t"
  145086. #else
  145087. "lsl r6, r6, #16\n\t"
  145088. #endif
  145089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145090. "adds r3, r3, r6\n\t"
  145091. #else
  145092. "add r3, r3, r6\n\t"
  145093. #endif
  145094. #ifdef WOLFSSL_KEIL
  145095. "adcs r4, r4, r7\n\t"
  145096. #elif defined(__clang__)
  145097. "adcs r4, r7\n\t"
  145098. #else
  145099. "adc r4, r7\n\t"
  145100. #endif
  145101. #ifdef WOLFSSL_KEIL
  145102. "adcs r5, r5, %[r]\n\t"
  145103. #elif defined(__clang__)
  145104. "adcs r5, %[r]\n\t"
  145105. #else
  145106. "adc r5, %[r]\n\t"
  145107. #endif
  145108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145109. "lsrs r6, %[a], #16\n\t"
  145110. #else
  145111. "lsr r6, %[a], #16\n\t"
  145112. #endif
  145113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145114. "lsrs r7, %[b], #16\n\t"
  145115. #else
  145116. "lsr r7, %[b], #16\n\t"
  145117. #endif
  145118. #ifdef WOLFSSL_KEIL
  145119. "muls r7, r6, r7\n\t"
  145120. #elif defined(__clang__)
  145121. "muls r7, r6\n\t"
  145122. #else
  145123. "mul r7, r6\n\t"
  145124. #endif
  145125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145126. "adds r4, r4, r7\n\t"
  145127. #else
  145128. "add r4, r4, r7\n\t"
  145129. #endif
  145130. #ifdef WOLFSSL_KEIL
  145131. "adcs r5, r5, %[r]\n\t"
  145132. #elif defined(__clang__)
  145133. "adcs r5, %[r]\n\t"
  145134. #else
  145135. "adc r5, %[r]\n\t"
  145136. #endif
  145137. "uxth r7, %[b]\n\t"
  145138. #ifdef WOLFSSL_KEIL
  145139. "muls r6, r7, r6\n\t"
  145140. #elif defined(__clang__)
  145141. "muls r6, r7\n\t"
  145142. #else
  145143. "mul r6, r7\n\t"
  145144. #endif
  145145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145146. "lsrs r7, r6, #16\n\t"
  145147. #else
  145148. "lsr r7, r6, #16\n\t"
  145149. #endif
  145150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145151. "lsls r6, r6, #16\n\t"
  145152. #else
  145153. "lsl r6, r6, #16\n\t"
  145154. #endif
  145155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145156. "adds r3, r3, r6\n\t"
  145157. #else
  145158. "add r3, r3, r6\n\t"
  145159. #endif
  145160. #ifdef WOLFSSL_KEIL
  145161. "adcs r4, r4, r7\n\t"
  145162. #elif defined(__clang__)
  145163. "adcs r4, r7\n\t"
  145164. #else
  145165. "adc r4, r7\n\t"
  145166. #endif
  145167. #ifdef WOLFSSL_KEIL
  145168. "adcs r5, r5, %[r]\n\t"
  145169. #elif defined(__clang__)
  145170. "adcs r5, %[r]\n\t"
  145171. #else
  145172. "adc r5, %[r]\n\t"
  145173. #endif
  145174. "# A[11] * B[1]\n\t"
  145175. "mov %[a], r9\n\t"
  145176. "mov %[b], r10\n\t"
  145177. "ldr %[a], [%[a], #44]\n\t"
  145178. "ldr %[b], [%[b], #4]\n\t"
  145179. "uxth r6, %[a]\n\t"
  145180. "uxth r7, %[b]\n\t"
  145181. #ifdef WOLFSSL_KEIL
  145182. "muls r7, r6, r7\n\t"
  145183. #elif defined(__clang__)
  145184. "muls r7, r6\n\t"
  145185. #else
  145186. "mul r7, r6\n\t"
  145187. #endif
  145188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145189. "adds r3, r3, r7\n\t"
  145190. #else
  145191. "add r3, r3, r7\n\t"
  145192. #endif
  145193. #ifdef WOLFSSL_KEIL
  145194. "adcs r4, r4, %[r]\n\t"
  145195. #elif defined(__clang__)
  145196. "adcs r4, %[r]\n\t"
  145197. #else
  145198. "adc r4, %[r]\n\t"
  145199. #endif
  145200. #ifdef WOLFSSL_KEIL
  145201. "adcs r5, r5, %[r]\n\t"
  145202. #elif defined(__clang__)
  145203. "adcs r5, %[r]\n\t"
  145204. #else
  145205. "adc r5, %[r]\n\t"
  145206. #endif
  145207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145208. "lsrs r7, %[b], #16\n\t"
  145209. #else
  145210. "lsr r7, %[b], #16\n\t"
  145211. #endif
  145212. #ifdef WOLFSSL_KEIL
  145213. "muls r6, r7, r6\n\t"
  145214. #elif defined(__clang__)
  145215. "muls r6, r7\n\t"
  145216. #else
  145217. "mul r6, r7\n\t"
  145218. #endif
  145219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145220. "lsrs r7, r6, #16\n\t"
  145221. #else
  145222. "lsr r7, r6, #16\n\t"
  145223. #endif
  145224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145225. "lsls r6, r6, #16\n\t"
  145226. #else
  145227. "lsl r6, r6, #16\n\t"
  145228. #endif
  145229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145230. "adds r3, r3, r6\n\t"
  145231. #else
  145232. "add r3, r3, r6\n\t"
  145233. #endif
  145234. #ifdef WOLFSSL_KEIL
  145235. "adcs r4, r4, r7\n\t"
  145236. #elif defined(__clang__)
  145237. "adcs r4, r7\n\t"
  145238. #else
  145239. "adc r4, r7\n\t"
  145240. #endif
  145241. #ifdef WOLFSSL_KEIL
  145242. "adcs r5, r5, %[r]\n\t"
  145243. #elif defined(__clang__)
  145244. "adcs r5, %[r]\n\t"
  145245. #else
  145246. "adc r5, %[r]\n\t"
  145247. #endif
  145248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145249. "lsrs r6, %[a], #16\n\t"
  145250. #else
  145251. "lsr r6, %[a], #16\n\t"
  145252. #endif
  145253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145254. "lsrs r7, %[b], #16\n\t"
  145255. #else
  145256. "lsr r7, %[b], #16\n\t"
  145257. #endif
  145258. #ifdef WOLFSSL_KEIL
  145259. "muls r7, r6, r7\n\t"
  145260. #elif defined(__clang__)
  145261. "muls r7, r6\n\t"
  145262. #else
  145263. "mul r7, r6\n\t"
  145264. #endif
  145265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145266. "adds r4, r4, r7\n\t"
  145267. #else
  145268. "add r4, r4, r7\n\t"
  145269. #endif
  145270. #ifdef WOLFSSL_KEIL
  145271. "adcs r5, r5, %[r]\n\t"
  145272. #elif defined(__clang__)
  145273. "adcs r5, %[r]\n\t"
  145274. #else
  145275. "adc r5, %[r]\n\t"
  145276. #endif
  145277. "uxth r7, %[b]\n\t"
  145278. #ifdef WOLFSSL_KEIL
  145279. "muls r6, r7, r6\n\t"
  145280. #elif defined(__clang__)
  145281. "muls r6, r7\n\t"
  145282. #else
  145283. "mul r6, r7\n\t"
  145284. #endif
  145285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145286. "lsrs r7, r6, #16\n\t"
  145287. #else
  145288. "lsr r7, r6, #16\n\t"
  145289. #endif
  145290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145291. "lsls r6, r6, #16\n\t"
  145292. #else
  145293. "lsl r6, r6, #16\n\t"
  145294. #endif
  145295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145296. "adds r3, r3, r6\n\t"
  145297. #else
  145298. "add r3, r3, r6\n\t"
  145299. #endif
  145300. #ifdef WOLFSSL_KEIL
  145301. "adcs r4, r4, r7\n\t"
  145302. #elif defined(__clang__)
  145303. "adcs r4, r7\n\t"
  145304. #else
  145305. "adc r4, r7\n\t"
  145306. #endif
  145307. #ifdef WOLFSSL_KEIL
  145308. "adcs r5, r5, %[r]\n\t"
  145309. #elif defined(__clang__)
  145310. "adcs r5, %[r]\n\t"
  145311. #else
  145312. "adc r5, %[r]\n\t"
  145313. #endif
  145314. "# A[10] * B[2]\n\t"
  145315. "mov %[a], r9\n\t"
  145316. "mov %[b], r10\n\t"
  145317. "ldr %[a], [%[a], #40]\n\t"
  145318. "ldr %[b], [%[b], #8]\n\t"
  145319. "uxth r6, %[a]\n\t"
  145320. "uxth r7, %[b]\n\t"
  145321. #ifdef WOLFSSL_KEIL
  145322. "muls r7, r6, r7\n\t"
  145323. #elif defined(__clang__)
  145324. "muls r7, r6\n\t"
  145325. #else
  145326. "mul r7, r6\n\t"
  145327. #endif
  145328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145329. "adds r3, r3, r7\n\t"
  145330. #else
  145331. "add r3, r3, r7\n\t"
  145332. #endif
  145333. #ifdef WOLFSSL_KEIL
  145334. "adcs r4, r4, %[r]\n\t"
  145335. #elif defined(__clang__)
  145336. "adcs r4, %[r]\n\t"
  145337. #else
  145338. "adc r4, %[r]\n\t"
  145339. #endif
  145340. #ifdef WOLFSSL_KEIL
  145341. "adcs r5, r5, %[r]\n\t"
  145342. #elif defined(__clang__)
  145343. "adcs r5, %[r]\n\t"
  145344. #else
  145345. "adc r5, %[r]\n\t"
  145346. #endif
  145347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145348. "lsrs r7, %[b], #16\n\t"
  145349. #else
  145350. "lsr r7, %[b], #16\n\t"
  145351. #endif
  145352. #ifdef WOLFSSL_KEIL
  145353. "muls r6, r7, r6\n\t"
  145354. #elif defined(__clang__)
  145355. "muls r6, r7\n\t"
  145356. #else
  145357. "mul r6, r7\n\t"
  145358. #endif
  145359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145360. "lsrs r7, r6, #16\n\t"
  145361. #else
  145362. "lsr r7, r6, #16\n\t"
  145363. #endif
  145364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145365. "lsls r6, r6, #16\n\t"
  145366. #else
  145367. "lsl r6, r6, #16\n\t"
  145368. #endif
  145369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145370. "adds r3, r3, r6\n\t"
  145371. #else
  145372. "add r3, r3, r6\n\t"
  145373. #endif
  145374. #ifdef WOLFSSL_KEIL
  145375. "adcs r4, r4, r7\n\t"
  145376. #elif defined(__clang__)
  145377. "adcs r4, r7\n\t"
  145378. #else
  145379. "adc r4, r7\n\t"
  145380. #endif
  145381. #ifdef WOLFSSL_KEIL
  145382. "adcs r5, r5, %[r]\n\t"
  145383. #elif defined(__clang__)
  145384. "adcs r5, %[r]\n\t"
  145385. #else
  145386. "adc r5, %[r]\n\t"
  145387. #endif
  145388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145389. "lsrs r6, %[a], #16\n\t"
  145390. #else
  145391. "lsr r6, %[a], #16\n\t"
  145392. #endif
  145393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145394. "lsrs r7, %[b], #16\n\t"
  145395. #else
  145396. "lsr r7, %[b], #16\n\t"
  145397. #endif
  145398. #ifdef WOLFSSL_KEIL
  145399. "muls r7, r6, r7\n\t"
  145400. #elif defined(__clang__)
  145401. "muls r7, r6\n\t"
  145402. #else
  145403. "mul r7, r6\n\t"
  145404. #endif
  145405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145406. "adds r4, r4, r7\n\t"
  145407. #else
  145408. "add r4, r4, r7\n\t"
  145409. #endif
  145410. #ifdef WOLFSSL_KEIL
  145411. "adcs r5, r5, %[r]\n\t"
  145412. #elif defined(__clang__)
  145413. "adcs r5, %[r]\n\t"
  145414. #else
  145415. "adc r5, %[r]\n\t"
  145416. #endif
  145417. "uxth r7, %[b]\n\t"
  145418. #ifdef WOLFSSL_KEIL
  145419. "muls r6, r7, r6\n\t"
  145420. #elif defined(__clang__)
  145421. "muls r6, r7\n\t"
  145422. #else
  145423. "mul r6, r7\n\t"
  145424. #endif
  145425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145426. "lsrs r7, r6, #16\n\t"
  145427. #else
  145428. "lsr r7, r6, #16\n\t"
  145429. #endif
  145430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145431. "lsls r6, r6, #16\n\t"
  145432. #else
  145433. "lsl r6, r6, #16\n\t"
  145434. #endif
  145435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145436. "adds r3, r3, r6\n\t"
  145437. #else
  145438. "add r3, r3, r6\n\t"
  145439. #endif
  145440. #ifdef WOLFSSL_KEIL
  145441. "adcs r4, r4, r7\n\t"
  145442. #elif defined(__clang__)
  145443. "adcs r4, r7\n\t"
  145444. #else
  145445. "adc r4, r7\n\t"
  145446. #endif
  145447. #ifdef WOLFSSL_KEIL
  145448. "adcs r5, r5, %[r]\n\t"
  145449. #elif defined(__clang__)
  145450. "adcs r5, %[r]\n\t"
  145451. #else
  145452. "adc r5, %[r]\n\t"
  145453. #endif
  145454. "# A[9] * B[3]\n\t"
  145455. "mov %[a], r9\n\t"
  145456. "mov %[b], r10\n\t"
  145457. "ldr %[a], [%[a], #36]\n\t"
  145458. "ldr %[b], [%[b], #12]\n\t"
  145459. "uxth r6, %[a]\n\t"
  145460. "uxth r7, %[b]\n\t"
  145461. #ifdef WOLFSSL_KEIL
  145462. "muls r7, r6, r7\n\t"
  145463. #elif defined(__clang__)
  145464. "muls r7, r6\n\t"
  145465. #else
  145466. "mul r7, r6\n\t"
  145467. #endif
  145468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145469. "adds r3, r3, r7\n\t"
  145470. #else
  145471. "add r3, r3, r7\n\t"
  145472. #endif
  145473. #ifdef WOLFSSL_KEIL
  145474. "adcs r4, r4, %[r]\n\t"
  145475. #elif defined(__clang__)
  145476. "adcs r4, %[r]\n\t"
  145477. #else
  145478. "adc r4, %[r]\n\t"
  145479. #endif
  145480. #ifdef WOLFSSL_KEIL
  145481. "adcs r5, r5, %[r]\n\t"
  145482. #elif defined(__clang__)
  145483. "adcs r5, %[r]\n\t"
  145484. #else
  145485. "adc r5, %[r]\n\t"
  145486. #endif
  145487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145488. "lsrs r7, %[b], #16\n\t"
  145489. #else
  145490. "lsr r7, %[b], #16\n\t"
  145491. #endif
  145492. #ifdef WOLFSSL_KEIL
  145493. "muls r6, r7, r6\n\t"
  145494. #elif defined(__clang__)
  145495. "muls r6, r7\n\t"
  145496. #else
  145497. "mul r6, r7\n\t"
  145498. #endif
  145499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145500. "lsrs r7, r6, #16\n\t"
  145501. #else
  145502. "lsr r7, r6, #16\n\t"
  145503. #endif
  145504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145505. "lsls r6, r6, #16\n\t"
  145506. #else
  145507. "lsl r6, r6, #16\n\t"
  145508. #endif
  145509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145510. "adds r3, r3, r6\n\t"
  145511. #else
  145512. "add r3, r3, r6\n\t"
  145513. #endif
  145514. #ifdef WOLFSSL_KEIL
  145515. "adcs r4, r4, r7\n\t"
  145516. #elif defined(__clang__)
  145517. "adcs r4, r7\n\t"
  145518. #else
  145519. "adc r4, r7\n\t"
  145520. #endif
  145521. #ifdef WOLFSSL_KEIL
  145522. "adcs r5, r5, %[r]\n\t"
  145523. #elif defined(__clang__)
  145524. "adcs r5, %[r]\n\t"
  145525. #else
  145526. "adc r5, %[r]\n\t"
  145527. #endif
  145528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145529. "lsrs r6, %[a], #16\n\t"
  145530. #else
  145531. "lsr r6, %[a], #16\n\t"
  145532. #endif
  145533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145534. "lsrs r7, %[b], #16\n\t"
  145535. #else
  145536. "lsr r7, %[b], #16\n\t"
  145537. #endif
  145538. #ifdef WOLFSSL_KEIL
  145539. "muls r7, r6, r7\n\t"
  145540. #elif defined(__clang__)
  145541. "muls r7, r6\n\t"
  145542. #else
  145543. "mul r7, r6\n\t"
  145544. #endif
  145545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145546. "adds r4, r4, r7\n\t"
  145547. #else
  145548. "add r4, r4, r7\n\t"
  145549. #endif
  145550. #ifdef WOLFSSL_KEIL
  145551. "adcs r5, r5, %[r]\n\t"
  145552. #elif defined(__clang__)
  145553. "adcs r5, %[r]\n\t"
  145554. #else
  145555. "adc r5, %[r]\n\t"
  145556. #endif
  145557. "uxth r7, %[b]\n\t"
  145558. #ifdef WOLFSSL_KEIL
  145559. "muls r6, r7, r6\n\t"
  145560. #elif defined(__clang__)
  145561. "muls r6, r7\n\t"
  145562. #else
  145563. "mul r6, r7\n\t"
  145564. #endif
  145565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145566. "lsrs r7, r6, #16\n\t"
  145567. #else
  145568. "lsr r7, r6, #16\n\t"
  145569. #endif
  145570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145571. "lsls r6, r6, #16\n\t"
  145572. #else
  145573. "lsl r6, r6, #16\n\t"
  145574. #endif
  145575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145576. "adds r3, r3, r6\n\t"
  145577. #else
  145578. "add r3, r3, r6\n\t"
  145579. #endif
  145580. #ifdef WOLFSSL_KEIL
  145581. "adcs r4, r4, r7\n\t"
  145582. #elif defined(__clang__)
  145583. "adcs r4, r7\n\t"
  145584. #else
  145585. "adc r4, r7\n\t"
  145586. #endif
  145587. #ifdef WOLFSSL_KEIL
  145588. "adcs r5, r5, %[r]\n\t"
  145589. #elif defined(__clang__)
  145590. "adcs r5, %[r]\n\t"
  145591. #else
  145592. "adc r5, %[r]\n\t"
  145593. #endif
  145594. "# A[8] * B[4]\n\t"
  145595. "mov %[a], r9\n\t"
  145596. "mov %[b], r10\n\t"
  145597. "ldr %[a], [%[a], #32]\n\t"
  145598. "ldr %[b], [%[b], #16]\n\t"
  145599. "uxth r6, %[a]\n\t"
  145600. "uxth r7, %[b]\n\t"
  145601. #ifdef WOLFSSL_KEIL
  145602. "muls r7, r6, r7\n\t"
  145603. #elif defined(__clang__)
  145604. "muls r7, r6\n\t"
  145605. #else
  145606. "mul r7, r6\n\t"
  145607. #endif
  145608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145609. "adds r3, r3, r7\n\t"
  145610. #else
  145611. "add r3, r3, r7\n\t"
  145612. #endif
  145613. #ifdef WOLFSSL_KEIL
  145614. "adcs r4, r4, %[r]\n\t"
  145615. #elif defined(__clang__)
  145616. "adcs r4, %[r]\n\t"
  145617. #else
  145618. "adc r4, %[r]\n\t"
  145619. #endif
  145620. #ifdef WOLFSSL_KEIL
  145621. "adcs r5, r5, %[r]\n\t"
  145622. #elif defined(__clang__)
  145623. "adcs r5, %[r]\n\t"
  145624. #else
  145625. "adc r5, %[r]\n\t"
  145626. #endif
  145627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145628. "lsrs r7, %[b], #16\n\t"
  145629. #else
  145630. "lsr r7, %[b], #16\n\t"
  145631. #endif
  145632. #ifdef WOLFSSL_KEIL
  145633. "muls r6, r7, r6\n\t"
  145634. #elif defined(__clang__)
  145635. "muls r6, r7\n\t"
  145636. #else
  145637. "mul r6, r7\n\t"
  145638. #endif
  145639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145640. "lsrs r7, r6, #16\n\t"
  145641. #else
  145642. "lsr r7, r6, #16\n\t"
  145643. #endif
  145644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145645. "lsls r6, r6, #16\n\t"
  145646. #else
  145647. "lsl r6, r6, #16\n\t"
  145648. #endif
  145649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145650. "adds r3, r3, r6\n\t"
  145651. #else
  145652. "add r3, r3, r6\n\t"
  145653. #endif
  145654. #ifdef WOLFSSL_KEIL
  145655. "adcs r4, r4, r7\n\t"
  145656. #elif defined(__clang__)
  145657. "adcs r4, r7\n\t"
  145658. #else
  145659. "adc r4, r7\n\t"
  145660. #endif
  145661. #ifdef WOLFSSL_KEIL
  145662. "adcs r5, r5, %[r]\n\t"
  145663. #elif defined(__clang__)
  145664. "adcs r5, %[r]\n\t"
  145665. #else
  145666. "adc r5, %[r]\n\t"
  145667. #endif
  145668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145669. "lsrs r6, %[a], #16\n\t"
  145670. #else
  145671. "lsr r6, %[a], #16\n\t"
  145672. #endif
  145673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145674. "lsrs r7, %[b], #16\n\t"
  145675. #else
  145676. "lsr r7, %[b], #16\n\t"
  145677. #endif
  145678. #ifdef WOLFSSL_KEIL
  145679. "muls r7, r6, r7\n\t"
  145680. #elif defined(__clang__)
  145681. "muls r7, r6\n\t"
  145682. #else
  145683. "mul r7, r6\n\t"
  145684. #endif
  145685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145686. "adds r4, r4, r7\n\t"
  145687. #else
  145688. "add r4, r4, r7\n\t"
  145689. #endif
  145690. #ifdef WOLFSSL_KEIL
  145691. "adcs r5, r5, %[r]\n\t"
  145692. #elif defined(__clang__)
  145693. "adcs r5, %[r]\n\t"
  145694. #else
  145695. "adc r5, %[r]\n\t"
  145696. #endif
  145697. "uxth r7, %[b]\n\t"
  145698. #ifdef WOLFSSL_KEIL
  145699. "muls r6, r7, r6\n\t"
  145700. #elif defined(__clang__)
  145701. "muls r6, r7\n\t"
  145702. #else
  145703. "mul r6, r7\n\t"
  145704. #endif
  145705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145706. "lsrs r7, r6, #16\n\t"
  145707. #else
  145708. "lsr r7, r6, #16\n\t"
  145709. #endif
  145710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145711. "lsls r6, r6, #16\n\t"
  145712. #else
  145713. "lsl r6, r6, #16\n\t"
  145714. #endif
  145715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145716. "adds r3, r3, r6\n\t"
  145717. #else
  145718. "add r3, r3, r6\n\t"
  145719. #endif
  145720. #ifdef WOLFSSL_KEIL
  145721. "adcs r4, r4, r7\n\t"
  145722. #elif defined(__clang__)
  145723. "adcs r4, r7\n\t"
  145724. #else
  145725. "adc r4, r7\n\t"
  145726. #endif
  145727. #ifdef WOLFSSL_KEIL
  145728. "adcs r5, r5, %[r]\n\t"
  145729. #elif defined(__clang__)
  145730. "adcs r5, %[r]\n\t"
  145731. #else
  145732. "adc r5, %[r]\n\t"
  145733. #endif
  145734. "# A[7] * B[5]\n\t"
  145735. "mov %[a], r9\n\t"
  145736. "mov %[b], r10\n\t"
  145737. "ldr %[a], [%[a], #28]\n\t"
  145738. "ldr %[b], [%[b], #20]\n\t"
  145739. "uxth r6, %[a]\n\t"
  145740. "uxth r7, %[b]\n\t"
  145741. #ifdef WOLFSSL_KEIL
  145742. "muls r7, r6, r7\n\t"
  145743. #elif defined(__clang__)
  145744. "muls r7, r6\n\t"
  145745. #else
  145746. "mul r7, r6\n\t"
  145747. #endif
  145748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145749. "adds r3, r3, r7\n\t"
  145750. #else
  145751. "add r3, r3, r7\n\t"
  145752. #endif
  145753. #ifdef WOLFSSL_KEIL
  145754. "adcs r4, r4, %[r]\n\t"
  145755. #elif defined(__clang__)
  145756. "adcs r4, %[r]\n\t"
  145757. #else
  145758. "adc r4, %[r]\n\t"
  145759. #endif
  145760. #ifdef WOLFSSL_KEIL
  145761. "adcs r5, r5, %[r]\n\t"
  145762. #elif defined(__clang__)
  145763. "adcs r5, %[r]\n\t"
  145764. #else
  145765. "adc r5, %[r]\n\t"
  145766. #endif
  145767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145768. "lsrs r7, %[b], #16\n\t"
  145769. #else
  145770. "lsr r7, %[b], #16\n\t"
  145771. #endif
  145772. #ifdef WOLFSSL_KEIL
  145773. "muls r6, r7, r6\n\t"
  145774. #elif defined(__clang__)
  145775. "muls r6, r7\n\t"
  145776. #else
  145777. "mul r6, r7\n\t"
  145778. #endif
  145779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145780. "lsrs r7, r6, #16\n\t"
  145781. #else
  145782. "lsr r7, r6, #16\n\t"
  145783. #endif
  145784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145785. "lsls r6, r6, #16\n\t"
  145786. #else
  145787. "lsl r6, r6, #16\n\t"
  145788. #endif
  145789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145790. "adds r3, r3, r6\n\t"
  145791. #else
  145792. "add r3, r3, r6\n\t"
  145793. #endif
  145794. #ifdef WOLFSSL_KEIL
  145795. "adcs r4, r4, r7\n\t"
  145796. #elif defined(__clang__)
  145797. "adcs r4, r7\n\t"
  145798. #else
  145799. "adc r4, r7\n\t"
  145800. #endif
  145801. #ifdef WOLFSSL_KEIL
  145802. "adcs r5, r5, %[r]\n\t"
  145803. #elif defined(__clang__)
  145804. "adcs r5, %[r]\n\t"
  145805. #else
  145806. "adc r5, %[r]\n\t"
  145807. #endif
  145808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145809. "lsrs r6, %[a], #16\n\t"
  145810. #else
  145811. "lsr r6, %[a], #16\n\t"
  145812. #endif
  145813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145814. "lsrs r7, %[b], #16\n\t"
  145815. #else
  145816. "lsr r7, %[b], #16\n\t"
  145817. #endif
  145818. #ifdef WOLFSSL_KEIL
  145819. "muls r7, r6, r7\n\t"
  145820. #elif defined(__clang__)
  145821. "muls r7, r6\n\t"
  145822. #else
  145823. "mul r7, r6\n\t"
  145824. #endif
  145825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145826. "adds r4, r4, r7\n\t"
  145827. #else
  145828. "add r4, r4, r7\n\t"
  145829. #endif
  145830. #ifdef WOLFSSL_KEIL
  145831. "adcs r5, r5, %[r]\n\t"
  145832. #elif defined(__clang__)
  145833. "adcs r5, %[r]\n\t"
  145834. #else
  145835. "adc r5, %[r]\n\t"
  145836. #endif
  145837. "uxth r7, %[b]\n\t"
  145838. #ifdef WOLFSSL_KEIL
  145839. "muls r6, r7, r6\n\t"
  145840. #elif defined(__clang__)
  145841. "muls r6, r7\n\t"
  145842. #else
  145843. "mul r6, r7\n\t"
  145844. #endif
  145845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145846. "lsrs r7, r6, #16\n\t"
  145847. #else
  145848. "lsr r7, r6, #16\n\t"
  145849. #endif
  145850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145851. "lsls r6, r6, #16\n\t"
  145852. #else
  145853. "lsl r6, r6, #16\n\t"
  145854. #endif
  145855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145856. "adds r3, r3, r6\n\t"
  145857. #else
  145858. "add r3, r3, r6\n\t"
  145859. #endif
  145860. #ifdef WOLFSSL_KEIL
  145861. "adcs r4, r4, r7\n\t"
  145862. #elif defined(__clang__)
  145863. "adcs r4, r7\n\t"
  145864. #else
  145865. "adc r4, r7\n\t"
  145866. #endif
  145867. #ifdef WOLFSSL_KEIL
  145868. "adcs r5, r5, %[r]\n\t"
  145869. #elif defined(__clang__)
  145870. "adcs r5, %[r]\n\t"
  145871. #else
  145872. "adc r5, %[r]\n\t"
  145873. #endif
  145874. "# A[6] * B[6]\n\t"
  145875. "mov %[a], r9\n\t"
  145876. "mov %[b], r10\n\t"
  145877. "ldr %[a], [%[a], #24]\n\t"
  145878. "ldr %[b], [%[b], #24]\n\t"
  145879. "uxth r6, %[a]\n\t"
  145880. "uxth r7, %[b]\n\t"
  145881. #ifdef WOLFSSL_KEIL
  145882. "muls r7, r6, r7\n\t"
  145883. #elif defined(__clang__)
  145884. "muls r7, r6\n\t"
  145885. #else
  145886. "mul r7, r6\n\t"
  145887. #endif
  145888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145889. "adds r3, r3, r7\n\t"
  145890. #else
  145891. "add r3, r3, r7\n\t"
  145892. #endif
  145893. #ifdef WOLFSSL_KEIL
  145894. "adcs r4, r4, %[r]\n\t"
  145895. #elif defined(__clang__)
  145896. "adcs r4, %[r]\n\t"
  145897. #else
  145898. "adc r4, %[r]\n\t"
  145899. #endif
  145900. #ifdef WOLFSSL_KEIL
  145901. "adcs r5, r5, %[r]\n\t"
  145902. #elif defined(__clang__)
  145903. "adcs r5, %[r]\n\t"
  145904. #else
  145905. "adc r5, %[r]\n\t"
  145906. #endif
  145907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145908. "lsrs r7, %[b], #16\n\t"
  145909. #else
  145910. "lsr r7, %[b], #16\n\t"
  145911. #endif
  145912. #ifdef WOLFSSL_KEIL
  145913. "muls r6, r7, r6\n\t"
  145914. #elif defined(__clang__)
  145915. "muls r6, r7\n\t"
  145916. #else
  145917. "mul r6, r7\n\t"
  145918. #endif
  145919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145920. "lsrs r7, r6, #16\n\t"
  145921. #else
  145922. "lsr r7, r6, #16\n\t"
  145923. #endif
  145924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145925. "lsls r6, r6, #16\n\t"
  145926. #else
  145927. "lsl r6, r6, #16\n\t"
  145928. #endif
  145929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145930. "adds r3, r3, r6\n\t"
  145931. #else
  145932. "add r3, r3, r6\n\t"
  145933. #endif
  145934. #ifdef WOLFSSL_KEIL
  145935. "adcs r4, r4, r7\n\t"
  145936. #elif defined(__clang__)
  145937. "adcs r4, r7\n\t"
  145938. #else
  145939. "adc r4, r7\n\t"
  145940. #endif
  145941. #ifdef WOLFSSL_KEIL
  145942. "adcs r5, r5, %[r]\n\t"
  145943. #elif defined(__clang__)
  145944. "adcs r5, %[r]\n\t"
  145945. #else
  145946. "adc r5, %[r]\n\t"
  145947. #endif
  145948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145949. "lsrs r6, %[a], #16\n\t"
  145950. #else
  145951. "lsr r6, %[a], #16\n\t"
  145952. #endif
  145953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145954. "lsrs r7, %[b], #16\n\t"
  145955. #else
  145956. "lsr r7, %[b], #16\n\t"
  145957. #endif
  145958. #ifdef WOLFSSL_KEIL
  145959. "muls r7, r6, r7\n\t"
  145960. #elif defined(__clang__)
  145961. "muls r7, r6\n\t"
  145962. #else
  145963. "mul r7, r6\n\t"
  145964. #endif
  145965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145966. "adds r4, r4, r7\n\t"
  145967. #else
  145968. "add r4, r4, r7\n\t"
  145969. #endif
  145970. #ifdef WOLFSSL_KEIL
  145971. "adcs r5, r5, %[r]\n\t"
  145972. #elif defined(__clang__)
  145973. "adcs r5, %[r]\n\t"
  145974. #else
  145975. "adc r5, %[r]\n\t"
  145976. #endif
  145977. "uxth r7, %[b]\n\t"
  145978. #ifdef WOLFSSL_KEIL
  145979. "muls r6, r7, r6\n\t"
  145980. #elif defined(__clang__)
  145981. "muls r6, r7\n\t"
  145982. #else
  145983. "mul r6, r7\n\t"
  145984. #endif
  145985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145986. "lsrs r7, r6, #16\n\t"
  145987. #else
  145988. "lsr r7, r6, #16\n\t"
  145989. #endif
  145990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145991. "lsls r6, r6, #16\n\t"
  145992. #else
  145993. "lsl r6, r6, #16\n\t"
  145994. #endif
  145995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  145996. "adds r3, r3, r6\n\t"
  145997. #else
  145998. "add r3, r3, r6\n\t"
  145999. #endif
  146000. #ifdef WOLFSSL_KEIL
  146001. "adcs r4, r4, r7\n\t"
  146002. #elif defined(__clang__)
  146003. "adcs r4, r7\n\t"
  146004. #else
  146005. "adc r4, r7\n\t"
  146006. #endif
  146007. #ifdef WOLFSSL_KEIL
  146008. "adcs r5, r5, %[r]\n\t"
  146009. #elif defined(__clang__)
  146010. "adcs r5, %[r]\n\t"
  146011. #else
  146012. "adc r5, %[r]\n\t"
  146013. #endif
  146014. "# A[5] * B[7]\n\t"
  146015. "mov %[a], r9\n\t"
  146016. "mov %[b], r10\n\t"
  146017. "ldr %[a], [%[a], #20]\n\t"
  146018. "ldr %[b], [%[b], #28]\n\t"
  146019. "uxth r6, %[a]\n\t"
  146020. "uxth r7, %[b]\n\t"
  146021. #ifdef WOLFSSL_KEIL
  146022. "muls r7, r6, r7\n\t"
  146023. #elif defined(__clang__)
  146024. "muls r7, r6\n\t"
  146025. #else
  146026. "mul r7, r6\n\t"
  146027. #endif
  146028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146029. "adds r3, r3, r7\n\t"
  146030. #else
  146031. "add r3, r3, r7\n\t"
  146032. #endif
  146033. #ifdef WOLFSSL_KEIL
  146034. "adcs r4, r4, %[r]\n\t"
  146035. #elif defined(__clang__)
  146036. "adcs r4, %[r]\n\t"
  146037. #else
  146038. "adc r4, %[r]\n\t"
  146039. #endif
  146040. #ifdef WOLFSSL_KEIL
  146041. "adcs r5, r5, %[r]\n\t"
  146042. #elif defined(__clang__)
  146043. "adcs r5, %[r]\n\t"
  146044. #else
  146045. "adc r5, %[r]\n\t"
  146046. #endif
  146047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146048. "lsrs r7, %[b], #16\n\t"
  146049. #else
  146050. "lsr r7, %[b], #16\n\t"
  146051. #endif
  146052. #ifdef WOLFSSL_KEIL
  146053. "muls r6, r7, r6\n\t"
  146054. #elif defined(__clang__)
  146055. "muls r6, r7\n\t"
  146056. #else
  146057. "mul r6, r7\n\t"
  146058. #endif
  146059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146060. "lsrs r7, r6, #16\n\t"
  146061. #else
  146062. "lsr r7, r6, #16\n\t"
  146063. #endif
  146064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146065. "lsls r6, r6, #16\n\t"
  146066. #else
  146067. "lsl r6, r6, #16\n\t"
  146068. #endif
  146069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146070. "adds r3, r3, r6\n\t"
  146071. #else
  146072. "add r3, r3, r6\n\t"
  146073. #endif
  146074. #ifdef WOLFSSL_KEIL
  146075. "adcs r4, r4, r7\n\t"
  146076. #elif defined(__clang__)
  146077. "adcs r4, r7\n\t"
  146078. #else
  146079. "adc r4, r7\n\t"
  146080. #endif
  146081. #ifdef WOLFSSL_KEIL
  146082. "adcs r5, r5, %[r]\n\t"
  146083. #elif defined(__clang__)
  146084. "adcs r5, %[r]\n\t"
  146085. #else
  146086. "adc r5, %[r]\n\t"
  146087. #endif
  146088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146089. "lsrs r6, %[a], #16\n\t"
  146090. #else
  146091. "lsr r6, %[a], #16\n\t"
  146092. #endif
  146093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146094. "lsrs r7, %[b], #16\n\t"
  146095. #else
  146096. "lsr r7, %[b], #16\n\t"
  146097. #endif
  146098. #ifdef WOLFSSL_KEIL
  146099. "muls r7, r6, r7\n\t"
  146100. #elif defined(__clang__)
  146101. "muls r7, r6\n\t"
  146102. #else
  146103. "mul r7, r6\n\t"
  146104. #endif
  146105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146106. "adds r4, r4, r7\n\t"
  146107. #else
  146108. "add r4, r4, r7\n\t"
  146109. #endif
  146110. #ifdef WOLFSSL_KEIL
  146111. "adcs r5, r5, %[r]\n\t"
  146112. #elif defined(__clang__)
  146113. "adcs r5, %[r]\n\t"
  146114. #else
  146115. "adc r5, %[r]\n\t"
  146116. #endif
  146117. "uxth r7, %[b]\n\t"
  146118. #ifdef WOLFSSL_KEIL
  146119. "muls r6, r7, r6\n\t"
  146120. #elif defined(__clang__)
  146121. "muls r6, r7\n\t"
  146122. #else
  146123. "mul r6, r7\n\t"
  146124. #endif
  146125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146126. "lsrs r7, r6, #16\n\t"
  146127. #else
  146128. "lsr r7, r6, #16\n\t"
  146129. #endif
  146130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146131. "lsls r6, r6, #16\n\t"
  146132. #else
  146133. "lsl r6, r6, #16\n\t"
  146134. #endif
  146135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146136. "adds r3, r3, r6\n\t"
  146137. #else
  146138. "add r3, r3, r6\n\t"
  146139. #endif
  146140. #ifdef WOLFSSL_KEIL
  146141. "adcs r4, r4, r7\n\t"
  146142. #elif defined(__clang__)
  146143. "adcs r4, r7\n\t"
  146144. #else
  146145. "adc r4, r7\n\t"
  146146. #endif
  146147. #ifdef WOLFSSL_KEIL
  146148. "adcs r5, r5, %[r]\n\t"
  146149. #elif defined(__clang__)
  146150. "adcs r5, %[r]\n\t"
  146151. #else
  146152. "adc r5, %[r]\n\t"
  146153. #endif
  146154. "# A[4] * B[8]\n\t"
  146155. "mov %[a], r9\n\t"
  146156. "mov %[b], r10\n\t"
  146157. "ldr %[a], [%[a], #16]\n\t"
  146158. "ldr %[b], [%[b], #32]\n\t"
  146159. "uxth r6, %[a]\n\t"
  146160. "uxth r7, %[b]\n\t"
  146161. #ifdef WOLFSSL_KEIL
  146162. "muls r7, r6, r7\n\t"
  146163. #elif defined(__clang__)
  146164. "muls r7, r6\n\t"
  146165. #else
  146166. "mul r7, r6\n\t"
  146167. #endif
  146168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146169. "adds r3, r3, r7\n\t"
  146170. #else
  146171. "add r3, r3, r7\n\t"
  146172. #endif
  146173. #ifdef WOLFSSL_KEIL
  146174. "adcs r4, r4, %[r]\n\t"
  146175. #elif defined(__clang__)
  146176. "adcs r4, %[r]\n\t"
  146177. #else
  146178. "adc r4, %[r]\n\t"
  146179. #endif
  146180. #ifdef WOLFSSL_KEIL
  146181. "adcs r5, r5, %[r]\n\t"
  146182. #elif defined(__clang__)
  146183. "adcs r5, %[r]\n\t"
  146184. #else
  146185. "adc r5, %[r]\n\t"
  146186. #endif
  146187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146188. "lsrs r7, %[b], #16\n\t"
  146189. #else
  146190. "lsr r7, %[b], #16\n\t"
  146191. #endif
  146192. #ifdef WOLFSSL_KEIL
  146193. "muls r6, r7, r6\n\t"
  146194. #elif defined(__clang__)
  146195. "muls r6, r7\n\t"
  146196. #else
  146197. "mul r6, r7\n\t"
  146198. #endif
  146199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146200. "lsrs r7, r6, #16\n\t"
  146201. #else
  146202. "lsr r7, r6, #16\n\t"
  146203. #endif
  146204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146205. "lsls r6, r6, #16\n\t"
  146206. #else
  146207. "lsl r6, r6, #16\n\t"
  146208. #endif
  146209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146210. "adds r3, r3, r6\n\t"
  146211. #else
  146212. "add r3, r3, r6\n\t"
  146213. #endif
  146214. #ifdef WOLFSSL_KEIL
  146215. "adcs r4, r4, r7\n\t"
  146216. #elif defined(__clang__)
  146217. "adcs r4, r7\n\t"
  146218. #else
  146219. "adc r4, r7\n\t"
  146220. #endif
  146221. #ifdef WOLFSSL_KEIL
  146222. "adcs r5, r5, %[r]\n\t"
  146223. #elif defined(__clang__)
  146224. "adcs r5, %[r]\n\t"
  146225. #else
  146226. "adc r5, %[r]\n\t"
  146227. #endif
  146228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146229. "lsrs r6, %[a], #16\n\t"
  146230. #else
  146231. "lsr r6, %[a], #16\n\t"
  146232. #endif
  146233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146234. "lsrs r7, %[b], #16\n\t"
  146235. #else
  146236. "lsr r7, %[b], #16\n\t"
  146237. #endif
  146238. #ifdef WOLFSSL_KEIL
  146239. "muls r7, r6, r7\n\t"
  146240. #elif defined(__clang__)
  146241. "muls r7, r6\n\t"
  146242. #else
  146243. "mul r7, r6\n\t"
  146244. #endif
  146245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146246. "adds r4, r4, r7\n\t"
  146247. #else
  146248. "add r4, r4, r7\n\t"
  146249. #endif
  146250. #ifdef WOLFSSL_KEIL
  146251. "adcs r5, r5, %[r]\n\t"
  146252. #elif defined(__clang__)
  146253. "adcs r5, %[r]\n\t"
  146254. #else
  146255. "adc r5, %[r]\n\t"
  146256. #endif
  146257. "uxth r7, %[b]\n\t"
  146258. #ifdef WOLFSSL_KEIL
  146259. "muls r6, r7, r6\n\t"
  146260. #elif defined(__clang__)
  146261. "muls r6, r7\n\t"
  146262. #else
  146263. "mul r6, r7\n\t"
  146264. #endif
  146265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146266. "lsrs r7, r6, #16\n\t"
  146267. #else
  146268. "lsr r7, r6, #16\n\t"
  146269. #endif
  146270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146271. "lsls r6, r6, #16\n\t"
  146272. #else
  146273. "lsl r6, r6, #16\n\t"
  146274. #endif
  146275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146276. "adds r3, r3, r6\n\t"
  146277. #else
  146278. "add r3, r3, r6\n\t"
  146279. #endif
  146280. #ifdef WOLFSSL_KEIL
  146281. "adcs r4, r4, r7\n\t"
  146282. #elif defined(__clang__)
  146283. "adcs r4, r7\n\t"
  146284. #else
  146285. "adc r4, r7\n\t"
  146286. #endif
  146287. #ifdef WOLFSSL_KEIL
  146288. "adcs r5, r5, %[r]\n\t"
  146289. #elif defined(__clang__)
  146290. "adcs r5, %[r]\n\t"
  146291. #else
  146292. "adc r5, %[r]\n\t"
  146293. #endif
  146294. "# A[3] * B[9]\n\t"
  146295. "mov %[a], r9\n\t"
  146296. "mov %[b], r10\n\t"
  146297. "ldr %[a], [%[a], #12]\n\t"
  146298. "ldr %[b], [%[b], #36]\n\t"
  146299. "uxth r6, %[a]\n\t"
  146300. "uxth r7, %[b]\n\t"
  146301. #ifdef WOLFSSL_KEIL
  146302. "muls r7, r6, r7\n\t"
  146303. #elif defined(__clang__)
  146304. "muls r7, r6\n\t"
  146305. #else
  146306. "mul r7, r6\n\t"
  146307. #endif
  146308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146309. "adds r3, r3, r7\n\t"
  146310. #else
  146311. "add r3, r3, r7\n\t"
  146312. #endif
  146313. #ifdef WOLFSSL_KEIL
  146314. "adcs r4, r4, %[r]\n\t"
  146315. #elif defined(__clang__)
  146316. "adcs r4, %[r]\n\t"
  146317. #else
  146318. "adc r4, %[r]\n\t"
  146319. #endif
  146320. #ifdef WOLFSSL_KEIL
  146321. "adcs r5, r5, %[r]\n\t"
  146322. #elif defined(__clang__)
  146323. "adcs r5, %[r]\n\t"
  146324. #else
  146325. "adc r5, %[r]\n\t"
  146326. #endif
  146327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146328. "lsrs r7, %[b], #16\n\t"
  146329. #else
  146330. "lsr r7, %[b], #16\n\t"
  146331. #endif
  146332. #ifdef WOLFSSL_KEIL
  146333. "muls r6, r7, r6\n\t"
  146334. #elif defined(__clang__)
  146335. "muls r6, r7\n\t"
  146336. #else
  146337. "mul r6, r7\n\t"
  146338. #endif
  146339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146340. "lsrs r7, r6, #16\n\t"
  146341. #else
  146342. "lsr r7, r6, #16\n\t"
  146343. #endif
  146344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146345. "lsls r6, r6, #16\n\t"
  146346. #else
  146347. "lsl r6, r6, #16\n\t"
  146348. #endif
  146349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146350. "adds r3, r3, r6\n\t"
  146351. #else
  146352. "add r3, r3, r6\n\t"
  146353. #endif
  146354. #ifdef WOLFSSL_KEIL
  146355. "adcs r4, r4, r7\n\t"
  146356. #elif defined(__clang__)
  146357. "adcs r4, r7\n\t"
  146358. #else
  146359. "adc r4, r7\n\t"
  146360. #endif
  146361. #ifdef WOLFSSL_KEIL
  146362. "adcs r5, r5, %[r]\n\t"
  146363. #elif defined(__clang__)
  146364. "adcs r5, %[r]\n\t"
  146365. #else
  146366. "adc r5, %[r]\n\t"
  146367. #endif
  146368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146369. "lsrs r6, %[a], #16\n\t"
  146370. #else
  146371. "lsr r6, %[a], #16\n\t"
  146372. #endif
  146373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146374. "lsrs r7, %[b], #16\n\t"
  146375. #else
  146376. "lsr r7, %[b], #16\n\t"
  146377. #endif
  146378. #ifdef WOLFSSL_KEIL
  146379. "muls r7, r6, r7\n\t"
  146380. #elif defined(__clang__)
  146381. "muls r7, r6\n\t"
  146382. #else
  146383. "mul r7, r6\n\t"
  146384. #endif
  146385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146386. "adds r4, r4, r7\n\t"
  146387. #else
  146388. "add r4, r4, r7\n\t"
  146389. #endif
  146390. #ifdef WOLFSSL_KEIL
  146391. "adcs r5, r5, %[r]\n\t"
  146392. #elif defined(__clang__)
  146393. "adcs r5, %[r]\n\t"
  146394. #else
  146395. "adc r5, %[r]\n\t"
  146396. #endif
  146397. "uxth r7, %[b]\n\t"
  146398. #ifdef WOLFSSL_KEIL
  146399. "muls r6, r7, r6\n\t"
  146400. #elif defined(__clang__)
  146401. "muls r6, r7\n\t"
  146402. #else
  146403. "mul r6, r7\n\t"
  146404. #endif
  146405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146406. "lsrs r7, r6, #16\n\t"
  146407. #else
  146408. "lsr r7, r6, #16\n\t"
  146409. #endif
  146410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146411. "lsls r6, r6, #16\n\t"
  146412. #else
  146413. "lsl r6, r6, #16\n\t"
  146414. #endif
  146415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146416. "adds r3, r3, r6\n\t"
  146417. #else
  146418. "add r3, r3, r6\n\t"
  146419. #endif
  146420. #ifdef WOLFSSL_KEIL
  146421. "adcs r4, r4, r7\n\t"
  146422. #elif defined(__clang__)
  146423. "adcs r4, r7\n\t"
  146424. #else
  146425. "adc r4, r7\n\t"
  146426. #endif
  146427. #ifdef WOLFSSL_KEIL
  146428. "adcs r5, r5, %[r]\n\t"
  146429. #elif defined(__clang__)
  146430. "adcs r5, %[r]\n\t"
  146431. #else
  146432. "adc r5, %[r]\n\t"
  146433. #endif
  146434. "# A[2] * B[10]\n\t"
  146435. "mov %[a], r9\n\t"
  146436. "mov %[b], r10\n\t"
  146437. "ldr %[a], [%[a], #8]\n\t"
  146438. "ldr %[b], [%[b], #40]\n\t"
  146439. "uxth r6, %[a]\n\t"
  146440. "uxth r7, %[b]\n\t"
  146441. #ifdef WOLFSSL_KEIL
  146442. "muls r7, r6, r7\n\t"
  146443. #elif defined(__clang__)
  146444. "muls r7, r6\n\t"
  146445. #else
  146446. "mul r7, r6\n\t"
  146447. #endif
  146448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146449. "adds r3, r3, r7\n\t"
  146450. #else
  146451. "add r3, r3, r7\n\t"
  146452. #endif
  146453. #ifdef WOLFSSL_KEIL
  146454. "adcs r4, r4, %[r]\n\t"
  146455. #elif defined(__clang__)
  146456. "adcs r4, %[r]\n\t"
  146457. #else
  146458. "adc r4, %[r]\n\t"
  146459. #endif
  146460. #ifdef WOLFSSL_KEIL
  146461. "adcs r5, r5, %[r]\n\t"
  146462. #elif defined(__clang__)
  146463. "adcs r5, %[r]\n\t"
  146464. #else
  146465. "adc r5, %[r]\n\t"
  146466. #endif
  146467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146468. "lsrs r7, %[b], #16\n\t"
  146469. #else
  146470. "lsr r7, %[b], #16\n\t"
  146471. #endif
  146472. #ifdef WOLFSSL_KEIL
  146473. "muls r6, r7, r6\n\t"
  146474. #elif defined(__clang__)
  146475. "muls r6, r7\n\t"
  146476. #else
  146477. "mul r6, r7\n\t"
  146478. #endif
  146479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146480. "lsrs r7, r6, #16\n\t"
  146481. #else
  146482. "lsr r7, r6, #16\n\t"
  146483. #endif
  146484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146485. "lsls r6, r6, #16\n\t"
  146486. #else
  146487. "lsl r6, r6, #16\n\t"
  146488. #endif
  146489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146490. "adds r3, r3, r6\n\t"
  146491. #else
  146492. "add r3, r3, r6\n\t"
  146493. #endif
  146494. #ifdef WOLFSSL_KEIL
  146495. "adcs r4, r4, r7\n\t"
  146496. #elif defined(__clang__)
  146497. "adcs r4, r7\n\t"
  146498. #else
  146499. "adc r4, r7\n\t"
  146500. #endif
  146501. #ifdef WOLFSSL_KEIL
  146502. "adcs r5, r5, %[r]\n\t"
  146503. #elif defined(__clang__)
  146504. "adcs r5, %[r]\n\t"
  146505. #else
  146506. "adc r5, %[r]\n\t"
  146507. #endif
  146508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146509. "lsrs r6, %[a], #16\n\t"
  146510. #else
  146511. "lsr r6, %[a], #16\n\t"
  146512. #endif
  146513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146514. "lsrs r7, %[b], #16\n\t"
  146515. #else
  146516. "lsr r7, %[b], #16\n\t"
  146517. #endif
  146518. #ifdef WOLFSSL_KEIL
  146519. "muls r7, r6, r7\n\t"
  146520. #elif defined(__clang__)
  146521. "muls r7, r6\n\t"
  146522. #else
  146523. "mul r7, r6\n\t"
  146524. #endif
  146525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146526. "adds r4, r4, r7\n\t"
  146527. #else
  146528. "add r4, r4, r7\n\t"
  146529. #endif
  146530. #ifdef WOLFSSL_KEIL
  146531. "adcs r5, r5, %[r]\n\t"
  146532. #elif defined(__clang__)
  146533. "adcs r5, %[r]\n\t"
  146534. #else
  146535. "adc r5, %[r]\n\t"
  146536. #endif
  146537. "uxth r7, %[b]\n\t"
  146538. #ifdef WOLFSSL_KEIL
  146539. "muls r6, r7, r6\n\t"
  146540. #elif defined(__clang__)
  146541. "muls r6, r7\n\t"
  146542. #else
  146543. "mul r6, r7\n\t"
  146544. #endif
  146545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146546. "lsrs r7, r6, #16\n\t"
  146547. #else
  146548. "lsr r7, r6, #16\n\t"
  146549. #endif
  146550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146551. "lsls r6, r6, #16\n\t"
  146552. #else
  146553. "lsl r6, r6, #16\n\t"
  146554. #endif
  146555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146556. "adds r3, r3, r6\n\t"
  146557. #else
  146558. "add r3, r3, r6\n\t"
  146559. #endif
  146560. #ifdef WOLFSSL_KEIL
  146561. "adcs r4, r4, r7\n\t"
  146562. #elif defined(__clang__)
  146563. "adcs r4, r7\n\t"
  146564. #else
  146565. "adc r4, r7\n\t"
  146566. #endif
  146567. #ifdef WOLFSSL_KEIL
  146568. "adcs r5, r5, %[r]\n\t"
  146569. #elif defined(__clang__)
  146570. "adcs r5, %[r]\n\t"
  146571. #else
  146572. "adc r5, %[r]\n\t"
  146573. #endif
  146574. "# A[1] * B[11]\n\t"
  146575. "mov %[a], r9\n\t"
  146576. "mov %[b], r10\n\t"
  146577. "ldr %[a], [%[a], #4]\n\t"
  146578. "ldr %[b], [%[b], #44]\n\t"
  146579. "uxth r6, %[a]\n\t"
  146580. "uxth r7, %[b]\n\t"
  146581. #ifdef WOLFSSL_KEIL
  146582. "muls r7, r6, r7\n\t"
  146583. #elif defined(__clang__)
  146584. "muls r7, r6\n\t"
  146585. #else
  146586. "mul r7, r6\n\t"
  146587. #endif
  146588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146589. "adds r3, r3, r7\n\t"
  146590. #else
  146591. "add r3, r3, r7\n\t"
  146592. #endif
  146593. #ifdef WOLFSSL_KEIL
  146594. "adcs r4, r4, %[r]\n\t"
  146595. #elif defined(__clang__)
  146596. "adcs r4, %[r]\n\t"
  146597. #else
  146598. "adc r4, %[r]\n\t"
  146599. #endif
  146600. #ifdef WOLFSSL_KEIL
  146601. "adcs r5, r5, %[r]\n\t"
  146602. #elif defined(__clang__)
  146603. "adcs r5, %[r]\n\t"
  146604. #else
  146605. "adc r5, %[r]\n\t"
  146606. #endif
  146607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146608. "lsrs r7, %[b], #16\n\t"
  146609. #else
  146610. "lsr r7, %[b], #16\n\t"
  146611. #endif
  146612. #ifdef WOLFSSL_KEIL
  146613. "muls r6, r7, r6\n\t"
  146614. #elif defined(__clang__)
  146615. "muls r6, r7\n\t"
  146616. #else
  146617. "mul r6, r7\n\t"
  146618. #endif
  146619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146620. "lsrs r7, r6, #16\n\t"
  146621. #else
  146622. "lsr r7, r6, #16\n\t"
  146623. #endif
  146624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146625. "lsls r6, r6, #16\n\t"
  146626. #else
  146627. "lsl r6, r6, #16\n\t"
  146628. #endif
  146629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146630. "adds r3, r3, r6\n\t"
  146631. #else
  146632. "add r3, r3, r6\n\t"
  146633. #endif
  146634. #ifdef WOLFSSL_KEIL
  146635. "adcs r4, r4, r7\n\t"
  146636. #elif defined(__clang__)
  146637. "adcs r4, r7\n\t"
  146638. #else
  146639. "adc r4, r7\n\t"
  146640. #endif
  146641. #ifdef WOLFSSL_KEIL
  146642. "adcs r5, r5, %[r]\n\t"
  146643. #elif defined(__clang__)
  146644. "adcs r5, %[r]\n\t"
  146645. #else
  146646. "adc r5, %[r]\n\t"
  146647. #endif
  146648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146649. "lsrs r6, %[a], #16\n\t"
  146650. #else
  146651. "lsr r6, %[a], #16\n\t"
  146652. #endif
  146653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146654. "lsrs r7, %[b], #16\n\t"
  146655. #else
  146656. "lsr r7, %[b], #16\n\t"
  146657. #endif
  146658. #ifdef WOLFSSL_KEIL
  146659. "muls r7, r6, r7\n\t"
  146660. #elif defined(__clang__)
  146661. "muls r7, r6\n\t"
  146662. #else
  146663. "mul r7, r6\n\t"
  146664. #endif
  146665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146666. "adds r4, r4, r7\n\t"
  146667. #else
  146668. "add r4, r4, r7\n\t"
  146669. #endif
  146670. #ifdef WOLFSSL_KEIL
  146671. "adcs r5, r5, %[r]\n\t"
  146672. #elif defined(__clang__)
  146673. "adcs r5, %[r]\n\t"
  146674. #else
  146675. "adc r5, %[r]\n\t"
  146676. #endif
  146677. "uxth r7, %[b]\n\t"
  146678. #ifdef WOLFSSL_KEIL
  146679. "muls r6, r7, r6\n\t"
  146680. #elif defined(__clang__)
  146681. "muls r6, r7\n\t"
  146682. #else
  146683. "mul r6, r7\n\t"
  146684. #endif
  146685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146686. "lsrs r7, r6, #16\n\t"
  146687. #else
  146688. "lsr r7, r6, #16\n\t"
  146689. #endif
  146690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146691. "lsls r6, r6, #16\n\t"
  146692. #else
  146693. "lsl r6, r6, #16\n\t"
  146694. #endif
  146695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146696. "adds r3, r3, r6\n\t"
  146697. #else
  146698. "add r3, r3, r6\n\t"
  146699. #endif
  146700. #ifdef WOLFSSL_KEIL
  146701. "adcs r4, r4, r7\n\t"
  146702. #elif defined(__clang__)
  146703. "adcs r4, r7\n\t"
  146704. #else
  146705. "adc r4, r7\n\t"
  146706. #endif
  146707. #ifdef WOLFSSL_KEIL
  146708. "adcs r5, r5, %[r]\n\t"
  146709. #elif defined(__clang__)
  146710. "adcs r5, %[r]\n\t"
  146711. #else
  146712. "adc r5, %[r]\n\t"
  146713. #endif
  146714. "# A[0] * B[12]\n\t"
  146715. "mov %[a], r9\n\t"
  146716. "mov %[b], r10\n\t"
  146717. "ldr %[a], [%[a]]\n\t"
  146718. "ldr %[b], [%[b], #48]\n\t"
  146719. "uxth r6, %[a]\n\t"
  146720. "uxth r7, %[b]\n\t"
  146721. #ifdef WOLFSSL_KEIL
  146722. "muls r7, r6, r7\n\t"
  146723. #elif defined(__clang__)
  146724. "muls r7, r6\n\t"
  146725. #else
  146726. "mul r7, r6\n\t"
  146727. #endif
  146728. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146729. "adds r3, r3, r7\n\t"
  146730. #else
  146731. "add r3, r3, r7\n\t"
  146732. #endif
  146733. #ifdef WOLFSSL_KEIL
  146734. "adcs r4, r4, %[r]\n\t"
  146735. #elif defined(__clang__)
  146736. "adcs r4, %[r]\n\t"
  146737. #else
  146738. "adc r4, %[r]\n\t"
  146739. #endif
  146740. #ifdef WOLFSSL_KEIL
  146741. "adcs r5, r5, %[r]\n\t"
  146742. #elif defined(__clang__)
  146743. "adcs r5, %[r]\n\t"
  146744. #else
  146745. "adc r5, %[r]\n\t"
  146746. #endif
  146747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146748. "lsrs r7, %[b], #16\n\t"
  146749. #else
  146750. "lsr r7, %[b], #16\n\t"
  146751. #endif
  146752. #ifdef WOLFSSL_KEIL
  146753. "muls r6, r7, r6\n\t"
  146754. #elif defined(__clang__)
  146755. "muls r6, r7\n\t"
  146756. #else
  146757. "mul r6, r7\n\t"
  146758. #endif
  146759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146760. "lsrs r7, r6, #16\n\t"
  146761. #else
  146762. "lsr r7, r6, #16\n\t"
  146763. #endif
  146764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146765. "lsls r6, r6, #16\n\t"
  146766. #else
  146767. "lsl r6, r6, #16\n\t"
  146768. #endif
  146769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146770. "adds r3, r3, r6\n\t"
  146771. #else
  146772. "add r3, r3, r6\n\t"
  146773. #endif
  146774. #ifdef WOLFSSL_KEIL
  146775. "adcs r4, r4, r7\n\t"
  146776. #elif defined(__clang__)
  146777. "adcs r4, r7\n\t"
  146778. #else
  146779. "adc r4, r7\n\t"
  146780. #endif
  146781. #ifdef WOLFSSL_KEIL
  146782. "adcs r5, r5, %[r]\n\t"
  146783. #elif defined(__clang__)
  146784. "adcs r5, %[r]\n\t"
  146785. #else
  146786. "adc r5, %[r]\n\t"
  146787. #endif
  146788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146789. "lsrs r6, %[a], #16\n\t"
  146790. #else
  146791. "lsr r6, %[a], #16\n\t"
  146792. #endif
  146793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146794. "lsrs r7, %[b], #16\n\t"
  146795. #else
  146796. "lsr r7, %[b], #16\n\t"
  146797. #endif
  146798. #ifdef WOLFSSL_KEIL
  146799. "muls r7, r6, r7\n\t"
  146800. #elif defined(__clang__)
  146801. "muls r7, r6\n\t"
  146802. #else
  146803. "mul r7, r6\n\t"
  146804. #endif
  146805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146806. "adds r4, r4, r7\n\t"
  146807. #else
  146808. "add r4, r4, r7\n\t"
  146809. #endif
  146810. #ifdef WOLFSSL_KEIL
  146811. "adcs r5, r5, %[r]\n\t"
  146812. #elif defined(__clang__)
  146813. "adcs r5, %[r]\n\t"
  146814. #else
  146815. "adc r5, %[r]\n\t"
  146816. #endif
  146817. "uxth r7, %[b]\n\t"
  146818. #ifdef WOLFSSL_KEIL
  146819. "muls r6, r7, r6\n\t"
  146820. #elif defined(__clang__)
  146821. "muls r6, r7\n\t"
  146822. #else
  146823. "mul r6, r7\n\t"
  146824. #endif
  146825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146826. "lsrs r7, r6, #16\n\t"
  146827. #else
  146828. "lsr r7, r6, #16\n\t"
  146829. #endif
  146830. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146831. "lsls r6, r6, #16\n\t"
  146832. #else
  146833. "lsl r6, r6, #16\n\t"
  146834. #endif
  146835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146836. "adds r3, r3, r6\n\t"
  146837. #else
  146838. "add r3, r3, r6\n\t"
  146839. #endif
  146840. #ifdef WOLFSSL_KEIL
  146841. "adcs r4, r4, r7\n\t"
  146842. #elif defined(__clang__)
  146843. "adcs r4, r7\n\t"
  146844. #else
  146845. "adc r4, r7\n\t"
  146846. #endif
  146847. #ifdef WOLFSSL_KEIL
  146848. "adcs r5, r5, %[r]\n\t"
  146849. #elif defined(__clang__)
  146850. "adcs r5, %[r]\n\t"
  146851. #else
  146852. "adc r5, %[r]\n\t"
  146853. #endif
  146854. "str r3, [sp, #48]\n\t"
  146855. "# A[0] * B[13]\n\t"
  146856. "movs r3, #0\n\t"
  146857. "mov %[a], r9\n\t"
  146858. "mov %[b], r10\n\t"
  146859. "ldr %[a], [%[a]]\n\t"
  146860. "ldr %[b], [%[b], #52]\n\t"
  146861. "uxth r6, %[a]\n\t"
  146862. "uxth r7, %[b]\n\t"
  146863. #ifdef WOLFSSL_KEIL
  146864. "muls r7, r6, r7\n\t"
  146865. #elif defined(__clang__)
  146866. "muls r7, r6\n\t"
  146867. #else
  146868. "mul r7, r6\n\t"
  146869. #endif
  146870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146871. "adds r4, r4, r7\n\t"
  146872. #else
  146873. "add r4, r4, r7\n\t"
  146874. #endif
  146875. #ifdef WOLFSSL_KEIL
  146876. "adcs r5, r5, %[r]\n\t"
  146877. #elif defined(__clang__)
  146878. "adcs r5, %[r]\n\t"
  146879. #else
  146880. "adc r5, %[r]\n\t"
  146881. #endif
  146882. #ifdef WOLFSSL_KEIL
  146883. "adcs r3, r3, %[r]\n\t"
  146884. #elif defined(__clang__)
  146885. "adcs r3, %[r]\n\t"
  146886. #else
  146887. "adc r3, %[r]\n\t"
  146888. #endif
  146889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146890. "lsrs r7, %[b], #16\n\t"
  146891. #else
  146892. "lsr r7, %[b], #16\n\t"
  146893. #endif
  146894. #ifdef WOLFSSL_KEIL
  146895. "muls r6, r7, r6\n\t"
  146896. #elif defined(__clang__)
  146897. "muls r6, r7\n\t"
  146898. #else
  146899. "mul r6, r7\n\t"
  146900. #endif
  146901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146902. "lsrs r7, r6, #16\n\t"
  146903. #else
  146904. "lsr r7, r6, #16\n\t"
  146905. #endif
  146906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146907. "lsls r6, r6, #16\n\t"
  146908. #else
  146909. "lsl r6, r6, #16\n\t"
  146910. #endif
  146911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146912. "adds r4, r4, r6\n\t"
  146913. #else
  146914. "add r4, r4, r6\n\t"
  146915. #endif
  146916. #ifdef WOLFSSL_KEIL
  146917. "adcs r5, r5, r7\n\t"
  146918. #elif defined(__clang__)
  146919. "adcs r5, r7\n\t"
  146920. #else
  146921. "adc r5, r7\n\t"
  146922. #endif
  146923. #ifdef WOLFSSL_KEIL
  146924. "adcs r3, r3, %[r]\n\t"
  146925. #elif defined(__clang__)
  146926. "adcs r3, %[r]\n\t"
  146927. #else
  146928. "adc r3, %[r]\n\t"
  146929. #endif
  146930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146931. "lsrs r6, %[a], #16\n\t"
  146932. #else
  146933. "lsr r6, %[a], #16\n\t"
  146934. #endif
  146935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146936. "lsrs r7, %[b], #16\n\t"
  146937. #else
  146938. "lsr r7, %[b], #16\n\t"
  146939. #endif
  146940. #ifdef WOLFSSL_KEIL
  146941. "muls r7, r6, r7\n\t"
  146942. #elif defined(__clang__)
  146943. "muls r7, r6\n\t"
  146944. #else
  146945. "mul r7, r6\n\t"
  146946. #endif
  146947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146948. "adds r5, r5, r7\n\t"
  146949. #else
  146950. "add r5, r5, r7\n\t"
  146951. #endif
  146952. #ifdef WOLFSSL_KEIL
  146953. "adcs r3, r3, %[r]\n\t"
  146954. #elif defined(__clang__)
  146955. "adcs r3, %[r]\n\t"
  146956. #else
  146957. "adc r3, %[r]\n\t"
  146958. #endif
  146959. "uxth r7, %[b]\n\t"
  146960. #ifdef WOLFSSL_KEIL
  146961. "muls r6, r7, r6\n\t"
  146962. #elif defined(__clang__)
  146963. "muls r6, r7\n\t"
  146964. #else
  146965. "mul r6, r7\n\t"
  146966. #endif
  146967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146968. "lsrs r7, r6, #16\n\t"
  146969. #else
  146970. "lsr r7, r6, #16\n\t"
  146971. #endif
  146972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146973. "lsls r6, r6, #16\n\t"
  146974. #else
  146975. "lsl r6, r6, #16\n\t"
  146976. #endif
  146977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  146978. "adds r4, r4, r6\n\t"
  146979. #else
  146980. "add r4, r4, r6\n\t"
  146981. #endif
  146982. #ifdef WOLFSSL_KEIL
  146983. "adcs r5, r5, r7\n\t"
  146984. #elif defined(__clang__)
  146985. "adcs r5, r7\n\t"
  146986. #else
  146987. "adc r5, r7\n\t"
  146988. #endif
  146989. #ifdef WOLFSSL_KEIL
  146990. "adcs r3, r3, %[r]\n\t"
  146991. #elif defined(__clang__)
  146992. "adcs r3, %[r]\n\t"
  146993. #else
  146994. "adc r3, %[r]\n\t"
  146995. #endif
  146996. "# A[1] * B[12]\n\t"
  146997. "mov %[a], r9\n\t"
  146998. "mov %[b], r10\n\t"
  146999. "ldr %[a], [%[a], #4]\n\t"
  147000. "ldr %[b], [%[b], #48]\n\t"
  147001. "uxth r6, %[a]\n\t"
  147002. "uxth r7, %[b]\n\t"
  147003. #ifdef WOLFSSL_KEIL
  147004. "muls r7, r6, r7\n\t"
  147005. #elif defined(__clang__)
  147006. "muls r7, r6\n\t"
  147007. #else
  147008. "mul r7, r6\n\t"
  147009. #endif
  147010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147011. "adds r4, r4, r7\n\t"
  147012. #else
  147013. "add r4, r4, r7\n\t"
  147014. #endif
  147015. #ifdef WOLFSSL_KEIL
  147016. "adcs r5, r5, %[r]\n\t"
  147017. #elif defined(__clang__)
  147018. "adcs r5, %[r]\n\t"
  147019. #else
  147020. "adc r5, %[r]\n\t"
  147021. #endif
  147022. #ifdef WOLFSSL_KEIL
  147023. "adcs r3, r3, %[r]\n\t"
  147024. #elif defined(__clang__)
  147025. "adcs r3, %[r]\n\t"
  147026. #else
  147027. "adc r3, %[r]\n\t"
  147028. #endif
  147029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147030. "lsrs r7, %[b], #16\n\t"
  147031. #else
  147032. "lsr r7, %[b], #16\n\t"
  147033. #endif
  147034. #ifdef WOLFSSL_KEIL
  147035. "muls r6, r7, r6\n\t"
  147036. #elif defined(__clang__)
  147037. "muls r6, r7\n\t"
  147038. #else
  147039. "mul r6, r7\n\t"
  147040. #endif
  147041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147042. "lsrs r7, r6, #16\n\t"
  147043. #else
  147044. "lsr r7, r6, #16\n\t"
  147045. #endif
  147046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147047. "lsls r6, r6, #16\n\t"
  147048. #else
  147049. "lsl r6, r6, #16\n\t"
  147050. #endif
  147051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147052. "adds r4, r4, r6\n\t"
  147053. #else
  147054. "add r4, r4, r6\n\t"
  147055. #endif
  147056. #ifdef WOLFSSL_KEIL
  147057. "adcs r5, r5, r7\n\t"
  147058. #elif defined(__clang__)
  147059. "adcs r5, r7\n\t"
  147060. #else
  147061. "adc r5, r7\n\t"
  147062. #endif
  147063. #ifdef WOLFSSL_KEIL
  147064. "adcs r3, r3, %[r]\n\t"
  147065. #elif defined(__clang__)
  147066. "adcs r3, %[r]\n\t"
  147067. #else
  147068. "adc r3, %[r]\n\t"
  147069. #endif
  147070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147071. "lsrs r6, %[a], #16\n\t"
  147072. #else
  147073. "lsr r6, %[a], #16\n\t"
  147074. #endif
  147075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147076. "lsrs r7, %[b], #16\n\t"
  147077. #else
  147078. "lsr r7, %[b], #16\n\t"
  147079. #endif
  147080. #ifdef WOLFSSL_KEIL
  147081. "muls r7, r6, r7\n\t"
  147082. #elif defined(__clang__)
  147083. "muls r7, r6\n\t"
  147084. #else
  147085. "mul r7, r6\n\t"
  147086. #endif
  147087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147088. "adds r5, r5, r7\n\t"
  147089. #else
  147090. "add r5, r5, r7\n\t"
  147091. #endif
  147092. #ifdef WOLFSSL_KEIL
  147093. "adcs r3, r3, %[r]\n\t"
  147094. #elif defined(__clang__)
  147095. "adcs r3, %[r]\n\t"
  147096. #else
  147097. "adc r3, %[r]\n\t"
  147098. #endif
  147099. "uxth r7, %[b]\n\t"
  147100. #ifdef WOLFSSL_KEIL
  147101. "muls r6, r7, r6\n\t"
  147102. #elif defined(__clang__)
  147103. "muls r6, r7\n\t"
  147104. #else
  147105. "mul r6, r7\n\t"
  147106. #endif
  147107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147108. "lsrs r7, r6, #16\n\t"
  147109. #else
  147110. "lsr r7, r6, #16\n\t"
  147111. #endif
  147112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147113. "lsls r6, r6, #16\n\t"
  147114. #else
  147115. "lsl r6, r6, #16\n\t"
  147116. #endif
  147117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147118. "adds r4, r4, r6\n\t"
  147119. #else
  147120. "add r4, r4, r6\n\t"
  147121. #endif
  147122. #ifdef WOLFSSL_KEIL
  147123. "adcs r5, r5, r7\n\t"
  147124. #elif defined(__clang__)
  147125. "adcs r5, r7\n\t"
  147126. #else
  147127. "adc r5, r7\n\t"
  147128. #endif
  147129. #ifdef WOLFSSL_KEIL
  147130. "adcs r3, r3, %[r]\n\t"
  147131. #elif defined(__clang__)
  147132. "adcs r3, %[r]\n\t"
  147133. #else
  147134. "adc r3, %[r]\n\t"
  147135. #endif
  147136. "# A[2] * B[11]\n\t"
  147137. "mov %[a], r9\n\t"
  147138. "mov %[b], r10\n\t"
  147139. "ldr %[a], [%[a], #8]\n\t"
  147140. "ldr %[b], [%[b], #44]\n\t"
  147141. "uxth r6, %[a]\n\t"
  147142. "uxth r7, %[b]\n\t"
  147143. #ifdef WOLFSSL_KEIL
  147144. "muls r7, r6, r7\n\t"
  147145. #elif defined(__clang__)
  147146. "muls r7, r6\n\t"
  147147. #else
  147148. "mul r7, r6\n\t"
  147149. #endif
  147150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147151. "adds r4, r4, r7\n\t"
  147152. #else
  147153. "add r4, r4, r7\n\t"
  147154. #endif
  147155. #ifdef WOLFSSL_KEIL
  147156. "adcs r5, r5, %[r]\n\t"
  147157. #elif defined(__clang__)
  147158. "adcs r5, %[r]\n\t"
  147159. #else
  147160. "adc r5, %[r]\n\t"
  147161. #endif
  147162. #ifdef WOLFSSL_KEIL
  147163. "adcs r3, r3, %[r]\n\t"
  147164. #elif defined(__clang__)
  147165. "adcs r3, %[r]\n\t"
  147166. #else
  147167. "adc r3, %[r]\n\t"
  147168. #endif
  147169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147170. "lsrs r7, %[b], #16\n\t"
  147171. #else
  147172. "lsr r7, %[b], #16\n\t"
  147173. #endif
  147174. #ifdef WOLFSSL_KEIL
  147175. "muls r6, r7, r6\n\t"
  147176. #elif defined(__clang__)
  147177. "muls r6, r7\n\t"
  147178. #else
  147179. "mul r6, r7\n\t"
  147180. #endif
  147181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147182. "lsrs r7, r6, #16\n\t"
  147183. #else
  147184. "lsr r7, r6, #16\n\t"
  147185. #endif
  147186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147187. "lsls r6, r6, #16\n\t"
  147188. #else
  147189. "lsl r6, r6, #16\n\t"
  147190. #endif
  147191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147192. "adds r4, r4, r6\n\t"
  147193. #else
  147194. "add r4, r4, r6\n\t"
  147195. #endif
  147196. #ifdef WOLFSSL_KEIL
  147197. "adcs r5, r5, r7\n\t"
  147198. #elif defined(__clang__)
  147199. "adcs r5, r7\n\t"
  147200. #else
  147201. "adc r5, r7\n\t"
  147202. #endif
  147203. #ifdef WOLFSSL_KEIL
  147204. "adcs r3, r3, %[r]\n\t"
  147205. #elif defined(__clang__)
  147206. "adcs r3, %[r]\n\t"
  147207. #else
  147208. "adc r3, %[r]\n\t"
  147209. #endif
  147210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147211. "lsrs r6, %[a], #16\n\t"
  147212. #else
  147213. "lsr r6, %[a], #16\n\t"
  147214. #endif
  147215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147216. "lsrs r7, %[b], #16\n\t"
  147217. #else
  147218. "lsr r7, %[b], #16\n\t"
  147219. #endif
  147220. #ifdef WOLFSSL_KEIL
  147221. "muls r7, r6, r7\n\t"
  147222. #elif defined(__clang__)
  147223. "muls r7, r6\n\t"
  147224. #else
  147225. "mul r7, r6\n\t"
  147226. #endif
  147227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147228. "adds r5, r5, r7\n\t"
  147229. #else
  147230. "add r5, r5, r7\n\t"
  147231. #endif
  147232. #ifdef WOLFSSL_KEIL
  147233. "adcs r3, r3, %[r]\n\t"
  147234. #elif defined(__clang__)
  147235. "adcs r3, %[r]\n\t"
  147236. #else
  147237. "adc r3, %[r]\n\t"
  147238. #endif
  147239. "uxth r7, %[b]\n\t"
  147240. #ifdef WOLFSSL_KEIL
  147241. "muls r6, r7, r6\n\t"
  147242. #elif defined(__clang__)
  147243. "muls r6, r7\n\t"
  147244. #else
  147245. "mul r6, r7\n\t"
  147246. #endif
  147247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147248. "lsrs r7, r6, #16\n\t"
  147249. #else
  147250. "lsr r7, r6, #16\n\t"
  147251. #endif
  147252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147253. "lsls r6, r6, #16\n\t"
  147254. #else
  147255. "lsl r6, r6, #16\n\t"
  147256. #endif
  147257. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147258. "adds r4, r4, r6\n\t"
  147259. #else
  147260. "add r4, r4, r6\n\t"
  147261. #endif
  147262. #ifdef WOLFSSL_KEIL
  147263. "adcs r5, r5, r7\n\t"
  147264. #elif defined(__clang__)
  147265. "adcs r5, r7\n\t"
  147266. #else
  147267. "adc r5, r7\n\t"
  147268. #endif
  147269. #ifdef WOLFSSL_KEIL
  147270. "adcs r3, r3, %[r]\n\t"
  147271. #elif defined(__clang__)
  147272. "adcs r3, %[r]\n\t"
  147273. #else
  147274. "adc r3, %[r]\n\t"
  147275. #endif
  147276. "# A[3] * B[10]\n\t"
  147277. "mov %[a], r9\n\t"
  147278. "mov %[b], r10\n\t"
  147279. "ldr %[a], [%[a], #12]\n\t"
  147280. "ldr %[b], [%[b], #40]\n\t"
  147281. "uxth r6, %[a]\n\t"
  147282. "uxth r7, %[b]\n\t"
  147283. #ifdef WOLFSSL_KEIL
  147284. "muls r7, r6, r7\n\t"
  147285. #elif defined(__clang__)
  147286. "muls r7, r6\n\t"
  147287. #else
  147288. "mul r7, r6\n\t"
  147289. #endif
  147290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147291. "adds r4, r4, r7\n\t"
  147292. #else
  147293. "add r4, r4, r7\n\t"
  147294. #endif
  147295. #ifdef WOLFSSL_KEIL
  147296. "adcs r5, r5, %[r]\n\t"
  147297. #elif defined(__clang__)
  147298. "adcs r5, %[r]\n\t"
  147299. #else
  147300. "adc r5, %[r]\n\t"
  147301. #endif
  147302. #ifdef WOLFSSL_KEIL
  147303. "adcs r3, r3, %[r]\n\t"
  147304. #elif defined(__clang__)
  147305. "adcs r3, %[r]\n\t"
  147306. #else
  147307. "adc r3, %[r]\n\t"
  147308. #endif
  147309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147310. "lsrs r7, %[b], #16\n\t"
  147311. #else
  147312. "lsr r7, %[b], #16\n\t"
  147313. #endif
  147314. #ifdef WOLFSSL_KEIL
  147315. "muls r6, r7, r6\n\t"
  147316. #elif defined(__clang__)
  147317. "muls r6, r7\n\t"
  147318. #else
  147319. "mul r6, r7\n\t"
  147320. #endif
  147321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147322. "lsrs r7, r6, #16\n\t"
  147323. #else
  147324. "lsr r7, r6, #16\n\t"
  147325. #endif
  147326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147327. "lsls r6, r6, #16\n\t"
  147328. #else
  147329. "lsl r6, r6, #16\n\t"
  147330. #endif
  147331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147332. "adds r4, r4, r6\n\t"
  147333. #else
  147334. "add r4, r4, r6\n\t"
  147335. #endif
  147336. #ifdef WOLFSSL_KEIL
  147337. "adcs r5, r5, r7\n\t"
  147338. #elif defined(__clang__)
  147339. "adcs r5, r7\n\t"
  147340. #else
  147341. "adc r5, r7\n\t"
  147342. #endif
  147343. #ifdef WOLFSSL_KEIL
  147344. "adcs r3, r3, %[r]\n\t"
  147345. #elif defined(__clang__)
  147346. "adcs r3, %[r]\n\t"
  147347. #else
  147348. "adc r3, %[r]\n\t"
  147349. #endif
  147350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147351. "lsrs r6, %[a], #16\n\t"
  147352. #else
  147353. "lsr r6, %[a], #16\n\t"
  147354. #endif
  147355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147356. "lsrs r7, %[b], #16\n\t"
  147357. #else
  147358. "lsr r7, %[b], #16\n\t"
  147359. #endif
  147360. #ifdef WOLFSSL_KEIL
  147361. "muls r7, r6, r7\n\t"
  147362. #elif defined(__clang__)
  147363. "muls r7, r6\n\t"
  147364. #else
  147365. "mul r7, r6\n\t"
  147366. #endif
  147367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147368. "adds r5, r5, r7\n\t"
  147369. #else
  147370. "add r5, r5, r7\n\t"
  147371. #endif
  147372. #ifdef WOLFSSL_KEIL
  147373. "adcs r3, r3, %[r]\n\t"
  147374. #elif defined(__clang__)
  147375. "adcs r3, %[r]\n\t"
  147376. #else
  147377. "adc r3, %[r]\n\t"
  147378. #endif
  147379. "uxth r7, %[b]\n\t"
  147380. #ifdef WOLFSSL_KEIL
  147381. "muls r6, r7, r6\n\t"
  147382. #elif defined(__clang__)
  147383. "muls r6, r7\n\t"
  147384. #else
  147385. "mul r6, r7\n\t"
  147386. #endif
  147387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147388. "lsrs r7, r6, #16\n\t"
  147389. #else
  147390. "lsr r7, r6, #16\n\t"
  147391. #endif
  147392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147393. "lsls r6, r6, #16\n\t"
  147394. #else
  147395. "lsl r6, r6, #16\n\t"
  147396. #endif
  147397. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147398. "adds r4, r4, r6\n\t"
  147399. #else
  147400. "add r4, r4, r6\n\t"
  147401. #endif
  147402. #ifdef WOLFSSL_KEIL
  147403. "adcs r5, r5, r7\n\t"
  147404. #elif defined(__clang__)
  147405. "adcs r5, r7\n\t"
  147406. #else
  147407. "adc r5, r7\n\t"
  147408. #endif
  147409. #ifdef WOLFSSL_KEIL
  147410. "adcs r3, r3, %[r]\n\t"
  147411. #elif defined(__clang__)
  147412. "adcs r3, %[r]\n\t"
  147413. #else
  147414. "adc r3, %[r]\n\t"
  147415. #endif
  147416. "# A[4] * B[9]\n\t"
  147417. "mov %[a], r9\n\t"
  147418. "mov %[b], r10\n\t"
  147419. "ldr %[a], [%[a], #16]\n\t"
  147420. "ldr %[b], [%[b], #36]\n\t"
  147421. "uxth r6, %[a]\n\t"
  147422. "uxth r7, %[b]\n\t"
  147423. #ifdef WOLFSSL_KEIL
  147424. "muls r7, r6, r7\n\t"
  147425. #elif defined(__clang__)
  147426. "muls r7, r6\n\t"
  147427. #else
  147428. "mul r7, r6\n\t"
  147429. #endif
  147430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147431. "adds r4, r4, r7\n\t"
  147432. #else
  147433. "add r4, r4, r7\n\t"
  147434. #endif
  147435. #ifdef WOLFSSL_KEIL
  147436. "adcs r5, r5, %[r]\n\t"
  147437. #elif defined(__clang__)
  147438. "adcs r5, %[r]\n\t"
  147439. #else
  147440. "adc r5, %[r]\n\t"
  147441. #endif
  147442. #ifdef WOLFSSL_KEIL
  147443. "adcs r3, r3, %[r]\n\t"
  147444. #elif defined(__clang__)
  147445. "adcs r3, %[r]\n\t"
  147446. #else
  147447. "adc r3, %[r]\n\t"
  147448. #endif
  147449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147450. "lsrs r7, %[b], #16\n\t"
  147451. #else
  147452. "lsr r7, %[b], #16\n\t"
  147453. #endif
  147454. #ifdef WOLFSSL_KEIL
  147455. "muls r6, r7, r6\n\t"
  147456. #elif defined(__clang__)
  147457. "muls r6, r7\n\t"
  147458. #else
  147459. "mul r6, r7\n\t"
  147460. #endif
  147461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147462. "lsrs r7, r6, #16\n\t"
  147463. #else
  147464. "lsr r7, r6, #16\n\t"
  147465. #endif
  147466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147467. "lsls r6, r6, #16\n\t"
  147468. #else
  147469. "lsl r6, r6, #16\n\t"
  147470. #endif
  147471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147472. "adds r4, r4, r6\n\t"
  147473. #else
  147474. "add r4, r4, r6\n\t"
  147475. #endif
  147476. #ifdef WOLFSSL_KEIL
  147477. "adcs r5, r5, r7\n\t"
  147478. #elif defined(__clang__)
  147479. "adcs r5, r7\n\t"
  147480. #else
  147481. "adc r5, r7\n\t"
  147482. #endif
  147483. #ifdef WOLFSSL_KEIL
  147484. "adcs r3, r3, %[r]\n\t"
  147485. #elif defined(__clang__)
  147486. "adcs r3, %[r]\n\t"
  147487. #else
  147488. "adc r3, %[r]\n\t"
  147489. #endif
  147490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147491. "lsrs r6, %[a], #16\n\t"
  147492. #else
  147493. "lsr r6, %[a], #16\n\t"
  147494. #endif
  147495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147496. "lsrs r7, %[b], #16\n\t"
  147497. #else
  147498. "lsr r7, %[b], #16\n\t"
  147499. #endif
  147500. #ifdef WOLFSSL_KEIL
  147501. "muls r7, r6, r7\n\t"
  147502. #elif defined(__clang__)
  147503. "muls r7, r6\n\t"
  147504. #else
  147505. "mul r7, r6\n\t"
  147506. #endif
  147507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147508. "adds r5, r5, r7\n\t"
  147509. #else
  147510. "add r5, r5, r7\n\t"
  147511. #endif
  147512. #ifdef WOLFSSL_KEIL
  147513. "adcs r3, r3, %[r]\n\t"
  147514. #elif defined(__clang__)
  147515. "adcs r3, %[r]\n\t"
  147516. #else
  147517. "adc r3, %[r]\n\t"
  147518. #endif
  147519. "uxth r7, %[b]\n\t"
  147520. #ifdef WOLFSSL_KEIL
  147521. "muls r6, r7, r6\n\t"
  147522. #elif defined(__clang__)
  147523. "muls r6, r7\n\t"
  147524. #else
  147525. "mul r6, r7\n\t"
  147526. #endif
  147527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147528. "lsrs r7, r6, #16\n\t"
  147529. #else
  147530. "lsr r7, r6, #16\n\t"
  147531. #endif
  147532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147533. "lsls r6, r6, #16\n\t"
  147534. #else
  147535. "lsl r6, r6, #16\n\t"
  147536. #endif
  147537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147538. "adds r4, r4, r6\n\t"
  147539. #else
  147540. "add r4, r4, r6\n\t"
  147541. #endif
  147542. #ifdef WOLFSSL_KEIL
  147543. "adcs r5, r5, r7\n\t"
  147544. #elif defined(__clang__)
  147545. "adcs r5, r7\n\t"
  147546. #else
  147547. "adc r5, r7\n\t"
  147548. #endif
  147549. #ifdef WOLFSSL_KEIL
  147550. "adcs r3, r3, %[r]\n\t"
  147551. #elif defined(__clang__)
  147552. "adcs r3, %[r]\n\t"
  147553. #else
  147554. "adc r3, %[r]\n\t"
  147555. #endif
  147556. "# A[5] * B[8]\n\t"
  147557. "mov %[a], r9\n\t"
  147558. "mov %[b], r10\n\t"
  147559. "ldr %[a], [%[a], #20]\n\t"
  147560. "ldr %[b], [%[b], #32]\n\t"
  147561. "uxth r6, %[a]\n\t"
  147562. "uxth r7, %[b]\n\t"
  147563. #ifdef WOLFSSL_KEIL
  147564. "muls r7, r6, r7\n\t"
  147565. #elif defined(__clang__)
  147566. "muls r7, r6\n\t"
  147567. #else
  147568. "mul r7, r6\n\t"
  147569. #endif
  147570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147571. "adds r4, r4, r7\n\t"
  147572. #else
  147573. "add r4, r4, r7\n\t"
  147574. #endif
  147575. #ifdef WOLFSSL_KEIL
  147576. "adcs r5, r5, %[r]\n\t"
  147577. #elif defined(__clang__)
  147578. "adcs r5, %[r]\n\t"
  147579. #else
  147580. "adc r5, %[r]\n\t"
  147581. #endif
  147582. #ifdef WOLFSSL_KEIL
  147583. "adcs r3, r3, %[r]\n\t"
  147584. #elif defined(__clang__)
  147585. "adcs r3, %[r]\n\t"
  147586. #else
  147587. "adc r3, %[r]\n\t"
  147588. #endif
  147589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147590. "lsrs r7, %[b], #16\n\t"
  147591. #else
  147592. "lsr r7, %[b], #16\n\t"
  147593. #endif
  147594. #ifdef WOLFSSL_KEIL
  147595. "muls r6, r7, r6\n\t"
  147596. #elif defined(__clang__)
  147597. "muls r6, r7\n\t"
  147598. #else
  147599. "mul r6, r7\n\t"
  147600. #endif
  147601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147602. "lsrs r7, r6, #16\n\t"
  147603. #else
  147604. "lsr r7, r6, #16\n\t"
  147605. #endif
  147606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147607. "lsls r6, r6, #16\n\t"
  147608. #else
  147609. "lsl r6, r6, #16\n\t"
  147610. #endif
  147611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147612. "adds r4, r4, r6\n\t"
  147613. #else
  147614. "add r4, r4, r6\n\t"
  147615. #endif
  147616. #ifdef WOLFSSL_KEIL
  147617. "adcs r5, r5, r7\n\t"
  147618. #elif defined(__clang__)
  147619. "adcs r5, r7\n\t"
  147620. #else
  147621. "adc r5, r7\n\t"
  147622. #endif
  147623. #ifdef WOLFSSL_KEIL
  147624. "adcs r3, r3, %[r]\n\t"
  147625. #elif defined(__clang__)
  147626. "adcs r3, %[r]\n\t"
  147627. #else
  147628. "adc r3, %[r]\n\t"
  147629. #endif
  147630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147631. "lsrs r6, %[a], #16\n\t"
  147632. #else
  147633. "lsr r6, %[a], #16\n\t"
  147634. #endif
  147635. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147636. "lsrs r7, %[b], #16\n\t"
  147637. #else
  147638. "lsr r7, %[b], #16\n\t"
  147639. #endif
  147640. #ifdef WOLFSSL_KEIL
  147641. "muls r7, r6, r7\n\t"
  147642. #elif defined(__clang__)
  147643. "muls r7, r6\n\t"
  147644. #else
  147645. "mul r7, r6\n\t"
  147646. #endif
  147647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147648. "adds r5, r5, r7\n\t"
  147649. #else
  147650. "add r5, r5, r7\n\t"
  147651. #endif
  147652. #ifdef WOLFSSL_KEIL
  147653. "adcs r3, r3, %[r]\n\t"
  147654. #elif defined(__clang__)
  147655. "adcs r3, %[r]\n\t"
  147656. #else
  147657. "adc r3, %[r]\n\t"
  147658. #endif
  147659. "uxth r7, %[b]\n\t"
  147660. #ifdef WOLFSSL_KEIL
  147661. "muls r6, r7, r6\n\t"
  147662. #elif defined(__clang__)
  147663. "muls r6, r7\n\t"
  147664. #else
  147665. "mul r6, r7\n\t"
  147666. #endif
  147667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147668. "lsrs r7, r6, #16\n\t"
  147669. #else
  147670. "lsr r7, r6, #16\n\t"
  147671. #endif
  147672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147673. "lsls r6, r6, #16\n\t"
  147674. #else
  147675. "lsl r6, r6, #16\n\t"
  147676. #endif
  147677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147678. "adds r4, r4, r6\n\t"
  147679. #else
  147680. "add r4, r4, r6\n\t"
  147681. #endif
  147682. #ifdef WOLFSSL_KEIL
  147683. "adcs r5, r5, r7\n\t"
  147684. #elif defined(__clang__)
  147685. "adcs r5, r7\n\t"
  147686. #else
  147687. "adc r5, r7\n\t"
  147688. #endif
  147689. #ifdef WOLFSSL_KEIL
  147690. "adcs r3, r3, %[r]\n\t"
  147691. #elif defined(__clang__)
  147692. "adcs r3, %[r]\n\t"
  147693. #else
  147694. "adc r3, %[r]\n\t"
  147695. #endif
  147696. "# A[6] * B[7]\n\t"
  147697. "mov %[a], r9\n\t"
  147698. "mov %[b], r10\n\t"
  147699. "ldr %[a], [%[a], #24]\n\t"
  147700. "ldr %[b], [%[b], #28]\n\t"
  147701. "uxth r6, %[a]\n\t"
  147702. "uxth r7, %[b]\n\t"
  147703. #ifdef WOLFSSL_KEIL
  147704. "muls r7, r6, r7\n\t"
  147705. #elif defined(__clang__)
  147706. "muls r7, r6\n\t"
  147707. #else
  147708. "mul r7, r6\n\t"
  147709. #endif
  147710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147711. "adds r4, r4, r7\n\t"
  147712. #else
  147713. "add r4, r4, r7\n\t"
  147714. #endif
  147715. #ifdef WOLFSSL_KEIL
  147716. "adcs r5, r5, %[r]\n\t"
  147717. #elif defined(__clang__)
  147718. "adcs r5, %[r]\n\t"
  147719. #else
  147720. "adc r5, %[r]\n\t"
  147721. #endif
  147722. #ifdef WOLFSSL_KEIL
  147723. "adcs r3, r3, %[r]\n\t"
  147724. #elif defined(__clang__)
  147725. "adcs r3, %[r]\n\t"
  147726. #else
  147727. "adc r3, %[r]\n\t"
  147728. #endif
  147729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147730. "lsrs r7, %[b], #16\n\t"
  147731. #else
  147732. "lsr r7, %[b], #16\n\t"
  147733. #endif
  147734. #ifdef WOLFSSL_KEIL
  147735. "muls r6, r7, r6\n\t"
  147736. #elif defined(__clang__)
  147737. "muls r6, r7\n\t"
  147738. #else
  147739. "mul r6, r7\n\t"
  147740. #endif
  147741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147742. "lsrs r7, r6, #16\n\t"
  147743. #else
  147744. "lsr r7, r6, #16\n\t"
  147745. #endif
  147746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147747. "lsls r6, r6, #16\n\t"
  147748. #else
  147749. "lsl r6, r6, #16\n\t"
  147750. #endif
  147751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147752. "adds r4, r4, r6\n\t"
  147753. #else
  147754. "add r4, r4, r6\n\t"
  147755. #endif
  147756. #ifdef WOLFSSL_KEIL
  147757. "adcs r5, r5, r7\n\t"
  147758. #elif defined(__clang__)
  147759. "adcs r5, r7\n\t"
  147760. #else
  147761. "adc r5, r7\n\t"
  147762. #endif
  147763. #ifdef WOLFSSL_KEIL
  147764. "adcs r3, r3, %[r]\n\t"
  147765. #elif defined(__clang__)
  147766. "adcs r3, %[r]\n\t"
  147767. #else
  147768. "adc r3, %[r]\n\t"
  147769. #endif
  147770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147771. "lsrs r6, %[a], #16\n\t"
  147772. #else
  147773. "lsr r6, %[a], #16\n\t"
  147774. #endif
  147775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147776. "lsrs r7, %[b], #16\n\t"
  147777. #else
  147778. "lsr r7, %[b], #16\n\t"
  147779. #endif
  147780. #ifdef WOLFSSL_KEIL
  147781. "muls r7, r6, r7\n\t"
  147782. #elif defined(__clang__)
  147783. "muls r7, r6\n\t"
  147784. #else
  147785. "mul r7, r6\n\t"
  147786. #endif
  147787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147788. "adds r5, r5, r7\n\t"
  147789. #else
  147790. "add r5, r5, r7\n\t"
  147791. #endif
  147792. #ifdef WOLFSSL_KEIL
  147793. "adcs r3, r3, %[r]\n\t"
  147794. #elif defined(__clang__)
  147795. "adcs r3, %[r]\n\t"
  147796. #else
  147797. "adc r3, %[r]\n\t"
  147798. #endif
  147799. "uxth r7, %[b]\n\t"
  147800. #ifdef WOLFSSL_KEIL
  147801. "muls r6, r7, r6\n\t"
  147802. #elif defined(__clang__)
  147803. "muls r6, r7\n\t"
  147804. #else
  147805. "mul r6, r7\n\t"
  147806. #endif
  147807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147808. "lsrs r7, r6, #16\n\t"
  147809. #else
  147810. "lsr r7, r6, #16\n\t"
  147811. #endif
  147812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147813. "lsls r6, r6, #16\n\t"
  147814. #else
  147815. "lsl r6, r6, #16\n\t"
  147816. #endif
  147817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147818. "adds r4, r4, r6\n\t"
  147819. #else
  147820. "add r4, r4, r6\n\t"
  147821. #endif
  147822. #ifdef WOLFSSL_KEIL
  147823. "adcs r5, r5, r7\n\t"
  147824. #elif defined(__clang__)
  147825. "adcs r5, r7\n\t"
  147826. #else
  147827. "adc r5, r7\n\t"
  147828. #endif
  147829. #ifdef WOLFSSL_KEIL
  147830. "adcs r3, r3, %[r]\n\t"
  147831. #elif defined(__clang__)
  147832. "adcs r3, %[r]\n\t"
  147833. #else
  147834. "adc r3, %[r]\n\t"
  147835. #endif
  147836. "# A[7] * B[6]\n\t"
  147837. "mov %[a], r9\n\t"
  147838. "mov %[b], r10\n\t"
  147839. "ldr %[a], [%[a], #28]\n\t"
  147840. "ldr %[b], [%[b], #24]\n\t"
  147841. "uxth r6, %[a]\n\t"
  147842. "uxth r7, %[b]\n\t"
  147843. #ifdef WOLFSSL_KEIL
  147844. "muls r7, r6, r7\n\t"
  147845. #elif defined(__clang__)
  147846. "muls r7, r6\n\t"
  147847. #else
  147848. "mul r7, r6\n\t"
  147849. #endif
  147850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147851. "adds r4, r4, r7\n\t"
  147852. #else
  147853. "add r4, r4, r7\n\t"
  147854. #endif
  147855. #ifdef WOLFSSL_KEIL
  147856. "adcs r5, r5, %[r]\n\t"
  147857. #elif defined(__clang__)
  147858. "adcs r5, %[r]\n\t"
  147859. #else
  147860. "adc r5, %[r]\n\t"
  147861. #endif
  147862. #ifdef WOLFSSL_KEIL
  147863. "adcs r3, r3, %[r]\n\t"
  147864. #elif defined(__clang__)
  147865. "adcs r3, %[r]\n\t"
  147866. #else
  147867. "adc r3, %[r]\n\t"
  147868. #endif
  147869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147870. "lsrs r7, %[b], #16\n\t"
  147871. #else
  147872. "lsr r7, %[b], #16\n\t"
  147873. #endif
  147874. #ifdef WOLFSSL_KEIL
  147875. "muls r6, r7, r6\n\t"
  147876. #elif defined(__clang__)
  147877. "muls r6, r7\n\t"
  147878. #else
  147879. "mul r6, r7\n\t"
  147880. #endif
  147881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147882. "lsrs r7, r6, #16\n\t"
  147883. #else
  147884. "lsr r7, r6, #16\n\t"
  147885. #endif
  147886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147887. "lsls r6, r6, #16\n\t"
  147888. #else
  147889. "lsl r6, r6, #16\n\t"
  147890. #endif
  147891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147892. "adds r4, r4, r6\n\t"
  147893. #else
  147894. "add r4, r4, r6\n\t"
  147895. #endif
  147896. #ifdef WOLFSSL_KEIL
  147897. "adcs r5, r5, r7\n\t"
  147898. #elif defined(__clang__)
  147899. "adcs r5, r7\n\t"
  147900. #else
  147901. "adc r5, r7\n\t"
  147902. #endif
  147903. #ifdef WOLFSSL_KEIL
  147904. "adcs r3, r3, %[r]\n\t"
  147905. #elif defined(__clang__)
  147906. "adcs r3, %[r]\n\t"
  147907. #else
  147908. "adc r3, %[r]\n\t"
  147909. #endif
  147910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147911. "lsrs r6, %[a], #16\n\t"
  147912. #else
  147913. "lsr r6, %[a], #16\n\t"
  147914. #endif
  147915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147916. "lsrs r7, %[b], #16\n\t"
  147917. #else
  147918. "lsr r7, %[b], #16\n\t"
  147919. #endif
  147920. #ifdef WOLFSSL_KEIL
  147921. "muls r7, r6, r7\n\t"
  147922. #elif defined(__clang__)
  147923. "muls r7, r6\n\t"
  147924. #else
  147925. "mul r7, r6\n\t"
  147926. #endif
  147927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147928. "adds r5, r5, r7\n\t"
  147929. #else
  147930. "add r5, r5, r7\n\t"
  147931. #endif
  147932. #ifdef WOLFSSL_KEIL
  147933. "adcs r3, r3, %[r]\n\t"
  147934. #elif defined(__clang__)
  147935. "adcs r3, %[r]\n\t"
  147936. #else
  147937. "adc r3, %[r]\n\t"
  147938. #endif
  147939. "uxth r7, %[b]\n\t"
  147940. #ifdef WOLFSSL_KEIL
  147941. "muls r6, r7, r6\n\t"
  147942. #elif defined(__clang__)
  147943. "muls r6, r7\n\t"
  147944. #else
  147945. "mul r6, r7\n\t"
  147946. #endif
  147947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147948. "lsrs r7, r6, #16\n\t"
  147949. #else
  147950. "lsr r7, r6, #16\n\t"
  147951. #endif
  147952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147953. "lsls r6, r6, #16\n\t"
  147954. #else
  147955. "lsl r6, r6, #16\n\t"
  147956. #endif
  147957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147958. "adds r4, r4, r6\n\t"
  147959. #else
  147960. "add r4, r4, r6\n\t"
  147961. #endif
  147962. #ifdef WOLFSSL_KEIL
  147963. "adcs r5, r5, r7\n\t"
  147964. #elif defined(__clang__)
  147965. "adcs r5, r7\n\t"
  147966. #else
  147967. "adc r5, r7\n\t"
  147968. #endif
  147969. #ifdef WOLFSSL_KEIL
  147970. "adcs r3, r3, %[r]\n\t"
  147971. #elif defined(__clang__)
  147972. "adcs r3, %[r]\n\t"
  147973. #else
  147974. "adc r3, %[r]\n\t"
  147975. #endif
  147976. "# A[8] * B[5]\n\t"
  147977. "mov %[a], r9\n\t"
  147978. "mov %[b], r10\n\t"
  147979. "ldr %[a], [%[a], #32]\n\t"
  147980. "ldr %[b], [%[b], #20]\n\t"
  147981. "uxth r6, %[a]\n\t"
  147982. "uxth r7, %[b]\n\t"
  147983. #ifdef WOLFSSL_KEIL
  147984. "muls r7, r6, r7\n\t"
  147985. #elif defined(__clang__)
  147986. "muls r7, r6\n\t"
  147987. #else
  147988. "mul r7, r6\n\t"
  147989. #endif
  147990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  147991. "adds r4, r4, r7\n\t"
  147992. #else
  147993. "add r4, r4, r7\n\t"
  147994. #endif
  147995. #ifdef WOLFSSL_KEIL
  147996. "adcs r5, r5, %[r]\n\t"
  147997. #elif defined(__clang__)
  147998. "adcs r5, %[r]\n\t"
  147999. #else
  148000. "adc r5, %[r]\n\t"
  148001. #endif
  148002. #ifdef WOLFSSL_KEIL
  148003. "adcs r3, r3, %[r]\n\t"
  148004. #elif defined(__clang__)
  148005. "adcs r3, %[r]\n\t"
  148006. #else
  148007. "adc r3, %[r]\n\t"
  148008. #endif
  148009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148010. "lsrs r7, %[b], #16\n\t"
  148011. #else
  148012. "lsr r7, %[b], #16\n\t"
  148013. #endif
  148014. #ifdef WOLFSSL_KEIL
  148015. "muls r6, r7, r6\n\t"
  148016. #elif defined(__clang__)
  148017. "muls r6, r7\n\t"
  148018. #else
  148019. "mul r6, r7\n\t"
  148020. #endif
  148021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148022. "lsrs r7, r6, #16\n\t"
  148023. #else
  148024. "lsr r7, r6, #16\n\t"
  148025. #endif
  148026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148027. "lsls r6, r6, #16\n\t"
  148028. #else
  148029. "lsl r6, r6, #16\n\t"
  148030. #endif
  148031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148032. "adds r4, r4, r6\n\t"
  148033. #else
  148034. "add r4, r4, r6\n\t"
  148035. #endif
  148036. #ifdef WOLFSSL_KEIL
  148037. "adcs r5, r5, r7\n\t"
  148038. #elif defined(__clang__)
  148039. "adcs r5, r7\n\t"
  148040. #else
  148041. "adc r5, r7\n\t"
  148042. #endif
  148043. #ifdef WOLFSSL_KEIL
  148044. "adcs r3, r3, %[r]\n\t"
  148045. #elif defined(__clang__)
  148046. "adcs r3, %[r]\n\t"
  148047. #else
  148048. "adc r3, %[r]\n\t"
  148049. #endif
  148050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148051. "lsrs r6, %[a], #16\n\t"
  148052. #else
  148053. "lsr r6, %[a], #16\n\t"
  148054. #endif
  148055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148056. "lsrs r7, %[b], #16\n\t"
  148057. #else
  148058. "lsr r7, %[b], #16\n\t"
  148059. #endif
  148060. #ifdef WOLFSSL_KEIL
  148061. "muls r7, r6, r7\n\t"
  148062. #elif defined(__clang__)
  148063. "muls r7, r6\n\t"
  148064. #else
  148065. "mul r7, r6\n\t"
  148066. #endif
  148067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148068. "adds r5, r5, r7\n\t"
  148069. #else
  148070. "add r5, r5, r7\n\t"
  148071. #endif
  148072. #ifdef WOLFSSL_KEIL
  148073. "adcs r3, r3, %[r]\n\t"
  148074. #elif defined(__clang__)
  148075. "adcs r3, %[r]\n\t"
  148076. #else
  148077. "adc r3, %[r]\n\t"
  148078. #endif
  148079. "uxth r7, %[b]\n\t"
  148080. #ifdef WOLFSSL_KEIL
  148081. "muls r6, r7, r6\n\t"
  148082. #elif defined(__clang__)
  148083. "muls r6, r7\n\t"
  148084. #else
  148085. "mul r6, r7\n\t"
  148086. #endif
  148087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148088. "lsrs r7, r6, #16\n\t"
  148089. #else
  148090. "lsr r7, r6, #16\n\t"
  148091. #endif
  148092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148093. "lsls r6, r6, #16\n\t"
  148094. #else
  148095. "lsl r6, r6, #16\n\t"
  148096. #endif
  148097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148098. "adds r4, r4, r6\n\t"
  148099. #else
  148100. "add r4, r4, r6\n\t"
  148101. #endif
  148102. #ifdef WOLFSSL_KEIL
  148103. "adcs r5, r5, r7\n\t"
  148104. #elif defined(__clang__)
  148105. "adcs r5, r7\n\t"
  148106. #else
  148107. "adc r5, r7\n\t"
  148108. #endif
  148109. #ifdef WOLFSSL_KEIL
  148110. "adcs r3, r3, %[r]\n\t"
  148111. #elif defined(__clang__)
  148112. "adcs r3, %[r]\n\t"
  148113. #else
  148114. "adc r3, %[r]\n\t"
  148115. #endif
  148116. "# A[9] * B[4]\n\t"
  148117. "mov %[a], r9\n\t"
  148118. "mov %[b], r10\n\t"
  148119. "ldr %[a], [%[a], #36]\n\t"
  148120. "ldr %[b], [%[b], #16]\n\t"
  148121. "uxth r6, %[a]\n\t"
  148122. "uxth r7, %[b]\n\t"
  148123. #ifdef WOLFSSL_KEIL
  148124. "muls r7, r6, r7\n\t"
  148125. #elif defined(__clang__)
  148126. "muls r7, r6\n\t"
  148127. #else
  148128. "mul r7, r6\n\t"
  148129. #endif
  148130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148131. "adds r4, r4, r7\n\t"
  148132. #else
  148133. "add r4, r4, r7\n\t"
  148134. #endif
  148135. #ifdef WOLFSSL_KEIL
  148136. "adcs r5, r5, %[r]\n\t"
  148137. #elif defined(__clang__)
  148138. "adcs r5, %[r]\n\t"
  148139. #else
  148140. "adc r5, %[r]\n\t"
  148141. #endif
  148142. #ifdef WOLFSSL_KEIL
  148143. "adcs r3, r3, %[r]\n\t"
  148144. #elif defined(__clang__)
  148145. "adcs r3, %[r]\n\t"
  148146. #else
  148147. "adc r3, %[r]\n\t"
  148148. #endif
  148149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148150. "lsrs r7, %[b], #16\n\t"
  148151. #else
  148152. "lsr r7, %[b], #16\n\t"
  148153. #endif
  148154. #ifdef WOLFSSL_KEIL
  148155. "muls r6, r7, r6\n\t"
  148156. #elif defined(__clang__)
  148157. "muls r6, r7\n\t"
  148158. #else
  148159. "mul r6, r7\n\t"
  148160. #endif
  148161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148162. "lsrs r7, r6, #16\n\t"
  148163. #else
  148164. "lsr r7, r6, #16\n\t"
  148165. #endif
  148166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148167. "lsls r6, r6, #16\n\t"
  148168. #else
  148169. "lsl r6, r6, #16\n\t"
  148170. #endif
  148171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148172. "adds r4, r4, r6\n\t"
  148173. #else
  148174. "add r4, r4, r6\n\t"
  148175. #endif
  148176. #ifdef WOLFSSL_KEIL
  148177. "adcs r5, r5, r7\n\t"
  148178. #elif defined(__clang__)
  148179. "adcs r5, r7\n\t"
  148180. #else
  148181. "adc r5, r7\n\t"
  148182. #endif
  148183. #ifdef WOLFSSL_KEIL
  148184. "adcs r3, r3, %[r]\n\t"
  148185. #elif defined(__clang__)
  148186. "adcs r3, %[r]\n\t"
  148187. #else
  148188. "adc r3, %[r]\n\t"
  148189. #endif
  148190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148191. "lsrs r6, %[a], #16\n\t"
  148192. #else
  148193. "lsr r6, %[a], #16\n\t"
  148194. #endif
  148195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148196. "lsrs r7, %[b], #16\n\t"
  148197. #else
  148198. "lsr r7, %[b], #16\n\t"
  148199. #endif
  148200. #ifdef WOLFSSL_KEIL
  148201. "muls r7, r6, r7\n\t"
  148202. #elif defined(__clang__)
  148203. "muls r7, r6\n\t"
  148204. #else
  148205. "mul r7, r6\n\t"
  148206. #endif
  148207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148208. "adds r5, r5, r7\n\t"
  148209. #else
  148210. "add r5, r5, r7\n\t"
  148211. #endif
  148212. #ifdef WOLFSSL_KEIL
  148213. "adcs r3, r3, %[r]\n\t"
  148214. #elif defined(__clang__)
  148215. "adcs r3, %[r]\n\t"
  148216. #else
  148217. "adc r3, %[r]\n\t"
  148218. #endif
  148219. "uxth r7, %[b]\n\t"
  148220. #ifdef WOLFSSL_KEIL
  148221. "muls r6, r7, r6\n\t"
  148222. #elif defined(__clang__)
  148223. "muls r6, r7\n\t"
  148224. #else
  148225. "mul r6, r7\n\t"
  148226. #endif
  148227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148228. "lsrs r7, r6, #16\n\t"
  148229. #else
  148230. "lsr r7, r6, #16\n\t"
  148231. #endif
  148232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148233. "lsls r6, r6, #16\n\t"
  148234. #else
  148235. "lsl r6, r6, #16\n\t"
  148236. #endif
  148237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148238. "adds r4, r4, r6\n\t"
  148239. #else
  148240. "add r4, r4, r6\n\t"
  148241. #endif
  148242. #ifdef WOLFSSL_KEIL
  148243. "adcs r5, r5, r7\n\t"
  148244. #elif defined(__clang__)
  148245. "adcs r5, r7\n\t"
  148246. #else
  148247. "adc r5, r7\n\t"
  148248. #endif
  148249. #ifdef WOLFSSL_KEIL
  148250. "adcs r3, r3, %[r]\n\t"
  148251. #elif defined(__clang__)
  148252. "adcs r3, %[r]\n\t"
  148253. #else
  148254. "adc r3, %[r]\n\t"
  148255. #endif
  148256. "# A[10] * B[3]\n\t"
  148257. "mov %[a], r9\n\t"
  148258. "mov %[b], r10\n\t"
  148259. "ldr %[a], [%[a], #40]\n\t"
  148260. "ldr %[b], [%[b], #12]\n\t"
  148261. "uxth r6, %[a]\n\t"
  148262. "uxth r7, %[b]\n\t"
  148263. #ifdef WOLFSSL_KEIL
  148264. "muls r7, r6, r7\n\t"
  148265. #elif defined(__clang__)
  148266. "muls r7, r6\n\t"
  148267. #else
  148268. "mul r7, r6\n\t"
  148269. #endif
  148270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148271. "adds r4, r4, r7\n\t"
  148272. #else
  148273. "add r4, r4, r7\n\t"
  148274. #endif
  148275. #ifdef WOLFSSL_KEIL
  148276. "adcs r5, r5, %[r]\n\t"
  148277. #elif defined(__clang__)
  148278. "adcs r5, %[r]\n\t"
  148279. #else
  148280. "adc r5, %[r]\n\t"
  148281. #endif
  148282. #ifdef WOLFSSL_KEIL
  148283. "adcs r3, r3, %[r]\n\t"
  148284. #elif defined(__clang__)
  148285. "adcs r3, %[r]\n\t"
  148286. #else
  148287. "adc r3, %[r]\n\t"
  148288. #endif
  148289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148290. "lsrs r7, %[b], #16\n\t"
  148291. #else
  148292. "lsr r7, %[b], #16\n\t"
  148293. #endif
  148294. #ifdef WOLFSSL_KEIL
  148295. "muls r6, r7, r6\n\t"
  148296. #elif defined(__clang__)
  148297. "muls r6, r7\n\t"
  148298. #else
  148299. "mul r6, r7\n\t"
  148300. #endif
  148301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148302. "lsrs r7, r6, #16\n\t"
  148303. #else
  148304. "lsr r7, r6, #16\n\t"
  148305. #endif
  148306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148307. "lsls r6, r6, #16\n\t"
  148308. #else
  148309. "lsl r6, r6, #16\n\t"
  148310. #endif
  148311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148312. "adds r4, r4, r6\n\t"
  148313. #else
  148314. "add r4, r4, r6\n\t"
  148315. #endif
  148316. #ifdef WOLFSSL_KEIL
  148317. "adcs r5, r5, r7\n\t"
  148318. #elif defined(__clang__)
  148319. "adcs r5, r7\n\t"
  148320. #else
  148321. "adc r5, r7\n\t"
  148322. #endif
  148323. #ifdef WOLFSSL_KEIL
  148324. "adcs r3, r3, %[r]\n\t"
  148325. #elif defined(__clang__)
  148326. "adcs r3, %[r]\n\t"
  148327. #else
  148328. "adc r3, %[r]\n\t"
  148329. #endif
  148330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148331. "lsrs r6, %[a], #16\n\t"
  148332. #else
  148333. "lsr r6, %[a], #16\n\t"
  148334. #endif
  148335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148336. "lsrs r7, %[b], #16\n\t"
  148337. #else
  148338. "lsr r7, %[b], #16\n\t"
  148339. #endif
  148340. #ifdef WOLFSSL_KEIL
  148341. "muls r7, r6, r7\n\t"
  148342. #elif defined(__clang__)
  148343. "muls r7, r6\n\t"
  148344. #else
  148345. "mul r7, r6\n\t"
  148346. #endif
  148347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148348. "adds r5, r5, r7\n\t"
  148349. #else
  148350. "add r5, r5, r7\n\t"
  148351. #endif
  148352. #ifdef WOLFSSL_KEIL
  148353. "adcs r3, r3, %[r]\n\t"
  148354. #elif defined(__clang__)
  148355. "adcs r3, %[r]\n\t"
  148356. #else
  148357. "adc r3, %[r]\n\t"
  148358. #endif
  148359. "uxth r7, %[b]\n\t"
  148360. #ifdef WOLFSSL_KEIL
  148361. "muls r6, r7, r6\n\t"
  148362. #elif defined(__clang__)
  148363. "muls r6, r7\n\t"
  148364. #else
  148365. "mul r6, r7\n\t"
  148366. #endif
  148367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148368. "lsrs r7, r6, #16\n\t"
  148369. #else
  148370. "lsr r7, r6, #16\n\t"
  148371. #endif
  148372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148373. "lsls r6, r6, #16\n\t"
  148374. #else
  148375. "lsl r6, r6, #16\n\t"
  148376. #endif
  148377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148378. "adds r4, r4, r6\n\t"
  148379. #else
  148380. "add r4, r4, r6\n\t"
  148381. #endif
  148382. #ifdef WOLFSSL_KEIL
  148383. "adcs r5, r5, r7\n\t"
  148384. #elif defined(__clang__)
  148385. "adcs r5, r7\n\t"
  148386. #else
  148387. "adc r5, r7\n\t"
  148388. #endif
  148389. #ifdef WOLFSSL_KEIL
  148390. "adcs r3, r3, %[r]\n\t"
  148391. #elif defined(__clang__)
  148392. "adcs r3, %[r]\n\t"
  148393. #else
  148394. "adc r3, %[r]\n\t"
  148395. #endif
  148396. "# A[11] * B[2]\n\t"
  148397. "mov %[a], r9\n\t"
  148398. "mov %[b], r10\n\t"
  148399. "ldr %[a], [%[a], #44]\n\t"
  148400. "ldr %[b], [%[b], #8]\n\t"
  148401. "uxth r6, %[a]\n\t"
  148402. "uxth r7, %[b]\n\t"
  148403. #ifdef WOLFSSL_KEIL
  148404. "muls r7, r6, r7\n\t"
  148405. #elif defined(__clang__)
  148406. "muls r7, r6\n\t"
  148407. #else
  148408. "mul r7, r6\n\t"
  148409. #endif
  148410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148411. "adds r4, r4, r7\n\t"
  148412. #else
  148413. "add r4, r4, r7\n\t"
  148414. #endif
  148415. #ifdef WOLFSSL_KEIL
  148416. "adcs r5, r5, %[r]\n\t"
  148417. #elif defined(__clang__)
  148418. "adcs r5, %[r]\n\t"
  148419. #else
  148420. "adc r5, %[r]\n\t"
  148421. #endif
  148422. #ifdef WOLFSSL_KEIL
  148423. "adcs r3, r3, %[r]\n\t"
  148424. #elif defined(__clang__)
  148425. "adcs r3, %[r]\n\t"
  148426. #else
  148427. "adc r3, %[r]\n\t"
  148428. #endif
  148429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148430. "lsrs r7, %[b], #16\n\t"
  148431. #else
  148432. "lsr r7, %[b], #16\n\t"
  148433. #endif
  148434. #ifdef WOLFSSL_KEIL
  148435. "muls r6, r7, r6\n\t"
  148436. #elif defined(__clang__)
  148437. "muls r6, r7\n\t"
  148438. #else
  148439. "mul r6, r7\n\t"
  148440. #endif
  148441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148442. "lsrs r7, r6, #16\n\t"
  148443. #else
  148444. "lsr r7, r6, #16\n\t"
  148445. #endif
  148446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148447. "lsls r6, r6, #16\n\t"
  148448. #else
  148449. "lsl r6, r6, #16\n\t"
  148450. #endif
  148451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148452. "adds r4, r4, r6\n\t"
  148453. #else
  148454. "add r4, r4, r6\n\t"
  148455. #endif
  148456. #ifdef WOLFSSL_KEIL
  148457. "adcs r5, r5, r7\n\t"
  148458. #elif defined(__clang__)
  148459. "adcs r5, r7\n\t"
  148460. #else
  148461. "adc r5, r7\n\t"
  148462. #endif
  148463. #ifdef WOLFSSL_KEIL
  148464. "adcs r3, r3, %[r]\n\t"
  148465. #elif defined(__clang__)
  148466. "adcs r3, %[r]\n\t"
  148467. #else
  148468. "adc r3, %[r]\n\t"
  148469. #endif
  148470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148471. "lsrs r6, %[a], #16\n\t"
  148472. #else
  148473. "lsr r6, %[a], #16\n\t"
  148474. #endif
  148475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148476. "lsrs r7, %[b], #16\n\t"
  148477. #else
  148478. "lsr r7, %[b], #16\n\t"
  148479. #endif
  148480. #ifdef WOLFSSL_KEIL
  148481. "muls r7, r6, r7\n\t"
  148482. #elif defined(__clang__)
  148483. "muls r7, r6\n\t"
  148484. #else
  148485. "mul r7, r6\n\t"
  148486. #endif
  148487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148488. "adds r5, r5, r7\n\t"
  148489. #else
  148490. "add r5, r5, r7\n\t"
  148491. #endif
  148492. #ifdef WOLFSSL_KEIL
  148493. "adcs r3, r3, %[r]\n\t"
  148494. #elif defined(__clang__)
  148495. "adcs r3, %[r]\n\t"
  148496. #else
  148497. "adc r3, %[r]\n\t"
  148498. #endif
  148499. "uxth r7, %[b]\n\t"
  148500. #ifdef WOLFSSL_KEIL
  148501. "muls r6, r7, r6\n\t"
  148502. #elif defined(__clang__)
  148503. "muls r6, r7\n\t"
  148504. #else
  148505. "mul r6, r7\n\t"
  148506. #endif
  148507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148508. "lsrs r7, r6, #16\n\t"
  148509. #else
  148510. "lsr r7, r6, #16\n\t"
  148511. #endif
  148512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148513. "lsls r6, r6, #16\n\t"
  148514. #else
  148515. "lsl r6, r6, #16\n\t"
  148516. #endif
  148517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148518. "adds r4, r4, r6\n\t"
  148519. #else
  148520. "add r4, r4, r6\n\t"
  148521. #endif
  148522. #ifdef WOLFSSL_KEIL
  148523. "adcs r5, r5, r7\n\t"
  148524. #elif defined(__clang__)
  148525. "adcs r5, r7\n\t"
  148526. #else
  148527. "adc r5, r7\n\t"
  148528. #endif
  148529. #ifdef WOLFSSL_KEIL
  148530. "adcs r3, r3, %[r]\n\t"
  148531. #elif defined(__clang__)
  148532. "adcs r3, %[r]\n\t"
  148533. #else
  148534. "adc r3, %[r]\n\t"
  148535. #endif
  148536. "# A[12] * B[1]\n\t"
  148537. "mov %[a], r9\n\t"
  148538. "mov %[b], r10\n\t"
  148539. "ldr %[a], [%[a], #48]\n\t"
  148540. "ldr %[b], [%[b], #4]\n\t"
  148541. "uxth r6, %[a]\n\t"
  148542. "uxth r7, %[b]\n\t"
  148543. #ifdef WOLFSSL_KEIL
  148544. "muls r7, r6, r7\n\t"
  148545. #elif defined(__clang__)
  148546. "muls r7, r6\n\t"
  148547. #else
  148548. "mul r7, r6\n\t"
  148549. #endif
  148550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148551. "adds r4, r4, r7\n\t"
  148552. #else
  148553. "add r4, r4, r7\n\t"
  148554. #endif
  148555. #ifdef WOLFSSL_KEIL
  148556. "adcs r5, r5, %[r]\n\t"
  148557. #elif defined(__clang__)
  148558. "adcs r5, %[r]\n\t"
  148559. #else
  148560. "adc r5, %[r]\n\t"
  148561. #endif
  148562. #ifdef WOLFSSL_KEIL
  148563. "adcs r3, r3, %[r]\n\t"
  148564. #elif defined(__clang__)
  148565. "adcs r3, %[r]\n\t"
  148566. #else
  148567. "adc r3, %[r]\n\t"
  148568. #endif
  148569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148570. "lsrs r7, %[b], #16\n\t"
  148571. #else
  148572. "lsr r7, %[b], #16\n\t"
  148573. #endif
  148574. #ifdef WOLFSSL_KEIL
  148575. "muls r6, r7, r6\n\t"
  148576. #elif defined(__clang__)
  148577. "muls r6, r7\n\t"
  148578. #else
  148579. "mul r6, r7\n\t"
  148580. #endif
  148581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148582. "lsrs r7, r6, #16\n\t"
  148583. #else
  148584. "lsr r7, r6, #16\n\t"
  148585. #endif
  148586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148587. "lsls r6, r6, #16\n\t"
  148588. #else
  148589. "lsl r6, r6, #16\n\t"
  148590. #endif
  148591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148592. "adds r4, r4, r6\n\t"
  148593. #else
  148594. "add r4, r4, r6\n\t"
  148595. #endif
  148596. #ifdef WOLFSSL_KEIL
  148597. "adcs r5, r5, r7\n\t"
  148598. #elif defined(__clang__)
  148599. "adcs r5, r7\n\t"
  148600. #else
  148601. "adc r5, r7\n\t"
  148602. #endif
  148603. #ifdef WOLFSSL_KEIL
  148604. "adcs r3, r3, %[r]\n\t"
  148605. #elif defined(__clang__)
  148606. "adcs r3, %[r]\n\t"
  148607. #else
  148608. "adc r3, %[r]\n\t"
  148609. #endif
  148610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148611. "lsrs r6, %[a], #16\n\t"
  148612. #else
  148613. "lsr r6, %[a], #16\n\t"
  148614. #endif
  148615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148616. "lsrs r7, %[b], #16\n\t"
  148617. #else
  148618. "lsr r7, %[b], #16\n\t"
  148619. #endif
  148620. #ifdef WOLFSSL_KEIL
  148621. "muls r7, r6, r7\n\t"
  148622. #elif defined(__clang__)
  148623. "muls r7, r6\n\t"
  148624. #else
  148625. "mul r7, r6\n\t"
  148626. #endif
  148627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148628. "adds r5, r5, r7\n\t"
  148629. #else
  148630. "add r5, r5, r7\n\t"
  148631. #endif
  148632. #ifdef WOLFSSL_KEIL
  148633. "adcs r3, r3, %[r]\n\t"
  148634. #elif defined(__clang__)
  148635. "adcs r3, %[r]\n\t"
  148636. #else
  148637. "adc r3, %[r]\n\t"
  148638. #endif
  148639. "uxth r7, %[b]\n\t"
  148640. #ifdef WOLFSSL_KEIL
  148641. "muls r6, r7, r6\n\t"
  148642. #elif defined(__clang__)
  148643. "muls r6, r7\n\t"
  148644. #else
  148645. "mul r6, r7\n\t"
  148646. #endif
  148647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148648. "lsrs r7, r6, #16\n\t"
  148649. #else
  148650. "lsr r7, r6, #16\n\t"
  148651. #endif
  148652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148653. "lsls r6, r6, #16\n\t"
  148654. #else
  148655. "lsl r6, r6, #16\n\t"
  148656. #endif
  148657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148658. "adds r4, r4, r6\n\t"
  148659. #else
  148660. "add r4, r4, r6\n\t"
  148661. #endif
  148662. #ifdef WOLFSSL_KEIL
  148663. "adcs r5, r5, r7\n\t"
  148664. #elif defined(__clang__)
  148665. "adcs r5, r7\n\t"
  148666. #else
  148667. "adc r5, r7\n\t"
  148668. #endif
  148669. #ifdef WOLFSSL_KEIL
  148670. "adcs r3, r3, %[r]\n\t"
  148671. #elif defined(__clang__)
  148672. "adcs r3, %[r]\n\t"
  148673. #else
  148674. "adc r3, %[r]\n\t"
  148675. #endif
  148676. "# A[13] * B[0]\n\t"
  148677. "mov %[a], r9\n\t"
  148678. "mov %[b], r10\n\t"
  148679. "ldr %[a], [%[a], #52]\n\t"
  148680. "ldr %[b], [%[b]]\n\t"
  148681. "uxth r6, %[a]\n\t"
  148682. "uxth r7, %[b]\n\t"
  148683. #ifdef WOLFSSL_KEIL
  148684. "muls r7, r6, r7\n\t"
  148685. #elif defined(__clang__)
  148686. "muls r7, r6\n\t"
  148687. #else
  148688. "mul r7, r6\n\t"
  148689. #endif
  148690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148691. "adds r4, r4, r7\n\t"
  148692. #else
  148693. "add r4, r4, r7\n\t"
  148694. #endif
  148695. #ifdef WOLFSSL_KEIL
  148696. "adcs r5, r5, %[r]\n\t"
  148697. #elif defined(__clang__)
  148698. "adcs r5, %[r]\n\t"
  148699. #else
  148700. "adc r5, %[r]\n\t"
  148701. #endif
  148702. #ifdef WOLFSSL_KEIL
  148703. "adcs r3, r3, %[r]\n\t"
  148704. #elif defined(__clang__)
  148705. "adcs r3, %[r]\n\t"
  148706. #else
  148707. "adc r3, %[r]\n\t"
  148708. #endif
  148709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148710. "lsrs r7, %[b], #16\n\t"
  148711. #else
  148712. "lsr r7, %[b], #16\n\t"
  148713. #endif
  148714. #ifdef WOLFSSL_KEIL
  148715. "muls r6, r7, r6\n\t"
  148716. #elif defined(__clang__)
  148717. "muls r6, r7\n\t"
  148718. #else
  148719. "mul r6, r7\n\t"
  148720. #endif
  148721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148722. "lsrs r7, r6, #16\n\t"
  148723. #else
  148724. "lsr r7, r6, #16\n\t"
  148725. #endif
  148726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148727. "lsls r6, r6, #16\n\t"
  148728. #else
  148729. "lsl r6, r6, #16\n\t"
  148730. #endif
  148731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148732. "adds r4, r4, r6\n\t"
  148733. #else
  148734. "add r4, r4, r6\n\t"
  148735. #endif
  148736. #ifdef WOLFSSL_KEIL
  148737. "adcs r5, r5, r7\n\t"
  148738. #elif defined(__clang__)
  148739. "adcs r5, r7\n\t"
  148740. #else
  148741. "adc r5, r7\n\t"
  148742. #endif
  148743. #ifdef WOLFSSL_KEIL
  148744. "adcs r3, r3, %[r]\n\t"
  148745. #elif defined(__clang__)
  148746. "adcs r3, %[r]\n\t"
  148747. #else
  148748. "adc r3, %[r]\n\t"
  148749. #endif
  148750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148751. "lsrs r6, %[a], #16\n\t"
  148752. #else
  148753. "lsr r6, %[a], #16\n\t"
  148754. #endif
  148755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148756. "lsrs r7, %[b], #16\n\t"
  148757. #else
  148758. "lsr r7, %[b], #16\n\t"
  148759. #endif
  148760. #ifdef WOLFSSL_KEIL
  148761. "muls r7, r6, r7\n\t"
  148762. #elif defined(__clang__)
  148763. "muls r7, r6\n\t"
  148764. #else
  148765. "mul r7, r6\n\t"
  148766. #endif
  148767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148768. "adds r5, r5, r7\n\t"
  148769. #else
  148770. "add r5, r5, r7\n\t"
  148771. #endif
  148772. #ifdef WOLFSSL_KEIL
  148773. "adcs r3, r3, %[r]\n\t"
  148774. #elif defined(__clang__)
  148775. "adcs r3, %[r]\n\t"
  148776. #else
  148777. "adc r3, %[r]\n\t"
  148778. #endif
  148779. "uxth r7, %[b]\n\t"
  148780. #ifdef WOLFSSL_KEIL
  148781. "muls r6, r7, r6\n\t"
  148782. #elif defined(__clang__)
  148783. "muls r6, r7\n\t"
  148784. #else
  148785. "mul r6, r7\n\t"
  148786. #endif
  148787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148788. "lsrs r7, r6, #16\n\t"
  148789. #else
  148790. "lsr r7, r6, #16\n\t"
  148791. #endif
  148792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148793. "lsls r6, r6, #16\n\t"
  148794. #else
  148795. "lsl r6, r6, #16\n\t"
  148796. #endif
  148797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148798. "adds r4, r4, r6\n\t"
  148799. #else
  148800. "add r4, r4, r6\n\t"
  148801. #endif
  148802. #ifdef WOLFSSL_KEIL
  148803. "adcs r5, r5, r7\n\t"
  148804. #elif defined(__clang__)
  148805. "adcs r5, r7\n\t"
  148806. #else
  148807. "adc r5, r7\n\t"
  148808. #endif
  148809. #ifdef WOLFSSL_KEIL
  148810. "adcs r3, r3, %[r]\n\t"
  148811. #elif defined(__clang__)
  148812. "adcs r3, %[r]\n\t"
  148813. #else
  148814. "adc r3, %[r]\n\t"
  148815. #endif
  148816. "str r4, [sp, #52]\n\t"
  148817. "# A[14] * B[0]\n\t"
  148818. "movs r4, #0\n\t"
  148819. "mov %[a], r9\n\t"
  148820. "mov %[b], r10\n\t"
  148821. "ldr %[a], [%[a], #56]\n\t"
  148822. "ldr %[b], [%[b]]\n\t"
  148823. "uxth r6, %[a]\n\t"
  148824. "uxth r7, %[b]\n\t"
  148825. #ifdef WOLFSSL_KEIL
  148826. "muls r7, r6, r7\n\t"
  148827. #elif defined(__clang__)
  148828. "muls r7, r6\n\t"
  148829. #else
  148830. "mul r7, r6\n\t"
  148831. #endif
  148832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148833. "adds r5, r5, r7\n\t"
  148834. #else
  148835. "add r5, r5, r7\n\t"
  148836. #endif
  148837. #ifdef WOLFSSL_KEIL
  148838. "adcs r3, r3, %[r]\n\t"
  148839. #elif defined(__clang__)
  148840. "adcs r3, %[r]\n\t"
  148841. #else
  148842. "adc r3, %[r]\n\t"
  148843. #endif
  148844. #ifdef WOLFSSL_KEIL
  148845. "adcs r4, r4, %[r]\n\t"
  148846. #elif defined(__clang__)
  148847. "adcs r4, %[r]\n\t"
  148848. #else
  148849. "adc r4, %[r]\n\t"
  148850. #endif
  148851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148852. "lsrs r7, %[b], #16\n\t"
  148853. #else
  148854. "lsr r7, %[b], #16\n\t"
  148855. #endif
  148856. #ifdef WOLFSSL_KEIL
  148857. "muls r6, r7, r6\n\t"
  148858. #elif defined(__clang__)
  148859. "muls r6, r7\n\t"
  148860. #else
  148861. "mul r6, r7\n\t"
  148862. #endif
  148863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148864. "lsrs r7, r6, #16\n\t"
  148865. #else
  148866. "lsr r7, r6, #16\n\t"
  148867. #endif
  148868. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148869. "lsls r6, r6, #16\n\t"
  148870. #else
  148871. "lsl r6, r6, #16\n\t"
  148872. #endif
  148873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148874. "adds r5, r5, r6\n\t"
  148875. #else
  148876. "add r5, r5, r6\n\t"
  148877. #endif
  148878. #ifdef WOLFSSL_KEIL
  148879. "adcs r3, r3, r7\n\t"
  148880. #elif defined(__clang__)
  148881. "adcs r3, r7\n\t"
  148882. #else
  148883. "adc r3, r7\n\t"
  148884. #endif
  148885. #ifdef WOLFSSL_KEIL
  148886. "adcs r4, r4, %[r]\n\t"
  148887. #elif defined(__clang__)
  148888. "adcs r4, %[r]\n\t"
  148889. #else
  148890. "adc r4, %[r]\n\t"
  148891. #endif
  148892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148893. "lsrs r6, %[a], #16\n\t"
  148894. #else
  148895. "lsr r6, %[a], #16\n\t"
  148896. #endif
  148897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148898. "lsrs r7, %[b], #16\n\t"
  148899. #else
  148900. "lsr r7, %[b], #16\n\t"
  148901. #endif
  148902. #ifdef WOLFSSL_KEIL
  148903. "muls r7, r6, r7\n\t"
  148904. #elif defined(__clang__)
  148905. "muls r7, r6\n\t"
  148906. #else
  148907. "mul r7, r6\n\t"
  148908. #endif
  148909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148910. "adds r3, r3, r7\n\t"
  148911. #else
  148912. "add r3, r3, r7\n\t"
  148913. #endif
  148914. #ifdef WOLFSSL_KEIL
  148915. "adcs r4, r4, %[r]\n\t"
  148916. #elif defined(__clang__)
  148917. "adcs r4, %[r]\n\t"
  148918. #else
  148919. "adc r4, %[r]\n\t"
  148920. #endif
  148921. "uxth r7, %[b]\n\t"
  148922. #ifdef WOLFSSL_KEIL
  148923. "muls r6, r7, r6\n\t"
  148924. #elif defined(__clang__)
  148925. "muls r6, r7\n\t"
  148926. #else
  148927. "mul r6, r7\n\t"
  148928. #endif
  148929. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148930. "lsrs r7, r6, #16\n\t"
  148931. #else
  148932. "lsr r7, r6, #16\n\t"
  148933. #endif
  148934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148935. "lsls r6, r6, #16\n\t"
  148936. #else
  148937. "lsl r6, r6, #16\n\t"
  148938. #endif
  148939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148940. "adds r5, r5, r6\n\t"
  148941. #else
  148942. "add r5, r5, r6\n\t"
  148943. #endif
  148944. #ifdef WOLFSSL_KEIL
  148945. "adcs r3, r3, r7\n\t"
  148946. #elif defined(__clang__)
  148947. "adcs r3, r7\n\t"
  148948. #else
  148949. "adc r3, r7\n\t"
  148950. #endif
  148951. #ifdef WOLFSSL_KEIL
  148952. "adcs r4, r4, %[r]\n\t"
  148953. #elif defined(__clang__)
  148954. "adcs r4, %[r]\n\t"
  148955. #else
  148956. "adc r4, %[r]\n\t"
  148957. #endif
  148958. "# A[13] * B[1]\n\t"
  148959. "mov %[a], r9\n\t"
  148960. "mov %[b], r10\n\t"
  148961. "ldr %[a], [%[a], #52]\n\t"
  148962. "ldr %[b], [%[b], #4]\n\t"
  148963. "uxth r6, %[a]\n\t"
  148964. "uxth r7, %[b]\n\t"
  148965. #ifdef WOLFSSL_KEIL
  148966. "muls r7, r6, r7\n\t"
  148967. #elif defined(__clang__)
  148968. "muls r7, r6\n\t"
  148969. #else
  148970. "mul r7, r6\n\t"
  148971. #endif
  148972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148973. "adds r5, r5, r7\n\t"
  148974. #else
  148975. "add r5, r5, r7\n\t"
  148976. #endif
  148977. #ifdef WOLFSSL_KEIL
  148978. "adcs r3, r3, %[r]\n\t"
  148979. #elif defined(__clang__)
  148980. "adcs r3, %[r]\n\t"
  148981. #else
  148982. "adc r3, %[r]\n\t"
  148983. #endif
  148984. #ifdef WOLFSSL_KEIL
  148985. "adcs r4, r4, %[r]\n\t"
  148986. #elif defined(__clang__)
  148987. "adcs r4, %[r]\n\t"
  148988. #else
  148989. "adc r4, %[r]\n\t"
  148990. #endif
  148991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  148992. "lsrs r7, %[b], #16\n\t"
  148993. #else
  148994. "lsr r7, %[b], #16\n\t"
  148995. #endif
  148996. #ifdef WOLFSSL_KEIL
  148997. "muls r6, r7, r6\n\t"
  148998. #elif defined(__clang__)
  148999. "muls r6, r7\n\t"
  149000. #else
  149001. "mul r6, r7\n\t"
  149002. #endif
  149003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149004. "lsrs r7, r6, #16\n\t"
  149005. #else
  149006. "lsr r7, r6, #16\n\t"
  149007. #endif
  149008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149009. "lsls r6, r6, #16\n\t"
  149010. #else
  149011. "lsl r6, r6, #16\n\t"
  149012. #endif
  149013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149014. "adds r5, r5, r6\n\t"
  149015. #else
  149016. "add r5, r5, r6\n\t"
  149017. #endif
  149018. #ifdef WOLFSSL_KEIL
  149019. "adcs r3, r3, r7\n\t"
  149020. #elif defined(__clang__)
  149021. "adcs r3, r7\n\t"
  149022. #else
  149023. "adc r3, r7\n\t"
  149024. #endif
  149025. #ifdef WOLFSSL_KEIL
  149026. "adcs r4, r4, %[r]\n\t"
  149027. #elif defined(__clang__)
  149028. "adcs r4, %[r]\n\t"
  149029. #else
  149030. "adc r4, %[r]\n\t"
  149031. #endif
  149032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149033. "lsrs r6, %[a], #16\n\t"
  149034. #else
  149035. "lsr r6, %[a], #16\n\t"
  149036. #endif
  149037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149038. "lsrs r7, %[b], #16\n\t"
  149039. #else
  149040. "lsr r7, %[b], #16\n\t"
  149041. #endif
  149042. #ifdef WOLFSSL_KEIL
  149043. "muls r7, r6, r7\n\t"
  149044. #elif defined(__clang__)
  149045. "muls r7, r6\n\t"
  149046. #else
  149047. "mul r7, r6\n\t"
  149048. #endif
  149049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149050. "adds r3, r3, r7\n\t"
  149051. #else
  149052. "add r3, r3, r7\n\t"
  149053. #endif
  149054. #ifdef WOLFSSL_KEIL
  149055. "adcs r4, r4, %[r]\n\t"
  149056. #elif defined(__clang__)
  149057. "adcs r4, %[r]\n\t"
  149058. #else
  149059. "adc r4, %[r]\n\t"
  149060. #endif
  149061. "uxth r7, %[b]\n\t"
  149062. #ifdef WOLFSSL_KEIL
  149063. "muls r6, r7, r6\n\t"
  149064. #elif defined(__clang__)
  149065. "muls r6, r7\n\t"
  149066. #else
  149067. "mul r6, r7\n\t"
  149068. #endif
  149069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149070. "lsrs r7, r6, #16\n\t"
  149071. #else
  149072. "lsr r7, r6, #16\n\t"
  149073. #endif
  149074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149075. "lsls r6, r6, #16\n\t"
  149076. #else
  149077. "lsl r6, r6, #16\n\t"
  149078. #endif
  149079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149080. "adds r5, r5, r6\n\t"
  149081. #else
  149082. "add r5, r5, r6\n\t"
  149083. #endif
  149084. #ifdef WOLFSSL_KEIL
  149085. "adcs r3, r3, r7\n\t"
  149086. #elif defined(__clang__)
  149087. "adcs r3, r7\n\t"
  149088. #else
  149089. "adc r3, r7\n\t"
  149090. #endif
  149091. #ifdef WOLFSSL_KEIL
  149092. "adcs r4, r4, %[r]\n\t"
  149093. #elif defined(__clang__)
  149094. "adcs r4, %[r]\n\t"
  149095. #else
  149096. "adc r4, %[r]\n\t"
  149097. #endif
  149098. "# A[12] * B[2]\n\t"
  149099. "mov %[a], r9\n\t"
  149100. "mov %[b], r10\n\t"
  149101. "ldr %[a], [%[a], #48]\n\t"
  149102. "ldr %[b], [%[b], #8]\n\t"
  149103. "uxth r6, %[a]\n\t"
  149104. "uxth r7, %[b]\n\t"
  149105. #ifdef WOLFSSL_KEIL
  149106. "muls r7, r6, r7\n\t"
  149107. #elif defined(__clang__)
  149108. "muls r7, r6\n\t"
  149109. #else
  149110. "mul r7, r6\n\t"
  149111. #endif
  149112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149113. "adds r5, r5, r7\n\t"
  149114. #else
  149115. "add r5, r5, r7\n\t"
  149116. #endif
  149117. #ifdef WOLFSSL_KEIL
  149118. "adcs r3, r3, %[r]\n\t"
  149119. #elif defined(__clang__)
  149120. "adcs r3, %[r]\n\t"
  149121. #else
  149122. "adc r3, %[r]\n\t"
  149123. #endif
  149124. #ifdef WOLFSSL_KEIL
  149125. "adcs r4, r4, %[r]\n\t"
  149126. #elif defined(__clang__)
  149127. "adcs r4, %[r]\n\t"
  149128. #else
  149129. "adc r4, %[r]\n\t"
  149130. #endif
  149131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149132. "lsrs r7, %[b], #16\n\t"
  149133. #else
  149134. "lsr r7, %[b], #16\n\t"
  149135. #endif
  149136. #ifdef WOLFSSL_KEIL
  149137. "muls r6, r7, r6\n\t"
  149138. #elif defined(__clang__)
  149139. "muls r6, r7\n\t"
  149140. #else
  149141. "mul r6, r7\n\t"
  149142. #endif
  149143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149144. "lsrs r7, r6, #16\n\t"
  149145. #else
  149146. "lsr r7, r6, #16\n\t"
  149147. #endif
  149148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149149. "lsls r6, r6, #16\n\t"
  149150. #else
  149151. "lsl r6, r6, #16\n\t"
  149152. #endif
  149153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149154. "adds r5, r5, r6\n\t"
  149155. #else
  149156. "add r5, r5, r6\n\t"
  149157. #endif
  149158. #ifdef WOLFSSL_KEIL
  149159. "adcs r3, r3, r7\n\t"
  149160. #elif defined(__clang__)
  149161. "adcs r3, r7\n\t"
  149162. #else
  149163. "adc r3, r7\n\t"
  149164. #endif
  149165. #ifdef WOLFSSL_KEIL
  149166. "adcs r4, r4, %[r]\n\t"
  149167. #elif defined(__clang__)
  149168. "adcs r4, %[r]\n\t"
  149169. #else
  149170. "adc r4, %[r]\n\t"
  149171. #endif
  149172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149173. "lsrs r6, %[a], #16\n\t"
  149174. #else
  149175. "lsr r6, %[a], #16\n\t"
  149176. #endif
  149177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149178. "lsrs r7, %[b], #16\n\t"
  149179. #else
  149180. "lsr r7, %[b], #16\n\t"
  149181. #endif
  149182. #ifdef WOLFSSL_KEIL
  149183. "muls r7, r6, r7\n\t"
  149184. #elif defined(__clang__)
  149185. "muls r7, r6\n\t"
  149186. #else
  149187. "mul r7, r6\n\t"
  149188. #endif
  149189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149190. "adds r3, r3, r7\n\t"
  149191. #else
  149192. "add r3, r3, r7\n\t"
  149193. #endif
  149194. #ifdef WOLFSSL_KEIL
  149195. "adcs r4, r4, %[r]\n\t"
  149196. #elif defined(__clang__)
  149197. "adcs r4, %[r]\n\t"
  149198. #else
  149199. "adc r4, %[r]\n\t"
  149200. #endif
  149201. "uxth r7, %[b]\n\t"
  149202. #ifdef WOLFSSL_KEIL
  149203. "muls r6, r7, r6\n\t"
  149204. #elif defined(__clang__)
  149205. "muls r6, r7\n\t"
  149206. #else
  149207. "mul r6, r7\n\t"
  149208. #endif
  149209. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149210. "lsrs r7, r6, #16\n\t"
  149211. #else
  149212. "lsr r7, r6, #16\n\t"
  149213. #endif
  149214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149215. "lsls r6, r6, #16\n\t"
  149216. #else
  149217. "lsl r6, r6, #16\n\t"
  149218. #endif
  149219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149220. "adds r5, r5, r6\n\t"
  149221. #else
  149222. "add r5, r5, r6\n\t"
  149223. #endif
  149224. #ifdef WOLFSSL_KEIL
  149225. "adcs r3, r3, r7\n\t"
  149226. #elif defined(__clang__)
  149227. "adcs r3, r7\n\t"
  149228. #else
  149229. "adc r3, r7\n\t"
  149230. #endif
  149231. #ifdef WOLFSSL_KEIL
  149232. "adcs r4, r4, %[r]\n\t"
  149233. #elif defined(__clang__)
  149234. "adcs r4, %[r]\n\t"
  149235. #else
  149236. "adc r4, %[r]\n\t"
  149237. #endif
  149238. "# A[11] * B[3]\n\t"
  149239. "mov %[a], r9\n\t"
  149240. "mov %[b], r10\n\t"
  149241. "ldr %[a], [%[a], #44]\n\t"
  149242. "ldr %[b], [%[b], #12]\n\t"
  149243. "uxth r6, %[a]\n\t"
  149244. "uxth r7, %[b]\n\t"
  149245. #ifdef WOLFSSL_KEIL
  149246. "muls r7, r6, r7\n\t"
  149247. #elif defined(__clang__)
  149248. "muls r7, r6\n\t"
  149249. #else
  149250. "mul r7, r6\n\t"
  149251. #endif
  149252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149253. "adds r5, r5, r7\n\t"
  149254. #else
  149255. "add r5, r5, r7\n\t"
  149256. #endif
  149257. #ifdef WOLFSSL_KEIL
  149258. "adcs r3, r3, %[r]\n\t"
  149259. #elif defined(__clang__)
  149260. "adcs r3, %[r]\n\t"
  149261. #else
  149262. "adc r3, %[r]\n\t"
  149263. #endif
  149264. #ifdef WOLFSSL_KEIL
  149265. "adcs r4, r4, %[r]\n\t"
  149266. #elif defined(__clang__)
  149267. "adcs r4, %[r]\n\t"
  149268. #else
  149269. "adc r4, %[r]\n\t"
  149270. #endif
  149271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149272. "lsrs r7, %[b], #16\n\t"
  149273. #else
  149274. "lsr r7, %[b], #16\n\t"
  149275. #endif
  149276. #ifdef WOLFSSL_KEIL
  149277. "muls r6, r7, r6\n\t"
  149278. #elif defined(__clang__)
  149279. "muls r6, r7\n\t"
  149280. #else
  149281. "mul r6, r7\n\t"
  149282. #endif
  149283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149284. "lsrs r7, r6, #16\n\t"
  149285. #else
  149286. "lsr r7, r6, #16\n\t"
  149287. #endif
  149288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149289. "lsls r6, r6, #16\n\t"
  149290. #else
  149291. "lsl r6, r6, #16\n\t"
  149292. #endif
  149293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149294. "adds r5, r5, r6\n\t"
  149295. #else
  149296. "add r5, r5, r6\n\t"
  149297. #endif
  149298. #ifdef WOLFSSL_KEIL
  149299. "adcs r3, r3, r7\n\t"
  149300. #elif defined(__clang__)
  149301. "adcs r3, r7\n\t"
  149302. #else
  149303. "adc r3, r7\n\t"
  149304. #endif
  149305. #ifdef WOLFSSL_KEIL
  149306. "adcs r4, r4, %[r]\n\t"
  149307. #elif defined(__clang__)
  149308. "adcs r4, %[r]\n\t"
  149309. #else
  149310. "adc r4, %[r]\n\t"
  149311. #endif
  149312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149313. "lsrs r6, %[a], #16\n\t"
  149314. #else
  149315. "lsr r6, %[a], #16\n\t"
  149316. #endif
  149317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149318. "lsrs r7, %[b], #16\n\t"
  149319. #else
  149320. "lsr r7, %[b], #16\n\t"
  149321. #endif
  149322. #ifdef WOLFSSL_KEIL
  149323. "muls r7, r6, r7\n\t"
  149324. #elif defined(__clang__)
  149325. "muls r7, r6\n\t"
  149326. #else
  149327. "mul r7, r6\n\t"
  149328. #endif
  149329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149330. "adds r3, r3, r7\n\t"
  149331. #else
  149332. "add r3, r3, r7\n\t"
  149333. #endif
  149334. #ifdef WOLFSSL_KEIL
  149335. "adcs r4, r4, %[r]\n\t"
  149336. #elif defined(__clang__)
  149337. "adcs r4, %[r]\n\t"
  149338. #else
  149339. "adc r4, %[r]\n\t"
  149340. #endif
  149341. "uxth r7, %[b]\n\t"
  149342. #ifdef WOLFSSL_KEIL
  149343. "muls r6, r7, r6\n\t"
  149344. #elif defined(__clang__)
  149345. "muls r6, r7\n\t"
  149346. #else
  149347. "mul r6, r7\n\t"
  149348. #endif
  149349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149350. "lsrs r7, r6, #16\n\t"
  149351. #else
  149352. "lsr r7, r6, #16\n\t"
  149353. #endif
  149354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149355. "lsls r6, r6, #16\n\t"
  149356. #else
  149357. "lsl r6, r6, #16\n\t"
  149358. #endif
  149359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149360. "adds r5, r5, r6\n\t"
  149361. #else
  149362. "add r5, r5, r6\n\t"
  149363. #endif
  149364. #ifdef WOLFSSL_KEIL
  149365. "adcs r3, r3, r7\n\t"
  149366. #elif defined(__clang__)
  149367. "adcs r3, r7\n\t"
  149368. #else
  149369. "adc r3, r7\n\t"
  149370. #endif
  149371. #ifdef WOLFSSL_KEIL
  149372. "adcs r4, r4, %[r]\n\t"
  149373. #elif defined(__clang__)
  149374. "adcs r4, %[r]\n\t"
  149375. #else
  149376. "adc r4, %[r]\n\t"
  149377. #endif
  149378. "# A[10] * B[4]\n\t"
  149379. "mov %[a], r9\n\t"
  149380. "mov %[b], r10\n\t"
  149381. "ldr %[a], [%[a], #40]\n\t"
  149382. "ldr %[b], [%[b], #16]\n\t"
  149383. "uxth r6, %[a]\n\t"
  149384. "uxth r7, %[b]\n\t"
  149385. #ifdef WOLFSSL_KEIL
  149386. "muls r7, r6, r7\n\t"
  149387. #elif defined(__clang__)
  149388. "muls r7, r6\n\t"
  149389. #else
  149390. "mul r7, r6\n\t"
  149391. #endif
  149392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149393. "adds r5, r5, r7\n\t"
  149394. #else
  149395. "add r5, r5, r7\n\t"
  149396. #endif
  149397. #ifdef WOLFSSL_KEIL
  149398. "adcs r3, r3, %[r]\n\t"
  149399. #elif defined(__clang__)
  149400. "adcs r3, %[r]\n\t"
  149401. #else
  149402. "adc r3, %[r]\n\t"
  149403. #endif
  149404. #ifdef WOLFSSL_KEIL
  149405. "adcs r4, r4, %[r]\n\t"
  149406. #elif defined(__clang__)
  149407. "adcs r4, %[r]\n\t"
  149408. #else
  149409. "adc r4, %[r]\n\t"
  149410. #endif
  149411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149412. "lsrs r7, %[b], #16\n\t"
  149413. #else
  149414. "lsr r7, %[b], #16\n\t"
  149415. #endif
  149416. #ifdef WOLFSSL_KEIL
  149417. "muls r6, r7, r6\n\t"
  149418. #elif defined(__clang__)
  149419. "muls r6, r7\n\t"
  149420. #else
  149421. "mul r6, r7\n\t"
  149422. #endif
  149423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149424. "lsrs r7, r6, #16\n\t"
  149425. #else
  149426. "lsr r7, r6, #16\n\t"
  149427. #endif
  149428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149429. "lsls r6, r6, #16\n\t"
  149430. #else
  149431. "lsl r6, r6, #16\n\t"
  149432. #endif
  149433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149434. "adds r5, r5, r6\n\t"
  149435. #else
  149436. "add r5, r5, r6\n\t"
  149437. #endif
  149438. #ifdef WOLFSSL_KEIL
  149439. "adcs r3, r3, r7\n\t"
  149440. #elif defined(__clang__)
  149441. "adcs r3, r7\n\t"
  149442. #else
  149443. "adc r3, r7\n\t"
  149444. #endif
  149445. #ifdef WOLFSSL_KEIL
  149446. "adcs r4, r4, %[r]\n\t"
  149447. #elif defined(__clang__)
  149448. "adcs r4, %[r]\n\t"
  149449. #else
  149450. "adc r4, %[r]\n\t"
  149451. #endif
  149452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149453. "lsrs r6, %[a], #16\n\t"
  149454. #else
  149455. "lsr r6, %[a], #16\n\t"
  149456. #endif
  149457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149458. "lsrs r7, %[b], #16\n\t"
  149459. #else
  149460. "lsr r7, %[b], #16\n\t"
  149461. #endif
  149462. #ifdef WOLFSSL_KEIL
  149463. "muls r7, r6, r7\n\t"
  149464. #elif defined(__clang__)
  149465. "muls r7, r6\n\t"
  149466. #else
  149467. "mul r7, r6\n\t"
  149468. #endif
  149469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149470. "adds r3, r3, r7\n\t"
  149471. #else
  149472. "add r3, r3, r7\n\t"
  149473. #endif
  149474. #ifdef WOLFSSL_KEIL
  149475. "adcs r4, r4, %[r]\n\t"
  149476. #elif defined(__clang__)
  149477. "adcs r4, %[r]\n\t"
  149478. #else
  149479. "adc r4, %[r]\n\t"
  149480. #endif
  149481. "uxth r7, %[b]\n\t"
  149482. #ifdef WOLFSSL_KEIL
  149483. "muls r6, r7, r6\n\t"
  149484. #elif defined(__clang__)
  149485. "muls r6, r7\n\t"
  149486. #else
  149487. "mul r6, r7\n\t"
  149488. #endif
  149489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149490. "lsrs r7, r6, #16\n\t"
  149491. #else
  149492. "lsr r7, r6, #16\n\t"
  149493. #endif
  149494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149495. "lsls r6, r6, #16\n\t"
  149496. #else
  149497. "lsl r6, r6, #16\n\t"
  149498. #endif
  149499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149500. "adds r5, r5, r6\n\t"
  149501. #else
  149502. "add r5, r5, r6\n\t"
  149503. #endif
  149504. #ifdef WOLFSSL_KEIL
  149505. "adcs r3, r3, r7\n\t"
  149506. #elif defined(__clang__)
  149507. "adcs r3, r7\n\t"
  149508. #else
  149509. "adc r3, r7\n\t"
  149510. #endif
  149511. #ifdef WOLFSSL_KEIL
  149512. "adcs r4, r4, %[r]\n\t"
  149513. #elif defined(__clang__)
  149514. "adcs r4, %[r]\n\t"
  149515. #else
  149516. "adc r4, %[r]\n\t"
  149517. #endif
  149518. "# A[9] * B[5]\n\t"
  149519. "mov %[a], r9\n\t"
  149520. "mov %[b], r10\n\t"
  149521. "ldr %[a], [%[a], #36]\n\t"
  149522. "ldr %[b], [%[b], #20]\n\t"
  149523. "uxth r6, %[a]\n\t"
  149524. "uxth r7, %[b]\n\t"
  149525. #ifdef WOLFSSL_KEIL
  149526. "muls r7, r6, r7\n\t"
  149527. #elif defined(__clang__)
  149528. "muls r7, r6\n\t"
  149529. #else
  149530. "mul r7, r6\n\t"
  149531. #endif
  149532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149533. "adds r5, r5, r7\n\t"
  149534. #else
  149535. "add r5, r5, r7\n\t"
  149536. #endif
  149537. #ifdef WOLFSSL_KEIL
  149538. "adcs r3, r3, %[r]\n\t"
  149539. #elif defined(__clang__)
  149540. "adcs r3, %[r]\n\t"
  149541. #else
  149542. "adc r3, %[r]\n\t"
  149543. #endif
  149544. #ifdef WOLFSSL_KEIL
  149545. "adcs r4, r4, %[r]\n\t"
  149546. #elif defined(__clang__)
  149547. "adcs r4, %[r]\n\t"
  149548. #else
  149549. "adc r4, %[r]\n\t"
  149550. #endif
  149551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149552. "lsrs r7, %[b], #16\n\t"
  149553. #else
  149554. "lsr r7, %[b], #16\n\t"
  149555. #endif
  149556. #ifdef WOLFSSL_KEIL
  149557. "muls r6, r7, r6\n\t"
  149558. #elif defined(__clang__)
  149559. "muls r6, r7\n\t"
  149560. #else
  149561. "mul r6, r7\n\t"
  149562. #endif
  149563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149564. "lsrs r7, r6, #16\n\t"
  149565. #else
  149566. "lsr r7, r6, #16\n\t"
  149567. #endif
  149568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149569. "lsls r6, r6, #16\n\t"
  149570. #else
  149571. "lsl r6, r6, #16\n\t"
  149572. #endif
  149573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149574. "adds r5, r5, r6\n\t"
  149575. #else
  149576. "add r5, r5, r6\n\t"
  149577. #endif
  149578. #ifdef WOLFSSL_KEIL
  149579. "adcs r3, r3, r7\n\t"
  149580. #elif defined(__clang__)
  149581. "adcs r3, r7\n\t"
  149582. #else
  149583. "adc r3, r7\n\t"
  149584. #endif
  149585. #ifdef WOLFSSL_KEIL
  149586. "adcs r4, r4, %[r]\n\t"
  149587. #elif defined(__clang__)
  149588. "adcs r4, %[r]\n\t"
  149589. #else
  149590. "adc r4, %[r]\n\t"
  149591. #endif
  149592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149593. "lsrs r6, %[a], #16\n\t"
  149594. #else
  149595. "lsr r6, %[a], #16\n\t"
  149596. #endif
  149597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149598. "lsrs r7, %[b], #16\n\t"
  149599. #else
  149600. "lsr r7, %[b], #16\n\t"
  149601. #endif
  149602. #ifdef WOLFSSL_KEIL
  149603. "muls r7, r6, r7\n\t"
  149604. #elif defined(__clang__)
  149605. "muls r7, r6\n\t"
  149606. #else
  149607. "mul r7, r6\n\t"
  149608. #endif
  149609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149610. "adds r3, r3, r7\n\t"
  149611. #else
  149612. "add r3, r3, r7\n\t"
  149613. #endif
  149614. #ifdef WOLFSSL_KEIL
  149615. "adcs r4, r4, %[r]\n\t"
  149616. #elif defined(__clang__)
  149617. "adcs r4, %[r]\n\t"
  149618. #else
  149619. "adc r4, %[r]\n\t"
  149620. #endif
  149621. "uxth r7, %[b]\n\t"
  149622. #ifdef WOLFSSL_KEIL
  149623. "muls r6, r7, r6\n\t"
  149624. #elif defined(__clang__)
  149625. "muls r6, r7\n\t"
  149626. #else
  149627. "mul r6, r7\n\t"
  149628. #endif
  149629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149630. "lsrs r7, r6, #16\n\t"
  149631. #else
  149632. "lsr r7, r6, #16\n\t"
  149633. #endif
  149634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149635. "lsls r6, r6, #16\n\t"
  149636. #else
  149637. "lsl r6, r6, #16\n\t"
  149638. #endif
  149639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149640. "adds r5, r5, r6\n\t"
  149641. #else
  149642. "add r5, r5, r6\n\t"
  149643. #endif
  149644. #ifdef WOLFSSL_KEIL
  149645. "adcs r3, r3, r7\n\t"
  149646. #elif defined(__clang__)
  149647. "adcs r3, r7\n\t"
  149648. #else
  149649. "adc r3, r7\n\t"
  149650. #endif
  149651. #ifdef WOLFSSL_KEIL
  149652. "adcs r4, r4, %[r]\n\t"
  149653. #elif defined(__clang__)
  149654. "adcs r4, %[r]\n\t"
  149655. #else
  149656. "adc r4, %[r]\n\t"
  149657. #endif
  149658. "# A[8] * B[6]\n\t"
  149659. "mov %[a], r9\n\t"
  149660. "mov %[b], r10\n\t"
  149661. "ldr %[a], [%[a], #32]\n\t"
  149662. "ldr %[b], [%[b], #24]\n\t"
  149663. "uxth r6, %[a]\n\t"
  149664. "uxth r7, %[b]\n\t"
  149665. #ifdef WOLFSSL_KEIL
  149666. "muls r7, r6, r7\n\t"
  149667. #elif defined(__clang__)
  149668. "muls r7, r6\n\t"
  149669. #else
  149670. "mul r7, r6\n\t"
  149671. #endif
  149672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149673. "adds r5, r5, r7\n\t"
  149674. #else
  149675. "add r5, r5, r7\n\t"
  149676. #endif
  149677. #ifdef WOLFSSL_KEIL
  149678. "adcs r3, r3, %[r]\n\t"
  149679. #elif defined(__clang__)
  149680. "adcs r3, %[r]\n\t"
  149681. #else
  149682. "adc r3, %[r]\n\t"
  149683. #endif
  149684. #ifdef WOLFSSL_KEIL
  149685. "adcs r4, r4, %[r]\n\t"
  149686. #elif defined(__clang__)
  149687. "adcs r4, %[r]\n\t"
  149688. #else
  149689. "adc r4, %[r]\n\t"
  149690. #endif
  149691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149692. "lsrs r7, %[b], #16\n\t"
  149693. #else
  149694. "lsr r7, %[b], #16\n\t"
  149695. #endif
  149696. #ifdef WOLFSSL_KEIL
  149697. "muls r6, r7, r6\n\t"
  149698. #elif defined(__clang__)
  149699. "muls r6, r7\n\t"
  149700. #else
  149701. "mul r6, r7\n\t"
  149702. #endif
  149703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149704. "lsrs r7, r6, #16\n\t"
  149705. #else
  149706. "lsr r7, r6, #16\n\t"
  149707. #endif
  149708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149709. "lsls r6, r6, #16\n\t"
  149710. #else
  149711. "lsl r6, r6, #16\n\t"
  149712. #endif
  149713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149714. "adds r5, r5, r6\n\t"
  149715. #else
  149716. "add r5, r5, r6\n\t"
  149717. #endif
  149718. #ifdef WOLFSSL_KEIL
  149719. "adcs r3, r3, r7\n\t"
  149720. #elif defined(__clang__)
  149721. "adcs r3, r7\n\t"
  149722. #else
  149723. "adc r3, r7\n\t"
  149724. #endif
  149725. #ifdef WOLFSSL_KEIL
  149726. "adcs r4, r4, %[r]\n\t"
  149727. #elif defined(__clang__)
  149728. "adcs r4, %[r]\n\t"
  149729. #else
  149730. "adc r4, %[r]\n\t"
  149731. #endif
  149732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149733. "lsrs r6, %[a], #16\n\t"
  149734. #else
  149735. "lsr r6, %[a], #16\n\t"
  149736. #endif
  149737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149738. "lsrs r7, %[b], #16\n\t"
  149739. #else
  149740. "lsr r7, %[b], #16\n\t"
  149741. #endif
  149742. #ifdef WOLFSSL_KEIL
  149743. "muls r7, r6, r7\n\t"
  149744. #elif defined(__clang__)
  149745. "muls r7, r6\n\t"
  149746. #else
  149747. "mul r7, r6\n\t"
  149748. #endif
  149749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149750. "adds r3, r3, r7\n\t"
  149751. #else
  149752. "add r3, r3, r7\n\t"
  149753. #endif
  149754. #ifdef WOLFSSL_KEIL
  149755. "adcs r4, r4, %[r]\n\t"
  149756. #elif defined(__clang__)
  149757. "adcs r4, %[r]\n\t"
  149758. #else
  149759. "adc r4, %[r]\n\t"
  149760. #endif
  149761. "uxth r7, %[b]\n\t"
  149762. #ifdef WOLFSSL_KEIL
  149763. "muls r6, r7, r6\n\t"
  149764. #elif defined(__clang__)
  149765. "muls r6, r7\n\t"
  149766. #else
  149767. "mul r6, r7\n\t"
  149768. #endif
  149769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149770. "lsrs r7, r6, #16\n\t"
  149771. #else
  149772. "lsr r7, r6, #16\n\t"
  149773. #endif
  149774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149775. "lsls r6, r6, #16\n\t"
  149776. #else
  149777. "lsl r6, r6, #16\n\t"
  149778. #endif
  149779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149780. "adds r5, r5, r6\n\t"
  149781. #else
  149782. "add r5, r5, r6\n\t"
  149783. #endif
  149784. #ifdef WOLFSSL_KEIL
  149785. "adcs r3, r3, r7\n\t"
  149786. #elif defined(__clang__)
  149787. "adcs r3, r7\n\t"
  149788. #else
  149789. "adc r3, r7\n\t"
  149790. #endif
  149791. #ifdef WOLFSSL_KEIL
  149792. "adcs r4, r4, %[r]\n\t"
  149793. #elif defined(__clang__)
  149794. "adcs r4, %[r]\n\t"
  149795. #else
  149796. "adc r4, %[r]\n\t"
  149797. #endif
  149798. "# A[7] * B[7]\n\t"
  149799. "mov %[a], r9\n\t"
  149800. "mov %[b], r10\n\t"
  149801. "ldr %[a], [%[a], #28]\n\t"
  149802. "ldr %[b], [%[b], #28]\n\t"
  149803. "uxth r6, %[a]\n\t"
  149804. "uxth r7, %[b]\n\t"
  149805. #ifdef WOLFSSL_KEIL
  149806. "muls r7, r6, r7\n\t"
  149807. #elif defined(__clang__)
  149808. "muls r7, r6\n\t"
  149809. #else
  149810. "mul r7, r6\n\t"
  149811. #endif
  149812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149813. "adds r5, r5, r7\n\t"
  149814. #else
  149815. "add r5, r5, r7\n\t"
  149816. #endif
  149817. #ifdef WOLFSSL_KEIL
  149818. "adcs r3, r3, %[r]\n\t"
  149819. #elif defined(__clang__)
  149820. "adcs r3, %[r]\n\t"
  149821. #else
  149822. "adc r3, %[r]\n\t"
  149823. #endif
  149824. #ifdef WOLFSSL_KEIL
  149825. "adcs r4, r4, %[r]\n\t"
  149826. #elif defined(__clang__)
  149827. "adcs r4, %[r]\n\t"
  149828. #else
  149829. "adc r4, %[r]\n\t"
  149830. #endif
  149831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149832. "lsrs r7, %[b], #16\n\t"
  149833. #else
  149834. "lsr r7, %[b], #16\n\t"
  149835. #endif
  149836. #ifdef WOLFSSL_KEIL
  149837. "muls r6, r7, r6\n\t"
  149838. #elif defined(__clang__)
  149839. "muls r6, r7\n\t"
  149840. #else
  149841. "mul r6, r7\n\t"
  149842. #endif
  149843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149844. "lsrs r7, r6, #16\n\t"
  149845. #else
  149846. "lsr r7, r6, #16\n\t"
  149847. #endif
  149848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149849. "lsls r6, r6, #16\n\t"
  149850. #else
  149851. "lsl r6, r6, #16\n\t"
  149852. #endif
  149853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149854. "adds r5, r5, r6\n\t"
  149855. #else
  149856. "add r5, r5, r6\n\t"
  149857. #endif
  149858. #ifdef WOLFSSL_KEIL
  149859. "adcs r3, r3, r7\n\t"
  149860. #elif defined(__clang__)
  149861. "adcs r3, r7\n\t"
  149862. #else
  149863. "adc r3, r7\n\t"
  149864. #endif
  149865. #ifdef WOLFSSL_KEIL
  149866. "adcs r4, r4, %[r]\n\t"
  149867. #elif defined(__clang__)
  149868. "adcs r4, %[r]\n\t"
  149869. #else
  149870. "adc r4, %[r]\n\t"
  149871. #endif
  149872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149873. "lsrs r6, %[a], #16\n\t"
  149874. #else
  149875. "lsr r6, %[a], #16\n\t"
  149876. #endif
  149877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149878. "lsrs r7, %[b], #16\n\t"
  149879. #else
  149880. "lsr r7, %[b], #16\n\t"
  149881. #endif
  149882. #ifdef WOLFSSL_KEIL
  149883. "muls r7, r6, r7\n\t"
  149884. #elif defined(__clang__)
  149885. "muls r7, r6\n\t"
  149886. #else
  149887. "mul r7, r6\n\t"
  149888. #endif
  149889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149890. "adds r3, r3, r7\n\t"
  149891. #else
  149892. "add r3, r3, r7\n\t"
  149893. #endif
  149894. #ifdef WOLFSSL_KEIL
  149895. "adcs r4, r4, %[r]\n\t"
  149896. #elif defined(__clang__)
  149897. "adcs r4, %[r]\n\t"
  149898. #else
  149899. "adc r4, %[r]\n\t"
  149900. #endif
  149901. "uxth r7, %[b]\n\t"
  149902. #ifdef WOLFSSL_KEIL
  149903. "muls r6, r7, r6\n\t"
  149904. #elif defined(__clang__)
  149905. "muls r6, r7\n\t"
  149906. #else
  149907. "mul r6, r7\n\t"
  149908. #endif
  149909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149910. "lsrs r7, r6, #16\n\t"
  149911. #else
  149912. "lsr r7, r6, #16\n\t"
  149913. #endif
  149914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149915. "lsls r6, r6, #16\n\t"
  149916. #else
  149917. "lsl r6, r6, #16\n\t"
  149918. #endif
  149919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149920. "adds r5, r5, r6\n\t"
  149921. #else
  149922. "add r5, r5, r6\n\t"
  149923. #endif
  149924. #ifdef WOLFSSL_KEIL
  149925. "adcs r3, r3, r7\n\t"
  149926. #elif defined(__clang__)
  149927. "adcs r3, r7\n\t"
  149928. #else
  149929. "adc r3, r7\n\t"
  149930. #endif
  149931. #ifdef WOLFSSL_KEIL
  149932. "adcs r4, r4, %[r]\n\t"
  149933. #elif defined(__clang__)
  149934. "adcs r4, %[r]\n\t"
  149935. #else
  149936. "adc r4, %[r]\n\t"
  149937. #endif
  149938. "# A[6] * B[8]\n\t"
  149939. "mov %[a], r9\n\t"
  149940. "mov %[b], r10\n\t"
  149941. "ldr %[a], [%[a], #24]\n\t"
  149942. "ldr %[b], [%[b], #32]\n\t"
  149943. "uxth r6, %[a]\n\t"
  149944. "uxth r7, %[b]\n\t"
  149945. #ifdef WOLFSSL_KEIL
  149946. "muls r7, r6, r7\n\t"
  149947. #elif defined(__clang__)
  149948. "muls r7, r6\n\t"
  149949. #else
  149950. "mul r7, r6\n\t"
  149951. #endif
  149952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149953. "adds r5, r5, r7\n\t"
  149954. #else
  149955. "add r5, r5, r7\n\t"
  149956. #endif
  149957. #ifdef WOLFSSL_KEIL
  149958. "adcs r3, r3, %[r]\n\t"
  149959. #elif defined(__clang__)
  149960. "adcs r3, %[r]\n\t"
  149961. #else
  149962. "adc r3, %[r]\n\t"
  149963. #endif
  149964. #ifdef WOLFSSL_KEIL
  149965. "adcs r4, r4, %[r]\n\t"
  149966. #elif defined(__clang__)
  149967. "adcs r4, %[r]\n\t"
  149968. #else
  149969. "adc r4, %[r]\n\t"
  149970. #endif
  149971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149972. "lsrs r7, %[b], #16\n\t"
  149973. #else
  149974. "lsr r7, %[b], #16\n\t"
  149975. #endif
  149976. #ifdef WOLFSSL_KEIL
  149977. "muls r6, r7, r6\n\t"
  149978. #elif defined(__clang__)
  149979. "muls r6, r7\n\t"
  149980. #else
  149981. "mul r6, r7\n\t"
  149982. #endif
  149983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149984. "lsrs r7, r6, #16\n\t"
  149985. #else
  149986. "lsr r7, r6, #16\n\t"
  149987. #endif
  149988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149989. "lsls r6, r6, #16\n\t"
  149990. #else
  149991. "lsl r6, r6, #16\n\t"
  149992. #endif
  149993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  149994. "adds r5, r5, r6\n\t"
  149995. #else
  149996. "add r5, r5, r6\n\t"
  149997. #endif
  149998. #ifdef WOLFSSL_KEIL
  149999. "adcs r3, r3, r7\n\t"
  150000. #elif defined(__clang__)
  150001. "adcs r3, r7\n\t"
  150002. #else
  150003. "adc r3, r7\n\t"
  150004. #endif
  150005. #ifdef WOLFSSL_KEIL
  150006. "adcs r4, r4, %[r]\n\t"
  150007. #elif defined(__clang__)
  150008. "adcs r4, %[r]\n\t"
  150009. #else
  150010. "adc r4, %[r]\n\t"
  150011. #endif
  150012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150013. "lsrs r6, %[a], #16\n\t"
  150014. #else
  150015. "lsr r6, %[a], #16\n\t"
  150016. #endif
  150017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150018. "lsrs r7, %[b], #16\n\t"
  150019. #else
  150020. "lsr r7, %[b], #16\n\t"
  150021. #endif
  150022. #ifdef WOLFSSL_KEIL
  150023. "muls r7, r6, r7\n\t"
  150024. #elif defined(__clang__)
  150025. "muls r7, r6\n\t"
  150026. #else
  150027. "mul r7, r6\n\t"
  150028. #endif
  150029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150030. "adds r3, r3, r7\n\t"
  150031. #else
  150032. "add r3, r3, r7\n\t"
  150033. #endif
  150034. #ifdef WOLFSSL_KEIL
  150035. "adcs r4, r4, %[r]\n\t"
  150036. #elif defined(__clang__)
  150037. "adcs r4, %[r]\n\t"
  150038. #else
  150039. "adc r4, %[r]\n\t"
  150040. #endif
  150041. "uxth r7, %[b]\n\t"
  150042. #ifdef WOLFSSL_KEIL
  150043. "muls r6, r7, r6\n\t"
  150044. #elif defined(__clang__)
  150045. "muls r6, r7\n\t"
  150046. #else
  150047. "mul r6, r7\n\t"
  150048. #endif
  150049. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150050. "lsrs r7, r6, #16\n\t"
  150051. #else
  150052. "lsr r7, r6, #16\n\t"
  150053. #endif
  150054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150055. "lsls r6, r6, #16\n\t"
  150056. #else
  150057. "lsl r6, r6, #16\n\t"
  150058. #endif
  150059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150060. "adds r5, r5, r6\n\t"
  150061. #else
  150062. "add r5, r5, r6\n\t"
  150063. #endif
  150064. #ifdef WOLFSSL_KEIL
  150065. "adcs r3, r3, r7\n\t"
  150066. #elif defined(__clang__)
  150067. "adcs r3, r7\n\t"
  150068. #else
  150069. "adc r3, r7\n\t"
  150070. #endif
  150071. #ifdef WOLFSSL_KEIL
  150072. "adcs r4, r4, %[r]\n\t"
  150073. #elif defined(__clang__)
  150074. "adcs r4, %[r]\n\t"
  150075. #else
  150076. "adc r4, %[r]\n\t"
  150077. #endif
  150078. "# A[5] * B[9]\n\t"
  150079. "mov %[a], r9\n\t"
  150080. "mov %[b], r10\n\t"
  150081. "ldr %[a], [%[a], #20]\n\t"
  150082. "ldr %[b], [%[b], #36]\n\t"
  150083. "uxth r6, %[a]\n\t"
  150084. "uxth r7, %[b]\n\t"
  150085. #ifdef WOLFSSL_KEIL
  150086. "muls r7, r6, r7\n\t"
  150087. #elif defined(__clang__)
  150088. "muls r7, r6\n\t"
  150089. #else
  150090. "mul r7, r6\n\t"
  150091. #endif
  150092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150093. "adds r5, r5, r7\n\t"
  150094. #else
  150095. "add r5, r5, r7\n\t"
  150096. #endif
  150097. #ifdef WOLFSSL_KEIL
  150098. "adcs r3, r3, %[r]\n\t"
  150099. #elif defined(__clang__)
  150100. "adcs r3, %[r]\n\t"
  150101. #else
  150102. "adc r3, %[r]\n\t"
  150103. #endif
  150104. #ifdef WOLFSSL_KEIL
  150105. "adcs r4, r4, %[r]\n\t"
  150106. #elif defined(__clang__)
  150107. "adcs r4, %[r]\n\t"
  150108. #else
  150109. "adc r4, %[r]\n\t"
  150110. #endif
  150111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150112. "lsrs r7, %[b], #16\n\t"
  150113. #else
  150114. "lsr r7, %[b], #16\n\t"
  150115. #endif
  150116. #ifdef WOLFSSL_KEIL
  150117. "muls r6, r7, r6\n\t"
  150118. #elif defined(__clang__)
  150119. "muls r6, r7\n\t"
  150120. #else
  150121. "mul r6, r7\n\t"
  150122. #endif
  150123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150124. "lsrs r7, r6, #16\n\t"
  150125. #else
  150126. "lsr r7, r6, #16\n\t"
  150127. #endif
  150128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150129. "lsls r6, r6, #16\n\t"
  150130. #else
  150131. "lsl r6, r6, #16\n\t"
  150132. #endif
  150133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150134. "adds r5, r5, r6\n\t"
  150135. #else
  150136. "add r5, r5, r6\n\t"
  150137. #endif
  150138. #ifdef WOLFSSL_KEIL
  150139. "adcs r3, r3, r7\n\t"
  150140. #elif defined(__clang__)
  150141. "adcs r3, r7\n\t"
  150142. #else
  150143. "adc r3, r7\n\t"
  150144. #endif
  150145. #ifdef WOLFSSL_KEIL
  150146. "adcs r4, r4, %[r]\n\t"
  150147. #elif defined(__clang__)
  150148. "adcs r4, %[r]\n\t"
  150149. #else
  150150. "adc r4, %[r]\n\t"
  150151. #endif
  150152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150153. "lsrs r6, %[a], #16\n\t"
  150154. #else
  150155. "lsr r6, %[a], #16\n\t"
  150156. #endif
  150157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150158. "lsrs r7, %[b], #16\n\t"
  150159. #else
  150160. "lsr r7, %[b], #16\n\t"
  150161. #endif
  150162. #ifdef WOLFSSL_KEIL
  150163. "muls r7, r6, r7\n\t"
  150164. #elif defined(__clang__)
  150165. "muls r7, r6\n\t"
  150166. #else
  150167. "mul r7, r6\n\t"
  150168. #endif
  150169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150170. "adds r3, r3, r7\n\t"
  150171. #else
  150172. "add r3, r3, r7\n\t"
  150173. #endif
  150174. #ifdef WOLFSSL_KEIL
  150175. "adcs r4, r4, %[r]\n\t"
  150176. #elif defined(__clang__)
  150177. "adcs r4, %[r]\n\t"
  150178. #else
  150179. "adc r4, %[r]\n\t"
  150180. #endif
  150181. "uxth r7, %[b]\n\t"
  150182. #ifdef WOLFSSL_KEIL
  150183. "muls r6, r7, r6\n\t"
  150184. #elif defined(__clang__)
  150185. "muls r6, r7\n\t"
  150186. #else
  150187. "mul r6, r7\n\t"
  150188. #endif
  150189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150190. "lsrs r7, r6, #16\n\t"
  150191. #else
  150192. "lsr r7, r6, #16\n\t"
  150193. #endif
  150194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150195. "lsls r6, r6, #16\n\t"
  150196. #else
  150197. "lsl r6, r6, #16\n\t"
  150198. #endif
  150199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150200. "adds r5, r5, r6\n\t"
  150201. #else
  150202. "add r5, r5, r6\n\t"
  150203. #endif
  150204. #ifdef WOLFSSL_KEIL
  150205. "adcs r3, r3, r7\n\t"
  150206. #elif defined(__clang__)
  150207. "adcs r3, r7\n\t"
  150208. #else
  150209. "adc r3, r7\n\t"
  150210. #endif
  150211. #ifdef WOLFSSL_KEIL
  150212. "adcs r4, r4, %[r]\n\t"
  150213. #elif defined(__clang__)
  150214. "adcs r4, %[r]\n\t"
  150215. #else
  150216. "adc r4, %[r]\n\t"
  150217. #endif
  150218. "# A[4] * B[10]\n\t"
  150219. "mov %[a], r9\n\t"
  150220. "mov %[b], r10\n\t"
  150221. "ldr %[a], [%[a], #16]\n\t"
  150222. "ldr %[b], [%[b], #40]\n\t"
  150223. "uxth r6, %[a]\n\t"
  150224. "uxth r7, %[b]\n\t"
  150225. #ifdef WOLFSSL_KEIL
  150226. "muls r7, r6, r7\n\t"
  150227. #elif defined(__clang__)
  150228. "muls r7, r6\n\t"
  150229. #else
  150230. "mul r7, r6\n\t"
  150231. #endif
  150232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150233. "adds r5, r5, r7\n\t"
  150234. #else
  150235. "add r5, r5, r7\n\t"
  150236. #endif
  150237. #ifdef WOLFSSL_KEIL
  150238. "adcs r3, r3, %[r]\n\t"
  150239. #elif defined(__clang__)
  150240. "adcs r3, %[r]\n\t"
  150241. #else
  150242. "adc r3, %[r]\n\t"
  150243. #endif
  150244. #ifdef WOLFSSL_KEIL
  150245. "adcs r4, r4, %[r]\n\t"
  150246. #elif defined(__clang__)
  150247. "adcs r4, %[r]\n\t"
  150248. #else
  150249. "adc r4, %[r]\n\t"
  150250. #endif
  150251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150252. "lsrs r7, %[b], #16\n\t"
  150253. #else
  150254. "lsr r7, %[b], #16\n\t"
  150255. #endif
  150256. #ifdef WOLFSSL_KEIL
  150257. "muls r6, r7, r6\n\t"
  150258. #elif defined(__clang__)
  150259. "muls r6, r7\n\t"
  150260. #else
  150261. "mul r6, r7\n\t"
  150262. #endif
  150263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150264. "lsrs r7, r6, #16\n\t"
  150265. #else
  150266. "lsr r7, r6, #16\n\t"
  150267. #endif
  150268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150269. "lsls r6, r6, #16\n\t"
  150270. #else
  150271. "lsl r6, r6, #16\n\t"
  150272. #endif
  150273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150274. "adds r5, r5, r6\n\t"
  150275. #else
  150276. "add r5, r5, r6\n\t"
  150277. #endif
  150278. #ifdef WOLFSSL_KEIL
  150279. "adcs r3, r3, r7\n\t"
  150280. #elif defined(__clang__)
  150281. "adcs r3, r7\n\t"
  150282. #else
  150283. "adc r3, r7\n\t"
  150284. #endif
  150285. #ifdef WOLFSSL_KEIL
  150286. "adcs r4, r4, %[r]\n\t"
  150287. #elif defined(__clang__)
  150288. "adcs r4, %[r]\n\t"
  150289. #else
  150290. "adc r4, %[r]\n\t"
  150291. #endif
  150292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150293. "lsrs r6, %[a], #16\n\t"
  150294. #else
  150295. "lsr r6, %[a], #16\n\t"
  150296. #endif
  150297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150298. "lsrs r7, %[b], #16\n\t"
  150299. #else
  150300. "lsr r7, %[b], #16\n\t"
  150301. #endif
  150302. #ifdef WOLFSSL_KEIL
  150303. "muls r7, r6, r7\n\t"
  150304. #elif defined(__clang__)
  150305. "muls r7, r6\n\t"
  150306. #else
  150307. "mul r7, r6\n\t"
  150308. #endif
  150309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150310. "adds r3, r3, r7\n\t"
  150311. #else
  150312. "add r3, r3, r7\n\t"
  150313. #endif
  150314. #ifdef WOLFSSL_KEIL
  150315. "adcs r4, r4, %[r]\n\t"
  150316. #elif defined(__clang__)
  150317. "adcs r4, %[r]\n\t"
  150318. #else
  150319. "adc r4, %[r]\n\t"
  150320. #endif
  150321. "uxth r7, %[b]\n\t"
  150322. #ifdef WOLFSSL_KEIL
  150323. "muls r6, r7, r6\n\t"
  150324. #elif defined(__clang__)
  150325. "muls r6, r7\n\t"
  150326. #else
  150327. "mul r6, r7\n\t"
  150328. #endif
  150329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150330. "lsrs r7, r6, #16\n\t"
  150331. #else
  150332. "lsr r7, r6, #16\n\t"
  150333. #endif
  150334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150335. "lsls r6, r6, #16\n\t"
  150336. #else
  150337. "lsl r6, r6, #16\n\t"
  150338. #endif
  150339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150340. "adds r5, r5, r6\n\t"
  150341. #else
  150342. "add r5, r5, r6\n\t"
  150343. #endif
  150344. #ifdef WOLFSSL_KEIL
  150345. "adcs r3, r3, r7\n\t"
  150346. #elif defined(__clang__)
  150347. "adcs r3, r7\n\t"
  150348. #else
  150349. "adc r3, r7\n\t"
  150350. #endif
  150351. #ifdef WOLFSSL_KEIL
  150352. "adcs r4, r4, %[r]\n\t"
  150353. #elif defined(__clang__)
  150354. "adcs r4, %[r]\n\t"
  150355. #else
  150356. "adc r4, %[r]\n\t"
  150357. #endif
  150358. "# A[3] * B[11]\n\t"
  150359. "mov %[a], r9\n\t"
  150360. "mov %[b], r10\n\t"
  150361. "ldr %[a], [%[a], #12]\n\t"
  150362. "ldr %[b], [%[b], #44]\n\t"
  150363. "uxth r6, %[a]\n\t"
  150364. "uxth r7, %[b]\n\t"
  150365. #ifdef WOLFSSL_KEIL
  150366. "muls r7, r6, r7\n\t"
  150367. #elif defined(__clang__)
  150368. "muls r7, r6\n\t"
  150369. #else
  150370. "mul r7, r6\n\t"
  150371. #endif
  150372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150373. "adds r5, r5, r7\n\t"
  150374. #else
  150375. "add r5, r5, r7\n\t"
  150376. #endif
  150377. #ifdef WOLFSSL_KEIL
  150378. "adcs r3, r3, %[r]\n\t"
  150379. #elif defined(__clang__)
  150380. "adcs r3, %[r]\n\t"
  150381. #else
  150382. "adc r3, %[r]\n\t"
  150383. #endif
  150384. #ifdef WOLFSSL_KEIL
  150385. "adcs r4, r4, %[r]\n\t"
  150386. #elif defined(__clang__)
  150387. "adcs r4, %[r]\n\t"
  150388. #else
  150389. "adc r4, %[r]\n\t"
  150390. #endif
  150391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150392. "lsrs r7, %[b], #16\n\t"
  150393. #else
  150394. "lsr r7, %[b], #16\n\t"
  150395. #endif
  150396. #ifdef WOLFSSL_KEIL
  150397. "muls r6, r7, r6\n\t"
  150398. #elif defined(__clang__)
  150399. "muls r6, r7\n\t"
  150400. #else
  150401. "mul r6, r7\n\t"
  150402. #endif
  150403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150404. "lsrs r7, r6, #16\n\t"
  150405. #else
  150406. "lsr r7, r6, #16\n\t"
  150407. #endif
  150408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150409. "lsls r6, r6, #16\n\t"
  150410. #else
  150411. "lsl r6, r6, #16\n\t"
  150412. #endif
  150413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150414. "adds r5, r5, r6\n\t"
  150415. #else
  150416. "add r5, r5, r6\n\t"
  150417. #endif
  150418. #ifdef WOLFSSL_KEIL
  150419. "adcs r3, r3, r7\n\t"
  150420. #elif defined(__clang__)
  150421. "adcs r3, r7\n\t"
  150422. #else
  150423. "adc r3, r7\n\t"
  150424. #endif
  150425. #ifdef WOLFSSL_KEIL
  150426. "adcs r4, r4, %[r]\n\t"
  150427. #elif defined(__clang__)
  150428. "adcs r4, %[r]\n\t"
  150429. #else
  150430. "adc r4, %[r]\n\t"
  150431. #endif
  150432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150433. "lsrs r6, %[a], #16\n\t"
  150434. #else
  150435. "lsr r6, %[a], #16\n\t"
  150436. #endif
  150437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150438. "lsrs r7, %[b], #16\n\t"
  150439. #else
  150440. "lsr r7, %[b], #16\n\t"
  150441. #endif
  150442. #ifdef WOLFSSL_KEIL
  150443. "muls r7, r6, r7\n\t"
  150444. #elif defined(__clang__)
  150445. "muls r7, r6\n\t"
  150446. #else
  150447. "mul r7, r6\n\t"
  150448. #endif
  150449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150450. "adds r3, r3, r7\n\t"
  150451. #else
  150452. "add r3, r3, r7\n\t"
  150453. #endif
  150454. #ifdef WOLFSSL_KEIL
  150455. "adcs r4, r4, %[r]\n\t"
  150456. #elif defined(__clang__)
  150457. "adcs r4, %[r]\n\t"
  150458. #else
  150459. "adc r4, %[r]\n\t"
  150460. #endif
  150461. "uxth r7, %[b]\n\t"
  150462. #ifdef WOLFSSL_KEIL
  150463. "muls r6, r7, r6\n\t"
  150464. #elif defined(__clang__)
  150465. "muls r6, r7\n\t"
  150466. #else
  150467. "mul r6, r7\n\t"
  150468. #endif
  150469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150470. "lsrs r7, r6, #16\n\t"
  150471. #else
  150472. "lsr r7, r6, #16\n\t"
  150473. #endif
  150474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150475. "lsls r6, r6, #16\n\t"
  150476. #else
  150477. "lsl r6, r6, #16\n\t"
  150478. #endif
  150479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150480. "adds r5, r5, r6\n\t"
  150481. #else
  150482. "add r5, r5, r6\n\t"
  150483. #endif
  150484. #ifdef WOLFSSL_KEIL
  150485. "adcs r3, r3, r7\n\t"
  150486. #elif defined(__clang__)
  150487. "adcs r3, r7\n\t"
  150488. #else
  150489. "adc r3, r7\n\t"
  150490. #endif
  150491. #ifdef WOLFSSL_KEIL
  150492. "adcs r4, r4, %[r]\n\t"
  150493. #elif defined(__clang__)
  150494. "adcs r4, %[r]\n\t"
  150495. #else
  150496. "adc r4, %[r]\n\t"
  150497. #endif
  150498. "# A[2] * B[12]\n\t"
  150499. "mov %[a], r9\n\t"
  150500. "mov %[b], r10\n\t"
  150501. "ldr %[a], [%[a], #8]\n\t"
  150502. "ldr %[b], [%[b], #48]\n\t"
  150503. "uxth r6, %[a]\n\t"
  150504. "uxth r7, %[b]\n\t"
  150505. #ifdef WOLFSSL_KEIL
  150506. "muls r7, r6, r7\n\t"
  150507. #elif defined(__clang__)
  150508. "muls r7, r6\n\t"
  150509. #else
  150510. "mul r7, r6\n\t"
  150511. #endif
  150512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150513. "adds r5, r5, r7\n\t"
  150514. #else
  150515. "add r5, r5, r7\n\t"
  150516. #endif
  150517. #ifdef WOLFSSL_KEIL
  150518. "adcs r3, r3, %[r]\n\t"
  150519. #elif defined(__clang__)
  150520. "adcs r3, %[r]\n\t"
  150521. #else
  150522. "adc r3, %[r]\n\t"
  150523. #endif
  150524. #ifdef WOLFSSL_KEIL
  150525. "adcs r4, r4, %[r]\n\t"
  150526. #elif defined(__clang__)
  150527. "adcs r4, %[r]\n\t"
  150528. #else
  150529. "adc r4, %[r]\n\t"
  150530. #endif
  150531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150532. "lsrs r7, %[b], #16\n\t"
  150533. #else
  150534. "lsr r7, %[b], #16\n\t"
  150535. #endif
  150536. #ifdef WOLFSSL_KEIL
  150537. "muls r6, r7, r6\n\t"
  150538. #elif defined(__clang__)
  150539. "muls r6, r7\n\t"
  150540. #else
  150541. "mul r6, r7\n\t"
  150542. #endif
  150543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150544. "lsrs r7, r6, #16\n\t"
  150545. #else
  150546. "lsr r7, r6, #16\n\t"
  150547. #endif
  150548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150549. "lsls r6, r6, #16\n\t"
  150550. #else
  150551. "lsl r6, r6, #16\n\t"
  150552. #endif
  150553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150554. "adds r5, r5, r6\n\t"
  150555. #else
  150556. "add r5, r5, r6\n\t"
  150557. #endif
  150558. #ifdef WOLFSSL_KEIL
  150559. "adcs r3, r3, r7\n\t"
  150560. #elif defined(__clang__)
  150561. "adcs r3, r7\n\t"
  150562. #else
  150563. "adc r3, r7\n\t"
  150564. #endif
  150565. #ifdef WOLFSSL_KEIL
  150566. "adcs r4, r4, %[r]\n\t"
  150567. #elif defined(__clang__)
  150568. "adcs r4, %[r]\n\t"
  150569. #else
  150570. "adc r4, %[r]\n\t"
  150571. #endif
  150572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150573. "lsrs r6, %[a], #16\n\t"
  150574. #else
  150575. "lsr r6, %[a], #16\n\t"
  150576. #endif
  150577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150578. "lsrs r7, %[b], #16\n\t"
  150579. #else
  150580. "lsr r7, %[b], #16\n\t"
  150581. #endif
  150582. #ifdef WOLFSSL_KEIL
  150583. "muls r7, r6, r7\n\t"
  150584. #elif defined(__clang__)
  150585. "muls r7, r6\n\t"
  150586. #else
  150587. "mul r7, r6\n\t"
  150588. #endif
  150589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150590. "adds r3, r3, r7\n\t"
  150591. #else
  150592. "add r3, r3, r7\n\t"
  150593. #endif
  150594. #ifdef WOLFSSL_KEIL
  150595. "adcs r4, r4, %[r]\n\t"
  150596. #elif defined(__clang__)
  150597. "adcs r4, %[r]\n\t"
  150598. #else
  150599. "adc r4, %[r]\n\t"
  150600. #endif
  150601. "uxth r7, %[b]\n\t"
  150602. #ifdef WOLFSSL_KEIL
  150603. "muls r6, r7, r6\n\t"
  150604. #elif defined(__clang__)
  150605. "muls r6, r7\n\t"
  150606. #else
  150607. "mul r6, r7\n\t"
  150608. #endif
  150609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150610. "lsrs r7, r6, #16\n\t"
  150611. #else
  150612. "lsr r7, r6, #16\n\t"
  150613. #endif
  150614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150615. "lsls r6, r6, #16\n\t"
  150616. #else
  150617. "lsl r6, r6, #16\n\t"
  150618. #endif
  150619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150620. "adds r5, r5, r6\n\t"
  150621. #else
  150622. "add r5, r5, r6\n\t"
  150623. #endif
  150624. #ifdef WOLFSSL_KEIL
  150625. "adcs r3, r3, r7\n\t"
  150626. #elif defined(__clang__)
  150627. "adcs r3, r7\n\t"
  150628. #else
  150629. "adc r3, r7\n\t"
  150630. #endif
  150631. #ifdef WOLFSSL_KEIL
  150632. "adcs r4, r4, %[r]\n\t"
  150633. #elif defined(__clang__)
  150634. "adcs r4, %[r]\n\t"
  150635. #else
  150636. "adc r4, %[r]\n\t"
  150637. #endif
  150638. "# A[1] * B[13]\n\t"
  150639. "mov %[a], r9\n\t"
  150640. "mov %[b], r10\n\t"
  150641. "ldr %[a], [%[a], #4]\n\t"
  150642. "ldr %[b], [%[b], #52]\n\t"
  150643. "uxth r6, %[a]\n\t"
  150644. "uxth r7, %[b]\n\t"
  150645. #ifdef WOLFSSL_KEIL
  150646. "muls r7, r6, r7\n\t"
  150647. #elif defined(__clang__)
  150648. "muls r7, r6\n\t"
  150649. #else
  150650. "mul r7, r6\n\t"
  150651. #endif
  150652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150653. "adds r5, r5, r7\n\t"
  150654. #else
  150655. "add r5, r5, r7\n\t"
  150656. #endif
  150657. #ifdef WOLFSSL_KEIL
  150658. "adcs r3, r3, %[r]\n\t"
  150659. #elif defined(__clang__)
  150660. "adcs r3, %[r]\n\t"
  150661. #else
  150662. "adc r3, %[r]\n\t"
  150663. #endif
  150664. #ifdef WOLFSSL_KEIL
  150665. "adcs r4, r4, %[r]\n\t"
  150666. #elif defined(__clang__)
  150667. "adcs r4, %[r]\n\t"
  150668. #else
  150669. "adc r4, %[r]\n\t"
  150670. #endif
  150671. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150672. "lsrs r7, %[b], #16\n\t"
  150673. #else
  150674. "lsr r7, %[b], #16\n\t"
  150675. #endif
  150676. #ifdef WOLFSSL_KEIL
  150677. "muls r6, r7, r6\n\t"
  150678. #elif defined(__clang__)
  150679. "muls r6, r7\n\t"
  150680. #else
  150681. "mul r6, r7\n\t"
  150682. #endif
  150683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150684. "lsrs r7, r6, #16\n\t"
  150685. #else
  150686. "lsr r7, r6, #16\n\t"
  150687. #endif
  150688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150689. "lsls r6, r6, #16\n\t"
  150690. #else
  150691. "lsl r6, r6, #16\n\t"
  150692. #endif
  150693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150694. "adds r5, r5, r6\n\t"
  150695. #else
  150696. "add r5, r5, r6\n\t"
  150697. #endif
  150698. #ifdef WOLFSSL_KEIL
  150699. "adcs r3, r3, r7\n\t"
  150700. #elif defined(__clang__)
  150701. "adcs r3, r7\n\t"
  150702. #else
  150703. "adc r3, r7\n\t"
  150704. #endif
  150705. #ifdef WOLFSSL_KEIL
  150706. "adcs r4, r4, %[r]\n\t"
  150707. #elif defined(__clang__)
  150708. "adcs r4, %[r]\n\t"
  150709. #else
  150710. "adc r4, %[r]\n\t"
  150711. #endif
  150712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150713. "lsrs r6, %[a], #16\n\t"
  150714. #else
  150715. "lsr r6, %[a], #16\n\t"
  150716. #endif
  150717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150718. "lsrs r7, %[b], #16\n\t"
  150719. #else
  150720. "lsr r7, %[b], #16\n\t"
  150721. #endif
  150722. #ifdef WOLFSSL_KEIL
  150723. "muls r7, r6, r7\n\t"
  150724. #elif defined(__clang__)
  150725. "muls r7, r6\n\t"
  150726. #else
  150727. "mul r7, r6\n\t"
  150728. #endif
  150729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150730. "adds r3, r3, r7\n\t"
  150731. #else
  150732. "add r3, r3, r7\n\t"
  150733. #endif
  150734. #ifdef WOLFSSL_KEIL
  150735. "adcs r4, r4, %[r]\n\t"
  150736. #elif defined(__clang__)
  150737. "adcs r4, %[r]\n\t"
  150738. #else
  150739. "adc r4, %[r]\n\t"
  150740. #endif
  150741. "uxth r7, %[b]\n\t"
  150742. #ifdef WOLFSSL_KEIL
  150743. "muls r6, r7, r6\n\t"
  150744. #elif defined(__clang__)
  150745. "muls r6, r7\n\t"
  150746. #else
  150747. "mul r6, r7\n\t"
  150748. #endif
  150749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150750. "lsrs r7, r6, #16\n\t"
  150751. #else
  150752. "lsr r7, r6, #16\n\t"
  150753. #endif
  150754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150755. "lsls r6, r6, #16\n\t"
  150756. #else
  150757. "lsl r6, r6, #16\n\t"
  150758. #endif
  150759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150760. "adds r5, r5, r6\n\t"
  150761. #else
  150762. "add r5, r5, r6\n\t"
  150763. #endif
  150764. #ifdef WOLFSSL_KEIL
  150765. "adcs r3, r3, r7\n\t"
  150766. #elif defined(__clang__)
  150767. "adcs r3, r7\n\t"
  150768. #else
  150769. "adc r3, r7\n\t"
  150770. #endif
  150771. #ifdef WOLFSSL_KEIL
  150772. "adcs r4, r4, %[r]\n\t"
  150773. #elif defined(__clang__)
  150774. "adcs r4, %[r]\n\t"
  150775. #else
  150776. "adc r4, %[r]\n\t"
  150777. #endif
  150778. "# A[0] * B[14]\n\t"
  150779. "mov %[a], r9\n\t"
  150780. "mov %[b], r10\n\t"
  150781. "ldr %[a], [%[a]]\n\t"
  150782. "ldr %[b], [%[b], #56]\n\t"
  150783. "uxth r6, %[a]\n\t"
  150784. "uxth r7, %[b]\n\t"
  150785. #ifdef WOLFSSL_KEIL
  150786. "muls r7, r6, r7\n\t"
  150787. #elif defined(__clang__)
  150788. "muls r7, r6\n\t"
  150789. #else
  150790. "mul r7, r6\n\t"
  150791. #endif
  150792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150793. "adds r5, r5, r7\n\t"
  150794. #else
  150795. "add r5, r5, r7\n\t"
  150796. #endif
  150797. #ifdef WOLFSSL_KEIL
  150798. "adcs r3, r3, %[r]\n\t"
  150799. #elif defined(__clang__)
  150800. "adcs r3, %[r]\n\t"
  150801. #else
  150802. "adc r3, %[r]\n\t"
  150803. #endif
  150804. #ifdef WOLFSSL_KEIL
  150805. "adcs r4, r4, %[r]\n\t"
  150806. #elif defined(__clang__)
  150807. "adcs r4, %[r]\n\t"
  150808. #else
  150809. "adc r4, %[r]\n\t"
  150810. #endif
  150811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150812. "lsrs r7, %[b], #16\n\t"
  150813. #else
  150814. "lsr r7, %[b], #16\n\t"
  150815. #endif
  150816. #ifdef WOLFSSL_KEIL
  150817. "muls r6, r7, r6\n\t"
  150818. #elif defined(__clang__)
  150819. "muls r6, r7\n\t"
  150820. #else
  150821. "mul r6, r7\n\t"
  150822. #endif
  150823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150824. "lsrs r7, r6, #16\n\t"
  150825. #else
  150826. "lsr r7, r6, #16\n\t"
  150827. #endif
  150828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150829. "lsls r6, r6, #16\n\t"
  150830. #else
  150831. "lsl r6, r6, #16\n\t"
  150832. #endif
  150833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150834. "adds r5, r5, r6\n\t"
  150835. #else
  150836. "add r5, r5, r6\n\t"
  150837. #endif
  150838. #ifdef WOLFSSL_KEIL
  150839. "adcs r3, r3, r7\n\t"
  150840. #elif defined(__clang__)
  150841. "adcs r3, r7\n\t"
  150842. #else
  150843. "adc r3, r7\n\t"
  150844. #endif
  150845. #ifdef WOLFSSL_KEIL
  150846. "adcs r4, r4, %[r]\n\t"
  150847. #elif defined(__clang__)
  150848. "adcs r4, %[r]\n\t"
  150849. #else
  150850. "adc r4, %[r]\n\t"
  150851. #endif
  150852. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150853. "lsrs r6, %[a], #16\n\t"
  150854. #else
  150855. "lsr r6, %[a], #16\n\t"
  150856. #endif
  150857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150858. "lsrs r7, %[b], #16\n\t"
  150859. #else
  150860. "lsr r7, %[b], #16\n\t"
  150861. #endif
  150862. #ifdef WOLFSSL_KEIL
  150863. "muls r7, r6, r7\n\t"
  150864. #elif defined(__clang__)
  150865. "muls r7, r6\n\t"
  150866. #else
  150867. "mul r7, r6\n\t"
  150868. #endif
  150869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150870. "adds r3, r3, r7\n\t"
  150871. #else
  150872. "add r3, r3, r7\n\t"
  150873. #endif
  150874. #ifdef WOLFSSL_KEIL
  150875. "adcs r4, r4, %[r]\n\t"
  150876. #elif defined(__clang__)
  150877. "adcs r4, %[r]\n\t"
  150878. #else
  150879. "adc r4, %[r]\n\t"
  150880. #endif
  150881. "uxth r7, %[b]\n\t"
  150882. #ifdef WOLFSSL_KEIL
  150883. "muls r6, r7, r6\n\t"
  150884. #elif defined(__clang__)
  150885. "muls r6, r7\n\t"
  150886. #else
  150887. "mul r6, r7\n\t"
  150888. #endif
  150889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150890. "lsrs r7, r6, #16\n\t"
  150891. #else
  150892. "lsr r7, r6, #16\n\t"
  150893. #endif
  150894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150895. "lsls r6, r6, #16\n\t"
  150896. #else
  150897. "lsl r6, r6, #16\n\t"
  150898. #endif
  150899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150900. "adds r5, r5, r6\n\t"
  150901. #else
  150902. "add r5, r5, r6\n\t"
  150903. #endif
  150904. #ifdef WOLFSSL_KEIL
  150905. "adcs r3, r3, r7\n\t"
  150906. #elif defined(__clang__)
  150907. "adcs r3, r7\n\t"
  150908. #else
  150909. "adc r3, r7\n\t"
  150910. #endif
  150911. #ifdef WOLFSSL_KEIL
  150912. "adcs r4, r4, %[r]\n\t"
  150913. #elif defined(__clang__)
  150914. "adcs r4, %[r]\n\t"
  150915. #else
  150916. "adc r4, %[r]\n\t"
  150917. #endif
  150918. "str r5, [sp, #56]\n\t"
  150919. "# A[0] * B[15]\n\t"
  150920. "movs r5, #0\n\t"
  150921. "mov %[a], r9\n\t"
  150922. "mov %[b], r10\n\t"
  150923. "ldr %[a], [%[a]]\n\t"
  150924. "ldr %[b], [%[b], #60]\n\t"
  150925. "uxth r6, %[a]\n\t"
  150926. "uxth r7, %[b]\n\t"
  150927. #ifdef WOLFSSL_KEIL
  150928. "muls r7, r6, r7\n\t"
  150929. #elif defined(__clang__)
  150930. "muls r7, r6\n\t"
  150931. #else
  150932. "mul r7, r6\n\t"
  150933. #endif
  150934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150935. "adds r3, r3, r7\n\t"
  150936. #else
  150937. "add r3, r3, r7\n\t"
  150938. #endif
  150939. #ifdef WOLFSSL_KEIL
  150940. "adcs r4, r4, %[r]\n\t"
  150941. #elif defined(__clang__)
  150942. "adcs r4, %[r]\n\t"
  150943. #else
  150944. "adc r4, %[r]\n\t"
  150945. #endif
  150946. #ifdef WOLFSSL_KEIL
  150947. "adcs r5, r5, %[r]\n\t"
  150948. #elif defined(__clang__)
  150949. "adcs r5, %[r]\n\t"
  150950. #else
  150951. "adc r5, %[r]\n\t"
  150952. #endif
  150953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150954. "lsrs r7, %[b], #16\n\t"
  150955. #else
  150956. "lsr r7, %[b], #16\n\t"
  150957. #endif
  150958. #ifdef WOLFSSL_KEIL
  150959. "muls r6, r7, r6\n\t"
  150960. #elif defined(__clang__)
  150961. "muls r6, r7\n\t"
  150962. #else
  150963. "mul r6, r7\n\t"
  150964. #endif
  150965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150966. "lsrs r7, r6, #16\n\t"
  150967. #else
  150968. "lsr r7, r6, #16\n\t"
  150969. #endif
  150970. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150971. "lsls r6, r6, #16\n\t"
  150972. #else
  150973. "lsl r6, r6, #16\n\t"
  150974. #endif
  150975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150976. "adds r3, r3, r6\n\t"
  150977. #else
  150978. "add r3, r3, r6\n\t"
  150979. #endif
  150980. #ifdef WOLFSSL_KEIL
  150981. "adcs r4, r4, r7\n\t"
  150982. #elif defined(__clang__)
  150983. "adcs r4, r7\n\t"
  150984. #else
  150985. "adc r4, r7\n\t"
  150986. #endif
  150987. #ifdef WOLFSSL_KEIL
  150988. "adcs r5, r5, %[r]\n\t"
  150989. #elif defined(__clang__)
  150990. "adcs r5, %[r]\n\t"
  150991. #else
  150992. "adc r5, %[r]\n\t"
  150993. #endif
  150994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  150995. "lsrs r6, %[a], #16\n\t"
  150996. #else
  150997. "lsr r6, %[a], #16\n\t"
  150998. #endif
  150999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151000. "lsrs r7, %[b], #16\n\t"
  151001. #else
  151002. "lsr r7, %[b], #16\n\t"
  151003. #endif
  151004. #ifdef WOLFSSL_KEIL
  151005. "muls r7, r6, r7\n\t"
  151006. #elif defined(__clang__)
  151007. "muls r7, r6\n\t"
  151008. #else
  151009. "mul r7, r6\n\t"
  151010. #endif
  151011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151012. "adds r4, r4, r7\n\t"
  151013. #else
  151014. "add r4, r4, r7\n\t"
  151015. #endif
  151016. #ifdef WOLFSSL_KEIL
  151017. "adcs r5, r5, %[r]\n\t"
  151018. #elif defined(__clang__)
  151019. "adcs r5, %[r]\n\t"
  151020. #else
  151021. "adc r5, %[r]\n\t"
  151022. #endif
  151023. "uxth r7, %[b]\n\t"
  151024. #ifdef WOLFSSL_KEIL
  151025. "muls r6, r7, r6\n\t"
  151026. #elif defined(__clang__)
  151027. "muls r6, r7\n\t"
  151028. #else
  151029. "mul r6, r7\n\t"
  151030. #endif
  151031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151032. "lsrs r7, r6, #16\n\t"
  151033. #else
  151034. "lsr r7, r6, #16\n\t"
  151035. #endif
  151036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151037. "lsls r6, r6, #16\n\t"
  151038. #else
  151039. "lsl r6, r6, #16\n\t"
  151040. #endif
  151041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151042. "adds r3, r3, r6\n\t"
  151043. #else
  151044. "add r3, r3, r6\n\t"
  151045. #endif
  151046. #ifdef WOLFSSL_KEIL
  151047. "adcs r4, r4, r7\n\t"
  151048. #elif defined(__clang__)
  151049. "adcs r4, r7\n\t"
  151050. #else
  151051. "adc r4, r7\n\t"
  151052. #endif
  151053. #ifdef WOLFSSL_KEIL
  151054. "adcs r5, r5, %[r]\n\t"
  151055. #elif defined(__clang__)
  151056. "adcs r5, %[r]\n\t"
  151057. #else
  151058. "adc r5, %[r]\n\t"
  151059. #endif
  151060. "# A[1] * B[14]\n\t"
  151061. "mov %[a], r9\n\t"
  151062. "mov %[b], r10\n\t"
  151063. "ldr %[a], [%[a], #4]\n\t"
  151064. "ldr %[b], [%[b], #56]\n\t"
  151065. "uxth r6, %[a]\n\t"
  151066. "uxth r7, %[b]\n\t"
  151067. #ifdef WOLFSSL_KEIL
  151068. "muls r7, r6, r7\n\t"
  151069. #elif defined(__clang__)
  151070. "muls r7, r6\n\t"
  151071. #else
  151072. "mul r7, r6\n\t"
  151073. #endif
  151074. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151075. "adds r3, r3, r7\n\t"
  151076. #else
  151077. "add r3, r3, r7\n\t"
  151078. #endif
  151079. #ifdef WOLFSSL_KEIL
  151080. "adcs r4, r4, %[r]\n\t"
  151081. #elif defined(__clang__)
  151082. "adcs r4, %[r]\n\t"
  151083. #else
  151084. "adc r4, %[r]\n\t"
  151085. #endif
  151086. #ifdef WOLFSSL_KEIL
  151087. "adcs r5, r5, %[r]\n\t"
  151088. #elif defined(__clang__)
  151089. "adcs r5, %[r]\n\t"
  151090. #else
  151091. "adc r5, %[r]\n\t"
  151092. #endif
  151093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151094. "lsrs r7, %[b], #16\n\t"
  151095. #else
  151096. "lsr r7, %[b], #16\n\t"
  151097. #endif
  151098. #ifdef WOLFSSL_KEIL
  151099. "muls r6, r7, r6\n\t"
  151100. #elif defined(__clang__)
  151101. "muls r6, r7\n\t"
  151102. #else
  151103. "mul r6, r7\n\t"
  151104. #endif
  151105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151106. "lsrs r7, r6, #16\n\t"
  151107. #else
  151108. "lsr r7, r6, #16\n\t"
  151109. #endif
  151110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151111. "lsls r6, r6, #16\n\t"
  151112. #else
  151113. "lsl r6, r6, #16\n\t"
  151114. #endif
  151115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151116. "adds r3, r3, r6\n\t"
  151117. #else
  151118. "add r3, r3, r6\n\t"
  151119. #endif
  151120. #ifdef WOLFSSL_KEIL
  151121. "adcs r4, r4, r7\n\t"
  151122. #elif defined(__clang__)
  151123. "adcs r4, r7\n\t"
  151124. #else
  151125. "adc r4, r7\n\t"
  151126. #endif
  151127. #ifdef WOLFSSL_KEIL
  151128. "adcs r5, r5, %[r]\n\t"
  151129. #elif defined(__clang__)
  151130. "adcs r5, %[r]\n\t"
  151131. #else
  151132. "adc r5, %[r]\n\t"
  151133. #endif
  151134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151135. "lsrs r6, %[a], #16\n\t"
  151136. #else
  151137. "lsr r6, %[a], #16\n\t"
  151138. #endif
  151139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151140. "lsrs r7, %[b], #16\n\t"
  151141. #else
  151142. "lsr r7, %[b], #16\n\t"
  151143. #endif
  151144. #ifdef WOLFSSL_KEIL
  151145. "muls r7, r6, r7\n\t"
  151146. #elif defined(__clang__)
  151147. "muls r7, r6\n\t"
  151148. #else
  151149. "mul r7, r6\n\t"
  151150. #endif
  151151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151152. "adds r4, r4, r7\n\t"
  151153. #else
  151154. "add r4, r4, r7\n\t"
  151155. #endif
  151156. #ifdef WOLFSSL_KEIL
  151157. "adcs r5, r5, %[r]\n\t"
  151158. #elif defined(__clang__)
  151159. "adcs r5, %[r]\n\t"
  151160. #else
  151161. "adc r5, %[r]\n\t"
  151162. #endif
  151163. "uxth r7, %[b]\n\t"
  151164. #ifdef WOLFSSL_KEIL
  151165. "muls r6, r7, r6\n\t"
  151166. #elif defined(__clang__)
  151167. "muls r6, r7\n\t"
  151168. #else
  151169. "mul r6, r7\n\t"
  151170. #endif
  151171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151172. "lsrs r7, r6, #16\n\t"
  151173. #else
  151174. "lsr r7, r6, #16\n\t"
  151175. #endif
  151176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151177. "lsls r6, r6, #16\n\t"
  151178. #else
  151179. "lsl r6, r6, #16\n\t"
  151180. #endif
  151181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151182. "adds r3, r3, r6\n\t"
  151183. #else
  151184. "add r3, r3, r6\n\t"
  151185. #endif
  151186. #ifdef WOLFSSL_KEIL
  151187. "adcs r4, r4, r7\n\t"
  151188. #elif defined(__clang__)
  151189. "adcs r4, r7\n\t"
  151190. #else
  151191. "adc r4, r7\n\t"
  151192. #endif
  151193. #ifdef WOLFSSL_KEIL
  151194. "adcs r5, r5, %[r]\n\t"
  151195. #elif defined(__clang__)
  151196. "adcs r5, %[r]\n\t"
  151197. #else
  151198. "adc r5, %[r]\n\t"
  151199. #endif
  151200. "# A[2] * B[13]\n\t"
  151201. "mov %[a], r9\n\t"
  151202. "mov %[b], r10\n\t"
  151203. "ldr %[a], [%[a], #8]\n\t"
  151204. "ldr %[b], [%[b], #52]\n\t"
  151205. "uxth r6, %[a]\n\t"
  151206. "uxth r7, %[b]\n\t"
  151207. #ifdef WOLFSSL_KEIL
  151208. "muls r7, r6, r7\n\t"
  151209. #elif defined(__clang__)
  151210. "muls r7, r6\n\t"
  151211. #else
  151212. "mul r7, r6\n\t"
  151213. #endif
  151214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151215. "adds r3, r3, r7\n\t"
  151216. #else
  151217. "add r3, r3, r7\n\t"
  151218. #endif
  151219. #ifdef WOLFSSL_KEIL
  151220. "adcs r4, r4, %[r]\n\t"
  151221. #elif defined(__clang__)
  151222. "adcs r4, %[r]\n\t"
  151223. #else
  151224. "adc r4, %[r]\n\t"
  151225. #endif
  151226. #ifdef WOLFSSL_KEIL
  151227. "adcs r5, r5, %[r]\n\t"
  151228. #elif defined(__clang__)
  151229. "adcs r5, %[r]\n\t"
  151230. #else
  151231. "adc r5, %[r]\n\t"
  151232. #endif
  151233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151234. "lsrs r7, %[b], #16\n\t"
  151235. #else
  151236. "lsr r7, %[b], #16\n\t"
  151237. #endif
  151238. #ifdef WOLFSSL_KEIL
  151239. "muls r6, r7, r6\n\t"
  151240. #elif defined(__clang__)
  151241. "muls r6, r7\n\t"
  151242. #else
  151243. "mul r6, r7\n\t"
  151244. #endif
  151245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151246. "lsrs r7, r6, #16\n\t"
  151247. #else
  151248. "lsr r7, r6, #16\n\t"
  151249. #endif
  151250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151251. "lsls r6, r6, #16\n\t"
  151252. #else
  151253. "lsl r6, r6, #16\n\t"
  151254. #endif
  151255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151256. "adds r3, r3, r6\n\t"
  151257. #else
  151258. "add r3, r3, r6\n\t"
  151259. #endif
  151260. #ifdef WOLFSSL_KEIL
  151261. "adcs r4, r4, r7\n\t"
  151262. #elif defined(__clang__)
  151263. "adcs r4, r7\n\t"
  151264. #else
  151265. "adc r4, r7\n\t"
  151266. #endif
  151267. #ifdef WOLFSSL_KEIL
  151268. "adcs r5, r5, %[r]\n\t"
  151269. #elif defined(__clang__)
  151270. "adcs r5, %[r]\n\t"
  151271. #else
  151272. "adc r5, %[r]\n\t"
  151273. #endif
  151274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151275. "lsrs r6, %[a], #16\n\t"
  151276. #else
  151277. "lsr r6, %[a], #16\n\t"
  151278. #endif
  151279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151280. "lsrs r7, %[b], #16\n\t"
  151281. #else
  151282. "lsr r7, %[b], #16\n\t"
  151283. #endif
  151284. #ifdef WOLFSSL_KEIL
  151285. "muls r7, r6, r7\n\t"
  151286. #elif defined(__clang__)
  151287. "muls r7, r6\n\t"
  151288. #else
  151289. "mul r7, r6\n\t"
  151290. #endif
  151291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151292. "adds r4, r4, r7\n\t"
  151293. #else
  151294. "add r4, r4, r7\n\t"
  151295. #endif
  151296. #ifdef WOLFSSL_KEIL
  151297. "adcs r5, r5, %[r]\n\t"
  151298. #elif defined(__clang__)
  151299. "adcs r5, %[r]\n\t"
  151300. #else
  151301. "adc r5, %[r]\n\t"
  151302. #endif
  151303. "uxth r7, %[b]\n\t"
  151304. #ifdef WOLFSSL_KEIL
  151305. "muls r6, r7, r6\n\t"
  151306. #elif defined(__clang__)
  151307. "muls r6, r7\n\t"
  151308. #else
  151309. "mul r6, r7\n\t"
  151310. #endif
  151311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151312. "lsrs r7, r6, #16\n\t"
  151313. #else
  151314. "lsr r7, r6, #16\n\t"
  151315. #endif
  151316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151317. "lsls r6, r6, #16\n\t"
  151318. #else
  151319. "lsl r6, r6, #16\n\t"
  151320. #endif
  151321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151322. "adds r3, r3, r6\n\t"
  151323. #else
  151324. "add r3, r3, r6\n\t"
  151325. #endif
  151326. #ifdef WOLFSSL_KEIL
  151327. "adcs r4, r4, r7\n\t"
  151328. #elif defined(__clang__)
  151329. "adcs r4, r7\n\t"
  151330. #else
  151331. "adc r4, r7\n\t"
  151332. #endif
  151333. #ifdef WOLFSSL_KEIL
  151334. "adcs r5, r5, %[r]\n\t"
  151335. #elif defined(__clang__)
  151336. "adcs r5, %[r]\n\t"
  151337. #else
  151338. "adc r5, %[r]\n\t"
  151339. #endif
  151340. "# A[3] * B[12]\n\t"
  151341. "mov %[a], r9\n\t"
  151342. "mov %[b], r10\n\t"
  151343. "ldr %[a], [%[a], #12]\n\t"
  151344. "ldr %[b], [%[b], #48]\n\t"
  151345. "uxth r6, %[a]\n\t"
  151346. "uxth r7, %[b]\n\t"
  151347. #ifdef WOLFSSL_KEIL
  151348. "muls r7, r6, r7\n\t"
  151349. #elif defined(__clang__)
  151350. "muls r7, r6\n\t"
  151351. #else
  151352. "mul r7, r6\n\t"
  151353. #endif
  151354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151355. "adds r3, r3, r7\n\t"
  151356. #else
  151357. "add r3, r3, r7\n\t"
  151358. #endif
  151359. #ifdef WOLFSSL_KEIL
  151360. "adcs r4, r4, %[r]\n\t"
  151361. #elif defined(__clang__)
  151362. "adcs r4, %[r]\n\t"
  151363. #else
  151364. "adc r4, %[r]\n\t"
  151365. #endif
  151366. #ifdef WOLFSSL_KEIL
  151367. "adcs r5, r5, %[r]\n\t"
  151368. #elif defined(__clang__)
  151369. "adcs r5, %[r]\n\t"
  151370. #else
  151371. "adc r5, %[r]\n\t"
  151372. #endif
  151373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151374. "lsrs r7, %[b], #16\n\t"
  151375. #else
  151376. "lsr r7, %[b], #16\n\t"
  151377. #endif
  151378. #ifdef WOLFSSL_KEIL
  151379. "muls r6, r7, r6\n\t"
  151380. #elif defined(__clang__)
  151381. "muls r6, r7\n\t"
  151382. #else
  151383. "mul r6, r7\n\t"
  151384. #endif
  151385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151386. "lsrs r7, r6, #16\n\t"
  151387. #else
  151388. "lsr r7, r6, #16\n\t"
  151389. #endif
  151390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151391. "lsls r6, r6, #16\n\t"
  151392. #else
  151393. "lsl r6, r6, #16\n\t"
  151394. #endif
  151395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151396. "adds r3, r3, r6\n\t"
  151397. #else
  151398. "add r3, r3, r6\n\t"
  151399. #endif
  151400. #ifdef WOLFSSL_KEIL
  151401. "adcs r4, r4, r7\n\t"
  151402. #elif defined(__clang__)
  151403. "adcs r4, r7\n\t"
  151404. #else
  151405. "adc r4, r7\n\t"
  151406. #endif
  151407. #ifdef WOLFSSL_KEIL
  151408. "adcs r5, r5, %[r]\n\t"
  151409. #elif defined(__clang__)
  151410. "adcs r5, %[r]\n\t"
  151411. #else
  151412. "adc r5, %[r]\n\t"
  151413. #endif
  151414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151415. "lsrs r6, %[a], #16\n\t"
  151416. #else
  151417. "lsr r6, %[a], #16\n\t"
  151418. #endif
  151419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151420. "lsrs r7, %[b], #16\n\t"
  151421. #else
  151422. "lsr r7, %[b], #16\n\t"
  151423. #endif
  151424. #ifdef WOLFSSL_KEIL
  151425. "muls r7, r6, r7\n\t"
  151426. #elif defined(__clang__)
  151427. "muls r7, r6\n\t"
  151428. #else
  151429. "mul r7, r6\n\t"
  151430. #endif
  151431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151432. "adds r4, r4, r7\n\t"
  151433. #else
  151434. "add r4, r4, r7\n\t"
  151435. #endif
  151436. #ifdef WOLFSSL_KEIL
  151437. "adcs r5, r5, %[r]\n\t"
  151438. #elif defined(__clang__)
  151439. "adcs r5, %[r]\n\t"
  151440. #else
  151441. "adc r5, %[r]\n\t"
  151442. #endif
  151443. "uxth r7, %[b]\n\t"
  151444. #ifdef WOLFSSL_KEIL
  151445. "muls r6, r7, r6\n\t"
  151446. #elif defined(__clang__)
  151447. "muls r6, r7\n\t"
  151448. #else
  151449. "mul r6, r7\n\t"
  151450. #endif
  151451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151452. "lsrs r7, r6, #16\n\t"
  151453. #else
  151454. "lsr r7, r6, #16\n\t"
  151455. #endif
  151456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151457. "lsls r6, r6, #16\n\t"
  151458. #else
  151459. "lsl r6, r6, #16\n\t"
  151460. #endif
  151461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151462. "adds r3, r3, r6\n\t"
  151463. #else
  151464. "add r3, r3, r6\n\t"
  151465. #endif
  151466. #ifdef WOLFSSL_KEIL
  151467. "adcs r4, r4, r7\n\t"
  151468. #elif defined(__clang__)
  151469. "adcs r4, r7\n\t"
  151470. #else
  151471. "adc r4, r7\n\t"
  151472. #endif
  151473. #ifdef WOLFSSL_KEIL
  151474. "adcs r5, r5, %[r]\n\t"
  151475. #elif defined(__clang__)
  151476. "adcs r5, %[r]\n\t"
  151477. #else
  151478. "adc r5, %[r]\n\t"
  151479. #endif
  151480. "# A[4] * B[11]\n\t"
  151481. "mov %[a], r9\n\t"
  151482. "mov %[b], r10\n\t"
  151483. "ldr %[a], [%[a], #16]\n\t"
  151484. "ldr %[b], [%[b], #44]\n\t"
  151485. "uxth r6, %[a]\n\t"
  151486. "uxth r7, %[b]\n\t"
  151487. #ifdef WOLFSSL_KEIL
  151488. "muls r7, r6, r7\n\t"
  151489. #elif defined(__clang__)
  151490. "muls r7, r6\n\t"
  151491. #else
  151492. "mul r7, r6\n\t"
  151493. #endif
  151494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151495. "adds r3, r3, r7\n\t"
  151496. #else
  151497. "add r3, r3, r7\n\t"
  151498. #endif
  151499. #ifdef WOLFSSL_KEIL
  151500. "adcs r4, r4, %[r]\n\t"
  151501. #elif defined(__clang__)
  151502. "adcs r4, %[r]\n\t"
  151503. #else
  151504. "adc r4, %[r]\n\t"
  151505. #endif
  151506. #ifdef WOLFSSL_KEIL
  151507. "adcs r5, r5, %[r]\n\t"
  151508. #elif defined(__clang__)
  151509. "adcs r5, %[r]\n\t"
  151510. #else
  151511. "adc r5, %[r]\n\t"
  151512. #endif
  151513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151514. "lsrs r7, %[b], #16\n\t"
  151515. #else
  151516. "lsr r7, %[b], #16\n\t"
  151517. #endif
  151518. #ifdef WOLFSSL_KEIL
  151519. "muls r6, r7, r6\n\t"
  151520. #elif defined(__clang__)
  151521. "muls r6, r7\n\t"
  151522. #else
  151523. "mul r6, r7\n\t"
  151524. #endif
  151525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151526. "lsrs r7, r6, #16\n\t"
  151527. #else
  151528. "lsr r7, r6, #16\n\t"
  151529. #endif
  151530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151531. "lsls r6, r6, #16\n\t"
  151532. #else
  151533. "lsl r6, r6, #16\n\t"
  151534. #endif
  151535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151536. "adds r3, r3, r6\n\t"
  151537. #else
  151538. "add r3, r3, r6\n\t"
  151539. #endif
  151540. #ifdef WOLFSSL_KEIL
  151541. "adcs r4, r4, r7\n\t"
  151542. #elif defined(__clang__)
  151543. "adcs r4, r7\n\t"
  151544. #else
  151545. "adc r4, r7\n\t"
  151546. #endif
  151547. #ifdef WOLFSSL_KEIL
  151548. "adcs r5, r5, %[r]\n\t"
  151549. #elif defined(__clang__)
  151550. "adcs r5, %[r]\n\t"
  151551. #else
  151552. "adc r5, %[r]\n\t"
  151553. #endif
  151554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151555. "lsrs r6, %[a], #16\n\t"
  151556. #else
  151557. "lsr r6, %[a], #16\n\t"
  151558. #endif
  151559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151560. "lsrs r7, %[b], #16\n\t"
  151561. #else
  151562. "lsr r7, %[b], #16\n\t"
  151563. #endif
  151564. #ifdef WOLFSSL_KEIL
  151565. "muls r7, r6, r7\n\t"
  151566. #elif defined(__clang__)
  151567. "muls r7, r6\n\t"
  151568. #else
  151569. "mul r7, r6\n\t"
  151570. #endif
  151571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151572. "adds r4, r4, r7\n\t"
  151573. #else
  151574. "add r4, r4, r7\n\t"
  151575. #endif
  151576. #ifdef WOLFSSL_KEIL
  151577. "adcs r5, r5, %[r]\n\t"
  151578. #elif defined(__clang__)
  151579. "adcs r5, %[r]\n\t"
  151580. #else
  151581. "adc r5, %[r]\n\t"
  151582. #endif
  151583. "uxth r7, %[b]\n\t"
  151584. #ifdef WOLFSSL_KEIL
  151585. "muls r6, r7, r6\n\t"
  151586. #elif defined(__clang__)
  151587. "muls r6, r7\n\t"
  151588. #else
  151589. "mul r6, r7\n\t"
  151590. #endif
  151591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151592. "lsrs r7, r6, #16\n\t"
  151593. #else
  151594. "lsr r7, r6, #16\n\t"
  151595. #endif
  151596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151597. "lsls r6, r6, #16\n\t"
  151598. #else
  151599. "lsl r6, r6, #16\n\t"
  151600. #endif
  151601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151602. "adds r3, r3, r6\n\t"
  151603. #else
  151604. "add r3, r3, r6\n\t"
  151605. #endif
  151606. #ifdef WOLFSSL_KEIL
  151607. "adcs r4, r4, r7\n\t"
  151608. #elif defined(__clang__)
  151609. "adcs r4, r7\n\t"
  151610. #else
  151611. "adc r4, r7\n\t"
  151612. #endif
  151613. #ifdef WOLFSSL_KEIL
  151614. "adcs r5, r5, %[r]\n\t"
  151615. #elif defined(__clang__)
  151616. "adcs r5, %[r]\n\t"
  151617. #else
  151618. "adc r5, %[r]\n\t"
  151619. #endif
  151620. "# A[5] * B[10]\n\t"
  151621. "mov %[a], r9\n\t"
  151622. "mov %[b], r10\n\t"
  151623. "ldr %[a], [%[a], #20]\n\t"
  151624. "ldr %[b], [%[b], #40]\n\t"
  151625. "uxth r6, %[a]\n\t"
  151626. "uxth r7, %[b]\n\t"
  151627. #ifdef WOLFSSL_KEIL
  151628. "muls r7, r6, r7\n\t"
  151629. #elif defined(__clang__)
  151630. "muls r7, r6\n\t"
  151631. #else
  151632. "mul r7, r6\n\t"
  151633. #endif
  151634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151635. "adds r3, r3, r7\n\t"
  151636. #else
  151637. "add r3, r3, r7\n\t"
  151638. #endif
  151639. #ifdef WOLFSSL_KEIL
  151640. "adcs r4, r4, %[r]\n\t"
  151641. #elif defined(__clang__)
  151642. "adcs r4, %[r]\n\t"
  151643. #else
  151644. "adc r4, %[r]\n\t"
  151645. #endif
  151646. #ifdef WOLFSSL_KEIL
  151647. "adcs r5, r5, %[r]\n\t"
  151648. #elif defined(__clang__)
  151649. "adcs r5, %[r]\n\t"
  151650. #else
  151651. "adc r5, %[r]\n\t"
  151652. #endif
  151653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151654. "lsrs r7, %[b], #16\n\t"
  151655. #else
  151656. "lsr r7, %[b], #16\n\t"
  151657. #endif
  151658. #ifdef WOLFSSL_KEIL
  151659. "muls r6, r7, r6\n\t"
  151660. #elif defined(__clang__)
  151661. "muls r6, r7\n\t"
  151662. #else
  151663. "mul r6, r7\n\t"
  151664. #endif
  151665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151666. "lsrs r7, r6, #16\n\t"
  151667. #else
  151668. "lsr r7, r6, #16\n\t"
  151669. #endif
  151670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151671. "lsls r6, r6, #16\n\t"
  151672. #else
  151673. "lsl r6, r6, #16\n\t"
  151674. #endif
  151675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151676. "adds r3, r3, r6\n\t"
  151677. #else
  151678. "add r3, r3, r6\n\t"
  151679. #endif
  151680. #ifdef WOLFSSL_KEIL
  151681. "adcs r4, r4, r7\n\t"
  151682. #elif defined(__clang__)
  151683. "adcs r4, r7\n\t"
  151684. #else
  151685. "adc r4, r7\n\t"
  151686. #endif
  151687. #ifdef WOLFSSL_KEIL
  151688. "adcs r5, r5, %[r]\n\t"
  151689. #elif defined(__clang__)
  151690. "adcs r5, %[r]\n\t"
  151691. #else
  151692. "adc r5, %[r]\n\t"
  151693. #endif
  151694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151695. "lsrs r6, %[a], #16\n\t"
  151696. #else
  151697. "lsr r6, %[a], #16\n\t"
  151698. #endif
  151699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151700. "lsrs r7, %[b], #16\n\t"
  151701. #else
  151702. "lsr r7, %[b], #16\n\t"
  151703. #endif
  151704. #ifdef WOLFSSL_KEIL
  151705. "muls r7, r6, r7\n\t"
  151706. #elif defined(__clang__)
  151707. "muls r7, r6\n\t"
  151708. #else
  151709. "mul r7, r6\n\t"
  151710. #endif
  151711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151712. "adds r4, r4, r7\n\t"
  151713. #else
  151714. "add r4, r4, r7\n\t"
  151715. #endif
  151716. #ifdef WOLFSSL_KEIL
  151717. "adcs r5, r5, %[r]\n\t"
  151718. #elif defined(__clang__)
  151719. "adcs r5, %[r]\n\t"
  151720. #else
  151721. "adc r5, %[r]\n\t"
  151722. #endif
  151723. "uxth r7, %[b]\n\t"
  151724. #ifdef WOLFSSL_KEIL
  151725. "muls r6, r7, r6\n\t"
  151726. #elif defined(__clang__)
  151727. "muls r6, r7\n\t"
  151728. #else
  151729. "mul r6, r7\n\t"
  151730. #endif
  151731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151732. "lsrs r7, r6, #16\n\t"
  151733. #else
  151734. "lsr r7, r6, #16\n\t"
  151735. #endif
  151736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151737. "lsls r6, r6, #16\n\t"
  151738. #else
  151739. "lsl r6, r6, #16\n\t"
  151740. #endif
  151741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151742. "adds r3, r3, r6\n\t"
  151743. #else
  151744. "add r3, r3, r6\n\t"
  151745. #endif
  151746. #ifdef WOLFSSL_KEIL
  151747. "adcs r4, r4, r7\n\t"
  151748. #elif defined(__clang__)
  151749. "adcs r4, r7\n\t"
  151750. #else
  151751. "adc r4, r7\n\t"
  151752. #endif
  151753. #ifdef WOLFSSL_KEIL
  151754. "adcs r5, r5, %[r]\n\t"
  151755. #elif defined(__clang__)
  151756. "adcs r5, %[r]\n\t"
  151757. #else
  151758. "adc r5, %[r]\n\t"
  151759. #endif
  151760. "# A[6] * B[9]\n\t"
  151761. "mov %[a], r9\n\t"
  151762. "mov %[b], r10\n\t"
  151763. "ldr %[a], [%[a], #24]\n\t"
  151764. "ldr %[b], [%[b], #36]\n\t"
  151765. "uxth r6, %[a]\n\t"
  151766. "uxth r7, %[b]\n\t"
  151767. #ifdef WOLFSSL_KEIL
  151768. "muls r7, r6, r7\n\t"
  151769. #elif defined(__clang__)
  151770. "muls r7, r6\n\t"
  151771. #else
  151772. "mul r7, r6\n\t"
  151773. #endif
  151774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151775. "adds r3, r3, r7\n\t"
  151776. #else
  151777. "add r3, r3, r7\n\t"
  151778. #endif
  151779. #ifdef WOLFSSL_KEIL
  151780. "adcs r4, r4, %[r]\n\t"
  151781. #elif defined(__clang__)
  151782. "adcs r4, %[r]\n\t"
  151783. #else
  151784. "adc r4, %[r]\n\t"
  151785. #endif
  151786. #ifdef WOLFSSL_KEIL
  151787. "adcs r5, r5, %[r]\n\t"
  151788. #elif defined(__clang__)
  151789. "adcs r5, %[r]\n\t"
  151790. #else
  151791. "adc r5, %[r]\n\t"
  151792. #endif
  151793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151794. "lsrs r7, %[b], #16\n\t"
  151795. #else
  151796. "lsr r7, %[b], #16\n\t"
  151797. #endif
  151798. #ifdef WOLFSSL_KEIL
  151799. "muls r6, r7, r6\n\t"
  151800. #elif defined(__clang__)
  151801. "muls r6, r7\n\t"
  151802. #else
  151803. "mul r6, r7\n\t"
  151804. #endif
  151805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151806. "lsrs r7, r6, #16\n\t"
  151807. #else
  151808. "lsr r7, r6, #16\n\t"
  151809. #endif
  151810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151811. "lsls r6, r6, #16\n\t"
  151812. #else
  151813. "lsl r6, r6, #16\n\t"
  151814. #endif
  151815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151816. "adds r3, r3, r6\n\t"
  151817. #else
  151818. "add r3, r3, r6\n\t"
  151819. #endif
  151820. #ifdef WOLFSSL_KEIL
  151821. "adcs r4, r4, r7\n\t"
  151822. #elif defined(__clang__)
  151823. "adcs r4, r7\n\t"
  151824. #else
  151825. "adc r4, r7\n\t"
  151826. #endif
  151827. #ifdef WOLFSSL_KEIL
  151828. "adcs r5, r5, %[r]\n\t"
  151829. #elif defined(__clang__)
  151830. "adcs r5, %[r]\n\t"
  151831. #else
  151832. "adc r5, %[r]\n\t"
  151833. #endif
  151834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151835. "lsrs r6, %[a], #16\n\t"
  151836. #else
  151837. "lsr r6, %[a], #16\n\t"
  151838. #endif
  151839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151840. "lsrs r7, %[b], #16\n\t"
  151841. #else
  151842. "lsr r7, %[b], #16\n\t"
  151843. #endif
  151844. #ifdef WOLFSSL_KEIL
  151845. "muls r7, r6, r7\n\t"
  151846. #elif defined(__clang__)
  151847. "muls r7, r6\n\t"
  151848. #else
  151849. "mul r7, r6\n\t"
  151850. #endif
  151851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151852. "adds r4, r4, r7\n\t"
  151853. #else
  151854. "add r4, r4, r7\n\t"
  151855. #endif
  151856. #ifdef WOLFSSL_KEIL
  151857. "adcs r5, r5, %[r]\n\t"
  151858. #elif defined(__clang__)
  151859. "adcs r5, %[r]\n\t"
  151860. #else
  151861. "adc r5, %[r]\n\t"
  151862. #endif
  151863. "uxth r7, %[b]\n\t"
  151864. #ifdef WOLFSSL_KEIL
  151865. "muls r6, r7, r6\n\t"
  151866. #elif defined(__clang__)
  151867. "muls r6, r7\n\t"
  151868. #else
  151869. "mul r6, r7\n\t"
  151870. #endif
  151871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151872. "lsrs r7, r6, #16\n\t"
  151873. #else
  151874. "lsr r7, r6, #16\n\t"
  151875. #endif
  151876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151877. "lsls r6, r6, #16\n\t"
  151878. #else
  151879. "lsl r6, r6, #16\n\t"
  151880. #endif
  151881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151882. "adds r3, r3, r6\n\t"
  151883. #else
  151884. "add r3, r3, r6\n\t"
  151885. #endif
  151886. #ifdef WOLFSSL_KEIL
  151887. "adcs r4, r4, r7\n\t"
  151888. #elif defined(__clang__)
  151889. "adcs r4, r7\n\t"
  151890. #else
  151891. "adc r4, r7\n\t"
  151892. #endif
  151893. #ifdef WOLFSSL_KEIL
  151894. "adcs r5, r5, %[r]\n\t"
  151895. #elif defined(__clang__)
  151896. "adcs r5, %[r]\n\t"
  151897. #else
  151898. "adc r5, %[r]\n\t"
  151899. #endif
  151900. "# A[7] * B[8]\n\t"
  151901. "mov %[a], r9\n\t"
  151902. "mov %[b], r10\n\t"
  151903. "ldr %[a], [%[a], #28]\n\t"
  151904. "ldr %[b], [%[b], #32]\n\t"
  151905. "uxth r6, %[a]\n\t"
  151906. "uxth r7, %[b]\n\t"
  151907. #ifdef WOLFSSL_KEIL
  151908. "muls r7, r6, r7\n\t"
  151909. #elif defined(__clang__)
  151910. "muls r7, r6\n\t"
  151911. #else
  151912. "mul r7, r6\n\t"
  151913. #endif
  151914. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151915. "adds r3, r3, r7\n\t"
  151916. #else
  151917. "add r3, r3, r7\n\t"
  151918. #endif
  151919. #ifdef WOLFSSL_KEIL
  151920. "adcs r4, r4, %[r]\n\t"
  151921. #elif defined(__clang__)
  151922. "adcs r4, %[r]\n\t"
  151923. #else
  151924. "adc r4, %[r]\n\t"
  151925. #endif
  151926. #ifdef WOLFSSL_KEIL
  151927. "adcs r5, r5, %[r]\n\t"
  151928. #elif defined(__clang__)
  151929. "adcs r5, %[r]\n\t"
  151930. #else
  151931. "adc r5, %[r]\n\t"
  151932. #endif
  151933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151934. "lsrs r7, %[b], #16\n\t"
  151935. #else
  151936. "lsr r7, %[b], #16\n\t"
  151937. #endif
  151938. #ifdef WOLFSSL_KEIL
  151939. "muls r6, r7, r6\n\t"
  151940. #elif defined(__clang__)
  151941. "muls r6, r7\n\t"
  151942. #else
  151943. "mul r6, r7\n\t"
  151944. #endif
  151945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151946. "lsrs r7, r6, #16\n\t"
  151947. #else
  151948. "lsr r7, r6, #16\n\t"
  151949. #endif
  151950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151951. "lsls r6, r6, #16\n\t"
  151952. #else
  151953. "lsl r6, r6, #16\n\t"
  151954. #endif
  151955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151956. "adds r3, r3, r6\n\t"
  151957. #else
  151958. "add r3, r3, r6\n\t"
  151959. #endif
  151960. #ifdef WOLFSSL_KEIL
  151961. "adcs r4, r4, r7\n\t"
  151962. #elif defined(__clang__)
  151963. "adcs r4, r7\n\t"
  151964. #else
  151965. "adc r4, r7\n\t"
  151966. #endif
  151967. #ifdef WOLFSSL_KEIL
  151968. "adcs r5, r5, %[r]\n\t"
  151969. #elif defined(__clang__)
  151970. "adcs r5, %[r]\n\t"
  151971. #else
  151972. "adc r5, %[r]\n\t"
  151973. #endif
  151974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151975. "lsrs r6, %[a], #16\n\t"
  151976. #else
  151977. "lsr r6, %[a], #16\n\t"
  151978. #endif
  151979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151980. "lsrs r7, %[b], #16\n\t"
  151981. #else
  151982. "lsr r7, %[b], #16\n\t"
  151983. #endif
  151984. #ifdef WOLFSSL_KEIL
  151985. "muls r7, r6, r7\n\t"
  151986. #elif defined(__clang__)
  151987. "muls r7, r6\n\t"
  151988. #else
  151989. "mul r7, r6\n\t"
  151990. #endif
  151991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  151992. "adds r4, r4, r7\n\t"
  151993. #else
  151994. "add r4, r4, r7\n\t"
  151995. #endif
  151996. #ifdef WOLFSSL_KEIL
  151997. "adcs r5, r5, %[r]\n\t"
  151998. #elif defined(__clang__)
  151999. "adcs r5, %[r]\n\t"
  152000. #else
  152001. "adc r5, %[r]\n\t"
  152002. #endif
  152003. "uxth r7, %[b]\n\t"
  152004. #ifdef WOLFSSL_KEIL
  152005. "muls r6, r7, r6\n\t"
  152006. #elif defined(__clang__)
  152007. "muls r6, r7\n\t"
  152008. #else
  152009. "mul r6, r7\n\t"
  152010. #endif
  152011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152012. "lsrs r7, r6, #16\n\t"
  152013. #else
  152014. "lsr r7, r6, #16\n\t"
  152015. #endif
  152016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152017. "lsls r6, r6, #16\n\t"
  152018. #else
  152019. "lsl r6, r6, #16\n\t"
  152020. #endif
  152021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152022. "adds r3, r3, r6\n\t"
  152023. #else
  152024. "add r3, r3, r6\n\t"
  152025. #endif
  152026. #ifdef WOLFSSL_KEIL
  152027. "adcs r4, r4, r7\n\t"
  152028. #elif defined(__clang__)
  152029. "adcs r4, r7\n\t"
  152030. #else
  152031. "adc r4, r7\n\t"
  152032. #endif
  152033. #ifdef WOLFSSL_KEIL
  152034. "adcs r5, r5, %[r]\n\t"
  152035. #elif defined(__clang__)
  152036. "adcs r5, %[r]\n\t"
  152037. #else
  152038. "adc r5, %[r]\n\t"
  152039. #endif
  152040. "# A[8] * B[7]\n\t"
  152041. "mov %[a], r9\n\t"
  152042. "mov %[b], r10\n\t"
  152043. "ldr %[a], [%[a], #32]\n\t"
  152044. "ldr %[b], [%[b], #28]\n\t"
  152045. "uxth r6, %[a]\n\t"
  152046. "uxth r7, %[b]\n\t"
  152047. #ifdef WOLFSSL_KEIL
  152048. "muls r7, r6, r7\n\t"
  152049. #elif defined(__clang__)
  152050. "muls r7, r6\n\t"
  152051. #else
  152052. "mul r7, r6\n\t"
  152053. #endif
  152054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152055. "adds r3, r3, r7\n\t"
  152056. #else
  152057. "add r3, r3, r7\n\t"
  152058. #endif
  152059. #ifdef WOLFSSL_KEIL
  152060. "adcs r4, r4, %[r]\n\t"
  152061. #elif defined(__clang__)
  152062. "adcs r4, %[r]\n\t"
  152063. #else
  152064. "adc r4, %[r]\n\t"
  152065. #endif
  152066. #ifdef WOLFSSL_KEIL
  152067. "adcs r5, r5, %[r]\n\t"
  152068. #elif defined(__clang__)
  152069. "adcs r5, %[r]\n\t"
  152070. #else
  152071. "adc r5, %[r]\n\t"
  152072. #endif
  152073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152074. "lsrs r7, %[b], #16\n\t"
  152075. #else
  152076. "lsr r7, %[b], #16\n\t"
  152077. #endif
  152078. #ifdef WOLFSSL_KEIL
  152079. "muls r6, r7, r6\n\t"
  152080. #elif defined(__clang__)
  152081. "muls r6, r7\n\t"
  152082. #else
  152083. "mul r6, r7\n\t"
  152084. #endif
  152085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152086. "lsrs r7, r6, #16\n\t"
  152087. #else
  152088. "lsr r7, r6, #16\n\t"
  152089. #endif
  152090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152091. "lsls r6, r6, #16\n\t"
  152092. #else
  152093. "lsl r6, r6, #16\n\t"
  152094. #endif
  152095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152096. "adds r3, r3, r6\n\t"
  152097. #else
  152098. "add r3, r3, r6\n\t"
  152099. #endif
  152100. #ifdef WOLFSSL_KEIL
  152101. "adcs r4, r4, r7\n\t"
  152102. #elif defined(__clang__)
  152103. "adcs r4, r7\n\t"
  152104. #else
  152105. "adc r4, r7\n\t"
  152106. #endif
  152107. #ifdef WOLFSSL_KEIL
  152108. "adcs r5, r5, %[r]\n\t"
  152109. #elif defined(__clang__)
  152110. "adcs r5, %[r]\n\t"
  152111. #else
  152112. "adc r5, %[r]\n\t"
  152113. #endif
  152114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152115. "lsrs r6, %[a], #16\n\t"
  152116. #else
  152117. "lsr r6, %[a], #16\n\t"
  152118. #endif
  152119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152120. "lsrs r7, %[b], #16\n\t"
  152121. #else
  152122. "lsr r7, %[b], #16\n\t"
  152123. #endif
  152124. #ifdef WOLFSSL_KEIL
  152125. "muls r7, r6, r7\n\t"
  152126. #elif defined(__clang__)
  152127. "muls r7, r6\n\t"
  152128. #else
  152129. "mul r7, r6\n\t"
  152130. #endif
  152131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152132. "adds r4, r4, r7\n\t"
  152133. #else
  152134. "add r4, r4, r7\n\t"
  152135. #endif
  152136. #ifdef WOLFSSL_KEIL
  152137. "adcs r5, r5, %[r]\n\t"
  152138. #elif defined(__clang__)
  152139. "adcs r5, %[r]\n\t"
  152140. #else
  152141. "adc r5, %[r]\n\t"
  152142. #endif
  152143. "uxth r7, %[b]\n\t"
  152144. #ifdef WOLFSSL_KEIL
  152145. "muls r6, r7, r6\n\t"
  152146. #elif defined(__clang__)
  152147. "muls r6, r7\n\t"
  152148. #else
  152149. "mul r6, r7\n\t"
  152150. #endif
  152151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152152. "lsrs r7, r6, #16\n\t"
  152153. #else
  152154. "lsr r7, r6, #16\n\t"
  152155. #endif
  152156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152157. "lsls r6, r6, #16\n\t"
  152158. #else
  152159. "lsl r6, r6, #16\n\t"
  152160. #endif
  152161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152162. "adds r3, r3, r6\n\t"
  152163. #else
  152164. "add r3, r3, r6\n\t"
  152165. #endif
  152166. #ifdef WOLFSSL_KEIL
  152167. "adcs r4, r4, r7\n\t"
  152168. #elif defined(__clang__)
  152169. "adcs r4, r7\n\t"
  152170. #else
  152171. "adc r4, r7\n\t"
  152172. #endif
  152173. #ifdef WOLFSSL_KEIL
  152174. "adcs r5, r5, %[r]\n\t"
  152175. #elif defined(__clang__)
  152176. "adcs r5, %[r]\n\t"
  152177. #else
  152178. "adc r5, %[r]\n\t"
  152179. #endif
  152180. "# A[9] * B[6]\n\t"
  152181. "mov %[a], r9\n\t"
  152182. "mov %[b], r10\n\t"
  152183. "ldr %[a], [%[a], #36]\n\t"
  152184. "ldr %[b], [%[b], #24]\n\t"
  152185. "uxth r6, %[a]\n\t"
  152186. "uxth r7, %[b]\n\t"
  152187. #ifdef WOLFSSL_KEIL
  152188. "muls r7, r6, r7\n\t"
  152189. #elif defined(__clang__)
  152190. "muls r7, r6\n\t"
  152191. #else
  152192. "mul r7, r6\n\t"
  152193. #endif
  152194. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152195. "adds r3, r3, r7\n\t"
  152196. #else
  152197. "add r3, r3, r7\n\t"
  152198. #endif
  152199. #ifdef WOLFSSL_KEIL
  152200. "adcs r4, r4, %[r]\n\t"
  152201. #elif defined(__clang__)
  152202. "adcs r4, %[r]\n\t"
  152203. #else
  152204. "adc r4, %[r]\n\t"
  152205. #endif
  152206. #ifdef WOLFSSL_KEIL
  152207. "adcs r5, r5, %[r]\n\t"
  152208. #elif defined(__clang__)
  152209. "adcs r5, %[r]\n\t"
  152210. #else
  152211. "adc r5, %[r]\n\t"
  152212. #endif
  152213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152214. "lsrs r7, %[b], #16\n\t"
  152215. #else
  152216. "lsr r7, %[b], #16\n\t"
  152217. #endif
  152218. #ifdef WOLFSSL_KEIL
  152219. "muls r6, r7, r6\n\t"
  152220. #elif defined(__clang__)
  152221. "muls r6, r7\n\t"
  152222. #else
  152223. "mul r6, r7\n\t"
  152224. #endif
  152225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152226. "lsrs r7, r6, #16\n\t"
  152227. #else
  152228. "lsr r7, r6, #16\n\t"
  152229. #endif
  152230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152231. "lsls r6, r6, #16\n\t"
  152232. #else
  152233. "lsl r6, r6, #16\n\t"
  152234. #endif
  152235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152236. "adds r3, r3, r6\n\t"
  152237. #else
  152238. "add r3, r3, r6\n\t"
  152239. #endif
  152240. #ifdef WOLFSSL_KEIL
  152241. "adcs r4, r4, r7\n\t"
  152242. #elif defined(__clang__)
  152243. "adcs r4, r7\n\t"
  152244. #else
  152245. "adc r4, r7\n\t"
  152246. #endif
  152247. #ifdef WOLFSSL_KEIL
  152248. "adcs r5, r5, %[r]\n\t"
  152249. #elif defined(__clang__)
  152250. "adcs r5, %[r]\n\t"
  152251. #else
  152252. "adc r5, %[r]\n\t"
  152253. #endif
  152254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152255. "lsrs r6, %[a], #16\n\t"
  152256. #else
  152257. "lsr r6, %[a], #16\n\t"
  152258. #endif
  152259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152260. "lsrs r7, %[b], #16\n\t"
  152261. #else
  152262. "lsr r7, %[b], #16\n\t"
  152263. #endif
  152264. #ifdef WOLFSSL_KEIL
  152265. "muls r7, r6, r7\n\t"
  152266. #elif defined(__clang__)
  152267. "muls r7, r6\n\t"
  152268. #else
  152269. "mul r7, r6\n\t"
  152270. #endif
  152271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152272. "adds r4, r4, r7\n\t"
  152273. #else
  152274. "add r4, r4, r7\n\t"
  152275. #endif
  152276. #ifdef WOLFSSL_KEIL
  152277. "adcs r5, r5, %[r]\n\t"
  152278. #elif defined(__clang__)
  152279. "adcs r5, %[r]\n\t"
  152280. #else
  152281. "adc r5, %[r]\n\t"
  152282. #endif
  152283. "uxth r7, %[b]\n\t"
  152284. #ifdef WOLFSSL_KEIL
  152285. "muls r6, r7, r6\n\t"
  152286. #elif defined(__clang__)
  152287. "muls r6, r7\n\t"
  152288. #else
  152289. "mul r6, r7\n\t"
  152290. #endif
  152291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152292. "lsrs r7, r6, #16\n\t"
  152293. #else
  152294. "lsr r7, r6, #16\n\t"
  152295. #endif
  152296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152297. "lsls r6, r6, #16\n\t"
  152298. #else
  152299. "lsl r6, r6, #16\n\t"
  152300. #endif
  152301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152302. "adds r3, r3, r6\n\t"
  152303. #else
  152304. "add r3, r3, r6\n\t"
  152305. #endif
  152306. #ifdef WOLFSSL_KEIL
  152307. "adcs r4, r4, r7\n\t"
  152308. #elif defined(__clang__)
  152309. "adcs r4, r7\n\t"
  152310. #else
  152311. "adc r4, r7\n\t"
  152312. #endif
  152313. #ifdef WOLFSSL_KEIL
  152314. "adcs r5, r5, %[r]\n\t"
  152315. #elif defined(__clang__)
  152316. "adcs r5, %[r]\n\t"
  152317. #else
  152318. "adc r5, %[r]\n\t"
  152319. #endif
  152320. "# A[10] * B[5]\n\t"
  152321. "mov %[a], r9\n\t"
  152322. "mov %[b], r10\n\t"
  152323. "ldr %[a], [%[a], #40]\n\t"
  152324. "ldr %[b], [%[b], #20]\n\t"
  152325. "uxth r6, %[a]\n\t"
  152326. "uxth r7, %[b]\n\t"
  152327. #ifdef WOLFSSL_KEIL
  152328. "muls r7, r6, r7\n\t"
  152329. #elif defined(__clang__)
  152330. "muls r7, r6\n\t"
  152331. #else
  152332. "mul r7, r6\n\t"
  152333. #endif
  152334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152335. "adds r3, r3, r7\n\t"
  152336. #else
  152337. "add r3, r3, r7\n\t"
  152338. #endif
  152339. #ifdef WOLFSSL_KEIL
  152340. "adcs r4, r4, %[r]\n\t"
  152341. #elif defined(__clang__)
  152342. "adcs r4, %[r]\n\t"
  152343. #else
  152344. "adc r4, %[r]\n\t"
  152345. #endif
  152346. #ifdef WOLFSSL_KEIL
  152347. "adcs r5, r5, %[r]\n\t"
  152348. #elif defined(__clang__)
  152349. "adcs r5, %[r]\n\t"
  152350. #else
  152351. "adc r5, %[r]\n\t"
  152352. #endif
  152353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152354. "lsrs r7, %[b], #16\n\t"
  152355. #else
  152356. "lsr r7, %[b], #16\n\t"
  152357. #endif
  152358. #ifdef WOLFSSL_KEIL
  152359. "muls r6, r7, r6\n\t"
  152360. #elif defined(__clang__)
  152361. "muls r6, r7\n\t"
  152362. #else
  152363. "mul r6, r7\n\t"
  152364. #endif
  152365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152366. "lsrs r7, r6, #16\n\t"
  152367. #else
  152368. "lsr r7, r6, #16\n\t"
  152369. #endif
  152370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152371. "lsls r6, r6, #16\n\t"
  152372. #else
  152373. "lsl r6, r6, #16\n\t"
  152374. #endif
  152375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152376. "adds r3, r3, r6\n\t"
  152377. #else
  152378. "add r3, r3, r6\n\t"
  152379. #endif
  152380. #ifdef WOLFSSL_KEIL
  152381. "adcs r4, r4, r7\n\t"
  152382. #elif defined(__clang__)
  152383. "adcs r4, r7\n\t"
  152384. #else
  152385. "adc r4, r7\n\t"
  152386. #endif
  152387. #ifdef WOLFSSL_KEIL
  152388. "adcs r5, r5, %[r]\n\t"
  152389. #elif defined(__clang__)
  152390. "adcs r5, %[r]\n\t"
  152391. #else
  152392. "adc r5, %[r]\n\t"
  152393. #endif
  152394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152395. "lsrs r6, %[a], #16\n\t"
  152396. #else
  152397. "lsr r6, %[a], #16\n\t"
  152398. #endif
  152399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152400. "lsrs r7, %[b], #16\n\t"
  152401. #else
  152402. "lsr r7, %[b], #16\n\t"
  152403. #endif
  152404. #ifdef WOLFSSL_KEIL
  152405. "muls r7, r6, r7\n\t"
  152406. #elif defined(__clang__)
  152407. "muls r7, r6\n\t"
  152408. #else
  152409. "mul r7, r6\n\t"
  152410. #endif
  152411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152412. "adds r4, r4, r7\n\t"
  152413. #else
  152414. "add r4, r4, r7\n\t"
  152415. #endif
  152416. #ifdef WOLFSSL_KEIL
  152417. "adcs r5, r5, %[r]\n\t"
  152418. #elif defined(__clang__)
  152419. "adcs r5, %[r]\n\t"
  152420. #else
  152421. "adc r5, %[r]\n\t"
  152422. #endif
  152423. "uxth r7, %[b]\n\t"
  152424. #ifdef WOLFSSL_KEIL
  152425. "muls r6, r7, r6\n\t"
  152426. #elif defined(__clang__)
  152427. "muls r6, r7\n\t"
  152428. #else
  152429. "mul r6, r7\n\t"
  152430. #endif
  152431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152432. "lsrs r7, r6, #16\n\t"
  152433. #else
  152434. "lsr r7, r6, #16\n\t"
  152435. #endif
  152436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152437. "lsls r6, r6, #16\n\t"
  152438. #else
  152439. "lsl r6, r6, #16\n\t"
  152440. #endif
  152441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152442. "adds r3, r3, r6\n\t"
  152443. #else
  152444. "add r3, r3, r6\n\t"
  152445. #endif
  152446. #ifdef WOLFSSL_KEIL
  152447. "adcs r4, r4, r7\n\t"
  152448. #elif defined(__clang__)
  152449. "adcs r4, r7\n\t"
  152450. #else
  152451. "adc r4, r7\n\t"
  152452. #endif
  152453. #ifdef WOLFSSL_KEIL
  152454. "adcs r5, r5, %[r]\n\t"
  152455. #elif defined(__clang__)
  152456. "adcs r5, %[r]\n\t"
  152457. #else
  152458. "adc r5, %[r]\n\t"
  152459. #endif
  152460. "# A[11] * B[4]\n\t"
  152461. "mov %[a], r9\n\t"
  152462. "mov %[b], r10\n\t"
  152463. "ldr %[a], [%[a], #44]\n\t"
  152464. "ldr %[b], [%[b], #16]\n\t"
  152465. "uxth r6, %[a]\n\t"
  152466. "uxth r7, %[b]\n\t"
  152467. #ifdef WOLFSSL_KEIL
  152468. "muls r7, r6, r7\n\t"
  152469. #elif defined(__clang__)
  152470. "muls r7, r6\n\t"
  152471. #else
  152472. "mul r7, r6\n\t"
  152473. #endif
  152474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152475. "adds r3, r3, r7\n\t"
  152476. #else
  152477. "add r3, r3, r7\n\t"
  152478. #endif
  152479. #ifdef WOLFSSL_KEIL
  152480. "adcs r4, r4, %[r]\n\t"
  152481. #elif defined(__clang__)
  152482. "adcs r4, %[r]\n\t"
  152483. #else
  152484. "adc r4, %[r]\n\t"
  152485. #endif
  152486. #ifdef WOLFSSL_KEIL
  152487. "adcs r5, r5, %[r]\n\t"
  152488. #elif defined(__clang__)
  152489. "adcs r5, %[r]\n\t"
  152490. #else
  152491. "adc r5, %[r]\n\t"
  152492. #endif
  152493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152494. "lsrs r7, %[b], #16\n\t"
  152495. #else
  152496. "lsr r7, %[b], #16\n\t"
  152497. #endif
  152498. #ifdef WOLFSSL_KEIL
  152499. "muls r6, r7, r6\n\t"
  152500. #elif defined(__clang__)
  152501. "muls r6, r7\n\t"
  152502. #else
  152503. "mul r6, r7\n\t"
  152504. #endif
  152505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152506. "lsrs r7, r6, #16\n\t"
  152507. #else
  152508. "lsr r7, r6, #16\n\t"
  152509. #endif
  152510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152511. "lsls r6, r6, #16\n\t"
  152512. #else
  152513. "lsl r6, r6, #16\n\t"
  152514. #endif
  152515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152516. "adds r3, r3, r6\n\t"
  152517. #else
  152518. "add r3, r3, r6\n\t"
  152519. #endif
  152520. #ifdef WOLFSSL_KEIL
  152521. "adcs r4, r4, r7\n\t"
  152522. #elif defined(__clang__)
  152523. "adcs r4, r7\n\t"
  152524. #else
  152525. "adc r4, r7\n\t"
  152526. #endif
  152527. #ifdef WOLFSSL_KEIL
  152528. "adcs r5, r5, %[r]\n\t"
  152529. #elif defined(__clang__)
  152530. "adcs r5, %[r]\n\t"
  152531. #else
  152532. "adc r5, %[r]\n\t"
  152533. #endif
  152534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152535. "lsrs r6, %[a], #16\n\t"
  152536. #else
  152537. "lsr r6, %[a], #16\n\t"
  152538. #endif
  152539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152540. "lsrs r7, %[b], #16\n\t"
  152541. #else
  152542. "lsr r7, %[b], #16\n\t"
  152543. #endif
  152544. #ifdef WOLFSSL_KEIL
  152545. "muls r7, r6, r7\n\t"
  152546. #elif defined(__clang__)
  152547. "muls r7, r6\n\t"
  152548. #else
  152549. "mul r7, r6\n\t"
  152550. #endif
  152551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152552. "adds r4, r4, r7\n\t"
  152553. #else
  152554. "add r4, r4, r7\n\t"
  152555. #endif
  152556. #ifdef WOLFSSL_KEIL
  152557. "adcs r5, r5, %[r]\n\t"
  152558. #elif defined(__clang__)
  152559. "adcs r5, %[r]\n\t"
  152560. #else
  152561. "adc r5, %[r]\n\t"
  152562. #endif
  152563. "uxth r7, %[b]\n\t"
  152564. #ifdef WOLFSSL_KEIL
  152565. "muls r6, r7, r6\n\t"
  152566. #elif defined(__clang__)
  152567. "muls r6, r7\n\t"
  152568. #else
  152569. "mul r6, r7\n\t"
  152570. #endif
  152571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152572. "lsrs r7, r6, #16\n\t"
  152573. #else
  152574. "lsr r7, r6, #16\n\t"
  152575. #endif
  152576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152577. "lsls r6, r6, #16\n\t"
  152578. #else
  152579. "lsl r6, r6, #16\n\t"
  152580. #endif
  152581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152582. "adds r3, r3, r6\n\t"
  152583. #else
  152584. "add r3, r3, r6\n\t"
  152585. #endif
  152586. #ifdef WOLFSSL_KEIL
  152587. "adcs r4, r4, r7\n\t"
  152588. #elif defined(__clang__)
  152589. "adcs r4, r7\n\t"
  152590. #else
  152591. "adc r4, r7\n\t"
  152592. #endif
  152593. #ifdef WOLFSSL_KEIL
  152594. "adcs r5, r5, %[r]\n\t"
  152595. #elif defined(__clang__)
  152596. "adcs r5, %[r]\n\t"
  152597. #else
  152598. "adc r5, %[r]\n\t"
  152599. #endif
  152600. "# A[12] * B[3]\n\t"
  152601. "mov %[a], r9\n\t"
  152602. "mov %[b], r10\n\t"
  152603. "ldr %[a], [%[a], #48]\n\t"
  152604. "ldr %[b], [%[b], #12]\n\t"
  152605. "uxth r6, %[a]\n\t"
  152606. "uxth r7, %[b]\n\t"
  152607. #ifdef WOLFSSL_KEIL
  152608. "muls r7, r6, r7\n\t"
  152609. #elif defined(__clang__)
  152610. "muls r7, r6\n\t"
  152611. #else
  152612. "mul r7, r6\n\t"
  152613. #endif
  152614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152615. "adds r3, r3, r7\n\t"
  152616. #else
  152617. "add r3, r3, r7\n\t"
  152618. #endif
  152619. #ifdef WOLFSSL_KEIL
  152620. "adcs r4, r4, %[r]\n\t"
  152621. #elif defined(__clang__)
  152622. "adcs r4, %[r]\n\t"
  152623. #else
  152624. "adc r4, %[r]\n\t"
  152625. #endif
  152626. #ifdef WOLFSSL_KEIL
  152627. "adcs r5, r5, %[r]\n\t"
  152628. #elif defined(__clang__)
  152629. "adcs r5, %[r]\n\t"
  152630. #else
  152631. "adc r5, %[r]\n\t"
  152632. #endif
  152633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152634. "lsrs r7, %[b], #16\n\t"
  152635. #else
  152636. "lsr r7, %[b], #16\n\t"
  152637. #endif
  152638. #ifdef WOLFSSL_KEIL
  152639. "muls r6, r7, r6\n\t"
  152640. #elif defined(__clang__)
  152641. "muls r6, r7\n\t"
  152642. #else
  152643. "mul r6, r7\n\t"
  152644. #endif
  152645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152646. "lsrs r7, r6, #16\n\t"
  152647. #else
  152648. "lsr r7, r6, #16\n\t"
  152649. #endif
  152650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152651. "lsls r6, r6, #16\n\t"
  152652. #else
  152653. "lsl r6, r6, #16\n\t"
  152654. #endif
  152655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152656. "adds r3, r3, r6\n\t"
  152657. #else
  152658. "add r3, r3, r6\n\t"
  152659. #endif
  152660. #ifdef WOLFSSL_KEIL
  152661. "adcs r4, r4, r7\n\t"
  152662. #elif defined(__clang__)
  152663. "adcs r4, r7\n\t"
  152664. #else
  152665. "adc r4, r7\n\t"
  152666. #endif
  152667. #ifdef WOLFSSL_KEIL
  152668. "adcs r5, r5, %[r]\n\t"
  152669. #elif defined(__clang__)
  152670. "adcs r5, %[r]\n\t"
  152671. #else
  152672. "adc r5, %[r]\n\t"
  152673. #endif
  152674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152675. "lsrs r6, %[a], #16\n\t"
  152676. #else
  152677. "lsr r6, %[a], #16\n\t"
  152678. #endif
  152679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152680. "lsrs r7, %[b], #16\n\t"
  152681. #else
  152682. "lsr r7, %[b], #16\n\t"
  152683. #endif
  152684. #ifdef WOLFSSL_KEIL
  152685. "muls r7, r6, r7\n\t"
  152686. #elif defined(__clang__)
  152687. "muls r7, r6\n\t"
  152688. #else
  152689. "mul r7, r6\n\t"
  152690. #endif
  152691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152692. "adds r4, r4, r7\n\t"
  152693. #else
  152694. "add r4, r4, r7\n\t"
  152695. #endif
  152696. #ifdef WOLFSSL_KEIL
  152697. "adcs r5, r5, %[r]\n\t"
  152698. #elif defined(__clang__)
  152699. "adcs r5, %[r]\n\t"
  152700. #else
  152701. "adc r5, %[r]\n\t"
  152702. #endif
  152703. "uxth r7, %[b]\n\t"
  152704. #ifdef WOLFSSL_KEIL
  152705. "muls r6, r7, r6\n\t"
  152706. #elif defined(__clang__)
  152707. "muls r6, r7\n\t"
  152708. #else
  152709. "mul r6, r7\n\t"
  152710. #endif
  152711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152712. "lsrs r7, r6, #16\n\t"
  152713. #else
  152714. "lsr r7, r6, #16\n\t"
  152715. #endif
  152716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152717. "lsls r6, r6, #16\n\t"
  152718. #else
  152719. "lsl r6, r6, #16\n\t"
  152720. #endif
  152721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152722. "adds r3, r3, r6\n\t"
  152723. #else
  152724. "add r3, r3, r6\n\t"
  152725. #endif
  152726. #ifdef WOLFSSL_KEIL
  152727. "adcs r4, r4, r7\n\t"
  152728. #elif defined(__clang__)
  152729. "adcs r4, r7\n\t"
  152730. #else
  152731. "adc r4, r7\n\t"
  152732. #endif
  152733. #ifdef WOLFSSL_KEIL
  152734. "adcs r5, r5, %[r]\n\t"
  152735. #elif defined(__clang__)
  152736. "adcs r5, %[r]\n\t"
  152737. #else
  152738. "adc r5, %[r]\n\t"
  152739. #endif
  152740. "# A[13] * B[2]\n\t"
  152741. "mov %[a], r9\n\t"
  152742. "mov %[b], r10\n\t"
  152743. "ldr %[a], [%[a], #52]\n\t"
  152744. "ldr %[b], [%[b], #8]\n\t"
  152745. "uxth r6, %[a]\n\t"
  152746. "uxth r7, %[b]\n\t"
  152747. #ifdef WOLFSSL_KEIL
  152748. "muls r7, r6, r7\n\t"
  152749. #elif defined(__clang__)
  152750. "muls r7, r6\n\t"
  152751. #else
  152752. "mul r7, r6\n\t"
  152753. #endif
  152754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152755. "adds r3, r3, r7\n\t"
  152756. #else
  152757. "add r3, r3, r7\n\t"
  152758. #endif
  152759. #ifdef WOLFSSL_KEIL
  152760. "adcs r4, r4, %[r]\n\t"
  152761. #elif defined(__clang__)
  152762. "adcs r4, %[r]\n\t"
  152763. #else
  152764. "adc r4, %[r]\n\t"
  152765. #endif
  152766. #ifdef WOLFSSL_KEIL
  152767. "adcs r5, r5, %[r]\n\t"
  152768. #elif defined(__clang__)
  152769. "adcs r5, %[r]\n\t"
  152770. #else
  152771. "adc r5, %[r]\n\t"
  152772. #endif
  152773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152774. "lsrs r7, %[b], #16\n\t"
  152775. #else
  152776. "lsr r7, %[b], #16\n\t"
  152777. #endif
  152778. #ifdef WOLFSSL_KEIL
  152779. "muls r6, r7, r6\n\t"
  152780. #elif defined(__clang__)
  152781. "muls r6, r7\n\t"
  152782. #else
  152783. "mul r6, r7\n\t"
  152784. #endif
  152785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152786. "lsrs r7, r6, #16\n\t"
  152787. #else
  152788. "lsr r7, r6, #16\n\t"
  152789. #endif
  152790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152791. "lsls r6, r6, #16\n\t"
  152792. #else
  152793. "lsl r6, r6, #16\n\t"
  152794. #endif
  152795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152796. "adds r3, r3, r6\n\t"
  152797. #else
  152798. "add r3, r3, r6\n\t"
  152799. #endif
  152800. #ifdef WOLFSSL_KEIL
  152801. "adcs r4, r4, r7\n\t"
  152802. #elif defined(__clang__)
  152803. "adcs r4, r7\n\t"
  152804. #else
  152805. "adc r4, r7\n\t"
  152806. #endif
  152807. #ifdef WOLFSSL_KEIL
  152808. "adcs r5, r5, %[r]\n\t"
  152809. #elif defined(__clang__)
  152810. "adcs r5, %[r]\n\t"
  152811. #else
  152812. "adc r5, %[r]\n\t"
  152813. #endif
  152814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152815. "lsrs r6, %[a], #16\n\t"
  152816. #else
  152817. "lsr r6, %[a], #16\n\t"
  152818. #endif
  152819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152820. "lsrs r7, %[b], #16\n\t"
  152821. #else
  152822. "lsr r7, %[b], #16\n\t"
  152823. #endif
  152824. #ifdef WOLFSSL_KEIL
  152825. "muls r7, r6, r7\n\t"
  152826. #elif defined(__clang__)
  152827. "muls r7, r6\n\t"
  152828. #else
  152829. "mul r7, r6\n\t"
  152830. #endif
  152831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152832. "adds r4, r4, r7\n\t"
  152833. #else
  152834. "add r4, r4, r7\n\t"
  152835. #endif
  152836. #ifdef WOLFSSL_KEIL
  152837. "adcs r5, r5, %[r]\n\t"
  152838. #elif defined(__clang__)
  152839. "adcs r5, %[r]\n\t"
  152840. #else
  152841. "adc r5, %[r]\n\t"
  152842. #endif
  152843. "uxth r7, %[b]\n\t"
  152844. #ifdef WOLFSSL_KEIL
  152845. "muls r6, r7, r6\n\t"
  152846. #elif defined(__clang__)
  152847. "muls r6, r7\n\t"
  152848. #else
  152849. "mul r6, r7\n\t"
  152850. #endif
  152851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152852. "lsrs r7, r6, #16\n\t"
  152853. #else
  152854. "lsr r7, r6, #16\n\t"
  152855. #endif
  152856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152857. "lsls r6, r6, #16\n\t"
  152858. #else
  152859. "lsl r6, r6, #16\n\t"
  152860. #endif
  152861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152862. "adds r3, r3, r6\n\t"
  152863. #else
  152864. "add r3, r3, r6\n\t"
  152865. #endif
  152866. #ifdef WOLFSSL_KEIL
  152867. "adcs r4, r4, r7\n\t"
  152868. #elif defined(__clang__)
  152869. "adcs r4, r7\n\t"
  152870. #else
  152871. "adc r4, r7\n\t"
  152872. #endif
  152873. #ifdef WOLFSSL_KEIL
  152874. "adcs r5, r5, %[r]\n\t"
  152875. #elif defined(__clang__)
  152876. "adcs r5, %[r]\n\t"
  152877. #else
  152878. "adc r5, %[r]\n\t"
  152879. #endif
  152880. "# A[14] * B[1]\n\t"
  152881. "mov %[a], r9\n\t"
  152882. "mov %[b], r10\n\t"
  152883. "ldr %[a], [%[a], #56]\n\t"
  152884. "ldr %[b], [%[b], #4]\n\t"
  152885. "uxth r6, %[a]\n\t"
  152886. "uxth r7, %[b]\n\t"
  152887. #ifdef WOLFSSL_KEIL
  152888. "muls r7, r6, r7\n\t"
  152889. #elif defined(__clang__)
  152890. "muls r7, r6\n\t"
  152891. #else
  152892. "mul r7, r6\n\t"
  152893. #endif
  152894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152895. "adds r3, r3, r7\n\t"
  152896. #else
  152897. "add r3, r3, r7\n\t"
  152898. #endif
  152899. #ifdef WOLFSSL_KEIL
  152900. "adcs r4, r4, %[r]\n\t"
  152901. #elif defined(__clang__)
  152902. "adcs r4, %[r]\n\t"
  152903. #else
  152904. "adc r4, %[r]\n\t"
  152905. #endif
  152906. #ifdef WOLFSSL_KEIL
  152907. "adcs r5, r5, %[r]\n\t"
  152908. #elif defined(__clang__)
  152909. "adcs r5, %[r]\n\t"
  152910. #else
  152911. "adc r5, %[r]\n\t"
  152912. #endif
  152913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152914. "lsrs r7, %[b], #16\n\t"
  152915. #else
  152916. "lsr r7, %[b], #16\n\t"
  152917. #endif
  152918. #ifdef WOLFSSL_KEIL
  152919. "muls r6, r7, r6\n\t"
  152920. #elif defined(__clang__)
  152921. "muls r6, r7\n\t"
  152922. #else
  152923. "mul r6, r7\n\t"
  152924. #endif
  152925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152926. "lsrs r7, r6, #16\n\t"
  152927. #else
  152928. "lsr r7, r6, #16\n\t"
  152929. #endif
  152930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152931. "lsls r6, r6, #16\n\t"
  152932. #else
  152933. "lsl r6, r6, #16\n\t"
  152934. #endif
  152935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152936. "adds r3, r3, r6\n\t"
  152937. #else
  152938. "add r3, r3, r6\n\t"
  152939. #endif
  152940. #ifdef WOLFSSL_KEIL
  152941. "adcs r4, r4, r7\n\t"
  152942. #elif defined(__clang__)
  152943. "adcs r4, r7\n\t"
  152944. #else
  152945. "adc r4, r7\n\t"
  152946. #endif
  152947. #ifdef WOLFSSL_KEIL
  152948. "adcs r5, r5, %[r]\n\t"
  152949. #elif defined(__clang__)
  152950. "adcs r5, %[r]\n\t"
  152951. #else
  152952. "adc r5, %[r]\n\t"
  152953. #endif
  152954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152955. "lsrs r6, %[a], #16\n\t"
  152956. #else
  152957. "lsr r6, %[a], #16\n\t"
  152958. #endif
  152959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152960. "lsrs r7, %[b], #16\n\t"
  152961. #else
  152962. "lsr r7, %[b], #16\n\t"
  152963. #endif
  152964. #ifdef WOLFSSL_KEIL
  152965. "muls r7, r6, r7\n\t"
  152966. #elif defined(__clang__)
  152967. "muls r7, r6\n\t"
  152968. #else
  152969. "mul r7, r6\n\t"
  152970. #endif
  152971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152972. "adds r4, r4, r7\n\t"
  152973. #else
  152974. "add r4, r4, r7\n\t"
  152975. #endif
  152976. #ifdef WOLFSSL_KEIL
  152977. "adcs r5, r5, %[r]\n\t"
  152978. #elif defined(__clang__)
  152979. "adcs r5, %[r]\n\t"
  152980. #else
  152981. "adc r5, %[r]\n\t"
  152982. #endif
  152983. "uxth r7, %[b]\n\t"
  152984. #ifdef WOLFSSL_KEIL
  152985. "muls r6, r7, r6\n\t"
  152986. #elif defined(__clang__)
  152987. "muls r6, r7\n\t"
  152988. #else
  152989. "mul r6, r7\n\t"
  152990. #endif
  152991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152992. "lsrs r7, r6, #16\n\t"
  152993. #else
  152994. "lsr r7, r6, #16\n\t"
  152995. #endif
  152996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  152997. "lsls r6, r6, #16\n\t"
  152998. #else
  152999. "lsl r6, r6, #16\n\t"
  153000. #endif
  153001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153002. "adds r3, r3, r6\n\t"
  153003. #else
  153004. "add r3, r3, r6\n\t"
  153005. #endif
  153006. #ifdef WOLFSSL_KEIL
  153007. "adcs r4, r4, r7\n\t"
  153008. #elif defined(__clang__)
  153009. "adcs r4, r7\n\t"
  153010. #else
  153011. "adc r4, r7\n\t"
  153012. #endif
  153013. #ifdef WOLFSSL_KEIL
  153014. "adcs r5, r5, %[r]\n\t"
  153015. #elif defined(__clang__)
  153016. "adcs r5, %[r]\n\t"
  153017. #else
  153018. "adc r5, %[r]\n\t"
  153019. #endif
  153020. "# A[15] * B[0]\n\t"
  153021. "mov %[a], r9\n\t"
  153022. "mov %[b], r10\n\t"
  153023. "ldr %[a], [%[a], #60]\n\t"
  153024. "ldr %[b], [%[b]]\n\t"
  153025. "uxth r6, %[a]\n\t"
  153026. "uxth r7, %[b]\n\t"
  153027. #ifdef WOLFSSL_KEIL
  153028. "muls r7, r6, r7\n\t"
  153029. #elif defined(__clang__)
  153030. "muls r7, r6\n\t"
  153031. #else
  153032. "mul r7, r6\n\t"
  153033. #endif
  153034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153035. "adds r3, r3, r7\n\t"
  153036. #else
  153037. "add r3, r3, r7\n\t"
  153038. #endif
  153039. #ifdef WOLFSSL_KEIL
  153040. "adcs r4, r4, %[r]\n\t"
  153041. #elif defined(__clang__)
  153042. "adcs r4, %[r]\n\t"
  153043. #else
  153044. "adc r4, %[r]\n\t"
  153045. #endif
  153046. #ifdef WOLFSSL_KEIL
  153047. "adcs r5, r5, %[r]\n\t"
  153048. #elif defined(__clang__)
  153049. "adcs r5, %[r]\n\t"
  153050. #else
  153051. "adc r5, %[r]\n\t"
  153052. #endif
  153053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153054. "lsrs r7, %[b], #16\n\t"
  153055. #else
  153056. "lsr r7, %[b], #16\n\t"
  153057. #endif
  153058. #ifdef WOLFSSL_KEIL
  153059. "muls r6, r7, r6\n\t"
  153060. #elif defined(__clang__)
  153061. "muls r6, r7\n\t"
  153062. #else
  153063. "mul r6, r7\n\t"
  153064. #endif
  153065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153066. "lsrs r7, r6, #16\n\t"
  153067. #else
  153068. "lsr r7, r6, #16\n\t"
  153069. #endif
  153070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153071. "lsls r6, r6, #16\n\t"
  153072. #else
  153073. "lsl r6, r6, #16\n\t"
  153074. #endif
  153075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153076. "adds r3, r3, r6\n\t"
  153077. #else
  153078. "add r3, r3, r6\n\t"
  153079. #endif
  153080. #ifdef WOLFSSL_KEIL
  153081. "adcs r4, r4, r7\n\t"
  153082. #elif defined(__clang__)
  153083. "adcs r4, r7\n\t"
  153084. #else
  153085. "adc r4, r7\n\t"
  153086. #endif
  153087. #ifdef WOLFSSL_KEIL
  153088. "adcs r5, r5, %[r]\n\t"
  153089. #elif defined(__clang__)
  153090. "adcs r5, %[r]\n\t"
  153091. #else
  153092. "adc r5, %[r]\n\t"
  153093. #endif
  153094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153095. "lsrs r6, %[a], #16\n\t"
  153096. #else
  153097. "lsr r6, %[a], #16\n\t"
  153098. #endif
  153099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153100. "lsrs r7, %[b], #16\n\t"
  153101. #else
  153102. "lsr r7, %[b], #16\n\t"
  153103. #endif
  153104. #ifdef WOLFSSL_KEIL
  153105. "muls r7, r6, r7\n\t"
  153106. #elif defined(__clang__)
  153107. "muls r7, r6\n\t"
  153108. #else
  153109. "mul r7, r6\n\t"
  153110. #endif
  153111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153112. "adds r4, r4, r7\n\t"
  153113. #else
  153114. "add r4, r4, r7\n\t"
  153115. #endif
  153116. #ifdef WOLFSSL_KEIL
  153117. "adcs r5, r5, %[r]\n\t"
  153118. #elif defined(__clang__)
  153119. "adcs r5, %[r]\n\t"
  153120. #else
  153121. "adc r5, %[r]\n\t"
  153122. #endif
  153123. "uxth r7, %[b]\n\t"
  153124. #ifdef WOLFSSL_KEIL
  153125. "muls r6, r7, r6\n\t"
  153126. #elif defined(__clang__)
  153127. "muls r6, r7\n\t"
  153128. #else
  153129. "mul r6, r7\n\t"
  153130. #endif
  153131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153132. "lsrs r7, r6, #16\n\t"
  153133. #else
  153134. "lsr r7, r6, #16\n\t"
  153135. #endif
  153136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153137. "lsls r6, r6, #16\n\t"
  153138. #else
  153139. "lsl r6, r6, #16\n\t"
  153140. #endif
  153141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153142. "adds r3, r3, r6\n\t"
  153143. #else
  153144. "add r3, r3, r6\n\t"
  153145. #endif
  153146. #ifdef WOLFSSL_KEIL
  153147. "adcs r4, r4, r7\n\t"
  153148. #elif defined(__clang__)
  153149. "adcs r4, r7\n\t"
  153150. #else
  153151. "adc r4, r7\n\t"
  153152. #endif
  153153. #ifdef WOLFSSL_KEIL
  153154. "adcs r5, r5, %[r]\n\t"
  153155. #elif defined(__clang__)
  153156. "adcs r5, %[r]\n\t"
  153157. #else
  153158. "adc r5, %[r]\n\t"
  153159. #endif
  153160. "str r3, [sp, #60]\n\t"
  153161. "# A[15] * B[1]\n\t"
  153162. "movs r3, #0\n\t"
  153163. "mov %[a], r9\n\t"
  153164. "mov %[b], r10\n\t"
  153165. "ldr %[a], [%[a], #60]\n\t"
  153166. "ldr %[b], [%[b], #4]\n\t"
  153167. "uxth r6, %[a]\n\t"
  153168. "uxth r7, %[b]\n\t"
  153169. #ifdef WOLFSSL_KEIL
  153170. "muls r7, r6, r7\n\t"
  153171. #elif defined(__clang__)
  153172. "muls r7, r6\n\t"
  153173. #else
  153174. "mul r7, r6\n\t"
  153175. #endif
  153176. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153177. "adds r4, r4, r7\n\t"
  153178. #else
  153179. "add r4, r4, r7\n\t"
  153180. #endif
  153181. #ifdef WOLFSSL_KEIL
  153182. "adcs r5, r5, %[r]\n\t"
  153183. #elif defined(__clang__)
  153184. "adcs r5, %[r]\n\t"
  153185. #else
  153186. "adc r5, %[r]\n\t"
  153187. #endif
  153188. #ifdef WOLFSSL_KEIL
  153189. "adcs r3, r3, %[r]\n\t"
  153190. #elif defined(__clang__)
  153191. "adcs r3, %[r]\n\t"
  153192. #else
  153193. "adc r3, %[r]\n\t"
  153194. #endif
  153195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153196. "lsrs r7, %[b], #16\n\t"
  153197. #else
  153198. "lsr r7, %[b], #16\n\t"
  153199. #endif
  153200. #ifdef WOLFSSL_KEIL
  153201. "muls r6, r7, r6\n\t"
  153202. #elif defined(__clang__)
  153203. "muls r6, r7\n\t"
  153204. #else
  153205. "mul r6, r7\n\t"
  153206. #endif
  153207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153208. "lsrs r7, r6, #16\n\t"
  153209. #else
  153210. "lsr r7, r6, #16\n\t"
  153211. #endif
  153212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153213. "lsls r6, r6, #16\n\t"
  153214. #else
  153215. "lsl r6, r6, #16\n\t"
  153216. #endif
  153217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153218. "adds r4, r4, r6\n\t"
  153219. #else
  153220. "add r4, r4, r6\n\t"
  153221. #endif
  153222. #ifdef WOLFSSL_KEIL
  153223. "adcs r5, r5, r7\n\t"
  153224. #elif defined(__clang__)
  153225. "adcs r5, r7\n\t"
  153226. #else
  153227. "adc r5, r7\n\t"
  153228. #endif
  153229. #ifdef WOLFSSL_KEIL
  153230. "adcs r3, r3, %[r]\n\t"
  153231. #elif defined(__clang__)
  153232. "adcs r3, %[r]\n\t"
  153233. #else
  153234. "adc r3, %[r]\n\t"
  153235. #endif
  153236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153237. "lsrs r6, %[a], #16\n\t"
  153238. #else
  153239. "lsr r6, %[a], #16\n\t"
  153240. #endif
  153241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153242. "lsrs r7, %[b], #16\n\t"
  153243. #else
  153244. "lsr r7, %[b], #16\n\t"
  153245. #endif
  153246. #ifdef WOLFSSL_KEIL
  153247. "muls r7, r6, r7\n\t"
  153248. #elif defined(__clang__)
  153249. "muls r7, r6\n\t"
  153250. #else
  153251. "mul r7, r6\n\t"
  153252. #endif
  153253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153254. "adds r5, r5, r7\n\t"
  153255. #else
  153256. "add r5, r5, r7\n\t"
  153257. #endif
  153258. #ifdef WOLFSSL_KEIL
  153259. "adcs r3, r3, %[r]\n\t"
  153260. #elif defined(__clang__)
  153261. "adcs r3, %[r]\n\t"
  153262. #else
  153263. "adc r3, %[r]\n\t"
  153264. #endif
  153265. "uxth r7, %[b]\n\t"
  153266. #ifdef WOLFSSL_KEIL
  153267. "muls r6, r7, r6\n\t"
  153268. #elif defined(__clang__)
  153269. "muls r6, r7\n\t"
  153270. #else
  153271. "mul r6, r7\n\t"
  153272. #endif
  153273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153274. "lsrs r7, r6, #16\n\t"
  153275. #else
  153276. "lsr r7, r6, #16\n\t"
  153277. #endif
  153278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153279. "lsls r6, r6, #16\n\t"
  153280. #else
  153281. "lsl r6, r6, #16\n\t"
  153282. #endif
  153283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153284. "adds r4, r4, r6\n\t"
  153285. #else
  153286. "add r4, r4, r6\n\t"
  153287. #endif
  153288. #ifdef WOLFSSL_KEIL
  153289. "adcs r5, r5, r7\n\t"
  153290. #elif defined(__clang__)
  153291. "adcs r5, r7\n\t"
  153292. #else
  153293. "adc r5, r7\n\t"
  153294. #endif
  153295. #ifdef WOLFSSL_KEIL
  153296. "adcs r3, r3, %[r]\n\t"
  153297. #elif defined(__clang__)
  153298. "adcs r3, %[r]\n\t"
  153299. #else
  153300. "adc r3, %[r]\n\t"
  153301. #endif
  153302. "# A[14] * B[2]\n\t"
  153303. "mov %[a], r9\n\t"
  153304. "mov %[b], r10\n\t"
  153305. "ldr %[a], [%[a], #56]\n\t"
  153306. "ldr %[b], [%[b], #8]\n\t"
  153307. "uxth r6, %[a]\n\t"
  153308. "uxth r7, %[b]\n\t"
  153309. #ifdef WOLFSSL_KEIL
  153310. "muls r7, r6, r7\n\t"
  153311. #elif defined(__clang__)
  153312. "muls r7, r6\n\t"
  153313. #else
  153314. "mul r7, r6\n\t"
  153315. #endif
  153316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153317. "adds r4, r4, r7\n\t"
  153318. #else
  153319. "add r4, r4, r7\n\t"
  153320. #endif
  153321. #ifdef WOLFSSL_KEIL
  153322. "adcs r5, r5, %[r]\n\t"
  153323. #elif defined(__clang__)
  153324. "adcs r5, %[r]\n\t"
  153325. #else
  153326. "adc r5, %[r]\n\t"
  153327. #endif
  153328. #ifdef WOLFSSL_KEIL
  153329. "adcs r3, r3, %[r]\n\t"
  153330. #elif defined(__clang__)
  153331. "adcs r3, %[r]\n\t"
  153332. #else
  153333. "adc r3, %[r]\n\t"
  153334. #endif
  153335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153336. "lsrs r7, %[b], #16\n\t"
  153337. #else
  153338. "lsr r7, %[b], #16\n\t"
  153339. #endif
  153340. #ifdef WOLFSSL_KEIL
  153341. "muls r6, r7, r6\n\t"
  153342. #elif defined(__clang__)
  153343. "muls r6, r7\n\t"
  153344. #else
  153345. "mul r6, r7\n\t"
  153346. #endif
  153347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153348. "lsrs r7, r6, #16\n\t"
  153349. #else
  153350. "lsr r7, r6, #16\n\t"
  153351. #endif
  153352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153353. "lsls r6, r6, #16\n\t"
  153354. #else
  153355. "lsl r6, r6, #16\n\t"
  153356. #endif
  153357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153358. "adds r4, r4, r6\n\t"
  153359. #else
  153360. "add r4, r4, r6\n\t"
  153361. #endif
  153362. #ifdef WOLFSSL_KEIL
  153363. "adcs r5, r5, r7\n\t"
  153364. #elif defined(__clang__)
  153365. "adcs r5, r7\n\t"
  153366. #else
  153367. "adc r5, r7\n\t"
  153368. #endif
  153369. #ifdef WOLFSSL_KEIL
  153370. "adcs r3, r3, %[r]\n\t"
  153371. #elif defined(__clang__)
  153372. "adcs r3, %[r]\n\t"
  153373. #else
  153374. "adc r3, %[r]\n\t"
  153375. #endif
  153376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153377. "lsrs r6, %[a], #16\n\t"
  153378. #else
  153379. "lsr r6, %[a], #16\n\t"
  153380. #endif
  153381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153382. "lsrs r7, %[b], #16\n\t"
  153383. #else
  153384. "lsr r7, %[b], #16\n\t"
  153385. #endif
  153386. #ifdef WOLFSSL_KEIL
  153387. "muls r7, r6, r7\n\t"
  153388. #elif defined(__clang__)
  153389. "muls r7, r6\n\t"
  153390. #else
  153391. "mul r7, r6\n\t"
  153392. #endif
  153393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153394. "adds r5, r5, r7\n\t"
  153395. #else
  153396. "add r5, r5, r7\n\t"
  153397. #endif
  153398. #ifdef WOLFSSL_KEIL
  153399. "adcs r3, r3, %[r]\n\t"
  153400. #elif defined(__clang__)
  153401. "adcs r3, %[r]\n\t"
  153402. #else
  153403. "adc r3, %[r]\n\t"
  153404. #endif
  153405. "uxth r7, %[b]\n\t"
  153406. #ifdef WOLFSSL_KEIL
  153407. "muls r6, r7, r6\n\t"
  153408. #elif defined(__clang__)
  153409. "muls r6, r7\n\t"
  153410. #else
  153411. "mul r6, r7\n\t"
  153412. #endif
  153413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153414. "lsrs r7, r6, #16\n\t"
  153415. #else
  153416. "lsr r7, r6, #16\n\t"
  153417. #endif
  153418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153419. "lsls r6, r6, #16\n\t"
  153420. #else
  153421. "lsl r6, r6, #16\n\t"
  153422. #endif
  153423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153424. "adds r4, r4, r6\n\t"
  153425. #else
  153426. "add r4, r4, r6\n\t"
  153427. #endif
  153428. #ifdef WOLFSSL_KEIL
  153429. "adcs r5, r5, r7\n\t"
  153430. #elif defined(__clang__)
  153431. "adcs r5, r7\n\t"
  153432. #else
  153433. "adc r5, r7\n\t"
  153434. #endif
  153435. #ifdef WOLFSSL_KEIL
  153436. "adcs r3, r3, %[r]\n\t"
  153437. #elif defined(__clang__)
  153438. "adcs r3, %[r]\n\t"
  153439. #else
  153440. "adc r3, %[r]\n\t"
  153441. #endif
  153442. "# A[13] * B[3]\n\t"
  153443. "mov %[a], r9\n\t"
  153444. "mov %[b], r10\n\t"
  153445. "ldr %[a], [%[a], #52]\n\t"
  153446. "ldr %[b], [%[b], #12]\n\t"
  153447. "uxth r6, %[a]\n\t"
  153448. "uxth r7, %[b]\n\t"
  153449. #ifdef WOLFSSL_KEIL
  153450. "muls r7, r6, r7\n\t"
  153451. #elif defined(__clang__)
  153452. "muls r7, r6\n\t"
  153453. #else
  153454. "mul r7, r6\n\t"
  153455. #endif
  153456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153457. "adds r4, r4, r7\n\t"
  153458. #else
  153459. "add r4, r4, r7\n\t"
  153460. #endif
  153461. #ifdef WOLFSSL_KEIL
  153462. "adcs r5, r5, %[r]\n\t"
  153463. #elif defined(__clang__)
  153464. "adcs r5, %[r]\n\t"
  153465. #else
  153466. "adc r5, %[r]\n\t"
  153467. #endif
  153468. #ifdef WOLFSSL_KEIL
  153469. "adcs r3, r3, %[r]\n\t"
  153470. #elif defined(__clang__)
  153471. "adcs r3, %[r]\n\t"
  153472. #else
  153473. "adc r3, %[r]\n\t"
  153474. #endif
  153475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153476. "lsrs r7, %[b], #16\n\t"
  153477. #else
  153478. "lsr r7, %[b], #16\n\t"
  153479. #endif
  153480. #ifdef WOLFSSL_KEIL
  153481. "muls r6, r7, r6\n\t"
  153482. #elif defined(__clang__)
  153483. "muls r6, r7\n\t"
  153484. #else
  153485. "mul r6, r7\n\t"
  153486. #endif
  153487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153488. "lsrs r7, r6, #16\n\t"
  153489. #else
  153490. "lsr r7, r6, #16\n\t"
  153491. #endif
  153492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153493. "lsls r6, r6, #16\n\t"
  153494. #else
  153495. "lsl r6, r6, #16\n\t"
  153496. #endif
  153497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153498. "adds r4, r4, r6\n\t"
  153499. #else
  153500. "add r4, r4, r6\n\t"
  153501. #endif
  153502. #ifdef WOLFSSL_KEIL
  153503. "adcs r5, r5, r7\n\t"
  153504. #elif defined(__clang__)
  153505. "adcs r5, r7\n\t"
  153506. #else
  153507. "adc r5, r7\n\t"
  153508. #endif
  153509. #ifdef WOLFSSL_KEIL
  153510. "adcs r3, r3, %[r]\n\t"
  153511. #elif defined(__clang__)
  153512. "adcs r3, %[r]\n\t"
  153513. #else
  153514. "adc r3, %[r]\n\t"
  153515. #endif
  153516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153517. "lsrs r6, %[a], #16\n\t"
  153518. #else
  153519. "lsr r6, %[a], #16\n\t"
  153520. #endif
  153521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153522. "lsrs r7, %[b], #16\n\t"
  153523. #else
  153524. "lsr r7, %[b], #16\n\t"
  153525. #endif
  153526. #ifdef WOLFSSL_KEIL
  153527. "muls r7, r6, r7\n\t"
  153528. #elif defined(__clang__)
  153529. "muls r7, r6\n\t"
  153530. #else
  153531. "mul r7, r6\n\t"
  153532. #endif
  153533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153534. "adds r5, r5, r7\n\t"
  153535. #else
  153536. "add r5, r5, r7\n\t"
  153537. #endif
  153538. #ifdef WOLFSSL_KEIL
  153539. "adcs r3, r3, %[r]\n\t"
  153540. #elif defined(__clang__)
  153541. "adcs r3, %[r]\n\t"
  153542. #else
  153543. "adc r3, %[r]\n\t"
  153544. #endif
  153545. "uxth r7, %[b]\n\t"
  153546. #ifdef WOLFSSL_KEIL
  153547. "muls r6, r7, r6\n\t"
  153548. #elif defined(__clang__)
  153549. "muls r6, r7\n\t"
  153550. #else
  153551. "mul r6, r7\n\t"
  153552. #endif
  153553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153554. "lsrs r7, r6, #16\n\t"
  153555. #else
  153556. "lsr r7, r6, #16\n\t"
  153557. #endif
  153558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153559. "lsls r6, r6, #16\n\t"
  153560. #else
  153561. "lsl r6, r6, #16\n\t"
  153562. #endif
  153563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153564. "adds r4, r4, r6\n\t"
  153565. #else
  153566. "add r4, r4, r6\n\t"
  153567. #endif
  153568. #ifdef WOLFSSL_KEIL
  153569. "adcs r5, r5, r7\n\t"
  153570. #elif defined(__clang__)
  153571. "adcs r5, r7\n\t"
  153572. #else
  153573. "adc r5, r7\n\t"
  153574. #endif
  153575. #ifdef WOLFSSL_KEIL
  153576. "adcs r3, r3, %[r]\n\t"
  153577. #elif defined(__clang__)
  153578. "adcs r3, %[r]\n\t"
  153579. #else
  153580. "adc r3, %[r]\n\t"
  153581. #endif
  153582. "# A[12] * B[4]\n\t"
  153583. "mov %[a], r9\n\t"
  153584. "mov %[b], r10\n\t"
  153585. "ldr %[a], [%[a], #48]\n\t"
  153586. "ldr %[b], [%[b], #16]\n\t"
  153587. "uxth r6, %[a]\n\t"
  153588. "uxth r7, %[b]\n\t"
  153589. #ifdef WOLFSSL_KEIL
  153590. "muls r7, r6, r7\n\t"
  153591. #elif defined(__clang__)
  153592. "muls r7, r6\n\t"
  153593. #else
  153594. "mul r7, r6\n\t"
  153595. #endif
  153596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153597. "adds r4, r4, r7\n\t"
  153598. #else
  153599. "add r4, r4, r7\n\t"
  153600. #endif
  153601. #ifdef WOLFSSL_KEIL
  153602. "adcs r5, r5, %[r]\n\t"
  153603. #elif defined(__clang__)
  153604. "adcs r5, %[r]\n\t"
  153605. #else
  153606. "adc r5, %[r]\n\t"
  153607. #endif
  153608. #ifdef WOLFSSL_KEIL
  153609. "adcs r3, r3, %[r]\n\t"
  153610. #elif defined(__clang__)
  153611. "adcs r3, %[r]\n\t"
  153612. #else
  153613. "adc r3, %[r]\n\t"
  153614. #endif
  153615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153616. "lsrs r7, %[b], #16\n\t"
  153617. #else
  153618. "lsr r7, %[b], #16\n\t"
  153619. #endif
  153620. #ifdef WOLFSSL_KEIL
  153621. "muls r6, r7, r6\n\t"
  153622. #elif defined(__clang__)
  153623. "muls r6, r7\n\t"
  153624. #else
  153625. "mul r6, r7\n\t"
  153626. #endif
  153627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153628. "lsrs r7, r6, #16\n\t"
  153629. #else
  153630. "lsr r7, r6, #16\n\t"
  153631. #endif
  153632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153633. "lsls r6, r6, #16\n\t"
  153634. #else
  153635. "lsl r6, r6, #16\n\t"
  153636. #endif
  153637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153638. "adds r4, r4, r6\n\t"
  153639. #else
  153640. "add r4, r4, r6\n\t"
  153641. #endif
  153642. #ifdef WOLFSSL_KEIL
  153643. "adcs r5, r5, r7\n\t"
  153644. #elif defined(__clang__)
  153645. "adcs r5, r7\n\t"
  153646. #else
  153647. "adc r5, r7\n\t"
  153648. #endif
  153649. #ifdef WOLFSSL_KEIL
  153650. "adcs r3, r3, %[r]\n\t"
  153651. #elif defined(__clang__)
  153652. "adcs r3, %[r]\n\t"
  153653. #else
  153654. "adc r3, %[r]\n\t"
  153655. #endif
  153656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153657. "lsrs r6, %[a], #16\n\t"
  153658. #else
  153659. "lsr r6, %[a], #16\n\t"
  153660. #endif
  153661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153662. "lsrs r7, %[b], #16\n\t"
  153663. #else
  153664. "lsr r7, %[b], #16\n\t"
  153665. #endif
  153666. #ifdef WOLFSSL_KEIL
  153667. "muls r7, r6, r7\n\t"
  153668. #elif defined(__clang__)
  153669. "muls r7, r6\n\t"
  153670. #else
  153671. "mul r7, r6\n\t"
  153672. #endif
  153673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153674. "adds r5, r5, r7\n\t"
  153675. #else
  153676. "add r5, r5, r7\n\t"
  153677. #endif
  153678. #ifdef WOLFSSL_KEIL
  153679. "adcs r3, r3, %[r]\n\t"
  153680. #elif defined(__clang__)
  153681. "adcs r3, %[r]\n\t"
  153682. #else
  153683. "adc r3, %[r]\n\t"
  153684. #endif
  153685. "uxth r7, %[b]\n\t"
  153686. #ifdef WOLFSSL_KEIL
  153687. "muls r6, r7, r6\n\t"
  153688. #elif defined(__clang__)
  153689. "muls r6, r7\n\t"
  153690. #else
  153691. "mul r6, r7\n\t"
  153692. #endif
  153693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153694. "lsrs r7, r6, #16\n\t"
  153695. #else
  153696. "lsr r7, r6, #16\n\t"
  153697. #endif
  153698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153699. "lsls r6, r6, #16\n\t"
  153700. #else
  153701. "lsl r6, r6, #16\n\t"
  153702. #endif
  153703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153704. "adds r4, r4, r6\n\t"
  153705. #else
  153706. "add r4, r4, r6\n\t"
  153707. #endif
  153708. #ifdef WOLFSSL_KEIL
  153709. "adcs r5, r5, r7\n\t"
  153710. #elif defined(__clang__)
  153711. "adcs r5, r7\n\t"
  153712. #else
  153713. "adc r5, r7\n\t"
  153714. #endif
  153715. #ifdef WOLFSSL_KEIL
  153716. "adcs r3, r3, %[r]\n\t"
  153717. #elif defined(__clang__)
  153718. "adcs r3, %[r]\n\t"
  153719. #else
  153720. "adc r3, %[r]\n\t"
  153721. #endif
  153722. "# A[11] * B[5]\n\t"
  153723. "mov %[a], r9\n\t"
  153724. "mov %[b], r10\n\t"
  153725. "ldr %[a], [%[a], #44]\n\t"
  153726. "ldr %[b], [%[b], #20]\n\t"
  153727. "uxth r6, %[a]\n\t"
  153728. "uxth r7, %[b]\n\t"
  153729. #ifdef WOLFSSL_KEIL
  153730. "muls r7, r6, r7\n\t"
  153731. #elif defined(__clang__)
  153732. "muls r7, r6\n\t"
  153733. #else
  153734. "mul r7, r6\n\t"
  153735. #endif
  153736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153737. "adds r4, r4, r7\n\t"
  153738. #else
  153739. "add r4, r4, r7\n\t"
  153740. #endif
  153741. #ifdef WOLFSSL_KEIL
  153742. "adcs r5, r5, %[r]\n\t"
  153743. #elif defined(__clang__)
  153744. "adcs r5, %[r]\n\t"
  153745. #else
  153746. "adc r5, %[r]\n\t"
  153747. #endif
  153748. #ifdef WOLFSSL_KEIL
  153749. "adcs r3, r3, %[r]\n\t"
  153750. #elif defined(__clang__)
  153751. "adcs r3, %[r]\n\t"
  153752. #else
  153753. "adc r3, %[r]\n\t"
  153754. #endif
  153755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153756. "lsrs r7, %[b], #16\n\t"
  153757. #else
  153758. "lsr r7, %[b], #16\n\t"
  153759. #endif
  153760. #ifdef WOLFSSL_KEIL
  153761. "muls r6, r7, r6\n\t"
  153762. #elif defined(__clang__)
  153763. "muls r6, r7\n\t"
  153764. #else
  153765. "mul r6, r7\n\t"
  153766. #endif
  153767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153768. "lsrs r7, r6, #16\n\t"
  153769. #else
  153770. "lsr r7, r6, #16\n\t"
  153771. #endif
  153772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153773. "lsls r6, r6, #16\n\t"
  153774. #else
  153775. "lsl r6, r6, #16\n\t"
  153776. #endif
  153777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153778. "adds r4, r4, r6\n\t"
  153779. #else
  153780. "add r4, r4, r6\n\t"
  153781. #endif
  153782. #ifdef WOLFSSL_KEIL
  153783. "adcs r5, r5, r7\n\t"
  153784. #elif defined(__clang__)
  153785. "adcs r5, r7\n\t"
  153786. #else
  153787. "adc r5, r7\n\t"
  153788. #endif
  153789. #ifdef WOLFSSL_KEIL
  153790. "adcs r3, r3, %[r]\n\t"
  153791. #elif defined(__clang__)
  153792. "adcs r3, %[r]\n\t"
  153793. #else
  153794. "adc r3, %[r]\n\t"
  153795. #endif
  153796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153797. "lsrs r6, %[a], #16\n\t"
  153798. #else
  153799. "lsr r6, %[a], #16\n\t"
  153800. #endif
  153801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153802. "lsrs r7, %[b], #16\n\t"
  153803. #else
  153804. "lsr r7, %[b], #16\n\t"
  153805. #endif
  153806. #ifdef WOLFSSL_KEIL
  153807. "muls r7, r6, r7\n\t"
  153808. #elif defined(__clang__)
  153809. "muls r7, r6\n\t"
  153810. #else
  153811. "mul r7, r6\n\t"
  153812. #endif
  153813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153814. "adds r5, r5, r7\n\t"
  153815. #else
  153816. "add r5, r5, r7\n\t"
  153817. #endif
  153818. #ifdef WOLFSSL_KEIL
  153819. "adcs r3, r3, %[r]\n\t"
  153820. #elif defined(__clang__)
  153821. "adcs r3, %[r]\n\t"
  153822. #else
  153823. "adc r3, %[r]\n\t"
  153824. #endif
  153825. "uxth r7, %[b]\n\t"
  153826. #ifdef WOLFSSL_KEIL
  153827. "muls r6, r7, r6\n\t"
  153828. #elif defined(__clang__)
  153829. "muls r6, r7\n\t"
  153830. #else
  153831. "mul r6, r7\n\t"
  153832. #endif
  153833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153834. "lsrs r7, r6, #16\n\t"
  153835. #else
  153836. "lsr r7, r6, #16\n\t"
  153837. #endif
  153838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153839. "lsls r6, r6, #16\n\t"
  153840. #else
  153841. "lsl r6, r6, #16\n\t"
  153842. #endif
  153843. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153844. "adds r4, r4, r6\n\t"
  153845. #else
  153846. "add r4, r4, r6\n\t"
  153847. #endif
  153848. #ifdef WOLFSSL_KEIL
  153849. "adcs r5, r5, r7\n\t"
  153850. #elif defined(__clang__)
  153851. "adcs r5, r7\n\t"
  153852. #else
  153853. "adc r5, r7\n\t"
  153854. #endif
  153855. #ifdef WOLFSSL_KEIL
  153856. "adcs r3, r3, %[r]\n\t"
  153857. #elif defined(__clang__)
  153858. "adcs r3, %[r]\n\t"
  153859. #else
  153860. "adc r3, %[r]\n\t"
  153861. #endif
  153862. "# A[10] * B[6]\n\t"
  153863. "mov %[a], r9\n\t"
  153864. "mov %[b], r10\n\t"
  153865. "ldr %[a], [%[a], #40]\n\t"
  153866. "ldr %[b], [%[b], #24]\n\t"
  153867. "uxth r6, %[a]\n\t"
  153868. "uxth r7, %[b]\n\t"
  153869. #ifdef WOLFSSL_KEIL
  153870. "muls r7, r6, r7\n\t"
  153871. #elif defined(__clang__)
  153872. "muls r7, r6\n\t"
  153873. #else
  153874. "mul r7, r6\n\t"
  153875. #endif
  153876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153877. "adds r4, r4, r7\n\t"
  153878. #else
  153879. "add r4, r4, r7\n\t"
  153880. #endif
  153881. #ifdef WOLFSSL_KEIL
  153882. "adcs r5, r5, %[r]\n\t"
  153883. #elif defined(__clang__)
  153884. "adcs r5, %[r]\n\t"
  153885. #else
  153886. "adc r5, %[r]\n\t"
  153887. #endif
  153888. #ifdef WOLFSSL_KEIL
  153889. "adcs r3, r3, %[r]\n\t"
  153890. #elif defined(__clang__)
  153891. "adcs r3, %[r]\n\t"
  153892. #else
  153893. "adc r3, %[r]\n\t"
  153894. #endif
  153895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153896. "lsrs r7, %[b], #16\n\t"
  153897. #else
  153898. "lsr r7, %[b], #16\n\t"
  153899. #endif
  153900. #ifdef WOLFSSL_KEIL
  153901. "muls r6, r7, r6\n\t"
  153902. #elif defined(__clang__)
  153903. "muls r6, r7\n\t"
  153904. #else
  153905. "mul r6, r7\n\t"
  153906. #endif
  153907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153908. "lsrs r7, r6, #16\n\t"
  153909. #else
  153910. "lsr r7, r6, #16\n\t"
  153911. #endif
  153912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153913. "lsls r6, r6, #16\n\t"
  153914. #else
  153915. "lsl r6, r6, #16\n\t"
  153916. #endif
  153917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153918. "adds r4, r4, r6\n\t"
  153919. #else
  153920. "add r4, r4, r6\n\t"
  153921. #endif
  153922. #ifdef WOLFSSL_KEIL
  153923. "adcs r5, r5, r7\n\t"
  153924. #elif defined(__clang__)
  153925. "adcs r5, r7\n\t"
  153926. #else
  153927. "adc r5, r7\n\t"
  153928. #endif
  153929. #ifdef WOLFSSL_KEIL
  153930. "adcs r3, r3, %[r]\n\t"
  153931. #elif defined(__clang__)
  153932. "adcs r3, %[r]\n\t"
  153933. #else
  153934. "adc r3, %[r]\n\t"
  153935. #endif
  153936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153937. "lsrs r6, %[a], #16\n\t"
  153938. #else
  153939. "lsr r6, %[a], #16\n\t"
  153940. #endif
  153941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153942. "lsrs r7, %[b], #16\n\t"
  153943. #else
  153944. "lsr r7, %[b], #16\n\t"
  153945. #endif
  153946. #ifdef WOLFSSL_KEIL
  153947. "muls r7, r6, r7\n\t"
  153948. #elif defined(__clang__)
  153949. "muls r7, r6\n\t"
  153950. #else
  153951. "mul r7, r6\n\t"
  153952. #endif
  153953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153954. "adds r5, r5, r7\n\t"
  153955. #else
  153956. "add r5, r5, r7\n\t"
  153957. #endif
  153958. #ifdef WOLFSSL_KEIL
  153959. "adcs r3, r3, %[r]\n\t"
  153960. #elif defined(__clang__)
  153961. "adcs r3, %[r]\n\t"
  153962. #else
  153963. "adc r3, %[r]\n\t"
  153964. #endif
  153965. "uxth r7, %[b]\n\t"
  153966. #ifdef WOLFSSL_KEIL
  153967. "muls r6, r7, r6\n\t"
  153968. #elif defined(__clang__)
  153969. "muls r6, r7\n\t"
  153970. #else
  153971. "mul r6, r7\n\t"
  153972. #endif
  153973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153974. "lsrs r7, r6, #16\n\t"
  153975. #else
  153976. "lsr r7, r6, #16\n\t"
  153977. #endif
  153978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153979. "lsls r6, r6, #16\n\t"
  153980. #else
  153981. "lsl r6, r6, #16\n\t"
  153982. #endif
  153983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  153984. "adds r4, r4, r6\n\t"
  153985. #else
  153986. "add r4, r4, r6\n\t"
  153987. #endif
  153988. #ifdef WOLFSSL_KEIL
  153989. "adcs r5, r5, r7\n\t"
  153990. #elif defined(__clang__)
  153991. "adcs r5, r7\n\t"
  153992. #else
  153993. "adc r5, r7\n\t"
  153994. #endif
  153995. #ifdef WOLFSSL_KEIL
  153996. "adcs r3, r3, %[r]\n\t"
  153997. #elif defined(__clang__)
  153998. "adcs r3, %[r]\n\t"
  153999. #else
  154000. "adc r3, %[r]\n\t"
  154001. #endif
  154002. "# A[9] * B[7]\n\t"
  154003. "mov %[a], r9\n\t"
  154004. "mov %[b], r10\n\t"
  154005. "ldr %[a], [%[a], #36]\n\t"
  154006. "ldr %[b], [%[b], #28]\n\t"
  154007. "uxth r6, %[a]\n\t"
  154008. "uxth r7, %[b]\n\t"
  154009. #ifdef WOLFSSL_KEIL
  154010. "muls r7, r6, r7\n\t"
  154011. #elif defined(__clang__)
  154012. "muls r7, r6\n\t"
  154013. #else
  154014. "mul r7, r6\n\t"
  154015. #endif
  154016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154017. "adds r4, r4, r7\n\t"
  154018. #else
  154019. "add r4, r4, r7\n\t"
  154020. #endif
  154021. #ifdef WOLFSSL_KEIL
  154022. "adcs r5, r5, %[r]\n\t"
  154023. #elif defined(__clang__)
  154024. "adcs r5, %[r]\n\t"
  154025. #else
  154026. "adc r5, %[r]\n\t"
  154027. #endif
  154028. #ifdef WOLFSSL_KEIL
  154029. "adcs r3, r3, %[r]\n\t"
  154030. #elif defined(__clang__)
  154031. "adcs r3, %[r]\n\t"
  154032. #else
  154033. "adc r3, %[r]\n\t"
  154034. #endif
  154035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154036. "lsrs r7, %[b], #16\n\t"
  154037. #else
  154038. "lsr r7, %[b], #16\n\t"
  154039. #endif
  154040. #ifdef WOLFSSL_KEIL
  154041. "muls r6, r7, r6\n\t"
  154042. #elif defined(__clang__)
  154043. "muls r6, r7\n\t"
  154044. #else
  154045. "mul r6, r7\n\t"
  154046. #endif
  154047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154048. "lsrs r7, r6, #16\n\t"
  154049. #else
  154050. "lsr r7, r6, #16\n\t"
  154051. #endif
  154052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154053. "lsls r6, r6, #16\n\t"
  154054. #else
  154055. "lsl r6, r6, #16\n\t"
  154056. #endif
  154057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154058. "adds r4, r4, r6\n\t"
  154059. #else
  154060. "add r4, r4, r6\n\t"
  154061. #endif
  154062. #ifdef WOLFSSL_KEIL
  154063. "adcs r5, r5, r7\n\t"
  154064. #elif defined(__clang__)
  154065. "adcs r5, r7\n\t"
  154066. #else
  154067. "adc r5, r7\n\t"
  154068. #endif
  154069. #ifdef WOLFSSL_KEIL
  154070. "adcs r3, r3, %[r]\n\t"
  154071. #elif defined(__clang__)
  154072. "adcs r3, %[r]\n\t"
  154073. #else
  154074. "adc r3, %[r]\n\t"
  154075. #endif
  154076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154077. "lsrs r6, %[a], #16\n\t"
  154078. #else
  154079. "lsr r6, %[a], #16\n\t"
  154080. #endif
  154081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154082. "lsrs r7, %[b], #16\n\t"
  154083. #else
  154084. "lsr r7, %[b], #16\n\t"
  154085. #endif
  154086. #ifdef WOLFSSL_KEIL
  154087. "muls r7, r6, r7\n\t"
  154088. #elif defined(__clang__)
  154089. "muls r7, r6\n\t"
  154090. #else
  154091. "mul r7, r6\n\t"
  154092. #endif
  154093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154094. "adds r5, r5, r7\n\t"
  154095. #else
  154096. "add r5, r5, r7\n\t"
  154097. #endif
  154098. #ifdef WOLFSSL_KEIL
  154099. "adcs r3, r3, %[r]\n\t"
  154100. #elif defined(__clang__)
  154101. "adcs r3, %[r]\n\t"
  154102. #else
  154103. "adc r3, %[r]\n\t"
  154104. #endif
  154105. "uxth r7, %[b]\n\t"
  154106. #ifdef WOLFSSL_KEIL
  154107. "muls r6, r7, r6\n\t"
  154108. #elif defined(__clang__)
  154109. "muls r6, r7\n\t"
  154110. #else
  154111. "mul r6, r7\n\t"
  154112. #endif
  154113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154114. "lsrs r7, r6, #16\n\t"
  154115. #else
  154116. "lsr r7, r6, #16\n\t"
  154117. #endif
  154118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154119. "lsls r6, r6, #16\n\t"
  154120. #else
  154121. "lsl r6, r6, #16\n\t"
  154122. #endif
  154123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154124. "adds r4, r4, r6\n\t"
  154125. #else
  154126. "add r4, r4, r6\n\t"
  154127. #endif
  154128. #ifdef WOLFSSL_KEIL
  154129. "adcs r5, r5, r7\n\t"
  154130. #elif defined(__clang__)
  154131. "adcs r5, r7\n\t"
  154132. #else
  154133. "adc r5, r7\n\t"
  154134. #endif
  154135. #ifdef WOLFSSL_KEIL
  154136. "adcs r3, r3, %[r]\n\t"
  154137. #elif defined(__clang__)
  154138. "adcs r3, %[r]\n\t"
  154139. #else
  154140. "adc r3, %[r]\n\t"
  154141. #endif
  154142. "# A[8] * B[8]\n\t"
  154143. "mov %[a], r9\n\t"
  154144. "mov %[b], r10\n\t"
  154145. "ldr %[a], [%[a], #32]\n\t"
  154146. "ldr %[b], [%[b], #32]\n\t"
  154147. "uxth r6, %[a]\n\t"
  154148. "uxth r7, %[b]\n\t"
  154149. #ifdef WOLFSSL_KEIL
  154150. "muls r7, r6, r7\n\t"
  154151. #elif defined(__clang__)
  154152. "muls r7, r6\n\t"
  154153. #else
  154154. "mul r7, r6\n\t"
  154155. #endif
  154156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154157. "adds r4, r4, r7\n\t"
  154158. #else
  154159. "add r4, r4, r7\n\t"
  154160. #endif
  154161. #ifdef WOLFSSL_KEIL
  154162. "adcs r5, r5, %[r]\n\t"
  154163. #elif defined(__clang__)
  154164. "adcs r5, %[r]\n\t"
  154165. #else
  154166. "adc r5, %[r]\n\t"
  154167. #endif
  154168. #ifdef WOLFSSL_KEIL
  154169. "adcs r3, r3, %[r]\n\t"
  154170. #elif defined(__clang__)
  154171. "adcs r3, %[r]\n\t"
  154172. #else
  154173. "adc r3, %[r]\n\t"
  154174. #endif
  154175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154176. "lsrs r7, %[b], #16\n\t"
  154177. #else
  154178. "lsr r7, %[b], #16\n\t"
  154179. #endif
  154180. #ifdef WOLFSSL_KEIL
  154181. "muls r6, r7, r6\n\t"
  154182. #elif defined(__clang__)
  154183. "muls r6, r7\n\t"
  154184. #else
  154185. "mul r6, r7\n\t"
  154186. #endif
  154187. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154188. "lsrs r7, r6, #16\n\t"
  154189. #else
  154190. "lsr r7, r6, #16\n\t"
  154191. #endif
  154192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154193. "lsls r6, r6, #16\n\t"
  154194. #else
  154195. "lsl r6, r6, #16\n\t"
  154196. #endif
  154197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154198. "adds r4, r4, r6\n\t"
  154199. #else
  154200. "add r4, r4, r6\n\t"
  154201. #endif
  154202. #ifdef WOLFSSL_KEIL
  154203. "adcs r5, r5, r7\n\t"
  154204. #elif defined(__clang__)
  154205. "adcs r5, r7\n\t"
  154206. #else
  154207. "adc r5, r7\n\t"
  154208. #endif
  154209. #ifdef WOLFSSL_KEIL
  154210. "adcs r3, r3, %[r]\n\t"
  154211. #elif defined(__clang__)
  154212. "adcs r3, %[r]\n\t"
  154213. #else
  154214. "adc r3, %[r]\n\t"
  154215. #endif
  154216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154217. "lsrs r6, %[a], #16\n\t"
  154218. #else
  154219. "lsr r6, %[a], #16\n\t"
  154220. #endif
  154221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154222. "lsrs r7, %[b], #16\n\t"
  154223. #else
  154224. "lsr r7, %[b], #16\n\t"
  154225. #endif
  154226. #ifdef WOLFSSL_KEIL
  154227. "muls r7, r6, r7\n\t"
  154228. #elif defined(__clang__)
  154229. "muls r7, r6\n\t"
  154230. #else
  154231. "mul r7, r6\n\t"
  154232. #endif
  154233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154234. "adds r5, r5, r7\n\t"
  154235. #else
  154236. "add r5, r5, r7\n\t"
  154237. #endif
  154238. #ifdef WOLFSSL_KEIL
  154239. "adcs r3, r3, %[r]\n\t"
  154240. #elif defined(__clang__)
  154241. "adcs r3, %[r]\n\t"
  154242. #else
  154243. "adc r3, %[r]\n\t"
  154244. #endif
  154245. "uxth r7, %[b]\n\t"
  154246. #ifdef WOLFSSL_KEIL
  154247. "muls r6, r7, r6\n\t"
  154248. #elif defined(__clang__)
  154249. "muls r6, r7\n\t"
  154250. #else
  154251. "mul r6, r7\n\t"
  154252. #endif
  154253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154254. "lsrs r7, r6, #16\n\t"
  154255. #else
  154256. "lsr r7, r6, #16\n\t"
  154257. #endif
  154258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154259. "lsls r6, r6, #16\n\t"
  154260. #else
  154261. "lsl r6, r6, #16\n\t"
  154262. #endif
  154263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154264. "adds r4, r4, r6\n\t"
  154265. #else
  154266. "add r4, r4, r6\n\t"
  154267. #endif
  154268. #ifdef WOLFSSL_KEIL
  154269. "adcs r5, r5, r7\n\t"
  154270. #elif defined(__clang__)
  154271. "adcs r5, r7\n\t"
  154272. #else
  154273. "adc r5, r7\n\t"
  154274. #endif
  154275. #ifdef WOLFSSL_KEIL
  154276. "adcs r3, r3, %[r]\n\t"
  154277. #elif defined(__clang__)
  154278. "adcs r3, %[r]\n\t"
  154279. #else
  154280. "adc r3, %[r]\n\t"
  154281. #endif
  154282. "# A[7] * B[9]\n\t"
  154283. "mov %[a], r9\n\t"
  154284. "mov %[b], r10\n\t"
  154285. "ldr %[a], [%[a], #28]\n\t"
  154286. "ldr %[b], [%[b], #36]\n\t"
  154287. "uxth r6, %[a]\n\t"
  154288. "uxth r7, %[b]\n\t"
  154289. #ifdef WOLFSSL_KEIL
  154290. "muls r7, r6, r7\n\t"
  154291. #elif defined(__clang__)
  154292. "muls r7, r6\n\t"
  154293. #else
  154294. "mul r7, r6\n\t"
  154295. #endif
  154296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154297. "adds r4, r4, r7\n\t"
  154298. #else
  154299. "add r4, r4, r7\n\t"
  154300. #endif
  154301. #ifdef WOLFSSL_KEIL
  154302. "adcs r5, r5, %[r]\n\t"
  154303. #elif defined(__clang__)
  154304. "adcs r5, %[r]\n\t"
  154305. #else
  154306. "adc r5, %[r]\n\t"
  154307. #endif
  154308. #ifdef WOLFSSL_KEIL
  154309. "adcs r3, r3, %[r]\n\t"
  154310. #elif defined(__clang__)
  154311. "adcs r3, %[r]\n\t"
  154312. #else
  154313. "adc r3, %[r]\n\t"
  154314. #endif
  154315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154316. "lsrs r7, %[b], #16\n\t"
  154317. #else
  154318. "lsr r7, %[b], #16\n\t"
  154319. #endif
  154320. #ifdef WOLFSSL_KEIL
  154321. "muls r6, r7, r6\n\t"
  154322. #elif defined(__clang__)
  154323. "muls r6, r7\n\t"
  154324. #else
  154325. "mul r6, r7\n\t"
  154326. #endif
  154327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154328. "lsrs r7, r6, #16\n\t"
  154329. #else
  154330. "lsr r7, r6, #16\n\t"
  154331. #endif
  154332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154333. "lsls r6, r6, #16\n\t"
  154334. #else
  154335. "lsl r6, r6, #16\n\t"
  154336. #endif
  154337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154338. "adds r4, r4, r6\n\t"
  154339. #else
  154340. "add r4, r4, r6\n\t"
  154341. #endif
  154342. #ifdef WOLFSSL_KEIL
  154343. "adcs r5, r5, r7\n\t"
  154344. #elif defined(__clang__)
  154345. "adcs r5, r7\n\t"
  154346. #else
  154347. "adc r5, r7\n\t"
  154348. #endif
  154349. #ifdef WOLFSSL_KEIL
  154350. "adcs r3, r3, %[r]\n\t"
  154351. #elif defined(__clang__)
  154352. "adcs r3, %[r]\n\t"
  154353. #else
  154354. "adc r3, %[r]\n\t"
  154355. #endif
  154356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154357. "lsrs r6, %[a], #16\n\t"
  154358. #else
  154359. "lsr r6, %[a], #16\n\t"
  154360. #endif
  154361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154362. "lsrs r7, %[b], #16\n\t"
  154363. #else
  154364. "lsr r7, %[b], #16\n\t"
  154365. #endif
  154366. #ifdef WOLFSSL_KEIL
  154367. "muls r7, r6, r7\n\t"
  154368. #elif defined(__clang__)
  154369. "muls r7, r6\n\t"
  154370. #else
  154371. "mul r7, r6\n\t"
  154372. #endif
  154373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154374. "adds r5, r5, r7\n\t"
  154375. #else
  154376. "add r5, r5, r7\n\t"
  154377. #endif
  154378. #ifdef WOLFSSL_KEIL
  154379. "adcs r3, r3, %[r]\n\t"
  154380. #elif defined(__clang__)
  154381. "adcs r3, %[r]\n\t"
  154382. #else
  154383. "adc r3, %[r]\n\t"
  154384. #endif
  154385. "uxth r7, %[b]\n\t"
  154386. #ifdef WOLFSSL_KEIL
  154387. "muls r6, r7, r6\n\t"
  154388. #elif defined(__clang__)
  154389. "muls r6, r7\n\t"
  154390. #else
  154391. "mul r6, r7\n\t"
  154392. #endif
  154393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154394. "lsrs r7, r6, #16\n\t"
  154395. #else
  154396. "lsr r7, r6, #16\n\t"
  154397. #endif
  154398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154399. "lsls r6, r6, #16\n\t"
  154400. #else
  154401. "lsl r6, r6, #16\n\t"
  154402. #endif
  154403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154404. "adds r4, r4, r6\n\t"
  154405. #else
  154406. "add r4, r4, r6\n\t"
  154407. #endif
  154408. #ifdef WOLFSSL_KEIL
  154409. "adcs r5, r5, r7\n\t"
  154410. #elif defined(__clang__)
  154411. "adcs r5, r7\n\t"
  154412. #else
  154413. "adc r5, r7\n\t"
  154414. #endif
  154415. #ifdef WOLFSSL_KEIL
  154416. "adcs r3, r3, %[r]\n\t"
  154417. #elif defined(__clang__)
  154418. "adcs r3, %[r]\n\t"
  154419. #else
  154420. "adc r3, %[r]\n\t"
  154421. #endif
  154422. "# A[6] * B[10]\n\t"
  154423. "mov %[a], r9\n\t"
  154424. "mov %[b], r10\n\t"
  154425. "ldr %[a], [%[a], #24]\n\t"
  154426. "ldr %[b], [%[b], #40]\n\t"
  154427. "uxth r6, %[a]\n\t"
  154428. "uxth r7, %[b]\n\t"
  154429. #ifdef WOLFSSL_KEIL
  154430. "muls r7, r6, r7\n\t"
  154431. #elif defined(__clang__)
  154432. "muls r7, r6\n\t"
  154433. #else
  154434. "mul r7, r6\n\t"
  154435. #endif
  154436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154437. "adds r4, r4, r7\n\t"
  154438. #else
  154439. "add r4, r4, r7\n\t"
  154440. #endif
  154441. #ifdef WOLFSSL_KEIL
  154442. "adcs r5, r5, %[r]\n\t"
  154443. #elif defined(__clang__)
  154444. "adcs r5, %[r]\n\t"
  154445. #else
  154446. "adc r5, %[r]\n\t"
  154447. #endif
  154448. #ifdef WOLFSSL_KEIL
  154449. "adcs r3, r3, %[r]\n\t"
  154450. #elif defined(__clang__)
  154451. "adcs r3, %[r]\n\t"
  154452. #else
  154453. "adc r3, %[r]\n\t"
  154454. #endif
  154455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154456. "lsrs r7, %[b], #16\n\t"
  154457. #else
  154458. "lsr r7, %[b], #16\n\t"
  154459. #endif
  154460. #ifdef WOLFSSL_KEIL
  154461. "muls r6, r7, r6\n\t"
  154462. #elif defined(__clang__)
  154463. "muls r6, r7\n\t"
  154464. #else
  154465. "mul r6, r7\n\t"
  154466. #endif
  154467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154468. "lsrs r7, r6, #16\n\t"
  154469. #else
  154470. "lsr r7, r6, #16\n\t"
  154471. #endif
  154472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154473. "lsls r6, r6, #16\n\t"
  154474. #else
  154475. "lsl r6, r6, #16\n\t"
  154476. #endif
  154477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154478. "adds r4, r4, r6\n\t"
  154479. #else
  154480. "add r4, r4, r6\n\t"
  154481. #endif
  154482. #ifdef WOLFSSL_KEIL
  154483. "adcs r5, r5, r7\n\t"
  154484. #elif defined(__clang__)
  154485. "adcs r5, r7\n\t"
  154486. #else
  154487. "adc r5, r7\n\t"
  154488. #endif
  154489. #ifdef WOLFSSL_KEIL
  154490. "adcs r3, r3, %[r]\n\t"
  154491. #elif defined(__clang__)
  154492. "adcs r3, %[r]\n\t"
  154493. #else
  154494. "adc r3, %[r]\n\t"
  154495. #endif
  154496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154497. "lsrs r6, %[a], #16\n\t"
  154498. #else
  154499. "lsr r6, %[a], #16\n\t"
  154500. #endif
  154501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154502. "lsrs r7, %[b], #16\n\t"
  154503. #else
  154504. "lsr r7, %[b], #16\n\t"
  154505. #endif
  154506. #ifdef WOLFSSL_KEIL
  154507. "muls r7, r6, r7\n\t"
  154508. #elif defined(__clang__)
  154509. "muls r7, r6\n\t"
  154510. #else
  154511. "mul r7, r6\n\t"
  154512. #endif
  154513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154514. "adds r5, r5, r7\n\t"
  154515. #else
  154516. "add r5, r5, r7\n\t"
  154517. #endif
  154518. #ifdef WOLFSSL_KEIL
  154519. "adcs r3, r3, %[r]\n\t"
  154520. #elif defined(__clang__)
  154521. "adcs r3, %[r]\n\t"
  154522. #else
  154523. "adc r3, %[r]\n\t"
  154524. #endif
  154525. "uxth r7, %[b]\n\t"
  154526. #ifdef WOLFSSL_KEIL
  154527. "muls r6, r7, r6\n\t"
  154528. #elif defined(__clang__)
  154529. "muls r6, r7\n\t"
  154530. #else
  154531. "mul r6, r7\n\t"
  154532. #endif
  154533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154534. "lsrs r7, r6, #16\n\t"
  154535. #else
  154536. "lsr r7, r6, #16\n\t"
  154537. #endif
  154538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154539. "lsls r6, r6, #16\n\t"
  154540. #else
  154541. "lsl r6, r6, #16\n\t"
  154542. #endif
  154543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154544. "adds r4, r4, r6\n\t"
  154545. #else
  154546. "add r4, r4, r6\n\t"
  154547. #endif
  154548. #ifdef WOLFSSL_KEIL
  154549. "adcs r5, r5, r7\n\t"
  154550. #elif defined(__clang__)
  154551. "adcs r5, r7\n\t"
  154552. #else
  154553. "adc r5, r7\n\t"
  154554. #endif
  154555. #ifdef WOLFSSL_KEIL
  154556. "adcs r3, r3, %[r]\n\t"
  154557. #elif defined(__clang__)
  154558. "adcs r3, %[r]\n\t"
  154559. #else
  154560. "adc r3, %[r]\n\t"
  154561. #endif
  154562. "# A[5] * B[11]\n\t"
  154563. "mov %[a], r9\n\t"
  154564. "mov %[b], r10\n\t"
  154565. "ldr %[a], [%[a], #20]\n\t"
  154566. "ldr %[b], [%[b], #44]\n\t"
  154567. "uxth r6, %[a]\n\t"
  154568. "uxth r7, %[b]\n\t"
  154569. #ifdef WOLFSSL_KEIL
  154570. "muls r7, r6, r7\n\t"
  154571. #elif defined(__clang__)
  154572. "muls r7, r6\n\t"
  154573. #else
  154574. "mul r7, r6\n\t"
  154575. #endif
  154576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154577. "adds r4, r4, r7\n\t"
  154578. #else
  154579. "add r4, r4, r7\n\t"
  154580. #endif
  154581. #ifdef WOLFSSL_KEIL
  154582. "adcs r5, r5, %[r]\n\t"
  154583. #elif defined(__clang__)
  154584. "adcs r5, %[r]\n\t"
  154585. #else
  154586. "adc r5, %[r]\n\t"
  154587. #endif
  154588. #ifdef WOLFSSL_KEIL
  154589. "adcs r3, r3, %[r]\n\t"
  154590. #elif defined(__clang__)
  154591. "adcs r3, %[r]\n\t"
  154592. #else
  154593. "adc r3, %[r]\n\t"
  154594. #endif
  154595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154596. "lsrs r7, %[b], #16\n\t"
  154597. #else
  154598. "lsr r7, %[b], #16\n\t"
  154599. #endif
  154600. #ifdef WOLFSSL_KEIL
  154601. "muls r6, r7, r6\n\t"
  154602. #elif defined(__clang__)
  154603. "muls r6, r7\n\t"
  154604. #else
  154605. "mul r6, r7\n\t"
  154606. #endif
  154607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154608. "lsrs r7, r6, #16\n\t"
  154609. #else
  154610. "lsr r7, r6, #16\n\t"
  154611. #endif
  154612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154613. "lsls r6, r6, #16\n\t"
  154614. #else
  154615. "lsl r6, r6, #16\n\t"
  154616. #endif
  154617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154618. "adds r4, r4, r6\n\t"
  154619. #else
  154620. "add r4, r4, r6\n\t"
  154621. #endif
  154622. #ifdef WOLFSSL_KEIL
  154623. "adcs r5, r5, r7\n\t"
  154624. #elif defined(__clang__)
  154625. "adcs r5, r7\n\t"
  154626. #else
  154627. "adc r5, r7\n\t"
  154628. #endif
  154629. #ifdef WOLFSSL_KEIL
  154630. "adcs r3, r3, %[r]\n\t"
  154631. #elif defined(__clang__)
  154632. "adcs r3, %[r]\n\t"
  154633. #else
  154634. "adc r3, %[r]\n\t"
  154635. #endif
  154636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154637. "lsrs r6, %[a], #16\n\t"
  154638. #else
  154639. "lsr r6, %[a], #16\n\t"
  154640. #endif
  154641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154642. "lsrs r7, %[b], #16\n\t"
  154643. #else
  154644. "lsr r7, %[b], #16\n\t"
  154645. #endif
  154646. #ifdef WOLFSSL_KEIL
  154647. "muls r7, r6, r7\n\t"
  154648. #elif defined(__clang__)
  154649. "muls r7, r6\n\t"
  154650. #else
  154651. "mul r7, r6\n\t"
  154652. #endif
  154653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154654. "adds r5, r5, r7\n\t"
  154655. #else
  154656. "add r5, r5, r7\n\t"
  154657. #endif
  154658. #ifdef WOLFSSL_KEIL
  154659. "adcs r3, r3, %[r]\n\t"
  154660. #elif defined(__clang__)
  154661. "adcs r3, %[r]\n\t"
  154662. #else
  154663. "adc r3, %[r]\n\t"
  154664. #endif
  154665. "uxth r7, %[b]\n\t"
  154666. #ifdef WOLFSSL_KEIL
  154667. "muls r6, r7, r6\n\t"
  154668. #elif defined(__clang__)
  154669. "muls r6, r7\n\t"
  154670. #else
  154671. "mul r6, r7\n\t"
  154672. #endif
  154673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154674. "lsrs r7, r6, #16\n\t"
  154675. #else
  154676. "lsr r7, r6, #16\n\t"
  154677. #endif
  154678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154679. "lsls r6, r6, #16\n\t"
  154680. #else
  154681. "lsl r6, r6, #16\n\t"
  154682. #endif
  154683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154684. "adds r4, r4, r6\n\t"
  154685. #else
  154686. "add r4, r4, r6\n\t"
  154687. #endif
  154688. #ifdef WOLFSSL_KEIL
  154689. "adcs r5, r5, r7\n\t"
  154690. #elif defined(__clang__)
  154691. "adcs r5, r7\n\t"
  154692. #else
  154693. "adc r5, r7\n\t"
  154694. #endif
  154695. #ifdef WOLFSSL_KEIL
  154696. "adcs r3, r3, %[r]\n\t"
  154697. #elif defined(__clang__)
  154698. "adcs r3, %[r]\n\t"
  154699. #else
  154700. "adc r3, %[r]\n\t"
  154701. #endif
  154702. "# A[4] * B[12]\n\t"
  154703. "mov %[a], r9\n\t"
  154704. "mov %[b], r10\n\t"
  154705. "ldr %[a], [%[a], #16]\n\t"
  154706. "ldr %[b], [%[b], #48]\n\t"
  154707. "uxth r6, %[a]\n\t"
  154708. "uxth r7, %[b]\n\t"
  154709. #ifdef WOLFSSL_KEIL
  154710. "muls r7, r6, r7\n\t"
  154711. #elif defined(__clang__)
  154712. "muls r7, r6\n\t"
  154713. #else
  154714. "mul r7, r6\n\t"
  154715. #endif
  154716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154717. "adds r4, r4, r7\n\t"
  154718. #else
  154719. "add r4, r4, r7\n\t"
  154720. #endif
  154721. #ifdef WOLFSSL_KEIL
  154722. "adcs r5, r5, %[r]\n\t"
  154723. #elif defined(__clang__)
  154724. "adcs r5, %[r]\n\t"
  154725. #else
  154726. "adc r5, %[r]\n\t"
  154727. #endif
  154728. #ifdef WOLFSSL_KEIL
  154729. "adcs r3, r3, %[r]\n\t"
  154730. #elif defined(__clang__)
  154731. "adcs r3, %[r]\n\t"
  154732. #else
  154733. "adc r3, %[r]\n\t"
  154734. #endif
  154735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154736. "lsrs r7, %[b], #16\n\t"
  154737. #else
  154738. "lsr r7, %[b], #16\n\t"
  154739. #endif
  154740. #ifdef WOLFSSL_KEIL
  154741. "muls r6, r7, r6\n\t"
  154742. #elif defined(__clang__)
  154743. "muls r6, r7\n\t"
  154744. #else
  154745. "mul r6, r7\n\t"
  154746. #endif
  154747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154748. "lsrs r7, r6, #16\n\t"
  154749. #else
  154750. "lsr r7, r6, #16\n\t"
  154751. #endif
  154752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154753. "lsls r6, r6, #16\n\t"
  154754. #else
  154755. "lsl r6, r6, #16\n\t"
  154756. #endif
  154757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154758. "adds r4, r4, r6\n\t"
  154759. #else
  154760. "add r4, r4, r6\n\t"
  154761. #endif
  154762. #ifdef WOLFSSL_KEIL
  154763. "adcs r5, r5, r7\n\t"
  154764. #elif defined(__clang__)
  154765. "adcs r5, r7\n\t"
  154766. #else
  154767. "adc r5, r7\n\t"
  154768. #endif
  154769. #ifdef WOLFSSL_KEIL
  154770. "adcs r3, r3, %[r]\n\t"
  154771. #elif defined(__clang__)
  154772. "adcs r3, %[r]\n\t"
  154773. #else
  154774. "adc r3, %[r]\n\t"
  154775. #endif
  154776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154777. "lsrs r6, %[a], #16\n\t"
  154778. #else
  154779. "lsr r6, %[a], #16\n\t"
  154780. #endif
  154781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154782. "lsrs r7, %[b], #16\n\t"
  154783. #else
  154784. "lsr r7, %[b], #16\n\t"
  154785. #endif
  154786. #ifdef WOLFSSL_KEIL
  154787. "muls r7, r6, r7\n\t"
  154788. #elif defined(__clang__)
  154789. "muls r7, r6\n\t"
  154790. #else
  154791. "mul r7, r6\n\t"
  154792. #endif
  154793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154794. "adds r5, r5, r7\n\t"
  154795. #else
  154796. "add r5, r5, r7\n\t"
  154797. #endif
  154798. #ifdef WOLFSSL_KEIL
  154799. "adcs r3, r3, %[r]\n\t"
  154800. #elif defined(__clang__)
  154801. "adcs r3, %[r]\n\t"
  154802. #else
  154803. "adc r3, %[r]\n\t"
  154804. #endif
  154805. "uxth r7, %[b]\n\t"
  154806. #ifdef WOLFSSL_KEIL
  154807. "muls r6, r7, r6\n\t"
  154808. #elif defined(__clang__)
  154809. "muls r6, r7\n\t"
  154810. #else
  154811. "mul r6, r7\n\t"
  154812. #endif
  154813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154814. "lsrs r7, r6, #16\n\t"
  154815. #else
  154816. "lsr r7, r6, #16\n\t"
  154817. #endif
  154818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154819. "lsls r6, r6, #16\n\t"
  154820. #else
  154821. "lsl r6, r6, #16\n\t"
  154822. #endif
  154823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154824. "adds r4, r4, r6\n\t"
  154825. #else
  154826. "add r4, r4, r6\n\t"
  154827. #endif
  154828. #ifdef WOLFSSL_KEIL
  154829. "adcs r5, r5, r7\n\t"
  154830. #elif defined(__clang__)
  154831. "adcs r5, r7\n\t"
  154832. #else
  154833. "adc r5, r7\n\t"
  154834. #endif
  154835. #ifdef WOLFSSL_KEIL
  154836. "adcs r3, r3, %[r]\n\t"
  154837. #elif defined(__clang__)
  154838. "adcs r3, %[r]\n\t"
  154839. #else
  154840. "adc r3, %[r]\n\t"
  154841. #endif
  154842. "# A[3] * B[13]\n\t"
  154843. "mov %[a], r9\n\t"
  154844. "mov %[b], r10\n\t"
  154845. "ldr %[a], [%[a], #12]\n\t"
  154846. "ldr %[b], [%[b], #52]\n\t"
  154847. "uxth r6, %[a]\n\t"
  154848. "uxth r7, %[b]\n\t"
  154849. #ifdef WOLFSSL_KEIL
  154850. "muls r7, r6, r7\n\t"
  154851. #elif defined(__clang__)
  154852. "muls r7, r6\n\t"
  154853. #else
  154854. "mul r7, r6\n\t"
  154855. #endif
  154856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154857. "adds r4, r4, r7\n\t"
  154858. #else
  154859. "add r4, r4, r7\n\t"
  154860. #endif
  154861. #ifdef WOLFSSL_KEIL
  154862. "adcs r5, r5, %[r]\n\t"
  154863. #elif defined(__clang__)
  154864. "adcs r5, %[r]\n\t"
  154865. #else
  154866. "adc r5, %[r]\n\t"
  154867. #endif
  154868. #ifdef WOLFSSL_KEIL
  154869. "adcs r3, r3, %[r]\n\t"
  154870. #elif defined(__clang__)
  154871. "adcs r3, %[r]\n\t"
  154872. #else
  154873. "adc r3, %[r]\n\t"
  154874. #endif
  154875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154876. "lsrs r7, %[b], #16\n\t"
  154877. #else
  154878. "lsr r7, %[b], #16\n\t"
  154879. #endif
  154880. #ifdef WOLFSSL_KEIL
  154881. "muls r6, r7, r6\n\t"
  154882. #elif defined(__clang__)
  154883. "muls r6, r7\n\t"
  154884. #else
  154885. "mul r6, r7\n\t"
  154886. #endif
  154887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154888. "lsrs r7, r6, #16\n\t"
  154889. #else
  154890. "lsr r7, r6, #16\n\t"
  154891. #endif
  154892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154893. "lsls r6, r6, #16\n\t"
  154894. #else
  154895. "lsl r6, r6, #16\n\t"
  154896. #endif
  154897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154898. "adds r4, r4, r6\n\t"
  154899. #else
  154900. "add r4, r4, r6\n\t"
  154901. #endif
  154902. #ifdef WOLFSSL_KEIL
  154903. "adcs r5, r5, r7\n\t"
  154904. #elif defined(__clang__)
  154905. "adcs r5, r7\n\t"
  154906. #else
  154907. "adc r5, r7\n\t"
  154908. #endif
  154909. #ifdef WOLFSSL_KEIL
  154910. "adcs r3, r3, %[r]\n\t"
  154911. #elif defined(__clang__)
  154912. "adcs r3, %[r]\n\t"
  154913. #else
  154914. "adc r3, %[r]\n\t"
  154915. #endif
  154916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154917. "lsrs r6, %[a], #16\n\t"
  154918. #else
  154919. "lsr r6, %[a], #16\n\t"
  154920. #endif
  154921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154922. "lsrs r7, %[b], #16\n\t"
  154923. #else
  154924. "lsr r7, %[b], #16\n\t"
  154925. #endif
  154926. #ifdef WOLFSSL_KEIL
  154927. "muls r7, r6, r7\n\t"
  154928. #elif defined(__clang__)
  154929. "muls r7, r6\n\t"
  154930. #else
  154931. "mul r7, r6\n\t"
  154932. #endif
  154933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154934. "adds r5, r5, r7\n\t"
  154935. #else
  154936. "add r5, r5, r7\n\t"
  154937. #endif
  154938. #ifdef WOLFSSL_KEIL
  154939. "adcs r3, r3, %[r]\n\t"
  154940. #elif defined(__clang__)
  154941. "adcs r3, %[r]\n\t"
  154942. #else
  154943. "adc r3, %[r]\n\t"
  154944. #endif
  154945. "uxth r7, %[b]\n\t"
  154946. #ifdef WOLFSSL_KEIL
  154947. "muls r6, r7, r6\n\t"
  154948. #elif defined(__clang__)
  154949. "muls r6, r7\n\t"
  154950. #else
  154951. "mul r6, r7\n\t"
  154952. #endif
  154953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154954. "lsrs r7, r6, #16\n\t"
  154955. #else
  154956. "lsr r7, r6, #16\n\t"
  154957. #endif
  154958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154959. "lsls r6, r6, #16\n\t"
  154960. #else
  154961. "lsl r6, r6, #16\n\t"
  154962. #endif
  154963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154964. "adds r4, r4, r6\n\t"
  154965. #else
  154966. "add r4, r4, r6\n\t"
  154967. #endif
  154968. #ifdef WOLFSSL_KEIL
  154969. "adcs r5, r5, r7\n\t"
  154970. #elif defined(__clang__)
  154971. "adcs r5, r7\n\t"
  154972. #else
  154973. "adc r5, r7\n\t"
  154974. #endif
  154975. #ifdef WOLFSSL_KEIL
  154976. "adcs r3, r3, %[r]\n\t"
  154977. #elif defined(__clang__)
  154978. "adcs r3, %[r]\n\t"
  154979. #else
  154980. "adc r3, %[r]\n\t"
  154981. #endif
  154982. "# A[2] * B[14]\n\t"
  154983. "mov %[a], r9\n\t"
  154984. "mov %[b], r10\n\t"
  154985. "ldr %[a], [%[a], #8]\n\t"
  154986. "ldr %[b], [%[b], #56]\n\t"
  154987. "uxth r6, %[a]\n\t"
  154988. "uxth r7, %[b]\n\t"
  154989. #ifdef WOLFSSL_KEIL
  154990. "muls r7, r6, r7\n\t"
  154991. #elif defined(__clang__)
  154992. "muls r7, r6\n\t"
  154993. #else
  154994. "mul r7, r6\n\t"
  154995. #endif
  154996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  154997. "adds r4, r4, r7\n\t"
  154998. #else
  154999. "add r4, r4, r7\n\t"
  155000. #endif
  155001. #ifdef WOLFSSL_KEIL
  155002. "adcs r5, r5, %[r]\n\t"
  155003. #elif defined(__clang__)
  155004. "adcs r5, %[r]\n\t"
  155005. #else
  155006. "adc r5, %[r]\n\t"
  155007. #endif
  155008. #ifdef WOLFSSL_KEIL
  155009. "adcs r3, r3, %[r]\n\t"
  155010. #elif defined(__clang__)
  155011. "adcs r3, %[r]\n\t"
  155012. #else
  155013. "adc r3, %[r]\n\t"
  155014. #endif
  155015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155016. "lsrs r7, %[b], #16\n\t"
  155017. #else
  155018. "lsr r7, %[b], #16\n\t"
  155019. #endif
  155020. #ifdef WOLFSSL_KEIL
  155021. "muls r6, r7, r6\n\t"
  155022. #elif defined(__clang__)
  155023. "muls r6, r7\n\t"
  155024. #else
  155025. "mul r6, r7\n\t"
  155026. #endif
  155027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155028. "lsrs r7, r6, #16\n\t"
  155029. #else
  155030. "lsr r7, r6, #16\n\t"
  155031. #endif
  155032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155033. "lsls r6, r6, #16\n\t"
  155034. #else
  155035. "lsl r6, r6, #16\n\t"
  155036. #endif
  155037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155038. "adds r4, r4, r6\n\t"
  155039. #else
  155040. "add r4, r4, r6\n\t"
  155041. #endif
  155042. #ifdef WOLFSSL_KEIL
  155043. "adcs r5, r5, r7\n\t"
  155044. #elif defined(__clang__)
  155045. "adcs r5, r7\n\t"
  155046. #else
  155047. "adc r5, r7\n\t"
  155048. #endif
  155049. #ifdef WOLFSSL_KEIL
  155050. "adcs r3, r3, %[r]\n\t"
  155051. #elif defined(__clang__)
  155052. "adcs r3, %[r]\n\t"
  155053. #else
  155054. "adc r3, %[r]\n\t"
  155055. #endif
  155056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155057. "lsrs r6, %[a], #16\n\t"
  155058. #else
  155059. "lsr r6, %[a], #16\n\t"
  155060. #endif
  155061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155062. "lsrs r7, %[b], #16\n\t"
  155063. #else
  155064. "lsr r7, %[b], #16\n\t"
  155065. #endif
  155066. #ifdef WOLFSSL_KEIL
  155067. "muls r7, r6, r7\n\t"
  155068. #elif defined(__clang__)
  155069. "muls r7, r6\n\t"
  155070. #else
  155071. "mul r7, r6\n\t"
  155072. #endif
  155073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155074. "adds r5, r5, r7\n\t"
  155075. #else
  155076. "add r5, r5, r7\n\t"
  155077. #endif
  155078. #ifdef WOLFSSL_KEIL
  155079. "adcs r3, r3, %[r]\n\t"
  155080. #elif defined(__clang__)
  155081. "adcs r3, %[r]\n\t"
  155082. #else
  155083. "adc r3, %[r]\n\t"
  155084. #endif
  155085. "uxth r7, %[b]\n\t"
  155086. #ifdef WOLFSSL_KEIL
  155087. "muls r6, r7, r6\n\t"
  155088. #elif defined(__clang__)
  155089. "muls r6, r7\n\t"
  155090. #else
  155091. "mul r6, r7\n\t"
  155092. #endif
  155093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155094. "lsrs r7, r6, #16\n\t"
  155095. #else
  155096. "lsr r7, r6, #16\n\t"
  155097. #endif
  155098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155099. "lsls r6, r6, #16\n\t"
  155100. #else
  155101. "lsl r6, r6, #16\n\t"
  155102. #endif
  155103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155104. "adds r4, r4, r6\n\t"
  155105. #else
  155106. "add r4, r4, r6\n\t"
  155107. #endif
  155108. #ifdef WOLFSSL_KEIL
  155109. "adcs r5, r5, r7\n\t"
  155110. #elif defined(__clang__)
  155111. "adcs r5, r7\n\t"
  155112. #else
  155113. "adc r5, r7\n\t"
  155114. #endif
  155115. #ifdef WOLFSSL_KEIL
  155116. "adcs r3, r3, %[r]\n\t"
  155117. #elif defined(__clang__)
  155118. "adcs r3, %[r]\n\t"
  155119. #else
  155120. "adc r3, %[r]\n\t"
  155121. #endif
  155122. "# A[1] * B[15]\n\t"
  155123. "mov %[a], r9\n\t"
  155124. "mov %[b], r10\n\t"
  155125. "ldr %[a], [%[a], #4]\n\t"
  155126. "ldr %[b], [%[b], #60]\n\t"
  155127. "uxth r6, %[a]\n\t"
  155128. "uxth r7, %[b]\n\t"
  155129. #ifdef WOLFSSL_KEIL
  155130. "muls r7, r6, r7\n\t"
  155131. #elif defined(__clang__)
  155132. "muls r7, r6\n\t"
  155133. #else
  155134. "mul r7, r6\n\t"
  155135. #endif
  155136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155137. "adds r4, r4, r7\n\t"
  155138. #else
  155139. "add r4, r4, r7\n\t"
  155140. #endif
  155141. #ifdef WOLFSSL_KEIL
  155142. "adcs r5, r5, %[r]\n\t"
  155143. #elif defined(__clang__)
  155144. "adcs r5, %[r]\n\t"
  155145. #else
  155146. "adc r5, %[r]\n\t"
  155147. #endif
  155148. #ifdef WOLFSSL_KEIL
  155149. "adcs r3, r3, %[r]\n\t"
  155150. #elif defined(__clang__)
  155151. "adcs r3, %[r]\n\t"
  155152. #else
  155153. "adc r3, %[r]\n\t"
  155154. #endif
  155155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155156. "lsrs r7, %[b], #16\n\t"
  155157. #else
  155158. "lsr r7, %[b], #16\n\t"
  155159. #endif
  155160. #ifdef WOLFSSL_KEIL
  155161. "muls r6, r7, r6\n\t"
  155162. #elif defined(__clang__)
  155163. "muls r6, r7\n\t"
  155164. #else
  155165. "mul r6, r7\n\t"
  155166. #endif
  155167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155168. "lsrs r7, r6, #16\n\t"
  155169. #else
  155170. "lsr r7, r6, #16\n\t"
  155171. #endif
  155172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155173. "lsls r6, r6, #16\n\t"
  155174. #else
  155175. "lsl r6, r6, #16\n\t"
  155176. #endif
  155177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155178. "adds r4, r4, r6\n\t"
  155179. #else
  155180. "add r4, r4, r6\n\t"
  155181. #endif
  155182. #ifdef WOLFSSL_KEIL
  155183. "adcs r5, r5, r7\n\t"
  155184. #elif defined(__clang__)
  155185. "adcs r5, r7\n\t"
  155186. #else
  155187. "adc r5, r7\n\t"
  155188. #endif
  155189. #ifdef WOLFSSL_KEIL
  155190. "adcs r3, r3, %[r]\n\t"
  155191. #elif defined(__clang__)
  155192. "adcs r3, %[r]\n\t"
  155193. #else
  155194. "adc r3, %[r]\n\t"
  155195. #endif
  155196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155197. "lsrs r6, %[a], #16\n\t"
  155198. #else
  155199. "lsr r6, %[a], #16\n\t"
  155200. #endif
  155201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155202. "lsrs r7, %[b], #16\n\t"
  155203. #else
  155204. "lsr r7, %[b], #16\n\t"
  155205. #endif
  155206. #ifdef WOLFSSL_KEIL
  155207. "muls r7, r6, r7\n\t"
  155208. #elif defined(__clang__)
  155209. "muls r7, r6\n\t"
  155210. #else
  155211. "mul r7, r6\n\t"
  155212. #endif
  155213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155214. "adds r5, r5, r7\n\t"
  155215. #else
  155216. "add r5, r5, r7\n\t"
  155217. #endif
  155218. #ifdef WOLFSSL_KEIL
  155219. "adcs r3, r3, %[r]\n\t"
  155220. #elif defined(__clang__)
  155221. "adcs r3, %[r]\n\t"
  155222. #else
  155223. "adc r3, %[r]\n\t"
  155224. #endif
  155225. "uxth r7, %[b]\n\t"
  155226. #ifdef WOLFSSL_KEIL
  155227. "muls r6, r7, r6\n\t"
  155228. #elif defined(__clang__)
  155229. "muls r6, r7\n\t"
  155230. #else
  155231. "mul r6, r7\n\t"
  155232. #endif
  155233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155234. "lsrs r7, r6, #16\n\t"
  155235. #else
  155236. "lsr r7, r6, #16\n\t"
  155237. #endif
  155238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155239. "lsls r6, r6, #16\n\t"
  155240. #else
  155241. "lsl r6, r6, #16\n\t"
  155242. #endif
  155243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155244. "adds r4, r4, r6\n\t"
  155245. #else
  155246. "add r4, r4, r6\n\t"
  155247. #endif
  155248. #ifdef WOLFSSL_KEIL
  155249. "adcs r5, r5, r7\n\t"
  155250. #elif defined(__clang__)
  155251. "adcs r5, r7\n\t"
  155252. #else
  155253. "adc r5, r7\n\t"
  155254. #endif
  155255. #ifdef WOLFSSL_KEIL
  155256. "adcs r3, r3, %[r]\n\t"
  155257. #elif defined(__clang__)
  155258. "adcs r3, %[r]\n\t"
  155259. #else
  155260. "adc r3, %[r]\n\t"
  155261. #endif
  155262. "mov %[r], r8\n\t"
  155263. "str r4, [%[r], #64]\n\t"
  155264. "movs %[r], #0\n\t"
  155265. "# A[2] * B[15]\n\t"
  155266. "movs r4, #0\n\t"
  155267. "mov %[a], r9\n\t"
  155268. "mov %[b], r10\n\t"
  155269. "ldr %[a], [%[a], #8]\n\t"
  155270. "ldr %[b], [%[b], #60]\n\t"
  155271. "uxth r6, %[a]\n\t"
  155272. "uxth r7, %[b]\n\t"
  155273. #ifdef WOLFSSL_KEIL
  155274. "muls r7, r6, r7\n\t"
  155275. #elif defined(__clang__)
  155276. "muls r7, r6\n\t"
  155277. #else
  155278. "mul r7, r6\n\t"
  155279. #endif
  155280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155281. "adds r5, r5, r7\n\t"
  155282. #else
  155283. "add r5, r5, r7\n\t"
  155284. #endif
  155285. #ifdef WOLFSSL_KEIL
  155286. "adcs r3, r3, %[r]\n\t"
  155287. #elif defined(__clang__)
  155288. "adcs r3, %[r]\n\t"
  155289. #else
  155290. "adc r3, %[r]\n\t"
  155291. #endif
  155292. #ifdef WOLFSSL_KEIL
  155293. "adcs r4, r4, %[r]\n\t"
  155294. #elif defined(__clang__)
  155295. "adcs r4, %[r]\n\t"
  155296. #else
  155297. "adc r4, %[r]\n\t"
  155298. #endif
  155299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155300. "lsrs r7, %[b], #16\n\t"
  155301. #else
  155302. "lsr r7, %[b], #16\n\t"
  155303. #endif
  155304. #ifdef WOLFSSL_KEIL
  155305. "muls r6, r7, r6\n\t"
  155306. #elif defined(__clang__)
  155307. "muls r6, r7\n\t"
  155308. #else
  155309. "mul r6, r7\n\t"
  155310. #endif
  155311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155312. "lsrs r7, r6, #16\n\t"
  155313. #else
  155314. "lsr r7, r6, #16\n\t"
  155315. #endif
  155316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155317. "lsls r6, r6, #16\n\t"
  155318. #else
  155319. "lsl r6, r6, #16\n\t"
  155320. #endif
  155321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155322. "adds r5, r5, r6\n\t"
  155323. #else
  155324. "add r5, r5, r6\n\t"
  155325. #endif
  155326. #ifdef WOLFSSL_KEIL
  155327. "adcs r3, r3, r7\n\t"
  155328. #elif defined(__clang__)
  155329. "adcs r3, r7\n\t"
  155330. #else
  155331. "adc r3, r7\n\t"
  155332. #endif
  155333. #ifdef WOLFSSL_KEIL
  155334. "adcs r4, r4, %[r]\n\t"
  155335. #elif defined(__clang__)
  155336. "adcs r4, %[r]\n\t"
  155337. #else
  155338. "adc r4, %[r]\n\t"
  155339. #endif
  155340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155341. "lsrs r6, %[a], #16\n\t"
  155342. #else
  155343. "lsr r6, %[a], #16\n\t"
  155344. #endif
  155345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155346. "lsrs r7, %[b], #16\n\t"
  155347. #else
  155348. "lsr r7, %[b], #16\n\t"
  155349. #endif
  155350. #ifdef WOLFSSL_KEIL
  155351. "muls r7, r6, r7\n\t"
  155352. #elif defined(__clang__)
  155353. "muls r7, r6\n\t"
  155354. #else
  155355. "mul r7, r6\n\t"
  155356. #endif
  155357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155358. "adds r3, r3, r7\n\t"
  155359. #else
  155360. "add r3, r3, r7\n\t"
  155361. #endif
  155362. #ifdef WOLFSSL_KEIL
  155363. "adcs r4, r4, %[r]\n\t"
  155364. #elif defined(__clang__)
  155365. "adcs r4, %[r]\n\t"
  155366. #else
  155367. "adc r4, %[r]\n\t"
  155368. #endif
  155369. "uxth r7, %[b]\n\t"
  155370. #ifdef WOLFSSL_KEIL
  155371. "muls r6, r7, r6\n\t"
  155372. #elif defined(__clang__)
  155373. "muls r6, r7\n\t"
  155374. #else
  155375. "mul r6, r7\n\t"
  155376. #endif
  155377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155378. "lsrs r7, r6, #16\n\t"
  155379. #else
  155380. "lsr r7, r6, #16\n\t"
  155381. #endif
  155382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155383. "lsls r6, r6, #16\n\t"
  155384. #else
  155385. "lsl r6, r6, #16\n\t"
  155386. #endif
  155387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155388. "adds r5, r5, r6\n\t"
  155389. #else
  155390. "add r5, r5, r6\n\t"
  155391. #endif
  155392. #ifdef WOLFSSL_KEIL
  155393. "adcs r3, r3, r7\n\t"
  155394. #elif defined(__clang__)
  155395. "adcs r3, r7\n\t"
  155396. #else
  155397. "adc r3, r7\n\t"
  155398. #endif
  155399. #ifdef WOLFSSL_KEIL
  155400. "adcs r4, r4, %[r]\n\t"
  155401. #elif defined(__clang__)
  155402. "adcs r4, %[r]\n\t"
  155403. #else
  155404. "adc r4, %[r]\n\t"
  155405. #endif
  155406. "# A[3] * B[14]\n\t"
  155407. "mov %[a], r9\n\t"
  155408. "mov %[b], r10\n\t"
  155409. "ldr %[a], [%[a], #12]\n\t"
  155410. "ldr %[b], [%[b], #56]\n\t"
  155411. "uxth r6, %[a]\n\t"
  155412. "uxth r7, %[b]\n\t"
  155413. #ifdef WOLFSSL_KEIL
  155414. "muls r7, r6, r7\n\t"
  155415. #elif defined(__clang__)
  155416. "muls r7, r6\n\t"
  155417. #else
  155418. "mul r7, r6\n\t"
  155419. #endif
  155420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155421. "adds r5, r5, r7\n\t"
  155422. #else
  155423. "add r5, r5, r7\n\t"
  155424. #endif
  155425. #ifdef WOLFSSL_KEIL
  155426. "adcs r3, r3, %[r]\n\t"
  155427. #elif defined(__clang__)
  155428. "adcs r3, %[r]\n\t"
  155429. #else
  155430. "adc r3, %[r]\n\t"
  155431. #endif
  155432. #ifdef WOLFSSL_KEIL
  155433. "adcs r4, r4, %[r]\n\t"
  155434. #elif defined(__clang__)
  155435. "adcs r4, %[r]\n\t"
  155436. #else
  155437. "adc r4, %[r]\n\t"
  155438. #endif
  155439. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155440. "lsrs r7, %[b], #16\n\t"
  155441. #else
  155442. "lsr r7, %[b], #16\n\t"
  155443. #endif
  155444. #ifdef WOLFSSL_KEIL
  155445. "muls r6, r7, r6\n\t"
  155446. #elif defined(__clang__)
  155447. "muls r6, r7\n\t"
  155448. #else
  155449. "mul r6, r7\n\t"
  155450. #endif
  155451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155452. "lsrs r7, r6, #16\n\t"
  155453. #else
  155454. "lsr r7, r6, #16\n\t"
  155455. #endif
  155456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155457. "lsls r6, r6, #16\n\t"
  155458. #else
  155459. "lsl r6, r6, #16\n\t"
  155460. #endif
  155461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155462. "adds r5, r5, r6\n\t"
  155463. #else
  155464. "add r5, r5, r6\n\t"
  155465. #endif
  155466. #ifdef WOLFSSL_KEIL
  155467. "adcs r3, r3, r7\n\t"
  155468. #elif defined(__clang__)
  155469. "adcs r3, r7\n\t"
  155470. #else
  155471. "adc r3, r7\n\t"
  155472. #endif
  155473. #ifdef WOLFSSL_KEIL
  155474. "adcs r4, r4, %[r]\n\t"
  155475. #elif defined(__clang__)
  155476. "adcs r4, %[r]\n\t"
  155477. #else
  155478. "adc r4, %[r]\n\t"
  155479. #endif
  155480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155481. "lsrs r6, %[a], #16\n\t"
  155482. #else
  155483. "lsr r6, %[a], #16\n\t"
  155484. #endif
  155485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155486. "lsrs r7, %[b], #16\n\t"
  155487. #else
  155488. "lsr r7, %[b], #16\n\t"
  155489. #endif
  155490. #ifdef WOLFSSL_KEIL
  155491. "muls r7, r6, r7\n\t"
  155492. #elif defined(__clang__)
  155493. "muls r7, r6\n\t"
  155494. #else
  155495. "mul r7, r6\n\t"
  155496. #endif
  155497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155498. "adds r3, r3, r7\n\t"
  155499. #else
  155500. "add r3, r3, r7\n\t"
  155501. #endif
  155502. #ifdef WOLFSSL_KEIL
  155503. "adcs r4, r4, %[r]\n\t"
  155504. #elif defined(__clang__)
  155505. "adcs r4, %[r]\n\t"
  155506. #else
  155507. "adc r4, %[r]\n\t"
  155508. #endif
  155509. "uxth r7, %[b]\n\t"
  155510. #ifdef WOLFSSL_KEIL
  155511. "muls r6, r7, r6\n\t"
  155512. #elif defined(__clang__)
  155513. "muls r6, r7\n\t"
  155514. #else
  155515. "mul r6, r7\n\t"
  155516. #endif
  155517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155518. "lsrs r7, r6, #16\n\t"
  155519. #else
  155520. "lsr r7, r6, #16\n\t"
  155521. #endif
  155522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155523. "lsls r6, r6, #16\n\t"
  155524. #else
  155525. "lsl r6, r6, #16\n\t"
  155526. #endif
  155527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155528. "adds r5, r5, r6\n\t"
  155529. #else
  155530. "add r5, r5, r6\n\t"
  155531. #endif
  155532. #ifdef WOLFSSL_KEIL
  155533. "adcs r3, r3, r7\n\t"
  155534. #elif defined(__clang__)
  155535. "adcs r3, r7\n\t"
  155536. #else
  155537. "adc r3, r7\n\t"
  155538. #endif
  155539. #ifdef WOLFSSL_KEIL
  155540. "adcs r4, r4, %[r]\n\t"
  155541. #elif defined(__clang__)
  155542. "adcs r4, %[r]\n\t"
  155543. #else
  155544. "adc r4, %[r]\n\t"
  155545. #endif
  155546. "# A[4] * B[13]\n\t"
  155547. "mov %[a], r9\n\t"
  155548. "mov %[b], r10\n\t"
  155549. "ldr %[a], [%[a], #16]\n\t"
  155550. "ldr %[b], [%[b], #52]\n\t"
  155551. "uxth r6, %[a]\n\t"
  155552. "uxth r7, %[b]\n\t"
  155553. #ifdef WOLFSSL_KEIL
  155554. "muls r7, r6, r7\n\t"
  155555. #elif defined(__clang__)
  155556. "muls r7, r6\n\t"
  155557. #else
  155558. "mul r7, r6\n\t"
  155559. #endif
  155560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155561. "adds r5, r5, r7\n\t"
  155562. #else
  155563. "add r5, r5, r7\n\t"
  155564. #endif
  155565. #ifdef WOLFSSL_KEIL
  155566. "adcs r3, r3, %[r]\n\t"
  155567. #elif defined(__clang__)
  155568. "adcs r3, %[r]\n\t"
  155569. #else
  155570. "adc r3, %[r]\n\t"
  155571. #endif
  155572. #ifdef WOLFSSL_KEIL
  155573. "adcs r4, r4, %[r]\n\t"
  155574. #elif defined(__clang__)
  155575. "adcs r4, %[r]\n\t"
  155576. #else
  155577. "adc r4, %[r]\n\t"
  155578. #endif
  155579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155580. "lsrs r7, %[b], #16\n\t"
  155581. #else
  155582. "lsr r7, %[b], #16\n\t"
  155583. #endif
  155584. #ifdef WOLFSSL_KEIL
  155585. "muls r6, r7, r6\n\t"
  155586. #elif defined(__clang__)
  155587. "muls r6, r7\n\t"
  155588. #else
  155589. "mul r6, r7\n\t"
  155590. #endif
  155591. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155592. "lsrs r7, r6, #16\n\t"
  155593. #else
  155594. "lsr r7, r6, #16\n\t"
  155595. #endif
  155596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155597. "lsls r6, r6, #16\n\t"
  155598. #else
  155599. "lsl r6, r6, #16\n\t"
  155600. #endif
  155601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155602. "adds r5, r5, r6\n\t"
  155603. #else
  155604. "add r5, r5, r6\n\t"
  155605. #endif
  155606. #ifdef WOLFSSL_KEIL
  155607. "adcs r3, r3, r7\n\t"
  155608. #elif defined(__clang__)
  155609. "adcs r3, r7\n\t"
  155610. #else
  155611. "adc r3, r7\n\t"
  155612. #endif
  155613. #ifdef WOLFSSL_KEIL
  155614. "adcs r4, r4, %[r]\n\t"
  155615. #elif defined(__clang__)
  155616. "adcs r4, %[r]\n\t"
  155617. #else
  155618. "adc r4, %[r]\n\t"
  155619. #endif
  155620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155621. "lsrs r6, %[a], #16\n\t"
  155622. #else
  155623. "lsr r6, %[a], #16\n\t"
  155624. #endif
  155625. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155626. "lsrs r7, %[b], #16\n\t"
  155627. #else
  155628. "lsr r7, %[b], #16\n\t"
  155629. #endif
  155630. #ifdef WOLFSSL_KEIL
  155631. "muls r7, r6, r7\n\t"
  155632. #elif defined(__clang__)
  155633. "muls r7, r6\n\t"
  155634. #else
  155635. "mul r7, r6\n\t"
  155636. #endif
  155637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155638. "adds r3, r3, r7\n\t"
  155639. #else
  155640. "add r3, r3, r7\n\t"
  155641. #endif
  155642. #ifdef WOLFSSL_KEIL
  155643. "adcs r4, r4, %[r]\n\t"
  155644. #elif defined(__clang__)
  155645. "adcs r4, %[r]\n\t"
  155646. #else
  155647. "adc r4, %[r]\n\t"
  155648. #endif
  155649. "uxth r7, %[b]\n\t"
  155650. #ifdef WOLFSSL_KEIL
  155651. "muls r6, r7, r6\n\t"
  155652. #elif defined(__clang__)
  155653. "muls r6, r7\n\t"
  155654. #else
  155655. "mul r6, r7\n\t"
  155656. #endif
  155657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155658. "lsrs r7, r6, #16\n\t"
  155659. #else
  155660. "lsr r7, r6, #16\n\t"
  155661. #endif
  155662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155663. "lsls r6, r6, #16\n\t"
  155664. #else
  155665. "lsl r6, r6, #16\n\t"
  155666. #endif
  155667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155668. "adds r5, r5, r6\n\t"
  155669. #else
  155670. "add r5, r5, r6\n\t"
  155671. #endif
  155672. #ifdef WOLFSSL_KEIL
  155673. "adcs r3, r3, r7\n\t"
  155674. #elif defined(__clang__)
  155675. "adcs r3, r7\n\t"
  155676. #else
  155677. "adc r3, r7\n\t"
  155678. #endif
  155679. #ifdef WOLFSSL_KEIL
  155680. "adcs r4, r4, %[r]\n\t"
  155681. #elif defined(__clang__)
  155682. "adcs r4, %[r]\n\t"
  155683. #else
  155684. "adc r4, %[r]\n\t"
  155685. #endif
  155686. "# A[5] * B[12]\n\t"
  155687. "mov %[a], r9\n\t"
  155688. "mov %[b], r10\n\t"
  155689. "ldr %[a], [%[a], #20]\n\t"
  155690. "ldr %[b], [%[b], #48]\n\t"
  155691. "uxth r6, %[a]\n\t"
  155692. "uxth r7, %[b]\n\t"
  155693. #ifdef WOLFSSL_KEIL
  155694. "muls r7, r6, r7\n\t"
  155695. #elif defined(__clang__)
  155696. "muls r7, r6\n\t"
  155697. #else
  155698. "mul r7, r6\n\t"
  155699. #endif
  155700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155701. "adds r5, r5, r7\n\t"
  155702. #else
  155703. "add r5, r5, r7\n\t"
  155704. #endif
  155705. #ifdef WOLFSSL_KEIL
  155706. "adcs r3, r3, %[r]\n\t"
  155707. #elif defined(__clang__)
  155708. "adcs r3, %[r]\n\t"
  155709. #else
  155710. "adc r3, %[r]\n\t"
  155711. #endif
  155712. #ifdef WOLFSSL_KEIL
  155713. "adcs r4, r4, %[r]\n\t"
  155714. #elif defined(__clang__)
  155715. "adcs r4, %[r]\n\t"
  155716. #else
  155717. "adc r4, %[r]\n\t"
  155718. #endif
  155719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155720. "lsrs r7, %[b], #16\n\t"
  155721. #else
  155722. "lsr r7, %[b], #16\n\t"
  155723. #endif
  155724. #ifdef WOLFSSL_KEIL
  155725. "muls r6, r7, r6\n\t"
  155726. #elif defined(__clang__)
  155727. "muls r6, r7\n\t"
  155728. #else
  155729. "mul r6, r7\n\t"
  155730. #endif
  155731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155732. "lsrs r7, r6, #16\n\t"
  155733. #else
  155734. "lsr r7, r6, #16\n\t"
  155735. #endif
  155736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155737. "lsls r6, r6, #16\n\t"
  155738. #else
  155739. "lsl r6, r6, #16\n\t"
  155740. #endif
  155741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155742. "adds r5, r5, r6\n\t"
  155743. #else
  155744. "add r5, r5, r6\n\t"
  155745. #endif
  155746. #ifdef WOLFSSL_KEIL
  155747. "adcs r3, r3, r7\n\t"
  155748. #elif defined(__clang__)
  155749. "adcs r3, r7\n\t"
  155750. #else
  155751. "adc r3, r7\n\t"
  155752. #endif
  155753. #ifdef WOLFSSL_KEIL
  155754. "adcs r4, r4, %[r]\n\t"
  155755. #elif defined(__clang__)
  155756. "adcs r4, %[r]\n\t"
  155757. #else
  155758. "adc r4, %[r]\n\t"
  155759. #endif
  155760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155761. "lsrs r6, %[a], #16\n\t"
  155762. #else
  155763. "lsr r6, %[a], #16\n\t"
  155764. #endif
  155765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155766. "lsrs r7, %[b], #16\n\t"
  155767. #else
  155768. "lsr r7, %[b], #16\n\t"
  155769. #endif
  155770. #ifdef WOLFSSL_KEIL
  155771. "muls r7, r6, r7\n\t"
  155772. #elif defined(__clang__)
  155773. "muls r7, r6\n\t"
  155774. #else
  155775. "mul r7, r6\n\t"
  155776. #endif
  155777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155778. "adds r3, r3, r7\n\t"
  155779. #else
  155780. "add r3, r3, r7\n\t"
  155781. #endif
  155782. #ifdef WOLFSSL_KEIL
  155783. "adcs r4, r4, %[r]\n\t"
  155784. #elif defined(__clang__)
  155785. "adcs r4, %[r]\n\t"
  155786. #else
  155787. "adc r4, %[r]\n\t"
  155788. #endif
  155789. "uxth r7, %[b]\n\t"
  155790. #ifdef WOLFSSL_KEIL
  155791. "muls r6, r7, r6\n\t"
  155792. #elif defined(__clang__)
  155793. "muls r6, r7\n\t"
  155794. #else
  155795. "mul r6, r7\n\t"
  155796. #endif
  155797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155798. "lsrs r7, r6, #16\n\t"
  155799. #else
  155800. "lsr r7, r6, #16\n\t"
  155801. #endif
  155802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155803. "lsls r6, r6, #16\n\t"
  155804. #else
  155805. "lsl r6, r6, #16\n\t"
  155806. #endif
  155807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155808. "adds r5, r5, r6\n\t"
  155809. #else
  155810. "add r5, r5, r6\n\t"
  155811. #endif
  155812. #ifdef WOLFSSL_KEIL
  155813. "adcs r3, r3, r7\n\t"
  155814. #elif defined(__clang__)
  155815. "adcs r3, r7\n\t"
  155816. #else
  155817. "adc r3, r7\n\t"
  155818. #endif
  155819. #ifdef WOLFSSL_KEIL
  155820. "adcs r4, r4, %[r]\n\t"
  155821. #elif defined(__clang__)
  155822. "adcs r4, %[r]\n\t"
  155823. #else
  155824. "adc r4, %[r]\n\t"
  155825. #endif
  155826. "# A[6] * B[11]\n\t"
  155827. "mov %[a], r9\n\t"
  155828. "mov %[b], r10\n\t"
  155829. "ldr %[a], [%[a], #24]\n\t"
  155830. "ldr %[b], [%[b], #44]\n\t"
  155831. "uxth r6, %[a]\n\t"
  155832. "uxth r7, %[b]\n\t"
  155833. #ifdef WOLFSSL_KEIL
  155834. "muls r7, r6, r7\n\t"
  155835. #elif defined(__clang__)
  155836. "muls r7, r6\n\t"
  155837. #else
  155838. "mul r7, r6\n\t"
  155839. #endif
  155840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155841. "adds r5, r5, r7\n\t"
  155842. #else
  155843. "add r5, r5, r7\n\t"
  155844. #endif
  155845. #ifdef WOLFSSL_KEIL
  155846. "adcs r3, r3, %[r]\n\t"
  155847. #elif defined(__clang__)
  155848. "adcs r3, %[r]\n\t"
  155849. #else
  155850. "adc r3, %[r]\n\t"
  155851. #endif
  155852. #ifdef WOLFSSL_KEIL
  155853. "adcs r4, r4, %[r]\n\t"
  155854. #elif defined(__clang__)
  155855. "adcs r4, %[r]\n\t"
  155856. #else
  155857. "adc r4, %[r]\n\t"
  155858. #endif
  155859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155860. "lsrs r7, %[b], #16\n\t"
  155861. #else
  155862. "lsr r7, %[b], #16\n\t"
  155863. #endif
  155864. #ifdef WOLFSSL_KEIL
  155865. "muls r6, r7, r6\n\t"
  155866. #elif defined(__clang__)
  155867. "muls r6, r7\n\t"
  155868. #else
  155869. "mul r6, r7\n\t"
  155870. #endif
  155871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155872. "lsrs r7, r6, #16\n\t"
  155873. #else
  155874. "lsr r7, r6, #16\n\t"
  155875. #endif
  155876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155877. "lsls r6, r6, #16\n\t"
  155878. #else
  155879. "lsl r6, r6, #16\n\t"
  155880. #endif
  155881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155882. "adds r5, r5, r6\n\t"
  155883. #else
  155884. "add r5, r5, r6\n\t"
  155885. #endif
  155886. #ifdef WOLFSSL_KEIL
  155887. "adcs r3, r3, r7\n\t"
  155888. #elif defined(__clang__)
  155889. "adcs r3, r7\n\t"
  155890. #else
  155891. "adc r3, r7\n\t"
  155892. #endif
  155893. #ifdef WOLFSSL_KEIL
  155894. "adcs r4, r4, %[r]\n\t"
  155895. #elif defined(__clang__)
  155896. "adcs r4, %[r]\n\t"
  155897. #else
  155898. "adc r4, %[r]\n\t"
  155899. #endif
  155900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155901. "lsrs r6, %[a], #16\n\t"
  155902. #else
  155903. "lsr r6, %[a], #16\n\t"
  155904. #endif
  155905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155906. "lsrs r7, %[b], #16\n\t"
  155907. #else
  155908. "lsr r7, %[b], #16\n\t"
  155909. #endif
  155910. #ifdef WOLFSSL_KEIL
  155911. "muls r7, r6, r7\n\t"
  155912. #elif defined(__clang__)
  155913. "muls r7, r6\n\t"
  155914. #else
  155915. "mul r7, r6\n\t"
  155916. #endif
  155917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155918. "adds r3, r3, r7\n\t"
  155919. #else
  155920. "add r3, r3, r7\n\t"
  155921. #endif
  155922. #ifdef WOLFSSL_KEIL
  155923. "adcs r4, r4, %[r]\n\t"
  155924. #elif defined(__clang__)
  155925. "adcs r4, %[r]\n\t"
  155926. #else
  155927. "adc r4, %[r]\n\t"
  155928. #endif
  155929. "uxth r7, %[b]\n\t"
  155930. #ifdef WOLFSSL_KEIL
  155931. "muls r6, r7, r6\n\t"
  155932. #elif defined(__clang__)
  155933. "muls r6, r7\n\t"
  155934. #else
  155935. "mul r6, r7\n\t"
  155936. #endif
  155937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155938. "lsrs r7, r6, #16\n\t"
  155939. #else
  155940. "lsr r7, r6, #16\n\t"
  155941. #endif
  155942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155943. "lsls r6, r6, #16\n\t"
  155944. #else
  155945. "lsl r6, r6, #16\n\t"
  155946. #endif
  155947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155948. "adds r5, r5, r6\n\t"
  155949. #else
  155950. "add r5, r5, r6\n\t"
  155951. #endif
  155952. #ifdef WOLFSSL_KEIL
  155953. "adcs r3, r3, r7\n\t"
  155954. #elif defined(__clang__)
  155955. "adcs r3, r7\n\t"
  155956. #else
  155957. "adc r3, r7\n\t"
  155958. #endif
  155959. #ifdef WOLFSSL_KEIL
  155960. "adcs r4, r4, %[r]\n\t"
  155961. #elif defined(__clang__)
  155962. "adcs r4, %[r]\n\t"
  155963. #else
  155964. "adc r4, %[r]\n\t"
  155965. #endif
  155966. "# A[7] * B[10]\n\t"
  155967. "mov %[a], r9\n\t"
  155968. "mov %[b], r10\n\t"
  155969. "ldr %[a], [%[a], #28]\n\t"
  155970. "ldr %[b], [%[b], #40]\n\t"
  155971. "uxth r6, %[a]\n\t"
  155972. "uxth r7, %[b]\n\t"
  155973. #ifdef WOLFSSL_KEIL
  155974. "muls r7, r6, r7\n\t"
  155975. #elif defined(__clang__)
  155976. "muls r7, r6\n\t"
  155977. #else
  155978. "mul r7, r6\n\t"
  155979. #endif
  155980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  155981. "adds r5, r5, r7\n\t"
  155982. #else
  155983. "add r5, r5, r7\n\t"
  155984. #endif
  155985. #ifdef WOLFSSL_KEIL
  155986. "adcs r3, r3, %[r]\n\t"
  155987. #elif defined(__clang__)
  155988. "adcs r3, %[r]\n\t"
  155989. #else
  155990. "adc r3, %[r]\n\t"
  155991. #endif
  155992. #ifdef WOLFSSL_KEIL
  155993. "adcs r4, r4, %[r]\n\t"
  155994. #elif defined(__clang__)
  155995. "adcs r4, %[r]\n\t"
  155996. #else
  155997. "adc r4, %[r]\n\t"
  155998. #endif
  155999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156000. "lsrs r7, %[b], #16\n\t"
  156001. #else
  156002. "lsr r7, %[b], #16\n\t"
  156003. #endif
  156004. #ifdef WOLFSSL_KEIL
  156005. "muls r6, r7, r6\n\t"
  156006. #elif defined(__clang__)
  156007. "muls r6, r7\n\t"
  156008. #else
  156009. "mul r6, r7\n\t"
  156010. #endif
  156011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156012. "lsrs r7, r6, #16\n\t"
  156013. #else
  156014. "lsr r7, r6, #16\n\t"
  156015. #endif
  156016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156017. "lsls r6, r6, #16\n\t"
  156018. #else
  156019. "lsl r6, r6, #16\n\t"
  156020. #endif
  156021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156022. "adds r5, r5, r6\n\t"
  156023. #else
  156024. "add r5, r5, r6\n\t"
  156025. #endif
  156026. #ifdef WOLFSSL_KEIL
  156027. "adcs r3, r3, r7\n\t"
  156028. #elif defined(__clang__)
  156029. "adcs r3, r7\n\t"
  156030. #else
  156031. "adc r3, r7\n\t"
  156032. #endif
  156033. #ifdef WOLFSSL_KEIL
  156034. "adcs r4, r4, %[r]\n\t"
  156035. #elif defined(__clang__)
  156036. "adcs r4, %[r]\n\t"
  156037. #else
  156038. "adc r4, %[r]\n\t"
  156039. #endif
  156040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156041. "lsrs r6, %[a], #16\n\t"
  156042. #else
  156043. "lsr r6, %[a], #16\n\t"
  156044. #endif
  156045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156046. "lsrs r7, %[b], #16\n\t"
  156047. #else
  156048. "lsr r7, %[b], #16\n\t"
  156049. #endif
  156050. #ifdef WOLFSSL_KEIL
  156051. "muls r7, r6, r7\n\t"
  156052. #elif defined(__clang__)
  156053. "muls r7, r6\n\t"
  156054. #else
  156055. "mul r7, r6\n\t"
  156056. #endif
  156057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156058. "adds r3, r3, r7\n\t"
  156059. #else
  156060. "add r3, r3, r7\n\t"
  156061. #endif
  156062. #ifdef WOLFSSL_KEIL
  156063. "adcs r4, r4, %[r]\n\t"
  156064. #elif defined(__clang__)
  156065. "adcs r4, %[r]\n\t"
  156066. #else
  156067. "adc r4, %[r]\n\t"
  156068. #endif
  156069. "uxth r7, %[b]\n\t"
  156070. #ifdef WOLFSSL_KEIL
  156071. "muls r6, r7, r6\n\t"
  156072. #elif defined(__clang__)
  156073. "muls r6, r7\n\t"
  156074. #else
  156075. "mul r6, r7\n\t"
  156076. #endif
  156077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156078. "lsrs r7, r6, #16\n\t"
  156079. #else
  156080. "lsr r7, r6, #16\n\t"
  156081. #endif
  156082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156083. "lsls r6, r6, #16\n\t"
  156084. #else
  156085. "lsl r6, r6, #16\n\t"
  156086. #endif
  156087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156088. "adds r5, r5, r6\n\t"
  156089. #else
  156090. "add r5, r5, r6\n\t"
  156091. #endif
  156092. #ifdef WOLFSSL_KEIL
  156093. "adcs r3, r3, r7\n\t"
  156094. #elif defined(__clang__)
  156095. "adcs r3, r7\n\t"
  156096. #else
  156097. "adc r3, r7\n\t"
  156098. #endif
  156099. #ifdef WOLFSSL_KEIL
  156100. "adcs r4, r4, %[r]\n\t"
  156101. #elif defined(__clang__)
  156102. "adcs r4, %[r]\n\t"
  156103. #else
  156104. "adc r4, %[r]\n\t"
  156105. #endif
  156106. "# A[8] * B[9]\n\t"
  156107. "mov %[a], r9\n\t"
  156108. "mov %[b], r10\n\t"
  156109. "ldr %[a], [%[a], #32]\n\t"
  156110. "ldr %[b], [%[b], #36]\n\t"
  156111. "uxth r6, %[a]\n\t"
  156112. "uxth r7, %[b]\n\t"
  156113. #ifdef WOLFSSL_KEIL
  156114. "muls r7, r6, r7\n\t"
  156115. #elif defined(__clang__)
  156116. "muls r7, r6\n\t"
  156117. #else
  156118. "mul r7, r6\n\t"
  156119. #endif
  156120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156121. "adds r5, r5, r7\n\t"
  156122. #else
  156123. "add r5, r5, r7\n\t"
  156124. #endif
  156125. #ifdef WOLFSSL_KEIL
  156126. "adcs r3, r3, %[r]\n\t"
  156127. #elif defined(__clang__)
  156128. "adcs r3, %[r]\n\t"
  156129. #else
  156130. "adc r3, %[r]\n\t"
  156131. #endif
  156132. #ifdef WOLFSSL_KEIL
  156133. "adcs r4, r4, %[r]\n\t"
  156134. #elif defined(__clang__)
  156135. "adcs r4, %[r]\n\t"
  156136. #else
  156137. "adc r4, %[r]\n\t"
  156138. #endif
  156139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156140. "lsrs r7, %[b], #16\n\t"
  156141. #else
  156142. "lsr r7, %[b], #16\n\t"
  156143. #endif
  156144. #ifdef WOLFSSL_KEIL
  156145. "muls r6, r7, r6\n\t"
  156146. #elif defined(__clang__)
  156147. "muls r6, r7\n\t"
  156148. #else
  156149. "mul r6, r7\n\t"
  156150. #endif
  156151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156152. "lsrs r7, r6, #16\n\t"
  156153. #else
  156154. "lsr r7, r6, #16\n\t"
  156155. #endif
  156156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156157. "lsls r6, r6, #16\n\t"
  156158. #else
  156159. "lsl r6, r6, #16\n\t"
  156160. #endif
  156161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156162. "adds r5, r5, r6\n\t"
  156163. #else
  156164. "add r5, r5, r6\n\t"
  156165. #endif
  156166. #ifdef WOLFSSL_KEIL
  156167. "adcs r3, r3, r7\n\t"
  156168. #elif defined(__clang__)
  156169. "adcs r3, r7\n\t"
  156170. #else
  156171. "adc r3, r7\n\t"
  156172. #endif
  156173. #ifdef WOLFSSL_KEIL
  156174. "adcs r4, r4, %[r]\n\t"
  156175. #elif defined(__clang__)
  156176. "adcs r4, %[r]\n\t"
  156177. #else
  156178. "adc r4, %[r]\n\t"
  156179. #endif
  156180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156181. "lsrs r6, %[a], #16\n\t"
  156182. #else
  156183. "lsr r6, %[a], #16\n\t"
  156184. #endif
  156185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156186. "lsrs r7, %[b], #16\n\t"
  156187. #else
  156188. "lsr r7, %[b], #16\n\t"
  156189. #endif
  156190. #ifdef WOLFSSL_KEIL
  156191. "muls r7, r6, r7\n\t"
  156192. #elif defined(__clang__)
  156193. "muls r7, r6\n\t"
  156194. #else
  156195. "mul r7, r6\n\t"
  156196. #endif
  156197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156198. "adds r3, r3, r7\n\t"
  156199. #else
  156200. "add r3, r3, r7\n\t"
  156201. #endif
  156202. #ifdef WOLFSSL_KEIL
  156203. "adcs r4, r4, %[r]\n\t"
  156204. #elif defined(__clang__)
  156205. "adcs r4, %[r]\n\t"
  156206. #else
  156207. "adc r4, %[r]\n\t"
  156208. #endif
  156209. "uxth r7, %[b]\n\t"
  156210. #ifdef WOLFSSL_KEIL
  156211. "muls r6, r7, r6\n\t"
  156212. #elif defined(__clang__)
  156213. "muls r6, r7\n\t"
  156214. #else
  156215. "mul r6, r7\n\t"
  156216. #endif
  156217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156218. "lsrs r7, r6, #16\n\t"
  156219. #else
  156220. "lsr r7, r6, #16\n\t"
  156221. #endif
  156222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156223. "lsls r6, r6, #16\n\t"
  156224. #else
  156225. "lsl r6, r6, #16\n\t"
  156226. #endif
  156227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156228. "adds r5, r5, r6\n\t"
  156229. #else
  156230. "add r5, r5, r6\n\t"
  156231. #endif
  156232. #ifdef WOLFSSL_KEIL
  156233. "adcs r3, r3, r7\n\t"
  156234. #elif defined(__clang__)
  156235. "adcs r3, r7\n\t"
  156236. #else
  156237. "adc r3, r7\n\t"
  156238. #endif
  156239. #ifdef WOLFSSL_KEIL
  156240. "adcs r4, r4, %[r]\n\t"
  156241. #elif defined(__clang__)
  156242. "adcs r4, %[r]\n\t"
  156243. #else
  156244. "adc r4, %[r]\n\t"
  156245. #endif
  156246. "# A[9] * B[8]\n\t"
  156247. "mov %[a], r9\n\t"
  156248. "mov %[b], r10\n\t"
  156249. "ldr %[a], [%[a], #36]\n\t"
  156250. "ldr %[b], [%[b], #32]\n\t"
  156251. "uxth r6, %[a]\n\t"
  156252. "uxth r7, %[b]\n\t"
  156253. #ifdef WOLFSSL_KEIL
  156254. "muls r7, r6, r7\n\t"
  156255. #elif defined(__clang__)
  156256. "muls r7, r6\n\t"
  156257. #else
  156258. "mul r7, r6\n\t"
  156259. #endif
  156260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156261. "adds r5, r5, r7\n\t"
  156262. #else
  156263. "add r5, r5, r7\n\t"
  156264. #endif
  156265. #ifdef WOLFSSL_KEIL
  156266. "adcs r3, r3, %[r]\n\t"
  156267. #elif defined(__clang__)
  156268. "adcs r3, %[r]\n\t"
  156269. #else
  156270. "adc r3, %[r]\n\t"
  156271. #endif
  156272. #ifdef WOLFSSL_KEIL
  156273. "adcs r4, r4, %[r]\n\t"
  156274. #elif defined(__clang__)
  156275. "adcs r4, %[r]\n\t"
  156276. #else
  156277. "adc r4, %[r]\n\t"
  156278. #endif
  156279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156280. "lsrs r7, %[b], #16\n\t"
  156281. #else
  156282. "lsr r7, %[b], #16\n\t"
  156283. #endif
  156284. #ifdef WOLFSSL_KEIL
  156285. "muls r6, r7, r6\n\t"
  156286. #elif defined(__clang__)
  156287. "muls r6, r7\n\t"
  156288. #else
  156289. "mul r6, r7\n\t"
  156290. #endif
  156291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156292. "lsrs r7, r6, #16\n\t"
  156293. #else
  156294. "lsr r7, r6, #16\n\t"
  156295. #endif
  156296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156297. "lsls r6, r6, #16\n\t"
  156298. #else
  156299. "lsl r6, r6, #16\n\t"
  156300. #endif
  156301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156302. "adds r5, r5, r6\n\t"
  156303. #else
  156304. "add r5, r5, r6\n\t"
  156305. #endif
  156306. #ifdef WOLFSSL_KEIL
  156307. "adcs r3, r3, r7\n\t"
  156308. #elif defined(__clang__)
  156309. "adcs r3, r7\n\t"
  156310. #else
  156311. "adc r3, r7\n\t"
  156312. #endif
  156313. #ifdef WOLFSSL_KEIL
  156314. "adcs r4, r4, %[r]\n\t"
  156315. #elif defined(__clang__)
  156316. "adcs r4, %[r]\n\t"
  156317. #else
  156318. "adc r4, %[r]\n\t"
  156319. #endif
  156320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156321. "lsrs r6, %[a], #16\n\t"
  156322. #else
  156323. "lsr r6, %[a], #16\n\t"
  156324. #endif
  156325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156326. "lsrs r7, %[b], #16\n\t"
  156327. #else
  156328. "lsr r7, %[b], #16\n\t"
  156329. #endif
  156330. #ifdef WOLFSSL_KEIL
  156331. "muls r7, r6, r7\n\t"
  156332. #elif defined(__clang__)
  156333. "muls r7, r6\n\t"
  156334. #else
  156335. "mul r7, r6\n\t"
  156336. #endif
  156337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156338. "adds r3, r3, r7\n\t"
  156339. #else
  156340. "add r3, r3, r7\n\t"
  156341. #endif
  156342. #ifdef WOLFSSL_KEIL
  156343. "adcs r4, r4, %[r]\n\t"
  156344. #elif defined(__clang__)
  156345. "adcs r4, %[r]\n\t"
  156346. #else
  156347. "adc r4, %[r]\n\t"
  156348. #endif
  156349. "uxth r7, %[b]\n\t"
  156350. #ifdef WOLFSSL_KEIL
  156351. "muls r6, r7, r6\n\t"
  156352. #elif defined(__clang__)
  156353. "muls r6, r7\n\t"
  156354. #else
  156355. "mul r6, r7\n\t"
  156356. #endif
  156357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156358. "lsrs r7, r6, #16\n\t"
  156359. #else
  156360. "lsr r7, r6, #16\n\t"
  156361. #endif
  156362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156363. "lsls r6, r6, #16\n\t"
  156364. #else
  156365. "lsl r6, r6, #16\n\t"
  156366. #endif
  156367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156368. "adds r5, r5, r6\n\t"
  156369. #else
  156370. "add r5, r5, r6\n\t"
  156371. #endif
  156372. #ifdef WOLFSSL_KEIL
  156373. "adcs r3, r3, r7\n\t"
  156374. #elif defined(__clang__)
  156375. "adcs r3, r7\n\t"
  156376. #else
  156377. "adc r3, r7\n\t"
  156378. #endif
  156379. #ifdef WOLFSSL_KEIL
  156380. "adcs r4, r4, %[r]\n\t"
  156381. #elif defined(__clang__)
  156382. "adcs r4, %[r]\n\t"
  156383. #else
  156384. "adc r4, %[r]\n\t"
  156385. #endif
  156386. "# A[10] * B[7]\n\t"
  156387. "mov %[a], r9\n\t"
  156388. "mov %[b], r10\n\t"
  156389. "ldr %[a], [%[a], #40]\n\t"
  156390. "ldr %[b], [%[b], #28]\n\t"
  156391. "uxth r6, %[a]\n\t"
  156392. "uxth r7, %[b]\n\t"
  156393. #ifdef WOLFSSL_KEIL
  156394. "muls r7, r6, r7\n\t"
  156395. #elif defined(__clang__)
  156396. "muls r7, r6\n\t"
  156397. #else
  156398. "mul r7, r6\n\t"
  156399. #endif
  156400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156401. "adds r5, r5, r7\n\t"
  156402. #else
  156403. "add r5, r5, r7\n\t"
  156404. #endif
  156405. #ifdef WOLFSSL_KEIL
  156406. "adcs r3, r3, %[r]\n\t"
  156407. #elif defined(__clang__)
  156408. "adcs r3, %[r]\n\t"
  156409. #else
  156410. "adc r3, %[r]\n\t"
  156411. #endif
  156412. #ifdef WOLFSSL_KEIL
  156413. "adcs r4, r4, %[r]\n\t"
  156414. #elif defined(__clang__)
  156415. "adcs r4, %[r]\n\t"
  156416. #else
  156417. "adc r4, %[r]\n\t"
  156418. #endif
  156419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156420. "lsrs r7, %[b], #16\n\t"
  156421. #else
  156422. "lsr r7, %[b], #16\n\t"
  156423. #endif
  156424. #ifdef WOLFSSL_KEIL
  156425. "muls r6, r7, r6\n\t"
  156426. #elif defined(__clang__)
  156427. "muls r6, r7\n\t"
  156428. #else
  156429. "mul r6, r7\n\t"
  156430. #endif
  156431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156432. "lsrs r7, r6, #16\n\t"
  156433. #else
  156434. "lsr r7, r6, #16\n\t"
  156435. #endif
  156436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156437. "lsls r6, r6, #16\n\t"
  156438. #else
  156439. "lsl r6, r6, #16\n\t"
  156440. #endif
  156441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156442. "adds r5, r5, r6\n\t"
  156443. #else
  156444. "add r5, r5, r6\n\t"
  156445. #endif
  156446. #ifdef WOLFSSL_KEIL
  156447. "adcs r3, r3, r7\n\t"
  156448. #elif defined(__clang__)
  156449. "adcs r3, r7\n\t"
  156450. #else
  156451. "adc r3, r7\n\t"
  156452. #endif
  156453. #ifdef WOLFSSL_KEIL
  156454. "adcs r4, r4, %[r]\n\t"
  156455. #elif defined(__clang__)
  156456. "adcs r4, %[r]\n\t"
  156457. #else
  156458. "adc r4, %[r]\n\t"
  156459. #endif
  156460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156461. "lsrs r6, %[a], #16\n\t"
  156462. #else
  156463. "lsr r6, %[a], #16\n\t"
  156464. #endif
  156465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156466. "lsrs r7, %[b], #16\n\t"
  156467. #else
  156468. "lsr r7, %[b], #16\n\t"
  156469. #endif
  156470. #ifdef WOLFSSL_KEIL
  156471. "muls r7, r6, r7\n\t"
  156472. #elif defined(__clang__)
  156473. "muls r7, r6\n\t"
  156474. #else
  156475. "mul r7, r6\n\t"
  156476. #endif
  156477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156478. "adds r3, r3, r7\n\t"
  156479. #else
  156480. "add r3, r3, r7\n\t"
  156481. #endif
  156482. #ifdef WOLFSSL_KEIL
  156483. "adcs r4, r4, %[r]\n\t"
  156484. #elif defined(__clang__)
  156485. "adcs r4, %[r]\n\t"
  156486. #else
  156487. "adc r4, %[r]\n\t"
  156488. #endif
  156489. "uxth r7, %[b]\n\t"
  156490. #ifdef WOLFSSL_KEIL
  156491. "muls r6, r7, r6\n\t"
  156492. #elif defined(__clang__)
  156493. "muls r6, r7\n\t"
  156494. #else
  156495. "mul r6, r7\n\t"
  156496. #endif
  156497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156498. "lsrs r7, r6, #16\n\t"
  156499. #else
  156500. "lsr r7, r6, #16\n\t"
  156501. #endif
  156502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156503. "lsls r6, r6, #16\n\t"
  156504. #else
  156505. "lsl r6, r6, #16\n\t"
  156506. #endif
  156507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156508. "adds r5, r5, r6\n\t"
  156509. #else
  156510. "add r5, r5, r6\n\t"
  156511. #endif
  156512. #ifdef WOLFSSL_KEIL
  156513. "adcs r3, r3, r7\n\t"
  156514. #elif defined(__clang__)
  156515. "adcs r3, r7\n\t"
  156516. #else
  156517. "adc r3, r7\n\t"
  156518. #endif
  156519. #ifdef WOLFSSL_KEIL
  156520. "adcs r4, r4, %[r]\n\t"
  156521. #elif defined(__clang__)
  156522. "adcs r4, %[r]\n\t"
  156523. #else
  156524. "adc r4, %[r]\n\t"
  156525. #endif
  156526. "# A[11] * B[6]\n\t"
  156527. "mov %[a], r9\n\t"
  156528. "mov %[b], r10\n\t"
  156529. "ldr %[a], [%[a], #44]\n\t"
  156530. "ldr %[b], [%[b], #24]\n\t"
  156531. "uxth r6, %[a]\n\t"
  156532. "uxth r7, %[b]\n\t"
  156533. #ifdef WOLFSSL_KEIL
  156534. "muls r7, r6, r7\n\t"
  156535. #elif defined(__clang__)
  156536. "muls r7, r6\n\t"
  156537. #else
  156538. "mul r7, r6\n\t"
  156539. #endif
  156540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156541. "adds r5, r5, r7\n\t"
  156542. #else
  156543. "add r5, r5, r7\n\t"
  156544. #endif
  156545. #ifdef WOLFSSL_KEIL
  156546. "adcs r3, r3, %[r]\n\t"
  156547. #elif defined(__clang__)
  156548. "adcs r3, %[r]\n\t"
  156549. #else
  156550. "adc r3, %[r]\n\t"
  156551. #endif
  156552. #ifdef WOLFSSL_KEIL
  156553. "adcs r4, r4, %[r]\n\t"
  156554. #elif defined(__clang__)
  156555. "adcs r4, %[r]\n\t"
  156556. #else
  156557. "adc r4, %[r]\n\t"
  156558. #endif
  156559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156560. "lsrs r7, %[b], #16\n\t"
  156561. #else
  156562. "lsr r7, %[b], #16\n\t"
  156563. #endif
  156564. #ifdef WOLFSSL_KEIL
  156565. "muls r6, r7, r6\n\t"
  156566. #elif defined(__clang__)
  156567. "muls r6, r7\n\t"
  156568. #else
  156569. "mul r6, r7\n\t"
  156570. #endif
  156571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156572. "lsrs r7, r6, #16\n\t"
  156573. #else
  156574. "lsr r7, r6, #16\n\t"
  156575. #endif
  156576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156577. "lsls r6, r6, #16\n\t"
  156578. #else
  156579. "lsl r6, r6, #16\n\t"
  156580. #endif
  156581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156582. "adds r5, r5, r6\n\t"
  156583. #else
  156584. "add r5, r5, r6\n\t"
  156585. #endif
  156586. #ifdef WOLFSSL_KEIL
  156587. "adcs r3, r3, r7\n\t"
  156588. #elif defined(__clang__)
  156589. "adcs r3, r7\n\t"
  156590. #else
  156591. "adc r3, r7\n\t"
  156592. #endif
  156593. #ifdef WOLFSSL_KEIL
  156594. "adcs r4, r4, %[r]\n\t"
  156595. #elif defined(__clang__)
  156596. "adcs r4, %[r]\n\t"
  156597. #else
  156598. "adc r4, %[r]\n\t"
  156599. #endif
  156600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156601. "lsrs r6, %[a], #16\n\t"
  156602. #else
  156603. "lsr r6, %[a], #16\n\t"
  156604. #endif
  156605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156606. "lsrs r7, %[b], #16\n\t"
  156607. #else
  156608. "lsr r7, %[b], #16\n\t"
  156609. #endif
  156610. #ifdef WOLFSSL_KEIL
  156611. "muls r7, r6, r7\n\t"
  156612. #elif defined(__clang__)
  156613. "muls r7, r6\n\t"
  156614. #else
  156615. "mul r7, r6\n\t"
  156616. #endif
  156617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156618. "adds r3, r3, r7\n\t"
  156619. #else
  156620. "add r3, r3, r7\n\t"
  156621. #endif
  156622. #ifdef WOLFSSL_KEIL
  156623. "adcs r4, r4, %[r]\n\t"
  156624. #elif defined(__clang__)
  156625. "adcs r4, %[r]\n\t"
  156626. #else
  156627. "adc r4, %[r]\n\t"
  156628. #endif
  156629. "uxth r7, %[b]\n\t"
  156630. #ifdef WOLFSSL_KEIL
  156631. "muls r6, r7, r6\n\t"
  156632. #elif defined(__clang__)
  156633. "muls r6, r7\n\t"
  156634. #else
  156635. "mul r6, r7\n\t"
  156636. #endif
  156637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156638. "lsrs r7, r6, #16\n\t"
  156639. #else
  156640. "lsr r7, r6, #16\n\t"
  156641. #endif
  156642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156643. "lsls r6, r6, #16\n\t"
  156644. #else
  156645. "lsl r6, r6, #16\n\t"
  156646. #endif
  156647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156648. "adds r5, r5, r6\n\t"
  156649. #else
  156650. "add r5, r5, r6\n\t"
  156651. #endif
  156652. #ifdef WOLFSSL_KEIL
  156653. "adcs r3, r3, r7\n\t"
  156654. #elif defined(__clang__)
  156655. "adcs r3, r7\n\t"
  156656. #else
  156657. "adc r3, r7\n\t"
  156658. #endif
  156659. #ifdef WOLFSSL_KEIL
  156660. "adcs r4, r4, %[r]\n\t"
  156661. #elif defined(__clang__)
  156662. "adcs r4, %[r]\n\t"
  156663. #else
  156664. "adc r4, %[r]\n\t"
  156665. #endif
  156666. "# A[12] * B[5]\n\t"
  156667. "mov %[a], r9\n\t"
  156668. "mov %[b], r10\n\t"
  156669. "ldr %[a], [%[a], #48]\n\t"
  156670. "ldr %[b], [%[b], #20]\n\t"
  156671. "uxth r6, %[a]\n\t"
  156672. "uxth r7, %[b]\n\t"
  156673. #ifdef WOLFSSL_KEIL
  156674. "muls r7, r6, r7\n\t"
  156675. #elif defined(__clang__)
  156676. "muls r7, r6\n\t"
  156677. #else
  156678. "mul r7, r6\n\t"
  156679. #endif
  156680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156681. "adds r5, r5, r7\n\t"
  156682. #else
  156683. "add r5, r5, r7\n\t"
  156684. #endif
  156685. #ifdef WOLFSSL_KEIL
  156686. "adcs r3, r3, %[r]\n\t"
  156687. #elif defined(__clang__)
  156688. "adcs r3, %[r]\n\t"
  156689. #else
  156690. "adc r3, %[r]\n\t"
  156691. #endif
  156692. #ifdef WOLFSSL_KEIL
  156693. "adcs r4, r4, %[r]\n\t"
  156694. #elif defined(__clang__)
  156695. "adcs r4, %[r]\n\t"
  156696. #else
  156697. "adc r4, %[r]\n\t"
  156698. #endif
  156699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156700. "lsrs r7, %[b], #16\n\t"
  156701. #else
  156702. "lsr r7, %[b], #16\n\t"
  156703. #endif
  156704. #ifdef WOLFSSL_KEIL
  156705. "muls r6, r7, r6\n\t"
  156706. #elif defined(__clang__)
  156707. "muls r6, r7\n\t"
  156708. #else
  156709. "mul r6, r7\n\t"
  156710. #endif
  156711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156712. "lsrs r7, r6, #16\n\t"
  156713. #else
  156714. "lsr r7, r6, #16\n\t"
  156715. #endif
  156716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156717. "lsls r6, r6, #16\n\t"
  156718. #else
  156719. "lsl r6, r6, #16\n\t"
  156720. #endif
  156721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156722. "adds r5, r5, r6\n\t"
  156723. #else
  156724. "add r5, r5, r6\n\t"
  156725. #endif
  156726. #ifdef WOLFSSL_KEIL
  156727. "adcs r3, r3, r7\n\t"
  156728. #elif defined(__clang__)
  156729. "adcs r3, r7\n\t"
  156730. #else
  156731. "adc r3, r7\n\t"
  156732. #endif
  156733. #ifdef WOLFSSL_KEIL
  156734. "adcs r4, r4, %[r]\n\t"
  156735. #elif defined(__clang__)
  156736. "adcs r4, %[r]\n\t"
  156737. #else
  156738. "adc r4, %[r]\n\t"
  156739. #endif
  156740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156741. "lsrs r6, %[a], #16\n\t"
  156742. #else
  156743. "lsr r6, %[a], #16\n\t"
  156744. #endif
  156745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156746. "lsrs r7, %[b], #16\n\t"
  156747. #else
  156748. "lsr r7, %[b], #16\n\t"
  156749. #endif
  156750. #ifdef WOLFSSL_KEIL
  156751. "muls r7, r6, r7\n\t"
  156752. #elif defined(__clang__)
  156753. "muls r7, r6\n\t"
  156754. #else
  156755. "mul r7, r6\n\t"
  156756. #endif
  156757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156758. "adds r3, r3, r7\n\t"
  156759. #else
  156760. "add r3, r3, r7\n\t"
  156761. #endif
  156762. #ifdef WOLFSSL_KEIL
  156763. "adcs r4, r4, %[r]\n\t"
  156764. #elif defined(__clang__)
  156765. "adcs r4, %[r]\n\t"
  156766. #else
  156767. "adc r4, %[r]\n\t"
  156768. #endif
  156769. "uxth r7, %[b]\n\t"
  156770. #ifdef WOLFSSL_KEIL
  156771. "muls r6, r7, r6\n\t"
  156772. #elif defined(__clang__)
  156773. "muls r6, r7\n\t"
  156774. #else
  156775. "mul r6, r7\n\t"
  156776. #endif
  156777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156778. "lsrs r7, r6, #16\n\t"
  156779. #else
  156780. "lsr r7, r6, #16\n\t"
  156781. #endif
  156782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156783. "lsls r6, r6, #16\n\t"
  156784. #else
  156785. "lsl r6, r6, #16\n\t"
  156786. #endif
  156787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156788. "adds r5, r5, r6\n\t"
  156789. #else
  156790. "add r5, r5, r6\n\t"
  156791. #endif
  156792. #ifdef WOLFSSL_KEIL
  156793. "adcs r3, r3, r7\n\t"
  156794. #elif defined(__clang__)
  156795. "adcs r3, r7\n\t"
  156796. #else
  156797. "adc r3, r7\n\t"
  156798. #endif
  156799. #ifdef WOLFSSL_KEIL
  156800. "adcs r4, r4, %[r]\n\t"
  156801. #elif defined(__clang__)
  156802. "adcs r4, %[r]\n\t"
  156803. #else
  156804. "adc r4, %[r]\n\t"
  156805. #endif
  156806. "# A[13] * B[4]\n\t"
  156807. "mov %[a], r9\n\t"
  156808. "mov %[b], r10\n\t"
  156809. "ldr %[a], [%[a], #52]\n\t"
  156810. "ldr %[b], [%[b], #16]\n\t"
  156811. "uxth r6, %[a]\n\t"
  156812. "uxth r7, %[b]\n\t"
  156813. #ifdef WOLFSSL_KEIL
  156814. "muls r7, r6, r7\n\t"
  156815. #elif defined(__clang__)
  156816. "muls r7, r6\n\t"
  156817. #else
  156818. "mul r7, r6\n\t"
  156819. #endif
  156820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156821. "adds r5, r5, r7\n\t"
  156822. #else
  156823. "add r5, r5, r7\n\t"
  156824. #endif
  156825. #ifdef WOLFSSL_KEIL
  156826. "adcs r3, r3, %[r]\n\t"
  156827. #elif defined(__clang__)
  156828. "adcs r3, %[r]\n\t"
  156829. #else
  156830. "adc r3, %[r]\n\t"
  156831. #endif
  156832. #ifdef WOLFSSL_KEIL
  156833. "adcs r4, r4, %[r]\n\t"
  156834. #elif defined(__clang__)
  156835. "adcs r4, %[r]\n\t"
  156836. #else
  156837. "adc r4, %[r]\n\t"
  156838. #endif
  156839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156840. "lsrs r7, %[b], #16\n\t"
  156841. #else
  156842. "lsr r7, %[b], #16\n\t"
  156843. #endif
  156844. #ifdef WOLFSSL_KEIL
  156845. "muls r6, r7, r6\n\t"
  156846. #elif defined(__clang__)
  156847. "muls r6, r7\n\t"
  156848. #else
  156849. "mul r6, r7\n\t"
  156850. #endif
  156851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156852. "lsrs r7, r6, #16\n\t"
  156853. #else
  156854. "lsr r7, r6, #16\n\t"
  156855. #endif
  156856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156857. "lsls r6, r6, #16\n\t"
  156858. #else
  156859. "lsl r6, r6, #16\n\t"
  156860. #endif
  156861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156862. "adds r5, r5, r6\n\t"
  156863. #else
  156864. "add r5, r5, r6\n\t"
  156865. #endif
  156866. #ifdef WOLFSSL_KEIL
  156867. "adcs r3, r3, r7\n\t"
  156868. #elif defined(__clang__)
  156869. "adcs r3, r7\n\t"
  156870. #else
  156871. "adc r3, r7\n\t"
  156872. #endif
  156873. #ifdef WOLFSSL_KEIL
  156874. "adcs r4, r4, %[r]\n\t"
  156875. #elif defined(__clang__)
  156876. "adcs r4, %[r]\n\t"
  156877. #else
  156878. "adc r4, %[r]\n\t"
  156879. #endif
  156880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156881. "lsrs r6, %[a], #16\n\t"
  156882. #else
  156883. "lsr r6, %[a], #16\n\t"
  156884. #endif
  156885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156886. "lsrs r7, %[b], #16\n\t"
  156887. #else
  156888. "lsr r7, %[b], #16\n\t"
  156889. #endif
  156890. #ifdef WOLFSSL_KEIL
  156891. "muls r7, r6, r7\n\t"
  156892. #elif defined(__clang__)
  156893. "muls r7, r6\n\t"
  156894. #else
  156895. "mul r7, r6\n\t"
  156896. #endif
  156897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156898. "adds r3, r3, r7\n\t"
  156899. #else
  156900. "add r3, r3, r7\n\t"
  156901. #endif
  156902. #ifdef WOLFSSL_KEIL
  156903. "adcs r4, r4, %[r]\n\t"
  156904. #elif defined(__clang__)
  156905. "adcs r4, %[r]\n\t"
  156906. #else
  156907. "adc r4, %[r]\n\t"
  156908. #endif
  156909. "uxth r7, %[b]\n\t"
  156910. #ifdef WOLFSSL_KEIL
  156911. "muls r6, r7, r6\n\t"
  156912. #elif defined(__clang__)
  156913. "muls r6, r7\n\t"
  156914. #else
  156915. "mul r6, r7\n\t"
  156916. #endif
  156917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156918. "lsrs r7, r6, #16\n\t"
  156919. #else
  156920. "lsr r7, r6, #16\n\t"
  156921. #endif
  156922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156923. "lsls r6, r6, #16\n\t"
  156924. #else
  156925. "lsl r6, r6, #16\n\t"
  156926. #endif
  156927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156928. "adds r5, r5, r6\n\t"
  156929. #else
  156930. "add r5, r5, r6\n\t"
  156931. #endif
  156932. #ifdef WOLFSSL_KEIL
  156933. "adcs r3, r3, r7\n\t"
  156934. #elif defined(__clang__)
  156935. "adcs r3, r7\n\t"
  156936. #else
  156937. "adc r3, r7\n\t"
  156938. #endif
  156939. #ifdef WOLFSSL_KEIL
  156940. "adcs r4, r4, %[r]\n\t"
  156941. #elif defined(__clang__)
  156942. "adcs r4, %[r]\n\t"
  156943. #else
  156944. "adc r4, %[r]\n\t"
  156945. #endif
  156946. "# A[14] * B[3]\n\t"
  156947. "mov %[a], r9\n\t"
  156948. "mov %[b], r10\n\t"
  156949. "ldr %[a], [%[a], #56]\n\t"
  156950. "ldr %[b], [%[b], #12]\n\t"
  156951. "uxth r6, %[a]\n\t"
  156952. "uxth r7, %[b]\n\t"
  156953. #ifdef WOLFSSL_KEIL
  156954. "muls r7, r6, r7\n\t"
  156955. #elif defined(__clang__)
  156956. "muls r7, r6\n\t"
  156957. #else
  156958. "mul r7, r6\n\t"
  156959. #endif
  156960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156961. "adds r5, r5, r7\n\t"
  156962. #else
  156963. "add r5, r5, r7\n\t"
  156964. #endif
  156965. #ifdef WOLFSSL_KEIL
  156966. "adcs r3, r3, %[r]\n\t"
  156967. #elif defined(__clang__)
  156968. "adcs r3, %[r]\n\t"
  156969. #else
  156970. "adc r3, %[r]\n\t"
  156971. #endif
  156972. #ifdef WOLFSSL_KEIL
  156973. "adcs r4, r4, %[r]\n\t"
  156974. #elif defined(__clang__)
  156975. "adcs r4, %[r]\n\t"
  156976. #else
  156977. "adc r4, %[r]\n\t"
  156978. #endif
  156979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156980. "lsrs r7, %[b], #16\n\t"
  156981. #else
  156982. "lsr r7, %[b], #16\n\t"
  156983. #endif
  156984. #ifdef WOLFSSL_KEIL
  156985. "muls r6, r7, r6\n\t"
  156986. #elif defined(__clang__)
  156987. "muls r6, r7\n\t"
  156988. #else
  156989. "mul r6, r7\n\t"
  156990. #endif
  156991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156992. "lsrs r7, r6, #16\n\t"
  156993. #else
  156994. "lsr r7, r6, #16\n\t"
  156995. #endif
  156996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  156997. "lsls r6, r6, #16\n\t"
  156998. #else
  156999. "lsl r6, r6, #16\n\t"
  157000. #endif
  157001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157002. "adds r5, r5, r6\n\t"
  157003. #else
  157004. "add r5, r5, r6\n\t"
  157005. #endif
  157006. #ifdef WOLFSSL_KEIL
  157007. "adcs r3, r3, r7\n\t"
  157008. #elif defined(__clang__)
  157009. "adcs r3, r7\n\t"
  157010. #else
  157011. "adc r3, r7\n\t"
  157012. #endif
  157013. #ifdef WOLFSSL_KEIL
  157014. "adcs r4, r4, %[r]\n\t"
  157015. #elif defined(__clang__)
  157016. "adcs r4, %[r]\n\t"
  157017. #else
  157018. "adc r4, %[r]\n\t"
  157019. #endif
  157020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157021. "lsrs r6, %[a], #16\n\t"
  157022. #else
  157023. "lsr r6, %[a], #16\n\t"
  157024. #endif
  157025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157026. "lsrs r7, %[b], #16\n\t"
  157027. #else
  157028. "lsr r7, %[b], #16\n\t"
  157029. #endif
  157030. #ifdef WOLFSSL_KEIL
  157031. "muls r7, r6, r7\n\t"
  157032. #elif defined(__clang__)
  157033. "muls r7, r6\n\t"
  157034. #else
  157035. "mul r7, r6\n\t"
  157036. #endif
  157037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157038. "adds r3, r3, r7\n\t"
  157039. #else
  157040. "add r3, r3, r7\n\t"
  157041. #endif
  157042. #ifdef WOLFSSL_KEIL
  157043. "adcs r4, r4, %[r]\n\t"
  157044. #elif defined(__clang__)
  157045. "adcs r4, %[r]\n\t"
  157046. #else
  157047. "adc r4, %[r]\n\t"
  157048. #endif
  157049. "uxth r7, %[b]\n\t"
  157050. #ifdef WOLFSSL_KEIL
  157051. "muls r6, r7, r6\n\t"
  157052. #elif defined(__clang__)
  157053. "muls r6, r7\n\t"
  157054. #else
  157055. "mul r6, r7\n\t"
  157056. #endif
  157057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157058. "lsrs r7, r6, #16\n\t"
  157059. #else
  157060. "lsr r7, r6, #16\n\t"
  157061. #endif
  157062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157063. "lsls r6, r6, #16\n\t"
  157064. #else
  157065. "lsl r6, r6, #16\n\t"
  157066. #endif
  157067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157068. "adds r5, r5, r6\n\t"
  157069. #else
  157070. "add r5, r5, r6\n\t"
  157071. #endif
  157072. #ifdef WOLFSSL_KEIL
  157073. "adcs r3, r3, r7\n\t"
  157074. #elif defined(__clang__)
  157075. "adcs r3, r7\n\t"
  157076. #else
  157077. "adc r3, r7\n\t"
  157078. #endif
  157079. #ifdef WOLFSSL_KEIL
  157080. "adcs r4, r4, %[r]\n\t"
  157081. #elif defined(__clang__)
  157082. "adcs r4, %[r]\n\t"
  157083. #else
  157084. "adc r4, %[r]\n\t"
  157085. #endif
  157086. "# A[15] * B[2]\n\t"
  157087. "mov %[a], r9\n\t"
  157088. "mov %[b], r10\n\t"
  157089. "ldr %[a], [%[a], #60]\n\t"
  157090. "ldr %[b], [%[b], #8]\n\t"
  157091. "uxth r6, %[a]\n\t"
  157092. "uxth r7, %[b]\n\t"
  157093. #ifdef WOLFSSL_KEIL
  157094. "muls r7, r6, r7\n\t"
  157095. #elif defined(__clang__)
  157096. "muls r7, r6\n\t"
  157097. #else
  157098. "mul r7, r6\n\t"
  157099. #endif
  157100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157101. "adds r5, r5, r7\n\t"
  157102. #else
  157103. "add r5, r5, r7\n\t"
  157104. #endif
  157105. #ifdef WOLFSSL_KEIL
  157106. "adcs r3, r3, %[r]\n\t"
  157107. #elif defined(__clang__)
  157108. "adcs r3, %[r]\n\t"
  157109. #else
  157110. "adc r3, %[r]\n\t"
  157111. #endif
  157112. #ifdef WOLFSSL_KEIL
  157113. "adcs r4, r4, %[r]\n\t"
  157114. #elif defined(__clang__)
  157115. "adcs r4, %[r]\n\t"
  157116. #else
  157117. "adc r4, %[r]\n\t"
  157118. #endif
  157119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157120. "lsrs r7, %[b], #16\n\t"
  157121. #else
  157122. "lsr r7, %[b], #16\n\t"
  157123. #endif
  157124. #ifdef WOLFSSL_KEIL
  157125. "muls r6, r7, r6\n\t"
  157126. #elif defined(__clang__)
  157127. "muls r6, r7\n\t"
  157128. #else
  157129. "mul r6, r7\n\t"
  157130. #endif
  157131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157132. "lsrs r7, r6, #16\n\t"
  157133. #else
  157134. "lsr r7, r6, #16\n\t"
  157135. #endif
  157136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157137. "lsls r6, r6, #16\n\t"
  157138. #else
  157139. "lsl r6, r6, #16\n\t"
  157140. #endif
  157141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157142. "adds r5, r5, r6\n\t"
  157143. #else
  157144. "add r5, r5, r6\n\t"
  157145. #endif
  157146. #ifdef WOLFSSL_KEIL
  157147. "adcs r3, r3, r7\n\t"
  157148. #elif defined(__clang__)
  157149. "adcs r3, r7\n\t"
  157150. #else
  157151. "adc r3, r7\n\t"
  157152. #endif
  157153. #ifdef WOLFSSL_KEIL
  157154. "adcs r4, r4, %[r]\n\t"
  157155. #elif defined(__clang__)
  157156. "adcs r4, %[r]\n\t"
  157157. #else
  157158. "adc r4, %[r]\n\t"
  157159. #endif
  157160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157161. "lsrs r6, %[a], #16\n\t"
  157162. #else
  157163. "lsr r6, %[a], #16\n\t"
  157164. #endif
  157165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157166. "lsrs r7, %[b], #16\n\t"
  157167. #else
  157168. "lsr r7, %[b], #16\n\t"
  157169. #endif
  157170. #ifdef WOLFSSL_KEIL
  157171. "muls r7, r6, r7\n\t"
  157172. #elif defined(__clang__)
  157173. "muls r7, r6\n\t"
  157174. #else
  157175. "mul r7, r6\n\t"
  157176. #endif
  157177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157178. "adds r3, r3, r7\n\t"
  157179. #else
  157180. "add r3, r3, r7\n\t"
  157181. #endif
  157182. #ifdef WOLFSSL_KEIL
  157183. "adcs r4, r4, %[r]\n\t"
  157184. #elif defined(__clang__)
  157185. "adcs r4, %[r]\n\t"
  157186. #else
  157187. "adc r4, %[r]\n\t"
  157188. #endif
  157189. "uxth r7, %[b]\n\t"
  157190. #ifdef WOLFSSL_KEIL
  157191. "muls r6, r7, r6\n\t"
  157192. #elif defined(__clang__)
  157193. "muls r6, r7\n\t"
  157194. #else
  157195. "mul r6, r7\n\t"
  157196. #endif
  157197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157198. "lsrs r7, r6, #16\n\t"
  157199. #else
  157200. "lsr r7, r6, #16\n\t"
  157201. #endif
  157202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157203. "lsls r6, r6, #16\n\t"
  157204. #else
  157205. "lsl r6, r6, #16\n\t"
  157206. #endif
  157207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157208. "adds r5, r5, r6\n\t"
  157209. #else
  157210. "add r5, r5, r6\n\t"
  157211. #endif
  157212. #ifdef WOLFSSL_KEIL
  157213. "adcs r3, r3, r7\n\t"
  157214. #elif defined(__clang__)
  157215. "adcs r3, r7\n\t"
  157216. #else
  157217. "adc r3, r7\n\t"
  157218. #endif
  157219. #ifdef WOLFSSL_KEIL
  157220. "adcs r4, r4, %[r]\n\t"
  157221. #elif defined(__clang__)
  157222. "adcs r4, %[r]\n\t"
  157223. #else
  157224. "adc r4, %[r]\n\t"
  157225. #endif
  157226. "mov %[r], r8\n\t"
  157227. "str r5, [%[r], #68]\n\t"
  157228. "movs %[r], #0\n\t"
  157229. "# A[15] * B[3]\n\t"
  157230. "movs r5, #0\n\t"
  157231. "mov %[a], r9\n\t"
  157232. "mov %[b], r10\n\t"
  157233. "ldr %[a], [%[a], #60]\n\t"
  157234. "ldr %[b], [%[b], #12]\n\t"
  157235. "uxth r6, %[a]\n\t"
  157236. "uxth r7, %[b]\n\t"
  157237. #ifdef WOLFSSL_KEIL
  157238. "muls r7, r6, r7\n\t"
  157239. #elif defined(__clang__)
  157240. "muls r7, r6\n\t"
  157241. #else
  157242. "mul r7, r6\n\t"
  157243. #endif
  157244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157245. "adds r3, r3, r7\n\t"
  157246. #else
  157247. "add r3, r3, r7\n\t"
  157248. #endif
  157249. #ifdef WOLFSSL_KEIL
  157250. "adcs r4, r4, %[r]\n\t"
  157251. #elif defined(__clang__)
  157252. "adcs r4, %[r]\n\t"
  157253. #else
  157254. "adc r4, %[r]\n\t"
  157255. #endif
  157256. #ifdef WOLFSSL_KEIL
  157257. "adcs r5, r5, %[r]\n\t"
  157258. #elif defined(__clang__)
  157259. "adcs r5, %[r]\n\t"
  157260. #else
  157261. "adc r5, %[r]\n\t"
  157262. #endif
  157263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157264. "lsrs r7, %[b], #16\n\t"
  157265. #else
  157266. "lsr r7, %[b], #16\n\t"
  157267. #endif
  157268. #ifdef WOLFSSL_KEIL
  157269. "muls r6, r7, r6\n\t"
  157270. #elif defined(__clang__)
  157271. "muls r6, r7\n\t"
  157272. #else
  157273. "mul r6, r7\n\t"
  157274. #endif
  157275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157276. "lsrs r7, r6, #16\n\t"
  157277. #else
  157278. "lsr r7, r6, #16\n\t"
  157279. #endif
  157280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157281. "lsls r6, r6, #16\n\t"
  157282. #else
  157283. "lsl r6, r6, #16\n\t"
  157284. #endif
  157285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157286. "adds r3, r3, r6\n\t"
  157287. #else
  157288. "add r3, r3, r6\n\t"
  157289. #endif
  157290. #ifdef WOLFSSL_KEIL
  157291. "adcs r4, r4, r7\n\t"
  157292. #elif defined(__clang__)
  157293. "adcs r4, r7\n\t"
  157294. #else
  157295. "adc r4, r7\n\t"
  157296. #endif
  157297. #ifdef WOLFSSL_KEIL
  157298. "adcs r5, r5, %[r]\n\t"
  157299. #elif defined(__clang__)
  157300. "adcs r5, %[r]\n\t"
  157301. #else
  157302. "adc r5, %[r]\n\t"
  157303. #endif
  157304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157305. "lsrs r6, %[a], #16\n\t"
  157306. #else
  157307. "lsr r6, %[a], #16\n\t"
  157308. #endif
  157309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157310. "lsrs r7, %[b], #16\n\t"
  157311. #else
  157312. "lsr r7, %[b], #16\n\t"
  157313. #endif
  157314. #ifdef WOLFSSL_KEIL
  157315. "muls r7, r6, r7\n\t"
  157316. #elif defined(__clang__)
  157317. "muls r7, r6\n\t"
  157318. #else
  157319. "mul r7, r6\n\t"
  157320. #endif
  157321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157322. "adds r4, r4, r7\n\t"
  157323. #else
  157324. "add r4, r4, r7\n\t"
  157325. #endif
  157326. #ifdef WOLFSSL_KEIL
  157327. "adcs r5, r5, %[r]\n\t"
  157328. #elif defined(__clang__)
  157329. "adcs r5, %[r]\n\t"
  157330. #else
  157331. "adc r5, %[r]\n\t"
  157332. #endif
  157333. "uxth r7, %[b]\n\t"
  157334. #ifdef WOLFSSL_KEIL
  157335. "muls r6, r7, r6\n\t"
  157336. #elif defined(__clang__)
  157337. "muls r6, r7\n\t"
  157338. #else
  157339. "mul r6, r7\n\t"
  157340. #endif
  157341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157342. "lsrs r7, r6, #16\n\t"
  157343. #else
  157344. "lsr r7, r6, #16\n\t"
  157345. #endif
  157346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157347. "lsls r6, r6, #16\n\t"
  157348. #else
  157349. "lsl r6, r6, #16\n\t"
  157350. #endif
  157351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157352. "adds r3, r3, r6\n\t"
  157353. #else
  157354. "add r3, r3, r6\n\t"
  157355. #endif
  157356. #ifdef WOLFSSL_KEIL
  157357. "adcs r4, r4, r7\n\t"
  157358. #elif defined(__clang__)
  157359. "adcs r4, r7\n\t"
  157360. #else
  157361. "adc r4, r7\n\t"
  157362. #endif
  157363. #ifdef WOLFSSL_KEIL
  157364. "adcs r5, r5, %[r]\n\t"
  157365. #elif defined(__clang__)
  157366. "adcs r5, %[r]\n\t"
  157367. #else
  157368. "adc r5, %[r]\n\t"
  157369. #endif
  157370. "# A[14] * B[4]\n\t"
  157371. "mov %[a], r9\n\t"
  157372. "mov %[b], r10\n\t"
  157373. "ldr %[a], [%[a], #56]\n\t"
  157374. "ldr %[b], [%[b], #16]\n\t"
  157375. "uxth r6, %[a]\n\t"
  157376. "uxth r7, %[b]\n\t"
  157377. #ifdef WOLFSSL_KEIL
  157378. "muls r7, r6, r7\n\t"
  157379. #elif defined(__clang__)
  157380. "muls r7, r6\n\t"
  157381. #else
  157382. "mul r7, r6\n\t"
  157383. #endif
  157384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157385. "adds r3, r3, r7\n\t"
  157386. #else
  157387. "add r3, r3, r7\n\t"
  157388. #endif
  157389. #ifdef WOLFSSL_KEIL
  157390. "adcs r4, r4, %[r]\n\t"
  157391. #elif defined(__clang__)
  157392. "adcs r4, %[r]\n\t"
  157393. #else
  157394. "adc r4, %[r]\n\t"
  157395. #endif
  157396. #ifdef WOLFSSL_KEIL
  157397. "adcs r5, r5, %[r]\n\t"
  157398. #elif defined(__clang__)
  157399. "adcs r5, %[r]\n\t"
  157400. #else
  157401. "adc r5, %[r]\n\t"
  157402. #endif
  157403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157404. "lsrs r7, %[b], #16\n\t"
  157405. #else
  157406. "lsr r7, %[b], #16\n\t"
  157407. #endif
  157408. #ifdef WOLFSSL_KEIL
  157409. "muls r6, r7, r6\n\t"
  157410. #elif defined(__clang__)
  157411. "muls r6, r7\n\t"
  157412. #else
  157413. "mul r6, r7\n\t"
  157414. #endif
  157415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157416. "lsrs r7, r6, #16\n\t"
  157417. #else
  157418. "lsr r7, r6, #16\n\t"
  157419. #endif
  157420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157421. "lsls r6, r6, #16\n\t"
  157422. #else
  157423. "lsl r6, r6, #16\n\t"
  157424. #endif
  157425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157426. "adds r3, r3, r6\n\t"
  157427. #else
  157428. "add r3, r3, r6\n\t"
  157429. #endif
  157430. #ifdef WOLFSSL_KEIL
  157431. "adcs r4, r4, r7\n\t"
  157432. #elif defined(__clang__)
  157433. "adcs r4, r7\n\t"
  157434. #else
  157435. "adc r4, r7\n\t"
  157436. #endif
  157437. #ifdef WOLFSSL_KEIL
  157438. "adcs r5, r5, %[r]\n\t"
  157439. #elif defined(__clang__)
  157440. "adcs r5, %[r]\n\t"
  157441. #else
  157442. "adc r5, %[r]\n\t"
  157443. #endif
  157444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157445. "lsrs r6, %[a], #16\n\t"
  157446. #else
  157447. "lsr r6, %[a], #16\n\t"
  157448. #endif
  157449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157450. "lsrs r7, %[b], #16\n\t"
  157451. #else
  157452. "lsr r7, %[b], #16\n\t"
  157453. #endif
  157454. #ifdef WOLFSSL_KEIL
  157455. "muls r7, r6, r7\n\t"
  157456. #elif defined(__clang__)
  157457. "muls r7, r6\n\t"
  157458. #else
  157459. "mul r7, r6\n\t"
  157460. #endif
  157461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157462. "adds r4, r4, r7\n\t"
  157463. #else
  157464. "add r4, r4, r7\n\t"
  157465. #endif
  157466. #ifdef WOLFSSL_KEIL
  157467. "adcs r5, r5, %[r]\n\t"
  157468. #elif defined(__clang__)
  157469. "adcs r5, %[r]\n\t"
  157470. #else
  157471. "adc r5, %[r]\n\t"
  157472. #endif
  157473. "uxth r7, %[b]\n\t"
  157474. #ifdef WOLFSSL_KEIL
  157475. "muls r6, r7, r6\n\t"
  157476. #elif defined(__clang__)
  157477. "muls r6, r7\n\t"
  157478. #else
  157479. "mul r6, r7\n\t"
  157480. #endif
  157481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157482. "lsrs r7, r6, #16\n\t"
  157483. #else
  157484. "lsr r7, r6, #16\n\t"
  157485. #endif
  157486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157487. "lsls r6, r6, #16\n\t"
  157488. #else
  157489. "lsl r6, r6, #16\n\t"
  157490. #endif
  157491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157492. "adds r3, r3, r6\n\t"
  157493. #else
  157494. "add r3, r3, r6\n\t"
  157495. #endif
  157496. #ifdef WOLFSSL_KEIL
  157497. "adcs r4, r4, r7\n\t"
  157498. #elif defined(__clang__)
  157499. "adcs r4, r7\n\t"
  157500. #else
  157501. "adc r4, r7\n\t"
  157502. #endif
  157503. #ifdef WOLFSSL_KEIL
  157504. "adcs r5, r5, %[r]\n\t"
  157505. #elif defined(__clang__)
  157506. "adcs r5, %[r]\n\t"
  157507. #else
  157508. "adc r5, %[r]\n\t"
  157509. #endif
  157510. "# A[13] * B[5]\n\t"
  157511. "mov %[a], r9\n\t"
  157512. "mov %[b], r10\n\t"
  157513. "ldr %[a], [%[a], #52]\n\t"
  157514. "ldr %[b], [%[b], #20]\n\t"
  157515. "uxth r6, %[a]\n\t"
  157516. "uxth r7, %[b]\n\t"
  157517. #ifdef WOLFSSL_KEIL
  157518. "muls r7, r6, r7\n\t"
  157519. #elif defined(__clang__)
  157520. "muls r7, r6\n\t"
  157521. #else
  157522. "mul r7, r6\n\t"
  157523. #endif
  157524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157525. "adds r3, r3, r7\n\t"
  157526. #else
  157527. "add r3, r3, r7\n\t"
  157528. #endif
  157529. #ifdef WOLFSSL_KEIL
  157530. "adcs r4, r4, %[r]\n\t"
  157531. #elif defined(__clang__)
  157532. "adcs r4, %[r]\n\t"
  157533. #else
  157534. "adc r4, %[r]\n\t"
  157535. #endif
  157536. #ifdef WOLFSSL_KEIL
  157537. "adcs r5, r5, %[r]\n\t"
  157538. #elif defined(__clang__)
  157539. "adcs r5, %[r]\n\t"
  157540. #else
  157541. "adc r5, %[r]\n\t"
  157542. #endif
  157543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157544. "lsrs r7, %[b], #16\n\t"
  157545. #else
  157546. "lsr r7, %[b], #16\n\t"
  157547. #endif
  157548. #ifdef WOLFSSL_KEIL
  157549. "muls r6, r7, r6\n\t"
  157550. #elif defined(__clang__)
  157551. "muls r6, r7\n\t"
  157552. #else
  157553. "mul r6, r7\n\t"
  157554. #endif
  157555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157556. "lsrs r7, r6, #16\n\t"
  157557. #else
  157558. "lsr r7, r6, #16\n\t"
  157559. #endif
  157560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157561. "lsls r6, r6, #16\n\t"
  157562. #else
  157563. "lsl r6, r6, #16\n\t"
  157564. #endif
  157565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157566. "adds r3, r3, r6\n\t"
  157567. #else
  157568. "add r3, r3, r6\n\t"
  157569. #endif
  157570. #ifdef WOLFSSL_KEIL
  157571. "adcs r4, r4, r7\n\t"
  157572. #elif defined(__clang__)
  157573. "adcs r4, r7\n\t"
  157574. #else
  157575. "adc r4, r7\n\t"
  157576. #endif
  157577. #ifdef WOLFSSL_KEIL
  157578. "adcs r5, r5, %[r]\n\t"
  157579. #elif defined(__clang__)
  157580. "adcs r5, %[r]\n\t"
  157581. #else
  157582. "adc r5, %[r]\n\t"
  157583. #endif
  157584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157585. "lsrs r6, %[a], #16\n\t"
  157586. #else
  157587. "lsr r6, %[a], #16\n\t"
  157588. #endif
  157589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157590. "lsrs r7, %[b], #16\n\t"
  157591. #else
  157592. "lsr r7, %[b], #16\n\t"
  157593. #endif
  157594. #ifdef WOLFSSL_KEIL
  157595. "muls r7, r6, r7\n\t"
  157596. #elif defined(__clang__)
  157597. "muls r7, r6\n\t"
  157598. #else
  157599. "mul r7, r6\n\t"
  157600. #endif
  157601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157602. "adds r4, r4, r7\n\t"
  157603. #else
  157604. "add r4, r4, r7\n\t"
  157605. #endif
  157606. #ifdef WOLFSSL_KEIL
  157607. "adcs r5, r5, %[r]\n\t"
  157608. #elif defined(__clang__)
  157609. "adcs r5, %[r]\n\t"
  157610. #else
  157611. "adc r5, %[r]\n\t"
  157612. #endif
  157613. "uxth r7, %[b]\n\t"
  157614. #ifdef WOLFSSL_KEIL
  157615. "muls r6, r7, r6\n\t"
  157616. #elif defined(__clang__)
  157617. "muls r6, r7\n\t"
  157618. #else
  157619. "mul r6, r7\n\t"
  157620. #endif
  157621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157622. "lsrs r7, r6, #16\n\t"
  157623. #else
  157624. "lsr r7, r6, #16\n\t"
  157625. #endif
  157626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157627. "lsls r6, r6, #16\n\t"
  157628. #else
  157629. "lsl r6, r6, #16\n\t"
  157630. #endif
  157631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157632. "adds r3, r3, r6\n\t"
  157633. #else
  157634. "add r3, r3, r6\n\t"
  157635. #endif
  157636. #ifdef WOLFSSL_KEIL
  157637. "adcs r4, r4, r7\n\t"
  157638. #elif defined(__clang__)
  157639. "adcs r4, r7\n\t"
  157640. #else
  157641. "adc r4, r7\n\t"
  157642. #endif
  157643. #ifdef WOLFSSL_KEIL
  157644. "adcs r5, r5, %[r]\n\t"
  157645. #elif defined(__clang__)
  157646. "adcs r5, %[r]\n\t"
  157647. #else
  157648. "adc r5, %[r]\n\t"
  157649. #endif
  157650. "# A[12] * B[6]\n\t"
  157651. "mov %[a], r9\n\t"
  157652. "mov %[b], r10\n\t"
  157653. "ldr %[a], [%[a], #48]\n\t"
  157654. "ldr %[b], [%[b], #24]\n\t"
  157655. "uxth r6, %[a]\n\t"
  157656. "uxth r7, %[b]\n\t"
  157657. #ifdef WOLFSSL_KEIL
  157658. "muls r7, r6, r7\n\t"
  157659. #elif defined(__clang__)
  157660. "muls r7, r6\n\t"
  157661. #else
  157662. "mul r7, r6\n\t"
  157663. #endif
  157664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157665. "adds r3, r3, r7\n\t"
  157666. #else
  157667. "add r3, r3, r7\n\t"
  157668. #endif
  157669. #ifdef WOLFSSL_KEIL
  157670. "adcs r4, r4, %[r]\n\t"
  157671. #elif defined(__clang__)
  157672. "adcs r4, %[r]\n\t"
  157673. #else
  157674. "adc r4, %[r]\n\t"
  157675. #endif
  157676. #ifdef WOLFSSL_KEIL
  157677. "adcs r5, r5, %[r]\n\t"
  157678. #elif defined(__clang__)
  157679. "adcs r5, %[r]\n\t"
  157680. #else
  157681. "adc r5, %[r]\n\t"
  157682. #endif
  157683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157684. "lsrs r7, %[b], #16\n\t"
  157685. #else
  157686. "lsr r7, %[b], #16\n\t"
  157687. #endif
  157688. #ifdef WOLFSSL_KEIL
  157689. "muls r6, r7, r6\n\t"
  157690. #elif defined(__clang__)
  157691. "muls r6, r7\n\t"
  157692. #else
  157693. "mul r6, r7\n\t"
  157694. #endif
  157695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157696. "lsrs r7, r6, #16\n\t"
  157697. #else
  157698. "lsr r7, r6, #16\n\t"
  157699. #endif
  157700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157701. "lsls r6, r6, #16\n\t"
  157702. #else
  157703. "lsl r6, r6, #16\n\t"
  157704. #endif
  157705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157706. "adds r3, r3, r6\n\t"
  157707. #else
  157708. "add r3, r3, r6\n\t"
  157709. #endif
  157710. #ifdef WOLFSSL_KEIL
  157711. "adcs r4, r4, r7\n\t"
  157712. #elif defined(__clang__)
  157713. "adcs r4, r7\n\t"
  157714. #else
  157715. "adc r4, r7\n\t"
  157716. #endif
  157717. #ifdef WOLFSSL_KEIL
  157718. "adcs r5, r5, %[r]\n\t"
  157719. #elif defined(__clang__)
  157720. "adcs r5, %[r]\n\t"
  157721. #else
  157722. "adc r5, %[r]\n\t"
  157723. #endif
  157724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157725. "lsrs r6, %[a], #16\n\t"
  157726. #else
  157727. "lsr r6, %[a], #16\n\t"
  157728. #endif
  157729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157730. "lsrs r7, %[b], #16\n\t"
  157731. #else
  157732. "lsr r7, %[b], #16\n\t"
  157733. #endif
  157734. #ifdef WOLFSSL_KEIL
  157735. "muls r7, r6, r7\n\t"
  157736. #elif defined(__clang__)
  157737. "muls r7, r6\n\t"
  157738. #else
  157739. "mul r7, r6\n\t"
  157740. #endif
  157741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157742. "adds r4, r4, r7\n\t"
  157743. #else
  157744. "add r4, r4, r7\n\t"
  157745. #endif
  157746. #ifdef WOLFSSL_KEIL
  157747. "adcs r5, r5, %[r]\n\t"
  157748. #elif defined(__clang__)
  157749. "adcs r5, %[r]\n\t"
  157750. #else
  157751. "adc r5, %[r]\n\t"
  157752. #endif
  157753. "uxth r7, %[b]\n\t"
  157754. #ifdef WOLFSSL_KEIL
  157755. "muls r6, r7, r6\n\t"
  157756. #elif defined(__clang__)
  157757. "muls r6, r7\n\t"
  157758. #else
  157759. "mul r6, r7\n\t"
  157760. #endif
  157761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157762. "lsrs r7, r6, #16\n\t"
  157763. #else
  157764. "lsr r7, r6, #16\n\t"
  157765. #endif
  157766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157767. "lsls r6, r6, #16\n\t"
  157768. #else
  157769. "lsl r6, r6, #16\n\t"
  157770. #endif
  157771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157772. "adds r3, r3, r6\n\t"
  157773. #else
  157774. "add r3, r3, r6\n\t"
  157775. #endif
  157776. #ifdef WOLFSSL_KEIL
  157777. "adcs r4, r4, r7\n\t"
  157778. #elif defined(__clang__)
  157779. "adcs r4, r7\n\t"
  157780. #else
  157781. "adc r4, r7\n\t"
  157782. #endif
  157783. #ifdef WOLFSSL_KEIL
  157784. "adcs r5, r5, %[r]\n\t"
  157785. #elif defined(__clang__)
  157786. "adcs r5, %[r]\n\t"
  157787. #else
  157788. "adc r5, %[r]\n\t"
  157789. #endif
  157790. "# A[11] * B[7]\n\t"
  157791. "mov %[a], r9\n\t"
  157792. "mov %[b], r10\n\t"
  157793. "ldr %[a], [%[a], #44]\n\t"
  157794. "ldr %[b], [%[b], #28]\n\t"
  157795. "uxth r6, %[a]\n\t"
  157796. "uxth r7, %[b]\n\t"
  157797. #ifdef WOLFSSL_KEIL
  157798. "muls r7, r6, r7\n\t"
  157799. #elif defined(__clang__)
  157800. "muls r7, r6\n\t"
  157801. #else
  157802. "mul r7, r6\n\t"
  157803. #endif
  157804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157805. "adds r3, r3, r7\n\t"
  157806. #else
  157807. "add r3, r3, r7\n\t"
  157808. #endif
  157809. #ifdef WOLFSSL_KEIL
  157810. "adcs r4, r4, %[r]\n\t"
  157811. #elif defined(__clang__)
  157812. "adcs r4, %[r]\n\t"
  157813. #else
  157814. "adc r4, %[r]\n\t"
  157815. #endif
  157816. #ifdef WOLFSSL_KEIL
  157817. "adcs r5, r5, %[r]\n\t"
  157818. #elif defined(__clang__)
  157819. "adcs r5, %[r]\n\t"
  157820. #else
  157821. "adc r5, %[r]\n\t"
  157822. #endif
  157823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157824. "lsrs r7, %[b], #16\n\t"
  157825. #else
  157826. "lsr r7, %[b], #16\n\t"
  157827. #endif
  157828. #ifdef WOLFSSL_KEIL
  157829. "muls r6, r7, r6\n\t"
  157830. #elif defined(__clang__)
  157831. "muls r6, r7\n\t"
  157832. #else
  157833. "mul r6, r7\n\t"
  157834. #endif
  157835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157836. "lsrs r7, r6, #16\n\t"
  157837. #else
  157838. "lsr r7, r6, #16\n\t"
  157839. #endif
  157840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157841. "lsls r6, r6, #16\n\t"
  157842. #else
  157843. "lsl r6, r6, #16\n\t"
  157844. #endif
  157845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157846. "adds r3, r3, r6\n\t"
  157847. #else
  157848. "add r3, r3, r6\n\t"
  157849. #endif
  157850. #ifdef WOLFSSL_KEIL
  157851. "adcs r4, r4, r7\n\t"
  157852. #elif defined(__clang__)
  157853. "adcs r4, r7\n\t"
  157854. #else
  157855. "adc r4, r7\n\t"
  157856. #endif
  157857. #ifdef WOLFSSL_KEIL
  157858. "adcs r5, r5, %[r]\n\t"
  157859. #elif defined(__clang__)
  157860. "adcs r5, %[r]\n\t"
  157861. #else
  157862. "adc r5, %[r]\n\t"
  157863. #endif
  157864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157865. "lsrs r6, %[a], #16\n\t"
  157866. #else
  157867. "lsr r6, %[a], #16\n\t"
  157868. #endif
  157869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157870. "lsrs r7, %[b], #16\n\t"
  157871. #else
  157872. "lsr r7, %[b], #16\n\t"
  157873. #endif
  157874. #ifdef WOLFSSL_KEIL
  157875. "muls r7, r6, r7\n\t"
  157876. #elif defined(__clang__)
  157877. "muls r7, r6\n\t"
  157878. #else
  157879. "mul r7, r6\n\t"
  157880. #endif
  157881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157882. "adds r4, r4, r7\n\t"
  157883. #else
  157884. "add r4, r4, r7\n\t"
  157885. #endif
  157886. #ifdef WOLFSSL_KEIL
  157887. "adcs r5, r5, %[r]\n\t"
  157888. #elif defined(__clang__)
  157889. "adcs r5, %[r]\n\t"
  157890. #else
  157891. "adc r5, %[r]\n\t"
  157892. #endif
  157893. "uxth r7, %[b]\n\t"
  157894. #ifdef WOLFSSL_KEIL
  157895. "muls r6, r7, r6\n\t"
  157896. #elif defined(__clang__)
  157897. "muls r6, r7\n\t"
  157898. #else
  157899. "mul r6, r7\n\t"
  157900. #endif
  157901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157902. "lsrs r7, r6, #16\n\t"
  157903. #else
  157904. "lsr r7, r6, #16\n\t"
  157905. #endif
  157906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157907. "lsls r6, r6, #16\n\t"
  157908. #else
  157909. "lsl r6, r6, #16\n\t"
  157910. #endif
  157911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157912. "adds r3, r3, r6\n\t"
  157913. #else
  157914. "add r3, r3, r6\n\t"
  157915. #endif
  157916. #ifdef WOLFSSL_KEIL
  157917. "adcs r4, r4, r7\n\t"
  157918. #elif defined(__clang__)
  157919. "adcs r4, r7\n\t"
  157920. #else
  157921. "adc r4, r7\n\t"
  157922. #endif
  157923. #ifdef WOLFSSL_KEIL
  157924. "adcs r5, r5, %[r]\n\t"
  157925. #elif defined(__clang__)
  157926. "adcs r5, %[r]\n\t"
  157927. #else
  157928. "adc r5, %[r]\n\t"
  157929. #endif
  157930. "# A[10] * B[8]\n\t"
  157931. "mov %[a], r9\n\t"
  157932. "mov %[b], r10\n\t"
  157933. "ldr %[a], [%[a], #40]\n\t"
  157934. "ldr %[b], [%[b], #32]\n\t"
  157935. "uxth r6, %[a]\n\t"
  157936. "uxth r7, %[b]\n\t"
  157937. #ifdef WOLFSSL_KEIL
  157938. "muls r7, r6, r7\n\t"
  157939. #elif defined(__clang__)
  157940. "muls r7, r6\n\t"
  157941. #else
  157942. "mul r7, r6\n\t"
  157943. #endif
  157944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157945. "adds r3, r3, r7\n\t"
  157946. #else
  157947. "add r3, r3, r7\n\t"
  157948. #endif
  157949. #ifdef WOLFSSL_KEIL
  157950. "adcs r4, r4, %[r]\n\t"
  157951. #elif defined(__clang__)
  157952. "adcs r4, %[r]\n\t"
  157953. #else
  157954. "adc r4, %[r]\n\t"
  157955. #endif
  157956. #ifdef WOLFSSL_KEIL
  157957. "adcs r5, r5, %[r]\n\t"
  157958. #elif defined(__clang__)
  157959. "adcs r5, %[r]\n\t"
  157960. #else
  157961. "adc r5, %[r]\n\t"
  157962. #endif
  157963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157964. "lsrs r7, %[b], #16\n\t"
  157965. #else
  157966. "lsr r7, %[b], #16\n\t"
  157967. #endif
  157968. #ifdef WOLFSSL_KEIL
  157969. "muls r6, r7, r6\n\t"
  157970. #elif defined(__clang__)
  157971. "muls r6, r7\n\t"
  157972. #else
  157973. "mul r6, r7\n\t"
  157974. #endif
  157975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157976. "lsrs r7, r6, #16\n\t"
  157977. #else
  157978. "lsr r7, r6, #16\n\t"
  157979. #endif
  157980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157981. "lsls r6, r6, #16\n\t"
  157982. #else
  157983. "lsl r6, r6, #16\n\t"
  157984. #endif
  157985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  157986. "adds r3, r3, r6\n\t"
  157987. #else
  157988. "add r3, r3, r6\n\t"
  157989. #endif
  157990. #ifdef WOLFSSL_KEIL
  157991. "adcs r4, r4, r7\n\t"
  157992. #elif defined(__clang__)
  157993. "adcs r4, r7\n\t"
  157994. #else
  157995. "adc r4, r7\n\t"
  157996. #endif
  157997. #ifdef WOLFSSL_KEIL
  157998. "adcs r5, r5, %[r]\n\t"
  157999. #elif defined(__clang__)
  158000. "adcs r5, %[r]\n\t"
  158001. #else
  158002. "adc r5, %[r]\n\t"
  158003. #endif
  158004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158005. "lsrs r6, %[a], #16\n\t"
  158006. #else
  158007. "lsr r6, %[a], #16\n\t"
  158008. #endif
  158009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158010. "lsrs r7, %[b], #16\n\t"
  158011. #else
  158012. "lsr r7, %[b], #16\n\t"
  158013. #endif
  158014. #ifdef WOLFSSL_KEIL
  158015. "muls r7, r6, r7\n\t"
  158016. #elif defined(__clang__)
  158017. "muls r7, r6\n\t"
  158018. #else
  158019. "mul r7, r6\n\t"
  158020. #endif
  158021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158022. "adds r4, r4, r7\n\t"
  158023. #else
  158024. "add r4, r4, r7\n\t"
  158025. #endif
  158026. #ifdef WOLFSSL_KEIL
  158027. "adcs r5, r5, %[r]\n\t"
  158028. #elif defined(__clang__)
  158029. "adcs r5, %[r]\n\t"
  158030. #else
  158031. "adc r5, %[r]\n\t"
  158032. #endif
  158033. "uxth r7, %[b]\n\t"
  158034. #ifdef WOLFSSL_KEIL
  158035. "muls r6, r7, r6\n\t"
  158036. #elif defined(__clang__)
  158037. "muls r6, r7\n\t"
  158038. #else
  158039. "mul r6, r7\n\t"
  158040. #endif
  158041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158042. "lsrs r7, r6, #16\n\t"
  158043. #else
  158044. "lsr r7, r6, #16\n\t"
  158045. #endif
  158046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158047. "lsls r6, r6, #16\n\t"
  158048. #else
  158049. "lsl r6, r6, #16\n\t"
  158050. #endif
  158051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158052. "adds r3, r3, r6\n\t"
  158053. #else
  158054. "add r3, r3, r6\n\t"
  158055. #endif
  158056. #ifdef WOLFSSL_KEIL
  158057. "adcs r4, r4, r7\n\t"
  158058. #elif defined(__clang__)
  158059. "adcs r4, r7\n\t"
  158060. #else
  158061. "adc r4, r7\n\t"
  158062. #endif
  158063. #ifdef WOLFSSL_KEIL
  158064. "adcs r5, r5, %[r]\n\t"
  158065. #elif defined(__clang__)
  158066. "adcs r5, %[r]\n\t"
  158067. #else
  158068. "adc r5, %[r]\n\t"
  158069. #endif
  158070. "# A[9] * B[9]\n\t"
  158071. "mov %[a], r9\n\t"
  158072. "mov %[b], r10\n\t"
  158073. "ldr %[a], [%[a], #36]\n\t"
  158074. "ldr %[b], [%[b], #36]\n\t"
  158075. "uxth r6, %[a]\n\t"
  158076. "uxth r7, %[b]\n\t"
  158077. #ifdef WOLFSSL_KEIL
  158078. "muls r7, r6, r7\n\t"
  158079. #elif defined(__clang__)
  158080. "muls r7, r6\n\t"
  158081. #else
  158082. "mul r7, r6\n\t"
  158083. #endif
  158084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158085. "adds r3, r3, r7\n\t"
  158086. #else
  158087. "add r3, r3, r7\n\t"
  158088. #endif
  158089. #ifdef WOLFSSL_KEIL
  158090. "adcs r4, r4, %[r]\n\t"
  158091. #elif defined(__clang__)
  158092. "adcs r4, %[r]\n\t"
  158093. #else
  158094. "adc r4, %[r]\n\t"
  158095. #endif
  158096. #ifdef WOLFSSL_KEIL
  158097. "adcs r5, r5, %[r]\n\t"
  158098. #elif defined(__clang__)
  158099. "adcs r5, %[r]\n\t"
  158100. #else
  158101. "adc r5, %[r]\n\t"
  158102. #endif
  158103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158104. "lsrs r7, %[b], #16\n\t"
  158105. #else
  158106. "lsr r7, %[b], #16\n\t"
  158107. #endif
  158108. #ifdef WOLFSSL_KEIL
  158109. "muls r6, r7, r6\n\t"
  158110. #elif defined(__clang__)
  158111. "muls r6, r7\n\t"
  158112. #else
  158113. "mul r6, r7\n\t"
  158114. #endif
  158115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158116. "lsrs r7, r6, #16\n\t"
  158117. #else
  158118. "lsr r7, r6, #16\n\t"
  158119. #endif
  158120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158121. "lsls r6, r6, #16\n\t"
  158122. #else
  158123. "lsl r6, r6, #16\n\t"
  158124. #endif
  158125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158126. "adds r3, r3, r6\n\t"
  158127. #else
  158128. "add r3, r3, r6\n\t"
  158129. #endif
  158130. #ifdef WOLFSSL_KEIL
  158131. "adcs r4, r4, r7\n\t"
  158132. #elif defined(__clang__)
  158133. "adcs r4, r7\n\t"
  158134. #else
  158135. "adc r4, r7\n\t"
  158136. #endif
  158137. #ifdef WOLFSSL_KEIL
  158138. "adcs r5, r5, %[r]\n\t"
  158139. #elif defined(__clang__)
  158140. "adcs r5, %[r]\n\t"
  158141. #else
  158142. "adc r5, %[r]\n\t"
  158143. #endif
  158144. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158145. "lsrs r6, %[a], #16\n\t"
  158146. #else
  158147. "lsr r6, %[a], #16\n\t"
  158148. #endif
  158149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158150. "lsrs r7, %[b], #16\n\t"
  158151. #else
  158152. "lsr r7, %[b], #16\n\t"
  158153. #endif
  158154. #ifdef WOLFSSL_KEIL
  158155. "muls r7, r6, r7\n\t"
  158156. #elif defined(__clang__)
  158157. "muls r7, r6\n\t"
  158158. #else
  158159. "mul r7, r6\n\t"
  158160. #endif
  158161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158162. "adds r4, r4, r7\n\t"
  158163. #else
  158164. "add r4, r4, r7\n\t"
  158165. #endif
  158166. #ifdef WOLFSSL_KEIL
  158167. "adcs r5, r5, %[r]\n\t"
  158168. #elif defined(__clang__)
  158169. "adcs r5, %[r]\n\t"
  158170. #else
  158171. "adc r5, %[r]\n\t"
  158172. #endif
  158173. "uxth r7, %[b]\n\t"
  158174. #ifdef WOLFSSL_KEIL
  158175. "muls r6, r7, r6\n\t"
  158176. #elif defined(__clang__)
  158177. "muls r6, r7\n\t"
  158178. #else
  158179. "mul r6, r7\n\t"
  158180. #endif
  158181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158182. "lsrs r7, r6, #16\n\t"
  158183. #else
  158184. "lsr r7, r6, #16\n\t"
  158185. #endif
  158186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158187. "lsls r6, r6, #16\n\t"
  158188. #else
  158189. "lsl r6, r6, #16\n\t"
  158190. #endif
  158191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158192. "adds r3, r3, r6\n\t"
  158193. #else
  158194. "add r3, r3, r6\n\t"
  158195. #endif
  158196. #ifdef WOLFSSL_KEIL
  158197. "adcs r4, r4, r7\n\t"
  158198. #elif defined(__clang__)
  158199. "adcs r4, r7\n\t"
  158200. #else
  158201. "adc r4, r7\n\t"
  158202. #endif
  158203. #ifdef WOLFSSL_KEIL
  158204. "adcs r5, r5, %[r]\n\t"
  158205. #elif defined(__clang__)
  158206. "adcs r5, %[r]\n\t"
  158207. #else
  158208. "adc r5, %[r]\n\t"
  158209. #endif
  158210. "# A[8] * B[10]\n\t"
  158211. "mov %[a], r9\n\t"
  158212. "mov %[b], r10\n\t"
  158213. "ldr %[a], [%[a], #32]\n\t"
  158214. "ldr %[b], [%[b], #40]\n\t"
  158215. "uxth r6, %[a]\n\t"
  158216. "uxth r7, %[b]\n\t"
  158217. #ifdef WOLFSSL_KEIL
  158218. "muls r7, r6, r7\n\t"
  158219. #elif defined(__clang__)
  158220. "muls r7, r6\n\t"
  158221. #else
  158222. "mul r7, r6\n\t"
  158223. #endif
  158224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158225. "adds r3, r3, r7\n\t"
  158226. #else
  158227. "add r3, r3, r7\n\t"
  158228. #endif
  158229. #ifdef WOLFSSL_KEIL
  158230. "adcs r4, r4, %[r]\n\t"
  158231. #elif defined(__clang__)
  158232. "adcs r4, %[r]\n\t"
  158233. #else
  158234. "adc r4, %[r]\n\t"
  158235. #endif
  158236. #ifdef WOLFSSL_KEIL
  158237. "adcs r5, r5, %[r]\n\t"
  158238. #elif defined(__clang__)
  158239. "adcs r5, %[r]\n\t"
  158240. #else
  158241. "adc r5, %[r]\n\t"
  158242. #endif
  158243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158244. "lsrs r7, %[b], #16\n\t"
  158245. #else
  158246. "lsr r7, %[b], #16\n\t"
  158247. #endif
  158248. #ifdef WOLFSSL_KEIL
  158249. "muls r6, r7, r6\n\t"
  158250. #elif defined(__clang__)
  158251. "muls r6, r7\n\t"
  158252. #else
  158253. "mul r6, r7\n\t"
  158254. #endif
  158255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158256. "lsrs r7, r6, #16\n\t"
  158257. #else
  158258. "lsr r7, r6, #16\n\t"
  158259. #endif
  158260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158261. "lsls r6, r6, #16\n\t"
  158262. #else
  158263. "lsl r6, r6, #16\n\t"
  158264. #endif
  158265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158266. "adds r3, r3, r6\n\t"
  158267. #else
  158268. "add r3, r3, r6\n\t"
  158269. #endif
  158270. #ifdef WOLFSSL_KEIL
  158271. "adcs r4, r4, r7\n\t"
  158272. #elif defined(__clang__)
  158273. "adcs r4, r7\n\t"
  158274. #else
  158275. "adc r4, r7\n\t"
  158276. #endif
  158277. #ifdef WOLFSSL_KEIL
  158278. "adcs r5, r5, %[r]\n\t"
  158279. #elif defined(__clang__)
  158280. "adcs r5, %[r]\n\t"
  158281. #else
  158282. "adc r5, %[r]\n\t"
  158283. #endif
  158284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158285. "lsrs r6, %[a], #16\n\t"
  158286. #else
  158287. "lsr r6, %[a], #16\n\t"
  158288. #endif
  158289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158290. "lsrs r7, %[b], #16\n\t"
  158291. #else
  158292. "lsr r7, %[b], #16\n\t"
  158293. #endif
  158294. #ifdef WOLFSSL_KEIL
  158295. "muls r7, r6, r7\n\t"
  158296. #elif defined(__clang__)
  158297. "muls r7, r6\n\t"
  158298. #else
  158299. "mul r7, r6\n\t"
  158300. #endif
  158301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158302. "adds r4, r4, r7\n\t"
  158303. #else
  158304. "add r4, r4, r7\n\t"
  158305. #endif
  158306. #ifdef WOLFSSL_KEIL
  158307. "adcs r5, r5, %[r]\n\t"
  158308. #elif defined(__clang__)
  158309. "adcs r5, %[r]\n\t"
  158310. #else
  158311. "adc r5, %[r]\n\t"
  158312. #endif
  158313. "uxth r7, %[b]\n\t"
  158314. #ifdef WOLFSSL_KEIL
  158315. "muls r6, r7, r6\n\t"
  158316. #elif defined(__clang__)
  158317. "muls r6, r7\n\t"
  158318. #else
  158319. "mul r6, r7\n\t"
  158320. #endif
  158321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158322. "lsrs r7, r6, #16\n\t"
  158323. #else
  158324. "lsr r7, r6, #16\n\t"
  158325. #endif
  158326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158327. "lsls r6, r6, #16\n\t"
  158328. #else
  158329. "lsl r6, r6, #16\n\t"
  158330. #endif
  158331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158332. "adds r3, r3, r6\n\t"
  158333. #else
  158334. "add r3, r3, r6\n\t"
  158335. #endif
  158336. #ifdef WOLFSSL_KEIL
  158337. "adcs r4, r4, r7\n\t"
  158338. #elif defined(__clang__)
  158339. "adcs r4, r7\n\t"
  158340. #else
  158341. "adc r4, r7\n\t"
  158342. #endif
  158343. #ifdef WOLFSSL_KEIL
  158344. "adcs r5, r5, %[r]\n\t"
  158345. #elif defined(__clang__)
  158346. "adcs r5, %[r]\n\t"
  158347. #else
  158348. "adc r5, %[r]\n\t"
  158349. #endif
  158350. "# A[7] * B[11]\n\t"
  158351. "mov %[a], r9\n\t"
  158352. "mov %[b], r10\n\t"
  158353. "ldr %[a], [%[a], #28]\n\t"
  158354. "ldr %[b], [%[b], #44]\n\t"
  158355. "uxth r6, %[a]\n\t"
  158356. "uxth r7, %[b]\n\t"
  158357. #ifdef WOLFSSL_KEIL
  158358. "muls r7, r6, r7\n\t"
  158359. #elif defined(__clang__)
  158360. "muls r7, r6\n\t"
  158361. #else
  158362. "mul r7, r6\n\t"
  158363. #endif
  158364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158365. "adds r3, r3, r7\n\t"
  158366. #else
  158367. "add r3, r3, r7\n\t"
  158368. #endif
  158369. #ifdef WOLFSSL_KEIL
  158370. "adcs r4, r4, %[r]\n\t"
  158371. #elif defined(__clang__)
  158372. "adcs r4, %[r]\n\t"
  158373. #else
  158374. "adc r4, %[r]\n\t"
  158375. #endif
  158376. #ifdef WOLFSSL_KEIL
  158377. "adcs r5, r5, %[r]\n\t"
  158378. #elif defined(__clang__)
  158379. "adcs r5, %[r]\n\t"
  158380. #else
  158381. "adc r5, %[r]\n\t"
  158382. #endif
  158383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158384. "lsrs r7, %[b], #16\n\t"
  158385. #else
  158386. "lsr r7, %[b], #16\n\t"
  158387. #endif
  158388. #ifdef WOLFSSL_KEIL
  158389. "muls r6, r7, r6\n\t"
  158390. #elif defined(__clang__)
  158391. "muls r6, r7\n\t"
  158392. #else
  158393. "mul r6, r7\n\t"
  158394. #endif
  158395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158396. "lsrs r7, r6, #16\n\t"
  158397. #else
  158398. "lsr r7, r6, #16\n\t"
  158399. #endif
  158400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158401. "lsls r6, r6, #16\n\t"
  158402. #else
  158403. "lsl r6, r6, #16\n\t"
  158404. #endif
  158405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158406. "adds r3, r3, r6\n\t"
  158407. #else
  158408. "add r3, r3, r6\n\t"
  158409. #endif
  158410. #ifdef WOLFSSL_KEIL
  158411. "adcs r4, r4, r7\n\t"
  158412. #elif defined(__clang__)
  158413. "adcs r4, r7\n\t"
  158414. #else
  158415. "adc r4, r7\n\t"
  158416. #endif
  158417. #ifdef WOLFSSL_KEIL
  158418. "adcs r5, r5, %[r]\n\t"
  158419. #elif defined(__clang__)
  158420. "adcs r5, %[r]\n\t"
  158421. #else
  158422. "adc r5, %[r]\n\t"
  158423. #endif
  158424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158425. "lsrs r6, %[a], #16\n\t"
  158426. #else
  158427. "lsr r6, %[a], #16\n\t"
  158428. #endif
  158429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158430. "lsrs r7, %[b], #16\n\t"
  158431. #else
  158432. "lsr r7, %[b], #16\n\t"
  158433. #endif
  158434. #ifdef WOLFSSL_KEIL
  158435. "muls r7, r6, r7\n\t"
  158436. #elif defined(__clang__)
  158437. "muls r7, r6\n\t"
  158438. #else
  158439. "mul r7, r6\n\t"
  158440. #endif
  158441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158442. "adds r4, r4, r7\n\t"
  158443. #else
  158444. "add r4, r4, r7\n\t"
  158445. #endif
  158446. #ifdef WOLFSSL_KEIL
  158447. "adcs r5, r5, %[r]\n\t"
  158448. #elif defined(__clang__)
  158449. "adcs r5, %[r]\n\t"
  158450. #else
  158451. "adc r5, %[r]\n\t"
  158452. #endif
  158453. "uxth r7, %[b]\n\t"
  158454. #ifdef WOLFSSL_KEIL
  158455. "muls r6, r7, r6\n\t"
  158456. #elif defined(__clang__)
  158457. "muls r6, r7\n\t"
  158458. #else
  158459. "mul r6, r7\n\t"
  158460. #endif
  158461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158462. "lsrs r7, r6, #16\n\t"
  158463. #else
  158464. "lsr r7, r6, #16\n\t"
  158465. #endif
  158466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158467. "lsls r6, r6, #16\n\t"
  158468. #else
  158469. "lsl r6, r6, #16\n\t"
  158470. #endif
  158471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158472. "adds r3, r3, r6\n\t"
  158473. #else
  158474. "add r3, r3, r6\n\t"
  158475. #endif
  158476. #ifdef WOLFSSL_KEIL
  158477. "adcs r4, r4, r7\n\t"
  158478. #elif defined(__clang__)
  158479. "adcs r4, r7\n\t"
  158480. #else
  158481. "adc r4, r7\n\t"
  158482. #endif
  158483. #ifdef WOLFSSL_KEIL
  158484. "adcs r5, r5, %[r]\n\t"
  158485. #elif defined(__clang__)
  158486. "adcs r5, %[r]\n\t"
  158487. #else
  158488. "adc r5, %[r]\n\t"
  158489. #endif
  158490. "# A[6] * B[12]\n\t"
  158491. "mov %[a], r9\n\t"
  158492. "mov %[b], r10\n\t"
  158493. "ldr %[a], [%[a], #24]\n\t"
  158494. "ldr %[b], [%[b], #48]\n\t"
  158495. "uxth r6, %[a]\n\t"
  158496. "uxth r7, %[b]\n\t"
  158497. #ifdef WOLFSSL_KEIL
  158498. "muls r7, r6, r7\n\t"
  158499. #elif defined(__clang__)
  158500. "muls r7, r6\n\t"
  158501. #else
  158502. "mul r7, r6\n\t"
  158503. #endif
  158504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158505. "adds r3, r3, r7\n\t"
  158506. #else
  158507. "add r3, r3, r7\n\t"
  158508. #endif
  158509. #ifdef WOLFSSL_KEIL
  158510. "adcs r4, r4, %[r]\n\t"
  158511. #elif defined(__clang__)
  158512. "adcs r4, %[r]\n\t"
  158513. #else
  158514. "adc r4, %[r]\n\t"
  158515. #endif
  158516. #ifdef WOLFSSL_KEIL
  158517. "adcs r5, r5, %[r]\n\t"
  158518. #elif defined(__clang__)
  158519. "adcs r5, %[r]\n\t"
  158520. #else
  158521. "adc r5, %[r]\n\t"
  158522. #endif
  158523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158524. "lsrs r7, %[b], #16\n\t"
  158525. #else
  158526. "lsr r7, %[b], #16\n\t"
  158527. #endif
  158528. #ifdef WOLFSSL_KEIL
  158529. "muls r6, r7, r6\n\t"
  158530. #elif defined(__clang__)
  158531. "muls r6, r7\n\t"
  158532. #else
  158533. "mul r6, r7\n\t"
  158534. #endif
  158535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158536. "lsrs r7, r6, #16\n\t"
  158537. #else
  158538. "lsr r7, r6, #16\n\t"
  158539. #endif
  158540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158541. "lsls r6, r6, #16\n\t"
  158542. #else
  158543. "lsl r6, r6, #16\n\t"
  158544. #endif
  158545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158546. "adds r3, r3, r6\n\t"
  158547. #else
  158548. "add r3, r3, r6\n\t"
  158549. #endif
  158550. #ifdef WOLFSSL_KEIL
  158551. "adcs r4, r4, r7\n\t"
  158552. #elif defined(__clang__)
  158553. "adcs r4, r7\n\t"
  158554. #else
  158555. "adc r4, r7\n\t"
  158556. #endif
  158557. #ifdef WOLFSSL_KEIL
  158558. "adcs r5, r5, %[r]\n\t"
  158559. #elif defined(__clang__)
  158560. "adcs r5, %[r]\n\t"
  158561. #else
  158562. "adc r5, %[r]\n\t"
  158563. #endif
  158564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158565. "lsrs r6, %[a], #16\n\t"
  158566. #else
  158567. "lsr r6, %[a], #16\n\t"
  158568. #endif
  158569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158570. "lsrs r7, %[b], #16\n\t"
  158571. #else
  158572. "lsr r7, %[b], #16\n\t"
  158573. #endif
  158574. #ifdef WOLFSSL_KEIL
  158575. "muls r7, r6, r7\n\t"
  158576. #elif defined(__clang__)
  158577. "muls r7, r6\n\t"
  158578. #else
  158579. "mul r7, r6\n\t"
  158580. #endif
  158581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158582. "adds r4, r4, r7\n\t"
  158583. #else
  158584. "add r4, r4, r7\n\t"
  158585. #endif
  158586. #ifdef WOLFSSL_KEIL
  158587. "adcs r5, r5, %[r]\n\t"
  158588. #elif defined(__clang__)
  158589. "adcs r5, %[r]\n\t"
  158590. #else
  158591. "adc r5, %[r]\n\t"
  158592. #endif
  158593. "uxth r7, %[b]\n\t"
  158594. #ifdef WOLFSSL_KEIL
  158595. "muls r6, r7, r6\n\t"
  158596. #elif defined(__clang__)
  158597. "muls r6, r7\n\t"
  158598. #else
  158599. "mul r6, r7\n\t"
  158600. #endif
  158601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158602. "lsrs r7, r6, #16\n\t"
  158603. #else
  158604. "lsr r7, r6, #16\n\t"
  158605. #endif
  158606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158607. "lsls r6, r6, #16\n\t"
  158608. #else
  158609. "lsl r6, r6, #16\n\t"
  158610. #endif
  158611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158612. "adds r3, r3, r6\n\t"
  158613. #else
  158614. "add r3, r3, r6\n\t"
  158615. #endif
  158616. #ifdef WOLFSSL_KEIL
  158617. "adcs r4, r4, r7\n\t"
  158618. #elif defined(__clang__)
  158619. "adcs r4, r7\n\t"
  158620. #else
  158621. "adc r4, r7\n\t"
  158622. #endif
  158623. #ifdef WOLFSSL_KEIL
  158624. "adcs r5, r5, %[r]\n\t"
  158625. #elif defined(__clang__)
  158626. "adcs r5, %[r]\n\t"
  158627. #else
  158628. "adc r5, %[r]\n\t"
  158629. #endif
  158630. "# A[5] * B[13]\n\t"
  158631. "mov %[a], r9\n\t"
  158632. "mov %[b], r10\n\t"
  158633. "ldr %[a], [%[a], #20]\n\t"
  158634. "ldr %[b], [%[b], #52]\n\t"
  158635. "uxth r6, %[a]\n\t"
  158636. "uxth r7, %[b]\n\t"
  158637. #ifdef WOLFSSL_KEIL
  158638. "muls r7, r6, r7\n\t"
  158639. #elif defined(__clang__)
  158640. "muls r7, r6\n\t"
  158641. #else
  158642. "mul r7, r6\n\t"
  158643. #endif
  158644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158645. "adds r3, r3, r7\n\t"
  158646. #else
  158647. "add r3, r3, r7\n\t"
  158648. #endif
  158649. #ifdef WOLFSSL_KEIL
  158650. "adcs r4, r4, %[r]\n\t"
  158651. #elif defined(__clang__)
  158652. "adcs r4, %[r]\n\t"
  158653. #else
  158654. "adc r4, %[r]\n\t"
  158655. #endif
  158656. #ifdef WOLFSSL_KEIL
  158657. "adcs r5, r5, %[r]\n\t"
  158658. #elif defined(__clang__)
  158659. "adcs r5, %[r]\n\t"
  158660. #else
  158661. "adc r5, %[r]\n\t"
  158662. #endif
  158663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158664. "lsrs r7, %[b], #16\n\t"
  158665. #else
  158666. "lsr r7, %[b], #16\n\t"
  158667. #endif
  158668. #ifdef WOLFSSL_KEIL
  158669. "muls r6, r7, r6\n\t"
  158670. #elif defined(__clang__)
  158671. "muls r6, r7\n\t"
  158672. #else
  158673. "mul r6, r7\n\t"
  158674. #endif
  158675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158676. "lsrs r7, r6, #16\n\t"
  158677. #else
  158678. "lsr r7, r6, #16\n\t"
  158679. #endif
  158680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158681. "lsls r6, r6, #16\n\t"
  158682. #else
  158683. "lsl r6, r6, #16\n\t"
  158684. #endif
  158685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158686. "adds r3, r3, r6\n\t"
  158687. #else
  158688. "add r3, r3, r6\n\t"
  158689. #endif
  158690. #ifdef WOLFSSL_KEIL
  158691. "adcs r4, r4, r7\n\t"
  158692. #elif defined(__clang__)
  158693. "adcs r4, r7\n\t"
  158694. #else
  158695. "adc r4, r7\n\t"
  158696. #endif
  158697. #ifdef WOLFSSL_KEIL
  158698. "adcs r5, r5, %[r]\n\t"
  158699. #elif defined(__clang__)
  158700. "adcs r5, %[r]\n\t"
  158701. #else
  158702. "adc r5, %[r]\n\t"
  158703. #endif
  158704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158705. "lsrs r6, %[a], #16\n\t"
  158706. #else
  158707. "lsr r6, %[a], #16\n\t"
  158708. #endif
  158709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158710. "lsrs r7, %[b], #16\n\t"
  158711. #else
  158712. "lsr r7, %[b], #16\n\t"
  158713. #endif
  158714. #ifdef WOLFSSL_KEIL
  158715. "muls r7, r6, r7\n\t"
  158716. #elif defined(__clang__)
  158717. "muls r7, r6\n\t"
  158718. #else
  158719. "mul r7, r6\n\t"
  158720. #endif
  158721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158722. "adds r4, r4, r7\n\t"
  158723. #else
  158724. "add r4, r4, r7\n\t"
  158725. #endif
  158726. #ifdef WOLFSSL_KEIL
  158727. "adcs r5, r5, %[r]\n\t"
  158728. #elif defined(__clang__)
  158729. "adcs r5, %[r]\n\t"
  158730. #else
  158731. "adc r5, %[r]\n\t"
  158732. #endif
  158733. "uxth r7, %[b]\n\t"
  158734. #ifdef WOLFSSL_KEIL
  158735. "muls r6, r7, r6\n\t"
  158736. #elif defined(__clang__)
  158737. "muls r6, r7\n\t"
  158738. #else
  158739. "mul r6, r7\n\t"
  158740. #endif
  158741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158742. "lsrs r7, r6, #16\n\t"
  158743. #else
  158744. "lsr r7, r6, #16\n\t"
  158745. #endif
  158746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158747. "lsls r6, r6, #16\n\t"
  158748. #else
  158749. "lsl r6, r6, #16\n\t"
  158750. #endif
  158751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158752. "adds r3, r3, r6\n\t"
  158753. #else
  158754. "add r3, r3, r6\n\t"
  158755. #endif
  158756. #ifdef WOLFSSL_KEIL
  158757. "adcs r4, r4, r7\n\t"
  158758. #elif defined(__clang__)
  158759. "adcs r4, r7\n\t"
  158760. #else
  158761. "adc r4, r7\n\t"
  158762. #endif
  158763. #ifdef WOLFSSL_KEIL
  158764. "adcs r5, r5, %[r]\n\t"
  158765. #elif defined(__clang__)
  158766. "adcs r5, %[r]\n\t"
  158767. #else
  158768. "adc r5, %[r]\n\t"
  158769. #endif
  158770. "# A[4] * B[14]\n\t"
  158771. "mov %[a], r9\n\t"
  158772. "mov %[b], r10\n\t"
  158773. "ldr %[a], [%[a], #16]\n\t"
  158774. "ldr %[b], [%[b], #56]\n\t"
  158775. "uxth r6, %[a]\n\t"
  158776. "uxth r7, %[b]\n\t"
  158777. #ifdef WOLFSSL_KEIL
  158778. "muls r7, r6, r7\n\t"
  158779. #elif defined(__clang__)
  158780. "muls r7, r6\n\t"
  158781. #else
  158782. "mul r7, r6\n\t"
  158783. #endif
  158784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158785. "adds r3, r3, r7\n\t"
  158786. #else
  158787. "add r3, r3, r7\n\t"
  158788. #endif
  158789. #ifdef WOLFSSL_KEIL
  158790. "adcs r4, r4, %[r]\n\t"
  158791. #elif defined(__clang__)
  158792. "adcs r4, %[r]\n\t"
  158793. #else
  158794. "adc r4, %[r]\n\t"
  158795. #endif
  158796. #ifdef WOLFSSL_KEIL
  158797. "adcs r5, r5, %[r]\n\t"
  158798. #elif defined(__clang__)
  158799. "adcs r5, %[r]\n\t"
  158800. #else
  158801. "adc r5, %[r]\n\t"
  158802. #endif
  158803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158804. "lsrs r7, %[b], #16\n\t"
  158805. #else
  158806. "lsr r7, %[b], #16\n\t"
  158807. #endif
  158808. #ifdef WOLFSSL_KEIL
  158809. "muls r6, r7, r6\n\t"
  158810. #elif defined(__clang__)
  158811. "muls r6, r7\n\t"
  158812. #else
  158813. "mul r6, r7\n\t"
  158814. #endif
  158815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158816. "lsrs r7, r6, #16\n\t"
  158817. #else
  158818. "lsr r7, r6, #16\n\t"
  158819. #endif
  158820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158821. "lsls r6, r6, #16\n\t"
  158822. #else
  158823. "lsl r6, r6, #16\n\t"
  158824. #endif
  158825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158826. "adds r3, r3, r6\n\t"
  158827. #else
  158828. "add r3, r3, r6\n\t"
  158829. #endif
  158830. #ifdef WOLFSSL_KEIL
  158831. "adcs r4, r4, r7\n\t"
  158832. #elif defined(__clang__)
  158833. "adcs r4, r7\n\t"
  158834. #else
  158835. "adc r4, r7\n\t"
  158836. #endif
  158837. #ifdef WOLFSSL_KEIL
  158838. "adcs r5, r5, %[r]\n\t"
  158839. #elif defined(__clang__)
  158840. "adcs r5, %[r]\n\t"
  158841. #else
  158842. "adc r5, %[r]\n\t"
  158843. #endif
  158844. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158845. "lsrs r6, %[a], #16\n\t"
  158846. #else
  158847. "lsr r6, %[a], #16\n\t"
  158848. #endif
  158849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158850. "lsrs r7, %[b], #16\n\t"
  158851. #else
  158852. "lsr r7, %[b], #16\n\t"
  158853. #endif
  158854. #ifdef WOLFSSL_KEIL
  158855. "muls r7, r6, r7\n\t"
  158856. #elif defined(__clang__)
  158857. "muls r7, r6\n\t"
  158858. #else
  158859. "mul r7, r6\n\t"
  158860. #endif
  158861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158862. "adds r4, r4, r7\n\t"
  158863. #else
  158864. "add r4, r4, r7\n\t"
  158865. #endif
  158866. #ifdef WOLFSSL_KEIL
  158867. "adcs r5, r5, %[r]\n\t"
  158868. #elif defined(__clang__)
  158869. "adcs r5, %[r]\n\t"
  158870. #else
  158871. "adc r5, %[r]\n\t"
  158872. #endif
  158873. "uxth r7, %[b]\n\t"
  158874. #ifdef WOLFSSL_KEIL
  158875. "muls r6, r7, r6\n\t"
  158876. #elif defined(__clang__)
  158877. "muls r6, r7\n\t"
  158878. #else
  158879. "mul r6, r7\n\t"
  158880. #endif
  158881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158882. "lsrs r7, r6, #16\n\t"
  158883. #else
  158884. "lsr r7, r6, #16\n\t"
  158885. #endif
  158886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158887. "lsls r6, r6, #16\n\t"
  158888. #else
  158889. "lsl r6, r6, #16\n\t"
  158890. #endif
  158891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158892. "adds r3, r3, r6\n\t"
  158893. #else
  158894. "add r3, r3, r6\n\t"
  158895. #endif
  158896. #ifdef WOLFSSL_KEIL
  158897. "adcs r4, r4, r7\n\t"
  158898. #elif defined(__clang__)
  158899. "adcs r4, r7\n\t"
  158900. #else
  158901. "adc r4, r7\n\t"
  158902. #endif
  158903. #ifdef WOLFSSL_KEIL
  158904. "adcs r5, r5, %[r]\n\t"
  158905. #elif defined(__clang__)
  158906. "adcs r5, %[r]\n\t"
  158907. #else
  158908. "adc r5, %[r]\n\t"
  158909. #endif
  158910. "# A[3] * B[15]\n\t"
  158911. "mov %[a], r9\n\t"
  158912. "mov %[b], r10\n\t"
  158913. "ldr %[a], [%[a], #12]\n\t"
  158914. "ldr %[b], [%[b], #60]\n\t"
  158915. "uxth r6, %[a]\n\t"
  158916. "uxth r7, %[b]\n\t"
  158917. #ifdef WOLFSSL_KEIL
  158918. "muls r7, r6, r7\n\t"
  158919. #elif defined(__clang__)
  158920. "muls r7, r6\n\t"
  158921. #else
  158922. "mul r7, r6\n\t"
  158923. #endif
  158924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158925. "adds r3, r3, r7\n\t"
  158926. #else
  158927. "add r3, r3, r7\n\t"
  158928. #endif
  158929. #ifdef WOLFSSL_KEIL
  158930. "adcs r4, r4, %[r]\n\t"
  158931. #elif defined(__clang__)
  158932. "adcs r4, %[r]\n\t"
  158933. #else
  158934. "adc r4, %[r]\n\t"
  158935. #endif
  158936. #ifdef WOLFSSL_KEIL
  158937. "adcs r5, r5, %[r]\n\t"
  158938. #elif defined(__clang__)
  158939. "adcs r5, %[r]\n\t"
  158940. #else
  158941. "adc r5, %[r]\n\t"
  158942. #endif
  158943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158944. "lsrs r7, %[b], #16\n\t"
  158945. #else
  158946. "lsr r7, %[b], #16\n\t"
  158947. #endif
  158948. #ifdef WOLFSSL_KEIL
  158949. "muls r6, r7, r6\n\t"
  158950. #elif defined(__clang__)
  158951. "muls r6, r7\n\t"
  158952. #else
  158953. "mul r6, r7\n\t"
  158954. #endif
  158955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158956. "lsrs r7, r6, #16\n\t"
  158957. #else
  158958. "lsr r7, r6, #16\n\t"
  158959. #endif
  158960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158961. "lsls r6, r6, #16\n\t"
  158962. #else
  158963. "lsl r6, r6, #16\n\t"
  158964. #endif
  158965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158966. "adds r3, r3, r6\n\t"
  158967. #else
  158968. "add r3, r3, r6\n\t"
  158969. #endif
  158970. #ifdef WOLFSSL_KEIL
  158971. "adcs r4, r4, r7\n\t"
  158972. #elif defined(__clang__)
  158973. "adcs r4, r7\n\t"
  158974. #else
  158975. "adc r4, r7\n\t"
  158976. #endif
  158977. #ifdef WOLFSSL_KEIL
  158978. "adcs r5, r5, %[r]\n\t"
  158979. #elif defined(__clang__)
  158980. "adcs r5, %[r]\n\t"
  158981. #else
  158982. "adc r5, %[r]\n\t"
  158983. #endif
  158984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158985. "lsrs r6, %[a], #16\n\t"
  158986. #else
  158987. "lsr r6, %[a], #16\n\t"
  158988. #endif
  158989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  158990. "lsrs r7, %[b], #16\n\t"
  158991. #else
  158992. "lsr r7, %[b], #16\n\t"
  158993. #endif
  158994. #ifdef WOLFSSL_KEIL
  158995. "muls r7, r6, r7\n\t"
  158996. #elif defined(__clang__)
  158997. "muls r7, r6\n\t"
  158998. #else
  158999. "mul r7, r6\n\t"
  159000. #endif
  159001. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159002. "adds r4, r4, r7\n\t"
  159003. #else
  159004. "add r4, r4, r7\n\t"
  159005. #endif
  159006. #ifdef WOLFSSL_KEIL
  159007. "adcs r5, r5, %[r]\n\t"
  159008. #elif defined(__clang__)
  159009. "adcs r5, %[r]\n\t"
  159010. #else
  159011. "adc r5, %[r]\n\t"
  159012. #endif
  159013. "uxth r7, %[b]\n\t"
  159014. #ifdef WOLFSSL_KEIL
  159015. "muls r6, r7, r6\n\t"
  159016. #elif defined(__clang__)
  159017. "muls r6, r7\n\t"
  159018. #else
  159019. "mul r6, r7\n\t"
  159020. #endif
  159021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159022. "lsrs r7, r6, #16\n\t"
  159023. #else
  159024. "lsr r7, r6, #16\n\t"
  159025. #endif
  159026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159027. "lsls r6, r6, #16\n\t"
  159028. #else
  159029. "lsl r6, r6, #16\n\t"
  159030. #endif
  159031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159032. "adds r3, r3, r6\n\t"
  159033. #else
  159034. "add r3, r3, r6\n\t"
  159035. #endif
  159036. #ifdef WOLFSSL_KEIL
  159037. "adcs r4, r4, r7\n\t"
  159038. #elif defined(__clang__)
  159039. "adcs r4, r7\n\t"
  159040. #else
  159041. "adc r4, r7\n\t"
  159042. #endif
  159043. #ifdef WOLFSSL_KEIL
  159044. "adcs r5, r5, %[r]\n\t"
  159045. #elif defined(__clang__)
  159046. "adcs r5, %[r]\n\t"
  159047. #else
  159048. "adc r5, %[r]\n\t"
  159049. #endif
  159050. "mov %[r], r8\n\t"
  159051. "str r3, [%[r], #72]\n\t"
  159052. "movs %[r], #0\n\t"
  159053. "# A[4] * B[15]\n\t"
  159054. "movs r3, #0\n\t"
  159055. "mov %[a], r9\n\t"
  159056. "mov %[b], r10\n\t"
  159057. "ldr %[a], [%[a], #16]\n\t"
  159058. "ldr %[b], [%[b], #60]\n\t"
  159059. "uxth r6, %[a]\n\t"
  159060. "uxth r7, %[b]\n\t"
  159061. #ifdef WOLFSSL_KEIL
  159062. "muls r7, r6, r7\n\t"
  159063. #elif defined(__clang__)
  159064. "muls r7, r6\n\t"
  159065. #else
  159066. "mul r7, r6\n\t"
  159067. #endif
  159068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159069. "adds r4, r4, r7\n\t"
  159070. #else
  159071. "add r4, r4, r7\n\t"
  159072. #endif
  159073. #ifdef WOLFSSL_KEIL
  159074. "adcs r5, r5, %[r]\n\t"
  159075. #elif defined(__clang__)
  159076. "adcs r5, %[r]\n\t"
  159077. #else
  159078. "adc r5, %[r]\n\t"
  159079. #endif
  159080. #ifdef WOLFSSL_KEIL
  159081. "adcs r3, r3, %[r]\n\t"
  159082. #elif defined(__clang__)
  159083. "adcs r3, %[r]\n\t"
  159084. #else
  159085. "adc r3, %[r]\n\t"
  159086. #endif
  159087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159088. "lsrs r7, %[b], #16\n\t"
  159089. #else
  159090. "lsr r7, %[b], #16\n\t"
  159091. #endif
  159092. #ifdef WOLFSSL_KEIL
  159093. "muls r6, r7, r6\n\t"
  159094. #elif defined(__clang__)
  159095. "muls r6, r7\n\t"
  159096. #else
  159097. "mul r6, r7\n\t"
  159098. #endif
  159099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159100. "lsrs r7, r6, #16\n\t"
  159101. #else
  159102. "lsr r7, r6, #16\n\t"
  159103. #endif
  159104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159105. "lsls r6, r6, #16\n\t"
  159106. #else
  159107. "lsl r6, r6, #16\n\t"
  159108. #endif
  159109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159110. "adds r4, r4, r6\n\t"
  159111. #else
  159112. "add r4, r4, r6\n\t"
  159113. #endif
  159114. #ifdef WOLFSSL_KEIL
  159115. "adcs r5, r5, r7\n\t"
  159116. #elif defined(__clang__)
  159117. "adcs r5, r7\n\t"
  159118. #else
  159119. "adc r5, r7\n\t"
  159120. #endif
  159121. #ifdef WOLFSSL_KEIL
  159122. "adcs r3, r3, %[r]\n\t"
  159123. #elif defined(__clang__)
  159124. "adcs r3, %[r]\n\t"
  159125. #else
  159126. "adc r3, %[r]\n\t"
  159127. #endif
  159128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159129. "lsrs r6, %[a], #16\n\t"
  159130. #else
  159131. "lsr r6, %[a], #16\n\t"
  159132. #endif
  159133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159134. "lsrs r7, %[b], #16\n\t"
  159135. #else
  159136. "lsr r7, %[b], #16\n\t"
  159137. #endif
  159138. #ifdef WOLFSSL_KEIL
  159139. "muls r7, r6, r7\n\t"
  159140. #elif defined(__clang__)
  159141. "muls r7, r6\n\t"
  159142. #else
  159143. "mul r7, r6\n\t"
  159144. #endif
  159145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159146. "adds r5, r5, r7\n\t"
  159147. #else
  159148. "add r5, r5, r7\n\t"
  159149. #endif
  159150. #ifdef WOLFSSL_KEIL
  159151. "adcs r3, r3, %[r]\n\t"
  159152. #elif defined(__clang__)
  159153. "adcs r3, %[r]\n\t"
  159154. #else
  159155. "adc r3, %[r]\n\t"
  159156. #endif
  159157. "uxth r7, %[b]\n\t"
  159158. #ifdef WOLFSSL_KEIL
  159159. "muls r6, r7, r6\n\t"
  159160. #elif defined(__clang__)
  159161. "muls r6, r7\n\t"
  159162. #else
  159163. "mul r6, r7\n\t"
  159164. #endif
  159165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159166. "lsrs r7, r6, #16\n\t"
  159167. #else
  159168. "lsr r7, r6, #16\n\t"
  159169. #endif
  159170. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159171. "lsls r6, r6, #16\n\t"
  159172. #else
  159173. "lsl r6, r6, #16\n\t"
  159174. #endif
  159175. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159176. "adds r4, r4, r6\n\t"
  159177. #else
  159178. "add r4, r4, r6\n\t"
  159179. #endif
  159180. #ifdef WOLFSSL_KEIL
  159181. "adcs r5, r5, r7\n\t"
  159182. #elif defined(__clang__)
  159183. "adcs r5, r7\n\t"
  159184. #else
  159185. "adc r5, r7\n\t"
  159186. #endif
  159187. #ifdef WOLFSSL_KEIL
  159188. "adcs r3, r3, %[r]\n\t"
  159189. #elif defined(__clang__)
  159190. "adcs r3, %[r]\n\t"
  159191. #else
  159192. "adc r3, %[r]\n\t"
  159193. #endif
  159194. "# A[5] * B[14]\n\t"
  159195. "mov %[a], r9\n\t"
  159196. "mov %[b], r10\n\t"
  159197. "ldr %[a], [%[a], #20]\n\t"
  159198. "ldr %[b], [%[b], #56]\n\t"
  159199. "uxth r6, %[a]\n\t"
  159200. "uxth r7, %[b]\n\t"
  159201. #ifdef WOLFSSL_KEIL
  159202. "muls r7, r6, r7\n\t"
  159203. #elif defined(__clang__)
  159204. "muls r7, r6\n\t"
  159205. #else
  159206. "mul r7, r6\n\t"
  159207. #endif
  159208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159209. "adds r4, r4, r7\n\t"
  159210. #else
  159211. "add r4, r4, r7\n\t"
  159212. #endif
  159213. #ifdef WOLFSSL_KEIL
  159214. "adcs r5, r5, %[r]\n\t"
  159215. #elif defined(__clang__)
  159216. "adcs r5, %[r]\n\t"
  159217. #else
  159218. "adc r5, %[r]\n\t"
  159219. #endif
  159220. #ifdef WOLFSSL_KEIL
  159221. "adcs r3, r3, %[r]\n\t"
  159222. #elif defined(__clang__)
  159223. "adcs r3, %[r]\n\t"
  159224. #else
  159225. "adc r3, %[r]\n\t"
  159226. #endif
  159227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159228. "lsrs r7, %[b], #16\n\t"
  159229. #else
  159230. "lsr r7, %[b], #16\n\t"
  159231. #endif
  159232. #ifdef WOLFSSL_KEIL
  159233. "muls r6, r7, r6\n\t"
  159234. #elif defined(__clang__)
  159235. "muls r6, r7\n\t"
  159236. #else
  159237. "mul r6, r7\n\t"
  159238. #endif
  159239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159240. "lsrs r7, r6, #16\n\t"
  159241. #else
  159242. "lsr r7, r6, #16\n\t"
  159243. #endif
  159244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159245. "lsls r6, r6, #16\n\t"
  159246. #else
  159247. "lsl r6, r6, #16\n\t"
  159248. #endif
  159249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159250. "adds r4, r4, r6\n\t"
  159251. #else
  159252. "add r4, r4, r6\n\t"
  159253. #endif
  159254. #ifdef WOLFSSL_KEIL
  159255. "adcs r5, r5, r7\n\t"
  159256. #elif defined(__clang__)
  159257. "adcs r5, r7\n\t"
  159258. #else
  159259. "adc r5, r7\n\t"
  159260. #endif
  159261. #ifdef WOLFSSL_KEIL
  159262. "adcs r3, r3, %[r]\n\t"
  159263. #elif defined(__clang__)
  159264. "adcs r3, %[r]\n\t"
  159265. #else
  159266. "adc r3, %[r]\n\t"
  159267. #endif
  159268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159269. "lsrs r6, %[a], #16\n\t"
  159270. #else
  159271. "lsr r6, %[a], #16\n\t"
  159272. #endif
  159273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159274. "lsrs r7, %[b], #16\n\t"
  159275. #else
  159276. "lsr r7, %[b], #16\n\t"
  159277. #endif
  159278. #ifdef WOLFSSL_KEIL
  159279. "muls r7, r6, r7\n\t"
  159280. #elif defined(__clang__)
  159281. "muls r7, r6\n\t"
  159282. #else
  159283. "mul r7, r6\n\t"
  159284. #endif
  159285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159286. "adds r5, r5, r7\n\t"
  159287. #else
  159288. "add r5, r5, r7\n\t"
  159289. #endif
  159290. #ifdef WOLFSSL_KEIL
  159291. "adcs r3, r3, %[r]\n\t"
  159292. #elif defined(__clang__)
  159293. "adcs r3, %[r]\n\t"
  159294. #else
  159295. "adc r3, %[r]\n\t"
  159296. #endif
  159297. "uxth r7, %[b]\n\t"
  159298. #ifdef WOLFSSL_KEIL
  159299. "muls r6, r7, r6\n\t"
  159300. #elif defined(__clang__)
  159301. "muls r6, r7\n\t"
  159302. #else
  159303. "mul r6, r7\n\t"
  159304. #endif
  159305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159306. "lsrs r7, r6, #16\n\t"
  159307. #else
  159308. "lsr r7, r6, #16\n\t"
  159309. #endif
  159310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159311. "lsls r6, r6, #16\n\t"
  159312. #else
  159313. "lsl r6, r6, #16\n\t"
  159314. #endif
  159315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159316. "adds r4, r4, r6\n\t"
  159317. #else
  159318. "add r4, r4, r6\n\t"
  159319. #endif
  159320. #ifdef WOLFSSL_KEIL
  159321. "adcs r5, r5, r7\n\t"
  159322. #elif defined(__clang__)
  159323. "adcs r5, r7\n\t"
  159324. #else
  159325. "adc r5, r7\n\t"
  159326. #endif
  159327. #ifdef WOLFSSL_KEIL
  159328. "adcs r3, r3, %[r]\n\t"
  159329. #elif defined(__clang__)
  159330. "adcs r3, %[r]\n\t"
  159331. #else
  159332. "adc r3, %[r]\n\t"
  159333. #endif
  159334. "# A[6] * B[13]\n\t"
  159335. "mov %[a], r9\n\t"
  159336. "mov %[b], r10\n\t"
  159337. "ldr %[a], [%[a], #24]\n\t"
  159338. "ldr %[b], [%[b], #52]\n\t"
  159339. "uxth r6, %[a]\n\t"
  159340. "uxth r7, %[b]\n\t"
  159341. #ifdef WOLFSSL_KEIL
  159342. "muls r7, r6, r7\n\t"
  159343. #elif defined(__clang__)
  159344. "muls r7, r6\n\t"
  159345. #else
  159346. "mul r7, r6\n\t"
  159347. #endif
  159348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159349. "adds r4, r4, r7\n\t"
  159350. #else
  159351. "add r4, r4, r7\n\t"
  159352. #endif
  159353. #ifdef WOLFSSL_KEIL
  159354. "adcs r5, r5, %[r]\n\t"
  159355. #elif defined(__clang__)
  159356. "adcs r5, %[r]\n\t"
  159357. #else
  159358. "adc r5, %[r]\n\t"
  159359. #endif
  159360. #ifdef WOLFSSL_KEIL
  159361. "adcs r3, r3, %[r]\n\t"
  159362. #elif defined(__clang__)
  159363. "adcs r3, %[r]\n\t"
  159364. #else
  159365. "adc r3, %[r]\n\t"
  159366. #endif
  159367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159368. "lsrs r7, %[b], #16\n\t"
  159369. #else
  159370. "lsr r7, %[b], #16\n\t"
  159371. #endif
  159372. #ifdef WOLFSSL_KEIL
  159373. "muls r6, r7, r6\n\t"
  159374. #elif defined(__clang__)
  159375. "muls r6, r7\n\t"
  159376. #else
  159377. "mul r6, r7\n\t"
  159378. #endif
  159379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159380. "lsrs r7, r6, #16\n\t"
  159381. #else
  159382. "lsr r7, r6, #16\n\t"
  159383. #endif
  159384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159385. "lsls r6, r6, #16\n\t"
  159386. #else
  159387. "lsl r6, r6, #16\n\t"
  159388. #endif
  159389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159390. "adds r4, r4, r6\n\t"
  159391. #else
  159392. "add r4, r4, r6\n\t"
  159393. #endif
  159394. #ifdef WOLFSSL_KEIL
  159395. "adcs r5, r5, r7\n\t"
  159396. #elif defined(__clang__)
  159397. "adcs r5, r7\n\t"
  159398. #else
  159399. "adc r5, r7\n\t"
  159400. #endif
  159401. #ifdef WOLFSSL_KEIL
  159402. "adcs r3, r3, %[r]\n\t"
  159403. #elif defined(__clang__)
  159404. "adcs r3, %[r]\n\t"
  159405. #else
  159406. "adc r3, %[r]\n\t"
  159407. #endif
  159408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159409. "lsrs r6, %[a], #16\n\t"
  159410. #else
  159411. "lsr r6, %[a], #16\n\t"
  159412. #endif
  159413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159414. "lsrs r7, %[b], #16\n\t"
  159415. #else
  159416. "lsr r7, %[b], #16\n\t"
  159417. #endif
  159418. #ifdef WOLFSSL_KEIL
  159419. "muls r7, r6, r7\n\t"
  159420. #elif defined(__clang__)
  159421. "muls r7, r6\n\t"
  159422. #else
  159423. "mul r7, r6\n\t"
  159424. #endif
  159425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159426. "adds r5, r5, r7\n\t"
  159427. #else
  159428. "add r5, r5, r7\n\t"
  159429. #endif
  159430. #ifdef WOLFSSL_KEIL
  159431. "adcs r3, r3, %[r]\n\t"
  159432. #elif defined(__clang__)
  159433. "adcs r3, %[r]\n\t"
  159434. #else
  159435. "adc r3, %[r]\n\t"
  159436. #endif
  159437. "uxth r7, %[b]\n\t"
  159438. #ifdef WOLFSSL_KEIL
  159439. "muls r6, r7, r6\n\t"
  159440. #elif defined(__clang__)
  159441. "muls r6, r7\n\t"
  159442. #else
  159443. "mul r6, r7\n\t"
  159444. #endif
  159445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159446. "lsrs r7, r6, #16\n\t"
  159447. #else
  159448. "lsr r7, r6, #16\n\t"
  159449. #endif
  159450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159451. "lsls r6, r6, #16\n\t"
  159452. #else
  159453. "lsl r6, r6, #16\n\t"
  159454. #endif
  159455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159456. "adds r4, r4, r6\n\t"
  159457. #else
  159458. "add r4, r4, r6\n\t"
  159459. #endif
  159460. #ifdef WOLFSSL_KEIL
  159461. "adcs r5, r5, r7\n\t"
  159462. #elif defined(__clang__)
  159463. "adcs r5, r7\n\t"
  159464. #else
  159465. "adc r5, r7\n\t"
  159466. #endif
  159467. #ifdef WOLFSSL_KEIL
  159468. "adcs r3, r3, %[r]\n\t"
  159469. #elif defined(__clang__)
  159470. "adcs r3, %[r]\n\t"
  159471. #else
  159472. "adc r3, %[r]\n\t"
  159473. #endif
  159474. "# A[7] * B[12]\n\t"
  159475. "mov %[a], r9\n\t"
  159476. "mov %[b], r10\n\t"
  159477. "ldr %[a], [%[a], #28]\n\t"
  159478. "ldr %[b], [%[b], #48]\n\t"
  159479. "uxth r6, %[a]\n\t"
  159480. "uxth r7, %[b]\n\t"
  159481. #ifdef WOLFSSL_KEIL
  159482. "muls r7, r6, r7\n\t"
  159483. #elif defined(__clang__)
  159484. "muls r7, r6\n\t"
  159485. #else
  159486. "mul r7, r6\n\t"
  159487. #endif
  159488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159489. "adds r4, r4, r7\n\t"
  159490. #else
  159491. "add r4, r4, r7\n\t"
  159492. #endif
  159493. #ifdef WOLFSSL_KEIL
  159494. "adcs r5, r5, %[r]\n\t"
  159495. #elif defined(__clang__)
  159496. "adcs r5, %[r]\n\t"
  159497. #else
  159498. "adc r5, %[r]\n\t"
  159499. #endif
  159500. #ifdef WOLFSSL_KEIL
  159501. "adcs r3, r3, %[r]\n\t"
  159502. #elif defined(__clang__)
  159503. "adcs r3, %[r]\n\t"
  159504. #else
  159505. "adc r3, %[r]\n\t"
  159506. #endif
  159507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159508. "lsrs r7, %[b], #16\n\t"
  159509. #else
  159510. "lsr r7, %[b], #16\n\t"
  159511. #endif
  159512. #ifdef WOLFSSL_KEIL
  159513. "muls r6, r7, r6\n\t"
  159514. #elif defined(__clang__)
  159515. "muls r6, r7\n\t"
  159516. #else
  159517. "mul r6, r7\n\t"
  159518. #endif
  159519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159520. "lsrs r7, r6, #16\n\t"
  159521. #else
  159522. "lsr r7, r6, #16\n\t"
  159523. #endif
  159524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159525. "lsls r6, r6, #16\n\t"
  159526. #else
  159527. "lsl r6, r6, #16\n\t"
  159528. #endif
  159529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159530. "adds r4, r4, r6\n\t"
  159531. #else
  159532. "add r4, r4, r6\n\t"
  159533. #endif
  159534. #ifdef WOLFSSL_KEIL
  159535. "adcs r5, r5, r7\n\t"
  159536. #elif defined(__clang__)
  159537. "adcs r5, r7\n\t"
  159538. #else
  159539. "adc r5, r7\n\t"
  159540. #endif
  159541. #ifdef WOLFSSL_KEIL
  159542. "adcs r3, r3, %[r]\n\t"
  159543. #elif defined(__clang__)
  159544. "adcs r3, %[r]\n\t"
  159545. #else
  159546. "adc r3, %[r]\n\t"
  159547. #endif
  159548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159549. "lsrs r6, %[a], #16\n\t"
  159550. #else
  159551. "lsr r6, %[a], #16\n\t"
  159552. #endif
  159553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159554. "lsrs r7, %[b], #16\n\t"
  159555. #else
  159556. "lsr r7, %[b], #16\n\t"
  159557. #endif
  159558. #ifdef WOLFSSL_KEIL
  159559. "muls r7, r6, r7\n\t"
  159560. #elif defined(__clang__)
  159561. "muls r7, r6\n\t"
  159562. #else
  159563. "mul r7, r6\n\t"
  159564. #endif
  159565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159566. "adds r5, r5, r7\n\t"
  159567. #else
  159568. "add r5, r5, r7\n\t"
  159569. #endif
  159570. #ifdef WOLFSSL_KEIL
  159571. "adcs r3, r3, %[r]\n\t"
  159572. #elif defined(__clang__)
  159573. "adcs r3, %[r]\n\t"
  159574. #else
  159575. "adc r3, %[r]\n\t"
  159576. #endif
  159577. "uxth r7, %[b]\n\t"
  159578. #ifdef WOLFSSL_KEIL
  159579. "muls r6, r7, r6\n\t"
  159580. #elif defined(__clang__)
  159581. "muls r6, r7\n\t"
  159582. #else
  159583. "mul r6, r7\n\t"
  159584. #endif
  159585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159586. "lsrs r7, r6, #16\n\t"
  159587. #else
  159588. "lsr r7, r6, #16\n\t"
  159589. #endif
  159590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159591. "lsls r6, r6, #16\n\t"
  159592. #else
  159593. "lsl r6, r6, #16\n\t"
  159594. #endif
  159595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159596. "adds r4, r4, r6\n\t"
  159597. #else
  159598. "add r4, r4, r6\n\t"
  159599. #endif
  159600. #ifdef WOLFSSL_KEIL
  159601. "adcs r5, r5, r7\n\t"
  159602. #elif defined(__clang__)
  159603. "adcs r5, r7\n\t"
  159604. #else
  159605. "adc r5, r7\n\t"
  159606. #endif
  159607. #ifdef WOLFSSL_KEIL
  159608. "adcs r3, r3, %[r]\n\t"
  159609. #elif defined(__clang__)
  159610. "adcs r3, %[r]\n\t"
  159611. #else
  159612. "adc r3, %[r]\n\t"
  159613. #endif
  159614. "# A[8] * B[11]\n\t"
  159615. "mov %[a], r9\n\t"
  159616. "mov %[b], r10\n\t"
  159617. "ldr %[a], [%[a], #32]\n\t"
  159618. "ldr %[b], [%[b], #44]\n\t"
  159619. "uxth r6, %[a]\n\t"
  159620. "uxth r7, %[b]\n\t"
  159621. #ifdef WOLFSSL_KEIL
  159622. "muls r7, r6, r7\n\t"
  159623. #elif defined(__clang__)
  159624. "muls r7, r6\n\t"
  159625. #else
  159626. "mul r7, r6\n\t"
  159627. #endif
  159628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159629. "adds r4, r4, r7\n\t"
  159630. #else
  159631. "add r4, r4, r7\n\t"
  159632. #endif
  159633. #ifdef WOLFSSL_KEIL
  159634. "adcs r5, r5, %[r]\n\t"
  159635. #elif defined(__clang__)
  159636. "adcs r5, %[r]\n\t"
  159637. #else
  159638. "adc r5, %[r]\n\t"
  159639. #endif
  159640. #ifdef WOLFSSL_KEIL
  159641. "adcs r3, r3, %[r]\n\t"
  159642. #elif defined(__clang__)
  159643. "adcs r3, %[r]\n\t"
  159644. #else
  159645. "adc r3, %[r]\n\t"
  159646. #endif
  159647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159648. "lsrs r7, %[b], #16\n\t"
  159649. #else
  159650. "lsr r7, %[b], #16\n\t"
  159651. #endif
  159652. #ifdef WOLFSSL_KEIL
  159653. "muls r6, r7, r6\n\t"
  159654. #elif defined(__clang__)
  159655. "muls r6, r7\n\t"
  159656. #else
  159657. "mul r6, r7\n\t"
  159658. #endif
  159659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159660. "lsrs r7, r6, #16\n\t"
  159661. #else
  159662. "lsr r7, r6, #16\n\t"
  159663. #endif
  159664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159665. "lsls r6, r6, #16\n\t"
  159666. #else
  159667. "lsl r6, r6, #16\n\t"
  159668. #endif
  159669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159670. "adds r4, r4, r6\n\t"
  159671. #else
  159672. "add r4, r4, r6\n\t"
  159673. #endif
  159674. #ifdef WOLFSSL_KEIL
  159675. "adcs r5, r5, r7\n\t"
  159676. #elif defined(__clang__)
  159677. "adcs r5, r7\n\t"
  159678. #else
  159679. "adc r5, r7\n\t"
  159680. #endif
  159681. #ifdef WOLFSSL_KEIL
  159682. "adcs r3, r3, %[r]\n\t"
  159683. #elif defined(__clang__)
  159684. "adcs r3, %[r]\n\t"
  159685. #else
  159686. "adc r3, %[r]\n\t"
  159687. #endif
  159688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159689. "lsrs r6, %[a], #16\n\t"
  159690. #else
  159691. "lsr r6, %[a], #16\n\t"
  159692. #endif
  159693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159694. "lsrs r7, %[b], #16\n\t"
  159695. #else
  159696. "lsr r7, %[b], #16\n\t"
  159697. #endif
  159698. #ifdef WOLFSSL_KEIL
  159699. "muls r7, r6, r7\n\t"
  159700. #elif defined(__clang__)
  159701. "muls r7, r6\n\t"
  159702. #else
  159703. "mul r7, r6\n\t"
  159704. #endif
  159705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159706. "adds r5, r5, r7\n\t"
  159707. #else
  159708. "add r5, r5, r7\n\t"
  159709. #endif
  159710. #ifdef WOLFSSL_KEIL
  159711. "adcs r3, r3, %[r]\n\t"
  159712. #elif defined(__clang__)
  159713. "adcs r3, %[r]\n\t"
  159714. #else
  159715. "adc r3, %[r]\n\t"
  159716. #endif
  159717. "uxth r7, %[b]\n\t"
  159718. #ifdef WOLFSSL_KEIL
  159719. "muls r6, r7, r6\n\t"
  159720. #elif defined(__clang__)
  159721. "muls r6, r7\n\t"
  159722. #else
  159723. "mul r6, r7\n\t"
  159724. #endif
  159725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159726. "lsrs r7, r6, #16\n\t"
  159727. #else
  159728. "lsr r7, r6, #16\n\t"
  159729. #endif
  159730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159731. "lsls r6, r6, #16\n\t"
  159732. #else
  159733. "lsl r6, r6, #16\n\t"
  159734. #endif
  159735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159736. "adds r4, r4, r6\n\t"
  159737. #else
  159738. "add r4, r4, r6\n\t"
  159739. #endif
  159740. #ifdef WOLFSSL_KEIL
  159741. "adcs r5, r5, r7\n\t"
  159742. #elif defined(__clang__)
  159743. "adcs r5, r7\n\t"
  159744. #else
  159745. "adc r5, r7\n\t"
  159746. #endif
  159747. #ifdef WOLFSSL_KEIL
  159748. "adcs r3, r3, %[r]\n\t"
  159749. #elif defined(__clang__)
  159750. "adcs r3, %[r]\n\t"
  159751. #else
  159752. "adc r3, %[r]\n\t"
  159753. #endif
  159754. "# A[9] * B[10]\n\t"
  159755. "mov %[a], r9\n\t"
  159756. "mov %[b], r10\n\t"
  159757. "ldr %[a], [%[a], #36]\n\t"
  159758. "ldr %[b], [%[b], #40]\n\t"
  159759. "uxth r6, %[a]\n\t"
  159760. "uxth r7, %[b]\n\t"
  159761. #ifdef WOLFSSL_KEIL
  159762. "muls r7, r6, r7\n\t"
  159763. #elif defined(__clang__)
  159764. "muls r7, r6\n\t"
  159765. #else
  159766. "mul r7, r6\n\t"
  159767. #endif
  159768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159769. "adds r4, r4, r7\n\t"
  159770. #else
  159771. "add r4, r4, r7\n\t"
  159772. #endif
  159773. #ifdef WOLFSSL_KEIL
  159774. "adcs r5, r5, %[r]\n\t"
  159775. #elif defined(__clang__)
  159776. "adcs r5, %[r]\n\t"
  159777. #else
  159778. "adc r5, %[r]\n\t"
  159779. #endif
  159780. #ifdef WOLFSSL_KEIL
  159781. "adcs r3, r3, %[r]\n\t"
  159782. #elif defined(__clang__)
  159783. "adcs r3, %[r]\n\t"
  159784. #else
  159785. "adc r3, %[r]\n\t"
  159786. #endif
  159787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159788. "lsrs r7, %[b], #16\n\t"
  159789. #else
  159790. "lsr r7, %[b], #16\n\t"
  159791. #endif
  159792. #ifdef WOLFSSL_KEIL
  159793. "muls r6, r7, r6\n\t"
  159794. #elif defined(__clang__)
  159795. "muls r6, r7\n\t"
  159796. #else
  159797. "mul r6, r7\n\t"
  159798. #endif
  159799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159800. "lsrs r7, r6, #16\n\t"
  159801. #else
  159802. "lsr r7, r6, #16\n\t"
  159803. #endif
  159804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159805. "lsls r6, r6, #16\n\t"
  159806. #else
  159807. "lsl r6, r6, #16\n\t"
  159808. #endif
  159809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159810. "adds r4, r4, r6\n\t"
  159811. #else
  159812. "add r4, r4, r6\n\t"
  159813. #endif
  159814. #ifdef WOLFSSL_KEIL
  159815. "adcs r5, r5, r7\n\t"
  159816. #elif defined(__clang__)
  159817. "adcs r5, r7\n\t"
  159818. #else
  159819. "adc r5, r7\n\t"
  159820. #endif
  159821. #ifdef WOLFSSL_KEIL
  159822. "adcs r3, r3, %[r]\n\t"
  159823. #elif defined(__clang__)
  159824. "adcs r3, %[r]\n\t"
  159825. #else
  159826. "adc r3, %[r]\n\t"
  159827. #endif
  159828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159829. "lsrs r6, %[a], #16\n\t"
  159830. #else
  159831. "lsr r6, %[a], #16\n\t"
  159832. #endif
  159833. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159834. "lsrs r7, %[b], #16\n\t"
  159835. #else
  159836. "lsr r7, %[b], #16\n\t"
  159837. #endif
  159838. #ifdef WOLFSSL_KEIL
  159839. "muls r7, r6, r7\n\t"
  159840. #elif defined(__clang__)
  159841. "muls r7, r6\n\t"
  159842. #else
  159843. "mul r7, r6\n\t"
  159844. #endif
  159845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159846. "adds r5, r5, r7\n\t"
  159847. #else
  159848. "add r5, r5, r7\n\t"
  159849. #endif
  159850. #ifdef WOLFSSL_KEIL
  159851. "adcs r3, r3, %[r]\n\t"
  159852. #elif defined(__clang__)
  159853. "adcs r3, %[r]\n\t"
  159854. #else
  159855. "adc r3, %[r]\n\t"
  159856. #endif
  159857. "uxth r7, %[b]\n\t"
  159858. #ifdef WOLFSSL_KEIL
  159859. "muls r6, r7, r6\n\t"
  159860. #elif defined(__clang__)
  159861. "muls r6, r7\n\t"
  159862. #else
  159863. "mul r6, r7\n\t"
  159864. #endif
  159865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159866. "lsrs r7, r6, #16\n\t"
  159867. #else
  159868. "lsr r7, r6, #16\n\t"
  159869. #endif
  159870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159871. "lsls r6, r6, #16\n\t"
  159872. #else
  159873. "lsl r6, r6, #16\n\t"
  159874. #endif
  159875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159876. "adds r4, r4, r6\n\t"
  159877. #else
  159878. "add r4, r4, r6\n\t"
  159879. #endif
  159880. #ifdef WOLFSSL_KEIL
  159881. "adcs r5, r5, r7\n\t"
  159882. #elif defined(__clang__)
  159883. "adcs r5, r7\n\t"
  159884. #else
  159885. "adc r5, r7\n\t"
  159886. #endif
  159887. #ifdef WOLFSSL_KEIL
  159888. "adcs r3, r3, %[r]\n\t"
  159889. #elif defined(__clang__)
  159890. "adcs r3, %[r]\n\t"
  159891. #else
  159892. "adc r3, %[r]\n\t"
  159893. #endif
  159894. "# A[10] * B[9]\n\t"
  159895. "mov %[a], r9\n\t"
  159896. "mov %[b], r10\n\t"
  159897. "ldr %[a], [%[a], #40]\n\t"
  159898. "ldr %[b], [%[b], #36]\n\t"
  159899. "uxth r6, %[a]\n\t"
  159900. "uxth r7, %[b]\n\t"
  159901. #ifdef WOLFSSL_KEIL
  159902. "muls r7, r6, r7\n\t"
  159903. #elif defined(__clang__)
  159904. "muls r7, r6\n\t"
  159905. #else
  159906. "mul r7, r6\n\t"
  159907. #endif
  159908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159909. "adds r4, r4, r7\n\t"
  159910. #else
  159911. "add r4, r4, r7\n\t"
  159912. #endif
  159913. #ifdef WOLFSSL_KEIL
  159914. "adcs r5, r5, %[r]\n\t"
  159915. #elif defined(__clang__)
  159916. "adcs r5, %[r]\n\t"
  159917. #else
  159918. "adc r5, %[r]\n\t"
  159919. #endif
  159920. #ifdef WOLFSSL_KEIL
  159921. "adcs r3, r3, %[r]\n\t"
  159922. #elif defined(__clang__)
  159923. "adcs r3, %[r]\n\t"
  159924. #else
  159925. "adc r3, %[r]\n\t"
  159926. #endif
  159927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159928. "lsrs r7, %[b], #16\n\t"
  159929. #else
  159930. "lsr r7, %[b], #16\n\t"
  159931. #endif
  159932. #ifdef WOLFSSL_KEIL
  159933. "muls r6, r7, r6\n\t"
  159934. #elif defined(__clang__)
  159935. "muls r6, r7\n\t"
  159936. #else
  159937. "mul r6, r7\n\t"
  159938. #endif
  159939. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159940. "lsrs r7, r6, #16\n\t"
  159941. #else
  159942. "lsr r7, r6, #16\n\t"
  159943. #endif
  159944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159945. "lsls r6, r6, #16\n\t"
  159946. #else
  159947. "lsl r6, r6, #16\n\t"
  159948. #endif
  159949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159950. "adds r4, r4, r6\n\t"
  159951. #else
  159952. "add r4, r4, r6\n\t"
  159953. #endif
  159954. #ifdef WOLFSSL_KEIL
  159955. "adcs r5, r5, r7\n\t"
  159956. #elif defined(__clang__)
  159957. "adcs r5, r7\n\t"
  159958. #else
  159959. "adc r5, r7\n\t"
  159960. #endif
  159961. #ifdef WOLFSSL_KEIL
  159962. "adcs r3, r3, %[r]\n\t"
  159963. #elif defined(__clang__)
  159964. "adcs r3, %[r]\n\t"
  159965. #else
  159966. "adc r3, %[r]\n\t"
  159967. #endif
  159968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159969. "lsrs r6, %[a], #16\n\t"
  159970. #else
  159971. "lsr r6, %[a], #16\n\t"
  159972. #endif
  159973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159974. "lsrs r7, %[b], #16\n\t"
  159975. #else
  159976. "lsr r7, %[b], #16\n\t"
  159977. #endif
  159978. #ifdef WOLFSSL_KEIL
  159979. "muls r7, r6, r7\n\t"
  159980. #elif defined(__clang__)
  159981. "muls r7, r6\n\t"
  159982. #else
  159983. "mul r7, r6\n\t"
  159984. #endif
  159985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  159986. "adds r5, r5, r7\n\t"
  159987. #else
  159988. "add r5, r5, r7\n\t"
  159989. #endif
  159990. #ifdef WOLFSSL_KEIL
  159991. "adcs r3, r3, %[r]\n\t"
  159992. #elif defined(__clang__)
  159993. "adcs r3, %[r]\n\t"
  159994. #else
  159995. "adc r3, %[r]\n\t"
  159996. #endif
  159997. "uxth r7, %[b]\n\t"
  159998. #ifdef WOLFSSL_KEIL
  159999. "muls r6, r7, r6\n\t"
  160000. #elif defined(__clang__)
  160001. "muls r6, r7\n\t"
  160002. #else
  160003. "mul r6, r7\n\t"
  160004. #endif
  160005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160006. "lsrs r7, r6, #16\n\t"
  160007. #else
  160008. "lsr r7, r6, #16\n\t"
  160009. #endif
  160010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160011. "lsls r6, r6, #16\n\t"
  160012. #else
  160013. "lsl r6, r6, #16\n\t"
  160014. #endif
  160015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160016. "adds r4, r4, r6\n\t"
  160017. #else
  160018. "add r4, r4, r6\n\t"
  160019. #endif
  160020. #ifdef WOLFSSL_KEIL
  160021. "adcs r5, r5, r7\n\t"
  160022. #elif defined(__clang__)
  160023. "adcs r5, r7\n\t"
  160024. #else
  160025. "adc r5, r7\n\t"
  160026. #endif
  160027. #ifdef WOLFSSL_KEIL
  160028. "adcs r3, r3, %[r]\n\t"
  160029. #elif defined(__clang__)
  160030. "adcs r3, %[r]\n\t"
  160031. #else
  160032. "adc r3, %[r]\n\t"
  160033. #endif
  160034. "# A[11] * B[8]\n\t"
  160035. "mov %[a], r9\n\t"
  160036. "mov %[b], r10\n\t"
  160037. "ldr %[a], [%[a], #44]\n\t"
  160038. "ldr %[b], [%[b], #32]\n\t"
  160039. "uxth r6, %[a]\n\t"
  160040. "uxth r7, %[b]\n\t"
  160041. #ifdef WOLFSSL_KEIL
  160042. "muls r7, r6, r7\n\t"
  160043. #elif defined(__clang__)
  160044. "muls r7, r6\n\t"
  160045. #else
  160046. "mul r7, r6\n\t"
  160047. #endif
  160048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160049. "adds r4, r4, r7\n\t"
  160050. #else
  160051. "add r4, r4, r7\n\t"
  160052. #endif
  160053. #ifdef WOLFSSL_KEIL
  160054. "adcs r5, r5, %[r]\n\t"
  160055. #elif defined(__clang__)
  160056. "adcs r5, %[r]\n\t"
  160057. #else
  160058. "adc r5, %[r]\n\t"
  160059. #endif
  160060. #ifdef WOLFSSL_KEIL
  160061. "adcs r3, r3, %[r]\n\t"
  160062. #elif defined(__clang__)
  160063. "adcs r3, %[r]\n\t"
  160064. #else
  160065. "adc r3, %[r]\n\t"
  160066. #endif
  160067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160068. "lsrs r7, %[b], #16\n\t"
  160069. #else
  160070. "lsr r7, %[b], #16\n\t"
  160071. #endif
  160072. #ifdef WOLFSSL_KEIL
  160073. "muls r6, r7, r6\n\t"
  160074. #elif defined(__clang__)
  160075. "muls r6, r7\n\t"
  160076. #else
  160077. "mul r6, r7\n\t"
  160078. #endif
  160079. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160080. "lsrs r7, r6, #16\n\t"
  160081. #else
  160082. "lsr r7, r6, #16\n\t"
  160083. #endif
  160084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160085. "lsls r6, r6, #16\n\t"
  160086. #else
  160087. "lsl r6, r6, #16\n\t"
  160088. #endif
  160089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160090. "adds r4, r4, r6\n\t"
  160091. #else
  160092. "add r4, r4, r6\n\t"
  160093. #endif
  160094. #ifdef WOLFSSL_KEIL
  160095. "adcs r5, r5, r7\n\t"
  160096. #elif defined(__clang__)
  160097. "adcs r5, r7\n\t"
  160098. #else
  160099. "adc r5, r7\n\t"
  160100. #endif
  160101. #ifdef WOLFSSL_KEIL
  160102. "adcs r3, r3, %[r]\n\t"
  160103. #elif defined(__clang__)
  160104. "adcs r3, %[r]\n\t"
  160105. #else
  160106. "adc r3, %[r]\n\t"
  160107. #endif
  160108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160109. "lsrs r6, %[a], #16\n\t"
  160110. #else
  160111. "lsr r6, %[a], #16\n\t"
  160112. #endif
  160113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160114. "lsrs r7, %[b], #16\n\t"
  160115. #else
  160116. "lsr r7, %[b], #16\n\t"
  160117. #endif
  160118. #ifdef WOLFSSL_KEIL
  160119. "muls r7, r6, r7\n\t"
  160120. #elif defined(__clang__)
  160121. "muls r7, r6\n\t"
  160122. #else
  160123. "mul r7, r6\n\t"
  160124. #endif
  160125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160126. "adds r5, r5, r7\n\t"
  160127. #else
  160128. "add r5, r5, r7\n\t"
  160129. #endif
  160130. #ifdef WOLFSSL_KEIL
  160131. "adcs r3, r3, %[r]\n\t"
  160132. #elif defined(__clang__)
  160133. "adcs r3, %[r]\n\t"
  160134. #else
  160135. "adc r3, %[r]\n\t"
  160136. #endif
  160137. "uxth r7, %[b]\n\t"
  160138. #ifdef WOLFSSL_KEIL
  160139. "muls r6, r7, r6\n\t"
  160140. #elif defined(__clang__)
  160141. "muls r6, r7\n\t"
  160142. #else
  160143. "mul r6, r7\n\t"
  160144. #endif
  160145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160146. "lsrs r7, r6, #16\n\t"
  160147. #else
  160148. "lsr r7, r6, #16\n\t"
  160149. #endif
  160150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160151. "lsls r6, r6, #16\n\t"
  160152. #else
  160153. "lsl r6, r6, #16\n\t"
  160154. #endif
  160155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160156. "adds r4, r4, r6\n\t"
  160157. #else
  160158. "add r4, r4, r6\n\t"
  160159. #endif
  160160. #ifdef WOLFSSL_KEIL
  160161. "adcs r5, r5, r7\n\t"
  160162. #elif defined(__clang__)
  160163. "adcs r5, r7\n\t"
  160164. #else
  160165. "adc r5, r7\n\t"
  160166. #endif
  160167. #ifdef WOLFSSL_KEIL
  160168. "adcs r3, r3, %[r]\n\t"
  160169. #elif defined(__clang__)
  160170. "adcs r3, %[r]\n\t"
  160171. #else
  160172. "adc r3, %[r]\n\t"
  160173. #endif
  160174. "# A[12] * B[7]\n\t"
  160175. "mov %[a], r9\n\t"
  160176. "mov %[b], r10\n\t"
  160177. "ldr %[a], [%[a], #48]\n\t"
  160178. "ldr %[b], [%[b], #28]\n\t"
  160179. "uxth r6, %[a]\n\t"
  160180. "uxth r7, %[b]\n\t"
  160181. #ifdef WOLFSSL_KEIL
  160182. "muls r7, r6, r7\n\t"
  160183. #elif defined(__clang__)
  160184. "muls r7, r6\n\t"
  160185. #else
  160186. "mul r7, r6\n\t"
  160187. #endif
  160188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160189. "adds r4, r4, r7\n\t"
  160190. #else
  160191. "add r4, r4, r7\n\t"
  160192. #endif
  160193. #ifdef WOLFSSL_KEIL
  160194. "adcs r5, r5, %[r]\n\t"
  160195. #elif defined(__clang__)
  160196. "adcs r5, %[r]\n\t"
  160197. #else
  160198. "adc r5, %[r]\n\t"
  160199. #endif
  160200. #ifdef WOLFSSL_KEIL
  160201. "adcs r3, r3, %[r]\n\t"
  160202. #elif defined(__clang__)
  160203. "adcs r3, %[r]\n\t"
  160204. #else
  160205. "adc r3, %[r]\n\t"
  160206. #endif
  160207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160208. "lsrs r7, %[b], #16\n\t"
  160209. #else
  160210. "lsr r7, %[b], #16\n\t"
  160211. #endif
  160212. #ifdef WOLFSSL_KEIL
  160213. "muls r6, r7, r6\n\t"
  160214. #elif defined(__clang__)
  160215. "muls r6, r7\n\t"
  160216. #else
  160217. "mul r6, r7\n\t"
  160218. #endif
  160219. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160220. "lsrs r7, r6, #16\n\t"
  160221. #else
  160222. "lsr r7, r6, #16\n\t"
  160223. #endif
  160224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160225. "lsls r6, r6, #16\n\t"
  160226. #else
  160227. "lsl r6, r6, #16\n\t"
  160228. #endif
  160229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160230. "adds r4, r4, r6\n\t"
  160231. #else
  160232. "add r4, r4, r6\n\t"
  160233. #endif
  160234. #ifdef WOLFSSL_KEIL
  160235. "adcs r5, r5, r7\n\t"
  160236. #elif defined(__clang__)
  160237. "adcs r5, r7\n\t"
  160238. #else
  160239. "adc r5, r7\n\t"
  160240. #endif
  160241. #ifdef WOLFSSL_KEIL
  160242. "adcs r3, r3, %[r]\n\t"
  160243. #elif defined(__clang__)
  160244. "adcs r3, %[r]\n\t"
  160245. #else
  160246. "adc r3, %[r]\n\t"
  160247. #endif
  160248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160249. "lsrs r6, %[a], #16\n\t"
  160250. #else
  160251. "lsr r6, %[a], #16\n\t"
  160252. #endif
  160253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160254. "lsrs r7, %[b], #16\n\t"
  160255. #else
  160256. "lsr r7, %[b], #16\n\t"
  160257. #endif
  160258. #ifdef WOLFSSL_KEIL
  160259. "muls r7, r6, r7\n\t"
  160260. #elif defined(__clang__)
  160261. "muls r7, r6\n\t"
  160262. #else
  160263. "mul r7, r6\n\t"
  160264. #endif
  160265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160266. "adds r5, r5, r7\n\t"
  160267. #else
  160268. "add r5, r5, r7\n\t"
  160269. #endif
  160270. #ifdef WOLFSSL_KEIL
  160271. "adcs r3, r3, %[r]\n\t"
  160272. #elif defined(__clang__)
  160273. "adcs r3, %[r]\n\t"
  160274. #else
  160275. "adc r3, %[r]\n\t"
  160276. #endif
  160277. "uxth r7, %[b]\n\t"
  160278. #ifdef WOLFSSL_KEIL
  160279. "muls r6, r7, r6\n\t"
  160280. #elif defined(__clang__)
  160281. "muls r6, r7\n\t"
  160282. #else
  160283. "mul r6, r7\n\t"
  160284. #endif
  160285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160286. "lsrs r7, r6, #16\n\t"
  160287. #else
  160288. "lsr r7, r6, #16\n\t"
  160289. #endif
  160290. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160291. "lsls r6, r6, #16\n\t"
  160292. #else
  160293. "lsl r6, r6, #16\n\t"
  160294. #endif
  160295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160296. "adds r4, r4, r6\n\t"
  160297. #else
  160298. "add r4, r4, r6\n\t"
  160299. #endif
  160300. #ifdef WOLFSSL_KEIL
  160301. "adcs r5, r5, r7\n\t"
  160302. #elif defined(__clang__)
  160303. "adcs r5, r7\n\t"
  160304. #else
  160305. "adc r5, r7\n\t"
  160306. #endif
  160307. #ifdef WOLFSSL_KEIL
  160308. "adcs r3, r3, %[r]\n\t"
  160309. #elif defined(__clang__)
  160310. "adcs r3, %[r]\n\t"
  160311. #else
  160312. "adc r3, %[r]\n\t"
  160313. #endif
  160314. "# A[13] * B[6]\n\t"
  160315. "mov %[a], r9\n\t"
  160316. "mov %[b], r10\n\t"
  160317. "ldr %[a], [%[a], #52]\n\t"
  160318. "ldr %[b], [%[b], #24]\n\t"
  160319. "uxth r6, %[a]\n\t"
  160320. "uxth r7, %[b]\n\t"
  160321. #ifdef WOLFSSL_KEIL
  160322. "muls r7, r6, r7\n\t"
  160323. #elif defined(__clang__)
  160324. "muls r7, r6\n\t"
  160325. #else
  160326. "mul r7, r6\n\t"
  160327. #endif
  160328. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160329. "adds r4, r4, r7\n\t"
  160330. #else
  160331. "add r4, r4, r7\n\t"
  160332. #endif
  160333. #ifdef WOLFSSL_KEIL
  160334. "adcs r5, r5, %[r]\n\t"
  160335. #elif defined(__clang__)
  160336. "adcs r5, %[r]\n\t"
  160337. #else
  160338. "adc r5, %[r]\n\t"
  160339. #endif
  160340. #ifdef WOLFSSL_KEIL
  160341. "adcs r3, r3, %[r]\n\t"
  160342. #elif defined(__clang__)
  160343. "adcs r3, %[r]\n\t"
  160344. #else
  160345. "adc r3, %[r]\n\t"
  160346. #endif
  160347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160348. "lsrs r7, %[b], #16\n\t"
  160349. #else
  160350. "lsr r7, %[b], #16\n\t"
  160351. #endif
  160352. #ifdef WOLFSSL_KEIL
  160353. "muls r6, r7, r6\n\t"
  160354. #elif defined(__clang__)
  160355. "muls r6, r7\n\t"
  160356. #else
  160357. "mul r6, r7\n\t"
  160358. #endif
  160359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160360. "lsrs r7, r6, #16\n\t"
  160361. #else
  160362. "lsr r7, r6, #16\n\t"
  160363. #endif
  160364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160365. "lsls r6, r6, #16\n\t"
  160366. #else
  160367. "lsl r6, r6, #16\n\t"
  160368. #endif
  160369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160370. "adds r4, r4, r6\n\t"
  160371. #else
  160372. "add r4, r4, r6\n\t"
  160373. #endif
  160374. #ifdef WOLFSSL_KEIL
  160375. "adcs r5, r5, r7\n\t"
  160376. #elif defined(__clang__)
  160377. "adcs r5, r7\n\t"
  160378. #else
  160379. "adc r5, r7\n\t"
  160380. #endif
  160381. #ifdef WOLFSSL_KEIL
  160382. "adcs r3, r3, %[r]\n\t"
  160383. #elif defined(__clang__)
  160384. "adcs r3, %[r]\n\t"
  160385. #else
  160386. "adc r3, %[r]\n\t"
  160387. #endif
  160388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160389. "lsrs r6, %[a], #16\n\t"
  160390. #else
  160391. "lsr r6, %[a], #16\n\t"
  160392. #endif
  160393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160394. "lsrs r7, %[b], #16\n\t"
  160395. #else
  160396. "lsr r7, %[b], #16\n\t"
  160397. #endif
  160398. #ifdef WOLFSSL_KEIL
  160399. "muls r7, r6, r7\n\t"
  160400. #elif defined(__clang__)
  160401. "muls r7, r6\n\t"
  160402. #else
  160403. "mul r7, r6\n\t"
  160404. #endif
  160405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160406. "adds r5, r5, r7\n\t"
  160407. #else
  160408. "add r5, r5, r7\n\t"
  160409. #endif
  160410. #ifdef WOLFSSL_KEIL
  160411. "adcs r3, r3, %[r]\n\t"
  160412. #elif defined(__clang__)
  160413. "adcs r3, %[r]\n\t"
  160414. #else
  160415. "adc r3, %[r]\n\t"
  160416. #endif
  160417. "uxth r7, %[b]\n\t"
  160418. #ifdef WOLFSSL_KEIL
  160419. "muls r6, r7, r6\n\t"
  160420. #elif defined(__clang__)
  160421. "muls r6, r7\n\t"
  160422. #else
  160423. "mul r6, r7\n\t"
  160424. #endif
  160425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160426. "lsrs r7, r6, #16\n\t"
  160427. #else
  160428. "lsr r7, r6, #16\n\t"
  160429. #endif
  160430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160431. "lsls r6, r6, #16\n\t"
  160432. #else
  160433. "lsl r6, r6, #16\n\t"
  160434. #endif
  160435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160436. "adds r4, r4, r6\n\t"
  160437. #else
  160438. "add r4, r4, r6\n\t"
  160439. #endif
  160440. #ifdef WOLFSSL_KEIL
  160441. "adcs r5, r5, r7\n\t"
  160442. #elif defined(__clang__)
  160443. "adcs r5, r7\n\t"
  160444. #else
  160445. "adc r5, r7\n\t"
  160446. #endif
  160447. #ifdef WOLFSSL_KEIL
  160448. "adcs r3, r3, %[r]\n\t"
  160449. #elif defined(__clang__)
  160450. "adcs r3, %[r]\n\t"
  160451. #else
  160452. "adc r3, %[r]\n\t"
  160453. #endif
  160454. "# A[14] * B[5]\n\t"
  160455. "mov %[a], r9\n\t"
  160456. "mov %[b], r10\n\t"
  160457. "ldr %[a], [%[a], #56]\n\t"
  160458. "ldr %[b], [%[b], #20]\n\t"
  160459. "uxth r6, %[a]\n\t"
  160460. "uxth r7, %[b]\n\t"
  160461. #ifdef WOLFSSL_KEIL
  160462. "muls r7, r6, r7\n\t"
  160463. #elif defined(__clang__)
  160464. "muls r7, r6\n\t"
  160465. #else
  160466. "mul r7, r6\n\t"
  160467. #endif
  160468. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160469. "adds r4, r4, r7\n\t"
  160470. #else
  160471. "add r4, r4, r7\n\t"
  160472. #endif
  160473. #ifdef WOLFSSL_KEIL
  160474. "adcs r5, r5, %[r]\n\t"
  160475. #elif defined(__clang__)
  160476. "adcs r5, %[r]\n\t"
  160477. #else
  160478. "adc r5, %[r]\n\t"
  160479. #endif
  160480. #ifdef WOLFSSL_KEIL
  160481. "adcs r3, r3, %[r]\n\t"
  160482. #elif defined(__clang__)
  160483. "adcs r3, %[r]\n\t"
  160484. #else
  160485. "adc r3, %[r]\n\t"
  160486. #endif
  160487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160488. "lsrs r7, %[b], #16\n\t"
  160489. #else
  160490. "lsr r7, %[b], #16\n\t"
  160491. #endif
  160492. #ifdef WOLFSSL_KEIL
  160493. "muls r6, r7, r6\n\t"
  160494. #elif defined(__clang__)
  160495. "muls r6, r7\n\t"
  160496. #else
  160497. "mul r6, r7\n\t"
  160498. #endif
  160499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160500. "lsrs r7, r6, #16\n\t"
  160501. #else
  160502. "lsr r7, r6, #16\n\t"
  160503. #endif
  160504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160505. "lsls r6, r6, #16\n\t"
  160506. #else
  160507. "lsl r6, r6, #16\n\t"
  160508. #endif
  160509. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160510. "adds r4, r4, r6\n\t"
  160511. #else
  160512. "add r4, r4, r6\n\t"
  160513. #endif
  160514. #ifdef WOLFSSL_KEIL
  160515. "adcs r5, r5, r7\n\t"
  160516. #elif defined(__clang__)
  160517. "adcs r5, r7\n\t"
  160518. #else
  160519. "adc r5, r7\n\t"
  160520. #endif
  160521. #ifdef WOLFSSL_KEIL
  160522. "adcs r3, r3, %[r]\n\t"
  160523. #elif defined(__clang__)
  160524. "adcs r3, %[r]\n\t"
  160525. #else
  160526. "adc r3, %[r]\n\t"
  160527. #endif
  160528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160529. "lsrs r6, %[a], #16\n\t"
  160530. #else
  160531. "lsr r6, %[a], #16\n\t"
  160532. #endif
  160533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160534. "lsrs r7, %[b], #16\n\t"
  160535. #else
  160536. "lsr r7, %[b], #16\n\t"
  160537. #endif
  160538. #ifdef WOLFSSL_KEIL
  160539. "muls r7, r6, r7\n\t"
  160540. #elif defined(__clang__)
  160541. "muls r7, r6\n\t"
  160542. #else
  160543. "mul r7, r6\n\t"
  160544. #endif
  160545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160546. "adds r5, r5, r7\n\t"
  160547. #else
  160548. "add r5, r5, r7\n\t"
  160549. #endif
  160550. #ifdef WOLFSSL_KEIL
  160551. "adcs r3, r3, %[r]\n\t"
  160552. #elif defined(__clang__)
  160553. "adcs r3, %[r]\n\t"
  160554. #else
  160555. "adc r3, %[r]\n\t"
  160556. #endif
  160557. "uxth r7, %[b]\n\t"
  160558. #ifdef WOLFSSL_KEIL
  160559. "muls r6, r7, r6\n\t"
  160560. #elif defined(__clang__)
  160561. "muls r6, r7\n\t"
  160562. #else
  160563. "mul r6, r7\n\t"
  160564. #endif
  160565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160566. "lsrs r7, r6, #16\n\t"
  160567. #else
  160568. "lsr r7, r6, #16\n\t"
  160569. #endif
  160570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160571. "lsls r6, r6, #16\n\t"
  160572. #else
  160573. "lsl r6, r6, #16\n\t"
  160574. #endif
  160575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160576. "adds r4, r4, r6\n\t"
  160577. #else
  160578. "add r4, r4, r6\n\t"
  160579. #endif
  160580. #ifdef WOLFSSL_KEIL
  160581. "adcs r5, r5, r7\n\t"
  160582. #elif defined(__clang__)
  160583. "adcs r5, r7\n\t"
  160584. #else
  160585. "adc r5, r7\n\t"
  160586. #endif
  160587. #ifdef WOLFSSL_KEIL
  160588. "adcs r3, r3, %[r]\n\t"
  160589. #elif defined(__clang__)
  160590. "adcs r3, %[r]\n\t"
  160591. #else
  160592. "adc r3, %[r]\n\t"
  160593. #endif
  160594. "# A[15] * B[4]\n\t"
  160595. "mov %[a], r9\n\t"
  160596. "mov %[b], r10\n\t"
  160597. "ldr %[a], [%[a], #60]\n\t"
  160598. "ldr %[b], [%[b], #16]\n\t"
  160599. "uxth r6, %[a]\n\t"
  160600. "uxth r7, %[b]\n\t"
  160601. #ifdef WOLFSSL_KEIL
  160602. "muls r7, r6, r7\n\t"
  160603. #elif defined(__clang__)
  160604. "muls r7, r6\n\t"
  160605. #else
  160606. "mul r7, r6\n\t"
  160607. #endif
  160608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160609. "adds r4, r4, r7\n\t"
  160610. #else
  160611. "add r4, r4, r7\n\t"
  160612. #endif
  160613. #ifdef WOLFSSL_KEIL
  160614. "adcs r5, r5, %[r]\n\t"
  160615. #elif defined(__clang__)
  160616. "adcs r5, %[r]\n\t"
  160617. #else
  160618. "adc r5, %[r]\n\t"
  160619. #endif
  160620. #ifdef WOLFSSL_KEIL
  160621. "adcs r3, r3, %[r]\n\t"
  160622. #elif defined(__clang__)
  160623. "adcs r3, %[r]\n\t"
  160624. #else
  160625. "adc r3, %[r]\n\t"
  160626. #endif
  160627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160628. "lsrs r7, %[b], #16\n\t"
  160629. #else
  160630. "lsr r7, %[b], #16\n\t"
  160631. #endif
  160632. #ifdef WOLFSSL_KEIL
  160633. "muls r6, r7, r6\n\t"
  160634. #elif defined(__clang__)
  160635. "muls r6, r7\n\t"
  160636. #else
  160637. "mul r6, r7\n\t"
  160638. #endif
  160639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160640. "lsrs r7, r6, #16\n\t"
  160641. #else
  160642. "lsr r7, r6, #16\n\t"
  160643. #endif
  160644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160645. "lsls r6, r6, #16\n\t"
  160646. #else
  160647. "lsl r6, r6, #16\n\t"
  160648. #endif
  160649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160650. "adds r4, r4, r6\n\t"
  160651. #else
  160652. "add r4, r4, r6\n\t"
  160653. #endif
  160654. #ifdef WOLFSSL_KEIL
  160655. "adcs r5, r5, r7\n\t"
  160656. #elif defined(__clang__)
  160657. "adcs r5, r7\n\t"
  160658. #else
  160659. "adc r5, r7\n\t"
  160660. #endif
  160661. #ifdef WOLFSSL_KEIL
  160662. "adcs r3, r3, %[r]\n\t"
  160663. #elif defined(__clang__)
  160664. "adcs r3, %[r]\n\t"
  160665. #else
  160666. "adc r3, %[r]\n\t"
  160667. #endif
  160668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160669. "lsrs r6, %[a], #16\n\t"
  160670. #else
  160671. "lsr r6, %[a], #16\n\t"
  160672. #endif
  160673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160674. "lsrs r7, %[b], #16\n\t"
  160675. #else
  160676. "lsr r7, %[b], #16\n\t"
  160677. #endif
  160678. #ifdef WOLFSSL_KEIL
  160679. "muls r7, r6, r7\n\t"
  160680. #elif defined(__clang__)
  160681. "muls r7, r6\n\t"
  160682. #else
  160683. "mul r7, r6\n\t"
  160684. #endif
  160685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160686. "adds r5, r5, r7\n\t"
  160687. #else
  160688. "add r5, r5, r7\n\t"
  160689. #endif
  160690. #ifdef WOLFSSL_KEIL
  160691. "adcs r3, r3, %[r]\n\t"
  160692. #elif defined(__clang__)
  160693. "adcs r3, %[r]\n\t"
  160694. #else
  160695. "adc r3, %[r]\n\t"
  160696. #endif
  160697. "uxth r7, %[b]\n\t"
  160698. #ifdef WOLFSSL_KEIL
  160699. "muls r6, r7, r6\n\t"
  160700. #elif defined(__clang__)
  160701. "muls r6, r7\n\t"
  160702. #else
  160703. "mul r6, r7\n\t"
  160704. #endif
  160705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160706. "lsrs r7, r6, #16\n\t"
  160707. #else
  160708. "lsr r7, r6, #16\n\t"
  160709. #endif
  160710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160711. "lsls r6, r6, #16\n\t"
  160712. #else
  160713. "lsl r6, r6, #16\n\t"
  160714. #endif
  160715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160716. "adds r4, r4, r6\n\t"
  160717. #else
  160718. "add r4, r4, r6\n\t"
  160719. #endif
  160720. #ifdef WOLFSSL_KEIL
  160721. "adcs r5, r5, r7\n\t"
  160722. #elif defined(__clang__)
  160723. "adcs r5, r7\n\t"
  160724. #else
  160725. "adc r5, r7\n\t"
  160726. #endif
  160727. #ifdef WOLFSSL_KEIL
  160728. "adcs r3, r3, %[r]\n\t"
  160729. #elif defined(__clang__)
  160730. "adcs r3, %[r]\n\t"
  160731. #else
  160732. "adc r3, %[r]\n\t"
  160733. #endif
  160734. "mov %[r], r8\n\t"
  160735. "str r4, [%[r], #76]\n\t"
  160736. "movs %[r], #0\n\t"
  160737. "# A[15] * B[5]\n\t"
  160738. "movs r4, #0\n\t"
  160739. "mov %[a], r9\n\t"
  160740. "mov %[b], r10\n\t"
  160741. "ldr %[a], [%[a], #60]\n\t"
  160742. "ldr %[b], [%[b], #20]\n\t"
  160743. "uxth r6, %[a]\n\t"
  160744. "uxth r7, %[b]\n\t"
  160745. #ifdef WOLFSSL_KEIL
  160746. "muls r7, r6, r7\n\t"
  160747. #elif defined(__clang__)
  160748. "muls r7, r6\n\t"
  160749. #else
  160750. "mul r7, r6\n\t"
  160751. #endif
  160752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160753. "adds r5, r5, r7\n\t"
  160754. #else
  160755. "add r5, r5, r7\n\t"
  160756. #endif
  160757. #ifdef WOLFSSL_KEIL
  160758. "adcs r3, r3, %[r]\n\t"
  160759. #elif defined(__clang__)
  160760. "adcs r3, %[r]\n\t"
  160761. #else
  160762. "adc r3, %[r]\n\t"
  160763. #endif
  160764. #ifdef WOLFSSL_KEIL
  160765. "adcs r4, r4, %[r]\n\t"
  160766. #elif defined(__clang__)
  160767. "adcs r4, %[r]\n\t"
  160768. #else
  160769. "adc r4, %[r]\n\t"
  160770. #endif
  160771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160772. "lsrs r7, %[b], #16\n\t"
  160773. #else
  160774. "lsr r7, %[b], #16\n\t"
  160775. #endif
  160776. #ifdef WOLFSSL_KEIL
  160777. "muls r6, r7, r6\n\t"
  160778. #elif defined(__clang__)
  160779. "muls r6, r7\n\t"
  160780. #else
  160781. "mul r6, r7\n\t"
  160782. #endif
  160783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160784. "lsrs r7, r6, #16\n\t"
  160785. #else
  160786. "lsr r7, r6, #16\n\t"
  160787. #endif
  160788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160789. "lsls r6, r6, #16\n\t"
  160790. #else
  160791. "lsl r6, r6, #16\n\t"
  160792. #endif
  160793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160794. "adds r5, r5, r6\n\t"
  160795. #else
  160796. "add r5, r5, r6\n\t"
  160797. #endif
  160798. #ifdef WOLFSSL_KEIL
  160799. "adcs r3, r3, r7\n\t"
  160800. #elif defined(__clang__)
  160801. "adcs r3, r7\n\t"
  160802. #else
  160803. "adc r3, r7\n\t"
  160804. #endif
  160805. #ifdef WOLFSSL_KEIL
  160806. "adcs r4, r4, %[r]\n\t"
  160807. #elif defined(__clang__)
  160808. "adcs r4, %[r]\n\t"
  160809. #else
  160810. "adc r4, %[r]\n\t"
  160811. #endif
  160812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160813. "lsrs r6, %[a], #16\n\t"
  160814. #else
  160815. "lsr r6, %[a], #16\n\t"
  160816. #endif
  160817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160818. "lsrs r7, %[b], #16\n\t"
  160819. #else
  160820. "lsr r7, %[b], #16\n\t"
  160821. #endif
  160822. #ifdef WOLFSSL_KEIL
  160823. "muls r7, r6, r7\n\t"
  160824. #elif defined(__clang__)
  160825. "muls r7, r6\n\t"
  160826. #else
  160827. "mul r7, r6\n\t"
  160828. #endif
  160829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160830. "adds r3, r3, r7\n\t"
  160831. #else
  160832. "add r3, r3, r7\n\t"
  160833. #endif
  160834. #ifdef WOLFSSL_KEIL
  160835. "adcs r4, r4, %[r]\n\t"
  160836. #elif defined(__clang__)
  160837. "adcs r4, %[r]\n\t"
  160838. #else
  160839. "adc r4, %[r]\n\t"
  160840. #endif
  160841. "uxth r7, %[b]\n\t"
  160842. #ifdef WOLFSSL_KEIL
  160843. "muls r6, r7, r6\n\t"
  160844. #elif defined(__clang__)
  160845. "muls r6, r7\n\t"
  160846. #else
  160847. "mul r6, r7\n\t"
  160848. #endif
  160849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160850. "lsrs r7, r6, #16\n\t"
  160851. #else
  160852. "lsr r7, r6, #16\n\t"
  160853. #endif
  160854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160855. "lsls r6, r6, #16\n\t"
  160856. #else
  160857. "lsl r6, r6, #16\n\t"
  160858. #endif
  160859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160860. "adds r5, r5, r6\n\t"
  160861. #else
  160862. "add r5, r5, r6\n\t"
  160863. #endif
  160864. #ifdef WOLFSSL_KEIL
  160865. "adcs r3, r3, r7\n\t"
  160866. #elif defined(__clang__)
  160867. "adcs r3, r7\n\t"
  160868. #else
  160869. "adc r3, r7\n\t"
  160870. #endif
  160871. #ifdef WOLFSSL_KEIL
  160872. "adcs r4, r4, %[r]\n\t"
  160873. #elif defined(__clang__)
  160874. "adcs r4, %[r]\n\t"
  160875. #else
  160876. "adc r4, %[r]\n\t"
  160877. #endif
  160878. "# A[14] * B[6]\n\t"
  160879. "mov %[a], r9\n\t"
  160880. "mov %[b], r10\n\t"
  160881. "ldr %[a], [%[a], #56]\n\t"
  160882. "ldr %[b], [%[b], #24]\n\t"
  160883. "uxth r6, %[a]\n\t"
  160884. "uxth r7, %[b]\n\t"
  160885. #ifdef WOLFSSL_KEIL
  160886. "muls r7, r6, r7\n\t"
  160887. #elif defined(__clang__)
  160888. "muls r7, r6\n\t"
  160889. #else
  160890. "mul r7, r6\n\t"
  160891. #endif
  160892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160893. "adds r5, r5, r7\n\t"
  160894. #else
  160895. "add r5, r5, r7\n\t"
  160896. #endif
  160897. #ifdef WOLFSSL_KEIL
  160898. "adcs r3, r3, %[r]\n\t"
  160899. #elif defined(__clang__)
  160900. "adcs r3, %[r]\n\t"
  160901. #else
  160902. "adc r3, %[r]\n\t"
  160903. #endif
  160904. #ifdef WOLFSSL_KEIL
  160905. "adcs r4, r4, %[r]\n\t"
  160906. #elif defined(__clang__)
  160907. "adcs r4, %[r]\n\t"
  160908. #else
  160909. "adc r4, %[r]\n\t"
  160910. #endif
  160911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160912. "lsrs r7, %[b], #16\n\t"
  160913. #else
  160914. "lsr r7, %[b], #16\n\t"
  160915. #endif
  160916. #ifdef WOLFSSL_KEIL
  160917. "muls r6, r7, r6\n\t"
  160918. #elif defined(__clang__)
  160919. "muls r6, r7\n\t"
  160920. #else
  160921. "mul r6, r7\n\t"
  160922. #endif
  160923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160924. "lsrs r7, r6, #16\n\t"
  160925. #else
  160926. "lsr r7, r6, #16\n\t"
  160927. #endif
  160928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160929. "lsls r6, r6, #16\n\t"
  160930. #else
  160931. "lsl r6, r6, #16\n\t"
  160932. #endif
  160933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160934. "adds r5, r5, r6\n\t"
  160935. #else
  160936. "add r5, r5, r6\n\t"
  160937. #endif
  160938. #ifdef WOLFSSL_KEIL
  160939. "adcs r3, r3, r7\n\t"
  160940. #elif defined(__clang__)
  160941. "adcs r3, r7\n\t"
  160942. #else
  160943. "adc r3, r7\n\t"
  160944. #endif
  160945. #ifdef WOLFSSL_KEIL
  160946. "adcs r4, r4, %[r]\n\t"
  160947. #elif defined(__clang__)
  160948. "adcs r4, %[r]\n\t"
  160949. #else
  160950. "adc r4, %[r]\n\t"
  160951. #endif
  160952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160953. "lsrs r6, %[a], #16\n\t"
  160954. #else
  160955. "lsr r6, %[a], #16\n\t"
  160956. #endif
  160957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160958. "lsrs r7, %[b], #16\n\t"
  160959. #else
  160960. "lsr r7, %[b], #16\n\t"
  160961. #endif
  160962. #ifdef WOLFSSL_KEIL
  160963. "muls r7, r6, r7\n\t"
  160964. #elif defined(__clang__)
  160965. "muls r7, r6\n\t"
  160966. #else
  160967. "mul r7, r6\n\t"
  160968. #endif
  160969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160970. "adds r3, r3, r7\n\t"
  160971. #else
  160972. "add r3, r3, r7\n\t"
  160973. #endif
  160974. #ifdef WOLFSSL_KEIL
  160975. "adcs r4, r4, %[r]\n\t"
  160976. #elif defined(__clang__)
  160977. "adcs r4, %[r]\n\t"
  160978. #else
  160979. "adc r4, %[r]\n\t"
  160980. #endif
  160981. "uxth r7, %[b]\n\t"
  160982. #ifdef WOLFSSL_KEIL
  160983. "muls r6, r7, r6\n\t"
  160984. #elif defined(__clang__)
  160985. "muls r6, r7\n\t"
  160986. #else
  160987. "mul r6, r7\n\t"
  160988. #endif
  160989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160990. "lsrs r7, r6, #16\n\t"
  160991. #else
  160992. "lsr r7, r6, #16\n\t"
  160993. #endif
  160994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  160995. "lsls r6, r6, #16\n\t"
  160996. #else
  160997. "lsl r6, r6, #16\n\t"
  160998. #endif
  160999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161000. "adds r5, r5, r6\n\t"
  161001. #else
  161002. "add r5, r5, r6\n\t"
  161003. #endif
  161004. #ifdef WOLFSSL_KEIL
  161005. "adcs r3, r3, r7\n\t"
  161006. #elif defined(__clang__)
  161007. "adcs r3, r7\n\t"
  161008. #else
  161009. "adc r3, r7\n\t"
  161010. #endif
  161011. #ifdef WOLFSSL_KEIL
  161012. "adcs r4, r4, %[r]\n\t"
  161013. #elif defined(__clang__)
  161014. "adcs r4, %[r]\n\t"
  161015. #else
  161016. "adc r4, %[r]\n\t"
  161017. #endif
  161018. "# A[13] * B[7]\n\t"
  161019. "mov %[a], r9\n\t"
  161020. "mov %[b], r10\n\t"
  161021. "ldr %[a], [%[a], #52]\n\t"
  161022. "ldr %[b], [%[b], #28]\n\t"
  161023. "uxth r6, %[a]\n\t"
  161024. "uxth r7, %[b]\n\t"
  161025. #ifdef WOLFSSL_KEIL
  161026. "muls r7, r6, r7\n\t"
  161027. #elif defined(__clang__)
  161028. "muls r7, r6\n\t"
  161029. #else
  161030. "mul r7, r6\n\t"
  161031. #endif
  161032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161033. "adds r5, r5, r7\n\t"
  161034. #else
  161035. "add r5, r5, r7\n\t"
  161036. #endif
  161037. #ifdef WOLFSSL_KEIL
  161038. "adcs r3, r3, %[r]\n\t"
  161039. #elif defined(__clang__)
  161040. "adcs r3, %[r]\n\t"
  161041. #else
  161042. "adc r3, %[r]\n\t"
  161043. #endif
  161044. #ifdef WOLFSSL_KEIL
  161045. "adcs r4, r4, %[r]\n\t"
  161046. #elif defined(__clang__)
  161047. "adcs r4, %[r]\n\t"
  161048. #else
  161049. "adc r4, %[r]\n\t"
  161050. #endif
  161051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161052. "lsrs r7, %[b], #16\n\t"
  161053. #else
  161054. "lsr r7, %[b], #16\n\t"
  161055. #endif
  161056. #ifdef WOLFSSL_KEIL
  161057. "muls r6, r7, r6\n\t"
  161058. #elif defined(__clang__)
  161059. "muls r6, r7\n\t"
  161060. #else
  161061. "mul r6, r7\n\t"
  161062. #endif
  161063. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161064. "lsrs r7, r6, #16\n\t"
  161065. #else
  161066. "lsr r7, r6, #16\n\t"
  161067. #endif
  161068. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161069. "lsls r6, r6, #16\n\t"
  161070. #else
  161071. "lsl r6, r6, #16\n\t"
  161072. #endif
  161073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161074. "adds r5, r5, r6\n\t"
  161075. #else
  161076. "add r5, r5, r6\n\t"
  161077. #endif
  161078. #ifdef WOLFSSL_KEIL
  161079. "adcs r3, r3, r7\n\t"
  161080. #elif defined(__clang__)
  161081. "adcs r3, r7\n\t"
  161082. #else
  161083. "adc r3, r7\n\t"
  161084. #endif
  161085. #ifdef WOLFSSL_KEIL
  161086. "adcs r4, r4, %[r]\n\t"
  161087. #elif defined(__clang__)
  161088. "adcs r4, %[r]\n\t"
  161089. #else
  161090. "adc r4, %[r]\n\t"
  161091. #endif
  161092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161093. "lsrs r6, %[a], #16\n\t"
  161094. #else
  161095. "lsr r6, %[a], #16\n\t"
  161096. #endif
  161097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161098. "lsrs r7, %[b], #16\n\t"
  161099. #else
  161100. "lsr r7, %[b], #16\n\t"
  161101. #endif
  161102. #ifdef WOLFSSL_KEIL
  161103. "muls r7, r6, r7\n\t"
  161104. #elif defined(__clang__)
  161105. "muls r7, r6\n\t"
  161106. #else
  161107. "mul r7, r6\n\t"
  161108. #endif
  161109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161110. "adds r3, r3, r7\n\t"
  161111. #else
  161112. "add r3, r3, r7\n\t"
  161113. #endif
  161114. #ifdef WOLFSSL_KEIL
  161115. "adcs r4, r4, %[r]\n\t"
  161116. #elif defined(__clang__)
  161117. "adcs r4, %[r]\n\t"
  161118. #else
  161119. "adc r4, %[r]\n\t"
  161120. #endif
  161121. "uxth r7, %[b]\n\t"
  161122. #ifdef WOLFSSL_KEIL
  161123. "muls r6, r7, r6\n\t"
  161124. #elif defined(__clang__)
  161125. "muls r6, r7\n\t"
  161126. #else
  161127. "mul r6, r7\n\t"
  161128. #endif
  161129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161130. "lsrs r7, r6, #16\n\t"
  161131. #else
  161132. "lsr r7, r6, #16\n\t"
  161133. #endif
  161134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161135. "lsls r6, r6, #16\n\t"
  161136. #else
  161137. "lsl r6, r6, #16\n\t"
  161138. #endif
  161139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161140. "adds r5, r5, r6\n\t"
  161141. #else
  161142. "add r5, r5, r6\n\t"
  161143. #endif
  161144. #ifdef WOLFSSL_KEIL
  161145. "adcs r3, r3, r7\n\t"
  161146. #elif defined(__clang__)
  161147. "adcs r3, r7\n\t"
  161148. #else
  161149. "adc r3, r7\n\t"
  161150. #endif
  161151. #ifdef WOLFSSL_KEIL
  161152. "adcs r4, r4, %[r]\n\t"
  161153. #elif defined(__clang__)
  161154. "adcs r4, %[r]\n\t"
  161155. #else
  161156. "adc r4, %[r]\n\t"
  161157. #endif
  161158. "# A[12] * B[8]\n\t"
  161159. "mov %[a], r9\n\t"
  161160. "mov %[b], r10\n\t"
  161161. "ldr %[a], [%[a], #48]\n\t"
  161162. "ldr %[b], [%[b], #32]\n\t"
  161163. "uxth r6, %[a]\n\t"
  161164. "uxth r7, %[b]\n\t"
  161165. #ifdef WOLFSSL_KEIL
  161166. "muls r7, r6, r7\n\t"
  161167. #elif defined(__clang__)
  161168. "muls r7, r6\n\t"
  161169. #else
  161170. "mul r7, r6\n\t"
  161171. #endif
  161172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161173. "adds r5, r5, r7\n\t"
  161174. #else
  161175. "add r5, r5, r7\n\t"
  161176. #endif
  161177. #ifdef WOLFSSL_KEIL
  161178. "adcs r3, r3, %[r]\n\t"
  161179. #elif defined(__clang__)
  161180. "adcs r3, %[r]\n\t"
  161181. #else
  161182. "adc r3, %[r]\n\t"
  161183. #endif
  161184. #ifdef WOLFSSL_KEIL
  161185. "adcs r4, r4, %[r]\n\t"
  161186. #elif defined(__clang__)
  161187. "adcs r4, %[r]\n\t"
  161188. #else
  161189. "adc r4, %[r]\n\t"
  161190. #endif
  161191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161192. "lsrs r7, %[b], #16\n\t"
  161193. #else
  161194. "lsr r7, %[b], #16\n\t"
  161195. #endif
  161196. #ifdef WOLFSSL_KEIL
  161197. "muls r6, r7, r6\n\t"
  161198. #elif defined(__clang__)
  161199. "muls r6, r7\n\t"
  161200. #else
  161201. "mul r6, r7\n\t"
  161202. #endif
  161203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161204. "lsrs r7, r6, #16\n\t"
  161205. #else
  161206. "lsr r7, r6, #16\n\t"
  161207. #endif
  161208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161209. "lsls r6, r6, #16\n\t"
  161210. #else
  161211. "lsl r6, r6, #16\n\t"
  161212. #endif
  161213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161214. "adds r5, r5, r6\n\t"
  161215. #else
  161216. "add r5, r5, r6\n\t"
  161217. #endif
  161218. #ifdef WOLFSSL_KEIL
  161219. "adcs r3, r3, r7\n\t"
  161220. #elif defined(__clang__)
  161221. "adcs r3, r7\n\t"
  161222. #else
  161223. "adc r3, r7\n\t"
  161224. #endif
  161225. #ifdef WOLFSSL_KEIL
  161226. "adcs r4, r4, %[r]\n\t"
  161227. #elif defined(__clang__)
  161228. "adcs r4, %[r]\n\t"
  161229. #else
  161230. "adc r4, %[r]\n\t"
  161231. #endif
  161232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161233. "lsrs r6, %[a], #16\n\t"
  161234. #else
  161235. "lsr r6, %[a], #16\n\t"
  161236. #endif
  161237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161238. "lsrs r7, %[b], #16\n\t"
  161239. #else
  161240. "lsr r7, %[b], #16\n\t"
  161241. #endif
  161242. #ifdef WOLFSSL_KEIL
  161243. "muls r7, r6, r7\n\t"
  161244. #elif defined(__clang__)
  161245. "muls r7, r6\n\t"
  161246. #else
  161247. "mul r7, r6\n\t"
  161248. #endif
  161249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161250. "adds r3, r3, r7\n\t"
  161251. #else
  161252. "add r3, r3, r7\n\t"
  161253. #endif
  161254. #ifdef WOLFSSL_KEIL
  161255. "adcs r4, r4, %[r]\n\t"
  161256. #elif defined(__clang__)
  161257. "adcs r4, %[r]\n\t"
  161258. #else
  161259. "adc r4, %[r]\n\t"
  161260. #endif
  161261. "uxth r7, %[b]\n\t"
  161262. #ifdef WOLFSSL_KEIL
  161263. "muls r6, r7, r6\n\t"
  161264. #elif defined(__clang__)
  161265. "muls r6, r7\n\t"
  161266. #else
  161267. "mul r6, r7\n\t"
  161268. #endif
  161269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161270. "lsrs r7, r6, #16\n\t"
  161271. #else
  161272. "lsr r7, r6, #16\n\t"
  161273. #endif
  161274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161275. "lsls r6, r6, #16\n\t"
  161276. #else
  161277. "lsl r6, r6, #16\n\t"
  161278. #endif
  161279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161280. "adds r5, r5, r6\n\t"
  161281. #else
  161282. "add r5, r5, r6\n\t"
  161283. #endif
  161284. #ifdef WOLFSSL_KEIL
  161285. "adcs r3, r3, r7\n\t"
  161286. #elif defined(__clang__)
  161287. "adcs r3, r7\n\t"
  161288. #else
  161289. "adc r3, r7\n\t"
  161290. #endif
  161291. #ifdef WOLFSSL_KEIL
  161292. "adcs r4, r4, %[r]\n\t"
  161293. #elif defined(__clang__)
  161294. "adcs r4, %[r]\n\t"
  161295. #else
  161296. "adc r4, %[r]\n\t"
  161297. #endif
  161298. "# A[11] * B[9]\n\t"
  161299. "mov %[a], r9\n\t"
  161300. "mov %[b], r10\n\t"
  161301. "ldr %[a], [%[a], #44]\n\t"
  161302. "ldr %[b], [%[b], #36]\n\t"
  161303. "uxth r6, %[a]\n\t"
  161304. "uxth r7, %[b]\n\t"
  161305. #ifdef WOLFSSL_KEIL
  161306. "muls r7, r6, r7\n\t"
  161307. #elif defined(__clang__)
  161308. "muls r7, r6\n\t"
  161309. #else
  161310. "mul r7, r6\n\t"
  161311. #endif
  161312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161313. "adds r5, r5, r7\n\t"
  161314. #else
  161315. "add r5, r5, r7\n\t"
  161316. #endif
  161317. #ifdef WOLFSSL_KEIL
  161318. "adcs r3, r3, %[r]\n\t"
  161319. #elif defined(__clang__)
  161320. "adcs r3, %[r]\n\t"
  161321. #else
  161322. "adc r3, %[r]\n\t"
  161323. #endif
  161324. #ifdef WOLFSSL_KEIL
  161325. "adcs r4, r4, %[r]\n\t"
  161326. #elif defined(__clang__)
  161327. "adcs r4, %[r]\n\t"
  161328. #else
  161329. "adc r4, %[r]\n\t"
  161330. #endif
  161331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161332. "lsrs r7, %[b], #16\n\t"
  161333. #else
  161334. "lsr r7, %[b], #16\n\t"
  161335. #endif
  161336. #ifdef WOLFSSL_KEIL
  161337. "muls r6, r7, r6\n\t"
  161338. #elif defined(__clang__)
  161339. "muls r6, r7\n\t"
  161340. #else
  161341. "mul r6, r7\n\t"
  161342. #endif
  161343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161344. "lsrs r7, r6, #16\n\t"
  161345. #else
  161346. "lsr r7, r6, #16\n\t"
  161347. #endif
  161348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161349. "lsls r6, r6, #16\n\t"
  161350. #else
  161351. "lsl r6, r6, #16\n\t"
  161352. #endif
  161353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161354. "adds r5, r5, r6\n\t"
  161355. #else
  161356. "add r5, r5, r6\n\t"
  161357. #endif
  161358. #ifdef WOLFSSL_KEIL
  161359. "adcs r3, r3, r7\n\t"
  161360. #elif defined(__clang__)
  161361. "adcs r3, r7\n\t"
  161362. #else
  161363. "adc r3, r7\n\t"
  161364. #endif
  161365. #ifdef WOLFSSL_KEIL
  161366. "adcs r4, r4, %[r]\n\t"
  161367. #elif defined(__clang__)
  161368. "adcs r4, %[r]\n\t"
  161369. #else
  161370. "adc r4, %[r]\n\t"
  161371. #endif
  161372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161373. "lsrs r6, %[a], #16\n\t"
  161374. #else
  161375. "lsr r6, %[a], #16\n\t"
  161376. #endif
  161377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161378. "lsrs r7, %[b], #16\n\t"
  161379. #else
  161380. "lsr r7, %[b], #16\n\t"
  161381. #endif
  161382. #ifdef WOLFSSL_KEIL
  161383. "muls r7, r6, r7\n\t"
  161384. #elif defined(__clang__)
  161385. "muls r7, r6\n\t"
  161386. #else
  161387. "mul r7, r6\n\t"
  161388. #endif
  161389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161390. "adds r3, r3, r7\n\t"
  161391. #else
  161392. "add r3, r3, r7\n\t"
  161393. #endif
  161394. #ifdef WOLFSSL_KEIL
  161395. "adcs r4, r4, %[r]\n\t"
  161396. #elif defined(__clang__)
  161397. "adcs r4, %[r]\n\t"
  161398. #else
  161399. "adc r4, %[r]\n\t"
  161400. #endif
  161401. "uxth r7, %[b]\n\t"
  161402. #ifdef WOLFSSL_KEIL
  161403. "muls r6, r7, r6\n\t"
  161404. #elif defined(__clang__)
  161405. "muls r6, r7\n\t"
  161406. #else
  161407. "mul r6, r7\n\t"
  161408. #endif
  161409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161410. "lsrs r7, r6, #16\n\t"
  161411. #else
  161412. "lsr r7, r6, #16\n\t"
  161413. #endif
  161414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161415. "lsls r6, r6, #16\n\t"
  161416. #else
  161417. "lsl r6, r6, #16\n\t"
  161418. #endif
  161419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161420. "adds r5, r5, r6\n\t"
  161421. #else
  161422. "add r5, r5, r6\n\t"
  161423. #endif
  161424. #ifdef WOLFSSL_KEIL
  161425. "adcs r3, r3, r7\n\t"
  161426. #elif defined(__clang__)
  161427. "adcs r3, r7\n\t"
  161428. #else
  161429. "adc r3, r7\n\t"
  161430. #endif
  161431. #ifdef WOLFSSL_KEIL
  161432. "adcs r4, r4, %[r]\n\t"
  161433. #elif defined(__clang__)
  161434. "adcs r4, %[r]\n\t"
  161435. #else
  161436. "adc r4, %[r]\n\t"
  161437. #endif
  161438. "# A[10] * B[10]\n\t"
  161439. "mov %[a], r9\n\t"
  161440. "mov %[b], r10\n\t"
  161441. "ldr %[a], [%[a], #40]\n\t"
  161442. "ldr %[b], [%[b], #40]\n\t"
  161443. "uxth r6, %[a]\n\t"
  161444. "uxth r7, %[b]\n\t"
  161445. #ifdef WOLFSSL_KEIL
  161446. "muls r7, r6, r7\n\t"
  161447. #elif defined(__clang__)
  161448. "muls r7, r6\n\t"
  161449. #else
  161450. "mul r7, r6\n\t"
  161451. #endif
  161452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161453. "adds r5, r5, r7\n\t"
  161454. #else
  161455. "add r5, r5, r7\n\t"
  161456. #endif
  161457. #ifdef WOLFSSL_KEIL
  161458. "adcs r3, r3, %[r]\n\t"
  161459. #elif defined(__clang__)
  161460. "adcs r3, %[r]\n\t"
  161461. #else
  161462. "adc r3, %[r]\n\t"
  161463. #endif
  161464. #ifdef WOLFSSL_KEIL
  161465. "adcs r4, r4, %[r]\n\t"
  161466. #elif defined(__clang__)
  161467. "adcs r4, %[r]\n\t"
  161468. #else
  161469. "adc r4, %[r]\n\t"
  161470. #endif
  161471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161472. "lsrs r7, %[b], #16\n\t"
  161473. #else
  161474. "lsr r7, %[b], #16\n\t"
  161475. #endif
  161476. #ifdef WOLFSSL_KEIL
  161477. "muls r6, r7, r6\n\t"
  161478. #elif defined(__clang__)
  161479. "muls r6, r7\n\t"
  161480. #else
  161481. "mul r6, r7\n\t"
  161482. #endif
  161483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161484. "lsrs r7, r6, #16\n\t"
  161485. #else
  161486. "lsr r7, r6, #16\n\t"
  161487. #endif
  161488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161489. "lsls r6, r6, #16\n\t"
  161490. #else
  161491. "lsl r6, r6, #16\n\t"
  161492. #endif
  161493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161494. "adds r5, r5, r6\n\t"
  161495. #else
  161496. "add r5, r5, r6\n\t"
  161497. #endif
  161498. #ifdef WOLFSSL_KEIL
  161499. "adcs r3, r3, r7\n\t"
  161500. #elif defined(__clang__)
  161501. "adcs r3, r7\n\t"
  161502. #else
  161503. "adc r3, r7\n\t"
  161504. #endif
  161505. #ifdef WOLFSSL_KEIL
  161506. "adcs r4, r4, %[r]\n\t"
  161507. #elif defined(__clang__)
  161508. "adcs r4, %[r]\n\t"
  161509. #else
  161510. "adc r4, %[r]\n\t"
  161511. #endif
  161512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161513. "lsrs r6, %[a], #16\n\t"
  161514. #else
  161515. "lsr r6, %[a], #16\n\t"
  161516. #endif
  161517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161518. "lsrs r7, %[b], #16\n\t"
  161519. #else
  161520. "lsr r7, %[b], #16\n\t"
  161521. #endif
  161522. #ifdef WOLFSSL_KEIL
  161523. "muls r7, r6, r7\n\t"
  161524. #elif defined(__clang__)
  161525. "muls r7, r6\n\t"
  161526. #else
  161527. "mul r7, r6\n\t"
  161528. #endif
  161529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161530. "adds r3, r3, r7\n\t"
  161531. #else
  161532. "add r3, r3, r7\n\t"
  161533. #endif
  161534. #ifdef WOLFSSL_KEIL
  161535. "adcs r4, r4, %[r]\n\t"
  161536. #elif defined(__clang__)
  161537. "adcs r4, %[r]\n\t"
  161538. #else
  161539. "adc r4, %[r]\n\t"
  161540. #endif
  161541. "uxth r7, %[b]\n\t"
  161542. #ifdef WOLFSSL_KEIL
  161543. "muls r6, r7, r6\n\t"
  161544. #elif defined(__clang__)
  161545. "muls r6, r7\n\t"
  161546. #else
  161547. "mul r6, r7\n\t"
  161548. #endif
  161549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161550. "lsrs r7, r6, #16\n\t"
  161551. #else
  161552. "lsr r7, r6, #16\n\t"
  161553. #endif
  161554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161555. "lsls r6, r6, #16\n\t"
  161556. #else
  161557. "lsl r6, r6, #16\n\t"
  161558. #endif
  161559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161560. "adds r5, r5, r6\n\t"
  161561. #else
  161562. "add r5, r5, r6\n\t"
  161563. #endif
  161564. #ifdef WOLFSSL_KEIL
  161565. "adcs r3, r3, r7\n\t"
  161566. #elif defined(__clang__)
  161567. "adcs r3, r7\n\t"
  161568. #else
  161569. "adc r3, r7\n\t"
  161570. #endif
  161571. #ifdef WOLFSSL_KEIL
  161572. "adcs r4, r4, %[r]\n\t"
  161573. #elif defined(__clang__)
  161574. "adcs r4, %[r]\n\t"
  161575. #else
  161576. "adc r4, %[r]\n\t"
  161577. #endif
  161578. "# A[9] * B[11]\n\t"
  161579. "mov %[a], r9\n\t"
  161580. "mov %[b], r10\n\t"
  161581. "ldr %[a], [%[a], #36]\n\t"
  161582. "ldr %[b], [%[b], #44]\n\t"
  161583. "uxth r6, %[a]\n\t"
  161584. "uxth r7, %[b]\n\t"
  161585. #ifdef WOLFSSL_KEIL
  161586. "muls r7, r6, r7\n\t"
  161587. #elif defined(__clang__)
  161588. "muls r7, r6\n\t"
  161589. #else
  161590. "mul r7, r6\n\t"
  161591. #endif
  161592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161593. "adds r5, r5, r7\n\t"
  161594. #else
  161595. "add r5, r5, r7\n\t"
  161596. #endif
  161597. #ifdef WOLFSSL_KEIL
  161598. "adcs r3, r3, %[r]\n\t"
  161599. #elif defined(__clang__)
  161600. "adcs r3, %[r]\n\t"
  161601. #else
  161602. "adc r3, %[r]\n\t"
  161603. #endif
  161604. #ifdef WOLFSSL_KEIL
  161605. "adcs r4, r4, %[r]\n\t"
  161606. #elif defined(__clang__)
  161607. "adcs r4, %[r]\n\t"
  161608. #else
  161609. "adc r4, %[r]\n\t"
  161610. #endif
  161611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161612. "lsrs r7, %[b], #16\n\t"
  161613. #else
  161614. "lsr r7, %[b], #16\n\t"
  161615. #endif
  161616. #ifdef WOLFSSL_KEIL
  161617. "muls r6, r7, r6\n\t"
  161618. #elif defined(__clang__)
  161619. "muls r6, r7\n\t"
  161620. #else
  161621. "mul r6, r7\n\t"
  161622. #endif
  161623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161624. "lsrs r7, r6, #16\n\t"
  161625. #else
  161626. "lsr r7, r6, #16\n\t"
  161627. #endif
  161628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161629. "lsls r6, r6, #16\n\t"
  161630. #else
  161631. "lsl r6, r6, #16\n\t"
  161632. #endif
  161633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161634. "adds r5, r5, r6\n\t"
  161635. #else
  161636. "add r5, r5, r6\n\t"
  161637. #endif
  161638. #ifdef WOLFSSL_KEIL
  161639. "adcs r3, r3, r7\n\t"
  161640. #elif defined(__clang__)
  161641. "adcs r3, r7\n\t"
  161642. #else
  161643. "adc r3, r7\n\t"
  161644. #endif
  161645. #ifdef WOLFSSL_KEIL
  161646. "adcs r4, r4, %[r]\n\t"
  161647. #elif defined(__clang__)
  161648. "adcs r4, %[r]\n\t"
  161649. #else
  161650. "adc r4, %[r]\n\t"
  161651. #endif
  161652. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161653. "lsrs r6, %[a], #16\n\t"
  161654. #else
  161655. "lsr r6, %[a], #16\n\t"
  161656. #endif
  161657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161658. "lsrs r7, %[b], #16\n\t"
  161659. #else
  161660. "lsr r7, %[b], #16\n\t"
  161661. #endif
  161662. #ifdef WOLFSSL_KEIL
  161663. "muls r7, r6, r7\n\t"
  161664. #elif defined(__clang__)
  161665. "muls r7, r6\n\t"
  161666. #else
  161667. "mul r7, r6\n\t"
  161668. #endif
  161669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161670. "adds r3, r3, r7\n\t"
  161671. #else
  161672. "add r3, r3, r7\n\t"
  161673. #endif
  161674. #ifdef WOLFSSL_KEIL
  161675. "adcs r4, r4, %[r]\n\t"
  161676. #elif defined(__clang__)
  161677. "adcs r4, %[r]\n\t"
  161678. #else
  161679. "adc r4, %[r]\n\t"
  161680. #endif
  161681. "uxth r7, %[b]\n\t"
  161682. #ifdef WOLFSSL_KEIL
  161683. "muls r6, r7, r6\n\t"
  161684. #elif defined(__clang__)
  161685. "muls r6, r7\n\t"
  161686. #else
  161687. "mul r6, r7\n\t"
  161688. #endif
  161689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161690. "lsrs r7, r6, #16\n\t"
  161691. #else
  161692. "lsr r7, r6, #16\n\t"
  161693. #endif
  161694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161695. "lsls r6, r6, #16\n\t"
  161696. #else
  161697. "lsl r6, r6, #16\n\t"
  161698. #endif
  161699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161700. "adds r5, r5, r6\n\t"
  161701. #else
  161702. "add r5, r5, r6\n\t"
  161703. #endif
  161704. #ifdef WOLFSSL_KEIL
  161705. "adcs r3, r3, r7\n\t"
  161706. #elif defined(__clang__)
  161707. "adcs r3, r7\n\t"
  161708. #else
  161709. "adc r3, r7\n\t"
  161710. #endif
  161711. #ifdef WOLFSSL_KEIL
  161712. "adcs r4, r4, %[r]\n\t"
  161713. #elif defined(__clang__)
  161714. "adcs r4, %[r]\n\t"
  161715. #else
  161716. "adc r4, %[r]\n\t"
  161717. #endif
  161718. "# A[8] * B[12]\n\t"
  161719. "mov %[a], r9\n\t"
  161720. "mov %[b], r10\n\t"
  161721. "ldr %[a], [%[a], #32]\n\t"
  161722. "ldr %[b], [%[b], #48]\n\t"
  161723. "uxth r6, %[a]\n\t"
  161724. "uxth r7, %[b]\n\t"
  161725. #ifdef WOLFSSL_KEIL
  161726. "muls r7, r6, r7\n\t"
  161727. #elif defined(__clang__)
  161728. "muls r7, r6\n\t"
  161729. #else
  161730. "mul r7, r6\n\t"
  161731. #endif
  161732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161733. "adds r5, r5, r7\n\t"
  161734. #else
  161735. "add r5, r5, r7\n\t"
  161736. #endif
  161737. #ifdef WOLFSSL_KEIL
  161738. "adcs r3, r3, %[r]\n\t"
  161739. #elif defined(__clang__)
  161740. "adcs r3, %[r]\n\t"
  161741. #else
  161742. "adc r3, %[r]\n\t"
  161743. #endif
  161744. #ifdef WOLFSSL_KEIL
  161745. "adcs r4, r4, %[r]\n\t"
  161746. #elif defined(__clang__)
  161747. "adcs r4, %[r]\n\t"
  161748. #else
  161749. "adc r4, %[r]\n\t"
  161750. #endif
  161751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161752. "lsrs r7, %[b], #16\n\t"
  161753. #else
  161754. "lsr r7, %[b], #16\n\t"
  161755. #endif
  161756. #ifdef WOLFSSL_KEIL
  161757. "muls r6, r7, r6\n\t"
  161758. #elif defined(__clang__)
  161759. "muls r6, r7\n\t"
  161760. #else
  161761. "mul r6, r7\n\t"
  161762. #endif
  161763. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161764. "lsrs r7, r6, #16\n\t"
  161765. #else
  161766. "lsr r7, r6, #16\n\t"
  161767. #endif
  161768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161769. "lsls r6, r6, #16\n\t"
  161770. #else
  161771. "lsl r6, r6, #16\n\t"
  161772. #endif
  161773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161774. "adds r5, r5, r6\n\t"
  161775. #else
  161776. "add r5, r5, r6\n\t"
  161777. #endif
  161778. #ifdef WOLFSSL_KEIL
  161779. "adcs r3, r3, r7\n\t"
  161780. #elif defined(__clang__)
  161781. "adcs r3, r7\n\t"
  161782. #else
  161783. "adc r3, r7\n\t"
  161784. #endif
  161785. #ifdef WOLFSSL_KEIL
  161786. "adcs r4, r4, %[r]\n\t"
  161787. #elif defined(__clang__)
  161788. "adcs r4, %[r]\n\t"
  161789. #else
  161790. "adc r4, %[r]\n\t"
  161791. #endif
  161792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161793. "lsrs r6, %[a], #16\n\t"
  161794. #else
  161795. "lsr r6, %[a], #16\n\t"
  161796. #endif
  161797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161798. "lsrs r7, %[b], #16\n\t"
  161799. #else
  161800. "lsr r7, %[b], #16\n\t"
  161801. #endif
  161802. #ifdef WOLFSSL_KEIL
  161803. "muls r7, r6, r7\n\t"
  161804. #elif defined(__clang__)
  161805. "muls r7, r6\n\t"
  161806. #else
  161807. "mul r7, r6\n\t"
  161808. #endif
  161809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161810. "adds r3, r3, r7\n\t"
  161811. #else
  161812. "add r3, r3, r7\n\t"
  161813. #endif
  161814. #ifdef WOLFSSL_KEIL
  161815. "adcs r4, r4, %[r]\n\t"
  161816. #elif defined(__clang__)
  161817. "adcs r4, %[r]\n\t"
  161818. #else
  161819. "adc r4, %[r]\n\t"
  161820. #endif
  161821. "uxth r7, %[b]\n\t"
  161822. #ifdef WOLFSSL_KEIL
  161823. "muls r6, r7, r6\n\t"
  161824. #elif defined(__clang__)
  161825. "muls r6, r7\n\t"
  161826. #else
  161827. "mul r6, r7\n\t"
  161828. #endif
  161829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161830. "lsrs r7, r6, #16\n\t"
  161831. #else
  161832. "lsr r7, r6, #16\n\t"
  161833. #endif
  161834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161835. "lsls r6, r6, #16\n\t"
  161836. #else
  161837. "lsl r6, r6, #16\n\t"
  161838. #endif
  161839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161840. "adds r5, r5, r6\n\t"
  161841. #else
  161842. "add r5, r5, r6\n\t"
  161843. #endif
  161844. #ifdef WOLFSSL_KEIL
  161845. "adcs r3, r3, r7\n\t"
  161846. #elif defined(__clang__)
  161847. "adcs r3, r7\n\t"
  161848. #else
  161849. "adc r3, r7\n\t"
  161850. #endif
  161851. #ifdef WOLFSSL_KEIL
  161852. "adcs r4, r4, %[r]\n\t"
  161853. #elif defined(__clang__)
  161854. "adcs r4, %[r]\n\t"
  161855. #else
  161856. "adc r4, %[r]\n\t"
  161857. #endif
  161858. "# A[7] * B[13]\n\t"
  161859. "mov %[a], r9\n\t"
  161860. "mov %[b], r10\n\t"
  161861. "ldr %[a], [%[a], #28]\n\t"
  161862. "ldr %[b], [%[b], #52]\n\t"
  161863. "uxth r6, %[a]\n\t"
  161864. "uxth r7, %[b]\n\t"
  161865. #ifdef WOLFSSL_KEIL
  161866. "muls r7, r6, r7\n\t"
  161867. #elif defined(__clang__)
  161868. "muls r7, r6\n\t"
  161869. #else
  161870. "mul r7, r6\n\t"
  161871. #endif
  161872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161873. "adds r5, r5, r7\n\t"
  161874. #else
  161875. "add r5, r5, r7\n\t"
  161876. #endif
  161877. #ifdef WOLFSSL_KEIL
  161878. "adcs r3, r3, %[r]\n\t"
  161879. #elif defined(__clang__)
  161880. "adcs r3, %[r]\n\t"
  161881. #else
  161882. "adc r3, %[r]\n\t"
  161883. #endif
  161884. #ifdef WOLFSSL_KEIL
  161885. "adcs r4, r4, %[r]\n\t"
  161886. #elif defined(__clang__)
  161887. "adcs r4, %[r]\n\t"
  161888. #else
  161889. "adc r4, %[r]\n\t"
  161890. #endif
  161891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161892. "lsrs r7, %[b], #16\n\t"
  161893. #else
  161894. "lsr r7, %[b], #16\n\t"
  161895. #endif
  161896. #ifdef WOLFSSL_KEIL
  161897. "muls r6, r7, r6\n\t"
  161898. #elif defined(__clang__)
  161899. "muls r6, r7\n\t"
  161900. #else
  161901. "mul r6, r7\n\t"
  161902. #endif
  161903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161904. "lsrs r7, r6, #16\n\t"
  161905. #else
  161906. "lsr r7, r6, #16\n\t"
  161907. #endif
  161908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161909. "lsls r6, r6, #16\n\t"
  161910. #else
  161911. "lsl r6, r6, #16\n\t"
  161912. #endif
  161913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161914. "adds r5, r5, r6\n\t"
  161915. #else
  161916. "add r5, r5, r6\n\t"
  161917. #endif
  161918. #ifdef WOLFSSL_KEIL
  161919. "adcs r3, r3, r7\n\t"
  161920. #elif defined(__clang__)
  161921. "adcs r3, r7\n\t"
  161922. #else
  161923. "adc r3, r7\n\t"
  161924. #endif
  161925. #ifdef WOLFSSL_KEIL
  161926. "adcs r4, r4, %[r]\n\t"
  161927. #elif defined(__clang__)
  161928. "adcs r4, %[r]\n\t"
  161929. #else
  161930. "adc r4, %[r]\n\t"
  161931. #endif
  161932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161933. "lsrs r6, %[a], #16\n\t"
  161934. #else
  161935. "lsr r6, %[a], #16\n\t"
  161936. #endif
  161937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161938. "lsrs r7, %[b], #16\n\t"
  161939. #else
  161940. "lsr r7, %[b], #16\n\t"
  161941. #endif
  161942. #ifdef WOLFSSL_KEIL
  161943. "muls r7, r6, r7\n\t"
  161944. #elif defined(__clang__)
  161945. "muls r7, r6\n\t"
  161946. #else
  161947. "mul r7, r6\n\t"
  161948. #endif
  161949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161950. "adds r3, r3, r7\n\t"
  161951. #else
  161952. "add r3, r3, r7\n\t"
  161953. #endif
  161954. #ifdef WOLFSSL_KEIL
  161955. "adcs r4, r4, %[r]\n\t"
  161956. #elif defined(__clang__)
  161957. "adcs r4, %[r]\n\t"
  161958. #else
  161959. "adc r4, %[r]\n\t"
  161960. #endif
  161961. "uxth r7, %[b]\n\t"
  161962. #ifdef WOLFSSL_KEIL
  161963. "muls r6, r7, r6\n\t"
  161964. #elif defined(__clang__)
  161965. "muls r6, r7\n\t"
  161966. #else
  161967. "mul r6, r7\n\t"
  161968. #endif
  161969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161970. "lsrs r7, r6, #16\n\t"
  161971. #else
  161972. "lsr r7, r6, #16\n\t"
  161973. #endif
  161974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161975. "lsls r6, r6, #16\n\t"
  161976. #else
  161977. "lsl r6, r6, #16\n\t"
  161978. #endif
  161979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  161980. "adds r5, r5, r6\n\t"
  161981. #else
  161982. "add r5, r5, r6\n\t"
  161983. #endif
  161984. #ifdef WOLFSSL_KEIL
  161985. "adcs r3, r3, r7\n\t"
  161986. #elif defined(__clang__)
  161987. "adcs r3, r7\n\t"
  161988. #else
  161989. "adc r3, r7\n\t"
  161990. #endif
  161991. #ifdef WOLFSSL_KEIL
  161992. "adcs r4, r4, %[r]\n\t"
  161993. #elif defined(__clang__)
  161994. "adcs r4, %[r]\n\t"
  161995. #else
  161996. "adc r4, %[r]\n\t"
  161997. #endif
  161998. "# A[6] * B[14]\n\t"
  161999. "mov %[a], r9\n\t"
  162000. "mov %[b], r10\n\t"
  162001. "ldr %[a], [%[a], #24]\n\t"
  162002. "ldr %[b], [%[b], #56]\n\t"
  162003. "uxth r6, %[a]\n\t"
  162004. "uxth r7, %[b]\n\t"
  162005. #ifdef WOLFSSL_KEIL
  162006. "muls r7, r6, r7\n\t"
  162007. #elif defined(__clang__)
  162008. "muls r7, r6\n\t"
  162009. #else
  162010. "mul r7, r6\n\t"
  162011. #endif
  162012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162013. "adds r5, r5, r7\n\t"
  162014. #else
  162015. "add r5, r5, r7\n\t"
  162016. #endif
  162017. #ifdef WOLFSSL_KEIL
  162018. "adcs r3, r3, %[r]\n\t"
  162019. #elif defined(__clang__)
  162020. "adcs r3, %[r]\n\t"
  162021. #else
  162022. "adc r3, %[r]\n\t"
  162023. #endif
  162024. #ifdef WOLFSSL_KEIL
  162025. "adcs r4, r4, %[r]\n\t"
  162026. #elif defined(__clang__)
  162027. "adcs r4, %[r]\n\t"
  162028. #else
  162029. "adc r4, %[r]\n\t"
  162030. #endif
  162031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162032. "lsrs r7, %[b], #16\n\t"
  162033. #else
  162034. "lsr r7, %[b], #16\n\t"
  162035. #endif
  162036. #ifdef WOLFSSL_KEIL
  162037. "muls r6, r7, r6\n\t"
  162038. #elif defined(__clang__)
  162039. "muls r6, r7\n\t"
  162040. #else
  162041. "mul r6, r7\n\t"
  162042. #endif
  162043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162044. "lsrs r7, r6, #16\n\t"
  162045. #else
  162046. "lsr r7, r6, #16\n\t"
  162047. #endif
  162048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162049. "lsls r6, r6, #16\n\t"
  162050. #else
  162051. "lsl r6, r6, #16\n\t"
  162052. #endif
  162053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162054. "adds r5, r5, r6\n\t"
  162055. #else
  162056. "add r5, r5, r6\n\t"
  162057. #endif
  162058. #ifdef WOLFSSL_KEIL
  162059. "adcs r3, r3, r7\n\t"
  162060. #elif defined(__clang__)
  162061. "adcs r3, r7\n\t"
  162062. #else
  162063. "adc r3, r7\n\t"
  162064. #endif
  162065. #ifdef WOLFSSL_KEIL
  162066. "adcs r4, r4, %[r]\n\t"
  162067. #elif defined(__clang__)
  162068. "adcs r4, %[r]\n\t"
  162069. #else
  162070. "adc r4, %[r]\n\t"
  162071. #endif
  162072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162073. "lsrs r6, %[a], #16\n\t"
  162074. #else
  162075. "lsr r6, %[a], #16\n\t"
  162076. #endif
  162077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162078. "lsrs r7, %[b], #16\n\t"
  162079. #else
  162080. "lsr r7, %[b], #16\n\t"
  162081. #endif
  162082. #ifdef WOLFSSL_KEIL
  162083. "muls r7, r6, r7\n\t"
  162084. #elif defined(__clang__)
  162085. "muls r7, r6\n\t"
  162086. #else
  162087. "mul r7, r6\n\t"
  162088. #endif
  162089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162090. "adds r3, r3, r7\n\t"
  162091. #else
  162092. "add r3, r3, r7\n\t"
  162093. #endif
  162094. #ifdef WOLFSSL_KEIL
  162095. "adcs r4, r4, %[r]\n\t"
  162096. #elif defined(__clang__)
  162097. "adcs r4, %[r]\n\t"
  162098. #else
  162099. "adc r4, %[r]\n\t"
  162100. #endif
  162101. "uxth r7, %[b]\n\t"
  162102. #ifdef WOLFSSL_KEIL
  162103. "muls r6, r7, r6\n\t"
  162104. #elif defined(__clang__)
  162105. "muls r6, r7\n\t"
  162106. #else
  162107. "mul r6, r7\n\t"
  162108. #endif
  162109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162110. "lsrs r7, r6, #16\n\t"
  162111. #else
  162112. "lsr r7, r6, #16\n\t"
  162113. #endif
  162114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162115. "lsls r6, r6, #16\n\t"
  162116. #else
  162117. "lsl r6, r6, #16\n\t"
  162118. #endif
  162119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162120. "adds r5, r5, r6\n\t"
  162121. #else
  162122. "add r5, r5, r6\n\t"
  162123. #endif
  162124. #ifdef WOLFSSL_KEIL
  162125. "adcs r3, r3, r7\n\t"
  162126. #elif defined(__clang__)
  162127. "adcs r3, r7\n\t"
  162128. #else
  162129. "adc r3, r7\n\t"
  162130. #endif
  162131. #ifdef WOLFSSL_KEIL
  162132. "adcs r4, r4, %[r]\n\t"
  162133. #elif defined(__clang__)
  162134. "adcs r4, %[r]\n\t"
  162135. #else
  162136. "adc r4, %[r]\n\t"
  162137. #endif
  162138. "# A[5] * B[15]\n\t"
  162139. "mov %[a], r9\n\t"
  162140. "mov %[b], r10\n\t"
  162141. "ldr %[a], [%[a], #20]\n\t"
  162142. "ldr %[b], [%[b], #60]\n\t"
  162143. "uxth r6, %[a]\n\t"
  162144. "uxth r7, %[b]\n\t"
  162145. #ifdef WOLFSSL_KEIL
  162146. "muls r7, r6, r7\n\t"
  162147. #elif defined(__clang__)
  162148. "muls r7, r6\n\t"
  162149. #else
  162150. "mul r7, r6\n\t"
  162151. #endif
  162152. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162153. "adds r5, r5, r7\n\t"
  162154. #else
  162155. "add r5, r5, r7\n\t"
  162156. #endif
  162157. #ifdef WOLFSSL_KEIL
  162158. "adcs r3, r3, %[r]\n\t"
  162159. #elif defined(__clang__)
  162160. "adcs r3, %[r]\n\t"
  162161. #else
  162162. "adc r3, %[r]\n\t"
  162163. #endif
  162164. #ifdef WOLFSSL_KEIL
  162165. "adcs r4, r4, %[r]\n\t"
  162166. #elif defined(__clang__)
  162167. "adcs r4, %[r]\n\t"
  162168. #else
  162169. "adc r4, %[r]\n\t"
  162170. #endif
  162171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162172. "lsrs r7, %[b], #16\n\t"
  162173. #else
  162174. "lsr r7, %[b], #16\n\t"
  162175. #endif
  162176. #ifdef WOLFSSL_KEIL
  162177. "muls r6, r7, r6\n\t"
  162178. #elif defined(__clang__)
  162179. "muls r6, r7\n\t"
  162180. #else
  162181. "mul r6, r7\n\t"
  162182. #endif
  162183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162184. "lsrs r7, r6, #16\n\t"
  162185. #else
  162186. "lsr r7, r6, #16\n\t"
  162187. #endif
  162188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162189. "lsls r6, r6, #16\n\t"
  162190. #else
  162191. "lsl r6, r6, #16\n\t"
  162192. #endif
  162193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162194. "adds r5, r5, r6\n\t"
  162195. #else
  162196. "add r5, r5, r6\n\t"
  162197. #endif
  162198. #ifdef WOLFSSL_KEIL
  162199. "adcs r3, r3, r7\n\t"
  162200. #elif defined(__clang__)
  162201. "adcs r3, r7\n\t"
  162202. #else
  162203. "adc r3, r7\n\t"
  162204. #endif
  162205. #ifdef WOLFSSL_KEIL
  162206. "adcs r4, r4, %[r]\n\t"
  162207. #elif defined(__clang__)
  162208. "adcs r4, %[r]\n\t"
  162209. #else
  162210. "adc r4, %[r]\n\t"
  162211. #endif
  162212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162213. "lsrs r6, %[a], #16\n\t"
  162214. #else
  162215. "lsr r6, %[a], #16\n\t"
  162216. #endif
  162217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162218. "lsrs r7, %[b], #16\n\t"
  162219. #else
  162220. "lsr r7, %[b], #16\n\t"
  162221. #endif
  162222. #ifdef WOLFSSL_KEIL
  162223. "muls r7, r6, r7\n\t"
  162224. #elif defined(__clang__)
  162225. "muls r7, r6\n\t"
  162226. #else
  162227. "mul r7, r6\n\t"
  162228. #endif
  162229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162230. "adds r3, r3, r7\n\t"
  162231. #else
  162232. "add r3, r3, r7\n\t"
  162233. #endif
  162234. #ifdef WOLFSSL_KEIL
  162235. "adcs r4, r4, %[r]\n\t"
  162236. #elif defined(__clang__)
  162237. "adcs r4, %[r]\n\t"
  162238. #else
  162239. "adc r4, %[r]\n\t"
  162240. #endif
  162241. "uxth r7, %[b]\n\t"
  162242. #ifdef WOLFSSL_KEIL
  162243. "muls r6, r7, r6\n\t"
  162244. #elif defined(__clang__)
  162245. "muls r6, r7\n\t"
  162246. #else
  162247. "mul r6, r7\n\t"
  162248. #endif
  162249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162250. "lsrs r7, r6, #16\n\t"
  162251. #else
  162252. "lsr r7, r6, #16\n\t"
  162253. #endif
  162254. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162255. "lsls r6, r6, #16\n\t"
  162256. #else
  162257. "lsl r6, r6, #16\n\t"
  162258. #endif
  162259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162260. "adds r5, r5, r6\n\t"
  162261. #else
  162262. "add r5, r5, r6\n\t"
  162263. #endif
  162264. #ifdef WOLFSSL_KEIL
  162265. "adcs r3, r3, r7\n\t"
  162266. #elif defined(__clang__)
  162267. "adcs r3, r7\n\t"
  162268. #else
  162269. "adc r3, r7\n\t"
  162270. #endif
  162271. #ifdef WOLFSSL_KEIL
  162272. "adcs r4, r4, %[r]\n\t"
  162273. #elif defined(__clang__)
  162274. "adcs r4, %[r]\n\t"
  162275. #else
  162276. "adc r4, %[r]\n\t"
  162277. #endif
  162278. "mov %[r], r8\n\t"
  162279. "str r5, [%[r], #80]\n\t"
  162280. "movs %[r], #0\n\t"
  162281. "# A[6] * B[15]\n\t"
  162282. "movs r5, #0\n\t"
  162283. "mov %[a], r9\n\t"
  162284. "mov %[b], r10\n\t"
  162285. "ldr %[a], [%[a], #24]\n\t"
  162286. "ldr %[b], [%[b], #60]\n\t"
  162287. "uxth r6, %[a]\n\t"
  162288. "uxth r7, %[b]\n\t"
  162289. #ifdef WOLFSSL_KEIL
  162290. "muls r7, r6, r7\n\t"
  162291. #elif defined(__clang__)
  162292. "muls r7, r6\n\t"
  162293. #else
  162294. "mul r7, r6\n\t"
  162295. #endif
  162296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162297. "adds r3, r3, r7\n\t"
  162298. #else
  162299. "add r3, r3, r7\n\t"
  162300. #endif
  162301. #ifdef WOLFSSL_KEIL
  162302. "adcs r4, r4, %[r]\n\t"
  162303. #elif defined(__clang__)
  162304. "adcs r4, %[r]\n\t"
  162305. #else
  162306. "adc r4, %[r]\n\t"
  162307. #endif
  162308. #ifdef WOLFSSL_KEIL
  162309. "adcs r5, r5, %[r]\n\t"
  162310. #elif defined(__clang__)
  162311. "adcs r5, %[r]\n\t"
  162312. #else
  162313. "adc r5, %[r]\n\t"
  162314. #endif
  162315. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162316. "lsrs r7, %[b], #16\n\t"
  162317. #else
  162318. "lsr r7, %[b], #16\n\t"
  162319. #endif
  162320. #ifdef WOLFSSL_KEIL
  162321. "muls r6, r7, r6\n\t"
  162322. #elif defined(__clang__)
  162323. "muls r6, r7\n\t"
  162324. #else
  162325. "mul r6, r7\n\t"
  162326. #endif
  162327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162328. "lsrs r7, r6, #16\n\t"
  162329. #else
  162330. "lsr r7, r6, #16\n\t"
  162331. #endif
  162332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162333. "lsls r6, r6, #16\n\t"
  162334. #else
  162335. "lsl r6, r6, #16\n\t"
  162336. #endif
  162337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162338. "adds r3, r3, r6\n\t"
  162339. #else
  162340. "add r3, r3, r6\n\t"
  162341. #endif
  162342. #ifdef WOLFSSL_KEIL
  162343. "adcs r4, r4, r7\n\t"
  162344. #elif defined(__clang__)
  162345. "adcs r4, r7\n\t"
  162346. #else
  162347. "adc r4, r7\n\t"
  162348. #endif
  162349. #ifdef WOLFSSL_KEIL
  162350. "adcs r5, r5, %[r]\n\t"
  162351. #elif defined(__clang__)
  162352. "adcs r5, %[r]\n\t"
  162353. #else
  162354. "adc r5, %[r]\n\t"
  162355. #endif
  162356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162357. "lsrs r6, %[a], #16\n\t"
  162358. #else
  162359. "lsr r6, %[a], #16\n\t"
  162360. #endif
  162361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162362. "lsrs r7, %[b], #16\n\t"
  162363. #else
  162364. "lsr r7, %[b], #16\n\t"
  162365. #endif
  162366. #ifdef WOLFSSL_KEIL
  162367. "muls r7, r6, r7\n\t"
  162368. #elif defined(__clang__)
  162369. "muls r7, r6\n\t"
  162370. #else
  162371. "mul r7, r6\n\t"
  162372. #endif
  162373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162374. "adds r4, r4, r7\n\t"
  162375. #else
  162376. "add r4, r4, r7\n\t"
  162377. #endif
  162378. #ifdef WOLFSSL_KEIL
  162379. "adcs r5, r5, %[r]\n\t"
  162380. #elif defined(__clang__)
  162381. "adcs r5, %[r]\n\t"
  162382. #else
  162383. "adc r5, %[r]\n\t"
  162384. #endif
  162385. "uxth r7, %[b]\n\t"
  162386. #ifdef WOLFSSL_KEIL
  162387. "muls r6, r7, r6\n\t"
  162388. #elif defined(__clang__)
  162389. "muls r6, r7\n\t"
  162390. #else
  162391. "mul r6, r7\n\t"
  162392. #endif
  162393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162394. "lsrs r7, r6, #16\n\t"
  162395. #else
  162396. "lsr r7, r6, #16\n\t"
  162397. #endif
  162398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162399. "lsls r6, r6, #16\n\t"
  162400. #else
  162401. "lsl r6, r6, #16\n\t"
  162402. #endif
  162403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162404. "adds r3, r3, r6\n\t"
  162405. #else
  162406. "add r3, r3, r6\n\t"
  162407. #endif
  162408. #ifdef WOLFSSL_KEIL
  162409. "adcs r4, r4, r7\n\t"
  162410. #elif defined(__clang__)
  162411. "adcs r4, r7\n\t"
  162412. #else
  162413. "adc r4, r7\n\t"
  162414. #endif
  162415. #ifdef WOLFSSL_KEIL
  162416. "adcs r5, r5, %[r]\n\t"
  162417. #elif defined(__clang__)
  162418. "adcs r5, %[r]\n\t"
  162419. #else
  162420. "adc r5, %[r]\n\t"
  162421. #endif
  162422. "# A[7] * B[14]\n\t"
  162423. "mov %[a], r9\n\t"
  162424. "mov %[b], r10\n\t"
  162425. "ldr %[a], [%[a], #28]\n\t"
  162426. "ldr %[b], [%[b], #56]\n\t"
  162427. "uxth r6, %[a]\n\t"
  162428. "uxth r7, %[b]\n\t"
  162429. #ifdef WOLFSSL_KEIL
  162430. "muls r7, r6, r7\n\t"
  162431. #elif defined(__clang__)
  162432. "muls r7, r6\n\t"
  162433. #else
  162434. "mul r7, r6\n\t"
  162435. #endif
  162436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162437. "adds r3, r3, r7\n\t"
  162438. #else
  162439. "add r3, r3, r7\n\t"
  162440. #endif
  162441. #ifdef WOLFSSL_KEIL
  162442. "adcs r4, r4, %[r]\n\t"
  162443. #elif defined(__clang__)
  162444. "adcs r4, %[r]\n\t"
  162445. #else
  162446. "adc r4, %[r]\n\t"
  162447. #endif
  162448. #ifdef WOLFSSL_KEIL
  162449. "adcs r5, r5, %[r]\n\t"
  162450. #elif defined(__clang__)
  162451. "adcs r5, %[r]\n\t"
  162452. #else
  162453. "adc r5, %[r]\n\t"
  162454. #endif
  162455. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162456. "lsrs r7, %[b], #16\n\t"
  162457. #else
  162458. "lsr r7, %[b], #16\n\t"
  162459. #endif
  162460. #ifdef WOLFSSL_KEIL
  162461. "muls r6, r7, r6\n\t"
  162462. #elif defined(__clang__)
  162463. "muls r6, r7\n\t"
  162464. #else
  162465. "mul r6, r7\n\t"
  162466. #endif
  162467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162468. "lsrs r7, r6, #16\n\t"
  162469. #else
  162470. "lsr r7, r6, #16\n\t"
  162471. #endif
  162472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162473. "lsls r6, r6, #16\n\t"
  162474. #else
  162475. "lsl r6, r6, #16\n\t"
  162476. #endif
  162477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162478. "adds r3, r3, r6\n\t"
  162479. #else
  162480. "add r3, r3, r6\n\t"
  162481. #endif
  162482. #ifdef WOLFSSL_KEIL
  162483. "adcs r4, r4, r7\n\t"
  162484. #elif defined(__clang__)
  162485. "adcs r4, r7\n\t"
  162486. #else
  162487. "adc r4, r7\n\t"
  162488. #endif
  162489. #ifdef WOLFSSL_KEIL
  162490. "adcs r5, r5, %[r]\n\t"
  162491. #elif defined(__clang__)
  162492. "adcs r5, %[r]\n\t"
  162493. #else
  162494. "adc r5, %[r]\n\t"
  162495. #endif
  162496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162497. "lsrs r6, %[a], #16\n\t"
  162498. #else
  162499. "lsr r6, %[a], #16\n\t"
  162500. #endif
  162501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162502. "lsrs r7, %[b], #16\n\t"
  162503. #else
  162504. "lsr r7, %[b], #16\n\t"
  162505. #endif
  162506. #ifdef WOLFSSL_KEIL
  162507. "muls r7, r6, r7\n\t"
  162508. #elif defined(__clang__)
  162509. "muls r7, r6\n\t"
  162510. #else
  162511. "mul r7, r6\n\t"
  162512. #endif
  162513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162514. "adds r4, r4, r7\n\t"
  162515. #else
  162516. "add r4, r4, r7\n\t"
  162517. #endif
  162518. #ifdef WOLFSSL_KEIL
  162519. "adcs r5, r5, %[r]\n\t"
  162520. #elif defined(__clang__)
  162521. "adcs r5, %[r]\n\t"
  162522. #else
  162523. "adc r5, %[r]\n\t"
  162524. #endif
  162525. "uxth r7, %[b]\n\t"
  162526. #ifdef WOLFSSL_KEIL
  162527. "muls r6, r7, r6\n\t"
  162528. #elif defined(__clang__)
  162529. "muls r6, r7\n\t"
  162530. #else
  162531. "mul r6, r7\n\t"
  162532. #endif
  162533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162534. "lsrs r7, r6, #16\n\t"
  162535. #else
  162536. "lsr r7, r6, #16\n\t"
  162537. #endif
  162538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162539. "lsls r6, r6, #16\n\t"
  162540. #else
  162541. "lsl r6, r6, #16\n\t"
  162542. #endif
  162543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162544. "adds r3, r3, r6\n\t"
  162545. #else
  162546. "add r3, r3, r6\n\t"
  162547. #endif
  162548. #ifdef WOLFSSL_KEIL
  162549. "adcs r4, r4, r7\n\t"
  162550. #elif defined(__clang__)
  162551. "adcs r4, r7\n\t"
  162552. #else
  162553. "adc r4, r7\n\t"
  162554. #endif
  162555. #ifdef WOLFSSL_KEIL
  162556. "adcs r5, r5, %[r]\n\t"
  162557. #elif defined(__clang__)
  162558. "adcs r5, %[r]\n\t"
  162559. #else
  162560. "adc r5, %[r]\n\t"
  162561. #endif
  162562. "# A[8] * B[13]\n\t"
  162563. "mov %[a], r9\n\t"
  162564. "mov %[b], r10\n\t"
  162565. "ldr %[a], [%[a], #32]\n\t"
  162566. "ldr %[b], [%[b], #52]\n\t"
  162567. "uxth r6, %[a]\n\t"
  162568. "uxth r7, %[b]\n\t"
  162569. #ifdef WOLFSSL_KEIL
  162570. "muls r7, r6, r7\n\t"
  162571. #elif defined(__clang__)
  162572. "muls r7, r6\n\t"
  162573. #else
  162574. "mul r7, r6\n\t"
  162575. #endif
  162576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162577. "adds r3, r3, r7\n\t"
  162578. #else
  162579. "add r3, r3, r7\n\t"
  162580. #endif
  162581. #ifdef WOLFSSL_KEIL
  162582. "adcs r4, r4, %[r]\n\t"
  162583. #elif defined(__clang__)
  162584. "adcs r4, %[r]\n\t"
  162585. #else
  162586. "adc r4, %[r]\n\t"
  162587. #endif
  162588. #ifdef WOLFSSL_KEIL
  162589. "adcs r5, r5, %[r]\n\t"
  162590. #elif defined(__clang__)
  162591. "adcs r5, %[r]\n\t"
  162592. #else
  162593. "adc r5, %[r]\n\t"
  162594. #endif
  162595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162596. "lsrs r7, %[b], #16\n\t"
  162597. #else
  162598. "lsr r7, %[b], #16\n\t"
  162599. #endif
  162600. #ifdef WOLFSSL_KEIL
  162601. "muls r6, r7, r6\n\t"
  162602. #elif defined(__clang__)
  162603. "muls r6, r7\n\t"
  162604. #else
  162605. "mul r6, r7\n\t"
  162606. #endif
  162607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162608. "lsrs r7, r6, #16\n\t"
  162609. #else
  162610. "lsr r7, r6, #16\n\t"
  162611. #endif
  162612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162613. "lsls r6, r6, #16\n\t"
  162614. #else
  162615. "lsl r6, r6, #16\n\t"
  162616. #endif
  162617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162618. "adds r3, r3, r6\n\t"
  162619. #else
  162620. "add r3, r3, r6\n\t"
  162621. #endif
  162622. #ifdef WOLFSSL_KEIL
  162623. "adcs r4, r4, r7\n\t"
  162624. #elif defined(__clang__)
  162625. "adcs r4, r7\n\t"
  162626. #else
  162627. "adc r4, r7\n\t"
  162628. #endif
  162629. #ifdef WOLFSSL_KEIL
  162630. "adcs r5, r5, %[r]\n\t"
  162631. #elif defined(__clang__)
  162632. "adcs r5, %[r]\n\t"
  162633. #else
  162634. "adc r5, %[r]\n\t"
  162635. #endif
  162636. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162637. "lsrs r6, %[a], #16\n\t"
  162638. #else
  162639. "lsr r6, %[a], #16\n\t"
  162640. #endif
  162641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162642. "lsrs r7, %[b], #16\n\t"
  162643. #else
  162644. "lsr r7, %[b], #16\n\t"
  162645. #endif
  162646. #ifdef WOLFSSL_KEIL
  162647. "muls r7, r6, r7\n\t"
  162648. #elif defined(__clang__)
  162649. "muls r7, r6\n\t"
  162650. #else
  162651. "mul r7, r6\n\t"
  162652. #endif
  162653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162654. "adds r4, r4, r7\n\t"
  162655. #else
  162656. "add r4, r4, r7\n\t"
  162657. #endif
  162658. #ifdef WOLFSSL_KEIL
  162659. "adcs r5, r5, %[r]\n\t"
  162660. #elif defined(__clang__)
  162661. "adcs r5, %[r]\n\t"
  162662. #else
  162663. "adc r5, %[r]\n\t"
  162664. #endif
  162665. "uxth r7, %[b]\n\t"
  162666. #ifdef WOLFSSL_KEIL
  162667. "muls r6, r7, r6\n\t"
  162668. #elif defined(__clang__)
  162669. "muls r6, r7\n\t"
  162670. #else
  162671. "mul r6, r7\n\t"
  162672. #endif
  162673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162674. "lsrs r7, r6, #16\n\t"
  162675. #else
  162676. "lsr r7, r6, #16\n\t"
  162677. #endif
  162678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162679. "lsls r6, r6, #16\n\t"
  162680. #else
  162681. "lsl r6, r6, #16\n\t"
  162682. #endif
  162683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162684. "adds r3, r3, r6\n\t"
  162685. #else
  162686. "add r3, r3, r6\n\t"
  162687. #endif
  162688. #ifdef WOLFSSL_KEIL
  162689. "adcs r4, r4, r7\n\t"
  162690. #elif defined(__clang__)
  162691. "adcs r4, r7\n\t"
  162692. #else
  162693. "adc r4, r7\n\t"
  162694. #endif
  162695. #ifdef WOLFSSL_KEIL
  162696. "adcs r5, r5, %[r]\n\t"
  162697. #elif defined(__clang__)
  162698. "adcs r5, %[r]\n\t"
  162699. #else
  162700. "adc r5, %[r]\n\t"
  162701. #endif
  162702. "# A[9] * B[12]\n\t"
  162703. "mov %[a], r9\n\t"
  162704. "mov %[b], r10\n\t"
  162705. "ldr %[a], [%[a], #36]\n\t"
  162706. "ldr %[b], [%[b], #48]\n\t"
  162707. "uxth r6, %[a]\n\t"
  162708. "uxth r7, %[b]\n\t"
  162709. #ifdef WOLFSSL_KEIL
  162710. "muls r7, r6, r7\n\t"
  162711. #elif defined(__clang__)
  162712. "muls r7, r6\n\t"
  162713. #else
  162714. "mul r7, r6\n\t"
  162715. #endif
  162716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162717. "adds r3, r3, r7\n\t"
  162718. #else
  162719. "add r3, r3, r7\n\t"
  162720. #endif
  162721. #ifdef WOLFSSL_KEIL
  162722. "adcs r4, r4, %[r]\n\t"
  162723. #elif defined(__clang__)
  162724. "adcs r4, %[r]\n\t"
  162725. #else
  162726. "adc r4, %[r]\n\t"
  162727. #endif
  162728. #ifdef WOLFSSL_KEIL
  162729. "adcs r5, r5, %[r]\n\t"
  162730. #elif defined(__clang__)
  162731. "adcs r5, %[r]\n\t"
  162732. #else
  162733. "adc r5, %[r]\n\t"
  162734. #endif
  162735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162736. "lsrs r7, %[b], #16\n\t"
  162737. #else
  162738. "lsr r7, %[b], #16\n\t"
  162739. #endif
  162740. #ifdef WOLFSSL_KEIL
  162741. "muls r6, r7, r6\n\t"
  162742. #elif defined(__clang__)
  162743. "muls r6, r7\n\t"
  162744. #else
  162745. "mul r6, r7\n\t"
  162746. #endif
  162747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162748. "lsrs r7, r6, #16\n\t"
  162749. #else
  162750. "lsr r7, r6, #16\n\t"
  162751. #endif
  162752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162753. "lsls r6, r6, #16\n\t"
  162754. #else
  162755. "lsl r6, r6, #16\n\t"
  162756. #endif
  162757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162758. "adds r3, r3, r6\n\t"
  162759. #else
  162760. "add r3, r3, r6\n\t"
  162761. #endif
  162762. #ifdef WOLFSSL_KEIL
  162763. "adcs r4, r4, r7\n\t"
  162764. #elif defined(__clang__)
  162765. "adcs r4, r7\n\t"
  162766. #else
  162767. "adc r4, r7\n\t"
  162768. #endif
  162769. #ifdef WOLFSSL_KEIL
  162770. "adcs r5, r5, %[r]\n\t"
  162771. #elif defined(__clang__)
  162772. "adcs r5, %[r]\n\t"
  162773. #else
  162774. "adc r5, %[r]\n\t"
  162775. #endif
  162776. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162777. "lsrs r6, %[a], #16\n\t"
  162778. #else
  162779. "lsr r6, %[a], #16\n\t"
  162780. #endif
  162781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162782. "lsrs r7, %[b], #16\n\t"
  162783. #else
  162784. "lsr r7, %[b], #16\n\t"
  162785. #endif
  162786. #ifdef WOLFSSL_KEIL
  162787. "muls r7, r6, r7\n\t"
  162788. #elif defined(__clang__)
  162789. "muls r7, r6\n\t"
  162790. #else
  162791. "mul r7, r6\n\t"
  162792. #endif
  162793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162794. "adds r4, r4, r7\n\t"
  162795. #else
  162796. "add r4, r4, r7\n\t"
  162797. #endif
  162798. #ifdef WOLFSSL_KEIL
  162799. "adcs r5, r5, %[r]\n\t"
  162800. #elif defined(__clang__)
  162801. "adcs r5, %[r]\n\t"
  162802. #else
  162803. "adc r5, %[r]\n\t"
  162804. #endif
  162805. "uxth r7, %[b]\n\t"
  162806. #ifdef WOLFSSL_KEIL
  162807. "muls r6, r7, r6\n\t"
  162808. #elif defined(__clang__)
  162809. "muls r6, r7\n\t"
  162810. #else
  162811. "mul r6, r7\n\t"
  162812. #endif
  162813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162814. "lsrs r7, r6, #16\n\t"
  162815. #else
  162816. "lsr r7, r6, #16\n\t"
  162817. #endif
  162818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162819. "lsls r6, r6, #16\n\t"
  162820. #else
  162821. "lsl r6, r6, #16\n\t"
  162822. #endif
  162823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162824. "adds r3, r3, r6\n\t"
  162825. #else
  162826. "add r3, r3, r6\n\t"
  162827. #endif
  162828. #ifdef WOLFSSL_KEIL
  162829. "adcs r4, r4, r7\n\t"
  162830. #elif defined(__clang__)
  162831. "adcs r4, r7\n\t"
  162832. #else
  162833. "adc r4, r7\n\t"
  162834. #endif
  162835. #ifdef WOLFSSL_KEIL
  162836. "adcs r5, r5, %[r]\n\t"
  162837. #elif defined(__clang__)
  162838. "adcs r5, %[r]\n\t"
  162839. #else
  162840. "adc r5, %[r]\n\t"
  162841. #endif
  162842. "# A[10] * B[11]\n\t"
  162843. "mov %[a], r9\n\t"
  162844. "mov %[b], r10\n\t"
  162845. "ldr %[a], [%[a], #40]\n\t"
  162846. "ldr %[b], [%[b], #44]\n\t"
  162847. "uxth r6, %[a]\n\t"
  162848. "uxth r7, %[b]\n\t"
  162849. #ifdef WOLFSSL_KEIL
  162850. "muls r7, r6, r7\n\t"
  162851. #elif defined(__clang__)
  162852. "muls r7, r6\n\t"
  162853. #else
  162854. "mul r7, r6\n\t"
  162855. #endif
  162856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162857. "adds r3, r3, r7\n\t"
  162858. #else
  162859. "add r3, r3, r7\n\t"
  162860. #endif
  162861. #ifdef WOLFSSL_KEIL
  162862. "adcs r4, r4, %[r]\n\t"
  162863. #elif defined(__clang__)
  162864. "adcs r4, %[r]\n\t"
  162865. #else
  162866. "adc r4, %[r]\n\t"
  162867. #endif
  162868. #ifdef WOLFSSL_KEIL
  162869. "adcs r5, r5, %[r]\n\t"
  162870. #elif defined(__clang__)
  162871. "adcs r5, %[r]\n\t"
  162872. #else
  162873. "adc r5, %[r]\n\t"
  162874. #endif
  162875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162876. "lsrs r7, %[b], #16\n\t"
  162877. #else
  162878. "lsr r7, %[b], #16\n\t"
  162879. #endif
  162880. #ifdef WOLFSSL_KEIL
  162881. "muls r6, r7, r6\n\t"
  162882. #elif defined(__clang__)
  162883. "muls r6, r7\n\t"
  162884. #else
  162885. "mul r6, r7\n\t"
  162886. #endif
  162887. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162888. "lsrs r7, r6, #16\n\t"
  162889. #else
  162890. "lsr r7, r6, #16\n\t"
  162891. #endif
  162892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162893. "lsls r6, r6, #16\n\t"
  162894. #else
  162895. "lsl r6, r6, #16\n\t"
  162896. #endif
  162897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162898. "adds r3, r3, r6\n\t"
  162899. #else
  162900. "add r3, r3, r6\n\t"
  162901. #endif
  162902. #ifdef WOLFSSL_KEIL
  162903. "adcs r4, r4, r7\n\t"
  162904. #elif defined(__clang__)
  162905. "adcs r4, r7\n\t"
  162906. #else
  162907. "adc r4, r7\n\t"
  162908. #endif
  162909. #ifdef WOLFSSL_KEIL
  162910. "adcs r5, r5, %[r]\n\t"
  162911. #elif defined(__clang__)
  162912. "adcs r5, %[r]\n\t"
  162913. #else
  162914. "adc r5, %[r]\n\t"
  162915. #endif
  162916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162917. "lsrs r6, %[a], #16\n\t"
  162918. #else
  162919. "lsr r6, %[a], #16\n\t"
  162920. #endif
  162921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162922. "lsrs r7, %[b], #16\n\t"
  162923. #else
  162924. "lsr r7, %[b], #16\n\t"
  162925. #endif
  162926. #ifdef WOLFSSL_KEIL
  162927. "muls r7, r6, r7\n\t"
  162928. #elif defined(__clang__)
  162929. "muls r7, r6\n\t"
  162930. #else
  162931. "mul r7, r6\n\t"
  162932. #endif
  162933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162934. "adds r4, r4, r7\n\t"
  162935. #else
  162936. "add r4, r4, r7\n\t"
  162937. #endif
  162938. #ifdef WOLFSSL_KEIL
  162939. "adcs r5, r5, %[r]\n\t"
  162940. #elif defined(__clang__)
  162941. "adcs r5, %[r]\n\t"
  162942. #else
  162943. "adc r5, %[r]\n\t"
  162944. #endif
  162945. "uxth r7, %[b]\n\t"
  162946. #ifdef WOLFSSL_KEIL
  162947. "muls r6, r7, r6\n\t"
  162948. #elif defined(__clang__)
  162949. "muls r6, r7\n\t"
  162950. #else
  162951. "mul r6, r7\n\t"
  162952. #endif
  162953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162954. "lsrs r7, r6, #16\n\t"
  162955. #else
  162956. "lsr r7, r6, #16\n\t"
  162957. #endif
  162958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162959. "lsls r6, r6, #16\n\t"
  162960. #else
  162961. "lsl r6, r6, #16\n\t"
  162962. #endif
  162963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162964. "adds r3, r3, r6\n\t"
  162965. #else
  162966. "add r3, r3, r6\n\t"
  162967. #endif
  162968. #ifdef WOLFSSL_KEIL
  162969. "adcs r4, r4, r7\n\t"
  162970. #elif defined(__clang__)
  162971. "adcs r4, r7\n\t"
  162972. #else
  162973. "adc r4, r7\n\t"
  162974. #endif
  162975. #ifdef WOLFSSL_KEIL
  162976. "adcs r5, r5, %[r]\n\t"
  162977. #elif defined(__clang__)
  162978. "adcs r5, %[r]\n\t"
  162979. #else
  162980. "adc r5, %[r]\n\t"
  162981. #endif
  162982. "# A[11] * B[10]\n\t"
  162983. "mov %[a], r9\n\t"
  162984. "mov %[b], r10\n\t"
  162985. "ldr %[a], [%[a], #44]\n\t"
  162986. "ldr %[b], [%[b], #40]\n\t"
  162987. "uxth r6, %[a]\n\t"
  162988. "uxth r7, %[b]\n\t"
  162989. #ifdef WOLFSSL_KEIL
  162990. "muls r7, r6, r7\n\t"
  162991. #elif defined(__clang__)
  162992. "muls r7, r6\n\t"
  162993. #else
  162994. "mul r7, r6\n\t"
  162995. #endif
  162996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  162997. "adds r3, r3, r7\n\t"
  162998. #else
  162999. "add r3, r3, r7\n\t"
  163000. #endif
  163001. #ifdef WOLFSSL_KEIL
  163002. "adcs r4, r4, %[r]\n\t"
  163003. #elif defined(__clang__)
  163004. "adcs r4, %[r]\n\t"
  163005. #else
  163006. "adc r4, %[r]\n\t"
  163007. #endif
  163008. #ifdef WOLFSSL_KEIL
  163009. "adcs r5, r5, %[r]\n\t"
  163010. #elif defined(__clang__)
  163011. "adcs r5, %[r]\n\t"
  163012. #else
  163013. "adc r5, %[r]\n\t"
  163014. #endif
  163015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163016. "lsrs r7, %[b], #16\n\t"
  163017. #else
  163018. "lsr r7, %[b], #16\n\t"
  163019. #endif
  163020. #ifdef WOLFSSL_KEIL
  163021. "muls r6, r7, r6\n\t"
  163022. #elif defined(__clang__)
  163023. "muls r6, r7\n\t"
  163024. #else
  163025. "mul r6, r7\n\t"
  163026. #endif
  163027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163028. "lsrs r7, r6, #16\n\t"
  163029. #else
  163030. "lsr r7, r6, #16\n\t"
  163031. #endif
  163032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163033. "lsls r6, r6, #16\n\t"
  163034. #else
  163035. "lsl r6, r6, #16\n\t"
  163036. #endif
  163037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163038. "adds r3, r3, r6\n\t"
  163039. #else
  163040. "add r3, r3, r6\n\t"
  163041. #endif
  163042. #ifdef WOLFSSL_KEIL
  163043. "adcs r4, r4, r7\n\t"
  163044. #elif defined(__clang__)
  163045. "adcs r4, r7\n\t"
  163046. #else
  163047. "adc r4, r7\n\t"
  163048. #endif
  163049. #ifdef WOLFSSL_KEIL
  163050. "adcs r5, r5, %[r]\n\t"
  163051. #elif defined(__clang__)
  163052. "adcs r5, %[r]\n\t"
  163053. #else
  163054. "adc r5, %[r]\n\t"
  163055. #endif
  163056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163057. "lsrs r6, %[a], #16\n\t"
  163058. #else
  163059. "lsr r6, %[a], #16\n\t"
  163060. #endif
  163061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163062. "lsrs r7, %[b], #16\n\t"
  163063. #else
  163064. "lsr r7, %[b], #16\n\t"
  163065. #endif
  163066. #ifdef WOLFSSL_KEIL
  163067. "muls r7, r6, r7\n\t"
  163068. #elif defined(__clang__)
  163069. "muls r7, r6\n\t"
  163070. #else
  163071. "mul r7, r6\n\t"
  163072. #endif
  163073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163074. "adds r4, r4, r7\n\t"
  163075. #else
  163076. "add r4, r4, r7\n\t"
  163077. #endif
  163078. #ifdef WOLFSSL_KEIL
  163079. "adcs r5, r5, %[r]\n\t"
  163080. #elif defined(__clang__)
  163081. "adcs r5, %[r]\n\t"
  163082. #else
  163083. "adc r5, %[r]\n\t"
  163084. #endif
  163085. "uxth r7, %[b]\n\t"
  163086. #ifdef WOLFSSL_KEIL
  163087. "muls r6, r7, r6\n\t"
  163088. #elif defined(__clang__)
  163089. "muls r6, r7\n\t"
  163090. #else
  163091. "mul r6, r7\n\t"
  163092. #endif
  163093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163094. "lsrs r7, r6, #16\n\t"
  163095. #else
  163096. "lsr r7, r6, #16\n\t"
  163097. #endif
  163098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163099. "lsls r6, r6, #16\n\t"
  163100. #else
  163101. "lsl r6, r6, #16\n\t"
  163102. #endif
  163103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163104. "adds r3, r3, r6\n\t"
  163105. #else
  163106. "add r3, r3, r6\n\t"
  163107. #endif
  163108. #ifdef WOLFSSL_KEIL
  163109. "adcs r4, r4, r7\n\t"
  163110. #elif defined(__clang__)
  163111. "adcs r4, r7\n\t"
  163112. #else
  163113. "adc r4, r7\n\t"
  163114. #endif
  163115. #ifdef WOLFSSL_KEIL
  163116. "adcs r5, r5, %[r]\n\t"
  163117. #elif defined(__clang__)
  163118. "adcs r5, %[r]\n\t"
  163119. #else
  163120. "adc r5, %[r]\n\t"
  163121. #endif
  163122. "# A[12] * B[9]\n\t"
  163123. "mov %[a], r9\n\t"
  163124. "mov %[b], r10\n\t"
  163125. "ldr %[a], [%[a], #48]\n\t"
  163126. "ldr %[b], [%[b], #36]\n\t"
  163127. "uxth r6, %[a]\n\t"
  163128. "uxth r7, %[b]\n\t"
  163129. #ifdef WOLFSSL_KEIL
  163130. "muls r7, r6, r7\n\t"
  163131. #elif defined(__clang__)
  163132. "muls r7, r6\n\t"
  163133. #else
  163134. "mul r7, r6\n\t"
  163135. #endif
  163136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163137. "adds r3, r3, r7\n\t"
  163138. #else
  163139. "add r3, r3, r7\n\t"
  163140. #endif
  163141. #ifdef WOLFSSL_KEIL
  163142. "adcs r4, r4, %[r]\n\t"
  163143. #elif defined(__clang__)
  163144. "adcs r4, %[r]\n\t"
  163145. #else
  163146. "adc r4, %[r]\n\t"
  163147. #endif
  163148. #ifdef WOLFSSL_KEIL
  163149. "adcs r5, r5, %[r]\n\t"
  163150. #elif defined(__clang__)
  163151. "adcs r5, %[r]\n\t"
  163152. #else
  163153. "adc r5, %[r]\n\t"
  163154. #endif
  163155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163156. "lsrs r7, %[b], #16\n\t"
  163157. #else
  163158. "lsr r7, %[b], #16\n\t"
  163159. #endif
  163160. #ifdef WOLFSSL_KEIL
  163161. "muls r6, r7, r6\n\t"
  163162. #elif defined(__clang__)
  163163. "muls r6, r7\n\t"
  163164. #else
  163165. "mul r6, r7\n\t"
  163166. #endif
  163167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163168. "lsrs r7, r6, #16\n\t"
  163169. #else
  163170. "lsr r7, r6, #16\n\t"
  163171. #endif
  163172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163173. "lsls r6, r6, #16\n\t"
  163174. #else
  163175. "lsl r6, r6, #16\n\t"
  163176. #endif
  163177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163178. "adds r3, r3, r6\n\t"
  163179. #else
  163180. "add r3, r3, r6\n\t"
  163181. #endif
  163182. #ifdef WOLFSSL_KEIL
  163183. "adcs r4, r4, r7\n\t"
  163184. #elif defined(__clang__)
  163185. "adcs r4, r7\n\t"
  163186. #else
  163187. "adc r4, r7\n\t"
  163188. #endif
  163189. #ifdef WOLFSSL_KEIL
  163190. "adcs r5, r5, %[r]\n\t"
  163191. #elif defined(__clang__)
  163192. "adcs r5, %[r]\n\t"
  163193. #else
  163194. "adc r5, %[r]\n\t"
  163195. #endif
  163196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163197. "lsrs r6, %[a], #16\n\t"
  163198. #else
  163199. "lsr r6, %[a], #16\n\t"
  163200. #endif
  163201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163202. "lsrs r7, %[b], #16\n\t"
  163203. #else
  163204. "lsr r7, %[b], #16\n\t"
  163205. #endif
  163206. #ifdef WOLFSSL_KEIL
  163207. "muls r7, r6, r7\n\t"
  163208. #elif defined(__clang__)
  163209. "muls r7, r6\n\t"
  163210. #else
  163211. "mul r7, r6\n\t"
  163212. #endif
  163213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163214. "adds r4, r4, r7\n\t"
  163215. #else
  163216. "add r4, r4, r7\n\t"
  163217. #endif
  163218. #ifdef WOLFSSL_KEIL
  163219. "adcs r5, r5, %[r]\n\t"
  163220. #elif defined(__clang__)
  163221. "adcs r5, %[r]\n\t"
  163222. #else
  163223. "adc r5, %[r]\n\t"
  163224. #endif
  163225. "uxth r7, %[b]\n\t"
  163226. #ifdef WOLFSSL_KEIL
  163227. "muls r6, r7, r6\n\t"
  163228. #elif defined(__clang__)
  163229. "muls r6, r7\n\t"
  163230. #else
  163231. "mul r6, r7\n\t"
  163232. #endif
  163233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163234. "lsrs r7, r6, #16\n\t"
  163235. #else
  163236. "lsr r7, r6, #16\n\t"
  163237. #endif
  163238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163239. "lsls r6, r6, #16\n\t"
  163240. #else
  163241. "lsl r6, r6, #16\n\t"
  163242. #endif
  163243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163244. "adds r3, r3, r6\n\t"
  163245. #else
  163246. "add r3, r3, r6\n\t"
  163247. #endif
  163248. #ifdef WOLFSSL_KEIL
  163249. "adcs r4, r4, r7\n\t"
  163250. #elif defined(__clang__)
  163251. "adcs r4, r7\n\t"
  163252. #else
  163253. "adc r4, r7\n\t"
  163254. #endif
  163255. #ifdef WOLFSSL_KEIL
  163256. "adcs r5, r5, %[r]\n\t"
  163257. #elif defined(__clang__)
  163258. "adcs r5, %[r]\n\t"
  163259. #else
  163260. "adc r5, %[r]\n\t"
  163261. #endif
  163262. "# A[13] * B[8]\n\t"
  163263. "mov %[a], r9\n\t"
  163264. "mov %[b], r10\n\t"
  163265. "ldr %[a], [%[a], #52]\n\t"
  163266. "ldr %[b], [%[b], #32]\n\t"
  163267. "uxth r6, %[a]\n\t"
  163268. "uxth r7, %[b]\n\t"
  163269. #ifdef WOLFSSL_KEIL
  163270. "muls r7, r6, r7\n\t"
  163271. #elif defined(__clang__)
  163272. "muls r7, r6\n\t"
  163273. #else
  163274. "mul r7, r6\n\t"
  163275. #endif
  163276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163277. "adds r3, r3, r7\n\t"
  163278. #else
  163279. "add r3, r3, r7\n\t"
  163280. #endif
  163281. #ifdef WOLFSSL_KEIL
  163282. "adcs r4, r4, %[r]\n\t"
  163283. #elif defined(__clang__)
  163284. "adcs r4, %[r]\n\t"
  163285. #else
  163286. "adc r4, %[r]\n\t"
  163287. #endif
  163288. #ifdef WOLFSSL_KEIL
  163289. "adcs r5, r5, %[r]\n\t"
  163290. #elif defined(__clang__)
  163291. "adcs r5, %[r]\n\t"
  163292. #else
  163293. "adc r5, %[r]\n\t"
  163294. #endif
  163295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163296. "lsrs r7, %[b], #16\n\t"
  163297. #else
  163298. "lsr r7, %[b], #16\n\t"
  163299. #endif
  163300. #ifdef WOLFSSL_KEIL
  163301. "muls r6, r7, r6\n\t"
  163302. #elif defined(__clang__)
  163303. "muls r6, r7\n\t"
  163304. #else
  163305. "mul r6, r7\n\t"
  163306. #endif
  163307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163308. "lsrs r7, r6, #16\n\t"
  163309. #else
  163310. "lsr r7, r6, #16\n\t"
  163311. #endif
  163312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163313. "lsls r6, r6, #16\n\t"
  163314. #else
  163315. "lsl r6, r6, #16\n\t"
  163316. #endif
  163317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163318. "adds r3, r3, r6\n\t"
  163319. #else
  163320. "add r3, r3, r6\n\t"
  163321. #endif
  163322. #ifdef WOLFSSL_KEIL
  163323. "adcs r4, r4, r7\n\t"
  163324. #elif defined(__clang__)
  163325. "adcs r4, r7\n\t"
  163326. #else
  163327. "adc r4, r7\n\t"
  163328. #endif
  163329. #ifdef WOLFSSL_KEIL
  163330. "adcs r5, r5, %[r]\n\t"
  163331. #elif defined(__clang__)
  163332. "adcs r5, %[r]\n\t"
  163333. #else
  163334. "adc r5, %[r]\n\t"
  163335. #endif
  163336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163337. "lsrs r6, %[a], #16\n\t"
  163338. #else
  163339. "lsr r6, %[a], #16\n\t"
  163340. #endif
  163341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163342. "lsrs r7, %[b], #16\n\t"
  163343. #else
  163344. "lsr r7, %[b], #16\n\t"
  163345. #endif
  163346. #ifdef WOLFSSL_KEIL
  163347. "muls r7, r6, r7\n\t"
  163348. #elif defined(__clang__)
  163349. "muls r7, r6\n\t"
  163350. #else
  163351. "mul r7, r6\n\t"
  163352. #endif
  163353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163354. "adds r4, r4, r7\n\t"
  163355. #else
  163356. "add r4, r4, r7\n\t"
  163357. #endif
  163358. #ifdef WOLFSSL_KEIL
  163359. "adcs r5, r5, %[r]\n\t"
  163360. #elif defined(__clang__)
  163361. "adcs r5, %[r]\n\t"
  163362. #else
  163363. "adc r5, %[r]\n\t"
  163364. #endif
  163365. "uxth r7, %[b]\n\t"
  163366. #ifdef WOLFSSL_KEIL
  163367. "muls r6, r7, r6\n\t"
  163368. #elif defined(__clang__)
  163369. "muls r6, r7\n\t"
  163370. #else
  163371. "mul r6, r7\n\t"
  163372. #endif
  163373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163374. "lsrs r7, r6, #16\n\t"
  163375. #else
  163376. "lsr r7, r6, #16\n\t"
  163377. #endif
  163378. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163379. "lsls r6, r6, #16\n\t"
  163380. #else
  163381. "lsl r6, r6, #16\n\t"
  163382. #endif
  163383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163384. "adds r3, r3, r6\n\t"
  163385. #else
  163386. "add r3, r3, r6\n\t"
  163387. #endif
  163388. #ifdef WOLFSSL_KEIL
  163389. "adcs r4, r4, r7\n\t"
  163390. #elif defined(__clang__)
  163391. "adcs r4, r7\n\t"
  163392. #else
  163393. "adc r4, r7\n\t"
  163394. #endif
  163395. #ifdef WOLFSSL_KEIL
  163396. "adcs r5, r5, %[r]\n\t"
  163397. #elif defined(__clang__)
  163398. "adcs r5, %[r]\n\t"
  163399. #else
  163400. "adc r5, %[r]\n\t"
  163401. #endif
  163402. "# A[14] * B[7]\n\t"
  163403. "mov %[a], r9\n\t"
  163404. "mov %[b], r10\n\t"
  163405. "ldr %[a], [%[a], #56]\n\t"
  163406. "ldr %[b], [%[b], #28]\n\t"
  163407. "uxth r6, %[a]\n\t"
  163408. "uxth r7, %[b]\n\t"
  163409. #ifdef WOLFSSL_KEIL
  163410. "muls r7, r6, r7\n\t"
  163411. #elif defined(__clang__)
  163412. "muls r7, r6\n\t"
  163413. #else
  163414. "mul r7, r6\n\t"
  163415. #endif
  163416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163417. "adds r3, r3, r7\n\t"
  163418. #else
  163419. "add r3, r3, r7\n\t"
  163420. #endif
  163421. #ifdef WOLFSSL_KEIL
  163422. "adcs r4, r4, %[r]\n\t"
  163423. #elif defined(__clang__)
  163424. "adcs r4, %[r]\n\t"
  163425. #else
  163426. "adc r4, %[r]\n\t"
  163427. #endif
  163428. #ifdef WOLFSSL_KEIL
  163429. "adcs r5, r5, %[r]\n\t"
  163430. #elif defined(__clang__)
  163431. "adcs r5, %[r]\n\t"
  163432. #else
  163433. "adc r5, %[r]\n\t"
  163434. #endif
  163435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163436. "lsrs r7, %[b], #16\n\t"
  163437. #else
  163438. "lsr r7, %[b], #16\n\t"
  163439. #endif
  163440. #ifdef WOLFSSL_KEIL
  163441. "muls r6, r7, r6\n\t"
  163442. #elif defined(__clang__)
  163443. "muls r6, r7\n\t"
  163444. #else
  163445. "mul r6, r7\n\t"
  163446. #endif
  163447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163448. "lsrs r7, r6, #16\n\t"
  163449. #else
  163450. "lsr r7, r6, #16\n\t"
  163451. #endif
  163452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163453. "lsls r6, r6, #16\n\t"
  163454. #else
  163455. "lsl r6, r6, #16\n\t"
  163456. #endif
  163457. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163458. "adds r3, r3, r6\n\t"
  163459. #else
  163460. "add r3, r3, r6\n\t"
  163461. #endif
  163462. #ifdef WOLFSSL_KEIL
  163463. "adcs r4, r4, r7\n\t"
  163464. #elif defined(__clang__)
  163465. "adcs r4, r7\n\t"
  163466. #else
  163467. "adc r4, r7\n\t"
  163468. #endif
  163469. #ifdef WOLFSSL_KEIL
  163470. "adcs r5, r5, %[r]\n\t"
  163471. #elif defined(__clang__)
  163472. "adcs r5, %[r]\n\t"
  163473. #else
  163474. "adc r5, %[r]\n\t"
  163475. #endif
  163476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163477. "lsrs r6, %[a], #16\n\t"
  163478. #else
  163479. "lsr r6, %[a], #16\n\t"
  163480. #endif
  163481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163482. "lsrs r7, %[b], #16\n\t"
  163483. #else
  163484. "lsr r7, %[b], #16\n\t"
  163485. #endif
  163486. #ifdef WOLFSSL_KEIL
  163487. "muls r7, r6, r7\n\t"
  163488. #elif defined(__clang__)
  163489. "muls r7, r6\n\t"
  163490. #else
  163491. "mul r7, r6\n\t"
  163492. #endif
  163493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163494. "adds r4, r4, r7\n\t"
  163495. #else
  163496. "add r4, r4, r7\n\t"
  163497. #endif
  163498. #ifdef WOLFSSL_KEIL
  163499. "adcs r5, r5, %[r]\n\t"
  163500. #elif defined(__clang__)
  163501. "adcs r5, %[r]\n\t"
  163502. #else
  163503. "adc r5, %[r]\n\t"
  163504. #endif
  163505. "uxth r7, %[b]\n\t"
  163506. #ifdef WOLFSSL_KEIL
  163507. "muls r6, r7, r6\n\t"
  163508. #elif defined(__clang__)
  163509. "muls r6, r7\n\t"
  163510. #else
  163511. "mul r6, r7\n\t"
  163512. #endif
  163513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163514. "lsrs r7, r6, #16\n\t"
  163515. #else
  163516. "lsr r7, r6, #16\n\t"
  163517. #endif
  163518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163519. "lsls r6, r6, #16\n\t"
  163520. #else
  163521. "lsl r6, r6, #16\n\t"
  163522. #endif
  163523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163524. "adds r3, r3, r6\n\t"
  163525. #else
  163526. "add r3, r3, r6\n\t"
  163527. #endif
  163528. #ifdef WOLFSSL_KEIL
  163529. "adcs r4, r4, r7\n\t"
  163530. #elif defined(__clang__)
  163531. "adcs r4, r7\n\t"
  163532. #else
  163533. "adc r4, r7\n\t"
  163534. #endif
  163535. #ifdef WOLFSSL_KEIL
  163536. "adcs r5, r5, %[r]\n\t"
  163537. #elif defined(__clang__)
  163538. "adcs r5, %[r]\n\t"
  163539. #else
  163540. "adc r5, %[r]\n\t"
  163541. #endif
  163542. "# A[15] * B[6]\n\t"
  163543. "mov %[a], r9\n\t"
  163544. "mov %[b], r10\n\t"
  163545. "ldr %[a], [%[a], #60]\n\t"
  163546. "ldr %[b], [%[b], #24]\n\t"
  163547. "uxth r6, %[a]\n\t"
  163548. "uxth r7, %[b]\n\t"
  163549. #ifdef WOLFSSL_KEIL
  163550. "muls r7, r6, r7\n\t"
  163551. #elif defined(__clang__)
  163552. "muls r7, r6\n\t"
  163553. #else
  163554. "mul r7, r6\n\t"
  163555. #endif
  163556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163557. "adds r3, r3, r7\n\t"
  163558. #else
  163559. "add r3, r3, r7\n\t"
  163560. #endif
  163561. #ifdef WOLFSSL_KEIL
  163562. "adcs r4, r4, %[r]\n\t"
  163563. #elif defined(__clang__)
  163564. "adcs r4, %[r]\n\t"
  163565. #else
  163566. "adc r4, %[r]\n\t"
  163567. #endif
  163568. #ifdef WOLFSSL_KEIL
  163569. "adcs r5, r5, %[r]\n\t"
  163570. #elif defined(__clang__)
  163571. "adcs r5, %[r]\n\t"
  163572. #else
  163573. "adc r5, %[r]\n\t"
  163574. #endif
  163575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163576. "lsrs r7, %[b], #16\n\t"
  163577. #else
  163578. "lsr r7, %[b], #16\n\t"
  163579. #endif
  163580. #ifdef WOLFSSL_KEIL
  163581. "muls r6, r7, r6\n\t"
  163582. #elif defined(__clang__)
  163583. "muls r6, r7\n\t"
  163584. #else
  163585. "mul r6, r7\n\t"
  163586. #endif
  163587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163588. "lsrs r7, r6, #16\n\t"
  163589. #else
  163590. "lsr r7, r6, #16\n\t"
  163591. #endif
  163592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163593. "lsls r6, r6, #16\n\t"
  163594. #else
  163595. "lsl r6, r6, #16\n\t"
  163596. #endif
  163597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163598. "adds r3, r3, r6\n\t"
  163599. #else
  163600. "add r3, r3, r6\n\t"
  163601. #endif
  163602. #ifdef WOLFSSL_KEIL
  163603. "adcs r4, r4, r7\n\t"
  163604. #elif defined(__clang__)
  163605. "adcs r4, r7\n\t"
  163606. #else
  163607. "adc r4, r7\n\t"
  163608. #endif
  163609. #ifdef WOLFSSL_KEIL
  163610. "adcs r5, r5, %[r]\n\t"
  163611. #elif defined(__clang__)
  163612. "adcs r5, %[r]\n\t"
  163613. #else
  163614. "adc r5, %[r]\n\t"
  163615. #endif
  163616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163617. "lsrs r6, %[a], #16\n\t"
  163618. #else
  163619. "lsr r6, %[a], #16\n\t"
  163620. #endif
  163621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163622. "lsrs r7, %[b], #16\n\t"
  163623. #else
  163624. "lsr r7, %[b], #16\n\t"
  163625. #endif
  163626. #ifdef WOLFSSL_KEIL
  163627. "muls r7, r6, r7\n\t"
  163628. #elif defined(__clang__)
  163629. "muls r7, r6\n\t"
  163630. #else
  163631. "mul r7, r6\n\t"
  163632. #endif
  163633. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163634. "adds r4, r4, r7\n\t"
  163635. #else
  163636. "add r4, r4, r7\n\t"
  163637. #endif
  163638. #ifdef WOLFSSL_KEIL
  163639. "adcs r5, r5, %[r]\n\t"
  163640. #elif defined(__clang__)
  163641. "adcs r5, %[r]\n\t"
  163642. #else
  163643. "adc r5, %[r]\n\t"
  163644. #endif
  163645. "uxth r7, %[b]\n\t"
  163646. #ifdef WOLFSSL_KEIL
  163647. "muls r6, r7, r6\n\t"
  163648. #elif defined(__clang__)
  163649. "muls r6, r7\n\t"
  163650. #else
  163651. "mul r6, r7\n\t"
  163652. #endif
  163653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163654. "lsrs r7, r6, #16\n\t"
  163655. #else
  163656. "lsr r7, r6, #16\n\t"
  163657. #endif
  163658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163659. "lsls r6, r6, #16\n\t"
  163660. #else
  163661. "lsl r6, r6, #16\n\t"
  163662. #endif
  163663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163664. "adds r3, r3, r6\n\t"
  163665. #else
  163666. "add r3, r3, r6\n\t"
  163667. #endif
  163668. #ifdef WOLFSSL_KEIL
  163669. "adcs r4, r4, r7\n\t"
  163670. #elif defined(__clang__)
  163671. "adcs r4, r7\n\t"
  163672. #else
  163673. "adc r4, r7\n\t"
  163674. #endif
  163675. #ifdef WOLFSSL_KEIL
  163676. "adcs r5, r5, %[r]\n\t"
  163677. #elif defined(__clang__)
  163678. "adcs r5, %[r]\n\t"
  163679. #else
  163680. "adc r5, %[r]\n\t"
  163681. #endif
  163682. "mov %[r], r8\n\t"
  163683. "str r3, [%[r], #84]\n\t"
  163684. "movs %[r], #0\n\t"
  163685. "# A[15] * B[7]\n\t"
  163686. "movs r3, #0\n\t"
  163687. "mov %[a], r9\n\t"
  163688. "mov %[b], r10\n\t"
  163689. "ldr %[a], [%[a], #60]\n\t"
  163690. "ldr %[b], [%[b], #28]\n\t"
  163691. "uxth r6, %[a]\n\t"
  163692. "uxth r7, %[b]\n\t"
  163693. #ifdef WOLFSSL_KEIL
  163694. "muls r7, r6, r7\n\t"
  163695. #elif defined(__clang__)
  163696. "muls r7, r6\n\t"
  163697. #else
  163698. "mul r7, r6\n\t"
  163699. #endif
  163700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163701. "adds r4, r4, r7\n\t"
  163702. #else
  163703. "add r4, r4, r7\n\t"
  163704. #endif
  163705. #ifdef WOLFSSL_KEIL
  163706. "adcs r5, r5, %[r]\n\t"
  163707. #elif defined(__clang__)
  163708. "adcs r5, %[r]\n\t"
  163709. #else
  163710. "adc r5, %[r]\n\t"
  163711. #endif
  163712. #ifdef WOLFSSL_KEIL
  163713. "adcs r3, r3, %[r]\n\t"
  163714. #elif defined(__clang__)
  163715. "adcs r3, %[r]\n\t"
  163716. #else
  163717. "adc r3, %[r]\n\t"
  163718. #endif
  163719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163720. "lsrs r7, %[b], #16\n\t"
  163721. #else
  163722. "lsr r7, %[b], #16\n\t"
  163723. #endif
  163724. #ifdef WOLFSSL_KEIL
  163725. "muls r6, r7, r6\n\t"
  163726. #elif defined(__clang__)
  163727. "muls r6, r7\n\t"
  163728. #else
  163729. "mul r6, r7\n\t"
  163730. #endif
  163731. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163732. "lsrs r7, r6, #16\n\t"
  163733. #else
  163734. "lsr r7, r6, #16\n\t"
  163735. #endif
  163736. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163737. "lsls r6, r6, #16\n\t"
  163738. #else
  163739. "lsl r6, r6, #16\n\t"
  163740. #endif
  163741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163742. "adds r4, r4, r6\n\t"
  163743. #else
  163744. "add r4, r4, r6\n\t"
  163745. #endif
  163746. #ifdef WOLFSSL_KEIL
  163747. "adcs r5, r5, r7\n\t"
  163748. #elif defined(__clang__)
  163749. "adcs r5, r7\n\t"
  163750. #else
  163751. "adc r5, r7\n\t"
  163752. #endif
  163753. #ifdef WOLFSSL_KEIL
  163754. "adcs r3, r3, %[r]\n\t"
  163755. #elif defined(__clang__)
  163756. "adcs r3, %[r]\n\t"
  163757. #else
  163758. "adc r3, %[r]\n\t"
  163759. #endif
  163760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163761. "lsrs r6, %[a], #16\n\t"
  163762. #else
  163763. "lsr r6, %[a], #16\n\t"
  163764. #endif
  163765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163766. "lsrs r7, %[b], #16\n\t"
  163767. #else
  163768. "lsr r7, %[b], #16\n\t"
  163769. #endif
  163770. #ifdef WOLFSSL_KEIL
  163771. "muls r7, r6, r7\n\t"
  163772. #elif defined(__clang__)
  163773. "muls r7, r6\n\t"
  163774. #else
  163775. "mul r7, r6\n\t"
  163776. #endif
  163777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163778. "adds r5, r5, r7\n\t"
  163779. #else
  163780. "add r5, r5, r7\n\t"
  163781. #endif
  163782. #ifdef WOLFSSL_KEIL
  163783. "adcs r3, r3, %[r]\n\t"
  163784. #elif defined(__clang__)
  163785. "adcs r3, %[r]\n\t"
  163786. #else
  163787. "adc r3, %[r]\n\t"
  163788. #endif
  163789. "uxth r7, %[b]\n\t"
  163790. #ifdef WOLFSSL_KEIL
  163791. "muls r6, r7, r6\n\t"
  163792. #elif defined(__clang__)
  163793. "muls r6, r7\n\t"
  163794. #else
  163795. "mul r6, r7\n\t"
  163796. #endif
  163797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163798. "lsrs r7, r6, #16\n\t"
  163799. #else
  163800. "lsr r7, r6, #16\n\t"
  163801. #endif
  163802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163803. "lsls r6, r6, #16\n\t"
  163804. #else
  163805. "lsl r6, r6, #16\n\t"
  163806. #endif
  163807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163808. "adds r4, r4, r6\n\t"
  163809. #else
  163810. "add r4, r4, r6\n\t"
  163811. #endif
  163812. #ifdef WOLFSSL_KEIL
  163813. "adcs r5, r5, r7\n\t"
  163814. #elif defined(__clang__)
  163815. "adcs r5, r7\n\t"
  163816. #else
  163817. "adc r5, r7\n\t"
  163818. #endif
  163819. #ifdef WOLFSSL_KEIL
  163820. "adcs r3, r3, %[r]\n\t"
  163821. #elif defined(__clang__)
  163822. "adcs r3, %[r]\n\t"
  163823. #else
  163824. "adc r3, %[r]\n\t"
  163825. #endif
  163826. "# A[14] * B[8]\n\t"
  163827. "mov %[a], r9\n\t"
  163828. "mov %[b], r10\n\t"
  163829. "ldr %[a], [%[a], #56]\n\t"
  163830. "ldr %[b], [%[b], #32]\n\t"
  163831. "uxth r6, %[a]\n\t"
  163832. "uxth r7, %[b]\n\t"
  163833. #ifdef WOLFSSL_KEIL
  163834. "muls r7, r6, r7\n\t"
  163835. #elif defined(__clang__)
  163836. "muls r7, r6\n\t"
  163837. #else
  163838. "mul r7, r6\n\t"
  163839. #endif
  163840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163841. "adds r4, r4, r7\n\t"
  163842. #else
  163843. "add r4, r4, r7\n\t"
  163844. #endif
  163845. #ifdef WOLFSSL_KEIL
  163846. "adcs r5, r5, %[r]\n\t"
  163847. #elif defined(__clang__)
  163848. "adcs r5, %[r]\n\t"
  163849. #else
  163850. "adc r5, %[r]\n\t"
  163851. #endif
  163852. #ifdef WOLFSSL_KEIL
  163853. "adcs r3, r3, %[r]\n\t"
  163854. #elif defined(__clang__)
  163855. "adcs r3, %[r]\n\t"
  163856. #else
  163857. "adc r3, %[r]\n\t"
  163858. #endif
  163859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163860. "lsrs r7, %[b], #16\n\t"
  163861. #else
  163862. "lsr r7, %[b], #16\n\t"
  163863. #endif
  163864. #ifdef WOLFSSL_KEIL
  163865. "muls r6, r7, r6\n\t"
  163866. #elif defined(__clang__)
  163867. "muls r6, r7\n\t"
  163868. #else
  163869. "mul r6, r7\n\t"
  163870. #endif
  163871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163872. "lsrs r7, r6, #16\n\t"
  163873. #else
  163874. "lsr r7, r6, #16\n\t"
  163875. #endif
  163876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163877. "lsls r6, r6, #16\n\t"
  163878. #else
  163879. "lsl r6, r6, #16\n\t"
  163880. #endif
  163881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163882. "adds r4, r4, r6\n\t"
  163883. #else
  163884. "add r4, r4, r6\n\t"
  163885. #endif
  163886. #ifdef WOLFSSL_KEIL
  163887. "adcs r5, r5, r7\n\t"
  163888. #elif defined(__clang__)
  163889. "adcs r5, r7\n\t"
  163890. #else
  163891. "adc r5, r7\n\t"
  163892. #endif
  163893. #ifdef WOLFSSL_KEIL
  163894. "adcs r3, r3, %[r]\n\t"
  163895. #elif defined(__clang__)
  163896. "adcs r3, %[r]\n\t"
  163897. #else
  163898. "adc r3, %[r]\n\t"
  163899. #endif
  163900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163901. "lsrs r6, %[a], #16\n\t"
  163902. #else
  163903. "lsr r6, %[a], #16\n\t"
  163904. #endif
  163905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163906. "lsrs r7, %[b], #16\n\t"
  163907. #else
  163908. "lsr r7, %[b], #16\n\t"
  163909. #endif
  163910. #ifdef WOLFSSL_KEIL
  163911. "muls r7, r6, r7\n\t"
  163912. #elif defined(__clang__)
  163913. "muls r7, r6\n\t"
  163914. #else
  163915. "mul r7, r6\n\t"
  163916. #endif
  163917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163918. "adds r5, r5, r7\n\t"
  163919. #else
  163920. "add r5, r5, r7\n\t"
  163921. #endif
  163922. #ifdef WOLFSSL_KEIL
  163923. "adcs r3, r3, %[r]\n\t"
  163924. #elif defined(__clang__)
  163925. "adcs r3, %[r]\n\t"
  163926. #else
  163927. "adc r3, %[r]\n\t"
  163928. #endif
  163929. "uxth r7, %[b]\n\t"
  163930. #ifdef WOLFSSL_KEIL
  163931. "muls r6, r7, r6\n\t"
  163932. #elif defined(__clang__)
  163933. "muls r6, r7\n\t"
  163934. #else
  163935. "mul r6, r7\n\t"
  163936. #endif
  163937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163938. "lsrs r7, r6, #16\n\t"
  163939. #else
  163940. "lsr r7, r6, #16\n\t"
  163941. #endif
  163942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163943. "lsls r6, r6, #16\n\t"
  163944. #else
  163945. "lsl r6, r6, #16\n\t"
  163946. #endif
  163947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163948. "adds r4, r4, r6\n\t"
  163949. #else
  163950. "add r4, r4, r6\n\t"
  163951. #endif
  163952. #ifdef WOLFSSL_KEIL
  163953. "adcs r5, r5, r7\n\t"
  163954. #elif defined(__clang__)
  163955. "adcs r5, r7\n\t"
  163956. #else
  163957. "adc r5, r7\n\t"
  163958. #endif
  163959. #ifdef WOLFSSL_KEIL
  163960. "adcs r3, r3, %[r]\n\t"
  163961. #elif defined(__clang__)
  163962. "adcs r3, %[r]\n\t"
  163963. #else
  163964. "adc r3, %[r]\n\t"
  163965. #endif
  163966. "# A[13] * B[9]\n\t"
  163967. "mov %[a], r9\n\t"
  163968. "mov %[b], r10\n\t"
  163969. "ldr %[a], [%[a], #52]\n\t"
  163970. "ldr %[b], [%[b], #36]\n\t"
  163971. "uxth r6, %[a]\n\t"
  163972. "uxth r7, %[b]\n\t"
  163973. #ifdef WOLFSSL_KEIL
  163974. "muls r7, r6, r7\n\t"
  163975. #elif defined(__clang__)
  163976. "muls r7, r6\n\t"
  163977. #else
  163978. "mul r7, r6\n\t"
  163979. #endif
  163980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  163981. "adds r4, r4, r7\n\t"
  163982. #else
  163983. "add r4, r4, r7\n\t"
  163984. #endif
  163985. #ifdef WOLFSSL_KEIL
  163986. "adcs r5, r5, %[r]\n\t"
  163987. #elif defined(__clang__)
  163988. "adcs r5, %[r]\n\t"
  163989. #else
  163990. "adc r5, %[r]\n\t"
  163991. #endif
  163992. #ifdef WOLFSSL_KEIL
  163993. "adcs r3, r3, %[r]\n\t"
  163994. #elif defined(__clang__)
  163995. "adcs r3, %[r]\n\t"
  163996. #else
  163997. "adc r3, %[r]\n\t"
  163998. #endif
  163999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164000. "lsrs r7, %[b], #16\n\t"
  164001. #else
  164002. "lsr r7, %[b], #16\n\t"
  164003. #endif
  164004. #ifdef WOLFSSL_KEIL
  164005. "muls r6, r7, r6\n\t"
  164006. #elif defined(__clang__)
  164007. "muls r6, r7\n\t"
  164008. #else
  164009. "mul r6, r7\n\t"
  164010. #endif
  164011. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164012. "lsrs r7, r6, #16\n\t"
  164013. #else
  164014. "lsr r7, r6, #16\n\t"
  164015. #endif
  164016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164017. "lsls r6, r6, #16\n\t"
  164018. #else
  164019. "lsl r6, r6, #16\n\t"
  164020. #endif
  164021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164022. "adds r4, r4, r6\n\t"
  164023. #else
  164024. "add r4, r4, r6\n\t"
  164025. #endif
  164026. #ifdef WOLFSSL_KEIL
  164027. "adcs r5, r5, r7\n\t"
  164028. #elif defined(__clang__)
  164029. "adcs r5, r7\n\t"
  164030. #else
  164031. "adc r5, r7\n\t"
  164032. #endif
  164033. #ifdef WOLFSSL_KEIL
  164034. "adcs r3, r3, %[r]\n\t"
  164035. #elif defined(__clang__)
  164036. "adcs r3, %[r]\n\t"
  164037. #else
  164038. "adc r3, %[r]\n\t"
  164039. #endif
  164040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164041. "lsrs r6, %[a], #16\n\t"
  164042. #else
  164043. "lsr r6, %[a], #16\n\t"
  164044. #endif
  164045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164046. "lsrs r7, %[b], #16\n\t"
  164047. #else
  164048. "lsr r7, %[b], #16\n\t"
  164049. #endif
  164050. #ifdef WOLFSSL_KEIL
  164051. "muls r7, r6, r7\n\t"
  164052. #elif defined(__clang__)
  164053. "muls r7, r6\n\t"
  164054. #else
  164055. "mul r7, r6\n\t"
  164056. #endif
  164057. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164058. "adds r5, r5, r7\n\t"
  164059. #else
  164060. "add r5, r5, r7\n\t"
  164061. #endif
  164062. #ifdef WOLFSSL_KEIL
  164063. "adcs r3, r3, %[r]\n\t"
  164064. #elif defined(__clang__)
  164065. "adcs r3, %[r]\n\t"
  164066. #else
  164067. "adc r3, %[r]\n\t"
  164068. #endif
  164069. "uxth r7, %[b]\n\t"
  164070. #ifdef WOLFSSL_KEIL
  164071. "muls r6, r7, r6\n\t"
  164072. #elif defined(__clang__)
  164073. "muls r6, r7\n\t"
  164074. #else
  164075. "mul r6, r7\n\t"
  164076. #endif
  164077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164078. "lsrs r7, r6, #16\n\t"
  164079. #else
  164080. "lsr r7, r6, #16\n\t"
  164081. #endif
  164082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164083. "lsls r6, r6, #16\n\t"
  164084. #else
  164085. "lsl r6, r6, #16\n\t"
  164086. #endif
  164087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164088. "adds r4, r4, r6\n\t"
  164089. #else
  164090. "add r4, r4, r6\n\t"
  164091. #endif
  164092. #ifdef WOLFSSL_KEIL
  164093. "adcs r5, r5, r7\n\t"
  164094. #elif defined(__clang__)
  164095. "adcs r5, r7\n\t"
  164096. #else
  164097. "adc r5, r7\n\t"
  164098. #endif
  164099. #ifdef WOLFSSL_KEIL
  164100. "adcs r3, r3, %[r]\n\t"
  164101. #elif defined(__clang__)
  164102. "adcs r3, %[r]\n\t"
  164103. #else
  164104. "adc r3, %[r]\n\t"
  164105. #endif
  164106. "# A[12] * B[10]\n\t"
  164107. "mov %[a], r9\n\t"
  164108. "mov %[b], r10\n\t"
  164109. "ldr %[a], [%[a], #48]\n\t"
  164110. "ldr %[b], [%[b], #40]\n\t"
  164111. "uxth r6, %[a]\n\t"
  164112. "uxth r7, %[b]\n\t"
  164113. #ifdef WOLFSSL_KEIL
  164114. "muls r7, r6, r7\n\t"
  164115. #elif defined(__clang__)
  164116. "muls r7, r6\n\t"
  164117. #else
  164118. "mul r7, r6\n\t"
  164119. #endif
  164120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164121. "adds r4, r4, r7\n\t"
  164122. #else
  164123. "add r4, r4, r7\n\t"
  164124. #endif
  164125. #ifdef WOLFSSL_KEIL
  164126. "adcs r5, r5, %[r]\n\t"
  164127. #elif defined(__clang__)
  164128. "adcs r5, %[r]\n\t"
  164129. #else
  164130. "adc r5, %[r]\n\t"
  164131. #endif
  164132. #ifdef WOLFSSL_KEIL
  164133. "adcs r3, r3, %[r]\n\t"
  164134. #elif defined(__clang__)
  164135. "adcs r3, %[r]\n\t"
  164136. #else
  164137. "adc r3, %[r]\n\t"
  164138. #endif
  164139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164140. "lsrs r7, %[b], #16\n\t"
  164141. #else
  164142. "lsr r7, %[b], #16\n\t"
  164143. #endif
  164144. #ifdef WOLFSSL_KEIL
  164145. "muls r6, r7, r6\n\t"
  164146. #elif defined(__clang__)
  164147. "muls r6, r7\n\t"
  164148. #else
  164149. "mul r6, r7\n\t"
  164150. #endif
  164151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164152. "lsrs r7, r6, #16\n\t"
  164153. #else
  164154. "lsr r7, r6, #16\n\t"
  164155. #endif
  164156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164157. "lsls r6, r6, #16\n\t"
  164158. #else
  164159. "lsl r6, r6, #16\n\t"
  164160. #endif
  164161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164162. "adds r4, r4, r6\n\t"
  164163. #else
  164164. "add r4, r4, r6\n\t"
  164165. #endif
  164166. #ifdef WOLFSSL_KEIL
  164167. "adcs r5, r5, r7\n\t"
  164168. #elif defined(__clang__)
  164169. "adcs r5, r7\n\t"
  164170. #else
  164171. "adc r5, r7\n\t"
  164172. #endif
  164173. #ifdef WOLFSSL_KEIL
  164174. "adcs r3, r3, %[r]\n\t"
  164175. #elif defined(__clang__)
  164176. "adcs r3, %[r]\n\t"
  164177. #else
  164178. "adc r3, %[r]\n\t"
  164179. #endif
  164180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164181. "lsrs r6, %[a], #16\n\t"
  164182. #else
  164183. "lsr r6, %[a], #16\n\t"
  164184. #endif
  164185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164186. "lsrs r7, %[b], #16\n\t"
  164187. #else
  164188. "lsr r7, %[b], #16\n\t"
  164189. #endif
  164190. #ifdef WOLFSSL_KEIL
  164191. "muls r7, r6, r7\n\t"
  164192. #elif defined(__clang__)
  164193. "muls r7, r6\n\t"
  164194. #else
  164195. "mul r7, r6\n\t"
  164196. #endif
  164197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164198. "adds r5, r5, r7\n\t"
  164199. #else
  164200. "add r5, r5, r7\n\t"
  164201. #endif
  164202. #ifdef WOLFSSL_KEIL
  164203. "adcs r3, r3, %[r]\n\t"
  164204. #elif defined(__clang__)
  164205. "adcs r3, %[r]\n\t"
  164206. #else
  164207. "adc r3, %[r]\n\t"
  164208. #endif
  164209. "uxth r7, %[b]\n\t"
  164210. #ifdef WOLFSSL_KEIL
  164211. "muls r6, r7, r6\n\t"
  164212. #elif defined(__clang__)
  164213. "muls r6, r7\n\t"
  164214. #else
  164215. "mul r6, r7\n\t"
  164216. #endif
  164217. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164218. "lsrs r7, r6, #16\n\t"
  164219. #else
  164220. "lsr r7, r6, #16\n\t"
  164221. #endif
  164222. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164223. "lsls r6, r6, #16\n\t"
  164224. #else
  164225. "lsl r6, r6, #16\n\t"
  164226. #endif
  164227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164228. "adds r4, r4, r6\n\t"
  164229. #else
  164230. "add r4, r4, r6\n\t"
  164231. #endif
  164232. #ifdef WOLFSSL_KEIL
  164233. "adcs r5, r5, r7\n\t"
  164234. #elif defined(__clang__)
  164235. "adcs r5, r7\n\t"
  164236. #else
  164237. "adc r5, r7\n\t"
  164238. #endif
  164239. #ifdef WOLFSSL_KEIL
  164240. "adcs r3, r3, %[r]\n\t"
  164241. #elif defined(__clang__)
  164242. "adcs r3, %[r]\n\t"
  164243. #else
  164244. "adc r3, %[r]\n\t"
  164245. #endif
  164246. "# A[11] * B[11]\n\t"
  164247. "mov %[a], r9\n\t"
  164248. "mov %[b], r10\n\t"
  164249. "ldr %[a], [%[a], #44]\n\t"
  164250. "ldr %[b], [%[b], #44]\n\t"
  164251. "uxth r6, %[a]\n\t"
  164252. "uxth r7, %[b]\n\t"
  164253. #ifdef WOLFSSL_KEIL
  164254. "muls r7, r6, r7\n\t"
  164255. #elif defined(__clang__)
  164256. "muls r7, r6\n\t"
  164257. #else
  164258. "mul r7, r6\n\t"
  164259. #endif
  164260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164261. "adds r4, r4, r7\n\t"
  164262. #else
  164263. "add r4, r4, r7\n\t"
  164264. #endif
  164265. #ifdef WOLFSSL_KEIL
  164266. "adcs r5, r5, %[r]\n\t"
  164267. #elif defined(__clang__)
  164268. "adcs r5, %[r]\n\t"
  164269. #else
  164270. "adc r5, %[r]\n\t"
  164271. #endif
  164272. #ifdef WOLFSSL_KEIL
  164273. "adcs r3, r3, %[r]\n\t"
  164274. #elif defined(__clang__)
  164275. "adcs r3, %[r]\n\t"
  164276. #else
  164277. "adc r3, %[r]\n\t"
  164278. #endif
  164279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164280. "lsrs r7, %[b], #16\n\t"
  164281. #else
  164282. "lsr r7, %[b], #16\n\t"
  164283. #endif
  164284. #ifdef WOLFSSL_KEIL
  164285. "muls r6, r7, r6\n\t"
  164286. #elif defined(__clang__)
  164287. "muls r6, r7\n\t"
  164288. #else
  164289. "mul r6, r7\n\t"
  164290. #endif
  164291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164292. "lsrs r7, r6, #16\n\t"
  164293. #else
  164294. "lsr r7, r6, #16\n\t"
  164295. #endif
  164296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164297. "lsls r6, r6, #16\n\t"
  164298. #else
  164299. "lsl r6, r6, #16\n\t"
  164300. #endif
  164301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164302. "adds r4, r4, r6\n\t"
  164303. #else
  164304. "add r4, r4, r6\n\t"
  164305. #endif
  164306. #ifdef WOLFSSL_KEIL
  164307. "adcs r5, r5, r7\n\t"
  164308. #elif defined(__clang__)
  164309. "adcs r5, r7\n\t"
  164310. #else
  164311. "adc r5, r7\n\t"
  164312. #endif
  164313. #ifdef WOLFSSL_KEIL
  164314. "adcs r3, r3, %[r]\n\t"
  164315. #elif defined(__clang__)
  164316. "adcs r3, %[r]\n\t"
  164317. #else
  164318. "adc r3, %[r]\n\t"
  164319. #endif
  164320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164321. "lsrs r6, %[a], #16\n\t"
  164322. #else
  164323. "lsr r6, %[a], #16\n\t"
  164324. #endif
  164325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164326. "lsrs r7, %[b], #16\n\t"
  164327. #else
  164328. "lsr r7, %[b], #16\n\t"
  164329. #endif
  164330. #ifdef WOLFSSL_KEIL
  164331. "muls r7, r6, r7\n\t"
  164332. #elif defined(__clang__)
  164333. "muls r7, r6\n\t"
  164334. #else
  164335. "mul r7, r6\n\t"
  164336. #endif
  164337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164338. "adds r5, r5, r7\n\t"
  164339. #else
  164340. "add r5, r5, r7\n\t"
  164341. #endif
  164342. #ifdef WOLFSSL_KEIL
  164343. "adcs r3, r3, %[r]\n\t"
  164344. #elif defined(__clang__)
  164345. "adcs r3, %[r]\n\t"
  164346. #else
  164347. "adc r3, %[r]\n\t"
  164348. #endif
  164349. "uxth r7, %[b]\n\t"
  164350. #ifdef WOLFSSL_KEIL
  164351. "muls r6, r7, r6\n\t"
  164352. #elif defined(__clang__)
  164353. "muls r6, r7\n\t"
  164354. #else
  164355. "mul r6, r7\n\t"
  164356. #endif
  164357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164358. "lsrs r7, r6, #16\n\t"
  164359. #else
  164360. "lsr r7, r6, #16\n\t"
  164361. #endif
  164362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164363. "lsls r6, r6, #16\n\t"
  164364. #else
  164365. "lsl r6, r6, #16\n\t"
  164366. #endif
  164367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164368. "adds r4, r4, r6\n\t"
  164369. #else
  164370. "add r4, r4, r6\n\t"
  164371. #endif
  164372. #ifdef WOLFSSL_KEIL
  164373. "adcs r5, r5, r7\n\t"
  164374. #elif defined(__clang__)
  164375. "adcs r5, r7\n\t"
  164376. #else
  164377. "adc r5, r7\n\t"
  164378. #endif
  164379. #ifdef WOLFSSL_KEIL
  164380. "adcs r3, r3, %[r]\n\t"
  164381. #elif defined(__clang__)
  164382. "adcs r3, %[r]\n\t"
  164383. #else
  164384. "adc r3, %[r]\n\t"
  164385. #endif
  164386. "# A[10] * B[12]\n\t"
  164387. "mov %[a], r9\n\t"
  164388. "mov %[b], r10\n\t"
  164389. "ldr %[a], [%[a], #40]\n\t"
  164390. "ldr %[b], [%[b], #48]\n\t"
  164391. "uxth r6, %[a]\n\t"
  164392. "uxth r7, %[b]\n\t"
  164393. #ifdef WOLFSSL_KEIL
  164394. "muls r7, r6, r7\n\t"
  164395. #elif defined(__clang__)
  164396. "muls r7, r6\n\t"
  164397. #else
  164398. "mul r7, r6\n\t"
  164399. #endif
  164400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164401. "adds r4, r4, r7\n\t"
  164402. #else
  164403. "add r4, r4, r7\n\t"
  164404. #endif
  164405. #ifdef WOLFSSL_KEIL
  164406. "adcs r5, r5, %[r]\n\t"
  164407. #elif defined(__clang__)
  164408. "adcs r5, %[r]\n\t"
  164409. #else
  164410. "adc r5, %[r]\n\t"
  164411. #endif
  164412. #ifdef WOLFSSL_KEIL
  164413. "adcs r3, r3, %[r]\n\t"
  164414. #elif defined(__clang__)
  164415. "adcs r3, %[r]\n\t"
  164416. #else
  164417. "adc r3, %[r]\n\t"
  164418. #endif
  164419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164420. "lsrs r7, %[b], #16\n\t"
  164421. #else
  164422. "lsr r7, %[b], #16\n\t"
  164423. #endif
  164424. #ifdef WOLFSSL_KEIL
  164425. "muls r6, r7, r6\n\t"
  164426. #elif defined(__clang__)
  164427. "muls r6, r7\n\t"
  164428. #else
  164429. "mul r6, r7\n\t"
  164430. #endif
  164431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164432. "lsrs r7, r6, #16\n\t"
  164433. #else
  164434. "lsr r7, r6, #16\n\t"
  164435. #endif
  164436. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164437. "lsls r6, r6, #16\n\t"
  164438. #else
  164439. "lsl r6, r6, #16\n\t"
  164440. #endif
  164441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164442. "adds r4, r4, r6\n\t"
  164443. #else
  164444. "add r4, r4, r6\n\t"
  164445. #endif
  164446. #ifdef WOLFSSL_KEIL
  164447. "adcs r5, r5, r7\n\t"
  164448. #elif defined(__clang__)
  164449. "adcs r5, r7\n\t"
  164450. #else
  164451. "adc r5, r7\n\t"
  164452. #endif
  164453. #ifdef WOLFSSL_KEIL
  164454. "adcs r3, r3, %[r]\n\t"
  164455. #elif defined(__clang__)
  164456. "adcs r3, %[r]\n\t"
  164457. #else
  164458. "adc r3, %[r]\n\t"
  164459. #endif
  164460. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164461. "lsrs r6, %[a], #16\n\t"
  164462. #else
  164463. "lsr r6, %[a], #16\n\t"
  164464. #endif
  164465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164466. "lsrs r7, %[b], #16\n\t"
  164467. #else
  164468. "lsr r7, %[b], #16\n\t"
  164469. #endif
  164470. #ifdef WOLFSSL_KEIL
  164471. "muls r7, r6, r7\n\t"
  164472. #elif defined(__clang__)
  164473. "muls r7, r6\n\t"
  164474. #else
  164475. "mul r7, r6\n\t"
  164476. #endif
  164477. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164478. "adds r5, r5, r7\n\t"
  164479. #else
  164480. "add r5, r5, r7\n\t"
  164481. #endif
  164482. #ifdef WOLFSSL_KEIL
  164483. "adcs r3, r3, %[r]\n\t"
  164484. #elif defined(__clang__)
  164485. "adcs r3, %[r]\n\t"
  164486. #else
  164487. "adc r3, %[r]\n\t"
  164488. #endif
  164489. "uxth r7, %[b]\n\t"
  164490. #ifdef WOLFSSL_KEIL
  164491. "muls r6, r7, r6\n\t"
  164492. #elif defined(__clang__)
  164493. "muls r6, r7\n\t"
  164494. #else
  164495. "mul r6, r7\n\t"
  164496. #endif
  164497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164498. "lsrs r7, r6, #16\n\t"
  164499. #else
  164500. "lsr r7, r6, #16\n\t"
  164501. #endif
  164502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164503. "lsls r6, r6, #16\n\t"
  164504. #else
  164505. "lsl r6, r6, #16\n\t"
  164506. #endif
  164507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164508. "adds r4, r4, r6\n\t"
  164509. #else
  164510. "add r4, r4, r6\n\t"
  164511. #endif
  164512. #ifdef WOLFSSL_KEIL
  164513. "adcs r5, r5, r7\n\t"
  164514. #elif defined(__clang__)
  164515. "adcs r5, r7\n\t"
  164516. #else
  164517. "adc r5, r7\n\t"
  164518. #endif
  164519. #ifdef WOLFSSL_KEIL
  164520. "adcs r3, r3, %[r]\n\t"
  164521. #elif defined(__clang__)
  164522. "adcs r3, %[r]\n\t"
  164523. #else
  164524. "adc r3, %[r]\n\t"
  164525. #endif
  164526. "# A[9] * B[13]\n\t"
  164527. "mov %[a], r9\n\t"
  164528. "mov %[b], r10\n\t"
  164529. "ldr %[a], [%[a], #36]\n\t"
  164530. "ldr %[b], [%[b], #52]\n\t"
  164531. "uxth r6, %[a]\n\t"
  164532. "uxth r7, %[b]\n\t"
  164533. #ifdef WOLFSSL_KEIL
  164534. "muls r7, r6, r7\n\t"
  164535. #elif defined(__clang__)
  164536. "muls r7, r6\n\t"
  164537. #else
  164538. "mul r7, r6\n\t"
  164539. #endif
  164540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164541. "adds r4, r4, r7\n\t"
  164542. #else
  164543. "add r4, r4, r7\n\t"
  164544. #endif
  164545. #ifdef WOLFSSL_KEIL
  164546. "adcs r5, r5, %[r]\n\t"
  164547. #elif defined(__clang__)
  164548. "adcs r5, %[r]\n\t"
  164549. #else
  164550. "adc r5, %[r]\n\t"
  164551. #endif
  164552. #ifdef WOLFSSL_KEIL
  164553. "adcs r3, r3, %[r]\n\t"
  164554. #elif defined(__clang__)
  164555. "adcs r3, %[r]\n\t"
  164556. #else
  164557. "adc r3, %[r]\n\t"
  164558. #endif
  164559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164560. "lsrs r7, %[b], #16\n\t"
  164561. #else
  164562. "lsr r7, %[b], #16\n\t"
  164563. #endif
  164564. #ifdef WOLFSSL_KEIL
  164565. "muls r6, r7, r6\n\t"
  164566. #elif defined(__clang__)
  164567. "muls r6, r7\n\t"
  164568. #else
  164569. "mul r6, r7\n\t"
  164570. #endif
  164571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164572. "lsrs r7, r6, #16\n\t"
  164573. #else
  164574. "lsr r7, r6, #16\n\t"
  164575. #endif
  164576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164577. "lsls r6, r6, #16\n\t"
  164578. #else
  164579. "lsl r6, r6, #16\n\t"
  164580. #endif
  164581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164582. "adds r4, r4, r6\n\t"
  164583. #else
  164584. "add r4, r4, r6\n\t"
  164585. #endif
  164586. #ifdef WOLFSSL_KEIL
  164587. "adcs r5, r5, r7\n\t"
  164588. #elif defined(__clang__)
  164589. "adcs r5, r7\n\t"
  164590. #else
  164591. "adc r5, r7\n\t"
  164592. #endif
  164593. #ifdef WOLFSSL_KEIL
  164594. "adcs r3, r3, %[r]\n\t"
  164595. #elif defined(__clang__)
  164596. "adcs r3, %[r]\n\t"
  164597. #else
  164598. "adc r3, %[r]\n\t"
  164599. #endif
  164600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164601. "lsrs r6, %[a], #16\n\t"
  164602. #else
  164603. "lsr r6, %[a], #16\n\t"
  164604. #endif
  164605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164606. "lsrs r7, %[b], #16\n\t"
  164607. #else
  164608. "lsr r7, %[b], #16\n\t"
  164609. #endif
  164610. #ifdef WOLFSSL_KEIL
  164611. "muls r7, r6, r7\n\t"
  164612. #elif defined(__clang__)
  164613. "muls r7, r6\n\t"
  164614. #else
  164615. "mul r7, r6\n\t"
  164616. #endif
  164617. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164618. "adds r5, r5, r7\n\t"
  164619. #else
  164620. "add r5, r5, r7\n\t"
  164621. #endif
  164622. #ifdef WOLFSSL_KEIL
  164623. "adcs r3, r3, %[r]\n\t"
  164624. #elif defined(__clang__)
  164625. "adcs r3, %[r]\n\t"
  164626. #else
  164627. "adc r3, %[r]\n\t"
  164628. #endif
  164629. "uxth r7, %[b]\n\t"
  164630. #ifdef WOLFSSL_KEIL
  164631. "muls r6, r7, r6\n\t"
  164632. #elif defined(__clang__)
  164633. "muls r6, r7\n\t"
  164634. #else
  164635. "mul r6, r7\n\t"
  164636. #endif
  164637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164638. "lsrs r7, r6, #16\n\t"
  164639. #else
  164640. "lsr r7, r6, #16\n\t"
  164641. #endif
  164642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164643. "lsls r6, r6, #16\n\t"
  164644. #else
  164645. "lsl r6, r6, #16\n\t"
  164646. #endif
  164647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164648. "adds r4, r4, r6\n\t"
  164649. #else
  164650. "add r4, r4, r6\n\t"
  164651. #endif
  164652. #ifdef WOLFSSL_KEIL
  164653. "adcs r5, r5, r7\n\t"
  164654. #elif defined(__clang__)
  164655. "adcs r5, r7\n\t"
  164656. #else
  164657. "adc r5, r7\n\t"
  164658. #endif
  164659. #ifdef WOLFSSL_KEIL
  164660. "adcs r3, r3, %[r]\n\t"
  164661. #elif defined(__clang__)
  164662. "adcs r3, %[r]\n\t"
  164663. #else
  164664. "adc r3, %[r]\n\t"
  164665. #endif
  164666. "# A[8] * B[14]\n\t"
  164667. "mov %[a], r9\n\t"
  164668. "mov %[b], r10\n\t"
  164669. "ldr %[a], [%[a], #32]\n\t"
  164670. "ldr %[b], [%[b], #56]\n\t"
  164671. "uxth r6, %[a]\n\t"
  164672. "uxth r7, %[b]\n\t"
  164673. #ifdef WOLFSSL_KEIL
  164674. "muls r7, r6, r7\n\t"
  164675. #elif defined(__clang__)
  164676. "muls r7, r6\n\t"
  164677. #else
  164678. "mul r7, r6\n\t"
  164679. #endif
  164680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164681. "adds r4, r4, r7\n\t"
  164682. #else
  164683. "add r4, r4, r7\n\t"
  164684. #endif
  164685. #ifdef WOLFSSL_KEIL
  164686. "adcs r5, r5, %[r]\n\t"
  164687. #elif defined(__clang__)
  164688. "adcs r5, %[r]\n\t"
  164689. #else
  164690. "adc r5, %[r]\n\t"
  164691. #endif
  164692. #ifdef WOLFSSL_KEIL
  164693. "adcs r3, r3, %[r]\n\t"
  164694. #elif defined(__clang__)
  164695. "adcs r3, %[r]\n\t"
  164696. #else
  164697. "adc r3, %[r]\n\t"
  164698. #endif
  164699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164700. "lsrs r7, %[b], #16\n\t"
  164701. #else
  164702. "lsr r7, %[b], #16\n\t"
  164703. #endif
  164704. #ifdef WOLFSSL_KEIL
  164705. "muls r6, r7, r6\n\t"
  164706. #elif defined(__clang__)
  164707. "muls r6, r7\n\t"
  164708. #else
  164709. "mul r6, r7\n\t"
  164710. #endif
  164711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164712. "lsrs r7, r6, #16\n\t"
  164713. #else
  164714. "lsr r7, r6, #16\n\t"
  164715. #endif
  164716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164717. "lsls r6, r6, #16\n\t"
  164718. #else
  164719. "lsl r6, r6, #16\n\t"
  164720. #endif
  164721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164722. "adds r4, r4, r6\n\t"
  164723. #else
  164724. "add r4, r4, r6\n\t"
  164725. #endif
  164726. #ifdef WOLFSSL_KEIL
  164727. "adcs r5, r5, r7\n\t"
  164728. #elif defined(__clang__)
  164729. "adcs r5, r7\n\t"
  164730. #else
  164731. "adc r5, r7\n\t"
  164732. #endif
  164733. #ifdef WOLFSSL_KEIL
  164734. "adcs r3, r3, %[r]\n\t"
  164735. #elif defined(__clang__)
  164736. "adcs r3, %[r]\n\t"
  164737. #else
  164738. "adc r3, %[r]\n\t"
  164739. #endif
  164740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164741. "lsrs r6, %[a], #16\n\t"
  164742. #else
  164743. "lsr r6, %[a], #16\n\t"
  164744. #endif
  164745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164746. "lsrs r7, %[b], #16\n\t"
  164747. #else
  164748. "lsr r7, %[b], #16\n\t"
  164749. #endif
  164750. #ifdef WOLFSSL_KEIL
  164751. "muls r7, r6, r7\n\t"
  164752. #elif defined(__clang__)
  164753. "muls r7, r6\n\t"
  164754. #else
  164755. "mul r7, r6\n\t"
  164756. #endif
  164757. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164758. "adds r5, r5, r7\n\t"
  164759. #else
  164760. "add r5, r5, r7\n\t"
  164761. #endif
  164762. #ifdef WOLFSSL_KEIL
  164763. "adcs r3, r3, %[r]\n\t"
  164764. #elif defined(__clang__)
  164765. "adcs r3, %[r]\n\t"
  164766. #else
  164767. "adc r3, %[r]\n\t"
  164768. #endif
  164769. "uxth r7, %[b]\n\t"
  164770. #ifdef WOLFSSL_KEIL
  164771. "muls r6, r7, r6\n\t"
  164772. #elif defined(__clang__)
  164773. "muls r6, r7\n\t"
  164774. #else
  164775. "mul r6, r7\n\t"
  164776. #endif
  164777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164778. "lsrs r7, r6, #16\n\t"
  164779. #else
  164780. "lsr r7, r6, #16\n\t"
  164781. #endif
  164782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164783. "lsls r6, r6, #16\n\t"
  164784. #else
  164785. "lsl r6, r6, #16\n\t"
  164786. #endif
  164787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164788. "adds r4, r4, r6\n\t"
  164789. #else
  164790. "add r4, r4, r6\n\t"
  164791. #endif
  164792. #ifdef WOLFSSL_KEIL
  164793. "adcs r5, r5, r7\n\t"
  164794. #elif defined(__clang__)
  164795. "adcs r5, r7\n\t"
  164796. #else
  164797. "adc r5, r7\n\t"
  164798. #endif
  164799. #ifdef WOLFSSL_KEIL
  164800. "adcs r3, r3, %[r]\n\t"
  164801. #elif defined(__clang__)
  164802. "adcs r3, %[r]\n\t"
  164803. #else
  164804. "adc r3, %[r]\n\t"
  164805. #endif
  164806. "# A[7] * B[15]\n\t"
  164807. "mov %[a], r9\n\t"
  164808. "mov %[b], r10\n\t"
  164809. "ldr %[a], [%[a], #28]\n\t"
  164810. "ldr %[b], [%[b], #60]\n\t"
  164811. "uxth r6, %[a]\n\t"
  164812. "uxth r7, %[b]\n\t"
  164813. #ifdef WOLFSSL_KEIL
  164814. "muls r7, r6, r7\n\t"
  164815. #elif defined(__clang__)
  164816. "muls r7, r6\n\t"
  164817. #else
  164818. "mul r7, r6\n\t"
  164819. #endif
  164820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164821. "adds r4, r4, r7\n\t"
  164822. #else
  164823. "add r4, r4, r7\n\t"
  164824. #endif
  164825. #ifdef WOLFSSL_KEIL
  164826. "adcs r5, r5, %[r]\n\t"
  164827. #elif defined(__clang__)
  164828. "adcs r5, %[r]\n\t"
  164829. #else
  164830. "adc r5, %[r]\n\t"
  164831. #endif
  164832. #ifdef WOLFSSL_KEIL
  164833. "adcs r3, r3, %[r]\n\t"
  164834. #elif defined(__clang__)
  164835. "adcs r3, %[r]\n\t"
  164836. #else
  164837. "adc r3, %[r]\n\t"
  164838. #endif
  164839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164840. "lsrs r7, %[b], #16\n\t"
  164841. #else
  164842. "lsr r7, %[b], #16\n\t"
  164843. #endif
  164844. #ifdef WOLFSSL_KEIL
  164845. "muls r6, r7, r6\n\t"
  164846. #elif defined(__clang__)
  164847. "muls r6, r7\n\t"
  164848. #else
  164849. "mul r6, r7\n\t"
  164850. #endif
  164851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164852. "lsrs r7, r6, #16\n\t"
  164853. #else
  164854. "lsr r7, r6, #16\n\t"
  164855. #endif
  164856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164857. "lsls r6, r6, #16\n\t"
  164858. #else
  164859. "lsl r6, r6, #16\n\t"
  164860. #endif
  164861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164862. "adds r4, r4, r6\n\t"
  164863. #else
  164864. "add r4, r4, r6\n\t"
  164865. #endif
  164866. #ifdef WOLFSSL_KEIL
  164867. "adcs r5, r5, r7\n\t"
  164868. #elif defined(__clang__)
  164869. "adcs r5, r7\n\t"
  164870. #else
  164871. "adc r5, r7\n\t"
  164872. #endif
  164873. #ifdef WOLFSSL_KEIL
  164874. "adcs r3, r3, %[r]\n\t"
  164875. #elif defined(__clang__)
  164876. "adcs r3, %[r]\n\t"
  164877. #else
  164878. "adc r3, %[r]\n\t"
  164879. #endif
  164880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164881. "lsrs r6, %[a], #16\n\t"
  164882. #else
  164883. "lsr r6, %[a], #16\n\t"
  164884. #endif
  164885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164886. "lsrs r7, %[b], #16\n\t"
  164887. #else
  164888. "lsr r7, %[b], #16\n\t"
  164889. #endif
  164890. #ifdef WOLFSSL_KEIL
  164891. "muls r7, r6, r7\n\t"
  164892. #elif defined(__clang__)
  164893. "muls r7, r6\n\t"
  164894. #else
  164895. "mul r7, r6\n\t"
  164896. #endif
  164897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164898. "adds r5, r5, r7\n\t"
  164899. #else
  164900. "add r5, r5, r7\n\t"
  164901. #endif
  164902. #ifdef WOLFSSL_KEIL
  164903. "adcs r3, r3, %[r]\n\t"
  164904. #elif defined(__clang__)
  164905. "adcs r3, %[r]\n\t"
  164906. #else
  164907. "adc r3, %[r]\n\t"
  164908. #endif
  164909. "uxth r7, %[b]\n\t"
  164910. #ifdef WOLFSSL_KEIL
  164911. "muls r6, r7, r6\n\t"
  164912. #elif defined(__clang__)
  164913. "muls r6, r7\n\t"
  164914. #else
  164915. "mul r6, r7\n\t"
  164916. #endif
  164917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164918. "lsrs r7, r6, #16\n\t"
  164919. #else
  164920. "lsr r7, r6, #16\n\t"
  164921. #endif
  164922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164923. "lsls r6, r6, #16\n\t"
  164924. #else
  164925. "lsl r6, r6, #16\n\t"
  164926. #endif
  164927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164928. "adds r4, r4, r6\n\t"
  164929. #else
  164930. "add r4, r4, r6\n\t"
  164931. #endif
  164932. #ifdef WOLFSSL_KEIL
  164933. "adcs r5, r5, r7\n\t"
  164934. #elif defined(__clang__)
  164935. "adcs r5, r7\n\t"
  164936. #else
  164937. "adc r5, r7\n\t"
  164938. #endif
  164939. #ifdef WOLFSSL_KEIL
  164940. "adcs r3, r3, %[r]\n\t"
  164941. #elif defined(__clang__)
  164942. "adcs r3, %[r]\n\t"
  164943. #else
  164944. "adc r3, %[r]\n\t"
  164945. #endif
  164946. "mov %[r], r8\n\t"
  164947. "str r4, [%[r], #88]\n\t"
  164948. "movs %[r], #0\n\t"
  164949. "# A[8] * B[15]\n\t"
  164950. "movs r4, #0\n\t"
  164951. "mov %[a], r9\n\t"
  164952. "mov %[b], r10\n\t"
  164953. "ldr %[a], [%[a], #32]\n\t"
  164954. "ldr %[b], [%[b], #60]\n\t"
  164955. "uxth r6, %[a]\n\t"
  164956. "uxth r7, %[b]\n\t"
  164957. #ifdef WOLFSSL_KEIL
  164958. "muls r7, r6, r7\n\t"
  164959. #elif defined(__clang__)
  164960. "muls r7, r6\n\t"
  164961. #else
  164962. "mul r7, r6\n\t"
  164963. #endif
  164964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164965. "adds r5, r5, r7\n\t"
  164966. #else
  164967. "add r5, r5, r7\n\t"
  164968. #endif
  164969. #ifdef WOLFSSL_KEIL
  164970. "adcs r3, r3, %[r]\n\t"
  164971. #elif defined(__clang__)
  164972. "adcs r3, %[r]\n\t"
  164973. #else
  164974. "adc r3, %[r]\n\t"
  164975. #endif
  164976. #ifdef WOLFSSL_KEIL
  164977. "adcs r4, r4, %[r]\n\t"
  164978. #elif defined(__clang__)
  164979. "adcs r4, %[r]\n\t"
  164980. #else
  164981. "adc r4, %[r]\n\t"
  164982. #endif
  164983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164984. "lsrs r7, %[b], #16\n\t"
  164985. #else
  164986. "lsr r7, %[b], #16\n\t"
  164987. #endif
  164988. #ifdef WOLFSSL_KEIL
  164989. "muls r6, r7, r6\n\t"
  164990. #elif defined(__clang__)
  164991. "muls r6, r7\n\t"
  164992. #else
  164993. "mul r6, r7\n\t"
  164994. #endif
  164995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  164996. "lsrs r7, r6, #16\n\t"
  164997. #else
  164998. "lsr r7, r6, #16\n\t"
  164999. #endif
  165000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165001. "lsls r6, r6, #16\n\t"
  165002. #else
  165003. "lsl r6, r6, #16\n\t"
  165004. #endif
  165005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165006. "adds r5, r5, r6\n\t"
  165007. #else
  165008. "add r5, r5, r6\n\t"
  165009. #endif
  165010. #ifdef WOLFSSL_KEIL
  165011. "adcs r3, r3, r7\n\t"
  165012. #elif defined(__clang__)
  165013. "adcs r3, r7\n\t"
  165014. #else
  165015. "adc r3, r7\n\t"
  165016. #endif
  165017. #ifdef WOLFSSL_KEIL
  165018. "adcs r4, r4, %[r]\n\t"
  165019. #elif defined(__clang__)
  165020. "adcs r4, %[r]\n\t"
  165021. #else
  165022. "adc r4, %[r]\n\t"
  165023. #endif
  165024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165025. "lsrs r6, %[a], #16\n\t"
  165026. #else
  165027. "lsr r6, %[a], #16\n\t"
  165028. #endif
  165029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165030. "lsrs r7, %[b], #16\n\t"
  165031. #else
  165032. "lsr r7, %[b], #16\n\t"
  165033. #endif
  165034. #ifdef WOLFSSL_KEIL
  165035. "muls r7, r6, r7\n\t"
  165036. #elif defined(__clang__)
  165037. "muls r7, r6\n\t"
  165038. #else
  165039. "mul r7, r6\n\t"
  165040. #endif
  165041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165042. "adds r3, r3, r7\n\t"
  165043. #else
  165044. "add r3, r3, r7\n\t"
  165045. #endif
  165046. #ifdef WOLFSSL_KEIL
  165047. "adcs r4, r4, %[r]\n\t"
  165048. #elif defined(__clang__)
  165049. "adcs r4, %[r]\n\t"
  165050. #else
  165051. "adc r4, %[r]\n\t"
  165052. #endif
  165053. "uxth r7, %[b]\n\t"
  165054. #ifdef WOLFSSL_KEIL
  165055. "muls r6, r7, r6\n\t"
  165056. #elif defined(__clang__)
  165057. "muls r6, r7\n\t"
  165058. #else
  165059. "mul r6, r7\n\t"
  165060. #endif
  165061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165062. "lsrs r7, r6, #16\n\t"
  165063. #else
  165064. "lsr r7, r6, #16\n\t"
  165065. #endif
  165066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165067. "lsls r6, r6, #16\n\t"
  165068. #else
  165069. "lsl r6, r6, #16\n\t"
  165070. #endif
  165071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165072. "adds r5, r5, r6\n\t"
  165073. #else
  165074. "add r5, r5, r6\n\t"
  165075. #endif
  165076. #ifdef WOLFSSL_KEIL
  165077. "adcs r3, r3, r7\n\t"
  165078. #elif defined(__clang__)
  165079. "adcs r3, r7\n\t"
  165080. #else
  165081. "adc r3, r7\n\t"
  165082. #endif
  165083. #ifdef WOLFSSL_KEIL
  165084. "adcs r4, r4, %[r]\n\t"
  165085. #elif defined(__clang__)
  165086. "adcs r4, %[r]\n\t"
  165087. #else
  165088. "adc r4, %[r]\n\t"
  165089. #endif
  165090. "# A[9] * B[14]\n\t"
  165091. "mov %[a], r9\n\t"
  165092. "mov %[b], r10\n\t"
  165093. "ldr %[a], [%[a], #36]\n\t"
  165094. "ldr %[b], [%[b], #56]\n\t"
  165095. "uxth r6, %[a]\n\t"
  165096. "uxth r7, %[b]\n\t"
  165097. #ifdef WOLFSSL_KEIL
  165098. "muls r7, r6, r7\n\t"
  165099. #elif defined(__clang__)
  165100. "muls r7, r6\n\t"
  165101. #else
  165102. "mul r7, r6\n\t"
  165103. #endif
  165104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165105. "adds r5, r5, r7\n\t"
  165106. #else
  165107. "add r5, r5, r7\n\t"
  165108. #endif
  165109. #ifdef WOLFSSL_KEIL
  165110. "adcs r3, r3, %[r]\n\t"
  165111. #elif defined(__clang__)
  165112. "adcs r3, %[r]\n\t"
  165113. #else
  165114. "adc r3, %[r]\n\t"
  165115. #endif
  165116. #ifdef WOLFSSL_KEIL
  165117. "adcs r4, r4, %[r]\n\t"
  165118. #elif defined(__clang__)
  165119. "adcs r4, %[r]\n\t"
  165120. #else
  165121. "adc r4, %[r]\n\t"
  165122. #endif
  165123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165124. "lsrs r7, %[b], #16\n\t"
  165125. #else
  165126. "lsr r7, %[b], #16\n\t"
  165127. #endif
  165128. #ifdef WOLFSSL_KEIL
  165129. "muls r6, r7, r6\n\t"
  165130. #elif defined(__clang__)
  165131. "muls r6, r7\n\t"
  165132. #else
  165133. "mul r6, r7\n\t"
  165134. #endif
  165135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165136. "lsrs r7, r6, #16\n\t"
  165137. #else
  165138. "lsr r7, r6, #16\n\t"
  165139. #endif
  165140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165141. "lsls r6, r6, #16\n\t"
  165142. #else
  165143. "lsl r6, r6, #16\n\t"
  165144. #endif
  165145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165146. "adds r5, r5, r6\n\t"
  165147. #else
  165148. "add r5, r5, r6\n\t"
  165149. #endif
  165150. #ifdef WOLFSSL_KEIL
  165151. "adcs r3, r3, r7\n\t"
  165152. #elif defined(__clang__)
  165153. "adcs r3, r7\n\t"
  165154. #else
  165155. "adc r3, r7\n\t"
  165156. #endif
  165157. #ifdef WOLFSSL_KEIL
  165158. "adcs r4, r4, %[r]\n\t"
  165159. #elif defined(__clang__)
  165160. "adcs r4, %[r]\n\t"
  165161. #else
  165162. "adc r4, %[r]\n\t"
  165163. #endif
  165164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165165. "lsrs r6, %[a], #16\n\t"
  165166. #else
  165167. "lsr r6, %[a], #16\n\t"
  165168. #endif
  165169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165170. "lsrs r7, %[b], #16\n\t"
  165171. #else
  165172. "lsr r7, %[b], #16\n\t"
  165173. #endif
  165174. #ifdef WOLFSSL_KEIL
  165175. "muls r7, r6, r7\n\t"
  165176. #elif defined(__clang__)
  165177. "muls r7, r6\n\t"
  165178. #else
  165179. "mul r7, r6\n\t"
  165180. #endif
  165181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165182. "adds r3, r3, r7\n\t"
  165183. #else
  165184. "add r3, r3, r7\n\t"
  165185. #endif
  165186. #ifdef WOLFSSL_KEIL
  165187. "adcs r4, r4, %[r]\n\t"
  165188. #elif defined(__clang__)
  165189. "adcs r4, %[r]\n\t"
  165190. #else
  165191. "adc r4, %[r]\n\t"
  165192. #endif
  165193. "uxth r7, %[b]\n\t"
  165194. #ifdef WOLFSSL_KEIL
  165195. "muls r6, r7, r6\n\t"
  165196. #elif defined(__clang__)
  165197. "muls r6, r7\n\t"
  165198. #else
  165199. "mul r6, r7\n\t"
  165200. #endif
  165201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165202. "lsrs r7, r6, #16\n\t"
  165203. #else
  165204. "lsr r7, r6, #16\n\t"
  165205. #endif
  165206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165207. "lsls r6, r6, #16\n\t"
  165208. #else
  165209. "lsl r6, r6, #16\n\t"
  165210. #endif
  165211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165212. "adds r5, r5, r6\n\t"
  165213. #else
  165214. "add r5, r5, r6\n\t"
  165215. #endif
  165216. #ifdef WOLFSSL_KEIL
  165217. "adcs r3, r3, r7\n\t"
  165218. #elif defined(__clang__)
  165219. "adcs r3, r7\n\t"
  165220. #else
  165221. "adc r3, r7\n\t"
  165222. #endif
  165223. #ifdef WOLFSSL_KEIL
  165224. "adcs r4, r4, %[r]\n\t"
  165225. #elif defined(__clang__)
  165226. "adcs r4, %[r]\n\t"
  165227. #else
  165228. "adc r4, %[r]\n\t"
  165229. #endif
  165230. "# A[10] * B[13]\n\t"
  165231. "mov %[a], r9\n\t"
  165232. "mov %[b], r10\n\t"
  165233. "ldr %[a], [%[a], #40]\n\t"
  165234. "ldr %[b], [%[b], #52]\n\t"
  165235. "uxth r6, %[a]\n\t"
  165236. "uxth r7, %[b]\n\t"
  165237. #ifdef WOLFSSL_KEIL
  165238. "muls r7, r6, r7\n\t"
  165239. #elif defined(__clang__)
  165240. "muls r7, r6\n\t"
  165241. #else
  165242. "mul r7, r6\n\t"
  165243. #endif
  165244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165245. "adds r5, r5, r7\n\t"
  165246. #else
  165247. "add r5, r5, r7\n\t"
  165248. #endif
  165249. #ifdef WOLFSSL_KEIL
  165250. "adcs r3, r3, %[r]\n\t"
  165251. #elif defined(__clang__)
  165252. "adcs r3, %[r]\n\t"
  165253. #else
  165254. "adc r3, %[r]\n\t"
  165255. #endif
  165256. #ifdef WOLFSSL_KEIL
  165257. "adcs r4, r4, %[r]\n\t"
  165258. #elif defined(__clang__)
  165259. "adcs r4, %[r]\n\t"
  165260. #else
  165261. "adc r4, %[r]\n\t"
  165262. #endif
  165263. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165264. "lsrs r7, %[b], #16\n\t"
  165265. #else
  165266. "lsr r7, %[b], #16\n\t"
  165267. #endif
  165268. #ifdef WOLFSSL_KEIL
  165269. "muls r6, r7, r6\n\t"
  165270. #elif defined(__clang__)
  165271. "muls r6, r7\n\t"
  165272. #else
  165273. "mul r6, r7\n\t"
  165274. #endif
  165275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165276. "lsrs r7, r6, #16\n\t"
  165277. #else
  165278. "lsr r7, r6, #16\n\t"
  165279. #endif
  165280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165281. "lsls r6, r6, #16\n\t"
  165282. #else
  165283. "lsl r6, r6, #16\n\t"
  165284. #endif
  165285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165286. "adds r5, r5, r6\n\t"
  165287. #else
  165288. "add r5, r5, r6\n\t"
  165289. #endif
  165290. #ifdef WOLFSSL_KEIL
  165291. "adcs r3, r3, r7\n\t"
  165292. #elif defined(__clang__)
  165293. "adcs r3, r7\n\t"
  165294. #else
  165295. "adc r3, r7\n\t"
  165296. #endif
  165297. #ifdef WOLFSSL_KEIL
  165298. "adcs r4, r4, %[r]\n\t"
  165299. #elif defined(__clang__)
  165300. "adcs r4, %[r]\n\t"
  165301. #else
  165302. "adc r4, %[r]\n\t"
  165303. #endif
  165304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165305. "lsrs r6, %[a], #16\n\t"
  165306. #else
  165307. "lsr r6, %[a], #16\n\t"
  165308. #endif
  165309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165310. "lsrs r7, %[b], #16\n\t"
  165311. #else
  165312. "lsr r7, %[b], #16\n\t"
  165313. #endif
  165314. #ifdef WOLFSSL_KEIL
  165315. "muls r7, r6, r7\n\t"
  165316. #elif defined(__clang__)
  165317. "muls r7, r6\n\t"
  165318. #else
  165319. "mul r7, r6\n\t"
  165320. #endif
  165321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165322. "adds r3, r3, r7\n\t"
  165323. #else
  165324. "add r3, r3, r7\n\t"
  165325. #endif
  165326. #ifdef WOLFSSL_KEIL
  165327. "adcs r4, r4, %[r]\n\t"
  165328. #elif defined(__clang__)
  165329. "adcs r4, %[r]\n\t"
  165330. #else
  165331. "adc r4, %[r]\n\t"
  165332. #endif
  165333. "uxth r7, %[b]\n\t"
  165334. #ifdef WOLFSSL_KEIL
  165335. "muls r6, r7, r6\n\t"
  165336. #elif defined(__clang__)
  165337. "muls r6, r7\n\t"
  165338. #else
  165339. "mul r6, r7\n\t"
  165340. #endif
  165341. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165342. "lsrs r7, r6, #16\n\t"
  165343. #else
  165344. "lsr r7, r6, #16\n\t"
  165345. #endif
  165346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165347. "lsls r6, r6, #16\n\t"
  165348. #else
  165349. "lsl r6, r6, #16\n\t"
  165350. #endif
  165351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165352. "adds r5, r5, r6\n\t"
  165353. #else
  165354. "add r5, r5, r6\n\t"
  165355. #endif
  165356. #ifdef WOLFSSL_KEIL
  165357. "adcs r3, r3, r7\n\t"
  165358. #elif defined(__clang__)
  165359. "adcs r3, r7\n\t"
  165360. #else
  165361. "adc r3, r7\n\t"
  165362. #endif
  165363. #ifdef WOLFSSL_KEIL
  165364. "adcs r4, r4, %[r]\n\t"
  165365. #elif defined(__clang__)
  165366. "adcs r4, %[r]\n\t"
  165367. #else
  165368. "adc r4, %[r]\n\t"
  165369. #endif
  165370. "# A[11] * B[12]\n\t"
  165371. "mov %[a], r9\n\t"
  165372. "mov %[b], r10\n\t"
  165373. "ldr %[a], [%[a], #44]\n\t"
  165374. "ldr %[b], [%[b], #48]\n\t"
  165375. "uxth r6, %[a]\n\t"
  165376. "uxth r7, %[b]\n\t"
  165377. #ifdef WOLFSSL_KEIL
  165378. "muls r7, r6, r7\n\t"
  165379. #elif defined(__clang__)
  165380. "muls r7, r6\n\t"
  165381. #else
  165382. "mul r7, r6\n\t"
  165383. #endif
  165384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165385. "adds r5, r5, r7\n\t"
  165386. #else
  165387. "add r5, r5, r7\n\t"
  165388. #endif
  165389. #ifdef WOLFSSL_KEIL
  165390. "adcs r3, r3, %[r]\n\t"
  165391. #elif defined(__clang__)
  165392. "adcs r3, %[r]\n\t"
  165393. #else
  165394. "adc r3, %[r]\n\t"
  165395. #endif
  165396. #ifdef WOLFSSL_KEIL
  165397. "adcs r4, r4, %[r]\n\t"
  165398. #elif defined(__clang__)
  165399. "adcs r4, %[r]\n\t"
  165400. #else
  165401. "adc r4, %[r]\n\t"
  165402. #endif
  165403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165404. "lsrs r7, %[b], #16\n\t"
  165405. #else
  165406. "lsr r7, %[b], #16\n\t"
  165407. #endif
  165408. #ifdef WOLFSSL_KEIL
  165409. "muls r6, r7, r6\n\t"
  165410. #elif defined(__clang__)
  165411. "muls r6, r7\n\t"
  165412. #else
  165413. "mul r6, r7\n\t"
  165414. #endif
  165415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165416. "lsrs r7, r6, #16\n\t"
  165417. #else
  165418. "lsr r7, r6, #16\n\t"
  165419. #endif
  165420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165421. "lsls r6, r6, #16\n\t"
  165422. #else
  165423. "lsl r6, r6, #16\n\t"
  165424. #endif
  165425. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165426. "adds r5, r5, r6\n\t"
  165427. #else
  165428. "add r5, r5, r6\n\t"
  165429. #endif
  165430. #ifdef WOLFSSL_KEIL
  165431. "adcs r3, r3, r7\n\t"
  165432. #elif defined(__clang__)
  165433. "adcs r3, r7\n\t"
  165434. #else
  165435. "adc r3, r7\n\t"
  165436. #endif
  165437. #ifdef WOLFSSL_KEIL
  165438. "adcs r4, r4, %[r]\n\t"
  165439. #elif defined(__clang__)
  165440. "adcs r4, %[r]\n\t"
  165441. #else
  165442. "adc r4, %[r]\n\t"
  165443. #endif
  165444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165445. "lsrs r6, %[a], #16\n\t"
  165446. #else
  165447. "lsr r6, %[a], #16\n\t"
  165448. #endif
  165449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165450. "lsrs r7, %[b], #16\n\t"
  165451. #else
  165452. "lsr r7, %[b], #16\n\t"
  165453. #endif
  165454. #ifdef WOLFSSL_KEIL
  165455. "muls r7, r6, r7\n\t"
  165456. #elif defined(__clang__)
  165457. "muls r7, r6\n\t"
  165458. #else
  165459. "mul r7, r6\n\t"
  165460. #endif
  165461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165462. "adds r3, r3, r7\n\t"
  165463. #else
  165464. "add r3, r3, r7\n\t"
  165465. #endif
  165466. #ifdef WOLFSSL_KEIL
  165467. "adcs r4, r4, %[r]\n\t"
  165468. #elif defined(__clang__)
  165469. "adcs r4, %[r]\n\t"
  165470. #else
  165471. "adc r4, %[r]\n\t"
  165472. #endif
  165473. "uxth r7, %[b]\n\t"
  165474. #ifdef WOLFSSL_KEIL
  165475. "muls r6, r7, r6\n\t"
  165476. #elif defined(__clang__)
  165477. "muls r6, r7\n\t"
  165478. #else
  165479. "mul r6, r7\n\t"
  165480. #endif
  165481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165482. "lsrs r7, r6, #16\n\t"
  165483. #else
  165484. "lsr r7, r6, #16\n\t"
  165485. #endif
  165486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165487. "lsls r6, r6, #16\n\t"
  165488. #else
  165489. "lsl r6, r6, #16\n\t"
  165490. #endif
  165491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165492. "adds r5, r5, r6\n\t"
  165493. #else
  165494. "add r5, r5, r6\n\t"
  165495. #endif
  165496. #ifdef WOLFSSL_KEIL
  165497. "adcs r3, r3, r7\n\t"
  165498. #elif defined(__clang__)
  165499. "adcs r3, r7\n\t"
  165500. #else
  165501. "adc r3, r7\n\t"
  165502. #endif
  165503. #ifdef WOLFSSL_KEIL
  165504. "adcs r4, r4, %[r]\n\t"
  165505. #elif defined(__clang__)
  165506. "adcs r4, %[r]\n\t"
  165507. #else
  165508. "adc r4, %[r]\n\t"
  165509. #endif
  165510. "# A[12] * B[11]\n\t"
  165511. "mov %[a], r9\n\t"
  165512. "mov %[b], r10\n\t"
  165513. "ldr %[a], [%[a], #48]\n\t"
  165514. "ldr %[b], [%[b], #44]\n\t"
  165515. "uxth r6, %[a]\n\t"
  165516. "uxth r7, %[b]\n\t"
  165517. #ifdef WOLFSSL_KEIL
  165518. "muls r7, r6, r7\n\t"
  165519. #elif defined(__clang__)
  165520. "muls r7, r6\n\t"
  165521. #else
  165522. "mul r7, r6\n\t"
  165523. #endif
  165524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165525. "adds r5, r5, r7\n\t"
  165526. #else
  165527. "add r5, r5, r7\n\t"
  165528. #endif
  165529. #ifdef WOLFSSL_KEIL
  165530. "adcs r3, r3, %[r]\n\t"
  165531. #elif defined(__clang__)
  165532. "adcs r3, %[r]\n\t"
  165533. #else
  165534. "adc r3, %[r]\n\t"
  165535. #endif
  165536. #ifdef WOLFSSL_KEIL
  165537. "adcs r4, r4, %[r]\n\t"
  165538. #elif defined(__clang__)
  165539. "adcs r4, %[r]\n\t"
  165540. #else
  165541. "adc r4, %[r]\n\t"
  165542. #endif
  165543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165544. "lsrs r7, %[b], #16\n\t"
  165545. #else
  165546. "lsr r7, %[b], #16\n\t"
  165547. #endif
  165548. #ifdef WOLFSSL_KEIL
  165549. "muls r6, r7, r6\n\t"
  165550. #elif defined(__clang__)
  165551. "muls r6, r7\n\t"
  165552. #else
  165553. "mul r6, r7\n\t"
  165554. #endif
  165555. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165556. "lsrs r7, r6, #16\n\t"
  165557. #else
  165558. "lsr r7, r6, #16\n\t"
  165559. #endif
  165560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165561. "lsls r6, r6, #16\n\t"
  165562. #else
  165563. "lsl r6, r6, #16\n\t"
  165564. #endif
  165565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165566. "adds r5, r5, r6\n\t"
  165567. #else
  165568. "add r5, r5, r6\n\t"
  165569. #endif
  165570. #ifdef WOLFSSL_KEIL
  165571. "adcs r3, r3, r7\n\t"
  165572. #elif defined(__clang__)
  165573. "adcs r3, r7\n\t"
  165574. #else
  165575. "adc r3, r7\n\t"
  165576. #endif
  165577. #ifdef WOLFSSL_KEIL
  165578. "adcs r4, r4, %[r]\n\t"
  165579. #elif defined(__clang__)
  165580. "adcs r4, %[r]\n\t"
  165581. #else
  165582. "adc r4, %[r]\n\t"
  165583. #endif
  165584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165585. "lsrs r6, %[a], #16\n\t"
  165586. #else
  165587. "lsr r6, %[a], #16\n\t"
  165588. #endif
  165589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165590. "lsrs r7, %[b], #16\n\t"
  165591. #else
  165592. "lsr r7, %[b], #16\n\t"
  165593. #endif
  165594. #ifdef WOLFSSL_KEIL
  165595. "muls r7, r6, r7\n\t"
  165596. #elif defined(__clang__)
  165597. "muls r7, r6\n\t"
  165598. #else
  165599. "mul r7, r6\n\t"
  165600. #endif
  165601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165602. "adds r3, r3, r7\n\t"
  165603. #else
  165604. "add r3, r3, r7\n\t"
  165605. #endif
  165606. #ifdef WOLFSSL_KEIL
  165607. "adcs r4, r4, %[r]\n\t"
  165608. #elif defined(__clang__)
  165609. "adcs r4, %[r]\n\t"
  165610. #else
  165611. "adc r4, %[r]\n\t"
  165612. #endif
  165613. "uxth r7, %[b]\n\t"
  165614. #ifdef WOLFSSL_KEIL
  165615. "muls r6, r7, r6\n\t"
  165616. #elif defined(__clang__)
  165617. "muls r6, r7\n\t"
  165618. #else
  165619. "mul r6, r7\n\t"
  165620. #endif
  165621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165622. "lsrs r7, r6, #16\n\t"
  165623. #else
  165624. "lsr r7, r6, #16\n\t"
  165625. #endif
  165626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165627. "lsls r6, r6, #16\n\t"
  165628. #else
  165629. "lsl r6, r6, #16\n\t"
  165630. #endif
  165631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165632. "adds r5, r5, r6\n\t"
  165633. #else
  165634. "add r5, r5, r6\n\t"
  165635. #endif
  165636. #ifdef WOLFSSL_KEIL
  165637. "adcs r3, r3, r7\n\t"
  165638. #elif defined(__clang__)
  165639. "adcs r3, r7\n\t"
  165640. #else
  165641. "adc r3, r7\n\t"
  165642. #endif
  165643. #ifdef WOLFSSL_KEIL
  165644. "adcs r4, r4, %[r]\n\t"
  165645. #elif defined(__clang__)
  165646. "adcs r4, %[r]\n\t"
  165647. #else
  165648. "adc r4, %[r]\n\t"
  165649. #endif
  165650. "# A[13] * B[10]\n\t"
  165651. "mov %[a], r9\n\t"
  165652. "mov %[b], r10\n\t"
  165653. "ldr %[a], [%[a], #52]\n\t"
  165654. "ldr %[b], [%[b], #40]\n\t"
  165655. "uxth r6, %[a]\n\t"
  165656. "uxth r7, %[b]\n\t"
  165657. #ifdef WOLFSSL_KEIL
  165658. "muls r7, r6, r7\n\t"
  165659. #elif defined(__clang__)
  165660. "muls r7, r6\n\t"
  165661. #else
  165662. "mul r7, r6\n\t"
  165663. #endif
  165664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165665. "adds r5, r5, r7\n\t"
  165666. #else
  165667. "add r5, r5, r7\n\t"
  165668. #endif
  165669. #ifdef WOLFSSL_KEIL
  165670. "adcs r3, r3, %[r]\n\t"
  165671. #elif defined(__clang__)
  165672. "adcs r3, %[r]\n\t"
  165673. #else
  165674. "adc r3, %[r]\n\t"
  165675. #endif
  165676. #ifdef WOLFSSL_KEIL
  165677. "adcs r4, r4, %[r]\n\t"
  165678. #elif defined(__clang__)
  165679. "adcs r4, %[r]\n\t"
  165680. #else
  165681. "adc r4, %[r]\n\t"
  165682. #endif
  165683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165684. "lsrs r7, %[b], #16\n\t"
  165685. #else
  165686. "lsr r7, %[b], #16\n\t"
  165687. #endif
  165688. #ifdef WOLFSSL_KEIL
  165689. "muls r6, r7, r6\n\t"
  165690. #elif defined(__clang__)
  165691. "muls r6, r7\n\t"
  165692. #else
  165693. "mul r6, r7\n\t"
  165694. #endif
  165695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165696. "lsrs r7, r6, #16\n\t"
  165697. #else
  165698. "lsr r7, r6, #16\n\t"
  165699. #endif
  165700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165701. "lsls r6, r6, #16\n\t"
  165702. #else
  165703. "lsl r6, r6, #16\n\t"
  165704. #endif
  165705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165706. "adds r5, r5, r6\n\t"
  165707. #else
  165708. "add r5, r5, r6\n\t"
  165709. #endif
  165710. #ifdef WOLFSSL_KEIL
  165711. "adcs r3, r3, r7\n\t"
  165712. #elif defined(__clang__)
  165713. "adcs r3, r7\n\t"
  165714. #else
  165715. "adc r3, r7\n\t"
  165716. #endif
  165717. #ifdef WOLFSSL_KEIL
  165718. "adcs r4, r4, %[r]\n\t"
  165719. #elif defined(__clang__)
  165720. "adcs r4, %[r]\n\t"
  165721. #else
  165722. "adc r4, %[r]\n\t"
  165723. #endif
  165724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165725. "lsrs r6, %[a], #16\n\t"
  165726. #else
  165727. "lsr r6, %[a], #16\n\t"
  165728. #endif
  165729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165730. "lsrs r7, %[b], #16\n\t"
  165731. #else
  165732. "lsr r7, %[b], #16\n\t"
  165733. #endif
  165734. #ifdef WOLFSSL_KEIL
  165735. "muls r7, r6, r7\n\t"
  165736. #elif defined(__clang__)
  165737. "muls r7, r6\n\t"
  165738. #else
  165739. "mul r7, r6\n\t"
  165740. #endif
  165741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165742. "adds r3, r3, r7\n\t"
  165743. #else
  165744. "add r3, r3, r7\n\t"
  165745. #endif
  165746. #ifdef WOLFSSL_KEIL
  165747. "adcs r4, r4, %[r]\n\t"
  165748. #elif defined(__clang__)
  165749. "adcs r4, %[r]\n\t"
  165750. #else
  165751. "adc r4, %[r]\n\t"
  165752. #endif
  165753. "uxth r7, %[b]\n\t"
  165754. #ifdef WOLFSSL_KEIL
  165755. "muls r6, r7, r6\n\t"
  165756. #elif defined(__clang__)
  165757. "muls r6, r7\n\t"
  165758. #else
  165759. "mul r6, r7\n\t"
  165760. #endif
  165761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165762. "lsrs r7, r6, #16\n\t"
  165763. #else
  165764. "lsr r7, r6, #16\n\t"
  165765. #endif
  165766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165767. "lsls r6, r6, #16\n\t"
  165768. #else
  165769. "lsl r6, r6, #16\n\t"
  165770. #endif
  165771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165772. "adds r5, r5, r6\n\t"
  165773. #else
  165774. "add r5, r5, r6\n\t"
  165775. #endif
  165776. #ifdef WOLFSSL_KEIL
  165777. "adcs r3, r3, r7\n\t"
  165778. #elif defined(__clang__)
  165779. "adcs r3, r7\n\t"
  165780. #else
  165781. "adc r3, r7\n\t"
  165782. #endif
  165783. #ifdef WOLFSSL_KEIL
  165784. "adcs r4, r4, %[r]\n\t"
  165785. #elif defined(__clang__)
  165786. "adcs r4, %[r]\n\t"
  165787. #else
  165788. "adc r4, %[r]\n\t"
  165789. #endif
  165790. "# A[14] * B[9]\n\t"
  165791. "mov %[a], r9\n\t"
  165792. "mov %[b], r10\n\t"
  165793. "ldr %[a], [%[a], #56]\n\t"
  165794. "ldr %[b], [%[b], #36]\n\t"
  165795. "uxth r6, %[a]\n\t"
  165796. "uxth r7, %[b]\n\t"
  165797. #ifdef WOLFSSL_KEIL
  165798. "muls r7, r6, r7\n\t"
  165799. #elif defined(__clang__)
  165800. "muls r7, r6\n\t"
  165801. #else
  165802. "mul r7, r6\n\t"
  165803. #endif
  165804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165805. "adds r5, r5, r7\n\t"
  165806. #else
  165807. "add r5, r5, r7\n\t"
  165808. #endif
  165809. #ifdef WOLFSSL_KEIL
  165810. "adcs r3, r3, %[r]\n\t"
  165811. #elif defined(__clang__)
  165812. "adcs r3, %[r]\n\t"
  165813. #else
  165814. "adc r3, %[r]\n\t"
  165815. #endif
  165816. #ifdef WOLFSSL_KEIL
  165817. "adcs r4, r4, %[r]\n\t"
  165818. #elif defined(__clang__)
  165819. "adcs r4, %[r]\n\t"
  165820. #else
  165821. "adc r4, %[r]\n\t"
  165822. #endif
  165823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165824. "lsrs r7, %[b], #16\n\t"
  165825. #else
  165826. "lsr r7, %[b], #16\n\t"
  165827. #endif
  165828. #ifdef WOLFSSL_KEIL
  165829. "muls r6, r7, r6\n\t"
  165830. #elif defined(__clang__)
  165831. "muls r6, r7\n\t"
  165832. #else
  165833. "mul r6, r7\n\t"
  165834. #endif
  165835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165836. "lsrs r7, r6, #16\n\t"
  165837. #else
  165838. "lsr r7, r6, #16\n\t"
  165839. #endif
  165840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165841. "lsls r6, r6, #16\n\t"
  165842. #else
  165843. "lsl r6, r6, #16\n\t"
  165844. #endif
  165845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165846. "adds r5, r5, r6\n\t"
  165847. #else
  165848. "add r5, r5, r6\n\t"
  165849. #endif
  165850. #ifdef WOLFSSL_KEIL
  165851. "adcs r3, r3, r7\n\t"
  165852. #elif defined(__clang__)
  165853. "adcs r3, r7\n\t"
  165854. #else
  165855. "adc r3, r7\n\t"
  165856. #endif
  165857. #ifdef WOLFSSL_KEIL
  165858. "adcs r4, r4, %[r]\n\t"
  165859. #elif defined(__clang__)
  165860. "adcs r4, %[r]\n\t"
  165861. #else
  165862. "adc r4, %[r]\n\t"
  165863. #endif
  165864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165865. "lsrs r6, %[a], #16\n\t"
  165866. #else
  165867. "lsr r6, %[a], #16\n\t"
  165868. #endif
  165869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165870. "lsrs r7, %[b], #16\n\t"
  165871. #else
  165872. "lsr r7, %[b], #16\n\t"
  165873. #endif
  165874. #ifdef WOLFSSL_KEIL
  165875. "muls r7, r6, r7\n\t"
  165876. #elif defined(__clang__)
  165877. "muls r7, r6\n\t"
  165878. #else
  165879. "mul r7, r6\n\t"
  165880. #endif
  165881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165882. "adds r3, r3, r7\n\t"
  165883. #else
  165884. "add r3, r3, r7\n\t"
  165885. #endif
  165886. #ifdef WOLFSSL_KEIL
  165887. "adcs r4, r4, %[r]\n\t"
  165888. #elif defined(__clang__)
  165889. "adcs r4, %[r]\n\t"
  165890. #else
  165891. "adc r4, %[r]\n\t"
  165892. #endif
  165893. "uxth r7, %[b]\n\t"
  165894. #ifdef WOLFSSL_KEIL
  165895. "muls r6, r7, r6\n\t"
  165896. #elif defined(__clang__)
  165897. "muls r6, r7\n\t"
  165898. #else
  165899. "mul r6, r7\n\t"
  165900. #endif
  165901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165902. "lsrs r7, r6, #16\n\t"
  165903. #else
  165904. "lsr r7, r6, #16\n\t"
  165905. #endif
  165906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165907. "lsls r6, r6, #16\n\t"
  165908. #else
  165909. "lsl r6, r6, #16\n\t"
  165910. #endif
  165911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165912. "adds r5, r5, r6\n\t"
  165913. #else
  165914. "add r5, r5, r6\n\t"
  165915. #endif
  165916. #ifdef WOLFSSL_KEIL
  165917. "adcs r3, r3, r7\n\t"
  165918. #elif defined(__clang__)
  165919. "adcs r3, r7\n\t"
  165920. #else
  165921. "adc r3, r7\n\t"
  165922. #endif
  165923. #ifdef WOLFSSL_KEIL
  165924. "adcs r4, r4, %[r]\n\t"
  165925. #elif defined(__clang__)
  165926. "adcs r4, %[r]\n\t"
  165927. #else
  165928. "adc r4, %[r]\n\t"
  165929. #endif
  165930. "# A[15] * B[8]\n\t"
  165931. "mov %[a], r9\n\t"
  165932. "mov %[b], r10\n\t"
  165933. "ldr %[a], [%[a], #60]\n\t"
  165934. "ldr %[b], [%[b], #32]\n\t"
  165935. "uxth r6, %[a]\n\t"
  165936. "uxth r7, %[b]\n\t"
  165937. #ifdef WOLFSSL_KEIL
  165938. "muls r7, r6, r7\n\t"
  165939. #elif defined(__clang__)
  165940. "muls r7, r6\n\t"
  165941. #else
  165942. "mul r7, r6\n\t"
  165943. #endif
  165944. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165945. "adds r5, r5, r7\n\t"
  165946. #else
  165947. "add r5, r5, r7\n\t"
  165948. #endif
  165949. #ifdef WOLFSSL_KEIL
  165950. "adcs r3, r3, %[r]\n\t"
  165951. #elif defined(__clang__)
  165952. "adcs r3, %[r]\n\t"
  165953. #else
  165954. "adc r3, %[r]\n\t"
  165955. #endif
  165956. #ifdef WOLFSSL_KEIL
  165957. "adcs r4, r4, %[r]\n\t"
  165958. #elif defined(__clang__)
  165959. "adcs r4, %[r]\n\t"
  165960. #else
  165961. "adc r4, %[r]\n\t"
  165962. #endif
  165963. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165964. "lsrs r7, %[b], #16\n\t"
  165965. #else
  165966. "lsr r7, %[b], #16\n\t"
  165967. #endif
  165968. #ifdef WOLFSSL_KEIL
  165969. "muls r6, r7, r6\n\t"
  165970. #elif defined(__clang__)
  165971. "muls r6, r7\n\t"
  165972. #else
  165973. "mul r6, r7\n\t"
  165974. #endif
  165975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165976. "lsrs r7, r6, #16\n\t"
  165977. #else
  165978. "lsr r7, r6, #16\n\t"
  165979. #endif
  165980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165981. "lsls r6, r6, #16\n\t"
  165982. #else
  165983. "lsl r6, r6, #16\n\t"
  165984. #endif
  165985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  165986. "adds r5, r5, r6\n\t"
  165987. #else
  165988. "add r5, r5, r6\n\t"
  165989. #endif
  165990. #ifdef WOLFSSL_KEIL
  165991. "adcs r3, r3, r7\n\t"
  165992. #elif defined(__clang__)
  165993. "adcs r3, r7\n\t"
  165994. #else
  165995. "adc r3, r7\n\t"
  165996. #endif
  165997. #ifdef WOLFSSL_KEIL
  165998. "adcs r4, r4, %[r]\n\t"
  165999. #elif defined(__clang__)
  166000. "adcs r4, %[r]\n\t"
  166001. #else
  166002. "adc r4, %[r]\n\t"
  166003. #endif
  166004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166005. "lsrs r6, %[a], #16\n\t"
  166006. #else
  166007. "lsr r6, %[a], #16\n\t"
  166008. #endif
  166009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166010. "lsrs r7, %[b], #16\n\t"
  166011. #else
  166012. "lsr r7, %[b], #16\n\t"
  166013. #endif
  166014. #ifdef WOLFSSL_KEIL
  166015. "muls r7, r6, r7\n\t"
  166016. #elif defined(__clang__)
  166017. "muls r7, r6\n\t"
  166018. #else
  166019. "mul r7, r6\n\t"
  166020. #endif
  166021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166022. "adds r3, r3, r7\n\t"
  166023. #else
  166024. "add r3, r3, r7\n\t"
  166025. #endif
  166026. #ifdef WOLFSSL_KEIL
  166027. "adcs r4, r4, %[r]\n\t"
  166028. #elif defined(__clang__)
  166029. "adcs r4, %[r]\n\t"
  166030. #else
  166031. "adc r4, %[r]\n\t"
  166032. #endif
  166033. "uxth r7, %[b]\n\t"
  166034. #ifdef WOLFSSL_KEIL
  166035. "muls r6, r7, r6\n\t"
  166036. #elif defined(__clang__)
  166037. "muls r6, r7\n\t"
  166038. #else
  166039. "mul r6, r7\n\t"
  166040. #endif
  166041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166042. "lsrs r7, r6, #16\n\t"
  166043. #else
  166044. "lsr r7, r6, #16\n\t"
  166045. #endif
  166046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166047. "lsls r6, r6, #16\n\t"
  166048. #else
  166049. "lsl r6, r6, #16\n\t"
  166050. #endif
  166051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166052. "adds r5, r5, r6\n\t"
  166053. #else
  166054. "add r5, r5, r6\n\t"
  166055. #endif
  166056. #ifdef WOLFSSL_KEIL
  166057. "adcs r3, r3, r7\n\t"
  166058. #elif defined(__clang__)
  166059. "adcs r3, r7\n\t"
  166060. #else
  166061. "adc r3, r7\n\t"
  166062. #endif
  166063. #ifdef WOLFSSL_KEIL
  166064. "adcs r4, r4, %[r]\n\t"
  166065. #elif defined(__clang__)
  166066. "adcs r4, %[r]\n\t"
  166067. #else
  166068. "adc r4, %[r]\n\t"
  166069. #endif
  166070. "mov %[r], r8\n\t"
  166071. "str r5, [%[r], #92]\n\t"
  166072. "movs %[r], #0\n\t"
  166073. "# A[15] * B[9]\n\t"
  166074. "movs r5, #0\n\t"
  166075. "mov %[a], r9\n\t"
  166076. "mov %[b], r10\n\t"
  166077. "ldr %[a], [%[a], #60]\n\t"
  166078. "ldr %[b], [%[b], #36]\n\t"
  166079. "uxth r6, %[a]\n\t"
  166080. "uxth r7, %[b]\n\t"
  166081. #ifdef WOLFSSL_KEIL
  166082. "muls r7, r6, r7\n\t"
  166083. #elif defined(__clang__)
  166084. "muls r7, r6\n\t"
  166085. #else
  166086. "mul r7, r6\n\t"
  166087. #endif
  166088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166089. "adds r3, r3, r7\n\t"
  166090. #else
  166091. "add r3, r3, r7\n\t"
  166092. #endif
  166093. #ifdef WOLFSSL_KEIL
  166094. "adcs r4, r4, %[r]\n\t"
  166095. #elif defined(__clang__)
  166096. "adcs r4, %[r]\n\t"
  166097. #else
  166098. "adc r4, %[r]\n\t"
  166099. #endif
  166100. #ifdef WOLFSSL_KEIL
  166101. "adcs r5, r5, %[r]\n\t"
  166102. #elif defined(__clang__)
  166103. "adcs r5, %[r]\n\t"
  166104. #else
  166105. "adc r5, %[r]\n\t"
  166106. #endif
  166107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166108. "lsrs r7, %[b], #16\n\t"
  166109. #else
  166110. "lsr r7, %[b], #16\n\t"
  166111. #endif
  166112. #ifdef WOLFSSL_KEIL
  166113. "muls r6, r7, r6\n\t"
  166114. #elif defined(__clang__)
  166115. "muls r6, r7\n\t"
  166116. #else
  166117. "mul r6, r7\n\t"
  166118. #endif
  166119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166120. "lsrs r7, r6, #16\n\t"
  166121. #else
  166122. "lsr r7, r6, #16\n\t"
  166123. #endif
  166124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166125. "lsls r6, r6, #16\n\t"
  166126. #else
  166127. "lsl r6, r6, #16\n\t"
  166128. #endif
  166129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166130. "adds r3, r3, r6\n\t"
  166131. #else
  166132. "add r3, r3, r6\n\t"
  166133. #endif
  166134. #ifdef WOLFSSL_KEIL
  166135. "adcs r4, r4, r7\n\t"
  166136. #elif defined(__clang__)
  166137. "adcs r4, r7\n\t"
  166138. #else
  166139. "adc r4, r7\n\t"
  166140. #endif
  166141. #ifdef WOLFSSL_KEIL
  166142. "adcs r5, r5, %[r]\n\t"
  166143. #elif defined(__clang__)
  166144. "adcs r5, %[r]\n\t"
  166145. #else
  166146. "adc r5, %[r]\n\t"
  166147. #endif
  166148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166149. "lsrs r6, %[a], #16\n\t"
  166150. #else
  166151. "lsr r6, %[a], #16\n\t"
  166152. #endif
  166153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166154. "lsrs r7, %[b], #16\n\t"
  166155. #else
  166156. "lsr r7, %[b], #16\n\t"
  166157. #endif
  166158. #ifdef WOLFSSL_KEIL
  166159. "muls r7, r6, r7\n\t"
  166160. #elif defined(__clang__)
  166161. "muls r7, r6\n\t"
  166162. #else
  166163. "mul r7, r6\n\t"
  166164. #endif
  166165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166166. "adds r4, r4, r7\n\t"
  166167. #else
  166168. "add r4, r4, r7\n\t"
  166169. #endif
  166170. #ifdef WOLFSSL_KEIL
  166171. "adcs r5, r5, %[r]\n\t"
  166172. #elif defined(__clang__)
  166173. "adcs r5, %[r]\n\t"
  166174. #else
  166175. "adc r5, %[r]\n\t"
  166176. #endif
  166177. "uxth r7, %[b]\n\t"
  166178. #ifdef WOLFSSL_KEIL
  166179. "muls r6, r7, r6\n\t"
  166180. #elif defined(__clang__)
  166181. "muls r6, r7\n\t"
  166182. #else
  166183. "mul r6, r7\n\t"
  166184. #endif
  166185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166186. "lsrs r7, r6, #16\n\t"
  166187. #else
  166188. "lsr r7, r6, #16\n\t"
  166189. #endif
  166190. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166191. "lsls r6, r6, #16\n\t"
  166192. #else
  166193. "lsl r6, r6, #16\n\t"
  166194. #endif
  166195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166196. "adds r3, r3, r6\n\t"
  166197. #else
  166198. "add r3, r3, r6\n\t"
  166199. #endif
  166200. #ifdef WOLFSSL_KEIL
  166201. "adcs r4, r4, r7\n\t"
  166202. #elif defined(__clang__)
  166203. "adcs r4, r7\n\t"
  166204. #else
  166205. "adc r4, r7\n\t"
  166206. #endif
  166207. #ifdef WOLFSSL_KEIL
  166208. "adcs r5, r5, %[r]\n\t"
  166209. #elif defined(__clang__)
  166210. "adcs r5, %[r]\n\t"
  166211. #else
  166212. "adc r5, %[r]\n\t"
  166213. #endif
  166214. "# A[14] * B[10]\n\t"
  166215. "mov %[a], r9\n\t"
  166216. "mov %[b], r10\n\t"
  166217. "ldr %[a], [%[a], #56]\n\t"
  166218. "ldr %[b], [%[b], #40]\n\t"
  166219. "uxth r6, %[a]\n\t"
  166220. "uxth r7, %[b]\n\t"
  166221. #ifdef WOLFSSL_KEIL
  166222. "muls r7, r6, r7\n\t"
  166223. #elif defined(__clang__)
  166224. "muls r7, r6\n\t"
  166225. #else
  166226. "mul r7, r6\n\t"
  166227. #endif
  166228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166229. "adds r3, r3, r7\n\t"
  166230. #else
  166231. "add r3, r3, r7\n\t"
  166232. #endif
  166233. #ifdef WOLFSSL_KEIL
  166234. "adcs r4, r4, %[r]\n\t"
  166235. #elif defined(__clang__)
  166236. "adcs r4, %[r]\n\t"
  166237. #else
  166238. "adc r4, %[r]\n\t"
  166239. #endif
  166240. #ifdef WOLFSSL_KEIL
  166241. "adcs r5, r5, %[r]\n\t"
  166242. #elif defined(__clang__)
  166243. "adcs r5, %[r]\n\t"
  166244. #else
  166245. "adc r5, %[r]\n\t"
  166246. #endif
  166247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166248. "lsrs r7, %[b], #16\n\t"
  166249. #else
  166250. "lsr r7, %[b], #16\n\t"
  166251. #endif
  166252. #ifdef WOLFSSL_KEIL
  166253. "muls r6, r7, r6\n\t"
  166254. #elif defined(__clang__)
  166255. "muls r6, r7\n\t"
  166256. #else
  166257. "mul r6, r7\n\t"
  166258. #endif
  166259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166260. "lsrs r7, r6, #16\n\t"
  166261. #else
  166262. "lsr r7, r6, #16\n\t"
  166263. #endif
  166264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166265. "lsls r6, r6, #16\n\t"
  166266. #else
  166267. "lsl r6, r6, #16\n\t"
  166268. #endif
  166269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166270. "adds r3, r3, r6\n\t"
  166271. #else
  166272. "add r3, r3, r6\n\t"
  166273. #endif
  166274. #ifdef WOLFSSL_KEIL
  166275. "adcs r4, r4, r7\n\t"
  166276. #elif defined(__clang__)
  166277. "adcs r4, r7\n\t"
  166278. #else
  166279. "adc r4, r7\n\t"
  166280. #endif
  166281. #ifdef WOLFSSL_KEIL
  166282. "adcs r5, r5, %[r]\n\t"
  166283. #elif defined(__clang__)
  166284. "adcs r5, %[r]\n\t"
  166285. #else
  166286. "adc r5, %[r]\n\t"
  166287. #endif
  166288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166289. "lsrs r6, %[a], #16\n\t"
  166290. #else
  166291. "lsr r6, %[a], #16\n\t"
  166292. #endif
  166293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166294. "lsrs r7, %[b], #16\n\t"
  166295. #else
  166296. "lsr r7, %[b], #16\n\t"
  166297. #endif
  166298. #ifdef WOLFSSL_KEIL
  166299. "muls r7, r6, r7\n\t"
  166300. #elif defined(__clang__)
  166301. "muls r7, r6\n\t"
  166302. #else
  166303. "mul r7, r6\n\t"
  166304. #endif
  166305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166306. "adds r4, r4, r7\n\t"
  166307. #else
  166308. "add r4, r4, r7\n\t"
  166309. #endif
  166310. #ifdef WOLFSSL_KEIL
  166311. "adcs r5, r5, %[r]\n\t"
  166312. #elif defined(__clang__)
  166313. "adcs r5, %[r]\n\t"
  166314. #else
  166315. "adc r5, %[r]\n\t"
  166316. #endif
  166317. "uxth r7, %[b]\n\t"
  166318. #ifdef WOLFSSL_KEIL
  166319. "muls r6, r7, r6\n\t"
  166320. #elif defined(__clang__)
  166321. "muls r6, r7\n\t"
  166322. #else
  166323. "mul r6, r7\n\t"
  166324. #endif
  166325. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166326. "lsrs r7, r6, #16\n\t"
  166327. #else
  166328. "lsr r7, r6, #16\n\t"
  166329. #endif
  166330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166331. "lsls r6, r6, #16\n\t"
  166332. #else
  166333. "lsl r6, r6, #16\n\t"
  166334. #endif
  166335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166336. "adds r3, r3, r6\n\t"
  166337. #else
  166338. "add r3, r3, r6\n\t"
  166339. #endif
  166340. #ifdef WOLFSSL_KEIL
  166341. "adcs r4, r4, r7\n\t"
  166342. #elif defined(__clang__)
  166343. "adcs r4, r7\n\t"
  166344. #else
  166345. "adc r4, r7\n\t"
  166346. #endif
  166347. #ifdef WOLFSSL_KEIL
  166348. "adcs r5, r5, %[r]\n\t"
  166349. #elif defined(__clang__)
  166350. "adcs r5, %[r]\n\t"
  166351. #else
  166352. "adc r5, %[r]\n\t"
  166353. #endif
  166354. "# A[13] * B[11]\n\t"
  166355. "mov %[a], r9\n\t"
  166356. "mov %[b], r10\n\t"
  166357. "ldr %[a], [%[a], #52]\n\t"
  166358. "ldr %[b], [%[b], #44]\n\t"
  166359. "uxth r6, %[a]\n\t"
  166360. "uxth r7, %[b]\n\t"
  166361. #ifdef WOLFSSL_KEIL
  166362. "muls r7, r6, r7\n\t"
  166363. #elif defined(__clang__)
  166364. "muls r7, r6\n\t"
  166365. #else
  166366. "mul r7, r6\n\t"
  166367. #endif
  166368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166369. "adds r3, r3, r7\n\t"
  166370. #else
  166371. "add r3, r3, r7\n\t"
  166372. #endif
  166373. #ifdef WOLFSSL_KEIL
  166374. "adcs r4, r4, %[r]\n\t"
  166375. #elif defined(__clang__)
  166376. "adcs r4, %[r]\n\t"
  166377. #else
  166378. "adc r4, %[r]\n\t"
  166379. #endif
  166380. #ifdef WOLFSSL_KEIL
  166381. "adcs r5, r5, %[r]\n\t"
  166382. #elif defined(__clang__)
  166383. "adcs r5, %[r]\n\t"
  166384. #else
  166385. "adc r5, %[r]\n\t"
  166386. #endif
  166387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166388. "lsrs r7, %[b], #16\n\t"
  166389. #else
  166390. "lsr r7, %[b], #16\n\t"
  166391. #endif
  166392. #ifdef WOLFSSL_KEIL
  166393. "muls r6, r7, r6\n\t"
  166394. #elif defined(__clang__)
  166395. "muls r6, r7\n\t"
  166396. #else
  166397. "mul r6, r7\n\t"
  166398. #endif
  166399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166400. "lsrs r7, r6, #16\n\t"
  166401. #else
  166402. "lsr r7, r6, #16\n\t"
  166403. #endif
  166404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166405. "lsls r6, r6, #16\n\t"
  166406. #else
  166407. "lsl r6, r6, #16\n\t"
  166408. #endif
  166409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166410. "adds r3, r3, r6\n\t"
  166411. #else
  166412. "add r3, r3, r6\n\t"
  166413. #endif
  166414. #ifdef WOLFSSL_KEIL
  166415. "adcs r4, r4, r7\n\t"
  166416. #elif defined(__clang__)
  166417. "adcs r4, r7\n\t"
  166418. #else
  166419. "adc r4, r7\n\t"
  166420. #endif
  166421. #ifdef WOLFSSL_KEIL
  166422. "adcs r5, r5, %[r]\n\t"
  166423. #elif defined(__clang__)
  166424. "adcs r5, %[r]\n\t"
  166425. #else
  166426. "adc r5, %[r]\n\t"
  166427. #endif
  166428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166429. "lsrs r6, %[a], #16\n\t"
  166430. #else
  166431. "lsr r6, %[a], #16\n\t"
  166432. #endif
  166433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166434. "lsrs r7, %[b], #16\n\t"
  166435. #else
  166436. "lsr r7, %[b], #16\n\t"
  166437. #endif
  166438. #ifdef WOLFSSL_KEIL
  166439. "muls r7, r6, r7\n\t"
  166440. #elif defined(__clang__)
  166441. "muls r7, r6\n\t"
  166442. #else
  166443. "mul r7, r6\n\t"
  166444. #endif
  166445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166446. "adds r4, r4, r7\n\t"
  166447. #else
  166448. "add r4, r4, r7\n\t"
  166449. #endif
  166450. #ifdef WOLFSSL_KEIL
  166451. "adcs r5, r5, %[r]\n\t"
  166452. #elif defined(__clang__)
  166453. "adcs r5, %[r]\n\t"
  166454. #else
  166455. "adc r5, %[r]\n\t"
  166456. #endif
  166457. "uxth r7, %[b]\n\t"
  166458. #ifdef WOLFSSL_KEIL
  166459. "muls r6, r7, r6\n\t"
  166460. #elif defined(__clang__)
  166461. "muls r6, r7\n\t"
  166462. #else
  166463. "mul r6, r7\n\t"
  166464. #endif
  166465. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166466. "lsrs r7, r6, #16\n\t"
  166467. #else
  166468. "lsr r7, r6, #16\n\t"
  166469. #endif
  166470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166471. "lsls r6, r6, #16\n\t"
  166472. #else
  166473. "lsl r6, r6, #16\n\t"
  166474. #endif
  166475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166476. "adds r3, r3, r6\n\t"
  166477. #else
  166478. "add r3, r3, r6\n\t"
  166479. #endif
  166480. #ifdef WOLFSSL_KEIL
  166481. "adcs r4, r4, r7\n\t"
  166482. #elif defined(__clang__)
  166483. "adcs r4, r7\n\t"
  166484. #else
  166485. "adc r4, r7\n\t"
  166486. #endif
  166487. #ifdef WOLFSSL_KEIL
  166488. "adcs r5, r5, %[r]\n\t"
  166489. #elif defined(__clang__)
  166490. "adcs r5, %[r]\n\t"
  166491. #else
  166492. "adc r5, %[r]\n\t"
  166493. #endif
  166494. "# A[12] * B[12]\n\t"
  166495. "mov %[a], r9\n\t"
  166496. "mov %[b], r10\n\t"
  166497. "ldr %[a], [%[a], #48]\n\t"
  166498. "ldr %[b], [%[b], #48]\n\t"
  166499. "uxth r6, %[a]\n\t"
  166500. "uxth r7, %[b]\n\t"
  166501. #ifdef WOLFSSL_KEIL
  166502. "muls r7, r6, r7\n\t"
  166503. #elif defined(__clang__)
  166504. "muls r7, r6\n\t"
  166505. #else
  166506. "mul r7, r6\n\t"
  166507. #endif
  166508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166509. "adds r3, r3, r7\n\t"
  166510. #else
  166511. "add r3, r3, r7\n\t"
  166512. #endif
  166513. #ifdef WOLFSSL_KEIL
  166514. "adcs r4, r4, %[r]\n\t"
  166515. #elif defined(__clang__)
  166516. "adcs r4, %[r]\n\t"
  166517. #else
  166518. "adc r4, %[r]\n\t"
  166519. #endif
  166520. #ifdef WOLFSSL_KEIL
  166521. "adcs r5, r5, %[r]\n\t"
  166522. #elif defined(__clang__)
  166523. "adcs r5, %[r]\n\t"
  166524. #else
  166525. "adc r5, %[r]\n\t"
  166526. #endif
  166527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166528. "lsrs r7, %[b], #16\n\t"
  166529. #else
  166530. "lsr r7, %[b], #16\n\t"
  166531. #endif
  166532. #ifdef WOLFSSL_KEIL
  166533. "muls r6, r7, r6\n\t"
  166534. #elif defined(__clang__)
  166535. "muls r6, r7\n\t"
  166536. #else
  166537. "mul r6, r7\n\t"
  166538. #endif
  166539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166540. "lsrs r7, r6, #16\n\t"
  166541. #else
  166542. "lsr r7, r6, #16\n\t"
  166543. #endif
  166544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166545. "lsls r6, r6, #16\n\t"
  166546. #else
  166547. "lsl r6, r6, #16\n\t"
  166548. #endif
  166549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166550. "adds r3, r3, r6\n\t"
  166551. #else
  166552. "add r3, r3, r6\n\t"
  166553. #endif
  166554. #ifdef WOLFSSL_KEIL
  166555. "adcs r4, r4, r7\n\t"
  166556. #elif defined(__clang__)
  166557. "adcs r4, r7\n\t"
  166558. #else
  166559. "adc r4, r7\n\t"
  166560. #endif
  166561. #ifdef WOLFSSL_KEIL
  166562. "adcs r5, r5, %[r]\n\t"
  166563. #elif defined(__clang__)
  166564. "adcs r5, %[r]\n\t"
  166565. #else
  166566. "adc r5, %[r]\n\t"
  166567. #endif
  166568. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166569. "lsrs r6, %[a], #16\n\t"
  166570. #else
  166571. "lsr r6, %[a], #16\n\t"
  166572. #endif
  166573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166574. "lsrs r7, %[b], #16\n\t"
  166575. #else
  166576. "lsr r7, %[b], #16\n\t"
  166577. #endif
  166578. #ifdef WOLFSSL_KEIL
  166579. "muls r7, r6, r7\n\t"
  166580. #elif defined(__clang__)
  166581. "muls r7, r6\n\t"
  166582. #else
  166583. "mul r7, r6\n\t"
  166584. #endif
  166585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166586. "adds r4, r4, r7\n\t"
  166587. #else
  166588. "add r4, r4, r7\n\t"
  166589. #endif
  166590. #ifdef WOLFSSL_KEIL
  166591. "adcs r5, r5, %[r]\n\t"
  166592. #elif defined(__clang__)
  166593. "adcs r5, %[r]\n\t"
  166594. #else
  166595. "adc r5, %[r]\n\t"
  166596. #endif
  166597. "uxth r7, %[b]\n\t"
  166598. #ifdef WOLFSSL_KEIL
  166599. "muls r6, r7, r6\n\t"
  166600. #elif defined(__clang__)
  166601. "muls r6, r7\n\t"
  166602. #else
  166603. "mul r6, r7\n\t"
  166604. #endif
  166605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166606. "lsrs r7, r6, #16\n\t"
  166607. #else
  166608. "lsr r7, r6, #16\n\t"
  166609. #endif
  166610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166611. "lsls r6, r6, #16\n\t"
  166612. #else
  166613. "lsl r6, r6, #16\n\t"
  166614. #endif
  166615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166616. "adds r3, r3, r6\n\t"
  166617. #else
  166618. "add r3, r3, r6\n\t"
  166619. #endif
  166620. #ifdef WOLFSSL_KEIL
  166621. "adcs r4, r4, r7\n\t"
  166622. #elif defined(__clang__)
  166623. "adcs r4, r7\n\t"
  166624. #else
  166625. "adc r4, r7\n\t"
  166626. #endif
  166627. #ifdef WOLFSSL_KEIL
  166628. "adcs r5, r5, %[r]\n\t"
  166629. #elif defined(__clang__)
  166630. "adcs r5, %[r]\n\t"
  166631. #else
  166632. "adc r5, %[r]\n\t"
  166633. #endif
  166634. "# A[11] * B[13]\n\t"
  166635. "mov %[a], r9\n\t"
  166636. "mov %[b], r10\n\t"
  166637. "ldr %[a], [%[a], #44]\n\t"
  166638. "ldr %[b], [%[b], #52]\n\t"
  166639. "uxth r6, %[a]\n\t"
  166640. "uxth r7, %[b]\n\t"
  166641. #ifdef WOLFSSL_KEIL
  166642. "muls r7, r6, r7\n\t"
  166643. #elif defined(__clang__)
  166644. "muls r7, r6\n\t"
  166645. #else
  166646. "mul r7, r6\n\t"
  166647. #endif
  166648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166649. "adds r3, r3, r7\n\t"
  166650. #else
  166651. "add r3, r3, r7\n\t"
  166652. #endif
  166653. #ifdef WOLFSSL_KEIL
  166654. "adcs r4, r4, %[r]\n\t"
  166655. #elif defined(__clang__)
  166656. "adcs r4, %[r]\n\t"
  166657. #else
  166658. "adc r4, %[r]\n\t"
  166659. #endif
  166660. #ifdef WOLFSSL_KEIL
  166661. "adcs r5, r5, %[r]\n\t"
  166662. #elif defined(__clang__)
  166663. "adcs r5, %[r]\n\t"
  166664. #else
  166665. "adc r5, %[r]\n\t"
  166666. #endif
  166667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166668. "lsrs r7, %[b], #16\n\t"
  166669. #else
  166670. "lsr r7, %[b], #16\n\t"
  166671. #endif
  166672. #ifdef WOLFSSL_KEIL
  166673. "muls r6, r7, r6\n\t"
  166674. #elif defined(__clang__)
  166675. "muls r6, r7\n\t"
  166676. #else
  166677. "mul r6, r7\n\t"
  166678. #endif
  166679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166680. "lsrs r7, r6, #16\n\t"
  166681. #else
  166682. "lsr r7, r6, #16\n\t"
  166683. #endif
  166684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166685. "lsls r6, r6, #16\n\t"
  166686. #else
  166687. "lsl r6, r6, #16\n\t"
  166688. #endif
  166689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166690. "adds r3, r3, r6\n\t"
  166691. #else
  166692. "add r3, r3, r6\n\t"
  166693. #endif
  166694. #ifdef WOLFSSL_KEIL
  166695. "adcs r4, r4, r7\n\t"
  166696. #elif defined(__clang__)
  166697. "adcs r4, r7\n\t"
  166698. #else
  166699. "adc r4, r7\n\t"
  166700. #endif
  166701. #ifdef WOLFSSL_KEIL
  166702. "adcs r5, r5, %[r]\n\t"
  166703. #elif defined(__clang__)
  166704. "adcs r5, %[r]\n\t"
  166705. #else
  166706. "adc r5, %[r]\n\t"
  166707. #endif
  166708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166709. "lsrs r6, %[a], #16\n\t"
  166710. #else
  166711. "lsr r6, %[a], #16\n\t"
  166712. #endif
  166713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166714. "lsrs r7, %[b], #16\n\t"
  166715. #else
  166716. "lsr r7, %[b], #16\n\t"
  166717. #endif
  166718. #ifdef WOLFSSL_KEIL
  166719. "muls r7, r6, r7\n\t"
  166720. #elif defined(__clang__)
  166721. "muls r7, r6\n\t"
  166722. #else
  166723. "mul r7, r6\n\t"
  166724. #endif
  166725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166726. "adds r4, r4, r7\n\t"
  166727. #else
  166728. "add r4, r4, r7\n\t"
  166729. #endif
  166730. #ifdef WOLFSSL_KEIL
  166731. "adcs r5, r5, %[r]\n\t"
  166732. #elif defined(__clang__)
  166733. "adcs r5, %[r]\n\t"
  166734. #else
  166735. "adc r5, %[r]\n\t"
  166736. #endif
  166737. "uxth r7, %[b]\n\t"
  166738. #ifdef WOLFSSL_KEIL
  166739. "muls r6, r7, r6\n\t"
  166740. #elif defined(__clang__)
  166741. "muls r6, r7\n\t"
  166742. #else
  166743. "mul r6, r7\n\t"
  166744. #endif
  166745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166746. "lsrs r7, r6, #16\n\t"
  166747. #else
  166748. "lsr r7, r6, #16\n\t"
  166749. #endif
  166750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166751. "lsls r6, r6, #16\n\t"
  166752. #else
  166753. "lsl r6, r6, #16\n\t"
  166754. #endif
  166755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166756. "adds r3, r3, r6\n\t"
  166757. #else
  166758. "add r3, r3, r6\n\t"
  166759. #endif
  166760. #ifdef WOLFSSL_KEIL
  166761. "adcs r4, r4, r7\n\t"
  166762. #elif defined(__clang__)
  166763. "adcs r4, r7\n\t"
  166764. #else
  166765. "adc r4, r7\n\t"
  166766. #endif
  166767. #ifdef WOLFSSL_KEIL
  166768. "adcs r5, r5, %[r]\n\t"
  166769. #elif defined(__clang__)
  166770. "adcs r5, %[r]\n\t"
  166771. #else
  166772. "adc r5, %[r]\n\t"
  166773. #endif
  166774. "# A[10] * B[14]\n\t"
  166775. "mov %[a], r9\n\t"
  166776. "mov %[b], r10\n\t"
  166777. "ldr %[a], [%[a], #40]\n\t"
  166778. "ldr %[b], [%[b], #56]\n\t"
  166779. "uxth r6, %[a]\n\t"
  166780. "uxth r7, %[b]\n\t"
  166781. #ifdef WOLFSSL_KEIL
  166782. "muls r7, r6, r7\n\t"
  166783. #elif defined(__clang__)
  166784. "muls r7, r6\n\t"
  166785. #else
  166786. "mul r7, r6\n\t"
  166787. #endif
  166788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166789. "adds r3, r3, r7\n\t"
  166790. #else
  166791. "add r3, r3, r7\n\t"
  166792. #endif
  166793. #ifdef WOLFSSL_KEIL
  166794. "adcs r4, r4, %[r]\n\t"
  166795. #elif defined(__clang__)
  166796. "adcs r4, %[r]\n\t"
  166797. #else
  166798. "adc r4, %[r]\n\t"
  166799. #endif
  166800. #ifdef WOLFSSL_KEIL
  166801. "adcs r5, r5, %[r]\n\t"
  166802. #elif defined(__clang__)
  166803. "adcs r5, %[r]\n\t"
  166804. #else
  166805. "adc r5, %[r]\n\t"
  166806. #endif
  166807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166808. "lsrs r7, %[b], #16\n\t"
  166809. #else
  166810. "lsr r7, %[b], #16\n\t"
  166811. #endif
  166812. #ifdef WOLFSSL_KEIL
  166813. "muls r6, r7, r6\n\t"
  166814. #elif defined(__clang__)
  166815. "muls r6, r7\n\t"
  166816. #else
  166817. "mul r6, r7\n\t"
  166818. #endif
  166819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166820. "lsrs r7, r6, #16\n\t"
  166821. #else
  166822. "lsr r7, r6, #16\n\t"
  166823. #endif
  166824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166825. "lsls r6, r6, #16\n\t"
  166826. #else
  166827. "lsl r6, r6, #16\n\t"
  166828. #endif
  166829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166830. "adds r3, r3, r6\n\t"
  166831. #else
  166832. "add r3, r3, r6\n\t"
  166833. #endif
  166834. #ifdef WOLFSSL_KEIL
  166835. "adcs r4, r4, r7\n\t"
  166836. #elif defined(__clang__)
  166837. "adcs r4, r7\n\t"
  166838. #else
  166839. "adc r4, r7\n\t"
  166840. #endif
  166841. #ifdef WOLFSSL_KEIL
  166842. "adcs r5, r5, %[r]\n\t"
  166843. #elif defined(__clang__)
  166844. "adcs r5, %[r]\n\t"
  166845. #else
  166846. "adc r5, %[r]\n\t"
  166847. #endif
  166848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166849. "lsrs r6, %[a], #16\n\t"
  166850. #else
  166851. "lsr r6, %[a], #16\n\t"
  166852. #endif
  166853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166854. "lsrs r7, %[b], #16\n\t"
  166855. #else
  166856. "lsr r7, %[b], #16\n\t"
  166857. #endif
  166858. #ifdef WOLFSSL_KEIL
  166859. "muls r7, r6, r7\n\t"
  166860. #elif defined(__clang__)
  166861. "muls r7, r6\n\t"
  166862. #else
  166863. "mul r7, r6\n\t"
  166864. #endif
  166865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166866. "adds r4, r4, r7\n\t"
  166867. #else
  166868. "add r4, r4, r7\n\t"
  166869. #endif
  166870. #ifdef WOLFSSL_KEIL
  166871. "adcs r5, r5, %[r]\n\t"
  166872. #elif defined(__clang__)
  166873. "adcs r5, %[r]\n\t"
  166874. #else
  166875. "adc r5, %[r]\n\t"
  166876. #endif
  166877. "uxth r7, %[b]\n\t"
  166878. #ifdef WOLFSSL_KEIL
  166879. "muls r6, r7, r6\n\t"
  166880. #elif defined(__clang__)
  166881. "muls r6, r7\n\t"
  166882. #else
  166883. "mul r6, r7\n\t"
  166884. #endif
  166885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166886. "lsrs r7, r6, #16\n\t"
  166887. #else
  166888. "lsr r7, r6, #16\n\t"
  166889. #endif
  166890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166891. "lsls r6, r6, #16\n\t"
  166892. #else
  166893. "lsl r6, r6, #16\n\t"
  166894. #endif
  166895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166896. "adds r3, r3, r6\n\t"
  166897. #else
  166898. "add r3, r3, r6\n\t"
  166899. #endif
  166900. #ifdef WOLFSSL_KEIL
  166901. "adcs r4, r4, r7\n\t"
  166902. #elif defined(__clang__)
  166903. "adcs r4, r7\n\t"
  166904. #else
  166905. "adc r4, r7\n\t"
  166906. #endif
  166907. #ifdef WOLFSSL_KEIL
  166908. "adcs r5, r5, %[r]\n\t"
  166909. #elif defined(__clang__)
  166910. "adcs r5, %[r]\n\t"
  166911. #else
  166912. "adc r5, %[r]\n\t"
  166913. #endif
  166914. "# A[9] * B[15]\n\t"
  166915. "mov %[a], r9\n\t"
  166916. "mov %[b], r10\n\t"
  166917. "ldr %[a], [%[a], #36]\n\t"
  166918. "ldr %[b], [%[b], #60]\n\t"
  166919. "uxth r6, %[a]\n\t"
  166920. "uxth r7, %[b]\n\t"
  166921. #ifdef WOLFSSL_KEIL
  166922. "muls r7, r6, r7\n\t"
  166923. #elif defined(__clang__)
  166924. "muls r7, r6\n\t"
  166925. #else
  166926. "mul r7, r6\n\t"
  166927. #endif
  166928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166929. "adds r3, r3, r7\n\t"
  166930. #else
  166931. "add r3, r3, r7\n\t"
  166932. #endif
  166933. #ifdef WOLFSSL_KEIL
  166934. "adcs r4, r4, %[r]\n\t"
  166935. #elif defined(__clang__)
  166936. "adcs r4, %[r]\n\t"
  166937. #else
  166938. "adc r4, %[r]\n\t"
  166939. #endif
  166940. #ifdef WOLFSSL_KEIL
  166941. "adcs r5, r5, %[r]\n\t"
  166942. #elif defined(__clang__)
  166943. "adcs r5, %[r]\n\t"
  166944. #else
  166945. "adc r5, %[r]\n\t"
  166946. #endif
  166947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166948. "lsrs r7, %[b], #16\n\t"
  166949. #else
  166950. "lsr r7, %[b], #16\n\t"
  166951. #endif
  166952. #ifdef WOLFSSL_KEIL
  166953. "muls r6, r7, r6\n\t"
  166954. #elif defined(__clang__)
  166955. "muls r6, r7\n\t"
  166956. #else
  166957. "mul r6, r7\n\t"
  166958. #endif
  166959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166960. "lsrs r7, r6, #16\n\t"
  166961. #else
  166962. "lsr r7, r6, #16\n\t"
  166963. #endif
  166964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166965. "lsls r6, r6, #16\n\t"
  166966. #else
  166967. "lsl r6, r6, #16\n\t"
  166968. #endif
  166969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166970. "adds r3, r3, r6\n\t"
  166971. #else
  166972. "add r3, r3, r6\n\t"
  166973. #endif
  166974. #ifdef WOLFSSL_KEIL
  166975. "adcs r4, r4, r7\n\t"
  166976. #elif defined(__clang__)
  166977. "adcs r4, r7\n\t"
  166978. #else
  166979. "adc r4, r7\n\t"
  166980. #endif
  166981. #ifdef WOLFSSL_KEIL
  166982. "adcs r5, r5, %[r]\n\t"
  166983. #elif defined(__clang__)
  166984. "adcs r5, %[r]\n\t"
  166985. #else
  166986. "adc r5, %[r]\n\t"
  166987. #endif
  166988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166989. "lsrs r6, %[a], #16\n\t"
  166990. #else
  166991. "lsr r6, %[a], #16\n\t"
  166992. #endif
  166993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  166994. "lsrs r7, %[b], #16\n\t"
  166995. #else
  166996. "lsr r7, %[b], #16\n\t"
  166997. #endif
  166998. #ifdef WOLFSSL_KEIL
  166999. "muls r7, r6, r7\n\t"
  167000. #elif defined(__clang__)
  167001. "muls r7, r6\n\t"
  167002. #else
  167003. "mul r7, r6\n\t"
  167004. #endif
  167005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167006. "adds r4, r4, r7\n\t"
  167007. #else
  167008. "add r4, r4, r7\n\t"
  167009. #endif
  167010. #ifdef WOLFSSL_KEIL
  167011. "adcs r5, r5, %[r]\n\t"
  167012. #elif defined(__clang__)
  167013. "adcs r5, %[r]\n\t"
  167014. #else
  167015. "adc r5, %[r]\n\t"
  167016. #endif
  167017. "uxth r7, %[b]\n\t"
  167018. #ifdef WOLFSSL_KEIL
  167019. "muls r6, r7, r6\n\t"
  167020. #elif defined(__clang__)
  167021. "muls r6, r7\n\t"
  167022. #else
  167023. "mul r6, r7\n\t"
  167024. #endif
  167025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167026. "lsrs r7, r6, #16\n\t"
  167027. #else
  167028. "lsr r7, r6, #16\n\t"
  167029. #endif
  167030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167031. "lsls r6, r6, #16\n\t"
  167032. #else
  167033. "lsl r6, r6, #16\n\t"
  167034. #endif
  167035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167036. "adds r3, r3, r6\n\t"
  167037. #else
  167038. "add r3, r3, r6\n\t"
  167039. #endif
  167040. #ifdef WOLFSSL_KEIL
  167041. "adcs r4, r4, r7\n\t"
  167042. #elif defined(__clang__)
  167043. "adcs r4, r7\n\t"
  167044. #else
  167045. "adc r4, r7\n\t"
  167046. #endif
  167047. #ifdef WOLFSSL_KEIL
  167048. "adcs r5, r5, %[r]\n\t"
  167049. #elif defined(__clang__)
  167050. "adcs r5, %[r]\n\t"
  167051. #else
  167052. "adc r5, %[r]\n\t"
  167053. #endif
  167054. "mov %[r], r8\n\t"
  167055. "str r3, [%[r], #96]\n\t"
  167056. "movs %[r], #0\n\t"
  167057. "# A[10] * B[15]\n\t"
  167058. "movs r3, #0\n\t"
  167059. "mov %[a], r9\n\t"
  167060. "mov %[b], r10\n\t"
  167061. "ldr %[a], [%[a], #40]\n\t"
  167062. "ldr %[b], [%[b], #60]\n\t"
  167063. "uxth r6, %[a]\n\t"
  167064. "uxth r7, %[b]\n\t"
  167065. #ifdef WOLFSSL_KEIL
  167066. "muls r7, r6, r7\n\t"
  167067. #elif defined(__clang__)
  167068. "muls r7, r6\n\t"
  167069. #else
  167070. "mul r7, r6\n\t"
  167071. #endif
  167072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167073. "adds r4, r4, r7\n\t"
  167074. #else
  167075. "add r4, r4, r7\n\t"
  167076. #endif
  167077. #ifdef WOLFSSL_KEIL
  167078. "adcs r5, r5, %[r]\n\t"
  167079. #elif defined(__clang__)
  167080. "adcs r5, %[r]\n\t"
  167081. #else
  167082. "adc r5, %[r]\n\t"
  167083. #endif
  167084. #ifdef WOLFSSL_KEIL
  167085. "adcs r3, r3, %[r]\n\t"
  167086. #elif defined(__clang__)
  167087. "adcs r3, %[r]\n\t"
  167088. #else
  167089. "adc r3, %[r]\n\t"
  167090. #endif
  167091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167092. "lsrs r7, %[b], #16\n\t"
  167093. #else
  167094. "lsr r7, %[b], #16\n\t"
  167095. #endif
  167096. #ifdef WOLFSSL_KEIL
  167097. "muls r6, r7, r6\n\t"
  167098. #elif defined(__clang__)
  167099. "muls r6, r7\n\t"
  167100. #else
  167101. "mul r6, r7\n\t"
  167102. #endif
  167103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167104. "lsrs r7, r6, #16\n\t"
  167105. #else
  167106. "lsr r7, r6, #16\n\t"
  167107. #endif
  167108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167109. "lsls r6, r6, #16\n\t"
  167110. #else
  167111. "lsl r6, r6, #16\n\t"
  167112. #endif
  167113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167114. "adds r4, r4, r6\n\t"
  167115. #else
  167116. "add r4, r4, r6\n\t"
  167117. #endif
  167118. #ifdef WOLFSSL_KEIL
  167119. "adcs r5, r5, r7\n\t"
  167120. #elif defined(__clang__)
  167121. "adcs r5, r7\n\t"
  167122. #else
  167123. "adc r5, r7\n\t"
  167124. #endif
  167125. #ifdef WOLFSSL_KEIL
  167126. "adcs r3, r3, %[r]\n\t"
  167127. #elif defined(__clang__)
  167128. "adcs r3, %[r]\n\t"
  167129. #else
  167130. "adc r3, %[r]\n\t"
  167131. #endif
  167132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167133. "lsrs r6, %[a], #16\n\t"
  167134. #else
  167135. "lsr r6, %[a], #16\n\t"
  167136. #endif
  167137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167138. "lsrs r7, %[b], #16\n\t"
  167139. #else
  167140. "lsr r7, %[b], #16\n\t"
  167141. #endif
  167142. #ifdef WOLFSSL_KEIL
  167143. "muls r7, r6, r7\n\t"
  167144. #elif defined(__clang__)
  167145. "muls r7, r6\n\t"
  167146. #else
  167147. "mul r7, r6\n\t"
  167148. #endif
  167149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167150. "adds r5, r5, r7\n\t"
  167151. #else
  167152. "add r5, r5, r7\n\t"
  167153. #endif
  167154. #ifdef WOLFSSL_KEIL
  167155. "adcs r3, r3, %[r]\n\t"
  167156. #elif defined(__clang__)
  167157. "adcs r3, %[r]\n\t"
  167158. #else
  167159. "adc r3, %[r]\n\t"
  167160. #endif
  167161. "uxth r7, %[b]\n\t"
  167162. #ifdef WOLFSSL_KEIL
  167163. "muls r6, r7, r6\n\t"
  167164. #elif defined(__clang__)
  167165. "muls r6, r7\n\t"
  167166. #else
  167167. "mul r6, r7\n\t"
  167168. #endif
  167169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167170. "lsrs r7, r6, #16\n\t"
  167171. #else
  167172. "lsr r7, r6, #16\n\t"
  167173. #endif
  167174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167175. "lsls r6, r6, #16\n\t"
  167176. #else
  167177. "lsl r6, r6, #16\n\t"
  167178. #endif
  167179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167180. "adds r4, r4, r6\n\t"
  167181. #else
  167182. "add r4, r4, r6\n\t"
  167183. #endif
  167184. #ifdef WOLFSSL_KEIL
  167185. "adcs r5, r5, r7\n\t"
  167186. #elif defined(__clang__)
  167187. "adcs r5, r7\n\t"
  167188. #else
  167189. "adc r5, r7\n\t"
  167190. #endif
  167191. #ifdef WOLFSSL_KEIL
  167192. "adcs r3, r3, %[r]\n\t"
  167193. #elif defined(__clang__)
  167194. "adcs r3, %[r]\n\t"
  167195. #else
  167196. "adc r3, %[r]\n\t"
  167197. #endif
  167198. "# A[11] * B[14]\n\t"
  167199. "mov %[a], r9\n\t"
  167200. "mov %[b], r10\n\t"
  167201. "ldr %[a], [%[a], #44]\n\t"
  167202. "ldr %[b], [%[b], #56]\n\t"
  167203. "uxth r6, %[a]\n\t"
  167204. "uxth r7, %[b]\n\t"
  167205. #ifdef WOLFSSL_KEIL
  167206. "muls r7, r6, r7\n\t"
  167207. #elif defined(__clang__)
  167208. "muls r7, r6\n\t"
  167209. #else
  167210. "mul r7, r6\n\t"
  167211. #endif
  167212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167213. "adds r4, r4, r7\n\t"
  167214. #else
  167215. "add r4, r4, r7\n\t"
  167216. #endif
  167217. #ifdef WOLFSSL_KEIL
  167218. "adcs r5, r5, %[r]\n\t"
  167219. #elif defined(__clang__)
  167220. "adcs r5, %[r]\n\t"
  167221. #else
  167222. "adc r5, %[r]\n\t"
  167223. #endif
  167224. #ifdef WOLFSSL_KEIL
  167225. "adcs r3, r3, %[r]\n\t"
  167226. #elif defined(__clang__)
  167227. "adcs r3, %[r]\n\t"
  167228. #else
  167229. "adc r3, %[r]\n\t"
  167230. #endif
  167231. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167232. "lsrs r7, %[b], #16\n\t"
  167233. #else
  167234. "lsr r7, %[b], #16\n\t"
  167235. #endif
  167236. #ifdef WOLFSSL_KEIL
  167237. "muls r6, r7, r6\n\t"
  167238. #elif defined(__clang__)
  167239. "muls r6, r7\n\t"
  167240. #else
  167241. "mul r6, r7\n\t"
  167242. #endif
  167243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167244. "lsrs r7, r6, #16\n\t"
  167245. #else
  167246. "lsr r7, r6, #16\n\t"
  167247. #endif
  167248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167249. "lsls r6, r6, #16\n\t"
  167250. #else
  167251. "lsl r6, r6, #16\n\t"
  167252. #endif
  167253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167254. "adds r4, r4, r6\n\t"
  167255. #else
  167256. "add r4, r4, r6\n\t"
  167257. #endif
  167258. #ifdef WOLFSSL_KEIL
  167259. "adcs r5, r5, r7\n\t"
  167260. #elif defined(__clang__)
  167261. "adcs r5, r7\n\t"
  167262. #else
  167263. "adc r5, r7\n\t"
  167264. #endif
  167265. #ifdef WOLFSSL_KEIL
  167266. "adcs r3, r3, %[r]\n\t"
  167267. #elif defined(__clang__)
  167268. "adcs r3, %[r]\n\t"
  167269. #else
  167270. "adc r3, %[r]\n\t"
  167271. #endif
  167272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167273. "lsrs r6, %[a], #16\n\t"
  167274. #else
  167275. "lsr r6, %[a], #16\n\t"
  167276. #endif
  167277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167278. "lsrs r7, %[b], #16\n\t"
  167279. #else
  167280. "lsr r7, %[b], #16\n\t"
  167281. #endif
  167282. #ifdef WOLFSSL_KEIL
  167283. "muls r7, r6, r7\n\t"
  167284. #elif defined(__clang__)
  167285. "muls r7, r6\n\t"
  167286. #else
  167287. "mul r7, r6\n\t"
  167288. #endif
  167289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167290. "adds r5, r5, r7\n\t"
  167291. #else
  167292. "add r5, r5, r7\n\t"
  167293. #endif
  167294. #ifdef WOLFSSL_KEIL
  167295. "adcs r3, r3, %[r]\n\t"
  167296. #elif defined(__clang__)
  167297. "adcs r3, %[r]\n\t"
  167298. #else
  167299. "adc r3, %[r]\n\t"
  167300. #endif
  167301. "uxth r7, %[b]\n\t"
  167302. #ifdef WOLFSSL_KEIL
  167303. "muls r6, r7, r6\n\t"
  167304. #elif defined(__clang__)
  167305. "muls r6, r7\n\t"
  167306. #else
  167307. "mul r6, r7\n\t"
  167308. #endif
  167309. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167310. "lsrs r7, r6, #16\n\t"
  167311. #else
  167312. "lsr r7, r6, #16\n\t"
  167313. #endif
  167314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167315. "lsls r6, r6, #16\n\t"
  167316. #else
  167317. "lsl r6, r6, #16\n\t"
  167318. #endif
  167319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167320. "adds r4, r4, r6\n\t"
  167321. #else
  167322. "add r4, r4, r6\n\t"
  167323. #endif
  167324. #ifdef WOLFSSL_KEIL
  167325. "adcs r5, r5, r7\n\t"
  167326. #elif defined(__clang__)
  167327. "adcs r5, r7\n\t"
  167328. #else
  167329. "adc r5, r7\n\t"
  167330. #endif
  167331. #ifdef WOLFSSL_KEIL
  167332. "adcs r3, r3, %[r]\n\t"
  167333. #elif defined(__clang__)
  167334. "adcs r3, %[r]\n\t"
  167335. #else
  167336. "adc r3, %[r]\n\t"
  167337. #endif
  167338. "# A[12] * B[13]\n\t"
  167339. "mov %[a], r9\n\t"
  167340. "mov %[b], r10\n\t"
  167341. "ldr %[a], [%[a], #48]\n\t"
  167342. "ldr %[b], [%[b], #52]\n\t"
  167343. "uxth r6, %[a]\n\t"
  167344. "uxth r7, %[b]\n\t"
  167345. #ifdef WOLFSSL_KEIL
  167346. "muls r7, r6, r7\n\t"
  167347. #elif defined(__clang__)
  167348. "muls r7, r6\n\t"
  167349. #else
  167350. "mul r7, r6\n\t"
  167351. #endif
  167352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167353. "adds r4, r4, r7\n\t"
  167354. #else
  167355. "add r4, r4, r7\n\t"
  167356. #endif
  167357. #ifdef WOLFSSL_KEIL
  167358. "adcs r5, r5, %[r]\n\t"
  167359. #elif defined(__clang__)
  167360. "adcs r5, %[r]\n\t"
  167361. #else
  167362. "adc r5, %[r]\n\t"
  167363. #endif
  167364. #ifdef WOLFSSL_KEIL
  167365. "adcs r3, r3, %[r]\n\t"
  167366. #elif defined(__clang__)
  167367. "adcs r3, %[r]\n\t"
  167368. #else
  167369. "adc r3, %[r]\n\t"
  167370. #endif
  167371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167372. "lsrs r7, %[b], #16\n\t"
  167373. #else
  167374. "lsr r7, %[b], #16\n\t"
  167375. #endif
  167376. #ifdef WOLFSSL_KEIL
  167377. "muls r6, r7, r6\n\t"
  167378. #elif defined(__clang__)
  167379. "muls r6, r7\n\t"
  167380. #else
  167381. "mul r6, r7\n\t"
  167382. #endif
  167383. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167384. "lsrs r7, r6, #16\n\t"
  167385. #else
  167386. "lsr r7, r6, #16\n\t"
  167387. #endif
  167388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167389. "lsls r6, r6, #16\n\t"
  167390. #else
  167391. "lsl r6, r6, #16\n\t"
  167392. #endif
  167393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167394. "adds r4, r4, r6\n\t"
  167395. #else
  167396. "add r4, r4, r6\n\t"
  167397. #endif
  167398. #ifdef WOLFSSL_KEIL
  167399. "adcs r5, r5, r7\n\t"
  167400. #elif defined(__clang__)
  167401. "adcs r5, r7\n\t"
  167402. #else
  167403. "adc r5, r7\n\t"
  167404. #endif
  167405. #ifdef WOLFSSL_KEIL
  167406. "adcs r3, r3, %[r]\n\t"
  167407. #elif defined(__clang__)
  167408. "adcs r3, %[r]\n\t"
  167409. #else
  167410. "adc r3, %[r]\n\t"
  167411. #endif
  167412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167413. "lsrs r6, %[a], #16\n\t"
  167414. #else
  167415. "lsr r6, %[a], #16\n\t"
  167416. #endif
  167417. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167418. "lsrs r7, %[b], #16\n\t"
  167419. #else
  167420. "lsr r7, %[b], #16\n\t"
  167421. #endif
  167422. #ifdef WOLFSSL_KEIL
  167423. "muls r7, r6, r7\n\t"
  167424. #elif defined(__clang__)
  167425. "muls r7, r6\n\t"
  167426. #else
  167427. "mul r7, r6\n\t"
  167428. #endif
  167429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167430. "adds r5, r5, r7\n\t"
  167431. #else
  167432. "add r5, r5, r7\n\t"
  167433. #endif
  167434. #ifdef WOLFSSL_KEIL
  167435. "adcs r3, r3, %[r]\n\t"
  167436. #elif defined(__clang__)
  167437. "adcs r3, %[r]\n\t"
  167438. #else
  167439. "adc r3, %[r]\n\t"
  167440. #endif
  167441. "uxth r7, %[b]\n\t"
  167442. #ifdef WOLFSSL_KEIL
  167443. "muls r6, r7, r6\n\t"
  167444. #elif defined(__clang__)
  167445. "muls r6, r7\n\t"
  167446. #else
  167447. "mul r6, r7\n\t"
  167448. #endif
  167449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167450. "lsrs r7, r6, #16\n\t"
  167451. #else
  167452. "lsr r7, r6, #16\n\t"
  167453. #endif
  167454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167455. "lsls r6, r6, #16\n\t"
  167456. #else
  167457. "lsl r6, r6, #16\n\t"
  167458. #endif
  167459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167460. "adds r4, r4, r6\n\t"
  167461. #else
  167462. "add r4, r4, r6\n\t"
  167463. #endif
  167464. #ifdef WOLFSSL_KEIL
  167465. "adcs r5, r5, r7\n\t"
  167466. #elif defined(__clang__)
  167467. "adcs r5, r7\n\t"
  167468. #else
  167469. "adc r5, r7\n\t"
  167470. #endif
  167471. #ifdef WOLFSSL_KEIL
  167472. "adcs r3, r3, %[r]\n\t"
  167473. #elif defined(__clang__)
  167474. "adcs r3, %[r]\n\t"
  167475. #else
  167476. "adc r3, %[r]\n\t"
  167477. #endif
  167478. "# A[13] * B[12]\n\t"
  167479. "mov %[a], r9\n\t"
  167480. "mov %[b], r10\n\t"
  167481. "ldr %[a], [%[a], #52]\n\t"
  167482. "ldr %[b], [%[b], #48]\n\t"
  167483. "uxth r6, %[a]\n\t"
  167484. "uxth r7, %[b]\n\t"
  167485. #ifdef WOLFSSL_KEIL
  167486. "muls r7, r6, r7\n\t"
  167487. #elif defined(__clang__)
  167488. "muls r7, r6\n\t"
  167489. #else
  167490. "mul r7, r6\n\t"
  167491. #endif
  167492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167493. "adds r4, r4, r7\n\t"
  167494. #else
  167495. "add r4, r4, r7\n\t"
  167496. #endif
  167497. #ifdef WOLFSSL_KEIL
  167498. "adcs r5, r5, %[r]\n\t"
  167499. #elif defined(__clang__)
  167500. "adcs r5, %[r]\n\t"
  167501. #else
  167502. "adc r5, %[r]\n\t"
  167503. #endif
  167504. #ifdef WOLFSSL_KEIL
  167505. "adcs r3, r3, %[r]\n\t"
  167506. #elif defined(__clang__)
  167507. "adcs r3, %[r]\n\t"
  167508. #else
  167509. "adc r3, %[r]\n\t"
  167510. #endif
  167511. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167512. "lsrs r7, %[b], #16\n\t"
  167513. #else
  167514. "lsr r7, %[b], #16\n\t"
  167515. #endif
  167516. #ifdef WOLFSSL_KEIL
  167517. "muls r6, r7, r6\n\t"
  167518. #elif defined(__clang__)
  167519. "muls r6, r7\n\t"
  167520. #else
  167521. "mul r6, r7\n\t"
  167522. #endif
  167523. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167524. "lsrs r7, r6, #16\n\t"
  167525. #else
  167526. "lsr r7, r6, #16\n\t"
  167527. #endif
  167528. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167529. "lsls r6, r6, #16\n\t"
  167530. #else
  167531. "lsl r6, r6, #16\n\t"
  167532. #endif
  167533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167534. "adds r4, r4, r6\n\t"
  167535. #else
  167536. "add r4, r4, r6\n\t"
  167537. #endif
  167538. #ifdef WOLFSSL_KEIL
  167539. "adcs r5, r5, r7\n\t"
  167540. #elif defined(__clang__)
  167541. "adcs r5, r7\n\t"
  167542. #else
  167543. "adc r5, r7\n\t"
  167544. #endif
  167545. #ifdef WOLFSSL_KEIL
  167546. "adcs r3, r3, %[r]\n\t"
  167547. #elif defined(__clang__)
  167548. "adcs r3, %[r]\n\t"
  167549. #else
  167550. "adc r3, %[r]\n\t"
  167551. #endif
  167552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167553. "lsrs r6, %[a], #16\n\t"
  167554. #else
  167555. "lsr r6, %[a], #16\n\t"
  167556. #endif
  167557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167558. "lsrs r7, %[b], #16\n\t"
  167559. #else
  167560. "lsr r7, %[b], #16\n\t"
  167561. #endif
  167562. #ifdef WOLFSSL_KEIL
  167563. "muls r7, r6, r7\n\t"
  167564. #elif defined(__clang__)
  167565. "muls r7, r6\n\t"
  167566. #else
  167567. "mul r7, r6\n\t"
  167568. #endif
  167569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167570. "adds r5, r5, r7\n\t"
  167571. #else
  167572. "add r5, r5, r7\n\t"
  167573. #endif
  167574. #ifdef WOLFSSL_KEIL
  167575. "adcs r3, r3, %[r]\n\t"
  167576. #elif defined(__clang__)
  167577. "adcs r3, %[r]\n\t"
  167578. #else
  167579. "adc r3, %[r]\n\t"
  167580. #endif
  167581. "uxth r7, %[b]\n\t"
  167582. #ifdef WOLFSSL_KEIL
  167583. "muls r6, r7, r6\n\t"
  167584. #elif defined(__clang__)
  167585. "muls r6, r7\n\t"
  167586. #else
  167587. "mul r6, r7\n\t"
  167588. #endif
  167589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167590. "lsrs r7, r6, #16\n\t"
  167591. #else
  167592. "lsr r7, r6, #16\n\t"
  167593. #endif
  167594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167595. "lsls r6, r6, #16\n\t"
  167596. #else
  167597. "lsl r6, r6, #16\n\t"
  167598. #endif
  167599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167600. "adds r4, r4, r6\n\t"
  167601. #else
  167602. "add r4, r4, r6\n\t"
  167603. #endif
  167604. #ifdef WOLFSSL_KEIL
  167605. "adcs r5, r5, r7\n\t"
  167606. #elif defined(__clang__)
  167607. "adcs r5, r7\n\t"
  167608. #else
  167609. "adc r5, r7\n\t"
  167610. #endif
  167611. #ifdef WOLFSSL_KEIL
  167612. "adcs r3, r3, %[r]\n\t"
  167613. #elif defined(__clang__)
  167614. "adcs r3, %[r]\n\t"
  167615. #else
  167616. "adc r3, %[r]\n\t"
  167617. #endif
  167618. "# A[14] * B[11]\n\t"
  167619. "mov %[a], r9\n\t"
  167620. "mov %[b], r10\n\t"
  167621. "ldr %[a], [%[a], #56]\n\t"
  167622. "ldr %[b], [%[b], #44]\n\t"
  167623. "uxth r6, %[a]\n\t"
  167624. "uxth r7, %[b]\n\t"
  167625. #ifdef WOLFSSL_KEIL
  167626. "muls r7, r6, r7\n\t"
  167627. #elif defined(__clang__)
  167628. "muls r7, r6\n\t"
  167629. #else
  167630. "mul r7, r6\n\t"
  167631. #endif
  167632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167633. "adds r4, r4, r7\n\t"
  167634. #else
  167635. "add r4, r4, r7\n\t"
  167636. #endif
  167637. #ifdef WOLFSSL_KEIL
  167638. "adcs r5, r5, %[r]\n\t"
  167639. #elif defined(__clang__)
  167640. "adcs r5, %[r]\n\t"
  167641. #else
  167642. "adc r5, %[r]\n\t"
  167643. #endif
  167644. #ifdef WOLFSSL_KEIL
  167645. "adcs r3, r3, %[r]\n\t"
  167646. #elif defined(__clang__)
  167647. "adcs r3, %[r]\n\t"
  167648. #else
  167649. "adc r3, %[r]\n\t"
  167650. #endif
  167651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167652. "lsrs r7, %[b], #16\n\t"
  167653. #else
  167654. "lsr r7, %[b], #16\n\t"
  167655. #endif
  167656. #ifdef WOLFSSL_KEIL
  167657. "muls r6, r7, r6\n\t"
  167658. #elif defined(__clang__)
  167659. "muls r6, r7\n\t"
  167660. #else
  167661. "mul r6, r7\n\t"
  167662. #endif
  167663. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167664. "lsrs r7, r6, #16\n\t"
  167665. #else
  167666. "lsr r7, r6, #16\n\t"
  167667. #endif
  167668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167669. "lsls r6, r6, #16\n\t"
  167670. #else
  167671. "lsl r6, r6, #16\n\t"
  167672. #endif
  167673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167674. "adds r4, r4, r6\n\t"
  167675. #else
  167676. "add r4, r4, r6\n\t"
  167677. #endif
  167678. #ifdef WOLFSSL_KEIL
  167679. "adcs r5, r5, r7\n\t"
  167680. #elif defined(__clang__)
  167681. "adcs r5, r7\n\t"
  167682. #else
  167683. "adc r5, r7\n\t"
  167684. #endif
  167685. #ifdef WOLFSSL_KEIL
  167686. "adcs r3, r3, %[r]\n\t"
  167687. #elif defined(__clang__)
  167688. "adcs r3, %[r]\n\t"
  167689. #else
  167690. "adc r3, %[r]\n\t"
  167691. #endif
  167692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167693. "lsrs r6, %[a], #16\n\t"
  167694. #else
  167695. "lsr r6, %[a], #16\n\t"
  167696. #endif
  167697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167698. "lsrs r7, %[b], #16\n\t"
  167699. #else
  167700. "lsr r7, %[b], #16\n\t"
  167701. #endif
  167702. #ifdef WOLFSSL_KEIL
  167703. "muls r7, r6, r7\n\t"
  167704. #elif defined(__clang__)
  167705. "muls r7, r6\n\t"
  167706. #else
  167707. "mul r7, r6\n\t"
  167708. #endif
  167709. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167710. "adds r5, r5, r7\n\t"
  167711. #else
  167712. "add r5, r5, r7\n\t"
  167713. #endif
  167714. #ifdef WOLFSSL_KEIL
  167715. "adcs r3, r3, %[r]\n\t"
  167716. #elif defined(__clang__)
  167717. "adcs r3, %[r]\n\t"
  167718. #else
  167719. "adc r3, %[r]\n\t"
  167720. #endif
  167721. "uxth r7, %[b]\n\t"
  167722. #ifdef WOLFSSL_KEIL
  167723. "muls r6, r7, r6\n\t"
  167724. #elif defined(__clang__)
  167725. "muls r6, r7\n\t"
  167726. #else
  167727. "mul r6, r7\n\t"
  167728. #endif
  167729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167730. "lsrs r7, r6, #16\n\t"
  167731. #else
  167732. "lsr r7, r6, #16\n\t"
  167733. #endif
  167734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167735. "lsls r6, r6, #16\n\t"
  167736. #else
  167737. "lsl r6, r6, #16\n\t"
  167738. #endif
  167739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167740. "adds r4, r4, r6\n\t"
  167741. #else
  167742. "add r4, r4, r6\n\t"
  167743. #endif
  167744. #ifdef WOLFSSL_KEIL
  167745. "adcs r5, r5, r7\n\t"
  167746. #elif defined(__clang__)
  167747. "adcs r5, r7\n\t"
  167748. #else
  167749. "adc r5, r7\n\t"
  167750. #endif
  167751. #ifdef WOLFSSL_KEIL
  167752. "adcs r3, r3, %[r]\n\t"
  167753. #elif defined(__clang__)
  167754. "adcs r3, %[r]\n\t"
  167755. #else
  167756. "adc r3, %[r]\n\t"
  167757. #endif
  167758. "# A[15] * B[10]\n\t"
  167759. "mov %[a], r9\n\t"
  167760. "mov %[b], r10\n\t"
  167761. "ldr %[a], [%[a], #60]\n\t"
  167762. "ldr %[b], [%[b], #40]\n\t"
  167763. "uxth r6, %[a]\n\t"
  167764. "uxth r7, %[b]\n\t"
  167765. #ifdef WOLFSSL_KEIL
  167766. "muls r7, r6, r7\n\t"
  167767. #elif defined(__clang__)
  167768. "muls r7, r6\n\t"
  167769. #else
  167770. "mul r7, r6\n\t"
  167771. #endif
  167772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167773. "adds r4, r4, r7\n\t"
  167774. #else
  167775. "add r4, r4, r7\n\t"
  167776. #endif
  167777. #ifdef WOLFSSL_KEIL
  167778. "adcs r5, r5, %[r]\n\t"
  167779. #elif defined(__clang__)
  167780. "adcs r5, %[r]\n\t"
  167781. #else
  167782. "adc r5, %[r]\n\t"
  167783. #endif
  167784. #ifdef WOLFSSL_KEIL
  167785. "adcs r3, r3, %[r]\n\t"
  167786. #elif defined(__clang__)
  167787. "adcs r3, %[r]\n\t"
  167788. #else
  167789. "adc r3, %[r]\n\t"
  167790. #endif
  167791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167792. "lsrs r7, %[b], #16\n\t"
  167793. #else
  167794. "lsr r7, %[b], #16\n\t"
  167795. #endif
  167796. #ifdef WOLFSSL_KEIL
  167797. "muls r6, r7, r6\n\t"
  167798. #elif defined(__clang__)
  167799. "muls r6, r7\n\t"
  167800. #else
  167801. "mul r6, r7\n\t"
  167802. #endif
  167803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167804. "lsrs r7, r6, #16\n\t"
  167805. #else
  167806. "lsr r7, r6, #16\n\t"
  167807. #endif
  167808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167809. "lsls r6, r6, #16\n\t"
  167810. #else
  167811. "lsl r6, r6, #16\n\t"
  167812. #endif
  167813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167814. "adds r4, r4, r6\n\t"
  167815. #else
  167816. "add r4, r4, r6\n\t"
  167817. #endif
  167818. #ifdef WOLFSSL_KEIL
  167819. "adcs r5, r5, r7\n\t"
  167820. #elif defined(__clang__)
  167821. "adcs r5, r7\n\t"
  167822. #else
  167823. "adc r5, r7\n\t"
  167824. #endif
  167825. #ifdef WOLFSSL_KEIL
  167826. "adcs r3, r3, %[r]\n\t"
  167827. #elif defined(__clang__)
  167828. "adcs r3, %[r]\n\t"
  167829. #else
  167830. "adc r3, %[r]\n\t"
  167831. #endif
  167832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167833. "lsrs r6, %[a], #16\n\t"
  167834. #else
  167835. "lsr r6, %[a], #16\n\t"
  167836. #endif
  167837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167838. "lsrs r7, %[b], #16\n\t"
  167839. #else
  167840. "lsr r7, %[b], #16\n\t"
  167841. #endif
  167842. #ifdef WOLFSSL_KEIL
  167843. "muls r7, r6, r7\n\t"
  167844. #elif defined(__clang__)
  167845. "muls r7, r6\n\t"
  167846. #else
  167847. "mul r7, r6\n\t"
  167848. #endif
  167849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167850. "adds r5, r5, r7\n\t"
  167851. #else
  167852. "add r5, r5, r7\n\t"
  167853. #endif
  167854. #ifdef WOLFSSL_KEIL
  167855. "adcs r3, r3, %[r]\n\t"
  167856. #elif defined(__clang__)
  167857. "adcs r3, %[r]\n\t"
  167858. #else
  167859. "adc r3, %[r]\n\t"
  167860. #endif
  167861. "uxth r7, %[b]\n\t"
  167862. #ifdef WOLFSSL_KEIL
  167863. "muls r6, r7, r6\n\t"
  167864. #elif defined(__clang__)
  167865. "muls r6, r7\n\t"
  167866. #else
  167867. "mul r6, r7\n\t"
  167868. #endif
  167869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167870. "lsrs r7, r6, #16\n\t"
  167871. #else
  167872. "lsr r7, r6, #16\n\t"
  167873. #endif
  167874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167875. "lsls r6, r6, #16\n\t"
  167876. #else
  167877. "lsl r6, r6, #16\n\t"
  167878. #endif
  167879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167880. "adds r4, r4, r6\n\t"
  167881. #else
  167882. "add r4, r4, r6\n\t"
  167883. #endif
  167884. #ifdef WOLFSSL_KEIL
  167885. "adcs r5, r5, r7\n\t"
  167886. #elif defined(__clang__)
  167887. "adcs r5, r7\n\t"
  167888. #else
  167889. "adc r5, r7\n\t"
  167890. #endif
  167891. #ifdef WOLFSSL_KEIL
  167892. "adcs r3, r3, %[r]\n\t"
  167893. #elif defined(__clang__)
  167894. "adcs r3, %[r]\n\t"
  167895. #else
  167896. "adc r3, %[r]\n\t"
  167897. #endif
  167898. "mov %[r], r8\n\t"
  167899. "str r4, [%[r], #100]\n\t"
  167900. "movs %[r], #0\n\t"
  167901. "# A[15] * B[11]\n\t"
  167902. "movs r4, #0\n\t"
  167903. "mov %[a], r9\n\t"
  167904. "mov %[b], r10\n\t"
  167905. "ldr %[a], [%[a], #60]\n\t"
  167906. "ldr %[b], [%[b], #44]\n\t"
  167907. "uxth r6, %[a]\n\t"
  167908. "uxth r7, %[b]\n\t"
  167909. #ifdef WOLFSSL_KEIL
  167910. "muls r7, r6, r7\n\t"
  167911. #elif defined(__clang__)
  167912. "muls r7, r6\n\t"
  167913. #else
  167914. "mul r7, r6\n\t"
  167915. #endif
  167916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167917. "adds r5, r5, r7\n\t"
  167918. #else
  167919. "add r5, r5, r7\n\t"
  167920. #endif
  167921. #ifdef WOLFSSL_KEIL
  167922. "adcs r3, r3, %[r]\n\t"
  167923. #elif defined(__clang__)
  167924. "adcs r3, %[r]\n\t"
  167925. #else
  167926. "adc r3, %[r]\n\t"
  167927. #endif
  167928. #ifdef WOLFSSL_KEIL
  167929. "adcs r4, r4, %[r]\n\t"
  167930. #elif defined(__clang__)
  167931. "adcs r4, %[r]\n\t"
  167932. #else
  167933. "adc r4, %[r]\n\t"
  167934. #endif
  167935. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167936. "lsrs r7, %[b], #16\n\t"
  167937. #else
  167938. "lsr r7, %[b], #16\n\t"
  167939. #endif
  167940. #ifdef WOLFSSL_KEIL
  167941. "muls r6, r7, r6\n\t"
  167942. #elif defined(__clang__)
  167943. "muls r6, r7\n\t"
  167944. #else
  167945. "mul r6, r7\n\t"
  167946. #endif
  167947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167948. "lsrs r7, r6, #16\n\t"
  167949. #else
  167950. "lsr r7, r6, #16\n\t"
  167951. #endif
  167952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167953. "lsls r6, r6, #16\n\t"
  167954. #else
  167955. "lsl r6, r6, #16\n\t"
  167956. #endif
  167957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167958. "adds r5, r5, r6\n\t"
  167959. #else
  167960. "add r5, r5, r6\n\t"
  167961. #endif
  167962. #ifdef WOLFSSL_KEIL
  167963. "adcs r3, r3, r7\n\t"
  167964. #elif defined(__clang__)
  167965. "adcs r3, r7\n\t"
  167966. #else
  167967. "adc r3, r7\n\t"
  167968. #endif
  167969. #ifdef WOLFSSL_KEIL
  167970. "adcs r4, r4, %[r]\n\t"
  167971. #elif defined(__clang__)
  167972. "adcs r4, %[r]\n\t"
  167973. #else
  167974. "adc r4, %[r]\n\t"
  167975. #endif
  167976. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167977. "lsrs r6, %[a], #16\n\t"
  167978. #else
  167979. "lsr r6, %[a], #16\n\t"
  167980. #endif
  167981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167982. "lsrs r7, %[b], #16\n\t"
  167983. #else
  167984. "lsr r7, %[b], #16\n\t"
  167985. #endif
  167986. #ifdef WOLFSSL_KEIL
  167987. "muls r7, r6, r7\n\t"
  167988. #elif defined(__clang__)
  167989. "muls r7, r6\n\t"
  167990. #else
  167991. "mul r7, r6\n\t"
  167992. #endif
  167993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  167994. "adds r3, r3, r7\n\t"
  167995. #else
  167996. "add r3, r3, r7\n\t"
  167997. #endif
  167998. #ifdef WOLFSSL_KEIL
  167999. "adcs r4, r4, %[r]\n\t"
  168000. #elif defined(__clang__)
  168001. "adcs r4, %[r]\n\t"
  168002. #else
  168003. "adc r4, %[r]\n\t"
  168004. #endif
  168005. "uxth r7, %[b]\n\t"
  168006. #ifdef WOLFSSL_KEIL
  168007. "muls r6, r7, r6\n\t"
  168008. #elif defined(__clang__)
  168009. "muls r6, r7\n\t"
  168010. #else
  168011. "mul r6, r7\n\t"
  168012. #endif
  168013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168014. "lsrs r7, r6, #16\n\t"
  168015. #else
  168016. "lsr r7, r6, #16\n\t"
  168017. #endif
  168018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168019. "lsls r6, r6, #16\n\t"
  168020. #else
  168021. "lsl r6, r6, #16\n\t"
  168022. #endif
  168023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168024. "adds r5, r5, r6\n\t"
  168025. #else
  168026. "add r5, r5, r6\n\t"
  168027. #endif
  168028. #ifdef WOLFSSL_KEIL
  168029. "adcs r3, r3, r7\n\t"
  168030. #elif defined(__clang__)
  168031. "adcs r3, r7\n\t"
  168032. #else
  168033. "adc r3, r7\n\t"
  168034. #endif
  168035. #ifdef WOLFSSL_KEIL
  168036. "adcs r4, r4, %[r]\n\t"
  168037. #elif defined(__clang__)
  168038. "adcs r4, %[r]\n\t"
  168039. #else
  168040. "adc r4, %[r]\n\t"
  168041. #endif
  168042. "# A[14] * B[12]\n\t"
  168043. "mov %[a], r9\n\t"
  168044. "mov %[b], r10\n\t"
  168045. "ldr %[a], [%[a], #56]\n\t"
  168046. "ldr %[b], [%[b], #48]\n\t"
  168047. "uxth r6, %[a]\n\t"
  168048. "uxth r7, %[b]\n\t"
  168049. #ifdef WOLFSSL_KEIL
  168050. "muls r7, r6, r7\n\t"
  168051. #elif defined(__clang__)
  168052. "muls r7, r6\n\t"
  168053. #else
  168054. "mul r7, r6\n\t"
  168055. #endif
  168056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168057. "adds r5, r5, r7\n\t"
  168058. #else
  168059. "add r5, r5, r7\n\t"
  168060. #endif
  168061. #ifdef WOLFSSL_KEIL
  168062. "adcs r3, r3, %[r]\n\t"
  168063. #elif defined(__clang__)
  168064. "adcs r3, %[r]\n\t"
  168065. #else
  168066. "adc r3, %[r]\n\t"
  168067. #endif
  168068. #ifdef WOLFSSL_KEIL
  168069. "adcs r4, r4, %[r]\n\t"
  168070. #elif defined(__clang__)
  168071. "adcs r4, %[r]\n\t"
  168072. #else
  168073. "adc r4, %[r]\n\t"
  168074. #endif
  168075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168076. "lsrs r7, %[b], #16\n\t"
  168077. #else
  168078. "lsr r7, %[b], #16\n\t"
  168079. #endif
  168080. #ifdef WOLFSSL_KEIL
  168081. "muls r6, r7, r6\n\t"
  168082. #elif defined(__clang__)
  168083. "muls r6, r7\n\t"
  168084. #else
  168085. "mul r6, r7\n\t"
  168086. #endif
  168087. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168088. "lsrs r7, r6, #16\n\t"
  168089. #else
  168090. "lsr r7, r6, #16\n\t"
  168091. #endif
  168092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168093. "lsls r6, r6, #16\n\t"
  168094. #else
  168095. "lsl r6, r6, #16\n\t"
  168096. #endif
  168097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168098. "adds r5, r5, r6\n\t"
  168099. #else
  168100. "add r5, r5, r6\n\t"
  168101. #endif
  168102. #ifdef WOLFSSL_KEIL
  168103. "adcs r3, r3, r7\n\t"
  168104. #elif defined(__clang__)
  168105. "adcs r3, r7\n\t"
  168106. #else
  168107. "adc r3, r7\n\t"
  168108. #endif
  168109. #ifdef WOLFSSL_KEIL
  168110. "adcs r4, r4, %[r]\n\t"
  168111. #elif defined(__clang__)
  168112. "adcs r4, %[r]\n\t"
  168113. #else
  168114. "adc r4, %[r]\n\t"
  168115. #endif
  168116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168117. "lsrs r6, %[a], #16\n\t"
  168118. #else
  168119. "lsr r6, %[a], #16\n\t"
  168120. #endif
  168121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168122. "lsrs r7, %[b], #16\n\t"
  168123. #else
  168124. "lsr r7, %[b], #16\n\t"
  168125. #endif
  168126. #ifdef WOLFSSL_KEIL
  168127. "muls r7, r6, r7\n\t"
  168128. #elif defined(__clang__)
  168129. "muls r7, r6\n\t"
  168130. #else
  168131. "mul r7, r6\n\t"
  168132. #endif
  168133. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168134. "adds r3, r3, r7\n\t"
  168135. #else
  168136. "add r3, r3, r7\n\t"
  168137. #endif
  168138. #ifdef WOLFSSL_KEIL
  168139. "adcs r4, r4, %[r]\n\t"
  168140. #elif defined(__clang__)
  168141. "adcs r4, %[r]\n\t"
  168142. #else
  168143. "adc r4, %[r]\n\t"
  168144. #endif
  168145. "uxth r7, %[b]\n\t"
  168146. #ifdef WOLFSSL_KEIL
  168147. "muls r6, r7, r6\n\t"
  168148. #elif defined(__clang__)
  168149. "muls r6, r7\n\t"
  168150. #else
  168151. "mul r6, r7\n\t"
  168152. #endif
  168153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168154. "lsrs r7, r6, #16\n\t"
  168155. #else
  168156. "lsr r7, r6, #16\n\t"
  168157. #endif
  168158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168159. "lsls r6, r6, #16\n\t"
  168160. #else
  168161. "lsl r6, r6, #16\n\t"
  168162. #endif
  168163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168164. "adds r5, r5, r6\n\t"
  168165. #else
  168166. "add r5, r5, r6\n\t"
  168167. #endif
  168168. #ifdef WOLFSSL_KEIL
  168169. "adcs r3, r3, r7\n\t"
  168170. #elif defined(__clang__)
  168171. "adcs r3, r7\n\t"
  168172. #else
  168173. "adc r3, r7\n\t"
  168174. #endif
  168175. #ifdef WOLFSSL_KEIL
  168176. "adcs r4, r4, %[r]\n\t"
  168177. #elif defined(__clang__)
  168178. "adcs r4, %[r]\n\t"
  168179. #else
  168180. "adc r4, %[r]\n\t"
  168181. #endif
  168182. "# A[13] * B[13]\n\t"
  168183. "mov %[a], r9\n\t"
  168184. "mov %[b], r10\n\t"
  168185. "ldr %[a], [%[a], #52]\n\t"
  168186. "ldr %[b], [%[b], #52]\n\t"
  168187. "uxth r6, %[a]\n\t"
  168188. "uxth r7, %[b]\n\t"
  168189. #ifdef WOLFSSL_KEIL
  168190. "muls r7, r6, r7\n\t"
  168191. #elif defined(__clang__)
  168192. "muls r7, r6\n\t"
  168193. #else
  168194. "mul r7, r6\n\t"
  168195. #endif
  168196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168197. "adds r5, r5, r7\n\t"
  168198. #else
  168199. "add r5, r5, r7\n\t"
  168200. #endif
  168201. #ifdef WOLFSSL_KEIL
  168202. "adcs r3, r3, %[r]\n\t"
  168203. #elif defined(__clang__)
  168204. "adcs r3, %[r]\n\t"
  168205. #else
  168206. "adc r3, %[r]\n\t"
  168207. #endif
  168208. #ifdef WOLFSSL_KEIL
  168209. "adcs r4, r4, %[r]\n\t"
  168210. #elif defined(__clang__)
  168211. "adcs r4, %[r]\n\t"
  168212. #else
  168213. "adc r4, %[r]\n\t"
  168214. #endif
  168215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168216. "lsrs r7, %[b], #16\n\t"
  168217. #else
  168218. "lsr r7, %[b], #16\n\t"
  168219. #endif
  168220. #ifdef WOLFSSL_KEIL
  168221. "muls r6, r7, r6\n\t"
  168222. #elif defined(__clang__)
  168223. "muls r6, r7\n\t"
  168224. #else
  168225. "mul r6, r7\n\t"
  168226. #endif
  168227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168228. "lsrs r7, r6, #16\n\t"
  168229. #else
  168230. "lsr r7, r6, #16\n\t"
  168231. #endif
  168232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168233. "lsls r6, r6, #16\n\t"
  168234. #else
  168235. "lsl r6, r6, #16\n\t"
  168236. #endif
  168237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168238. "adds r5, r5, r6\n\t"
  168239. #else
  168240. "add r5, r5, r6\n\t"
  168241. #endif
  168242. #ifdef WOLFSSL_KEIL
  168243. "adcs r3, r3, r7\n\t"
  168244. #elif defined(__clang__)
  168245. "adcs r3, r7\n\t"
  168246. #else
  168247. "adc r3, r7\n\t"
  168248. #endif
  168249. #ifdef WOLFSSL_KEIL
  168250. "adcs r4, r4, %[r]\n\t"
  168251. #elif defined(__clang__)
  168252. "adcs r4, %[r]\n\t"
  168253. #else
  168254. "adc r4, %[r]\n\t"
  168255. #endif
  168256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168257. "lsrs r6, %[a], #16\n\t"
  168258. #else
  168259. "lsr r6, %[a], #16\n\t"
  168260. #endif
  168261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168262. "lsrs r7, %[b], #16\n\t"
  168263. #else
  168264. "lsr r7, %[b], #16\n\t"
  168265. #endif
  168266. #ifdef WOLFSSL_KEIL
  168267. "muls r7, r6, r7\n\t"
  168268. #elif defined(__clang__)
  168269. "muls r7, r6\n\t"
  168270. #else
  168271. "mul r7, r6\n\t"
  168272. #endif
  168273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168274. "adds r3, r3, r7\n\t"
  168275. #else
  168276. "add r3, r3, r7\n\t"
  168277. #endif
  168278. #ifdef WOLFSSL_KEIL
  168279. "adcs r4, r4, %[r]\n\t"
  168280. #elif defined(__clang__)
  168281. "adcs r4, %[r]\n\t"
  168282. #else
  168283. "adc r4, %[r]\n\t"
  168284. #endif
  168285. "uxth r7, %[b]\n\t"
  168286. #ifdef WOLFSSL_KEIL
  168287. "muls r6, r7, r6\n\t"
  168288. #elif defined(__clang__)
  168289. "muls r6, r7\n\t"
  168290. #else
  168291. "mul r6, r7\n\t"
  168292. #endif
  168293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168294. "lsrs r7, r6, #16\n\t"
  168295. #else
  168296. "lsr r7, r6, #16\n\t"
  168297. #endif
  168298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168299. "lsls r6, r6, #16\n\t"
  168300. #else
  168301. "lsl r6, r6, #16\n\t"
  168302. #endif
  168303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168304. "adds r5, r5, r6\n\t"
  168305. #else
  168306. "add r5, r5, r6\n\t"
  168307. #endif
  168308. #ifdef WOLFSSL_KEIL
  168309. "adcs r3, r3, r7\n\t"
  168310. #elif defined(__clang__)
  168311. "adcs r3, r7\n\t"
  168312. #else
  168313. "adc r3, r7\n\t"
  168314. #endif
  168315. #ifdef WOLFSSL_KEIL
  168316. "adcs r4, r4, %[r]\n\t"
  168317. #elif defined(__clang__)
  168318. "adcs r4, %[r]\n\t"
  168319. #else
  168320. "adc r4, %[r]\n\t"
  168321. #endif
  168322. "# A[12] * B[14]\n\t"
  168323. "mov %[a], r9\n\t"
  168324. "mov %[b], r10\n\t"
  168325. "ldr %[a], [%[a], #48]\n\t"
  168326. "ldr %[b], [%[b], #56]\n\t"
  168327. "uxth r6, %[a]\n\t"
  168328. "uxth r7, %[b]\n\t"
  168329. #ifdef WOLFSSL_KEIL
  168330. "muls r7, r6, r7\n\t"
  168331. #elif defined(__clang__)
  168332. "muls r7, r6\n\t"
  168333. #else
  168334. "mul r7, r6\n\t"
  168335. #endif
  168336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168337. "adds r5, r5, r7\n\t"
  168338. #else
  168339. "add r5, r5, r7\n\t"
  168340. #endif
  168341. #ifdef WOLFSSL_KEIL
  168342. "adcs r3, r3, %[r]\n\t"
  168343. #elif defined(__clang__)
  168344. "adcs r3, %[r]\n\t"
  168345. #else
  168346. "adc r3, %[r]\n\t"
  168347. #endif
  168348. #ifdef WOLFSSL_KEIL
  168349. "adcs r4, r4, %[r]\n\t"
  168350. #elif defined(__clang__)
  168351. "adcs r4, %[r]\n\t"
  168352. #else
  168353. "adc r4, %[r]\n\t"
  168354. #endif
  168355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168356. "lsrs r7, %[b], #16\n\t"
  168357. #else
  168358. "lsr r7, %[b], #16\n\t"
  168359. #endif
  168360. #ifdef WOLFSSL_KEIL
  168361. "muls r6, r7, r6\n\t"
  168362. #elif defined(__clang__)
  168363. "muls r6, r7\n\t"
  168364. #else
  168365. "mul r6, r7\n\t"
  168366. #endif
  168367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168368. "lsrs r7, r6, #16\n\t"
  168369. #else
  168370. "lsr r7, r6, #16\n\t"
  168371. #endif
  168372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168373. "lsls r6, r6, #16\n\t"
  168374. #else
  168375. "lsl r6, r6, #16\n\t"
  168376. #endif
  168377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168378. "adds r5, r5, r6\n\t"
  168379. #else
  168380. "add r5, r5, r6\n\t"
  168381. #endif
  168382. #ifdef WOLFSSL_KEIL
  168383. "adcs r3, r3, r7\n\t"
  168384. #elif defined(__clang__)
  168385. "adcs r3, r7\n\t"
  168386. #else
  168387. "adc r3, r7\n\t"
  168388. #endif
  168389. #ifdef WOLFSSL_KEIL
  168390. "adcs r4, r4, %[r]\n\t"
  168391. #elif defined(__clang__)
  168392. "adcs r4, %[r]\n\t"
  168393. #else
  168394. "adc r4, %[r]\n\t"
  168395. #endif
  168396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168397. "lsrs r6, %[a], #16\n\t"
  168398. #else
  168399. "lsr r6, %[a], #16\n\t"
  168400. #endif
  168401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168402. "lsrs r7, %[b], #16\n\t"
  168403. #else
  168404. "lsr r7, %[b], #16\n\t"
  168405. #endif
  168406. #ifdef WOLFSSL_KEIL
  168407. "muls r7, r6, r7\n\t"
  168408. #elif defined(__clang__)
  168409. "muls r7, r6\n\t"
  168410. #else
  168411. "mul r7, r6\n\t"
  168412. #endif
  168413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168414. "adds r3, r3, r7\n\t"
  168415. #else
  168416. "add r3, r3, r7\n\t"
  168417. #endif
  168418. #ifdef WOLFSSL_KEIL
  168419. "adcs r4, r4, %[r]\n\t"
  168420. #elif defined(__clang__)
  168421. "adcs r4, %[r]\n\t"
  168422. #else
  168423. "adc r4, %[r]\n\t"
  168424. #endif
  168425. "uxth r7, %[b]\n\t"
  168426. #ifdef WOLFSSL_KEIL
  168427. "muls r6, r7, r6\n\t"
  168428. #elif defined(__clang__)
  168429. "muls r6, r7\n\t"
  168430. #else
  168431. "mul r6, r7\n\t"
  168432. #endif
  168433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168434. "lsrs r7, r6, #16\n\t"
  168435. #else
  168436. "lsr r7, r6, #16\n\t"
  168437. #endif
  168438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168439. "lsls r6, r6, #16\n\t"
  168440. #else
  168441. "lsl r6, r6, #16\n\t"
  168442. #endif
  168443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168444. "adds r5, r5, r6\n\t"
  168445. #else
  168446. "add r5, r5, r6\n\t"
  168447. #endif
  168448. #ifdef WOLFSSL_KEIL
  168449. "adcs r3, r3, r7\n\t"
  168450. #elif defined(__clang__)
  168451. "adcs r3, r7\n\t"
  168452. #else
  168453. "adc r3, r7\n\t"
  168454. #endif
  168455. #ifdef WOLFSSL_KEIL
  168456. "adcs r4, r4, %[r]\n\t"
  168457. #elif defined(__clang__)
  168458. "adcs r4, %[r]\n\t"
  168459. #else
  168460. "adc r4, %[r]\n\t"
  168461. #endif
  168462. "# A[11] * B[15]\n\t"
  168463. "mov %[a], r9\n\t"
  168464. "mov %[b], r10\n\t"
  168465. "ldr %[a], [%[a], #44]\n\t"
  168466. "ldr %[b], [%[b], #60]\n\t"
  168467. "uxth r6, %[a]\n\t"
  168468. "uxth r7, %[b]\n\t"
  168469. #ifdef WOLFSSL_KEIL
  168470. "muls r7, r6, r7\n\t"
  168471. #elif defined(__clang__)
  168472. "muls r7, r6\n\t"
  168473. #else
  168474. "mul r7, r6\n\t"
  168475. #endif
  168476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168477. "adds r5, r5, r7\n\t"
  168478. #else
  168479. "add r5, r5, r7\n\t"
  168480. #endif
  168481. #ifdef WOLFSSL_KEIL
  168482. "adcs r3, r3, %[r]\n\t"
  168483. #elif defined(__clang__)
  168484. "adcs r3, %[r]\n\t"
  168485. #else
  168486. "adc r3, %[r]\n\t"
  168487. #endif
  168488. #ifdef WOLFSSL_KEIL
  168489. "adcs r4, r4, %[r]\n\t"
  168490. #elif defined(__clang__)
  168491. "adcs r4, %[r]\n\t"
  168492. #else
  168493. "adc r4, %[r]\n\t"
  168494. #endif
  168495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168496. "lsrs r7, %[b], #16\n\t"
  168497. #else
  168498. "lsr r7, %[b], #16\n\t"
  168499. #endif
  168500. #ifdef WOLFSSL_KEIL
  168501. "muls r6, r7, r6\n\t"
  168502. #elif defined(__clang__)
  168503. "muls r6, r7\n\t"
  168504. #else
  168505. "mul r6, r7\n\t"
  168506. #endif
  168507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168508. "lsrs r7, r6, #16\n\t"
  168509. #else
  168510. "lsr r7, r6, #16\n\t"
  168511. #endif
  168512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168513. "lsls r6, r6, #16\n\t"
  168514. #else
  168515. "lsl r6, r6, #16\n\t"
  168516. #endif
  168517. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168518. "adds r5, r5, r6\n\t"
  168519. #else
  168520. "add r5, r5, r6\n\t"
  168521. #endif
  168522. #ifdef WOLFSSL_KEIL
  168523. "adcs r3, r3, r7\n\t"
  168524. #elif defined(__clang__)
  168525. "adcs r3, r7\n\t"
  168526. #else
  168527. "adc r3, r7\n\t"
  168528. #endif
  168529. #ifdef WOLFSSL_KEIL
  168530. "adcs r4, r4, %[r]\n\t"
  168531. #elif defined(__clang__)
  168532. "adcs r4, %[r]\n\t"
  168533. #else
  168534. "adc r4, %[r]\n\t"
  168535. #endif
  168536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168537. "lsrs r6, %[a], #16\n\t"
  168538. #else
  168539. "lsr r6, %[a], #16\n\t"
  168540. #endif
  168541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168542. "lsrs r7, %[b], #16\n\t"
  168543. #else
  168544. "lsr r7, %[b], #16\n\t"
  168545. #endif
  168546. #ifdef WOLFSSL_KEIL
  168547. "muls r7, r6, r7\n\t"
  168548. #elif defined(__clang__)
  168549. "muls r7, r6\n\t"
  168550. #else
  168551. "mul r7, r6\n\t"
  168552. #endif
  168553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168554. "adds r3, r3, r7\n\t"
  168555. #else
  168556. "add r3, r3, r7\n\t"
  168557. #endif
  168558. #ifdef WOLFSSL_KEIL
  168559. "adcs r4, r4, %[r]\n\t"
  168560. #elif defined(__clang__)
  168561. "adcs r4, %[r]\n\t"
  168562. #else
  168563. "adc r4, %[r]\n\t"
  168564. #endif
  168565. "uxth r7, %[b]\n\t"
  168566. #ifdef WOLFSSL_KEIL
  168567. "muls r6, r7, r6\n\t"
  168568. #elif defined(__clang__)
  168569. "muls r6, r7\n\t"
  168570. #else
  168571. "mul r6, r7\n\t"
  168572. #endif
  168573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168574. "lsrs r7, r6, #16\n\t"
  168575. #else
  168576. "lsr r7, r6, #16\n\t"
  168577. #endif
  168578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168579. "lsls r6, r6, #16\n\t"
  168580. #else
  168581. "lsl r6, r6, #16\n\t"
  168582. #endif
  168583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168584. "adds r5, r5, r6\n\t"
  168585. #else
  168586. "add r5, r5, r6\n\t"
  168587. #endif
  168588. #ifdef WOLFSSL_KEIL
  168589. "adcs r3, r3, r7\n\t"
  168590. #elif defined(__clang__)
  168591. "adcs r3, r7\n\t"
  168592. #else
  168593. "adc r3, r7\n\t"
  168594. #endif
  168595. #ifdef WOLFSSL_KEIL
  168596. "adcs r4, r4, %[r]\n\t"
  168597. #elif defined(__clang__)
  168598. "adcs r4, %[r]\n\t"
  168599. #else
  168600. "adc r4, %[r]\n\t"
  168601. #endif
  168602. "mov %[r], r8\n\t"
  168603. "str r5, [%[r], #104]\n\t"
  168604. "movs %[r], #0\n\t"
  168605. "# A[12] * B[15]\n\t"
  168606. "movs r5, #0\n\t"
  168607. "mov %[a], r9\n\t"
  168608. "mov %[b], r10\n\t"
  168609. "ldr %[a], [%[a], #48]\n\t"
  168610. "ldr %[b], [%[b], #60]\n\t"
  168611. "uxth r6, %[a]\n\t"
  168612. "uxth r7, %[b]\n\t"
  168613. #ifdef WOLFSSL_KEIL
  168614. "muls r7, r6, r7\n\t"
  168615. #elif defined(__clang__)
  168616. "muls r7, r6\n\t"
  168617. #else
  168618. "mul r7, r6\n\t"
  168619. #endif
  168620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168621. "adds r3, r3, r7\n\t"
  168622. #else
  168623. "add r3, r3, r7\n\t"
  168624. #endif
  168625. #ifdef WOLFSSL_KEIL
  168626. "adcs r4, r4, %[r]\n\t"
  168627. #elif defined(__clang__)
  168628. "adcs r4, %[r]\n\t"
  168629. #else
  168630. "adc r4, %[r]\n\t"
  168631. #endif
  168632. #ifdef WOLFSSL_KEIL
  168633. "adcs r5, r5, %[r]\n\t"
  168634. #elif defined(__clang__)
  168635. "adcs r5, %[r]\n\t"
  168636. #else
  168637. "adc r5, %[r]\n\t"
  168638. #endif
  168639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168640. "lsrs r7, %[b], #16\n\t"
  168641. #else
  168642. "lsr r7, %[b], #16\n\t"
  168643. #endif
  168644. #ifdef WOLFSSL_KEIL
  168645. "muls r6, r7, r6\n\t"
  168646. #elif defined(__clang__)
  168647. "muls r6, r7\n\t"
  168648. #else
  168649. "mul r6, r7\n\t"
  168650. #endif
  168651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168652. "lsrs r7, r6, #16\n\t"
  168653. #else
  168654. "lsr r7, r6, #16\n\t"
  168655. #endif
  168656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168657. "lsls r6, r6, #16\n\t"
  168658. #else
  168659. "lsl r6, r6, #16\n\t"
  168660. #endif
  168661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168662. "adds r3, r3, r6\n\t"
  168663. #else
  168664. "add r3, r3, r6\n\t"
  168665. #endif
  168666. #ifdef WOLFSSL_KEIL
  168667. "adcs r4, r4, r7\n\t"
  168668. #elif defined(__clang__)
  168669. "adcs r4, r7\n\t"
  168670. #else
  168671. "adc r4, r7\n\t"
  168672. #endif
  168673. #ifdef WOLFSSL_KEIL
  168674. "adcs r5, r5, %[r]\n\t"
  168675. #elif defined(__clang__)
  168676. "adcs r5, %[r]\n\t"
  168677. #else
  168678. "adc r5, %[r]\n\t"
  168679. #endif
  168680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168681. "lsrs r6, %[a], #16\n\t"
  168682. #else
  168683. "lsr r6, %[a], #16\n\t"
  168684. #endif
  168685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168686. "lsrs r7, %[b], #16\n\t"
  168687. #else
  168688. "lsr r7, %[b], #16\n\t"
  168689. #endif
  168690. #ifdef WOLFSSL_KEIL
  168691. "muls r7, r6, r7\n\t"
  168692. #elif defined(__clang__)
  168693. "muls r7, r6\n\t"
  168694. #else
  168695. "mul r7, r6\n\t"
  168696. #endif
  168697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168698. "adds r4, r4, r7\n\t"
  168699. #else
  168700. "add r4, r4, r7\n\t"
  168701. #endif
  168702. #ifdef WOLFSSL_KEIL
  168703. "adcs r5, r5, %[r]\n\t"
  168704. #elif defined(__clang__)
  168705. "adcs r5, %[r]\n\t"
  168706. #else
  168707. "adc r5, %[r]\n\t"
  168708. #endif
  168709. "uxth r7, %[b]\n\t"
  168710. #ifdef WOLFSSL_KEIL
  168711. "muls r6, r7, r6\n\t"
  168712. #elif defined(__clang__)
  168713. "muls r6, r7\n\t"
  168714. #else
  168715. "mul r6, r7\n\t"
  168716. #endif
  168717. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168718. "lsrs r7, r6, #16\n\t"
  168719. #else
  168720. "lsr r7, r6, #16\n\t"
  168721. #endif
  168722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168723. "lsls r6, r6, #16\n\t"
  168724. #else
  168725. "lsl r6, r6, #16\n\t"
  168726. #endif
  168727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168728. "adds r3, r3, r6\n\t"
  168729. #else
  168730. "add r3, r3, r6\n\t"
  168731. #endif
  168732. #ifdef WOLFSSL_KEIL
  168733. "adcs r4, r4, r7\n\t"
  168734. #elif defined(__clang__)
  168735. "adcs r4, r7\n\t"
  168736. #else
  168737. "adc r4, r7\n\t"
  168738. #endif
  168739. #ifdef WOLFSSL_KEIL
  168740. "adcs r5, r5, %[r]\n\t"
  168741. #elif defined(__clang__)
  168742. "adcs r5, %[r]\n\t"
  168743. #else
  168744. "adc r5, %[r]\n\t"
  168745. #endif
  168746. "# A[13] * B[14]\n\t"
  168747. "mov %[a], r9\n\t"
  168748. "mov %[b], r10\n\t"
  168749. "ldr %[a], [%[a], #52]\n\t"
  168750. "ldr %[b], [%[b], #56]\n\t"
  168751. "uxth r6, %[a]\n\t"
  168752. "uxth r7, %[b]\n\t"
  168753. #ifdef WOLFSSL_KEIL
  168754. "muls r7, r6, r7\n\t"
  168755. #elif defined(__clang__)
  168756. "muls r7, r6\n\t"
  168757. #else
  168758. "mul r7, r6\n\t"
  168759. #endif
  168760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168761. "adds r3, r3, r7\n\t"
  168762. #else
  168763. "add r3, r3, r7\n\t"
  168764. #endif
  168765. #ifdef WOLFSSL_KEIL
  168766. "adcs r4, r4, %[r]\n\t"
  168767. #elif defined(__clang__)
  168768. "adcs r4, %[r]\n\t"
  168769. #else
  168770. "adc r4, %[r]\n\t"
  168771. #endif
  168772. #ifdef WOLFSSL_KEIL
  168773. "adcs r5, r5, %[r]\n\t"
  168774. #elif defined(__clang__)
  168775. "adcs r5, %[r]\n\t"
  168776. #else
  168777. "adc r5, %[r]\n\t"
  168778. #endif
  168779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168780. "lsrs r7, %[b], #16\n\t"
  168781. #else
  168782. "lsr r7, %[b], #16\n\t"
  168783. #endif
  168784. #ifdef WOLFSSL_KEIL
  168785. "muls r6, r7, r6\n\t"
  168786. #elif defined(__clang__)
  168787. "muls r6, r7\n\t"
  168788. #else
  168789. "mul r6, r7\n\t"
  168790. #endif
  168791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168792. "lsrs r7, r6, #16\n\t"
  168793. #else
  168794. "lsr r7, r6, #16\n\t"
  168795. #endif
  168796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168797. "lsls r6, r6, #16\n\t"
  168798. #else
  168799. "lsl r6, r6, #16\n\t"
  168800. #endif
  168801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168802. "adds r3, r3, r6\n\t"
  168803. #else
  168804. "add r3, r3, r6\n\t"
  168805. #endif
  168806. #ifdef WOLFSSL_KEIL
  168807. "adcs r4, r4, r7\n\t"
  168808. #elif defined(__clang__)
  168809. "adcs r4, r7\n\t"
  168810. #else
  168811. "adc r4, r7\n\t"
  168812. #endif
  168813. #ifdef WOLFSSL_KEIL
  168814. "adcs r5, r5, %[r]\n\t"
  168815. #elif defined(__clang__)
  168816. "adcs r5, %[r]\n\t"
  168817. #else
  168818. "adc r5, %[r]\n\t"
  168819. #endif
  168820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168821. "lsrs r6, %[a], #16\n\t"
  168822. #else
  168823. "lsr r6, %[a], #16\n\t"
  168824. #endif
  168825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168826. "lsrs r7, %[b], #16\n\t"
  168827. #else
  168828. "lsr r7, %[b], #16\n\t"
  168829. #endif
  168830. #ifdef WOLFSSL_KEIL
  168831. "muls r7, r6, r7\n\t"
  168832. #elif defined(__clang__)
  168833. "muls r7, r6\n\t"
  168834. #else
  168835. "mul r7, r6\n\t"
  168836. #endif
  168837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168838. "adds r4, r4, r7\n\t"
  168839. #else
  168840. "add r4, r4, r7\n\t"
  168841. #endif
  168842. #ifdef WOLFSSL_KEIL
  168843. "adcs r5, r5, %[r]\n\t"
  168844. #elif defined(__clang__)
  168845. "adcs r5, %[r]\n\t"
  168846. #else
  168847. "adc r5, %[r]\n\t"
  168848. #endif
  168849. "uxth r7, %[b]\n\t"
  168850. #ifdef WOLFSSL_KEIL
  168851. "muls r6, r7, r6\n\t"
  168852. #elif defined(__clang__)
  168853. "muls r6, r7\n\t"
  168854. #else
  168855. "mul r6, r7\n\t"
  168856. #endif
  168857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168858. "lsrs r7, r6, #16\n\t"
  168859. #else
  168860. "lsr r7, r6, #16\n\t"
  168861. #endif
  168862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168863. "lsls r6, r6, #16\n\t"
  168864. #else
  168865. "lsl r6, r6, #16\n\t"
  168866. #endif
  168867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168868. "adds r3, r3, r6\n\t"
  168869. #else
  168870. "add r3, r3, r6\n\t"
  168871. #endif
  168872. #ifdef WOLFSSL_KEIL
  168873. "adcs r4, r4, r7\n\t"
  168874. #elif defined(__clang__)
  168875. "adcs r4, r7\n\t"
  168876. #else
  168877. "adc r4, r7\n\t"
  168878. #endif
  168879. #ifdef WOLFSSL_KEIL
  168880. "adcs r5, r5, %[r]\n\t"
  168881. #elif defined(__clang__)
  168882. "adcs r5, %[r]\n\t"
  168883. #else
  168884. "adc r5, %[r]\n\t"
  168885. #endif
  168886. "# A[14] * B[13]\n\t"
  168887. "mov %[a], r9\n\t"
  168888. "mov %[b], r10\n\t"
  168889. "ldr %[a], [%[a], #56]\n\t"
  168890. "ldr %[b], [%[b], #52]\n\t"
  168891. "uxth r6, %[a]\n\t"
  168892. "uxth r7, %[b]\n\t"
  168893. #ifdef WOLFSSL_KEIL
  168894. "muls r7, r6, r7\n\t"
  168895. #elif defined(__clang__)
  168896. "muls r7, r6\n\t"
  168897. #else
  168898. "mul r7, r6\n\t"
  168899. #endif
  168900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168901. "adds r3, r3, r7\n\t"
  168902. #else
  168903. "add r3, r3, r7\n\t"
  168904. #endif
  168905. #ifdef WOLFSSL_KEIL
  168906. "adcs r4, r4, %[r]\n\t"
  168907. #elif defined(__clang__)
  168908. "adcs r4, %[r]\n\t"
  168909. #else
  168910. "adc r4, %[r]\n\t"
  168911. #endif
  168912. #ifdef WOLFSSL_KEIL
  168913. "adcs r5, r5, %[r]\n\t"
  168914. #elif defined(__clang__)
  168915. "adcs r5, %[r]\n\t"
  168916. #else
  168917. "adc r5, %[r]\n\t"
  168918. #endif
  168919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168920. "lsrs r7, %[b], #16\n\t"
  168921. #else
  168922. "lsr r7, %[b], #16\n\t"
  168923. #endif
  168924. #ifdef WOLFSSL_KEIL
  168925. "muls r6, r7, r6\n\t"
  168926. #elif defined(__clang__)
  168927. "muls r6, r7\n\t"
  168928. #else
  168929. "mul r6, r7\n\t"
  168930. #endif
  168931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168932. "lsrs r7, r6, #16\n\t"
  168933. #else
  168934. "lsr r7, r6, #16\n\t"
  168935. #endif
  168936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168937. "lsls r6, r6, #16\n\t"
  168938. #else
  168939. "lsl r6, r6, #16\n\t"
  168940. #endif
  168941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168942. "adds r3, r3, r6\n\t"
  168943. #else
  168944. "add r3, r3, r6\n\t"
  168945. #endif
  168946. #ifdef WOLFSSL_KEIL
  168947. "adcs r4, r4, r7\n\t"
  168948. #elif defined(__clang__)
  168949. "adcs r4, r7\n\t"
  168950. #else
  168951. "adc r4, r7\n\t"
  168952. #endif
  168953. #ifdef WOLFSSL_KEIL
  168954. "adcs r5, r5, %[r]\n\t"
  168955. #elif defined(__clang__)
  168956. "adcs r5, %[r]\n\t"
  168957. #else
  168958. "adc r5, %[r]\n\t"
  168959. #endif
  168960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168961. "lsrs r6, %[a], #16\n\t"
  168962. #else
  168963. "lsr r6, %[a], #16\n\t"
  168964. #endif
  168965. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168966. "lsrs r7, %[b], #16\n\t"
  168967. #else
  168968. "lsr r7, %[b], #16\n\t"
  168969. #endif
  168970. #ifdef WOLFSSL_KEIL
  168971. "muls r7, r6, r7\n\t"
  168972. #elif defined(__clang__)
  168973. "muls r7, r6\n\t"
  168974. #else
  168975. "mul r7, r6\n\t"
  168976. #endif
  168977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168978. "adds r4, r4, r7\n\t"
  168979. #else
  168980. "add r4, r4, r7\n\t"
  168981. #endif
  168982. #ifdef WOLFSSL_KEIL
  168983. "adcs r5, r5, %[r]\n\t"
  168984. #elif defined(__clang__)
  168985. "adcs r5, %[r]\n\t"
  168986. #else
  168987. "adc r5, %[r]\n\t"
  168988. #endif
  168989. "uxth r7, %[b]\n\t"
  168990. #ifdef WOLFSSL_KEIL
  168991. "muls r6, r7, r6\n\t"
  168992. #elif defined(__clang__)
  168993. "muls r6, r7\n\t"
  168994. #else
  168995. "mul r6, r7\n\t"
  168996. #endif
  168997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  168998. "lsrs r7, r6, #16\n\t"
  168999. #else
  169000. "lsr r7, r6, #16\n\t"
  169001. #endif
  169002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169003. "lsls r6, r6, #16\n\t"
  169004. #else
  169005. "lsl r6, r6, #16\n\t"
  169006. #endif
  169007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169008. "adds r3, r3, r6\n\t"
  169009. #else
  169010. "add r3, r3, r6\n\t"
  169011. #endif
  169012. #ifdef WOLFSSL_KEIL
  169013. "adcs r4, r4, r7\n\t"
  169014. #elif defined(__clang__)
  169015. "adcs r4, r7\n\t"
  169016. #else
  169017. "adc r4, r7\n\t"
  169018. #endif
  169019. #ifdef WOLFSSL_KEIL
  169020. "adcs r5, r5, %[r]\n\t"
  169021. #elif defined(__clang__)
  169022. "adcs r5, %[r]\n\t"
  169023. #else
  169024. "adc r5, %[r]\n\t"
  169025. #endif
  169026. "# A[15] * B[12]\n\t"
  169027. "mov %[a], r9\n\t"
  169028. "mov %[b], r10\n\t"
  169029. "ldr %[a], [%[a], #60]\n\t"
  169030. "ldr %[b], [%[b], #48]\n\t"
  169031. "uxth r6, %[a]\n\t"
  169032. "uxth r7, %[b]\n\t"
  169033. #ifdef WOLFSSL_KEIL
  169034. "muls r7, r6, r7\n\t"
  169035. #elif defined(__clang__)
  169036. "muls r7, r6\n\t"
  169037. #else
  169038. "mul r7, r6\n\t"
  169039. #endif
  169040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169041. "adds r3, r3, r7\n\t"
  169042. #else
  169043. "add r3, r3, r7\n\t"
  169044. #endif
  169045. #ifdef WOLFSSL_KEIL
  169046. "adcs r4, r4, %[r]\n\t"
  169047. #elif defined(__clang__)
  169048. "adcs r4, %[r]\n\t"
  169049. #else
  169050. "adc r4, %[r]\n\t"
  169051. #endif
  169052. #ifdef WOLFSSL_KEIL
  169053. "adcs r5, r5, %[r]\n\t"
  169054. #elif defined(__clang__)
  169055. "adcs r5, %[r]\n\t"
  169056. #else
  169057. "adc r5, %[r]\n\t"
  169058. #endif
  169059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169060. "lsrs r7, %[b], #16\n\t"
  169061. #else
  169062. "lsr r7, %[b], #16\n\t"
  169063. #endif
  169064. #ifdef WOLFSSL_KEIL
  169065. "muls r6, r7, r6\n\t"
  169066. #elif defined(__clang__)
  169067. "muls r6, r7\n\t"
  169068. #else
  169069. "mul r6, r7\n\t"
  169070. #endif
  169071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169072. "lsrs r7, r6, #16\n\t"
  169073. #else
  169074. "lsr r7, r6, #16\n\t"
  169075. #endif
  169076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169077. "lsls r6, r6, #16\n\t"
  169078. #else
  169079. "lsl r6, r6, #16\n\t"
  169080. #endif
  169081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169082. "adds r3, r3, r6\n\t"
  169083. #else
  169084. "add r3, r3, r6\n\t"
  169085. #endif
  169086. #ifdef WOLFSSL_KEIL
  169087. "adcs r4, r4, r7\n\t"
  169088. #elif defined(__clang__)
  169089. "adcs r4, r7\n\t"
  169090. #else
  169091. "adc r4, r7\n\t"
  169092. #endif
  169093. #ifdef WOLFSSL_KEIL
  169094. "adcs r5, r5, %[r]\n\t"
  169095. #elif defined(__clang__)
  169096. "adcs r5, %[r]\n\t"
  169097. #else
  169098. "adc r5, %[r]\n\t"
  169099. #endif
  169100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169101. "lsrs r6, %[a], #16\n\t"
  169102. #else
  169103. "lsr r6, %[a], #16\n\t"
  169104. #endif
  169105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169106. "lsrs r7, %[b], #16\n\t"
  169107. #else
  169108. "lsr r7, %[b], #16\n\t"
  169109. #endif
  169110. #ifdef WOLFSSL_KEIL
  169111. "muls r7, r6, r7\n\t"
  169112. #elif defined(__clang__)
  169113. "muls r7, r6\n\t"
  169114. #else
  169115. "mul r7, r6\n\t"
  169116. #endif
  169117. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169118. "adds r4, r4, r7\n\t"
  169119. #else
  169120. "add r4, r4, r7\n\t"
  169121. #endif
  169122. #ifdef WOLFSSL_KEIL
  169123. "adcs r5, r5, %[r]\n\t"
  169124. #elif defined(__clang__)
  169125. "adcs r5, %[r]\n\t"
  169126. #else
  169127. "adc r5, %[r]\n\t"
  169128. #endif
  169129. "uxth r7, %[b]\n\t"
  169130. #ifdef WOLFSSL_KEIL
  169131. "muls r6, r7, r6\n\t"
  169132. #elif defined(__clang__)
  169133. "muls r6, r7\n\t"
  169134. #else
  169135. "mul r6, r7\n\t"
  169136. #endif
  169137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169138. "lsrs r7, r6, #16\n\t"
  169139. #else
  169140. "lsr r7, r6, #16\n\t"
  169141. #endif
  169142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169143. "lsls r6, r6, #16\n\t"
  169144. #else
  169145. "lsl r6, r6, #16\n\t"
  169146. #endif
  169147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169148. "adds r3, r3, r6\n\t"
  169149. #else
  169150. "add r3, r3, r6\n\t"
  169151. #endif
  169152. #ifdef WOLFSSL_KEIL
  169153. "adcs r4, r4, r7\n\t"
  169154. #elif defined(__clang__)
  169155. "adcs r4, r7\n\t"
  169156. #else
  169157. "adc r4, r7\n\t"
  169158. #endif
  169159. #ifdef WOLFSSL_KEIL
  169160. "adcs r5, r5, %[r]\n\t"
  169161. #elif defined(__clang__)
  169162. "adcs r5, %[r]\n\t"
  169163. #else
  169164. "adc r5, %[r]\n\t"
  169165. #endif
  169166. "mov %[r], r8\n\t"
  169167. "str r3, [%[r], #108]\n\t"
  169168. "movs %[r], #0\n\t"
  169169. "# A[15] * B[13]\n\t"
  169170. "movs r3, #0\n\t"
  169171. "mov %[a], r9\n\t"
  169172. "mov %[b], r10\n\t"
  169173. "ldr %[a], [%[a], #60]\n\t"
  169174. "ldr %[b], [%[b], #52]\n\t"
  169175. "uxth r6, %[a]\n\t"
  169176. "uxth r7, %[b]\n\t"
  169177. #ifdef WOLFSSL_KEIL
  169178. "muls r7, r6, r7\n\t"
  169179. #elif defined(__clang__)
  169180. "muls r7, r6\n\t"
  169181. #else
  169182. "mul r7, r6\n\t"
  169183. #endif
  169184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169185. "adds r4, r4, r7\n\t"
  169186. #else
  169187. "add r4, r4, r7\n\t"
  169188. #endif
  169189. #ifdef WOLFSSL_KEIL
  169190. "adcs r5, r5, %[r]\n\t"
  169191. #elif defined(__clang__)
  169192. "adcs r5, %[r]\n\t"
  169193. #else
  169194. "adc r5, %[r]\n\t"
  169195. #endif
  169196. #ifdef WOLFSSL_KEIL
  169197. "adcs r3, r3, %[r]\n\t"
  169198. #elif defined(__clang__)
  169199. "adcs r3, %[r]\n\t"
  169200. #else
  169201. "adc r3, %[r]\n\t"
  169202. #endif
  169203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169204. "lsrs r7, %[b], #16\n\t"
  169205. #else
  169206. "lsr r7, %[b], #16\n\t"
  169207. #endif
  169208. #ifdef WOLFSSL_KEIL
  169209. "muls r6, r7, r6\n\t"
  169210. #elif defined(__clang__)
  169211. "muls r6, r7\n\t"
  169212. #else
  169213. "mul r6, r7\n\t"
  169214. #endif
  169215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169216. "lsrs r7, r6, #16\n\t"
  169217. #else
  169218. "lsr r7, r6, #16\n\t"
  169219. #endif
  169220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169221. "lsls r6, r6, #16\n\t"
  169222. #else
  169223. "lsl r6, r6, #16\n\t"
  169224. #endif
  169225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169226. "adds r4, r4, r6\n\t"
  169227. #else
  169228. "add r4, r4, r6\n\t"
  169229. #endif
  169230. #ifdef WOLFSSL_KEIL
  169231. "adcs r5, r5, r7\n\t"
  169232. #elif defined(__clang__)
  169233. "adcs r5, r7\n\t"
  169234. #else
  169235. "adc r5, r7\n\t"
  169236. #endif
  169237. #ifdef WOLFSSL_KEIL
  169238. "adcs r3, r3, %[r]\n\t"
  169239. #elif defined(__clang__)
  169240. "adcs r3, %[r]\n\t"
  169241. #else
  169242. "adc r3, %[r]\n\t"
  169243. #endif
  169244. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169245. "lsrs r6, %[a], #16\n\t"
  169246. #else
  169247. "lsr r6, %[a], #16\n\t"
  169248. #endif
  169249. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169250. "lsrs r7, %[b], #16\n\t"
  169251. #else
  169252. "lsr r7, %[b], #16\n\t"
  169253. #endif
  169254. #ifdef WOLFSSL_KEIL
  169255. "muls r7, r6, r7\n\t"
  169256. #elif defined(__clang__)
  169257. "muls r7, r6\n\t"
  169258. #else
  169259. "mul r7, r6\n\t"
  169260. #endif
  169261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169262. "adds r5, r5, r7\n\t"
  169263. #else
  169264. "add r5, r5, r7\n\t"
  169265. #endif
  169266. #ifdef WOLFSSL_KEIL
  169267. "adcs r3, r3, %[r]\n\t"
  169268. #elif defined(__clang__)
  169269. "adcs r3, %[r]\n\t"
  169270. #else
  169271. "adc r3, %[r]\n\t"
  169272. #endif
  169273. "uxth r7, %[b]\n\t"
  169274. #ifdef WOLFSSL_KEIL
  169275. "muls r6, r7, r6\n\t"
  169276. #elif defined(__clang__)
  169277. "muls r6, r7\n\t"
  169278. #else
  169279. "mul r6, r7\n\t"
  169280. #endif
  169281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169282. "lsrs r7, r6, #16\n\t"
  169283. #else
  169284. "lsr r7, r6, #16\n\t"
  169285. #endif
  169286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169287. "lsls r6, r6, #16\n\t"
  169288. #else
  169289. "lsl r6, r6, #16\n\t"
  169290. #endif
  169291. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169292. "adds r4, r4, r6\n\t"
  169293. #else
  169294. "add r4, r4, r6\n\t"
  169295. #endif
  169296. #ifdef WOLFSSL_KEIL
  169297. "adcs r5, r5, r7\n\t"
  169298. #elif defined(__clang__)
  169299. "adcs r5, r7\n\t"
  169300. #else
  169301. "adc r5, r7\n\t"
  169302. #endif
  169303. #ifdef WOLFSSL_KEIL
  169304. "adcs r3, r3, %[r]\n\t"
  169305. #elif defined(__clang__)
  169306. "adcs r3, %[r]\n\t"
  169307. #else
  169308. "adc r3, %[r]\n\t"
  169309. #endif
  169310. "# A[14] * B[14]\n\t"
  169311. "mov %[a], r9\n\t"
  169312. "mov %[b], r10\n\t"
  169313. "ldr %[a], [%[a], #56]\n\t"
  169314. "ldr %[b], [%[b], #56]\n\t"
  169315. "uxth r6, %[a]\n\t"
  169316. "uxth r7, %[b]\n\t"
  169317. #ifdef WOLFSSL_KEIL
  169318. "muls r7, r6, r7\n\t"
  169319. #elif defined(__clang__)
  169320. "muls r7, r6\n\t"
  169321. #else
  169322. "mul r7, r6\n\t"
  169323. #endif
  169324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169325. "adds r4, r4, r7\n\t"
  169326. #else
  169327. "add r4, r4, r7\n\t"
  169328. #endif
  169329. #ifdef WOLFSSL_KEIL
  169330. "adcs r5, r5, %[r]\n\t"
  169331. #elif defined(__clang__)
  169332. "adcs r5, %[r]\n\t"
  169333. #else
  169334. "adc r5, %[r]\n\t"
  169335. #endif
  169336. #ifdef WOLFSSL_KEIL
  169337. "adcs r3, r3, %[r]\n\t"
  169338. #elif defined(__clang__)
  169339. "adcs r3, %[r]\n\t"
  169340. #else
  169341. "adc r3, %[r]\n\t"
  169342. #endif
  169343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169344. "lsrs r7, %[b], #16\n\t"
  169345. #else
  169346. "lsr r7, %[b], #16\n\t"
  169347. #endif
  169348. #ifdef WOLFSSL_KEIL
  169349. "muls r6, r7, r6\n\t"
  169350. #elif defined(__clang__)
  169351. "muls r6, r7\n\t"
  169352. #else
  169353. "mul r6, r7\n\t"
  169354. #endif
  169355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169356. "lsrs r7, r6, #16\n\t"
  169357. #else
  169358. "lsr r7, r6, #16\n\t"
  169359. #endif
  169360. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169361. "lsls r6, r6, #16\n\t"
  169362. #else
  169363. "lsl r6, r6, #16\n\t"
  169364. #endif
  169365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169366. "adds r4, r4, r6\n\t"
  169367. #else
  169368. "add r4, r4, r6\n\t"
  169369. #endif
  169370. #ifdef WOLFSSL_KEIL
  169371. "adcs r5, r5, r7\n\t"
  169372. #elif defined(__clang__)
  169373. "adcs r5, r7\n\t"
  169374. #else
  169375. "adc r5, r7\n\t"
  169376. #endif
  169377. #ifdef WOLFSSL_KEIL
  169378. "adcs r3, r3, %[r]\n\t"
  169379. #elif defined(__clang__)
  169380. "adcs r3, %[r]\n\t"
  169381. #else
  169382. "adc r3, %[r]\n\t"
  169383. #endif
  169384. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169385. "lsrs r6, %[a], #16\n\t"
  169386. #else
  169387. "lsr r6, %[a], #16\n\t"
  169388. #endif
  169389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169390. "lsrs r7, %[b], #16\n\t"
  169391. #else
  169392. "lsr r7, %[b], #16\n\t"
  169393. #endif
  169394. #ifdef WOLFSSL_KEIL
  169395. "muls r7, r6, r7\n\t"
  169396. #elif defined(__clang__)
  169397. "muls r7, r6\n\t"
  169398. #else
  169399. "mul r7, r6\n\t"
  169400. #endif
  169401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169402. "adds r5, r5, r7\n\t"
  169403. #else
  169404. "add r5, r5, r7\n\t"
  169405. #endif
  169406. #ifdef WOLFSSL_KEIL
  169407. "adcs r3, r3, %[r]\n\t"
  169408. #elif defined(__clang__)
  169409. "adcs r3, %[r]\n\t"
  169410. #else
  169411. "adc r3, %[r]\n\t"
  169412. #endif
  169413. "uxth r7, %[b]\n\t"
  169414. #ifdef WOLFSSL_KEIL
  169415. "muls r6, r7, r6\n\t"
  169416. #elif defined(__clang__)
  169417. "muls r6, r7\n\t"
  169418. #else
  169419. "mul r6, r7\n\t"
  169420. #endif
  169421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169422. "lsrs r7, r6, #16\n\t"
  169423. #else
  169424. "lsr r7, r6, #16\n\t"
  169425. #endif
  169426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169427. "lsls r6, r6, #16\n\t"
  169428. #else
  169429. "lsl r6, r6, #16\n\t"
  169430. #endif
  169431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169432. "adds r4, r4, r6\n\t"
  169433. #else
  169434. "add r4, r4, r6\n\t"
  169435. #endif
  169436. #ifdef WOLFSSL_KEIL
  169437. "adcs r5, r5, r7\n\t"
  169438. #elif defined(__clang__)
  169439. "adcs r5, r7\n\t"
  169440. #else
  169441. "adc r5, r7\n\t"
  169442. #endif
  169443. #ifdef WOLFSSL_KEIL
  169444. "adcs r3, r3, %[r]\n\t"
  169445. #elif defined(__clang__)
  169446. "adcs r3, %[r]\n\t"
  169447. #else
  169448. "adc r3, %[r]\n\t"
  169449. #endif
  169450. "# A[13] * B[15]\n\t"
  169451. "mov %[a], r9\n\t"
  169452. "mov %[b], r10\n\t"
  169453. "ldr %[a], [%[a], #52]\n\t"
  169454. "ldr %[b], [%[b], #60]\n\t"
  169455. "uxth r6, %[a]\n\t"
  169456. "uxth r7, %[b]\n\t"
  169457. #ifdef WOLFSSL_KEIL
  169458. "muls r7, r6, r7\n\t"
  169459. #elif defined(__clang__)
  169460. "muls r7, r6\n\t"
  169461. #else
  169462. "mul r7, r6\n\t"
  169463. #endif
  169464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169465. "adds r4, r4, r7\n\t"
  169466. #else
  169467. "add r4, r4, r7\n\t"
  169468. #endif
  169469. #ifdef WOLFSSL_KEIL
  169470. "adcs r5, r5, %[r]\n\t"
  169471. #elif defined(__clang__)
  169472. "adcs r5, %[r]\n\t"
  169473. #else
  169474. "adc r5, %[r]\n\t"
  169475. #endif
  169476. #ifdef WOLFSSL_KEIL
  169477. "adcs r3, r3, %[r]\n\t"
  169478. #elif defined(__clang__)
  169479. "adcs r3, %[r]\n\t"
  169480. #else
  169481. "adc r3, %[r]\n\t"
  169482. #endif
  169483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169484. "lsrs r7, %[b], #16\n\t"
  169485. #else
  169486. "lsr r7, %[b], #16\n\t"
  169487. #endif
  169488. #ifdef WOLFSSL_KEIL
  169489. "muls r6, r7, r6\n\t"
  169490. #elif defined(__clang__)
  169491. "muls r6, r7\n\t"
  169492. #else
  169493. "mul r6, r7\n\t"
  169494. #endif
  169495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169496. "lsrs r7, r6, #16\n\t"
  169497. #else
  169498. "lsr r7, r6, #16\n\t"
  169499. #endif
  169500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169501. "lsls r6, r6, #16\n\t"
  169502. #else
  169503. "lsl r6, r6, #16\n\t"
  169504. #endif
  169505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169506. "adds r4, r4, r6\n\t"
  169507. #else
  169508. "add r4, r4, r6\n\t"
  169509. #endif
  169510. #ifdef WOLFSSL_KEIL
  169511. "adcs r5, r5, r7\n\t"
  169512. #elif defined(__clang__)
  169513. "adcs r5, r7\n\t"
  169514. #else
  169515. "adc r5, r7\n\t"
  169516. #endif
  169517. #ifdef WOLFSSL_KEIL
  169518. "adcs r3, r3, %[r]\n\t"
  169519. #elif defined(__clang__)
  169520. "adcs r3, %[r]\n\t"
  169521. #else
  169522. "adc r3, %[r]\n\t"
  169523. #endif
  169524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169525. "lsrs r6, %[a], #16\n\t"
  169526. #else
  169527. "lsr r6, %[a], #16\n\t"
  169528. #endif
  169529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169530. "lsrs r7, %[b], #16\n\t"
  169531. #else
  169532. "lsr r7, %[b], #16\n\t"
  169533. #endif
  169534. #ifdef WOLFSSL_KEIL
  169535. "muls r7, r6, r7\n\t"
  169536. #elif defined(__clang__)
  169537. "muls r7, r6\n\t"
  169538. #else
  169539. "mul r7, r6\n\t"
  169540. #endif
  169541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169542. "adds r5, r5, r7\n\t"
  169543. #else
  169544. "add r5, r5, r7\n\t"
  169545. #endif
  169546. #ifdef WOLFSSL_KEIL
  169547. "adcs r3, r3, %[r]\n\t"
  169548. #elif defined(__clang__)
  169549. "adcs r3, %[r]\n\t"
  169550. #else
  169551. "adc r3, %[r]\n\t"
  169552. #endif
  169553. "uxth r7, %[b]\n\t"
  169554. #ifdef WOLFSSL_KEIL
  169555. "muls r6, r7, r6\n\t"
  169556. #elif defined(__clang__)
  169557. "muls r6, r7\n\t"
  169558. #else
  169559. "mul r6, r7\n\t"
  169560. #endif
  169561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169562. "lsrs r7, r6, #16\n\t"
  169563. #else
  169564. "lsr r7, r6, #16\n\t"
  169565. #endif
  169566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169567. "lsls r6, r6, #16\n\t"
  169568. #else
  169569. "lsl r6, r6, #16\n\t"
  169570. #endif
  169571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169572. "adds r4, r4, r6\n\t"
  169573. #else
  169574. "add r4, r4, r6\n\t"
  169575. #endif
  169576. #ifdef WOLFSSL_KEIL
  169577. "adcs r5, r5, r7\n\t"
  169578. #elif defined(__clang__)
  169579. "adcs r5, r7\n\t"
  169580. #else
  169581. "adc r5, r7\n\t"
  169582. #endif
  169583. #ifdef WOLFSSL_KEIL
  169584. "adcs r3, r3, %[r]\n\t"
  169585. #elif defined(__clang__)
  169586. "adcs r3, %[r]\n\t"
  169587. #else
  169588. "adc r3, %[r]\n\t"
  169589. #endif
  169590. "mov %[r], r8\n\t"
  169591. "str r4, [%[r], #112]\n\t"
  169592. "movs %[r], #0\n\t"
  169593. "# A[14] * B[15]\n\t"
  169594. "movs r4, #0\n\t"
  169595. "mov %[a], r9\n\t"
  169596. "mov %[b], r10\n\t"
  169597. "ldr %[a], [%[a], #56]\n\t"
  169598. "ldr %[b], [%[b], #60]\n\t"
  169599. "uxth r6, %[a]\n\t"
  169600. "uxth r7, %[b]\n\t"
  169601. #ifdef WOLFSSL_KEIL
  169602. "muls r7, r6, r7\n\t"
  169603. #elif defined(__clang__)
  169604. "muls r7, r6\n\t"
  169605. #else
  169606. "mul r7, r6\n\t"
  169607. #endif
  169608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169609. "adds r5, r5, r7\n\t"
  169610. #else
  169611. "add r5, r5, r7\n\t"
  169612. #endif
  169613. #ifdef WOLFSSL_KEIL
  169614. "adcs r3, r3, %[r]\n\t"
  169615. #elif defined(__clang__)
  169616. "adcs r3, %[r]\n\t"
  169617. #else
  169618. "adc r3, %[r]\n\t"
  169619. #endif
  169620. #ifdef WOLFSSL_KEIL
  169621. "adcs r4, r4, %[r]\n\t"
  169622. #elif defined(__clang__)
  169623. "adcs r4, %[r]\n\t"
  169624. #else
  169625. "adc r4, %[r]\n\t"
  169626. #endif
  169627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169628. "lsrs r7, %[b], #16\n\t"
  169629. #else
  169630. "lsr r7, %[b], #16\n\t"
  169631. #endif
  169632. #ifdef WOLFSSL_KEIL
  169633. "muls r6, r7, r6\n\t"
  169634. #elif defined(__clang__)
  169635. "muls r6, r7\n\t"
  169636. #else
  169637. "mul r6, r7\n\t"
  169638. #endif
  169639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169640. "lsrs r7, r6, #16\n\t"
  169641. #else
  169642. "lsr r7, r6, #16\n\t"
  169643. #endif
  169644. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169645. "lsls r6, r6, #16\n\t"
  169646. #else
  169647. "lsl r6, r6, #16\n\t"
  169648. #endif
  169649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169650. "adds r5, r5, r6\n\t"
  169651. #else
  169652. "add r5, r5, r6\n\t"
  169653. #endif
  169654. #ifdef WOLFSSL_KEIL
  169655. "adcs r3, r3, r7\n\t"
  169656. #elif defined(__clang__)
  169657. "adcs r3, r7\n\t"
  169658. #else
  169659. "adc r3, r7\n\t"
  169660. #endif
  169661. #ifdef WOLFSSL_KEIL
  169662. "adcs r4, r4, %[r]\n\t"
  169663. #elif defined(__clang__)
  169664. "adcs r4, %[r]\n\t"
  169665. #else
  169666. "adc r4, %[r]\n\t"
  169667. #endif
  169668. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169669. "lsrs r6, %[a], #16\n\t"
  169670. #else
  169671. "lsr r6, %[a], #16\n\t"
  169672. #endif
  169673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169674. "lsrs r7, %[b], #16\n\t"
  169675. #else
  169676. "lsr r7, %[b], #16\n\t"
  169677. #endif
  169678. #ifdef WOLFSSL_KEIL
  169679. "muls r7, r6, r7\n\t"
  169680. #elif defined(__clang__)
  169681. "muls r7, r6\n\t"
  169682. #else
  169683. "mul r7, r6\n\t"
  169684. #endif
  169685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169686. "adds r3, r3, r7\n\t"
  169687. #else
  169688. "add r3, r3, r7\n\t"
  169689. #endif
  169690. #ifdef WOLFSSL_KEIL
  169691. "adcs r4, r4, %[r]\n\t"
  169692. #elif defined(__clang__)
  169693. "adcs r4, %[r]\n\t"
  169694. #else
  169695. "adc r4, %[r]\n\t"
  169696. #endif
  169697. "uxth r7, %[b]\n\t"
  169698. #ifdef WOLFSSL_KEIL
  169699. "muls r6, r7, r6\n\t"
  169700. #elif defined(__clang__)
  169701. "muls r6, r7\n\t"
  169702. #else
  169703. "mul r6, r7\n\t"
  169704. #endif
  169705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169706. "lsrs r7, r6, #16\n\t"
  169707. #else
  169708. "lsr r7, r6, #16\n\t"
  169709. #endif
  169710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169711. "lsls r6, r6, #16\n\t"
  169712. #else
  169713. "lsl r6, r6, #16\n\t"
  169714. #endif
  169715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169716. "adds r5, r5, r6\n\t"
  169717. #else
  169718. "add r5, r5, r6\n\t"
  169719. #endif
  169720. #ifdef WOLFSSL_KEIL
  169721. "adcs r3, r3, r7\n\t"
  169722. #elif defined(__clang__)
  169723. "adcs r3, r7\n\t"
  169724. #else
  169725. "adc r3, r7\n\t"
  169726. #endif
  169727. #ifdef WOLFSSL_KEIL
  169728. "adcs r4, r4, %[r]\n\t"
  169729. #elif defined(__clang__)
  169730. "adcs r4, %[r]\n\t"
  169731. #else
  169732. "adc r4, %[r]\n\t"
  169733. #endif
  169734. "# A[15] * B[14]\n\t"
  169735. "mov %[a], r9\n\t"
  169736. "mov %[b], r10\n\t"
  169737. "ldr %[a], [%[a], #60]\n\t"
  169738. "ldr %[b], [%[b], #56]\n\t"
  169739. "uxth r6, %[a]\n\t"
  169740. "uxth r7, %[b]\n\t"
  169741. #ifdef WOLFSSL_KEIL
  169742. "muls r7, r6, r7\n\t"
  169743. #elif defined(__clang__)
  169744. "muls r7, r6\n\t"
  169745. #else
  169746. "mul r7, r6\n\t"
  169747. #endif
  169748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169749. "adds r5, r5, r7\n\t"
  169750. #else
  169751. "add r5, r5, r7\n\t"
  169752. #endif
  169753. #ifdef WOLFSSL_KEIL
  169754. "adcs r3, r3, %[r]\n\t"
  169755. #elif defined(__clang__)
  169756. "adcs r3, %[r]\n\t"
  169757. #else
  169758. "adc r3, %[r]\n\t"
  169759. #endif
  169760. #ifdef WOLFSSL_KEIL
  169761. "adcs r4, r4, %[r]\n\t"
  169762. #elif defined(__clang__)
  169763. "adcs r4, %[r]\n\t"
  169764. #else
  169765. "adc r4, %[r]\n\t"
  169766. #endif
  169767. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169768. "lsrs r7, %[b], #16\n\t"
  169769. #else
  169770. "lsr r7, %[b], #16\n\t"
  169771. #endif
  169772. #ifdef WOLFSSL_KEIL
  169773. "muls r6, r7, r6\n\t"
  169774. #elif defined(__clang__)
  169775. "muls r6, r7\n\t"
  169776. #else
  169777. "mul r6, r7\n\t"
  169778. #endif
  169779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169780. "lsrs r7, r6, #16\n\t"
  169781. #else
  169782. "lsr r7, r6, #16\n\t"
  169783. #endif
  169784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169785. "lsls r6, r6, #16\n\t"
  169786. #else
  169787. "lsl r6, r6, #16\n\t"
  169788. #endif
  169789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169790. "adds r5, r5, r6\n\t"
  169791. #else
  169792. "add r5, r5, r6\n\t"
  169793. #endif
  169794. #ifdef WOLFSSL_KEIL
  169795. "adcs r3, r3, r7\n\t"
  169796. #elif defined(__clang__)
  169797. "adcs r3, r7\n\t"
  169798. #else
  169799. "adc r3, r7\n\t"
  169800. #endif
  169801. #ifdef WOLFSSL_KEIL
  169802. "adcs r4, r4, %[r]\n\t"
  169803. #elif defined(__clang__)
  169804. "adcs r4, %[r]\n\t"
  169805. #else
  169806. "adc r4, %[r]\n\t"
  169807. #endif
  169808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169809. "lsrs r6, %[a], #16\n\t"
  169810. #else
  169811. "lsr r6, %[a], #16\n\t"
  169812. #endif
  169813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169814. "lsrs r7, %[b], #16\n\t"
  169815. #else
  169816. "lsr r7, %[b], #16\n\t"
  169817. #endif
  169818. #ifdef WOLFSSL_KEIL
  169819. "muls r7, r6, r7\n\t"
  169820. #elif defined(__clang__)
  169821. "muls r7, r6\n\t"
  169822. #else
  169823. "mul r7, r6\n\t"
  169824. #endif
  169825. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169826. "adds r3, r3, r7\n\t"
  169827. #else
  169828. "add r3, r3, r7\n\t"
  169829. #endif
  169830. #ifdef WOLFSSL_KEIL
  169831. "adcs r4, r4, %[r]\n\t"
  169832. #elif defined(__clang__)
  169833. "adcs r4, %[r]\n\t"
  169834. #else
  169835. "adc r4, %[r]\n\t"
  169836. #endif
  169837. "uxth r7, %[b]\n\t"
  169838. #ifdef WOLFSSL_KEIL
  169839. "muls r6, r7, r6\n\t"
  169840. #elif defined(__clang__)
  169841. "muls r6, r7\n\t"
  169842. #else
  169843. "mul r6, r7\n\t"
  169844. #endif
  169845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169846. "lsrs r7, r6, #16\n\t"
  169847. #else
  169848. "lsr r7, r6, #16\n\t"
  169849. #endif
  169850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169851. "lsls r6, r6, #16\n\t"
  169852. #else
  169853. "lsl r6, r6, #16\n\t"
  169854. #endif
  169855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169856. "adds r5, r5, r6\n\t"
  169857. #else
  169858. "add r5, r5, r6\n\t"
  169859. #endif
  169860. #ifdef WOLFSSL_KEIL
  169861. "adcs r3, r3, r7\n\t"
  169862. #elif defined(__clang__)
  169863. "adcs r3, r7\n\t"
  169864. #else
  169865. "adc r3, r7\n\t"
  169866. #endif
  169867. #ifdef WOLFSSL_KEIL
  169868. "adcs r4, r4, %[r]\n\t"
  169869. #elif defined(__clang__)
  169870. "adcs r4, %[r]\n\t"
  169871. #else
  169872. "adc r4, %[r]\n\t"
  169873. #endif
  169874. "mov %[r], r8\n\t"
  169875. "str r5, [%[r], #116]\n\t"
  169876. "movs %[r], #0\n\t"
  169877. "# A[15] * B[15]\n\t"
  169878. "mov %[a], r9\n\t"
  169879. "mov %[b], r10\n\t"
  169880. "ldr %[a], [%[a], #60]\n\t"
  169881. "ldr %[b], [%[b], #60]\n\t"
  169882. "uxth r6, %[a]\n\t"
  169883. "uxth r7, %[b]\n\t"
  169884. #ifdef WOLFSSL_KEIL
  169885. "muls r7, r6, r7\n\t"
  169886. #elif defined(__clang__)
  169887. "muls r7, r6\n\t"
  169888. #else
  169889. "mul r7, r6\n\t"
  169890. #endif
  169891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169892. "adds r3, r3, r7\n\t"
  169893. #else
  169894. "add r3, r3, r7\n\t"
  169895. #endif
  169896. #ifdef WOLFSSL_KEIL
  169897. "adcs r4, r4, %[r]\n\t"
  169898. #elif defined(__clang__)
  169899. "adcs r4, %[r]\n\t"
  169900. #else
  169901. "adc r4, %[r]\n\t"
  169902. #endif
  169903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169904. "lsrs r7, %[b], #16\n\t"
  169905. #else
  169906. "lsr r7, %[b], #16\n\t"
  169907. #endif
  169908. #ifdef WOLFSSL_KEIL
  169909. "muls r6, r7, r6\n\t"
  169910. #elif defined(__clang__)
  169911. "muls r6, r7\n\t"
  169912. #else
  169913. "mul r6, r7\n\t"
  169914. #endif
  169915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169916. "lsrs r7, r6, #16\n\t"
  169917. #else
  169918. "lsr r7, r6, #16\n\t"
  169919. #endif
  169920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169921. "lsls r6, r6, #16\n\t"
  169922. #else
  169923. "lsl r6, r6, #16\n\t"
  169924. #endif
  169925. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169926. "adds r3, r3, r6\n\t"
  169927. #else
  169928. "add r3, r3, r6\n\t"
  169929. #endif
  169930. #ifdef WOLFSSL_KEIL
  169931. "adcs r4, r4, r7\n\t"
  169932. #elif defined(__clang__)
  169933. "adcs r4, r7\n\t"
  169934. #else
  169935. "adc r4, r7\n\t"
  169936. #endif
  169937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169938. "lsrs r6, %[a], #16\n\t"
  169939. #else
  169940. "lsr r6, %[a], #16\n\t"
  169941. #endif
  169942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169943. "lsrs r7, %[b], #16\n\t"
  169944. #else
  169945. "lsr r7, %[b], #16\n\t"
  169946. #endif
  169947. #ifdef WOLFSSL_KEIL
  169948. "muls r7, r6, r7\n\t"
  169949. #elif defined(__clang__)
  169950. "muls r7, r6\n\t"
  169951. #else
  169952. "mul r7, r6\n\t"
  169953. #endif
  169954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169955. "adds r4, r4, r7\n\t"
  169956. #else
  169957. "add r4, r4, r7\n\t"
  169958. #endif
  169959. "uxth r7, %[b]\n\t"
  169960. #ifdef WOLFSSL_KEIL
  169961. "muls r6, r7, r6\n\t"
  169962. #elif defined(__clang__)
  169963. "muls r6, r7\n\t"
  169964. #else
  169965. "mul r6, r7\n\t"
  169966. #endif
  169967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169968. "lsrs r7, r6, #16\n\t"
  169969. #else
  169970. "lsr r7, r6, #16\n\t"
  169971. #endif
  169972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169973. "lsls r6, r6, #16\n\t"
  169974. #else
  169975. "lsl r6, r6, #16\n\t"
  169976. #endif
  169977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  169978. "adds r3, r3, r6\n\t"
  169979. #else
  169980. "add r3, r3, r6\n\t"
  169981. #endif
  169982. #ifdef WOLFSSL_KEIL
  169983. "adcs r4, r4, r7\n\t"
  169984. #elif defined(__clang__)
  169985. "adcs r4, r7\n\t"
  169986. #else
  169987. "adc r4, r7\n\t"
  169988. #endif
  169989. "mov %[r], r8\n\t"
  169990. "str r3, [%[r], #120]\n\t"
  169991. "str r4, [%[r], #124]\n\t"
  169992. "pop {r3, r4, r5, r6}\n\t"
  169993. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  169994. "pop {r3, r4, r5, r6}\n\t"
  169995. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  169996. "pop {r3, r4, r5, r6}\n\t"
  169997. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  169998. "pop {r3, r4, r5, r6}\n\t"
  169999. "stm %[r]!, {r3, r4, r5, r6}\n\t"
  170000. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  170001. :
  170002. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"
  170003. );
  170004. }
  170005. #endif /* !WOLFSSL_SP_LARGE_CODE */
  170006. #ifndef WOLFSSL_SP_LARGE_CODE
  170007. /* Square a and put result in r. (r = a * a)
  170008. *
  170009. * r A single precision integer.
  170010. * a A single precision integer.
  170011. */
  170012. SP_NOINLINE static void sp_1024_sqr_16(sp_digit* r, const sp_digit* a)
  170013. {
  170014. __asm__ __volatile__ (
  170015. "movs r3, #0\n\t"
  170016. "movs r4, #0\n\t"
  170017. "movs r5, #0\n\t"
  170018. "mov r8, r3\n\t"
  170019. "mov r11, %[r]\n\t"
  170020. "movs r6, #0x80\n\t"
  170021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170022. "negs r6, r6\n\t"
  170023. #else
  170024. "neg r6, r6\n\t"
  170025. #endif
  170026. "add sp, sp, r6\n\t"
  170027. "mov r10, sp\n\t"
  170028. "mov r9, %[a]\n\t"
  170029. "\n"
  170030. "L_sp_1024_sqr_16_words_%=:\n\t"
  170031. "movs %[r], #0\n\t"
  170032. "movs r6, #60\n\t"
  170033. "mov %[a], r8\n\t"
  170034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170035. "subs %[a], %[a], r6\n\t"
  170036. #else
  170037. "sub %[a], %[a], r6\n\t"
  170038. #endif
  170039. #ifdef WOLFSSL_KEIL
  170040. "sbcs r6, r6, r6\n\t"
  170041. #elif defined(__clang__)
  170042. "sbcs r6, r6\n\t"
  170043. #else
  170044. "sbc r6, r6\n\t"
  170045. #endif
  170046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170047. "mvns r6, r6\n\t"
  170048. #else
  170049. "mvn r6, r6\n\t"
  170050. #endif
  170051. #ifdef WOLFSSL_KEIL
  170052. "ands %[a], %[a], r6\n\t"
  170053. #elif defined(__clang__)
  170054. "ands %[a], r6\n\t"
  170055. #else
  170056. "and %[a], r6\n\t"
  170057. #endif
  170058. "mov r2, r8\n\t"
  170059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170060. "subs r2, r2, %[a]\n\t"
  170061. #else
  170062. "sub r2, r2, %[a]\n\t"
  170063. #endif
  170064. "add %[a], %[a], r9\n\t"
  170065. "add r2, r2, r9\n\t"
  170066. "\n"
  170067. "L_sp_1024_sqr_16_mul_%=:\n\t"
  170068. "cmp r2, %[a]\n\t"
  170069. "beq L_sp_1024_sqr_16_sqr_%=\n\t"
  170070. "# Multiply * 2: Start\n\t"
  170071. "ldrh r6, [%[a]]\n\t"
  170072. "ldrh r7, [r2]\n\t"
  170073. #ifdef WOLFSSL_KEIL
  170074. "muls r7, r6, r7\n\t"
  170075. #elif defined(__clang__)
  170076. "muls r7, r6\n\t"
  170077. #else
  170078. "mul r7, r6\n\t"
  170079. #endif
  170080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170081. "adds r3, r3, r7\n\t"
  170082. #else
  170083. "add r3, r3, r7\n\t"
  170084. #endif
  170085. #ifdef WOLFSSL_KEIL
  170086. "adcs r4, r4, %[r]\n\t"
  170087. #elif defined(__clang__)
  170088. "adcs r4, %[r]\n\t"
  170089. #else
  170090. "adc r4, %[r]\n\t"
  170091. #endif
  170092. #ifdef WOLFSSL_KEIL
  170093. "adcs r5, r5, %[r]\n\t"
  170094. #elif defined(__clang__)
  170095. "adcs r5, %[r]\n\t"
  170096. #else
  170097. "adc r5, %[r]\n\t"
  170098. #endif
  170099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170100. "adds r3, r3, r7\n\t"
  170101. #else
  170102. "add r3, r3, r7\n\t"
  170103. #endif
  170104. #ifdef WOLFSSL_KEIL
  170105. "adcs r4, r4, %[r]\n\t"
  170106. #elif defined(__clang__)
  170107. "adcs r4, %[r]\n\t"
  170108. #else
  170109. "adc r4, %[r]\n\t"
  170110. #endif
  170111. #ifdef WOLFSSL_KEIL
  170112. "adcs r5, r5, %[r]\n\t"
  170113. #elif defined(__clang__)
  170114. "adcs r5, %[r]\n\t"
  170115. #else
  170116. "adc r5, %[r]\n\t"
  170117. #endif
  170118. "ldr r7, [r2]\n\t"
  170119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170120. "lsrs r7, r7, #16\n\t"
  170121. #else
  170122. "lsr r7, r7, #16\n\t"
  170123. #endif
  170124. #ifdef WOLFSSL_KEIL
  170125. "muls r6, r7, r6\n\t"
  170126. #elif defined(__clang__)
  170127. "muls r6, r7\n\t"
  170128. #else
  170129. "mul r6, r7\n\t"
  170130. #endif
  170131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170132. "lsrs r7, r6, #16\n\t"
  170133. #else
  170134. "lsr r7, r6, #16\n\t"
  170135. #endif
  170136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170137. "lsls r6, r6, #16\n\t"
  170138. #else
  170139. "lsl r6, r6, #16\n\t"
  170140. #endif
  170141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170142. "adds r3, r3, r6\n\t"
  170143. #else
  170144. "add r3, r3, r6\n\t"
  170145. #endif
  170146. #ifdef WOLFSSL_KEIL
  170147. "adcs r4, r4, r7\n\t"
  170148. #elif defined(__clang__)
  170149. "adcs r4, r7\n\t"
  170150. #else
  170151. "adc r4, r7\n\t"
  170152. #endif
  170153. #ifdef WOLFSSL_KEIL
  170154. "adcs r5, r5, %[r]\n\t"
  170155. #elif defined(__clang__)
  170156. "adcs r5, %[r]\n\t"
  170157. #else
  170158. "adc r5, %[r]\n\t"
  170159. #endif
  170160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170161. "adds r3, r3, r6\n\t"
  170162. #else
  170163. "add r3, r3, r6\n\t"
  170164. #endif
  170165. #ifdef WOLFSSL_KEIL
  170166. "adcs r4, r4, r7\n\t"
  170167. #elif defined(__clang__)
  170168. "adcs r4, r7\n\t"
  170169. #else
  170170. "adc r4, r7\n\t"
  170171. #endif
  170172. #ifdef WOLFSSL_KEIL
  170173. "adcs r5, r5, %[r]\n\t"
  170174. #elif defined(__clang__)
  170175. "adcs r5, %[r]\n\t"
  170176. #else
  170177. "adc r5, %[r]\n\t"
  170178. #endif
  170179. "ldr r6, [%[a]]\n\t"
  170180. "ldr r7, [r2]\n\t"
  170181. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170182. "lsrs r6, r6, #16\n\t"
  170183. #else
  170184. "lsr r6, r6, #16\n\t"
  170185. #endif
  170186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170187. "lsrs r7, r7, #16\n\t"
  170188. #else
  170189. "lsr r7, r7, #16\n\t"
  170190. #endif
  170191. #ifdef WOLFSSL_KEIL
  170192. "muls r7, r6, r7\n\t"
  170193. #elif defined(__clang__)
  170194. "muls r7, r6\n\t"
  170195. #else
  170196. "mul r7, r6\n\t"
  170197. #endif
  170198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170199. "adds r4, r4, r7\n\t"
  170200. #else
  170201. "add r4, r4, r7\n\t"
  170202. #endif
  170203. #ifdef WOLFSSL_KEIL
  170204. "adcs r5, r5, %[r]\n\t"
  170205. #elif defined(__clang__)
  170206. "adcs r5, %[r]\n\t"
  170207. #else
  170208. "adc r5, %[r]\n\t"
  170209. #endif
  170210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170211. "adds r4, r4, r7\n\t"
  170212. #else
  170213. "add r4, r4, r7\n\t"
  170214. #endif
  170215. #ifdef WOLFSSL_KEIL
  170216. "adcs r5, r5, %[r]\n\t"
  170217. #elif defined(__clang__)
  170218. "adcs r5, %[r]\n\t"
  170219. #else
  170220. "adc r5, %[r]\n\t"
  170221. #endif
  170222. "ldrh r7, [r2]\n\t"
  170223. #ifdef WOLFSSL_KEIL
  170224. "muls r6, r7, r6\n\t"
  170225. #elif defined(__clang__)
  170226. "muls r6, r7\n\t"
  170227. #else
  170228. "mul r6, r7\n\t"
  170229. #endif
  170230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170231. "lsrs r7, r6, #16\n\t"
  170232. #else
  170233. "lsr r7, r6, #16\n\t"
  170234. #endif
  170235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170236. "lsls r6, r6, #16\n\t"
  170237. #else
  170238. "lsl r6, r6, #16\n\t"
  170239. #endif
  170240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170241. "adds r3, r3, r6\n\t"
  170242. #else
  170243. "add r3, r3, r6\n\t"
  170244. #endif
  170245. #ifdef WOLFSSL_KEIL
  170246. "adcs r4, r4, r7\n\t"
  170247. #elif defined(__clang__)
  170248. "adcs r4, r7\n\t"
  170249. #else
  170250. "adc r4, r7\n\t"
  170251. #endif
  170252. #ifdef WOLFSSL_KEIL
  170253. "adcs r5, r5, %[r]\n\t"
  170254. #elif defined(__clang__)
  170255. "adcs r5, %[r]\n\t"
  170256. #else
  170257. "adc r5, %[r]\n\t"
  170258. #endif
  170259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170260. "adds r3, r3, r6\n\t"
  170261. #else
  170262. "add r3, r3, r6\n\t"
  170263. #endif
  170264. #ifdef WOLFSSL_KEIL
  170265. "adcs r4, r4, r7\n\t"
  170266. #elif defined(__clang__)
  170267. "adcs r4, r7\n\t"
  170268. #else
  170269. "adc r4, r7\n\t"
  170270. #endif
  170271. #ifdef WOLFSSL_KEIL
  170272. "adcs r5, r5, %[r]\n\t"
  170273. #elif defined(__clang__)
  170274. "adcs r5, %[r]\n\t"
  170275. #else
  170276. "adc r5, %[r]\n\t"
  170277. #endif
  170278. "# Multiply * 2: Done\n\t"
  170279. "bal L_sp_1024_sqr_16_done_sqr_%=\n\t"
  170280. "\n"
  170281. "L_sp_1024_sqr_16_sqr_%=:\n\t"
  170282. "mov r12, r2\n\t"
  170283. "ldr r2, [%[a]]\n\t"
  170284. "# Square: Start\n\t"
  170285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170286. "lsrs r7, r2, #16\n\t"
  170287. #else
  170288. "lsr r7, r2, #16\n\t"
  170289. #endif
  170290. "uxth r6, r2\n\t"
  170291. #ifdef WOLFSSL_KEIL
  170292. "muls r6, r6, r6\n\t"
  170293. #elif defined(__clang__)
  170294. "muls r6, r6\n\t"
  170295. #else
  170296. "mul r6, r6\n\t"
  170297. #endif
  170298. #ifdef WOLFSSL_KEIL
  170299. "muls r7, r7, r7\n\t"
  170300. #elif defined(__clang__)
  170301. "muls r7, r7\n\t"
  170302. #else
  170303. "mul r7, r7\n\t"
  170304. #endif
  170305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170306. "adds r3, r3, r6\n\t"
  170307. #else
  170308. "add r3, r3, r6\n\t"
  170309. #endif
  170310. #ifdef WOLFSSL_KEIL
  170311. "adcs r4, r4, r7\n\t"
  170312. #elif defined(__clang__)
  170313. "adcs r4, r7\n\t"
  170314. #else
  170315. "adc r4, r7\n\t"
  170316. #endif
  170317. #ifdef WOLFSSL_KEIL
  170318. "adcs r5, r5, %[r]\n\t"
  170319. #elif defined(__clang__)
  170320. "adcs r5, %[r]\n\t"
  170321. #else
  170322. "adc r5, %[r]\n\t"
  170323. #endif
  170324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170325. "lsrs r7, r2, #16\n\t"
  170326. #else
  170327. "lsr r7, r2, #16\n\t"
  170328. #endif
  170329. "uxth r6, r2\n\t"
  170330. #ifdef WOLFSSL_KEIL
  170331. "muls r6, r7, r6\n\t"
  170332. #elif defined(__clang__)
  170333. "muls r6, r7\n\t"
  170334. #else
  170335. "mul r6, r7\n\t"
  170336. #endif
  170337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170338. "lsrs r7, r6, #15\n\t"
  170339. #else
  170340. "lsr r7, r6, #15\n\t"
  170341. #endif
  170342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170343. "lsls r6, r6, #17\n\t"
  170344. #else
  170345. "lsl r6, r6, #17\n\t"
  170346. #endif
  170347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170348. "adds r3, r3, r6\n\t"
  170349. #else
  170350. "add r3, r3, r6\n\t"
  170351. #endif
  170352. #ifdef WOLFSSL_KEIL
  170353. "adcs r4, r4, r7\n\t"
  170354. #elif defined(__clang__)
  170355. "adcs r4, r7\n\t"
  170356. #else
  170357. "adc r4, r7\n\t"
  170358. #endif
  170359. #ifdef WOLFSSL_KEIL
  170360. "adcs r5, r5, %[r]\n\t"
  170361. #elif defined(__clang__)
  170362. "adcs r5, %[r]\n\t"
  170363. #else
  170364. "adc r5, %[r]\n\t"
  170365. #endif
  170366. "# Square: Done\n\t"
  170367. "mov r2, r12\n\t"
  170368. "\n"
  170369. "L_sp_1024_sqr_16_done_sqr_%=:\n\t"
  170370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170371. "adds %[a], %[a], #4\n\t"
  170372. #else
  170373. "add %[a], %[a], #4\n\t"
  170374. #endif
  170375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170376. "subs r2, r2, #4\n\t"
  170377. #else
  170378. "sub r2, r2, #4\n\t"
  170379. #endif
  170380. "movs r6, #0x40\n\t"
  170381. "add r6, r6, r9\n\t"
  170382. "cmp %[a], r6\n\t"
  170383. "beq L_sp_1024_sqr_16_done_mul_%=\n\t"
  170384. "cmp %[a], r2\n\t"
  170385. "bgt L_sp_1024_sqr_16_done_mul_%=\n\t"
  170386. "mov r7, r8\n\t"
  170387. "add r7, r7, r9\n\t"
  170388. "cmp %[a], r7\n\t"
  170389. "ble L_sp_1024_sqr_16_mul_%=\n\t"
  170390. "\n"
  170391. "L_sp_1024_sqr_16_done_mul_%=:\n\t"
  170392. "mov %[r], r10\n\t"
  170393. "mov r7, r8\n\t"
  170394. "str r3, [%[r], r7]\n\t"
  170395. "movs r3, r4\n\t"
  170396. "movs r4, r5\n\t"
  170397. "movs r5, #0\n\t"
  170398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170399. "adds r7, r7, #4\n\t"
  170400. #else
  170401. "add r7, r7, #4\n\t"
  170402. #endif
  170403. "mov r8, r7\n\t"
  170404. "movs r6, #0x78\n\t"
  170405. "cmp r7, r6\n\t"
  170406. "ble L_sp_1024_sqr_16_words_%=\n\t"
  170407. "mov %[a], r9\n\t"
  170408. "str r3, [%[r], r7]\n\t"
  170409. "mov %[r], r11\n\t"
  170410. "mov %[a], r10\n\t"
  170411. "movs r3, #0x7c\n\t"
  170412. "\n"
  170413. "L_sp_1024_sqr_16_store_%=:\n\t"
  170414. "ldr r6, [%[a], r3]\n\t"
  170415. "str r6, [%[r], r3]\n\t"
  170416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170417. "subs r3, r3, #4\n\t"
  170418. #else
  170419. "sub r3, r3, #4\n\t"
  170420. #endif
  170421. "bge L_sp_1024_sqr_16_store_%=\n\t"
  170422. "movs r6, #0x80\n\t"
  170423. "add sp, sp, r6\n\t"
  170424. : [r] "+l" (r), [a] "+l" (a)
  170425. :
  170426. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  170427. );
  170428. }
  170429. #else
  170430. /* Square a and put result in r. (r = a * a)
  170431. *
  170432. * r A single precision integer.
  170433. * a A single precision integer.
  170434. */
  170435. SP_NOINLINE static void sp_1024_sqr_16(sp_digit* r, const sp_digit* a)
  170436. {
  170437. __asm__ __volatile__ (
  170438. "sub sp, sp, #0x40\n\t"
  170439. "mov r8, %[r]\n\t"
  170440. "mov r9, %[a]\n\t"
  170441. "movs %[r], #0\n\t"
  170442. "ldm %[a]!, {r2, r3, r4, r5}\n\t"
  170443. "mov r10, r2\n\t"
  170444. "mov r11, r3\n\t"
  170445. "mov r12, r4\n\t"
  170446. "mov lr, r5\n\t"
  170447. "mov %[a], r9\n\t"
  170448. "# A[0] * A[0]\n\t"
  170449. "movs r4, #0\n\t"
  170450. "mov r7, r10\n\t"
  170451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170452. "lsrs r6, r7, #16\n\t"
  170453. #else
  170454. "lsr r6, r7, #16\n\t"
  170455. #endif
  170456. "uxth r5, r7\n\t"
  170457. "movs r2, r5\n\t"
  170458. "movs r3, r6\n\t"
  170459. #ifdef WOLFSSL_KEIL
  170460. "muls r2, r2, r2\n\t"
  170461. #elif defined(__clang__)
  170462. "muls r2, r2\n\t"
  170463. #else
  170464. "mul r2, r2\n\t"
  170465. #endif
  170466. #ifdef WOLFSSL_KEIL
  170467. "muls r3, r3, r3\n\t"
  170468. #elif defined(__clang__)
  170469. "muls r3, r3\n\t"
  170470. #else
  170471. "mul r3, r3\n\t"
  170472. #endif
  170473. #ifdef WOLFSSL_KEIL
  170474. "muls r5, r6, r5\n\t"
  170475. #elif defined(__clang__)
  170476. "muls r5, r6\n\t"
  170477. #else
  170478. "mul r5, r6\n\t"
  170479. #endif
  170480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170481. "lsrs r6, r5, #15\n\t"
  170482. #else
  170483. "lsr r6, r5, #15\n\t"
  170484. #endif
  170485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170486. "lsls r5, r5, #17\n\t"
  170487. #else
  170488. "lsl r5, r5, #17\n\t"
  170489. #endif
  170490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170491. "adds r2, r2, r5\n\t"
  170492. #else
  170493. "add r2, r2, r5\n\t"
  170494. #endif
  170495. #ifdef WOLFSSL_KEIL
  170496. "adcs r3, r3, r6\n\t"
  170497. #elif defined(__clang__)
  170498. "adcs r3, r6\n\t"
  170499. #else
  170500. "adc r3, r6\n\t"
  170501. #endif
  170502. "str r2, [sp]\n\t"
  170503. "# A[1] * A[0]\n\t"
  170504. "movs r2, #0\n\t"
  170505. "mov %[a], r11\n\t"
  170506. "uxth r5, %[a]\n\t"
  170507. "uxth r6, r7\n\t"
  170508. #ifdef WOLFSSL_KEIL
  170509. "muls r6, r5, r6\n\t"
  170510. #elif defined(__clang__)
  170511. "muls r6, r5\n\t"
  170512. #else
  170513. "mul r6, r5\n\t"
  170514. #endif
  170515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170516. "adds r3, r3, r6\n\t"
  170517. #else
  170518. "add r3, r3, r6\n\t"
  170519. #endif
  170520. #ifdef WOLFSSL_KEIL
  170521. "adcs r4, r4, %[r]\n\t"
  170522. #elif defined(__clang__)
  170523. "adcs r4, %[r]\n\t"
  170524. #else
  170525. "adc r4, %[r]\n\t"
  170526. #endif
  170527. #ifdef WOLFSSL_KEIL
  170528. "adcs r2, r2, %[r]\n\t"
  170529. #elif defined(__clang__)
  170530. "adcs r2, %[r]\n\t"
  170531. #else
  170532. "adc r2, %[r]\n\t"
  170533. #endif
  170534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170535. "adds r3, r3, r6\n\t"
  170536. #else
  170537. "add r3, r3, r6\n\t"
  170538. #endif
  170539. #ifdef WOLFSSL_KEIL
  170540. "adcs r4, r4, %[r]\n\t"
  170541. #elif defined(__clang__)
  170542. "adcs r4, %[r]\n\t"
  170543. #else
  170544. "adc r4, %[r]\n\t"
  170545. #endif
  170546. #ifdef WOLFSSL_KEIL
  170547. "adcs r2, r2, %[r]\n\t"
  170548. #elif defined(__clang__)
  170549. "adcs r2, %[r]\n\t"
  170550. #else
  170551. "adc r2, %[r]\n\t"
  170552. #endif
  170553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170554. "lsrs r6, r7, #16\n\t"
  170555. #else
  170556. "lsr r6, r7, #16\n\t"
  170557. #endif
  170558. #ifdef WOLFSSL_KEIL
  170559. "muls r5, r6, r5\n\t"
  170560. #elif defined(__clang__)
  170561. "muls r5, r6\n\t"
  170562. #else
  170563. "mul r5, r6\n\t"
  170564. #endif
  170565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170566. "lsrs r6, r5, #16\n\t"
  170567. #else
  170568. "lsr r6, r5, #16\n\t"
  170569. #endif
  170570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170571. "lsls r5, r5, #16\n\t"
  170572. #else
  170573. "lsl r5, r5, #16\n\t"
  170574. #endif
  170575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170576. "adds r3, r3, r5\n\t"
  170577. #else
  170578. "add r3, r3, r5\n\t"
  170579. #endif
  170580. #ifdef WOLFSSL_KEIL
  170581. "adcs r4, r4, r6\n\t"
  170582. #elif defined(__clang__)
  170583. "adcs r4, r6\n\t"
  170584. #else
  170585. "adc r4, r6\n\t"
  170586. #endif
  170587. #ifdef WOLFSSL_KEIL
  170588. "adcs r2, r2, %[r]\n\t"
  170589. #elif defined(__clang__)
  170590. "adcs r2, %[r]\n\t"
  170591. #else
  170592. "adc r2, %[r]\n\t"
  170593. #endif
  170594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170595. "adds r3, r3, r5\n\t"
  170596. #else
  170597. "add r3, r3, r5\n\t"
  170598. #endif
  170599. #ifdef WOLFSSL_KEIL
  170600. "adcs r4, r4, r6\n\t"
  170601. #elif defined(__clang__)
  170602. "adcs r4, r6\n\t"
  170603. #else
  170604. "adc r4, r6\n\t"
  170605. #endif
  170606. #ifdef WOLFSSL_KEIL
  170607. "adcs r2, r2, %[r]\n\t"
  170608. #elif defined(__clang__)
  170609. "adcs r2, %[r]\n\t"
  170610. #else
  170611. "adc r2, %[r]\n\t"
  170612. #endif
  170613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170614. "lsrs r5, %[a], #16\n\t"
  170615. #else
  170616. "lsr r5, %[a], #16\n\t"
  170617. #endif
  170618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170619. "lsrs r6, r7, #16\n\t"
  170620. #else
  170621. "lsr r6, r7, #16\n\t"
  170622. #endif
  170623. #ifdef WOLFSSL_KEIL
  170624. "muls r6, r5, r6\n\t"
  170625. #elif defined(__clang__)
  170626. "muls r6, r5\n\t"
  170627. #else
  170628. "mul r6, r5\n\t"
  170629. #endif
  170630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170631. "adds r4, r4, r6\n\t"
  170632. #else
  170633. "add r4, r4, r6\n\t"
  170634. #endif
  170635. #ifdef WOLFSSL_KEIL
  170636. "adcs r2, r2, %[r]\n\t"
  170637. #elif defined(__clang__)
  170638. "adcs r2, %[r]\n\t"
  170639. #else
  170640. "adc r2, %[r]\n\t"
  170641. #endif
  170642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170643. "adds r4, r4, r6\n\t"
  170644. #else
  170645. "add r4, r4, r6\n\t"
  170646. #endif
  170647. #ifdef WOLFSSL_KEIL
  170648. "adcs r2, r2, %[r]\n\t"
  170649. #elif defined(__clang__)
  170650. "adcs r2, %[r]\n\t"
  170651. #else
  170652. "adc r2, %[r]\n\t"
  170653. #endif
  170654. "uxth r6, r7\n\t"
  170655. #ifdef WOLFSSL_KEIL
  170656. "muls r5, r6, r5\n\t"
  170657. #elif defined(__clang__)
  170658. "muls r5, r6\n\t"
  170659. #else
  170660. "mul r5, r6\n\t"
  170661. #endif
  170662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170663. "lsrs r6, r5, #16\n\t"
  170664. #else
  170665. "lsr r6, r5, #16\n\t"
  170666. #endif
  170667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170668. "lsls r5, r5, #16\n\t"
  170669. #else
  170670. "lsl r5, r5, #16\n\t"
  170671. #endif
  170672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170673. "adds r3, r3, r5\n\t"
  170674. #else
  170675. "add r3, r3, r5\n\t"
  170676. #endif
  170677. #ifdef WOLFSSL_KEIL
  170678. "adcs r4, r4, r6\n\t"
  170679. #elif defined(__clang__)
  170680. "adcs r4, r6\n\t"
  170681. #else
  170682. "adc r4, r6\n\t"
  170683. #endif
  170684. #ifdef WOLFSSL_KEIL
  170685. "adcs r2, r2, %[r]\n\t"
  170686. #elif defined(__clang__)
  170687. "adcs r2, %[r]\n\t"
  170688. #else
  170689. "adc r2, %[r]\n\t"
  170690. #endif
  170691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170692. "adds r3, r3, r5\n\t"
  170693. #else
  170694. "add r3, r3, r5\n\t"
  170695. #endif
  170696. #ifdef WOLFSSL_KEIL
  170697. "adcs r4, r4, r6\n\t"
  170698. #elif defined(__clang__)
  170699. "adcs r4, r6\n\t"
  170700. #else
  170701. "adc r4, r6\n\t"
  170702. #endif
  170703. #ifdef WOLFSSL_KEIL
  170704. "adcs r2, r2, %[r]\n\t"
  170705. #elif defined(__clang__)
  170706. "adcs r2, %[r]\n\t"
  170707. #else
  170708. "adc r2, %[r]\n\t"
  170709. #endif
  170710. "str r3, [sp, #4]\n\t"
  170711. "# A[2] * A[0]\n\t"
  170712. "movs r3, #0\n\t"
  170713. "mov %[a], r9\n\t"
  170714. "mov %[a], r12\n\t"
  170715. "uxth r5, %[a]\n\t"
  170716. "uxth r6, r7\n\t"
  170717. #ifdef WOLFSSL_KEIL
  170718. "muls r6, r5, r6\n\t"
  170719. #elif defined(__clang__)
  170720. "muls r6, r5\n\t"
  170721. #else
  170722. "mul r6, r5\n\t"
  170723. #endif
  170724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170725. "adds r4, r4, r6\n\t"
  170726. #else
  170727. "add r4, r4, r6\n\t"
  170728. #endif
  170729. #ifdef WOLFSSL_KEIL
  170730. "adcs r2, r2, %[r]\n\t"
  170731. #elif defined(__clang__)
  170732. "adcs r2, %[r]\n\t"
  170733. #else
  170734. "adc r2, %[r]\n\t"
  170735. #endif
  170736. #ifdef WOLFSSL_KEIL
  170737. "adcs r3, r3, %[r]\n\t"
  170738. #elif defined(__clang__)
  170739. "adcs r3, %[r]\n\t"
  170740. #else
  170741. "adc r3, %[r]\n\t"
  170742. #endif
  170743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170744. "adds r4, r4, r6\n\t"
  170745. #else
  170746. "add r4, r4, r6\n\t"
  170747. #endif
  170748. #ifdef WOLFSSL_KEIL
  170749. "adcs r2, r2, %[r]\n\t"
  170750. #elif defined(__clang__)
  170751. "adcs r2, %[r]\n\t"
  170752. #else
  170753. "adc r2, %[r]\n\t"
  170754. #endif
  170755. #ifdef WOLFSSL_KEIL
  170756. "adcs r3, r3, %[r]\n\t"
  170757. #elif defined(__clang__)
  170758. "adcs r3, %[r]\n\t"
  170759. #else
  170760. "adc r3, %[r]\n\t"
  170761. #endif
  170762. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170763. "lsrs r6, r7, #16\n\t"
  170764. #else
  170765. "lsr r6, r7, #16\n\t"
  170766. #endif
  170767. #ifdef WOLFSSL_KEIL
  170768. "muls r5, r6, r5\n\t"
  170769. #elif defined(__clang__)
  170770. "muls r5, r6\n\t"
  170771. #else
  170772. "mul r5, r6\n\t"
  170773. #endif
  170774. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170775. "lsrs r6, r5, #16\n\t"
  170776. #else
  170777. "lsr r6, r5, #16\n\t"
  170778. #endif
  170779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170780. "lsls r5, r5, #16\n\t"
  170781. #else
  170782. "lsl r5, r5, #16\n\t"
  170783. #endif
  170784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170785. "adds r4, r4, r5\n\t"
  170786. #else
  170787. "add r4, r4, r5\n\t"
  170788. #endif
  170789. #ifdef WOLFSSL_KEIL
  170790. "adcs r2, r2, r6\n\t"
  170791. #elif defined(__clang__)
  170792. "adcs r2, r6\n\t"
  170793. #else
  170794. "adc r2, r6\n\t"
  170795. #endif
  170796. #ifdef WOLFSSL_KEIL
  170797. "adcs r3, r3, %[r]\n\t"
  170798. #elif defined(__clang__)
  170799. "adcs r3, %[r]\n\t"
  170800. #else
  170801. "adc r3, %[r]\n\t"
  170802. #endif
  170803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170804. "adds r4, r4, r5\n\t"
  170805. #else
  170806. "add r4, r4, r5\n\t"
  170807. #endif
  170808. #ifdef WOLFSSL_KEIL
  170809. "adcs r2, r2, r6\n\t"
  170810. #elif defined(__clang__)
  170811. "adcs r2, r6\n\t"
  170812. #else
  170813. "adc r2, r6\n\t"
  170814. #endif
  170815. #ifdef WOLFSSL_KEIL
  170816. "adcs r3, r3, %[r]\n\t"
  170817. #elif defined(__clang__)
  170818. "adcs r3, %[r]\n\t"
  170819. #else
  170820. "adc r3, %[r]\n\t"
  170821. #endif
  170822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170823. "lsrs r5, %[a], #16\n\t"
  170824. #else
  170825. "lsr r5, %[a], #16\n\t"
  170826. #endif
  170827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170828. "lsrs r6, r7, #16\n\t"
  170829. #else
  170830. "lsr r6, r7, #16\n\t"
  170831. #endif
  170832. #ifdef WOLFSSL_KEIL
  170833. "muls r6, r5, r6\n\t"
  170834. #elif defined(__clang__)
  170835. "muls r6, r5\n\t"
  170836. #else
  170837. "mul r6, r5\n\t"
  170838. #endif
  170839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170840. "adds r2, r2, r6\n\t"
  170841. #else
  170842. "add r2, r2, r6\n\t"
  170843. #endif
  170844. #ifdef WOLFSSL_KEIL
  170845. "adcs r3, r3, %[r]\n\t"
  170846. #elif defined(__clang__)
  170847. "adcs r3, %[r]\n\t"
  170848. #else
  170849. "adc r3, %[r]\n\t"
  170850. #endif
  170851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170852. "adds r2, r2, r6\n\t"
  170853. #else
  170854. "add r2, r2, r6\n\t"
  170855. #endif
  170856. #ifdef WOLFSSL_KEIL
  170857. "adcs r3, r3, %[r]\n\t"
  170858. #elif defined(__clang__)
  170859. "adcs r3, %[r]\n\t"
  170860. #else
  170861. "adc r3, %[r]\n\t"
  170862. #endif
  170863. "uxth r6, r7\n\t"
  170864. #ifdef WOLFSSL_KEIL
  170865. "muls r5, r6, r5\n\t"
  170866. #elif defined(__clang__)
  170867. "muls r5, r6\n\t"
  170868. #else
  170869. "mul r5, r6\n\t"
  170870. #endif
  170871. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170872. "lsrs r6, r5, #16\n\t"
  170873. #else
  170874. "lsr r6, r5, #16\n\t"
  170875. #endif
  170876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170877. "lsls r5, r5, #16\n\t"
  170878. #else
  170879. "lsl r5, r5, #16\n\t"
  170880. #endif
  170881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170882. "adds r4, r4, r5\n\t"
  170883. #else
  170884. "add r4, r4, r5\n\t"
  170885. #endif
  170886. #ifdef WOLFSSL_KEIL
  170887. "adcs r2, r2, r6\n\t"
  170888. #elif defined(__clang__)
  170889. "adcs r2, r6\n\t"
  170890. #else
  170891. "adc r2, r6\n\t"
  170892. #endif
  170893. #ifdef WOLFSSL_KEIL
  170894. "adcs r3, r3, %[r]\n\t"
  170895. #elif defined(__clang__)
  170896. "adcs r3, %[r]\n\t"
  170897. #else
  170898. "adc r3, %[r]\n\t"
  170899. #endif
  170900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170901. "adds r4, r4, r5\n\t"
  170902. #else
  170903. "add r4, r4, r5\n\t"
  170904. #endif
  170905. #ifdef WOLFSSL_KEIL
  170906. "adcs r2, r2, r6\n\t"
  170907. #elif defined(__clang__)
  170908. "adcs r2, r6\n\t"
  170909. #else
  170910. "adc r2, r6\n\t"
  170911. #endif
  170912. #ifdef WOLFSSL_KEIL
  170913. "adcs r3, r3, %[r]\n\t"
  170914. #elif defined(__clang__)
  170915. "adcs r3, %[r]\n\t"
  170916. #else
  170917. "adc r3, %[r]\n\t"
  170918. #endif
  170919. "# A[1] * A[1]\n\t"
  170920. "mov r7, r11\n\t"
  170921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170922. "lsrs r6, r7, #16\n\t"
  170923. #else
  170924. "lsr r6, r7, #16\n\t"
  170925. #endif
  170926. "uxth r5, r7\n\t"
  170927. #ifdef WOLFSSL_KEIL
  170928. "muls r5, r5, r5\n\t"
  170929. #elif defined(__clang__)
  170930. "muls r5, r5\n\t"
  170931. #else
  170932. "mul r5, r5\n\t"
  170933. #endif
  170934. #ifdef WOLFSSL_KEIL
  170935. "muls r6, r6, r6\n\t"
  170936. #elif defined(__clang__)
  170937. "muls r6, r6\n\t"
  170938. #else
  170939. "mul r6, r6\n\t"
  170940. #endif
  170941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170942. "adds r4, r4, r5\n\t"
  170943. #else
  170944. "add r4, r4, r5\n\t"
  170945. #endif
  170946. #ifdef WOLFSSL_KEIL
  170947. "adcs r2, r2, r6\n\t"
  170948. #elif defined(__clang__)
  170949. "adcs r2, r6\n\t"
  170950. #else
  170951. "adc r2, r6\n\t"
  170952. #endif
  170953. #ifdef WOLFSSL_KEIL
  170954. "adcs r3, r3, %[r]\n\t"
  170955. #elif defined(__clang__)
  170956. "adcs r3, %[r]\n\t"
  170957. #else
  170958. "adc r3, %[r]\n\t"
  170959. #endif
  170960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170961. "lsrs r6, r7, #16\n\t"
  170962. #else
  170963. "lsr r6, r7, #16\n\t"
  170964. #endif
  170965. "uxth r5, r7\n\t"
  170966. #ifdef WOLFSSL_KEIL
  170967. "muls r5, r6, r5\n\t"
  170968. #elif defined(__clang__)
  170969. "muls r5, r6\n\t"
  170970. #else
  170971. "mul r5, r6\n\t"
  170972. #endif
  170973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170974. "lsrs r6, r5, #15\n\t"
  170975. #else
  170976. "lsr r6, r5, #15\n\t"
  170977. #endif
  170978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170979. "lsls r5, r5, #17\n\t"
  170980. #else
  170981. "lsl r5, r5, #17\n\t"
  170982. #endif
  170983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  170984. "adds r4, r4, r5\n\t"
  170985. #else
  170986. "add r4, r4, r5\n\t"
  170987. #endif
  170988. #ifdef WOLFSSL_KEIL
  170989. "adcs r2, r2, r6\n\t"
  170990. #elif defined(__clang__)
  170991. "adcs r2, r6\n\t"
  170992. #else
  170993. "adc r2, r6\n\t"
  170994. #endif
  170995. #ifdef WOLFSSL_KEIL
  170996. "adcs r3, r3, %[r]\n\t"
  170997. #elif defined(__clang__)
  170998. "adcs r3, %[r]\n\t"
  170999. #else
  171000. "adc r3, %[r]\n\t"
  171001. #endif
  171002. "str r4, [sp, #8]\n\t"
  171003. "# A[2] * A[1]\n\t"
  171004. "movs r4, #0\n\t"
  171005. "mov %[a], r9\n\t"
  171006. "mov %[a], r12\n\t"
  171007. "uxth r5, %[a]\n\t"
  171008. "uxth r6, r7\n\t"
  171009. #ifdef WOLFSSL_KEIL
  171010. "muls r6, r5, r6\n\t"
  171011. #elif defined(__clang__)
  171012. "muls r6, r5\n\t"
  171013. #else
  171014. "mul r6, r5\n\t"
  171015. #endif
  171016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171017. "adds r2, r2, r6\n\t"
  171018. #else
  171019. "add r2, r2, r6\n\t"
  171020. #endif
  171021. #ifdef WOLFSSL_KEIL
  171022. "adcs r3, r3, %[r]\n\t"
  171023. #elif defined(__clang__)
  171024. "adcs r3, %[r]\n\t"
  171025. #else
  171026. "adc r3, %[r]\n\t"
  171027. #endif
  171028. #ifdef WOLFSSL_KEIL
  171029. "adcs r4, r4, %[r]\n\t"
  171030. #elif defined(__clang__)
  171031. "adcs r4, %[r]\n\t"
  171032. #else
  171033. "adc r4, %[r]\n\t"
  171034. #endif
  171035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171036. "adds r2, r2, r6\n\t"
  171037. #else
  171038. "add r2, r2, r6\n\t"
  171039. #endif
  171040. #ifdef WOLFSSL_KEIL
  171041. "adcs r3, r3, %[r]\n\t"
  171042. #elif defined(__clang__)
  171043. "adcs r3, %[r]\n\t"
  171044. #else
  171045. "adc r3, %[r]\n\t"
  171046. #endif
  171047. #ifdef WOLFSSL_KEIL
  171048. "adcs r4, r4, %[r]\n\t"
  171049. #elif defined(__clang__)
  171050. "adcs r4, %[r]\n\t"
  171051. #else
  171052. "adc r4, %[r]\n\t"
  171053. #endif
  171054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171055. "lsrs r6, r7, #16\n\t"
  171056. #else
  171057. "lsr r6, r7, #16\n\t"
  171058. #endif
  171059. #ifdef WOLFSSL_KEIL
  171060. "muls r5, r6, r5\n\t"
  171061. #elif defined(__clang__)
  171062. "muls r5, r6\n\t"
  171063. #else
  171064. "mul r5, r6\n\t"
  171065. #endif
  171066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171067. "lsrs r6, r5, #16\n\t"
  171068. #else
  171069. "lsr r6, r5, #16\n\t"
  171070. #endif
  171071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171072. "lsls r5, r5, #16\n\t"
  171073. #else
  171074. "lsl r5, r5, #16\n\t"
  171075. #endif
  171076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171077. "adds r2, r2, r5\n\t"
  171078. #else
  171079. "add r2, r2, r5\n\t"
  171080. #endif
  171081. #ifdef WOLFSSL_KEIL
  171082. "adcs r3, r3, r6\n\t"
  171083. #elif defined(__clang__)
  171084. "adcs r3, r6\n\t"
  171085. #else
  171086. "adc r3, r6\n\t"
  171087. #endif
  171088. #ifdef WOLFSSL_KEIL
  171089. "adcs r4, r4, %[r]\n\t"
  171090. #elif defined(__clang__)
  171091. "adcs r4, %[r]\n\t"
  171092. #else
  171093. "adc r4, %[r]\n\t"
  171094. #endif
  171095. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171096. "adds r2, r2, r5\n\t"
  171097. #else
  171098. "add r2, r2, r5\n\t"
  171099. #endif
  171100. #ifdef WOLFSSL_KEIL
  171101. "adcs r3, r3, r6\n\t"
  171102. #elif defined(__clang__)
  171103. "adcs r3, r6\n\t"
  171104. #else
  171105. "adc r3, r6\n\t"
  171106. #endif
  171107. #ifdef WOLFSSL_KEIL
  171108. "adcs r4, r4, %[r]\n\t"
  171109. #elif defined(__clang__)
  171110. "adcs r4, %[r]\n\t"
  171111. #else
  171112. "adc r4, %[r]\n\t"
  171113. #endif
  171114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171115. "lsrs r5, %[a], #16\n\t"
  171116. #else
  171117. "lsr r5, %[a], #16\n\t"
  171118. #endif
  171119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171120. "lsrs r6, r7, #16\n\t"
  171121. #else
  171122. "lsr r6, r7, #16\n\t"
  171123. #endif
  171124. #ifdef WOLFSSL_KEIL
  171125. "muls r6, r5, r6\n\t"
  171126. #elif defined(__clang__)
  171127. "muls r6, r5\n\t"
  171128. #else
  171129. "mul r6, r5\n\t"
  171130. #endif
  171131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171132. "adds r3, r3, r6\n\t"
  171133. #else
  171134. "add r3, r3, r6\n\t"
  171135. #endif
  171136. #ifdef WOLFSSL_KEIL
  171137. "adcs r4, r4, %[r]\n\t"
  171138. #elif defined(__clang__)
  171139. "adcs r4, %[r]\n\t"
  171140. #else
  171141. "adc r4, %[r]\n\t"
  171142. #endif
  171143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171144. "adds r3, r3, r6\n\t"
  171145. #else
  171146. "add r3, r3, r6\n\t"
  171147. #endif
  171148. #ifdef WOLFSSL_KEIL
  171149. "adcs r4, r4, %[r]\n\t"
  171150. #elif defined(__clang__)
  171151. "adcs r4, %[r]\n\t"
  171152. #else
  171153. "adc r4, %[r]\n\t"
  171154. #endif
  171155. "uxth r6, r7\n\t"
  171156. #ifdef WOLFSSL_KEIL
  171157. "muls r5, r6, r5\n\t"
  171158. #elif defined(__clang__)
  171159. "muls r5, r6\n\t"
  171160. #else
  171161. "mul r5, r6\n\t"
  171162. #endif
  171163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171164. "lsrs r6, r5, #16\n\t"
  171165. #else
  171166. "lsr r6, r5, #16\n\t"
  171167. #endif
  171168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171169. "lsls r5, r5, #16\n\t"
  171170. #else
  171171. "lsl r5, r5, #16\n\t"
  171172. #endif
  171173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171174. "adds r2, r2, r5\n\t"
  171175. #else
  171176. "add r2, r2, r5\n\t"
  171177. #endif
  171178. #ifdef WOLFSSL_KEIL
  171179. "adcs r3, r3, r6\n\t"
  171180. #elif defined(__clang__)
  171181. "adcs r3, r6\n\t"
  171182. #else
  171183. "adc r3, r6\n\t"
  171184. #endif
  171185. #ifdef WOLFSSL_KEIL
  171186. "adcs r4, r4, %[r]\n\t"
  171187. #elif defined(__clang__)
  171188. "adcs r4, %[r]\n\t"
  171189. #else
  171190. "adc r4, %[r]\n\t"
  171191. #endif
  171192. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171193. "adds r2, r2, r5\n\t"
  171194. #else
  171195. "add r2, r2, r5\n\t"
  171196. #endif
  171197. #ifdef WOLFSSL_KEIL
  171198. "adcs r3, r3, r6\n\t"
  171199. #elif defined(__clang__)
  171200. "adcs r3, r6\n\t"
  171201. #else
  171202. "adc r3, r6\n\t"
  171203. #endif
  171204. #ifdef WOLFSSL_KEIL
  171205. "adcs r4, r4, %[r]\n\t"
  171206. #elif defined(__clang__)
  171207. "adcs r4, %[r]\n\t"
  171208. #else
  171209. "adc r4, %[r]\n\t"
  171210. #endif
  171211. "# A[3] * A[0]\n\t"
  171212. "mov %[a], r9\n\t"
  171213. "mov r7, r10\n\t"
  171214. "mov %[a], lr\n\t"
  171215. "uxth r5, %[a]\n\t"
  171216. "uxth r6, r7\n\t"
  171217. #ifdef WOLFSSL_KEIL
  171218. "muls r6, r5, r6\n\t"
  171219. #elif defined(__clang__)
  171220. "muls r6, r5\n\t"
  171221. #else
  171222. "mul r6, r5\n\t"
  171223. #endif
  171224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171225. "adds r2, r2, r6\n\t"
  171226. #else
  171227. "add r2, r2, r6\n\t"
  171228. #endif
  171229. #ifdef WOLFSSL_KEIL
  171230. "adcs r3, r3, %[r]\n\t"
  171231. #elif defined(__clang__)
  171232. "adcs r3, %[r]\n\t"
  171233. #else
  171234. "adc r3, %[r]\n\t"
  171235. #endif
  171236. #ifdef WOLFSSL_KEIL
  171237. "adcs r4, r4, %[r]\n\t"
  171238. #elif defined(__clang__)
  171239. "adcs r4, %[r]\n\t"
  171240. #else
  171241. "adc r4, %[r]\n\t"
  171242. #endif
  171243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171244. "adds r2, r2, r6\n\t"
  171245. #else
  171246. "add r2, r2, r6\n\t"
  171247. #endif
  171248. #ifdef WOLFSSL_KEIL
  171249. "adcs r3, r3, %[r]\n\t"
  171250. #elif defined(__clang__)
  171251. "adcs r3, %[r]\n\t"
  171252. #else
  171253. "adc r3, %[r]\n\t"
  171254. #endif
  171255. #ifdef WOLFSSL_KEIL
  171256. "adcs r4, r4, %[r]\n\t"
  171257. #elif defined(__clang__)
  171258. "adcs r4, %[r]\n\t"
  171259. #else
  171260. "adc r4, %[r]\n\t"
  171261. #endif
  171262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171263. "lsrs r6, r7, #16\n\t"
  171264. #else
  171265. "lsr r6, r7, #16\n\t"
  171266. #endif
  171267. #ifdef WOLFSSL_KEIL
  171268. "muls r5, r6, r5\n\t"
  171269. #elif defined(__clang__)
  171270. "muls r5, r6\n\t"
  171271. #else
  171272. "mul r5, r6\n\t"
  171273. #endif
  171274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171275. "lsrs r6, r5, #16\n\t"
  171276. #else
  171277. "lsr r6, r5, #16\n\t"
  171278. #endif
  171279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171280. "lsls r5, r5, #16\n\t"
  171281. #else
  171282. "lsl r5, r5, #16\n\t"
  171283. #endif
  171284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171285. "adds r2, r2, r5\n\t"
  171286. #else
  171287. "add r2, r2, r5\n\t"
  171288. #endif
  171289. #ifdef WOLFSSL_KEIL
  171290. "adcs r3, r3, r6\n\t"
  171291. #elif defined(__clang__)
  171292. "adcs r3, r6\n\t"
  171293. #else
  171294. "adc r3, r6\n\t"
  171295. #endif
  171296. #ifdef WOLFSSL_KEIL
  171297. "adcs r4, r4, %[r]\n\t"
  171298. #elif defined(__clang__)
  171299. "adcs r4, %[r]\n\t"
  171300. #else
  171301. "adc r4, %[r]\n\t"
  171302. #endif
  171303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171304. "adds r2, r2, r5\n\t"
  171305. #else
  171306. "add r2, r2, r5\n\t"
  171307. #endif
  171308. #ifdef WOLFSSL_KEIL
  171309. "adcs r3, r3, r6\n\t"
  171310. #elif defined(__clang__)
  171311. "adcs r3, r6\n\t"
  171312. #else
  171313. "adc r3, r6\n\t"
  171314. #endif
  171315. #ifdef WOLFSSL_KEIL
  171316. "adcs r4, r4, %[r]\n\t"
  171317. #elif defined(__clang__)
  171318. "adcs r4, %[r]\n\t"
  171319. #else
  171320. "adc r4, %[r]\n\t"
  171321. #endif
  171322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171323. "lsrs r5, %[a], #16\n\t"
  171324. #else
  171325. "lsr r5, %[a], #16\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. #ifdef WOLFSSL_KEIL
  171333. "muls r6, r5, r6\n\t"
  171334. #elif defined(__clang__)
  171335. "muls r6, r5\n\t"
  171336. #else
  171337. "mul r6, r5\n\t"
  171338. #endif
  171339. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171340. "adds r3, r3, r6\n\t"
  171341. #else
  171342. "add r3, r3, r6\n\t"
  171343. #endif
  171344. #ifdef WOLFSSL_KEIL
  171345. "adcs r4, r4, %[r]\n\t"
  171346. #elif defined(__clang__)
  171347. "adcs r4, %[r]\n\t"
  171348. #else
  171349. "adc r4, %[r]\n\t"
  171350. #endif
  171351. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171352. "adds r3, r3, r6\n\t"
  171353. #else
  171354. "add r3, r3, r6\n\t"
  171355. #endif
  171356. #ifdef WOLFSSL_KEIL
  171357. "adcs r4, r4, %[r]\n\t"
  171358. #elif defined(__clang__)
  171359. "adcs r4, %[r]\n\t"
  171360. #else
  171361. "adc r4, %[r]\n\t"
  171362. #endif
  171363. "uxth r6, r7\n\t"
  171364. #ifdef WOLFSSL_KEIL
  171365. "muls r5, r6, r5\n\t"
  171366. #elif defined(__clang__)
  171367. "muls r5, r6\n\t"
  171368. #else
  171369. "mul r5, r6\n\t"
  171370. #endif
  171371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171372. "lsrs r6, r5, #16\n\t"
  171373. #else
  171374. "lsr r6, r5, #16\n\t"
  171375. #endif
  171376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171377. "lsls r5, r5, #16\n\t"
  171378. #else
  171379. "lsl r5, r5, #16\n\t"
  171380. #endif
  171381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171382. "adds r2, r2, r5\n\t"
  171383. #else
  171384. "add r2, r2, r5\n\t"
  171385. #endif
  171386. #ifdef WOLFSSL_KEIL
  171387. "adcs r3, r3, r6\n\t"
  171388. #elif defined(__clang__)
  171389. "adcs r3, r6\n\t"
  171390. #else
  171391. "adc r3, r6\n\t"
  171392. #endif
  171393. #ifdef WOLFSSL_KEIL
  171394. "adcs r4, r4, %[r]\n\t"
  171395. #elif defined(__clang__)
  171396. "adcs r4, %[r]\n\t"
  171397. #else
  171398. "adc r4, %[r]\n\t"
  171399. #endif
  171400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171401. "adds r2, r2, r5\n\t"
  171402. #else
  171403. "add r2, r2, r5\n\t"
  171404. #endif
  171405. #ifdef WOLFSSL_KEIL
  171406. "adcs r3, r3, r6\n\t"
  171407. #elif defined(__clang__)
  171408. "adcs r3, r6\n\t"
  171409. #else
  171410. "adc r3, r6\n\t"
  171411. #endif
  171412. #ifdef WOLFSSL_KEIL
  171413. "adcs r4, r4, %[r]\n\t"
  171414. #elif defined(__clang__)
  171415. "adcs r4, %[r]\n\t"
  171416. #else
  171417. "adc r4, %[r]\n\t"
  171418. #endif
  171419. "str r2, [sp, #12]\n\t"
  171420. "# A[4] * A[0]\n\t"
  171421. "movs r2, #0\n\t"
  171422. "mov %[a], r9\n\t"
  171423. "ldr %[a], [%[a], #16]\n\t"
  171424. "uxth r5, %[a]\n\t"
  171425. "uxth r6, r7\n\t"
  171426. #ifdef WOLFSSL_KEIL
  171427. "muls r6, r5, r6\n\t"
  171428. #elif defined(__clang__)
  171429. "muls r6, r5\n\t"
  171430. #else
  171431. "mul r6, r5\n\t"
  171432. #endif
  171433. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171434. "adds r3, r3, r6\n\t"
  171435. #else
  171436. "add r3, r3, r6\n\t"
  171437. #endif
  171438. #ifdef WOLFSSL_KEIL
  171439. "adcs r4, r4, %[r]\n\t"
  171440. #elif defined(__clang__)
  171441. "adcs r4, %[r]\n\t"
  171442. #else
  171443. "adc r4, %[r]\n\t"
  171444. #endif
  171445. #ifdef WOLFSSL_KEIL
  171446. "adcs r2, r2, %[r]\n\t"
  171447. #elif defined(__clang__)
  171448. "adcs r2, %[r]\n\t"
  171449. #else
  171450. "adc r2, %[r]\n\t"
  171451. #endif
  171452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171453. "adds r3, r3, r6\n\t"
  171454. #else
  171455. "add r3, r3, r6\n\t"
  171456. #endif
  171457. #ifdef WOLFSSL_KEIL
  171458. "adcs r4, r4, %[r]\n\t"
  171459. #elif defined(__clang__)
  171460. "adcs r4, %[r]\n\t"
  171461. #else
  171462. "adc r4, %[r]\n\t"
  171463. #endif
  171464. #ifdef WOLFSSL_KEIL
  171465. "adcs r2, r2, %[r]\n\t"
  171466. #elif defined(__clang__)
  171467. "adcs r2, %[r]\n\t"
  171468. #else
  171469. "adc r2, %[r]\n\t"
  171470. #endif
  171471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171472. "lsrs r6, r7, #16\n\t"
  171473. #else
  171474. "lsr r6, r7, #16\n\t"
  171475. #endif
  171476. #ifdef WOLFSSL_KEIL
  171477. "muls r5, r6, r5\n\t"
  171478. #elif defined(__clang__)
  171479. "muls r5, r6\n\t"
  171480. #else
  171481. "mul r5, r6\n\t"
  171482. #endif
  171483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171484. "lsrs r6, r5, #16\n\t"
  171485. #else
  171486. "lsr r6, r5, #16\n\t"
  171487. #endif
  171488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171489. "lsls r5, r5, #16\n\t"
  171490. #else
  171491. "lsl r5, r5, #16\n\t"
  171492. #endif
  171493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171494. "adds r3, r3, r5\n\t"
  171495. #else
  171496. "add r3, r3, r5\n\t"
  171497. #endif
  171498. #ifdef WOLFSSL_KEIL
  171499. "adcs r4, r4, r6\n\t"
  171500. #elif defined(__clang__)
  171501. "adcs r4, r6\n\t"
  171502. #else
  171503. "adc r4, r6\n\t"
  171504. #endif
  171505. #ifdef WOLFSSL_KEIL
  171506. "adcs r2, r2, %[r]\n\t"
  171507. #elif defined(__clang__)
  171508. "adcs r2, %[r]\n\t"
  171509. #else
  171510. "adc r2, %[r]\n\t"
  171511. #endif
  171512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171513. "adds r3, r3, r5\n\t"
  171514. #else
  171515. "add r3, r3, r5\n\t"
  171516. #endif
  171517. #ifdef WOLFSSL_KEIL
  171518. "adcs r4, r4, r6\n\t"
  171519. #elif defined(__clang__)
  171520. "adcs r4, r6\n\t"
  171521. #else
  171522. "adc r4, r6\n\t"
  171523. #endif
  171524. #ifdef WOLFSSL_KEIL
  171525. "adcs r2, r2, %[r]\n\t"
  171526. #elif defined(__clang__)
  171527. "adcs r2, %[r]\n\t"
  171528. #else
  171529. "adc r2, %[r]\n\t"
  171530. #endif
  171531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171532. "lsrs r5, %[a], #16\n\t"
  171533. #else
  171534. "lsr r5, %[a], #16\n\t"
  171535. #endif
  171536. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171537. "lsrs r6, r7, #16\n\t"
  171538. #else
  171539. "lsr r6, r7, #16\n\t"
  171540. #endif
  171541. #ifdef WOLFSSL_KEIL
  171542. "muls r6, r5, r6\n\t"
  171543. #elif defined(__clang__)
  171544. "muls r6, r5\n\t"
  171545. #else
  171546. "mul r6, r5\n\t"
  171547. #endif
  171548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171549. "adds r4, r4, r6\n\t"
  171550. #else
  171551. "add r4, r4, r6\n\t"
  171552. #endif
  171553. #ifdef WOLFSSL_KEIL
  171554. "adcs r2, r2, %[r]\n\t"
  171555. #elif defined(__clang__)
  171556. "adcs r2, %[r]\n\t"
  171557. #else
  171558. "adc r2, %[r]\n\t"
  171559. #endif
  171560. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171561. "adds r4, r4, r6\n\t"
  171562. #else
  171563. "add r4, r4, r6\n\t"
  171564. #endif
  171565. #ifdef WOLFSSL_KEIL
  171566. "adcs r2, r2, %[r]\n\t"
  171567. #elif defined(__clang__)
  171568. "adcs r2, %[r]\n\t"
  171569. #else
  171570. "adc r2, %[r]\n\t"
  171571. #endif
  171572. "uxth r6, r7\n\t"
  171573. #ifdef WOLFSSL_KEIL
  171574. "muls r5, r6, r5\n\t"
  171575. #elif defined(__clang__)
  171576. "muls r5, r6\n\t"
  171577. #else
  171578. "mul r5, r6\n\t"
  171579. #endif
  171580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171581. "lsrs r6, r5, #16\n\t"
  171582. #else
  171583. "lsr r6, r5, #16\n\t"
  171584. #endif
  171585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171586. "lsls r5, r5, #16\n\t"
  171587. #else
  171588. "lsl r5, r5, #16\n\t"
  171589. #endif
  171590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171591. "adds r3, r3, r5\n\t"
  171592. #else
  171593. "add r3, r3, r5\n\t"
  171594. #endif
  171595. #ifdef WOLFSSL_KEIL
  171596. "adcs r4, r4, r6\n\t"
  171597. #elif defined(__clang__)
  171598. "adcs r4, r6\n\t"
  171599. #else
  171600. "adc r4, r6\n\t"
  171601. #endif
  171602. #ifdef WOLFSSL_KEIL
  171603. "adcs r2, r2, %[r]\n\t"
  171604. #elif defined(__clang__)
  171605. "adcs r2, %[r]\n\t"
  171606. #else
  171607. "adc r2, %[r]\n\t"
  171608. #endif
  171609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171610. "adds r3, r3, r5\n\t"
  171611. #else
  171612. "add r3, r3, r5\n\t"
  171613. #endif
  171614. #ifdef WOLFSSL_KEIL
  171615. "adcs r4, r4, r6\n\t"
  171616. #elif defined(__clang__)
  171617. "adcs r4, r6\n\t"
  171618. #else
  171619. "adc r4, r6\n\t"
  171620. #endif
  171621. #ifdef WOLFSSL_KEIL
  171622. "adcs r2, r2, %[r]\n\t"
  171623. #elif defined(__clang__)
  171624. "adcs r2, %[r]\n\t"
  171625. #else
  171626. "adc r2, %[r]\n\t"
  171627. #endif
  171628. "# A[3] * A[1]\n\t"
  171629. "mov %[a], r9\n\t"
  171630. "mov r7, r11\n\t"
  171631. "mov %[a], lr\n\t"
  171632. "uxth r5, %[a]\n\t"
  171633. "uxth r6, r7\n\t"
  171634. #ifdef WOLFSSL_KEIL
  171635. "muls r6, r5, r6\n\t"
  171636. #elif defined(__clang__)
  171637. "muls r6, r5\n\t"
  171638. #else
  171639. "mul r6, r5\n\t"
  171640. #endif
  171641. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171642. "adds r3, r3, r6\n\t"
  171643. #else
  171644. "add r3, r3, r6\n\t"
  171645. #endif
  171646. #ifdef WOLFSSL_KEIL
  171647. "adcs r4, r4, %[r]\n\t"
  171648. #elif defined(__clang__)
  171649. "adcs r4, %[r]\n\t"
  171650. #else
  171651. "adc r4, %[r]\n\t"
  171652. #endif
  171653. #ifdef WOLFSSL_KEIL
  171654. "adcs r2, r2, %[r]\n\t"
  171655. #elif defined(__clang__)
  171656. "adcs r2, %[r]\n\t"
  171657. #else
  171658. "adc r2, %[r]\n\t"
  171659. #endif
  171660. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171661. "adds r3, r3, r6\n\t"
  171662. #else
  171663. "add r3, r3, r6\n\t"
  171664. #endif
  171665. #ifdef WOLFSSL_KEIL
  171666. "adcs r4, r4, %[r]\n\t"
  171667. #elif defined(__clang__)
  171668. "adcs r4, %[r]\n\t"
  171669. #else
  171670. "adc r4, %[r]\n\t"
  171671. #endif
  171672. #ifdef WOLFSSL_KEIL
  171673. "adcs r2, r2, %[r]\n\t"
  171674. #elif defined(__clang__)
  171675. "adcs r2, %[r]\n\t"
  171676. #else
  171677. "adc r2, %[r]\n\t"
  171678. #endif
  171679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171680. "lsrs r6, r7, #16\n\t"
  171681. #else
  171682. "lsr r6, r7, #16\n\t"
  171683. #endif
  171684. #ifdef WOLFSSL_KEIL
  171685. "muls r5, r6, r5\n\t"
  171686. #elif defined(__clang__)
  171687. "muls r5, r6\n\t"
  171688. #else
  171689. "mul r5, r6\n\t"
  171690. #endif
  171691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171692. "lsrs r6, r5, #16\n\t"
  171693. #else
  171694. "lsr r6, r5, #16\n\t"
  171695. #endif
  171696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171697. "lsls r5, r5, #16\n\t"
  171698. #else
  171699. "lsl r5, r5, #16\n\t"
  171700. #endif
  171701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171702. "adds r3, r3, r5\n\t"
  171703. #else
  171704. "add r3, r3, r5\n\t"
  171705. #endif
  171706. #ifdef WOLFSSL_KEIL
  171707. "adcs r4, r4, r6\n\t"
  171708. #elif defined(__clang__)
  171709. "adcs r4, r6\n\t"
  171710. #else
  171711. "adc r4, r6\n\t"
  171712. #endif
  171713. #ifdef WOLFSSL_KEIL
  171714. "adcs r2, r2, %[r]\n\t"
  171715. #elif defined(__clang__)
  171716. "adcs r2, %[r]\n\t"
  171717. #else
  171718. "adc r2, %[r]\n\t"
  171719. #endif
  171720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171721. "adds r3, r3, r5\n\t"
  171722. #else
  171723. "add r3, r3, r5\n\t"
  171724. #endif
  171725. #ifdef WOLFSSL_KEIL
  171726. "adcs r4, r4, r6\n\t"
  171727. #elif defined(__clang__)
  171728. "adcs r4, r6\n\t"
  171729. #else
  171730. "adc r4, r6\n\t"
  171731. #endif
  171732. #ifdef WOLFSSL_KEIL
  171733. "adcs r2, r2, %[r]\n\t"
  171734. #elif defined(__clang__)
  171735. "adcs r2, %[r]\n\t"
  171736. #else
  171737. "adc r2, %[r]\n\t"
  171738. #endif
  171739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171740. "lsrs r5, %[a], #16\n\t"
  171741. #else
  171742. "lsr r5, %[a], #16\n\t"
  171743. #endif
  171744. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171745. "lsrs r6, r7, #16\n\t"
  171746. #else
  171747. "lsr r6, r7, #16\n\t"
  171748. #endif
  171749. #ifdef WOLFSSL_KEIL
  171750. "muls r6, r5, r6\n\t"
  171751. #elif defined(__clang__)
  171752. "muls r6, r5\n\t"
  171753. #else
  171754. "mul r6, r5\n\t"
  171755. #endif
  171756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171757. "adds r4, r4, r6\n\t"
  171758. #else
  171759. "add r4, r4, r6\n\t"
  171760. #endif
  171761. #ifdef WOLFSSL_KEIL
  171762. "adcs r2, r2, %[r]\n\t"
  171763. #elif defined(__clang__)
  171764. "adcs r2, %[r]\n\t"
  171765. #else
  171766. "adc r2, %[r]\n\t"
  171767. #endif
  171768. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171769. "adds r4, r4, r6\n\t"
  171770. #else
  171771. "add r4, r4, r6\n\t"
  171772. #endif
  171773. #ifdef WOLFSSL_KEIL
  171774. "adcs r2, r2, %[r]\n\t"
  171775. #elif defined(__clang__)
  171776. "adcs r2, %[r]\n\t"
  171777. #else
  171778. "adc r2, %[r]\n\t"
  171779. #endif
  171780. "uxth r6, r7\n\t"
  171781. #ifdef WOLFSSL_KEIL
  171782. "muls r5, r6, r5\n\t"
  171783. #elif defined(__clang__)
  171784. "muls r5, r6\n\t"
  171785. #else
  171786. "mul r5, r6\n\t"
  171787. #endif
  171788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171789. "lsrs r6, r5, #16\n\t"
  171790. #else
  171791. "lsr r6, r5, #16\n\t"
  171792. #endif
  171793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171794. "lsls r5, r5, #16\n\t"
  171795. #else
  171796. "lsl r5, r5, #16\n\t"
  171797. #endif
  171798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171799. "adds r3, r3, r5\n\t"
  171800. #else
  171801. "add r3, r3, r5\n\t"
  171802. #endif
  171803. #ifdef WOLFSSL_KEIL
  171804. "adcs r4, r4, r6\n\t"
  171805. #elif defined(__clang__)
  171806. "adcs r4, r6\n\t"
  171807. #else
  171808. "adc r4, r6\n\t"
  171809. #endif
  171810. #ifdef WOLFSSL_KEIL
  171811. "adcs r2, r2, %[r]\n\t"
  171812. #elif defined(__clang__)
  171813. "adcs r2, %[r]\n\t"
  171814. #else
  171815. "adc r2, %[r]\n\t"
  171816. #endif
  171817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171818. "adds r3, r3, r5\n\t"
  171819. #else
  171820. "add r3, r3, r5\n\t"
  171821. #endif
  171822. #ifdef WOLFSSL_KEIL
  171823. "adcs r4, r4, r6\n\t"
  171824. #elif defined(__clang__)
  171825. "adcs r4, r6\n\t"
  171826. #else
  171827. "adc r4, r6\n\t"
  171828. #endif
  171829. #ifdef WOLFSSL_KEIL
  171830. "adcs r2, r2, %[r]\n\t"
  171831. #elif defined(__clang__)
  171832. "adcs r2, %[r]\n\t"
  171833. #else
  171834. "adc r2, %[r]\n\t"
  171835. #endif
  171836. "# A[2] * A[2]\n\t"
  171837. "mov r7, r12\n\t"
  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. "uxth r5, r7\n\t"
  171844. #ifdef WOLFSSL_KEIL
  171845. "muls r5, r5, r5\n\t"
  171846. #elif defined(__clang__)
  171847. "muls r5, r5\n\t"
  171848. #else
  171849. "mul r5, r5\n\t"
  171850. #endif
  171851. #ifdef WOLFSSL_KEIL
  171852. "muls r6, r6, r6\n\t"
  171853. #elif defined(__clang__)
  171854. "muls r6, r6\n\t"
  171855. #else
  171856. "mul r6, r6\n\t"
  171857. #endif
  171858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171859. "adds r3, r3, r5\n\t"
  171860. #else
  171861. "add r3, r3, r5\n\t"
  171862. #endif
  171863. #ifdef WOLFSSL_KEIL
  171864. "adcs r4, r4, r6\n\t"
  171865. #elif defined(__clang__)
  171866. "adcs r4, r6\n\t"
  171867. #else
  171868. "adc r4, r6\n\t"
  171869. #endif
  171870. #ifdef WOLFSSL_KEIL
  171871. "adcs r2, r2, %[r]\n\t"
  171872. #elif defined(__clang__)
  171873. "adcs r2, %[r]\n\t"
  171874. #else
  171875. "adc r2, %[r]\n\t"
  171876. #endif
  171877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171878. "lsrs r6, r7, #16\n\t"
  171879. #else
  171880. "lsr r6, r7, #16\n\t"
  171881. #endif
  171882. "uxth r5, r7\n\t"
  171883. #ifdef WOLFSSL_KEIL
  171884. "muls r5, r6, r5\n\t"
  171885. #elif defined(__clang__)
  171886. "muls r5, r6\n\t"
  171887. #else
  171888. "mul r5, r6\n\t"
  171889. #endif
  171890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171891. "lsrs r6, r5, #15\n\t"
  171892. #else
  171893. "lsr r6, r5, #15\n\t"
  171894. #endif
  171895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171896. "lsls r5, r5, #17\n\t"
  171897. #else
  171898. "lsl r5, r5, #17\n\t"
  171899. #endif
  171900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171901. "adds r3, r3, r5\n\t"
  171902. #else
  171903. "add r3, r3, r5\n\t"
  171904. #endif
  171905. #ifdef WOLFSSL_KEIL
  171906. "adcs r4, r4, r6\n\t"
  171907. #elif defined(__clang__)
  171908. "adcs r4, r6\n\t"
  171909. #else
  171910. "adc r4, r6\n\t"
  171911. #endif
  171912. #ifdef WOLFSSL_KEIL
  171913. "adcs r2, r2, %[r]\n\t"
  171914. #elif defined(__clang__)
  171915. "adcs r2, %[r]\n\t"
  171916. #else
  171917. "adc r2, %[r]\n\t"
  171918. #endif
  171919. "str r3, [sp, #16]\n\t"
  171920. "# A[3] * A[2]\n\t"
  171921. "movs r3, #0\n\t"
  171922. "mov %[a], r9\n\t"
  171923. "mov %[a], lr\n\t"
  171924. "uxth r5, %[a]\n\t"
  171925. "uxth r6, r7\n\t"
  171926. #ifdef WOLFSSL_KEIL
  171927. "muls r6, r5, r6\n\t"
  171928. #elif defined(__clang__)
  171929. "muls r6, r5\n\t"
  171930. #else
  171931. "mul r6, r5\n\t"
  171932. #endif
  171933. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171934. "adds r4, r4, r6\n\t"
  171935. #else
  171936. "add r4, r4, r6\n\t"
  171937. #endif
  171938. #ifdef WOLFSSL_KEIL
  171939. "adcs r2, r2, %[r]\n\t"
  171940. #elif defined(__clang__)
  171941. "adcs r2, %[r]\n\t"
  171942. #else
  171943. "adc r2, %[r]\n\t"
  171944. #endif
  171945. #ifdef WOLFSSL_KEIL
  171946. "adcs r3, r3, %[r]\n\t"
  171947. #elif defined(__clang__)
  171948. "adcs r3, %[r]\n\t"
  171949. #else
  171950. "adc r3, %[r]\n\t"
  171951. #endif
  171952. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171953. "adds r4, r4, r6\n\t"
  171954. #else
  171955. "add r4, r4, r6\n\t"
  171956. #endif
  171957. #ifdef WOLFSSL_KEIL
  171958. "adcs r2, r2, %[r]\n\t"
  171959. #elif defined(__clang__)
  171960. "adcs r2, %[r]\n\t"
  171961. #else
  171962. "adc r2, %[r]\n\t"
  171963. #endif
  171964. #ifdef WOLFSSL_KEIL
  171965. "adcs r3, r3, %[r]\n\t"
  171966. #elif defined(__clang__)
  171967. "adcs r3, %[r]\n\t"
  171968. #else
  171969. "adc r3, %[r]\n\t"
  171970. #endif
  171971. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171972. "lsrs r6, r7, #16\n\t"
  171973. #else
  171974. "lsr r6, r7, #16\n\t"
  171975. #endif
  171976. #ifdef WOLFSSL_KEIL
  171977. "muls r5, r6, r5\n\t"
  171978. #elif defined(__clang__)
  171979. "muls r5, r6\n\t"
  171980. #else
  171981. "mul r5, r6\n\t"
  171982. #endif
  171983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171984. "lsrs r6, r5, #16\n\t"
  171985. #else
  171986. "lsr r6, r5, #16\n\t"
  171987. #endif
  171988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171989. "lsls r5, r5, #16\n\t"
  171990. #else
  171991. "lsl r5, r5, #16\n\t"
  171992. #endif
  171993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  171994. "adds r4, r4, r5\n\t"
  171995. #else
  171996. "add r4, r4, r5\n\t"
  171997. #endif
  171998. #ifdef WOLFSSL_KEIL
  171999. "adcs r2, r2, r6\n\t"
  172000. #elif defined(__clang__)
  172001. "adcs r2, r6\n\t"
  172002. #else
  172003. "adc r2, r6\n\t"
  172004. #endif
  172005. #ifdef WOLFSSL_KEIL
  172006. "adcs r3, r3, %[r]\n\t"
  172007. #elif defined(__clang__)
  172008. "adcs r3, %[r]\n\t"
  172009. #else
  172010. "adc r3, %[r]\n\t"
  172011. #endif
  172012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172013. "adds r4, r4, r5\n\t"
  172014. #else
  172015. "add r4, r4, r5\n\t"
  172016. #endif
  172017. #ifdef WOLFSSL_KEIL
  172018. "adcs r2, r2, r6\n\t"
  172019. #elif defined(__clang__)
  172020. "adcs r2, r6\n\t"
  172021. #else
  172022. "adc r2, r6\n\t"
  172023. #endif
  172024. #ifdef WOLFSSL_KEIL
  172025. "adcs r3, r3, %[r]\n\t"
  172026. #elif defined(__clang__)
  172027. "adcs r3, %[r]\n\t"
  172028. #else
  172029. "adc r3, %[r]\n\t"
  172030. #endif
  172031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172032. "lsrs r5, %[a], #16\n\t"
  172033. #else
  172034. "lsr r5, %[a], #16\n\t"
  172035. #endif
  172036. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172037. "lsrs r6, r7, #16\n\t"
  172038. #else
  172039. "lsr r6, r7, #16\n\t"
  172040. #endif
  172041. #ifdef WOLFSSL_KEIL
  172042. "muls r6, r5, r6\n\t"
  172043. #elif defined(__clang__)
  172044. "muls r6, r5\n\t"
  172045. #else
  172046. "mul r6, r5\n\t"
  172047. #endif
  172048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172049. "adds r2, r2, r6\n\t"
  172050. #else
  172051. "add r2, r2, r6\n\t"
  172052. #endif
  172053. #ifdef WOLFSSL_KEIL
  172054. "adcs r3, r3, %[r]\n\t"
  172055. #elif defined(__clang__)
  172056. "adcs r3, %[r]\n\t"
  172057. #else
  172058. "adc r3, %[r]\n\t"
  172059. #endif
  172060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172061. "adds r2, r2, r6\n\t"
  172062. #else
  172063. "add r2, r2, r6\n\t"
  172064. #endif
  172065. #ifdef WOLFSSL_KEIL
  172066. "adcs r3, r3, %[r]\n\t"
  172067. #elif defined(__clang__)
  172068. "adcs r3, %[r]\n\t"
  172069. #else
  172070. "adc r3, %[r]\n\t"
  172071. #endif
  172072. "uxth r6, r7\n\t"
  172073. #ifdef WOLFSSL_KEIL
  172074. "muls r5, r6, r5\n\t"
  172075. #elif defined(__clang__)
  172076. "muls r5, r6\n\t"
  172077. #else
  172078. "mul r5, r6\n\t"
  172079. #endif
  172080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172081. "lsrs r6, r5, #16\n\t"
  172082. #else
  172083. "lsr r6, r5, #16\n\t"
  172084. #endif
  172085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172086. "lsls r5, r5, #16\n\t"
  172087. #else
  172088. "lsl r5, r5, #16\n\t"
  172089. #endif
  172090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172091. "adds r4, r4, r5\n\t"
  172092. #else
  172093. "add r4, r4, r5\n\t"
  172094. #endif
  172095. #ifdef WOLFSSL_KEIL
  172096. "adcs r2, r2, r6\n\t"
  172097. #elif defined(__clang__)
  172098. "adcs r2, r6\n\t"
  172099. #else
  172100. "adc r2, r6\n\t"
  172101. #endif
  172102. #ifdef WOLFSSL_KEIL
  172103. "adcs r3, r3, %[r]\n\t"
  172104. #elif defined(__clang__)
  172105. "adcs r3, %[r]\n\t"
  172106. #else
  172107. "adc r3, %[r]\n\t"
  172108. #endif
  172109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172110. "adds r4, r4, r5\n\t"
  172111. #else
  172112. "add r4, r4, r5\n\t"
  172113. #endif
  172114. #ifdef WOLFSSL_KEIL
  172115. "adcs r2, r2, r6\n\t"
  172116. #elif defined(__clang__)
  172117. "adcs r2, r6\n\t"
  172118. #else
  172119. "adc r2, r6\n\t"
  172120. #endif
  172121. #ifdef WOLFSSL_KEIL
  172122. "adcs r3, r3, %[r]\n\t"
  172123. #elif defined(__clang__)
  172124. "adcs r3, %[r]\n\t"
  172125. #else
  172126. "adc r3, %[r]\n\t"
  172127. #endif
  172128. "# A[4] * A[1]\n\t"
  172129. "mov %[a], r9\n\t"
  172130. "mov r7, r11\n\t"
  172131. "ldr %[a], [%[a], #16]\n\t"
  172132. "uxth r5, %[a]\n\t"
  172133. "uxth r6, r7\n\t"
  172134. #ifdef WOLFSSL_KEIL
  172135. "muls r6, r5, r6\n\t"
  172136. #elif defined(__clang__)
  172137. "muls r6, r5\n\t"
  172138. #else
  172139. "mul r6, r5\n\t"
  172140. #endif
  172141. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172142. "adds r4, r4, r6\n\t"
  172143. #else
  172144. "add r4, r4, r6\n\t"
  172145. #endif
  172146. #ifdef WOLFSSL_KEIL
  172147. "adcs r2, r2, %[r]\n\t"
  172148. #elif defined(__clang__)
  172149. "adcs r2, %[r]\n\t"
  172150. #else
  172151. "adc r2, %[r]\n\t"
  172152. #endif
  172153. #ifdef WOLFSSL_KEIL
  172154. "adcs r3, r3, %[r]\n\t"
  172155. #elif defined(__clang__)
  172156. "adcs r3, %[r]\n\t"
  172157. #else
  172158. "adc r3, %[r]\n\t"
  172159. #endif
  172160. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172161. "adds r4, r4, r6\n\t"
  172162. #else
  172163. "add r4, r4, r6\n\t"
  172164. #endif
  172165. #ifdef WOLFSSL_KEIL
  172166. "adcs r2, r2, %[r]\n\t"
  172167. #elif defined(__clang__)
  172168. "adcs r2, %[r]\n\t"
  172169. #else
  172170. "adc r2, %[r]\n\t"
  172171. #endif
  172172. #ifdef WOLFSSL_KEIL
  172173. "adcs r3, r3, %[r]\n\t"
  172174. #elif defined(__clang__)
  172175. "adcs r3, %[r]\n\t"
  172176. #else
  172177. "adc r3, %[r]\n\t"
  172178. #endif
  172179. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172180. "lsrs r6, r7, #16\n\t"
  172181. #else
  172182. "lsr r6, r7, #16\n\t"
  172183. #endif
  172184. #ifdef WOLFSSL_KEIL
  172185. "muls r5, r6, r5\n\t"
  172186. #elif defined(__clang__)
  172187. "muls r5, r6\n\t"
  172188. #else
  172189. "mul r5, r6\n\t"
  172190. #endif
  172191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172192. "lsrs r6, r5, #16\n\t"
  172193. #else
  172194. "lsr r6, r5, #16\n\t"
  172195. #endif
  172196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172197. "lsls r5, r5, #16\n\t"
  172198. #else
  172199. "lsl r5, r5, #16\n\t"
  172200. #endif
  172201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172202. "adds r4, r4, r5\n\t"
  172203. #else
  172204. "add r4, r4, r5\n\t"
  172205. #endif
  172206. #ifdef WOLFSSL_KEIL
  172207. "adcs r2, r2, r6\n\t"
  172208. #elif defined(__clang__)
  172209. "adcs r2, r6\n\t"
  172210. #else
  172211. "adc r2, r6\n\t"
  172212. #endif
  172213. #ifdef WOLFSSL_KEIL
  172214. "adcs r3, r3, %[r]\n\t"
  172215. #elif defined(__clang__)
  172216. "adcs r3, %[r]\n\t"
  172217. #else
  172218. "adc r3, %[r]\n\t"
  172219. #endif
  172220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172221. "adds r4, r4, r5\n\t"
  172222. #else
  172223. "add r4, r4, r5\n\t"
  172224. #endif
  172225. #ifdef WOLFSSL_KEIL
  172226. "adcs r2, r2, r6\n\t"
  172227. #elif defined(__clang__)
  172228. "adcs r2, r6\n\t"
  172229. #else
  172230. "adc r2, r6\n\t"
  172231. #endif
  172232. #ifdef WOLFSSL_KEIL
  172233. "adcs r3, r3, %[r]\n\t"
  172234. #elif defined(__clang__)
  172235. "adcs r3, %[r]\n\t"
  172236. #else
  172237. "adc r3, %[r]\n\t"
  172238. #endif
  172239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172240. "lsrs r5, %[a], #16\n\t"
  172241. #else
  172242. "lsr r5, %[a], #16\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. #ifdef WOLFSSL_KEIL
  172250. "muls r6, r5, r6\n\t"
  172251. #elif defined(__clang__)
  172252. "muls r6, r5\n\t"
  172253. #else
  172254. "mul r6, r5\n\t"
  172255. #endif
  172256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172257. "adds r2, r2, r6\n\t"
  172258. #else
  172259. "add r2, r2, r6\n\t"
  172260. #endif
  172261. #ifdef WOLFSSL_KEIL
  172262. "adcs r3, r3, %[r]\n\t"
  172263. #elif defined(__clang__)
  172264. "adcs r3, %[r]\n\t"
  172265. #else
  172266. "adc r3, %[r]\n\t"
  172267. #endif
  172268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172269. "adds r2, r2, r6\n\t"
  172270. #else
  172271. "add r2, r2, r6\n\t"
  172272. #endif
  172273. #ifdef WOLFSSL_KEIL
  172274. "adcs r3, r3, %[r]\n\t"
  172275. #elif defined(__clang__)
  172276. "adcs r3, %[r]\n\t"
  172277. #else
  172278. "adc r3, %[r]\n\t"
  172279. #endif
  172280. "uxth r6, r7\n\t"
  172281. #ifdef WOLFSSL_KEIL
  172282. "muls r5, r6, r5\n\t"
  172283. #elif defined(__clang__)
  172284. "muls r5, r6\n\t"
  172285. #else
  172286. "mul r5, r6\n\t"
  172287. #endif
  172288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172289. "lsrs r6, r5, #16\n\t"
  172290. #else
  172291. "lsr r6, r5, #16\n\t"
  172292. #endif
  172293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172294. "lsls r5, r5, #16\n\t"
  172295. #else
  172296. "lsl r5, r5, #16\n\t"
  172297. #endif
  172298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172299. "adds r4, r4, r5\n\t"
  172300. #else
  172301. "add r4, r4, r5\n\t"
  172302. #endif
  172303. #ifdef WOLFSSL_KEIL
  172304. "adcs r2, r2, r6\n\t"
  172305. #elif defined(__clang__)
  172306. "adcs r2, r6\n\t"
  172307. #else
  172308. "adc r2, r6\n\t"
  172309. #endif
  172310. #ifdef WOLFSSL_KEIL
  172311. "adcs r3, r3, %[r]\n\t"
  172312. #elif defined(__clang__)
  172313. "adcs r3, %[r]\n\t"
  172314. #else
  172315. "adc r3, %[r]\n\t"
  172316. #endif
  172317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172318. "adds r4, r4, r5\n\t"
  172319. #else
  172320. "add r4, r4, r5\n\t"
  172321. #endif
  172322. #ifdef WOLFSSL_KEIL
  172323. "adcs r2, r2, r6\n\t"
  172324. #elif defined(__clang__)
  172325. "adcs r2, r6\n\t"
  172326. #else
  172327. "adc r2, r6\n\t"
  172328. #endif
  172329. #ifdef WOLFSSL_KEIL
  172330. "adcs r3, r3, %[r]\n\t"
  172331. #elif defined(__clang__)
  172332. "adcs r3, %[r]\n\t"
  172333. #else
  172334. "adc r3, %[r]\n\t"
  172335. #endif
  172336. "# A[5] * A[0]\n\t"
  172337. "mov %[a], r9\n\t"
  172338. "mov r7, r10\n\t"
  172339. "ldr %[a], [%[a], #20]\n\t"
  172340. "uxth r5, %[a]\n\t"
  172341. "uxth r6, r7\n\t"
  172342. #ifdef WOLFSSL_KEIL
  172343. "muls r6, r5, r6\n\t"
  172344. #elif defined(__clang__)
  172345. "muls r6, r5\n\t"
  172346. #else
  172347. "mul r6, r5\n\t"
  172348. #endif
  172349. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172350. "adds r4, r4, r6\n\t"
  172351. #else
  172352. "add r4, r4, r6\n\t"
  172353. #endif
  172354. #ifdef WOLFSSL_KEIL
  172355. "adcs r2, r2, %[r]\n\t"
  172356. #elif defined(__clang__)
  172357. "adcs r2, %[r]\n\t"
  172358. #else
  172359. "adc r2, %[r]\n\t"
  172360. #endif
  172361. #ifdef WOLFSSL_KEIL
  172362. "adcs r3, r3, %[r]\n\t"
  172363. #elif defined(__clang__)
  172364. "adcs r3, %[r]\n\t"
  172365. #else
  172366. "adc r3, %[r]\n\t"
  172367. #endif
  172368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172369. "adds r4, r4, r6\n\t"
  172370. #else
  172371. "add r4, r4, r6\n\t"
  172372. #endif
  172373. #ifdef WOLFSSL_KEIL
  172374. "adcs r2, r2, %[r]\n\t"
  172375. #elif defined(__clang__)
  172376. "adcs r2, %[r]\n\t"
  172377. #else
  172378. "adc r2, %[r]\n\t"
  172379. #endif
  172380. #ifdef WOLFSSL_KEIL
  172381. "adcs r3, r3, %[r]\n\t"
  172382. #elif defined(__clang__)
  172383. "adcs r3, %[r]\n\t"
  172384. #else
  172385. "adc r3, %[r]\n\t"
  172386. #endif
  172387. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172388. "lsrs r6, r7, #16\n\t"
  172389. #else
  172390. "lsr r6, r7, #16\n\t"
  172391. #endif
  172392. #ifdef WOLFSSL_KEIL
  172393. "muls r5, r6, r5\n\t"
  172394. #elif defined(__clang__)
  172395. "muls r5, r6\n\t"
  172396. #else
  172397. "mul r5, r6\n\t"
  172398. #endif
  172399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172400. "lsrs r6, r5, #16\n\t"
  172401. #else
  172402. "lsr r6, r5, #16\n\t"
  172403. #endif
  172404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172405. "lsls r5, r5, #16\n\t"
  172406. #else
  172407. "lsl r5, r5, #16\n\t"
  172408. #endif
  172409. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172410. "adds r4, r4, r5\n\t"
  172411. #else
  172412. "add r4, r4, r5\n\t"
  172413. #endif
  172414. #ifdef WOLFSSL_KEIL
  172415. "adcs r2, r2, r6\n\t"
  172416. #elif defined(__clang__)
  172417. "adcs r2, r6\n\t"
  172418. #else
  172419. "adc r2, r6\n\t"
  172420. #endif
  172421. #ifdef WOLFSSL_KEIL
  172422. "adcs r3, r3, %[r]\n\t"
  172423. #elif defined(__clang__)
  172424. "adcs r3, %[r]\n\t"
  172425. #else
  172426. "adc r3, %[r]\n\t"
  172427. #endif
  172428. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172429. "adds r4, r4, r5\n\t"
  172430. #else
  172431. "add r4, r4, r5\n\t"
  172432. #endif
  172433. #ifdef WOLFSSL_KEIL
  172434. "adcs r2, r2, r6\n\t"
  172435. #elif defined(__clang__)
  172436. "adcs r2, r6\n\t"
  172437. #else
  172438. "adc r2, r6\n\t"
  172439. #endif
  172440. #ifdef WOLFSSL_KEIL
  172441. "adcs r3, r3, %[r]\n\t"
  172442. #elif defined(__clang__)
  172443. "adcs r3, %[r]\n\t"
  172444. #else
  172445. "adc r3, %[r]\n\t"
  172446. #endif
  172447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172448. "lsrs r5, %[a], #16\n\t"
  172449. #else
  172450. "lsr r5, %[a], #16\n\t"
  172451. #endif
  172452. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172453. "lsrs r6, r7, #16\n\t"
  172454. #else
  172455. "lsr r6, r7, #16\n\t"
  172456. #endif
  172457. #ifdef WOLFSSL_KEIL
  172458. "muls r6, r5, r6\n\t"
  172459. #elif defined(__clang__)
  172460. "muls r6, r5\n\t"
  172461. #else
  172462. "mul r6, r5\n\t"
  172463. #endif
  172464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172465. "adds r2, r2, r6\n\t"
  172466. #else
  172467. "add r2, 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 r2, r2, r6\n\t"
  172478. #else
  172479. "add r2, r2, r6\n\t"
  172480. #endif
  172481. #ifdef WOLFSSL_KEIL
  172482. "adcs r3, r3, %[r]\n\t"
  172483. #elif defined(__clang__)
  172484. "adcs r3, %[r]\n\t"
  172485. #else
  172486. "adc r3, %[r]\n\t"
  172487. #endif
  172488. "uxth r6, r7\n\t"
  172489. #ifdef WOLFSSL_KEIL
  172490. "muls r5, r6, r5\n\t"
  172491. #elif defined(__clang__)
  172492. "muls r5, r6\n\t"
  172493. #else
  172494. "mul r5, r6\n\t"
  172495. #endif
  172496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172497. "lsrs r6, r5, #16\n\t"
  172498. #else
  172499. "lsr r6, r5, #16\n\t"
  172500. #endif
  172501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172502. "lsls r5, r5, #16\n\t"
  172503. #else
  172504. "lsl r5, r5, #16\n\t"
  172505. #endif
  172506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172507. "adds r4, r4, r5\n\t"
  172508. #else
  172509. "add r4, r4, r5\n\t"
  172510. #endif
  172511. #ifdef WOLFSSL_KEIL
  172512. "adcs r2, r2, r6\n\t"
  172513. #elif defined(__clang__)
  172514. "adcs r2, r6\n\t"
  172515. #else
  172516. "adc r2, r6\n\t"
  172517. #endif
  172518. #ifdef WOLFSSL_KEIL
  172519. "adcs r3, r3, %[r]\n\t"
  172520. #elif defined(__clang__)
  172521. "adcs r3, %[r]\n\t"
  172522. #else
  172523. "adc r3, %[r]\n\t"
  172524. #endif
  172525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172526. "adds r4, r4, r5\n\t"
  172527. #else
  172528. "add r4, r4, r5\n\t"
  172529. #endif
  172530. #ifdef WOLFSSL_KEIL
  172531. "adcs r2, r2, r6\n\t"
  172532. #elif defined(__clang__)
  172533. "adcs r2, r6\n\t"
  172534. #else
  172535. "adc r2, r6\n\t"
  172536. #endif
  172537. #ifdef WOLFSSL_KEIL
  172538. "adcs r3, r3, %[r]\n\t"
  172539. #elif defined(__clang__)
  172540. "adcs r3, %[r]\n\t"
  172541. #else
  172542. "adc r3, %[r]\n\t"
  172543. #endif
  172544. "str r4, [sp, #20]\n\t"
  172545. "# A[6] * A[0]\n\t"
  172546. "movs r4, #0\n\t"
  172547. "mov %[a], r9\n\t"
  172548. "ldr %[a], [%[a], #24]\n\t"
  172549. "uxth r5, %[a]\n\t"
  172550. "uxth r6, r7\n\t"
  172551. #ifdef WOLFSSL_KEIL
  172552. "muls r6, r5, r6\n\t"
  172553. #elif defined(__clang__)
  172554. "muls r6, r5\n\t"
  172555. #else
  172556. "mul r6, r5\n\t"
  172557. #endif
  172558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172559. "adds r2, r2, r6\n\t"
  172560. #else
  172561. "add r2, r2, r6\n\t"
  172562. #endif
  172563. #ifdef WOLFSSL_KEIL
  172564. "adcs r3, r3, %[r]\n\t"
  172565. #elif defined(__clang__)
  172566. "adcs r3, %[r]\n\t"
  172567. #else
  172568. "adc r3, %[r]\n\t"
  172569. #endif
  172570. #ifdef WOLFSSL_KEIL
  172571. "adcs r4, r4, %[r]\n\t"
  172572. #elif defined(__clang__)
  172573. "adcs r4, %[r]\n\t"
  172574. #else
  172575. "adc r4, %[r]\n\t"
  172576. #endif
  172577. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172578. "adds r2, r2, r6\n\t"
  172579. #else
  172580. "add r2, r2, r6\n\t"
  172581. #endif
  172582. #ifdef WOLFSSL_KEIL
  172583. "adcs r3, r3, %[r]\n\t"
  172584. #elif defined(__clang__)
  172585. "adcs r3, %[r]\n\t"
  172586. #else
  172587. "adc r3, %[r]\n\t"
  172588. #endif
  172589. #ifdef WOLFSSL_KEIL
  172590. "adcs r4, r4, %[r]\n\t"
  172591. #elif defined(__clang__)
  172592. "adcs r4, %[r]\n\t"
  172593. #else
  172594. "adc r4, %[r]\n\t"
  172595. #endif
  172596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172597. "lsrs r6, r7, #16\n\t"
  172598. #else
  172599. "lsr r6, r7, #16\n\t"
  172600. #endif
  172601. #ifdef WOLFSSL_KEIL
  172602. "muls r5, r6, r5\n\t"
  172603. #elif defined(__clang__)
  172604. "muls r5, r6\n\t"
  172605. #else
  172606. "mul r5, r6\n\t"
  172607. #endif
  172608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172609. "lsrs r6, r5, #16\n\t"
  172610. #else
  172611. "lsr r6, r5, #16\n\t"
  172612. #endif
  172613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172614. "lsls r5, r5, #16\n\t"
  172615. #else
  172616. "lsl r5, r5, #16\n\t"
  172617. #endif
  172618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172619. "adds r2, r2, r5\n\t"
  172620. #else
  172621. "add r2, r2, r5\n\t"
  172622. #endif
  172623. #ifdef WOLFSSL_KEIL
  172624. "adcs r3, r3, r6\n\t"
  172625. #elif defined(__clang__)
  172626. "adcs r3, r6\n\t"
  172627. #else
  172628. "adc r3, r6\n\t"
  172629. #endif
  172630. #ifdef WOLFSSL_KEIL
  172631. "adcs r4, r4, %[r]\n\t"
  172632. #elif defined(__clang__)
  172633. "adcs r4, %[r]\n\t"
  172634. #else
  172635. "adc r4, %[r]\n\t"
  172636. #endif
  172637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172638. "adds r2, r2, r5\n\t"
  172639. #else
  172640. "add r2, r2, r5\n\t"
  172641. #endif
  172642. #ifdef WOLFSSL_KEIL
  172643. "adcs r3, r3, r6\n\t"
  172644. #elif defined(__clang__)
  172645. "adcs r3, r6\n\t"
  172646. #else
  172647. "adc r3, r6\n\t"
  172648. #endif
  172649. #ifdef WOLFSSL_KEIL
  172650. "adcs r4, r4, %[r]\n\t"
  172651. #elif defined(__clang__)
  172652. "adcs r4, %[r]\n\t"
  172653. #else
  172654. "adc r4, %[r]\n\t"
  172655. #endif
  172656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172657. "lsrs r5, %[a], #16\n\t"
  172658. #else
  172659. "lsr r5, %[a], #16\n\t"
  172660. #endif
  172661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172662. "lsrs r6, r7, #16\n\t"
  172663. #else
  172664. "lsr r6, r7, #16\n\t"
  172665. #endif
  172666. #ifdef WOLFSSL_KEIL
  172667. "muls r6, r5, r6\n\t"
  172668. #elif defined(__clang__)
  172669. "muls r6, r5\n\t"
  172670. #else
  172671. "mul r6, r5\n\t"
  172672. #endif
  172673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172674. "adds r3, r3, r6\n\t"
  172675. #else
  172676. "add r3, r3, r6\n\t"
  172677. #endif
  172678. #ifdef WOLFSSL_KEIL
  172679. "adcs r4, r4, %[r]\n\t"
  172680. #elif defined(__clang__)
  172681. "adcs r4, %[r]\n\t"
  172682. #else
  172683. "adc r4, %[r]\n\t"
  172684. #endif
  172685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172686. "adds r3, r3, r6\n\t"
  172687. #else
  172688. "add r3, r3, r6\n\t"
  172689. #endif
  172690. #ifdef WOLFSSL_KEIL
  172691. "adcs r4, r4, %[r]\n\t"
  172692. #elif defined(__clang__)
  172693. "adcs r4, %[r]\n\t"
  172694. #else
  172695. "adc r4, %[r]\n\t"
  172696. #endif
  172697. "uxth r6, r7\n\t"
  172698. #ifdef WOLFSSL_KEIL
  172699. "muls r5, r6, r5\n\t"
  172700. #elif defined(__clang__)
  172701. "muls r5, r6\n\t"
  172702. #else
  172703. "mul r5, r6\n\t"
  172704. #endif
  172705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172706. "lsrs r6, r5, #16\n\t"
  172707. #else
  172708. "lsr r6, r5, #16\n\t"
  172709. #endif
  172710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172711. "lsls r5, r5, #16\n\t"
  172712. #else
  172713. "lsl r5, r5, #16\n\t"
  172714. #endif
  172715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172716. "adds r2, r2, r5\n\t"
  172717. #else
  172718. "add r2, r2, r5\n\t"
  172719. #endif
  172720. #ifdef WOLFSSL_KEIL
  172721. "adcs r3, r3, r6\n\t"
  172722. #elif defined(__clang__)
  172723. "adcs r3, r6\n\t"
  172724. #else
  172725. "adc r3, r6\n\t"
  172726. #endif
  172727. #ifdef WOLFSSL_KEIL
  172728. "adcs r4, r4, %[r]\n\t"
  172729. #elif defined(__clang__)
  172730. "adcs r4, %[r]\n\t"
  172731. #else
  172732. "adc r4, %[r]\n\t"
  172733. #endif
  172734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172735. "adds r2, r2, r5\n\t"
  172736. #else
  172737. "add r2, r2, r5\n\t"
  172738. #endif
  172739. #ifdef WOLFSSL_KEIL
  172740. "adcs r3, r3, r6\n\t"
  172741. #elif defined(__clang__)
  172742. "adcs r3, r6\n\t"
  172743. #else
  172744. "adc r3, r6\n\t"
  172745. #endif
  172746. #ifdef WOLFSSL_KEIL
  172747. "adcs r4, r4, %[r]\n\t"
  172748. #elif defined(__clang__)
  172749. "adcs r4, %[r]\n\t"
  172750. #else
  172751. "adc r4, %[r]\n\t"
  172752. #endif
  172753. "# A[5] * A[1]\n\t"
  172754. "mov %[a], r9\n\t"
  172755. "mov r7, r11\n\t"
  172756. "ldr %[a], [%[a], #20]\n\t"
  172757. "uxth r5, %[a]\n\t"
  172758. "uxth r6, r7\n\t"
  172759. #ifdef WOLFSSL_KEIL
  172760. "muls r6, r5, r6\n\t"
  172761. #elif defined(__clang__)
  172762. "muls r6, r5\n\t"
  172763. #else
  172764. "mul r6, r5\n\t"
  172765. #endif
  172766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172767. "adds r2, r2, r6\n\t"
  172768. #else
  172769. "add r2, r2, r6\n\t"
  172770. #endif
  172771. #ifdef WOLFSSL_KEIL
  172772. "adcs r3, r3, %[r]\n\t"
  172773. #elif defined(__clang__)
  172774. "adcs r3, %[r]\n\t"
  172775. #else
  172776. "adc r3, %[r]\n\t"
  172777. #endif
  172778. #ifdef WOLFSSL_KEIL
  172779. "adcs r4, r4, %[r]\n\t"
  172780. #elif defined(__clang__)
  172781. "adcs r4, %[r]\n\t"
  172782. #else
  172783. "adc r4, %[r]\n\t"
  172784. #endif
  172785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172786. "adds r2, r2, r6\n\t"
  172787. #else
  172788. "add r2, r2, r6\n\t"
  172789. #endif
  172790. #ifdef WOLFSSL_KEIL
  172791. "adcs r3, r3, %[r]\n\t"
  172792. #elif defined(__clang__)
  172793. "adcs r3, %[r]\n\t"
  172794. #else
  172795. "adc r3, %[r]\n\t"
  172796. #endif
  172797. #ifdef WOLFSSL_KEIL
  172798. "adcs r4, r4, %[r]\n\t"
  172799. #elif defined(__clang__)
  172800. "adcs r4, %[r]\n\t"
  172801. #else
  172802. "adc r4, %[r]\n\t"
  172803. #endif
  172804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172805. "lsrs r6, r7, #16\n\t"
  172806. #else
  172807. "lsr r6, r7, #16\n\t"
  172808. #endif
  172809. #ifdef WOLFSSL_KEIL
  172810. "muls r5, r6, r5\n\t"
  172811. #elif defined(__clang__)
  172812. "muls r5, r6\n\t"
  172813. #else
  172814. "mul r5, r6\n\t"
  172815. #endif
  172816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172817. "lsrs r6, r5, #16\n\t"
  172818. #else
  172819. "lsr r6, r5, #16\n\t"
  172820. #endif
  172821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172822. "lsls r5, r5, #16\n\t"
  172823. #else
  172824. "lsl r5, r5, #16\n\t"
  172825. #endif
  172826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172827. "adds r2, r2, r5\n\t"
  172828. #else
  172829. "add r2, r2, r5\n\t"
  172830. #endif
  172831. #ifdef WOLFSSL_KEIL
  172832. "adcs r3, r3, r6\n\t"
  172833. #elif defined(__clang__)
  172834. "adcs r3, r6\n\t"
  172835. #else
  172836. "adc r3, r6\n\t"
  172837. #endif
  172838. #ifdef WOLFSSL_KEIL
  172839. "adcs r4, r4, %[r]\n\t"
  172840. #elif defined(__clang__)
  172841. "adcs r4, %[r]\n\t"
  172842. #else
  172843. "adc r4, %[r]\n\t"
  172844. #endif
  172845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172846. "adds r2, r2, r5\n\t"
  172847. #else
  172848. "add r2, r2, r5\n\t"
  172849. #endif
  172850. #ifdef WOLFSSL_KEIL
  172851. "adcs r3, r3, r6\n\t"
  172852. #elif defined(__clang__)
  172853. "adcs r3, r6\n\t"
  172854. #else
  172855. "adc r3, r6\n\t"
  172856. #endif
  172857. #ifdef WOLFSSL_KEIL
  172858. "adcs r4, r4, %[r]\n\t"
  172859. #elif defined(__clang__)
  172860. "adcs r4, %[r]\n\t"
  172861. #else
  172862. "adc r4, %[r]\n\t"
  172863. #endif
  172864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172865. "lsrs r5, %[a], #16\n\t"
  172866. #else
  172867. "lsr r5, %[a], #16\n\t"
  172868. #endif
  172869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172870. "lsrs r6, r7, #16\n\t"
  172871. #else
  172872. "lsr r6, r7, #16\n\t"
  172873. #endif
  172874. #ifdef WOLFSSL_KEIL
  172875. "muls r6, r5, r6\n\t"
  172876. #elif defined(__clang__)
  172877. "muls r6, r5\n\t"
  172878. #else
  172879. "mul r6, r5\n\t"
  172880. #endif
  172881. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172882. "adds r3, r3, r6\n\t"
  172883. #else
  172884. "add r3, r3, r6\n\t"
  172885. #endif
  172886. #ifdef WOLFSSL_KEIL
  172887. "adcs r4, r4, %[r]\n\t"
  172888. #elif defined(__clang__)
  172889. "adcs r4, %[r]\n\t"
  172890. #else
  172891. "adc r4, %[r]\n\t"
  172892. #endif
  172893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172894. "adds r3, r3, r6\n\t"
  172895. #else
  172896. "add r3, r3, r6\n\t"
  172897. #endif
  172898. #ifdef WOLFSSL_KEIL
  172899. "adcs r4, r4, %[r]\n\t"
  172900. #elif defined(__clang__)
  172901. "adcs r4, %[r]\n\t"
  172902. #else
  172903. "adc r4, %[r]\n\t"
  172904. #endif
  172905. "uxth r6, r7\n\t"
  172906. #ifdef WOLFSSL_KEIL
  172907. "muls r5, r6, r5\n\t"
  172908. #elif defined(__clang__)
  172909. "muls r5, r6\n\t"
  172910. #else
  172911. "mul r5, r6\n\t"
  172912. #endif
  172913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172914. "lsrs r6, r5, #16\n\t"
  172915. #else
  172916. "lsr r6, r5, #16\n\t"
  172917. #endif
  172918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172919. "lsls r5, r5, #16\n\t"
  172920. #else
  172921. "lsl r5, r5, #16\n\t"
  172922. #endif
  172923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172924. "adds r2, r2, r5\n\t"
  172925. #else
  172926. "add r2, r2, r5\n\t"
  172927. #endif
  172928. #ifdef WOLFSSL_KEIL
  172929. "adcs r3, r3, r6\n\t"
  172930. #elif defined(__clang__)
  172931. "adcs r3, r6\n\t"
  172932. #else
  172933. "adc r3, r6\n\t"
  172934. #endif
  172935. #ifdef WOLFSSL_KEIL
  172936. "adcs r4, r4, %[r]\n\t"
  172937. #elif defined(__clang__)
  172938. "adcs r4, %[r]\n\t"
  172939. #else
  172940. "adc r4, %[r]\n\t"
  172941. #endif
  172942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172943. "adds r2, r2, r5\n\t"
  172944. #else
  172945. "add r2, r2, r5\n\t"
  172946. #endif
  172947. #ifdef WOLFSSL_KEIL
  172948. "adcs r3, r3, r6\n\t"
  172949. #elif defined(__clang__)
  172950. "adcs r3, r6\n\t"
  172951. #else
  172952. "adc r3, r6\n\t"
  172953. #endif
  172954. #ifdef WOLFSSL_KEIL
  172955. "adcs r4, r4, %[r]\n\t"
  172956. #elif defined(__clang__)
  172957. "adcs r4, %[r]\n\t"
  172958. #else
  172959. "adc r4, %[r]\n\t"
  172960. #endif
  172961. "# A[4] * A[2]\n\t"
  172962. "mov %[a], r9\n\t"
  172963. "mov r7, r12\n\t"
  172964. "ldr %[a], [%[a], #16]\n\t"
  172965. "uxth r5, %[a]\n\t"
  172966. "uxth r6, r7\n\t"
  172967. #ifdef WOLFSSL_KEIL
  172968. "muls r6, r5, r6\n\t"
  172969. #elif defined(__clang__)
  172970. "muls r6, r5\n\t"
  172971. #else
  172972. "mul r6, r5\n\t"
  172973. #endif
  172974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172975. "adds r2, r2, r6\n\t"
  172976. #else
  172977. "add r2, r2, r6\n\t"
  172978. #endif
  172979. #ifdef WOLFSSL_KEIL
  172980. "adcs r3, r3, %[r]\n\t"
  172981. #elif defined(__clang__)
  172982. "adcs r3, %[r]\n\t"
  172983. #else
  172984. "adc r3, %[r]\n\t"
  172985. #endif
  172986. #ifdef WOLFSSL_KEIL
  172987. "adcs r4, r4, %[r]\n\t"
  172988. #elif defined(__clang__)
  172989. "adcs r4, %[r]\n\t"
  172990. #else
  172991. "adc r4, %[r]\n\t"
  172992. #endif
  172993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  172994. "adds r2, r2, r6\n\t"
  172995. #else
  172996. "add r2, r2, r6\n\t"
  172997. #endif
  172998. #ifdef WOLFSSL_KEIL
  172999. "adcs r3, r3, %[r]\n\t"
  173000. #elif defined(__clang__)
  173001. "adcs r3, %[r]\n\t"
  173002. #else
  173003. "adc r3, %[r]\n\t"
  173004. #endif
  173005. #ifdef WOLFSSL_KEIL
  173006. "adcs r4, r4, %[r]\n\t"
  173007. #elif defined(__clang__)
  173008. "adcs r4, %[r]\n\t"
  173009. #else
  173010. "adc r4, %[r]\n\t"
  173011. #endif
  173012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173013. "lsrs r6, r7, #16\n\t"
  173014. #else
  173015. "lsr r6, r7, #16\n\t"
  173016. #endif
  173017. #ifdef WOLFSSL_KEIL
  173018. "muls r5, r6, r5\n\t"
  173019. #elif defined(__clang__)
  173020. "muls r5, r6\n\t"
  173021. #else
  173022. "mul r5, r6\n\t"
  173023. #endif
  173024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173025. "lsrs r6, r5, #16\n\t"
  173026. #else
  173027. "lsr r6, r5, #16\n\t"
  173028. #endif
  173029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173030. "lsls r5, r5, #16\n\t"
  173031. #else
  173032. "lsl r5, r5, #16\n\t"
  173033. #endif
  173034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173035. "adds r2, r2, r5\n\t"
  173036. #else
  173037. "add r2, r2, r5\n\t"
  173038. #endif
  173039. #ifdef WOLFSSL_KEIL
  173040. "adcs r3, r3, r6\n\t"
  173041. #elif defined(__clang__)
  173042. "adcs r3, r6\n\t"
  173043. #else
  173044. "adc r3, r6\n\t"
  173045. #endif
  173046. #ifdef WOLFSSL_KEIL
  173047. "adcs r4, r4, %[r]\n\t"
  173048. #elif defined(__clang__)
  173049. "adcs r4, %[r]\n\t"
  173050. #else
  173051. "adc r4, %[r]\n\t"
  173052. #endif
  173053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173054. "adds r2, r2, r5\n\t"
  173055. #else
  173056. "add r2, r2, r5\n\t"
  173057. #endif
  173058. #ifdef WOLFSSL_KEIL
  173059. "adcs r3, r3, r6\n\t"
  173060. #elif defined(__clang__)
  173061. "adcs r3, r6\n\t"
  173062. #else
  173063. "adc r3, r6\n\t"
  173064. #endif
  173065. #ifdef WOLFSSL_KEIL
  173066. "adcs r4, r4, %[r]\n\t"
  173067. #elif defined(__clang__)
  173068. "adcs r4, %[r]\n\t"
  173069. #else
  173070. "adc r4, %[r]\n\t"
  173071. #endif
  173072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173073. "lsrs r5, %[a], #16\n\t"
  173074. #else
  173075. "lsr r5, %[a], #16\n\t"
  173076. #endif
  173077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173078. "lsrs r6, r7, #16\n\t"
  173079. #else
  173080. "lsr r6, r7, #16\n\t"
  173081. #endif
  173082. #ifdef WOLFSSL_KEIL
  173083. "muls r6, r5, r6\n\t"
  173084. #elif defined(__clang__)
  173085. "muls r6, r5\n\t"
  173086. #else
  173087. "mul r6, r5\n\t"
  173088. #endif
  173089. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173090. "adds r3, r3, r6\n\t"
  173091. #else
  173092. "add r3, 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 r3, r3, r6\n\t"
  173103. #else
  173104. "add r3, r3, r6\n\t"
  173105. #endif
  173106. #ifdef WOLFSSL_KEIL
  173107. "adcs r4, r4, %[r]\n\t"
  173108. #elif defined(__clang__)
  173109. "adcs r4, %[r]\n\t"
  173110. #else
  173111. "adc r4, %[r]\n\t"
  173112. #endif
  173113. "uxth r6, r7\n\t"
  173114. #ifdef WOLFSSL_KEIL
  173115. "muls r5, r6, r5\n\t"
  173116. #elif defined(__clang__)
  173117. "muls r5, r6\n\t"
  173118. #else
  173119. "mul r5, r6\n\t"
  173120. #endif
  173121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173122. "lsrs r6, r5, #16\n\t"
  173123. #else
  173124. "lsr r6, r5, #16\n\t"
  173125. #endif
  173126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173127. "lsls r5, r5, #16\n\t"
  173128. #else
  173129. "lsl r5, r5, #16\n\t"
  173130. #endif
  173131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173132. "adds r2, r2, r5\n\t"
  173133. #else
  173134. "add r2, r2, r5\n\t"
  173135. #endif
  173136. #ifdef WOLFSSL_KEIL
  173137. "adcs r3, r3, r6\n\t"
  173138. #elif defined(__clang__)
  173139. "adcs r3, r6\n\t"
  173140. #else
  173141. "adc r3, r6\n\t"
  173142. #endif
  173143. #ifdef WOLFSSL_KEIL
  173144. "adcs r4, r4, %[r]\n\t"
  173145. #elif defined(__clang__)
  173146. "adcs r4, %[r]\n\t"
  173147. #else
  173148. "adc r4, %[r]\n\t"
  173149. #endif
  173150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173151. "adds r2, r2, r5\n\t"
  173152. #else
  173153. "add r2, r2, r5\n\t"
  173154. #endif
  173155. #ifdef WOLFSSL_KEIL
  173156. "adcs r3, r3, r6\n\t"
  173157. #elif defined(__clang__)
  173158. "adcs r3, r6\n\t"
  173159. #else
  173160. "adc r3, r6\n\t"
  173161. #endif
  173162. #ifdef WOLFSSL_KEIL
  173163. "adcs r4, r4, %[r]\n\t"
  173164. #elif defined(__clang__)
  173165. "adcs r4, %[r]\n\t"
  173166. #else
  173167. "adc r4, %[r]\n\t"
  173168. #endif
  173169. "# A[3] * A[3]\n\t"
  173170. "mov r7, lr\n\t"
  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. "uxth r5, r7\n\t"
  173177. #ifdef WOLFSSL_KEIL
  173178. "muls r5, r5, r5\n\t"
  173179. #elif defined(__clang__)
  173180. "muls r5, r5\n\t"
  173181. #else
  173182. "mul r5, r5\n\t"
  173183. #endif
  173184. #ifdef WOLFSSL_KEIL
  173185. "muls r6, r6, r6\n\t"
  173186. #elif defined(__clang__)
  173187. "muls r6, r6\n\t"
  173188. #else
  173189. "mul r6, r6\n\t"
  173190. #endif
  173191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173192. "adds r2, r2, r5\n\t"
  173193. #else
  173194. "add r2, r2, r5\n\t"
  173195. #endif
  173196. #ifdef WOLFSSL_KEIL
  173197. "adcs r3, r3, r6\n\t"
  173198. #elif defined(__clang__)
  173199. "adcs r3, r6\n\t"
  173200. #else
  173201. "adc r3, r6\n\t"
  173202. #endif
  173203. #ifdef WOLFSSL_KEIL
  173204. "adcs r4, r4, %[r]\n\t"
  173205. #elif defined(__clang__)
  173206. "adcs r4, %[r]\n\t"
  173207. #else
  173208. "adc r4, %[r]\n\t"
  173209. #endif
  173210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173211. "lsrs r6, r7, #16\n\t"
  173212. #else
  173213. "lsr r6, r7, #16\n\t"
  173214. #endif
  173215. "uxth r5, r7\n\t"
  173216. #ifdef WOLFSSL_KEIL
  173217. "muls r5, r6, r5\n\t"
  173218. #elif defined(__clang__)
  173219. "muls r5, r6\n\t"
  173220. #else
  173221. "mul r5, r6\n\t"
  173222. #endif
  173223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173224. "lsrs r6, r5, #15\n\t"
  173225. #else
  173226. "lsr r6, r5, #15\n\t"
  173227. #endif
  173228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173229. "lsls r5, r5, #17\n\t"
  173230. #else
  173231. "lsl r5, r5, #17\n\t"
  173232. #endif
  173233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173234. "adds r2, r2, r5\n\t"
  173235. #else
  173236. "add r2, r2, r5\n\t"
  173237. #endif
  173238. #ifdef WOLFSSL_KEIL
  173239. "adcs r3, r3, r6\n\t"
  173240. #elif defined(__clang__)
  173241. "adcs r3, r6\n\t"
  173242. #else
  173243. "adc r3, r6\n\t"
  173244. #endif
  173245. #ifdef WOLFSSL_KEIL
  173246. "adcs r4, r4, %[r]\n\t"
  173247. #elif defined(__clang__)
  173248. "adcs r4, %[r]\n\t"
  173249. #else
  173250. "adc r4, %[r]\n\t"
  173251. #endif
  173252. "str r2, [sp, #24]\n\t"
  173253. "# A[4] * A[3]\n\t"
  173254. "movs r2, #0\n\t"
  173255. "mov %[a], r9\n\t"
  173256. "ldr %[a], [%[a], #16]\n\t"
  173257. "uxth r5, %[a]\n\t"
  173258. "uxth r6, r7\n\t"
  173259. #ifdef WOLFSSL_KEIL
  173260. "muls r6, r5, r6\n\t"
  173261. #elif defined(__clang__)
  173262. "muls r6, r5\n\t"
  173263. #else
  173264. "mul r6, r5\n\t"
  173265. #endif
  173266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173267. "adds r3, r3, r6\n\t"
  173268. #else
  173269. "add r3, r3, r6\n\t"
  173270. #endif
  173271. #ifdef WOLFSSL_KEIL
  173272. "adcs r4, r4, %[r]\n\t"
  173273. #elif defined(__clang__)
  173274. "adcs r4, %[r]\n\t"
  173275. #else
  173276. "adc r4, %[r]\n\t"
  173277. #endif
  173278. #ifdef WOLFSSL_KEIL
  173279. "adcs r2, r2, %[r]\n\t"
  173280. #elif defined(__clang__)
  173281. "adcs r2, %[r]\n\t"
  173282. #else
  173283. "adc r2, %[r]\n\t"
  173284. #endif
  173285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173286. "adds r3, r3, r6\n\t"
  173287. #else
  173288. "add r3, r3, r6\n\t"
  173289. #endif
  173290. #ifdef WOLFSSL_KEIL
  173291. "adcs r4, r4, %[r]\n\t"
  173292. #elif defined(__clang__)
  173293. "adcs r4, %[r]\n\t"
  173294. #else
  173295. "adc r4, %[r]\n\t"
  173296. #endif
  173297. #ifdef WOLFSSL_KEIL
  173298. "adcs r2, r2, %[r]\n\t"
  173299. #elif defined(__clang__)
  173300. "adcs r2, %[r]\n\t"
  173301. #else
  173302. "adc r2, %[r]\n\t"
  173303. #endif
  173304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173305. "lsrs r6, r7, #16\n\t"
  173306. #else
  173307. "lsr r6, r7, #16\n\t"
  173308. #endif
  173309. #ifdef WOLFSSL_KEIL
  173310. "muls r5, r6, r5\n\t"
  173311. #elif defined(__clang__)
  173312. "muls r5, r6\n\t"
  173313. #else
  173314. "mul r5, r6\n\t"
  173315. #endif
  173316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173317. "lsrs r6, r5, #16\n\t"
  173318. #else
  173319. "lsr r6, r5, #16\n\t"
  173320. #endif
  173321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173322. "lsls r5, r5, #16\n\t"
  173323. #else
  173324. "lsl r5, r5, #16\n\t"
  173325. #endif
  173326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173327. "adds r3, r3, r5\n\t"
  173328. #else
  173329. "add r3, r3, r5\n\t"
  173330. #endif
  173331. #ifdef WOLFSSL_KEIL
  173332. "adcs r4, r4, r6\n\t"
  173333. #elif defined(__clang__)
  173334. "adcs r4, r6\n\t"
  173335. #else
  173336. "adc r4, r6\n\t"
  173337. #endif
  173338. #ifdef WOLFSSL_KEIL
  173339. "adcs r2, r2, %[r]\n\t"
  173340. #elif defined(__clang__)
  173341. "adcs r2, %[r]\n\t"
  173342. #else
  173343. "adc r2, %[r]\n\t"
  173344. #endif
  173345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173346. "adds r3, r3, r5\n\t"
  173347. #else
  173348. "add r3, r3, r5\n\t"
  173349. #endif
  173350. #ifdef WOLFSSL_KEIL
  173351. "adcs r4, r4, r6\n\t"
  173352. #elif defined(__clang__)
  173353. "adcs r4, r6\n\t"
  173354. #else
  173355. "adc r4, r6\n\t"
  173356. #endif
  173357. #ifdef WOLFSSL_KEIL
  173358. "adcs r2, r2, %[r]\n\t"
  173359. #elif defined(__clang__)
  173360. "adcs r2, %[r]\n\t"
  173361. #else
  173362. "adc r2, %[r]\n\t"
  173363. #endif
  173364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173365. "lsrs r5, %[a], #16\n\t"
  173366. #else
  173367. "lsr r5, %[a], #16\n\t"
  173368. #endif
  173369. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173370. "lsrs r6, r7, #16\n\t"
  173371. #else
  173372. "lsr r6, r7, #16\n\t"
  173373. #endif
  173374. #ifdef WOLFSSL_KEIL
  173375. "muls r6, r5, r6\n\t"
  173376. #elif defined(__clang__)
  173377. "muls r6, r5\n\t"
  173378. #else
  173379. "mul r6, r5\n\t"
  173380. #endif
  173381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173382. "adds r4, r4, r6\n\t"
  173383. #else
  173384. "add r4, r4, r6\n\t"
  173385. #endif
  173386. #ifdef WOLFSSL_KEIL
  173387. "adcs r2, r2, %[r]\n\t"
  173388. #elif defined(__clang__)
  173389. "adcs r2, %[r]\n\t"
  173390. #else
  173391. "adc r2, %[r]\n\t"
  173392. #endif
  173393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173394. "adds r4, r4, r6\n\t"
  173395. #else
  173396. "add r4, r4, r6\n\t"
  173397. #endif
  173398. #ifdef WOLFSSL_KEIL
  173399. "adcs r2, r2, %[r]\n\t"
  173400. #elif defined(__clang__)
  173401. "adcs r2, %[r]\n\t"
  173402. #else
  173403. "adc r2, %[r]\n\t"
  173404. #endif
  173405. "uxth r6, r7\n\t"
  173406. #ifdef WOLFSSL_KEIL
  173407. "muls r5, r6, r5\n\t"
  173408. #elif defined(__clang__)
  173409. "muls r5, r6\n\t"
  173410. #else
  173411. "mul r5, r6\n\t"
  173412. #endif
  173413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173414. "lsrs r6, r5, #16\n\t"
  173415. #else
  173416. "lsr r6, r5, #16\n\t"
  173417. #endif
  173418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173419. "lsls r5, r5, #16\n\t"
  173420. #else
  173421. "lsl r5, r5, #16\n\t"
  173422. #endif
  173423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173424. "adds r3, r3, r5\n\t"
  173425. #else
  173426. "add r3, r3, r5\n\t"
  173427. #endif
  173428. #ifdef WOLFSSL_KEIL
  173429. "adcs r4, r4, r6\n\t"
  173430. #elif defined(__clang__)
  173431. "adcs r4, r6\n\t"
  173432. #else
  173433. "adc r4, r6\n\t"
  173434. #endif
  173435. #ifdef WOLFSSL_KEIL
  173436. "adcs r2, r2, %[r]\n\t"
  173437. #elif defined(__clang__)
  173438. "adcs r2, %[r]\n\t"
  173439. #else
  173440. "adc r2, %[r]\n\t"
  173441. #endif
  173442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173443. "adds r3, r3, r5\n\t"
  173444. #else
  173445. "add r3, r3, r5\n\t"
  173446. #endif
  173447. #ifdef WOLFSSL_KEIL
  173448. "adcs r4, r4, r6\n\t"
  173449. #elif defined(__clang__)
  173450. "adcs r4, r6\n\t"
  173451. #else
  173452. "adc r4, r6\n\t"
  173453. #endif
  173454. #ifdef WOLFSSL_KEIL
  173455. "adcs r2, r2, %[r]\n\t"
  173456. #elif defined(__clang__)
  173457. "adcs r2, %[r]\n\t"
  173458. #else
  173459. "adc r2, %[r]\n\t"
  173460. #endif
  173461. "# A[5] * A[2]\n\t"
  173462. "mov %[a], r9\n\t"
  173463. "mov r7, r12\n\t"
  173464. "ldr %[a], [%[a], #20]\n\t"
  173465. "uxth r5, %[a]\n\t"
  173466. "uxth r6, r7\n\t"
  173467. #ifdef WOLFSSL_KEIL
  173468. "muls r6, r5, r6\n\t"
  173469. #elif defined(__clang__)
  173470. "muls r6, r5\n\t"
  173471. #else
  173472. "mul r6, r5\n\t"
  173473. #endif
  173474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173475. "adds r3, r3, r6\n\t"
  173476. #else
  173477. "add r3, r3, r6\n\t"
  173478. #endif
  173479. #ifdef WOLFSSL_KEIL
  173480. "adcs r4, r4, %[r]\n\t"
  173481. #elif defined(__clang__)
  173482. "adcs r4, %[r]\n\t"
  173483. #else
  173484. "adc r4, %[r]\n\t"
  173485. #endif
  173486. #ifdef WOLFSSL_KEIL
  173487. "adcs r2, r2, %[r]\n\t"
  173488. #elif defined(__clang__)
  173489. "adcs r2, %[r]\n\t"
  173490. #else
  173491. "adc r2, %[r]\n\t"
  173492. #endif
  173493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173494. "adds r3, r3, r6\n\t"
  173495. #else
  173496. "add r3, r3, r6\n\t"
  173497. #endif
  173498. #ifdef WOLFSSL_KEIL
  173499. "adcs r4, r4, %[r]\n\t"
  173500. #elif defined(__clang__)
  173501. "adcs r4, %[r]\n\t"
  173502. #else
  173503. "adc r4, %[r]\n\t"
  173504. #endif
  173505. #ifdef WOLFSSL_KEIL
  173506. "adcs r2, r2, %[r]\n\t"
  173507. #elif defined(__clang__)
  173508. "adcs r2, %[r]\n\t"
  173509. #else
  173510. "adc r2, %[r]\n\t"
  173511. #endif
  173512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173513. "lsrs r6, r7, #16\n\t"
  173514. #else
  173515. "lsr r6, r7, #16\n\t"
  173516. #endif
  173517. #ifdef WOLFSSL_KEIL
  173518. "muls r5, r6, r5\n\t"
  173519. #elif defined(__clang__)
  173520. "muls r5, r6\n\t"
  173521. #else
  173522. "mul r5, r6\n\t"
  173523. #endif
  173524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173525. "lsrs r6, r5, #16\n\t"
  173526. #else
  173527. "lsr r6, r5, #16\n\t"
  173528. #endif
  173529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173530. "lsls r5, r5, #16\n\t"
  173531. #else
  173532. "lsl r5, r5, #16\n\t"
  173533. #endif
  173534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173535. "adds r3, r3, r5\n\t"
  173536. #else
  173537. "add r3, r3, r5\n\t"
  173538. #endif
  173539. #ifdef WOLFSSL_KEIL
  173540. "adcs r4, r4, r6\n\t"
  173541. #elif defined(__clang__)
  173542. "adcs r4, r6\n\t"
  173543. #else
  173544. "adc r4, r6\n\t"
  173545. #endif
  173546. #ifdef WOLFSSL_KEIL
  173547. "adcs r2, r2, %[r]\n\t"
  173548. #elif defined(__clang__)
  173549. "adcs r2, %[r]\n\t"
  173550. #else
  173551. "adc r2, %[r]\n\t"
  173552. #endif
  173553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173554. "adds r3, r3, r5\n\t"
  173555. #else
  173556. "add r3, r3, r5\n\t"
  173557. #endif
  173558. #ifdef WOLFSSL_KEIL
  173559. "adcs r4, r4, r6\n\t"
  173560. #elif defined(__clang__)
  173561. "adcs r4, r6\n\t"
  173562. #else
  173563. "adc r4, r6\n\t"
  173564. #endif
  173565. #ifdef WOLFSSL_KEIL
  173566. "adcs r2, r2, %[r]\n\t"
  173567. #elif defined(__clang__)
  173568. "adcs r2, %[r]\n\t"
  173569. #else
  173570. "adc r2, %[r]\n\t"
  173571. #endif
  173572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173573. "lsrs r5, %[a], #16\n\t"
  173574. #else
  173575. "lsr r5, %[a], #16\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. #ifdef WOLFSSL_KEIL
  173583. "muls r6, r5, r6\n\t"
  173584. #elif defined(__clang__)
  173585. "muls r6, r5\n\t"
  173586. #else
  173587. "mul r6, r5\n\t"
  173588. #endif
  173589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173590. "adds r4, r4, r6\n\t"
  173591. #else
  173592. "add r4, r4, r6\n\t"
  173593. #endif
  173594. #ifdef WOLFSSL_KEIL
  173595. "adcs r2, r2, %[r]\n\t"
  173596. #elif defined(__clang__)
  173597. "adcs r2, %[r]\n\t"
  173598. #else
  173599. "adc r2, %[r]\n\t"
  173600. #endif
  173601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173602. "adds r4, r4, r6\n\t"
  173603. #else
  173604. "add r4, r4, r6\n\t"
  173605. #endif
  173606. #ifdef WOLFSSL_KEIL
  173607. "adcs r2, r2, %[r]\n\t"
  173608. #elif defined(__clang__)
  173609. "adcs r2, %[r]\n\t"
  173610. #else
  173611. "adc r2, %[r]\n\t"
  173612. #endif
  173613. "uxth r6, r7\n\t"
  173614. #ifdef WOLFSSL_KEIL
  173615. "muls r5, r6, r5\n\t"
  173616. #elif defined(__clang__)
  173617. "muls r5, r6\n\t"
  173618. #else
  173619. "mul r5, r6\n\t"
  173620. #endif
  173621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173622. "lsrs r6, r5, #16\n\t"
  173623. #else
  173624. "lsr r6, r5, #16\n\t"
  173625. #endif
  173626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173627. "lsls r5, r5, #16\n\t"
  173628. #else
  173629. "lsl r5, r5, #16\n\t"
  173630. #endif
  173631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173632. "adds r3, r3, r5\n\t"
  173633. #else
  173634. "add r3, r3, r5\n\t"
  173635. #endif
  173636. #ifdef WOLFSSL_KEIL
  173637. "adcs r4, r4, r6\n\t"
  173638. #elif defined(__clang__)
  173639. "adcs r4, r6\n\t"
  173640. #else
  173641. "adc r4, r6\n\t"
  173642. #endif
  173643. #ifdef WOLFSSL_KEIL
  173644. "adcs r2, r2, %[r]\n\t"
  173645. #elif defined(__clang__)
  173646. "adcs r2, %[r]\n\t"
  173647. #else
  173648. "adc r2, %[r]\n\t"
  173649. #endif
  173650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173651. "adds r3, r3, r5\n\t"
  173652. #else
  173653. "add r3, r3, r5\n\t"
  173654. #endif
  173655. #ifdef WOLFSSL_KEIL
  173656. "adcs r4, r4, r6\n\t"
  173657. #elif defined(__clang__)
  173658. "adcs r4, r6\n\t"
  173659. #else
  173660. "adc r4, r6\n\t"
  173661. #endif
  173662. #ifdef WOLFSSL_KEIL
  173663. "adcs r2, r2, %[r]\n\t"
  173664. #elif defined(__clang__)
  173665. "adcs r2, %[r]\n\t"
  173666. #else
  173667. "adc r2, %[r]\n\t"
  173668. #endif
  173669. "# A[6] * A[1]\n\t"
  173670. "mov %[a], r9\n\t"
  173671. "mov r7, r11\n\t"
  173672. "ldr %[a], [%[a], #24]\n\t"
  173673. "uxth r5, %[a]\n\t"
  173674. "uxth r6, r7\n\t"
  173675. #ifdef WOLFSSL_KEIL
  173676. "muls r6, r5, r6\n\t"
  173677. #elif defined(__clang__)
  173678. "muls r6, r5\n\t"
  173679. #else
  173680. "mul r6, r5\n\t"
  173681. #endif
  173682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173683. "adds r3, r3, r6\n\t"
  173684. #else
  173685. "add r3, r3, r6\n\t"
  173686. #endif
  173687. #ifdef WOLFSSL_KEIL
  173688. "adcs r4, r4, %[r]\n\t"
  173689. #elif defined(__clang__)
  173690. "adcs r4, %[r]\n\t"
  173691. #else
  173692. "adc r4, %[r]\n\t"
  173693. #endif
  173694. #ifdef WOLFSSL_KEIL
  173695. "adcs r2, r2, %[r]\n\t"
  173696. #elif defined(__clang__)
  173697. "adcs r2, %[r]\n\t"
  173698. #else
  173699. "adc r2, %[r]\n\t"
  173700. #endif
  173701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173702. "adds r3, r3, r6\n\t"
  173703. #else
  173704. "add r3, r3, r6\n\t"
  173705. #endif
  173706. #ifdef WOLFSSL_KEIL
  173707. "adcs r4, r4, %[r]\n\t"
  173708. #elif defined(__clang__)
  173709. "adcs r4, %[r]\n\t"
  173710. #else
  173711. "adc r4, %[r]\n\t"
  173712. #endif
  173713. #ifdef WOLFSSL_KEIL
  173714. "adcs r2, r2, %[r]\n\t"
  173715. #elif defined(__clang__)
  173716. "adcs r2, %[r]\n\t"
  173717. #else
  173718. "adc r2, %[r]\n\t"
  173719. #endif
  173720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173721. "lsrs r6, r7, #16\n\t"
  173722. #else
  173723. "lsr r6, r7, #16\n\t"
  173724. #endif
  173725. #ifdef WOLFSSL_KEIL
  173726. "muls r5, r6, r5\n\t"
  173727. #elif defined(__clang__)
  173728. "muls r5, r6\n\t"
  173729. #else
  173730. "mul r5, r6\n\t"
  173731. #endif
  173732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173733. "lsrs r6, r5, #16\n\t"
  173734. #else
  173735. "lsr r6, r5, #16\n\t"
  173736. #endif
  173737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173738. "lsls r5, r5, #16\n\t"
  173739. #else
  173740. "lsl r5, r5, #16\n\t"
  173741. #endif
  173742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173743. "adds r3, r3, r5\n\t"
  173744. #else
  173745. "add r3, r3, r5\n\t"
  173746. #endif
  173747. #ifdef WOLFSSL_KEIL
  173748. "adcs r4, r4, r6\n\t"
  173749. #elif defined(__clang__)
  173750. "adcs r4, r6\n\t"
  173751. #else
  173752. "adc r4, r6\n\t"
  173753. #endif
  173754. #ifdef WOLFSSL_KEIL
  173755. "adcs r2, r2, %[r]\n\t"
  173756. #elif defined(__clang__)
  173757. "adcs r2, %[r]\n\t"
  173758. #else
  173759. "adc r2, %[r]\n\t"
  173760. #endif
  173761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173762. "adds r3, r3, r5\n\t"
  173763. #else
  173764. "add r3, r3, r5\n\t"
  173765. #endif
  173766. #ifdef WOLFSSL_KEIL
  173767. "adcs r4, r4, r6\n\t"
  173768. #elif defined(__clang__)
  173769. "adcs r4, r6\n\t"
  173770. #else
  173771. "adc r4, r6\n\t"
  173772. #endif
  173773. #ifdef WOLFSSL_KEIL
  173774. "adcs r2, r2, %[r]\n\t"
  173775. #elif defined(__clang__)
  173776. "adcs r2, %[r]\n\t"
  173777. #else
  173778. "adc r2, %[r]\n\t"
  173779. #endif
  173780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173781. "lsrs r5, %[a], #16\n\t"
  173782. #else
  173783. "lsr r5, %[a], #16\n\t"
  173784. #endif
  173785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173786. "lsrs r6, r7, #16\n\t"
  173787. #else
  173788. "lsr r6, r7, #16\n\t"
  173789. #endif
  173790. #ifdef WOLFSSL_KEIL
  173791. "muls r6, r5, r6\n\t"
  173792. #elif defined(__clang__)
  173793. "muls r6, r5\n\t"
  173794. #else
  173795. "mul r6, r5\n\t"
  173796. #endif
  173797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173798. "adds r4, r4, r6\n\t"
  173799. #else
  173800. "add r4, 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 r4, r4, r6\n\t"
  173811. #else
  173812. "add r4, r4, r6\n\t"
  173813. #endif
  173814. #ifdef WOLFSSL_KEIL
  173815. "adcs r2, r2, %[r]\n\t"
  173816. #elif defined(__clang__)
  173817. "adcs r2, %[r]\n\t"
  173818. #else
  173819. "adc r2, %[r]\n\t"
  173820. #endif
  173821. "uxth r6, r7\n\t"
  173822. #ifdef WOLFSSL_KEIL
  173823. "muls r5, r6, r5\n\t"
  173824. #elif defined(__clang__)
  173825. "muls r5, r6\n\t"
  173826. #else
  173827. "mul r5, r6\n\t"
  173828. #endif
  173829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173830. "lsrs r6, r5, #16\n\t"
  173831. #else
  173832. "lsr r6, r5, #16\n\t"
  173833. #endif
  173834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173835. "lsls r5, r5, #16\n\t"
  173836. #else
  173837. "lsl r5, r5, #16\n\t"
  173838. #endif
  173839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173840. "adds r3, r3, r5\n\t"
  173841. #else
  173842. "add r3, r3, r5\n\t"
  173843. #endif
  173844. #ifdef WOLFSSL_KEIL
  173845. "adcs r4, r4, r6\n\t"
  173846. #elif defined(__clang__)
  173847. "adcs r4, r6\n\t"
  173848. #else
  173849. "adc r4, r6\n\t"
  173850. #endif
  173851. #ifdef WOLFSSL_KEIL
  173852. "adcs r2, r2, %[r]\n\t"
  173853. #elif defined(__clang__)
  173854. "adcs r2, %[r]\n\t"
  173855. #else
  173856. "adc r2, %[r]\n\t"
  173857. #endif
  173858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173859. "adds r3, r3, r5\n\t"
  173860. #else
  173861. "add r3, r3, r5\n\t"
  173862. #endif
  173863. #ifdef WOLFSSL_KEIL
  173864. "adcs r4, r4, r6\n\t"
  173865. #elif defined(__clang__)
  173866. "adcs r4, r6\n\t"
  173867. #else
  173868. "adc r4, r6\n\t"
  173869. #endif
  173870. #ifdef WOLFSSL_KEIL
  173871. "adcs r2, r2, %[r]\n\t"
  173872. #elif defined(__clang__)
  173873. "adcs r2, %[r]\n\t"
  173874. #else
  173875. "adc r2, %[r]\n\t"
  173876. #endif
  173877. "# A[7] * A[0]\n\t"
  173878. "mov %[a], r9\n\t"
  173879. "mov r7, r10\n\t"
  173880. "ldr %[a], [%[a], #28]\n\t"
  173881. "uxth r5, %[a]\n\t"
  173882. "uxth r6, r7\n\t"
  173883. #ifdef WOLFSSL_KEIL
  173884. "muls r6, r5, r6\n\t"
  173885. #elif defined(__clang__)
  173886. "muls r6, r5\n\t"
  173887. #else
  173888. "mul r6, r5\n\t"
  173889. #endif
  173890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173891. "adds r3, r3, r6\n\t"
  173892. #else
  173893. "add r3, r3, r6\n\t"
  173894. #endif
  173895. #ifdef WOLFSSL_KEIL
  173896. "adcs r4, r4, %[r]\n\t"
  173897. #elif defined(__clang__)
  173898. "adcs r4, %[r]\n\t"
  173899. #else
  173900. "adc r4, %[r]\n\t"
  173901. #endif
  173902. #ifdef WOLFSSL_KEIL
  173903. "adcs r2, r2, %[r]\n\t"
  173904. #elif defined(__clang__)
  173905. "adcs r2, %[r]\n\t"
  173906. #else
  173907. "adc r2, %[r]\n\t"
  173908. #endif
  173909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173910. "adds r3, r3, r6\n\t"
  173911. #else
  173912. "add r3, r3, r6\n\t"
  173913. #endif
  173914. #ifdef WOLFSSL_KEIL
  173915. "adcs r4, r4, %[r]\n\t"
  173916. #elif defined(__clang__)
  173917. "adcs r4, %[r]\n\t"
  173918. #else
  173919. "adc r4, %[r]\n\t"
  173920. #endif
  173921. #ifdef WOLFSSL_KEIL
  173922. "adcs r2, r2, %[r]\n\t"
  173923. #elif defined(__clang__)
  173924. "adcs r2, %[r]\n\t"
  173925. #else
  173926. "adc r2, %[r]\n\t"
  173927. #endif
  173928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173929. "lsrs r6, r7, #16\n\t"
  173930. #else
  173931. "lsr r6, r7, #16\n\t"
  173932. #endif
  173933. #ifdef WOLFSSL_KEIL
  173934. "muls r5, r6, r5\n\t"
  173935. #elif defined(__clang__)
  173936. "muls r5, r6\n\t"
  173937. #else
  173938. "mul r5, r6\n\t"
  173939. #endif
  173940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173941. "lsrs r6, r5, #16\n\t"
  173942. #else
  173943. "lsr r6, r5, #16\n\t"
  173944. #endif
  173945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173946. "lsls r5, r5, #16\n\t"
  173947. #else
  173948. "lsl r5, r5, #16\n\t"
  173949. #endif
  173950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173951. "adds r3, r3, r5\n\t"
  173952. #else
  173953. "add r3, r3, r5\n\t"
  173954. #endif
  173955. #ifdef WOLFSSL_KEIL
  173956. "adcs r4, r4, r6\n\t"
  173957. #elif defined(__clang__)
  173958. "adcs r4, r6\n\t"
  173959. #else
  173960. "adc r4, r6\n\t"
  173961. #endif
  173962. #ifdef WOLFSSL_KEIL
  173963. "adcs r2, r2, %[r]\n\t"
  173964. #elif defined(__clang__)
  173965. "adcs r2, %[r]\n\t"
  173966. #else
  173967. "adc r2, %[r]\n\t"
  173968. #endif
  173969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173970. "adds r3, r3, r5\n\t"
  173971. #else
  173972. "add r3, r3, r5\n\t"
  173973. #endif
  173974. #ifdef WOLFSSL_KEIL
  173975. "adcs r4, r4, r6\n\t"
  173976. #elif defined(__clang__)
  173977. "adcs r4, r6\n\t"
  173978. #else
  173979. "adc r4, r6\n\t"
  173980. #endif
  173981. #ifdef WOLFSSL_KEIL
  173982. "adcs r2, r2, %[r]\n\t"
  173983. #elif defined(__clang__)
  173984. "adcs r2, %[r]\n\t"
  173985. #else
  173986. "adc r2, %[r]\n\t"
  173987. #endif
  173988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173989. "lsrs r5, %[a], #16\n\t"
  173990. #else
  173991. "lsr r5, %[a], #16\n\t"
  173992. #endif
  173993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  173994. "lsrs r6, r7, #16\n\t"
  173995. #else
  173996. "lsr r6, r7, #16\n\t"
  173997. #endif
  173998. #ifdef WOLFSSL_KEIL
  173999. "muls r6, r5, r6\n\t"
  174000. #elif defined(__clang__)
  174001. "muls r6, r5\n\t"
  174002. #else
  174003. "mul r6, r5\n\t"
  174004. #endif
  174005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174006. "adds r4, r4, r6\n\t"
  174007. #else
  174008. "add r4, 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 r4, r4, r6\n\t"
  174019. #else
  174020. "add r4, r4, r6\n\t"
  174021. #endif
  174022. #ifdef WOLFSSL_KEIL
  174023. "adcs r2, r2, %[r]\n\t"
  174024. #elif defined(__clang__)
  174025. "adcs r2, %[r]\n\t"
  174026. #else
  174027. "adc r2, %[r]\n\t"
  174028. #endif
  174029. "uxth r6, r7\n\t"
  174030. #ifdef WOLFSSL_KEIL
  174031. "muls r5, r6, r5\n\t"
  174032. #elif defined(__clang__)
  174033. "muls r5, r6\n\t"
  174034. #else
  174035. "mul r5, r6\n\t"
  174036. #endif
  174037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174038. "lsrs r6, r5, #16\n\t"
  174039. #else
  174040. "lsr r6, r5, #16\n\t"
  174041. #endif
  174042. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174043. "lsls r5, r5, #16\n\t"
  174044. #else
  174045. "lsl r5, r5, #16\n\t"
  174046. #endif
  174047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174048. "adds r3, r3, r5\n\t"
  174049. #else
  174050. "add r3, r3, r5\n\t"
  174051. #endif
  174052. #ifdef WOLFSSL_KEIL
  174053. "adcs r4, r4, r6\n\t"
  174054. #elif defined(__clang__)
  174055. "adcs r4, r6\n\t"
  174056. #else
  174057. "adc r4, r6\n\t"
  174058. #endif
  174059. #ifdef WOLFSSL_KEIL
  174060. "adcs r2, r2, %[r]\n\t"
  174061. #elif defined(__clang__)
  174062. "adcs r2, %[r]\n\t"
  174063. #else
  174064. "adc r2, %[r]\n\t"
  174065. #endif
  174066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174067. "adds r3, r3, r5\n\t"
  174068. #else
  174069. "add r3, r3, r5\n\t"
  174070. #endif
  174071. #ifdef WOLFSSL_KEIL
  174072. "adcs r4, r4, r6\n\t"
  174073. #elif defined(__clang__)
  174074. "adcs r4, r6\n\t"
  174075. #else
  174076. "adc r4, r6\n\t"
  174077. #endif
  174078. #ifdef WOLFSSL_KEIL
  174079. "adcs r2, r2, %[r]\n\t"
  174080. #elif defined(__clang__)
  174081. "adcs r2, %[r]\n\t"
  174082. #else
  174083. "adc r2, %[r]\n\t"
  174084. #endif
  174085. "str r3, [sp, #28]\n\t"
  174086. "# A[8] * A[0]\n\t"
  174087. "movs r3, #0\n\t"
  174088. "mov %[a], r9\n\t"
  174089. "ldr %[a], [%[a], #32]\n\t"
  174090. "uxth r5, %[a]\n\t"
  174091. "uxth r6, r7\n\t"
  174092. #ifdef WOLFSSL_KEIL
  174093. "muls r6, r5, r6\n\t"
  174094. #elif defined(__clang__)
  174095. "muls r6, r5\n\t"
  174096. #else
  174097. "mul r6, r5\n\t"
  174098. #endif
  174099. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174100. "adds r4, r4, r6\n\t"
  174101. #else
  174102. "add r4, r4, r6\n\t"
  174103. #endif
  174104. #ifdef WOLFSSL_KEIL
  174105. "adcs r2, r2, %[r]\n\t"
  174106. #elif defined(__clang__)
  174107. "adcs r2, %[r]\n\t"
  174108. #else
  174109. "adc r2, %[r]\n\t"
  174110. #endif
  174111. #ifdef WOLFSSL_KEIL
  174112. "adcs r3, r3, %[r]\n\t"
  174113. #elif defined(__clang__)
  174114. "adcs r3, %[r]\n\t"
  174115. #else
  174116. "adc r3, %[r]\n\t"
  174117. #endif
  174118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174119. "adds r4, r4, r6\n\t"
  174120. #else
  174121. "add r4, r4, r6\n\t"
  174122. #endif
  174123. #ifdef WOLFSSL_KEIL
  174124. "adcs r2, r2, %[r]\n\t"
  174125. #elif defined(__clang__)
  174126. "adcs r2, %[r]\n\t"
  174127. #else
  174128. "adc r2, %[r]\n\t"
  174129. #endif
  174130. #ifdef WOLFSSL_KEIL
  174131. "adcs r3, r3, %[r]\n\t"
  174132. #elif defined(__clang__)
  174133. "adcs r3, %[r]\n\t"
  174134. #else
  174135. "adc r3, %[r]\n\t"
  174136. #endif
  174137. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174138. "lsrs r6, r7, #16\n\t"
  174139. #else
  174140. "lsr r6, r7, #16\n\t"
  174141. #endif
  174142. #ifdef WOLFSSL_KEIL
  174143. "muls r5, r6, r5\n\t"
  174144. #elif defined(__clang__)
  174145. "muls r5, r6\n\t"
  174146. #else
  174147. "mul r5, r6\n\t"
  174148. #endif
  174149. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174150. "lsrs r6, r5, #16\n\t"
  174151. #else
  174152. "lsr r6, r5, #16\n\t"
  174153. #endif
  174154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174155. "lsls r5, r5, #16\n\t"
  174156. #else
  174157. "lsl r5, r5, #16\n\t"
  174158. #endif
  174159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174160. "adds r4, r4, r5\n\t"
  174161. #else
  174162. "add r4, r4, r5\n\t"
  174163. #endif
  174164. #ifdef WOLFSSL_KEIL
  174165. "adcs r2, r2, r6\n\t"
  174166. #elif defined(__clang__)
  174167. "adcs r2, r6\n\t"
  174168. #else
  174169. "adc r2, r6\n\t"
  174170. #endif
  174171. #ifdef WOLFSSL_KEIL
  174172. "adcs r3, r3, %[r]\n\t"
  174173. #elif defined(__clang__)
  174174. "adcs r3, %[r]\n\t"
  174175. #else
  174176. "adc r3, %[r]\n\t"
  174177. #endif
  174178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174179. "adds r4, r4, r5\n\t"
  174180. #else
  174181. "add r4, r4, r5\n\t"
  174182. #endif
  174183. #ifdef WOLFSSL_KEIL
  174184. "adcs r2, r2, r6\n\t"
  174185. #elif defined(__clang__)
  174186. "adcs r2, r6\n\t"
  174187. #else
  174188. "adc r2, r6\n\t"
  174189. #endif
  174190. #ifdef WOLFSSL_KEIL
  174191. "adcs r3, r3, %[r]\n\t"
  174192. #elif defined(__clang__)
  174193. "adcs r3, %[r]\n\t"
  174194. #else
  174195. "adc r3, %[r]\n\t"
  174196. #endif
  174197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174198. "lsrs r5, %[a], #16\n\t"
  174199. #else
  174200. "lsr r5, %[a], #16\n\t"
  174201. #endif
  174202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174203. "lsrs r6, r7, #16\n\t"
  174204. #else
  174205. "lsr r6, r7, #16\n\t"
  174206. #endif
  174207. #ifdef WOLFSSL_KEIL
  174208. "muls r6, r5, r6\n\t"
  174209. #elif defined(__clang__)
  174210. "muls r6, r5\n\t"
  174211. #else
  174212. "mul r6, r5\n\t"
  174213. #endif
  174214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174215. "adds r2, r2, r6\n\t"
  174216. #else
  174217. "add r2, r2, r6\n\t"
  174218. #endif
  174219. #ifdef WOLFSSL_KEIL
  174220. "adcs r3, r3, %[r]\n\t"
  174221. #elif defined(__clang__)
  174222. "adcs r3, %[r]\n\t"
  174223. #else
  174224. "adc r3, %[r]\n\t"
  174225. #endif
  174226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174227. "adds r2, r2, r6\n\t"
  174228. #else
  174229. "add r2, r2, r6\n\t"
  174230. #endif
  174231. #ifdef WOLFSSL_KEIL
  174232. "adcs r3, r3, %[r]\n\t"
  174233. #elif defined(__clang__)
  174234. "adcs r3, %[r]\n\t"
  174235. #else
  174236. "adc r3, %[r]\n\t"
  174237. #endif
  174238. "uxth r6, r7\n\t"
  174239. #ifdef WOLFSSL_KEIL
  174240. "muls r5, r6, r5\n\t"
  174241. #elif defined(__clang__)
  174242. "muls r5, r6\n\t"
  174243. #else
  174244. "mul r5, r6\n\t"
  174245. #endif
  174246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174247. "lsrs r6, r5, #16\n\t"
  174248. #else
  174249. "lsr r6, r5, #16\n\t"
  174250. #endif
  174251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174252. "lsls r5, r5, #16\n\t"
  174253. #else
  174254. "lsl r5, r5, #16\n\t"
  174255. #endif
  174256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174257. "adds r4, r4, r5\n\t"
  174258. #else
  174259. "add r4, r4, r5\n\t"
  174260. #endif
  174261. #ifdef WOLFSSL_KEIL
  174262. "adcs r2, r2, r6\n\t"
  174263. #elif defined(__clang__)
  174264. "adcs r2, r6\n\t"
  174265. #else
  174266. "adc r2, r6\n\t"
  174267. #endif
  174268. #ifdef WOLFSSL_KEIL
  174269. "adcs r3, r3, %[r]\n\t"
  174270. #elif defined(__clang__)
  174271. "adcs r3, %[r]\n\t"
  174272. #else
  174273. "adc r3, %[r]\n\t"
  174274. #endif
  174275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174276. "adds r4, r4, r5\n\t"
  174277. #else
  174278. "add r4, r4, r5\n\t"
  174279. #endif
  174280. #ifdef WOLFSSL_KEIL
  174281. "adcs r2, r2, r6\n\t"
  174282. #elif defined(__clang__)
  174283. "adcs r2, r6\n\t"
  174284. #else
  174285. "adc r2, r6\n\t"
  174286. #endif
  174287. #ifdef WOLFSSL_KEIL
  174288. "adcs r3, r3, %[r]\n\t"
  174289. #elif defined(__clang__)
  174290. "adcs r3, %[r]\n\t"
  174291. #else
  174292. "adc r3, %[r]\n\t"
  174293. #endif
  174294. "# A[7] * A[1]\n\t"
  174295. "mov %[a], r9\n\t"
  174296. "mov r7, r11\n\t"
  174297. "ldr %[a], [%[a], #28]\n\t"
  174298. "uxth r5, %[a]\n\t"
  174299. "uxth r6, r7\n\t"
  174300. #ifdef WOLFSSL_KEIL
  174301. "muls r6, r5, r6\n\t"
  174302. #elif defined(__clang__)
  174303. "muls r6, r5\n\t"
  174304. #else
  174305. "mul r6, r5\n\t"
  174306. #endif
  174307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174308. "adds r4, r4, r6\n\t"
  174309. #else
  174310. "add r4, r4, r6\n\t"
  174311. #endif
  174312. #ifdef WOLFSSL_KEIL
  174313. "adcs r2, r2, %[r]\n\t"
  174314. #elif defined(__clang__)
  174315. "adcs r2, %[r]\n\t"
  174316. #else
  174317. "adc r2, %[r]\n\t"
  174318. #endif
  174319. #ifdef WOLFSSL_KEIL
  174320. "adcs r3, r3, %[r]\n\t"
  174321. #elif defined(__clang__)
  174322. "adcs r3, %[r]\n\t"
  174323. #else
  174324. "adc r3, %[r]\n\t"
  174325. #endif
  174326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174327. "adds r4, r4, r6\n\t"
  174328. #else
  174329. "add r4, r4, r6\n\t"
  174330. #endif
  174331. #ifdef WOLFSSL_KEIL
  174332. "adcs r2, r2, %[r]\n\t"
  174333. #elif defined(__clang__)
  174334. "adcs r2, %[r]\n\t"
  174335. #else
  174336. "adc r2, %[r]\n\t"
  174337. #endif
  174338. #ifdef WOLFSSL_KEIL
  174339. "adcs r3, r3, %[r]\n\t"
  174340. #elif defined(__clang__)
  174341. "adcs r3, %[r]\n\t"
  174342. #else
  174343. "adc r3, %[r]\n\t"
  174344. #endif
  174345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174346. "lsrs r6, r7, #16\n\t"
  174347. #else
  174348. "lsr r6, r7, #16\n\t"
  174349. #endif
  174350. #ifdef WOLFSSL_KEIL
  174351. "muls r5, r6, r5\n\t"
  174352. #elif defined(__clang__)
  174353. "muls r5, r6\n\t"
  174354. #else
  174355. "mul r5, r6\n\t"
  174356. #endif
  174357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174358. "lsrs r6, r5, #16\n\t"
  174359. #else
  174360. "lsr r6, r5, #16\n\t"
  174361. #endif
  174362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174363. "lsls r5, r5, #16\n\t"
  174364. #else
  174365. "lsl r5, r5, #16\n\t"
  174366. #endif
  174367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174368. "adds r4, r4, r5\n\t"
  174369. #else
  174370. "add r4, r4, r5\n\t"
  174371. #endif
  174372. #ifdef WOLFSSL_KEIL
  174373. "adcs r2, r2, r6\n\t"
  174374. #elif defined(__clang__)
  174375. "adcs r2, r6\n\t"
  174376. #else
  174377. "adc r2, r6\n\t"
  174378. #endif
  174379. #ifdef WOLFSSL_KEIL
  174380. "adcs r3, r3, %[r]\n\t"
  174381. #elif defined(__clang__)
  174382. "adcs r3, %[r]\n\t"
  174383. #else
  174384. "adc r3, %[r]\n\t"
  174385. #endif
  174386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174387. "adds r4, r4, r5\n\t"
  174388. #else
  174389. "add r4, r4, r5\n\t"
  174390. #endif
  174391. #ifdef WOLFSSL_KEIL
  174392. "adcs r2, r2, r6\n\t"
  174393. #elif defined(__clang__)
  174394. "adcs r2, r6\n\t"
  174395. #else
  174396. "adc r2, r6\n\t"
  174397. #endif
  174398. #ifdef WOLFSSL_KEIL
  174399. "adcs r3, r3, %[r]\n\t"
  174400. #elif defined(__clang__)
  174401. "adcs r3, %[r]\n\t"
  174402. #else
  174403. "adc r3, %[r]\n\t"
  174404. #endif
  174405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174406. "lsrs r5, %[a], #16\n\t"
  174407. #else
  174408. "lsr r5, %[a], #16\n\t"
  174409. #endif
  174410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174411. "lsrs r6, r7, #16\n\t"
  174412. #else
  174413. "lsr r6, r7, #16\n\t"
  174414. #endif
  174415. #ifdef WOLFSSL_KEIL
  174416. "muls r6, r5, r6\n\t"
  174417. #elif defined(__clang__)
  174418. "muls r6, r5\n\t"
  174419. #else
  174420. "mul r6, r5\n\t"
  174421. #endif
  174422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174423. "adds r2, r2, r6\n\t"
  174424. #else
  174425. "add r2, r2, r6\n\t"
  174426. #endif
  174427. #ifdef WOLFSSL_KEIL
  174428. "adcs r3, r3, %[r]\n\t"
  174429. #elif defined(__clang__)
  174430. "adcs r3, %[r]\n\t"
  174431. #else
  174432. "adc r3, %[r]\n\t"
  174433. #endif
  174434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174435. "adds r2, r2, r6\n\t"
  174436. #else
  174437. "add r2, r2, r6\n\t"
  174438. #endif
  174439. #ifdef WOLFSSL_KEIL
  174440. "adcs r3, r3, %[r]\n\t"
  174441. #elif defined(__clang__)
  174442. "adcs r3, %[r]\n\t"
  174443. #else
  174444. "adc r3, %[r]\n\t"
  174445. #endif
  174446. "uxth r6, r7\n\t"
  174447. #ifdef WOLFSSL_KEIL
  174448. "muls r5, r6, r5\n\t"
  174449. #elif defined(__clang__)
  174450. "muls r5, r6\n\t"
  174451. #else
  174452. "mul r5, r6\n\t"
  174453. #endif
  174454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174455. "lsrs r6, r5, #16\n\t"
  174456. #else
  174457. "lsr r6, r5, #16\n\t"
  174458. #endif
  174459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174460. "lsls r5, r5, #16\n\t"
  174461. #else
  174462. "lsl r5, r5, #16\n\t"
  174463. #endif
  174464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174465. "adds r4, r4, r5\n\t"
  174466. #else
  174467. "add r4, r4, r5\n\t"
  174468. #endif
  174469. #ifdef WOLFSSL_KEIL
  174470. "adcs r2, r2, r6\n\t"
  174471. #elif defined(__clang__)
  174472. "adcs r2, r6\n\t"
  174473. #else
  174474. "adc r2, r6\n\t"
  174475. #endif
  174476. #ifdef WOLFSSL_KEIL
  174477. "adcs r3, r3, %[r]\n\t"
  174478. #elif defined(__clang__)
  174479. "adcs r3, %[r]\n\t"
  174480. #else
  174481. "adc r3, %[r]\n\t"
  174482. #endif
  174483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174484. "adds r4, r4, r5\n\t"
  174485. #else
  174486. "add r4, r4, r5\n\t"
  174487. #endif
  174488. #ifdef WOLFSSL_KEIL
  174489. "adcs r2, r2, r6\n\t"
  174490. #elif defined(__clang__)
  174491. "adcs r2, r6\n\t"
  174492. #else
  174493. "adc r2, r6\n\t"
  174494. #endif
  174495. #ifdef WOLFSSL_KEIL
  174496. "adcs r3, r3, %[r]\n\t"
  174497. #elif defined(__clang__)
  174498. "adcs r3, %[r]\n\t"
  174499. #else
  174500. "adc r3, %[r]\n\t"
  174501. #endif
  174502. "# A[6] * A[2]\n\t"
  174503. "mov %[a], r9\n\t"
  174504. "mov r7, r12\n\t"
  174505. "ldr %[a], [%[a], #24]\n\t"
  174506. "uxth r5, %[a]\n\t"
  174507. "uxth r6, r7\n\t"
  174508. #ifdef WOLFSSL_KEIL
  174509. "muls r6, r5, r6\n\t"
  174510. #elif defined(__clang__)
  174511. "muls r6, r5\n\t"
  174512. #else
  174513. "mul r6, r5\n\t"
  174514. #endif
  174515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174516. "adds r4, r4, r6\n\t"
  174517. #else
  174518. "add r4, r4, r6\n\t"
  174519. #endif
  174520. #ifdef WOLFSSL_KEIL
  174521. "adcs r2, r2, %[r]\n\t"
  174522. #elif defined(__clang__)
  174523. "adcs r2, %[r]\n\t"
  174524. #else
  174525. "adc r2, %[r]\n\t"
  174526. #endif
  174527. #ifdef WOLFSSL_KEIL
  174528. "adcs r3, r3, %[r]\n\t"
  174529. #elif defined(__clang__)
  174530. "adcs r3, %[r]\n\t"
  174531. #else
  174532. "adc r3, %[r]\n\t"
  174533. #endif
  174534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174535. "adds r4, r4, r6\n\t"
  174536. #else
  174537. "add r4, r4, r6\n\t"
  174538. #endif
  174539. #ifdef WOLFSSL_KEIL
  174540. "adcs r2, r2, %[r]\n\t"
  174541. #elif defined(__clang__)
  174542. "adcs r2, %[r]\n\t"
  174543. #else
  174544. "adc r2, %[r]\n\t"
  174545. #endif
  174546. #ifdef WOLFSSL_KEIL
  174547. "adcs r3, r3, %[r]\n\t"
  174548. #elif defined(__clang__)
  174549. "adcs r3, %[r]\n\t"
  174550. #else
  174551. "adc r3, %[r]\n\t"
  174552. #endif
  174553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174554. "lsrs r6, r7, #16\n\t"
  174555. #else
  174556. "lsr r6, r7, #16\n\t"
  174557. #endif
  174558. #ifdef WOLFSSL_KEIL
  174559. "muls r5, r6, r5\n\t"
  174560. #elif defined(__clang__)
  174561. "muls r5, r6\n\t"
  174562. #else
  174563. "mul r5, r6\n\t"
  174564. #endif
  174565. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174566. "lsrs r6, r5, #16\n\t"
  174567. #else
  174568. "lsr r6, r5, #16\n\t"
  174569. #endif
  174570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174571. "lsls r5, r5, #16\n\t"
  174572. #else
  174573. "lsl r5, r5, #16\n\t"
  174574. #endif
  174575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174576. "adds r4, r4, r5\n\t"
  174577. #else
  174578. "add r4, r4, r5\n\t"
  174579. #endif
  174580. #ifdef WOLFSSL_KEIL
  174581. "adcs r2, r2, r6\n\t"
  174582. #elif defined(__clang__)
  174583. "adcs r2, r6\n\t"
  174584. #else
  174585. "adc r2, r6\n\t"
  174586. #endif
  174587. #ifdef WOLFSSL_KEIL
  174588. "adcs r3, r3, %[r]\n\t"
  174589. #elif defined(__clang__)
  174590. "adcs r3, %[r]\n\t"
  174591. #else
  174592. "adc r3, %[r]\n\t"
  174593. #endif
  174594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174595. "adds r4, r4, r5\n\t"
  174596. #else
  174597. "add r4, r4, r5\n\t"
  174598. #endif
  174599. #ifdef WOLFSSL_KEIL
  174600. "adcs r2, r2, r6\n\t"
  174601. #elif defined(__clang__)
  174602. "adcs r2, r6\n\t"
  174603. #else
  174604. "adc r2, r6\n\t"
  174605. #endif
  174606. #ifdef WOLFSSL_KEIL
  174607. "adcs r3, r3, %[r]\n\t"
  174608. #elif defined(__clang__)
  174609. "adcs r3, %[r]\n\t"
  174610. #else
  174611. "adc r3, %[r]\n\t"
  174612. #endif
  174613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174614. "lsrs r5, %[a], #16\n\t"
  174615. #else
  174616. "lsr r5, %[a], #16\n\t"
  174617. #endif
  174618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174619. "lsrs r6, r7, #16\n\t"
  174620. #else
  174621. "lsr r6, r7, #16\n\t"
  174622. #endif
  174623. #ifdef WOLFSSL_KEIL
  174624. "muls r6, r5, r6\n\t"
  174625. #elif defined(__clang__)
  174626. "muls r6, r5\n\t"
  174627. #else
  174628. "mul r6, r5\n\t"
  174629. #endif
  174630. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174631. "adds r2, r2, r6\n\t"
  174632. #else
  174633. "add r2, 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 r2, r2, r6\n\t"
  174644. #else
  174645. "add r2, r2, r6\n\t"
  174646. #endif
  174647. #ifdef WOLFSSL_KEIL
  174648. "adcs r3, r3, %[r]\n\t"
  174649. #elif defined(__clang__)
  174650. "adcs r3, %[r]\n\t"
  174651. #else
  174652. "adc r3, %[r]\n\t"
  174653. #endif
  174654. "uxth r6, r7\n\t"
  174655. #ifdef WOLFSSL_KEIL
  174656. "muls r5, r6, r5\n\t"
  174657. #elif defined(__clang__)
  174658. "muls r5, r6\n\t"
  174659. #else
  174660. "mul r5, r6\n\t"
  174661. #endif
  174662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174663. "lsrs r6, r5, #16\n\t"
  174664. #else
  174665. "lsr r6, r5, #16\n\t"
  174666. #endif
  174667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174668. "lsls r5, r5, #16\n\t"
  174669. #else
  174670. "lsl r5, r5, #16\n\t"
  174671. #endif
  174672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174673. "adds r4, r4, r5\n\t"
  174674. #else
  174675. "add r4, r4, r5\n\t"
  174676. #endif
  174677. #ifdef WOLFSSL_KEIL
  174678. "adcs r2, r2, r6\n\t"
  174679. #elif defined(__clang__)
  174680. "adcs r2, r6\n\t"
  174681. #else
  174682. "adc r2, r6\n\t"
  174683. #endif
  174684. #ifdef WOLFSSL_KEIL
  174685. "adcs r3, r3, %[r]\n\t"
  174686. #elif defined(__clang__)
  174687. "adcs r3, %[r]\n\t"
  174688. #else
  174689. "adc r3, %[r]\n\t"
  174690. #endif
  174691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174692. "adds r4, r4, r5\n\t"
  174693. #else
  174694. "add r4, r4, r5\n\t"
  174695. #endif
  174696. #ifdef WOLFSSL_KEIL
  174697. "adcs r2, r2, r6\n\t"
  174698. #elif defined(__clang__)
  174699. "adcs r2, r6\n\t"
  174700. #else
  174701. "adc r2, r6\n\t"
  174702. #endif
  174703. #ifdef WOLFSSL_KEIL
  174704. "adcs r3, r3, %[r]\n\t"
  174705. #elif defined(__clang__)
  174706. "adcs r3, %[r]\n\t"
  174707. #else
  174708. "adc r3, %[r]\n\t"
  174709. #endif
  174710. "# A[5] * A[3]\n\t"
  174711. "mov %[a], r9\n\t"
  174712. "mov r7, lr\n\t"
  174713. "ldr %[a], [%[a], #20]\n\t"
  174714. "uxth r5, %[a]\n\t"
  174715. "uxth r6, r7\n\t"
  174716. #ifdef WOLFSSL_KEIL
  174717. "muls r6, r5, r6\n\t"
  174718. #elif defined(__clang__)
  174719. "muls r6, r5\n\t"
  174720. #else
  174721. "mul r6, r5\n\t"
  174722. #endif
  174723. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174724. "adds r4, r4, r6\n\t"
  174725. #else
  174726. "add r4, r4, r6\n\t"
  174727. #endif
  174728. #ifdef WOLFSSL_KEIL
  174729. "adcs r2, r2, %[r]\n\t"
  174730. #elif defined(__clang__)
  174731. "adcs r2, %[r]\n\t"
  174732. #else
  174733. "adc r2, %[r]\n\t"
  174734. #endif
  174735. #ifdef WOLFSSL_KEIL
  174736. "adcs r3, r3, %[r]\n\t"
  174737. #elif defined(__clang__)
  174738. "adcs r3, %[r]\n\t"
  174739. #else
  174740. "adc r3, %[r]\n\t"
  174741. #endif
  174742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174743. "adds r4, r4, r6\n\t"
  174744. #else
  174745. "add r4, r4, r6\n\t"
  174746. #endif
  174747. #ifdef WOLFSSL_KEIL
  174748. "adcs r2, r2, %[r]\n\t"
  174749. #elif defined(__clang__)
  174750. "adcs r2, %[r]\n\t"
  174751. #else
  174752. "adc r2, %[r]\n\t"
  174753. #endif
  174754. #ifdef WOLFSSL_KEIL
  174755. "adcs r3, r3, %[r]\n\t"
  174756. #elif defined(__clang__)
  174757. "adcs r3, %[r]\n\t"
  174758. #else
  174759. "adc r3, %[r]\n\t"
  174760. #endif
  174761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174762. "lsrs r6, r7, #16\n\t"
  174763. #else
  174764. "lsr r6, r7, #16\n\t"
  174765. #endif
  174766. #ifdef WOLFSSL_KEIL
  174767. "muls r5, r6, r5\n\t"
  174768. #elif defined(__clang__)
  174769. "muls r5, r6\n\t"
  174770. #else
  174771. "mul r5, r6\n\t"
  174772. #endif
  174773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174774. "lsrs r6, r5, #16\n\t"
  174775. #else
  174776. "lsr r6, r5, #16\n\t"
  174777. #endif
  174778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174779. "lsls r5, r5, #16\n\t"
  174780. #else
  174781. "lsl r5, r5, #16\n\t"
  174782. #endif
  174783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174784. "adds r4, r4, r5\n\t"
  174785. #else
  174786. "add r4, r4, r5\n\t"
  174787. #endif
  174788. #ifdef WOLFSSL_KEIL
  174789. "adcs r2, r2, r6\n\t"
  174790. #elif defined(__clang__)
  174791. "adcs r2, r6\n\t"
  174792. #else
  174793. "adc r2, r6\n\t"
  174794. #endif
  174795. #ifdef WOLFSSL_KEIL
  174796. "adcs r3, r3, %[r]\n\t"
  174797. #elif defined(__clang__)
  174798. "adcs r3, %[r]\n\t"
  174799. #else
  174800. "adc r3, %[r]\n\t"
  174801. #endif
  174802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174803. "adds r4, r4, r5\n\t"
  174804. #else
  174805. "add r4, r4, r5\n\t"
  174806. #endif
  174807. #ifdef WOLFSSL_KEIL
  174808. "adcs r2, r2, r6\n\t"
  174809. #elif defined(__clang__)
  174810. "adcs r2, r6\n\t"
  174811. #else
  174812. "adc r2, r6\n\t"
  174813. #endif
  174814. #ifdef WOLFSSL_KEIL
  174815. "adcs r3, r3, %[r]\n\t"
  174816. #elif defined(__clang__)
  174817. "adcs r3, %[r]\n\t"
  174818. #else
  174819. "adc r3, %[r]\n\t"
  174820. #endif
  174821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174822. "lsrs r5, %[a], #16\n\t"
  174823. #else
  174824. "lsr r5, %[a], #16\n\t"
  174825. #endif
  174826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174827. "lsrs r6, r7, #16\n\t"
  174828. #else
  174829. "lsr r6, r7, #16\n\t"
  174830. #endif
  174831. #ifdef WOLFSSL_KEIL
  174832. "muls r6, r5, r6\n\t"
  174833. #elif defined(__clang__)
  174834. "muls r6, r5\n\t"
  174835. #else
  174836. "mul r6, r5\n\t"
  174837. #endif
  174838. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174839. "adds r2, r2, r6\n\t"
  174840. #else
  174841. "add r2, 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 r2, r2, r6\n\t"
  174852. #else
  174853. "add r2, r2, r6\n\t"
  174854. #endif
  174855. #ifdef WOLFSSL_KEIL
  174856. "adcs r3, r3, %[r]\n\t"
  174857. #elif defined(__clang__)
  174858. "adcs r3, %[r]\n\t"
  174859. #else
  174860. "adc r3, %[r]\n\t"
  174861. #endif
  174862. "uxth r6, r7\n\t"
  174863. #ifdef WOLFSSL_KEIL
  174864. "muls r5, r6, r5\n\t"
  174865. #elif defined(__clang__)
  174866. "muls r5, r6\n\t"
  174867. #else
  174868. "mul r5, r6\n\t"
  174869. #endif
  174870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174871. "lsrs r6, r5, #16\n\t"
  174872. #else
  174873. "lsr r6, r5, #16\n\t"
  174874. #endif
  174875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174876. "lsls r5, r5, #16\n\t"
  174877. #else
  174878. "lsl r5, r5, #16\n\t"
  174879. #endif
  174880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174881. "adds r4, r4, r5\n\t"
  174882. #else
  174883. "add r4, r4, r5\n\t"
  174884. #endif
  174885. #ifdef WOLFSSL_KEIL
  174886. "adcs r2, r2, r6\n\t"
  174887. #elif defined(__clang__)
  174888. "adcs r2, r6\n\t"
  174889. #else
  174890. "adc r2, r6\n\t"
  174891. #endif
  174892. #ifdef WOLFSSL_KEIL
  174893. "adcs r3, r3, %[r]\n\t"
  174894. #elif defined(__clang__)
  174895. "adcs r3, %[r]\n\t"
  174896. #else
  174897. "adc r3, %[r]\n\t"
  174898. #endif
  174899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174900. "adds r4, r4, r5\n\t"
  174901. #else
  174902. "add r4, r4, r5\n\t"
  174903. #endif
  174904. #ifdef WOLFSSL_KEIL
  174905. "adcs r2, r2, r6\n\t"
  174906. #elif defined(__clang__)
  174907. "adcs r2, r6\n\t"
  174908. #else
  174909. "adc r2, r6\n\t"
  174910. #endif
  174911. #ifdef WOLFSSL_KEIL
  174912. "adcs r3, r3, %[r]\n\t"
  174913. #elif defined(__clang__)
  174914. "adcs r3, %[r]\n\t"
  174915. #else
  174916. "adc r3, %[r]\n\t"
  174917. #endif
  174918. "# A[4] * A[4]\n\t"
  174919. "mov %[a], r9\n\t"
  174920. "ldr r7, [%[a], #16]\n\t"
  174921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174922. "lsrs r6, r7, #16\n\t"
  174923. #else
  174924. "lsr r6, r7, #16\n\t"
  174925. #endif
  174926. "uxth r5, r7\n\t"
  174927. #ifdef WOLFSSL_KEIL
  174928. "muls r5, r5, r5\n\t"
  174929. #elif defined(__clang__)
  174930. "muls r5, r5\n\t"
  174931. #else
  174932. "mul r5, r5\n\t"
  174933. #endif
  174934. #ifdef WOLFSSL_KEIL
  174935. "muls r6, r6, r6\n\t"
  174936. #elif defined(__clang__)
  174937. "muls r6, r6\n\t"
  174938. #else
  174939. "mul r6, r6\n\t"
  174940. #endif
  174941. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174942. "adds r4, r4, r5\n\t"
  174943. #else
  174944. "add r4, r4, r5\n\t"
  174945. #endif
  174946. #ifdef WOLFSSL_KEIL
  174947. "adcs r2, r2, r6\n\t"
  174948. #elif defined(__clang__)
  174949. "adcs r2, r6\n\t"
  174950. #else
  174951. "adc r2, r6\n\t"
  174952. #endif
  174953. #ifdef WOLFSSL_KEIL
  174954. "adcs r3, r3, %[r]\n\t"
  174955. #elif defined(__clang__)
  174956. "adcs r3, %[r]\n\t"
  174957. #else
  174958. "adc r3, %[r]\n\t"
  174959. #endif
  174960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174961. "lsrs r6, r7, #16\n\t"
  174962. #else
  174963. "lsr r6, r7, #16\n\t"
  174964. #endif
  174965. "uxth r5, r7\n\t"
  174966. #ifdef WOLFSSL_KEIL
  174967. "muls r5, r6, r5\n\t"
  174968. #elif defined(__clang__)
  174969. "muls r5, r6\n\t"
  174970. #else
  174971. "mul r5, r6\n\t"
  174972. #endif
  174973. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174974. "lsrs r6, r5, #15\n\t"
  174975. #else
  174976. "lsr r6, r5, #15\n\t"
  174977. #endif
  174978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174979. "lsls r5, r5, #17\n\t"
  174980. #else
  174981. "lsl r5, r5, #17\n\t"
  174982. #endif
  174983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  174984. "adds r4, r4, r5\n\t"
  174985. #else
  174986. "add r4, r4, r5\n\t"
  174987. #endif
  174988. #ifdef WOLFSSL_KEIL
  174989. "adcs r2, r2, r6\n\t"
  174990. #elif defined(__clang__)
  174991. "adcs r2, r6\n\t"
  174992. #else
  174993. "adc r2, r6\n\t"
  174994. #endif
  174995. #ifdef WOLFSSL_KEIL
  174996. "adcs r3, r3, %[r]\n\t"
  174997. #elif defined(__clang__)
  174998. "adcs r3, %[r]\n\t"
  174999. #else
  175000. "adc r3, %[r]\n\t"
  175001. #endif
  175002. "str r4, [sp, #32]\n\t"
  175003. "# A[5] * A[4]\n\t"
  175004. "movs r4, #0\n\t"
  175005. "ldr %[a], [%[a], #20]\n\t"
  175006. "uxth r5, %[a]\n\t"
  175007. "uxth r6, r7\n\t"
  175008. #ifdef WOLFSSL_KEIL
  175009. "muls r6, r5, r6\n\t"
  175010. #elif defined(__clang__)
  175011. "muls r6, r5\n\t"
  175012. #else
  175013. "mul r6, r5\n\t"
  175014. #endif
  175015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175016. "adds r2, r2, r6\n\t"
  175017. #else
  175018. "add r2, r2, r6\n\t"
  175019. #endif
  175020. #ifdef WOLFSSL_KEIL
  175021. "adcs r3, r3, %[r]\n\t"
  175022. #elif defined(__clang__)
  175023. "adcs r3, %[r]\n\t"
  175024. #else
  175025. "adc r3, %[r]\n\t"
  175026. #endif
  175027. #ifdef WOLFSSL_KEIL
  175028. "adcs r4, r4, %[r]\n\t"
  175029. #elif defined(__clang__)
  175030. "adcs r4, %[r]\n\t"
  175031. #else
  175032. "adc r4, %[r]\n\t"
  175033. #endif
  175034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175035. "adds r2, r2, r6\n\t"
  175036. #else
  175037. "add r2, r2, r6\n\t"
  175038. #endif
  175039. #ifdef WOLFSSL_KEIL
  175040. "adcs r3, r3, %[r]\n\t"
  175041. #elif defined(__clang__)
  175042. "adcs r3, %[r]\n\t"
  175043. #else
  175044. "adc r3, %[r]\n\t"
  175045. #endif
  175046. #ifdef WOLFSSL_KEIL
  175047. "adcs r4, r4, %[r]\n\t"
  175048. #elif defined(__clang__)
  175049. "adcs r4, %[r]\n\t"
  175050. #else
  175051. "adc r4, %[r]\n\t"
  175052. #endif
  175053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175054. "lsrs r6, r7, #16\n\t"
  175055. #else
  175056. "lsr r6, r7, #16\n\t"
  175057. #endif
  175058. #ifdef WOLFSSL_KEIL
  175059. "muls r5, r6, r5\n\t"
  175060. #elif defined(__clang__)
  175061. "muls r5, r6\n\t"
  175062. #else
  175063. "mul r5, r6\n\t"
  175064. #endif
  175065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175066. "lsrs r6, r5, #16\n\t"
  175067. #else
  175068. "lsr r6, r5, #16\n\t"
  175069. #endif
  175070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175071. "lsls r5, r5, #16\n\t"
  175072. #else
  175073. "lsl r5, r5, #16\n\t"
  175074. #endif
  175075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175076. "adds r2, r2, r5\n\t"
  175077. #else
  175078. "add r2, r2, r5\n\t"
  175079. #endif
  175080. #ifdef WOLFSSL_KEIL
  175081. "adcs r3, r3, r6\n\t"
  175082. #elif defined(__clang__)
  175083. "adcs r3, r6\n\t"
  175084. #else
  175085. "adc r3, r6\n\t"
  175086. #endif
  175087. #ifdef WOLFSSL_KEIL
  175088. "adcs r4, r4, %[r]\n\t"
  175089. #elif defined(__clang__)
  175090. "adcs r4, %[r]\n\t"
  175091. #else
  175092. "adc r4, %[r]\n\t"
  175093. #endif
  175094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175095. "adds r2, r2, r5\n\t"
  175096. #else
  175097. "add r2, r2, r5\n\t"
  175098. #endif
  175099. #ifdef WOLFSSL_KEIL
  175100. "adcs r3, r3, r6\n\t"
  175101. #elif defined(__clang__)
  175102. "adcs r3, r6\n\t"
  175103. #else
  175104. "adc r3, r6\n\t"
  175105. #endif
  175106. #ifdef WOLFSSL_KEIL
  175107. "adcs r4, r4, %[r]\n\t"
  175108. #elif defined(__clang__)
  175109. "adcs r4, %[r]\n\t"
  175110. #else
  175111. "adc r4, %[r]\n\t"
  175112. #endif
  175113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175114. "lsrs r5, %[a], #16\n\t"
  175115. #else
  175116. "lsr r5, %[a], #16\n\t"
  175117. #endif
  175118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175119. "lsrs r6, r7, #16\n\t"
  175120. #else
  175121. "lsr r6, r7, #16\n\t"
  175122. #endif
  175123. #ifdef WOLFSSL_KEIL
  175124. "muls r6, r5, r6\n\t"
  175125. #elif defined(__clang__)
  175126. "muls r6, r5\n\t"
  175127. #else
  175128. "mul r6, r5\n\t"
  175129. #endif
  175130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175131. "adds r3, r3, r6\n\t"
  175132. #else
  175133. "add r3, r3, r6\n\t"
  175134. #endif
  175135. #ifdef WOLFSSL_KEIL
  175136. "adcs r4, r4, %[r]\n\t"
  175137. #elif defined(__clang__)
  175138. "adcs r4, %[r]\n\t"
  175139. #else
  175140. "adc r4, %[r]\n\t"
  175141. #endif
  175142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175143. "adds r3, r3, r6\n\t"
  175144. #else
  175145. "add r3, r3, r6\n\t"
  175146. #endif
  175147. #ifdef WOLFSSL_KEIL
  175148. "adcs r4, r4, %[r]\n\t"
  175149. #elif defined(__clang__)
  175150. "adcs r4, %[r]\n\t"
  175151. #else
  175152. "adc r4, %[r]\n\t"
  175153. #endif
  175154. "uxth r6, r7\n\t"
  175155. #ifdef WOLFSSL_KEIL
  175156. "muls r5, r6, r5\n\t"
  175157. #elif defined(__clang__)
  175158. "muls r5, r6\n\t"
  175159. #else
  175160. "mul r5, r6\n\t"
  175161. #endif
  175162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175163. "lsrs r6, r5, #16\n\t"
  175164. #else
  175165. "lsr r6, r5, #16\n\t"
  175166. #endif
  175167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175168. "lsls r5, r5, #16\n\t"
  175169. #else
  175170. "lsl r5, r5, #16\n\t"
  175171. #endif
  175172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175173. "adds r2, r2, r5\n\t"
  175174. #else
  175175. "add r2, r2, r5\n\t"
  175176. #endif
  175177. #ifdef WOLFSSL_KEIL
  175178. "adcs r3, r3, r6\n\t"
  175179. #elif defined(__clang__)
  175180. "adcs r3, r6\n\t"
  175181. #else
  175182. "adc r3, r6\n\t"
  175183. #endif
  175184. #ifdef WOLFSSL_KEIL
  175185. "adcs r4, r4, %[r]\n\t"
  175186. #elif defined(__clang__)
  175187. "adcs r4, %[r]\n\t"
  175188. #else
  175189. "adc r4, %[r]\n\t"
  175190. #endif
  175191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175192. "adds r2, r2, r5\n\t"
  175193. #else
  175194. "add r2, r2, r5\n\t"
  175195. #endif
  175196. #ifdef WOLFSSL_KEIL
  175197. "adcs r3, r3, r6\n\t"
  175198. #elif defined(__clang__)
  175199. "adcs r3, r6\n\t"
  175200. #else
  175201. "adc r3, r6\n\t"
  175202. #endif
  175203. #ifdef WOLFSSL_KEIL
  175204. "adcs r4, r4, %[r]\n\t"
  175205. #elif defined(__clang__)
  175206. "adcs r4, %[r]\n\t"
  175207. #else
  175208. "adc r4, %[r]\n\t"
  175209. #endif
  175210. "# A[6] * A[3]\n\t"
  175211. "mov %[a], r9\n\t"
  175212. "mov r7, lr\n\t"
  175213. "ldr %[a], [%[a], #24]\n\t"
  175214. "uxth r5, %[a]\n\t"
  175215. "uxth r6, r7\n\t"
  175216. #ifdef WOLFSSL_KEIL
  175217. "muls r6, r5, r6\n\t"
  175218. #elif defined(__clang__)
  175219. "muls r6, r5\n\t"
  175220. #else
  175221. "mul r6, r5\n\t"
  175222. #endif
  175223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175224. "adds r2, r2, r6\n\t"
  175225. #else
  175226. "add r2, r2, r6\n\t"
  175227. #endif
  175228. #ifdef WOLFSSL_KEIL
  175229. "adcs r3, r3, %[r]\n\t"
  175230. #elif defined(__clang__)
  175231. "adcs r3, %[r]\n\t"
  175232. #else
  175233. "adc r3, %[r]\n\t"
  175234. #endif
  175235. #ifdef WOLFSSL_KEIL
  175236. "adcs r4, r4, %[r]\n\t"
  175237. #elif defined(__clang__)
  175238. "adcs r4, %[r]\n\t"
  175239. #else
  175240. "adc r4, %[r]\n\t"
  175241. #endif
  175242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175243. "adds r2, r2, r6\n\t"
  175244. #else
  175245. "add r2, r2, r6\n\t"
  175246. #endif
  175247. #ifdef WOLFSSL_KEIL
  175248. "adcs r3, r3, %[r]\n\t"
  175249. #elif defined(__clang__)
  175250. "adcs r3, %[r]\n\t"
  175251. #else
  175252. "adc r3, %[r]\n\t"
  175253. #endif
  175254. #ifdef WOLFSSL_KEIL
  175255. "adcs r4, r4, %[r]\n\t"
  175256. #elif defined(__clang__)
  175257. "adcs r4, %[r]\n\t"
  175258. #else
  175259. "adc r4, %[r]\n\t"
  175260. #endif
  175261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175262. "lsrs r6, r7, #16\n\t"
  175263. #else
  175264. "lsr r6, r7, #16\n\t"
  175265. #endif
  175266. #ifdef WOLFSSL_KEIL
  175267. "muls r5, r6, r5\n\t"
  175268. #elif defined(__clang__)
  175269. "muls r5, r6\n\t"
  175270. #else
  175271. "mul r5, r6\n\t"
  175272. #endif
  175273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175274. "lsrs r6, r5, #16\n\t"
  175275. #else
  175276. "lsr r6, r5, #16\n\t"
  175277. #endif
  175278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175279. "lsls r5, r5, #16\n\t"
  175280. #else
  175281. "lsl r5, r5, #16\n\t"
  175282. #endif
  175283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175284. "adds r2, r2, r5\n\t"
  175285. #else
  175286. "add r2, r2, r5\n\t"
  175287. #endif
  175288. #ifdef WOLFSSL_KEIL
  175289. "adcs r3, r3, r6\n\t"
  175290. #elif defined(__clang__)
  175291. "adcs r3, r6\n\t"
  175292. #else
  175293. "adc r3, r6\n\t"
  175294. #endif
  175295. #ifdef WOLFSSL_KEIL
  175296. "adcs r4, r4, %[r]\n\t"
  175297. #elif defined(__clang__)
  175298. "adcs r4, %[r]\n\t"
  175299. #else
  175300. "adc r4, %[r]\n\t"
  175301. #endif
  175302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175303. "adds r2, r2, r5\n\t"
  175304. #else
  175305. "add r2, r2, r5\n\t"
  175306. #endif
  175307. #ifdef WOLFSSL_KEIL
  175308. "adcs r3, r3, r6\n\t"
  175309. #elif defined(__clang__)
  175310. "adcs r3, r6\n\t"
  175311. #else
  175312. "adc r3, r6\n\t"
  175313. #endif
  175314. #ifdef WOLFSSL_KEIL
  175315. "adcs r4, r4, %[r]\n\t"
  175316. #elif defined(__clang__)
  175317. "adcs r4, %[r]\n\t"
  175318. #else
  175319. "adc r4, %[r]\n\t"
  175320. #endif
  175321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175322. "lsrs r5, %[a], #16\n\t"
  175323. #else
  175324. "lsr r5, %[a], #16\n\t"
  175325. #endif
  175326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175327. "lsrs r6, r7, #16\n\t"
  175328. #else
  175329. "lsr r6, r7, #16\n\t"
  175330. #endif
  175331. #ifdef WOLFSSL_KEIL
  175332. "muls r6, r5, r6\n\t"
  175333. #elif defined(__clang__)
  175334. "muls r6, r5\n\t"
  175335. #else
  175336. "mul r6, r5\n\t"
  175337. #endif
  175338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175339. "adds r3, r3, r6\n\t"
  175340. #else
  175341. "add r3, r3, r6\n\t"
  175342. #endif
  175343. #ifdef WOLFSSL_KEIL
  175344. "adcs r4, r4, %[r]\n\t"
  175345. #elif defined(__clang__)
  175346. "adcs r4, %[r]\n\t"
  175347. #else
  175348. "adc r4, %[r]\n\t"
  175349. #endif
  175350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175351. "adds r3, r3, r6\n\t"
  175352. #else
  175353. "add r3, r3, r6\n\t"
  175354. #endif
  175355. #ifdef WOLFSSL_KEIL
  175356. "adcs r4, r4, %[r]\n\t"
  175357. #elif defined(__clang__)
  175358. "adcs r4, %[r]\n\t"
  175359. #else
  175360. "adc r4, %[r]\n\t"
  175361. #endif
  175362. "uxth r6, r7\n\t"
  175363. #ifdef WOLFSSL_KEIL
  175364. "muls r5, r6, r5\n\t"
  175365. #elif defined(__clang__)
  175366. "muls r5, r6\n\t"
  175367. #else
  175368. "mul r5, r6\n\t"
  175369. #endif
  175370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175371. "lsrs r6, r5, #16\n\t"
  175372. #else
  175373. "lsr r6, r5, #16\n\t"
  175374. #endif
  175375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175376. "lsls r5, r5, #16\n\t"
  175377. #else
  175378. "lsl r5, r5, #16\n\t"
  175379. #endif
  175380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175381. "adds r2, r2, r5\n\t"
  175382. #else
  175383. "add r2, r2, r5\n\t"
  175384. #endif
  175385. #ifdef WOLFSSL_KEIL
  175386. "adcs r3, r3, r6\n\t"
  175387. #elif defined(__clang__)
  175388. "adcs r3, r6\n\t"
  175389. #else
  175390. "adc r3, r6\n\t"
  175391. #endif
  175392. #ifdef WOLFSSL_KEIL
  175393. "adcs r4, r4, %[r]\n\t"
  175394. #elif defined(__clang__)
  175395. "adcs r4, %[r]\n\t"
  175396. #else
  175397. "adc r4, %[r]\n\t"
  175398. #endif
  175399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175400. "adds r2, r2, r5\n\t"
  175401. #else
  175402. "add r2, r2, r5\n\t"
  175403. #endif
  175404. #ifdef WOLFSSL_KEIL
  175405. "adcs r3, r3, r6\n\t"
  175406. #elif defined(__clang__)
  175407. "adcs r3, r6\n\t"
  175408. #else
  175409. "adc r3, r6\n\t"
  175410. #endif
  175411. #ifdef WOLFSSL_KEIL
  175412. "adcs r4, r4, %[r]\n\t"
  175413. #elif defined(__clang__)
  175414. "adcs r4, %[r]\n\t"
  175415. #else
  175416. "adc r4, %[r]\n\t"
  175417. #endif
  175418. "# A[7] * A[2]\n\t"
  175419. "mov %[a], r9\n\t"
  175420. "mov r7, r12\n\t"
  175421. "ldr %[a], [%[a], #28]\n\t"
  175422. "uxth r5, %[a]\n\t"
  175423. "uxth r6, r7\n\t"
  175424. #ifdef WOLFSSL_KEIL
  175425. "muls r6, r5, r6\n\t"
  175426. #elif defined(__clang__)
  175427. "muls r6, r5\n\t"
  175428. #else
  175429. "mul r6, r5\n\t"
  175430. #endif
  175431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175432. "adds r2, r2, r6\n\t"
  175433. #else
  175434. "add r2, r2, r6\n\t"
  175435. #endif
  175436. #ifdef WOLFSSL_KEIL
  175437. "adcs r3, r3, %[r]\n\t"
  175438. #elif defined(__clang__)
  175439. "adcs r3, %[r]\n\t"
  175440. #else
  175441. "adc r3, %[r]\n\t"
  175442. #endif
  175443. #ifdef WOLFSSL_KEIL
  175444. "adcs r4, r4, %[r]\n\t"
  175445. #elif defined(__clang__)
  175446. "adcs r4, %[r]\n\t"
  175447. #else
  175448. "adc r4, %[r]\n\t"
  175449. #endif
  175450. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175451. "adds r2, r2, r6\n\t"
  175452. #else
  175453. "add r2, r2, r6\n\t"
  175454. #endif
  175455. #ifdef WOLFSSL_KEIL
  175456. "adcs r3, r3, %[r]\n\t"
  175457. #elif defined(__clang__)
  175458. "adcs r3, %[r]\n\t"
  175459. #else
  175460. "adc r3, %[r]\n\t"
  175461. #endif
  175462. #ifdef WOLFSSL_KEIL
  175463. "adcs r4, r4, %[r]\n\t"
  175464. #elif defined(__clang__)
  175465. "adcs r4, %[r]\n\t"
  175466. #else
  175467. "adc r4, %[r]\n\t"
  175468. #endif
  175469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175470. "lsrs r6, r7, #16\n\t"
  175471. #else
  175472. "lsr r6, r7, #16\n\t"
  175473. #endif
  175474. #ifdef WOLFSSL_KEIL
  175475. "muls r5, r6, r5\n\t"
  175476. #elif defined(__clang__)
  175477. "muls r5, r6\n\t"
  175478. #else
  175479. "mul r5, r6\n\t"
  175480. #endif
  175481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175482. "lsrs r6, r5, #16\n\t"
  175483. #else
  175484. "lsr r6, r5, #16\n\t"
  175485. #endif
  175486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175487. "lsls r5, r5, #16\n\t"
  175488. #else
  175489. "lsl r5, r5, #16\n\t"
  175490. #endif
  175491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175492. "adds r2, r2, r5\n\t"
  175493. #else
  175494. "add r2, r2, r5\n\t"
  175495. #endif
  175496. #ifdef WOLFSSL_KEIL
  175497. "adcs r3, r3, r6\n\t"
  175498. #elif defined(__clang__)
  175499. "adcs r3, r6\n\t"
  175500. #else
  175501. "adc r3, r6\n\t"
  175502. #endif
  175503. #ifdef WOLFSSL_KEIL
  175504. "adcs r4, r4, %[r]\n\t"
  175505. #elif defined(__clang__)
  175506. "adcs r4, %[r]\n\t"
  175507. #else
  175508. "adc r4, %[r]\n\t"
  175509. #endif
  175510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175511. "adds r2, r2, r5\n\t"
  175512. #else
  175513. "add r2, r2, r5\n\t"
  175514. #endif
  175515. #ifdef WOLFSSL_KEIL
  175516. "adcs r3, r3, r6\n\t"
  175517. #elif defined(__clang__)
  175518. "adcs r3, r6\n\t"
  175519. #else
  175520. "adc r3, r6\n\t"
  175521. #endif
  175522. #ifdef WOLFSSL_KEIL
  175523. "adcs r4, r4, %[r]\n\t"
  175524. #elif defined(__clang__)
  175525. "adcs r4, %[r]\n\t"
  175526. #else
  175527. "adc r4, %[r]\n\t"
  175528. #endif
  175529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175530. "lsrs r5, %[a], #16\n\t"
  175531. #else
  175532. "lsr r5, %[a], #16\n\t"
  175533. #endif
  175534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175535. "lsrs r6, r7, #16\n\t"
  175536. #else
  175537. "lsr r6, r7, #16\n\t"
  175538. #endif
  175539. #ifdef WOLFSSL_KEIL
  175540. "muls r6, r5, r6\n\t"
  175541. #elif defined(__clang__)
  175542. "muls r6, r5\n\t"
  175543. #else
  175544. "mul r6, r5\n\t"
  175545. #endif
  175546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175547. "adds r3, r3, r6\n\t"
  175548. #else
  175549. "add r3, 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 r3, r3, r6\n\t"
  175560. #else
  175561. "add r3, r3, r6\n\t"
  175562. #endif
  175563. #ifdef WOLFSSL_KEIL
  175564. "adcs r4, r4, %[r]\n\t"
  175565. #elif defined(__clang__)
  175566. "adcs r4, %[r]\n\t"
  175567. #else
  175568. "adc r4, %[r]\n\t"
  175569. #endif
  175570. "uxth r6, r7\n\t"
  175571. #ifdef WOLFSSL_KEIL
  175572. "muls r5, r6, r5\n\t"
  175573. #elif defined(__clang__)
  175574. "muls r5, r6\n\t"
  175575. #else
  175576. "mul r5, r6\n\t"
  175577. #endif
  175578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175579. "lsrs r6, r5, #16\n\t"
  175580. #else
  175581. "lsr r6, r5, #16\n\t"
  175582. #endif
  175583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175584. "lsls r5, r5, #16\n\t"
  175585. #else
  175586. "lsl r5, r5, #16\n\t"
  175587. #endif
  175588. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175589. "adds r2, r2, r5\n\t"
  175590. #else
  175591. "add r2, r2, r5\n\t"
  175592. #endif
  175593. #ifdef WOLFSSL_KEIL
  175594. "adcs r3, r3, r6\n\t"
  175595. #elif defined(__clang__)
  175596. "adcs r3, r6\n\t"
  175597. #else
  175598. "adc r3, r6\n\t"
  175599. #endif
  175600. #ifdef WOLFSSL_KEIL
  175601. "adcs r4, r4, %[r]\n\t"
  175602. #elif defined(__clang__)
  175603. "adcs r4, %[r]\n\t"
  175604. #else
  175605. "adc r4, %[r]\n\t"
  175606. #endif
  175607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175608. "adds r2, r2, r5\n\t"
  175609. #else
  175610. "add r2, r2, r5\n\t"
  175611. #endif
  175612. #ifdef WOLFSSL_KEIL
  175613. "adcs r3, r3, r6\n\t"
  175614. #elif defined(__clang__)
  175615. "adcs r3, r6\n\t"
  175616. #else
  175617. "adc r3, r6\n\t"
  175618. #endif
  175619. #ifdef WOLFSSL_KEIL
  175620. "adcs r4, r4, %[r]\n\t"
  175621. #elif defined(__clang__)
  175622. "adcs r4, %[r]\n\t"
  175623. #else
  175624. "adc r4, %[r]\n\t"
  175625. #endif
  175626. "# A[8] * A[1]\n\t"
  175627. "mov %[a], r9\n\t"
  175628. "mov r7, r11\n\t"
  175629. "ldr %[a], [%[a], #32]\n\t"
  175630. "uxth r5, %[a]\n\t"
  175631. "uxth r6, r7\n\t"
  175632. #ifdef WOLFSSL_KEIL
  175633. "muls r6, r5, r6\n\t"
  175634. #elif defined(__clang__)
  175635. "muls r6, r5\n\t"
  175636. #else
  175637. "mul r6, r5\n\t"
  175638. #endif
  175639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175640. "adds r2, r2, r6\n\t"
  175641. #else
  175642. "add r2, r2, r6\n\t"
  175643. #endif
  175644. #ifdef WOLFSSL_KEIL
  175645. "adcs r3, r3, %[r]\n\t"
  175646. #elif defined(__clang__)
  175647. "adcs r3, %[r]\n\t"
  175648. #else
  175649. "adc r3, %[r]\n\t"
  175650. #endif
  175651. #ifdef WOLFSSL_KEIL
  175652. "adcs r4, r4, %[r]\n\t"
  175653. #elif defined(__clang__)
  175654. "adcs r4, %[r]\n\t"
  175655. #else
  175656. "adc r4, %[r]\n\t"
  175657. #endif
  175658. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175659. "adds r2, r2, r6\n\t"
  175660. #else
  175661. "add r2, r2, r6\n\t"
  175662. #endif
  175663. #ifdef WOLFSSL_KEIL
  175664. "adcs r3, r3, %[r]\n\t"
  175665. #elif defined(__clang__)
  175666. "adcs r3, %[r]\n\t"
  175667. #else
  175668. "adc r3, %[r]\n\t"
  175669. #endif
  175670. #ifdef WOLFSSL_KEIL
  175671. "adcs r4, r4, %[r]\n\t"
  175672. #elif defined(__clang__)
  175673. "adcs r4, %[r]\n\t"
  175674. #else
  175675. "adc r4, %[r]\n\t"
  175676. #endif
  175677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175678. "lsrs r6, r7, #16\n\t"
  175679. #else
  175680. "lsr r6, r7, #16\n\t"
  175681. #endif
  175682. #ifdef WOLFSSL_KEIL
  175683. "muls r5, r6, r5\n\t"
  175684. #elif defined(__clang__)
  175685. "muls r5, r6\n\t"
  175686. #else
  175687. "mul r5, r6\n\t"
  175688. #endif
  175689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175690. "lsrs r6, r5, #16\n\t"
  175691. #else
  175692. "lsr r6, r5, #16\n\t"
  175693. #endif
  175694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175695. "lsls r5, r5, #16\n\t"
  175696. #else
  175697. "lsl r5, r5, #16\n\t"
  175698. #endif
  175699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175700. "adds r2, r2, r5\n\t"
  175701. #else
  175702. "add r2, r2, r5\n\t"
  175703. #endif
  175704. #ifdef WOLFSSL_KEIL
  175705. "adcs r3, r3, r6\n\t"
  175706. #elif defined(__clang__)
  175707. "adcs r3, r6\n\t"
  175708. #else
  175709. "adc r3, r6\n\t"
  175710. #endif
  175711. #ifdef WOLFSSL_KEIL
  175712. "adcs r4, r4, %[r]\n\t"
  175713. #elif defined(__clang__)
  175714. "adcs r4, %[r]\n\t"
  175715. #else
  175716. "adc r4, %[r]\n\t"
  175717. #endif
  175718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175719. "adds r2, r2, r5\n\t"
  175720. #else
  175721. "add r2, r2, r5\n\t"
  175722. #endif
  175723. #ifdef WOLFSSL_KEIL
  175724. "adcs r3, r3, r6\n\t"
  175725. #elif defined(__clang__)
  175726. "adcs r3, r6\n\t"
  175727. #else
  175728. "adc r3, r6\n\t"
  175729. #endif
  175730. #ifdef WOLFSSL_KEIL
  175731. "adcs r4, r4, %[r]\n\t"
  175732. #elif defined(__clang__)
  175733. "adcs r4, %[r]\n\t"
  175734. #else
  175735. "adc r4, %[r]\n\t"
  175736. #endif
  175737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175738. "lsrs r5, %[a], #16\n\t"
  175739. #else
  175740. "lsr r5, %[a], #16\n\t"
  175741. #endif
  175742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175743. "lsrs r6, r7, #16\n\t"
  175744. #else
  175745. "lsr r6, r7, #16\n\t"
  175746. #endif
  175747. #ifdef WOLFSSL_KEIL
  175748. "muls r6, r5, r6\n\t"
  175749. #elif defined(__clang__)
  175750. "muls r6, r5\n\t"
  175751. #else
  175752. "mul r6, r5\n\t"
  175753. #endif
  175754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175755. "adds r3, r3, r6\n\t"
  175756. #else
  175757. "add r3, 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 r3, r3, r6\n\t"
  175768. #else
  175769. "add r3, r3, r6\n\t"
  175770. #endif
  175771. #ifdef WOLFSSL_KEIL
  175772. "adcs r4, r4, %[r]\n\t"
  175773. #elif defined(__clang__)
  175774. "adcs r4, %[r]\n\t"
  175775. #else
  175776. "adc r4, %[r]\n\t"
  175777. #endif
  175778. "uxth r6, r7\n\t"
  175779. #ifdef WOLFSSL_KEIL
  175780. "muls r5, r6, r5\n\t"
  175781. #elif defined(__clang__)
  175782. "muls r5, r6\n\t"
  175783. #else
  175784. "mul r5, r6\n\t"
  175785. #endif
  175786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175787. "lsrs r6, r5, #16\n\t"
  175788. #else
  175789. "lsr r6, r5, #16\n\t"
  175790. #endif
  175791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175792. "lsls r5, r5, #16\n\t"
  175793. #else
  175794. "lsl r5, r5, #16\n\t"
  175795. #endif
  175796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175797. "adds r2, r2, r5\n\t"
  175798. #else
  175799. "add r2, r2, r5\n\t"
  175800. #endif
  175801. #ifdef WOLFSSL_KEIL
  175802. "adcs r3, r3, r6\n\t"
  175803. #elif defined(__clang__)
  175804. "adcs r3, r6\n\t"
  175805. #else
  175806. "adc r3, r6\n\t"
  175807. #endif
  175808. #ifdef WOLFSSL_KEIL
  175809. "adcs r4, r4, %[r]\n\t"
  175810. #elif defined(__clang__)
  175811. "adcs r4, %[r]\n\t"
  175812. #else
  175813. "adc r4, %[r]\n\t"
  175814. #endif
  175815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175816. "adds r2, r2, r5\n\t"
  175817. #else
  175818. "add r2, r2, r5\n\t"
  175819. #endif
  175820. #ifdef WOLFSSL_KEIL
  175821. "adcs r3, r3, r6\n\t"
  175822. #elif defined(__clang__)
  175823. "adcs r3, r6\n\t"
  175824. #else
  175825. "adc r3, r6\n\t"
  175826. #endif
  175827. #ifdef WOLFSSL_KEIL
  175828. "adcs r4, r4, %[r]\n\t"
  175829. #elif defined(__clang__)
  175830. "adcs r4, %[r]\n\t"
  175831. #else
  175832. "adc r4, %[r]\n\t"
  175833. #endif
  175834. "# A[9] * A[0]\n\t"
  175835. "mov %[a], r9\n\t"
  175836. "mov r7, r10\n\t"
  175837. "ldr %[a], [%[a], #36]\n\t"
  175838. "uxth r5, %[a]\n\t"
  175839. "uxth r6, r7\n\t"
  175840. #ifdef WOLFSSL_KEIL
  175841. "muls r6, r5, r6\n\t"
  175842. #elif defined(__clang__)
  175843. "muls r6, r5\n\t"
  175844. #else
  175845. "mul r6, r5\n\t"
  175846. #endif
  175847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175848. "adds r2, r2, r6\n\t"
  175849. #else
  175850. "add r2, r2, r6\n\t"
  175851. #endif
  175852. #ifdef WOLFSSL_KEIL
  175853. "adcs r3, r3, %[r]\n\t"
  175854. #elif defined(__clang__)
  175855. "adcs r3, %[r]\n\t"
  175856. #else
  175857. "adc r3, %[r]\n\t"
  175858. #endif
  175859. #ifdef WOLFSSL_KEIL
  175860. "adcs r4, r4, %[r]\n\t"
  175861. #elif defined(__clang__)
  175862. "adcs r4, %[r]\n\t"
  175863. #else
  175864. "adc r4, %[r]\n\t"
  175865. #endif
  175866. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175867. "adds r2, r2, r6\n\t"
  175868. #else
  175869. "add r2, r2, r6\n\t"
  175870. #endif
  175871. #ifdef WOLFSSL_KEIL
  175872. "adcs r3, r3, %[r]\n\t"
  175873. #elif defined(__clang__)
  175874. "adcs r3, %[r]\n\t"
  175875. #else
  175876. "adc r3, %[r]\n\t"
  175877. #endif
  175878. #ifdef WOLFSSL_KEIL
  175879. "adcs r4, r4, %[r]\n\t"
  175880. #elif defined(__clang__)
  175881. "adcs r4, %[r]\n\t"
  175882. #else
  175883. "adc r4, %[r]\n\t"
  175884. #endif
  175885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175886. "lsrs r6, r7, #16\n\t"
  175887. #else
  175888. "lsr r6, r7, #16\n\t"
  175889. #endif
  175890. #ifdef WOLFSSL_KEIL
  175891. "muls r5, r6, r5\n\t"
  175892. #elif defined(__clang__)
  175893. "muls r5, r6\n\t"
  175894. #else
  175895. "mul r5, r6\n\t"
  175896. #endif
  175897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175898. "lsrs r6, r5, #16\n\t"
  175899. #else
  175900. "lsr r6, r5, #16\n\t"
  175901. #endif
  175902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175903. "lsls r5, r5, #16\n\t"
  175904. #else
  175905. "lsl r5, r5, #16\n\t"
  175906. #endif
  175907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175908. "adds r2, r2, r5\n\t"
  175909. #else
  175910. "add r2, r2, r5\n\t"
  175911. #endif
  175912. #ifdef WOLFSSL_KEIL
  175913. "adcs r3, r3, r6\n\t"
  175914. #elif defined(__clang__)
  175915. "adcs r3, r6\n\t"
  175916. #else
  175917. "adc r3, r6\n\t"
  175918. #endif
  175919. #ifdef WOLFSSL_KEIL
  175920. "adcs r4, r4, %[r]\n\t"
  175921. #elif defined(__clang__)
  175922. "adcs r4, %[r]\n\t"
  175923. #else
  175924. "adc r4, %[r]\n\t"
  175925. #endif
  175926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175927. "adds r2, r2, r5\n\t"
  175928. #else
  175929. "add r2, r2, r5\n\t"
  175930. #endif
  175931. #ifdef WOLFSSL_KEIL
  175932. "adcs r3, r3, r6\n\t"
  175933. #elif defined(__clang__)
  175934. "adcs r3, r6\n\t"
  175935. #else
  175936. "adc r3, r6\n\t"
  175937. #endif
  175938. #ifdef WOLFSSL_KEIL
  175939. "adcs r4, r4, %[r]\n\t"
  175940. #elif defined(__clang__)
  175941. "adcs r4, %[r]\n\t"
  175942. #else
  175943. "adc r4, %[r]\n\t"
  175944. #endif
  175945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175946. "lsrs r5, %[a], #16\n\t"
  175947. #else
  175948. "lsr r5, %[a], #16\n\t"
  175949. #endif
  175950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175951. "lsrs r6, r7, #16\n\t"
  175952. #else
  175953. "lsr r6, r7, #16\n\t"
  175954. #endif
  175955. #ifdef WOLFSSL_KEIL
  175956. "muls r6, r5, r6\n\t"
  175957. #elif defined(__clang__)
  175958. "muls r6, r5\n\t"
  175959. #else
  175960. "mul r6, r5\n\t"
  175961. #endif
  175962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175963. "adds r3, r3, r6\n\t"
  175964. #else
  175965. "add r3, 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 r3, r3, r6\n\t"
  175976. #else
  175977. "add r3, r3, r6\n\t"
  175978. #endif
  175979. #ifdef WOLFSSL_KEIL
  175980. "adcs r4, r4, %[r]\n\t"
  175981. #elif defined(__clang__)
  175982. "adcs r4, %[r]\n\t"
  175983. #else
  175984. "adc r4, %[r]\n\t"
  175985. #endif
  175986. "uxth r6, r7\n\t"
  175987. #ifdef WOLFSSL_KEIL
  175988. "muls r5, r6, r5\n\t"
  175989. #elif defined(__clang__)
  175990. "muls r5, r6\n\t"
  175991. #else
  175992. "mul r5, r6\n\t"
  175993. #endif
  175994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  175995. "lsrs r6, r5, #16\n\t"
  175996. #else
  175997. "lsr r6, r5, #16\n\t"
  175998. #endif
  175999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176000. "lsls r5, r5, #16\n\t"
  176001. #else
  176002. "lsl r5, r5, #16\n\t"
  176003. #endif
  176004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176005. "adds r2, r2, r5\n\t"
  176006. #else
  176007. "add r2, r2, r5\n\t"
  176008. #endif
  176009. #ifdef WOLFSSL_KEIL
  176010. "adcs r3, r3, r6\n\t"
  176011. #elif defined(__clang__)
  176012. "adcs r3, r6\n\t"
  176013. #else
  176014. "adc r3, r6\n\t"
  176015. #endif
  176016. #ifdef WOLFSSL_KEIL
  176017. "adcs r4, r4, %[r]\n\t"
  176018. #elif defined(__clang__)
  176019. "adcs r4, %[r]\n\t"
  176020. #else
  176021. "adc r4, %[r]\n\t"
  176022. #endif
  176023. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176024. "adds r2, r2, r5\n\t"
  176025. #else
  176026. "add r2, r2, r5\n\t"
  176027. #endif
  176028. #ifdef WOLFSSL_KEIL
  176029. "adcs r3, r3, r6\n\t"
  176030. #elif defined(__clang__)
  176031. "adcs r3, r6\n\t"
  176032. #else
  176033. "adc r3, r6\n\t"
  176034. #endif
  176035. #ifdef WOLFSSL_KEIL
  176036. "adcs r4, r4, %[r]\n\t"
  176037. #elif defined(__clang__)
  176038. "adcs r4, %[r]\n\t"
  176039. #else
  176040. "adc r4, %[r]\n\t"
  176041. #endif
  176042. "str r2, [sp, #36]\n\t"
  176043. "# A[10] * A[0]\n\t"
  176044. "movs r2, #0\n\t"
  176045. "mov %[a], r9\n\t"
  176046. "ldr %[a], [%[a], #40]\n\t"
  176047. "uxth r5, %[a]\n\t"
  176048. "uxth r6, r7\n\t"
  176049. #ifdef WOLFSSL_KEIL
  176050. "muls r6, r5, r6\n\t"
  176051. #elif defined(__clang__)
  176052. "muls r6, r5\n\t"
  176053. #else
  176054. "mul r6, r5\n\t"
  176055. #endif
  176056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176057. "adds r3, r3, r6\n\t"
  176058. #else
  176059. "add r3, r3, r6\n\t"
  176060. #endif
  176061. #ifdef WOLFSSL_KEIL
  176062. "adcs r4, r4, %[r]\n\t"
  176063. #elif defined(__clang__)
  176064. "adcs r4, %[r]\n\t"
  176065. #else
  176066. "adc r4, %[r]\n\t"
  176067. #endif
  176068. #ifdef WOLFSSL_KEIL
  176069. "adcs r2, r2, %[r]\n\t"
  176070. #elif defined(__clang__)
  176071. "adcs r2, %[r]\n\t"
  176072. #else
  176073. "adc r2, %[r]\n\t"
  176074. #endif
  176075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176076. "adds r3, r3, r6\n\t"
  176077. #else
  176078. "add r3, r3, r6\n\t"
  176079. #endif
  176080. #ifdef WOLFSSL_KEIL
  176081. "adcs r4, r4, %[r]\n\t"
  176082. #elif defined(__clang__)
  176083. "adcs r4, %[r]\n\t"
  176084. #else
  176085. "adc r4, %[r]\n\t"
  176086. #endif
  176087. #ifdef WOLFSSL_KEIL
  176088. "adcs r2, r2, %[r]\n\t"
  176089. #elif defined(__clang__)
  176090. "adcs r2, %[r]\n\t"
  176091. #else
  176092. "adc r2, %[r]\n\t"
  176093. #endif
  176094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176095. "lsrs r6, r7, #16\n\t"
  176096. #else
  176097. "lsr r6, r7, #16\n\t"
  176098. #endif
  176099. #ifdef WOLFSSL_KEIL
  176100. "muls r5, r6, r5\n\t"
  176101. #elif defined(__clang__)
  176102. "muls r5, r6\n\t"
  176103. #else
  176104. "mul r5, r6\n\t"
  176105. #endif
  176106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176107. "lsrs r6, r5, #16\n\t"
  176108. #else
  176109. "lsr r6, r5, #16\n\t"
  176110. #endif
  176111. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176112. "lsls r5, r5, #16\n\t"
  176113. #else
  176114. "lsl r5, r5, #16\n\t"
  176115. #endif
  176116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176117. "adds r3, r3, r5\n\t"
  176118. #else
  176119. "add r3, r3, r5\n\t"
  176120. #endif
  176121. #ifdef WOLFSSL_KEIL
  176122. "adcs r4, r4, r6\n\t"
  176123. #elif defined(__clang__)
  176124. "adcs r4, r6\n\t"
  176125. #else
  176126. "adc r4, r6\n\t"
  176127. #endif
  176128. #ifdef WOLFSSL_KEIL
  176129. "adcs r2, r2, %[r]\n\t"
  176130. #elif defined(__clang__)
  176131. "adcs r2, %[r]\n\t"
  176132. #else
  176133. "adc r2, %[r]\n\t"
  176134. #endif
  176135. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176136. "adds r3, r3, r5\n\t"
  176137. #else
  176138. "add r3, r3, r5\n\t"
  176139. #endif
  176140. #ifdef WOLFSSL_KEIL
  176141. "adcs r4, r4, r6\n\t"
  176142. #elif defined(__clang__)
  176143. "adcs r4, r6\n\t"
  176144. #else
  176145. "adc r4, r6\n\t"
  176146. #endif
  176147. #ifdef WOLFSSL_KEIL
  176148. "adcs r2, r2, %[r]\n\t"
  176149. #elif defined(__clang__)
  176150. "adcs r2, %[r]\n\t"
  176151. #else
  176152. "adc r2, %[r]\n\t"
  176153. #endif
  176154. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176155. "lsrs r5, %[a], #16\n\t"
  176156. #else
  176157. "lsr r5, %[a], #16\n\t"
  176158. #endif
  176159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176160. "lsrs r6, r7, #16\n\t"
  176161. #else
  176162. "lsr r6, r7, #16\n\t"
  176163. #endif
  176164. #ifdef WOLFSSL_KEIL
  176165. "muls r6, r5, r6\n\t"
  176166. #elif defined(__clang__)
  176167. "muls r6, r5\n\t"
  176168. #else
  176169. "mul r6, r5\n\t"
  176170. #endif
  176171. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176172. "adds r4, r4, r6\n\t"
  176173. #else
  176174. "add r4, r4, r6\n\t"
  176175. #endif
  176176. #ifdef WOLFSSL_KEIL
  176177. "adcs r2, r2, %[r]\n\t"
  176178. #elif defined(__clang__)
  176179. "adcs r2, %[r]\n\t"
  176180. #else
  176181. "adc r2, %[r]\n\t"
  176182. #endif
  176183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176184. "adds r4, r4, r6\n\t"
  176185. #else
  176186. "add r4, r4, r6\n\t"
  176187. #endif
  176188. #ifdef WOLFSSL_KEIL
  176189. "adcs r2, r2, %[r]\n\t"
  176190. #elif defined(__clang__)
  176191. "adcs r2, %[r]\n\t"
  176192. #else
  176193. "adc r2, %[r]\n\t"
  176194. #endif
  176195. "uxth r6, r7\n\t"
  176196. #ifdef WOLFSSL_KEIL
  176197. "muls r5, r6, r5\n\t"
  176198. #elif defined(__clang__)
  176199. "muls r5, r6\n\t"
  176200. #else
  176201. "mul r5, r6\n\t"
  176202. #endif
  176203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176204. "lsrs r6, r5, #16\n\t"
  176205. #else
  176206. "lsr r6, r5, #16\n\t"
  176207. #endif
  176208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176209. "lsls r5, r5, #16\n\t"
  176210. #else
  176211. "lsl r5, r5, #16\n\t"
  176212. #endif
  176213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176214. "adds r3, r3, r5\n\t"
  176215. #else
  176216. "add r3, r3, r5\n\t"
  176217. #endif
  176218. #ifdef WOLFSSL_KEIL
  176219. "adcs r4, r4, r6\n\t"
  176220. #elif defined(__clang__)
  176221. "adcs r4, r6\n\t"
  176222. #else
  176223. "adc r4, r6\n\t"
  176224. #endif
  176225. #ifdef WOLFSSL_KEIL
  176226. "adcs r2, r2, %[r]\n\t"
  176227. #elif defined(__clang__)
  176228. "adcs r2, %[r]\n\t"
  176229. #else
  176230. "adc r2, %[r]\n\t"
  176231. #endif
  176232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176233. "adds r3, r3, r5\n\t"
  176234. #else
  176235. "add r3, r3, r5\n\t"
  176236. #endif
  176237. #ifdef WOLFSSL_KEIL
  176238. "adcs r4, r4, r6\n\t"
  176239. #elif defined(__clang__)
  176240. "adcs r4, r6\n\t"
  176241. #else
  176242. "adc r4, r6\n\t"
  176243. #endif
  176244. #ifdef WOLFSSL_KEIL
  176245. "adcs r2, r2, %[r]\n\t"
  176246. #elif defined(__clang__)
  176247. "adcs r2, %[r]\n\t"
  176248. #else
  176249. "adc r2, %[r]\n\t"
  176250. #endif
  176251. "# A[9] * A[1]\n\t"
  176252. "mov %[a], r9\n\t"
  176253. "mov r7, r11\n\t"
  176254. "ldr %[a], [%[a], #36]\n\t"
  176255. "uxth r5, %[a]\n\t"
  176256. "uxth r6, r7\n\t"
  176257. #ifdef WOLFSSL_KEIL
  176258. "muls r6, r5, r6\n\t"
  176259. #elif defined(__clang__)
  176260. "muls r6, r5\n\t"
  176261. #else
  176262. "mul r6, r5\n\t"
  176263. #endif
  176264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176265. "adds r3, r3, r6\n\t"
  176266. #else
  176267. "add r3, r3, r6\n\t"
  176268. #endif
  176269. #ifdef WOLFSSL_KEIL
  176270. "adcs r4, r4, %[r]\n\t"
  176271. #elif defined(__clang__)
  176272. "adcs r4, %[r]\n\t"
  176273. #else
  176274. "adc r4, %[r]\n\t"
  176275. #endif
  176276. #ifdef WOLFSSL_KEIL
  176277. "adcs r2, r2, %[r]\n\t"
  176278. #elif defined(__clang__)
  176279. "adcs r2, %[r]\n\t"
  176280. #else
  176281. "adc r2, %[r]\n\t"
  176282. #endif
  176283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176284. "adds r3, r3, r6\n\t"
  176285. #else
  176286. "add r3, r3, r6\n\t"
  176287. #endif
  176288. #ifdef WOLFSSL_KEIL
  176289. "adcs r4, r4, %[r]\n\t"
  176290. #elif defined(__clang__)
  176291. "adcs r4, %[r]\n\t"
  176292. #else
  176293. "adc r4, %[r]\n\t"
  176294. #endif
  176295. #ifdef WOLFSSL_KEIL
  176296. "adcs r2, r2, %[r]\n\t"
  176297. #elif defined(__clang__)
  176298. "adcs r2, %[r]\n\t"
  176299. #else
  176300. "adc r2, %[r]\n\t"
  176301. #endif
  176302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176303. "lsrs r6, r7, #16\n\t"
  176304. #else
  176305. "lsr r6, r7, #16\n\t"
  176306. #endif
  176307. #ifdef WOLFSSL_KEIL
  176308. "muls r5, r6, r5\n\t"
  176309. #elif defined(__clang__)
  176310. "muls r5, r6\n\t"
  176311. #else
  176312. "mul r5, r6\n\t"
  176313. #endif
  176314. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176315. "lsrs r6, r5, #16\n\t"
  176316. #else
  176317. "lsr r6, r5, #16\n\t"
  176318. #endif
  176319. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176320. "lsls r5, r5, #16\n\t"
  176321. #else
  176322. "lsl r5, r5, #16\n\t"
  176323. #endif
  176324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176325. "adds r3, r3, r5\n\t"
  176326. #else
  176327. "add r3, r3, r5\n\t"
  176328. #endif
  176329. #ifdef WOLFSSL_KEIL
  176330. "adcs r4, r4, r6\n\t"
  176331. #elif defined(__clang__)
  176332. "adcs r4, r6\n\t"
  176333. #else
  176334. "adc r4, r6\n\t"
  176335. #endif
  176336. #ifdef WOLFSSL_KEIL
  176337. "adcs r2, r2, %[r]\n\t"
  176338. #elif defined(__clang__)
  176339. "adcs r2, %[r]\n\t"
  176340. #else
  176341. "adc r2, %[r]\n\t"
  176342. #endif
  176343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176344. "adds r3, r3, r5\n\t"
  176345. #else
  176346. "add r3, r3, r5\n\t"
  176347. #endif
  176348. #ifdef WOLFSSL_KEIL
  176349. "adcs r4, r4, r6\n\t"
  176350. #elif defined(__clang__)
  176351. "adcs r4, r6\n\t"
  176352. #else
  176353. "adc r4, r6\n\t"
  176354. #endif
  176355. #ifdef WOLFSSL_KEIL
  176356. "adcs r2, r2, %[r]\n\t"
  176357. #elif defined(__clang__)
  176358. "adcs r2, %[r]\n\t"
  176359. #else
  176360. "adc r2, %[r]\n\t"
  176361. #endif
  176362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176363. "lsrs r5, %[a], #16\n\t"
  176364. #else
  176365. "lsr r5, %[a], #16\n\t"
  176366. #endif
  176367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176368. "lsrs r6, r7, #16\n\t"
  176369. #else
  176370. "lsr r6, r7, #16\n\t"
  176371. #endif
  176372. #ifdef WOLFSSL_KEIL
  176373. "muls r6, r5, r6\n\t"
  176374. #elif defined(__clang__)
  176375. "muls r6, r5\n\t"
  176376. #else
  176377. "mul r6, r5\n\t"
  176378. #endif
  176379. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176380. "adds r4, r4, r6\n\t"
  176381. #else
  176382. "add r4, r4, r6\n\t"
  176383. #endif
  176384. #ifdef WOLFSSL_KEIL
  176385. "adcs r2, r2, %[r]\n\t"
  176386. #elif defined(__clang__)
  176387. "adcs r2, %[r]\n\t"
  176388. #else
  176389. "adc r2, %[r]\n\t"
  176390. #endif
  176391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176392. "adds r4, r4, r6\n\t"
  176393. #else
  176394. "add r4, r4, r6\n\t"
  176395. #endif
  176396. #ifdef WOLFSSL_KEIL
  176397. "adcs r2, r2, %[r]\n\t"
  176398. #elif defined(__clang__)
  176399. "adcs r2, %[r]\n\t"
  176400. #else
  176401. "adc r2, %[r]\n\t"
  176402. #endif
  176403. "uxth r6, r7\n\t"
  176404. #ifdef WOLFSSL_KEIL
  176405. "muls r5, r6, r5\n\t"
  176406. #elif defined(__clang__)
  176407. "muls r5, r6\n\t"
  176408. #else
  176409. "mul r5, r6\n\t"
  176410. #endif
  176411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176412. "lsrs r6, r5, #16\n\t"
  176413. #else
  176414. "lsr r6, r5, #16\n\t"
  176415. #endif
  176416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176417. "lsls r5, r5, #16\n\t"
  176418. #else
  176419. "lsl r5, r5, #16\n\t"
  176420. #endif
  176421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176422. "adds r3, r3, r5\n\t"
  176423. #else
  176424. "add r3, r3, r5\n\t"
  176425. #endif
  176426. #ifdef WOLFSSL_KEIL
  176427. "adcs r4, r4, r6\n\t"
  176428. #elif defined(__clang__)
  176429. "adcs r4, r6\n\t"
  176430. #else
  176431. "adc r4, r6\n\t"
  176432. #endif
  176433. #ifdef WOLFSSL_KEIL
  176434. "adcs r2, r2, %[r]\n\t"
  176435. #elif defined(__clang__)
  176436. "adcs r2, %[r]\n\t"
  176437. #else
  176438. "adc r2, %[r]\n\t"
  176439. #endif
  176440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176441. "adds r3, r3, r5\n\t"
  176442. #else
  176443. "add r3, r3, r5\n\t"
  176444. #endif
  176445. #ifdef WOLFSSL_KEIL
  176446. "adcs r4, r4, r6\n\t"
  176447. #elif defined(__clang__)
  176448. "adcs r4, r6\n\t"
  176449. #else
  176450. "adc r4, r6\n\t"
  176451. #endif
  176452. #ifdef WOLFSSL_KEIL
  176453. "adcs r2, r2, %[r]\n\t"
  176454. #elif defined(__clang__)
  176455. "adcs r2, %[r]\n\t"
  176456. #else
  176457. "adc r2, %[r]\n\t"
  176458. #endif
  176459. "# A[8] * A[2]\n\t"
  176460. "mov %[a], r9\n\t"
  176461. "mov r7, r12\n\t"
  176462. "ldr %[a], [%[a], #32]\n\t"
  176463. "uxth r5, %[a]\n\t"
  176464. "uxth r6, r7\n\t"
  176465. #ifdef WOLFSSL_KEIL
  176466. "muls r6, r5, r6\n\t"
  176467. #elif defined(__clang__)
  176468. "muls r6, r5\n\t"
  176469. #else
  176470. "mul r6, r5\n\t"
  176471. #endif
  176472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176473. "adds r3, r3, r6\n\t"
  176474. #else
  176475. "add r3, r3, r6\n\t"
  176476. #endif
  176477. #ifdef WOLFSSL_KEIL
  176478. "adcs r4, r4, %[r]\n\t"
  176479. #elif defined(__clang__)
  176480. "adcs r4, %[r]\n\t"
  176481. #else
  176482. "adc r4, %[r]\n\t"
  176483. #endif
  176484. #ifdef WOLFSSL_KEIL
  176485. "adcs r2, r2, %[r]\n\t"
  176486. #elif defined(__clang__)
  176487. "adcs r2, %[r]\n\t"
  176488. #else
  176489. "adc r2, %[r]\n\t"
  176490. #endif
  176491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176492. "adds r3, r3, r6\n\t"
  176493. #else
  176494. "add r3, r3, r6\n\t"
  176495. #endif
  176496. #ifdef WOLFSSL_KEIL
  176497. "adcs r4, r4, %[r]\n\t"
  176498. #elif defined(__clang__)
  176499. "adcs r4, %[r]\n\t"
  176500. #else
  176501. "adc r4, %[r]\n\t"
  176502. #endif
  176503. #ifdef WOLFSSL_KEIL
  176504. "adcs r2, r2, %[r]\n\t"
  176505. #elif defined(__clang__)
  176506. "adcs r2, %[r]\n\t"
  176507. #else
  176508. "adc r2, %[r]\n\t"
  176509. #endif
  176510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176511. "lsrs r6, r7, #16\n\t"
  176512. #else
  176513. "lsr r6, r7, #16\n\t"
  176514. #endif
  176515. #ifdef WOLFSSL_KEIL
  176516. "muls r5, r6, r5\n\t"
  176517. #elif defined(__clang__)
  176518. "muls r5, r6\n\t"
  176519. #else
  176520. "mul r5, r6\n\t"
  176521. #endif
  176522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176523. "lsrs r6, r5, #16\n\t"
  176524. #else
  176525. "lsr r6, r5, #16\n\t"
  176526. #endif
  176527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176528. "lsls r5, r5, #16\n\t"
  176529. #else
  176530. "lsl r5, r5, #16\n\t"
  176531. #endif
  176532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176533. "adds r3, r3, r5\n\t"
  176534. #else
  176535. "add r3, r3, r5\n\t"
  176536. #endif
  176537. #ifdef WOLFSSL_KEIL
  176538. "adcs r4, r4, r6\n\t"
  176539. #elif defined(__clang__)
  176540. "adcs r4, r6\n\t"
  176541. #else
  176542. "adc r4, r6\n\t"
  176543. #endif
  176544. #ifdef WOLFSSL_KEIL
  176545. "adcs r2, r2, %[r]\n\t"
  176546. #elif defined(__clang__)
  176547. "adcs r2, %[r]\n\t"
  176548. #else
  176549. "adc r2, %[r]\n\t"
  176550. #endif
  176551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176552. "adds r3, r3, r5\n\t"
  176553. #else
  176554. "add r3, r3, r5\n\t"
  176555. #endif
  176556. #ifdef WOLFSSL_KEIL
  176557. "adcs r4, r4, r6\n\t"
  176558. #elif defined(__clang__)
  176559. "adcs r4, r6\n\t"
  176560. #else
  176561. "adc r4, r6\n\t"
  176562. #endif
  176563. #ifdef WOLFSSL_KEIL
  176564. "adcs r2, r2, %[r]\n\t"
  176565. #elif defined(__clang__)
  176566. "adcs r2, %[r]\n\t"
  176567. #else
  176568. "adc r2, %[r]\n\t"
  176569. #endif
  176570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176571. "lsrs r5, %[a], #16\n\t"
  176572. #else
  176573. "lsr r5, %[a], #16\n\t"
  176574. #endif
  176575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176576. "lsrs r6, r7, #16\n\t"
  176577. #else
  176578. "lsr r6, r7, #16\n\t"
  176579. #endif
  176580. #ifdef WOLFSSL_KEIL
  176581. "muls r6, r5, r6\n\t"
  176582. #elif defined(__clang__)
  176583. "muls r6, r5\n\t"
  176584. #else
  176585. "mul r6, r5\n\t"
  176586. #endif
  176587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176588. "adds r4, r4, r6\n\t"
  176589. #else
  176590. "add r4, 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 r4, r4, r6\n\t"
  176601. #else
  176602. "add r4, r4, r6\n\t"
  176603. #endif
  176604. #ifdef WOLFSSL_KEIL
  176605. "adcs r2, r2, %[r]\n\t"
  176606. #elif defined(__clang__)
  176607. "adcs r2, %[r]\n\t"
  176608. #else
  176609. "adc r2, %[r]\n\t"
  176610. #endif
  176611. "uxth r6, r7\n\t"
  176612. #ifdef WOLFSSL_KEIL
  176613. "muls r5, r6, r5\n\t"
  176614. #elif defined(__clang__)
  176615. "muls r5, r6\n\t"
  176616. #else
  176617. "mul r5, r6\n\t"
  176618. #endif
  176619. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176620. "lsrs r6, r5, #16\n\t"
  176621. #else
  176622. "lsr r6, r5, #16\n\t"
  176623. #endif
  176624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176625. "lsls r5, r5, #16\n\t"
  176626. #else
  176627. "lsl r5, r5, #16\n\t"
  176628. #endif
  176629. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176630. "adds r3, r3, r5\n\t"
  176631. #else
  176632. "add r3, r3, r5\n\t"
  176633. #endif
  176634. #ifdef WOLFSSL_KEIL
  176635. "adcs r4, r4, r6\n\t"
  176636. #elif defined(__clang__)
  176637. "adcs r4, r6\n\t"
  176638. #else
  176639. "adc r4, r6\n\t"
  176640. #endif
  176641. #ifdef WOLFSSL_KEIL
  176642. "adcs r2, r2, %[r]\n\t"
  176643. #elif defined(__clang__)
  176644. "adcs r2, %[r]\n\t"
  176645. #else
  176646. "adc r2, %[r]\n\t"
  176647. #endif
  176648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176649. "adds r3, r3, r5\n\t"
  176650. #else
  176651. "add r3, r3, r5\n\t"
  176652. #endif
  176653. #ifdef WOLFSSL_KEIL
  176654. "adcs r4, r4, r6\n\t"
  176655. #elif defined(__clang__)
  176656. "adcs r4, r6\n\t"
  176657. #else
  176658. "adc r4, r6\n\t"
  176659. #endif
  176660. #ifdef WOLFSSL_KEIL
  176661. "adcs r2, r2, %[r]\n\t"
  176662. #elif defined(__clang__)
  176663. "adcs r2, %[r]\n\t"
  176664. #else
  176665. "adc r2, %[r]\n\t"
  176666. #endif
  176667. "# A[7] * A[3]\n\t"
  176668. "mov %[a], r9\n\t"
  176669. "mov r7, lr\n\t"
  176670. "ldr %[a], [%[a], #28]\n\t"
  176671. "uxth r5, %[a]\n\t"
  176672. "uxth r6, r7\n\t"
  176673. #ifdef WOLFSSL_KEIL
  176674. "muls r6, r5, r6\n\t"
  176675. #elif defined(__clang__)
  176676. "muls r6, r5\n\t"
  176677. #else
  176678. "mul r6, r5\n\t"
  176679. #endif
  176680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176681. "adds r3, r3, r6\n\t"
  176682. #else
  176683. "add r3, r3, r6\n\t"
  176684. #endif
  176685. #ifdef WOLFSSL_KEIL
  176686. "adcs r4, r4, %[r]\n\t"
  176687. #elif defined(__clang__)
  176688. "adcs r4, %[r]\n\t"
  176689. #else
  176690. "adc r4, %[r]\n\t"
  176691. #endif
  176692. #ifdef WOLFSSL_KEIL
  176693. "adcs r2, r2, %[r]\n\t"
  176694. #elif defined(__clang__)
  176695. "adcs r2, %[r]\n\t"
  176696. #else
  176697. "adc r2, %[r]\n\t"
  176698. #endif
  176699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176700. "adds r3, r3, r6\n\t"
  176701. #else
  176702. "add r3, r3, r6\n\t"
  176703. #endif
  176704. #ifdef WOLFSSL_KEIL
  176705. "adcs r4, r4, %[r]\n\t"
  176706. #elif defined(__clang__)
  176707. "adcs r4, %[r]\n\t"
  176708. #else
  176709. "adc r4, %[r]\n\t"
  176710. #endif
  176711. #ifdef WOLFSSL_KEIL
  176712. "adcs r2, r2, %[r]\n\t"
  176713. #elif defined(__clang__)
  176714. "adcs r2, %[r]\n\t"
  176715. #else
  176716. "adc r2, %[r]\n\t"
  176717. #endif
  176718. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176719. "lsrs r6, r7, #16\n\t"
  176720. #else
  176721. "lsr r6, r7, #16\n\t"
  176722. #endif
  176723. #ifdef WOLFSSL_KEIL
  176724. "muls r5, r6, r5\n\t"
  176725. #elif defined(__clang__)
  176726. "muls r5, r6\n\t"
  176727. #else
  176728. "mul r5, r6\n\t"
  176729. #endif
  176730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176731. "lsrs r6, r5, #16\n\t"
  176732. #else
  176733. "lsr r6, r5, #16\n\t"
  176734. #endif
  176735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176736. "lsls r5, r5, #16\n\t"
  176737. #else
  176738. "lsl r5, r5, #16\n\t"
  176739. #endif
  176740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176741. "adds r3, r3, r5\n\t"
  176742. #else
  176743. "add r3, r3, r5\n\t"
  176744. #endif
  176745. #ifdef WOLFSSL_KEIL
  176746. "adcs r4, r4, r6\n\t"
  176747. #elif defined(__clang__)
  176748. "adcs r4, r6\n\t"
  176749. #else
  176750. "adc r4, r6\n\t"
  176751. #endif
  176752. #ifdef WOLFSSL_KEIL
  176753. "adcs r2, r2, %[r]\n\t"
  176754. #elif defined(__clang__)
  176755. "adcs r2, %[r]\n\t"
  176756. #else
  176757. "adc r2, %[r]\n\t"
  176758. #endif
  176759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176760. "adds r3, r3, r5\n\t"
  176761. #else
  176762. "add r3, r3, r5\n\t"
  176763. #endif
  176764. #ifdef WOLFSSL_KEIL
  176765. "adcs r4, r4, r6\n\t"
  176766. #elif defined(__clang__)
  176767. "adcs r4, r6\n\t"
  176768. #else
  176769. "adc r4, r6\n\t"
  176770. #endif
  176771. #ifdef WOLFSSL_KEIL
  176772. "adcs r2, r2, %[r]\n\t"
  176773. #elif defined(__clang__)
  176774. "adcs r2, %[r]\n\t"
  176775. #else
  176776. "adc r2, %[r]\n\t"
  176777. #endif
  176778. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176779. "lsrs r5, %[a], #16\n\t"
  176780. #else
  176781. "lsr r5, %[a], #16\n\t"
  176782. #endif
  176783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176784. "lsrs r6, r7, #16\n\t"
  176785. #else
  176786. "lsr r6, r7, #16\n\t"
  176787. #endif
  176788. #ifdef WOLFSSL_KEIL
  176789. "muls r6, r5, r6\n\t"
  176790. #elif defined(__clang__)
  176791. "muls r6, r5\n\t"
  176792. #else
  176793. "mul r6, r5\n\t"
  176794. #endif
  176795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176796. "adds r4, r4, r6\n\t"
  176797. #else
  176798. "add r4, 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 r4, r4, r6\n\t"
  176809. #else
  176810. "add r4, r4, r6\n\t"
  176811. #endif
  176812. #ifdef WOLFSSL_KEIL
  176813. "adcs r2, r2, %[r]\n\t"
  176814. #elif defined(__clang__)
  176815. "adcs r2, %[r]\n\t"
  176816. #else
  176817. "adc r2, %[r]\n\t"
  176818. #endif
  176819. "uxth r6, r7\n\t"
  176820. #ifdef WOLFSSL_KEIL
  176821. "muls r5, r6, r5\n\t"
  176822. #elif defined(__clang__)
  176823. "muls r5, r6\n\t"
  176824. #else
  176825. "mul r5, r6\n\t"
  176826. #endif
  176827. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176828. "lsrs r6, r5, #16\n\t"
  176829. #else
  176830. "lsr r6, r5, #16\n\t"
  176831. #endif
  176832. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176833. "lsls r5, r5, #16\n\t"
  176834. #else
  176835. "lsl r5, r5, #16\n\t"
  176836. #endif
  176837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176838. "adds r3, r3, r5\n\t"
  176839. #else
  176840. "add r3, r3, r5\n\t"
  176841. #endif
  176842. #ifdef WOLFSSL_KEIL
  176843. "adcs r4, r4, r6\n\t"
  176844. #elif defined(__clang__)
  176845. "adcs r4, r6\n\t"
  176846. #else
  176847. "adc r4, r6\n\t"
  176848. #endif
  176849. #ifdef WOLFSSL_KEIL
  176850. "adcs r2, r2, %[r]\n\t"
  176851. #elif defined(__clang__)
  176852. "adcs r2, %[r]\n\t"
  176853. #else
  176854. "adc r2, %[r]\n\t"
  176855. #endif
  176856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176857. "adds r3, r3, r5\n\t"
  176858. #else
  176859. "add r3, r3, r5\n\t"
  176860. #endif
  176861. #ifdef WOLFSSL_KEIL
  176862. "adcs r4, r4, r6\n\t"
  176863. #elif defined(__clang__)
  176864. "adcs r4, r6\n\t"
  176865. #else
  176866. "adc r4, r6\n\t"
  176867. #endif
  176868. #ifdef WOLFSSL_KEIL
  176869. "adcs r2, r2, %[r]\n\t"
  176870. #elif defined(__clang__)
  176871. "adcs r2, %[r]\n\t"
  176872. #else
  176873. "adc r2, %[r]\n\t"
  176874. #endif
  176875. "# A[6] * A[4]\n\t"
  176876. "mov %[a], r9\n\t"
  176877. "ldr r7, [%[a], #16]\n\t"
  176878. "ldr %[a], [%[a], #24]\n\t"
  176879. "uxth r5, %[a]\n\t"
  176880. "uxth r6, r7\n\t"
  176881. #ifdef WOLFSSL_KEIL
  176882. "muls r6, r5, r6\n\t"
  176883. #elif defined(__clang__)
  176884. "muls r6, r5\n\t"
  176885. #else
  176886. "mul r6, r5\n\t"
  176887. #endif
  176888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176889. "adds r3, r3, r6\n\t"
  176890. #else
  176891. "add r3, r3, r6\n\t"
  176892. #endif
  176893. #ifdef WOLFSSL_KEIL
  176894. "adcs r4, r4, %[r]\n\t"
  176895. #elif defined(__clang__)
  176896. "adcs r4, %[r]\n\t"
  176897. #else
  176898. "adc r4, %[r]\n\t"
  176899. #endif
  176900. #ifdef WOLFSSL_KEIL
  176901. "adcs r2, r2, %[r]\n\t"
  176902. #elif defined(__clang__)
  176903. "adcs r2, %[r]\n\t"
  176904. #else
  176905. "adc r2, %[r]\n\t"
  176906. #endif
  176907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176908. "adds r3, r3, r6\n\t"
  176909. #else
  176910. "add r3, r3, r6\n\t"
  176911. #endif
  176912. #ifdef WOLFSSL_KEIL
  176913. "adcs r4, r4, %[r]\n\t"
  176914. #elif defined(__clang__)
  176915. "adcs r4, %[r]\n\t"
  176916. #else
  176917. "adc r4, %[r]\n\t"
  176918. #endif
  176919. #ifdef WOLFSSL_KEIL
  176920. "adcs r2, r2, %[r]\n\t"
  176921. #elif defined(__clang__)
  176922. "adcs r2, %[r]\n\t"
  176923. #else
  176924. "adc r2, %[r]\n\t"
  176925. #endif
  176926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176927. "lsrs r6, r7, #16\n\t"
  176928. #else
  176929. "lsr r6, r7, #16\n\t"
  176930. #endif
  176931. #ifdef WOLFSSL_KEIL
  176932. "muls r5, r6, r5\n\t"
  176933. #elif defined(__clang__)
  176934. "muls r5, r6\n\t"
  176935. #else
  176936. "mul r5, r6\n\t"
  176937. #endif
  176938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176939. "lsrs r6, r5, #16\n\t"
  176940. #else
  176941. "lsr r6, r5, #16\n\t"
  176942. #endif
  176943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176944. "lsls r5, r5, #16\n\t"
  176945. #else
  176946. "lsl r5, r5, #16\n\t"
  176947. #endif
  176948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176949. "adds r3, r3, r5\n\t"
  176950. #else
  176951. "add r3, r3, r5\n\t"
  176952. #endif
  176953. #ifdef WOLFSSL_KEIL
  176954. "adcs r4, r4, r6\n\t"
  176955. #elif defined(__clang__)
  176956. "adcs r4, r6\n\t"
  176957. #else
  176958. "adc r4, r6\n\t"
  176959. #endif
  176960. #ifdef WOLFSSL_KEIL
  176961. "adcs r2, r2, %[r]\n\t"
  176962. #elif defined(__clang__)
  176963. "adcs r2, %[r]\n\t"
  176964. #else
  176965. "adc r2, %[r]\n\t"
  176966. #endif
  176967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176968. "adds r3, r3, r5\n\t"
  176969. #else
  176970. "add r3, r3, r5\n\t"
  176971. #endif
  176972. #ifdef WOLFSSL_KEIL
  176973. "adcs r4, r4, r6\n\t"
  176974. #elif defined(__clang__)
  176975. "adcs r4, r6\n\t"
  176976. #else
  176977. "adc r4, r6\n\t"
  176978. #endif
  176979. #ifdef WOLFSSL_KEIL
  176980. "adcs r2, r2, %[r]\n\t"
  176981. #elif defined(__clang__)
  176982. "adcs r2, %[r]\n\t"
  176983. #else
  176984. "adc r2, %[r]\n\t"
  176985. #endif
  176986. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176987. "lsrs r5, %[a], #16\n\t"
  176988. #else
  176989. "lsr r5, %[a], #16\n\t"
  176990. #endif
  176991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  176992. "lsrs r6, r7, #16\n\t"
  176993. #else
  176994. "lsr r6, r7, #16\n\t"
  176995. #endif
  176996. #ifdef WOLFSSL_KEIL
  176997. "muls r6, r5, r6\n\t"
  176998. #elif defined(__clang__)
  176999. "muls r6, r5\n\t"
  177000. #else
  177001. "mul r6, r5\n\t"
  177002. #endif
  177003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177004. "adds r4, r4, r6\n\t"
  177005. #else
  177006. "add r4, 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 r4, r4, r6\n\t"
  177017. #else
  177018. "add r4, r4, r6\n\t"
  177019. #endif
  177020. #ifdef WOLFSSL_KEIL
  177021. "adcs r2, r2, %[r]\n\t"
  177022. #elif defined(__clang__)
  177023. "adcs r2, %[r]\n\t"
  177024. #else
  177025. "adc r2, %[r]\n\t"
  177026. #endif
  177027. "uxth r6, r7\n\t"
  177028. #ifdef WOLFSSL_KEIL
  177029. "muls r5, r6, r5\n\t"
  177030. #elif defined(__clang__)
  177031. "muls r5, r6\n\t"
  177032. #else
  177033. "mul r5, r6\n\t"
  177034. #endif
  177035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177036. "lsrs r6, r5, #16\n\t"
  177037. #else
  177038. "lsr r6, r5, #16\n\t"
  177039. #endif
  177040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177041. "lsls r5, r5, #16\n\t"
  177042. #else
  177043. "lsl r5, r5, #16\n\t"
  177044. #endif
  177045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177046. "adds r3, r3, r5\n\t"
  177047. #else
  177048. "add r3, r3, r5\n\t"
  177049. #endif
  177050. #ifdef WOLFSSL_KEIL
  177051. "adcs r4, r4, r6\n\t"
  177052. #elif defined(__clang__)
  177053. "adcs r4, r6\n\t"
  177054. #else
  177055. "adc r4, r6\n\t"
  177056. #endif
  177057. #ifdef WOLFSSL_KEIL
  177058. "adcs r2, r2, %[r]\n\t"
  177059. #elif defined(__clang__)
  177060. "adcs r2, %[r]\n\t"
  177061. #else
  177062. "adc r2, %[r]\n\t"
  177063. #endif
  177064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177065. "adds r3, r3, r5\n\t"
  177066. #else
  177067. "add r3, r3, r5\n\t"
  177068. #endif
  177069. #ifdef WOLFSSL_KEIL
  177070. "adcs r4, r4, r6\n\t"
  177071. #elif defined(__clang__)
  177072. "adcs r4, r6\n\t"
  177073. #else
  177074. "adc r4, r6\n\t"
  177075. #endif
  177076. #ifdef WOLFSSL_KEIL
  177077. "adcs r2, r2, %[r]\n\t"
  177078. #elif defined(__clang__)
  177079. "adcs r2, %[r]\n\t"
  177080. #else
  177081. "adc r2, %[r]\n\t"
  177082. #endif
  177083. "# A[5] * A[5]\n\t"
  177084. "mov %[a], r9\n\t"
  177085. "ldr r7, [%[a], #20]\n\t"
  177086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177087. "lsrs r6, r7, #16\n\t"
  177088. #else
  177089. "lsr r6, r7, #16\n\t"
  177090. #endif
  177091. "uxth r5, r7\n\t"
  177092. #ifdef WOLFSSL_KEIL
  177093. "muls r5, r5, r5\n\t"
  177094. #elif defined(__clang__)
  177095. "muls r5, r5\n\t"
  177096. #else
  177097. "mul r5, r5\n\t"
  177098. #endif
  177099. #ifdef WOLFSSL_KEIL
  177100. "muls r6, r6, r6\n\t"
  177101. #elif defined(__clang__)
  177102. "muls r6, r6\n\t"
  177103. #else
  177104. "mul r6, r6\n\t"
  177105. #endif
  177106. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177107. "adds r3, r3, r5\n\t"
  177108. #else
  177109. "add r3, r3, r5\n\t"
  177110. #endif
  177111. #ifdef WOLFSSL_KEIL
  177112. "adcs r4, r4, r6\n\t"
  177113. #elif defined(__clang__)
  177114. "adcs r4, r6\n\t"
  177115. #else
  177116. "adc r4, r6\n\t"
  177117. #endif
  177118. #ifdef WOLFSSL_KEIL
  177119. "adcs r2, r2, %[r]\n\t"
  177120. #elif defined(__clang__)
  177121. "adcs r2, %[r]\n\t"
  177122. #else
  177123. "adc r2, %[r]\n\t"
  177124. #endif
  177125. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177126. "lsrs r6, r7, #16\n\t"
  177127. #else
  177128. "lsr r6, r7, #16\n\t"
  177129. #endif
  177130. "uxth r5, r7\n\t"
  177131. #ifdef WOLFSSL_KEIL
  177132. "muls r5, r6, r5\n\t"
  177133. #elif defined(__clang__)
  177134. "muls r5, r6\n\t"
  177135. #else
  177136. "mul r5, r6\n\t"
  177137. #endif
  177138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177139. "lsrs r6, r5, #15\n\t"
  177140. #else
  177141. "lsr r6, r5, #15\n\t"
  177142. #endif
  177143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177144. "lsls r5, r5, #17\n\t"
  177145. #else
  177146. "lsl r5, r5, #17\n\t"
  177147. #endif
  177148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177149. "adds r3, r3, r5\n\t"
  177150. #else
  177151. "add r3, r3, r5\n\t"
  177152. #endif
  177153. #ifdef WOLFSSL_KEIL
  177154. "adcs r4, r4, r6\n\t"
  177155. #elif defined(__clang__)
  177156. "adcs r4, r6\n\t"
  177157. #else
  177158. "adc r4, r6\n\t"
  177159. #endif
  177160. #ifdef WOLFSSL_KEIL
  177161. "adcs r2, r2, %[r]\n\t"
  177162. #elif defined(__clang__)
  177163. "adcs r2, %[r]\n\t"
  177164. #else
  177165. "adc r2, %[r]\n\t"
  177166. #endif
  177167. "str r3, [sp, #40]\n\t"
  177168. "# A[6] * A[5]\n\t"
  177169. "movs r3, #0\n\t"
  177170. "ldr %[a], [%[a], #24]\n\t"
  177171. "uxth r5, %[a]\n\t"
  177172. "uxth r6, r7\n\t"
  177173. #ifdef WOLFSSL_KEIL
  177174. "muls r6, r5, r6\n\t"
  177175. #elif defined(__clang__)
  177176. "muls r6, r5\n\t"
  177177. #else
  177178. "mul r6, r5\n\t"
  177179. #endif
  177180. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177181. "adds r4, r4, r6\n\t"
  177182. #else
  177183. "add r4, r4, r6\n\t"
  177184. #endif
  177185. #ifdef WOLFSSL_KEIL
  177186. "adcs r2, r2, %[r]\n\t"
  177187. #elif defined(__clang__)
  177188. "adcs r2, %[r]\n\t"
  177189. #else
  177190. "adc r2, %[r]\n\t"
  177191. #endif
  177192. #ifdef WOLFSSL_KEIL
  177193. "adcs r3, r3, %[r]\n\t"
  177194. #elif defined(__clang__)
  177195. "adcs r3, %[r]\n\t"
  177196. #else
  177197. "adc r3, %[r]\n\t"
  177198. #endif
  177199. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177200. "adds r4, r4, r6\n\t"
  177201. #else
  177202. "add r4, r4, r6\n\t"
  177203. #endif
  177204. #ifdef WOLFSSL_KEIL
  177205. "adcs r2, r2, %[r]\n\t"
  177206. #elif defined(__clang__)
  177207. "adcs r2, %[r]\n\t"
  177208. #else
  177209. "adc r2, %[r]\n\t"
  177210. #endif
  177211. #ifdef WOLFSSL_KEIL
  177212. "adcs r3, r3, %[r]\n\t"
  177213. #elif defined(__clang__)
  177214. "adcs r3, %[r]\n\t"
  177215. #else
  177216. "adc r3, %[r]\n\t"
  177217. #endif
  177218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177219. "lsrs r6, r7, #16\n\t"
  177220. #else
  177221. "lsr r6, r7, #16\n\t"
  177222. #endif
  177223. #ifdef WOLFSSL_KEIL
  177224. "muls r5, r6, r5\n\t"
  177225. #elif defined(__clang__)
  177226. "muls r5, r6\n\t"
  177227. #else
  177228. "mul r5, r6\n\t"
  177229. #endif
  177230. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177231. "lsrs r6, r5, #16\n\t"
  177232. #else
  177233. "lsr r6, r5, #16\n\t"
  177234. #endif
  177235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177236. "lsls r5, r5, #16\n\t"
  177237. #else
  177238. "lsl r5, r5, #16\n\t"
  177239. #endif
  177240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177241. "adds r4, r4, r5\n\t"
  177242. #else
  177243. "add r4, r4, r5\n\t"
  177244. #endif
  177245. #ifdef WOLFSSL_KEIL
  177246. "adcs r2, r2, r6\n\t"
  177247. #elif defined(__clang__)
  177248. "adcs r2, r6\n\t"
  177249. #else
  177250. "adc r2, r6\n\t"
  177251. #endif
  177252. #ifdef WOLFSSL_KEIL
  177253. "adcs r3, r3, %[r]\n\t"
  177254. #elif defined(__clang__)
  177255. "adcs r3, %[r]\n\t"
  177256. #else
  177257. "adc r3, %[r]\n\t"
  177258. #endif
  177259. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177260. "adds r4, r4, r5\n\t"
  177261. #else
  177262. "add r4, r4, r5\n\t"
  177263. #endif
  177264. #ifdef WOLFSSL_KEIL
  177265. "adcs r2, r2, r6\n\t"
  177266. #elif defined(__clang__)
  177267. "adcs r2, r6\n\t"
  177268. #else
  177269. "adc r2, r6\n\t"
  177270. #endif
  177271. #ifdef WOLFSSL_KEIL
  177272. "adcs r3, r3, %[r]\n\t"
  177273. #elif defined(__clang__)
  177274. "adcs r3, %[r]\n\t"
  177275. #else
  177276. "adc r3, %[r]\n\t"
  177277. #endif
  177278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177279. "lsrs r5, %[a], #16\n\t"
  177280. #else
  177281. "lsr r5, %[a], #16\n\t"
  177282. #endif
  177283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177284. "lsrs r6, r7, #16\n\t"
  177285. #else
  177286. "lsr r6, r7, #16\n\t"
  177287. #endif
  177288. #ifdef WOLFSSL_KEIL
  177289. "muls r6, r5, r6\n\t"
  177290. #elif defined(__clang__)
  177291. "muls r6, r5\n\t"
  177292. #else
  177293. "mul r6, r5\n\t"
  177294. #endif
  177295. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177296. "adds r2, r2, r6\n\t"
  177297. #else
  177298. "add r2, r2, r6\n\t"
  177299. #endif
  177300. #ifdef WOLFSSL_KEIL
  177301. "adcs r3, r3, %[r]\n\t"
  177302. #elif defined(__clang__)
  177303. "adcs r3, %[r]\n\t"
  177304. #else
  177305. "adc r3, %[r]\n\t"
  177306. #endif
  177307. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177308. "adds r2, r2, r6\n\t"
  177309. #else
  177310. "add r2, r2, r6\n\t"
  177311. #endif
  177312. #ifdef WOLFSSL_KEIL
  177313. "adcs r3, r3, %[r]\n\t"
  177314. #elif defined(__clang__)
  177315. "adcs r3, %[r]\n\t"
  177316. #else
  177317. "adc r3, %[r]\n\t"
  177318. #endif
  177319. "uxth r6, r7\n\t"
  177320. #ifdef WOLFSSL_KEIL
  177321. "muls r5, r6, r5\n\t"
  177322. #elif defined(__clang__)
  177323. "muls r5, r6\n\t"
  177324. #else
  177325. "mul r5, r6\n\t"
  177326. #endif
  177327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177328. "lsrs r6, r5, #16\n\t"
  177329. #else
  177330. "lsr r6, r5, #16\n\t"
  177331. #endif
  177332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177333. "lsls r5, r5, #16\n\t"
  177334. #else
  177335. "lsl r5, r5, #16\n\t"
  177336. #endif
  177337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177338. "adds r4, r4, r5\n\t"
  177339. #else
  177340. "add r4, r4, r5\n\t"
  177341. #endif
  177342. #ifdef WOLFSSL_KEIL
  177343. "adcs r2, r2, r6\n\t"
  177344. #elif defined(__clang__)
  177345. "adcs r2, r6\n\t"
  177346. #else
  177347. "adc r2, r6\n\t"
  177348. #endif
  177349. #ifdef WOLFSSL_KEIL
  177350. "adcs r3, r3, %[r]\n\t"
  177351. #elif defined(__clang__)
  177352. "adcs r3, %[r]\n\t"
  177353. #else
  177354. "adc r3, %[r]\n\t"
  177355. #endif
  177356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177357. "adds r4, r4, r5\n\t"
  177358. #else
  177359. "add r4, r4, r5\n\t"
  177360. #endif
  177361. #ifdef WOLFSSL_KEIL
  177362. "adcs r2, r2, r6\n\t"
  177363. #elif defined(__clang__)
  177364. "adcs r2, r6\n\t"
  177365. #else
  177366. "adc r2, r6\n\t"
  177367. #endif
  177368. #ifdef WOLFSSL_KEIL
  177369. "adcs r3, r3, %[r]\n\t"
  177370. #elif defined(__clang__)
  177371. "adcs r3, %[r]\n\t"
  177372. #else
  177373. "adc r3, %[r]\n\t"
  177374. #endif
  177375. "# A[7] * A[4]\n\t"
  177376. "mov %[a], r9\n\t"
  177377. "ldr r7, [%[a], #16]\n\t"
  177378. "ldr %[a], [%[a], #28]\n\t"
  177379. "uxth r5, %[a]\n\t"
  177380. "uxth r6, r7\n\t"
  177381. #ifdef WOLFSSL_KEIL
  177382. "muls r6, r5, r6\n\t"
  177383. #elif defined(__clang__)
  177384. "muls r6, r5\n\t"
  177385. #else
  177386. "mul r6, r5\n\t"
  177387. #endif
  177388. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177389. "adds r4, r4, r6\n\t"
  177390. #else
  177391. "add r4, r4, r6\n\t"
  177392. #endif
  177393. #ifdef WOLFSSL_KEIL
  177394. "adcs r2, r2, %[r]\n\t"
  177395. #elif defined(__clang__)
  177396. "adcs r2, %[r]\n\t"
  177397. #else
  177398. "adc r2, %[r]\n\t"
  177399. #endif
  177400. #ifdef WOLFSSL_KEIL
  177401. "adcs r3, r3, %[r]\n\t"
  177402. #elif defined(__clang__)
  177403. "adcs r3, %[r]\n\t"
  177404. #else
  177405. "adc r3, %[r]\n\t"
  177406. #endif
  177407. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177408. "adds r4, r4, r6\n\t"
  177409. #else
  177410. "add r4, r4, r6\n\t"
  177411. #endif
  177412. #ifdef WOLFSSL_KEIL
  177413. "adcs r2, r2, %[r]\n\t"
  177414. #elif defined(__clang__)
  177415. "adcs r2, %[r]\n\t"
  177416. #else
  177417. "adc r2, %[r]\n\t"
  177418. #endif
  177419. #ifdef WOLFSSL_KEIL
  177420. "adcs r3, r3, %[r]\n\t"
  177421. #elif defined(__clang__)
  177422. "adcs r3, %[r]\n\t"
  177423. #else
  177424. "adc r3, %[r]\n\t"
  177425. #endif
  177426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177427. "lsrs r6, r7, #16\n\t"
  177428. #else
  177429. "lsr r6, r7, #16\n\t"
  177430. #endif
  177431. #ifdef WOLFSSL_KEIL
  177432. "muls r5, r6, r5\n\t"
  177433. #elif defined(__clang__)
  177434. "muls r5, r6\n\t"
  177435. #else
  177436. "mul r5, r6\n\t"
  177437. #endif
  177438. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177439. "lsrs r6, r5, #16\n\t"
  177440. #else
  177441. "lsr r6, r5, #16\n\t"
  177442. #endif
  177443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177444. "lsls r5, r5, #16\n\t"
  177445. #else
  177446. "lsl r5, r5, #16\n\t"
  177447. #endif
  177448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177449. "adds r4, r4, r5\n\t"
  177450. #else
  177451. "add r4, r4, r5\n\t"
  177452. #endif
  177453. #ifdef WOLFSSL_KEIL
  177454. "adcs r2, r2, r6\n\t"
  177455. #elif defined(__clang__)
  177456. "adcs r2, r6\n\t"
  177457. #else
  177458. "adc r2, r6\n\t"
  177459. #endif
  177460. #ifdef WOLFSSL_KEIL
  177461. "adcs r3, r3, %[r]\n\t"
  177462. #elif defined(__clang__)
  177463. "adcs r3, %[r]\n\t"
  177464. #else
  177465. "adc r3, %[r]\n\t"
  177466. #endif
  177467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177468. "adds r4, r4, r5\n\t"
  177469. #else
  177470. "add r4, r4, r5\n\t"
  177471. #endif
  177472. #ifdef WOLFSSL_KEIL
  177473. "adcs r2, r2, r6\n\t"
  177474. #elif defined(__clang__)
  177475. "adcs r2, r6\n\t"
  177476. #else
  177477. "adc r2, r6\n\t"
  177478. #endif
  177479. #ifdef WOLFSSL_KEIL
  177480. "adcs r3, r3, %[r]\n\t"
  177481. #elif defined(__clang__)
  177482. "adcs r3, %[r]\n\t"
  177483. #else
  177484. "adc r3, %[r]\n\t"
  177485. #endif
  177486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177487. "lsrs r5, %[a], #16\n\t"
  177488. #else
  177489. "lsr r5, %[a], #16\n\t"
  177490. #endif
  177491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177492. "lsrs r6, r7, #16\n\t"
  177493. #else
  177494. "lsr r6, r7, #16\n\t"
  177495. #endif
  177496. #ifdef WOLFSSL_KEIL
  177497. "muls r6, r5, r6\n\t"
  177498. #elif defined(__clang__)
  177499. "muls r6, r5\n\t"
  177500. #else
  177501. "mul r6, r5\n\t"
  177502. #endif
  177503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177504. "adds r2, r2, r6\n\t"
  177505. #else
  177506. "add r2, r2, r6\n\t"
  177507. #endif
  177508. #ifdef WOLFSSL_KEIL
  177509. "adcs r3, r3, %[r]\n\t"
  177510. #elif defined(__clang__)
  177511. "adcs r3, %[r]\n\t"
  177512. #else
  177513. "adc r3, %[r]\n\t"
  177514. #endif
  177515. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177516. "adds r2, r2, r6\n\t"
  177517. #else
  177518. "add r2, r2, r6\n\t"
  177519. #endif
  177520. #ifdef WOLFSSL_KEIL
  177521. "adcs r3, r3, %[r]\n\t"
  177522. #elif defined(__clang__)
  177523. "adcs r3, %[r]\n\t"
  177524. #else
  177525. "adc r3, %[r]\n\t"
  177526. #endif
  177527. "uxth r6, r7\n\t"
  177528. #ifdef WOLFSSL_KEIL
  177529. "muls r5, r6, r5\n\t"
  177530. #elif defined(__clang__)
  177531. "muls r5, r6\n\t"
  177532. #else
  177533. "mul r5, r6\n\t"
  177534. #endif
  177535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177536. "lsrs r6, r5, #16\n\t"
  177537. #else
  177538. "lsr r6, r5, #16\n\t"
  177539. #endif
  177540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177541. "lsls r5, r5, #16\n\t"
  177542. #else
  177543. "lsl r5, r5, #16\n\t"
  177544. #endif
  177545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177546. "adds r4, r4, r5\n\t"
  177547. #else
  177548. "add r4, r4, r5\n\t"
  177549. #endif
  177550. #ifdef WOLFSSL_KEIL
  177551. "adcs r2, r2, r6\n\t"
  177552. #elif defined(__clang__)
  177553. "adcs r2, r6\n\t"
  177554. #else
  177555. "adc r2, r6\n\t"
  177556. #endif
  177557. #ifdef WOLFSSL_KEIL
  177558. "adcs r3, r3, %[r]\n\t"
  177559. #elif defined(__clang__)
  177560. "adcs r3, %[r]\n\t"
  177561. #else
  177562. "adc r3, %[r]\n\t"
  177563. #endif
  177564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177565. "adds r4, r4, r5\n\t"
  177566. #else
  177567. "add r4, r4, r5\n\t"
  177568. #endif
  177569. #ifdef WOLFSSL_KEIL
  177570. "adcs r2, r2, r6\n\t"
  177571. #elif defined(__clang__)
  177572. "adcs r2, r6\n\t"
  177573. #else
  177574. "adc r2, r6\n\t"
  177575. #endif
  177576. #ifdef WOLFSSL_KEIL
  177577. "adcs r3, r3, %[r]\n\t"
  177578. #elif defined(__clang__)
  177579. "adcs r3, %[r]\n\t"
  177580. #else
  177581. "adc r3, %[r]\n\t"
  177582. #endif
  177583. "# A[8] * A[3]\n\t"
  177584. "mov %[a], r9\n\t"
  177585. "mov r7, lr\n\t"
  177586. "ldr %[a], [%[a], #32]\n\t"
  177587. "uxth r5, %[a]\n\t"
  177588. "uxth r6, r7\n\t"
  177589. #ifdef WOLFSSL_KEIL
  177590. "muls r6, r5, r6\n\t"
  177591. #elif defined(__clang__)
  177592. "muls r6, r5\n\t"
  177593. #else
  177594. "mul r6, r5\n\t"
  177595. #endif
  177596. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177597. "adds r4, r4, r6\n\t"
  177598. #else
  177599. "add r4, r4, r6\n\t"
  177600. #endif
  177601. #ifdef WOLFSSL_KEIL
  177602. "adcs r2, r2, %[r]\n\t"
  177603. #elif defined(__clang__)
  177604. "adcs r2, %[r]\n\t"
  177605. #else
  177606. "adc r2, %[r]\n\t"
  177607. #endif
  177608. #ifdef WOLFSSL_KEIL
  177609. "adcs r3, r3, %[r]\n\t"
  177610. #elif defined(__clang__)
  177611. "adcs r3, %[r]\n\t"
  177612. #else
  177613. "adc r3, %[r]\n\t"
  177614. #endif
  177615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177616. "adds r4, r4, r6\n\t"
  177617. #else
  177618. "add r4, r4, r6\n\t"
  177619. #endif
  177620. #ifdef WOLFSSL_KEIL
  177621. "adcs r2, r2, %[r]\n\t"
  177622. #elif defined(__clang__)
  177623. "adcs r2, %[r]\n\t"
  177624. #else
  177625. "adc r2, %[r]\n\t"
  177626. #endif
  177627. #ifdef WOLFSSL_KEIL
  177628. "adcs r3, r3, %[r]\n\t"
  177629. #elif defined(__clang__)
  177630. "adcs r3, %[r]\n\t"
  177631. #else
  177632. "adc r3, %[r]\n\t"
  177633. #endif
  177634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177635. "lsrs r6, r7, #16\n\t"
  177636. #else
  177637. "lsr r6, r7, #16\n\t"
  177638. #endif
  177639. #ifdef WOLFSSL_KEIL
  177640. "muls r5, r6, r5\n\t"
  177641. #elif defined(__clang__)
  177642. "muls r5, r6\n\t"
  177643. #else
  177644. "mul r5, r6\n\t"
  177645. #endif
  177646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177647. "lsrs r6, r5, #16\n\t"
  177648. #else
  177649. "lsr r6, r5, #16\n\t"
  177650. #endif
  177651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177652. "lsls r5, r5, #16\n\t"
  177653. #else
  177654. "lsl r5, r5, #16\n\t"
  177655. #endif
  177656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177657. "adds r4, r4, r5\n\t"
  177658. #else
  177659. "add r4, r4, r5\n\t"
  177660. #endif
  177661. #ifdef WOLFSSL_KEIL
  177662. "adcs r2, r2, r6\n\t"
  177663. #elif defined(__clang__)
  177664. "adcs r2, r6\n\t"
  177665. #else
  177666. "adc r2, r6\n\t"
  177667. #endif
  177668. #ifdef WOLFSSL_KEIL
  177669. "adcs r3, r3, %[r]\n\t"
  177670. #elif defined(__clang__)
  177671. "adcs r3, %[r]\n\t"
  177672. #else
  177673. "adc r3, %[r]\n\t"
  177674. #endif
  177675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177676. "adds r4, r4, r5\n\t"
  177677. #else
  177678. "add r4, r4, r5\n\t"
  177679. #endif
  177680. #ifdef WOLFSSL_KEIL
  177681. "adcs r2, r2, r6\n\t"
  177682. #elif defined(__clang__)
  177683. "adcs r2, r6\n\t"
  177684. #else
  177685. "adc r2, r6\n\t"
  177686. #endif
  177687. #ifdef WOLFSSL_KEIL
  177688. "adcs r3, r3, %[r]\n\t"
  177689. #elif defined(__clang__)
  177690. "adcs r3, %[r]\n\t"
  177691. #else
  177692. "adc r3, %[r]\n\t"
  177693. #endif
  177694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177695. "lsrs r5, %[a], #16\n\t"
  177696. #else
  177697. "lsr r5, %[a], #16\n\t"
  177698. #endif
  177699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177700. "lsrs r6, r7, #16\n\t"
  177701. #else
  177702. "lsr r6, r7, #16\n\t"
  177703. #endif
  177704. #ifdef WOLFSSL_KEIL
  177705. "muls r6, r5, r6\n\t"
  177706. #elif defined(__clang__)
  177707. "muls r6, r5\n\t"
  177708. #else
  177709. "mul r6, r5\n\t"
  177710. #endif
  177711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177712. "adds r2, r2, r6\n\t"
  177713. #else
  177714. "add r2, 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 r2, r2, r6\n\t"
  177725. #else
  177726. "add r2, r2, r6\n\t"
  177727. #endif
  177728. #ifdef WOLFSSL_KEIL
  177729. "adcs r3, r3, %[r]\n\t"
  177730. #elif defined(__clang__)
  177731. "adcs r3, %[r]\n\t"
  177732. #else
  177733. "adc r3, %[r]\n\t"
  177734. #endif
  177735. "uxth r6, r7\n\t"
  177736. #ifdef WOLFSSL_KEIL
  177737. "muls r5, r6, r5\n\t"
  177738. #elif defined(__clang__)
  177739. "muls r5, r6\n\t"
  177740. #else
  177741. "mul r5, r6\n\t"
  177742. #endif
  177743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177744. "lsrs r6, r5, #16\n\t"
  177745. #else
  177746. "lsr r6, r5, #16\n\t"
  177747. #endif
  177748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177749. "lsls r5, r5, #16\n\t"
  177750. #else
  177751. "lsl r5, r5, #16\n\t"
  177752. #endif
  177753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177754. "adds r4, r4, r5\n\t"
  177755. #else
  177756. "add r4, r4, r5\n\t"
  177757. #endif
  177758. #ifdef WOLFSSL_KEIL
  177759. "adcs r2, r2, r6\n\t"
  177760. #elif defined(__clang__)
  177761. "adcs r2, r6\n\t"
  177762. #else
  177763. "adc r2, r6\n\t"
  177764. #endif
  177765. #ifdef WOLFSSL_KEIL
  177766. "adcs r3, r3, %[r]\n\t"
  177767. #elif defined(__clang__)
  177768. "adcs r3, %[r]\n\t"
  177769. #else
  177770. "adc r3, %[r]\n\t"
  177771. #endif
  177772. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177773. "adds r4, r4, r5\n\t"
  177774. #else
  177775. "add r4, r4, r5\n\t"
  177776. #endif
  177777. #ifdef WOLFSSL_KEIL
  177778. "adcs r2, r2, r6\n\t"
  177779. #elif defined(__clang__)
  177780. "adcs r2, r6\n\t"
  177781. #else
  177782. "adc r2, r6\n\t"
  177783. #endif
  177784. #ifdef WOLFSSL_KEIL
  177785. "adcs r3, r3, %[r]\n\t"
  177786. #elif defined(__clang__)
  177787. "adcs r3, %[r]\n\t"
  177788. #else
  177789. "adc r3, %[r]\n\t"
  177790. #endif
  177791. "# A[9] * A[2]\n\t"
  177792. "mov %[a], r9\n\t"
  177793. "mov r7, r12\n\t"
  177794. "ldr %[a], [%[a], #36]\n\t"
  177795. "uxth r5, %[a]\n\t"
  177796. "uxth r6, r7\n\t"
  177797. #ifdef WOLFSSL_KEIL
  177798. "muls r6, r5, r6\n\t"
  177799. #elif defined(__clang__)
  177800. "muls r6, r5\n\t"
  177801. #else
  177802. "mul r6, r5\n\t"
  177803. #endif
  177804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177805. "adds r4, r4, r6\n\t"
  177806. #else
  177807. "add r4, r4, r6\n\t"
  177808. #endif
  177809. #ifdef WOLFSSL_KEIL
  177810. "adcs r2, r2, %[r]\n\t"
  177811. #elif defined(__clang__)
  177812. "adcs r2, %[r]\n\t"
  177813. #else
  177814. "adc r2, %[r]\n\t"
  177815. #endif
  177816. #ifdef WOLFSSL_KEIL
  177817. "adcs r3, r3, %[r]\n\t"
  177818. #elif defined(__clang__)
  177819. "adcs r3, %[r]\n\t"
  177820. #else
  177821. "adc r3, %[r]\n\t"
  177822. #endif
  177823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177824. "adds r4, r4, r6\n\t"
  177825. #else
  177826. "add r4, r4, r6\n\t"
  177827. #endif
  177828. #ifdef WOLFSSL_KEIL
  177829. "adcs r2, r2, %[r]\n\t"
  177830. #elif defined(__clang__)
  177831. "adcs r2, %[r]\n\t"
  177832. #else
  177833. "adc r2, %[r]\n\t"
  177834. #endif
  177835. #ifdef WOLFSSL_KEIL
  177836. "adcs r3, r3, %[r]\n\t"
  177837. #elif defined(__clang__)
  177838. "adcs r3, %[r]\n\t"
  177839. #else
  177840. "adc r3, %[r]\n\t"
  177841. #endif
  177842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177843. "lsrs r6, r7, #16\n\t"
  177844. #else
  177845. "lsr r6, r7, #16\n\t"
  177846. #endif
  177847. #ifdef WOLFSSL_KEIL
  177848. "muls r5, r6, r5\n\t"
  177849. #elif defined(__clang__)
  177850. "muls r5, r6\n\t"
  177851. #else
  177852. "mul r5, r6\n\t"
  177853. #endif
  177854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177855. "lsrs r6, r5, #16\n\t"
  177856. #else
  177857. "lsr r6, r5, #16\n\t"
  177858. #endif
  177859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177860. "lsls r5, r5, #16\n\t"
  177861. #else
  177862. "lsl r5, r5, #16\n\t"
  177863. #endif
  177864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177865. "adds r4, r4, r5\n\t"
  177866. #else
  177867. "add r4, r4, r5\n\t"
  177868. #endif
  177869. #ifdef WOLFSSL_KEIL
  177870. "adcs r2, r2, r6\n\t"
  177871. #elif defined(__clang__)
  177872. "adcs r2, r6\n\t"
  177873. #else
  177874. "adc r2, r6\n\t"
  177875. #endif
  177876. #ifdef WOLFSSL_KEIL
  177877. "adcs r3, r3, %[r]\n\t"
  177878. #elif defined(__clang__)
  177879. "adcs r3, %[r]\n\t"
  177880. #else
  177881. "adc r3, %[r]\n\t"
  177882. #endif
  177883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177884. "adds r4, r4, r5\n\t"
  177885. #else
  177886. "add r4, r4, r5\n\t"
  177887. #endif
  177888. #ifdef WOLFSSL_KEIL
  177889. "adcs r2, r2, r6\n\t"
  177890. #elif defined(__clang__)
  177891. "adcs r2, r6\n\t"
  177892. #else
  177893. "adc r2, r6\n\t"
  177894. #endif
  177895. #ifdef WOLFSSL_KEIL
  177896. "adcs r3, r3, %[r]\n\t"
  177897. #elif defined(__clang__)
  177898. "adcs r3, %[r]\n\t"
  177899. #else
  177900. "adc r3, %[r]\n\t"
  177901. #endif
  177902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177903. "lsrs r5, %[a], #16\n\t"
  177904. #else
  177905. "lsr r5, %[a], #16\n\t"
  177906. #endif
  177907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177908. "lsrs r6, r7, #16\n\t"
  177909. #else
  177910. "lsr r6, r7, #16\n\t"
  177911. #endif
  177912. #ifdef WOLFSSL_KEIL
  177913. "muls r6, r5, r6\n\t"
  177914. #elif defined(__clang__)
  177915. "muls r6, r5\n\t"
  177916. #else
  177917. "mul r6, r5\n\t"
  177918. #endif
  177919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177920. "adds r2, r2, r6\n\t"
  177921. #else
  177922. "add r2, 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 r2, r2, r6\n\t"
  177933. #else
  177934. "add r2, r2, r6\n\t"
  177935. #endif
  177936. #ifdef WOLFSSL_KEIL
  177937. "adcs r3, r3, %[r]\n\t"
  177938. #elif defined(__clang__)
  177939. "adcs r3, %[r]\n\t"
  177940. #else
  177941. "adc r3, %[r]\n\t"
  177942. #endif
  177943. "uxth r6, r7\n\t"
  177944. #ifdef WOLFSSL_KEIL
  177945. "muls r5, r6, r5\n\t"
  177946. #elif defined(__clang__)
  177947. "muls r5, r6\n\t"
  177948. #else
  177949. "mul r5, r6\n\t"
  177950. #endif
  177951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177952. "lsrs r6, r5, #16\n\t"
  177953. #else
  177954. "lsr r6, r5, #16\n\t"
  177955. #endif
  177956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177957. "lsls r5, r5, #16\n\t"
  177958. #else
  177959. "lsl r5, r5, #16\n\t"
  177960. #endif
  177961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177962. "adds r4, r4, r5\n\t"
  177963. #else
  177964. "add r4, r4, r5\n\t"
  177965. #endif
  177966. #ifdef WOLFSSL_KEIL
  177967. "adcs r2, r2, r6\n\t"
  177968. #elif defined(__clang__)
  177969. "adcs r2, r6\n\t"
  177970. #else
  177971. "adc r2, r6\n\t"
  177972. #endif
  177973. #ifdef WOLFSSL_KEIL
  177974. "adcs r3, r3, %[r]\n\t"
  177975. #elif defined(__clang__)
  177976. "adcs r3, %[r]\n\t"
  177977. #else
  177978. "adc r3, %[r]\n\t"
  177979. #endif
  177980. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  177981. "adds r4, r4, r5\n\t"
  177982. #else
  177983. "add r4, r4, r5\n\t"
  177984. #endif
  177985. #ifdef WOLFSSL_KEIL
  177986. "adcs r2, r2, r6\n\t"
  177987. #elif defined(__clang__)
  177988. "adcs r2, r6\n\t"
  177989. #else
  177990. "adc r2, r6\n\t"
  177991. #endif
  177992. #ifdef WOLFSSL_KEIL
  177993. "adcs r3, r3, %[r]\n\t"
  177994. #elif defined(__clang__)
  177995. "adcs r3, %[r]\n\t"
  177996. #else
  177997. "adc r3, %[r]\n\t"
  177998. #endif
  177999. "# A[10] * A[1]\n\t"
  178000. "mov %[a], r9\n\t"
  178001. "mov r7, r11\n\t"
  178002. "ldr %[a], [%[a], #40]\n\t"
  178003. "uxth r5, %[a]\n\t"
  178004. "uxth r6, r7\n\t"
  178005. #ifdef WOLFSSL_KEIL
  178006. "muls r6, r5, r6\n\t"
  178007. #elif defined(__clang__)
  178008. "muls r6, r5\n\t"
  178009. #else
  178010. "mul r6, r5\n\t"
  178011. #endif
  178012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178013. "adds r4, r4, r6\n\t"
  178014. #else
  178015. "add r4, r4, r6\n\t"
  178016. #endif
  178017. #ifdef WOLFSSL_KEIL
  178018. "adcs r2, r2, %[r]\n\t"
  178019. #elif defined(__clang__)
  178020. "adcs r2, %[r]\n\t"
  178021. #else
  178022. "adc r2, %[r]\n\t"
  178023. #endif
  178024. #ifdef WOLFSSL_KEIL
  178025. "adcs r3, r3, %[r]\n\t"
  178026. #elif defined(__clang__)
  178027. "adcs r3, %[r]\n\t"
  178028. #else
  178029. "adc r3, %[r]\n\t"
  178030. #endif
  178031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178032. "adds r4, r4, r6\n\t"
  178033. #else
  178034. "add r4, r4, r6\n\t"
  178035. #endif
  178036. #ifdef WOLFSSL_KEIL
  178037. "adcs r2, r2, %[r]\n\t"
  178038. #elif defined(__clang__)
  178039. "adcs r2, %[r]\n\t"
  178040. #else
  178041. "adc r2, %[r]\n\t"
  178042. #endif
  178043. #ifdef WOLFSSL_KEIL
  178044. "adcs r3, r3, %[r]\n\t"
  178045. #elif defined(__clang__)
  178046. "adcs r3, %[r]\n\t"
  178047. #else
  178048. "adc r3, %[r]\n\t"
  178049. #endif
  178050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178051. "lsrs r6, r7, #16\n\t"
  178052. #else
  178053. "lsr r6, r7, #16\n\t"
  178054. #endif
  178055. #ifdef WOLFSSL_KEIL
  178056. "muls r5, r6, r5\n\t"
  178057. #elif defined(__clang__)
  178058. "muls r5, r6\n\t"
  178059. #else
  178060. "mul r5, r6\n\t"
  178061. #endif
  178062. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178063. "lsrs r6, r5, #16\n\t"
  178064. #else
  178065. "lsr r6, r5, #16\n\t"
  178066. #endif
  178067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178068. "lsls r5, r5, #16\n\t"
  178069. #else
  178070. "lsl r5, r5, #16\n\t"
  178071. #endif
  178072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178073. "adds r4, r4, r5\n\t"
  178074. #else
  178075. "add r4, r4, r5\n\t"
  178076. #endif
  178077. #ifdef WOLFSSL_KEIL
  178078. "adcs r2, r2, r6\n\t"
  178079. #elif defined(__clang__)
  178080. "adcs r2, r6\n\t"
  178081. #else
  178082. "adc r2, r6\n\t"
  178083. #endif
  178084. #ifdef WOLFSSL_KEIL
  178085. "adcs r3, r3, %[r]\n\t"
  178086. #elif defined(__clang__)
  178087. "adcs r3, %[r]\n\t"
  178088. #else
  178089. "adc r3, %[r]\n\t"
  178090. #endif
  178091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178092. "adds r4, r4, r5\n\t"
  178093. #else
  178094. "add r4, r4, r5\n\t"
  178095. #endif
  178096. #ifdef WOLFSSL_KEIL
  178097. "adcs r2, r2, r6\n\t"
  178098. #elif defined(__clang__)
  178099. "adcs r2, r6\n\t"
  178100. #else
  178101. "adc r2, r6\n\t"
  178102. #endif
  178103. #ifdef WOLFSSL_KEIL
  178104. "adcs r3, r3, %[r]\n\t"
  178105. #elif defined(__clang__)
  178106. "adcs r3, %[r]\n\t"
  178107. #else
  178108. "adc r3, %[r]\n\t"
  178109. #endif
  178110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178111. "lsrs r5, %[a], #16\n\t"
  178112. #else
  178113. "lsr r5, %[a], #16\n\t"
  178114. #endif
  178115. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178116. "lsrs r6, r7, #16\n\t"
  178117. #else
  178118. "lsr r6, r7, #16\n\t"
  178119. #endif
  178120. #ifdef WOLFSSL_KEIL
  178121. "muls r6, r5, r6\n\t"
  178122. #elif defined(__clang__)
  178123. "muls r6, r5\n\t"
  178124. #else
  178125. "mul r6, r5\n\t"
  178126. #endif
  178127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178128. "adds r2, r2, r6\n\t"
  178129. #else
  178130. "add r2, 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 r2, r2, r6\n\t"
  178141. #else
  178142. "add r2, r2, r6\n\t"
  178143. #endif
  178144. #ifdef WOLFSSL_KEIL
  178145. "adcs r3, r3, %[r]\n\t"
  178146. #elif defined(__clang__)
  178147. "adcs r3, %[r]\n\t"
  178148. #else
  178149. "adc r3, %[r]\n\t"
  178150. #endif
  178151. "uxth r6, r7\n\t"
  178152. #ifdef WOLFSSL_KEIL
  178153. "muls r5, r6, r5\n\t"
  178154. #elif defined(__clang__)
  178155. "muls r5, r6\n\t"
  178156. #else
  178157. "mul r5, r6\n\t"
  178158. #endif
  178159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178160. "lsrs r6, r5, #16\n\t"
  178161. #else
  178162. "lsr r6, r5, #16\n\t"
  178163. #endif
  178164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178165. "lsls r5, r5, #16\n\t"
  178166. #else
  178167. "lsl r5, r5, #16\n\t"
  178168. #endif
  178169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178170. "adds r4, r4, r5\n\t"
  178171. #else
  178172. "add r4, r4, r5\n\t"
  178173. #endif
  178174. #ifdef WOLFSSL_KEIL
  178175. "adcs r2, r2, r6\n\t"
  178176. #elif defined(__clang__)
  178177. "adcs r2, r6\n\t"
  178178. #else
  178179. "adc r2, r6\n\t"
  178180. #endif
  178181. #ifdef WOLFSSL_KEIL
  178182. "adcs r3, r3, %[r]\n\t"
  178183. #elif defined(__clang__)
  178184. "adcs r3, %[r]\n\t"
  178185. #else
  178186. "adc r3, %[r]\n\t"
  178187. #endif
  178188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178189. "adds r4, r4, r5\n\t"
  178190. #else
  178191. "add r4, r4, r5\n\t"
  178192. #endif
  178193. #ifdef WOLFSSL_KEIL
  178194. "adcs r2, r2, r6\n\t"
  178195. #elif defined(__clang__)
  178196. "adcs r2, r6\n\t"
  178197. #else
  178198. "adc r2, r6\n\t"
  178199. #endif
  178200. #ifdef WOLFSSL_KEIL
  178201. "adcs r3, r3, %[r]\n\t"
  178202. #elif defined(__clang__)
  178203. "adcs r3, %[r]\n\t"
  178204. #else
  178205. "adc r3, %[r]\n\t"
  178206. #endif
  178207. "# A[11] * A[0]\n\t"
  178208. "mov %[a], r9\n\t"
  178209. "mov r7, r10\n\t"
  178210. "ldr %[a], [%[a], #44]\n\t"
  178211. "uxth r5, %[a]\n\t"
  178212. "uxth r6, r7\n\t"
  178213. #ifdef WOLFSSL_KEIL
  178214. "muls r6, r5, r6\n\t"
  178215. #elif defined(__clang__)
  178216. "muls r6, r5\n\t"
  178217. #else
  178218. "mul r6, r5\n\t"
  178219. #endif
  178220. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178221. "adds r4, r4, r6\n\t"
  178222. #else
  178223. "add r4, r4, r6\n\t"
  178224. #endif
  178225. #ifdef WOLFSSL_KEIL
  178226. "adcs r2, r2, %[r]\n\t"
  178227. #elif defined(__clang__)
  178228. "adcs r2, %[r]\n\t"
  178229. #else
  178230. "adc r2, %[r]\n\t"
  178231. #endif
  178232. #ifdef WOLFSSL_KEIL
  178233. "adcs r3, r3, %[r]\n\t"
  178234. #elif defined(__clang__)
  178235. "adcs r3, %[r]\n\t"
  178236. #else
  178237. "adc r3, %[r]\n\t"
  178238. #endif
  178239. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178240. "adds r4, r4, r6\n\t"
  178241. #else
  178242. "add r4, r4, r6\n\t"
  178243. #endif
  178244. #ifdef WOLFSSL_KEIL
  178245. "adcs r2, r2, %[r]\n\t"
  178246. #elif defined(__clang__)
  178247. "adcs r2, %[r]\n\t"
  178248. #else
  178249. "adc r2, %[r]\n\t"
  178250. #endif
  178251. #ifdef WOLFSSL_KEIL
  178252. "adcs r3, r3, %[r]\n\t"
  178253. #elif defined(__clang__)
  178254. "adcs r3, %[r]\n\t"
  178255. #else
  178256. "adc r3, %[r]\n\t"
  178257. #endif
  178258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178259. "lsrs r6, r7, #16\n\t"
  178260. #else
  178261. "lsr r6, r7, #16\n\t"
  178262. #endif
  178263. #ifdef WOLFSSL_KEIL
  178264. "muls r5, r6, r5\n\t"
  178265. #elif defined(__clang__)
  178266. "muls r5, r6\n\t"
  178267. #else
  178268. "mul r5, r6\n\t"
  178269. #endif
  178270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178271. "lsrs r6, r5, #16\n\t"
  178272. #else
  178273. "lsr r6, r5, #16\n\t"
  178274. #endif
  178275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178276. "lsls r5, r5, #16\n\t"
  178277. #else
  178278. "lsl r5, r5, #16\n\t"
  178279. #endif
  178280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178281. "adds r4, r4, r5\n\t"
  178282. #else
  178283. "add r4, r4, r5\n\t"
  178284. #endif
  178285. #ifdef WOLFSSL_KEIL
  178286. "adcs r2, r2, r6\n\t"
  178287. #elif defined(__clang__)
  178288. "adcs r2, r6\n\t"
  178289. #else
  178290. "adc r2, r6\n\t"
  178291. #endif
  178292. #ifdef WOLFSSL_KEIL
  178293. "adcs r3, r3, %[r]\n\t"
  178294. #elif defined(__clang__)
  178295. "adcs r3, %[r]\n\t"
  178296. #else
  178297. "adc r3, %[r]\n\t"
  178298. #endif
  178299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178300. "adds r4, r4, r5\n\t"
  178301. #else
  178302. "add r4, r4, r5\n\t"
  178303. #endif
  178304. #ifdef WOLFSSL_KEIL
  178305. "adcs r2, r2, r6\n\t"
  178306. #elif defined(__clang__)
  178307. "adcs r2, r6\n\t"
  178308. #else
  178309. "adc r2, r6\n\t"
  178310. #endif
  178311. #ifdef WOLFSSL_KEIL
  178312. "adcs r3, r3, %[r]\n\t"
  178313. #elif defined(__clang__)
  178314. "adcs r3, %[r]\n\t"
  178315. #else
  178316. "adc r3, %[r]\n\t"
  178317. #endif
  178318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178319. "lsrs r5, %[a], #16\n\t"
  178320. #else
  178321. "lsr r5, %[a], #16\n\t"
  178322. #endif
  178323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178324. "lsrs r6, r7, #16\n\t"
  178325. #else
  178326. "lsr r6, r7, #16\n\t"
  178327. #endif
  178328. #ifdef WOLFSSL_KEIL
  178329. "muls r6, r5, r6\n\t"
  178330. #elif defined(__clang__)
  178331. "muls r6, r5\n\t"
  178332. #else
  178333. "mul r6, r5\n\t"
  178334. #endif
  178335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178336. "adds r2, r2, r6\n\t"
  178337. #else
  178338. "add r2, 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 r2, r2, r6\n\t"
  178349. #else
  178350. "add r2, r2, r6\n\t"
  178351. #endif
  178352. #ifdef WOLFSSL_KEIL
  178353. "adcs r3, r3, %[r]\n\t"
  178354. #elif defined(__clang__)
  178355. "adcs r3, %[r]\n\t"
  178356. #else
  178357. "adc r3, %[r]\n\t"
  178358. #endif
  178359. "uxth r6, r7\n\t"
  178360. #ifdef WOLFSSL_KEIL
  178361. "muls r5, r6, r5\n\t"
  178362. #elif defined(__clang__)
  178363. "muls r5, r6\n\t"
  178364. #else
  178365. "mul r5, r6\n\t"
  178366. #endif
  178367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178368. "lsrs r6, r5, #16\n\t"
  178369. #else
  178370. "lsr r6, r5, #16\n\t"
  178371. #endif
  178372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178373. "lsls r5, r5, #16\n\t"
  178374. #else
  178375. "lsl r5, r5, #16\n\t"
  178376. #endif
  178377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178378. "adds r4, r4, r5\n\t"
  178379. #else
  178380. "add r4, r4, r5\n\t"
  178381. #endif
  178382. #ifdef WOLFSSL_KEIL
  178383. "adcs r2, r2, r6\n\t"
  178384. #elif defined(__clang__)
  178385. "adcs r2, r6\n\t"
  178386. #else
  178387. "adc r2, r6\n\t"
  178388. #endif
  178389. #ifdef WOLFSSL_KEIL
  178390. "adcs r3, r3, %[r]\n\t"
  178391. #elif defined(__clang__)
  178392. "adcs r3, %[r]\n\t"
  178393. #else
  178394. "adc r3, %[r]\n\t"
  178395. #endif
  178396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178397. "adds r4, r4, r5\n\t"
  178398. #else
  178399. "add r4, r4, r5\n\t"
  178400. #endif
  178401. #ifdef WOLFSSL_KEIL
  178402. "adcs r2, r2, r6\n\t"
  178403. #elif defined(__clang__)
  178404. "adcs r2, r6\n\t"
  178405. #else
  178406. "adc r2, r6\n\t"
  178407. #endif
  178408. #ifdef WOLFSSL_KEIL
  178409. "adcs r3, r3, %[r]\n\t"
  178410. #elif defined(__clang__)
  178411. "adcs r3, %[r]\n\t"
  178412. #else
  178413. "adc r3, %[r]\n\t"
  178414. #endif
  178415. "str r4, [sp, #44]\n\t"
  178416. "# A[12] * A[0]\n\t"
  178417. "movs r4, #0\n\t"
  178418. "mov %[a], r9\n\t"
  178419. "ldr %[a], [%[a], #48]\n\t"
  178420. "uxth r5, %[a]\n\t"
  178421. "uxth r6, r7\n\t"
  178422. #ifdef WOLFSSL_KEIL
  178423. "muls r6, r5, r6\n\t"
  178424. #elif defined(__clang__)
  178425. "muls r6, r5\n\t"
  178426. #else
  178427. "mul r6, r5\n\t"
  178428. #endif
  178429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178430. "adds r2, r2, r6\n\t"
  178431. #else
  178432. "add r2, r2, r6\n\t"
  178433. #endif
  178434. #ifdef WOLFSSL_KEIL
  178435. "adcs r3, r3, %[r]\n\t"
  178436. #elif defined(__clang__)
  178437. "adcs r3, %[r]\n\t"
  178438. #else
  178439. "adc r3, %[r]\n\t"
  178440. #endif
  178441. #ifdef WOLFSSL_KEIL
  178442. "adcs r4, r4, %[r]\n\t"
  178443. #elif defined(__clang__)
  178444. "adcs r4, %[r]\n\t"
  178445. #else
  178446. "adc r4, %[r]\n\t"
  178447. #endif
  178448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178449. "adds r2, r2, r6\n\t"
  178450. #else
  178451. "add r2, r2, r6\n\t"
  178452. #endif
  178453. #ifdef WOLFSSL_KEIL
  178454. "adcs r3, r3, %[r]\n\t"
  178455. #elif defined(__clang__)
  178456. "adcs r3, %[r]\n\t"
  178457. #else
  178458. "adc r3, %[r]\n\t"
  178459. #endif
  178460. #ifdef WOLFSSL_KEIL
  178461. "adcs r4, r4, %[r]\n\t"
  178462. #elif defined(__clang__)
  178463. "adcs r4, %[r]\n\t"
  178464. #else
  178465. "adc r4, %[r]\n\t"
  178466. #endif
  178467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178468. "lsrs r6, r7, #16\n\t"
  178469. #else
  178470. "lsr r6, r7, #16\n\t"
  178471. #endif
  178472. #ifdef WOLFSSL_KEIL
  178473. "muls r5, r6, r5\n\t"
  178474. #elif defined(__clang__)
  178475. "muls r5, r6\n\t"
  178476. #else
  178477. "mul r5, r6\n\t"
  178478. #endif
  178479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178480. "lsrs r6, r5, #16\n\t"
  178481. #else
  178482. "lsr r6, r5, #16\n\t"
  178483. #endif
  178484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178485. "lsls r5, r5, #16\n\t"
  178486. #else
  178487. "lsl r5, r5, #16\n\t"
  178488. #endif
  178489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178490. "adds r2, r2, r5\n\t"
  178491. #else
  178492. "add r2, r2, r5\n\t"
  178493. #endif
  178494. #ifdef WOLFSSL_KEIL
  178495. "adcs r3, r3, r6\n\t"
  178496. #elif defined(__clang__)
  178497. "adcs r3, r6\n\t"
  178498. #else
  178499. "adc r3, r6\n\t"
  178500. #endif
  178501. #ifdef WOLFSSL_KEIL
  178502. "adcs r4, r4, %[r]\n\t"
  178503. #elif defined(__clang__)
  178504. "adcs r4, %[r]\n\t"
  178505. #else
  178506. "adc r4, %[r]\n\t"
  178507. #endif
  178508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178509. "adds r2, r2, r5\n\t"
  178510. #else
  178511. "add r2, r2, r5\n\t"
  178512. #endif
  178513. #ifdef WOLFSSL_KEIL
  178514. "adcs r3, r3, r6\n\t"
  178515. #elif defined(__clang__)
  178516. "adcs r3, r6\n\t"
  178517. #else
  178518. "adc r3, r6\n\t"
  178519. #endif
  178520. #ifdef WOLFSSL_KEIL
  178521. "adcs r4, r4, %[r]\n\t"
  178522. #elif defined(__clang__)
  178523. "adcs r4, %[r]\n\t"
  178524. #else
  178525. "adc r4, %[r]\n\t"
  178526. #endif
  178527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178528. "lsrs r5, %[a], #16\n\t"
  178529. #else
  178530. "lsr r5, %[a], #16\n\t"
  178531. #endif
  178532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178533. "lsrs r6, r7, #16\n\t"
  178534. #else
  178535. "lsr r6, r7, #16\n\t"
  178536. #endif
  178537. #ifdef WOLFSSL_KEIL
  178538. "muls r6, r5, r6\n\t"
  178539. #elif defined(__clang__)
  178540. "muls r6, r5\n\t"
  178541. #else
  178542. "mul r6, r5\n\t"
  178543. #endif
  178544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178545. "adds r3, r3, r6\n\t"
  178546. #else
  178547. "add r3, r3, r6\n\t"
  178548. #endif
  178549. #ifdef WOLFSSL_KEIL
  178550. "adcs r4, r4, %[r]\n\t"
  178551. #elif defined(__clang__)
  178552. "adcs r4, %[r]\n\t"
  178553. #else
  178554. "adc r4, %[r]\n\t"
  178555. #endif
  178556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178557. "adds r3, r3, r6\n\t"
  178558. #else
  178559. "add r3, r3, r6\n\t"
  178560. #endif
  178561. #ifdef WOLFSSL_KEIL
  178562. "adcs r4, r4, %[r]\n\t"
  178563. #elif defined(__clang__)
  178564. "adcs r4, %[r]\n\t"
  178565. #else
  178566. "adc r4, %[r]\n\t"
  178567. #endif
  178568. "uxth r6, r7\n\t"
  178569. #ifdef WOLFSSL_KEIL
  178570. "muls r5, r6, r5\n\t"
  178571. #elif defined(__clang__)
  178572. "muls r5, r6\n\t"
  178573. #else
  178574. "mul r5, r6\n\t"
  178575. #endif
  178576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178577. "lsrs r6, r5, #16\n\t"
  178578. #else
  178579. "lsr r6, r5, #16\n\t"
  178580. #endif
  178581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178582. "lsls r5, r5, #16\n\t"
  178583. #else
  178584. "lsl r5, r5, #16\n\t"
  178585. #endif
  178586. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178587. "adds r2, r2, r5\n\t"
  178588. #else
  178589. "add r2, r2, r5\n\t"
  178590. #endif
  178591. #ifdef WOLFSSL_KEIL
  178592. "adcs r3, r3, r6\n\t"
  178593. #elif defined(__clang__)
  178594. "adcs r3, r6\n\t"
  178595. #else
  178596. "adc r3, r6\n\t"
  178597. #endif
  178598. #ifdef WOLFSSL_KEIL
  178599. "adcs r4, r4, %[r]\n\t"
  178600. #elif defined(__clang__)
  178601. "adcs r4, %[r]\n\t"
  178602. #else
  178603. "adc r4, %[r]\n\t"
  178604. #endif
  178605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178606. "adds r2, r2, r5\n\t"
  178607. #else
  178608. "add r2, r2, r5\n\t"
  178609. #endif
  178610. #ifdef WOLFSSL_KEIL
  178611. "adcs r3, r3, r6\n\t"
  178612. #elif defined(__clang__)
  178613. "adcs r3, r6\n\t"
  178614. #else
  178615. "adc r3, r6\n\t"
  178616. #endif
  178617. #ifdef WOLFSSL_KEIL
  178618. "adcs r4, r4, %[r]\n\t"
  178619. #elif defined(__clang__)
  178620. "adcs r4, %[r]\n\t"
  178621. #else
  178622. "adc r4, %[r]\n\t"
  178623. #endif
  178624. "# A[11] * A[1]\n\t"
  178625. "mov %[a], r9\n\t"
  178626. "mov r7, r11\n\t"
  178627. "ldr %[a], [%[a], #44]\n\t"
  178628. "uxth r5, %[a]\n\t"
  178629. "uxth r6, r7\n\t"
  178630. #ifdef WOLFSSL_KEIL
  178631. "muls r6, r5, r6\n\t"
  178632. #elif defined(__clang__)
  178633. "muls r6, r5\n\t"
  178634. #else
  178635. "mul r6, r5\n\t"
  178636. #endif
  178637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178638. "adds r2, r2, r6\n\t"
  178639. #else
  178640. "add r2, r2, r6\n\t"
  178641. #endif
  178642. #ifdef WOLFSSL_KEIL
  178643. "adcs r3, r3, %[r]\n\t"
  178644. #elif defined(__clang__)
  178645. "adcs r3, %[r]\n\t"
  178646. #else
  178647. "adc r3, %[r]\n\t"
  178648. #endif
  178649. #ifdef WOLFSSL_KEIL
  178650. "adcs r4, r4, %[r]\n\t"
  178651. #elif defined(__clang__)
  178652. "adcs r4, %[r]\n\t"
  178653. #else
  178654. "adc r4, %[r]\n\t"
  178655. #endif
  178656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178657. "adds r2, r2, r6\n\t"
  178658. #else
  178659. "add r2, r2, r6\n\t"
  178660. #endif
  178661. #ifdef WOLFSSL_KEIL
  178662. "adcs r3, r3, %[r]\n\t"
  178663. #elif defined(__clang__)
  178664. "adcs r3, %[r]\n\t"
  178665. #else
  178666. "adc r3, %[r]\n\t"
  178667. #endif
  178668. #ifdef WOLFSSL_KEIL
  178669. "adcs r4, r4, %[r]\n\t"
  178670. #elif defined(__clang__)
  178671. "adcs r4, %[r]\n\t"
  178672. #else
  178673. "adc r4, %[r]\n\t"
  178674. #endif
  178675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178676. "lsrs r6, r7, #16\n\t"
  178677. #else
  178678. "lsr r6, r7, #16\n\t"
  178679. #endif
  178680. #ifdef WOLFSSL_KEIL
  178681. "muls r5, r6, r5\n\t"
  178682. #elif defined(__clang__)
  178683. "muls r5, r6\n\t"
  178684. #else
  178685. "mul r5, r6\n\t"
  178686. #endif
  178687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178688. "lsrs r6, r5, #16\n\t"
  178689. #else
  178690. "lsr r6, r5, #16\n\t"
  178691. #endif
  178692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178693. "lsls r5, r5, #16\n\t"
  178694. #else
  178695. "lsl r5, r5, #16\n\t"
  178696. #endif
  178697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178698. "adds r2, r2, r5\n\t"
  178699. #else
  178700. "add r2, r2, r5\n\t"
  178701. #endif
  178702. #ifdef WOLFSSL_KEIL
  178703. "adcs r3, r3, r6\n\t"
  178704. #elif defined(__clang__)
  178705. "adcs r3, r6\n\t"
  178706. #else
  178707. "adc r3, r6\n\t"
  178708. #endif
  178709. #ifdef WOLFSSL_KEIL
  178710. "adcs r4, r4, %[r]\n\t"
  178711. #elif defined(__clang__)
  178712. "adcs r4, %[r]\n\t"
  178713. #else
  178714. "adc r4, %[r]\n\t"
  178715. #endif
  178716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178717. "adds r2, r2, r5\n\t"
  178718. #else
  178719. "add r2, r2, r5\n\t"
  178720. #endif
  178721. #ifdef WOLFSSL_KEIL
  178722. "adcs r3, r3, r6\n\t"
  178723. #elif defined(__clang__)
  178724. "adcs r3, r6\n\t"
  178725. #else
  178726. "adc r3, r6\n\t"
  178727. #endif
  178728. #ifdef WOLFSSL_KEIL
  178729. "adcs r4, r4, %[r]\n\t"
  178730. #elif defined(__clang__)
  178731. "adcs r4, %[r]\n\t"
  178732. #else
  178733. "adc r4, %[r]\n\t"
  178734. #endif
  178735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178736. "lsrs r5, %[a], #16\n\t"
  178737. #else
  178738. "lsr r5, %[a], #16\n\t"
  178739. #endif
  178740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178741. "lsrs r6, r7, #16\n\t"
  178742. #else
  178743. "lsr r6, r7, #16\n\t"
  178744. #endif
  178745. #ifdef WOLFSSL_KEIL
  178746. "muls r6, r5, r6\n\t"
  178747. #elif defined(__clang__)
  178748. "muls r6, r5\n\t"
  178749. #else
  178750. "mul r6, r5\n\t"
  178751. #endif
  178752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178753. "adds r3, r3, r6\n\t"
  178754. #else
  178755. "add r3, r3, r6\n\t"
  178756. #endif
  178757. #ifdef WOLFSSL_KEIL
  178758. "adcs r4, r4, %[r]\n\t"
  178759. #elif defined(__clang__)
  178760. "adcs r4, %[r]\n\t"
  178761. #else
  178762. "adc r4, %[r]\n\t"
  178763. #endif
  178764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178765. "adds r3, r3, r6\n\t"
  178766. #else
  178767. "add r3, r3, r6\n\t"
  178768. #endif
  178769. #ifdef WOLFSSL_KEIL
  178770. "adcs r4, r4, %[r]\n\t"
  178771. #elif defined(__clang__)
  178772. "adcs r4, %[r]\n\t"
  178773. #else
  178774. "adc r4, %[r]\n\t"
  178775. #endif
  178776. "uxth r6, r7\n\t"
  178777. #ifdef WOLFSSL_KEIL
  178778. "muls r5, r6, r5\n\t"
  178779. #elif defined(__clang__)
  178780. "muls r5, r6\n\t"
  178781. #else
  178782. "mul r5, r6\n\t"
  178783. #endif
  178784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178785. "lsrs r6, r5, #16\n\t"
  178786. #else
  178787. "lsr r6, r5, #16\n\t"
  178788. #endif
  178789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178790. "lsls r5, r5, #16\n\t"
  178791. #else
  178792. "lsl r5, r5, #16\n\t"
  178793. #endif
  178794. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178795. "adds r2, r2, r5\n\t"
  178796. #else
  178797. "add r2, r2, r5\n\t"
  178798. #endif
  178799. #ifdef WOLFSSL_KEIL
  178800. "adcs r3, r3, r6\n\t"
  178801. #elif defined(__clang__)
  178802. "adcs r3, r6\n\t"
  178803. #else
  178804. "adc r3, r6\n\t"
  178805. #endif
  178806. #ifdef WOLFSSL_KEIL
  178807. "adcs r4, r4, %[r]\n\t"
  178808. #elif defined(__clang__)
  178809. "adcs r4, %[r]\n\t"
  178810. #else
  178811. "adc r4, %[r]\n\t"
  178812. #endif
  178813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178814. "adds r2, r2, r5\n\t"
  178815. #else
  178816. "add r2, r2, r5\n\t"
  178817. #endif
  178818. #ifdef WOLFSSL_KEIL
  178819. "adcs r3, r3, r6\n\t"
  178820. #elif defined(__clang__)
  178821. "adcs r3, r6\n\t"
  178822. #else
  178823. "adc r3, r6\n\t"
  178824. #endif
  178825. #ifdef WOLFSSL_KEIL
  178826. "adcs r4, r4, %[r]\n\t"
  178827. #elif defined(__clang__)
  178828. "adcs r4, %[r]\n\t"
  178829. #else
  178830. "adc r4, %[r]\n\t"
  178831. #endif
  178832. "# A[10] * A[2]\n\t"
  178833. "mov %[a], r9\n\t"
  178834. "mov r7, r12\n\t"
  178835. "ldr %[a], [%[a], #40]\n\t"
  178836. "uxth r5, %[a]\n\t"
  178837. "uxth r6, r7\n\t"
  178838. #ifdef WOLFSSL_KEIL
  178839. "muls r6, r5, r6\n\t"
  178840. #elif defined(__clang__)
  178841. "muls r6, r5\n\t"
  178842. #else
  178843. "mul r6, r5\n\t"
  178844. #endif
  178845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178846. "adds r2, r2, r6\n\t"
  178847. #else
  178848. "add r2, r2, r6\n\t"
  178849. #endif
  178850. #ifdef WOLFSSL_KEIL
  178851. "adcs r3, r3, %[r]\n\t"
  178852. #elif defined(__clang__)
  178853. "adcs r3, %[r]\n\t"
  178854. #else
  178855. "adc r3, %[r]\n\t"
  178856. #endif
  178857. #ifdef WOLFSSL_KEIL
  178858. "adcs r4, r4, %[r]\n\t"
  178859. #elif defined(__clang__)
  178860. "adcs r4, %[r]\n\t"
  178861. #else
  178862. "adc r4, %[r]\n\t"
  178863. #endif
  178864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178865. "adds r2, r2, r6\n\t"
  178866. #else
  178867. "add r2, r2, r6\n\t"
  178868. #endif
  178869. #ifdef WOLFSSL_KEIL
  178870. "adcs r3, r3, %[r]\n\t"
  178871. #elif defined(__clang__)
  178872. "adcs r3, %[r]\n\t"
  178873. #else
  178874. "adc r3, %[r]\n\t"
  178875. #endif
  178876. #ifdef WOLFSSL_KEIL
  178877. "adcs r4, r4, %[r]\n\t"
  178878. #elif defined(__clang__)
  178879. "adcs r4, %[r]\n\t"
  178880. #else
  178881. "adc r4, %[r]\n\t"
  178882. #endif
  178883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178884. "lsrs r6, r7, #16\n\t"
  178885. #else
  178886. "lsr r6, r7, #16\n\t"
  178887. #endif
  178888. #ifdef WOLFSSL_KEIL
  178889. "muls r5, r6, r5\n\t"
  178890. #elif defined(__clang__)
  178891. "muls r5, r6\n\t"
  178892. #else
  178893. "mul r5, r6\n\t"
  178894. #endif
  178895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178896. "lsrs r6, r5, #16\n\t"
  178897. #else
  178898. "lsr r6, r5, #16\n\t"
  178899. #endif
  178900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178901. "lsls r5, r5, #16\n\t"
  178902. #else
  178903. "lsl r5, r5, #16\n\t"
  178904. #endif
  178905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178906. "adds r2, r2, r5\n\t"
  178907. #else
  178908. "add r2, r2, r5\n\t"
  178909. #endif
  178910. #ifdef WOLFSSL_KEIL
  178911. "adcs r3, r3, r6\n\t"
  178912. #elif defined(__clang__)
  178913. "adcs r3, r6\n\t"
  178914. #else
  178915. "adc r3, r6\n\t"
  178916. #endif
  178917. #ifdef WOLFSSL_KEIL
  178918. "adcs r4, r4, %[r]\n\t"
  178919. #elif defined(__clang__)
  178920. "adcs r4, %[r]\n\t"
  178921. #else
  178922. "adc r4, %[r]\n\t"
  178923. #endif
  178924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178925. "adds r2, r2, r5\n\t"
  178926. #else
  178927. "add r2, r2, r5\n\t"
  178928. #endif
  178929. #ifdef WOLFSSL_KEIL
  178930. "adcs r3, r3, r6\n\t"
  178931. #elif defined(__clang__)
  178932. "adcs r3, r6\n\t"
  178933. #else
  178934. "adc r3, r6\n\t"
  178935. #endif
  178936. #ifdef WOLFSSL_KEIL
  178937. "adcs r4, r4, %[r]\n\t"
  178938. #elif defined(__clang__)
  178939. "adcs r4, %[r]\n\t"
  178940. #else
  178941. "adc r4, %[r]\n\t"
  178942. #endif
  178943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178944. "lsrs r5, %[a], #16\n\t"
  178945. #else
  178946. "lsr r5, %[a], #16\n\t"
  178947. #endif
  178948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178949. "lsrs r6, r7, #16\n\t"
  178950. #else
  178951. "lsr r6, r7, #16\n\t"
  178952. #endif
  178953. #ifdef WOLFSSL_KEIL
  178954. "muls r6, r5, r6\n\t"
  178955. #elif defined(__clang__)
  178956. "muls r6, r5\n\t"
  178957. #else
  178958. "mul r6, r5\n\t"
  178959. #endif
  178960. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178961. "adds r3, r3, r6\n\t"
  178962. #else
  178963. "add r3, 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 r3, r3, r6\n\t"
  178974. #else
  178975. "add r3, r3, r6\n\t"
  178976. #endif
  178977. #ifdef WOLFSSL_KEIL
  178978. "adcs r4, r4, %[r]\n\t"
  178979. #elif defined(__clang__)
  178980. "adcs r4, %[r]\n\t"
  178981. #else
  178982. "adc r4, %[r]\n\t"
  178983. #endif
  178984. "uxth r6, r7\n\t"
  178985. #ifdef WOLFSSL_KEIL
  178986. "muls r5, r6, r5\n\t"
  178987. #elif defined(__clang__)
  178988. "muls r5, r6\n\t"
  178989. #else
  178990. "mul r5, r6\n\t"
  178991. #endif
  178992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178993. "lsrs r6, r5, #16\n\t"
  178994. #else
  178995. "lsr r6, r5, #16\n\t"
  178996. #endif
  178997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  178998. "lsls r5, r5, #16\n\t"
  178999. #else
  179000. "lsl r5, r5, #16\n\t"
  179001. #endif
  179002. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179003. "adds r2, r2, r5\n\t"
  179004. #else
  179005. "add r2, r2, r5\n\t"
  179006. #endif
  179007. #ifdef WOLFSSL_KEIL
  179008. "adcs r3, r3, r6\n\t"
  179009. #elif defined(__clang__)
  179010. "adcs r3, r6\n\t"
  179011. #else
  179012. "adc r3, r6\n\t"
  179013. #endif
  179014. #ifdef WOLFSSL_KEIL
  179015. "adcs r4, r4, %[r]\n\t"
  179016. #elif defined(__clang__)
  179017. "adcs r4, %[r]\n\t"
  179018. #else
  179019. "adc r4, %[r]\n\t"
  179020. #endif
  179021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179022. "adds r2, r2, r5\n\t"
  179023. #else
  179024. "add r2, r2, r5\n\t"
  179025. #endif
  179026. #ifdef WOLFSSL_KEIL
  179027. "adcs r3, r3, r6\n\t"
  179028. #elif defined(__clang__)
  179029. "adcs r3, r6\n\t"
  179030. #else
  179031. "adc r3, r6\n\t"
  179032. #endif
  179033. #ifdef WOLFSSL_KEIL
  179034. "adcs r4, r4, %[r]\n\t"
  179035. #elif defined(__clang__)
  179036. "adcs r4, %[r]\n\t"
  179037. #else
  179038. "adc r4, %[r]\n\t"
  179039. #endif
  179040. "# A[9] * A[3]\n\t"
  179041. "mov %[a], r9\n\t"
  179042. "mov r7, lr\n\t"
  179043. "ldr %[a], [%[a], #36]\n\t"
  179044. "uxth r5, %[a]\n\t"
  179045. "uxth r6, r7\n\t"
  179046. #ifdef WOLFSSL_KEIL
  179047. "muls r6, r5, r6\n\t"
  179048. #elif defined(__clang__)
  179049. "muls r6, r5\n\t"
  179050. #else
  179051. "mul r6, r5\n\t"
  179052. #endif
  179053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179054. "adds r2, r2, r6\n\t"
  179055. #else
  179056. "add r2, r2, r6\n\t"
  179057. #endif
  179058. #ifdef WOLFSSL_KEIL
  179059. "adcs r3, r3, %[r]\n\t"
  179060. #elif defined(__clang__)
  179061. "adcs r3, %[r]\n\t"
  179062. #else
  179063. "adc r3, %[r]\n\t"
  179064. #endif
  179065. #ifdef WOLFSSL_KEIL
  179066. "adcs r4, r4, %[r]\n\t"
  179067. #elif defined(__clang__)
  179068. "adcs r4, %[r]\n\t"
  179069. #else
  179070. "adc r4, %[r]\n\t"
  179071. #endif
  179072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179073. "adds r2, r2, r6\n\t"
  179074. #else
  179075. "add r2, r2, r6\n\t"
  179076. #endif
  179077. #ifdef WOLFSSL_KEIL
  179078. "adcs r3, r3, %[r]\n\t"
  179079. #elif defined(__clang__)
  179080. "adcs r3, %[r]\n\t"
  179081. #else
  179082. "adc r3, %[r]\n\t"
  179083. #endif
  179084. #ifdef WOLFSSL_KEIL
  179085. "adcs r4, r4, %[r]\n\t"
  179086. #elif defined(__clang__)
  179087. "adcs r4, %[r]\n\t"
  179088. #else
  179089. "adc r4, %[r]\n\t"
  179090. #endif
  179091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179092. "lsrs r6, r7, #16\n\t"
  179093. #else
  179094. "lsr r6, r7, #16\n\t"
  179095. #endif
  179096. #ifdef WOLFSSL_KEIL
  179097. "muls r5, r6, r5\n\t"
  179098. #elif defined(__clang__)
  179099. "muls r5, r6\n\t"
  179100. #else
  179101. "mul r5, r6\n\t"
  179102. #endif
  179103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179104. "lsrs r6, r5, #16\n\t"
  179105. #else
  179106. "lsr r6, r5, #16\n\t"
  179107. #endif
  179108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179109. "lsls r5, r5, #16\n\t"
  179110. #else
  179111. "lsl r5, r5, #16\n\t"
  179112. #endif
  179113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179114. "adds r2, r2, r5\n\t"
  179115. #else
  179116. "add r2, r2, r5\n\t"
  179117. #endif
  179118. #ifdef WOLFSSL_KEIL
  179119. "adcs r3, r3, r6\n\t"
  179120. #elif defined(__clang__)
  179121. "adcs r3, r6\n\t"
  179122. #else
  179123. "adc r3, r6\n\t"
  179124. #endif
  179125. #ifdef WOLFSSL_KEIL
  179126. "adcs r4, r4, %[r]\n\t"
  179127. #elif defined(__clang__)
  179128. "adcs r4, %[r]\n\t"
  179129. #else
  179130. "adc r4, %[r]\n\t"
  179131. #endif
  179132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179133. "adds r2, r2, r5\n\t"
  179134. #else
  179135. "add r2, r2, r5\n\t"
  179136. #endif
  179137. #ifdef WOLFSSL_KEIL
  179138. "adcs r3, r3, r6\n\t"
  179139. #elif defined(__clang__)
  179140. "adcs r3, r6\n\t"
  179141. #else
  179142. "adc r3, r6\n\t"
  179143. #endif
  179144. #ifdef WOLFSSL_KEIL
  179145. "adcs r4, r4, %[r]\n\t"
  179146. #elif defined(__clang__)
  179147. "adcs r4, %[r]\n\t"
  179148. #else
  179149. "adc r4, %[r]\n\t"
  179150. #endif
  179151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179152. "lsrs r5, %[a], #16\n\t"
  179153. #else
  179154. "lsr r5, %[a], #16\n\t"
  179155. #endif
  179156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179157. "lsrs r6, r7, #16\n\t"
  179158. #else
  179159. "lsr r6, r7, #16\n\t"
  179160. #endif
  179161. #ifdef WOLFSSL_KEIL
  179162. "muls r6, r5, r6\n\t"
  179163. #elif defined(__clang__)
  179164. "muls r6, r5\n\t"
  179165. #else
  179166. "mul r6, r5\n\t"
  179167. #endif
  179168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179169. "adds r3, r3, r6\n\t"
  179170. #else
  179171. "add r3, 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 r3, r3, r6\n\t"
  179182. #else
  179183. "add r3, r3, r6\n\t"
  179184. #endif
  179185. #ifdef WOLFSSL_KEIL
  179186. "adcs r4, r4, %[r]\n\t"
  179187. #elif defined(__clang__)
  179188. "adcs r4, %[r]\n\t"
  179189. #else
  179190. "adc r4, %[r]\n\t"
  179191. #endif
  179192. "uxth r6, r7\n\t"
  179193. #ifdef WOLFSSL_KEIL
  179194. "muls r5, r6, r5\n\t"
  179195. #elif defined(__clang__)
  179196. "muls r5, r6\n\t"
  179197. #else
  179198. "mul r5, r6\n\t"
  179199. #endif
  179200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179201. "lsrs r6, r5, #16\n\t"
  179202. #else
  179203. "lsr r6, r5, #16\n\t"
  179204. #endif
  179205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179206. "lsls r5, r5, #16\n\t"
  179207. #else
  179208. "lsl r5, r5, #16\n\t"
  179209. #endif
  179210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179211. "adds r2, r2, r5\n\t"
  179212. #else
  179213. "add r2, r2, r5\n\t"
  179214. #endif
  179215. #ifdef WOLFSSL_KEIL
  179216. "adcs r3, r3, r6\n\t"
  179217. #elif defined(__clang__)
  179218. "adcs r3, r6\n\t"
  179219. #else
  179220. "adc r3, r6\n\t"
  179221. #endif
  179222. #ifdef WOLFSSL_KEIL
  179223. "adcs r4, r4, %[r]\n\t"
  179224. #elif defined(__clang__)
  179225. "adcs r4, %[r]\n\t"
  179226. #else
  179227. "adc r4, %[r]\n\t"
  179228. #endif
  179229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179230. "adds r2, r2, r5\n\t"
  179231. #else
  179232. "add r2, r2, r5\n\t"
  179233. #endif
  179234. #ifdef WOLFSSL_KEIL
  179235. "adcs r3, r3, r6\n\t"
  179236. #elif defined(__clang__)
  179237. "adcs r3, r6\n\t"
  179238. #else
  179239. "adc r3, r6\n\t"
  179240. #endif
  179241. #ifdef WOLFSSL_KEIL
  179242. "adcs r4, r4, %[r]\n\t"
  179243. #elif defined(__clang__)
  179244. "adcs r4, %[r]\n\t"
  179245. #else
  179246. "adc r4, %[r]\n\t"
  179247. #endif
  179248. "# A[8] * A[4]\n\t"
  179249. "mov %[a], r9\n\t"
  179250. "ldr r7, [%[a], #16]\n\t"
  179251. "ldr %[a], [%[a], #32]\n\t"
  179252. "uxth r5, %[a]\n\t"
  179253. "uxth r6, r7\n\t"
  179254. #ifdef WOLFSSL_KEIL
  179255. "muls r6, r5, r6\n\t"
  179256. #elif defined(__clang__)
  179257. "muls r6, r5\n\t"
  179258. #else
  179259. "mul r6, r5\n\t"
  179260. #endif
  179261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179262. "adds r2, r2, r6\n\t"
  179263. #else
  179264. "add r2, r2, r6\n\t"
  179265. #endif
  179266. #ifdef WOLFSSL_KEIL
  179267. "adcs r3, r3, %[r]\n\t"
  179268. #elif defined(__clang__)
  179269. "adcs r3, %[r]\n\t"
  179270. #else
  179271. "adc r3, %[r]\n\t"
  179272. #endif
  179273. #ifdef WOLFSSL_KEIL
  179274. "adcs r4, r4, %[r]\n\t"
  179275. #elif defined(__clang__)
  179276. "adcs r4, %[r]\n\t"
  179277. #else
  179278. "adc r4, %[r]\n\t"
  179279. #endif
  179280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179281. "adds r2, r2, r6\n\t"
  179282. #else
  179283. "add r2, r2, r6\n\t"
  179284. #endif
  179285. #ifdef WOLFSSL_KEIL
  179286. "adcs r3, r3, %[r]\n\t"
  179287. #elif defined(__clang__)
  179288. "adcs r3, %[r]\n\t"
  179289. #else
  179290. "adc r3, %[r]\n\t"
  179291. #endif
  179292. #ifdef WOLFSSL_KEIL
  179293. "adcs r4, r4, %[r]\n\t"
  179294. #elif defined(__clang__)
  179295. "adcs r4, %[r]\n\t"
  179296. #else
  179297. "adc r4, %[r]\n\t"
  179298. #endif
  179299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179300. "lsrs r6, r7, #16\n\t"
  179301. #else
  179302. "lsr r6, r7, #16\n\t"
  179303. #endif
  179304. #ifdef WOLFSSL_KEIL
  179305. "muls r5, r6, r5\n\t"
  179306. #elif defined(__clang__)
  179307. "muls r5, r6\n\t"
  179308. #else
  179309. "mul r5, r6\n\t"
  179310. #endif
  179311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179312. "lsrs r6, r5, #16\n\t"
  179313. #else
  179314. "lsr r6, r5, #16\n\t"
  179315. #endif
  179316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179317. "lsls r5, r5, #16\n\t"
  179318. #else
  179319. "lsl r5, r5, #16\n\t"
  179320. #endif
  179321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179322. "adds r2, r2, r5\n\t"
  179323. #else
  179324. "add r2, r2, r5\n\t"
  179325. #endif
  179326. #ifdef WOLFSSL_KEIL
  179327. "adcs r3, r3, r6\n\t"
  179328. #elif defined(__clang__)
  179329. "adcs r3, r6\n\t"
  179330. #else
  179331. "adc r3, r6\n\t"
  179332. #endif
  179333. #ifdef WOLFSSL_KEIL
  179334. "adcs r4, r4, %[r]\n\t"
  179335. #elif defined(__clang__)
  179336. "adcs r4, %[r]\n\t"
  179337. #else
  179338. "adc r4, %[r]\n\t"
  179339. #endif
  179340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179341. "adds r2, r2, r5\n\t"
  179342. #else
  179343. "add r2, r2, r5\n\t"
  179344. #endif
  179345. #ifdef WOLFSSL_KEIL
  179346. "adcs r3, r3, r6\n\t"
  179347. #elif defined(__clang__)
  179348. "adcs r3, r6\n\t"
  179349. #else
  179350. "adc r3, r6\n\t"
  179351. #endif
  179352. #ifdef WOLFSSL_KEIL
  179353. "adcs r4, r4, %[r]\n\t"
  179354. #elif defined(__clang__)
  179355. "adcs r4, %[r]\n\t"
  179356. #else
  179357. "adc r4, %[r]\n\t"
  179358. #endif
  179359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179360. "lsrs r5, %[a], #16\n\t"
  179361. #else
  179362. "lsr r5, %[a], #16\n\t"
  179363. #endif
  179364. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179365. "lsrs r6, r7, #16\n\t"
  179366. #else
  179367. "lsr r6, r7, #16\n\t"
  179368. #endif
  179369. #ifdef WOLFSSL_KEIL
  179370. "muls r6, r5, r6\n\t"
  179371. #elif defined(__clang__)
  179372. "muls r6, r5\n\t"
  179373. #else
  179374. "mul r6, r5\n\t"
  179375. #endif
  179376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179377. "adds r3, r3, r6\n\t"
  179378. #else
  179379. "add r3, 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 r3, r3, r6\n\t"
  179390. #else
  179391. "add r3, r3, r6\n\t"
  179392. #endif
  179393. #ifdef WOLFSSL_KEIL
  179394. "adcs r4, r4, %[r]\n\t"
  179395. #elif defined(__clang__)
  179396. "adcs r4, %[r]\n\t"
  179397. #else
  179398. "adc r4, %[r]\n\t"
  179399. #endif
  179400. "uxth r6, r7\n\t"
  179401. #ifdef WOLFSSL_KEIL
  179402. "muls r5, r6, r5\n\t"
  179403. #elif defined(__clang__)
  179404. "muls r5, r6\n\t"
  179405. #else
  179406. "mul r5, r6\n\t"
  179407. #endif
  179408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179409. "lsrs r6, r5, #16\n\t"
  179410. #else
  179411. "lsr r6, r5, #16\n\t"
  179412. #endif
  179413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179414. "lsls r5, r5, #16\n\t"
  179415. #else
  179416. "lsl r5, r5, #16\n\t"
  179417. #endif
  179418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179419. "adds r2, r2, r5\n\t"
  179420. #else
  179421. "add r2, r2, r5\n\t"
  179422. #endif
  179423. #ifdef WOLFSSL_KEIL
  179424. "adcs r3, r3, r6\n\t"
  179425. #elif defined(__clang__)
  179426. "adcs r3, r6\n\t"
  179427. #else
  179428. "adc r3, r6\n\t"
  179429. #endif
  179430. #ifdef WOLFSSL_KEIL
  179431. "adcs r4, r4, %[r]\n\t"
  179432. #elif defined(__clang__)
  179433. "adcs r4, %[r]\n\t"
  179434. #else
  179435. "adc r4, %[r]\n\t"
  179436. #endif
  179437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179438. "adds r2, r2, r5\n\t"
  179439. #else
  179440. "add r2, r2, r5\n\t"
  179441. #endif
  179442. #ifdef WOLFSSL_KEIL
  179443. "adcs r3, r3, r6\n\t"
  179444. #elif defined(__clang__)
  179445. "adcs r3, r6\n\t"
  179446. #else
  179447. "adc r3, r6\n\t"
  179448. #endif
  179449. #ifdef WOLFSSL_KEIL
  179450. "adcs r4, r4, %[r]\n\t"
  179451. #elif defined(__clang__)
  179452. "adcs r4, %[r]\n\t"
  179453. #else
  179454. "adc r4, %[r]\n\t"
  179455. #endif
  179456. "# A[7] * A[5]\n\t"
  179457. "mov %[a], r9\n\t"
  179458. "ldr r7, [%[a], #20]\n\t"
  179459. "ldr %[a], [%[a], #28]\n\t"
  179460. "uxth r5, %[a]\n\t"
  179461. "uxth r6, r7\n\t"
  179462. #ifdef WOLFSSL_KEIL
  179463. "muls r6, r5, r6\n\t"
  179464. #elif defined(__clang__)
  179465. "muls r6, r5\n\t"
  179466. #else
  179467. "mul r6, r5\n\t"
  179468. #endif
  179469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179470. "adds r2, r2, r6\n\t"
  179471. #else
  179472. "add r2, r2, r6\n\t"
  179473. #endif
  179474. #ifdef WOLFSSL_KEIL
  179475. "adcs r3, r3, %[r]\n\t"
  179476. #elif defined(__clang__)
  179477. "adcs r3, %[r]\n\t"
  179478. #else
  179479. "adc r3, %[r]\n\t"
  179480. #endif
  179481. #ifdef WOLFSSL_KEIL
  179482. "adcs r4, r4, %[r]\n\t"
  179483. #elif defined(__clang__)
  179484. "adcs r4, %[r]\n\t"
  179485. #else
  179486. "adc r4, %[r]\n\t"
  179487. #endif
  179488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179489. "adds r2, r2, r6\n\t"
  179490. #else
  179491. "add r2, r2, r6\n\t"
  179492. #endif
  179493. #ifdef WOLFSSL_KEIL
  179494. "adcs r3, r3, %[r]\n\t"
  179495. #elif defined(__clang__)
  179496. "adcs r3, %[r]\n\t"
  179497. #else
  179498. "adc r3, %[r]\n\t"
  179499. #endif
  179500. #ifdef WOLFSSL_KEIL
  179501. "adcs r4, r4, %[r]\n\t"
  179502. #elif defined(__clang__)
  179503. "adcs r4, %[r]\n\t"
  179504. #else
  179505. "adc r4, %[r]\n\t"
  179506. #endif
  179507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179508. "lsrs r6, r7, #16\n\t"
  179509. #else
  179510. "lsr r6, r7, #16\n\t"
  179511. #endif
  179512. #ifdef WOLFSSL_KEIL
  179513. "muls r5, r6, r5\n\t"
  179514. #elif defined(__clang__)
  179515. "muls r5, r6\n\t"
  179516. #else
  179517. "mul r5, r6\n\t"
  179518. #endif
  179519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179520. "lsrs r6, r5, #16\n\t"
  179521. #else
  179522. "lsr r6, r5, #16\n\t"
  179523. #endif
  179524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179525. "lsls r5, r5, #16\n\t"
  179526. #else
  179527. "lsl r5, r5, #16\n\t"
  179528. #endif
  179529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179530. "adds r2, r2, r5\n\t"
  179531. #else
  179532. "add r2, r2, r5\n\t"
  179533. #endif
  179534. #ifdef WOLFSSL_KEIL
  179535. "adcs r3, r3, r6\n\t"
  179536. #elif defined(__clang__)
  179537. "adcs r3, r6\n\t"
  179538. #else
  179539. "adc r3, r6\n\t"
  179540. #endif
  179541. #ifdef WOLFSSL_KEIL
  179542. "adcs r4, r4, %[r]\n\t"
  179543. #elif defined(__clang__)
  179544. "adcs r4, %[r]\n\t"
  179545. #else
  179546. "adc r4, %[r]\n\t"
  179547. #endif
  179548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179549. "adds r2, r2, r5\n\t"
  179550. #else
  179551. "add r2, r2, r5\n\t"
  179552. #endif
  179553. #ifdef WOLFSSL_KEIL
  179554. "adcs r3, r3, r6\n\t"
  179555. #elif defined(__clang__)
  179556. "adcs r3, r6\n\t"
  179557. #else
  179558. "adc r3, r6\n\t"
  179559. #endif
  179560. #ifdef WOLFSSL_KEIL
  179561. "adcs r4, r4, %[r]\n\t"
  179562. #elif defined(__clang__)
  179563. "adcs r4, %[r]\n\t"
  179564. #else
  179565. "adc r4, %[r]\n\t"
  179566. #endif
  179567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179568. "lsrs r5, %[a], #16\n\t"
  179569. #else
  179570. "lsr r5, %[a], #16\n\t"
  179571. #endif
  179572. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179573. "lsrs r6, r7, #16\n\t"
  179574. #else
  179575. "lsr r6, r7, #16\n\t"
  179576. #endif
  179577. #ifdef WOLFSSL_KEIL
  179578. "muls r6, r5, r6\n\t"
  179579. #elif defined(__clang__)
  179580. "muls r6, r5\n\t"
  179581. #else
  179582. "mul r6, r5\n\t"
  179583. #endif
  179584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179585. "adds r3, r3, r6\n\t"
  179586. #else
  179587. "add r3, 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 r3, r3, r6\n\t"
  179598. #else
  179599. "add r3, r3, r6\n\t"
  179600. #endif
  179601. #ifdef WOLFSSL_KEIL
  179602. "adcs r4, r4, %[r]\n\t"
  179603. #elif defined(__clang__)
  179604. "adcs r4, %[r]\n\t"
  179605. #else
  179606. "adc r4, %[r]\n\t"
  179607. #endif
  179608. "uxth r6, r7\n\t"
  179609. #ifdef WOLFSSL_KEIL
  179610. "muls r5, r6, r5\n\t"
  179611. #elif defined(__clang__)
  179612. "muls r5, r6\n\t"
  179613. #else
  179614. "mul r5, r6\n\t"
  179615. #endif
  179616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179617. "lsrs r6, r5, #16\n\t"
  179618. #else
  179619. "lsr r6, r5, #16\n\t"
  179620. #endif
  179621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179622. "lsls r5, r5, #16\n\t"
  179623. #else
  179624. "lsl r5, r5, #16\n\t"
  179625. #endif
  179626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179627. "adds r2, r2, r5\n\t"
  179628. #else
  179629. "add r2, r2, r5\n\t"
  179630. #endif
  179631. #ifdef WOLFSSL_KEIL
  179632. "adcs r3, r3, r6\n\t"
  179633. #elif defined(__clang__)
  179634. "adcs r3, r6\n\t"
  179635. #else
  179636. "adc r3, r6\n\t"
  179637. #endif
  179638. #ifdef WOLFSSL_KEIL
  179639. "adcs r4, r4, %[r]\n\t"
  179640. #elif defined(__clang__)
  179641. "adcs r4, %[r]\n\t"
  179642. #else
  179643. "adc r4, %[r]\n\t"
  179644. #endif
  179645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179646. "adds r2, r2, r5\n\t"
  179647. #else
  179648. "add r2, r2, r5\n\t"
  179649. #endif
  179650. #ifdef WOLFSSL_KEIL
  179651. "adcs r3, r3, r6\n\t"
  179652. #elif defined(__clang__)
  179653. "adcs r3, r6\n\t"
  179654. #else
  179655. "adc r3, r6\n\t"
  179656. #endif
  179657. #ifdef WOLFSSL_KEIL
  179658. "adcs r4, r4, %[r]\n\t"
  179659. #elif defined(__clang__)
  179660. "adcs r4, %[r]\n\t"
  179661. #else
  179662. "adc r4, %[r]\n\t"
  179663. #endif
  179664. "# A[6] * A[6]\n\t"
  179665. "mov %[a], r9\n\t"
  179666. "ldr r7, [%[a], #24]\n\t"
  179667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179668. "lsrs r6, r7, #16\n\t"
  179669. #else
  179670. "lsr r6, r7, #16\n\t"
  179671. #endif
  179672. "uxth r5, r7\n\t"
  179673. #ifdef WOLFSSL_KEIL
  179674. "muls r5, r5, r5\n\t"
  179675. #elif defined(__clang__)
  179676. "muls r5, r5\n\t"
  179677. #else
  179678. "mul r5, r5\n\t"
  179679. #endif
  179680. #ifdef WOLFSSL_KEIL
  179681. "muls r6, r6, r6\n\t"
  179682. #elif defined(__clang__)
  179683. "muls r6, r6\n\t"
  179684. #else
  179685. "mul r6, r6\n\t"
  179686. #endif
  179687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179688. "adds r2, r2, r5\n\t"
  179689. #else
  179690. "add r2, r2, r5\n\t"
  179691. #endif
  179692. #ifdef WOLFSSL_KEIL
  179693. "adcs r3, r3, r6\n\t"
  179694. #elif defined(__clang__)
  179695. "adcs r3, r6\n\t"
  179696. #else
  179697. "adc r3, r6\n\t"
  179698. #endif
  179699. #ifdef WOLFSSL_KEIL
  179700. "adcs r4, r4, %[r]\n\t"
  179701. #elif defined(__clang__)
  179702. "adcs r4, %[r]\n\t"
  179703. #else
  179704. "adc r4, %[r]\n\t"
  179705. #endif
  179706. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179707. "lsrs r6, r7, #16\n\t"
  179708. #else
  179709. "lsr r6, r7, #16\n\t"
  179710. #endif
  179711. "uxth r5, r7\n\t"
  179712. #ifdef WOLFSSL_KEIL
  179713. "muls r5, r6, r5\n\t"
  179714. #elif defined(__clang__)
  179715. "muls r5, r6\n\t"
  179716. #else
  179717. "mul r5, r6\n\t"
  179718. #endif
  179719. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179720. "lsrs r6, r5, #15\n\t"
  179721. #else
  179722. "lsr r6, r5, #15\n\t"
  179723. #endif
  179724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179725. "lsls r5, r5, #17\n\t"
  179726. #else
  179727. "lsl r5, r5, #17\n\t"
  179728. #endif
  179729. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179730. "adds r2, r2, r5\n\t"
  179731. #else
  179732. "add r2, r2, r5\n\t"
  179733. #endif
  179734. #ifdef WOLFSSL_KEIL
  179735. "adcs r3, r3, r6\n\t"
  179736. #elif defined(__clang__)
  179737. "adcs r3, r6\n\t"
  179738. #else
  179739. "adc r3, r6\n\t"
  179740. #endif
  179741. #ifdef WOLFSSL_KEIL
  179742. "adcs r4, r4, %[r]\n\t"
  179743. #elif defined(__clang__)
  179744. "adcs r4, %[r]\n\t"
  179745. #else
  179746. "adc r4, %[r]\n\t"
  179747. #endif
  179748. "str r2, [sp, #48]\n\t"
  179749. "# A[7] * A[6]\n\t"
  179750. "movs r2, #0\n\t"
  179751. "ldr %[a], [%[a], #28]\n\t"
  179752. "uxth r5, %[a]\n\t"
  179753. "uxth r6, r7\n\t"
  179754. #ifdef WOLFSSL_KEIL
  179755. "muls r6, r5, r6\n\t"
  179756. #elif defined(__clang__)
  179757. "muls r6, r5\n\t"
  179758. #else
  179759. "mul r6, r5\n\t"
  179760. #endif
  179761. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179762. "adds r3, r3, r6\n\t"
  179763. #else
  179764. "add r3, r3, r6\n\t"
  179765. #endif
  179766. #ifdef WOLFSSL_KEIL
  179767. "adcs r4, r4, %[r]\n\t"
  179768. #elif defined(__clang__)
  179769. "adcs r4, %[r]\n\t"
  179770. #else
  179771. "adc r4, %[r]\n\t"
  179772. #endif
  179773. #ifdef WOLFSSL_KEIL
  179774. "adcs r2, r2, %[r]\n\t"
  179775. #elif defined(__clang__)
  179776. "adcs r2, %[r]\n\t"
  179777. #else
  179778. "adc r2, %[r]\n\t"
  179779. #endif
  179780. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179781. "adds r3, r3, r6\n\t"
  179782. #else
  179783. "add r3, r3, r6\n\t"
  179784. #endif
  179785. #ifdef WOLFSSL_KEIL
  179786. "adcs r4, r4, %[r]\n\t"
  179787. #elif defined(__clang__)
  179788. "adcs r4, %[r]\n\t"
  179789. #else
  179790. "adc r4, %[r]\n\t"
  179791. #endif
  179792. #ifdef WOLFSSL_KEIL
  179793. "adcs r2, r2, %[r]\n\t"
  179794. #elif defined(__clang__)
  179795. "adcs r2, %[r]\n\t"
  179796. #else
  179797. "adc r2, %[r]\n\t"
  179798. #endif
  179799. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179800. "lsrs r6, r7, #16\n\t"
  179801. #else
  179802. "lsr r6, r7, #16\n\t"
  179803. #endif
  179804. #ifdef WOLFSSL_KEIL
  179805. "muls r5, r6, r5\n\t"
  179806. #elif defined(__clang__)
  179807. "muls r5, r6\n\t"
  179808. #else
  179809. "mul r5, r6\n\t"
  179810. #endif
  179811. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179812. "lsrs r6, r5, #16\n\t"
  179813. #else
  179814. "lsr r6, r5, #16\n\t"
  179815. #endif
  179816. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179817. "lsls r5, r5, #16\n\t"
  179818. #else
  179819. "lsl r5, r5, #16\n\t"
  179820. #endif
  179821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179822. "adds r3, r3, r5\n\t"
  179823. #else
  179824. "add r3, r3, r5\n\t"
  179825. #endif
  179826. #ifdef WOLFSSL_KEIL
  179827. "adcs r4, r4, r6\n\t"
  179828. #elif defined(__clang__)
  179829. "adcs r4, r6\n\t"
  179830. #else
  179831. "adc r4, r6\n\t"
  179832. #endif
  179833. #ifdef WOLFSSL_KEIL
  179834. "adcs r2, r2, %[r]\n\t"
  179835. #elif defined(__clang__)
  179836. "adcs r2, %[r]\n\t"
  179837. #else
  179838. "adc r2, %[r]\n\t"
  179839. #endif
  179840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179841. "adds r3, r3, r5\n\t"
  179842. #else
  179843. "add r3, r3, r5\n\t"
  179844. #endif
  179845. #ifdef WOLFSSL_KEIL
  179846. "adcs r4, r4, r6\n\t"
  179847. #elif defined(__clang__)
  179848. "adcs r4, r6\n\t"
  179849. #else
  179850. "adc r4, r6\n\t"
  179851. #endif
  179852. #ifdef WOLFSSL_KEIL
  179853. "adcs r2, r2, %[r]\n\t"
  179854. #elif defined(__clang__)
  179855. "adcs r2, %[r]\n\t"
  179856. #else
  179857. "adc r2, %[r]\n\t"
  179858. #endif
  179859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179860. "lsrs r5, %[a], #16\n\t"
  179861. #else
  179862. "lsr r5, %[a], #16\n\t"
  179863. #endif
  179864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179865. "lsrs r6, r7, #16\n\t"
  179866. #else
  179867. "lsr r6, r7, #16\n\t"
  179868. #endif
  179869. #ifdef WOLFSSL_KEIL
  179870. "muls r6, r5, r6\n\t"
  179871. #elif defined(__clang__)
  179872. "muls r6, r5\n\t"
  179873. #else
  179874. "mul r6, r5\n\t"
  179875. #endif
  179876. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179877. "adds r4, r4, r6\n\t"
  179878. #else
  179879. "add r4, r4, r6\n\t"
  179880. #endif
  179881. #ifdef WOLFSSL_KEIL
  179882. "adcs r2, r2, %[r]\n\t"
  179883. #elif defined(__clang__)
  179884. "adcs r2, %[r]\n\t"
  179885. #else
  179886. "adc r2, %[r]\n\t"
  179887. #endif
  179888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179889. "adds r4, r4, r6\n\t"
  179890. #else
  179891. "add r4, r4, r6\n\t"
  179892. #endif
  179893. #ifdef WOLFSSL_KEIL
  179894. "adcs r2, r2, %[r]\n\t"
  179895. #elif defined(__clang__)
  179896. "adcs r2, %[r]\n\t"
  179897. #else
  179898. "adc r2, %[r]\n\t"
  179899. #endif
  179900. "uxth r6, r7\n\t"
  179901. #ifdef WOLFSSL_KEIL
  179902. "muls r5, r6, r5\n\t"
  179903. #elif defined(__clang__)
  179904. "muls r5, r6\n\t"
  179905. #else
  179906. "mul r5, r6\n\t"
  179907. #endif
  179908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179909. "lsrs r6, r5, #16\n\t"
  179910. #else
  179911. "lsr r6, r5, #16\n\t"
  179912. #endif
  179913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179914. "lsls r5, r5, #16\n\t"
  179915. #else
  179916. "lsl r5, r5, #16\n\t"
  179917. #endif
  179918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179919. "adds r3, r3, r5\n\t"
  179920. #else
  179921. "add r3, r3, r5\n\t"
  179922. #endif
  179923. #ifdef WOLFSSL_KEIL
  179924. "adcs r4, r4, r6\n\t"
  179925. #elif defined(__clang__)
  179926. "adcs r4, r6\n\t"
  179927. #else
  179928. "adc r4, r6\n\t"
  179929. #endif
  179930. #ifdef WOLFSSL_KEIL
  179931. "adcs r2, r2, %[r]\n\t"
  179932. #elif defined(__clang__)
  179933. "adcs r2, %[r]\n\t"
  179934. #else
  179935. "adc r2, %[r]\n\t"
  179936. #endif
  179937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179938. "adds r3, r3, r5\n\t"
  179939. #else
  179940. "add r3, r3, r5\n\t"
  179941. #endif
  179942. #ifdef WOLFSSL_KEIL
  179943. "adcs r4, r4, r6\n\t"
  179944. #elif defined(__clang__)
  179945. "adcs r4, r6\n\t"
  179946. #else
  179947. "adc r4, r6\n\t"
  179948. #endif
  179949. #ifdef WOLFSSL_KEIL
  179950. "adcs r2, r2, %[r]\n\t"
  179951. #elif defined(__clang__)
  179952. "adcs r2, %[r]\n\t"
  179953. #else
  179954. "adc r2, %[r]\n\t"
  179955. #endif
  179956. "# A[8] * A[5]\n\t"
  179957. "mov %[a], r9\n\t"
  179958. "ldr r7, [%[a], #20]\n\t"
  179959. "ldr %[a], [%[a], #32]\n\t"
  179960. "uxth r5, %[a]\n\t"
  179961. "uxth r6, r7\n\t"
  179962. #ifdef WOLFSSL_KEIL
  179963. "muls r6, r5, r6\n\t"
  179964. #elif defined(__clang__)
  179965. "muls r6, r5\n\t"
  179966. #else
  179967. "mul r6, r5\n\t"
  179968. #endif
  179969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179970. "adds r3, r3, r6\n\t"
  179971. #else
  179972. "add r3, r3, r6\n\t"
  179973. #endif
  179974. #ifdef WOLFSSL_KEIL
  179975. "adcs r4, r4, %[r]\n\t"
  179976. #elif defined(__clang__)
  179977. "adcs r4, %[r]\n\t"
  179978. #else
  179979. "adc r4, %[r]\n\t"
  179980. #endif
  179981. #ifdef WOLFSSL_KEIL
  179982. "adcs r2, r2, %[r]\n\t"
  179983. #elif defined(__clang__)
  179984. "adcs r2, %[r]\n\t"
  179985. #else
  179986. "adc r2, %[r]\n\t"
  179987. #endif
  179988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  179989. "adds r3, r3, r6\n\t"
  179990. #else
  179991. "add r3, r3, r6\n\t"
  179992. #endif
  179993. #ifdef WOLFSSL_KEIL
  179994. "adcs r4, r4, %[r]\n\t"
  179995. #elif defined(__clang__)
  179996. "adcs r4, %[r]\n\t"
  179997. #else
  179998. "adc r4, %[r]\n\t"
  179999. #endif
  180000. #ifdef WOLFSSL_KEIL
  180001. "adcs r2, r2, %[r]\n\t"
  180002. #elif defined(__clang__)
  180003. "adcs r2, %[r]\n\t"
  180004. #else
  180005. "adc r2, %[r]\n\t"
  180006. #endif
  180007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180008. "lsrs r6, r7, #16\n\t"
  180009. #else
  180010. "lsr r6, r7, #16\n\t"
  180011. #endif
  180012. #ifdef WOLFSSL_KEIL
  180013. "muls r5, r6, r5\n\t"
  180014. #elif defined(__clang__)
  180015. "muls r5, r6\n\t"
  180016. #else
  180017. "mul r5, r6\n\t"
  180018. #endif
  180019. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180020. "lsrs r6, r5, #16\n\t"
  180021. #else
  180022. "lsr r6, r5, #16\n\t"
  180023. #endif
  180024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180025. "lsls r5, r5, #16\n\t"
  180026. #else
  180027. "lsl r5, r5, #16\n\t"
  180028. #endif
  180029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180030. "adds r3, r3, r5\n\t"
  180031. #else
  180032. "add r3, r3, r5\n\t"
  180033. #endif
  180034. #ifdef WOLFSSL_KEIL
  180035. "adcs r4, r4, r6\n\t"
  180036. #elif defined(__clang__)
  180037. "adcs r4, r6\n\t"
  180038. #else
  180039. "adc r4, r6\n\t"
  180040. #endif
  180041. #ifdef WOLFSSL_KEIL
  180042. "adcs r2, r2, %[r]\n\t"
  180043. #elif defined(__clang__)
  180044. "adcs r2, %[r]\n\t"
  180045. #else
  180046. "adc r2, %[r]\n\t"
  180047. #endif
  180048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180049. "adds r3, r3, r5\n\t"
  180050. #else
  180051. "add r3, r3, r5\n\t"
  180052. #endif
  180053. #ifdef WOLFSSL_KEIL
  180054. "adcs r4, r4, r6\n\t"
  180055. #elif defined(__clang__)
  180056. "adcs r4, r6\n\t"
  180057. #else
  180058. "adc r4, r6\n\t"
  180059. #endif
  180060. #ifdef WOLFSSL_KEIL
  180061. "adcs r2, r2, %[r]\n\t"
  180062. #elif defined(__clang__)
  180063. "adcs r2, %[r]\n\t"
  180064. #else
  180065. "adc r2, %[r]\n\t"
  180066. #endif
  180067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180068. "lsrs r5, %[a], #16\n\t"
  180069. #else
  180070. "lsr r5, %[a], #16\n\t"
  180071. #endif
  180072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180073. "lsrs r6, r7, #16\n\t"
  180074. #else
  180075. "lsr r6, r7, #16\n\t"
  180076. #endif
  180077. #ifdef WOLFSSL_KEIL
  180078. "muls r6, r5, r6\n\t"
  180079. #elif defined(__clang__)
  180080. "muls r6, r5\n\t"
  180081. #else
  180082. "mul r6, r5\n\t"
  180083. #endif
  180084. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180085. "adds r4, r4, r6\n\t"
  180086. #else
  180087. "add r4, r4, r6\n\t"
  180088. #endif
  180089. #ifdef WOLFSSL_KEIL
  180090. "adcs r2, r2, %[r]\n\t"
  180091. #elif defined(__clang__)
  180092. "adcs r2, %[r]\n\t"
  180093. #else
  180094. "adc r2, %[r]\n\t"
  180095. #endif
  180096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180097. "adds r4, r4, r6\n\t"
  180098. #else
  180099. "add r4, r4, r6\n\t"
  180100. #endif
  180101. #ifdef WOLFSSL_KEIL
  180102. "adcs r2, r2, %[r]\n\t"
  180103. #elif defined(__clang__)
  180104. "adcs r2, %[r]\n\t"
  180105. #else
  180106. "adc r2, %[r]\n\t"
  180107. #endif
  180108. "uxth r6, r7\n\t"
  180109. #ifdef WOLFSSL_KEIL
  180110. "muls r5, r6, r5\n\t"
  180111. #elif defined(__clang__)
  180112. "muls r5, r6\n\t"
  180113. #else
  180114. "mul r5, r6\n\t"
  180115. #endif
  180116. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180117. "lsrs r6, r5, #16\n\t"
  180118. #else
  180119. "lsr r6, r5, #16\n\t"
  180120. #endif
  180121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180122. "lsls r5, r5, #16\n\t"
  180123. #else
  180124. "lsl r5, r5, #16\n\t"
  180125. #endif
  180126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180127. "adds r3, r3, r5\n\t"
  180128. #else
  180129. "add r3, r3, r5\n\t"
  180130. #endif
  180131. #ifdef WOLFSSL_KEIL
  180132. "adcs r4, r4, r6\n\t"
  180133. #elif defined(__clang__)
  180134. "adcs r4, r6\n\t"
  180135. #else
  180136. "adc r4, r6\n\t"
  180137. #endif
  180138. #ifdef WOLFSSL_KEIL
  180139. "adcs r2, r2, %[r]\n\t"
  180140. #elif defined(__clang__)
  180141. "adcs r2, %[r]\n\t"
  180142. #else
  180143. "adc r2, %[r]\n\t"
  180144. #endif
  180145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180146. "adds r3, r3, r5\n\t"
  180147. #else
  180148. "add r3, r3, r5\n\t"
  180149. #endif
  180150. #ifdef WOLFSSL_KEIL
  180151. "adcs r4, r4, r6\n\t"
  180152. #elif defined(__clang__)
  180153. "adcs r4, r6\n\t"
  180154. #else
  180155. "adc r4, r6\n\t"
  180156. #endif
  180157. #ifdef WOLFSSL_KEIL
  180158. "adcs r2, r2, %[r]\n\t"
  180159. #elif defined(__clang__)
  180160. "adcs r2, %[r]\n\t"
  180161. #else
  180162. "adc r2, %[r]\n\t"
  180163. #endif
  180164. "# A[9] * A[4]\n\t"
  180165. "mov %[a], r9\n\t"
  180166. "ldr r7, [%[a], #16]\n\t"
  180167. "ldr %[a], [%[a], #36]\n\t"
  180168. "uxth r5, %[a]\n\t"
  180169. "uxth r6, r7\n\t"
  180170. #ifdef WOLFSSL_KEIL
  180171. "muls r6, r5, r6\n\t"
  180172. #elif defined(__clang__)
  180173. "muls r6, r5\n\t"
  180174. #else
  180175. "mul r6, r5\n\t"
  180176. #endif
  180177. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180178. "adds r3, r3, r6\n\t"
  180179. #else
  180180. "add r3, r3, r6\n\t"
  180181. #endif
  180182. #ifdef WOLFSSL_KEIL
  180183. "adcs r4, r4, %[r]\n\t"
  180184. #elif defined(__clang__)
  180185. "adcs r4, %[r]\n\t"
  180186. #else
  180187. "adc r4, %[r]\n\t"
  180188. #endif
  180189. #ifdef WOLFSSL_KEIL
  180190. "adcs r2, r2, %[r]\n\t"
  180191. #elif defined(__clang__)
  180192. "adcs r2, %[r]\n\t"
  180193. #else
  180194. "adc r2, %[r]\n\t"
  180195. #endif
  180196. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180197. "adds r3, r3, r6\n\t"
  180198. #else
  180199. "add r3, r3, r6\n\t"
  180200. #endif
  180201. #ifdef WOLFSSL_KEIL
  180202. "adcs r4, r4, %[r]\n\t"
  180203. #elif defined(__clang__)
  180204. "adcs r4, %[r]\n\t"
  180205. #else
  180206. "adc r4, %[r]\n\t"
  180207. #endif
  180208. #ifdef WOLFSSL_KEIL
  180209. "adcs r2, r2, %[r]\n\t"
  180210. #elif defined(__clang__)
  180211. "adcs r2, %[r]\n\t"
  180212. #else
  180213. "adc r2, %[r]\n\t"
  180214. #endif
  180215. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180216. "lsrs r6, r7, #16\n\t"
  180217. #else
  180218. "lsr r6, r7, #16\n\t"
  180219. #endif
  180220. #ifdef WOLFSSL_KEIL
  180221. "muls r5, r6, r5\n\t"
  180222. #elif defined(__clang__)
  180223. "muls r5, r6\n\t"
  180224. #else
  180225. "mul r5, r6\n\t"
  180226. #endif
  180227. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180228. "lsrs r6, r5, #16\n\t"
  180229. #else
  180230. "lsr r6, r5, #16\n\t"
  180231. #endif
  180232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180233. "lsls r5, r5, #16\n\t"
  180234. #else
  180235. "lsl r5, r5, #16\n\t"
  180236. #endif
  180237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180238. "adds r3, r3, r5\n\t"
  180239. #else
  180240. "add r3, r3, r5\n\t"
  180241. #endif
  180242. #ifdef WOLFSSL_KEIL
  180243. "adcs r4, r4, r6\n\t"
  180244. #elif defined(__clang__)
  180245. "adcs r4, r6\n\t"
  180246. #else
  180247. "adc r4, r6\n\t"
  180248. #endif
  180249. #ifdef WOLFSSL_KEIL
  180250. "adcs r2, r2, %[r]\n\t"
  180251. #elif defined(__clang__)
  180252. "adcs r2, %[r]\n\t"
  180253. #else
  180254. "adc r2, %[r]\n\t"
  180255. #endif
  180256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180257. "adds r3, r3, r5\n\t"
  180258. #else
  180259. "add r3, r3, r5\n\t"
  180260. #endif
  180261. #ifdef WOLFSSL_KEIL
  180262. "adcs r4, r4, r6\n\t"
  180263. #elif defined(__clang__)
  180264. "adcs r4, r6\n\t"
  180265. #else
  180266. "adc r4, r6\n\t"
  180267. #endif
  180268. #ifdef WOLFSSL_KEIL
  180269. "adcs r2, r2, %[r]\n\t"
  180270. #elif defined(__clang__)
  180271. "adcs r2, %[r]\n\t"
  180272. #else
  180273. "adc r2, %[r]\n\t"
  180274. #endif
  180275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180276. "lsrs r5, %[a], #16\n\t"
  180277. #else
  180278. "lsr r5, %[a], #16\n\t"
  180279. #endif
  180280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180281. "lsrs r6, r7, #16\n\t"
  180282. #else
  180283. "lsr r6, r7, #16\n\t"
  180284. #endif
  180285. #ifdef WOLFSSL_KEIL
  180286. "muls r6, r5, r6\n\t"
  180287. #elif defined(__clang__)
  180288. "muls r6, r5\n\t"
  180289. #else
  180290. "mul r6, r5\n\t"
  180291. #endif
  180292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180293. "adds r4, r4, r6\n\t"
  180294. #else
  180295. "add r4, 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 r4, r4, r6\n\t"
  180306. #else
  180307. "add r4, r4, r6\n\t"
  180308. #endif
  180309. #ifdef WOLFSSL_KEIL
  180310. "adcs r2, r2, %[r]\n\t"
  180311. #elif defined(__clang__)
  180312. "adcs r2, %[r]\n\t"
  180313. #else
  180314. "adc r2, %[r]\n\t"
  180315. #endif
  180316. "uxth r6, r7\n\t"
  180317. #ifdef WOLFSSL_KEIL
  180318. "muls r5, r6, r5\n\t"
  180319. #elif defined(__clang__)
  180320. "muls r5, r6\n\t"
  180321. #else
  180322. "mul r5, r6\n\t"
  180323. #endif
  180324. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180325. "lsrs r6, r5, #16\n\t"
  180326. #else
  180327. "lsr r6, r5, #16\n\t"
  180328. #endif
  180329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180330. "lsls r5, r5, #16\n\t"
  180331. #else
  180332. "lsl r5, r5, #16\n\t"
  180333. #endif
  180334. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180335. "adds r3, r3, r5\n\t"
  180336. #else
  180337. "add r3, r3, r5\n\t"
  180338. #endif
  180339. #ifdef WOLFSSL_KEIL
  180340. "adcs r4, r4, r6\n\t"
  180341. #elif defined(__clang__)
  180342. "adcs r4, r6\n\t"
  180343. #else
  180344. "adc r4, r6\n\t"
  180345. #endif
  180346. #ifdef WOLFSSL_KEIL
  180347. "adcs r2, r2, %[r]\n\t"
  180348. #elif defined(__clang__)
  180349. "adcs r2, %[r]\n\t"
  180350. #else
  180351. "adc r2, %[r]\n\t"
  180352. #endif
  180353. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180354. "adds r3, r3, r5\n\t"
  180355. #else
  180356. "add r3, r3, r5\n\t"
  180357. #endif
  180358. #ifdef WOLFSSL_KEIL
  180359. "adcs r4, r4, r6\n\t"
  180360. #elif defined(__clang__)
  180361. "adcs r4, r6\n\t"
  180362. #else
  180363. "adc r4, r6\n\t"
  180364. #endif
  180365. #ifdef WOLFSSL_KEIL
  180366. "adcs r2, r2, %[r]\n\t"
  180367. #elif defined(__clang__)
  180368. "adcs r2, %[r]\n\t"
  180369. #else
  180370. "adc r2, %[r]\n\t"
  180371. #endif
  180372. "# A[10] * A[3]\n\t"
  180373. "mov %[a], r9\n\t"
  180374. "mov r7, lr\n\t"
  180375. "ldr %[a], [%[a], #40]\n\t"
  180376. "uxth r5, %[a]\n\t"
  180377. "uxth r6, r7\n\t"
  180378. #ifdef WOLFSSL_KEIL
  180379. "muls r6, r5, r6\n\t"
  180380. #elif defined(__clang__)
  180381. "muls r6, r5\n\t"
  180382. #else
  180383. "mul r6, r5\n\t"
  180384. #endif
  180385. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180386. "adds r3, r3, r6\n\t"
  180387. #else
  180388. "add r3, r3, r6\n\t"
  180389. #endif
  180390. #ifdef WOLFSSL_KEIL
  180391. "adcs r4, r4, %[r]\n\t"
  180392. #elif defined(__clang__)
  180393. "adcs r4, %[r]\n\t"
  180394. #else
  180395. "adc r4, %[r]\n\t"
  180396. #endif
  180397. #ifdef WOLFSSL_KEIL
  180398. "adcs r2, r2, %[r]\n\t"
  180399. #elif defined(__clang__)
  180400. "adcs r2, %[r]\n\t"
  180401. #else
  180402. "adc r2, %[r]\n\t"
  180403. #endif
  180404. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180405. "adds r3, r3, r6\n\t"
  180406. #else
  180407. "add r3, r3, r6\n\t"
  180408. #endif
  180409. #ifdef WOLFSSL_KEIL
  180410. "adcs r4, r4, %[r]\n\t"
  180411. #elif defined(__clang__)
  180412. "adcs r4, %[r]\n\t"
  180413. #else
  180414. "adc r4, %[r]\n\t"
  180415. #endif
  180416. #ifdef WOLFSSL_KEIL
  180417. "adcs r2, r2, %[r]\n\t"
  180418. #elif defined(__clang__)
  180419. "adcs r2, %[r]\n\t"
  180420. #else
  180421. "adc r2, %[r]\n\t"
  180422. #endif
  180423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180424. "lsrs r6, r7, #16\n\t"
  180425. #else
  180426. "lsr r6, r7, #16\n\t"
  180427. #endif
  180428. #ifdef WOLFSSL_KEIL
  180429. "muls r5, r6, r5\n\t"
  180430. #elif defined(__clang__)
  180431. "muls r5, r6\n\t"
  180432. #else
  180433. "mul r5, r6\n\t"
  180434. #endif
  180435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180436. "lsrs r6, r5, #16\n\t"
  180437. #else
  180438. "lsr r6, r5, #16\n\t"
  180439. #endif
  180440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180441. "lsls r5, r5, #16\n\t"
  180442. #else
  180443. "lsl r5, r5, #16\n\t"
  180444. #endif
  180445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180446. "adds r3, r3, r5\n\t"
  180447. #else
  180448. "add r3, r3, r5\n\t"
  180449. #endif
  180450. #ifdef WOLFSSL_KEIL
  180451. "adcs r4, r4, r6\n\t"
  180452. #elif defined(__clang__)
  180453. "adcs r4, r6\n\t"
  180454. #else
  180455. "adc r4, r6\n\t"
  180456. #endif
  180457. #ifdef WOLFSSL_KEIL
  180458. "adcs r2, r2, %[r]\n\t"
  180459. #elif defined(__clang__)
  180460. "adcs r2, %[r]\n\t"
  180461. #else
  180462. "adc r2, %[r]\n\t"
  180463. #endif
  180464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180465. "adds r3, r3, r5\n\t"
  180466. #else
  180467. "add r3, r3, r5\n\t"
  180468. #endif
  180469. #ifdef WOLFSSL_KEIL
  180470. "adcs r4, r4, r6\n\t"
  180471. #elif defined(__clang__)
  180472. "adcs r4, r6\n\t"
  180473. #else
  180474. "adc r4, r6\n\t"
  180475. #endif
  180476. #ifdef WOLFSSL_KEIL
  180477. "adcs r2, r2, %[r]\n\t"
  180478. #elif defined(__clang__)
  180479. "adcs r2, %[r]\n\t"
  180480. #else
  180481. "adc r2, %[r]\n\t"
  180482. #endif
  180483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180484. "lsrs r5, %[a], #16\n\t"
  180485. #else
  180486. "lsr r5, %[a], #16\n\t"
  180487. #endif
  180488. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180489. "lsrs r6, r7, #16\n\t"
  180490. #else
  180491. "lsr r6, r7, #16\n\t"
  180492. #endif
  180493. #ifdef WOLFSSL_KEIL
  180494. "muls r6, r5, r6\n\t"
  180495. #elif defined(__clang__)
  180496. "muls r6, r5\n\t"
  180497. #else
  180498. "mul r6, r5\n\t"
  180499. #endif
  180500. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180501. "adds r4, r4, r6\n\t"
  180502. #else
  180503. "add r4, 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 r4, r4, r6\n\t"
  180514. #else
  180515. "add r4, r4, r6\n\t"
  180516. #endif
  180517. #ifdef WOLFSSL_KEIL
  180518. "adcs r2, r2, %[r]\n\t"
  180519. #elif defined(__clang__)
  180520. "adcs r2, %[r]\n\t"
  180521. #else
  180522. "adc r2, %[r]\n\t"
  180523. #endif
  180524. "uxth r6, r7\n\t"
  180525. #ifdef WOLFSSL_KEIL
  180526. "muls r5, r6, r5\n\t"
  180527. #elif defined(__clang__)
  180528. "muls r5, r6\n\t"
  180529. #else
  180530. "mul r5, r6\n\t"
  180531. #endif
  180532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180533. "lsrs r6, r5, #16\n\t"
  180534. #else
  180535. "lsr r6, r5, #16\n\t"
  180536. #endif
  180537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180538. "lsls r5, r5, #16\n\t"
  180539. #else
  180540. "lsl r5, r5, #16\n\t"
  180541. #endif
  180542. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180543. "adds r3, r3, r5\n\t"
  180544. #else
  180545. "add r3, r3, r5\n\t"
  180546. #endif
  180547. #ifdef WOLFSSL_KEIL
  180548. "adcs r4, r4, r6\n\t"
  180549. #elif defined(__clang__)
  180550. "adcs r4, r6\n\t"
  180551. #else
  180552. "adc r4, r6\n\t"
  180553. #endif
  180554. #ifdef WOLFSSL_KEIL
  180555. "adcs r2, r2, %[r]\n\t"
  180556. #elif defined(__clang__)
  180557. "adcs r2, %[r]\n\t"
  180558. #else
  180559. "adc r2, %[r]\n\t"
  180560. #endif
  180561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180562. "adds r3, r3, r5\n\t"
  180563. #else
  180564. "add r3, r3, r5\n\t"
  180565. #endif
  180566. #ifdef WOLFSSL_KEIL
  180567. "adcs r4, r4, r6\n\t"
  180568. #elif defined(__clang__)
  180569. "adcs r4, r6\n\t"
  180570. #else
  180571. "adc r4, r6\n\t"
  180572. #endif
  180573. #ifdef WOLFSSL_KEIL
  180574. "adcs r2, r2, %[r]\n\t"
  180575. #elif defined(__clang__)
  180576. "adcs r2, %[r]\n\t"
  180577. #else
  180578. "adc r2, %[r]\n\t"
  180579. #endif
  180580. "# A[11] * A[2]\n\t"
  180581. "mov %[a], r9\n\t"
  180582. "mov r7, r12\n\t"
  180583. "ldr %[a], [%[a], #44]\n\t"
  180584. "uxth r5, %[a]\n\t"
  180585. "uxth r6, r7\n\t"
  180586. #ifdef WOLFSSL_KEIL
  180587. "muls r6, r5, r6\n\t"
  180588. #elif defined(__clang__)
  180589. "muls r6, r5\n\t"
  180590. #else
  180591. "mul r6, r5\n\t"
  180592. #endif
  180593. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180594. "adds r3, r3, r6\n\t"
  180595. #else
  180596. "add r3, r3, r6\n\t"
  180597. #endif
  180598. #ifdef WOLFSSL_KEIL
  180599. "adcs r4, r4, %[r]\n\t"
  180600. #elif defined(__clang__)
  180601. "adcs r4, %[r]\n\t"
  180602. #else
  180603. "adc r4, %[r]\n\t"
  180604. #endif
  180605. #ifdef WOLFSSL_KEIL
  180606. "adcs r2, r2, %[r]\n\t"
  180607. #elif defined(__clang__)
  180608. "adcs r2, %[r]\n\t"
  180609. #else
  180610. "adc r2, %[r]\n\t"
  180611. #endif
  180612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180613. "adds r3, r3, r6\n\t"
  180614. #else
  180615. "add r3, r3, r6\n\t"
  180616. #endif
  180617. #ifdef WOLFSSL_KEIL
  180618. "adcs r4, r4, %[r]\n\t"
  180619. #elif defined(__clang__)
  180620. "adcs r4, %[r]\n\t"
  180621. #else
  180622. "adc r4, %[r]\n\t"
  180623. #endif
  180624. #ifdef WOLFSSL_KEIL
  180625. "adcs r2, r2, %[r]\n\t"
  180626. #elif defined(__clang__)
  180627. "adcs r2, %[r]\n\t"
  180628. #else
  180629. "adc r2, %[r]\n\t"
  180630. #endif
  180631. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180632. "lsrs r6, r7, #16\n\t"
  180633. #else
  180634. "lsr r6, r7, #16\n\t"
  180635. #endif
  180636. #ifdef WOLFSSL_KEIL
  180637. "muls r5, r6, r5\n\t"
  180638. #elif defined(__clang__)
  180639. "muls r5, r6\n\t"
  180640. #else
  180641. "mul r5, r6\n\t"
  180642. #endif
  180643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180644. "lsrs r6, r5, #16\n\t"
  180645. #else
  180646. "lsr r6, r5, #16\n\t"
  180647. #endif
  180648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180649. "lsls r5, r5, #16\n\t"
  180650. #else
  180651. "lsl r5, r5, #16\n\t"
  180652. #endif
  180653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180654. "adds r3, r3, r5\n\t"
  180655. #else
  180656. "add r3, r3, r5\n\t"
  180657. #endif
  180658. #ifdef WOLFSSL_KEIL
  180659. "adcs r4, r4, r6\n\t"
  180660. #elif defined(__clang__)
  180661. "adcs r4, r6\n\t"
  180662. #else
  180663. "adc r4, r6\n\t"
  180664. #endif
  180665. #ifdef WOLFSSL_KEIL
  180666. "adcs r2, r2, %[r]\n\t"
  180667. #elif defined(__clang__)
  180668. "adcs r2, %[r]\n\t"
  180669. #else
  180670. "adc r2, %[r]\n\t"
  180671. #endif
  180672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180673. "adds r3, r3, r5\n\t"
  180674. #else
  180675. "add r3, r3, r5\n\t"
  180676. #endif
  180677. #ifdef WOLFSSL_KEIL
  180678. "adcs r4, r4, r6\n\t"
  180679. #elif defined(__clang__)
  180680. "adcs r4, r6\n\t"
  180681. #else
  180682. "adc r4, r6\n\t"
  180683. #endif
  180684. #ifdef WOLFSSL_KEIL
  180685. "adcs r2, r2, %[r]\n\t"
  180686. #elif defined(__clang__)
  180687. "adcs r2, %[r]\n\t"
  180688. #else
  180689. "adc r2, %[r]\n\t"
  180690. #endif
  180691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180692. "lsrs r5, %[a], #16\n\t"
  180693. #else
  180694. "lsr r5, %[a], #16\n\t"
  180695. #endif
  180696. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180697. "lsrs r6, r7, #16\n\t"
  180698. #else
  180699. "lsr r6, r7, #16\n\t"
  180700. #endif
  180701. #ifdef WOLFSSL_KEIL
  180702. "muls r6, r5, r6\n\t"
  180703. #elif defined(__clang__)
  180704. "muls r6, r5\n\t"
  180705. #else
  180706. "mul r6, r5\n\t"
  180707. #endif
  180708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180709. "adds r4, r4, r6\n\t"
  180710. #else
  180711. "add r4, 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 r4, r4, r6\n\t"
  180722. #else
  180723. "add r4, r4, r6\n\t"
  180724. #endif
  180725. #ifdef WOLFSSL_KEIL
  180726. "adcs r2, r2, %[r]\n\t"
  180727. #elif defined(__clang__)
  180728. "adcs r2, %[r]\n\t"
  180729. #else
  180730. "adc r2, %[r]\n\t"
  180731. #endif
  180732. "uxth r6, r7\n\t"
  180733. #ifdef WOLFSSL_KEIL
  180734. "muls r5, r6, r5\n\t"
  180735. #elif defined(__clang__)
  180736. "muls r5, r6\n\t"
  180737. #else
  180738. "mul r5, r6\n\t"
  180739. #endif
  180740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180741. "lsrs r6, r5, #16\n\t"
  180742. #else
  180743. "lsr r6, r5, #16\n\t"
  180744. #endif
  180745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180746. "lsls r5, r5, #16\n\t"
  180747. #else
  180748. "lsl r5, r5, #16\n\t"
  180749. #endif
  180750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180751. "adds r3, r3, r5\n\t"
  180752. #else
  180753. "add r3, r3, r5\n\t"
  180754. #endif
  180755. #ifdef WOLFSSL_KEIL
  180756. "adcs r4, r4, r6\n\t"
  180757. #elif defined(__clang__)
  180758. "adcs r4, r6\n\t"
  180759. #else
  180760. "adc r4, r6\n\t"
  180761. #endif
  180762. #ifdef WOLFSSL_KEIL
  180763. "adcs r2, r2, %[r]\n\t"
  180764. #elif defined(__clang__)
  180765. "adcs r2, %[r]\n\t"
  180766. #else
  180767. "adc r2, %[r]\n\t"
  180768. #endif
  180769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180770. "adds r3, r3, r5\n\t"
  180771. #else
  180772. "add r3, r3, r5\n\t"
  180773. #endif
  180774. #ifdef WOLFSSL_KEIL
  180775. "adcs r4, r4, r6\n\t"
  180776. #elif defined(__clang__)
  180777. "adcs r4, r6\n\t"
  180778. #else
  180779. "adc r4, r6\n\t"
  180780. #endif
  180781. #ifdef WOLFSSL_KEIL
  180782. "adcs r2, r2, %[r]\n\t"
  180783. #elif defined(__clang__)
  180784. "adcs r2, %[r]\n\t"
  180785. #else
  180786. "adc r2, %[r]\n\t"
  180787. #endif
  180788. "# A[12] * A[1]\n\t"
  180789. "mov %[a], r9\n\t"
  180790. "mov r7, r11\n\t"
  180791. "ldr %[a], [%[a], #48]\n\t"
  180792. "uxth r5, %[a]\n\t"
  180793. "uxth r6, r7\n\t"
  180794. #ifdef WOLFSSL_KEIL
  180795. "muls r6, r5, r6\n\t"
  180796. #elif defined(__clang__)
  180797. "muls r6, r5\n\t"
  180798. #else
  180799. "mul r6, r5\n\t"
  180800. #endif
  180801. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180802. "adds r3, r3, r6\n\t"
  180803. #else
  180804. "add r3, r3, r6\n\t"
  180805. #endif
  180806. #ifdef WOLFSSL_KEIL
  180807. "adcs r4, r4, %[r]\n\t"
  180808. #elif defined(__clang__)
  180809. "adcs r4, %[r]\n\t"
  180810. #else
  180811. "adc r4, %[r]\n\t"
  180812. #endif
  180813. #ifdef WOLFSSL_KEIL
  180814. "adcs r2, r2, %[r]\n\t"
  180815. #elif defined(__clang__)
  180816. "adcs r2, %[r]\n\t"
  180817. #else
  180818. "adc r2, %[r]\n\t"
  180819. #endif
  180820. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180821. "adds r3, r3, r6\n\t"
  180822. #else
  180823. "add r3, r3, r6\n\t"
  180824. #endif
  180825. #ifdef WOLFSSL_KEIL
  180826. "adcs r4, r4, %[r]\n\t"
  180827. #elif defined(__clang__)
  180828. "adcs r4, %[r]\n\t"
  180829. #else
  180830. "adc r4, %[r]\n\t"
  180831. #endif
  180832. #ifdef WOLFSSL_KEIL
  180833. "adcs r2, r2, %[r]\n\t"
  180834. #elif defined(__clang__)
  180835. "adcs r2, %[r]\n\t"
  180836. #else
  180837. "adc r2, %[r]\n\t"
  180838. #endif
  180839. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180840. "lsrs r6, r7, #16\n\t"
  180841. #else
  180842. "lsr r6, r7, #16\n\t"
  180843. #endif
  180844. #ifdef WOLFSSL_KEIL
  180845. "muls r5, r6, r5\n\t"
  180846. #elif defined(__clang__)
  180847. "muls r5, r6\n\t"
  180848. #else
  180849. "mul r5, r6\n\t"
  180850. #endif
  180851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180852. "lsrs r6, r5, #16\n\t"
  180853. #else
  180854. "lsr r6, r5, #16\n\t"
  180855. #endif
  180856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180857. "lsls r5, r5, #16\n\t"
  180858. #else
  180859. "lsl r5, r5, #16\n\t"
  180860. #endif
  180861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180862. "adds r3, r3, r5\n\t"
  180863. #else
  180864. "add r3, r3, r5\n\t"
  180865. #endif
  180866. #ifdef WOLFSSL_KEIL
  180867. "adcs r4, r4, r6\n\t"
  180868. #elif defined(__clang__)
  180869. "adcs r4, r6\n\t"
  180870. #else
  180871. "adc r4, r6\n\t"
  180872. #endif
  180873. #ifdef WOLFSSL_KEIL
  180874. "adcs r2, r2, %[r]\n\t"
  180875. #elif defined(__clang__)
  180876. "adcs r2, %[r]\n\t"
  180877. #else
  180878. "adc r2, %[r]\n\t"
  180879. #endif
  180880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180881. "adds r3, r3, r5\n\t"
  180882. #else
  180883. "add r3, r3, r5\n\t"
  180884. #endif
  180885. #ifdef WOLFSSL_KEIL
  180886. "adcs r4, r4, r6\n\t"
  180887. #elif defined(__clang__)
  180888. "adcs r4, r6\n\t"
  180889. #else
  180890. "adc r4, r6\n\t"
  180891. #endif
  180892. #ifdef WOLFSSL_KEIL
  180893. "adcs r2, r2, %[r]\n\t"
  180894. #elif defined(__clang__)
  180895. "adcs r2, %[r]\n\t"
  180896. #else
  180897. "adc r2, %[r]\n\t"
  180898. #endif
  180899. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180900. "lsrs r5, %[a], #16\n\t"
  180901. #else
  180902. "lsr r5, %[a], #16\n\t"
  180903. #endif
  180904. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180905. "lsrs r6, r7, #16\n\t"
  180906. #else
  180907. "lsr r6, r7, #16\n\t"
  180908. #endif
  180909. #ifdef WOLFSSL_KEIL
  180910. "muls r6, r5, r6\n\t"
  180911. #elif defined(__clang__)
  180912. "muls r6, r5\n\t"
  180913. #else
  180914. "mul r6, r5\n\t"
  180915. #endif
  180916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180917. "adds r4, r4, r6\n\t"
  180918. #else
  180919. "add r4, 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 r4, r4, r6\n\t"
  180930. #else
  180931. "add r4, r4, r6\n\t"
  180932. #endif
  180933. #ifdef WOLFSSL_KEIL
  180934. "adcs r2, r2, %[r]\n\t"
  180935. #elif defined(__clang__)
  180936. "adcs r2, %[r]\n\t"
  180937. #else
  180938. "adc r2, %[r]\n\t"
  180939. #endif
  180940. "uxth r6, r7\n\t"
  180941. #ifdef WOLFSSL_KEIL
  180942. "muls r5, r6, r5\n\t"
  180943. #elif defined(__clang__)
  180944. "muls r5, r6\n\t"
  180945. #else
  180946. "mul r5, r6\n\t"
  180947. #endif
  180948. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180949. "lsrs r6, r5, #16\n\t"
  180950. #else
  180951. "lsr r6, r5, #16\n\t"
  180952. #endif
  180953. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180954. "lsls r5, r5, #16\n\t"
  180955. #else
  180956. "lsl r5, r5, #16\n\t"
  180957. #endif
  180958. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180959. "adds r3, r3, r5\n\t"
  180960. #else
  180961. "add r3, r3, r5\n\t"
  180962. #endif
  180963. #ifdef WOLFSSL_KEIL
  180964. "adcs r4, r4, r6\n\t"
  180965. #elif defined(__clang__)
  180966. "adcs r4, r6\n\t"
  180967. #else
  180968. "adc r4, r6\n\t"
  180969. #endif
  180970. #ifdef WOLFSSL_KEIL
  180971. "adcs r2, r2, %[r]\n\t"
  180972. #elif defined(__clang__)
  180973. "adcs r2, %[r]\n\t"
  180974. #else
  180975. "adc r2, %[r]\n\t"
  180976. #endif
  180977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  180978. "adds r3, r3, r5\n\t"
  180979. #else
  180980. "add r3, r3, r5\n\t"
  180981. #endif
  180982. #ifdef WOLFSSL_KEIL
  180983. "adcs r4, r4, r6\n\t"
  180984. #elif defined(__clang__)
  180985. "adcs r4, r6\n\t"
  180986. #else
  180987. "adc r4, r6\n\t"
  180988. #endif
  180989. #ifdef WOLFSSL_KEIL
  180990. "adcs r2, r2, %[r]\n\t"
  180991. #elif defined(__clang__)
  180992. "adcs r2, %[r]\n\t"
  180993. #else
  180994. "adc r2, %[r]\n\t"
  180995. #endif
  180996. "# A[13] * A[0]\n\t"
  180997. "mov %[a], r9\n\t"
  180998. "mov r7, r10\n\t"
  180999. "ldr %[a], [%[a], #52]\n\t"
  181000. "uxth r5, %[a]\n\t"
  181001. "uxth r6, r7\n\t"
  181002. #ifdef WOLFSSL_KEIL
  181003. "muls r6, r5, r6\n\t"
  181004. #elif defined(__clang__)
  181005. "muls r6, r5\n\t"
  181006. #else
  181007. "mul r6, r5\n\t"
  181008. #endif
  181009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181010. "adds r3, r3, r6\n\t"
  181011. #else
  181012. "add r3, r3, r6\n\t"
  181013. #endif
  181014. #ifdef WOLFSSL_KEIL
  181015. "adcs r4, r4, %[r]\n\t"
  181016. #elif defined(__clang__)
  181017. "adcs r4, %[r]\n\t"
  181018. #else
  181019. "adc r4, %[r]\n\t"
  181020. #endif
  181021. #ifdef WOLFSSL_KEIL
  181022. "adcs r2, r2, %[r]\n\t"
  181023. #elif defined(__clang__)
  181024. "adcs r2, %[r]\n\t"
  181025. #else
  181026. "adc r2, %[r]\n\t"
  181027. #endif
  181028. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181029. "adds r3, r3, r6\n\t"
  181030. #else
  181031. "add r3, r3, r6\n\t"
  181032. #endif
  181033. #ifdef WOLFSSL_KEIL
  181034. "adcs r4, r4, %[r]\n\t"
  181035. #elif defined(__clang__)
  181036. "adcs r4, %[r]\n\t"
  181037. #else
  181038. "adc r4, %[r]\n\t"
  181039. #endif
  181040. #ifdef WOLFSSL_KEIL
  181041. "adcs r2, r2, %[r]\n\t"
  181042. #elif defined(__clang__)
  181043. "adcs r2, %[r]\n\t"
  181044. #else
  181045. "adc r2, %[r]\n\t"
  181046. #endif
  181047. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181048. "lsrs r6, r7, #16\n\t"
  181049. #else
  181050. "lsr r6, r7, #16\n\t"
  181051. #endif
  181052. #ifdef WOLFSSL_KEIL
  181053. "muls r5, r6, r5\n\t"
  181054. #elif defined(__clang__)
  181055. "muls r5, r6\n\t"
  181056. #else
  181057. "mul r5, r6\n\t"
  181058. #endif
  181059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181060. "lsrs r6, r5, #16\n\t"
  181061. #else
  181062. "lsr r6, r5, #16\n\t"
  181063. #endif
  181064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181065. "lsls r5, r5, #16\n\t"
  181066. #else
  181067. "lsl r5, r5, #16\n\t"
  181068. #endif
  181069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181070. "adds r3, r3, r5\n\t"
  181071. #else
  181072. "add r3, r3, r5\n\t"
  181073. #endif
  181074. #ifdef WOLFSSL_KEIL
  181075. "adcs r4, r4, r6\n\t"
  181076. #elif defined(__clang__)
  181077. "adcs r4, r6\n\t"
  181078. #else
  181079. "adc r4, r6\n\t"
  181080. #endif
  181081. #ifdef WOLFSSL_KEIL
  181082. "adcs r2, r2, %[r]\n\t"
  181083. #elif defined(__clang__)
  181084. "adcs r2, %[r]\n\t"
  181085. #else
  181086. "adc r2, %[r]\n\t"
  181087. #endif
  181088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181089. "adds r3, r3, r5\n\t"
  181090. #else
  181091. "add r3, r3, r5\n\t"
  181092. #endif
  181093. #ifdef WOLFSSL_KEIL
  181094. "adcs r4, r4, r6\n\t"
  181095. #elif defined(__clang__)
  181096. "adcs r4, r6\n\t"
  181097. #else
  181098. "adc r4, r6\n\t"
  181099. #endif
  181100. #ifdef WOLFSSL_KEIL
  181101. "adcs r2, r2, %[r]\n\t"
  181102. #elif defined(__clang__)
  181103. "adcs r2, %[r]\n\t"
  181104. #else
  181105. "adc r2, %[r]\n\t"
  181106. #endif
  181107. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181108. "lsrs r5, %[a], #16\n\t"
  181109. #else
  181110. "lsr r5, %[a], #16\n\t"
  181111. #endif
  181112. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181113. "lsrs r6, r7, #16\n\t"
  181114. #else
  181115. "lsr r6, r7, #16\n\t"
  181116. #endif
  181117. #ifdef WOLFSSL_KEIL
  181118. "muls r6, r5, r6\n\t"
  181119. #elif defined(__clang__)
  181120. "muls r6, r5\n\t"
  181121. #else
  181122. "mul r6, r5\n\t"
  181123. #endif
  181124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181125. "adds r4, r4, r6\n\t"
  181126. #else
  181127. "add r4, 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 r4, r4, r6\n\t"
  181138. #else
  181139. "add r4, r4, r6\n\t"
  181140. #endif
  181141. #ifdef WOLFSSL_KEIL
  181142. "adcs r2, r2, %[r]\n\t"
  181143. #elif defined(__clang__)
  181144. "adcs r2, %[r]\n\t"
  181145. #else
  181146. "adc r2, %[r]\n\t"
  181147. #endif
  181148. "uxth r6, r7\n\t"
  181149. #ifdef WOLFSSL_KEIL
  181150. "muls r5, r6, r5\n\t"
  181151. #elif defined(__clang__)
  181152. "muls r5, r6\n\t"
  181153. #else
  181154. "mul r5, r6\n\t"
  181155. #endif
  181156. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181157. "lsrs r6, r5, #16\n\t"
  181158. #else
  181159. "lsr r6, r5, #16\n\t"
  181160. #endif
  181161. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181162. "lsls r5, r5, #16\n\t"
  181163. #else
  181164. "lsl r5, r5, #16\n\t"
  181165. #endif
  181166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181167. "adds r3, r3, r5\n\t"
  181168. #else
  181169. "add r3, r3, r5\n\t"
  181170. #endif
  181171. #ifdef WOLFSSL_KEIL
  181172. "adcs r4, r4, r6\n\t"
  181173. #elif defined(__clang__)
  181174. "adcs r4, r6\n\t"
  181175. #else
  181176. "adc r4, r6\n\t"
  181177. #endif
  181178. #ifdef WOLFSSL_KEIL
  181179. "adcs r2, r2, %[r]\n\t"
  181180. #elif defined(__clang__)
  181181. "adcs r2, %[r]\n\t"
  181182. #else
  181183. "adc r2, %[r]\n\t"
  181184. #endif
  181185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181186. "adds r3, r3, r5\n\t"
  181187. #else
  181188. "add r3, r3, r5\n\t"
  181189. #endif
  181190. #ifdef WOLFSSL_KEIL
  181191. "adcs r4, r4, r6\n\t"
  181192. #elif defined(__clang__)
  181193. "adcs r4, r6\n\t"
  181194. #else
  181195. "adc r4, r6\n\t"
  181196. #endif
  181197. #ifdef WOLFSSL_KEIL
  181198. "adcs r2, r2, %[r]\n\t"
  181199. #elif defined(__clang__)
  181200. "adcs r2, %[r]\n\t"
  181201. #else
  181202. "adc r2, %[r]\n\t"
  181203. #endif
  181204. "str r3, [sp, #52]\n\t"
  181205. "# A[14] * A[0]\n\t"
  181206. "movs r3, #0\n\t"
  181207. "mov %[a], r9\n\t"
  181208. "ldr %[a], [%[a], #56]\n\t"
  181209. "uxth r5, %[a]\n\t"
  181210. "uxth r6, r7\n\t"
  181211. #ifdef WOLFSSL_KEIL
  181212. "muls r6, r5, r6\n\t"
  181213. #elif defined(__clang__)
  181214. "muls r6, r5\n\t"
  181215. #else
  181216. "mul r6, r5\n\t"
  181217. #endif
  181218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181219. "adds r4, r4, r6\n\t"
  181220. #else
  181221. "add r4, r4, r6\n\t"
  181222. #endif
  181223. #ifdef WOLFSSL_KEIL
  181224. "adcs r2, r2, %[r]\n\t"
  181225. #elif defined(__clang__)
  181226. "adcs r2, %[r]\n\t"
  181227. #else
  181228. "adc r2, %[r]\n\t"
  181229. #endif
  181230. #ifdef WOLFSSL_KEIL
  181231. "adcs r3, r3, %[r]\n\t"
  181232. #elif defined(__clang__)
  181233. "adcs r3, %[r]\n\t"
  181234. #else
  181235. "adc r3, %[r]\n\t"
  181236. #endif
  181237. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181238. "adds r4, r4, r6\n\t"
  181239. #else
  181240. "add r4, r4, r6\n\t"
  181241. #endif
  181242. #ifdef WOLFSSL_KEIL
  181243. "adcs r2, r2, %[r]\n\t"
  181244. #elif defined(__clang__)
  181245. "adcs r2, %[r]\n\t"
  181246. #else
  181247. "adc r2, %[r]\n\t"
  181248. #endif
  181249. #ifdef WOLFSSL_KEIL
  181250. "adcs r3, r3, %[r]\n\t"
  181251. #elif defined(__clang__)
  181252. "adcs r3, %[r]\n\t"
  181253. #else
  181254. "adc r3, %[r]\n\t"
  181255. #endif
  181256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181257. "lsrs r6, r7, #16\n\t"
  181258. #else
  181259. "lsr r6, r7, #16\n\t"
  181260. #endif
  181261. #ifdef WOLFSSL_KEIL
  181262. "muls r5, r6, r5\n\t"
  181263. #elif defined(__clang__)
  181264. "muls r5, r6\n\t"
  181265. #else
  181266. "mul r5, r6\n\t"
  181267. #endif
  181268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181269. "lsrs r6, r5, #16\n\t"
  181270. #else
  181271. "lsr r6, r5, #16\n\t"
  181272. #endif
  181273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181274. "lsls r5, r5, #16\n\t"
  181275. #else
  181276. "lsl r5, r5, #16\n\t"
  181277. #endif
  181278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181279. "adds r4, r4, r5\n\t"
  181280. #else
  181281. "add r4, r4, r5\n\t"
  181282. #endif
  181283. #ifdef WOLFSSL_KEIL
  181284. "adcs r2, r2, r6\n\t"
  181285. #elif defined(__clang__)
  181286. "adcs r2, r6\n\t"
  181287. #else
  181288. "adc r2, r6\n\t"
  181289. #endif
  181290. #ifdef WOLFSSL_KEIL
  181291. "adcs r3, r3, %[r]\n\t"
  181292. #elif defined(__clang__)
  181293. "adcs r3, %[r]\n\t"
  181294. #else
  181295. "adc r3, %[r]\n\t"
  181296. #endif
  181297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181298. "adds r4, r4, r5\n\t"
  181299. #else
  181300. "add r4, r4, r5\n\t"
  181301. #endif
  181302. #ifdef WOLFSSL_KEIL
  181303. "adcs r2, r2, r6\n\t"
  181304. #elif defined(__clang__)
  181305. "adcs r2, r6\n\t"
  181306. #else
  181307. "adc r2, r6\n\t"
  181308. #endif
  181309. #ifdef WOLFSSL_KEIL
  181310. "adcs r3, r3, %[r]\n\t"
  181311. #elif defined(__clang__)
  181312. "adcs r3, %[r]\n\t"
  181313. #else
  181314. "adc r3, %[r]\n\t"
  181315. #endif
  181316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181317. "lsrs r5, %[a], #16\n\t"
  181318. #else
  181319. "lsr r5, %[a], #16\n\t"
  181320. #endif
  181321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181322. "lsrs r6, r7, #16\n\t"
  181323. #else
  181324. "lsr r6, r7, #16\n\t"
  181325. #endif
  181326. #ifdef WOLFSSL_KEIL
  181327. "muls r6, r5, r6\n\t"
  181328. #elif defined(__clang__)
  181329. "muls r6, r5\n\t"
  181330. #else
  181331. "mul r6, r5\n\t"
  181332. #endif
  181333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181334. "adds r2, r2, r6\n\t"
  181335. #else
  181336. "add r2, r2, r6\n\t"
  181337. #endif
  181338. #ifdef WOLFSSL_KEIL
  181339. "adcs r3, r3, %[r]\n\t"
  181340. #elif defined(__clang__)
  181341. "adcs r3, %[r]\n\t"
  181342. #else
  181343. "adc r3, %[r]\n\t"
  181344. #endif
  181345. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181346. "adds r2, r2, r6\n\t"
  181347. #else
  181348. "add r2, r2, r6\n\t"
  181349. #endif
  181350. #ifdef WOLFSSL_KEIL
  181351. "adcs r3, r3, %[r]\n\t"
  181352. #elif defined(__clang__)
  181353. "adcs r3, %[r]\n\t"
  181354. #else
  181355. "adc r3, %[r]\n\t"
  181356. #endif
  181357. "uxth r6, r7\n\t"
  181358. #ifdef WOLFSSL_KEIL
  181359. "muls r5, r6, r5\n\t"
  181360. #elif defined(__clang__)
  181361. "muls r5, r6\n\t"
  181362. #else
  181363. "mul r5, r6\n\t"
  181364. #endif
  181365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181366. "lsrs r6, r5, #16\n\t"
  181367. #else
  181368. "lsr r6, r5, #16\n\t"
  181369. #endif
  181370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181371. "lsls r5, r5, #16\n\t"
  181372. #else
  181373. "lsl r5, r5, #16\n\t"
  181374. #endif
  181375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181376. "adds r4, r4, r5\n\t"
  181377. #else
  181378. "add r4, r4, r5\n\t"
  181379. #endif
  181380. #ifdef WOLFSSL_KEIL
  181381. "adcs r2, r2, r6\n\t"
  181382. #elif defined(__clang__)
  181383. "adcs r2, r6\n\t"
  181384. #else
  181385. "adc r2, r6\n\t"
  181386. #endif
  181387. #ifdef WOLFSSL_KEIL
  181388. "adcs r3, r3, %[r]\n\t"
  181389. #elif defined(__clang__)
  181390. "adcs r3, %[r]\n\t"
  181391. #else
  181392. "adc r3, %[r]\n\t"
  181393. #endif
  181394. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181395. "adds r4, r4, r5\n\t"
  181396. #else
  181397. "add r4, r4, r5\n\t"
  181398. #endif
  181399. #ifdef WOLFSSL_KEIL
  181400. "adcs r2, r2, r6\n\t"
  181401. #elif defined(__clang__)
  181402. "adcs r2, r6\n\t"
  181403. #else
  181404. "adc r2, r6\n\t"
  181405. #endif
  181406. #ifdef WOLFSSL_KEIL
  181407. "adcs r3, r3, %[r]\n\t"
  181408. #elif defined(__clang__)
  181409. "adcs r3, %[r]\n\t"
  181410. #else
  181411. "adc r3, %[r]\n\t"
  181412. #endif
  181413. "# A[13] * A[1]\n\t"
  181414. "mov %[a], r9\n\t"
  181415. "mov r7, r11\n\t"
  181416. "ldr %[a], [%[a], #52]\n\t"
  181417. "uxth r5, %[a]\n\t"
  181418. "uxth r6, r7\n\t"
  181419. #ifdef WOLFSSL_KEIL
  181420. "muls r6, r5, r6\n\t"
  181421. #elif defined(__clang__)
  181422. "muls r6, r5\n\t"
  181423. #else
  181424. "mul r6, r5\n\t"
  181425. #endif
  181426. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181427. "adds r4, r4, r6\n\t"
  181428. #else
  181429. "add r4, r4, r6\n\t"
  181430. #endif
  181431. #ifdef WOLFSSL_KEIL
  181432. "adcs r2, r2, %[r]\n\t"
  181433. #elif defined(__clang__)
  181434. "adcs r2, %[r]\n\t"
  181435. #else
  181436. "adc r2, %[r]\n\t"
  181437. #endif
  181438. #ifdef WOLFSSL_KEIL
  181439. "adcs r3, r3, %[r]\n\t"
  181440. #elif defined(__clang__)
  181441. "adcs r3, %[r]\n\t"
  181442. #else
  181443. "adc r3, %[r]\n\t"
  181444. #endif
  181445. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181446. "adds r4, r4, r6\n\t"
  181447. #else
  181448. "add r4, r4, r6\n\t"
  181449. #endif
  181450. #ifdef WOLFSSL_KEIL
  181451. "adcs r2, r2, %[r]\n\t"
  181452. #elif defined(__clang__)
  181453. "adcs r2, %[r]\n\t"
  181454. #else
  181455. "adc r2, %[r]\n\t"
  181456. #endif
  181457. #ifdef WOLFSSL_KEIL
  181458. "adcs r3, r3, %[r]\n\t"
  181459. #elif defined(__clang__)
  181460. "adcs r3, %[r]\n\t"
  181461. #else
  181462. "adc r3, %[r]\n\t"
  181463. #endif
  181464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181465. "lsrs r6, r7, #16\n\t"
  181466. #else
  181467. "lsr r6, r7, #16\n\t"
  181468. #endif
  181469. #ifdef WOLFSSL_KEIL
  181470. "muls r5, r6, r5\n\t"
  181471. #elif defined(__clang__)
  181472. "muls r5, r6\n\t"
  181473. #else
  181474. "mul r5, r6\n\t"
  181475. #endif
  181476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181477. "lsrs r6, r5, #16\n\t"
  181478. #else
  181479. "lsr r6, r5, #16\n\t"
  181480. #endif
  181481. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181482. "lsls r5, r5, #16\n\t"
  181483. #else
  181484. "lsl r5, r5, #16\n\t"
  181485. #endif
  181486. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181487. "adds r4, r4, r5\n\t"
  181488. #else
  181489. "add r4, r4, r5\n\t"
  181490. #endif
  181491. #ifdef WOLFSSL_KEIL
  181492. "adcs r2, r2, r6\n\t"
  181493. #elif defined(__clang__)
  181494. "adcs r2, r6\n\t"
  181495. #else
  181496. "adc r2, r6\n\t"
  181497. #endif
  181498. #ifdef WOLFSSL_KEIL
  181499. "adcs r3, r3, %[r]\n\t"
  181500. #elif defined(__clang__)
  181501. "adcs r3, %[r]\n\t"
  181502. #else
  181503. "adc r3, %[r]\n\t"
  181504. #endif
  181505. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181506. "adds r4, r4, r5\n\t"
  181507. #else
  181508. "add r4, r4, r5\n\t"
  181509. #endif
  181510. #ifdef WOLFSSL_KEIL
  181511. "adcs r2, r2, r6\n\t"
  181512. #elif defined(__clang__)
  181513. "adcs r2, r6\n\t"
  181514. #else
  181515. "adc r2, r6\n\t"
  181516. #endif
  181517. #ifdef WOLFSSL_KEIL
  181518. "adcs r3, r3, %[r]\n\t"
  181519. #elif defined(__clang__)
  181520. "adcs r3, %[r]\n\t"
  181521. #else
  181522. "adc r3, %[r]\n\t"
  181523. #endif
  181524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181525. "lsrs r5, %[a], #16\n\t"
  181526. #else
  181527. "lsr r5, %[a], #16\n\t"
  181528. #endif
  181529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181530. "lsrs r6, r7, #16\n\t"
  181531. #else
  181532. "lsr r6, r7, #16\n\t"
  181533. #endif
  181534. #ifdef WOLFSSL_KEIL
  181535. "muls r6, r5, r6\n\t"
  181536. #elif defined(__clang__)
  181537. "muls r6, r5\n\t"
  181538. #else
  181539. "mul r6, r5\n\t"
  181540. #endif
  181541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181542. "adds r2, r2, r6\n\t"
  181543. #else
  181544. "add r2, r2, r6\n\t"
  181545. #endif
  181546. #ifdef WOLFSSL_KEIL
  181547. "adcs r3, r3, %[r]\n\t"
  181548. #elif defined(__clang__)
  181549. "adcs r3, %[r]\n\t"
  181550. #else
  181551. "adc r3, %[r]\n\t"
  181552. #endif
  181553. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181554. "adds r2, r2, r6\n\t"
  181555. #else
  181556. "add r2, r2, r6\n\t"
  181557. #endif
  181558. #ifdef WOLFSSL_KEIL
  181559. "adcs r3, r3, %[r]\n\t"
  181560. #elif defined(__clang__)
  181561. "adcs r3, %[r]\n\t"
  181562. #else
  181563. "adc r3, %[r]\n\t"
  181564. #endif
  181565. "uxth r6, r7\n\t"
  181566. #ifdef WOLFSSL_KEIL
  181567. "muls r5, r6, r5\n\t"
  181568. #elif defined(__clang__)
  181569. "muls r5, r6\n\t"
  181570. #else
  181571. "mul r5, r6\n\t"
  181572. #endif
  181573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181574. "lsrs r6, r5, #16\n\t"
  181575. #else
  181576. "lsr r6, r5, #16\n\t"
  181577. #endif
  181578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181579. "lsls r5, r5, #16\n\t"
  181580. #else
  181581. "lsl r5, r5, #16\n\t"
  181582. #endif
  181583. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181584. "adds r4, r4, r5\n\t"
  181585. #else
  181586. "add r4, r4, r5\n\t"
  181587. #endif
  181588. #ifdef WOLFSSL_KEIL
  181589. "adcs r2, r2, r6\n\t"
  181590. #elif defined(__clang__)
  181591. "adcs r2, r6\n\t"
  181592. #else
  181593. "adc r2, r6\n\t"
  181594. #endif
  181595. #ifdef WOLFSSL_KEIL
  181596. "adcs r3, r3, %[r]\n\t"
  181597. #elif defined(__clang__)
  181598. "adcs r3, %[r]\n\t"
  181599. #else
  181600. "adc r3, %[r]\n\t"
  181601. #endif
  181602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181603. "adds r4, r4, r5\n\t"
  181604. #else
  181605. "add r4, r4, r5\n\t"
  181606. #endif
  181607. #ifdef WOLFSSL_KEIL
  181608. "adcs r2, r2, r6\n\t"
  181609. #elif defined(__clang__)
  181610. "adcs r2, r6\n\t"
  181611. #else
  181612. "adc r2, r6\n\t"
  181613. #endif
  181614. #ifdef WOLFSSL_KEIL
  181615. "adcs r3, r3, %[r]\n\t"
  181616. #elif defined(__clang__)
  181617. "adcs r3, %[r]\n\t"
  181618. #else
  181619. "adc r3, %[r]\n\t"
  181620. #endif
  181621. "# A[12] * A[2]\n\t"
  181622. "mov %[a], r9\n\t"
  181623. "mov r7, r12\n\t"
  181624. "ldr %[a], [%[a], #48]\n\t"
  181625. "uxth r5, %[a]\n\t"
  181626. "uxth r6, r7\n\t"
  181627. #ifdef WOLFSSL_KEIL
  181628. "muls r6, r5, r6\n\t"
  181629. #elif defined(__clang__)
  181630. "muls r6, r5\n\t"
  181631. #else
  181632. "mul r6, r5\n\t"
  181633. #endif
  181634. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181635. "adds r4, r4, r6\n\t"
  181636. #else
  181637. "add r4, r4, r6\n\t"
  181638. #endif
  181639. #ifdef WOLFSSL_KEIL
  181640. "adcs r2, r2, %[r]\n\t"
  181641. #elif defined(__clang__)
  181642. "adcs r2, %[r]\n\t"
  181643. #else
  181644. "adc r2, %[r]\n\t"
  181645. #endif
  181646. #ifdef WOLFSSL_KEIL
  181647. "adcs r3, r3, %[r]\n\t"
  181648. #elif defined(__clang__)
  181649. "adcs r3, %[r]\n\t"
  181650. #else
  181651. "adc r3, %[r]\n\t"
  181652. #endif
  181653. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181654. "adds r4, r4, r6\n\t"
  181655. #else
  181656. "add r4, r4, r6\n\t"
  181657. #endif
  181658. #ifdef WOLFSSL_KEIL
  181659. "adcs r2, r2, %[r]\n\t"
  181660. #elif defined(__clang__)
  181661. "adcs r2, %[r]\n\t"
  181662. #else
  181663. "adc r2, %[r]\n\t"
  181664. #endif
  181665. #ifdef WOLFSSL_KEIL
  181666. "adcs r3, r3, %[r]\n\t"
  181667. #elif defined(__clang__)
  181668. "adcs r3, %[r]\n\t"
  181669. #else
  181670. "adc r3, %[r]\n\t"
  181671. #endif
  181672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181673. "lsrs r6, r7, #16\n\t"
  181674. #else
  181675. "lsr r6, r7, #16\n\t"
  181676. #endif
  181677. #ifdef WOLFSSL_KEIL
  181678. "muls r5, r6, r5\n\t"
  181679. #elif defined(__clang__)
  181680. "muls r5, r6\n\t"
  181681. #else
  181682. "mul r5, r6\n\t"
  181683. #endif
  181684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181685. "lsrs r6, r5, #16\n\t"
  181686. #else
  181687. "lsr r6, r5, #16\n\t"
  181688. #endif
  181689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181690. "lsls r5, r5, #16\n\t"
  181691. #else
  181692. "lsl r5, r5, #16\n\t"
  181693. #endif
  181694. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181695. "adds r4, r4, r5\n\t"
  181696. #else
  181697. "add r4, r4, r5\n\t"
  181698. #endif
  181699. #ifdef WOLFSSL_KEIL
  181700. "adcs r2, r2, r6\n\t"
  181701. #elif defined(__clang__)
  181702. "adcs r2, r6\n\t"
  181703. #else
  181704. "adc r2, r6\n\t"
  181705. #endif
  181706. #ifdef WOLFSSL_KEIL
  181707. "adcs r3, r3, %[r]\n\t"
  181708. #elif defined(__clang__)
  181709. "adcs r3, %[r]\n\t"
  181710. #else
  181711. "adc r3, %[r]\n\t"
  181712. #endif
  181713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181714. "adds r4, r4, r5\n\t"
  181715. #else
  181716. "add r4, r4, r5\n\t"
  181717. #endif
  181718. #ifdef WOLFSSL_KEIL
  181719. "adcs r2, r2, r6\n\t"
  181720. #elif defined(__clang__)
  181721. "adcs r2, r6\n\t"
  181722. #else
  181723. "adc r2, r6\n\t"
  181724. #endif
  181725. #ifdef WOLFSSL_KEIL
  181726. "adcs r3, r3, %[r]\n\t"
  181727. #elif defined(__clang__)
  181728. "adcs r3, %[r]\n\t"
  181729. #else
  181730. "adc r3, %[r]\n\t"
  181731. #endif
  181732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181733. "lsrs r5, %[a], #16\n\t"
  181734. #else
  181735. "lsr r5, %[a], #16\n\t"
  181736. #endif
  181737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181738. "lsrs r6, r7, #16\n\t"
  181739. #else
  181740. "lsr r6, r7, #16\n\t"
  181741. #endif
  181742. #ifdef WOLFSSL_KEIL
  181743. "muls r6, r5, r6\n\t"
  181744. #elif defined(__clang__)
  181745. "muls r6, r5\n\t"
  181746. #else
  181747. "mul r6, r5\n\t"
  181748. #endif
  181749. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181750. "adds r2, r2, r6\n\t"
  181751. #else
  181752. "add r2, 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 r2, r2, r6\n\t"
  181763. #else
  181764. "add r2, r2, r6\n\t"
  181765. #endif
  181766. #ifdef WOLFSSL_KEIL
  181767. "adcs r3, r3, %[r]\n\t"
  181768. #elif defined(__clang__)
  181769. "adcs r3, %[r]\n\t"
  181770. #else
  181771. "adc r3, %[r]\n\t"
  181772. #endif
  181773. "uxth r6, r7\n\t"
  181774. #ifdef WOLFSSL_KEIL
  181775. "muls r5, r6, r5\n\t"
  181776. #elif defined(__clang__)
  181777. "muls r5, r6\n\t"
  181778. #else
  181779. "mul r5, r6\n\t"
  181780. #endif
  181781. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181782. "lsrs r6, r5, #16\n\t"
  181783. #else
  181784. "lsr r6, r5, #16\n\t"
  181785. #endif
  181786. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181787. "lsls r5, r5, #16\n\t"
  181788. #else
  181789. "lsl r5, r5, #16\n\t"
  181790. #endif
  181791. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181792. "adds r4, r4, r5\n\t"
  181793. #else
  181794. "add r4, r4, r5\n\t"
  181795. #endif
  181796. #ifdef WOLFSSL_KEIL
  181797. "adcs r2, r2, r6\n\t"
  181798. #elif defined(__clang__)
  181799. "adcs r2, r6\n\t"
  181800. #else
  181801. "adc r2, r6\n\t"
  181802. #endif
  181803. #ifdef WOLFSSL_KEIL
  181804. "adcs r3, r3, %[r]\n\t"
  181805. #elif defined(__clang__)
  181806. "adcs r3, %[r]\n\t"
  181807. #else
  181808. "adc r3, %[r]\n\t"
  181809. #endif
  181810. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181811. "adds r4, r4, r5\n\t"
  181812. #else
  181813. "add r4, r4, r5\n\t"
  181814. #endif
  181815. #ifdef WOLFSSL_KEIL
  181816. "adcs r2, r2, r6\n\t"
  181817. #elif defined(__clang__)
  181818. "adcs r2, r6\n\t"
  181819. #else
  181820. "adc r2, r6\n\t"
  181821. #endif
  181822. #ifdef WOLFSSL_KEIL
  181823. "adcs r3, r3, %[r]\n\t"
  181824. #elif defined(__clang__)
  181825. "adcs r3, %[r]\n\t"
  181826. #else
  181827. "adc r3, %[r]\n\t"
  181828. #endif
  181829. "# A[11] * A[3]\n\t"
  181830. "mov %[a], r9\n\t"
  181831. "mov r7, lr\n\t"
  181832. "ldr %[a], [%[a], #44]\n\t"
  181833. "uxth r5, %[a]\n\t"
  181834. "uxth r6, r7\n\t"
  181835. #ifdef WOLFSSL_KEIL
  181836. "muls r6, r5, r6\n\t"
  181837. #elif defined(__clang__)
  181838. "muls r6, r5\n\t"
  181839. #else
  181840. "mul r6, r5\n\t"
  181841. #endif
  181842. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181843. "adds r4, r4, r6\n\t"
  181844. #else
  181845. "add r4, r4, r6\n\t"
  181846. #endif
  181847. #ifdef WOLFSSL_KEIL
  181848. "adcs r2, r2, %[r]\n\t"
  181849. #elif defined(__clang__)
  181850. "adcs r2, %[r]\n\t"
  181851. #else
  181852. "adc r2, %[r]\n\t"
  181853. #endif
  181854. #ifdef WOLFSSL_KEIL
  181855. "adcs r3, r3, %[r]\n\t"
  181856. #elif defined(__clang__)
  181857. "adcs r3, %[r]\n\t"
  181858. #else
  181859. "adc r3, %[r]\n\t"
  181860. #endif
  181861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181862. "adds r4, r4, r6\n\t"
  181863. #else
  181864. "add r4, r4, r6\n\t"
  181865. #endif
  181866. #ifdef WOLFSSL_KEIL
  181867. "adcs r2, r2, %[r]\n\t"
  181868. #elif defined(__clang__)
  181869. "adcs r2, %[r]\n\t"
  181870. #else
  181871. "adc r2, %[r]\n\t"
  181872. #endif
  181873. #ifdef WOLFSSL_KEIL
  181874. "adcs r3, r3, %[r]\n\t"
  181875. #elif defined(__clang__)
  181876. "adcs r3, %[r]\n\t"
  181877. #else
  181878. "adc r3, %[r]\n\t"
  181879. #endif
  181880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181881. "lsrs r6, r7, #16\n\t"
  181882. #else
  181883. "lsr r6, r7, #16\n\t"
  181884. #endif
  181885. #ifdef WOLFSSL_KEIL
  181886. "muls r5, r6, r5\n\t"
  181887. #elif defined(__clang__)
  181888. "muls r5, r6\n\t"
  181889. #else
  181890. "mul r5, r6\n\t"
  181891. #endif
  181892. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181893. "lsrs r6, r5, #16\n\t"
  181894. #else
  181895. "lsr r6, r5, #16\n\t"
  181896. #endif
  181897. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181898. "lsls r5, r5, #16\n\t"
  181899. #else
  181900. "lsl r5, r5, #16\n\t"
  181901. #endif
  181902. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181903. "adds r4, r4, r5\n\t"
  181904. #else
  181905. "add r4, r4, r5\n\t"
  181906. #endif
  181907. #ifdef WOLFSSL_KEIL
  181908. "adcs r2, r2, r6\n\t"
  181909. #elif defined(__clang__)
  181910. "adcs r2, r6\n\t"
  181911. #else
  181912. "adc r2, r6\n\t"
  181913. #endif
  181914. #ifdef WOLFSSL_KEIL
  181915. "adcs r3, r3, %[r]\n\t"
  181916. #elif defined(__clang__)
  181917. "adcs r3, %[r]\n\t"
  181918. #else
  181919. "adc r3, %[r]\n\t"
  181920. #endif
  181921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181922. "adds r4, r4, r5\n\t"
  181923. #else
  181924. "add r4, r4, r5\n\t"
  181925. #endif
  181926. #ifdef WOLFSSL_KEIL
  181927. "adcs r2, r2, r6\n\t"
  181928. #elif defined(__clang__)
  181929. "adcs r2, r6\n\t"
  181930. #else
  181931. "adc r2, r6\n\t"
  181932. #endif
  181933. #ifdef WOLFSSL_KEIL
  181934. "adcs r3, r3, %[r]\n\t"
  181935. #elif defined(__clang__)
  181936. "adcs r3, %[r]\n\t"
  181937. #else
  181938. "adc r3, %[r]\n\t"
  181939. #endif
  181940. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181941. "lsrs r5, %[a], #16\n\t"
  181942. #else
  181943. "lsr r5, %[a], #16\n\t"
  181944. #endif
  181945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181946. "lsrs r6, r7, #16\n\t"
  181947. #else
  181948. "lsr r6, r7, #16\n\t"
  181949. #endif
  181950. #ifdef WOLFSSL_KEIL
  181951. "muls r6, r5, r6\n\t"
  181952. #elif defined(__clang__)
  181953. "muls r6, r5\n\t"
  181954. #else
  181955. "mul r6, r5\n\t"
  181956. #endif
  181957. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181958. "adds r2, r2, r6\n\t"
  181959. #else
  181960. "add r2, 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 r2, r2, r6\n\t"
  181971. #else
  181972. "add r2, r2, r6\n\t"
  181973. #endif
  181974. #ifdef WOLFSSL_KEIL
  181975. "adcs r3, r3, %[r]\n\t"
  181976. #elif defined(__clang__)
  181977. "adcs r3, %[r]\n\t"
  181978. #else
  181979. "adc r3, %[r]\n\t"
  181980. #endif
  181981. "uxth r6, r7\n\t"
  181982. #ifdef WOLFSSL_KEIL
  181983. "muls r5, r6, r5\n\t"
  181984. #elif defined(__clang__)
  181985. "muls r5, r6\n\t"
  181986. #else
  181987. "mul r5, r6\n\t"
  181988. #endif
  181989. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181990. "lsrs r6, r5, #16\n\t"
  181991. #else
  181992. "lsr r6, r5, #16\n\t"
  181993. #endif
  181994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  181995. "lsls r5, r5, #16\n\t"
  181996. #else
  181997. "lsl r5, r5, #16\n\t"
  181998. #endif
  181999. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182000. "adds r4, r4, r5\n\t"
  182001. #else
  182002. "add r4, r4, r5\n\t"
  182003. #endif
  182004. #ifdef WOLFSSL_KEIL
  182005. "adcs r2, r2, r6\n\t"
  182006. #elif defined(__clang__)
  182007. "adcs r2, r6\n\t"
  182008. #else
  182009. "adc r2, r6\n\t"
  182010. #endif
  182011. #ifdef WOLFSSL_KEIL
  182012. "adcs r3, r3, %[r]\n\t"
  182013. #elif defined(__clang__)
  182014. "adcs r3, %[r]\n\t"
  182015. #else
  182016. "adc r3, %[r]\n\t"
  182017. #endif
  182018. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182019. "adds r4, r4, r5\n\t"
  182020. #else
  182021. "add r4, r4, r5\n\t"
  182022. #endif
  182023. #ifdef WOLFSSL_KEIL
  182024. "adcs r2, r2, r6\n\t"
  182025. #elif defined(__clang__)
  182026. "adcs r2, r6\n\t"
  182027. #else
  182028. "adc r2, r6\n\t"
  182029. #endif
  182030. #ifdef WOLFSSL_KEIL
  182031. "adcs r3, r3, %[r]\n\t"
  182032. #elif defined(__clang__)
  182033. "adcs r3, %[r]\n\t"
  182034. #else
  182035. "adc r3, %[r]\n\t"
  182036. #endif
  182037. "# A[10] * A[4]\n\t"
  182038. "mov %[a], r9\n\t"
  182039. "ldr r7, [%[a], #16]\n\t"
  182040. "ldr %[a], [%[a], #40]\n\t"
  182041. "uxth r5, %[a]\n\t"
  182042. "uxth r6, r7\n\t"
  182043. #ifdef WOLFSSL_KEIL
  182044. "muls r6, r5, r6\n\t"
  182045. #elif defined(__clang__)
  182046. "muls r6, r5\n\t"
  182047. #else
  182048. "mul r6, r5\n\t"
  182049. #endif
  182050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182051. "adds r4, r4, r6\n\t"
  182052. #else
  182053. "add r4, r4, r6\n\t"
  182054. #endif
  182055. #ifdef WOLFSSL_KEIL
  182056. "adcs r2, r2, %[r]\n\t"
  182057. #elif defined(__clang__)
  182058. "adcs r2, %[r]\n\t"
  182059. #else
  182060. "adc r2, %[r]\n\t"
  182061. #endif
  182062. #ifdef WOLFSSL_KEIL
  182063. "adcs r3, r3, %[r]\n\t"
  182064. #elif defined(__clang__)
  182065. "adcs r3, %[r]\n\t"
  182066. #else
  182067. "adc r3, %[r]\n\t"
  182068. #endif
  182069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182070. "adds r4, r4, r6\n\t"
  182071. #else
  182072. "add r4, r4, r6\n\t"
  182073. #endif
  182074. #ifdef WOLFSSL_KEIL
  182075. "adcs r2, r2, %[r]\n\t"
  182076. #elif defined(__clang__)
  182077. "adcs r2, %[r]\n\t"
  182078. #else
  182079. "adc r2, %[r]\n\t"
  182080. #endif
  182081. #ifdef WOLFSSL_KEIL
  182082. "adcs r3, r3, %[r]\n\t"
  182083. #elif defined(__clang__)
  182084. "adcs r3, %[r]\n\t"
  182085. #else
  182086. "adc r3, %[r]\n\t"
  182087. #endif
  182088. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182089. "lsrs r6, r7, #16\n\t"
  182090. #else
  182091. "lsr r6, r7, #16\n\t"
  182092. #endif
  182093. #ifdef WOLFSSL_KEIL
  182094. "muls r5, r6, r5\n\t"
  182095. #elif defined(__clang__)
  182096. "muls r5, r6\n\t"
  182097. #else
  182098. "mul r5, r6\n\t"
  182099. #endif
  182100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182101. "lsrs r6, r5, #16\n\t"
  182102. #else
  182103. "lsr r6, r5, #16\n\t"
  182104. #endif
  182105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182106. "lsls r5, r5, #16\n\t"
  182107. #else
  182108. "lsl r5, r5, #16\n\t"
  182109. #endif
  182110. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182111. "adds r4, r4, r5\n\t"
  182112. #else
  182113. "add r4, r4, r5\n\t"
  182114. #endif
  182115. #ifdef WOLFSSL_KEIL
  182116. "adcs r2, r2, r6\n\t"
  182117. #elif defined(__clang__)
  182118. "adcs r2, r6\n\t"
  182119. #else
  182120. "adc r2, r6\n\t"
  182121. #endif
  182122. #ifdef WOLFSSL_KEIL
  182123. "adcs r3, r3, %[r]\n\t"
  182124. #elif defined(__clang__)
  182125. "adcs r3, %[r]\n\t"
  182126. #else
  182127. "adc r3, %[r]\n\t"
  182128. #endif
  182129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182130. "adds r4, r4, r5\n\t"
  182131. #else
  182132. "add r4, r4, r5\n\t"
  182133. #endif
  182134. #ifdef WOLFSSL_KEIL
  182135. "adcs r2, r2, r6\n\t"
  182136. #elif defined(__clang__)
  182137. "adcs r2, r6\n\t"
  182138. #else
  182139. "adc r2, r6\n\t"
  182140. #endif
  182141. #ifdef WOLFSSL_KEIL
  182142. "adcs r3, r3, %[r]\n\t"
  182143. #elif defined(__clang__)
  182144. "adcs r3, %[r]\n\t"
  182145. #else
  182146. "adc r3, %[r]\n\t"
  182147. #endif
  182148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182149. "lsrs r5, %[a], #16\n\t"
  182150. #else
  182151. "lsr r5, %[a], #16\n\t"
  182152. #endif
  182153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182154. "lsrs r6, r7, #16\n\t"
  182155. #else
  182156. "lsr r6, r7, #16\n\t"
  182157. #endif
  182158. #ifdef WOLFSSL_KEIL
  182159. "muls r6, r5, r6\n\t"
  182160. #elif defined(__clang__)
  182161. "muls r6, r5\n\t"
  182162. #else
  182163. "mul r6, r5\n\t"
  182164. #endif
  182165. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182166. "adds r2, r2, r6\n\t"
  182167. #else
  182168. "add r2, 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 r2, r2, r6\n\t"
  182179. #else
  182180. "add r2, r2, r6\n\t"
  182181. #endif
  182182. #ifdef WOLFSSL_KEIL
  182183. "adcs r3, r3, %[r]\n\t"
  182184. #elif defined(__clang__)
  182185. "adcs r3, %[r]\n\t"
  182186. #else
  182187. "adc r3, %[r]\n\t"
  182188. #endif
  182189. "uxth r6, r7\n\t"
  182190. #ifdef WOLFSSL_KEIL
  182191. "muls r5, r6, r5\n\t"
  182192. #elif defined(__clang__)
  182193. "muls r5, r6\n\t"
  182194. #else
  182195. "mul r5, r6\n\t"
  182196. #endif
  182197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182198. "lsrs r6, r5, #16\n\t"
  182199. #else
  182200. "lsr r6, r5, #16\n\t"
  182201. #endif
  182202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182203. "lsls r5, r5, #16\n\t"
  182204. #else
  182205. "lsl r5, r5, #16\n\t"
  182206. #endif
  182207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182208. "adds r4, r4, r5\n\t"
  182209. #else
  182210. "add r4, r4, r5\n\t"
  182211. #endif
  182212. #ifdef WOLFSSL_KEIL
  182213. "adcs r2, r2, r6\n\t"
  182214. #elif defined(__clang__)
  182215. "adcs r2, r6\n\t"
  182216. #else
  182217. "adc r2, r6\n\t"
  182218. #endif
  182219. #ifdef WOLFSSL_KEIL
  182220. "adcs r3, r3, %[r]\n\t"
  182221. #elif defined(__clang__)
  182222. "adcs r3, %[r]\n\t"
  182223. #else
  182224. "adc r3, %[r]\n\t"
  182225. #endif
  182226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182227. "adds r4, r4, r5\n\t"
  182228. #else
  182229. "add r4, r4, r5\n\t"
  182230. #endif
  182231. #ifdef WOLFSSL_KEIL
  182232. "adcs r2, r2, r6\n\t"
  182233. #elif defined(__clang__)
  182234. "adcs r2, r6\n\t"
  182235. #else
  182236. "adc r2, r6\n\t"
  182237. #endif
  182238. #ifdef WOLFSSL_KEIL
  182239. "adcs r3, r3, %[r]\n\t"
  182240. #elif defined(__clang__)
  182241. "adcs r3, %[r]\n\t"
  182242. #else
  182243. "adc r3, %[r]\n\t"
  182244. #endif
  182245. "# A[9] * A[5]\n\t"
  182246. "mov %[a], r9\n\t"
  182247. "ldr r7, [%[a], #20]\n\t"
  182248. "ldr %[a], [%[a], #36]\n\t"
  182249. "uxth r5, %[a]\n\t"
  182250. "uxth r6, r7\n\t"
  182251. #ifdef WOLFSSL_KEIL
  182252. "muls r6, r5, r6\n\t"
  182253. #elif defined(__clang__)
  182254. "muls r6, r5\n\t"
  182255. #else
  182256. "mul r6, r5\n\t"
  182257. #endif
  182258. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182259. "adds r4, r4, r6\n\t"
  182260. #else
  182261. "add r4, r4, r6\n\t"
  182262. #endif
  182263. #ifdef WOLFSSL_KEIL
  182264. "adcs r2, r2, %[r]\n\t"
  182265. #elif defined(__clang__)
  182266. "adcs r2, %[r]\n\t"
  182267. #else
  182268. "adc r2, %[r]\n\t"
  182269. #endif
  182270. #ifdef WOLFSSL_KEIL
  182271. "adcs r3, r3, %[r]\n\t"
  182272. #elif defined(__clang__)
  182273. "adcs r3, %[r]\n\t"
  182274. #else
  182275. "adc r3, %[r]\n\t"
  182276. #endif
  182277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182278. "adds r4, r4, r6\n\t"
  182279. #else
  182280. "add r4, r4, r6\n\t"
  182281. #endif
  182282. #ifdef WOLFSSL_KEIL
  182283. "adcs r2, r2, %[r]\n\t"
  182284. #elif defined(__clang__)
  182285. "adcs r2, %[r]\n\t"
  182286. #else
  182287. "adc r2, %[r]\n\t"
  182288. #endif
  182289. #ifdef WOLFSSL_KEIL
  182290. "adcs r3, r3, %[r]\n\t"
  182291. #elif defined(__clang__)
  182292. "adcs r3, %[r]\n\t"
  182293. #else
  182294. "adc r3, %[r]\n\t"
  182295. #endif
  182296. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182297. "lsrs r6, r7, #16\n\t"
  182298. #else
  182299. "lsr r6, r7, #16\n\t"
  182300. #endif
  182301. #ifdef WOLFSSL_KEIL
  182302. "muls r5, r6, r5\n\t"
  182303. #elif defined(__clang__)
  182304. "muls r5, r6\n\t"
  182305. #else
  182306. "mul r5, r6\n\t"
  182307. #endif
  182308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182309. "lsrs r6, r5, #16\n\t"
  182310. #else
  182311. "lsr r6, r5, #16\n\t"
  182312. #endif
  182313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182314. "lsls r5, r5, #16\n\t"
  182315. #else
  182316. "lsl r5, r5, #16\n\t"
  182317. #endif
  182318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182319. "adds r4, r4, r5\n\t"
  182320. #else
  182321. "add r4, r4, r5\n\t"
  182322. #endif
  182323. #ifdef WOLFSSL_KEIL
  182324. "adcs r2, r2, r6\n\t"
  182325. #elif defined(__clang__)
  182326. "adcs r2, r6\n\t"
  182327. #else
  182328. "adc r2, r6\n\t"
  182329. #endif
  182330. #ifdef WOLFSSL_KEIL
  182331. "adcs r3, r3, %[r]\n\t"
  182332. #elif defined(__clang__)
  182333. "adcs r3, %[r]\n\t"
  182334. #else
  182335. "adc r3, %[r]\n\t"
  182336. #endif
  182337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182338. "adds r4, r4, r5\n\t"
  182339. #else
  182340. "add r4, r4, r5\n\t"
  182341. #endif
  182342. #ifdef WOLFSSL_KEIL
  182343. "adcs r2, r2, r6\n\t"
  182344. #elif defined(__clang__)
  182345. "adcs r2, r6\n\t"
  182346. #else
  182347. "adc r2, r6\n\t"
  182348. #endif
  182349. #ifdef WOLFSSL_KEIL
  182350. "adcs r3, r3, %[r]\n\t"
  182351. #elif defined(__clang__)
  182352. "adcs r3, %[r]\n\t"
  182353. #else
  182354. "adc r3, %[r]\n\t"
  182355. #endif
  182356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182357. "lsrs r5, %[a], #16\n\t"
  182358. #else
  182359. "lsr r5, %[a], #16\n\t"
  182360. #endif
  182361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182362. "lsrs r6, r7, #16\n\t"
  182363. #else
  182364. "lsr r6, r7, #16\n\t"
  182365. #endif
  182366. #ifdef WOLFSSL_KEIL
  182367. "muls r6, r5, r6\n\t"
  182368. #elif defined(__clang__)
  182369. "muls r6, r5\n\t"
  182370. #else
  182371. "mul r6, r5\n\t"
  182372. #endif
  182373. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182374. "adds r2, r2, r6\n\t"
  182375. #else
  182376. "add r2, 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 r2, r2, r6\n\t"
  182387. #else
  182388. "add r2, r2, r6\n\t"
  182389. #endif
  182390. #ifdef WOLFSSL_KEIL
  182391. "adcs r3, r3, %[r]\n\t"
  182392. #elif defined(__clang__)
  182393. "adcs r3, %[r]\n\t"
  182394. #else
  182395. "adc r3, %[r]\n\t"
  182396. #endif
  182397. "uxth r6, r7\n\t"
  182398. #ifdef WOLFSSL_KEIL
  182399. "muls r5, r6, r5\n\t"
  182400. #elif defined(__clang__)
  182401. "muls r5, r6\n\t"
  182402. #else
  182403. "mul r5, r6\n\t"
  182404. #endif
  182405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182406. "lsrs r6, r5, #16\n\t"
  182407. #else
  182408. "lsr r6, r5, #16\n\t"
  182409. #endif
  182410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182411. "lsls r5, r5, #16\n\t"
  182412. #else
  182413. "lsl r5, r5, #16\n\t"
  182414. #endif
  182415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182416. "adds r4, r4, r5\n\t"
  182417. #else
  182418. "add r4, r4, r5\n\t"
  182419. #endif
  182420. #ifdef WOLFSSL_KEIL
  182421. "adcs r2, r2, r6\n\t"
  182422. #elif defined(__clang__)
  182423. "adcs r2, r6\n\t"
  182424. #else
  182425. "adc r2, r6\n\t"
  182426. #endif
  182427. #ifdef WOLFSSL_KEIL
  182428. "adcs r3, r3, %[r]\n\t"
  182429. #elif defined(__clang__)
  182430. "adcs r3, %[r]\n\t"
  182431. #else
  182432. "adc r3, %[r]\n\t"
  182433. #endif
  182434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182435. "adds r4, r4, r5\n\t"
  182436. #else
  182437. "add r4, r4, r5\n\t"
  182438. #endif
  182439. #ifdef WOLFSSL_KEIL
  182440. "adcs r2, r2, r6\n\t"
  182441. #elif defined(__clang__)
  182442. "adcs r2, r6\n\t"
  182443. #else
  182444. "adc r2, r6\n\t"
  182445. #endif
  182446. #ifdef WOLFSSL_KEIL
  182447. "adcs r3, r3, %[r]\n\t"
  182448. #elif defined(__clang__)
  182449. "adcs r3, %[r]\n\t"
  182450. #else
  182451. "adc r3, %[r]\n\t"
  182452. #endif
  182453. "# A[8] * A[6]\n\t"
  182454. "mov %[a], r9\n\t"
  182455. "ldr r7, [%[a], #24]\n\t"
  182456. "ldr %[a], [%[a], #32]\n\t"
  182457. "uxth r5, %[a]\n\t"
  182458. "uxth r6, r7\n\t"
  182459. #ifdef WOLFSSL_KEIL
  182460. "muls r6, r5, r6\n\t"
  182461. #elif defined(__clang__)
  182462. "muls r6, r5\n\t"
  182463. #else
  182464. "mul r6, r5\n\t"
  182465. #endif
  182466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182467. "adds r4, r4, r6\n\t"
  182468. #else
  182469. "add r4, r4, r6\n\t"
  182470. #endif
  182471. #ifdef WOLFSSL_KEIL
  182472. "adcs r2, r2, %[r]\n\t"
  182473. #elif defined(__clang__)
  182474. "adcs r2, %[r]\n\t"
  182475. #else
  182476. "adc r2, %[r]\n\t"
  182477. #endif
  182478. #ifdef WOLFSSL_KEIL
  182479. "adcs r3, r3, %[r]\n\t"
  182480. #elif defined(__clang__)
  182481. "adcs r3, %[r]\n\t"
  182482. #else
  182483. "adc r3, %[r]\n\t"
  182484. #endif
  182485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182486. "adds r4, r4, r6\n\t"
  182487. #else
  182488. "add r4, r4, r6\n\t"
  182489. #endif
  182490. #ifdef WOLFSSL_KEIL
  182491. "adcs r2, r2, %[r]\n\t"
  182492. #elif defined(__clang__)
  182493. "adcs r2, %[r]\n\t"
  182494. #else
  182495. "adc r2, %[r]\n\t"
  182496. #endif
  182497. #ifdef WOLFSSL_KEIL
  182498. "adcs r3, r3, %[r]\n\t"
  182499. #elif defined(__clang__)
  182500. "adcs r3, %[r]\n\t"
  182501. #else
  182502. "adc r3, %[r]\n\t"
  182503. #endif
  182504. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182505. "lsrs r6, r7, #16\n\t"
  182506. #else
  182507. "lsr r6, r7, #16\n\t"
  182508. #endif
  182509. #ifdef WOLFSSL_KEIL
  182510. "muls r5, r6, r5\n\t"
  182511. #elif defined(__clang__)
  182512. "muls r5, r6\n\t"
  182513. #else
  182514. "mul r5, r6\n\t"
  182515. #endif
  182516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182517. "lsrs r6, r5, #16\n\t"
  182518. #else
  182519. "lsr r6, r5, #16\n\t"
  182520. #endif
  182521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182522. "lsls r5, r5, #16\n\t"
  182523. #else
  182524. "lsl r5, r5, #16\n\t"
  182525. #endif
  182526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182527. "adds r4, r4, r5\n\t"
  182528. #else
  182529. "add r4, r4, r5\n\t"
  182530. #endif
  182531. #ifdef WOLFSSL_KEIL
  182532. "adcs r2, r2, r6\n\t"
  182533. #elif defined(__clang__)
  182534. "adcs r2, r6\n\t"
  182535. #else
  182536. "adc r2, r6\n\t"
  182537. #endif
  182538. #ifdef WOLFSSL_KEIL
  182539. "adcs r3, r3, %[r]\n\t"
  182540. #elif defined(__clang__)
  182541. "adcs r3, %[r]\n\t"
  182542. #else
  182543. "adc r3, %[r]\n\t"
  182544. #endif
  182545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182546. "adds r4, r4, r5\n\t"
  182547. #else
  182548. "add r4, r4, r5\n\t"
  182549. #endif
  182550. #ifdef WOLFSSL_KEIL
  182551. "adcs r2, r2, r6\n\t"
  182552. #elif defined(__clang__)
  182553. "adcs r2, r6\n\t"
  182554. #else
  182555. "adc r2, r6\n\t"
  182556. #endif
  182557. #ifdef WOLFSSL_KEIL
  182558. "adcs r3, r3, %[r]\n\t"
  182559. #elif defined(__clang__)
  182560. "adcs r3, %[r]\n\t"
  182561. #else
  182562. "adc r3, %[r]\n\t"
  182563. #endif
  182564. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182565. "lsrs r5, %[a], #16\n\t"
  182566. #else
  182567. "lsr r5, %[a], #16\n\t"
  182568. #endif
  182569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182570. "lsrs r6, r7, #16\n\t"
  182571. #else
  182572. "lsr r6, r7, #16\n\t"
  182573. #endif
  182574. #ifdef WOLFSSL_KEIL
  182575. "muls r6, r5, r6\n\t"
  182576. #elif defined(__clang__)
  182577. "muls r6, r5\n\t"
  182578. #else
  182579. "mul r6, r5\n\t"
  182580. #endif
  182581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182582. "adds r2, r2, r6\n\t"
  182583. #else
  182584. "add r2, 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 r2, r2, r6\n\t"
  182595. #else
  182596. "add r2, r2, r6\n\t"
  182597. #endif
  182598. #ifdef WOLFSSL_KEIL
  182599. "adcs r3, r3, %[r]\n\t"
  182600. #elif defined(__clang__)
  182601. "adcs r3, %[r]\n\t"
  182602. #else
  182603. "adc r3, %[r]\n\t"
  182604. #endif
  182605. "uxth r6, r7\n\t"
  182606. #ifdef WOLFSSL_KEIL
  182607. "muls r5, r6, r5\n\t"
  182608. #elif defined(__clang__)
  182609. "muls r5, r6\n\t"
  182610. #else
  182611. "mul r5, r6\n\t"
  182612. #endif
  182613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182614. "lsrs r6, r5, #16\n\t"
  182615. #else
  182616. "lsr r6, r5, #16\n\t"
  182617. #endif
  182618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182619. "lsls r5, r5, #16\n\t"
  182620. #else
  182621. "lsl r5, r5, #16\n\t"
  182622. #endif
  182623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182624. "adds r4, r4, r5\n\t"
  182625. #else
  182626. "add r4, r4, r5\n\t"
  182627. #endif
  182628. #ifdef WOLFSSL_KEIL
  182629. "adcs r2, r2, r6\n\t"
  182630. #elif defined(__clang__)
  182631. "adcs r2, r6\n\t"
  182632. #else
  182633. "adc r2, r6\n\t"
  182634. #endif
  182635. #ifdef WOLFSSL_KEIL
  182636. "adcs r3, r3, %[r]\n\t"
  182637. #elif defined(__clang__)
  182638. "adcs r3, %[r]\n\t"
  182639. #else
  182640. "adc r3, %[r]\n\t"
  182641. #endif
  182642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182643. "adds r4, r4, r5\n\t"
  182644. #else
  182645. "add r4, r4, r5\n\t"
  182646. #endif
  182647. #ifdef WOLFSSL_KEIL
  182648. "adcs r2, r2, r6\n\t"
  182649. #elif defined(__clang__)
  182650. "adcs r2, r6\n\t"
  182651. #else
  182652. "adc r2, r6\n\t"
  182653. #endif
  182654. #ifdef WOLFSSL_KEIL
  182655. "adcs r3, r3, %[r]\n\t"
  182656. #elif defined(__clang__)
  182657. "adcs r3, %[r]\n\t"
  182658. #else
  182659. "adc r3, %[r]\n\t"
  182660. #endif
  182661. "# A[7] * A[7]\n\t"
  182662. "mov %[a], r9\n\t"
  182663. "ldr r7, [%[a], #28]\n\t"
  182664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182665. "lsrs r6, r7, #16\n\t"
  182666. #else
  182667. "lsr r6, r7, #16\n\t"
  182668. #endif
  182669. "uxth r5, r7\n\t"
  182670. #ifdef WOLFSSL_KEIL
  182671. "muls r5, r5, r5\n\t"
  182672. #elif defined(__clang__)
  182673. "muls r5, r5\n\t"
  182674. #else
  182675. "mul r5, r5\n\t"
  182676. #endif
  182677. #ifdef WOLFSSL_KEIL
  182678. "muls r6, r6, r6\n\t"
  182679. #elif defined(__clang__)
  182680. "muls r6, r6\n\t"
  182681. #else
  182682. "mul r6, r6\n\t"
  182683. #endif
  182684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182685. "adds r4, r4, r5\n\t"
  182686. #else
  182687. "add r4, r4, r5\n\t"
  182688. #endif
  182689. #ifdef WOLFSSL_KEIL
  182690. "adcs r2, r2, r6\n\t"
  182691. #elif defined(__clang__)
  182692. "adcs r2, r6\n\t"
  182693. #else
  182694. "adc r2, r6\n\t"
  182695. #endif
  182696. #ifdef WOLFSSL_KEIL
  182697. "adcs r3, r3, %[r]\n\t"
  182698. #elif defined(__clang__)
  182699. "adcs r3, %[r]\n\t"
  182700. #else
  182701. "adc r3, %[r]\n\t"
  182702. #endif
  182703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182704. "lsrs r6, r7, #16\n\t"
  182705. #else
  182706. "lsr r6, r7, #16\n\t"
  182707. #endif
  182708. "uxth r5, r7\n\t"
  182709. #ifdef WOLFSSL_KEIL
  182710. "muls r5, r6, r5\n\t"
  182711. #elif defined(__clang__)
  182712. "muls r5, r6\n\t"
  182713. #else
  182714. "mul r5, r6\n\t"
  182715. #endif
  182716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182717. "lsrs r6, r5, #15\n\t"
  182718. #else
  182719. "lsr r6, r5, #15\n\t"
  182720. #endif
  182721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182722. "lsls r5, r5, #17\n\t"
  182723. #else
  182724. "lsl r5, r5, #17\n\t"
  182725. #endif
  182726. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182727. "adds r4, r4, r5\n\t"
  182728. #else
  182729. "add r4, r4, r5\n\t"
  182730. #endif
  182731. #ifdef WOLFSSL_KEIL
  182732. "adcs r2, r2, r6\n\t"
  182733. #elif defined(__clang__)
  182734. "adcs r2, r6\n\t"
  182735. #else
  182736. "adc r2, r6\n\t"
  182737. #endif
  182738. #ifdef WOLFSSL_KEIL
  182739. "adcs r3, r3, %[r]\n\t"
  182740. #elif defined(__clang__)
  182741. "adcs r3, %[r]\n\t"
  182742. #else
  182743. "adc r3, %[r]\n\t"
  182744. #endif
  182745. "str r4, [sp, #56]\n\t"
  182746. "# A[8] * A[7]\n\t"
  182747. "movs r4, #0\n\t"
  182748. "ldr %[a], [%[a], #32]\n\t"
  182749. "uxth r5, %[a]\n\t"
  182750. "uxth r6, r7\n\t"
  182751. #ifdef WOLFSSL_KEIL
  182752. "muls r6, r5, r6\n\t"
  182753. #elif defined(__clang__)
  182754. "muls r6, r5\n\t"
  182755. #else
  182756. "mul r6, r5\n\t"
  182757. #endif
  182758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182759. "adds r2, r2, r6\n\t"
  182760. #else
  182761. "add r2, r2, r6\n\t"
  182762. #endif
  182763. #ifdef WOLFSSL_KEIL
  182764. "adcs r3, r3, %[r]\n\t"
  182765. #elif defined(__clang__)
  182766. "adcs r3, %[r]\n\t"
  182767. #else
  182768. "adc r3, %[r]\n\t"
  182769. #endif
  182770. #ifdef WOLFSSL_KEIL
  182771. "adcs r4, r4, %[r]\n\t"
  182772. #elif defined(__clang__)
  182773. "adcs r4, %[r]\n\t"
  182774. #else
  182775. "adc r4, %[r]\n\t"
  182776. #endif
  182777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182778. "adds r2, r2, r6\n\t"
  182779. #else
  182780. "add r2, r2, r6\n\t"
  182781. #endif
  182782. #ifdef WOLFSSL_KEIL
  182783. "adcs r3, r3, %[r]\n\t"
  182784. #elif defined(__clang__)
  182785. "adcs r3, %[r]\n\t"
  182786. #else
  182787. "adc r3, %[r]\n\t"
  182788. #endif
  182789. #ifdef WOLFSSL_KEIL
  182790. "adcs r4, r4, %[r]\n\t"
  182791. #elif defined(__clang__)
  182792. "adcs r4, %[r]\n\t"
  182793. #else
  182794. "adc r4, %[r]\n\t"
  182795. #endif
  182796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182797. "lsrs r6, r7, #16\n\t"
  182798. #else
  182799. "lsr r6, r7, #16\n\t"
  182800. #endif
  182801. #ifdef WOLFSSL_KEIL
  182802. "muls r5, r6, r5\n\t"
  182803. #elif defined(__clang__)
  182804. "muls r5, r6\n\t"
  182805. #else
  182806. "mul r5, r6\n\t"
  182807. #endif
  182808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182809. "lsrs r6, r5, #16\n\t"
  182810. #else
  182811. "lsr r6, r5, #16\n\t"
  182812. #endif
  182813. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182814. "lsls r5, r5, #16\n\t"
  182815. #else
  182816. "lsl r5, r5, #16\n\t"
  182817. #endif
  182818. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182819. "adds r2, r2, r5\n\t"
  182820. #else
  182821. "add r2, r2, r5\n\t"
  182822. #endif
  182823. #ifdef WOLFSSL_KEIL
  182824. "adcs r3, r3, r6\n\t"
  182825. #elif defined(__clang__)
  182826. "adcs r3, r6\n\t"
  182827. #else
  182828. "adc r3, r6\n\t"
  182829. #endif
  182830. #ifdef WOLFSSL_KEIL
  182831. "adcs r4, r4, %[r]\n\t"
  182832. #elif defined(__clang__)
  182833. "adcs r4, %[r]\n\t"
  182834. #else
  182835. "adc r4, %[r]\n\t"
  182836. #endif
  182837. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182838. "adds r2, r2, r5\n\t"
  182839. #else
  182840. "add r2, r2, r5\n\t"
  182841. #endif
  182842. #ifdef WOLFSSL_KEIL
  182843. "adcs r3, r3, r6\n\t"
  182844. #elif defined(__clang__)
  182845. "adcs r3, r6\n\t"
  182846. #else
  182847. "adc r3, r6\n\t"
  182848. #endif
  182849. #ifdef WOLFSSL_KEIL
  182850. "adcs r4, r4, %[r]\n\t"
  182851. #elif defined(__clang__)
  182852. "adcs r4, %[r]\n\t"
  182853. #else
  182854. "adc r4, %[r]\n\t"
  182855. #endif
  182856. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182857. "lsrs r5, %[a], #16\n\t"
  182858. #else
  182859. "lsr r5, %[a], #16\n\t"
  182860. #endif
  182861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182862. "lsrs r6, r7, #16\n\t"
  182863. #else
  182864. "lsr r6, r7, #16\n\t"
  182865. #endif
  182866. #ifdef WOLFSSL_KEIL
  182867. "muls r6, r5, r6\n\t"
  182868. #elif defined(__clang__)
  182869. "muls r6, r5\n\t"
  182870. #else
  182871. "mul r6, r5\n\t"
  182872. #endif
  182873. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182874. "adds r3, r3, r6\n\t"
  182875. #else
  182876. "add r3, r3, r6\n\t"
  182877. #endif
  182878. #ifdef WOLFSSL_KEIL
  182879. "adcs r4, r4, %[r]\n\t"
  182880. #elif defined(__clang__)
  182881. "adcs r4, %[r]\n\t"
  182882. #else
  182883. "adc r4, %[r]\n\t"
  182884. #endif
  182885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182886. "adds r3, r3, r6\n\t"
  182887. #else
  182888. "add r3, r3, r6\n\t"
  182889. #endif
  182890. #ifdef WOLFSSL_KEIL
  182891. "adcs r4, r4, %[r]\n\t"
  182892. #elif defined(__clang__)
  182893. "adcs r4, %[r]\n\t"
  182894. #else
  182895. "adc r4, %[r]\n\t"
  182896. #endif
  182897. "uxth r6, r7\n\t"
  182898. #ifdef WOLFSSL_KEIL
  182899. "muls r5, r6, r5\n\t"
  182900. #elif defined(__clang__)
  182901. "muls r5, r6\n\t"
  182902. #else
  182903. "mul r5, r6\n\t"
  182904. #endif
  182905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182906. "lsrs r6, r5, #16\n\t"
  182907. #else
  182908. "lsr r6, r5, #16\n\t"
  182909. #endif
  182910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182911. "lsls r5, r5, #16\n\t"
  182912. #else
  182913. "lsl r5, r5, #16\n\t"
  182914. #endif
  182915. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182916. "adds r2, r2, r5\n\t"
  182917. #else
  182918. "add r2, r2, r5\n\t"
  182919. #endif
  182920. #ifdef WOLFSSL_KEIL
  182921. "adcs r3, r3, r6\n\t"
  182922. #elif defined(__clang__)
  182923. "adcs r3, r6\n\t"
  182924. #else
  182925. "adc r3, r6\n\t"
  182926. #endif
  182927. #ifdef WOLFSSL_KEIL
  182928. "adcs r4, r4, %[r]\n\t"
  182929. #elif defined(__clang__)
  182930. "adcs r4, %[r]\n\t"
  182931. #else
  182932. "adc r4, %[r]\n\t"
  182933. #endif
  182934. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182935. "adds r2, r2, r5\n\t"
  182936. #else
  182937. "add r2, r2, r5\n\t"
  182938. #endif
  182939. #ifdef WOLFSSL_KEIL
  182940. "adcs r3, r3, r6\n\t"
  182941. #elif defined(__clang__)
  182942. "adcs r3, r6\n\t"
  182943. #else
  182944. "adc r3, r6\n\t"
  182945. #endif
  182946. #ifdef WOLFSSL_KEIL
  182947. "adcs r4, r4, %[r]\n\t"
  182948. #elif defined(__clang__)
  182949. "adcs r4, %[r]\n\t"
  182950. #else
  182951. "adc r4, %[r]\n\t"
  182952. #endif
  182953. "# A[9] * A[6]\n\t"
  182954. "mov %[a], r9\n\t"
  182955. "ldr r7, [%[a], #24]\n\t"
  182956. "ldr %[a], [%[a], #36]\n\t"
  182957. "uxth r5, %[a]\n\t"
  182958. "uxth r6, r7\n\t"
  182959. #ifdef WOLFSSL_KEIL
  182960. "muls r6, r5, r6\n\t"
  182961. #elif defined(__clang__)
  182962. "muls r6, r5\n\t"
  182963. #else
  182964. "mul r6, r5\n\t"
  182965. #endif
  182966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182967. "adds r2, r2, r6\n\t"
  182968. #else
  182969. "add r2, r2, r6\n\t"
  182970. #endif
  182971. #ifdef WOLFSSL_KEIL
  182972. "adcs r3, r3, %[r]\n\t"
  182973. #elif defined(__clang__)
  182974. "adcs r3, %[r]\n\t"
  182975. #else
  182976. "adc r3, %[r]\n\t"
  182977. #endif
  182978. #ifdef WOLFSSL_KEIL
  182979. "adcs r4, r4, %[r]\n\t"
  182980. #elif defined(__clang__)
  182981. "adcs r4, %[r]\n\t"
  182982. #else
  182983. "adc r4, %[r]\n\t"
  182984. #endif
  182985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  182986. "adds r2, r2, r6\n\t"
  182987. #else
  182988. "add r2, r2, r6\n\t"
  182989. #endif
  182990. #ifdef WOLFSSL_KEIL
  182991. "adcs r3, r3, %[r]\n\t"
  182992. #elif defined(__clang__)
  182993. "adcs r3, %[r]\n\t"
  182994. #else
  182995. "adc r3, %[r]\n\t"
  182996. #endif
  182997. #ifdef WOLFSSL_KEIL
  182998. "adcs r4, r4, %[r]\n\t"
  182999. #elif defined(__clang__)
  183000. "adcs r4, %[r]\n\t"
  183001. #else
  183002. "adc r4, %[r]\n\t"
  183003. #endif
  183004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183005. "lsrs r6, r7, #16\n\t"
  183006. #else
  183007. "lsr r6, r7, #16\n\t"
  183008. #endif
  183009. #ifdef WOLFSSL_KEIL
  183010. "muls r5, r6, r5\n\t"
  183011. #elif defined(__clang__)
  183012. "muls r5, r6\n\t"
  183013. #else
  183014. "mul r5, r6\n\t"
  183015. #endif
  183016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183017. "lsrs r6, r5, #16\n\t"
  183018. #else
  183019. "lsr r6, r5, #16\n\t"
  183020. #endif
  183021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183022. "lsls r5, r5, #16\n\t"
  183023. #else
  183024. "lsl r5, r5, #16\n\t"
  183025. #endif
  183026. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183027. "adds r2, r2, r5\n\t"
  183028. #else
  183029. "add r2, r2, r5\n\t"
  183030. #endif
  183031. #ifdef WOLFSSL_KEIL
  183032. "adcs r3, r3, r6\n\t"
  183033. #elif defined(__clang__)
  183034. "adcs r3, r6\n\t"
  183035. #else
  183036. "adc r3, r6\n\t"
  183037. #endif
  183038. #ifdef WOLFSSL_KEIL
  183039. "adcs r4, r4, %[r]\n\t"
  183040. #elif defined(__clang__)
  183041. "adcs r4, %[r]\n\t"
  183042. #else
  183043. "adc r4, %[r]\n\t"
  183044. #endif
  183045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183046. "adds r2, r2, r5\n\t"
  183047. #else
  183048. "add r2, r2, r5\n\t"
  183049. #endif
  183050. #ifdef WOLFSSL_KEIL
  183051. "adcs r3, r3, r6\n\t"
  183052. #elif defined(__clang__)
  183053. "adcs r3, r6\n\t"
  183054. #else
  183055. "adc r3, r6\n\t"
  183056. #endif
  183057. #ifdef WOLFSSL_KEIL
  183058. "adcs r4, r4, %[r]\n\t"
  183059. #elif defined(__clang__)
  183060. "adcs r4, %[r]\n\t"
  183061. #else
  183062. "adc r4, %[r]\n\t"
  183063. #endif
  183064. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183065. "lsrs r5, %[a], #16\n\t"
  183066. #else
  183067. "lsr r5, %[a], #16\n\t"
  183068. #endif
  183069. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183070. "lsrs r6, r7, #16\n\t"
  183071. #else
  183072. "lsr r6, r7, #16\n\t"
  183073. #endif
  183074. #ifdef WOLFSSL_KEIL
  183075. "muls r6, r5, r6\n\t"
  183076. #elif defined(__clang__)
  183077. "muls r6, r5\n\t"
  183078. #else
  183079. "mul r6, r5\n\t"
  183080. #endif
  183081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183082. "adds r3, r3, r6\n\t"
  183083. #else
  183084. "add r3, r3, r6\n\t"
  183085. #endif
  183086. #ifdef WOLFSSL_KEIL
  183087. "adcs r4, r4, %[r]\n\t"
  183088. #elif defined(__clang__)
  183089. "adcs r4, %[r]\n\t"
  183090. #else
  183091. "adc r4, %[r]\n\t"
  183092. #endif
  183093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183094. "adds r3, r3, r6\n\t"
  183095. #else
  183096. "add r3, r3, r6\n\t"
  183097. #endif
  183098. #ifdef WOLFSSL_KEIL
  183099. "adcs r4, r4, %[r]\n\t"
  183100. #elif defined(__clang__)
  183101. "adcs r4, %[r]\n\t"
  183102. #else
  183103. "adc r4, %[r]\n\t"
  183104. #endif
  183105. "uxth r6, r7\n\t"
  183106. #ifdef WOLFSSL_KEIL
  183107. "muls r5, r6, r5\n\t"
  183108. #elif defined(__clang__)
  183109. "muls r5, r6\n\t"
  183110. #else
  183111. "mul r5, r6\n\t"
  183112. #endif
  183113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183114. "lsrs r6, r5, #16\n\t"
  183115. #else
  183116. "lsr r6, r5, #16\n\t"
  183117. #endif
  183118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183119. "lsls r5, r5, #16\n\t"
  183120. #else
  183121. "lsl r5, r5, #16\n\t"
  183122. #endif
  183123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183124. "adds r2, r2, r5\n\t"
  183125. #else
  183126. "add r2, r2, r5\n\t"
  183127. #endif
  183128. #ifdef WOLFSSL_KEIL
  183129. "adcs r3, r3, r6\n\t"
  183130. #elif defined(__clang__)
  183131. "adcs r3, r6\n\t"
  183132. #else
  183133. "adc r3, r6\n\t"
  183134. #endif
  183135. #ifdef WOLFSSL_KEIL
  183136. "adcs r4, r4, %[r]\n\t"
  183137. #elif defined(__clang__)
  183138. "adcs r4, %[r]\n\t"
  183139. #else
  183140. "adc r4, %[r]\n\t"
  183141. #endif
  183142. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183143. "adds r2, r2, r5\n\t"
  183144. #else
  183145. "add r2, r2, r5\n\t"
  183146. #endif
  183147. #ifdef WOLFSSL_KEIL
  183148. "adcs r3, r3, r6\n\t"
  183149. #elif defined(__clang__)
  183150. "adcs r3, r6\n\t"
  183151. #else
  183152. "adc r3, r6\n\t"
  183153. #endif
  183154. #ifdef WOLFSSL_KEIL
  183155. "adcs r4, r4, %[r]\n\t"
  183156. #elif defined(__clang__)
  183157. "adcs r4, %[r]\n\t"
  183158. #else
  183159. "adc r4, %[r]\n\t"
  183160. #endif
  183161. "# A[10] * A[5]\n\t"
  183162. "mov %[a], r9\n\t"
  183163. "ldr r7, [%[a], #20]\n\t"
  183164. "ldr %[a], [%[a], #40]\n\t"
  183165. "uxth r5, %[a]\n\t"
  183166. "uxth r6, r7\n\t"
  183167. #ifdef WOLFSSL_KEIL
  183168. "muls r6, r5, r6\n\t"
  183169. #elif defined(__clang__)
  183170. "muls r6, r5\n\t"
  183171. #else
  183172. "mul r6, r5\n\t"
  183173. #endif
  183174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183175. "adds r2, r2, r6\n\t"
  183176. #else
  183177. "add r2, r2, r6\n\t"
  183178. #endif
  183179. #ifdef WOLFSSL_KEIL
  183180. "adcs r3, r3, %[r]\n\t"
  183181. #elif defined(__clang__)
  183182. "adcs r3, %[r]\n\t"
  183183. #else
  183184. "adc r3, %[r]\n\t"
  183185. #endif
  183186. #ifdef WOLFSSL_KEIL
  183187. "adcs r4, r4, %[r]\n\t"
  183188. #elif defined(__clang__)
  183189. "adcs r4, %[r]\n\t"
  183190. #else
  183191. "adc r4, %[r]\n\t"
  183192. #endif
  183193. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183194. "adds r2, r2, r6\n\t"
  183195. #else
  183196. "add r2, r2, r6\n\t"
  183197. #endif
  183198. #ifdef WOLFSSL_KEIL
  183199. "adcs r3, r3, %[r]\n\t"
  183200. #elif defined(__clang__)
  183201. "adcs r3, %[r]\n\t"
  183202. #else
  183203. "adc r3, %[r]\n\t"
  183204. #endif
  183205. #ifdef WOLFSSL_KEIL
  183206. "adcs r4, r4, %[r]\n\t"
  183207. #elif defined(__clang__)
  183208. "adcs r4, %[r]\n\t"
  183209. #else
  183210. "adc r4, %[r]\n\t"
  183211. #endif
  183212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183213. "lsrs r6, r7, #16\n\t"
  183214. #else
  183215. "lsr r6, r7, #16\n\t"
  183216. #endif
  183217. #ifdef WOLFSSL_KEIL
  183218. "muls r5, r6, r5\n\t"
  183219. #elif defined(__clang__)
  183220. "muls r5, r6\n\t"
  183221. #else
  183222. "mul r5, r6\n\t"
  183223. #endif
  183224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183225. "lsrs r6, r5, #16\n\t"
  183226. #else
  183227. "lsr r6, r5, #16\n\t"
  183228. #endif
  183229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183230. "lsls r5, r5, #16\n\t"
  183231. #else
  183232. "lsl r5, r5, #16\n\t"
  183233. #endif
  183234. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183235. "adds r2, r2, r5\n\t"
  183236. #else
  183237. "add r2, r2, r5\n\t"
  183238. #endif
  183239. #ifdef WOLFSSL_KEIL
  183240. "adcs r3, r3, r6\n\t"
  183241. #elif defined(__clang__)
  183242. "adcs r3, r6\n\t"
  183243. #else
  183244. "adc r3, r6\n\t"
  183245. #endif
  183246. #ifdef WOLFSSL_KEIL
  183247. "adcs r4, r4, %[r]\n\t"
  183248. #elif defined(__clang__)
  183249. "adcs r4, %[r]\n\t"
  183250. #else
  183251. "adc r4, %[r]\n\t"
  183252. #endif
  183253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183254. "adds r2, r2, r5\n\t"
  183255. #else
  183256. "add r2, r2, r5\n\t"
  183257. #endif
  183258. #ifdef WOLFSSL_KEIL
  183259. "adcs r3, r3, r6\n\t"
  183260. #elif defined(__clang__)
  183261. "adcs r3, r6\n\t"
  183262. #else
  183263. "adc r3, r6\n\t"
  183264. #endif
  183265. #ifdef WOLFSSL_KEIL
  183266. "adcs r4, r4, %[r]\n\t"
  183267. #elif defined(__clang__)
  183268. "adcs r4, %[r]\n\t"
  183269. #else
  183270. "adc r4, %[r]\n\t"
  183271. #endif
  183272. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183273. "lsrs r5, %[a], #16\n\t"
  183274. #else
  183275. "lsr r5, %[a], #16\n\t"
  183276. #endif
  183277. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183278. "lsrs r6, r7, #16\n\t"
  183279. #else
  183280. "lsr r6, r7, #16\n\t"
  183281. #endif
  183282. #ifdef WOLFSSL_KEIL
  183283. "muls r6, r5, r6\n\t"
  183284. #elif defined(__clang__)
  183285. "muls r6, r5\n\t"
  183286. #else
  183287. "mul r6, r5\n\t"
  183288. #endif
  183289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183290. "adds r3, r3, r6\n\t"
  183291. #else
  183292. "add r3, 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 r3, r3, r6\n\t"
  183303. #else
  183304. "add r3, r3, r6\n\t"
  183305. #endif
  183306. #ifdef WOLFSSL_KEIL
  183307. "adcs r4, r4, %[r]\n\t"
  183308. #elif defined(__clang__)
  183309. "adcs r4, %[r]\n\t"
  183310. #else
  183311. "adc r4, %[r]\n\t"
  183312. #endif
  183313. "uxth r6, r7\n\t"
  183314. #ifdef WOLFSSL_KEIL
  183315. "muls r5, r6, r5\n\t"
  183316. #elif defined(__clang__)
  183317. "muls r5, r6\n\t"
  183318. #else
  183319. "mul r5, r6\n\t"
  183320. #endif
  183321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183322. "lsrs r6, r5, #16\n\t"
  183323. #else
  183324. "lsr r6, r5, #16\n\t"
  183325. #endif
  183326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183327. "lsls r5, r5, #16\n\t"
  183328. #else
  183329. "lsl r5, r5, #16\n\t"
  183330. #endif
  183331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183332. "adds r2, r2, r5\n\t"
  183333. #else
  183334. "add r2, r2, r5\n\t"
  183335. #endif
  183336. #ifdef WOLFSSL_KEIL
  183337. "adcs r3, r3, r6\n\t"
  183338. #elif defined(__clang__)
  183339. "adcs r3, r6\n\t"
  183340. #else
  183341. "adc r3, r6\n\t"
  183342. #endif
  183343. #ifdef WOLFSSL_KEIL
  183344. "adcs r4, r4, %[r]\n\t"
  183345. #elif defined(__clang__)
  183346. "adcs r4, %[r]\n\t"
  183347. #else
  183348. "adc r4, %[r]\n\t"
  183349. #endif
  183350. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183351. "adds r2, r2, r5\n\t"
  183352. #else
  183353. "add r2, r2, r5\n\t"
  183354. #endif
  183355. #ifdef WOLFSSL_KEIL
  183356. "adcs r3, r3, r6\n\t"
  183357. #elif defined(__clang__)
  183358. "adcs r3, r6\n\t"
  183359. #else
  183360. "adc r3, r6\n\t"
  183361. #endif
  183362. #ifdef WOLFSSL_KEIL
  183363. "adcs r4, r4, %[r]\n\t"
  183364. #elif defined(__clang__)
  183365. "adcs r4, %[r]\n\t"
  183366. #else
  183367. "adc r4, %[r]\n\t"
  183368. #endif
  183369. "# A[11] * A[4]\n\t"
  183370. "mov %[a], r9\n\t"
  183371. "ldr r7, [%[a], #16]\n\t"
  183372. "ldr %[a], [%[a], #44]\n\t"
  183373. "uxth r5, %[a]\n\t"
  183374. "uxth r6, r7\n\t"
  183375. #ifdef WOLFSSL_KEIL
  183376. "muls r6, r5, r6\n\t"
  183377. #elif defined(__clang__)
  183378. "muls r6, r5\n\t"
  183379. #else
  183380. "mul r6, r5\n\t"
  183381. #endif
  183382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183383. "adds r2, r2, r6\n\t"
  183384. #else
  183385. "add r2, r2, r6\n\t"
  183386. #endif
  183387. #ifdef WOLFSSL_KEIL
  183388. "adcs r3, r3, %[r]\n\t"
  183389. #elif defined(__clang__)
  183390. "adcs r3, %[r]\n\t"
  183391. #else
  183392. "adc r3, %[r]\n\t"
  183393. #endif
  183394. #ifdef WOLFSSL_KEIL
  183395. "adcs r4, r4, %[r]\n\t"
  183396. #elif defined(__clang__)
  183397. "adcs r4, %[r]\n\t"
  183398. #else
  183399. "adc r4, %[r]\n\t"
  183400. #endif
  183401. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183402. "adds r2, r2, r6\n\t"
  183403. #else
  183404. "add r2, r2, r6\n\t"
  183405. #endif
  183406. #ifdef WOLFSSL_KEIL
  183407. "adcs r3, r3, %[r]\n\t"
  183408. #elif defined(__clang__)
  183409. "adcs r3, %[r]\n\t"
  183410. #else
  183411. "adc r3, %[r]\n\t"
  183412. #endif
  183413. #ifdef WOLFSSL_KEIL
  183414. "adcs r4, r4, %[r]\n\t"
  183415. #elif defined(__clang__)
  183416. "adcs r4, %[r]\n\t"
  183417. #else
  183418. "adc r4, %[r]\n\t"
  183419. #endif
  183420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183421. "lsrs r6, r7, #16\n\t"
  183422. #else
  183423. "lsr r6, r7, #16\n\t"
  183424. #endif
  183425. #ifdef WOLFSSL_KEIL
  183426. "muls r5, r6, r5\n\t"
  183427. #elif defined(__clang__)
  183428. "muls r5, r6\n\t"
  183429. #else
  183430. "mul r5, r6\n\t"
  183431. #endif
  183432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183433. "lsrs r6, r5, #16\n\t"
  183434. #else
  183435. "lsr r6, r5, #16\n\t"
  183436. #endif
  183437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183438. "lsls r5, r5, #16\n\t"
  183439. #else
  183440. "lsl r5, r5, #16\n\t"
  183441. #endif
  183442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183443. "adds r2, r2, r5\n\t"
  183444. #else
  183445. "add r2, r2, r5\n\t"
  183446. #endif
  183447. #ifdef WOLFSSL_KEIL
  183448. "adcs r3, r3, r6\n\t"
  183449. #elif defined(__clang__)
  183450. "adcs r3, r6\n\t"
  183451. #else
  183452. "adc r3, r6\n\t"
  183453. #endif
  183454. #ifdef WOLFSSL_KEIL
  183455. "adcs r4, r4, %[r]\n\t"
  183456. #elif defined(__clang__)
  183457. "adcs r4, %[r]\n\t"
  183458. #else
  183459. "adc r4, %[r]\n\t"
  183460. #endif
  183461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183462. "adds r2, r2, r5\n\t"
  183463. #else
  183464. "add r2, r2, r5\n\t"
  183465. #endif
  183466. #ifdef WOLFSSL_KEIL
  183467. "adcs r3, r3, r6\n\t"
  183468. #elif defined(__clang__)
  183469. "adcs r3, r6\n\t"
  183470. #else
  183471. "adc r3, r6\n\t"
  183472. #endif
  183473. #ifdef WOLFSSL_KEIL
  183474. "adcs r4, r4, %[r]\n\t"
  183475. #elif defined(__clang__)
  183476. "adcs r4, %[r]\n\t"
  183477. #else
  183478. "adc r4, %[r]\n\t"
  183479. #endif
  183480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183481. "lsrs r5, %[a], #16\n\t"
  183482. #else
  183483. "lsr r5, %[a], #16\n\t"
  183484. #endif
  183485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183486. "lsrs r6, r7, #16\n\t"
  183487. #else
  183488. "lsr r6, r7, #16\n\t"
  183489. #endif
  183490. #ifdef WOLFSSL_KEIL
  183491. "muls r6, r5, r6\n\t"
  183492. #elif defined(__clang__)
  183493. "muls r6, r5\n\t"
  183494. #else
  183495. "mul r6, r5\n\t"
  183496. #endif
  183497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183498. "adds r3, r3, r6\n\t"
  183499. #else
  183500. "add r3, 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 r3, r3, r6\n\t"
  183511. #else
  183512. "add r3, r3, r6\n\t"
  183513. #endif
  183514. #ifdef WOLFSSL_KEIL
  183515. "adcs r4, r4, %[r]\n\t"
  183516. #elif defined(__clang__)
  183517. "adcs r4, %[r]\n\t"
  183518. #else
  183519. "adc r4, %[r]\n\t"
  183520. #endif
  183521. "uxth r6, r7\n\t"
  183522. #ifdef WOLFSSL_KEIL
  183523. "muls r5, r6, r5\n\t"
  183524. #elif defined(__clang__)
  183525. "muls r5, r6\n\t"
  183526. #else
  183527. "mul r5, r6\n\t"
  183528. #endif
  183529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183530. "lsrs r6, r5, #16\n\t"
  183531. #else
  183532. "lsr r6, r5, #16\n\t"
  183533. #endif
  183534. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183535. "lsls r5, r5, #16\n\t"
  183536. #else
  183537. "lsl r5, r5, #16\n\t"
  183538. #endif
  183539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183540. "adds r2, r2, r5\n\t"
  183541. #else
  183542. "add r2, r2, r5\n\t"
  183543. #endif
  183544. #ifdef WOLFSSL_KEIL
  183545. "adcs r3, r3, r6\n\t"
  183546. #elif defined(__clang__)
  183547. "adcs r3, r6\n\t"
  183548. #else
  183549. "adc r3, r6\n\t"
  183550. #endif
  183551. #ifdef WOLFSSL_KEIL
  183552. "adcs r4, r4, %[r]\n\t"
  183553. #elif defined(__clang__)
  183554. "adcs r4, %[r]\n\t"
  183555. #else
  183556. "adc r4, %[r]\n\t"
  183557. #endif
  183558. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183559. "adds r2, r2, r5\n\t"
  183560. #else
  183561. "add r2, r2, r5\n\t"
  183562. #endif
  183563. #ifdef WOLFSSL_KEIL
  183564. "adcs r3, r3, r6\n\t"
  183565. #elif defined(__clang__)
  183566. "adcs r3, r6\n\t"
  183567. #else
  183568. "adc r3, r6\n\t"
  183569. #endif
  183570. #ifdef WOLFSSL_KEIL
  183571. "adcs r4, r4, %[r]\n\t"
  183572. #elif defined(__clang__)
  183573. "adcs r4, %[r]\n\t"
  183574. #else
  183575. "adc r4, %[r]\n\t"
  183576. #endif
  183577. "# A[12] * A[3]\n\t"
  183578. "mov %[a], r9\n\t"
  183579. "mov r7, lr\n\t"
  183580. "ldr %[a], [%[a], #48]\n\t"
  183581. "uxth r5, %[a]\n\t"
  183582. "uxth r6, r7\n\t"
  183583. #ifdef WOLFSSL_KEIL
  183584. "muls r6, r5, r6\n\t"
  183585. #elif defined(__clang__)
  183586. "muls r6, r5\n\t"
  183587. #else
  183588. "mul r6, r5\n\t"
  183589. #endif
  183590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183591. "adds r2, r2, r6\n\t"
  183592. #else
  183593. "add r2, r2, r6\n\t"
  183594. #endif
  183595. #ifdef WOLFSSL_KEIL
  183596. "adcs r3, r3, %[r]\n\t"
  183597. #elif defined(__clang__)
  183598. "adcs r3, %[r]\n\t"
  183599. #else
  183600. "adc r3, %[r]\n\t"
  183601. #endif
  183602. #ifdef WOLFSSL_KEIL
  183603. "adcs r4, r4, %[r]\n\t"
  183604. #elif defined(__clang__)
  183605. "adcs r4, %[r]\n\t"
  183606. #else
  183607. "adc r4, %[r]\n\t"
  183608. #endif
  183609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183610. "adds r2, r2, r6\n\t"
  183611. #else
  183612. "add r2, r2, r6\n\t"
  183613. #endif
  183614. #ifdef WOLFSSL_KEIL
  183615. "adcs r3, r3, %[r]\n\t"
  183616. #elif defined(__clang__)
  183617. "adcs r3, %[r]\n\t"
  183618. #else
  183619. "adc r3, %[r]\n\t"
  183620. #endif
  183621. #ifdef WOLFSSL_KEIL
  183622. "adcs r4, r4, %[r]\n\t"
  183623. #elif defined(__clang__)
  183624. "adcs r4, %[r]\n\t"
  183625. #else
  183626. "adc r4, %[r]\n\t"
  183627. #endif
  183628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183629. "lsrs r6, r7, #16\n\t"
  183630. #else
  183631. "lsr r6, r7, #16\n\t"
  183632. #endif
  183633. #ifdef WOLFSSL_KEIL
  183634. "muls r5, r6, r5\n\t"
  183635. #elif defined(__clang__)
  183636. "muls r5, r6\n\t"
  183637. #else
  183638. "mul r5, r6\n\t"
  183639. #endif
  183640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183641. "lsrs r6, r5, #16\n\t"
  183642. #else
  183643. "lsr r6, r5, #16\n\t"
  183644. #endif
  183645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183646. "lsls r5, r5, #16\n\t"
  183647. #else
  183648. "lsl r5, r5, #16\n\t"
  183649. #endif
  183650. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183651. "adds r2, r2, r5\n\t"
  183652. #else
  183653. "add r2, r2, r5\n\t"
  183654. #endif
  183655. #ifdef WOLFSSL_KEIL
  183656. "adcs r3, r3, r6\n\t"
  183657. #elif defined(__clang__)
  183658. "adcs r3, r6\n\t"
  183659. #else
  183660. "adc r3, r6\n\t"
  183661. #endif
  183662. #ifdef WOLFSSL_KEIL
  183663. "adcs r4, r4, %[r]\n\t"
  183664. #elif defined(__clang__)
  183665. "adcs r4, %[r]\n\t"
  183666. #else
  183667. "adc r4, %[r]\n\t"
  183668. #endif
  183669. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183670. "adds r2, r2, r5\n\t"
  183671. #else
  183672. "add r2, r2, r5\n\t"
  183673. #endif
  183674. #ifdef WOLFSSL_KEIL
  183675. "adcs r3, r3, r6\n\t"
  183676. #elif defined(__clang__)
  183677. "adcs r3, r6\n\t"
  183678. #else
  183679. "adc r3, r6\n\t"
  183680. #endif
  183681. #ifdef WOLFSSL_KEIL
  183682. "adcs r4, r4, %[r]\n\t"
  183683. #elif defined(__clang__)
  183684. "adcs r4, %[r]\n\t"
  183685. #else
  183686. "adc r4, %[r]\n\t"
  183687. #endif
  183688. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183689. "lsrs r5, %[a], #16\n\t"
  183690. #else
  183691. "lsr r5, %[a], #16\n\t"
  183692. #endif
  183693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183694. "lsrs r6, r7, #16\n\t"
  183695. #else
  183696. "lsr r6, r7, #16\n\t"
  183697. #endif
  183698. #ifdef WOLFSSL_KEIL
  183699. "muls r6, r5, r6\n\t"
  183700. #elif defined(__clang__)
  183701. "muls r6, r5\n\t"
  183702. #else
  183703. "mul r6, r5\n\t"
  183704. #endif
  183705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183706. "adds r3, r3, r6\n\t"
  183707. #else
  183708. "add r3, 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 r3, r3, r6\n\t"
  183719. #else
  183720. "add r3, r3, r6\n\t"
  183721. #endif
  183722. #ifdef WOLFSSL_KEIL
  183723. "adcs r4, r4, %[r]\n\t"
  183724. #elif defined(__clang__)
  183725. "adcs r4, %[r]\n\t"
  183726. #else
  183727. "adc r4, %[r]\n\t"
  183728. #endif
  183729. "uxth r6, r7\n\t"
  183730. #ifdef WOLFSSL_KEIL
  183731. "muls r5, r6, r5\n\t"
  183732. #elif defined(__clang__)
  183733. "muls r5, r6\n\t"
  183734. #else
  183735. "mul r5, r6\n\t"
  183736. #endif
  183737. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183738. "lsrs r6, r5, #16\n\t"
  183739. #else
  183740. "lsr r6, r5, #16\n\t"
  183741. #endif
  183742. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183743. "lsls r5, r5, #16\n\t"
  183744. #else
  183745. "lsl r5, r5, #16\n\t"
  183746. #endif
  183747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183748. "adds r2, r2, r5\n\t"
  183749. #else
  183750. "add r2, r2, r5\n\t"
  183751. #endif
  183752. #ifdef WOLFSSL_KEIL
  183753. "adcs r3, r3, r6\n\t"
  183754. #elif defined(__clang__)
  183755. "adcs r3, r6\n\t"
  183756. #else
  183757. "adc r3, r6\n\t"
  183758. #endif
  183759. #ifdef WOLFSSL_KEIL
  183760. "adcs r4, r4, %[r]\n\t"
  183761. #elif defined(__clang__)
  183762. "adcs r4, %[r]\n\t"
  183763. #else
  183764. "adc r4, %[r]\n\t"
  183765. #endif
  183766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183767. "adds r2, r2, r5\n\t"
  183768. #else
  183769. "add r2, r2, r5\n\t"
  183770. #endif
  183771. #ifdef WOLFSSL_KEIL
  183772. "adcs r3, r3, r6\n\t"
  183773. #elif defined(__clang__)
  183774. "adcs r3, r6\n\t"
  183775. #else
  183776. "adc r3, r6\n\t"
  183777. #endif
  183778. #ifdef WOLFSSL_KEIL
  183779. "adcs r4, r4, %[r]\n\t"
  183780. #elif defined(__clang__)
  183781. "adcs r4, %[r]\n\t"
  183782. #else
  183783. "adc r4, %[r]\n\t"
  183784. #endif
  183785. "# A[13] * A[2]\n\t"
  183786. "mov %[a], r9\n\t"
  183787. "mov r7, r12\n\t"
  183788. "ldr %[a], [%[a], #52]\n\t"
  183789. "uxth r5, %[a]\n\t"
  183790. "uxth r6, r7\n\t"
  183791. #ifdef WOLFSSL_KEIL
  183792. "muls r6, r5, r6\n\t"
  183793. #elif defined(__clang__)
  183794. "muls r6, r5\n\t"
  183795. #else
  183796. "mul r6, r5\n\t"
  183797. #endif
  183798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183799. "adds r2, r2, r6\n\t"
  183800. #else
  183801. "add r2, r2, r6\n\t"
  183802. #endif
  183803. #ifdef WOLFSSL_KEIL
  183804. "adcs r3, r3, %[r]\n\t"
  183805. #elif defined(__clang__)
  183806. "adcs r3, %[r]\n\t"
  183807. #else
  183808. "adc r3, %[r]\n\t"
  183809. #endif
  183810. #ifdef WOLFSSL_KEIL
  183811. "adcs r4, r4, %[r]\n\t"
  183812. #elif defined(__clang__)
  183813. "adcs r4, %[r]\n\t"
  183814. #else
  183815. "adc r4, %[r]\n\t"
  183816. #endif
  183817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183818. "adds r2, r2, r6\n\t"
  183819. #else
  183820. "add r2, r2, r6\n\t"
  183821. #endif
  183822. #ifdef WOLFSSL_KEIL
  183823. "adcs r3, r3, %[r]\n\t"
  183824. #elif defined(__clang__)
  183825. "adcs r3, %[r]\n\t"
  183826. #else
  183827. "adc r3, %[r]\n\t"
  183828. #endif
  183829. #ifdef WOLFSSL_KEIL
  183830. "adcs r4, r4, %[r]\n\t"
  183831. #elif defined(__clang__)
  183832. "adcs r4, %[r]\n\t"
  183833. #else
  183834. "adc r4, %[r]\n\t"
  183835. #endif
  183836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183837. "lsrs r6, r7, #16\n\t"
  183838. #else
  183839. "lsr r6, r7, #16\n\t"
  183840. #endif
  183841. #ifdef WOLFSSL_KEIL
  183842. "muls r5, r6, r5\n\t"
  183843. #elif defined(__clang__)
  183844. "muls r5, r6\n\t"
  183845. #else
  183846. "mul r5, r6\n\t"
  183847. #endif
  183848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183849. "lsrs r6, r5, #16\n\t"
  183850. #else
  183851. "lsr r6, r5, #16\n\t"
  183852. #endif
  183853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183854. "lsls r5, r5, #16\n\t"
  183855. #else
  183856. "lsl r5, r5, #16\n\t"
  183857. #endif
  183858. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183859. "adds r2, r2, r5\n\t"
  183860. #else
  183861. "add r2, r2, r5\n\t"
  183862. #endif
  183863. #ifdef WOLFSSL_KEIL
  183864. "adcs r3, r3, r6\n\t"
  183865. #elif defined(__clang__)
  183866. "adcs r3, r6\n\t"
  183867. #else
  183868. "adc r3, r6\n\t"
  183869. #endif
  183870. #ifdef WOLFSSL_KEIL
  183871. "adcs r4, r4, %[r]\n\t"
  183872. #elif defined(__clang__)
  183873. "adcs r4, %[r]\n\t"
  183874. #else
  183875. "adc r4, %[r]\n\t"
  183876. #endif
  183877. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183878. "adds r2, r2, r5\n\t"
  183879. #else
  183880. "add r2, r2, r5\n\t"
  183881. #endif
  183882. #ifdef WOLFSSL_KEIL
  183883. "adcs r3, r3, r6\n\t"
  183884. #elif defined(__clang__)
  183885. "adcs r3, r6\n\t"
  183886. #else
  183887. "adc r3, r6\n\t"
  183888. #endif
  183889. #ifdef WOLFSSL_KEIL
  183890. "adcs r4, r4, %[r]\n\t"
  183891. #elif defined(__clang__)
  183892. "adcs r4, %[r]\n\t"
  183893. #else
  183894. "adc r4, %[r]\n\t"
  183895. #endif
  183896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183897. "lsrs r5, %[a], #16\n\t"
  183898. #else
  183899. "lsr r5, %[a], #16\n\t"
  183900. #endif
  183901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183902. "lsrs r6, r7, #16\n\t"
  183903. #else
  183904. "lsr r6, r7, #16\n\t"
  183905. #endif
  183906. #ifdef WOLFSSL_KEIL
  183907. "muls r6, r5, r6\n\t"
  183908. #elif defined(__clang__)
  183909. "muls r6, r5\n\t"
  183910. #else
  183911. "mul r6, r5\n\t"
  183912. #endif
  183913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183914. "adds r3, r3, r6\n\t"
  183915. #else
  183916. "add r3, 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 r3, r3, r6\n\t"
  183927. #else
  183928. "add r3, r3, r6\n\t"
  183929. #endif
  183930. #ifdef WOLFSSL_KEIL
  183931. "adcs r4, r4, %[r]\n\t"
  183932. #elif defined(__clang__)
  183933. "adcs r4, %[r]\n\t"
  183934. #else
  183935. "adc r4, %[r]\n\t"
  183936. #endif
  183937. "uxth r6, r7\n\t"
  183938. #ifdef WOLFSSL_KEIL
  183939. "muls r5, r6, r5\n\t"
  183940. #elif defined(__clang__)
  183941. "muls r5, r6\n\t"
  183942. #else
  183943. "mul r5, r6\n\t"
  183944. #endif
  183945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183946. "lsrs r6, r5, #16\n\t"
  183947. #else
  183948. "lsr r6, r5, #16\n\t"
  183949. #endif
  183950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183951. "lsls r5, r5, #16\n\t"
  183952. #else
  183953. "lsl r5, r5, #16\n\t"
  183954. #endif
  183955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183956. "adds r2, r2, r5\n\t"
  183957. #else
  183958. "add r2, r2, r5\n\t"
  183959. #endif
  183960. #ifdef WOLFSSL_KEIL
  183961. "adcs r3, r3, r6\n\t"
  183962. #elif defined(__clang__)
  183963. "adcs r3, r6\n\t"
  183964. #else
  183965. "adc r3, r6\n\t"
  183966. #endif
  183967. #ifdef WOLFSSL_KEIL
  183968. "adcs r4, r4, %[r]\n\t"
  183969. #elif defined(__clang__)
  183970. "adcs r4, %[r]\n\t"
  183971. #else
  183972. "adc r4, %[r]\n\t"
  183973. #endif
  183974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  183975. "adds r2, r2, r5\n\t"
  183976. #else
  183977. "add r2, r2, r5\n\t"
  183978. #endif
  183979. #ifdef WOLFSSL_KEIL
  183980. "adcs r3, r3, r6\n\t"
  183981. #elif defined(__clang__)
  183982. "adcs r3, r6\n\t"
  183983. #else
  183984. "adc r3, r6\n\t"
  183985. #endif
  183986. #ifdef WOLFSSL_KEIL
  183987. "adcs r4, r4, %[r]\n\t"
  183988. #elif defined(__clang__)
  183989. "adcs r4, %[r]\n\t"
  183990. #else
  183991. "adc r4, %[r]\n\t"
  183992. #endif
  183993. "# A[14] * A[1]\n\t"
  183994. "mov %[a], r9\n\t"
  183995. "mov r7, r11\n\t"
  183996. "ldr %[a], [%[a], #56]\n\t"
  183997. "uxth r5, %[a]\n\t"
  183998. "uxth r6, r7\n\t"
  183999. #ifdef WOLFSSL_KEIL
  184000. "muls r6, r5, r6\n\t"
  184001. #elif defined(__clang__)
  184002. "muls r6, r5\n\t"
  184003. #else
  184004. "mul r6, r5\n\t"
  184005. #endif
  184006. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184007. "adds r2, r2, r6\n\t"
  184008. #else
  184009. "add r2, r2, r6\n\t"
  184010. #endif
  184011. #ifdef WOLFSSL_KEIL
  184012. "adcs r3, r3, %[r]\n\t"
  184013. #elif defined(__clang__)
  184014. "adcs r3, %[r]\n\t"
  184015. #else
  184016. "adc r3, %[r]\n\t"
  184017. #endif
  184018. #ifdef WOLFSSL_KEIL
  184019. "adcs r4, r4, %[r]\n\t"
  184020. #elif defined(__clang__)
  184021. "adcs r4, %[r]\n\t"
  184022. #else
  184023. "adc r4, %[r]\n\t"
  184024. #endif
  184025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184026. "adds r2, r2, r6\n\t"
  184027. #else
  184028. "add r2, r2, r6\n\t"
  184029. #endif
  184030. #ifdef WOLFSSL_KEIL
  184031. "adcs r3, r3, %[r]\n\t"
  184032. #elif defined(__clang__)
  184033. "adcs r3, %[r]\n\t"
  184034. #else
  184035. "adc r3, %[r]\n\t"
  184036. #endif
  184037. #ifdef WOLFSSL_KEIL
  184038. "adcs r4, r4, %[r]\n\t"
  184039. #elif defined(__clang__)
  184040. "adcs r4, %[r]\n\t"
  184041. #else
  184042. "adc r4, %[r]\n\t"
  184043. #endif
  184044. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184045. "lsrs r6, r7, #16\n\t"
  184046. #else
  184047. "lsr r6, r7, #16\n\t"
  184048. #endif
  184049. #ifdef WOLFSSL_KEIL
  184050. "muls r5, r6, r5\n\t"
  184051. #elif defined(__clang__)
  184052. "muls r5, r6\n\t"
  184053. #else
  184054. "mul r5, r6\n\t"
  184055. #endif
  184056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184057. "lsrs r6, r5, #16\n\t"
  184058. #else
  184059. "lsr r6, r5, #16\n\t"
  184060. #endif
  184061. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184062. "lsls r5, r5, #16\n\t"
  184063. #else
  184064. "lsl r5, r5, #16\n\t"
  184065. #endif
  184066. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184067. "adds r2, r2, r5\n\t"
  184068. #else
  184069. "add r2, r2, r5\n\t"
  184070. #endif
  184071. #ifdef WOLFSSL_KEIL
  184072. "adcs r3, r3, r6\n\t"
  184073. #elif defined(__clang__)
  184074. "adcs r3, r6\n\t"
  184075. #else
  184076. "adc r3, r6\n\t"
  184077. #endif
  184078. #ifdef WOLFSSL_KEIL
  184079. "adcs r4, r4, %[r]\n\t"
  184080. #elif defined(__clang__)
  184081. "adcs r4, %[r]\n\t"
  184082. #else
  184083. "adc r4, %[r]\n\t"
  184084. #endif
  184085. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184086. "adds r2, r2, r5\n\t"
  184087. #else
  184088. "add r2, r2, r5\n\t"
  184089. #endif
  184090. #ifdef WOLFSSL_KEIL
  184091. "adcs r3, r3, r6\n\t"
  184092. #elif defined(__clang__)
  184093. "adcs r3, r6\n\t"
  184094. #else
  184095. "adc r3, r6\n\t"
  184096. #endif
  184097. #ifdef WOLFSSL_KEIL
  184098. "adcs r4, r4, %[r]\n\t"
  184099. #elif defined(__clang__)
  184100. "adcs r4, %[r]\n\t"
  184101. #else
  184102. "adc r4, %[r]\n\t"
  184103. #endif
  184104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184105. "lsrs r5, %[a], #16\n\t"
  184106. #else
  184107. "lsr r5, %[a], #16\n\t"
  184108. #endif
  184109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184110. "lsrs r6, r7, #16\n\t"
  184111. #else
  184112. "lsr r6, r7, #16\n\t"
  184113. #endif
  184114. #ifdef WOLFSSL_KEIL
  184115. "muls r6, r5, r6\n\t"
  184116. #elif defined(__clang__)
  184117. "muls r6, r5\n\t"
  184118. #else
  184119. "mul r6, r5\n\t"
  184120. #endif
  184121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184122. "adds r3, r3, r6\n\t"
  184123. #else
  184124. "add r3, 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 r3, r3, r6\n\t"
  184135. #else
  184136. "add r3, r3, r6\n\t"
  184137. #endif
  184138. #ifdef WOLFSSL_KEIL
  184139. "adcs r4, r4, %[r]\n\t"
  184140. #elif defined(__clang__)
  184141. "adcs r4, %[r]\n\t"
  184142. #else
  184143. "adc r4, %[r]\n\t"
  184144. #endif
  184145. "uxth r6, r7\n\t"
  184146. #ifdef WOLFSSL_KEIL
  184147. "muls r5, r6, r5\n\t"
  184148. #elif defined(__clang__)
  184149. "muls r5, r6\n\t"
  184150. #else
  184151. "mul r5, r6\n\t"
  184152. #endif
  184153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184154. "lsrs r6, r5, #16\n\t"
  184155. #else
  184156. "lsr r6, r5, #16\n\t"
  184157. #endif
  184158. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184159. "lsls r5, r5, #16\n\t"
  184160. #else
  184161. "lsl r5, r5, #16\n\t"
  184162. #endif
  184163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184164. "adds r2, r2, r5\n\t"
  184165. #else
  184166. "add r2, r2, r5\n\t"
  184167. #endif
  184168. #ifdef WOLFSSL_KEIL
  184169. "adcs r3, r3, r6\n\t"
  184170. #elif defined(__clang__)
  184171. "adcs r3, r6\n\t"
  184172. #else
  184173. "adc r3, r6\n\t"
  184174. #endif
  184175. #ifdef WOLFSSL_KEIL
  184176. "adcs r4, r4, %[r]\n\t"
  184177. #elif defined(__clang__)
  184178. "adcs r4, %[r]\n\t"
  184179. #else
  184180. "adc r4, %[r]\n\t"
  184181. #endif
  184182. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184183. "adds r2, r2, r5\n\t"
  184184. #else
  184185. "add r2, r2, r5\n\t"
  184186. #endif
  184187. #ifdef WOLFSSL_KEIL
  184188. "adcs r3, r3, r6\n\t"
  184189. #elif defined(__clang__)
  184190. "adcs r3, r6\n\t"
  184191. #else
  184192. "adc r3, r6\n\t"
  184193. #endif
  184194. #ifdef WOLFSSL_KEIL
  184195. "adcs r4, r4, %[r]\n\t"
  184196. #elif defined(__clang__)
  184197. "adcs r4, %[r]\n\t"
  184198. #else
  184199. "adc r4, %[r]\n\t"
  184200. #endif
  184201. "# A[15] * A[0]\n\t"
  184202. "mov %[a], r9\n\t"
  184203. "mov r7, r10\n\t"
  184204. "ldr %[a], [%[a], #60]\n\t"
  184205. "uxth r5, %[a]\n\t"
  184206. "uxth r6, r7\n\t"
  184207. #ifdef WOLFSSL_KEIL
  184208. "muls r6, r5, r6\n\t"
  184209. #elif defined(__clang__)
  184210. "muls r6, r5\n\t"
  184211. #else
  184212. "mul r6, r5\n\t"
  184213. #endif
  184214. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184215. "adds r2, r2, r6\n\t"
  184216. #else
  184217. "add r2, r2, r6\n\t"
  184218. #endif
  184219. #ifdef WOLFSSL_KEIL
  184220. "adcs r3, r3, %[r]\n\t"
  184221. #elif defined(__clang__)
  184222. "adcs r3, %[r]\n\t"
  184223. #else
  184224. "adc r3, %[r]\n\t"
  184225. #endif
  184226. #ifdef WOLFSSL_KEIL
  184227. "adcs r4, r4, %[r]\n\t"
  184228. #elif defined(__clang__)
  184229. "adcs r4, %[r]\n\t"
  184230. #else
  184231. "adc r4, %[r]\n\t"
  184232. #endif
  184233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184234. "adds r2, r2, r6\n\t"
  184235. #else
  184236. "add r2, r2, r6\n\t"
  184237. #endif
  184238. #ifdef WOLFSSL_KEIL
  184239. "adcs r3, r3, %[r]\n\t"
  184240. #elif defined(__clang__)
  184241. "adcs r3, %[r]\n\t"
  184242. #else
  184243. "adc r3, %[r]\n\t"
  184244. #endif
  184245. #ifdef WOLFSSL_KEIL
  184246. "adcs r4, r4, %[r]\n\t"
  184247. #elif defined(__clang__)
  184248. "adcs r4, %[r]\n\t"
  184249. #else
  184250. "adc r4, %[r]\n\t"
  184251. #endif
  184252. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184253. "lsrs r6, r7, #16\n\t"
  184254. #else
  184255. "lsr r6, r7, #16\n\t"
  184256. #endif
  184257. #ifdef WOLFSSL_KEIL
  184258. "muls r5, r6, r5\n\t"
  184259. #elif defined(__clang__)
  184260. "muls r5, r6\n\t"
  184261. #else
  184262. "mul r5, r6\n\t"
  184263. #endif
  184264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184265. "lsrs r6, r5, #16\n\t"
  184266. #else
  184267. "lsr r6, r5, #16\n\t"
  184268. #endif
  184269. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184270. "lsls r5, r5, #16\n\t"
  184271. #else
  184272. "lsl r5, r5, #16\n\t"
  184273. #endif
  184274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184275. "adds r2, r2, r5\n\t"
  184276. #else
  184277. "add r2, r2, r5\n\t"
  184278. #endif
  184279. #ifdef WOLFSSL_KEIL
  184280. "adcs r3, r3, r6\n\t"
  184281. #elif defined(__clang__)
  184282. "adcs r3, r6\n\t"
  184283. #else
  184284. "adc r3, r6\n\t"
  184285. #endif
  184286. #ifdef WOLFSSL_KEIL
  184287. "adcs r4, r4, %[r]\n\t"
  184288. #elif defined(__clang__)
  184289. "adcs r4, %[r]\n\t"
  184290. #else
  184291. "adc r4, %[r]\n\t"
  184292. #endif
  184293. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184294. "adds r2, r2, r5\n\t"
  184295. #else
  184296. "add r2, r2, r5\n\t"
  184297. #endif
  184298. #ifdef WOLFSSL_KEIL
  184299. "adcs r3, r3, r6\n\t"
  184300. #elif defined(__clang__)
  184301. "adcs r3, r6\n\t"
  184302. #else
  184303. "adc r3, r6\n\t"
  184304. #endif
  184305. #ifdef WOLFSSL_KEIL
  184306. "adcs r4, r4, %[r]\n\t"
  184307. #elif defined(__clang__)
  184308. "adcs r4, %[r]\n\t"
  184309. #else
  184310. "adc r4, %[r]\n\t"
  184311. #endif
  184312. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184313. "lsrs r5, %[a], #16\n\t"
  184314. #else
  184315. "lsr r5, %[a], #16\n\t"
  184316. #endif
  184317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184318. "lsrs r6, r7, #16\n\t"
  184319. #else
  184320. "lsr r6, r7, #16\n\t"
  184321. #endif
  184322. #ifdef WOLFSSL_KEIL
  184323. "muls r6, r5, r6\n\t"
  184324. #elif defined(__clang__)
  184325. "muls r6, r5\n\t"
  184326. #else
  184327. "mul r6, r5\n\t"
  184328. #endif
  184329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184330. "adds r3, r3, r6\n\t"
  184331. #else
  184332. "add r3, 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 r3, r3, r6\n\t"
  184343. #else
  184344. "add r3, r3, r6\n\t"
  184345. #endif
  184346. #ifdef WOLFSSL_KEIL
  184347. "adcs r4, r4, %[r]\n\t"
  184348. #elif defined(__clang__)
  184349. "adcs r4, %[r]\n\t"
  184350. #else
  184351. "adc r4, %[r]\n\t"
  184352. #endif
  184353. "uxth r6, r7\n\t"
  184354. #ifdef WOLFSSL_KEIL
  184355. "muls r5, r6, r5\n\t"
  184356. #elif defined(__clang__)
  184357. "muls r5, r6\n\t"
  184358. #else
  184359. "mul r5, r6\n\t"
  184360. #endif
  184361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184362. "lsrs r6, r5, #16\n\t"
  184363. #else
  184364. "lsr r6, r5, #16\n\t"
  184365. #endif
  184366. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184367. "lsls r5, r5, #16\n\t"
  184368. #else
  184369. "lsl r5, r5, #16\n\t"
  184370. #endif
  184371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184372. "adds r2, r2, r5\n\t"
  184373. #else
  184374. "add r2, r2, r5\n\t"
  184375. #endif
  184376. #ifdef WOLFSSL_KEIL
  184377. "adcs r3, r3, r6\n\t"
  184378. #elif defined(__clang__)
  184379. "adcs r3, r6\n\t"
  184380. #else
  184381. "adc r3, r6\n\t"
  184382. #endif
  184383. #ifdef WOLFSSL_KEIL
  184384. "adcs r4, r4, %[r]\n\t"
  184385. #elif defined(__clang__)
  184386. "adcs r4, %[r]\n\t"
  184387. #else
  184388. "adc r4, %[r]\n\t"
  184389. #endif
  184390. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184391. "adds r2, r2, r5\n\t"
  184392. #else
  184393. "add r2, r2, r5\n\t"
  184394. #endif
  184395. #ifdef WOLFSSL_KEIL
  184396. "adcs r3, r3, r6\n\t"
  184397. #elif defined(__clang__)
  184398. "adcs r3, r6\n\t"
  184399. #else
  184400. "adc r3, r6\n\t"
  184401. #endif
  184402. #ifdef WOLFSSL_KEIL
  184403. "adcs r4, r4, %[r]\n\t"
  184404. #elif defined(__clang__)
  184405. "adcs r4, %[r]\n\t"
  184406. #else
  184407. "adc r4, %[r]\n\t"
  184408. #endif
  184409. "str r2, [sp, #60]\n\t"
  184410. "# A[15] * A[1]\n\t"
  184411. "movs r2, #0\n\t"
  184412. "mov %[a], r9\n\t"
  184413. "mov r7, r11\n\t"
  184414. "ldr %[a], [%[a], #60]\n\t"
  184415. "uxth r5, %[a]\n\t"
  184416. "uxth r6, r7\n\t"
  184417. #ifdef WOLFSSL_KEIL
  184418. "muls r6, r5, r6\n\t"
  184419. #elif defined(__clang__)
  184420. "muls r6, r5\n\t"
  184421. #else
  184422. "mul r6, r5\n\t"
  184423. #endif
  184424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184425. "adds r3, r3, r6\n\t"
  184426. #else
  184427. "add r3, r3, r6\n\t"
  184428. #endif
  184429. #ifdef WOLFSSL_KEIL
  184430. "adcs r4, r4, %[r]\n\t"
  184431. #elif defined(__clang__)
  184432. "adcs r4, %[r]\n\t"
  184433. #else
  184434. "adc r4, %[r]\n\t"
  184435. #endif
  184436. #ifdef WOLFSSL_KEIL
  184437. "adcs r2, r2, %[r]\n\t"
  184438. #elif defined(__clang__)
  184439. "adcs r2, %[r]\n\t"
  184440. #else
  184441. "adc r2, %[r]\n\t"
  184442. #endif
  184443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184444. "adds r3, r3, r6\n\t"
  184445. #else
  184446. "add r3, r3, r6\n\t"
  184447. #endif
  184448. #ifdef WOLFSSL_KEIL
  184449. "adcs r4, r4, %[r]\n\t"
  184450. #elif defined(__clang__)
  184451. "adcs r4, %[r]\n\t"
  184452. #else
  184453. "adc r4, %[r]\n\t"
  184454. #endif
  184455. #ifdef WOLFSSL_KEIL
  184456. "adcs r2, r2, %[r]\n\t"
  184457. #elif defined(__clang__)
  184458. "adcs r2, %[r]\n\t"
  184459. #else
  184460. "adc r2, %[r]\n\t"
  184461. #endif
  184462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184463. "lsrs r6, r7, #16\n\t"
  184464. #else
  184465. "lsr r6, r7, #16\n\t"
  184466. #endif
  184467. #ifdef WOLFSSL_KEIL
  184468. "muls r5, r6, r5\n\t"
  184469. #elif defined(__clang__)
  184470. "muls r5, r6\n\t"
  184471. #else
  184472. "mul r5, r6\n\t"
  184473. #endif
  184474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184475. "lsrs r6, r5, #16\n\t"
  184476. #else
  184477. "lsr r6, r5, #16\n\t"
  184478. #endif
  184479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184480. "lsls r5, r5, #16\n\t"
  184481. #else
  184482. "lsl r5, r5, #16\n\t"
  184483. #endif
  184484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184485. "adds r3, r3, r5\n\t"
  184486. #else
  184487. "add r3, r3, r5\n\t"
  184488. #endif
  184489. #ifdef WOLFSSL_KEIL
  184490. "adcs r4, r4, r6\n\t"
  184491. #elif defined(__clang__)
  184492. "adcs r4, r6\n\t"
  184493. #else
  184494. "adc r4, r6\n\t"
  184495. #endif
  184496. #ifdef WOLFSSL_KEIL
  184497. "adcs r2, r2, %[r]\n\t"
  184498. #elif defined(__clang__)
  184499. "adcs r2, %[r]\n\t"
  184500. #else
  184501. "adc r2, %[r]\n\t"
  184502. #endif
  184503. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184504. "adds r3, r3, r5\n\t"
  184505. #else
  184506. "add r3, r3, r5\n\t"
  184507. #endif
  184508. #ifdef WOLFSSL_KEIL
  184509. "adcs r4, r4, r6\n\t"
  184510. #elif defined(__clang__)
  184511. "adcs r4, r6\n\t"
  184512. #else
  184513. "adc r4, r6\n\t"
  184514. #endif
  184515. #ifdef WOLFSSL_KEIL
  184516. "adcs r2, r2, %[r]\n\t"
  184517. #elif defined(__clang__)
  184518. "adcs r2, %[r]\n\t"
  184519. #else
  184520. "adc r2, %[r]\n\t"
  184521. #endif
  184522. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184523. "lsrs r5, %[a], #16\n\t"
  184524. #else
  184525. "lsr r5, %[a], #16\n\t"
  184526. #endif
  184527. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184528. "lsrs r6, r7, #16\n\t"
  184529. #else
  184530. "lsr r6, r7, #16\n\t"
  184531. #endif
  184532. #ifdef WOLFSSL_KEIL
  184533. "muls r6, r5, r6\n\t"
  184534. #elif defined(__clang__)
  184535. "muls r6, r5\n\t"
  184536. #else
  184537. "mul r6, r5\n\t"
  184538. #endif
  184539. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184540. "adds r4, r4, r6\n\t"
  184541. #else
  184542. "add r4, r4, r6\n\t"
  184543. #endif
  184544. #ifdef WOLFSSL_KEIL
  184545. "adcs r2, r2, %[r]\n\t"
  184546. #elif defined(__clang__)
  184547. "adcs r2, %[r]\n\t"
  184548. #else
  184549. "adc r2, %[r]\n\t"
  184550. #endif
  184551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184552. "adds r4, r4, r6\n\t"
  184553. #else
  184554. "add r4, r4, r6\n\t"
  184555. #endif
  184556. #ifdef WOLFSSL_KEIL
  184557. "adcs r2, r2, %[r]\n\t"
  184558. #elif defined(__clang__)
  184559. "adcs r2, %[r]\n\t"
  184560. #else
  184561. "adc r2, %[r]\n\t"
  184562. #endif
  184563. "uxth r6, r7\n\t"
  184564. #ifdef WOLFSSL_KEIL
  184565. "muls r5, r6, r5\n\t"
  184566. #elif defined(__clang__)
  184567. "muls r5, r6\n\t"
  184568. #else
  184569. "mul r5, r6\n\t"
  184570. #endif
  184571. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184572. "lsrs r6, r5, #16\n\t"
  184573. #else
  184574. "lsr r6, r5, #16\n\t"
  184575. #endif
  184576. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184577. "lsls r5, r5, #16\n\t"
  184578. #else
  184579. "lsl r5, r5, #16\n\t"
  184580. #endif
  184581. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184582. "adds r3, r3, r5\n\t"
  184583. #else
  184584. "add r3, r3, r5\n\t"
  184585. #endif
  184586. #ifdef WOLFSSL_KEIL
  184587. "adcs r4, r4, r6\n\t"
  184588. #elif defined(__clang__)
  184589. "adcs r4, r6\n\t"
  184590. #else
  184591. "adc r4, r6\n\t"
  184592. #endif
  184593. #ifdef WOLFSSL_KEIL
  184594. "adcs r2, r2, %[r]\n\t"
  184595. #elif defined(__clang__)
  184596. "adcs r2, %[r]\n\t"
  184597. #else
  184598. "adc r2, %[r]\n\t"
  184599. #endif
  184600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184601. "adds r3, r3, r5\n\t"
  184602. #else
  184603. "add r3, r3, r5\n\t"
  184604. #endif
  184605. #ifdef WOLFSSL_KEIL
  184606. "adcs r4, r4, r6\n\t"
  184607. #elif defined(__clang__)
  184608. "adcs r4, r6\n\t"
  184609. #else
  184610. "adc r4, r6\n\t"
  184611. #endif
  184612. #ifdef WOLFSSL_KEIL
  184613. "adcs r2, r2, %[r]\n\t"
  184614. #elif defined(__clang__)
  184615. "adcs r2, %[r]\n\t"
  184616. #else
  184617. "adc r2, %[r]\n\t"
  184618. #endif
  184619. "# A[14] * A[2]\n\t"
  184620. "mov %[a], r9\n\t"
  184621. "mov r7, r12\n\t"
  184622. "ldr %[a], [%[a], #56]\n\t"
  184623. "uxth r5, %[a]\n\t"
  184624. "uxth r6, r7\n\t"
  184625. #ifdef WOLFSSL_KEIL
  184626. "muls r6, r5, r6\n\t"
  184627. #elif defined(__clang__)
  184628. "muls r6, r5\n\t"
  184629. #else
  184630. "mul r6, r5\n\t"
  184631. #endif
  184632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184633. "adds r3, r3, r6\n\t"
  184634. #else
  184635. "add r3, r3, r6\n\t"
  184636. #endif
  184637. #ifdef WOLFSSL_KEIL
  184638. "adcs r4, r4, %[r]\n\t"
  184639. #elif defined(__clang__)
  184640. "adcs r4, %[r]\n\t"
  184641. #else
  184642. "adc r4, %[r]\n\t"
  184643. #endif
  184644. #ifdef WOLFSSL_KEIL
  184645. "adcs r2, r2, %[r]\n\t"
  184646. #elif defined(__clang__)
  184647. "adcs r2, %[r]\n\t"
  184648. #else
  184649. "adc r2, %[r]\n\t"
  184650. #endif
  184651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184652. "adds r3, r3, r6\n\t"
  184653. #else
  184654. "add r3, r3, r6\n\t"
  184655. #endif
  184656. #ifdef WOLFSSL_KEIL
  184657. "adcs r4, r4, %[r]\n\t"
  184658. #elif defined(__clang__)
  184659. "adcs r4, %[r]\n\t"
  184660. #else
  184661. "adc r4, %[r]\n\t"
  184662. #endif
  184663. #ifdef WOLFSSL_KEIL
  184664. "adcs r2, r2, %[r]\n\t"
  184665. #elif defined(__clang__)
  184666. "adcs r2, %[r]\n\t"
  184667. #else
  184668. "adc r2, %[r]\n\t"
  184669. #endif
  184670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184671. "lsrs r6, r7, #16\n\t"
  184672. #else
  184673. "lsr r6, r7, #16\n\t"
  184674. #endif
  184675. #ifdef WOLFSSL_KEIL
  184676. "muls r5, r6, r5\n\t"
  184677. #elif defined(__clang__)
  184678. "muls r5, r6\n\t"
  184679. #else
  184680. "mul r5, r6\n\t"
  184681. #endif
  184682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184683. "lsrs r6, r5, #16\n\t"
  184684. #else
  184685. "lsr r6, r5, #16\n\t"
  184686. #endif
  184687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184688. "lsls r5, r5, #16\n\t"
  184689. #else
  184690. "lsl r5, r5, #16\n\t"
  184691. #endif
  184692. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184693. "adds r3, r3, r5\n\t"
  184694. #else
  184695. "add r3, r3, r5\n\t"
  184696. #endif
  184697. #ifdef WOLFSSL_KEIL
  184698. "adcs r4, r4, r6\n\t"
  184699. #elif defined(__clang__)
  184700. "adcs r4, r6\n\t"
  184701. #else
  184702. "adc r4, r6\n\t"
  184703. #endif
  184704. #ifdef WOLFSSL_KEIL
  184705. "adcs r2, r2, %[r]\n\t"
  184706. #elif defined(__clang__)
  184707. "adcs r2, %[r]\n\t"
  184708. #else
  184709. "adc r2, %[r]\n\t"
  184710. #endif
  184711. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184712. "adds r3, r3, r5\n\t"
  184713. #else
  184714. "add r3, r3, r5\n\t"
  184715. #endif
  184716. #ifdef WOLFSSL_KEIL
  184717. "adcs r4, r4, r6\n\t"
  184718. #elif defined(__clang__)
  184719. "adcs r4, r6\n\t"
  184720. #else
  184721. "adc r4, r6\n\t"
  184722. #endif
  184723. #ifdef WOLFSSL_KEIL
  184724. "adcs r2, r2, %[r]\n\t"
  184725. #elif defined(__clang__)
  184726. "adcs r2, %[r]\n\t"
  184727. #else
  184728. "adc r2, %[r]\n\t"
  184729. #endif
  184730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184731. "lsrs r5, %[a], #16\n\t"
  184732. #else
  184733. "lsr r5, %[a], #16\n\t"
  184734. #endif
  184735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184736. "lsrs r6, r7, #16\n\t"
  184737. #else
  184738. "lsr r6, r7, #16\n\t"
  184739. #endif
  184740. #ifdef WOLFSSL_KEIL
  184741. "muls r6, r5, r6\n\t"
  184742. #elif defined(__clang__)
  184743. "muls r6, r5\n\t"
  184744. #else
  184745. "mul r6, r5\n\t"
  184746. #endif
  184747. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184748. "adds r4, r4, r6\n\t"
  184749. #else
  184750. "add r4, r4, r6\n\t"
  184751. #endif
  184752. #ifdef WOLFSSL_KEIL
  184753. "adcs r2, r2, %[r]\n\t"
  184754. #elif defined(__clang__)
  184755. "adcs r2, %[r]\n\t"
  184756. #else
  184757. "adc r2, %[r]\n\t"
  184758. #endif
  184759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184760. "adds r4, r4, r6\n\t"
  184761. #else
  184762. "add r4, r4, r6\n\t"
  184763. #endif
  184764. #ifdef WOLFSSL_KEIL
  184765. "adcs r2, r2, %[r]\n\t"
  184766. #elif defined(__clang__)
  184767. "adcs r2, %[r]\n\t"
  184768. #else
  184769. "adc r2, %[r]\n\t"
  184770. #endif
  184771. "uxth r6, r7\n\t"
  184772. #ifdef WOLFSSL_KEIL
  184773. "muls r5, r6, r5\n\t"
  184774. #elif defined(__clang__)
  184775. "muls r5, r6\n\t"
  184776. #else
  184777. "mul r5, r6\n\t"
  184778. #endif
  184779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184780. "lsrs r6, r5, #16\n\t"
  184781. #else
  184782. "lsr r6, r5, #16\n\t"
  184783. #endif
  184784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184785. "lsls r5, r5, #16\n\t"
  184786. #else
  184787. "lsl r5, r5, #16\n\t"
  184788. #endif
  184789. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184790. "adds r3, r3, r5\n\t"
  184791. #else
  184792. "add r3, r3, r5\n\t"
  184793. #endif
  184794. #ifdef WOLFSSL_KEIL
  184795. "adcs r4, r4, r6\n\t"
  184796. #elif defined(__clang__)
  184797. "adcs r4, r6\n\t"
  184798. #else
  184799. "adc r4, r6\n\t"
  184800. #endif
  184801. #ifdef WOLFSSL_KEIL
  184802. "adcs r2, r2, %[r]\n\t"
  184803. #elif defined(__clang__)
  184804. "adcs r2, %[r]\n\t"
  184805. #else
  184806. "adc r2, %[r]\n\t"
  184807. #endif
  184808. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184809. "adds r3, r3, r5\n\t"
  184810. #else
  184811. "add r3, r3, r5\n\t"
  184812. #endif
  184813. #ifdef WOLFSSL_KEIL
  184814. "adcs r4, r4, r6\n\t"
  184815. #elif defined(__clang__)
  184816. "adcs r4, r6\n\t"
  184817. #else
  184818. "adc r4, r6\n\t"
  184819. #endif
  184820. #ifdef WOLFSSL_KEIL
  184821. "adcs r2, r2, %[r]\n\t"
  184822. #elif defined(__clang__)
  184823. "adcs r2, %[r]\n\t"
  184824. #else
  184825. "adc r2, %[r]\n\t"
  184826. #endif
  184827. "# A[13] * A[3]\n\t"
  184828. "mov %[a], r9\n\t"
  184829. "mov r7, lr\n\t"
  184830. "ldr %[a], [%[a], #52]\n\t"
  184831. "uxth r5, %[a]\n\t"
  184832. "uxth r6, r7\n\t"
  184833. #ifdef WOLFSSL_KEIL
  184834. "muls r6, r5, r6\n\t"
  184835. #elif defined(__clang__)
  184836. "muls r6, r5\n\t"
  184837. #else
  184838. "mul r6, r5\n\t"
  184839. #endif
  184840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184841. "adds r3, r3, r6\n\t"
  184842. #else
  184843. "add r3, r3, r6\n\t"
  184844. #endif
  184845. #ifdef WOLFSSL_KEIL
  184846. "adcs r4, r4, %[r]\n\t"
  184847. #elif defined(__clang__)
  184848. "adcs r4, %[r]\n\t"
  184849. #else
  184850. "adc r4, %[r]\n\t"
  184851. #endif
  184852. #ifdef WOLFSSL_KEIL
  184853. "adcs r2, r2, %[r]\n\t"
  184854. #elif defined(__clang__)
  184855. "adcs r2, %[r]\n\t"
  184856. #else
  184857. "adc r2, %[r]\n\t"
  184858. #endif
  184859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184860. "adds r3, r3, r6\n\t"
  184861. #else
  184862. "add r3, r3, r6\n\t"
  184863. #endif
  184864. #ifdef WOLFSSL_KEIL
  184865. "adcs r4, r4, %[r]\n\t"
  184866. #elif defined(__clang__)
  184867. "adcs r4, %[r]\n\t"
  184868. #else
  184869. "adc r4, %[r]\n\t"
  184870. #endif
  184871. #ifdef WOLFSSL_KEIL
  184872. "adcs r2, r2, %[r]\n\t"
  184873. #elif defined(__clang__)
  184874. "adcs r2, %[r]\n\t"
  184875. #else
  184876. "adc r2, %[r]\n\t"
  184877. #endif
  184878. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184879. "lsrs r6, r7, #16\n\t"
  184880. #else
  184881. "lsr r6, r7, #16\n\t"
  184882. #endif
  184883. #ifdef WOLFSSL_KEIL
  184884. "muls r5, r6, r5\n\t"
  184885. #elif defined(__clang__)
  184886. "muls r5, r6\n\t"
  184887. #else
  184888. "mul r5, r6\n\t"
  184889. #endif
  184890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184891. "lsrs r6, r5, #16\n\t"
  184892. #else
  184893. "lsr r6, r5, #16\n\t"
  184894. #endif
  184895. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184896. "lsls r5, r5, #16\n\t"
  184897. #else
  184898. "lsl r5, r5, #16\n\t"
  184899. #endif
  184900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184901. "adds r3, r3, r5\n\t"
  184902. #else
  184903. "add r3, r3, r5\n\t"
  184904. #endif
  184905. #ifdef WOLFSSL_KEIL
  184906. "adcs r4, r4, r6\n\t"
  184907. #elif defined(__clang__)
  184908. "adcs r4, r6\n\t"
  184909. #else
  184910. "adc r4, r6\n\t"
  184911. #endif
  184912. #ifdef WOLFSSL_KEIL
  184913. "adcs r2, r2, %[r]\n\t"
  184914. #elif defined(__clang__)
  184915. "adcs r2, %[r]\n\t"
  184916. #else
  184917. "adc r2, %[r]\n\t"
  184918. #endif
  184919. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184920. "adds r3, r3, r5\n\t"
  184921. #else
  184922. "add r3, r3, r5\n\t"
  184923. #endif
  184924. #ifdef WOLFSSL_KEIL
  184925. "adcs r4, r4, r6\n\t"
  184926. #elif defined(__clang__)
  184927. "adcs r4, r6\n\t"
  184928. #else
  184929. "adc r4, r6\n\t"
  184930. #endif
  184931. #ifdef WOLFSSL_KEIL
  184932. "adcs r2, r2, %[r]\n\t"
  184933. #elif defined(__clang__)
  184934. "adcs r2, %[r]\n\t"
  184935. #else
  184936. "adc r2, %[r]\n\t"
  184937. #endif
  184938. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184939. "lsrs r5, %[a], #16\n\t"
  184940. #else
  184941. "lsr r5, %[a], #16\n\t"
  184942. #endif
  184943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184944. "lsrs r6, r7, #16\n\t"
  184945. #else
  184946. "lsr r6, r7, #16\n\t"
  184947. #endif
  184948. #ifdef WOLFSSL_KEIL
  184949. "muls r6, r5, r6\n\t"
  184950. #elif defined(__clang__)
  184951. "muls r6, r5\n\t"
  184952. #else
  184953. "mul r6, r5\n\t"
  184954. #endif
  184955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184956. "adds r4, r4, r6\n\t"
  184957. #else
  184958. "add r4, 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 r4, r4, r6\n\t"
  184969. #else
  184970. "add r4, r4, r6\n\t"
  184971. #endif
  184972. #ifdef WOLFSSL_KEIL
  184973. "adcs r2, r2, %[r]\n\t"
  184974. #elif defined(__clang__)
  184975. "adcs r2, %[r]\n\t"
  184976. #else
  184977. "adc r2, %[r]\n\t"
  184978. #endif
  184979. "uxth r6, r7\n\t"
  184980. #ifdef WOLFSSL_KEIL
  184981. "muls r5, r6, r5\n\t"
  184982. #elif defined(__clang__)
  184983. "muls r5, r6\n\t"
  184984. #else
  184985. "mul r5, r6\n\t"
  184986. #endif
  184987. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184988. "lsrs r6, r5, #16\n\t"
  184989. #else
  184990. "lsr r6, r5, #16\n\t"
  184991. #endif
  184992. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184993. "lsls r5, r5, #16\n\t"
  184994. #else
  184995. "lsl r5, r5, #16\n\t"
  184996. #endif
  184997. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  184998. "adds r3, r3, r5\n\t"
  184999. #else
  185000. "add r3, r3, r5\n\t"
  185001. #endif
  185002. #ifdef WOLFSSL_KEIL
  185003. "adcs r4, r4, r6\n\t"
  185004. #elif defined(__clang__)
  185005. "adcs r4, r6\n\t"
  185006. #else
  185007. "adc r4, r6\n\t"
  185008. #endif
  185009. #ifdef WOLFSSL_KEIL
  185010. "adcs r2, r2, %[r]\n\t"
  185011. #elif defined(__clang__)
  185012. "adcs r2, %[r]\n\t"
  185013. #else
  185014. "adc r2, %[r]\n\t"
  185015. #endif
  185016. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185017. "adds r3, r3, r5\n\t"
  185018. #else
  185019. "add r3, r3, r5\n\t"
  185020. #endif
  185021. #ifdef WOLFSSL_KEIL
  185022. "adcs r4, r4, r6\n\t"
  185023. #elif defined(__clang__)
  185024. "adcs r4, r6\n\t"
  185025. #else
  185026. "adc r4, r6\n\t"
  185027. #endif
  185028. #ifdef WOLFSSL_KEIL
  185029. "adcs r2, r2, %[r]\n\t"
  185030. #elif defined(__clang__)
  185031. "adcs r2, %[r]\n\t"
  185032. #else
  185033. "adc r2, %[r]\n\t"
  185034. #endif
  185035. "# A[12] * A[4]\n\t"
  185036. "mov %[a], r9\n\t"
  185037. "ldr r7, [%[a], #16]\n\t"
  185038. "ldr %[a], [%[a], #48]\n\t"
  185039. "uxth r5, %[a]\n\t"
  185040. "uxth r6, r7\n\t"
  185041. #ifdef WOLFSSL_KEIL
  185042. "muls r6, r5, r6\n\t"
  185043. #elif defined(__clang__)
  185044. "muls r6, r5\n\t"
  185045. #else
  185046. "mul r6, r5\n\t"
  185047. #endif
  185048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185049. "adds r3, r3, r6\n\t"
  185050. #else
  185051. "add r3, r3, r6\n\t"
  185052. #endif
  185053. #ifdef WOLFSSL_KEIL
  185054. "adcs r4, r4, %[r]\n\t"
  185055. #elif defined(__clang__)
  185056. "adcs r4, %[r]\n\t"
  185057. #else
  185058. "adc r4, %[r]\n\t"
  185059. #endif
  185060. #ifdef WOLFSSL_KEIL
  185061. "adcs r2, r2, %[r]\n\t"
  185062. #elif defined(__clang__)
  185063. "adcs r2, %[r]\n\t"
  185064. #else
  185065. "adc r2, %[r]\n\t"
  185066. #endif
  185067. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185068. "adds r3, r3, r6\n\t"
  185069. #else
  185070. "add r3, r3, r6\n\t"
  185071. #endif
  185072. #ifdef WOLFSSL_KEIL
  185073. "adcs r4, r4, %[r]\n\t"
  185074. #elif defined(__clang__)
  185075. "adcs r4, %[r]\n\t"
  185076. #else
  185077. "adc r4, %[r]\n\t"
  185078. #endif
  185079. #ifdef WOLFSSL_KEIL
  185080. "adcs r2, r2, %[r]\n\t"
  185081. #elif defined(__clang__)
  185082. "adcs r2, %[r]\n\t"
  185083. #else
  185084. "adc r2, %[r]\n\t"
  185085. #endif
  185086. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185087. "lsrs r6, r7, #16\n\t"
  185088. #else
  185089. "lsr r6, r7, #16\n\t"
  185090. #endif
  185091. #ifdef WOLFSSL_KEIL
  185092. "muls r5, r6, r5\n\t"
  185093. #elif defined(__clang__)
  185094. "muls r5, r6\n\t"
  185095. #else
  185096. "mul r5, r6\n\t"
  185097. #endif
  185098. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185099. "lsrs r6, r5, #16\n\t"
  185100. #else
  185101. "lsr r6, r5, #16\n\t"
  185102. #endif
  185103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185104. "lsls r5, r5, #16\n\t"
  185105. #else
  185106. "lsl r5, r5, #16\n\t"
  185107. #endif
  185108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185109. "adds r3, r3, r5\n\t"
  185110. #else
  185111. "add r3, r3, r5\n\t"
  185112. #endif
  185113. #ifdef WOLFSSL_KEIL
  185114. "adcs r4, r4, r6\n\t"
  185115. #elif defined(__clang__)
  185116. "adcs r4, r6\n\t"
  185117. #else
  185118. "adc r4, r6\n\t"
  185119. #endif
  185120. #ifdef WOLFSSL_KEIL
  185121. "adcs r2, r2, %[r]\n\t"
  185122. #elif defined(__clang__)
  185123. "adcs r2, %[r]\n\t"
  185124. #else
  185125. "adc r2, %[r]\n\t"
  185126. #endif
  185127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185128. "adds r3, r3, r5\n\t"
  185129. #else
  185130. "add r3, r3, r5\n\t"
  185131. #endif
  185132. #ifdef WOLFSSL_KEIL
  185133. "adcs r4, r4, r6\n\t"
  185134. #elif defined(__clang__)
  185135. "adcs r4, r6\n\t"
  185136. #else
  185137. "adc r4, r6\n\t"
  185138. #endif
  185139. #ifdef WOLFSSL_KEIL
  185140. "adcs r2, r2, %[r]\n\t"
  185141. #elif defined(__clang__)
  185142. "adcs r2, %[r]\n\t"
  185143. #else
  185144. "adc r2, %[r]\n\t"
  185145. #endif
  185146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185147. "lsrs r5, %[a], #16\n\t"
  185148. #else
  185149. "lsr r5, %[a], #16\n\t"
  185150. #endif
  185151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185152. "lsrs r6, r7, #16\n\t"
  185153. #else
  185154. "lsr r6, r7, #16\n\t"
  185155. #endif
  185156. #ifdef WOLFSSL_KEIL
  185157. "muls r6, r5, r6\n\t"
  185158. #elif defined(__clang__)
  185159. "muls r6, r5\n\t"
  185160. #else
  185161. "mul r6, r5\n\t"
  185162. #endif
  185163. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185164. "adds r4, r4, r6\n\t"
  185165. #else
  185166. "add r4, 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 r4, r4, r6\n\t"
  185177. #else
  185178. "add r4, r4, r6\n\t"
  185179. #endif
  185180. #ifdef WOLFSSL_KEIL
  185181. "adcs r2, r2, %[r]\n\t"
  185182. #elif defined(__clang__)
  185183. "adcs r2, %[r]\n\t"
  185184. #else
  185185. "adc r2, %[r]\n\t"
  185186. #endif
  185187. "uxth r6, r7\n\t"
  185188. #ifdef WOLFSSL_KEIL
  185189. "muls r5, r6, r5\n\t"
  185190. #elif defined(__clang__)
  185191. "muls r5, r6\n\t"
  185192. #else
  185193. "mul r5, r6\n\t"
  185194. #endif
  185195. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185196. "lsrs r6, r5, #16\n\t"
  185197. #else
  185198. "lsr r6, r5, #16\n\t"
  185199. #endif
  185200. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185201. "lsls r5, r5, #16\n\t"
  185202. #else
  185203. "lsl r5, r5, #16\n\t"
  185204. #endif
  185205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185206. "adds r3, r3, r5\n\t"
  185207. #else
  185208. "add r3, r3, r5\n\t"
  185209. #endif
  185210. #ifdef WOLFSSL_KEIL
  185211. "adcs r4, r4, r6\n\t"
  185212. #elif defined(__clang__)
  185213. "adcs r4, r6\n\t"
  185214. #else
  185215. "adc r4, r6\n\t"
  185216. #endif
  185217. #ifdef WOLFSSL_KEIL
  185218. "adcs r2, r2, %[r]\n\t"
  185219. #elif defined(__clang__)
  185220. "adcs r2, %[r]\n\t"
  185221. #else
  185222. "adc r2, %[r]\n\t"
  185223. #endif
  185224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185225. "adds r3, r3, r5\n\t"
  185226. #else
  185227. "add r3, r3, r5\n\t"
  185228. #endif
  185229. #ifdef WOLFSSL_KEIL
  185230. "adcs r4, r4, r6\n\t"
  185231. #elif defined(__clang__)
  185232. "adcs r4, r6\n\t"
  185233. #else
  185234. "adc r4, r6\n\t"
  185235. #endif
  185236. #ifdef WOLFSSL_KEIL
  185237. "adcs r2, r2, %[r]\n\t"
  185238. #elif defined(__clang__)
  185239. "adcs r2, %[r]\n\t"
  185240. #else
  185241. "adc r2, %[r]\n\t"
  185242. #endif
  185243. "# A[11] * A[5]\n\t"
  185244. "mov %[a], r9\n\t"
  185245. "ldr r7, [%[a], #20]\n\t"
  185246. "ldr %[a], [%[a], #44]\n\t"
  185247. "uxth r5, %[a]\n\t"
  185248. "uxth r6, r7\n\t"
  185249. #ifdef WOLFSSL_KEIL
  185250. "muls r6, r5, r6\n\t"
  185251. #elif defined(__clang__)
  185252. "muls r6, r5\n\t"
  185253. #else
  185254. "mul r6, r5\n\t"
  185255. #endif
  185256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185257. "adds r3, r3, r6\n\t"
  185258. #else
  185259. "add r3, r3, r6\n\t"
  185260. #endif
  185261. #ifdef WOLFSSL_KEIL
  185262. "adcs r4, r4, %[r]\n\t"
  185263. #elif defined(__clang__)
  185264. "adcs r4, %[r]\n\t"
  185265. #else
  185266. "adc r4, %[r]\n\t"
  185267. #endif
  185268. #ifdef WOLFSSL_KEIL
  185269. "adcs r2, r2, %[r]\n\t"
  185270. #elif defined(__clang__)
  185271. "adcs r2, %[r]\n\t"
  185272. #else
  185273. "adc r2, %[r]\n\t"
  185274. #endif
  185275. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185276. "adds r3, r3, r6\n\t"
  185277. #else
  185278. "add r3, r3, r6\n\t"
  185279. #endif
  185280. #ifdef WOLFSSL_KEIL
  185281. "adcs r4, r4, %[r]\n\t"
  185282. #elif defined(__clang__)
  185283. "adcs r4, %[r]\n\t"
  185284. #else
  185285. "adc r4, %[r]\n\t"
  185286. #endif
  185287. #ifdef WOLFSSL_KEIL
  185288. "adcs r2, r2, %[r]\n\t"
  185289. #elif defined(__clang__)
  185290. "adcs r2, %[r]\n\t"
  185291. #else
  185292. "adc r2, %[r]\n\t"
  185293. #endif
  185294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185295. "lsrs r6, r7, #16\n\t"
  185296. #else
  185297. "lsr r6, r7, #16\n\t"
  185298. #endif
  185299. #ifdef WOLFSSL_KEIL
  185300. "muls r5, r6, r5\n\t"
  185301. #elif defined(__clang__)
  185302. "muls r5, r6\n\t"
  185303. #else
  185304. "mul r5, r6\n\t"
  185305. #endif
  185306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185307. "lsrs r6, r5, #16\n\t"
  185308. #else
  185309. "lsr r6, r5, #16\n\t"
  185310. #endif
  185311. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185312. "lsls r5, r5, #16\n\t"
  185313. #else
  185314. "lsl r5, r5, #16\n\t"
  185315. #endif
  185316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185317. "adds r3, r3, r5\n\t"
  185318. #else
  185319. "add r3, r3, r5\n\t"
  185320. #endif
  185321. #ifdef WOLFSSL_KEIL
  185322. "adcs r4, r4, r6\n\t"
  185323. #elif defined(__clang__)
  185324. "adcs r4, r6\n\t"
  185325. #else
  185326. "adc r4, r6\n\t"
  185327. #endif
  185328. #ifdef WOLFSSL_KEIL
  185329. "adcs r2, r2, %[r]\n\t"
  185330. #elif defined(__clang__)
  185331. "adcs r2, %[r]\n\t"
  185332. #else
  185333. "adc r2, %[r]\n\t"
  185334. #endif
  185335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185336. "adds r3, r3, r5\n\t"
  185337. #else
  185338. "add r3, r3, r5\n\t"
  185339. #endif
  185340. #ifdef WOLFSSL_KEIL
  185341. "adcs r4, r4, r6\n\t"
  185342. #elif defined(__clang__)
  185343. "adcs r4, r6\n\t"
  185344. #else
  185345. "adc r4, r6\n\t"
  185346. #endif
  185347. #ifdef WOLFSSL_KEIL
  185348. "adcs r2, r2, %[r]\n\t"
  185349. #elif defined(__clang__)
  185350. "adcs r2, %[r]\n\t"
  185351. #else
  185352. "adc r2, %[r]\n\t"
  185353. #endif
  185354. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185355. "lsrs r5, %[a], #16\n\t"
  185356. #else
  185357. "lsr r5, %[a], #16\n\t"
  185358. #endif
  185359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185360. "lsrs r6, r7, #16\n\t"
  185361. #else
  185362. "lsr r6, r7, #16\n\t"
  185363. #endif
  185364. #ifdef WOLFSSL_KEIL
  185365. "muls r6, r5, r6\n\t"
  185366. #elif defined(__clang__)
  185367. "muls r6, r5\n\t"
  185368. #else
  185369. "mul r6, r5\n\t"
  185370. #endif
  185371. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185372. "adds r4, r4, r6\n\t"
  185373. #else
  185374. "add r4, 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 r4, r4, r6\n\t"
  185385. #else
  185386. "add r4, r4, r6\n\t"
  185387. #endif
  185388. #ifdef WOLFSSL_KEIL
  185389. "adcs r2, r2, %[r]\n\t"
  185390. #elif defined(__clang__)
  185391. "adcs r2, %[r]\n\t"
  185392. #else
  185393. "adc r2, %[r]\n\t"
  185394. #endif
  185395. "uxth r6, r7\n\t"
  185396. #ifdef WOLFSSL_KEIL
  185397. "muls r5, r6, r5\n\t"
  185398. #elif defined(__clang__)
  185399. "muls r5, r6\n\t"
  185400. #else
  185401. "mul r5, r6\n\t"
  185402. #endif
  185403. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185404. "lsrs r6, r5, #16\n\t"
  185405. #else
  185406. "lsr r6, r5, #16\n\t"
  185407. #endif
  185408. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185409. "lsls r5, r5, #16\n\t"
  185410. #else
  185411. "lsl r5, r5, #16\n\t"
  185412. #endif
  185413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185414. "adds r3, r3, r5\n\t"
  185415. #else
  185416. "add r3, r3, r5\n\t"
  185417. #endif
  185418. #ifdef WOLFSSL_KEIL
  185419. "adcs r4, r4, r6\n\t"
  185420. #elif defined(__clang__)
  185421. "adcs r4, r6\n\t"
  185422. #else
  185423. "adc r4, r6\n\t"
  185424. #endif
  185425. #ifdef WOLFSSL_KEIL
  185426. "adcs r2, r2, %[r]\n\t"
  185427. #elif defined(__clang__)
  185428. "adcs r2, %[r]\n\t"
  185429. #else
  185430. "adc r2, %[r]\n\t"
  185431. #endif
  185432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185433. "adds r3, r3, r5\n\t"
  185434. #else
  185435. "add r3, r3, r5\n\t"
  185436. #endif
  185437. #ifdef WOLFSSL_KEIL
  185438. "adcs r4, r4, r6\n\t"
  185439. #elif defined(__clang__)
  185440. "adcs r4, r6\n\t"
  185441. #else
  185442. "adc r4, r6\n\t"
  185443. #endif
  185444. #ifdef WOLFSSL_KEIL
  185445. "adcs r2, r2, %[r]\n\t"
  185446. #elif defined(__clang__)
  185447. "adcs r2, %[r]\n\t"
  185448. #else
  185449. "adc r2, %[r]\n\t"
  185450. #endif
  185451. "# A[10] * A[6]\n\t"
  185452. "mov %[a], r9\n\t"
  185453. "ldr r7, [%[a], #24]\n\t"
  185454. "ldr %[a], [%[a], #40]\n\t"
  185455. "uxth r5, %[a]\n\t"
  185456. "uxth r6, r7\n\t"
  185457. #ifdef WOLFSSL_KEIL
  185458. "muls r6, r5, r6\n\t"
  185459. #elif defined(__clang__)
  185460. "muls r6, r5\n\t"
  185461. #else
  185462. "mul r6, r5\n\t"
  185463. #endif
  185464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185465. "adds r3, r3, r6\n\t"
  185466. #else
  185467. "add r3, r3, r6\n\t"
  185468. #endif
  185469. #ifdef WOLFSSL_KEIL
  185470. "adcs r4, r4, %[r]\n\t"
  185471. #elif defined(__clang__)
  185472. "adcs r4, %[r]\n\t"
  185473. #else
  185474. "adc r4, %[r]\n\t"
  185475. #endif
  185476. #ifdef WOLFSSL_KEIL
  185477. "adcs r2, r2, %[r]\n\t"
  185478. #elif defined(__clang__)
  185479. "adcs r2, %[r]\n\t"
  185480. #else
  185481. "adc r2, %[r]\n\t"
  185482. #endif
  185483. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185484. "adds r3, r3, r6\n\t"
  185485. #else
  185486. "add r3, r3, r6\n\t"
  185487. #endif
  185488. #ifdef WOLFSSL_KEIL
  185489. "adcs r4, r4, %[r]\n\t"
  185490. #elif defined(__clang__)
  185491. "adcs r4, %[r]\n\t"
  185492. #else
  185493. "adc r4, %[r]\n\t"
  185494. #endif
  185495. #ifdef WOLFSSL_KEIL
  185496. "adcs r2, r2, %[r]\n\t"
  185497. #elif defined(__clang__)
  185498. "adcs r2, %[r]\n\t"
  185499. #else
  185500. "adc r2, %[r]\n\t"
  185501. #endif
  185502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185503. "lsrs r6, r7, #16\n\t"
  185504. #else
  185505. "lsr r6, r7, #16\n\t"
  185506. #endif
  185507. #ifdef WOLFSSL_KEIL
  185508. "muls r5, r6, r5\n\t"
  185509. #elif defined(__clang__)
  185510. "muls r5, r6\n\t"
  185511. #else
  185512. "mul r5, r6\n\t"
  185513. #endif
  185514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185515. "lsrs r6, r5, #16\n\t"
  185516. #else
  185517. "lsr r6, r5, #16\n\t"
  185518. #endif
  185519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185520. "lsls r5, r5, #16\n\t"
  185521. #else
  185522. "lsl r5, r5, #16\n\t"
  185523. #endif
  185524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185525. "adds r3, r3, r5\n\t"
  185526. #else
  185527. "add r3, r3, r5\n\t"
  185528. #endif
  185529. #ifdef WOLFSSL_KEIL
  185530. "adcs r4, r4, r6\n\t"
  185531. #elif defined(__clang__)
  185532. "adcs r4, r6\n\t"
  185533. #else
  185534. "adc r4, r6\n\t"
  185535. #endif
  185536. #ifdef WOLFSSL_KEIL
  185537. "adcs r2, r2, %[r]\n\t"
  185538. #elif defined(__clang__)
  185539. "adcs r2, %[r]\n\t"
  185540. #else
  185541. "adc r2, %[r]\n\t"
  185542. #endif
  185543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185544. "adds r3, r3, r5\n\t"
  185545. #else
  185546. "add r3, r3, r5\n\t"
  185547. #endif
  185548. #ifdef WOLFSSL_KEIL
  185549. "adcs r4, r4, r6\n\t"
  185550. #elif defined(__clang__)
  185551. "adcs r4, r6\n\t"
  185552. #else
  185553. "adc r4, r6\n\t"
  185554. #endif
  185555. #ifdef WOLFSSL_KEIL
  185556. "adcs r2, r2, %[r]\n\t"
  185557. #elif defined(__clang__)
  185558. "adcs r2, %[r]\n\t"
  185559. #else
  185560. "adc r2, %[r]\n\t"
  185561. #endif
  185562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185563. "lsrs r5, %[a], #16\n\t"
  185564. #else
  185565. "lsr r5, %[a], #16\n\t"
  185566. #endif
  185567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185568. "lsrs r6, r7, #16\n\t"
  185569. #else
  185570. "lsr r6, r7, #16\n\t"
  185571. #endif
  185572. #ifdef WOLFSSL_KEIL
  185573. "muls r6, r5, r6\n\t"
  185574. #elif defined(__clang__)
  185575. "muls r6, r5\n\t"
  185576. #else
  185577. "mul r6, r5\n\t"
  185578. #endif
  185579. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185580. "adds r4, r4, r6\n\t"
  185581. #else
  185582. "add r4, 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 r4, r4, r6\n\t"
  185593. #else
  185594. "add r4, r4, r6\n\t"
  185595. #endif
  185596. #ifdef WOLFSSL_KEIL
  185597. "adcs r2, r2, %[r]\n\t"
  185598. #elif defined(__clang__)
  185599. "adcs r2, %[r]\n\t"
  185600. #else
  185601. "adc r2, %[r]\n\t"
  185602. #endif
  185603. "uxth r6, r7\n\t"
  185604. #ifdef WOLFSSL_KEIL
  185605. "muls r5, r6, r5\n\t"
  185606. #elif defined(__clang__)
  185607. "muls r5, r6\n\t"
  185608. #else
  185609. "mul r5, r6\n\t"
  185610. #endif
  185611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185612. "lsrs r6, r5, #16\n\t"
  185613. #else
  185614. "lsr r6, r5, #16\n\t"
  185615. #endif
  185616. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185617. "lsls r5, r5, #16\n\t"
  185618. #else
  185619. "lsl r5, r5, #16\n\t"
  185620. #endif
  185621. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185622. "adds r3, r3, r5\n\t"
  185623. #else
  185624. "add r3, r3, r5\n\t"
  185625. #endif
  185626. #ifdef WOLFSSL_KEIL
  185627. "adcs r4, r4, r6\n\t"
  185628. #elif defined(__clang__)
  185629. "adcs r4, r6\n\t"
  185630. #else
  185631. "adc r4, r6\n\t"
  185632. #endif
  185633. #ifdef WOLFSSL_KEIL
  185634. "adcs r2, r2, %[r]\n\t"
  185635. #elif defined(__clang__)
  185636. "adcs r2, %[r]\n\t"
  185637. #else
  185638. "adc r2, %[r]\n\t"
  185639. #endif
  185640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185641. "adds r3, r3, r5\n\t"
  185642. #else
  185643. "add r3, r3, r5\n\t"
  185644. #endif
  185645. #ifdef WOLFSSL_KEIL
  185646. "adcs r4, r4, r6\n\t"
  185647. #elif defined(__clang__)
  185648. "adcs r4, r6\n\t"
  185649. #else
  185650. "adc r4, r6\n\t"
  185651. #endif
  185652. #ifdef WOLFSSL_KEIL
  185653. "adcs r2, r2, %[r]\n\t"
  185654. #elif defined(__clang__)
  185655. "adcs r2, %[r]\n\t"
  185656. #else
  185657. "adc r2, %[r]\n\t"
  185658. #endif
  185659. "# A[9] * A[7]\n\t"
  185660. "mov %[a], r9\n\t"
  185661. "ldr r7, [%[a], #28]\n\t"
  185662. "ldr %[a], [%[a], #36]\n\t"
  185663. "uxth r5, %[a]\n\t"
  185664. "uxth r6, r7\n\t"
  185665. #ifdef WOLFSSL_KEIL
  185666. "muls r6, r5, r6\n\t"
  185667. #elif defined(__clang__)
  185668. "muls r6, r5\n\t"
  185669. #else
  185670. "mul r6, r5\n\t"
  185671. #endif
  185672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185673. "adds r3, r3, r6\n\t"
  185674. #else
  185675. "add r3, r3, r6\n\t"
  185676. #endif
  185677. #ifdef WOLFSSL_KEIL
  185678. "adcs r4, r4, %[r]\n\t"
  185679. #elif defined(__clang__)
  185680. "adcs r4, %[r]\n\t"
  185681. #else
  185682. "adc r4, %[r]\n\t"
  185683. #endif
  185684. #ifdef WOLFSSL_KEIL
  185685. "adcs r2, r2, %[r]\n\t"
  185686. #elif defined(__clang__)
  185687. "adcs r2, %[r]\n\t"
  185688. #else
  185689. "adc r2, %[r]\n\t"
  185690. #endif
  185691. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185692. "adds r3, r3, r6\n\t"
  185693. #else
  185694. "add r3, r3, r6\n\t"
  185695. #endif
  185696. #ifdef WOLFSSL_KEIL
  185697. "adcs r4, r4, %[r]\n\t"
  185698. #elif defined(__clang__)
  185699. "adcs r4, %[r]\n\t"
  185700. #else
  185701. "adc r4, %[r]\n\t"
  185702. #endif
  185703. #ifdef WOLFSSL_KEIL
  185704. "adcs r2, r2, %[r]\n\t"
  185705. #elif defined(__clang__)
  185706. "adcs r2, %[r]\n\t"
  185707. #else
  185708. "adc r2, %[r]\n\t"
  185709. #endif
  185710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185711. "lsrs r6, r7, #16\n\t"
  185712. #else
  185713. "lsr r6, r7, #16\n\t"
  185714. #endif
  185715. #ifdef WOLFSSL_KEIL
  185716. "muls r5, r6, r5\n\t"
  185717. #elif defined(__clang__)
  185718. "muls r5, r6\n\t"
  185719. #else
  185720. "mul r5, r6\n\t"
  185721. #endif
  185722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185723. "lsrs r6, r5, #16\n\t"
  185724. #else
  185725. "lsr r6, r5, #16\n\t"
  185726. #endif
  185727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185728. "lsls r5, r5, #16\n\t"
  185729. #else
  185730. "lsl r5, r5, #16\n\t"
  185731. #endif
  185732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185733. "adds r3, r3, r5\n\t"
  185734. #else
  185735. "add r3, r3, r5\n\t"
  185736. #endif
  185737. #ifdef WOLFSSL_KEIL
  185738. "adcs r4, r4, r6\n\t"
  185739. #elif defined(__clang__)
  185740. "adcs r4, r6\n\t"
  185741. #else
  185742. "adc r4, r6\n\t"
  185743. #endif
  185744. #ifdef WOLFSSL_KEIL
  185745. "adcs r2, r2, %[r]\n\t"
  185746. #elif defined(__clang__)
  185747. "adcs r2, %[r]\n\t"
  185748. #else
  185749. "adc r2, %[r]\n\t"
  185750. #endif
  185751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185752. "adds r3, r3, r5\n\t"
  185753. #else
  185754. "add r3, r3, r5\n\t"
  185755. #endif
  185756. #ifdef WOLFSSL_KEIL
  185757. "adcs r4, r4, r6\n\t"
  185758. #elif defined(__clang__)
  185759. "adcs r4, r6\n\t"
  185760. #else
  185761. "adc r4, r6\n\t"
  185762. #endif
  185763. #ifdef WOLFSSL_KEIL
  185764. "adcs r2, r2, %[r]\n\t"
  185765. #elif defined(__clang__)
  185766. "adcs r2, %[r]\n\t"
  185767. #else
  185768. "adc r2, %[r]\n\t"
  185769. #endif
  185770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185771. "lsrs r5, %[a], #16\n\t"
  185772. #else
  185773. "lsr r5, %[a], #16\n\t"
  185774. #endif
  185775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185776. "lsrs r6, r7, #16\n\t"
  185777. #else
  185778. "lsr r6, r7, #16\n\t"
  185779. #endif
  185780. #ifdef WOLFSSL_KEIL
  185781. "muls r6, r5, r6\n\t"
  185782. #elif defined(__clang__)
  185783. "muls r6, r5\n\t"
  185784. #else
  185785. "mul r6, r5\n\t"
  185786. #endif
  185787. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185788. "adds r4, r4, r6\n\t"
  185789. #else
  185790. "add r4, 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 r4, r4, r6\n\t"
  185801. #else
  185802. "add r4, r4, r6\n\t"
  185803. #endif
  185804. #ifdef WOLFSSL_KEIL
  185805. "adcs r2, r2, %[r]\n\t"
  185806. #elif defined(__clang__)
  185807. "adcs r2, %[r]\n\t"
  185808. #else
  185809. "adc r2, %[r]\n\t"
  185810. #endif
  185811. "uxth r6, r7\n\t"
  185812. #ifdef WOLFSSL_KEIL
  185813. "muls r5, r6, r5\n\t"
  185814. #elif defined(__clang__)
  185815. "muls r5, r6\n\t"
  185816. #else
  185817. "mul r5, r6\n\t"
  185818. #endif
  185819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185820. "lsrs r6, r5, #16\n\t"
  185821. #else
  185822. "lsr r6, r5, #16\n\t"
  185823. #endif
  185824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185825. "lsls r5, r5, #16\n\t"
  185826. #else
  185827. "lsl r5, r5, #16\n\t"
  185828. #endif
  185829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185830. "adds r3, r3, r5\n\t"
  185831. #else
  185832. "add r3, r3, r5\n\t"
  185833. #endif
  185834. #ifdef WOLFSSL_KEIL
  185835. "adcs r4, r4, r6\n\t"
  185836. #elif defined(__clang__)
  185837. "adcs r4, r6\n\t"
  185838. #else
  185839. "adc r4, r6\n\t"
  185840. #endif
  185841. #ifdef WOLFSSL_KEIL
  185842. "adcs r2, r2, %[r]\n\t"
  185843. #elif defined(__clang__)
  185844. "adcs r2, %[r]\n\t"
  185845. #else
  185846. "adc r2, %[r]\n\t"
  185847. #endif
  185848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185849. "adds r3, r3, r5\n\t"
  185850. #else
  185851. "add r3, r3, r5\n\t"
  185852. #endif
  185853. #ifdef WOLFSSL_KEIL
  185854. "adcs r4, r4, r6\n\t"
  185855. #elif defined(__clang__)
  185856. "adcs r4, r6\n\t"
  185857. #else
  185858. "adc r4, r6\n\t"
  185859. #endif
  185860. #ifdef WOLFSSL_KEIL
  185861. "adcs r2, r2, %[r]\n\t"
  185862. #elif defined(__clang__)
  185863. "adcs r2, %[r]\n\t"
  185864. #else
  185865. "adc r2, %[r]\n\t"
  185866. #endif
  185867. "# A[8] * A[8]\n\t"
  185868. "mov %[a], r9\n\t"
  185869. "ldr r7, [%[a], #32]\n\t"
  185870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185871. "lsrs r6, r7, #16\n\t"
  185872. #else
  185873. "lsr r6, r7, #16\n\t"
  185874. #endif
  185875. "uxth r5, r7\n\t"
  185876. #ifdef WOLFSSL_KEIL
  185877. "muls r5, r5, r5\n\t"
  185878. #elif defined(__clang__)
  185879. "muls r5, r5\n\t"
  185880. #else
  185881. "mul r5, r5\n\t"
  185882. #endif
  185883. #ifdef WOLFSSL_KEIL
  185884. "muls r6, r6, r6\n\t"
  185885. #elif defined(__clang__)
  185886. "muls r6, r6\n\t"
  185887. #else
  185888. "mul r6, r6\n\t"
  185889. #endif
  185890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185891. "adds r3, r3, r5\n\t"
  185892. #else
  185893. "add r3, r3, r5\n\t"
  185894. #endif
  185895. #ifdef WOLFSSL_KEIL
  185896. "adcs r4, r4, r6\n\t"
  185897. #elif defined(__clang__)
  185898. "adcs r4, r6\n\t"
  185899. #else
  185900. "adc r4, r6\n\t"
  185901. #endif
  185902. #ifdef WOLFSSL_KEIL
  185903. "adcs r2, r2, %[r]\n\t"
  185904. #elif defined(__clang__)
  185905. "adcs r2, %[r]\n\t"
  185906. #else
  185907. "adc r2, %[r]\n\t"
  185908. #endif
  185909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185910. "lsrs r6, r7, #16\n\t"
  185911. #else
  185912. "lsr r6, r7, #16\n\t"
  185913. #endif
  185914. "uxth r5, r7\n\t"
  185915. #ifdef WOLFSSL_KEIL
  185916. "muls r5, r6, r5\n\t"
  185917. #elif defined(__clang__)
  185918. "muls r5, r6\n\t"
  185919. #else
  185920. "mul r5, r6\n\t"
  185921. #endif
  185922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185923. "lsrs r6, r5, #15\n\t"
  185924. #else
  185925. "lsr r6, r5, #15\n\t"
  185926. #endif
  185927. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185928. "lsls r5, r5, #17\n\t"
  185929. #else
  185930. "lsl r5, r5, #17\n\t"
  185931. #endif
  185932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185933. "adds r3, r3, r5\n\t"
  185934. #else
  185935. "add r3, r3, r5\n\t"
  185936. #endif
  185937. #ifdef WOLFSSL_KEIL
  185938. "adcs r4, r4, r6\n\t"
  185939. #elif defined(__clang__)
  185940. "adcs r4, r6\n\t"
  185941. #else
  185942. "adc r4, r6\n\t"
  185943. #endif
  185944. #ifdef WOLFSSL_KEIL
  185945. "adcs r2, r2, %[r]\n\t"
  185946. #elif defined(__clang__)
  185947. "adcs r2, %[r]\n\t"
  185948. #else
  185949. "adc r2, %[r]\n\t"
  185950. #endif
  185951. "mov %[r], r8\n\t"
  185952. "str r3, [%[r], #64]\n\t"
  185953. "movs %[r], #0\n\t"
  185954. "movs %[a], #48\n\t"
  185955. "add %[a], %[a], r9\n\t"
  185956. "ldm %[a]!, {r5, r6}\n\t"
  185957. "mov r10, r5\n\t"
  185958. "mov r11, r6\n\t"
  185959. "ldm %[a]!, {r5, r6}\n\t"
  185960. "mov r12, r5\n\t"
  185961. "mov lr, r6\n\t"
  185962. "mov %[a], r9\n\t"
  185963. "# A[9] * A[8]\n\t"
  185964. "movs r3, #0\n\t"
  185965. "ldr %[a], [%[a], #36]\n\t"
  185966. "uxth r5, %[a]\n\t"
  185967. "uxth r6, r7\n\t"
  185968. #ifdef WOLFSSL_KEIL
  185969. "muls r6, r5, r6\n\t"
  185970. #elif defined(__clang__)
  185971. "muls r6, r5\n\t"
  185972. #else
  185973. "mul r6, r5\n\t"
  185974. #endif
  185975. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185976. "adds r4, r4, r6\n\t"
  185977. #else
  185978. "add r4, r4, r6\n\t"
  185979. #endif
  185980. #ifdef WOLFSSL_KEIL
  185981. "adcs r2, r2, %[r]\n\t"
  185982. #elif defined(__clang__)
  185983. "adcs r2, %[r]\n\t"
  185984. #else
  185985. "adc r2, %[r]\n\t"
  185986. #endif
  185987. #ifdef WOLFSSL_KEIL
  185988. "adcs r3, r3, %[r]\n\t"
  185989. #elif defined(__clang__)
  185990. "adcs r3, %[r]\n\t"
  185991. #else
  185992. "adc r3, %[r]\n\t"
  185993. #endif
  185994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  185995. "adds r4, r4, r6\n\t"
  185996. #else
  185997. "add r4, r4, r6\n\t"
  185998. #endif
  185999. #ifdef WOLFSSL_KEIL
  186000. "adcs r2, r2, %[r]\n\t"
  186001. #elif defined(__clang__)
  186002. "adcs r2, %[r]\n\t"
  186003. #else
  186004. "adc r2, %[r]\n\t"
  186005. #endif
  186006. #ifdef WOLFSSL_KEIL
  186007. "adcs r3, r3, %[r]\n\t"
  186008. #elif defined(__clang__)
  186009. "adcs r3, %[r]\n\t"
  186010. #else
  186011. "adc r3, %[r]\n\t"
  186012. #endif
  186013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186014. "lsrs r6, r7, #16\n\t"
  186015. #else
  186016. "lsr r6, r7, #16\n\t"
  186017. #endif
  186018. #ifdef WOLFSSL_KEIL
  186019. "muls r5, r6, r5\n\t"
  186020. #elif defined(__clang__)
  186021. "muls r5, r6\n\t"
  186022. #else
  186023. "mul r5, r6\n\t"
  186024. #endif
  186025. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186026. "lsrs r6, r5, #16\n\t"
  186027. #else
  186028. "lsr r6, r5, #16\n\t"
  186029. #endif
  186030. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186031. "lsls r5, r5, #16\n\t"
  186032. #else
  186033. "lsl r5, r5, #16\n\t"
  186034. #endif
  186035. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186036. "adds r4, r4, r5\n\t"
  186037. #else
  186038. "add r4, r4, r5\n\t"
  186039. #endif
  186040. #ifdef WOLFSSL_KEIL
  186041. "adcs r2, r2, r6\n\t"
  186042. #elif defined(__clang__)
  186043. "adcs r2, r6\n\t"
  186044. #else
  186045. "adc r2, r6\n\t"
  186046. #endif
  186047. #ifdef WOLFSSL_KEIL
  186048. "adcs r3, r3, %[r]\n\t"
  186049. #elif defined(__clang__)
  186050. "adcs r3, %[r]\n\t"
  186051. #else
  186052. "adc r3, %[r]\n\t"
  186053. #endif
  186054. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186055. "adds r4, r4, r5\n\t"
  186056. #else
  186057. "add r4, r4, r5\n\t"
  186058. #endif
  186059. #ifdef WOLFSSL_KEIL
  186060. "adcs r2, r2, r6\n\t"
  186061. #elif defined(__clang__)
  186062. "adcs r2, r6\n\t"
  186063. #else
  186064. "adc r2, r6\n\t"
  186065. #endif
  186066. #ifdef WOLFSSL_KEIL
  186067. "adcs r3, r3, %[r]\n\t"
  186068. #elif defined(__clang__)
  186069. "adcs r3, %[r]\n\t"
  186070. #else
  186071. "adc r3, %[r]\n\t"
  186072. #endif
  186073. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186074. "lsrs r5, %[a], #16\n\t"
  186075. #else
  186076. "lsr r5, %[a], #16\n\t"
  186077. #endif
  186078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186079. "lsrs r6, r7, #16\n\t"
  186080. #else
  186081. "lsr r6, r7, #16\n\t"
  186082. #endif
  186083. #ifdef WOLFSSL_KEIL
  186084. "muls r6, r5, r6\n\t"
  186085. #elif defined(__clang__)
  186086. "muls r6, r5\n\t"
  186087. #else
  186088. "mul r6, r5\n\t"
  186089. #endif
  186090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186091. "adds r2, r2, r6\n\t"
  186092. #else
  186093. "add r2, r2, r6\n\t"
  186094. #endif
  186095. #ifdef WOLFSSL_KEIL
  186096. "adcs r3, r3, %[r]\n\t"
  186097. #elif defined(__clang__)
  186098. "adcs r3, %[r]\n\t"
  186099. #else
  186100. "adc r3, %[r]\n\t"
  186101. #endif
  186102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186103. "adds r2, r2, r6\n\t"
  186104. #else
  186105. "add r2, r2, r6\n\t"
  186106. #endif
  186107. #ifdef WOLFSSL_KEIL
  186108. "adcs r3, r3, %[r]\n\t"
  186109. #elif defined(__clang__)
  186110. "adcs r3, %[r]\n\t"
  186111. #else
  186112. "adc r3, %[r]\n\t"
  186113. #endif
  186114. "uxth r6, r7\n\t"
  186115. #ifdef WOLFSSL_KEIL
  186116. "muls r5, r6, r5\n\t"
  186117. #elif defined(__clang__)
  186118. "muls r5, r6\n\t"
  186119. #else
  186120. "mul r5, r6\n\t"
  186121. #endif
  186122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186123. "lsrs r6, r5, #16\n\t"
  186124. #else
  186125. "lsr r6, r5, #16\n\t"
  186126. #endif
  186127. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186128. "lsls r5, r5, #16\n\t"
  186129. #else
  186130. "lsl r5, r5, #16\n\t"
  186131. #endif
  186132. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186133. "adds r4, r4, r5\n\t"
  186134. #else
  186135. "add r4, r4, r5\n\t"
  186136. #endif
  186137. #ifdef WOLFSSL_KEIL
  186138. "adcs r2, r2, r6\n\t"
  186139. #elif defined(__clang__)
  186140. "adcs r2, r6\n\t"
  186141. #else
  186142. "adc r2, r6\n\t"
  186143. #endif
  186144. #ifdef WOLFSSL_KEIL
  186145. "adcs r3, r3, %[r]\n\t"
  186146. #elif defined(__clang__)
  186147. "adcs r3, %[r]\n\t"
  186148. #else
  186149. "adc r3, %[r]\n\t"
  186150. #endif
  186151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186152. "adds r4, r4, r5\n\t"
  186153. #else
  186154. "add r4, r4, r5\n\t"
  186155. #endif
  186156. #ifdef WOLFSSL_KEIL
  186157. "adcs r2, r2, r6\n\t"
  186158. #elif defined(__clang__)
  186159. "adcs r2, r6\n\t"
  186160. #else
  186161. "adc r2, r6\n\t"
  186162. #endif
  186163. #ifdef WOLFSSL_KEIL
  186164. "adcs r3, r3, %[r]\n\t"
  186165. #elif defined(__clang__)
  186166. "adcs r3, %[r]\n\t"
  186167. #else
  186168. "adc r3, %[r]\n\t"
  186169. #endif
  186170. "# A[10] * A[7]\n\t"
  186171. "mov %[a], r9\n\t"
  186172. "ldr r7, [%[a], #28]\n\t"
  186173. "ldr %[a], [%[a], #40]\n\t"
  186174. "uxth r5, %[a]\n\t"
  186175. "uxth r6, r7\n\t"
  186176. #ifdef WOLFSSL_KEIL
  186177. "muls r6, r5, r6\n\t"
  186178. #elif defined(__clang__)
  186179. "muls r6, r5\n\t"
  186180. #else
  186181. "mul r6, r5\n\t"
  186182. #endif
  186183. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186184. "adds r4, r4, r6\n\t"
  186185. #else
  186186. "add r4, r4, r6\n\t"
  186187. #endif
  186188. #ifdef WOLFSSL_KEIL
  186189. "adcs r2, r2, %[r]\n\t"
  186190. #elif defined(__clang__)
  186191. "adcs r2, %[r]\n\t"
  186192. #else
  186193. "adc r2, %[r]\n\t"
  186194. #endif
  186195. #ifdef WOLFSSL_KEIL
  186196. "adcs r3, r3, %[r]\n\t"
  186197. #elif defined(__clang__)
  186198. "adcs r3, %[r]\n\t"
  186199. #else
  186200. "adc r3, %[r]\n\t"
  186201. #endif
  186202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186203. "adds r4, r4, r6\n\t"
  186204. #else
  186205. "add r4, r4, r6\n\t"
  186206. #endif
  186207. #ifdef WOLFSSL_KEIL
  186208. "adcs r2, r2, %[r]\n\t"
  186209. #elif defined(__clang__)
  186210. "adcs r2, %[r]\n\t"
  186211. #else
  186212. "adc r2, %[r]\n\t"
  186213. #endif
  186214. #ifdef WOLFSSL_KEIL
  186215. "adcs r3, r3, %[r]\n\t"
  186216. #elif defined(__clang__)
  186217. "adcs r3, %[r]\n\t"
  186218. #else
  186219. "adc r3, %[r]\n\t"
  186220. #endif
  186221. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186222. "lsrs r6, r7, #16\n\t"
  186223. #else
  186224. "lsr r6, r7, #16\n\t"
  186225. #endif
  186226. #ifdef WOLFSSL_KEIL
  186227. "muls r5, r6, r5\n\t"
  186228. #elif defined(__clang__)
  186229. "muls r5, r6\n\t"
  186230. #else
  186231. "mul r5, r6\n\t"
  186232. #endif
  186233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186234. "lsrs r6, r5, #16\n\t"
  186235. #else
  186236. "lsr r6, r5, #16\n\t"
  186237. #endif
  186238. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186239. "lsls r5, r5, #16\n\t"
  186240. #else
  186241. "lsl r5, r5, #16\n\t"
  186242. #endif
  186243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186244. "adds r4, r4, r5\n\t"
  186245. #else
  186246. "add r4, r4, r5\n\t"
  186247. #endif
  186248. #ifdef WOLFSSL_KEIL
  186249. "adcs r2, r2, r6\n\t"
  186250. #elif defined(__clang__)
  186251. "adcs r2, r6\n\t"
  186252. #else
  186253. "adc r2, r6\n\t"
  186254. #endif
  186255. #ifdef WOLFSSL_KEIL
  186256. "adcs r3, r3, %[r]\n\t"
  186257. #elif defined(__clang__)
  186258. "adcs r3, %[r]\n\t"
  186259. #else
  186260. "adc r3, %[r]\n\t"
  186261. #endif
  186262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186263. "adds r4, r4, r5\n\t"
  186264. #else
  186265. "add r4, r4, r5\n\t"
  186266. #endif
  186267. #ifdef WOLFSSL_KEIL
  186268. "adcs r2, r2, r6\n\t"
  186269. #elif defined(__clang__)
  186270. "adcs r2, r6\n\t"
  186271. #else
  186272. "adc r2, r6\n\t"
  186273. #endif
  186274. #ifdef WOLFSSL_KEIL
  186275. "adcs r3, r3, %[r]\n\t"
  186276. #elif defined(__clang__)
  186277. "adcs r3, %[r]\n\t"
  186278. #else
  186279. "adc r3, %[r]\n\t"
  186280. #endif
  186281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186282. "lsrs r5, %[a], #16\n\t"
  186283. #else
  186284. "lsr r5, %[a], #16\n\t"
  186285. #endif
  186286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186287. "lsrs r6, r7, #16\n\t"
  186288. #else
  186289. "lsr r6, r7, #16\n\t"
  186290. #endif
  186291. #ifdef WOLFSSL_KEIL
  186292. "muls r6, r5, r6\n\t"
  186293. #elif defined(__clang__)
  186294. "muls r6, r5\n\t"
  186295. #else
  186296. "mul r6, r5\n\t"
  186297. #endif
  186298. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186299. "adds r2, r2, r6\n\t"
  186300. #else
  186301. "add r2, r2, r6\n\t"
  186302. #endif
  186303. #ifdef WOLFSSL_KEIL
  186304. "adcs r3, r3, %[r]\n\t"
  186305. #elif defined(__clang__)
  186306. "adcs r3, %[r]\n\t"
  186307. #else
  186308. "adc r3, %[r]\n\t"
  186309. #endif
  186310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186311. "adds r2, r2, r6\n\t"
  186312. #else
  186313. "add r2, r2, r6\n\t"
  186314. #endif
  186315. #ifdef WOLFSSL_KEIL
  186316. "adcs r3, r3, %[r]\n\t"
  186317. #elif defined(__clang__)
  186318. "adcs r3, %[r]\n\t"
  186319. #else
  186320. "adc r3, %[r]\n\t"
  186321. #endif
  186322. "uxth r6, r7\n\t"
  186323. #ifdef WOLFSSL_KEIL
  186324. "muls r5, r6, r5\n\t"
  186325. #elif defined(__clang__)
  186326. "muls r5, r6\n\t"
  186327. #else
  186328. "mul r5, r6\n\t"
  186329. #endif
  186330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186331. "lsrs r6, r5, #16\n\t"
  186332. #else
  186333. "lsr r6, r5, #16\n\t"
  186334. #endif
  186335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186336. "lsls r5, r5, #16\n\t"
  186337. #else
  186338. "lsl r5, r5, #16\n\t"
  186339. #endif
  186340. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186341. "adds r4, r4, r5\n\t"
  186342. #else
  186343. "add r4, r4, r5\n\t"
  186344. #endif
  186345. #ifdef WOLFSSL_KEIL
  186346. "adcs r2, r2, r6\n\t"
  186347. #elif defined(__clang__)
  186348. "adcs r2, r6\n\t"
  186349. #else
  186350. "adc r2, r6\n\t"
  186351. #endif
  186352. #ifdef WOLFSSL_KEIL
  186353. "adcs r3, r3, %[r]\n\t"
  186354. #elif defined(__clang__)
  186355. "adcs r3, %[r]\n\t"
  186356. #else
  186357. "adc r3, %[r]\n\t"
  186358. #endif
  186359. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186360. "adds r4, r4, r5\n\t"
  186361. #else
  186362. "add r4, r4, r5\n\t"
  186363. #endif
  186364. #ifdef WOLFSSL_KEIL
  186365. "adcs r2, r2, r6\n\t"
  186366. #elif defined(__clang__)
  186367. "adcs r2, r6\n\t"
  186368. #else
  186369. "adc r2, r6\n\t"
  186370. #endif
  186371. #ifdef WOLFSSL_KEIL
  186372. "adcs r3, r3, %[r]\n\t"
  186373. #elif defined(__clang__)
  186374. "adcs r3, %[r]\n\t"
  186375. #else
  186376. "adc r3, %[r]\n\t"
  186377. #endif
  186378. "# A[11] * A[6]\n\t"
  186379. "mov %[a], r9\n\t"
  186380. "ldr r7, [%[a], #24]\n\t"
  186381. "ldr %[a], [%[a], #44]\n\t"
  186382. "uxth r5, %[a]\n\t"
  186383. "uxth r6, r7\n\t"
  186384. #ifdef WOLFSSL_KEIL
  186385. "muls r6, r5, r6\n\t"
  186386. #elif defined(__clang__)
  186387. "muls r6, r5\n\t"
  186388. #else
  186389. "mul r6, r5\n\t"
  186390. #endif
  186391. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186392. "adds r4, r4, r6\n\t"
  186393. #else
  186394. "add r4, r4, r6\n\t"
  186395. #endif
  186396. #ifdef WOLFSSL_KEIL
  186397. "adcs r2, r2, %[r]\n\t"
  186398. #elif defined(__clang__)
  186399. "adcs r2, %[r]\n\t"
  186400. #else
  186401. "adc r2, %[r]\n\t"
  186402. #endif
  186403. #ifdef WOLFSSL_KEIL
  186404. "adcs r3, r3, %[r]\n\t"
  186405. #elif defined(__clang__)
  186406. "adcs r3, %[r]\n\t"
  186407. #else
  186408. "adc r3, %[r]\n\t"
  186409. #endif
  186410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186411. "adds r4, r4, r6\n\t"
  186412. #else
  186413. "add r4, r4, r6\n\t"
  186414. #endif
  186415. #ifdef WOLFSSL_KEIL
  186416. "adcs r2, r2, %[r]\n\t"
  186417. #elif defined(__clang__)
  186418. "adcs r2, %[r]\n\t"
  186419. #else
  186420. "adc r2, %[r]\n\t"
  186421. #endif
  186422. #ifdef WOLFSSL_KEIL
  186423. "adcs r3, r3, %[r]\n\t"
  186424. #elif defined(__clang__)
  186425. "adcs r3, %[r]\n\t"
  186426. #else
  186427. "adc r3, %[r]\n\t"
  186428. #endif
  186429. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186430. "lsrs r6, r7, #16\n\t"
  186431. #else
  186432. "lsr r6, r7, #16\n\t"
  186433. #endif
  186434. #ifdef WOLFSSL_KEIL
  186435. "muls r5, r6, r5\n\t"
  186436. #elif defined(__clang__)
  186437. "muls r5, r6\n\t"
  186438. #else
  186439. "mul r5, r6\n\t"
  186440. #endif
  186441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186442. "lsrs r6, r5, #16\n\t"
  186443. #else
  186444. "lsr r6, r5, #16\n\t"
  186445. #endif
  186446. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186447. "lsls r5, r5, #16\n\t"
  186448. #else
  186449. "lsl r5, r5, #16\n\t"
  186450. #endif
  186451. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186452. "adds r4, r4, r5\n\t"
  186453. #else
  186454. "add r4, r4, r5\n\t"
  186455. #endif
  186456. #ifdef WOLFSSL_KEIL
  186457. "adcs r2, r2, r6\n\t"
  186458. #elif defined(__clang__)
  186459. "adcs r2, r6\n\t"
  186460. #else
  186461. "adc r2, r6\n\t"
  186462. #endif
  186463. #ifdef WOLFSSL_KEIL
  186464. "adcs r3, r3, %[r]\n\t"
  186465. #elif defined(__clang__)
  186466. "adcs r3, %[r]\n\t"
  186467. #else
  186468. "adc r3, %[r]\n\t"
  186469. #endif
  186470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186471. "adds r4, r4, r5\n\t"
  186472. #else
  186473. "add r4, r4, r5\n\t"
  186474. #endif
  186475. #ifdef WOLFSSL_KEIL
  186476. "adcs r2, r2, r6\n\t"
  186477. #elif defined(__clang__)
  186478. "adcs r2, r6\n\t"
  186479. #else
  186480. "adc r2, r6\n\t"
  186481. #endif
  186482. #ifdef WOLFSSL_KEIL
  186483. "adcs r3, r3, %[r]\n\t"
  186484. #elif defined(__clang__)
  186485. "adcs r3, %[r]\n\t"
  186486. #else
  186487. "adc r3, %[r]\n\t"
  186488. #endif
  186489. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186490. "lsrs r5, %[a], #16\n\t"
  186491. #else
  186492. "lsr r5, %[a], #16\n\t"
  186493. #endif
  186494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186495. "lsrs r6, r7, #16\n\t"
  186496. #else
  186497. "lsr r6, r7, #16\n\t"
  186498. #endif
  186499. #ifdef WOLFSSL_KEIL
  186500. "muls r6, r5, r6\n\t"
  186501. #elif defined(__clang__)
  186502. "muls r6, r5\n\t"
  186503. #else
  186504. "mul r6, r5\n\t"
  186505. #endif
  186506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186507. "adds r2, r2, r6\n\t"
  186508. #else
  186509. "add r2, 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 r2, r2, r6\n\t"
  186520. #else
  186521. "add r2, r2, r6\n\t"
  186522. #endif
  186523. #ifdef WOLFSSL_KEIL
  186524. "adcs r3, r3, %[r]\n\t"
  186525. #elif defined(__clang__)
  186526. "adcs r3, %[r]\n\t"
  186527. #else
  186528. "adc r3, %[r]\n\t"
  186529. #endif
  186530. "uxth r6, r7\n\t"
  186531. #ifdef WOLFSSL_KEIL
  186532. "muls r5, r6, r5\n\t"
  186533. #elif defined(__clang__)
  186534. "muls r5, r6\n\t"
  186535. #else
  186536. "mul r5, r6\n\t"
  186537. #endif
  186538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186539. "lsrs r6, r5, #16\n\t"
  186540. #else
  186541. "lsr r6, r5, #16\n\t"
  186542. #endif
  186543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186544. "lsls r5, r5, #16\n\t"
  186545. #else
  186546. "lsl r5, r5, #16\n\t"
  186547. #endif
  186548. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186549. "adds r4, r4, r5\n\t"
  186550. #else
  186551. "add r4, r4, r5\n\t"
  186552. #endif
  186553. #ifdef WOLFSSL_KEIL
  186554. "adcs r2, r2, r6\n\t"
  186555. #elif defined(__clang__)
  186556. "adcs r2, r6\n\t"
  186557. #else
  186558. "adc r2, r6\n\t"
  186559. #endif
  186560. #ifdef WOLFSSL_KEIL
  186561. "adcs r3, r3, %[r]\n\t"
  186562. #elif defined(__clang__)
  186563. "adcs r3, %[r]\n\t"
  186564. #else
  186565. "adc r3, %[r]\n\t"
  186566. #endif
  186567. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186568. "adds r4, r4, r5\n\t"
  186569. #else
  186570. "add r4, r4, r5\n\t"
  186571. #endif
  186572. #ifdef WOLFSSL_KEIL
  186573. "adcs r2, r2, r6\n\t"
  186574. #elif defined(__clang__)
  186575. "adcs r2, r6\n\t"
  186576. #else
  186577. "adc r2, r6\n\t"
  186578. #endif
  186579. #ifdef WOLFSSL_KEIL
  186580. "adcs r3, r3, %[r]\n\t"
  186581. #elif defined(__clang__)
  186582. "adcs r3, %[r]\n\t"
  186583. #else
  186584. "adc r3, %[r]\n\t"
  186585. #endif
  186586. "# A[12] * A[5]\n\t"
  186587. "mov %[a], r9\n\t"
  186588. "ldr r7, [%[a], #20]\n\t"
  186589. "mov %[a], r10\n\t"
  186590. "uxth r5, %[a]\n\t"
  186591. "uxth r6, r7\n\t"
  186592. #ifdef WOLFSSL_KEIL
  186593. "muls r6, r5, r6\n\t"
  186594. #elif defined(__clang__)
  186595. "muls r6, r5\n\t"
  186596. #else
  186597. "mul r6, r5\n\t"
  186598. #endif
  186599. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186600. "adds r4, r4, r6\n\t"
  186601. #else
  186602. "add r4, r4, r6\n\t"
  186603. #endif
  186604. #ifdef WOLFSSL_KEIL
  186605. "adcs r2, r2, %[r]\n\t"
  186606. #elif defined(__clang__)
  186607. "adcs r2, %[r]\n\t"
  186608. #else
  186609. "adc r2, %[r]\n\t"
  186610. #endif
  186611. #ifdef WOLFSSL_KEIL
  186612. "adcs r3, r3, %[r]\n\t"
  186613. #elif defined(__clang__)
  186614. "adcs r3, %[r]\n\t"
  186615. #else
  186616. "adc r3, %[r]\n\t"
  186617. #endif
  186618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186619. "adds r4, r4, r6\n\t"
  186620. #else
  186621. "add r4, r4, r6\n\t"
  186622. #endif
  186623. #ifdef WOLFSSL_KEIL
  186624. "adcs r2, r2, %[r]\n\t"
  186625. #elif defined(__clang__)
  186626. "adcs r2, %[r]\n\t"
  186627. #else
  186628. "adc r2, %[r]\n\t"
  186629. #endif
  186630. #ifdef WOLFSSL_KEIL
  186631. "adcs r3, r3, %[r]\n\t"
  186632. #elif defined(__clang__)
  186633. "adcs r3, %[r]\n\t"
  186634. #else
  186635. "adc r3, %[r]\n\t"
  186636. #endif
  186637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186638. "lsrs r6, r7, #16\n\t"
  186639. #else
  186640. "lsr r6, r7, #16\n\t"
  186641. #endif
  186642. #ifdef WOLFSSL_KEIL
  186643. "muls r5, r6, r5\n\t"
  186644. #elif defined(__clang__)
  186645. "muls r5, r6\n\t"
  186646. #else
  186647. "mul r5, r6\n\t"
  186648. #endif
  186649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186650. "lsrs r6, r5, #16\n\t"
  186651. #else
  186652. "lsr r6, r5, #16\n\t"
  186653. #endif
  186654. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186655. "lsls r5, r5, #16\n\t"
  186656. #else
  186657. "lsl r5, r5, #16\n\t"
  186658. #endif
  186659. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186660. "adds r4, r4, r5\n\t"
  186661. #else
  186662. "add r4, r4, r5\n\t"
  186663. #endif
  186664. #ifdef WOLFSSL_KEIL
  186665. "adcs r2, r2, r6\n\t"
  186666. #elif defined(__clang__)
  186667. "adcs r2, r6\n\t"
  186668. #else
  186669. "adc r2, r6\n\t"
  186670. #endif
  186671. #ifdef WOLFSSL_KEIL
  186672. "adcs r3, r3, %[r]\n\t"
  186673. #elif defined(__clang__)
  186674. "adcs r3, %[r]\n\t"
  186675. #else
  186676. "adc r3, %[r]\n\t"
  186677. #endif
  186678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186679. "adds r4, r4, r5\n\t"
  186680. #else
  186681. "add r4, r4, r5\n\t"
  186682. #endif
  186683. #ifdef WOLFSSL_KEIL
  186684. "adcs r2, r2, r6\n\t"
  186685. #elif defined(__clang__)
  186686. "adcs r2, r6\n\t"
  186687. #else
  186688. "adc r2, r6\n\t"
  186689. #endif
  186690. #ifdef WOLFSSL_KEIL
  186691. "adcs r3, r3, %[r]\n\t"
  186692. #elif defined(__clang__)
  186693. "adcs r3, %[r]\n\t"
  186694. #else
  186695. "adc r3, %[r]\n\t"
  186696. #endif
  186697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186698. "lsrs r5, %[a], #16\n\t"
  186699. #else
  186700. "lsr r5, %[a], #16\n\t"
  186701. #endif
  186702. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186703. "lsrs r6, r7, #16\n\t"
  186704. #else
  186705. "lsr r6, r7, #16\n\t"
  186706. #endif
  186707. #ifdef WOLFSSL_KEIL
  186708. "muls r6, r5, r6\n\t"
  186709. #elif defined(__clang__)
  186710. "muls r6, r5\n\t"
  186711. #else
  186712. "mul r6, r5\n\t"
  186713. #endif
  186714. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186715. "adds r2, r2, r6\n\t"
  186716. #else
  186717. "add r2, 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 r2, r2, r6\n\t"
  186728. #else
  186729. "add r2, r2, r6\n\t"
  186730. #endif
  186731. #ifdef WOLFSSL_KEIL
  186732. "adcs r3, r3, %[r]\n\t"
  186733. #elif defined(__clang__)
  186734. "adcs r3, %[r]\n\t"
  186735. #else
  186736. "adc r3, %[r]\n\t"
  186737. #endif
  186738. "uxth r6, r7\n\t"
  186739. #ifdef WOLFSSL_KEIL
  186740. "muls r5, r6, r5\n\t"
  186741. #elif defined(__clang__)
  186742. "muls r5, r6\n\t"
  186743. #else
  186744. "mul r5, r6\n\t"
  186745. #endif
  186746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186747. "lsrs r6, r5, #16\n\t"
  186748. #else
  186749. "lsr r6, r5, #16\n\t"
  186750. #endif
  186751. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186752. "lsls r5, r5, #16\n\t"
  186753. #else
  186754. "lsl r5, r5, #16\n\t"
  186755. #endif
  186756. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186757. "adds r4, r4, r5\n\t"
  186758. #else
  186759. "add r4, r4, r5\n\t"
  186760. #endif
  186761. #ifdef WOLFSSL_KEIL
  186762. "adcs r2, r2, r6\n\t"
  186763. #elif defined(__clang__)
  186764. "adcs r2, r6\n\t"
  186765. #else
  186766. "adc r2, r6\n\t"
  186767. #endif
  186768. #ifdef WOLFSSL_KEIL
  186769. "adcs r3, r3, %[r]\n\t"
  186770. #elif defined(__clang__)
  186771. "adcs r3, %[r]\n\t"
  186772. #else
  186773. "adc r3, %[r]\n\t"
  186774. #endif
  186775. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186776. "adds r4, r4, r5\n\t"
  186777. #else
  186778. "add r4, r4, r5\n\t"
  186779. #endif
  186780. #ifdef WOLFSSL_KEIL
  186781. "adcs r2, r2, r6\n\t"
  186782. #elif defined(__clang__)
  186783. "adcs r2, r6\n\t"
  186784. #else
  186785. "adc r2, r6\n\t"
  186786. #endif
  186787. #ifdef WOLFSSL_KEIL
  186788. "adcs r3, r3, %[r]\n\t"
  186789. #elif defined(__clang__)
  186790. "adcs r3, %[r]\n\t"
  186791. #else
  186792. "adc r3, %[r]\n\t"
  186793. #endif
  186794. "# A[13] * A[4]\n\t"
  186795. "mov %[a], r9\n\t"
  186796. "ldr r7, [%[a], #16]\n\t"
  186797. "mov %[a], r11\n\t"
  186798. "uxth r5, %[a]\n\t"
  186799. "uxth r6, r7\n\t"
  186800. #ifdef WOLFSSL_KEIL
  186801. "muls r6, r5, r6\n\t"
  186802. #elif defined(__clang__)
  186803. "muls r6, r5\n\t"
  186804. #else
  186805. "mul r6, r5\n\t"
  186806. #endif
  186807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186808. "adds r4, r4, r6\n\t"
  186809. #else
  186810. "add r4, r4, r6\n\t"
  186811. #endif
  186812. #ifdef WOLFSSL_KEIL
  186813. "adcs r2, r2, %[r]\n\t"
  186814. #elif defined(__clang__)
  186815. "adcs r2, %[r]\n\t"
  186816. #else
  186817. "adc r2, %[r]\n\t"
  186818. #endif
  186819. #ifdef WOLFSSL_KEIL
  186820. "adcs r3, r3, %[r]\n\t"
  186821. #elif defined(__clang__)
  186822. "adcs r3, %[r]\n\t"
  186823. #else
  186824. "adc r3, %[r]\n\t"
  186825. #endif
  186826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186827. "adds r4, r4, r6\n\t"
  186828. #else
  186829. "add r4, r4, r6\n\t"
  186830. #endif
  186831. #ifdef WOLFSSL_KEIL
  186832. "adcs r2, r2, %[r]\n\t"
  186833. #elif defined(__clang__)
  186834. "adcs r2, %[r]\n\t"
  186835. #else
  186836. "adc r2, %[r]\n\t"
  186837. #endif
  186838. #ifdef WOLFSSL_KEIL
  186839. "adcs r3, r3, %[r]\n\t"
  186840. #elif defined(__clang__)
  186841. "adcs r3, %[r]\n\t"
  186842. #else
  186843. "adc r3, %[r]\n\t"
  186844. #endif
  186845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186846. "lsrs r6, r7, #16\n\t"
  186847. #else
  186848. "lsr r6, r7, #16\n\t"
  186849. #endif
  186850. #ifdef WOLFSSL_KEIL
  186851. "muls r5, r6, r5\n\t"
  186852. #elif defined(__clang__)
  186853. "muls r5, r6\n\t"
  186854. #else
  186855. "mul r5, r6\n\t"
  186856. #endif
  186857. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186858. "lsrs r6, r5, #16\n\t"
  186859. #else
  186860. "lsr r6, r5, #16\n\t"
  186861. #endif
  186862. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186863. "lsls r5, r5, #16\n\t"
  186864. #else
  186865. "lsl r5, r5, #16\n\t"
  186866. #endif
  186867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186868. "adds r4, r4, r5\n\t"
  186869. #else
  186870. "add r4, r4, r5\n\t"
  186871. #endif
  186872. #ifdef WOLFSSL_KEIL
  186873. "adcs r2, r2, r6\n\t"
  186874. #elif defined(__clang__)
  186875. "adcs r2, r6\n\t"
  186876. #else
  186877. "adc r2, r6\n\t"
  186878. #endif
  186879. #ifdef WOLFSSL_KEIL
  186880. "adcs r3, r3, %[r]\n\t"
  186881. #elif defined(__clang__)
  186882. "adcs r3, %[r]\n\t"
  186883. #else
  186884. "adc r3, %[r]\n\t"
  186885. #endif
  186886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186887. "adds r4, r4, r5\n\t"
  186888. #else
  186889. "add r4, r4, r5\n\t"
  186890. #endif
  186891. #ifdef WOLFSSL_KEIL
  186892. "adcs r2, r2, r6\n\t"
  186893. #elif defined(__clang__)
  186894. "adcs r2, r6\n\t"
  186895. #else
  186896. "adc r2, r6\n\t"
  186897. #endif
  186898. #ifdef WOLFSSL_KEIL
  186899. "adcs r3, r3, %[r]\n\t"
  186900. #elif defined(__clang__)
  186901. "adcs r3, %[r]\n\t"
  186902. #else
  186903. "adc r3, %[r]\n\t"
  186904. #endif
  186905. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186906. "lsrs r5, %[a], #16\n\t"
  186907. #else
  186908. "lsr r5, %[a], #16\n\t"
  186909. #endif
  186910. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186911. "lsrs r6, r7, #16\n\t"
  186912. #else
  186913. "lsr r6, r7, #16\n\t"
  186914. #endif
  186915. #ifdef WOLFSSL_KEIL
  186916. "muls r6, r5, r6\n\t"
  186917. #elif defined(__clang__)
  186918. "muls r6, r5\n\t"
  186919. #else
  186920. "mul r6, r5\n\t"
  186921. #endif
  186922. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186923. "adds r2, r2, r6\n\t"
  186924. #else
  186925. "add r2, 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 r2, r2, r6\n\t"
  186936. #else
  186937. "add r2, r2, r6\n\t"
  186938. #endif
  186939. #ifdef WOLFSSL_KEIL
  186940. "adcs r3, r3, %[r]\n\t"
  186941. #elif defined(__clang__)
  186942. "adcs r3, %[r]\n\t"
  186943. #else
  186944. "adc r3, %[r]\n\t"
  186945. #endif
  186946. "uxth r6, r7\n\t"
  186947. #ifdef WOLFSSL_KEIL
  186948. "muls r5, r6, r5\n\t"
  186949. #elif defined(__clang__)
  186950. "muls r5, r6\n\t"
  186951. #else
  186952. "mul r5, r6\n\t"
  186953. #endif
  186954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186955. "lsrs r6, r5, #16\n\t"
  186956. #else
  186957. "lsr r6, r5, #16\n\t"
  186958. #endif
  186959. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186960. "lsls r5, r5, #16\n\t"
  186961. #else
  186962. "lsl r5, r5, #16\n\t"
  186963. #endif
  186964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186965. "adds r4, r4, r5\n\t"
  186966. #else
  186967. "add r4, r4, r5\n\t"
  186968. #endif
  186969. #ifdef WOLFSSL_KEIL
  186970. "adcs r2, r2, r6\n\t"
  186971. #elif defined(__clang__)
  186972. "adcs r2, r6\n\t"
  186973. #else
  186974. "adc r2, r6\n\t"
  186975. #endif
  186976. #ifdef WOLFSSL_KEIL
  186977. "adcs r3, r3, %[r]\n\t"
  186978. #elif defined(__clang__)
  186979. "adcs r3, %[r]\n\t"
  186980. #else
  186981. "adc r3, %[r]\n\t"
  186982. #endif
  186983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  186984. "adds r4, r4, r5\n\t"
  186985. #else
  186986. "add r4, r4, r5\n\t"
  186987. #endif
  186988. #ifdef WOLFSSL_KEIL
  186989. "adcs r2, r2, r6\n\t"
  186990. #elif defined(__clang__)
  186991. "adcs r2, r6\n\t"
  186992. #else
  186993. "adc r2, r6\n\t"
  186994. #endif
  186995. #ifdef WOLFSSL_KEIL
  186996. "adcs r3, r3, %[r]\n\t"
  186997. #elif defined(__clang__)
  186998. "adcs r3, %[r]\n\t"
  186999. #else
  187000. "adc r3, %[r]\n\t"
  187001. #endif
  187002. "# A[14] * A[3]\n\t"
  187003. "mov %[a], r9\n\t"
  187004. "ldr r7, [%[a], #12]\n\t"
  187005. "mov %[a], r12\n\t"
  187006. "uxth r5, %[a]\n\t"
  187007. "uxth r6, r7\n\t"
  187008. #ifdef WOLFSSL_KEIL
  187009. "muls r6, r5, r6\n\t"
  187010. #elif defined(__clang__)
  187011. "muls r6, r5\n\t"
  187012. #else
  187013. "mul r6, r5\n\t"
  187014. #endif
  187015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187016. "adds r4, r4, r6\n\t"
  187017. #else
  187018. "add r4, r4, r6\n\t"
  187019. #endif
  187020. #ifdef WOLFSSL_KEIL
  187021. "adcs r2, r2, %[r]\n\t"
  187022. #elif defined(__clang__)
  187023. "adcs r2, %[r]\n\t"
  187024. #else
  187025. "adc r2, %[r]\n\t"
  187026. #endif
  187027. #ifdef WOLFSSL_KEIL
  187028. "adcs r3, r3, %[r]\n\t"
  187029. #elif defined(__clang__)
  187030. "adcs r3, %[r]\n\t"
  187031. #else
  187032. "adc r3, %[r]\n\t"
  187033. #endif
  187034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187035. "adds r4, r4, r6\n\t"
  187036. #else
  187037. "add r4, r4, r6\n\t"
  187038. #endif
  187039. #ifdef WOLFSSL_KEIL
  187040. "adcs r2, r2, %[r]\n\t"
  187041. #elif defined(__clang__)
  187042. "adcs r2, %[r]\n\t"
  187043. #else
  187044. "adc r2, %[r]\n\t"
  187045. #endif
  187046. #ifdef WOLFSSL_KEIL
  187047. "adcs r3, r3, %[r]\n\t"
  187048. #elif defined(__clang__)
  187049. "adcs r3, %[r]\n\t"
  187050. #else
  187051. "adc r3, %[r]\n\t"
  187052. #endif
  187053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187054. "lsrs r6, r7, #16\n\t"
  187055. #else
  187056. "lsr r6, r7, #16\n\t"
  187057. #endif
  187058. #ifdef WOLFSSL_KEIL
  187059. "muls r5, r6, r5\n\t"
  187060. #elif defined(__clang__)
  187061. "muls r5, r6\n\t"
  187062. #else
  187063. "mul r5, r6\n\t"
  187064. #endif
  187065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187066. "lsrs r6, r5, #16\n\t"
  187067. #else
  187068. "lsr r6, r5, #16\n\t"
  187069. #endif
  187070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187071. "lsls r5, r5, #16\n\t"
  187072. #else
  187073. "lsl r5, r5, #16\n\t"
  187074. #endif
  187075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187076. "adds r4, r4, r5\n\t"
  187077. #else
  187078. "add r4, r4, r5\n\t"
  187079. #endif
  187080. #ifdef WOLFSSL_KEIL
  187081. "adcs r2, r2, r6\n\t"
  187082. #elif defined(__clang__)
  187083. "adcs r2, r6\n\t"
  187084. #else
  187085. "adc r2, r6\n\t"
  187086. #endif
  187087. #ifdef WOLFSSL_KEIL
  187088. "adcs r3, r3, %[r]\n\t"
  187089. #elif defined(__clang__)
  187090. "adcs r3, %[r]\n\t"
  187091. #else
  187092. "adc r3, %[r]\n\t"
  187093. #endif
  187094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187095. "adds r4, r4, r5\n\t"
  187096. #else
  187097. "add r4, r4, r5\n\t"
  187098. #endif
  187099. #ifdef WOLFSSL_KEIL
  187100. "adcs r2, r2, r6\n\t"
  187101. #elif defined(__clang__)
  187102. "adcs r2, r6\n\t"
  187103. #else
  187104. "adc r2, r6\n\t"
  187105. #endif
  187106. #ifdef WOLFSSL_KEIL
  187107. "adcs r3, r3, %[r]\n\t"
  187108. #elif defined(__clang__)
  187109. "adcs r3, %[r]\n\t"
  187110. #else
  187111. "adc r3, %[r]\n\t"
  187112. #endif
  187113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187114. "lsrs r5, %[a], #16\n\t"
  187115. #else
  187116. "lsr r5, %[a], #16\n\t"
  187117. #endif
  187118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187119. "lsrs r6, r7, #16\n\t"
  187120. #else
  187121. "lsr r6, r7, #16\n\t"
  187122. #endif
  187123. #ifdef WOLFSSL_KEIL
  187124. "muls r6, r5, r6\n\t"
  187125. #elif defined(__clang__)
  187126. "muls r6, r5\n\t"
  187127. #else
  187128. "mul r6, r5\n\t"
  187129. #endif
  187130. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187131. "adds r2, r2, r6\n\t"
  187132. #else
  187133. "add r2, 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 r2, r2, r6\n\t"
  187144. #else
  187145. "add r2, r2, r6\n\t"
  187146. #endif
  187147. #ifdef WOLFSSL_KEIL
  187148. "adcs r3, r3, %[r]\n\t"
  187149. #elif defined(__clang__)
  187150. "adcs r3, %[r]\n\t"
  187151. #else
  187152. "adc r3, %[r]\n\t"
  187153. #endif
  187154. "uxth r6, r7\n\t"
  187155. #ifdef WOLFSSL_KEIL
  187156. "muls r5, r6, r5\n\t"
  187157. #elif defined(__clang__)
  187158. "muls r5, r6\n\t"
  187159. #else
  187160. "mul r5, r6\n\t"
  187161. #endif
  187162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187163. "lsrs r6, r5, #16\n\t"
  187164. #else
  187165. "lsr r6, r5, #16\n\t"
  187166. #endif
  187167. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187168. "lsls r5, r5, #16\n\t"
  187169. #else
  187170. "lsl r5, r5, #16\n\t"
  187171. #endif
  187172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187173. "adds r4, r4, r5\n\t"
  187174. #else
  187175. "add r4, r4, r5\n\t"
  187176. #endif
  187177. #ifdef WOLFSSL_KEIL
  187178. "adcs r2, r2, r6\n\t"
  187179. #elif defined(__clang__)
  187180. "adcs r2, r6\n\t"
  187181. #else
  187182. "adc r2, r6\n\t"
  187183. #endif
  187184. #ifdef WOLFSSL_KEIL
  187185. "adcs r3, r3, %[r]\n\t"
  187186. #elif defined(__clang__)
  187187. "adcs r3, %[r]\n\t"
  187188. #else
  187189. "adc r3, %[r]\n\t"
  187190. #endif
  187191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187192. "adds r4, r4, r5\n\t"
  187193. #else
  187194. "add r4, r4, r5\n\t"
  187195. #endif
  187196. #ifdef WOLFSSL_KEIL
  187197. "adcs r2, r2, r6\n\t"
  187198. #elif defined(__clang__)
  187199. "adcs r2, r6\n\t"
  187200. #else
  187201. "adc r2, r6\n\t"
  187202. #endif
  187203. #ifdef WOLFSSL_KEIL
  187204. "adcs r3, r3, %[r]\n\t"
  187205. #elif defined(__clang__)
  187206. "adcs r3, %[r]\n\t"
  187207. #else
  187208. "adc r3, %[r]\n\t"
  187209. #endif
  187210. "# A[15] * A[2]\n\t"
  187211. "mov %[a], r9\n\t"
  187212. "ldr r7, [%[a], #8]\n\t"
  187213. "mov %[a], lr\n\t"
  187214. "uxth r5, %[a]\n\t"
  187215. "uxth r6, r7\n\t"
  187216. #ifdef WOLFSSL_KEIL
  187217. "muls r6, r5, r6\n\t"
  187218. #elif defined(__clang__)
  187219. "muls r6, r5\n\t"
  187220. #else
  187221. "mul r6, r5\n\t"
  187222. #endif
  187223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187224. "adds r4, r4, r6\n\t"
  187225. #else
  187226. "add r4, r4, r6\n\t"
  187227. #endif
  187228. #ifdef WOLFSSL_KEIL
  187229. "adcs r2, r2, %[r]\n\t"
  187230. #elif defined(__clang__)
  187231. "adcs r2, %[r]\n\t"
  187232. #else
  187233. "adc r2, %[r]\n\t"
  187234. #endif
  187235. #ifdef WOLFSSL_KEIL
  187236. "adcs r3, r3, %[r]\n\t"
  187237. #elif defined(__clang__)
  187238. "adcs r3, %[r]\n\t"
  187239. #else
  187240. "adc r3, %[r]\n\t"
  187241. #endif
  187242. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187243. "adds r4, r4, r6\n\t"
  187244. #else
  187245. "add r4, r4, r6\n\t"
  187246. #endif
  187247. #ifdef WOLFSSL_KEIL
  187248. "adcs r2, r2, %[r]\n\t"
  187249. #elif defined(__clang__)
  187250. "adcs r2, %[r]\n\t"
  187251. #else
  187252. "adc r2, %[r]\n\t"
  187253. #endif
  187254. #ifdef WOLFSSL_KEIL
  187255. "adcs r3, r3, %[r]\n\t"
  187256. #elif defined(__clang__)
  187257. "adcs r3, %[r]\n\t"
  187258. #else
  187259. "adc r3, %[r]\n\t"
  187260. #endif
  187261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187262. "lsrs r6, r7, #16\n\t"
  187263. #else
  187264. "lsr r6, r7, #16\n\t"
  187265. #endif
  187266. #ifdef WOLFSSL_KEIL
  187267. "muls r5, r6, r5\n\t"
  187268. #elif defined(__clang__)
  187269. "muls r5, r6\n\t"
  187270. #else
  187271. "mul r5, r6\n\t"
  187272. #endif
  187273. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187274. "lsrs r6, r5, #16\n\t"
  187275. #else
  187276. "lsr r6, r5, #16\n\t"
  187277. #endif
  187278. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187279. "lsls r5, r5, #16\n\t"
  187280. #else
  187281. "lsl r5, r5, #16\n\t"
  187282. #endif
  187283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187284. "adds r4, r4, r5\n\t"
  187285. #else
  187286. "add r4, r4, r5\n\t"
  187287. #endif
  187288. #ifdef WOLFSSL_KEIL
  187289. "adcs r2, r2, r6\n\t"
  187290. #elif defined(__clang__)
  187291. "adcs r2, r6\n\t"
  187292. #else
  187293. "adc r2, r6\n\t"
  187294. #endif
  187295. #ifdef WOLFSSL_KEIL
  187296. "adcs r3, r3, %[r]\n\t"
  187297. #elif defined(__clang__)
  187298. "adcs r3, %[r]\n\t"
  187299. #else
  187300. "adc r3, %[r]\n\t"
  187301. #endif
  187302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187303. "adds r4, r4, r5\n\t"
  187304. #else
  187305. "add r4, r4, r5\n\t"
  187306. #endif
  187307. #ifdef WOLFSSL_KEIL
  187308. "adcs r2, r2, r6\n\t"
  187309. #elif defined(__clang__)
  187310. "adcs r2, r6\n\t"
  187311. #else
  187312. "adc r2, r6\n\t"
  187313. #endif
  187314. #ifdef WOLFSSL_KEIL
  187315. "adcs r3, r3, %[r]\n\t"
  187316. #elif defined(__clang__)
  187317. "adcs r3, %[r]\n\t"
  187318. #else
  187319. "adc r3, %[r]\n\t"
  187320. #endif
  187321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187322. "lsrs r5, %[a], #16\n\t"
  187323. #else
  187324. "lsr r5, %[a], #16\n\t"
  187325. #endif
  187326. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187327. "lsrs r6, r7, #16\n\t"
  187328. #else
  187329. "lsr r6, r7, #16\n\t"
  187330. #endif
  187331. #ifdef WOLFSSL_KEIL
  187332. "muls r6, r5, r6\n\t"
  187333. #elif defined(__clang__)
  187334. "muls r6, r5\n\t"
  187335. #else
  187336. "mul r6, r5\n\t"
  187337. #endif
  187338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187339. "adds r2, r2, r6\n\t"
  187340. #else
  187341. "add r2, 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 r2, r2, r6\n\t"
  187352. #else
  187353. "add r2, r2, r6\n\t"
  187354. #endif
  187355. #ifdef WOLFSSL_KEIL
  187356. "adcs r3, r3, %[r]\n\t"
  187357. #elif defined(__clang__)
  187358. "adcs r3, %[r]\n\t"
  187359. #else
  187360. "adc r3, %[r]\n\t"
  187361. #endif
  187362. "uxth r6, r7\n\t"
  187363. #ifdef WOLFSSL_KEIL
  187364. "muls r5, r6, r5\n\t"
  187365. #elif defined(__clang__)
  187366. "muls r5, r6\n\t"
  187367. #else
  187368. "mul r5, r6\n\t"
  187369. #endif
  187370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187371. "lsrs r6, r5, #16\n\t"
  187372. #else
  187373. "lsr r6, r5, #16\n\t"
  187374. #endif
  187375. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187376. "lsls r5, r5, #16\n\t"
  187377. #else
  187378. "lsl r5, r5, #16\n\t"
  187379. #endif
  187380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187381. "adds r4, r4, r5\n\t"
  187382. #else
  187383. "add r4, r4, r5\n\t"
  187384. #endif
  187385. #ifdef WOLFSSL_KEIL
  187386. "adcs r2, r2, r6\n\t"
  187387. #elif defined(__clang__)
  187388. "adcs r2, r6\n\t"
  187389. #else
  187390. "adc r2, r6\n\t"
  187391. #endif
  187392. #ifdef WOLFSSL_KEIL
  187393. "adcs r3, r3, %[r]\n\t"
  187394. #elif defined(__clang__)
  187395. "adcs r3, %[r]\n\t"
  187396. #else
  187397. "adc r3, %[r]\n\t"
  187398. #endif
  187399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187400. "adds r4, r4, r5\n\t"
  187401. #else
  187402. "add r4, r4, r5\n\t"
  187403. #endif
  187404. #ifdef WOLFSSL_KEIL
  187405. "adcs r2, r2, r6\n\t"
  187406. #elif defined(__clang__)
  187407. "adcs r2, r6\n\t"
  187408. #else
  187409. "adc r2, r6\n\t"
  187410. #endif
  187411. #ifdef WOLFSSL_KEIL
  187412. "adcs r3, r3, %[r]\n\t"
  187413. #elif defined(__clang__)
  187414. "adcs r3, %[r]\n\t"
  187415. #else
  187416. "adc r3, %[r]\n\t"
  187417. #endif
  187418. "mov %[r], r8\n\t"
  187419. "str r4, [%[r], #68]\n\t"
  187420. "movs %[r], #0\n\t"
  187421. "# A[15] * A[3]\n\t"
  187422. "movs r4, #0\n\t"
  187423. "mov %[a], r9\n\t"
  187424. "ldr r7, [%[a], #12]\n\t"
  187425. "mov %[a], lr\n\t"
  187426. "uxth r5, %[a]\n\t"
  187427. "uxth r6, r7\n\t"
  187428. #ifdef WOLFSSL_KEIL
  187429. "muls r6, r5, r6\n\t"
  187430. #elif defined(__clang__)
  187431. "muls r6, r5\n\t"
  187432. #else
  187433. "mul r6, r5\n\t"
  187434. #endif
  187435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187436. "adds r2, r2, r6\n\t"
  187437. #else
  187438. "add r2, r2, r6\n\t"
  187439. #endif
  187440. #ifdef WOLFSSL_KEIL
  187441. "adcs r3, r3, %[r]\n\t"
  187442. #elif defined(__clang__)
  187443. "adcs r3, %[r]\n\t"
  187444. #else
  187445. "adc r3, %[r]\n\t"
  187446. #endif
  187447. #ifdef WOLFSSL_KEIL
  187448. "adcs r4, r4, %[r]\n\t"
  187449. #elif defined(__clang__)
  187450. "adcs r4, %[r]\n\t"
  187451. #else
  187452. "adc r4, %[r]\n\t"
  187453. #endif
  187454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187455. "adds r2, r2, r6\n\t"
  187456. #else
  187457. "add r2, r2, r6\n\t"
  187458. #endif
  187459. #ifdef WOLFSSL_KEIL
  187460. "adcs r3, r3, %[r]\n\t"
  187461. #elif defined(__clang__)
  187462. "adcs r3, %[r]\n\t"
  187463. #else
  187464. "adc r3, %[r]\n\t"
  187465. #endif
  187466. #ifdef WOLFSSL_KEIL
  187467. "adcs r4, r4, %[r]\n\t"
  187468. #elif defined(__clang__)
  187469. "adcs r4, %[r]\n\t"
  187470. #else
  187471. "adc r4, %[r]\n\t"
  187472. #endif
  187473. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187474. "lsrs r6, r7, #16\n\t"
  187475. #else
  187476. "lsr r6, r7, #16\n\t"
  187477. #endif
  187478. #ifdef WOLFSSL_KEIL
  187479. "muls r5, r6, r5\n\t"
  187480. #elif defined(__clang__)
  187481. "muls r5, r6\n\t"
  187482. #else
  187483. "mul r5, r6\n\t"
  187484. #endif
  187485. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187486. "lsrs r6, r5, #16\n\t"
  187487. #else
  187488. "lsr r6, r5, #16\n\t"
  187489. #endif
  187490. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187491. "lsls r5, r5, #16\n\t"
  187492. #else
  187493. "lsl r5, r5, #16\n\t"
  187494. #endif
  187495. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187496. "adds r2, r2, r5\n\t"
  187497. #else
  187498. "add r2, r2, r5\n\t"
  187499. #endif
  187500. #ifdef WOLFSSL_KEIL
  187501. "adcs r3, r3, r6\n\t"
  187502. #elif defined(__clang__)
  187503. "adcs r3, r6\n\t"
  187504. #else
  187505. "adc r3, r6\n\t"
  187506. #endif
  187507. #ifdef WOLFSSL_KEIL
  187508. "adcs r4, r4, %[r]\n\t"
  187509. #elif defined(__clang__)
  187510. "adcs r4, %[r]\n\t"
  187511. #else
  187512. "adc r4, %[r]\n\t"
  187513. #endif
  187514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187515. "adds r2, r2, r5\n\t"
  187516. #else
  187517. "add r2, r2, r5\n\t"
  187518. #endif
  187519. #ifdef WOLFSSL_KEIL
  187520. "adcs r3, r3, r6\n\t"
  187521. #elif defined(__clang__)
  187522. "adcs r3, r6\n\t"
  187523. #else
  187524. "adc r3, r6\n\t"
  187525. #endif
  187526. #ifdef WOLFSSL_KEIL
  187527. "adcs r4, r4, %[r]\n\t"
  187528. #elif defined(__clang__)
  187529. "adcs r4, %[r]\n\t"
  187530. #else
  187531. "adc r4, %[r]\n\t"
  187532. #endif
  187533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187534. "lsrs r5, %[a], #16\n\t"
  187535. #else
  187536. "lsr r5, %[a], #16\n\t"
  187537. #endif
  187538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187539. "lsrs r6, r7, #16\n\t"
  187540. #else
  187541. "lsr r6, r7, #16\n\t"
  187542. #endif
  187543. #ifdef WOLFSSL_KEIL
  187544. "muls r6, r5, r6\n\t"
  187545. #elif defined(__clang__)
  187546. "muls r6, r5\n\t"
  187547. #else
  187548. "mul r6, r5\n\t"
  187549. #endif
  187550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187551. "adds r3, r3, r6\n\t"
  187552. #else
  187553. "add r3, r3, r6\n\t"
  187554. #endif
  187555. #ifdef WOLFSSL_KEIL
  187556. "adcs r4, r4, %[r]\n\t"
  187557. #elif defined(__clang__)
  187558. "adcs r4, %[r]\n\t"
  187559. #else
  187560. "adc r4, %[r]\n\t"
  187561. #endif
  187562. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187563. "adds r3, r3, r6\n\t"
  187564. #else
  187565. "add r3, r3, r6\n\t"
  187566. #endif
  187567. #ifdef WOLFSSL_KEIL
  187568. "adcs r4, r4, %[r]\n\t"
  187569. #elif defined(__clang__)
  187570. "adcs r4, %[r]\n\t"
  187571. #else
  187572. "adc r4, %[r]\n\t"
  187573. #endif
  187574. "uxth r6, r7\n\t"
  187575. #ifdef WOLFSSL_KEIL
  187576. "muls r5, r6, r5\n\t"
  187577. #elif defined(__clang__)
  187578. "muls r5, r6\n\t"
  187579. #else
  187580. "mul r5, r6\n\t"
  187581. #endif
  187582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187583. "lsrs r6, r5, #16\n\t"
  187584. #else
  187585. "lsr r6, r5, #16\n\t"
  187586. #endif
  187587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187588. "lsls r5, r5, #16\n\t"
  187589. #else
  187590. "lsl r5, r5, #16\n\t"
  187591. #endif
  187592. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187593. "adds r2, r2, r5\n\t"
  187594. #else
  187595. "add r2, r2, r5\n\t"
  187596. #endif
  187597. #ifdef WOLFSSL_KEIL
  187598. "adcs r3, r3, r6\n\t"
  187599. #elif defined(__clang__)
  187600. "adcs r3, r6\n\t"
  187601. #else
  187602. "adc r3, r6\n\t"
  187603. #endif
  187604. #ifdef WOLFSSL_KEIL
  187605. "adcs r4, r4, %[r]\n\t"
  187606. #elif defined(__clang__)
  187607. "adcs r4, %[r]\n\t"
  187608. #else
  187609. "adc r4, %[r]\n\t"
  187610. #endif
  187611. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187612. "adds r2, r2, r5\n\t"
  187613. #else
  187614. "add r2, r2, r5\n\t"
  187615. #endif
  187616. #ifdef WOLFSSL_KEIL
  187617. "adcs r3, r3, r6\n\t"
  187618. #elif defined(__clang__)
  187619. "adcs r3, r6\n\t"
  187620. #else
  187621. "adc r3, r6\n\t"
  187622. #endif
  187623. #ifdef WOLFSSL_KEIL
  187624. "adcs r4, r4, %[r]\n\t"
  187625. #elif defined(__clang__)
  187626. "adcs r4, %[r]\n\t"
  187627. #else
  187628. "adc r4, %[r]\n\t"
  187629. #endif
  187630. "# A[14] * A[4]\n\t"
  187631. "mov %[a], r9\n\t"
  187632. "ldr r7, [%[a], #16]\n\t"
  187633. "mov %[a], r12\n\t"
  187634. "uxth r5, %[a]\n\t"
  187635. "uxth r6, r7\n\t"
  187636. #ifdef WOLFSSL_KEIL
  187637. "muls r6, r5, r6\n\t"
  187638. #elif defined(__clang__)
  187639. "muls r6, r5\n\t"
  187640. #else
  187641. "mul r6, r5\n\t"
  187642. #endif
  187643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187644. "adds r2, r2, r6\n\t"
  187645. #else
  187646. "add r2, r2, r6\n\t"
  187647. #endif
  187648. #ifdef WOLFSSL_KEIL
  187649. "adcs r3, r3, %[r]\n\t"
  187650. #elif defined(__clang__)
  187651. "adcs r3, %[r]\n\t"
  187652. #else
  187653. "adc r3, %[r]\n\t"
  187654. #endif
  187655. #ifdef WOLFSSL_KEIL
  187656. "adcs r4, r4, %[r]\n\t"
  187657. #elif defined(__clang__)
  187658. "adcs r4, %[r]\n\t"
  187659. #else
  187660. "adc r4, %[r]\n\t"
  187661. #endif
  187662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187663. "adds r2, r2, r6\n\t"
  187664. #else
  187665. "add r2, r2, r6\n\t"
  187666. #endif
  187667. #ifdef WOLFSSL_KEIL
  187668. "adcs r3, r3, %[r]\n\t"
  187669. #elif defined(__clang__)
  187670. "adcs r3, %[r]\n\t"
  187671. #else
  187672. "adc r3, %[r]\n\t"
  187673. #endif
  187674. #ifdef WOLFSSL_KEIL
  187675. "adcs r4, r4, %[r]\n\t"
  187676. #elif defined(__clang__)
  187677. "adcs r4, %[r]\n\t"
  187678. #else
  187679. "adc r4, %[r]\n\t"
  187680. #endif
  187681. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187682. "lsrs r6, r7, #16\n\t"
  187683. #else
  187684. "lsr r6, r7, #16\n\t"
  187685. #endif
  187686. #ifdef WOLFSSL_KEIL
  187687. "muls r5, r6, r5\n\t"
  187688. #elif defined(__clang__)
  187689. "muls r5, r6\n\t"
  187690. #else
  187691. "mul r5, r6\n\t"
  187692. #endif
  187693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187694. "lsrs r6, r5, #16\n\t"
  187695. #else
  187696. "lsr r6, r5, #16\n\t"
  187697. #endif
  187698. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187699. "lsls r5, r5, #16\n\t"
  187700. #else
  187701. "lsl r5, r5, #16\n\t"
  187702. #endif
  187703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187704. "adds r2, r2, r5\n\t"
  187705. #else
  187706. "add r2, r2, r5\n\t"
  187707. #endif
  187708. #ifdef WOLFSSL_KEIL
  187709. "adcs r3, r3, r6\n\t"
  187710. #elif defined(__clang__)
  187711. "adcs r3, r6\n\t"
  187712. #else
  187713. "adc r3, r6\n\t"
  187714. #endif
  187715. #ifdef WOLFSSL_KEIL
  187716. "adcs r4, r4, %[r]\n\t"
  187717. #elif defined(__clang__)
  187718. "adcs r4, %[r]\n\t"
  187719. #else
  187720. "adc r4, %[r]\n\t"
  187721. #endif
  187722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187723. "adds r2, r2, r5\n\t"
  187724. #else
  187725. "add r2, r2, r5\n\t"
  187726. #endif
  187727. #ifdef WOLFSSL_KEIL
  187728. "adcs r3, r3, r6\n\t"
  187729. #elif defined(__clang__)
  187730. "adcs r3, r6\n\t"
  187731. #else
  187732. "adc r3, r6\n\t"
  187733. #endif
  187734. #ifdef WOLFSSL_KEIL
  187735. "adcs r4, r4, %[r]\n\t"
  187736. #elif defined(__clang__)
  187737. "adcs r4, %[r]\n\t"
  187738. #else
  187739. "adc r4, %[r]\n\t"
  187740. #endif
  187741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187742. "lsrs r5, %[a], #16\n\t"
  187743. #else
  187744. "lsr r5, %[a], #16\n\t"
  187745. #endif
  187746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187747. "lsrs r6, r7, #16\n\t"
  187748. #else
  187749. "lsr r6, r7, #16\n\t"
  187750. #endif
  187751. #ifdef WOLFSSL_KEIL
  187752. "muls r6, r5, r6\n\t"
  187753. #elif defined(__clang__)
  187754. "muls r6, r5\n\t"
  187755. #else
  187756. "mul r6, r5\n\t"
  187757. #endif
  187758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187759. "adds r3, r3, r6\n\t"
  187760. #else
  187761. "add r3, r3, r6\n\t"
  187762. #endif
  187763. #ifdef WOLFSSL_KEIL
  187764. "adcs r4, r4, %[r]\n\t"
  187765. #elif defined(__clang__)
  187766. "adcs r4, %[r]\n\t"
  187767. #else
  187768. "adc r4, %[r]\n\t"
  187769. #endif
  187770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187771. "adds r3, r3, r6\n\t"
  187772. #else
  187773. "add r3, r3, r6\n\t"
  187774. #endif
  187775. #ifdef WOLFSSL_KEIL
  187776. "adcs r4, r4, %[r]\n\t"
  187777. #elif defined(__clang__)
  187778. "adcs r4, %[r]\n\t"
  187779. #else
  187780. "adc r4, %[r]\n\t"
  187781. #endif
  187782. "uxth r6, r7\n\t"
  187783. #ifdef WOLFSSL_KEIL
  187784. "muls r5, r6, r5\n\t"
  187785. #elif defined(__clang__)
  187786. "muls r5, r6\n\t"
  187787. #else
  187788. "mul r5, r6\n\t"
  187789. #endif
  187790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187791. "lsrs r6, r5, #16\n\t"
  187792. #else
  187793. "lsr r6, r5, #16\n\t"
  187794. #endif
  187795. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187796. "lsls r5, r5, #16\n\t"
  187797. #else
  187798. "lsl r5, r5, #16\n\t"
  187799. #endif
  187800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187801. "adds r2, r2, r5\n\t"
  187802. #else
  187803. "add r2, r2, r5\n\t"
  187804. #endif
  187805. #ifdef WOLFSSL_KEIL
  187806. "adcs r3, r3, r6\n\t"
  187807. #elif defined(__clang__)
  187808. "adcs r3, r6\n\t"
  187809. #else
  187810. "adc r3, r6\n\t"
  187811. #endif
  187812. #ifdef WOLFSSL_KEIL
  187813. "adcs r4, r4, %[r]\n\t"
  187814. #elif defined(__clang__)
  187815. "adcs r4, %[r]\n\t"
  187816. #else
  187817. "adc r4, %[r]\n\t"
  187818. #endif
  187819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187820. "adds r2, r2, r5\n\t"
  187821. #else
  187822. "add r2, r2, r5\n\t"
  187823. #endif
  187824. #ifdef WOLFSSL_KEIL
  187825. "adcs r3, r3, r6\n\t"
  187826. #elif defined(__clang__)
  187827. "adcs r3, r6\n\t"
  187828. #else
  187829. "adc r3, r6\n\t"
  187830. #endif
  187831. #ifdef WOLFSSL_KEIL
  187832. "adcs r4, r4, %[r]\n\t"
  187833. #elif defined(__clang__)
  187834. "adcs r4, %[r]\n\t"
  187835. #else
  187836. "adc r4, %[r]\n\t"
  187837. #endif
  187838. "# A[13] * A[5]\n\t"
  187839. "mov %[a], r9\n\t"
  187840. "ldr r7, [%[a], #20]\n\t"
  187841. "mov %[a], r11\n\t"
  187842. "uxth r5, %[a]\n\t"
  187843. "uxth r6, r7\n\t"
  187844. #ifdef WOLFSSL_KEIL
  187845. "muls r6, r5, r6\n\t"
  187846. #elif defined(__clang__)
  187847. "muls r6, r5\n\t"
  187848. #else
  187849. "mul r6, r5\n\t"
  187850. #endif
  187851. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187852. "adds r2, r2, r6\n\t"
  187853. #else
  187854. "add r2, r2, r6\n\t"
  187855. #endif
  187856. #ifdef WOLFSSL_KEIL
  187857. "adcs r3, r3, %[r]\n\t"
  187858. #elif defined(__clang__)
  187859. "adcs r3, %[r]\n\t"
  187860. #else
  187861. "adc r3, %[r]\n\t"
  187862. #endif
  187863. #ifdef WOLFSSL_KEIL
  187864. "adcs r4, r4, %[r]\n\t"
  187865. #elif defined(__clang__)
  187866. "adcs r4, %[r]\n\t"
  187867. #else
  187868. "adc r4, %[r]\n\t"
  187869. #endif
  187870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187871. "adds r2, r2, r6\n\t"
  187872. #else
  187873. "add r2, r2, r6\n\t"
  187874. #endif
  187875. #ifdef WOLFSSL_KEIL
  187876. "adcs r3, r3, %[r]\n\t"
  187877. #elif defined(__clang__)
  187878. "adcs r3, %[r]\n\t"
  187879. #else
  187880. "adc r3, %[r]\n\t"
  187881. #endif
  187882. #ifdef WOLFSSL_KEIL
  187883. "adcs r4, r4, %[r]\n\t"
  187884. #elif defined(__clang__)
  187885. "adcs r4, %[r]\n\t"
  187886. #else
  187887. "adc r4, %[r]\n\t"
  187888. #endif
  187889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187890. "lsrs r6, r7, #16\n\t"
  187891. #else
  187892. "lsr r6, r7, #16\n\t"
  187893. #endif
  187894. #ifdef WOLFSSL_KEIL
  187895. "muls r5, r6, r5\n\t"
  187896. #elif defined(__clang__)
  187897. "muls r5, r6\n\t"
  187898. #else
  187899. "mul r5, r6\n\t"
  187900. #endif
  187901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187902. "lsrs r6, r5, #16\n\t"
  187903. #else
  187904. "lsr r6, r5, #16\n\t"
  187905. #endif
  187906. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187907. "lsls r5, r5, #16\n\t"
  187908. #else
  187909. "lsl r5, r5, #16\n\t"
  187910. #endif
  187911. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187912. "adds r2, r2, r5\n\t"
  187913. #else
  187914. "add r2, r2, r5\n\t"
  187915. #endif
  187916. #ifdef WOLFSSL_KEIL
  187917. "adcs r3, r3, r6\n\t"
  187918. #elif defined(__clang__)
  187919. "adcs r3, r6\n\t"
  187920. #else
  187921. "adc r3, r6\n\t"
  187922. #endif
  187923. #ifdef WOLFSSL_KEIL
  187924. "adcs r4, r4, %[r]\n\t"
  187925. #elif defined(__clang__)
  187926. "adcs r4, %[r]\n\t"
  187927. #else
  187928. "adc r4, %[r]\n\t"
  187929. #endif
  187930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187931. "adds r2, r2, r5\n\t"
  187932. #else
  187933. "add r2, r2, r5\n\t"
  187934. #endif
  187935. #ifdef WOLFSSL_KEIL
  187936. "adcs r3, r3, r6\n\t"
  187937. #elif defined(__clang__)
  187938. "adcs r3, r6\n\t"
  187939. #else
  187940. "adc r3, r6\n\t"
  187941. #endif
  187942. #ifdef WOLFSSL_KEIL
  187943. "adcs r4, r4, %[r]\n\t"
  187944. #elif defined(__clang__)
  187945. "adcs r4, %[r]\n\t"
  187946. #else
  187947. "adc r4, %[r]\n\t"
  187948. #endif
  187949. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187950. "lsrs r5, %[a], #16\n\t"
  187951. #else
  187952. "lsr r5, %[a], #16\n\t"
  187953. #endif
  187954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187955. "lsrs r6, r7, #16\n\t"
  187956. #else
  187957. "lsr r6, r7, #16\n\t"
  187958. #endif
  187959. #ifdef WOLFSSL_KEIL
  187960. "muls r6, r5, r6\n\t"
  187961. #elif defined(__clang__)
  187962. "muls r6, r5\n\t"
  187963. #else
  187964. "mul r6, r5\n\t"
  187965. #endif
  187966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187967. "adds r3, r3, r6\n\t"
  187968. #else
  187969. "add r3, 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 r3, r3, r6\n\t"
  187980. #else
  187981. "add r3, r3, r6\n\t"
  187982. #endif
  187983. #ifdef WOLFSSL_KEIL
  187984. "adcs r4, r4, %[r]\n\t"
  187985. #elif defined(__clang__)
  187986. "adcs r4, %[r]\n\t"
  187987. #else
  187988. "adc r4, %[r]\n\t"
  187989. #endif
  187990. "uxth r6, r7\n\t"
  187991. #ifdef WOLFSSL_KEIL
  187992. "muls r5, r6, r5\n\t"
  187993. #elif defined(__clang__)
  187994. "muls r5, r6\n\t"
  187995. #else
  187996. "mul r5, r6\n\t"
  187997. #endif
  187998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  187999. "lsrs r6, r5, #16\n\t"
  188000. #else
  188001. "lsr r6, r5, #16\n\t"
  188002. #endif
  188003. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188004. "lsls r5, r5, #16\n\t"
  188005. #else
  188006. "lsl r5, r5, #16\n\t"
  188007. #endif
  188008. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188009. "adds r2, r2, r5\n\t"
  188010. #else
  188011. "add r2, r2, r5\n\t"
  188012. #endif
  188013. #ifdef WOLFSSL_KEIL
  188014. "adcs r3, r3, r6\n\t"
  188015. #elif defined(__clang__)
  188016. "adcs r3, r6\n\t"
  188017. #else
  188018. "adc r3, r6\n\t"
  188019. #endif
  188020. #ifdef WOLFSSL_KEIL
  188021. "adcs r4, r4, %[r]\n\t"
  188022. #elif defined(__clang__)
  188023. "adcs r4, %[r]\n\t"
  188024. #else
  188025. "adc r4, %[r]\n\t"
  188026. #endif
  188027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188028. "adds r2, r2, r5\n\t"
  188029. #else
  188030. "add r2, r2, r5\n\t"
  188031. #endif
  188032. #ifdef WOLFSSL_KEIL
  188033. "adcs r3, r3, r6\n\t"
  188034. #elif defined(__clang__)
  188035. "adcs r3, r6\n\t"
  188036. #else
  188037. "adc r3, r6\n\t"
  188038. #endif
  188039. #ifdef WOLFSSL_KEIL
  188040. "adcs r4, r4, %[r]\n\t"
  188041. #elif defined(__clang__)
  188042. "adcs r4, %[r]\n\t"
  188043. #else
  188044. "adc r4, %[r]\n\t"
  188045. #endif
  188046. "# A[12] * A[6]\n\t"
  188047. "mov %[a], r9\n\t"
  188048. "ldr r7, [%[a], #24]\n\t"
  188049. "mov %[a], r10\n\t"
  188050. "uxth r5, %[a]\n\t"
  188051. "uxth r6, r7\n\t"
  188052. #ifdef WOLFSSL_KEIL
  188053. "muls r6, r5, r6\n\t"
  188054. #elif defined(__clang__)
  188055. "muls r6, r5\n\t"
  188056. #else
  188057. "mul r6, r5\n\t"
  188058. #endif
  188059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188060. "adds r2, r2, r6\n\t"
  188061. #else
  188062. "add r2, r2, r6\n\t"
  188063. #endif
  188064. #ifdef WOLFSSL_KEIL
  188065. "adcs r3, r3, %[r]\n\t"
  188066. #elif defined(__clang__)
  188067. "adcs r3, %[r]\n\t"
  188068. #else
  188069. "adc r3, %[r]\n\t"
  188070. #endif
  188071. #ifdef WOLFSSL_KEIL
  188072. "adcs r4, r4, %[r]\n\t"
  188073. #elif defined(__clang__)
  188074. "adcs r4, %[r]\n\t"
  188075. #else
  188076. "adc r4, %[r]\n\t"
  188077. #endif
  188078. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188079. "adds r2, r2, r6\n\t"
  188080. #else
  188081. "add r2, r2, r6\n\t"
  188082. #endif
  188083. #ifdef WOLFSSL_KEIL
  188084. "adcs r3, r3, %[r]\n\t"
  188085. #elif defined(__clang__)
  188086. "adcs r3, %[r]\n\t"
  188087. #else
  188088. "adc r3, %[r]\n\t"
  188089. #endif
  188090. #ifdef WOLFSSL_KEIL
  188091. "adcs r4, r4, %[r]\n\t"
  188092. #elif defined(__clang__)
  188093. "adcs r4, %[r]\n\t"
  188094. #else
  188095. "adc r4, %[r]\n\t"
  188096. #endif
  188097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188098. "lsrs r6, r7, #16\n\t"
  188099. #else
  188100. "lsr r6, r7, #16\n\t"
  188101. #endif
  188102. #ifdef WOLFSSL_KEIL
  188103. "muls r5, r6, r5\n\t"
  188104. #elif defined(__clang__)
  188105. "muls r5, r6\n\t"
  188106. #else
  188107. "mul r5, r6\n\t"
  188108. #endif
  188109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188110. "lsrs r6, r5, #16\n\t"
  188111. #else
  188112. "lsr r6, r5, #16\n\t"
  188113. #endif
  188114. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188115. "lsls r5, r5, #16\n\t"
  188116. #else
  188117. "lsl r5, r5, #16\n\t"
  188118. #endif
  188119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188120. "adds r2, r2, r5\n\t"
  188121. #else
  188122. "add r2, r2, r5\n\t"
  188123. #endif
  188124. #ifdef WOLFSSL_KEIL
  188125. "adcs r3, r3, r6\n\t"
  188126. #elif defined(__clang__)
  188127. "adcs r3, r6\n\t"
  188128. #else
  188129. "adc r3, r6\n\t"
  188130. #endif
  188131. #ifdef WOLFSSL_KEIL
  188132. "adcs r4, r4, %[r]\n\t"
  188133. #elif defined(__clang__)
  188134. "adcs r4, %[r]\n\t"
  188135. #else
  188136. "adc r4, %[r]\n\t"
  188137. #endif
  188138. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188139. "adds r2, r2, r5\n\t"
  188140. #else
  188141. "add r2, r2, r5\n\t"
  188142. #endif
  188143. #ifdef WOLFSSL_KEIL
  188144. "adcs r3, r3, r6\n\t"
  188145. #elif defined(__clang__)
  188146. "adcs r3, r6\n\t"
  188147. #else
  188148. "adc r3, r6\n\t"
  188149. #endif
  188150. #ifdef WOLFSSL_KEIL
  188151. "adcs r4, r4, %[r]\n\t"
  188152. #elif defined(__clang__)
  188153. "adcs r4, %[r]\n\t"
  188154. #else
  188155. "adc r4, %[r]\n\t"
  188156. #endif
  188157. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188158. "lsrs r5, %[a], #16\n\t"
  188159. #else
  188160. "lsr r5, %[a], #16\n\t"
  188161. #endif
  188162. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188163. "lsrs r6, r7, #16\n\t"
  188164. #else
  188165. "lsr r6, r7, #16\n\t"
  188166. #endif
  188167. #ifdef WOLFSSL_KEIL
  188168. "muls r6, r5, r6\n\t"
  188169. #elif defined(__clang__)
  188170. "muls r6, r5\n\t"
  188171. #else
  188172. "mul r6, r5\n\t"
  188173. #endif
  188174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188175. "adds r3, r3, r6\n\t"
  188176. #else
  188177. "add r3, 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 r3, r3, r6\n\t"
  188188. #else
  188189. "add r3, r3, r6\n\t"
  188190. #endif
  188191. #ifdef WOLFSSL_KEIL
  188192. "adcs r4, r4, %[r]\n\t"
  188193. #elif defined(__clang__)
  188194. "adcs r4, %[r]\n\t"
  188195. #else
  188196. "adc r4, %[r]\n\t"
  188197. #endif
  188198. "uxth r6, r7\n\t"
  188199. #ifdef WOLFSSL_KEIL
  188200. "muls r5, r6, r5\n\t"
  188201. #elif defined(__clang__)
  188202. "muls r5, r6\n\t"
  188203. #else
  188204. "mul r5, r6\n\t"
  188205. #endif
  188206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188207. "lsrs r6, r5, #16\n\t"
  188208. #else
  188209. "lsr r6, r5, #16\n\t"
  188210. #endif
  188211. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188212. "lsls r5, r5, #16\n\t"
  188213. #else
  188214. "lsl r5, r5, #16\n\t"
  188215. #endif
  188216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188217. "adds r2, r2, r5\n\t"
  188218. #else
  188219. "add r2, r2, r5\n\t"
  188220. #endif
  188221. #ifdef WOLFSSL_KEIL
  188222. "adcs r3, r3, r6\n\t"
  188223. #elif defined(__clang__)
  188224. "adcs r3, r6\n\t"
  188225. #else
  188226. "adc r3, r6\n\t"
  188227. #endif
  188228. #ifdef WOLFSSL_KEIL
  188229. "adcs r4, r4, %[r]\n\t"
  188230. #elif defined(__clang__)
  188231. "adcs r4, %[r]\n\t"
  188232. #else
  188233. "adc r4, %[r]\n\t"
  188234. #endif
  188235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188236. "adds r2, r2, r5\n\t"
  188237. #else
  188238. "add r2, r2, r5\n\t"
  188239. #endif
  188240. #ifdef WOLFSSL_KEIL
  188241. "adcs r3, r3, r6\n\t"
  188242. #elif defined(__clang__)
  188243. "adcs r3, r6\n\t"
  188244. #else
  188245. "adc r3, r6\n\t"
  188246. #endif
  188247. #ifdef WOLFSSL_KEIL
  188248. "adcs r4, r4, %[r]\n\t"
  188249. #elif defined(__clang__)
  188250. "adcs r4, %[r]\n\t"
  188251. #else
  188252. "adc r4, %[r]\n\t"
  188253. #endif
  188254. "# A[11] * A[7]\n\t"
  188255. "mov %[a], r9\n\t"
  188256. "ldr r7, [%[a], #28]\n\t"
  188257. "ldr %[a], [%[a], #44]\n\t"
  188258. "uxth r5, %[a]\n\t"
  188259. "uxth r6, r7\n\t"
  188260. #ifdef WOLFSSL_KEIL
  188261. "muls r6, r5, r6\n\t"
  188262. #elif defined(__clang__)
  188263. "muls r6, r5\n\t"
  188264. #else
  188265. "mul r6, r5\n\t"
  188266. #endif
  188267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188268. "adds r2, r2, r6\n\t"
  188269. #else
  188270. "add r2, r2, r6\n\t"
  188271. #endif
  188272. #ifdef WOLFSSL_KEIL
  188273. "adcs r3, r3, %[r]\n\t"
  188274. #elif defined(__clang__)
  188275. "adcs r3, %[r]\n\t"
  188276. #else
  188277. "adc r3, %[r]\n\t"
  188278. #endif
  188279. #ifdef WOLFSSL_KEIL
  188280. "adcs r4, r4, %[r]\n\t"
  188281. #elif defined(__clang__)
  188282. "adcs r4, %[r]\n\t"
  188283. #else
  188284. "adc r4, %[r]\n\t"
  188285. #endif
  188286. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188287. "adds r2, r2, r6\n\t"
  188288. #else
  188289. "add r2, r2, r6\n\t"
  188290. #endif
  188291. #ifdef WOLFSSL_KEIL
  188292. "adcs r3, r3, %[r]\n\t"
  188293. #elif defined(__clang__)
  188294. "adcs r3, %[r]\n\t"
  188295. #else
  188296. "adc r3, %[r]\n\t"
  188297. #endif
  188298. #ifdef WOLFSSL_KEIL
  188299. "adcs r4, r4, %[r]\n\t"
  188300. #elif defined(__clang__)
  188301. "adcs r4, %[r]\n\t"
  188302. #else
  188303. "adc r4, %[r]\n\t"
  188304. #endif
  188305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188306. "lsrs r6, r7, #16\n\t"
  188307. #else
  188308. "lsr r6, r7, #16\n\t"
  188309. #endif
  188310. #ifdef WOLFSSL_KEIL
  188311. "muls r5, r6, r5\n\t"
  188312. #elif defined(__clang__)
  188313. "muls r5, r6\n\t"
  188314. #else
  188315. "mul r5, r6\n\t"
  188316. #endif
  188317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188318. "lsrs r6, r5, #16\n\t"
  188319. #else
  188320. "lsr r6, r5, #16\n\t"
  188321. #endif
  188322. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188323. "lsls r5, r5, #16\n\t"
  188324. #else
  188325. "lsl r5, r5, #16\n\t"
  188326. #endif
  188327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188328. "adds r2, r2, r5\n\t"
  188329. #else
  188330. "add r2, r2, r5\n\t"
  188331. #endif
  188332. #ifdef WOLFSSL_KEIL
  188333. "adcs r3, r3, r6\n\t"
  188334. #elif defined(__clang__)
  188335. "adcs r3, r6\n\t"
  188336. #else
  188337. "adc r3, r6\n\t"
  188338. #endif
  188339. #ifdef WOLFSSL_KEIL
  188340. "adcs r4, r4, %[r]\n\t"
  188341. #elif defined(__clang__)
  188342. "adcs r4, %[r]\n\t"
  188343. #else
  188344. "adc r4, %[r]\n\t"
  188345. #endif
  188346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188347. "adds r2, r2, r5\n\t"
  188348. #else
  188349. "add r2, r2, r5\n\t"
  188350. #endif
  188351. #ifdef WOLFSSL_KEIL
  188352. "adcs r3, r3, r6\n\t"
  188353. #elif defined(__clang__)
  188354. "adcs r3, r6\n\t"
  188355. #else
  188356. "adc r3, r6\n\t"
  188357. #endif
  188358. #ifdef WOLFSSL_KEIL
  188359. "adcs r4, r4, %[r]\n\t"
  188360. #elif defined(__clang__)
  188361. "adcs r4, %[r]\n\t"
  188362. #else
  188363. "adc r4, %[r]\n\t"
  188364. #endif
  188365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188366. "lsrs r5, %[a], #16\n\t"
  188367. #else
  188368. "lsr r5, %[a], #16\n\t"
  188369. #endif
  188370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188371. "lsrs r6, r7, #16\n\t"
  188372. #else
  188373. "lsr r6, r7, #16\n\t"
  188374. #endif
  188375. #ifdef WOLFSSL_KEIL
  188376. "muls r6, r5, r6\n\t"
  188377. #elif defined(__clang__)
  188378. "muls r6, r5\n\t"
  188379. #else
  188380. "mul r6, r5\n\t"
  188381. #endif
  188382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188383. "adds r3, r3, r6\n\t"
  188384. #else
  188385. "add r3, 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 r3, r3, r6\n\t"
  188396. #else
  188397. "add r3, r3, r6\n\t"
  188398. #endif
  188399. #ifdef WOLFSSL_KEIL
  188400. "adcs r4, r4, %[r]\n\t"
  188401. #elif defined(__clang__)
  188402. "adcs r4, %[r]\n\t"
  188403. #else
  188404. "adc r4, %[r]\n\t"
  188405. #endif
  188406. "uxth r6, r7\n\t"
  188407. #ifdef WOLFSSL_KEIL
  188408. "muls r5, r6, r5\n\t"
  188409. #elif defined(__clang__)
  188410. "muls r5, r6\n\t"
  188411. #else
  188412. "mul r5, r6\n\t"
  188413. #endif
  188414. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188415. "lsrs r6, r5, #16\n\t"
  188416. #else
  188417. "lsr r6, r5, #16\n\t"
  188418. #endif
  188419. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188420. "lsls r5, r5, #16\n\t"
  188421. #else
  188422. "lsl r5, r5, #16\n\t"
  188423. #endif
  188424. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188425. "adds r2, r2, r5\n\t"
  188426. #else
  188427. "add r2, r2, r5\n\t"
  188428. #endif
  188429. #ifdef WOLFSSL_KEIL
  188430. "adcs r3, r3, r6\n\t"
  188431. #elif defined(__clang__)
  188432. "adcs r3, r6\n\t"
  188433. #else
  188434. "adc r3, r6\n\t"
  188435. #endif
  188436. #ifdef WOLFSSL_KEIL
  188437. "adcs r4, r4, %[r]\n\t"
  188438. #elif defined(__clang__)
  188439. "adcs r4, %[r]\n\t"
  188440. #else
  188441. "adc r4, %[r]\n\t"
  188442. #endif
  188443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188444. "adds r2, r2, r5\n\t"
  188445. #else
  188446. "add r2, r2, r5\n\t"
  188447. #endif
  188448. #ifdef WOLFSSL_KEIL
  188449. "adcs r3, r3, r6\n\t"
  188450. #elif defined(__clang__)
  188451. "adcs r3, r6\n\t"
  188452. #else
  188453. "adc r3, r6\n\t"
  188454. #endif
  188455. #ifdef WOLFSSL_KEIL
  188456. "adcs r4, r4, %[r]\n\t"
  188457. #elif defined(__clang__)
  188458. "adcs r4, %[r]\n\t"
  188459. #else
  188460. "adc r4, %[r]\n\t"
  188461. #endif
  188462. "# A[10] * A[8]\n\t"
  188463. "mov %[a], r9\n\t"
  188464. "ldr r7, [%[a], #32]\n\t"
  188465. "ldr %[a], [%[a], #40]\n\t"
  188466. "uxth r5, %[a]\n\t"
  188467. "uxth r6, r7\n\t"
  188468. #ifdef WOLFSSL_KEIL
  188469. "muls r6, r5, r6\n\t"
  188470. #elif defined(__clang__)
  188471. "muls r6, r5\n\t"
  188472. #else
  188473. "mul r6, r5\n\t"
  188474. #endif
  188475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188476. "adds r2, r2, r6\n\t"
  188477. #else
  188478. "add r2, r2, r6\n\t"
  188479. #endif
  188480. #ifdef WOLFSSL_KEIL
  188481. "adcs r3, r3, %[r]\n\t"
  188482. #elif defined(__clang__)
  188483. "adcs r3, %[r]\n\t"
  188484. #else
  188485. "adc r3, %[r]\n\t"
  188486. #endif
  188487. #ifdef WOLFSSL_KEIL
  188488. "adcs r4, r4, %[r]\n\t"
  188489. #elif defined(__clang__)
  188490. "adcs r4, %[r]\n\t"
  188491. #else
  188492. "adc r4, %[r]\n\t"
  188493. #endif
  188494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188495. "adds r2, r2, r6\n\t"
  188496. #else
  188497. "add r2, r2, r6\n\t"
  188498. #endif
  188499. #ifdef WOLFSSL_KEIL
  188500. "adcs r3, r3, %[r]\n\t"
  188501. #elif defined(__clang__)
  188502. "adcs r3, %[r]\n\t"
  188503. #else
  188504. "adc r3, %[r]\n\t"
  188505. #endif
  188506. #ifdef WOLFSSL_KEIL
  188507. "adcs r4, r4, %[r]\n\t"
  188508. #elif defined(__clang__)
  188509. "adcs r4, %[r]\n\t"
  188510. #else
  188511. "adc r4, %[r]\n\t"
  188512. #endif
  188513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188514. "lsrs r6, r7, #16\n\t"
  188515. #else
  188516. "lsr r6, r7, #16\n\t"
  188517. #endif
  188518. #ifdef WOLFSSL_KEIL
  188519. "muls r5, r6, r5\n\t"
  188520. #elif defined(__clang__)
  188521. "muls r5, r6\n\t"
  188522. #else
  188523. "mul r5, r6\n\t"
  188524. #endif
  188525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188526. "lsrs r6, r5, #16\n\t"
  188527. #else
  188528. "lsr r6, r5, #16\n\t"
  188529. #endif
  188530. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188531. "lsls r5, r5, #16\n\t"
  188532. #else
  188533. "lsl r5, r5, #16\n\t"
  188534. #endif
  188535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188536. "adds r2, r2, r5\n\t"
  188537. #else
  188538. "add r2, r2, r5\n\t"
  188539. #endif
  188540. #ifdef WOLFSSL_KEIL
  188541. "adcs r3, r3, r6\n\t"
  188542. #elif defined(__clang__)
  188543. "adcs r3, r6\n\t"
  188544. #else
  188545. "adc r3, r6\n\t"
  188546. #endif
  188547. #ifdef WOLFSSL_KEIL
  188548. "adcs r4, r4, %[r]\n\t"
  188549. #elif defined(__clang__)
  188550. "adcs r4, %[r]\n\t"
  188551. #else
  188552. "adc r4, %[r]\n\t"
  188553. #endif
  188554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188555. "adds r2, r2, r5\n\t"
  188556. #else
  188557. "add r2, r2, r5\n\t"
  188558. #endif
  188559. #ifdef WOLFSSL_KEIL
  188560. "adcs r3, r3, r6\n\t"
  188561. #elif defined(__clang__)
  188562. "adcs r3, r6\n\t"
  188563. #else
  188564. "adc r3, r6\n\t"
  188565. #endif
  188566. #ifdef WOLFSSL_KEIL
  188567. "adcs r4, r4, %[r]\n\t"
  188568. #elif defined(__clang__)
  188569. "adcs r4, %[r]\n\t"
  188570. #else
  188571. "adc r4, %[r]\n\t"
  188572. #endif
  188573. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188574. "lsrs r5, %[a], #16\n\t"
  188575. #else
  188576. "lsr r5, %[a], #16\n\t"
  188577. #endif
  188578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188579. "lsrs r6, r7, #16\n\t"
  188580. #else
  188581. "lsr r6, r7, #16\n\t"
  188582. #endif
  188583. #ifdef WOLFSSL_KEIL
  188584. "muls r6, r5, r6\n\t"
  188585. #elif defined(__clang__)
  188586. "muls r6, r5\n\t"
  188587. #else
  188588. "mul r6, r5\n\t"
  188589. #endif
  188590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188591. "adds r3, r3, r6\n\t"
  188592. #else
  188593. "add r3, 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 r3, r3, r6\n\t"
  188604. #else
  188605. "add r3, r3, r6\n\t"
  188606. #endif
  188607. #ifdef WOLFSSL_KEIL
  188608. "adcs r4, r4, %[r]\n\t"
  188609. #elif defined(__clang__)
  188610. "adcs r4, %[r]\n\t"
  188611. #else
  188612. "adc r4, %[r]\n\t"
  188613. #endif
  188614. "uxth r6, r7\n\t"
  188615. #ifdef WOLFSSL_KEIL
  188616. "muls r5, r6, r5\n\t"
  188617. #elif defined(__clang__)
  188618. "muls r5, r6\n\t"
  188619. #else
  188620. "mul r5, r6\n\t"
  188621. #endif
  188622. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188623. "lsrs r6, r5, #16\n\t"
  188624. #else
  188625. "lsr r6, r5, #16\n\t"
  188626. #endif
  188627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188628. "lsls r5, r5, #16\n\t"
  188629. #else
  188630. "lsl r5, r5, #16\n\t"
  188631. #endif
  188632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188633. "adds r2, r2, r5\n\t"
  188634. #else
  188635. "add r2, r2, r5\n\t"
  188636. #endif
  188637. #ifdef WOLFSSL_KEIL
  188638. "adcs r3, r3, r6\n\t"
  188639. #elif defined(__clang__)
  188640. "adcs r3, r6\n\t"
  188641. #else
  188642. "adc r3, r6\n\t"
  188643. #endif
  188644. #ifdef WOLFSSL_KEIL
  188645. "adcs r4, r4, %[r]\n\t"
  188646. #elif defined(__clang__)
  188647. "adcs r4, %[r]\n\t"
  188648. #else
  188649. "adc r4, %[r]\n\t"
  188650. #endif
  188651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188652. "adds r2, r2, r5\n\t"
  188653. #else
  188654. "add r2, r2, r5\n\t"
  188655. #endif
  188656. #ifdef WOLFSSL_KEIL
  188657. "adcs r3, r3, r6\n\t"
  188658. #elif defined(__clang__)
  188659. "adcs r3, r6\n\t"
  188660. #else
  188661. "adc r3, r6\n\t"
  188662. #endif
  188663. #ifdef WOLFSSL_KEIL
  188664. "adcs r4, r4, %[r]\n\t"
  188665. #elif defined(__clang__)
  188666. "adcs r4, %[r]\n\t"
  188667. #else
  188668. "adc r4, %[r]\n\t"
  188669. #endif
  188670. "# A[9] * A[9]\n\t"
  188671. "mov %[a], r9\n\t"
  188672. "ldr r7, [%[a], #36]\n\t"
  188673. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188674. "lsrs r6, r7, #16\n\t"
  188675. #else
  188676. "lsr r6, r7, #16\n\t"
  188677. #endif
  188678. "uxth r5, r7\n\t"
  188679. #ifdef WOLFSSL_KEIL
  188680. "muls r5, r5, r5\n\t"
  188681. #elif defined(__clang__)
  188682. "muls r5, r5\n\t"
  188683. #else
  188684. "mul r5, r5\n\t"
  188685. #endif
  188686. #ifdef WOLFSSL_KEIL
  188687. "muls r6, r6, r6\n\t"
  188688. #elif defined(__clang__)
  188689. "muls r6, r6\n\t"
  188690. #else
  188691. "mul r6, r6\n\t"
  188692. #endif
  188693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188694. "adds r2, r2, r5\n\t"
  188695. #else
  188696. "add r2, r2, r5\n\t"
  188697. #endif
  188698. #ifdef WOLFSSL_KEIL
  188699. "adcs r3, r3, r6\n\t"
  188700. #elif defined(__clang__)
  188701. "adcs r3, r6\n\t"
  188702. #else
  188703. "adc r3, r6\n\t"
  188704. #endif
  188705. #ifdef WOLFSSL_KEIL
  188706. "adcs r4, r4, %[r]\n\t"
  188707. #elif defined(__clang__)
  188708. "adcs r4, %[r]\n\t"
  188709. #else
  188710. "adc r4, %[r]\n\t"
  188711. #endif
  188712. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188713. "lsrs r6, r7, #16\n\t"
  188714. #else
  188715. "lsr r6, r7, #16\n\t"
  188716. #endif
  188717. "uxth r5, r7\n\t"
  188718. #ifdef WOLFSSL_KEIL
  188719. "muls r5, r6, r5\n\t"
  188720. #elif defined(__clang__)
  188721. "muls r5, r6\n\t"
  188722. #else
  188723. "mul r5, r6\n\t"
  188724. #endif
  188725. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188726. "lsrs r6, r5, #15\n\t"
  188727. #else
  188728. "lsr r6, r5, #15\n\t"
  188729. #endif
  188730. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188731. "lsls r5, r5, #17\n\t"
  188732. #else
  188733. "lsl r5, r5, #17\n\t"
  188734. #endif
  188735. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188736. "adds r2, r2, r5\n\t"
  188737. #else
  188738. "add r2, r2, r5\n\t"
  188739. #endif
  188740. #ifdef WOLFSSL_KEIL
  188741. "adcs r3, r3, r6\n\t"
  188742. #elif defined(__clang__)
  188743. "adcs r3, r6\n\t"
  188744. #else
  188745. "adc r3, r6\n\t"
  188746. #endif
  188747. #ifdef WOLFSSL_KEIL
  188748. "adcs r4, r4, %[r]\n\t"
  188749. #elif defined(__clang__)
  188750. "adcs r4, %[r]\n\t"
  188751. #else
  188752. "adc r4, %[r]\n\t"
  188753. #endif
  188754. "mov %[r], r8\n\t"
  188755. "str r2, [%[r], #72]\n\t"
  188756. "movs %[r], #0\n\t"
  188757. "# A[10] * A[9]\n\t"
  188758. "movs r2, #0\n\t"
  188759. "ldr %[a], [%[a], #40]\n\t"
  188760. "uxth r5, %[a]\n\t"
  188761. "uxth r6, r7\n\t"
  188762. #ifdef WOLFSSL_KEIL
  188763. "muls r6, r5, r6\n\t"
  188764. #elif defined(__clang__)
  188765. "muls r6, r5\n\t"
  188766. #else
  188767. "mul r6, r5\n\t"
  188768. #endif
  188769. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188770. "adds r3, r3, r6\n\t"
  188771. #else
  188772. "add r3, r3, r6\n\t"
  188773. #endif
  188774. #ifdef WOLFSSL_KEIL
  188775. "adcs r4, r4, %[r]\n\t"
  188776. #elif defined(__clang__)
  188777. "adcs r4, %[r]\n\t"
  188778. #else
  188779. "adc r4, %[r]\n\t"
  188780. #endif
  188781. #ifdef WOLFSSL_KEIL
  188782. "adcs r2, r2, %[r]\n\t"
  188783. #elif defined(__clang__)
  188784. "adcs r2, %[r]\n\t"
  188785. #else
  188786. "adc r2, %[r]\n\t"
  188787. #endif
  188788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188789. "adds r3, r3, r6\n\t"
  188790. #else
  188791. "add r3, r3, r6\n\t"
  188792. #endif
  188793. #ifdef WOLFSSL_KEIL
  188794. "adcs r4, r4, %[r]\n\t"
  188795. #elif defined(__clang__)
  188796. "adcs r4, %[r]\n\t"
  188797. #else
  188798. "adc r4, %[r]\n\t"
  188799. #endif
  188800. #ifdef WOLFSSL_KEIL
  188801. "adcs r2, r2, %[r]\n\t"
  188802. #elif defined(__clang__)
  188803. "adcs r2, %[r]\n\t"
  188804. #else
  188805. "adc r2, %[r]\n\t"
  188806. #endif
  188807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188808. "lsrs r6, r7, #16\n\t"
  188809. #else
  188810. "lsr r6, r7, #16\n\t"
  188811. #endif
  188812. #ifdef WOLFSSL_KEIL
  188813. "muls r5, r6, r5\n\t"
  188814. #elif defined(__clang__)
  188815. "muls r5, r6\n\t"
  188816. #else
  188817. "mul r5, r6\n\t"
  188818. #endif
  188819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188820. "lsrs r6, r5, #16\n\t"
  188821. #else
  188822. "lsr r6, r5, #16\n\t"
  188823. #endif
  188824. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188825. "lsls r5, r5, #16\n\t"
  188826. #else
  188827. "lsl r5, r5, #16\n\t"
  188828. #endif
  188829. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188830. "adds r3, r3, r5\n\t"
  188831. #else
  188832. "add r3, r3, r5\n\t"
  188833. #endif
  188834. #ifdef WOLFSSL_KEIL
  188835. "adcs r4, r4, r6\n\t"
  188836. #elif defined(__clang__)
  188837. "adcs r4, r6\n\t"
  188838. #else
  188839. "adc r4, r6\n\t"
  188840. #endif
  188841. #ifdef WOLFSSL_KEIL
  188842. "adcs r2, r2, %[r]\n\t"
  188843. #elif defined(__clang__)
  188844. "adcs r2, %[r]\n\t"
  188845. #else
  188846. "adc r2, %[r]\n\t"
  188847. #endif
  188848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188849. "adds r3, r3, r5\n\t"
  188850. #else
  188851. "add r3, r3, r5\n\t"
  188852. #endif
  188853. #ifdef WOLFSSL_KEIL
  188854. "adcs r4, r4, r6\n\t"
  188855. #elif defined(__clang__)
  188856. "adcs r4, r6\n\t"
  188857. #else
  188858. "adc r4, r6\n\t"
  188859. #endif
  188860. #ifdef WOLFSSL_KEIL
  188861. "adcs r2, r2, %[r]\n\t"
  188862. #elif defined(__clang__)
  188863. "adcs r2, %[r]\n\t"
  188864. #else
  188865. "adc r2, %[r]\n\t"
  188866. #endif
  188867. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188868. "lsrs r5, %[a], #16\n\t"
  188869. #else
  188870. "lsr r5, %[a], #16\n\t"
  188871. #endif
  188872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188873. "lsrs r6, r7, #16\n\t"
  188874. #else
  188875. "lsr r6, r7, #16\n\t"
  188876. #endif
  188877. #ifdef WOLFSSL_KEIL
  188878. "muls r6, r5, r6\n\t"
  188879. #elif defined(__clang__)
  188880. "muls r6, r5\n\t"
  188881. #else
  188882. "mul r6, r5\n\t"
  188883. #endif
  188884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188885. "adds r4, r4, r6\n\t"
  188886. #else
  188887. "add r4, r4, r6\n\t"
  188888. #endif
  188889. #ifdef WOLFSSL_KEIL
  188890. "adcs r2, r2, %[r]\n\t"
  188891. #elif defined(__clang__)
  188892. "adcs r2, %[r]\n\t"
  188893. #else
  188894. "adc r2, %[r]\n\t"
  188895. #endif
  188896. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188897. "adds r4, r4, r6\n\t"
  188898. #else
  188899. "add r4, r4, r6\n\t"
  188900. #endif
  188901. #ifdef WOLFSSL_KEIL
  188902. "adcs r2, r2, %[r]\n\t"
  188903. #elif defined(__clang__)
  188904. "adcs r2, %[r]\n\t"
  188905. #else
  188906. "adc r2, %[r]\n\t"
  188907. #endif
  188908. "uxth r6, r7\n\t"
  188909. #ifdef WOLFSSL_KEIL
  188910. "muls r5, r6, r5\n\t"
  188911. #elif defined(__clang__)
  188912. "muls r5, r6\n\t"
  188913. #else
  188914. "mul r5, r6\n\t"
  188915. #endif
  188916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188917. "lsrs r6, r5, #16\n\t"
  188918. #else
  188919. "lsr r6, r5, #16\n\t"
  188920. #endif
  188921. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188922. "lsls r5, r5, #16\n\t"
  188923. #else
  188924. "lsl r5, r5, #16\n\t"
  188925. #endif
  188926. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188927. "adds r3, r3, r5\n\t"
  188928. #else
  188929. "add r3, r3, r5\n\t"
  188930. #endif
  188931. #ifdef WOLFSSL_KEIL
  188932. "adcs r4, r4, r6\n\t"
  188933. #elif defined(__clang__)
  188934. "adcs r4, r6\n\t"
  188935. #else
  188936. "adc r4, r6\n\t"
  188937. #endif
  188938. #ifdef WOLFSSL_KEIL
  188939. "adcs r2, r2, %[r]\n\t"
  188940. #elif defined(__clang__)
  188941. "adcs r2, %[r]\n\t"
  188942. #else
  188943. "adc r2, %[r]\n\t"
  188944. #endif
  188945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188946. "adds r3, r3, r5\n\t"
  188947. #else
  188948. "add r3, r3, r5\n\t"
  188949. #endif
  188950. #ifdef WOLFSSL_KEIL
  188951. "adcs r4, r4, r6\n\t"
  188952. #elif defined(__clang__)
  188953. "adcs r4, r6\n\t"
  188954. #else
  188955. "adc r4, r6\n\t"
  188956. #endif
  188957. #ifdef WOLFSSL_KEIL
  188958. "adcs r2, r2, %[r]\n\t"
  188959. #elif defined(__clang__)
  188960. "adcs r2, %[r]\n\t"
  188961. #else
  188962. "adc r2, %[r]\n\t"
  188963. #endif
  188964. "# A[11] * A[8]\n\t"
  188965. "mov %[a], r9\n\t"
  188966. "ldr r7, [%[a], #32]\n\t"
  188967. "ldr %[a], [%[a], #44]\n\t"
  188968. "uxth r5, %[a]\n\t"
  188969. "uxth r6, r7\n\t"
  188970. #ifdef WOLFSSL_KEIL
  188971. "muls r6, r5, r6\n\t"
  188972. #elif defined(__clang__)
  188973. "muls r6, r5\n\t"
  188974. #else
  188975. "mul r6, r5\n\t"
  188976. #endif
  188977. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188978. "adds r3, r3, r6\n\t"
  188979. #else
  188980. "add r3, r3, r6\n\t"
  188981. #endif
  188982. #ifdef WOLFSSL_KEIL
  188983. "adcs r4, r4, %[r]\n\t"
  188984. #elif defined(__clang__)
  188985. "adcs r4, %[r]\n\t"
  188986. #else
  188987. "adc r4, %[r]\n\t"
  188988. #endif
  188989. #ifdef WOLFSSL_KEIL
  188990. "adcs r2, r2, %[r]\n\t"
  188991. #elif defined(__clang__)
  188992. "adcs r2, %[r]\n\t"
  188993. #else
  188994. "adc r2, %[r]\n\t"
  188995. #endif
  188996. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  188997. "adds r3, r3, r6\n\t"
  188998. #else
  188999. "add r3, r3, r6\n\t"
  189000. #endif
  189001. #ifdef WOLFSSL_KEIL
  189002. "adcs r4, r4, %[r]\n\t"
  189003. #elif defined(__clang__)
  189004. "adcs r4, %[r]\n\t"
  189005. #else
  189006. "adc r4, %[r]\n\t"
  189007. #endif
  189008. #ifdef WOLFSSL_KEIL
  189009. "adcs r2, r2, %[r]\n\t"
  189010. #elif defined(__clang__)
  189011. "adcs r2, %[r]\n\t"
  189012. #else
  189013. "adc r2, %[r]\n\t"
  189014. #endif
  189015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189016. "lsrs r6, r7, #16\n\t"
  189017. #else
  189018. "lsr r6, r7, #16\n\t"
  189019. #endif
  189020. #ifdef WOLFSSL_KEIL
  189021. "muls r5, r6, r5\n\t"
  189022. #elif defined(__clang__)
  189023. "muls r5, r6\n\t"
  189024. #else
  189025. "mul r5, r6\n\t"
  189026. #endif
  189027. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189028. "lsrs r6, r5, #16\n\t"
  189029. #else
  189030. "lsr r6, r5, #16\n\t"
  189031. #endif
  189032. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189033. "lsls r5, r5, #16\n\t"
  189034. #else
  189035. "lsl r5, r5, #16\n\t"
  189036. #endif
  189037. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189038. "adds r3, r3, r5\n\t"
  189039. #else
  189040. "add r3, r3, r5\n\t"
  189041. #endif
  189042. #ifdef WOLFSSL_KEIL
  189043. "adcs r4, r4, r6\n\t"
  189044. #elif defined(__clang__)
  189045. "adcs r4, r6\n\t"
  189046. #else
  189047. "adc r4, r6\n\t"
  189048. #endif
  189049. #ifdef WOLFSSL_KEIL
  189050. "adcs r2, r2, %[r]\n\t"
  189051. #elif defined(__clang__)
  189052. "adcs r2, %[r]\n\t"
  189053. #else
  189054. "adc r2, %[r]\n\t"
  189055. #endif
  189056. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189057. "adds r3, r3, r5\n\t"
  189058. #else
  189059. "add r3, r3, r5\n\t"
  189060. #endif
  189061. #ifdef WOLFSSL_KEIL
  189062. "adcs r4, r4, r6\n\t"
  189063. #elif defined(__clang__)
  189064. "adcs r4, r6\n\t"
  189065. #else
  189066. "adc r4, r6\n\t"
  189067. #endif
  189068. #ifdef WOLFSSL_KEIL
  189069. "adcs r2, r2, %[r]\n\t"
  189070. #elif defined(__clang__)
  189071. "adcs r2, %[r]\n\t"
  189072. #else
  189073. "adc r2, %[r]\n\t"
  189074. #endif
  189075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189076. "lsrs r5, %[a], #16\n\t"
  189077. #else
  189078. "lsr r5, %[a], #16\n\t"
  189079. #endif
  189080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189081. "lsrs r6, r7, #16\n\t"
  189082. #else
  189083. "lsr r6, r7, #16\n\t"
  189084. #endif
  189085. #ifdef WOLFSSL_KEIL
  189086. "muls r6, r5, r6\n\t"
  189087. #elif defined(__clang__)
  189088. "muls r6, r5\n\t"
  189089. #else
  189090. "mul r6, r5\n\t"
  189091. #endif
  189092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189093. "adds r4, r4, r6\n\t"
  189094. #else
  189095. "add r4, r4, r6\n\t"
  189096. #endif
  189097. #ifdef WOLFSSL_KEIL
  189098. "adcs r2, r2, %[r]\n\t"
  189099. #elif defined(__clang__)
  189100. "adcs r2, %[r]\n\t"
  189101. #else
  189102. "adc r2, %[r]\n\t"
  189103. #endif
  189104. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189105. "adds r4, r4, r6\n\t"
  189106. #else
  189107. "add r4, r4, r6\n\t"
  189108. #endif
  189109. #ifdef WOLFSSL_KEIL
  189110. "adcs r2, r2, %[r]\n\t"
  189111. #elif defined(__clang__)
  189112. "adcs r2, %[r]\n\t"
  189113. #else
  189114. "adc r2, %[r]\n\t"
  189115. #endif
  189116. "uxth r6, r7\n\t"
  189117. #ifdef WOLFSSL_KEIL
  189118. "muls r5, r6, r5\n\t"
  189119. #elif defined(__clang__)
  189120. "muls r5, r6\n\t"
  189121. #else
  189122. "mul r5, r6\n\t"
  189123. #endif
  189124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189125. "lsrs r6, r5, #16\n\t"
  189126. #else
  189127. "lsr r6, r5, #16\n\t"
  189128. #endif
  189129. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189130. "lsls r5, r5, #16\n\t"
  189131. #else
  189132. "lsl r5, r5, #16\n\t"
  189133. #endif
  189134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189135. "adds r3, r3, r5\n\t"
  189136. #else
  189137. "add r3, r3, r5\n\t"
  189138. #endif
  189139. #ifdef WOLFSSL_KEIL
  189140. "adcs r4, r4, r6\n\t"
  189141. #elif defined(__clang__)
  189142. "adcs r4, r6\n\t"
  189143. #else
  189144. "adc r4, r6\n\t"
  189145. #endif
  189146. #ifdef WOLFSSL_KEIL
  189147. "adcs r2, r2, %[r]\n\t"
  189148. #elif defined(__clang__)
  189149. "adcs r2, %[r]\n\t"
  189150. #else
  189151. "adc r2, %[r]\n\t"
  189152. #endif
  189153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189154. "adds r3, r3, r5\n\t"
  189155. #else
  189156. "add r3, r3, r5\n\t"
  189157. #endif
  189158. #ifdef WOLFSSL_KEIL
  189159. "adcs r4, r4, r6\n\t"
  189160. #elif defined(__clang__)
  189161. "adcs r4, r6\n\t"
  189162. #else
  189163. "adc r4, r6\n\t"
  189164. #endif
  189165. #ifdef WOLFSSL_KEIL
  189166. "adcs r2, r2, %[r]\n\t"
  189167. #elif defined(__clang__)
  189168. "adcs r2, %[r]\n\t"
  189169. #else
  189170. "adc r2, %[r]\n\t"
  189171. #endif
  189172. "# A[12] * A[7]\n\t"
  189173. "mov %[a], r9\n\t"
  189174. "ldr r7, [%[a], #28]\n\t"
  189175. "mov %[a], r10\n\t"
  189176. "uxth r5, %[a]\n\t"
  189177. "uxth r6, r7\n\t"
  189178. #ifdef WOLFSSL_KEIL
  189179. "muls r6, r5, r6\n\t"
  189180. #elif defined(__clang__)
  189181. "muls r6, r5\n\t"
  189182. #else
  189183. "mul r6, r5\n\t"
  189184. #endif
  189185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189186. "adds r3, r3, r6\n\t"
  189187. #else
  189188. "add r3, r3, r6\n\t"
  189189. #endif
  189190. #ifdef WOLFSSL_KEIL
  189191. "adcs r4, r4, %[r]\n\t"
  189192. #elif defined(__clang__)
  189193. "adcs r4, %[r]\n\t"
  189194. #else
  189195. "adc r4, %[r]\n\t"
  189196. #endif
  189197. #ifdef WOLFSSL_KEIL
  189198. "adcs r2, r2, %[r]\n\t"
  189199. #elif defined(__clang__)
  189200. "adcs r2, %[r]\n\t"
  189201. #else
  189202. "adc r2, %[r]\n\t"
  189203. #endif
  189204. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189205. "adds r3, r3, r6\n\t"
  189206. #else
  189207. "add r3, r3, r6\n\t"
  189208. #endif
  189209. #ifdef WOLFSSL_KEIL
  189210. "adcs r4, r4, %[r]\n\t"
  189211. #elif defined(__clang__)
  189212. "adcs r4, %[r]\n\t"
  189213. #else
  189214. "adc r4, %[r]\n\t"
  189215. #endif
  189216. #ifdef WOLFSSL_KEIL
  189217. "adcs r2, r2, %[r]\n\t"
  189218. #elif defined(__clang__)
  189219. "adcs r2, %[r]\n\t"
  189220. #else
  189221. "adc r2, %[r]\n\t"
  189222. #endif
  189223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189224. "lsrs r6, r7, #16\n\t"
  189225. #else
  189226. "lsr r6, r7, #16\n\t"
  189227. #endif
  189228. #ifdef WOLFSSL_KEIL
  189229. "muls r5, r6, r5\n\t"
  189230. #elif defined(__clang__)
  189231. "muls r5, r6\n\t"
  189232. #else
  189233. "mul r5, r6\n\t"
  189234. #endif
  189235. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189236. "lsrs r6, r5, #16\n\t"
  189237. #else
  189238. "lsr r6, r5, #16\n\t"
  189239. #endif
  189240. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189241. "lsls r5, r5, #16\n\t"
  189242. #else
  189243. "lsl r5, r5, #16\n\t"
  189244. #endif
  189245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189246. "adds r3, r3, r5\n\t"
  189247. #else
  189248. "add r3, r3, r5\n\t"
  189249. #endif
  189250. #ifdef WOLFSSL_KEIL
  189251. "adcs r4, r4, r6\n\t"
  189252. #elif defined(__clang__)
  189253. "adcs r4, r6\n\t"
  189254. #else
  189255. "adc r4, r6\n\t"
  189256. #endif
  189257. #ifdef WOLFSSL_KEIL
  189258. "adcs r2, r2, %[r]\n\t"
  189259. #elif defined(__clang__)
  189260. "adcs r2, %[r]\n\t"
  189261. #else
  189262. "adc r2, %[r]\n\t"
  189263. #endif
  189264. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189265. "adds r3, r3, r5\n\t"
  189266. #else
  189267. "add r3, r3, r5\n\t"
  189268. #endif
  189269. #ifdef WOLFSSL_KEIL
  189270. "adcs r4, r4, r6\n\t"
  189271. #elif defined(__clang__)
  189272. "adcs r4, r6\n\t"
  189273. #else
  189274. "adc r4, r6\n\t"
  189275. #endif
  189276. #ifdef WOLFSSL_KEIL
  189277. "adcs r2, r2, %[r]\n\t"
  189278. #elif defined(__clang__)
  189279. "adcs r2, %[r]\n\t"
  189280. #else
  189281. "adc r2, %[r]\n\t"
  189282. #endif
  189283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189284. "lsrs r5, %[a], #16\n\t"
  189285. #else
  189286. "lsr r5, %[a], #16\n\t"
  189287. #endif
  189288. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189289. "lsrs r6, r7, #16\n\t"
  189290. #else
  189291. "lsr r6, r7, #16\n\t"
  189292. #endif
  189293. #ifdef WOLFSSL_KEIL
  189294. "muls r6, r5, r6\n\t"
  189295. #elif defined(__clang__)
  189296. "muls r6, r5\n\t"
  189297. #else
  189298. "mul r6, r5\n\t"
  189299. #endif
  189300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189301. "adds r4, r4, r6\n\t"
  189302. #else
  189303. "add r4, 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 r4, r4, r6\n\t"
  189314. #else
  189315. "add r4, r4, r6\n\t"
  189316. #endif
  189317. #ifdef WOLFSSL_KEIL
  189318. "adcs r2, r2, %[r]\n\t"
  189319. #elif defined(__clang__)
  189320. "adcs r2, %[r]\n\t"
  189321. #else
  189322. "adc r2, %[r]\n\t"
  189323. #endif
  189324. "uxth r6, r7\n\t"
  189325. #ifdef WOLFSSL_KEIL
  189326. "muls r5, r6, r5\n\t"
  189327. #elif defined(__clang__)
  189328. "muls r5, r6\n\t"
  189329. #else
  189330. "mul r5, r6\n\t"
  189331. #endif
  189332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189333. "lsrs r6, r5, #16\n\t"
  189334. #else
  189335. "lsr r6, r5, #16\n\t"
  189336. #endif
  189337. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189338. "lsls r5, r5, #16\n\t"
  189339. #else
  189340. "lsl r5, r5, #16\n\t"
  189341. #endif
  189342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189343. "adds r3, r3, r5\n\t"
  189344. #else
  189345. "add r3, r3, r5\n\t"
  189346. #endif
  189347. #ifdef WOLFSSL_KEIL
  189348. "adcs r4, r4, r6\n\t"
  189349. #elif defined(__clang__)
  189350. "adcs r4, r6\n\t"
  189351. #else
  189352. "adc r4, r6\n\t"
  189353. #endif
  189354. #ifdef WOLFSSL_KEIL
  189355. "adcs r2, r2, %[r]\n\t"
  189356. #elif defined(__clang__)
  189357. "adcs r2, %[r]\n\t"
  189358. #else
  189359. "adc r2, %[r]\n\t"
  189360. #endif
  189361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189362. "adds r3, r3, r5\n\t"
  189363. #else
  189364. "add r3, r3, r5\n\t"
  189365. #endif
  189366. #ifdef WOLFSSL_KEIL
  189367. "adcs r4, r4, r6\n\t"
  189368. #elif defined(__clang__)
  189369. "adcs r4, r6\n\t"
  189370. #else
  189371. "adc r4, r6\n\t"
  189372. #endif
  189373. #ifdef WOLFSSL_KEIL
  189374. "adcs r2, r2, %[r]\n\t"
  189375. #elif defined(__clang__)
  189376. "adcs r2, %[r]\n\t"
  189377. #else
  189378. "adc r2, %[r]\n\t"
  189379. #endif
  189380. "# A[13] * A[6]\n\t"
  189381. "mov %[a], r9\n\t"
  189382. "ldr r7, [%[a], #24]\n\t"
  189383. "mov %[a], r11\n\t"
  189384. "uxth r5, %[a]\n\t"
  189385. "uxth r6, r7\n\t"
  189386. #ifdef WOLFSSL_KEIL
  189387. "muls r6, r5, r6\n\t"
  189388. #elif defined(__clang__)
  189389. "muls r6, r5\n\t"
  189390. #else
  189391. "mul r6, r5\n\t"
  189392. #endif
  189393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189394. "adds r3, r3, r6\n\t"
  189395. #else
  189396. "add r3, r3, r6\n\t"
  189397. #endif
  189398. #ifdef WOLFSSL_KEIL
  189399. "adcs r4, r4, %[r]\n\t"
  189400. #elif defined(__clang__)
  189401. "adcs r4, %[r]\n\t"
  189402. #else
  189403. "adc r4, %[r]\n\t"
  189404. #endif
  189405. #ifdef WOLFSSL_KEIL
  189406. "adcs r2, r2, %[r]\n\t"
  189407. #elif defined(__clang__)
  189408. "adcs r2, %[r]\n\t"
  189409. #else
  189410. "adc r2, %[r]\n\t"
  189411. #endif
  189412. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189413. "adds r3, r3, r6\n\t"
  189414. #else
  189415. "add r3, r3, r6\n\t"
  189416. #endif
  189417. #ifdef WOLFSSL_KEIL
  189418. "adcs r4, r4, %[r]\n\t"
  189419. #elif defined(__clang__)
  189420. "adcs r4, %[r]\n\t"
  189421. #else
  189422. "adc r4, %[r]\n\t"
  189423. #endif
  189424. #ifdef WOLFSSL_KEIL
  189425. "adcs r2, r2, %[r]\n\t"
  189426. #elif defined(__clang__)
  189427. "adcs r2, %[r]\n\t"
  189428. #else
  189429. "adc r2, %[r]\n\t"
  189430. #endif
  189431. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189432. "lsrs r6, r7, #16\n\t"
  189433. #else
  189434. "lsr r6, r7, #16\n\t"
  189435. #endif
  189436. #ifdef WOLFSSL_KEIL
  189437. "muls r5, r6, r5\n\t"
  189438. #elif defined(__clang__)
  189439. "muls r5, r6\n\t"
  189440. #else
  189441. "mul r5, r6\n\t"
  189442. #endif
  189443. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189444. "lsrs r6, r5, #16\n\t"
  189445. #else
  189446. "lsr r6, r5, #16\n\t"
  189447. #endif
  189448. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189449. "lsls r5, r5, #16\n\t"
  189450. #else
  189451. "lsl r5, r5, #16\n\t"
  189452. #endif
  189453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189454. "adds r3, r3, r5\n\t"
  189455. #else
  189456. "add r3, r3, r5\n\t"
  189457. #endif
  189458. #ifdef WOLFSSL_KEIL
  189459. "adcs r4, r4, r6\n\t"
  189460. #elif defined(__clang__)
  189461. "adcs r4, r6\n\t"
  189462. #else
  189463. "adc r4, r6\n\t"
  189464. #endif
  189465. #ifdef WOLFSSL_KEIL
  189466. "adcs r2, r2, %[r]\n\t"
  189467. #elif defined(__clang__)
  189468. "adcs r2, %[r]\n\t"
  189469. #else
  189470. "adc r2, %[r]\n\t"
  189471. #endif
  189472. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189473. "adds r3, r3, r5\n\t"
  189474. #else
  189475. "add r3, r3, r5\n\t"
  189476. #endif
  189477. #ifdef WOLFSSL_KEIL
  189478. "adcs r4, r4, r6\n\t"
  189479. #elif defined(__clang__)
  189480. "adcs r4, r6\n\t"
  189481. #else
  189482. "adc r4, r6\n\t"
  189483. #endif
  189484. #ifdef WOLFSSL_KEIL
  189485. "adcs r2, r2, %[r]\n\t"
  189486. #elif defined(__clang__)
  189487. "adcs r2, %[r]\n\t"
  189488. #else
  189489. "adc r2, %[r]\n\t"
  189490. #endif
  189491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189492. "lsrs r5, %[a], #16\n\t"
  189493. #else
  189494. "lsr r5, %[a], #16\n\t"
  189495. #endif
  189496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189497. "lsrs r6, r7, #16\n\t"
  189498. #else
  189499. "lsr r6, r7, #16\n\t"
  189500. #endif
  189501. #ifdef WOLFSSL_KEIL
  189502. "muls r6, r5, r6\n\t"
  189503. #elif defined(__clang__)
  189504. "muls r6, r5\n\t"
  189505. #else
  189506. "mul r6, r5\n\t"
  189507. #endif
  189508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189509. "adds r4, r4, r6\n\t"
  189510. #else
  189511. "add r4, 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 r4, r4, r6\n\t"
  189522. #else
  189523. "add r4, r4, r6\n\t"
  189524. #endif
  189525. #ifdef WOLFSSL_KEIL
  189526. "adcs r2, r2, %[r]\n\t"
  189527. #elif defined(__clang__)
  189528. "adcs r2, %[r]\n\t"
  189529. #else
  189530. "adc r2, %[r]\n\t"
  189531. #endif
  189532. "uxth r6, r7\n\t"
  189533. #ifdef WOLFSSL_KEIL
  189534. "muls r5, r6, r5\n\t"
  189535. #elif defined(__clang__)
  189536. "muls r5, r6\n\t"
  189537. #else
  189538. "mul r5, r6\n\t"
  189539. #endif
  189540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189541. "lsrs r6, r5, #16\n\t"
  189542. #else
  189543. "lsr r6, r5, #16\n\t"
  189544. #endif
  189545. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189546. "lsls r5, r5, #16\n\t"
  189547. #else
  189548. "lsl r5, r5, #16\n\t"
  189549. #endif
  189550. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189551. "adds r3, r3, r5\n\t"
  189552. #else
  189553. "add r3, r3, r5\n\t"
  189554. #endif
  189555. #ifdef WOLFSSL_KEIL
  189556. "adcs r4, r4, r6\n\t"
  189557. #elif defined(__clang__)
  189558. "adcs r4, r6\n\t"
  189559. #else
  189560. "adc r4, r6\n\t"
  189561. #endif
  189562. #ifdef WOLFSSL_KEIL
  189563. "adcs r2, r2, %[r]\n\t"
  189564. #elif defined(__clang__)
  189565. "adcs r2, %[r]\n\t"
  189566. #else
  189567. "adc r2, %[r]\n\t"
  189568. #endif
  189569. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189570. "adds r3, r3, r5\n\t"
  189571. #else
  189572. "add r3, r3, r5\n\t"
  189573. #endif
  189574. #ifdef WOLFSSL_KEIL
  189575. "adcs r4, r4, r6\n\t"
  189576. #elif defined(__clang__)
  189577. "adcs r4, r6\n\t"
  189578. #else
  189579. "adc r4, r6\n\t"
  189580. #endif
  189581. #ifdef WOLFSSL_KEIL
  189582. "adcs r2, r2, %[r]\n\t"
  189583. #elif defined(__clang__)
  189584. "adcs r2, %[r]\n\t"
  189585. #else
  189586. "adc r2, %[r]\n\t"
  189587. #endif
  189588. "# A[14] * A[5]\n\t"
  189589. "mov %[a], r9\n\t"
  189590. "ldr r7, [%[a], #20]\n\t"
  189591. "mov %[a], r12\n\t"
  189592. "uxth r5, %[a]\n\t"
  189593. "uxth r6, r7\n\t"
  189594. #ifdef WOLFSSL_KEIL
  189595. "muls r6, r5, r6\n\t"
  189596. #elif defined(__clang__)
  189597. "muls r6, r5\n\t"
  189598. #else
  189599. "mul r6, r5\n\t"
  189600. #endif
  189601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189602. "adds r3, r3, r6\n\t"
  189603. #else
  189604. "add r3, r3, r6\n\t"
  189605. #endif
  189606. #ifdef WOLFSSL_KEIL
  189607. "adcs r4, r4, %[r]\n\t"
  189608. #elif defined(__clang__)
  189609. "adcs r4, %[r]\n\t"
  189610. #else
  189611. "adc r4, %[r]\n\t"
  189612. #endif
  189613. #ifdef WOLFSSL_KEIL
  189614. "adcs r2, r2, %[r]\n\t"
  189615. #elif defined(__clang__)
  189616. "adcs r2, %[r]\n\t"
  189617. #else
  189618. "adc r2, %[r]\n\t"
  189619. #endif
  189620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189621. "adds r3, r3, r6\n\t"
  189622. #else
  189623. "add r3, r3, r6\n\t"
  189624. #endif
  189625. #ifdef WOLFSSL_KEIL
  189626. "adcs r4, r4, %[r]\n\t"
  189627. #elif defined(__clang__)
  189628. "adcs r4, %[r]\n\t"
  189629. #else
  189630. "adc r4, %[r]\n\t"
  189631. #endif
  189632. #ifdef WOLFSSL_KEIL
  189633. "adcs r2, r2, %[r]\n\t"
  189634. #elif defined(__clang__)
  189635. "adcs r2, %[r]\n\t"
  189636. #else
  189637. "adc r2, %[r]\n\t"
  189638. #endif
  189639. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189640. "lsrs r6, r7, #16\n\t"
  189641. #else
  189642. "lsr r6, r7, #16\n\t"
  189643. #endif
  189644. #ifdef WOLFSSL_KEIL
  189645. "muls r5, r6, r5\n\t"
  189646. #elif defined(__clang__)
  189647. "muls r5, r6\n\t"
  189648. #else
  189649. "mul r5, r6\n\t"
  189650. #endif
  189651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189652. "lsrs r6, r5, #16\n\t"
  189653. #else
  189654. "lsr r6, r5, #16\n\t"
  189655. #endif
  189656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189657. "lsls r5, r5, #16\n\t"
  189658. #else
  189659. "lsl r5, r5, #16\n\t"
  189660. #endif
  189661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189662. "adds r3, r3, r5\n\t"
  189663. #else
  189664. "add r3, r3, r5\n\t"
  189665. #endif
  189666. #ifdef WOLFSSL_KEIL
  189667. "adcs r4, r4, r6\n\t"
  189668. #elif defined(__clang__)
  189669. "adcs r4, r6\n\t"
  189670. #else
  189671. "adc r4, r6\n\t"
  189672. #endif
  189673. #ifdef WOLFSSL_KEIL
  189674. "adcs r2, r2, %[r]\n\t"
  189675. #elif defined(__clang__)
  189676. "adcs r2, %[r]\n\t"
  189677. #else
  189678. "adc r2, %[r]\n\t"
  189679. #endif
  189680. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189681. "adds r3, r3, r5\n\t"
  189682. #else
  189683. "add r3, r3, r5\n\t"
  189684. #endif
  189685. #ifdef WOLFSSL_KEIL
  189686. "adcs r4, r4, r6\n\t"
  189687. #elif defined(__clang__)
  189688. "adcs r4, r6\n\t"
  189689. #else
  189690. "adc r4, r6\n\t"
  189691. #endif
  189692. #ifdef WOLFSSL_KEIL
  189693. "adcs r2, r2, %[r]\n\t"
  189694. #elif defined(__clang__)
  189695. "adcs r2, %[r]\n\t"
  189696. #else
  189697. "adc r2, %[r]\n\t"
  189698. #endif
  189699. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189700. "lsrs r5, %[a], #16\n\t"
  189701. #else
  189702. "lsr r5, %[a], #16\n\t"
  189703. #endif
  189704. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189705. "lsrs r6, r7, #16\n\t"
  189706. #else
  189707. "lsr r6, r7, #16\n\t"
  189708. #endif
  189709. #ifdef WOLFSSL_KEIL
  189710. "muls r6, r5, r6\n\t"
  189711. #elif defined(__clang__)
  189712. "muls r6, r5\n\t"
  189713. #else
  189714. "mul r6, r5\n\t"
  189715. #endif
  189716. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189717. "adds r4, r4, r6\n\t"
  189718. #else
  189719. "add r4, 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 r4, r4, r6\n\t"
  189730. #else
  189731. "add r4, r4, r6\n\t"
  189732. #endif
  189733. #ifdef WOLFSSL_KEIL
  189734. "adcs r2, r2, %[r]\n\t"
  189735. #elif defined(__clang__)
  189736. "adcs r2, %[r]\n\t"
  189737. #else
  189738. "adc r2, %[r]\n\t"
  189739. #endif
  189740. "uxth r6, r7\n\t"
  189741. #ifdef WOLFSSL_KEIL
  189742. "muls r5, r6, r5\n\t"
  189743. #elif defined(__clang__)
  189744. "muls r5, r6\n\t"
  189745. #else
  189746. "mul r5, r6\n\t"
  189747. #endif
  189748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189749. "lsrs r6, r5, #16\n\t"
  189750. #else
  189751. "lsr r6, r5, #16\n\t"
  189752. #endif
  189753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189754. "lsls r5, r5, #16\n\t"
  189755. #else
  189756. "lsl r5, r5, #16\n\t"
  189757. #endif
  189758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189759. "adds r3, r3, r5\n\t"
  189760. #else
  189761. "add r3, r3, r5\n\t"
  189762. #endif
  189763. #ifdef WOLFSSL_KEIL
  189764. "adcs r4, r4, r6\n\t"
  189765. #elif defined(__clang__)
  189766. "adcs r4, r6\n\t"
  189767. #else
  189768. "adc r4, r6\n\t"
  189769. #endif
  189770. #ifdef WOLFSSL_KEIL
  189771. "adcs r2, r2, %[r]\n\t"
  189772. #elif defined(__clang__)
  189773. "adcs r2, %[r]\n\t"
  189774. #else
  189775. "adc r2, %[r]\n\t"
  189776. #endif
  189777. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189778. "adds r3, r3, r5\n\t"
  189779. #else
  189780. "add r3, r3, r5\n\t"
  189781. #endif
  189782. #ifdef WOLFSSL_KEIL
  189783. "adcs r4, r4, r6\n\t"
  189784. #elif defined(__clang__)
  189785. "adcs r4, r6\n\t"
  189786. #else
  189787. "adc r4, r6\n\t"
  189788. #endif
  189789. #ifdef WOLFSSL_KEIL
  189790. "adcs r2, r2, %[r]\n\t"
  189791. #elif defined(__clang__)
  189792. "adcs r2, %[r]\n\t"
  189793. #else
  189794. "adc r2, %[r]\n\t"
  189795. #endif
  189796. "# A[15] * A[4]\n\t"
  189797. "mov %[a], r9\n\t"
  189798. "ldr r7, [%[a], #16]\n\t"
  189799. "mov %[a], lr\n\t"
  189800. "uxth r5, %[a]\n\t"
  189801. "uxth r6, r7\n\t"
  189802. #ifdef WOLFSSL_KEIL
  189803. "muls r6, r5, r6\n\t"
  189804. #elif defined(__clang__)
  189805. "muls r6, r5\n\t"
  189806. #else
  189807. "mul r6, r5\n\t"
  189808. #endif
  189809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189810. "adds r3, r3, r6\n\t"
  189811. #else
  189812. "add r3, r3, r6\n\t"
  189813. #endif
  189814. #ifdef WOLFSSL_KEIL
  189815. "adcs r4, r4, %[r]\n\t"
  189816. #elif defined(__clang__)
  189817. "adcs r4, %[r]\n\t"
  189818. #else
  189819. "adc r4, %[r]\n\t"
  189820. #endif
  189821. #ifdef WOLFSSL_KEIL
  189822. "adcs r2, r2, %[r]\n\t"
  189823. #elif defined(__clang__)
  189824. "adcs r2, %[r]\n\t"
  189825. #else
  189826. "adc r2, %[r]\n\t"
  189827. #endif
  189828. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189829. "adds r3, r3, r6\n\t"
  189830. #else
  189831. "add r3, r3, r6\n\t"
  189832. #endif
  189833. #ifdef WOLFSSL_KEIL
  189834. "adcs r4, r4, %[r]\n\t"
  189835. #elif defined(__clang__)
  189836. "adcs r4, %[r]\n\t"
  189837. #else
  189838. "adc r4, %[r]\n\t"
  189839. #endif
  189840. #ifdef WOLFSSL_KEIL
  189841. "adcs r2, r2, %[r]\n\t"
  189842. #elif defined(__clang__)
  189843. "adcs r2, %[r]\n\t"
  189844. #else
  189845. "adc r2, %[r]\n\t"
  189846. #endif
  189847. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189848. "lsrs r6, r7, #16\n\t"
  189849. #else
  189850. "lsr r6, r7, #16\n\t"
  189851. #endif
  189852. #ifdef WOLFSSL_KEIL
  189853. "muls r5, r6, r5\n\t"
  189854. #elif defined(__clang__)
  189855. "muls r5, r6\n\t"
  189856. #else
  189857. "mul r5, r6\n\t"
  189858. #endif
  189859. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189860. "lsrs r6, r5, #16\n\t"
  189861. #else
  189862. "lsr r6, r5, #16\n\t"
  189863. #endif
  189864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189865. "lsls r5, r5, #16\n\t"
  189866. #else
  189867. "lsl r5, r5, #16\n\t"
  189868. #endif
  189869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189870. "adds r3, r3, r5\n\t"
  189871. #else
  189872. "add r3, r3, r5\n\t"
  189873. #endif
  189874. #ifdef WOLFSSL_KEIL
  189875. "adcs r4, r4, r6\n\t"
  189876. #elif defined(__clang__)
  189877. "adcs r4, r6\n\t"
  189878. #else
  189879. "adc r4, r6\n\t"
  189880. #endif
  189881. #ifdef WOLFSSL_KEIL
  189882. "adcs r2, r2, %[r]\n\t"
  189883. #elif defined(__clang__)
  189884. "adcs r2, %[r]\n\t"
  189885. #else
  189886. "adc r2, %[r]\n\t"
  189887. #endif
  189888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189889. "adds r3, r3, r5\n\t"
  189890. #else
  189891. "add r3, r3, r5\n\t"
  189892. #endif
  189893. #ifdef WOLFSSL_KEIL
  189894. "adcs r4, r4, r6\n\t"
  189895. #elif defined(__clang__)
  189896. "adcs r4, r6\n\t"
  189897. #else
  189898. "adc r4, r6\n\t"
  189899. #endif
  189900. #ifdef WOLFSSL_KEIL
  189901. "adcs r2, r2, %[r]\n\t"
  189902. #elif defined(__clang__)
  189903. "adcs r2, %[r]\n\t"
  189904. #else
  189905. "adc r2, %[r]\n\t"
  189906. #endif
  189907. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189908. "lsrs r5, %[a], #16\n\t"
  189909. #else
  189910. "lsr r5, %[a], #16\n\t"
  189911. #endif
  189912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189913. "lsrs r6, r7, #16\n\t"
  189914. #else
  189915. "lsr r6, r7, #16\n\t"
  189916. #endif
  189917. #ifdef WOLFSSL_KEIL
  189918. "muls r6, r5, r6\n\t"
  189919. #elif defined(__clang__)
  189920. "muls r6, r5\n\t"
  189921. #else
  189922. "mul r6, r5\n\t"
  189923. #endif
  189924. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189925. "adds r4, r4, r6\n\t"
  189926. #else
  189927. "add r4, 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 r4, r4, r6\n\t"
  189938. #else
  189939. "add r4, r4, r6\n\t"
  189940. #endif
  189941. #ifdef WOLFSSL_KEIL
  189942. "adcs r2, r2, %[r]\n\t"
  189943. #elif defined(__clang__)
  189944. "adcs r2, %[r]\n\t"
  189945. #else
  189946. "adc r2, %[r]\n\t"
  189947. #endif
  189948. "uxth r6, r7\n\t"
  189949. #ifdef WOLFSSL_KEIL
  189950. "muls r5, r6, r5\n\t"
  189951. #elif defined(__clang__)
  189952. "muls r5, r6\n\t"
  189953. #else
  189954. "mul r5, r6\n\t"
  189955. #endif
  189956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189957. "lsrs r6, r5, #16\n\t"
  189958. #else
  189959. "lsr r6, r5, #16\n\t"
  189960. #endif
  189961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189962. "lsls r5, r5, #16\n\t"
  189963. #else
  189964. "lsl r5, r5, #16\n\t"
  189965. #endif
  189966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189967. "adds r3, r3, r5\n\t"
  189968. #else
  189969. "add r3, r3, r5\n\t"
  189970. #endif
  189971. #ifdef WOLFSSL_KEIL
  189972. "adcs r4, r4, r6\n\t"
  189973. #elif defined(__clang__)
  189974. "adcs r4, r6\n\t"
  189975. #else
  189976. "adc r4, r6\n\t"
  189977. #endif
  189978. #ifdef WOLFSSL_KEIL
  189979. "adcs r2, r2, %[r]\n\t"
  189980. #elif defined(__clang__)
  189981. "adcs r2, %[r]\n\t"
  189982. #else
  189983. "adc r2, %[r]\n\t"
  189984. #endif
  189985. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  189986. "adds r3, r3, r5\n\t"
  189987. #else
  189988. "add r3, r3, r5\n\t"
  189989. #endif
  189990. #ifdef WOLFSSL_KEIL
  189991. "adcs r4, r4, r6\n\t"
  189992. #elif defined(__clang__)
  189993. "adcs r4, r6\n\t"
  189994. #else
  189995. "adc r4, r6\n\t"
  189996. #endif
  189997. #ifdef WOLFSSL_KEIL
  189998. "adcs r2, r2, %[r]\n\t"
  189999. #elif defined(__clang__)
  190000. "adcs r2, %[r]\n\t"
  190001. #else
  190002. "adc r2, %[r]\n\t"
  190003. #endif
  190004. "mov %[r], r8\n\t"
  190005. "str r3, [%[r], #76]\n\t"
  190006. "movs %[r], #0\n\t"
  190007. "# A[15] * A[5]\n\t"
  190008. "movs r3, #0\n\t"
  190009. "mov %[a], r9\n\t"
  190010. "ldr r7, [%[a], #20]\n\t"
  190011. "mov %[a], lr\n\t"
  190012. "uxth r5, %[a]\n\t"
  190013. "uxth r6, r7\n\t"
  190014. #ifdef WOLFSSL_KEIL
  190015. "muls r6, r5, r6\n\t"
  190016. #elif defined(__clang__)
  190017. "muls r6, r5\n\t"
  190018. #else
  190019. "mul r6, r5\n\t"
  190020. #endif
  190021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190022. "adds r4, r4, r6\n\t"
  190023. #else
  190024. "add r4, r4, r6\n\t"
  190025. #endif
  190026. #ifdef WOLFSSL_KEIL
  190027. "adcs r2, r2, %[r]\n\t"
  190028. #elif defined(__clang__)
  190029. "adcs r2, %[r]\n\t"
  190030. #else
  190031. "adc r2, %[r]\n\t"
  190032. #endif
  190033. #ifdef WOLFSSL_KEIL
  190034. "adcs r3, r3, %[r]\n\t"
  190035. #elif defined(__clang__)
  190036. "adcs r3, %[r]\n\t"
  190037. #else
  190038. "adc r3, %[r]\n\t"
  190039. #endif
  190040. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190041. "adds r4, r4, r6\n\t"
  190042. #else
  190043. "add r4, r4, r6\n\t"
  190044. #endif
  190045. #ifdef WOLFSSL_KEIL
  190046. "adcs r2, r2, %[r]\n\t"
  190047. #elif defined(__clang__)
  190048. "adcs r2, %[r]\n\t"
  190049. #else
  190050. "adc r2, %[r]\n\t"
  190051. #endif
  190052. #ifdef WOLFSSL_KEIL
  190053. "adcs r3, r3, %[r]\n\t"
  190054. #elif defined(__clang__)
  190055. "adcs r3, %[r]\n\t"
  190056. #else
  190057. "adc r3, %[r]\n\t"
  190058. #endif
  190059. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190060. "lsrs r6, r7, #16\n\t"
  190061. #else
  190062. "lsr r6, r7, #16\n\t"
  190063. #endif
  190064. #ifdef WOLFSSL_KEIL
  190065. "muls r5, r6, r5\n\t"
  190066. #elif defined(__clang__)
  190067. "muls r5, r6\n\t"
  190068. #else
  190069. "mul r5, r6\n\t"
  190070. #endif
  190071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190072. "lsrs r6, r5, #16\n\t"
  190073. #else
  190074. "lsr r6, r5, #16\n\t"
  190075. #endif
  190076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190077. "lsls r5, r5, #16\n\t"
  190078. #else
  190079. "lsl r5, r5, #16\n\t"
  190080. #endif
  190081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190082. "adds r4, r4, r5\n\t"
  190083. #else
  190084. "add r4, r4, r5\n\t"
  190085. #endif
  190086. #ifdef WOLFSSL_KEIL
  190087. "adcs r2, r2, r6\n\t"
  190088. #elif defined(__clang__)
  190089. "adcs r2, r6\n\t"
  190090. #else
  190091. "adc r2, r6\n\t"
  190092. #endif
  190093. #ifdef WOLFSSL_KEIL
  190094. "adcs r3, r3, %[r]\n\t"
  190095. #elif defined(__clang__)
  190096. "adcs r3, %[r]\n\t"
  190097. #else
  190098. "adc r3, %[r]\n\t"
  190099. #endif
  190100. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190101. "adds r4, r4, r5\n\t"
  190102. #else
  190103. "add r4, r4, r5\n\t"
  190104. #endif
  190105. #ifdef WOLFSSL_KEIL
  190106. "adcs r2, r2, r6\n\t"
  190107. #elif defined(__clang__)
  190108. "adcs r2, r6\n\t"
  190109. #else
  190110. "adc r2, r6\n\t"
  190111. #endif
  190112. #ifdef WOLFSSL_KEIL
  190113. "adcs r3, r3, %[r]\n\t"
  190114. #elif defined(__clang__)
  190115. "adcs r3, %[r]\n\t"
  190116. #else
  190117. "adc r3, %[r]\n\t"
  190118. #endif
  190119. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190120. "lsrs r5, %[a], #16\n\t"
  190121. #else
  190122. "lsr r5, %[a], #16\n\t"
  190123. #endif
  190124. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190125. "lsrs r6, r7, #16\n\t"
  190126. #else
  190127. "lsr r6, r7, #16\n\t"
  190128. #endif
  190129. #ifdef WOLFSSL_KEIL
  190130. "muls r6, r5, r6\n\t"
  190131. #elif defined(__clang__)
  190132. "muls r6, r5\n\t"
  190133. #else
  190134. "mul r6, r5\n\t"
  190135. #endif
  190136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190137. "adds r2, r2, r6\n\t"
  190138. #else
  190139. "add r2, r2, r6\n\t"
  190140. #endif
  190141. #ifdef WOLFSSL_KEIL
  190142. "adcs r3, r3, %[r]\n\t"
  190143. #elif defined(__clang__)
  190144. "adcs r3, %[r]\n\t"
  190145. #else
  190146. "adc r3, %[r]\n\t"
  190147. #endif
  190148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190149. "adds r2, r2, r6\n\t"
  190150. #else
  190151. "add r2, r2, r6\n\t"
  190152. #endif
  190153. #ifdef WOLFSSL_KEIL
  190154. "adcs r3, r3, %[r]\n\t"
  190155. #elif defined(__clang__)
  190156. "adcs r3, %[r]\n\t"
  190157. #else
  190158. "adc r3, %[r]\n\t"
  190159. #endif
  190160. "uxth r6, r7\n\t"
  190161. #ifdef WOLFSSL_KEIL
  190162. "muls r5, r6, r5\n\t"
  190163. #elif defined(__clang__)
  190164. "muls r5, r6\n\t"
  190165. #else
  190166. "mul r5, r6\n\t"
  190167. #endif
  190168. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190169. "lsrs r6, r5, #16\n\t"
  190170. #else
  190171. "lsr r6, r5, #16\n\t"
  190172. #endif
  190173. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190174. "lsls r5, r5, #16\n\t"
  190175. #else
  190176. "lsl r5, r5, #16\n\t"
  190177. #endif
  190178. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190179. "adds r4, r4, r5\n\t"
  190180. #else
  190181. "add r4, r4, r5\n\t"
  190182. #endif
  190183. #ifdef WOLFSSL_KEIL
  190184. "adcs r2, r2, r6\n\t"
  190185. #elif defined(__clang__)
  190186. "adcs r2, r6\n\t"
  190187. #else
  190188. "adc r2, r6\n\t"
  190189. #endif
  190190. #ifdef WOLFSSL_KEIL
  190191. "adcs r3, r3, %[r]\n\t"
  190192. #elif defined(__clang__)
  190193. "adcs r3, %[r]\n\t"
  190194. #else
  190195. "adc r3, %[r]\n\t"
  190196. #endif
  190197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190198. "adds r4, r4, r5\n\t"
  190199. #else
  190200. "add r4, r4, r5\n\t"
  190201. #endif
  190202. #ifdef WOLFSSL_KEIL
  190203. "adcs r2, r2, r6\n\t"
  190204. #elif defined(__clang__)
  190205. "adcs r2, r6\n\t"
  190206. #else
  190207. "adc r2, r6\n\t"
  190208. #endif
  190209. #ifdef WOLFSSL_KEIL
  190210. "adcs r3, r3, %[r]\n\t"
  190211. #elif defined(__clang__)
  190212. "adcs r3, %[r]\n\t"
  190213. #else
  190214. "adc r3, %[r]\n\t"
  190215. #endif
  190216. "# A[14] * A[6]\n\t"
  190217. "mov %[a], r9\n\t"
  190218. "ldr r7, [%[a], #24]\n\t"
  190219. "mov %[a], r12\n\t"
  190220. "uxth r5, %[a]\n\t"
  190221. "uxth r6, r7\n\t"
  190222. #ifdef WOLFSSL_KEIL
  190223. "muls r6, r5, r6\n\t"
  190224. #elif defined(__clang__)
  190225. "muls r6, r5\n\t"
  190226. #else
  190227. "mul r6, r5\n\t"
  190228. #endif
  190229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190230. "adds r4, r4, r6\n\t"
  190231. #else
  190232. "add r4, r4, r6\n\t"
  190233. #endif
  190234. #ifdef WOLFSSL_KEIL
  190235. "adcs r2, r2, %[r]\n\t"
  190236. #elif defined(__clang__)
  190237. "adcs r2, %[r]\n\t"
  190238. #else
  190239. "adc r2, %[r]\n\t"
  190240. #endif
  190241. #ifdef WOLFSSL_KEIL
  190242. "adcs r3, r3, %[r]\n\t"
  190243. #elif defined(__clang__)
  190244. "adcs r3, %[r]\n\t"
  190245. #else
  190246. "adc r3, %[r]\n\t"
  190247. #endif
  190248. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190249. "adds r4, r4, r6\n\t"
  190250. #else
  190251. "add r4, r4, r6\n\t"
  190252. #endif
  190253. #ifdef WOLFSSL_KEIL
  190254. "adcs r2, r2, %[r]\n\t"
  190255. #elif defined(__clang__)
  190256. "adcs r2, %[r]\n\t"
  190257. #else
  190258. "adc r2, %[r]\n\t"
  190259. #endif
  190260. #ifdef WOLFSSL_KEIL
  190261. "adcs r3, r3, %[r]\n\t"
  190262. #elif defined(__clang__)
  190263. "adcs r3, %[r]\n\t"
  190264. #else
  190265. "adc r3, %[r]\n\t"
  190266. #endif
  190267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190268. "lsrs r6, r7, #16\n\t"
  190269. #else
  190270. "lsr r6, r7, #16\n\t"
  190271. #endif
  190272. #ifdef WOLFSSL_KEIL
  190273. "muls r5, r6, r5\n\t"
  190274. #elif defined(__clang__)
  190275. "muls r5, r6\n\t"
  190276. #else
  190277. "mul r5, r6\n\t"
  190278. #endif
  190279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190280. "lsrs r6, r5, #16\n\t"
  190281. #else
  190282. "lsr r6, r5, #16\n\t"
  190283. #endif
  190284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190285. "lsls r5, r5, #16\n\t"
  190286. #else
  190287. "lsl r5, r5, #16\n\t"
  190288. #endif
  190289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190290. "adds r4, r4, r5\n\t"
  190291. #else
  190292. "add r4, r4, r5\n\t"
  190293. #endif
  190294. #ifdef WOLFSSL_KEIL
  190295. "adcs r2, r2, r6\n\t"
  190296. #elif defined(__clang__)
  190297. "adcs r2, r6\n\t"
  190298. #else
  190299. "adc r2, r6\n\t"
  190300. #endif
  190301. #ifdef WOLFSSL_KEIL
  190302. "adcs r3, r3, %[r]\n\t"
  190303. #elif defined(__clang__)
  190304. "adcs r3, %[r]\n\t"
  190305. #else
  190306. "adc r3, %[r]\n\t"
  190307. #endif
  190308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190309. "adds r4, r4, r5\n\t"
  190310. #else
  190311. "add r4, r4, r5\n\t"
  190312. #endif
  190313. #ifdef WOLFSSL_KEIL
  190314. "adcs r2, r2, r6\n\t"
  190315. #elif defined(__clang__)
  190316. "adcs r2, r6\n\t"
  190317. #else
  190318. "adc r2, r6\n\t"
  190319. #endif
  190320. #ifdef WOLFSSL_KEIL
  190321. "adcs r3, r3, %[r]\n\t"
  190322. #elif defined(__clang__)
  190323. "adcs r3, %[r]\n\t"
  190324. #else
  190325. "adc r3, %[r]\n\t"
  190326. #endif
  190327. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190328. "lsrs r5, %[a], #16\n\t"
  190329. #else
  190330. "lsr r5, %[a], #16\n\t"
  190331. #endif
  190332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190333. "lsrs r6, r7, #16\n\t"
  190334. #else
  190335. "lsr r6, r7, #16\n\t"
  190336. #endif
  190337. #ifdef WOLFSSL_KEIL
  190338. "muls r6, r5, r6\n\t"
  190339. #elif defined(__clang__)
  190340. "muls r6, r5\n\t"
  190341. #else
  190342. "mul r6, r5\n\t"
  190343. #endif
  190344. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190345. "adds r2, r2, r6\n\t"
  190346. #else
  190347. "add r2, r2, r6\n\t"
  190348. #endif
  190349. #ifdef WOLFSSL_KEIL
  190350. "adcs r3, r3, %[r]\n\t"
  190351. #elif defined(__clang__)
  190352. "adcs r3, %[r]\n\t"
  190353. #else
  190354. "adc r3, %[r]\n\t"
  190355. #endif
  190356. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190357. "adds r2, r2, r6\n\t"
  190358. #else
  190359. "add r2, r2, r6\n\t"
  190360. #endif
  190361. #ifdef WOLFSSL_KEIL
  190362. "adcs r3, r3, %[r]\n\t"
  190363. #elif defined(__clang__)
  190364. "adcs r3, %[r]\n\t"
  190365. #else
  190366. "adc r3, %[r]\n\t"
  190367. #endif
  190368. "uxth r6, r7\n\t"
  190369. #ifdef WOLFSSL_KEIL
  190370. "muls r5, r6, r5\n\t"
  190371. #elif defined(__clang__)
  190372. "muls r5, r6\n\t"
  190373. #else
  190374. "mul r5, r6\n\t"
  190375. #endif
  190376. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190377. "lsrs r6, r5, #16\n\t"
  190378. #else
  190379. "lsr r6, r5, #16\n\t"
  190380. #endif
  190381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190382. "lsls r5, r5, #16\n\t"
  190383. #else
  190384. "lsl r5, r5, #16\n\t"
  190385. #endif
  190386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190387. "adds r4, r4, r5\n\t"
  190388. #else
  190389. "add r4, r4, r5\n\t"
  190390. #endif
  190391. #ifdef WOLFSSL_KEIL
  190392. "adcs r2, r2, r6\n\t"
  190393. #elif defined(__clang__)
  190394. "adcs r2, r6\n\t"
  190395. #else
  190396. "adc r2, r6\n\t"
  190397. #endif
  190398. #ifdef WOLFSSL_KEIL
  190399. "adcs r3, r3, %[r]\n\t"
  190400. #elif defined(__clang__)
  190401. "adcs r3, %[r]\n\t"
  190402. #else
  190403. "adc r3, %[r]\n\t"
  190404. #endif
  190405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190406. "adds r4, r4, r5\n\t"
  190407. #else
  190408. "add r4, r4, r5\n\t"
  190409. #endif
  190410. #ifdef WOLFSSL_KEIL
  190411. "adcs r2, r2, r6\n\t"
  190412. #elif defined(__clang__)
  190413. "adcs r2, r6\n\t"
  190414. #else
  190415. "adc r2, r6\n\t"
  190416. #endif
  190417. #ifdef WOLFSSL_KEIL
  190418. "adcs r3, r3, %[r]\n\t"
  190419. #elif defined(__clang__)
  190420. "adcs r3, %[r]\n\t"
  190421. #else
  190422. "adc r3, %[r]\n\t"
  190423. #endif
  190424. "# A[13] * A[7]\n\t"
  190425. "mov %[a], r9\n\t"
  190426. "ldr r7, [%[a], #28]\n\t"
  190427. "mov %[a], r11\n\t"
  190428. "uxth r5, %[a]\n\t"
  190429. "uxth r6, r7\n\t"
  190430. #ifdef WOLFSSL_KEIL
  190431. "muls r6, r5, r6\n\t"
  190432. #elif defined(__clang__)
  190433. "muls r6, r5\n\t"
  190434. #else
  190435. "mul r6, r5\n\t"
  190436. #endif
  190437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190438. "adds r4, r4, r6\n\t"
  190439. #else
  190440. "add r4, r4, r6\n\t"
  190441. #endif
  190442. #ifdef WOLFSSL_KEIL
  190443. "adcs r2, r2, %[r]\n\t"
  190444. #elif defined(__clang__)
  190445. "adcs r2, %[r]\n\t"
  190446. #else
  190447. "adc r2, %[r]\n\t"
  190448. #endif
  190449. #ifdef WOLFSSL_KEIL
  190450. "adcs r3, r3, %[r]\n\t"
  190451. #elif defined(__clang__)
  190452. "adcs r3, %[r]\n\t"
  190453. #else
  190454. "adc r3, %[r]\n\t"
  190455. #endif
  190456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190457. "adds r4, r4, r6\n\t"
  190458. #else
  190459. "add r4, r4, r6\n\t"
  190460. #endif
  190461. #ifdef WOLFSSL_KEIL
  190462. "adcs r2, r2, %[r]\n\t"
  190463. #elif defined(__clang__)
  190464. "adcs r2, %[r]\n\t"
  190465. #else
  190466. "adc r2, %[r]\n\t"
  190467. #endif
  190468. #ifdef WOLFSSL_KEIL
  190469. "adcs r3, r3, %[r]\n\t"
  190470. #elif defined(__clang__)
  190471. "adcs r3, %[r]\n\t"
  190472. #else
  190473. "adc r3, %[r]\n\t"
  190474. #endif
  190475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190476. "lsrs r6, r7, #16\n\t"
  190477. #else
  190478. "lsr r6, r7, #16\n\t"
  190479. #endif
  190480. #ifdef WOLFSSL_KEIL
  190481. "muls r5, r6, r5\n\t"
  190482. #elif defined(__clang__)
  190483. "muls r5, r6\n\t"
  190484. #else
  190485. "mul r5, r6\n\t"
  190486. #endif
  190487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190488. "lsrs r6, r5, #16\n\t"
  190489. #else
  190490. "lsr r6, r5, #16\n\t"
  190491. #endif
  190492. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190493. "lsls r5, r5, #16\n\t"
  190494. #else
  190495. "lsl r5, r5, #16\n\t"
  190496. #endif
  190497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190498. "adds r4, r4, r5\n\t"
  190499. #else
  190500. "add r4, r4, r5\n\t"
  190501. #endif
  190502. #ifdef WOLFSSL_KEIL
  190503. "adcs r2, r2, r6\n\t"
  190504. #elif defined(__clang__)
  190505. "adcs r2, r6\n\t"
  190506. #else
  190507. "adc r2, r6\n\t"
  190508. #endif
  190509. #ifdef WOLFSSL_KEIL
  190510. "adcs r3, r3, %[r]\n\t"
  190511. #elif defined(__clang__)
  190512. "adcs r3, %[r]\n\t"
  190513. #else
  190514. "adc r3, %[r]\n\t"
  190515. #endif
  190516. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190517. "adds r4, r4, r5\n\t"
  190518. #else
  190519. "add r4, r4, r5\n\t"
  190520. #endif
  190521. #ifdef WOLFSSL_KEIL
  190522. "adcs r2, r2, r6\n\t"
  190523. #elif defined(__clang__)
  190524. "adcs r2, r6\n\t"
  190525. #else
  190526. "adc r2, r6\n\t"
  190527. #endif
  190528. #ifdef WOLFSSL_KEIL
  190529. "adcs r3, r3, %[r]\n\t"
  190530. #elif defined(__clang__)
  190531. "adcs r3, %[r]\n\t"
  190532. #else
  190533. "adc r3, %[r]\n\t"
  190534. #endif
  190535. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190536. "lsrs r5, %[a], #16\n\t"
  190537. #else
  190538. "lsr r5, %[a], #16\n\t"
  190539. #endif
  190540. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190541. "lsrs r6, r7, #16\n\t"
  190542. #else
  190543. "lsr r6, r7, #16\n\t"
  190544. #endif
  190545. #ifdef WOLFSSL_KEIL
  190546. "muls r6, r5, r6\n\t"
  190547. #elif defined(__clang__)
  190548. "muls r6, r5\n\t"
  190549. #else
  190550. "mul r6, r5\n\t"
  190551. #endif
  190552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190553. "adds r2, r2, r6\n\t"
  190554. #else
  190555. "add r2, 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 r2, r2, r6\n\t"
  190566. #else
  190567. "add r2, r2, r6\n\t"
  190568. #endif
  190569. #ifdef WOLFSSL_KEIL
  190570. "adcs r3, r3, %[r]\n\t"
  190571. #elif defined(__clang__)
  190572. "adcs r3, %[r]\n\t"
  190573. #else
  190574. "adc r3, %[r]\n\t"
  190575. #endif
  190576. "uxth r6, r7\n\t"
  190577. #ifdef WOLFSSL_KEIL
  190578. "muls r5, r6, r5\n\t"
  190579. #elif defined(__clang__)
  190580. "muls r5, r6\n\t"
  190581. #else
  190582. "mul r5, r6\n\t"
  190583. #endif
  190584. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190585. "lsrs r6, r5, #16\n\t"
  190586. #else
  190587. "lsr r6, r5, #16\n\t"
  190588. #endif
  190589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190590. "lsls r5, r5, #16\n\t"
  190591. #else
  190592. "lsl r5, r5, #16\n\t"
  190593. #endif
  190594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190595. "adds r4, r4, r5\n\t"
  190596. #else
  190597. "add r4, r4, r5\n\t"
  190598. #endif
  190599. #ifdef WOLFSSL_KEIL
  190600. "adcs r2, r2, r6\n\t"
  190601. #elif defined(__clang__)
  190602. "adcs r2, r6\n\t"
  190603. #else
  190604. "adc r2, r6\n\t"
  190605. #endif
  190606. #ifdef WOLFSSL_KEIL
  190607. "adcs r3, r3, %[r]\n\t"
  190608. #elif defined(__clang__)
  190609. "adcs r3, %[r]\n\t"
  190610. #else
  190611. "adc r3, %[r]\n\t"
  190612. #endif
  190613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190614. "adds r4, r4, r5\n\t"
  190615. #else
  190616. "add r4, r4, r5\n\t"
  190617. #endif
  190618. #ifdef WOLFSSL_KEIL
  190619. "adcs r2, r2, r6\n\t"
  190620. #elif defined(__clang__)
  190621. "adcs r2, r6\n\t"
  190622. #else
  190623. "adc r2, r6\n\t"
  190624. #endif
  190625. #ifdef WOLFSSL_KEIL
  190626. "adcs r3, r3, %[r]\n\t"
  190627. #elif defined(__clang__)
  190628. "adcs r3, %[r]\n\t"
  190629. #else
  190630. "adc r3, %[r]\n\t"
  190631. #endif
  190632. "# A[12] * A[8]\n\t"
  190633. "mov %[a], r9\n\t"
  190634. "ldr r7, [%[a], #32]\n\t"
  190635. "mov %[a], r10\n\t"
  190636. "uxth r5, %[a]\n\t"
  190637. "uxth r6, r7\n\t"
  190638. #ifdef WOLFSSL_KEIL
  190639. "muls r6, r5, r6\n\t"
  190640. #elif defined(__clang__)
  190641. "muls r6, r5\n\t"
  190642. #else
  190643. "mul r6, r5\n\t"
  190644. #endif
  190645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190646. "adds r4, r4, r6\n\t"
  190647. #else
  190648. "add r4, r4, r6\n\t"
  190649. #endif
  190650. #ifdef WOLFSSL_KEIL
  190651. "adcs r2, r2, %[r]\n\t"
  190652. #elif defined(__clang__)
  190653. "adcs r2, %[r]\n\t"
  190654. #else
  190655. "adc r2, %[r]\n\t"
  190656. #endif
  190657. #ifdef WOLFSSL_KEIL
  190658. "adcs r3, r3, %[r]\n\t"
  190659. #elif defined(__clang__)
  190660. "adcs r3, %[r]\n\t"
  190661. #else
  190662. "adc r3, %[r]\n\t"
  190663. #endif
  190664. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190665. "adds r4, r4, r6\n\t"
  190666. #else
  190667. "add r4, r4, r6\n\t"
  190668. #endif
  190669. #ifdef WOLFSSL_KEIL
  190670. "adcs r2, r2, %[r]\n\t"
  190671. #elif defined(__clang__)
  190672. "adcs r2, %[r]\n\t"
  190673. #else
  190674. "adc r2, %[r]\n\t"
  190675. #endif
  190676. #ifdef WOLFSSL_KEIL
  190677. "adcs r3, r3, %[r]\n\t"
  190678. #elif defined(__clang__)
  190679. "adcs r3, %[r]\n\t"
  190680. #else
  190681. "adc r3, %[r]\n\t"
  190682. #endif
  190683. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190684. "lsrs r6, r7, #16\n\t"
  190685. #else
  190686. "lsr r6, r7, #16\n\t"
  190687. #endif
  190688. #ifdef WOLFSSL_KEIL
  190689. "muls r5, r6, r5\n\t"
  190690. #elif defined(__clang__)
  190691. "muls r5, r6\n\t"
  190692. #else
  190693. "mul r5, r6\n\t"
  190694. #endif
  190695. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190696. "lsrs r6, r5, #16\n\t"
  190697. #else
  190698. "lsr r6, r5, #16\n\t"
  190699. #endif
  190700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190701. "lsls r5, r5, #16\n\t"
  190702. #else
  190703. "lsl r5, r5, #16\n\t"
  190704. #endif
  190705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190706. "adds r4, r4, r5\n\t"
  190707. #else
  190708. "add r4, r4, r5\n\t"
  190709. #endif
  190710. #ifdef WOLFSSL_KEIL
  190711. "adcs r2, r2, r6\n\t"
  190712. #elif defined(__clang__)
  190713. "adcs r2, r6\n\t"
  190714. #else
  190715. "adc r2, r6\n\t"
  190716. #endif
  190717. #ifdef WOLFSSL_KEIL
  190718. "adcs r3, r3, %[r]\n\t"
  190719. #elif defined(__clang__)
  190720. "adcs r3, %[r]\n\t"
  190721. #else
  190722. "adc r3, %[r]\n\t"
  190723. #endif
  190724. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190725. "adds r4, r4, r5\n\t"
  190726. #else
  190727. "add r4, r4, r5\n\t"
  190728. #endif
  190729. #ifdef WOLFSSL_KEIL
  190730. "adcs r2, r2, r6\n\t"
  190731. #elif defined(__clang__)
  190732. "adcs r2, r6\n\t"
  190733. #else
  190734. "adc r2, r6\n\t"
  190735. #endif
  190736. #ifdef WOLFSSL_KEIL
  190737. "adcs r3, r3, %[r]\n\t"
  190738. #elif defined(__clang__)
  190739. "adcs r3, %[r]\n\t"
  190740. #else
  190741. "adc r3, %[r]\n\t"
  190742. #endif
  190743. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190744. "lsrs r5, %[a], #16\n\t"
  190745. #else
  190746. "lsr r5, %[a], #16\n\t"
  190747. #endif
  190748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190749. "lsrs r6, r7, #16\n\t"
  190750. #else
  190751. "lsr r6, r7, #16\n\t"
  190752. #endif
  190753. #ifdef WOLFSSL_KEIL
  190754. "muls r6, r5, r6\n\t"
  190755. #elif defined(__clang__)
  190756. "muls r6, r5\n\t"
  190757. #else
  190758. "mul r6, r5\n\t"
  190759. #endif
  190760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190761. "adds r2, r2, r6\n\t"
  190762. #else
  190763. "add r2, 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 r2, r2, r6\n\t"
  190774. #else
  190775. "add r2, r2, r6\n\t"
  190776. #endif
  190777. #ifdef WOLFSSL_KEIL
  190778. "adcs r3, r3, %[r]\n\t"
  190779. #elif defined(__clang__)
  190780. "adcs r3, %[r]\n\t"
  190781. #else
  190782. "adc r3, %[r]\n\t"
  190783. #endif
  190784. "uxth r6, r7\n\t"
  190785. #ifdef WOLFSSL_KEIL
  190786. "muls r5, r6, r5\n\t"
  190787. #elif defined(__clang__)
  190788. "muls r5, r6\n\t"
  190789. #else
  190790. "mul r5, r6\n\t"
  190791. #endif
  190792. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190793. "lsrs r6, r5, #16\n\t"
  190794. #else
  190795. "lsr r6, r5, #16\n\t"
  190796. #endif
  190797. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190798. "lsls r5, r5, #16\n\t"
  190799. #else
  190800. "lsl r5, r5, #16\n\t"
  190801. #endif
  190802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190803. "adds r4, r4, r5\n\t"
  190804. #else
  190805. "add r4, r4, r5\n\t"
  190806. #endif
  190807. #ifdef WOLFSSL_KEIL
  190808. "adcs r2, r2, r6\n\t"
  190809. #elif defined(__clang__)
  190810. "adcs r2, r6\n\t"
  190811. #else
  190812. "adc r2, r6\n\t"
  190813. #endif
  190814. #ifdef WOLFSSL_KEIL
  190815. "adcs r3, r3, %[r]\n\t"
  190816. #elif defined(__clang__)
  190817. "adcs r3, %[r]\n\t"
  190818. #else
  190819. "adc r3, %[r]\n\t"
  190820. #endif
  190821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190822. "adds r4, r4, r5\n\t"
  190823. #else
  190824. "add r4, r4, r5\n\t"
  190825. #endif
  190826. #ifdef WOLFSSL_KEIL
  190827. "adcs r2, r2, r6\n\t"
  190828. #elif defined(__clang__)
  190829. "adcs r2, r6\n\t"
  190830. #else
  190831. "adc r2, r6\n\t"
  190832. #endif
  190833. #ifdef WOLFSSL_KEIL
  190834. "adcs r3, r3, %[r]\n\t"
  190835. #elif defined(__clang__)
  190836. "adcs r3, %[r]\n\t"
  190837. #else
  190838. "adc r3, %[r]\n\t"
  190839. #endif
  190840. "# A[11] * A[9]\n\t"
  190841. "mov %[a], r9\n\t"
  190842. "ldr r7, [%[a], #36]\n\t"
  190843. "ldr %[a], [%[a], #44]\n\t"
  190844. "uxth r5, %[a]\n\t"
  190845. "uxth r6, r7\n\t"
  190846. #ifdef WOLFSSL_KEIL
  190847. "muls r6, r5, r6\n\t"
  190848. #elif defined(__clang__)
  190849. "muls r6, r5\n\t"
  190850. #else
  190851. "mul r6, r5\n\t"
  190852. #endif
  190853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190854. "adds r4, r4, r6\n\t"
  190855. #else
  190856. "add r4, r4, r6\n\t"
  190857. #endif
  190858. #ifdef WOLFSSL_KEIL
  190859. "adcs r2, r2, %[r]\n\t"
  190860. #elif defined(__clang__)
  190861. "adcs r2, %[r]\n\t"
  190862. #else
  190863. "adc r2, %[r]\n\t"
  190864. #endif
  190865. #ifdef WOLFSSL_KEIL
  190866. "adcs r3, r3, %[r]\n\t"
  190867. #elif defined(__clang__)
  190868. "adcs r3, %[r]\n\t"
  190869. #else
  190870. "adc r3, %[r]\n\t"
  190871. #endif
  190872. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190873. "adds r4, r4, r6\n\t"
  190874. #else
  190875. "add r4, r4, r6\n\t"
  190876. #endif
  190877. #ifdef WOLFSSL_KEIL
  190878. "adcs r2, r2, %[r]\n\t"
  190879. #elif defined(__clang__)
  190880. "adcs r2, %[r]\n\t"
  190881. #else
  190882. "adc r2, %[r]\n\t"
  190883. #endif
  190884. #ifdef WOLFSSL_KEIL
  190885. "adcs r3, r3, %[r]\n\t"
  190886. #elif defined(__clang__)
  190887. "adcs r3, %[r]\n\t"
  190888. #else
  190889. "adc r3, %[r]\n\t"
  190890. #endif
  190891. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190892. "lsrs r6, r7, #16\n\t"
  190893. #else
  190894. "lsr r6, r7, #16\n\t"
  190895. #endif
  190896. #ifdef WOLFSSL_KEIL
  190897. "muls r5, r6, r5\n\t"
  190898. #elif defined(__clang__)
  190899. "muls r5, r6\n\t"
  190900. #else
  190901. "mul r5, r6\n\t"
  190902. #endif
  190903. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190904. "lsrs r6, r5, #16\n\t"
  190905. #else
  190906. "lsr r6, r5, #16\n\t"
  190907. #endif
  190908. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190909. "lsls r5, r5, #16\n\t"
  190910. #else
  190911. "lsl r5, r5, #16\n\t"
  190912. #endif
  190913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190914. "adds r4, r4, r5\n\t"
  190915. #else
  190916. "add r4, r4, r5\n\t"
  190917. #endif
  190918. #ifdef WOLFSSL_KEIL
  190919. "adcs r2, r2, r6\n\t"
  190920. #elif defined(__clang__)
  190921. "adcs r2, r6\n\t"
  190922. #else
  190923. "adc r2, r6\n\t"
  190924. #endif
  190925. #ifdef WOLFSSL_KEIL
  190926. "adcs r3, r3, %[r]\n\t"
  190927. #elif defined(__clang__)
  190928. "adcs r3, %[r]\n\t"
  190929. #else
  190930. "adc r3, %[r]\n\t"
  190931. #endif
  190932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190933. "adds r4, r4, r5\n\t"
  190934. #else
  190935. "add r4, r4, r5\n\t"
  190936. #endif
  190937. #ifdef WOLFSSL_KEIL
  190938. "adcs r2, r2, r6\n\t"
  190939. #elif defined(__clang__)
  190940. "adcs r2, r6\n\t"
  190941. #else
  190942. "adc r2, r6\n\t"
  190943. #endif
  190944. #ifdef WOLFSSL_KEIL
  190945. "adcs r3, r3, %[r]\n\t"
  190946. #elif defined(__clang__)
  190947. "adcs r3, %[r]\n\t"
  190948. #else
  190949. "adc r3, %[r]\n\t"
  190950. #endif
  190951. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190952. "lsrs r5, %[a], #16\n\t"
  190953. #else
  190954. "lsr r5, %[a], #16\n\t"
  190955. #endif
  190956. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190957. "lsrs r6, r7, #16\n\t"
  190958. #else
  190959. "lsr r6, r7, #16\n\t"
  190960. #endif
  190961. #ifdef WOLFSSL_KEIL
  190962. "muls r6, r5, r6\n\t"
  190963. #elif defined(__clang__)
  190964. "muls r6, r5\n\t"
  190965. #else
  190966. "mul r6, r5\n\t"
  190967. #endif
  190968. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  190969. "adds r2, r2, r6\n\t"
  190970. #else
  190971. "add r2, 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 r2, r2, r6\n\t"
  190982. #else
  190983. "add r2, r2, r6\n\t"
  190984. #endif
  190985. #ifdef WOLFSSL_KEIL
  190986. "adcs r3, r3, %[r]\n\t"
  190987. #elif defined(__clang__)
  190988. "adcs r3, %[r]\n\t"
  190989. #else
  190990. "adc r3, %[r]\n\t"
  190991. #endif
  190992. "uxth r6, r7\n\t"
  190993. #ifdef WOLFSSL_KEIL
  190994. "muls r5, r6, r5\n\t"
  190995. #elif defined(__clang__)
  190996. "muls r5, r6\n\t"
  190997. #else
  190998. "mul r5, r6\n\t"
  190999. #endif
  191000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191001. "lsrs r6, r5, #16\n\t"
  191002. #else
  191003. "lsr r6, r5, #16\n\t"
  191004. #endif
  191005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191006. "lsls r5, r5, #16\n\t"
  191007. #else
  191008. "lsl r5, r5, #16\n\t"
  191009. #endif
  191010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191011. "adds r4, r4, r5\n\t"
  191012. #else
  191013. "add r4, r4, r5\n\t"
  191014. #endif
  191015. #ifdef WOLFSSL_KEIL
  191016. "adcs r2, r2, r6\n\t"
  191017. #elif defined(__clang__)
  191018. "adcs r2, r6\n\t"
  191019. #else
  191020. "adc r2, r6\n\t"
  191021. #endif
  191022. #ifdef WOLFSSL_KEIL
  191023. "adcs r3, r3, %[r]\n\t"
  191024. #elif defined(__clang__)
  191025. "adcs r3, %[r]\n\t"
  191026. #else
  191027. "adc r3, %[r]\n\t"
  191028. #endif
  191029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191030. "adds r4, r4, r5\n\t"
  191031. #else
  191032. "add r4, r4, r5\n\t"
  191033. #endif
  191034. #ifdef WOLFSSL_KEIL
  191035. "adcs r2, r2, r6\n\t"
  191036. #elif defined(__clang__)
  191037. "adcs r2, r6\n\t"
  191038. #else
  191039. "adc r2, r6\n\t"
  191040. #endif
  191041. #ifdef WOLFSSL_KEIL
  191042. "adcs r3, r3, %[r]\n\t"
  191043. #elif defined(__clang__)
  191044. "adcs r3, %[r]\n\t"
  191045. #else
  191046. "adc r3, %[r]\n\t"
  191047. #endif
  191048. "# A[10] * A[10]\n\t"
  191049. "mov %[a], r9\n\t"
  191050. "ldr r7, [%[a], #40]\n\t"
  191051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191052. "lsrs r6, r7, #16\n\t"
  191053. #else
  191054. "lsr r6, r7, #16\n\t"
  191055. #endif
  191056. "uxth r5, r7\n\t"
  191057. #ifdef WOLFSSL_KEIL
  191058. "muls r5, r5, r5\n\t"
  191059. #elif defined(__clang__)
  191060. "muls r5, r5\n\t"
  191061. #else
  191062. "mul r5, r5\n\t"
  191063. #endif
  191064. #ifdef WOLFSSL_KEIL
  191065. "muls r6, r6, r6\n\t"
  191066. #elif defined(__clang__)
  191067. "muls r6, r6\n\t"
  191068. #else
  191069. "mul r6, r6\n\t"
  191070. #endif
  191071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191072. "adds r4, r4, r5\n\t"
  191073. #else
  191074. "add r4, r4, r5\n\t"
  191075. #endif
  191076. #ifdef WOLFSSL_KEIL
  191077. "adcs r2, r2, r6\n\t"
  191078. #elif defined(__clang__)
  191079. "adcs r2, r6\n\t"
  191080. #else
  191081. "adc r2, r6\n\t"
  191082. #endif
  191083. #ifdef WOLFSSL_KEIL
  191084. "adcs r3, r3, %[r]\n\t"
  191085. #elif defined(__clang__)
  191086. "adcs r3, %[r]\n\t"
  191087. #else
  191088. "adc r3, %[r]\n\t"
  191089. #endif
  191090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191091. "lsrs r6, r7, #16\n\t"
  191092. #else
  191093. "lsr r6, r7, #16\n\t"
  191094. #endif
  191095. "uxth r5, r7\n\t"
  191096. #ifdef WOLFSSL_KEIL
  191097. "muls r5, r6, r5\n\t"
  191098. #elif defined(__clang__)
  191099. "muls r5, r6\n\t"
  191100. #else
  191101. "mul r5, r6\n\t"
  191102. #endif
  191103. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191104. "lsrs r6, r5, #15\n\t"
  191105. #else
  191106. "lsr r6, r5, #15\n\t"
  191107. #endif
  191108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191109. "lsls r5, r5, #17\n\t"
  191110. #else
  191111. "lsl r5, r5, #17\n\t"
  191112. #endif
  191113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191114. "adds r4, r4, r5\n\t"
  191115. #else
  191116. "add r4, r4, r5\n\t"
  191117. #endif
  191118. #ifdef WOLFSSL_KEIL
  191119. "adcs r2, r2, r6\n\t"
  191120. #elif defined(__clang__)
  191121. "adcs r2, r6\n\t"
  191122. #else
  191123. "adc r2, r6\n\t"
  191124. #endif
  191125. #ifdef WOLFSSL_KEIL
  191126. "adcs r3, r3, %[r]\n\t"
  191127. #elif defined(__clang__)
  191128. "adcs r3, %[r]\n\t"
  191129. #else
  191130. "adc r3, %[r]\n\t"
  191131. #endif
  191132. "mov %[r], r8\n\t"
  191133. "str r4, [%[r], #80]\n\t"
  191134. "movs %[r], #0\n\t"
  191135. "# A[11] * A[10]\n\t"
  191136. "movs r4, #0\n\t"
  191137. "ldr %[a], [%[a], #44]\n\t"
  191138. "uxth r5, %[a]\n\t"
  191139. "uxth r6, r7\n\t"
  191140. #ifdef WOLFSSL_KEIL
  191141. "muls r6, r5, r6\n\t"
  191142. #elif defined(__clang__)
  191143. "muls r6, r5\n\t"
  191144. #else
  191145. "mul r6, r5\n\t"
  191146. #endif
  191147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191148. "adds r2, r2, r6\n\t"
  191149. #else
  191150. "add r2, r2, r6\n\t"
  191151. #endif
  191152. #ifdef WOLFSSL_KEIL
  191153. "adcs r3, r3, %[r]\n\t"
  191154. #elif defined(__clang__)
  191155. "adcs r3, %[r]\n\t"
  191156. #else
  191157. "adc r3, %[r]\n\t"
  191158. #endif
  191159. #ifdef WOLFSSL_KEIL
  191160. "adcs r4, r4, %[r]\n\t"
  191161. #elif defined(__clang__)
  191162. "adcs r4, %[r]\n\t"
  191163. #else
  191164. "adc r4, %[r]\n\t"
  191165. #endif
  191166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191167. "adds r2, r2, r6\n\t"
  191168. #else
  191169. "add r2, r2, r6\n\t"
  191170. #endif
  191171. #ifdef WOLFSSL_KEIL
  191172. "adcs r3, r3, %[r]\n\t"
  191173. #elif defined(__clang__)
  191174. "adcs r3, %[r]\n\t"
  191175. #else
  191176. "adc r3, %[r]\n\t"
  191177. #endif
  191178. #ifdef WOLFSSL_KEIL
  191179. "adcs r4, r4, %[r]\n\t"
  191180. #elif defined(__clang__)
  191181. "adcs r4, %[r]\n\t"
  191182. #else
  191183. "adc r4, %[r]\n\t"
  191184. #endif
  191185. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191186. "lsrs r6, r7, #16\n\t"
  191187. #else
  191188. "lsr r6, r7, #16\n\t"
  191189. #endif
  191190. #ifdef WOLFSSL_KEIL
  191191. "muls r5, r6, r5\n\t"
  191192. #elif defined(__clang__)
  191193. "muls r5, r6\n\t"
  191194. #else
  191195. "mul r5, r6\n\t"
  191196. #endif
  191197. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191198. "lsrs r6, r5, #16\n\t"
  191199. #else
  191200. "lsr r6, r5, #16\n\t"
  191201. #endif
  191202. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191203. "lsls r5, r5, #16\n\t"
  191204. #else
  191205. "lsl r5, r5, #16\n\t"
  191206. #endif
  191207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191208. "adds r2, r2, r5\n\t"
  191209. #else
  191210. "add r2, r2, r5\n\t"
  191211. #endif
  191212. #ifdef WOLFSSL_KEIL
  191213. "adcs r3, r3, r6\n\t"
  191214. #elif defined(__clang__)
  191215. "adcs r3, r6\n\t"
  191216. #else
  191217. "adc r3, r6\n\t"
  191218. #endif
  191219. #ifdef WOLFSSL_KEIL
  191220. "adcs r4, r4, %[r]\n\t"
  191221. #elif defined(__clang__)
  191222. "adcs r4, %[r]\n\t"
  191223. #else
  191224. "adc r4, %[r]\n\t"
  191225. #endif
  191226. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191227. "adds r2, r2, r5\n\t"
  191228. #else
  191229. "add r2, r2, r5\n\t"
  191230. #endif
  191231. #ifdef WOLFSSL_KEIL
  191232. "adcs r3, r3, r6\n\t"
  191233. #elif defined(__clang__)
  191234. "adcs r3, r6\n\t"
  191235. #else
  191236. "adc r3, r6\n\t"
  191237. #endif
  191238. #ifdef WOLFSSL_KEIL
  191239. "adcs r4, r4, %[r]\n\t"
  191240. #elif defined(__clang__)
  191241. "adcs r4, %[r]\n\t"
  191242. #else
  191243. "adc r4, %[r]\n\t"
  191244. #endif
  191245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191246. "lsrs r5, %[a], #16\n\t"
  191247. #else
  191248. "lsr r5, %[a], #16\n\t"
  191249. #endif
  191250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191251. "lsrs r6, r7, #16\n\t"
  191252. #else
  191253. "lsr r6, r7, #16\n\t"
  191254. #endif
  191255. #ifdef WOLFSSL_KEIL
  191256. "muls r6, r5, r6\n\t"
  191257. #elif defined(__clang__)
  191258. "muls r6, r5\n\t"
  191259. #else
  191260. "mul r6, r5\n\t"
  191261. #endif
  191262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191263. "adds r3, r3, r6\n\t"
  191264. #else
  191265. "add r3, r3, r6\n\t"
  191266. #endif
  191267. #ifdef WOLFSSL_KEIL
  191268. "adcs r4, r4, %[r]\n\t"
  191269. #elif defined(__clang__)
  191270. "adcs r4, %[r]\n\t"
  191271. #else
  191272. "adc r4, %[r]\n\t"
  191273. #endif
  191274. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191275. "adds r3, r3, r6\n\t"
  191276. #else
  191277. "add r3, r3, r6\n\t"
  191278. #endif
  191279. #ifdef WOLFSSL_KEIL
  191280. "adcs r4, r4, %[r]\n\t"
  191281. #elif defined(__clang__)
  191282. "adcs r4, %[r]\n\t"
  191283. #else
  191284. "adc r4, %[r]\n\t"
  191285. #endif
  191286. "uxth r6, r7\n\t"
  191287. #ifdef WOLFSSL_KEIL
  191288. "muls r5, r6, r5\n\t"
  191289. #elif defined(__clang__)
  191290. "muls r5, r6\n\t"
  191291. #else
  191292. "mul r5, r6\n\t"
  191293. #endif
  191294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191295. "lsrs r6, r5, #16\n\t"
  191296. #else
  191297. "lsr r6, r5, #16\n\t"
  191298. #endif
  191299. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191300. "lsls r5, r5, #16\n\t"
  191301. #else
  191302. "lsl r5, r5, #16\n\t"
  191303. #endif
  191304. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191305. "adds r2, r2, r5\n\t"
  191306. #else
  191307. "add r2, r2, r5\n\t"
  191308. #endif
  191309. #ifdef WOLFSSL_KEIL
  191310. "adcs r3, r3, r6\n\t"
  191311. #elif defined(__clang__)
  191312. "adcs r3, r6\n\t"
  191313. #else
  191314. "adc r3, r6\n\t"
  191315. #endif
  191316. #ifdef WOLFSSL_KEIL
  191317. "adcs r4, r4, %[r]\n\t"
  191318. #elif defined(__clang__)
  191319. "adcs r4, %[r]\n\t"
  191320. #else
  191321. "adc r4, %[r]\n\t"
  191322. #endif
  191323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191324. "adds r2, r2, r5\n\t"
  191325. #else
  191326. "add r2, r2, r5\n\t"
  191327. #endif
  191328. #ifdef WOLFSSL_KEIL
  191329. "adcs r3, r3, r6\n\t"
  191330. #elif defined(__clang__)
  191331. "adcs r3, r6\n\t"
  191332. #else
  191333. "adc r3, r6\n\t"
  191334. #endif
  191335. #ifdef WOLFSSL_KEIL
  191336. "adcs r4, r4, %[r]\n\t"
  191337. #elif defined(__clang__)
  191338. "adcs r4, %[r]\n\t"
  191339. #else
  191340. "adc r4, %[r]\n\t"
  191341. #endif
  191342. "# A[12] * A[9]\n\t"
  191343. "mov %[a], r9\n\t"
  191344. "ldr r7, [%[a], #36]\n\t"
  191345. "mov %[a], r10\n\t"
  191346. "uxth r5, %[a]\n\t"
  191347. "uxth r6, r7\n\t"
  191348. #ifdef WOLFSSL_KEIL
  191349. "muls r6, r5, r6\n\t"
  191350. #elif defined(__clang__)
  191351. "muls r6, r5\n\t"
  191352. #else
  191353. "mul r6, r5\n\t"
  191354. #endif
  191355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191356. "adds r2, r2, r6\n\t"
  191357. #else
  191358. "add r2, r2, r6\n\t"
  191359. #endif
  191360. #ifdef WOLFSSL_KEIL
  191361. "adcs r3, r3, %[r]\n\t"
  191362. #elif defined(__clang__)
  191363. "adcs r3, %[r]\n\t"
  191364. #else
  191365. "adc r3, %[r]\n\t"
  191366. #endif
  191367. #ifdef WOLFSSL_KEIL
  191368. "adcs r4, r4, %[r]\n\t"
  191369. #elif defined(__clang__)
  191370. "adcs r4, %[r]\n\t"
  191371. #else
  191372. "adc r4, %[r]\n\t"
  191373. #endif
  191374. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191375. "adds r2, r2, r6\n\t"
  191376. #else
  191377. "add r2, r2, r6\n\t"
  191378. #endif
  191379. #ifdef WOLFSSL_KEIL
  191380. "adcs r3, r3, %[r]\n\t"
  191381. #elif defined(__clang__)
  191382. "adcs r3, %[r]\n\t"
  191383. #else
  191384. "adc r3, %[r]\n\t"
  191385. #endif
  191386. #ifdef WOLFSSL_KEIL
  191387. "adcs r4, r4, %[r]\n\t"
  191388. #elif defined(__clang__)
  191389. "adcs r4, %[r]\n\t"
  191390. #else
  191391. "adc r4, %[r]\n\t"
  191392. #endif
  191393. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191394. "lsrs r6, r7, #16\n\t"
  191395. #else
  191396. "lsr r6, r7, #16\n\t"
  191397. #endif
  191398. #ifdef WOLFSSL_KEIL
  191399. "muls r5, r6, r5\n\t"
  191400. #elif defined(__clang__)
  191401. "muls r5, r6\n\t"
  191402. #else
  191403. "mul r5, r6\n\t"
  191404. #endif
  191405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191406. "lsrs r6, r5, #16\n\t"
  191407. #else
  191408. "lsr r6, r5, #16\n\t"
  191409. #endif
  191410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191411. "lsls r5, r5, #16\n\t"
  191412. #else
  191413. "lsl r5, r5, #16\n\t"
  191414. #endif
  191415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191416. "adds r2, r2, r5\n\t"
  191417. #else
  191418. "add r2, r2, r5\n\t"
  191419. #endif
  191420. #ifdef WOLFSSL_KEIL
  191421. "adcs r3, r3, r6\n\t"
  191422. #elif defined(__clang__)
  191423. "adcs r3, r6\n\t"
  191424. #else
  191425. "adc r3, r6\n\t"
  191426. #endif
  191427. #ifdef WOLFSSL_KEIL
  191428. "adcs r4, r4, %[r]\n\t"
  191429. #elif defined(__clang__)
  191430. "adcs r4, %[r]\n\t"
  191431. #else
  191432. "adc r4, %[r]\n\t"
  191433. #endif
  191434. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191435. "adds r2, r2, r5\n\t"
  191436. #else
  191437. "add r2, r2, r5\n\t"
  191438. #endif
  191439. #ifdef WOLFSSL_KEIL
  191440. "adcs r3, r3, r6\n\t"
  191441. #elif defined(__clang__)
  191442. "adcs r3, r6\n\t"
  191443. #else
  191444. "adc r3, r6\n\t"
  191445. #endif
  191446. #ifdef WOLFSSL_KEIL
  191447. "adcs r4, r4, %[r]\n\t"
  191448. #elif defined(__clang__)
  191449. "adcs r4, %[r]\n\t"
  191450. #else
  191451. "adc r4, %[r]\n\t"
  191452. #endif
  191453. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191454. "lsrs r5, %[a], #16\n\t"
  191455. #else
  191456. "lsr r5, %[a], #16\n\t"
  191457. #endif
  191458. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191459. "lsrs r6, r7, #16\n\t"
  191460. #else
  191461. "lsr r6, r7, #16\n\t"
  191462. #endif
  191463. #ifdef WOLFSSL_KEIL
  191464. "muls r6, r5, r6\n\t"
  191465. #elif defined(__clang__)
  191466. "muls r6, r5\n\t"
  191467. #else
  191468. "mul r6, r5\n\t"
  191469. #endif
  191470. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191471. "adds r3, r3, r6\n\t"
  191472. #else
  191473. "add r3, r3, r6\n\t"
  191474. #endif
  191475. #ifdef WOLFSSL_KEIL
  191476. "adcs r4, r4, %[r]\n\t"
  191477. #elif defined(__clang__)
  191478. "adcs r4, %[r]\n\t"
  191479. #else
  191480. "adc r4, %[r]\n\t"
  191481. #endif
  191482. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191483. "adds r3, r3, r6\n\t"
  191484. #else
  191485. "add r3, r3, r6\n\t"
  191486. #endif
  191487. #ifdef WOLFSSL_KEIL
  191488. "adcs r4, r4, %[r]\n\t"
  191489. #elif defined(__clang__)
  191490. "adcs r4, %[r]\n\t"
  191491. #else
  191492. "adc r4, %[r]\n\t"
  191493. #endif
  191494. "uxth r6, r7\n\t"
  191495. #ifdef WOLFSSL_KEIL
  191496. "muls r5, r6, r5\n\t"
  191497. #elif defined(__clang__)
  191498. "muls r5, r6\n\t"
  191499. #else
  191500. "mul r5, r6\n\t"
  191501. #endif
  191502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191503. "lsrs r6, r5, #16\n\t"
  191504. #else
  191505. "lsr r6, r5, #16\n\t"
  191506. #endif
  191507. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191508. "lsls r5, r5, #16\n\t"
  191509. #else
  191510. "lsl r5, r5, #16\n\t"
  191511. #endif
  191512. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191513. "adds r2, r2, r5\n\t"
  191514. #else
  191515. "add r2, r2, r5\n\t"
  191516. #endif
  191517. #ifdef WOLFSSL_KEIL
  191518. "adcs r3, r3, r6\n\t"
  191519. #elif defined(__clang__)
  191520. "adcs r3, r6\n\t"
  191521. #else
  191522. "adc r3, r6\n\t"
  191523. #endif
  191524. #ifdef WOLFSSL_KEIL
  191525. "adcs r4, r4, %[r]\n\t"
  191526. #elif defined(__clang__)
  191527. "adcs r4, %[r]\n\t"
  191528. #else
  191529. "adc r4, %[r]\n\t"
  191530. #endif
  191531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191532. "adds r2, r2, r5\n\t"
  191533. #else
  191534. "add r2, r2, r5\n\t"
  191535. #endif
  191536. #ifdef WOLFSSL_KEIL
  191537. "adcs r3, r3, r6\n\t"
  191538. #elif defined(__clang__)
  191539. "adcs r3, r6\n\t"
  191540. #else
  191541. "adc r3, r6\n\t"
  191542. #endif
  191543. #ifdef WOLFSSL_KEIL
  191544. "adcs r4, r4, %[r]\n\t"
  191545. #elif defined(__clang__)
  191546. "adcs r4, %[r]\n\t"
  191547. #else
  191548. "adc r4, %[r]\n\t"
  191549. #endif
  191550. "# A[13] * A[8]\n\t"
  191551. "mov %[a], r9\n\t"
  191552. "ldr r7, [%[a], #32]\n\t"
  191553. "mov %[a], r11\n\t"
  191554. "uxth r5, %[a]\n\t"
  191555. "uxth r6, r7\n\t"
  191556. #ifdef WOLFSSL_KEIL
  191557. "muls r6, r5, r6\n\t"
  191558. #elif defined(__clang__)
  191559. "muls r6, r5\n\t"
  191560. #else
  191561. "mul r6, r5\n\t"
  191562. #endif
  191563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191564. "adds r2, r2, r6\n\t"
  191565. #else
  191566. "add r2, r2, r6\n\t"
  191567. #endif
  191568. #ifdef WOLFSSL_KEIL
  191569. "adcs r3, r3, %[r]\n\t"
  191570. #elif defined(__clang__)
  191571. "adcs r3, %[r]\n\t"
  191572. #else
  191573. "adc r3, %[r]\n\t"
  191574. #endif
  191575. #ifdef WOLFSSL_KEIL
  191576. "adcs r4, r4, %[r]\n\t"
  191577. #elif defined(__clang__)
  191578. "adcs r4, %[r]\n\t"
  191579. #else
  191580. "adc r4, %[r]\n\t"
  191581. #endif
  191582. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191583. "adds r2, r2, r6\n\t"
  191584. #else
  191585. "add r2, r2, r6\n\t"
  191586. #endif
  191587. #ifdef WOLFSSL_KEIL
  191588. "adcs r3, r3, %[r]\n\t"
  191589. #elif defined(__clang__)
  191590. "adcs r3, %[r]\n\t"
  191591. #else
  191592. "adc r3, %[r]\n\t"
  191593. #endif
  191594. #ifdef WOLFSSL_KEIL
  191595. "adcs r4, r4, %[r]\n\t"
  191596. #elif defined(__clang__)
  191597. "adcs r4, %[r]\n\t"
  191598. #else
  191599. "adc r4, %[r]\n\t"
  191600. #endif
  191601. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191602. "lsrs r6, r7, #16\n\t"
  191603. #else
  191604. "lsr r6, r7, #16\n\t"
  191605. #endif
  191606. #ifdef WOLFSSL_KEIL
  191607. "muls r5, r6, r5\n\t"
  191608. #elif defined(__clang__)
  191609. "muls r5, r6\n\t"
  191610. #else
  191611. "mul r5, r6\n\t"
  191612. #endif
  191613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191614. "lsrs r6, r5, #16\n\t"
  191615. #else
  191616. "lsr r6, r5, #16\n\t"
  191617. #endif
  191618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191619. "lsls r5, r5, #16\n\t"
  191620. #else
  191621. "lsl r5, r5, #16\n\t"
  191622. #endif
  191623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191624. "adds r2, r2, r5\n\t"
  191625. #else
  191626. "add r2, r2, r5\n\t"
  191627. #endif
  191628. #ifdef WOLFSSL_KEIL
  191629. "adcs r3, r3, r6\n\t"
  191630. #elif defined(__clang__)
  191631. "adcs r3, r6\n\t"
  191632. #else
  191633. "adc r3, r6\n\t"
  191634. #endif
  191635. #ifdef WOLFSSL_KEIL
  191636. "adcs r4, r4, %[r]\n\t"
  191637. #elif defined(__clang__)
  191638. "adcs r4, %[r]\n\t"
  191639. #else
  191640. "adc r4, %[r]\n\t"
  191641. #endif
  191642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191643. "adds r2, r2, r5\n\t"
  191644. #else
  191645. "add r2, r2, r5\n\t"
  191646. #endif
  191647. #ifdef WOLFSSL_KEIL
  191648. "adcs r3, r3, r6\n\t"
  191649. #elif defined(__clang__)
  191650. "adcs r3, r6\n\t"
  191651. #else
  191652. "adc r3, r6\n\t"
  191653. #endif
  191654. #ifdef WOLFSSL_KEIL
  191655. "adcs r4, r4, %[r]\n\t"
  191656. #elif defined(__clang__)
  191657. "adcs r4, %[r]\n\t"
  191658. #else
  191659. "adc r4, %[r]\n\t"
  191660. #endif
  191661. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191662. "lsrs r5, %[a], #16\n\t"
  191663. #else
  191664. "lsr r5, %[a], #16\n\t"
  191665. #endif
  191666. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191667. "lsrs r6, r7, #16\n\t"
  191668. #else
  191669. "lsr r6, r7, #16\n\t"
  191670. #endif
  191671. #ifdef WOLFSSL_KEIL
  191672. "muls r6, r5, r6\n\t"
  191673. #elif defined(__clang__)
  191674. "muls r6, r5\n\t"
  191675. #else
  191676. "mul r6, r5\n\t"
  191677. #endif
  191678. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191679. "adds r3, r3, r6\n\t"
  191680. #else
  191681. "add r3, 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 r3, r3, r6\n\t"
  191692. #else
  191693. "add r3, r3, r6\n\t"
  191694. #endif
  191695. #ifdef WOLFSSL_KEIL
  191696. "adcs r4, r4, %[r]\n\t"
  191697. #elif defined(__clang__)
  191698. "adcs r4, %[r]\n\t"
  191699. #else
  191700. "adc r4, %[r]\n\t"
  191701. #endif
  191702. "uxth r6, r7\n\t"
  191703. #ifdef WOLFSSL_KEIL
  191704. "muls r5, r6, r5\n\t"
  191705. #elif defined(__clang__)
  191706. "muls r5, r6\n\t"
  191707. #else
  191708. "mul r5, r6\n\t"
  191709. #endif
  191710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191711. "lsrs r6, r5, #16\n\t"
  191712. #else
  191713. "lsr r6, r5, #16\n\t"
  191714. #endif
  191715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191716. "lsls r5, r5, #16\n\t"
  191717. #else
  191718. "lsl r5, r5, #16\n\t"
  191719. #endif
  191720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191721. "adds r2, r2, r5\n\t"
  191722. #else
  191723. "add r2, r2, r5\n\t"
  191724. #endif
  191725. #ifdef WOLFSSL_KEIL
  191726. "adcs r3, r3, r6\n\t"
  191727. #elif defined(__clang__)
  191728. "adcs r3, r6\n\t"
  191729. #else
  191730. "adc r3, r6\n\t"
  191731. #endif
  191732. #ifdef WOLFSSL_KEIL
  191733. "adcs r4, r4, %[r]\n\t"
  191734. #elif defined(__clang__)
  191735. "adcs r4, %[r]\n\t"
  191736. #else
  191737. "adc r4, %[r]\n\t"
  191738. #endif
  191739. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191740. "adds r2, r2, r5\n\t"
  191741. #else
  191742. "add r2, r2, r5\n\t"
  191743. #endif
  191744. #ifdef WOLFSSL_KEIL
  191745. "adcs r3, r3, r6\n\t"
  191746. #elif defined(__clang__)
  191747. "adcs r3, r6\n\t"
  191748. #else
  191749. "adc r3, r6\n\t"
  191750. #endif
  191751. #ifdef WOLFSSL_KEIL
  191752. "adcs r4, r4, %[r]\n\t"
  191753. #elif defined(__clang__)
  191754. "adcs r4, %[r]\n\t"
  191755. #else
  191756. "adc r4, %[r]\n\t"
  191757. #endif
  191758. "# A[14] * A[7]\n\t"
  191759. "mov %[a], r9\n\t"
  191760. "ldr r7, [%[a], #28]\n\t"
  191761. "mov %[a], r12\n\t"
  191762. "uxth r5, %[a]\n\t"
  191763. "uxth r6, r7\n\t"
  191764. #ifdef WOLFSSL_KEIL
  191765. "muls r6, r5, r6\n\t"
  191766. #elif defined(__clang__)
  191767. "muls r6, r5\n\t"
  191768. #else
  191769. "mul r6, r5\n\t"
  191770. #endif
  191771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191772. "adds r2, r2, r6\n\t"
  191773. #else
  191774. "add r2, r2, r6\n\t"
  191775. #endif
  191776. #ifdef WOLFSSL_KEIL
  191777. "adcs r3, r3, %[r]\n\t"
  191778. #elif defined(__clang__)
  191779. "adcs r3, %[r]\n\t"
  191780. #else
  191781. "adc r3, %[r]\n\t"
  191782. #endif
  191783. #ifdef WOLFSSL_KEIL
  191784. "adcs r4, r4, %[r]\n\t"
  191785. #elif defined(__clang__)
  191786. "adcs r4, %[r]\n\t"
  191787. #else
  191788. "adc r4, %[r]\n\t"
  191789. #endif
  191790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191791. "adds r2, r2, r6\n\t"
  191792. #else
  191793. "add r2, r2, r6\n\t"
  191794. #endif
  191795. #ifdef WOLFSSL_KEIL
  191796. "adcs r3, r3, %[r]\n\t"
  191797. #elif defined(__clang__)
  191798. "adcs r3, %[r]\n\t"
  191799. #else
  191800. "adc r3, %[r]\n\t"
  191801. #endif
  191802. #ifdef WOLFSSL_KEIL
  191803. "adcs r4, r4, %[r]\n\t"
  191804. #elif defined(__clang__)
  191805. "adcs r4, %[r]\n\t"
  191806. #else
  191807. "adc r4, %[r]\n\t"
  191808. #endif
  191809. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191810. "lsrs r6, r7, #16\n\t"
  191811. #else
  191812. "lsr r6, r7, #16\n\t"
  191813. #endif
  191814. #ifdef WOLFSSL_KEIL
  191815. "muls r5, r6, r5\n\t"
  191816. #elif defined(__clang__)
  191817. "muls r5, r6\n\t"
  191818. #else
  191819. "mul r5, r6\n\t"
  191820. #endif
  191821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191822. "lsrs r6, r5, #16\n\t"
  191823. #else
  191824. "lsr r6, r5, #16\n\t"
  191825. #endif
  191826. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191827. "lsls r5, r5, #16\n\t"
  191828. #else
  191829. "lsl r5, r5, #16\n\t"
  191830. #endif
  191831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191832. "adds r2, r2, r5\n\t"
  191833. #else
  191834. "add r2, r2, r5\n\t"
  191835. #endif
  191836. #ifdef WOLFSSL_KEIL
  191837. "adcs r3, r3, r6\n\t"
  191838. #elif defined(__clang__)
  191839. "adcs r3, r6\n\t"
  191840. #else
  191841. "adc r3, r6\n\t"
  191842. #endif
  191843. #ifdef WOLFSSL_KEIL
  191844. "adcs r4, r4, %[r]\n\t"
  191845. #elif defined(__clang__)
  191846. "adcs r4, %[r]\n\t"
  191847. #else
  191848. "adc r4, %[r]\n\t"
  191849. #endif
  191850. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191851. "adds r2, r2, r5\n\t"
  191852. #else
  191853. "add r2, r2, r5\n\t"
  191854. #endif
  191855. #ifdef WOLFSSL_KEIL
  191856. "adcs r3, r3, r6\n\t"
  191857. #elif defined(__clang__)
  191858. "adcs r3, r6\n\t"
  191859. #else
  191860. "adc r3, r6\n\t"
  191861. #endif
  191862. #ifdef WOLFSSL_KEIL
  191863. "adcs r4, r4, %[r]\n\t"
  191864. #elif defined(__clang__)
  191865. "adcs r4, %[r]\n\t"
  191866. #else
  191867. "adc r4, %[r]\n\t"
  191868. #endif
  191869. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191870. "lsrs r5, %[a], #16\n\t"
  191871. #else
  191872. "lsr r5, %[a], #16\n\t"
  191873. #endif
  191874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191875. "lsrs r6, r7, #16\n\t"
  191876. #else
  191877. "lsr r6, r7, #16\n\t"
  191878. #endif
  191879. #ifdef WOLFSSL_KEIL
  191880. "muls r6, r5, r6\n\t"
  191881. #elif defined(__clang__)
  191882. "muls r6, r5\n\t"
  191883. #else
  191884. "mul r6, r5\n\t"
  191885. #endif
  191886. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191887. "adds r3, r3, r6\n\t"
  191888. #else
  191889. "add r3, 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 r3, r3, r6\n\t"
  191900. #else
  191901. "add r3, r3, r6\n\t"
  191902. #endif
  191903. #ifdef WOLFSSL_KEIL
  191904. "adcs r4, r4, %[r]\n\t"
  191905. #elif defined(__clang__)
  191906. "adcs r4, %[r]\n\t"
  191907. #else
  191908. "adc r4, %[r]\n\t"
  191909. #endif
  191910. "uxth r6, r7\n\t"
  191911. #ifdef WOLFSSL_KEIL
  191912. "muls r5, r6, r5\n\t"
  191913. #elif defined(__clang__)
  191914. "muls r5, r6\n\t"
  191915. #else
  191916. "mul r5, r6\n\t"
  191917. #endif
  191918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191919. "lsrs r6, r5, #16\n\t"
  191920. #else
  191921. "lsr r6, r5, #16\n\t"
  191922. #endif
  191923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191924. "lsls r5, r5, #16\n\t"
  191925. #else
  191926. "lsl r5, r5, #16\n\t"
  191927. #endif
  191928. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191929. "adds r2, r2, r5\n\t"
  191930. #else
  191931. "add r2, r2, r5\n\t"
  191932. #endif
  191933. #ifdef WOLFSSL_KEIL
  191934. "adcs r3, r3, r6\n\t"
  191935. #elif defined(__clang__)
  191936. "adcs r3, r6\n\t"
  191937. #else
  191938. "adc r3, r6\n\t"
  191939. #endif
  191940. #ifdef WOLFSSL_KEIL
  191941. "adcs r4, r4, %[r]\n\t"
  191942. #elif defined(__clang__)
  191943. "adcs r4, %[r]\n\t"
  191944. #else
  191945. "adc r4, %[r]\n\t"
  191946. #endif
  191947. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191948. "adds r2, r2, r5\n\t"
  191949. #else
  191950. "add r2, r2, r5\n\t"
  191951. #endif
  191952. #ifdef WOLFSSL_KEIL
  191953. "adcs r3, r3, r6\n\t"
  191954. #elif defined(__clang__)
  191955. "adcs r3, r6\n\t"
  191956. #else
  191957. "adc r3, r6\n\t"
  191958. #endif
  191959. #ifdef WOLFSSL_KEIL
  191960. "adcs r4, r4, %[r]\n\t"
  191961. #elif defined(__clang__)
  191962. "adcs r4, %[r]\n\t"
  191963. #else
  191964. "adc r4, %[r]\n\t"
  191965. #endif
  191966. "# A[15] * A[6]\n\t"
  191967. "mov %[a], r9\n\t"
  191968. "ldr r7, [%[a], #24]\n\t"
  191969. "mov %[a], lr\n\t"
  191970. "uxth r5, %[a]\n\t"
  191971. "uxth r6, r7\n\t"
  191972. #ifdef WOLFSSL_KEIL
  191973. "muls r6, r5, r6\n\t"
  191974. #elif defined(__clang__)
  191975. "muls r6, r5\n\t"
  191976. #else
  191977. "mul r6, r5\n\t"
  191978. #endif
  191979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191980. "adds r2, r2, r6\n\t"
  191981. #else
  191982. "add r2, r2, r6\n\t"
  191983. #endif
  191984. #ifdef WOLFSSL_KEIL
  191985. "adcs r3, r3, %[r]\n\t"
  191986. #elif defined(__clang__)
  191987. "adcs r3, %[r]\n\t"
  191988. #else
  191989. "adc r3, %[r]\n\t"
  191990. #endif
  191991. #ifdef WOLFSSL_KEIL
  191992. "adcs r4, r4, %[r]\n\t"
  191993. #elif defined(__clang__)
  191994. "adcs r4, %[r]\n\t"
  191995. #else
  191996. "adc r4, %[r]\n\t"
  191997. #endif
  191998. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  191999. "adds r2, r2, r6\n\t"
  192000. #else
  192001. "add r2, r2, r6\n\t"
  192002. #endif
  192003. #ifdef WOLFSSL_KEIL
  192004. "adcs r3, r3, %[r]\n\t"
  192005. #elif defined(__clang__)
  192006. "adcs r3, %[r]\n\t"
  192007. #else
  192008. "adc r3, %[r]\n\t"
  192009. #endif
  192010. #ifdef WOLFSSL_KEIL
  192011. "adcs r4, r4, %[r]\n\t"
  192012. #elif defined(__clang__)
  192013. "adcs r4, %[r]\n\t"
  192014. #else
  192015. "adc r4, %[r]\n\t"
  192016. #endif
  192017. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192018. "lsrs r6, r7, #16\n\t"
  192019. #else
  192020. "lsr r6, r7, #16\n\t"
  192021. #endif
  192022. #ifdef WOLFSSL_KEIL
  192023. "muls r5, r6, r5\n\t"
  192024. #elif defined(__clang__)
  192025. "muls r5, r6\n\t"
  192026. #else
  192027. "mul r5, r6\n\t"
  192028. #endif
  192029. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192030. "lsrs r6, r5, #16\n\t"
  192031. #else
  192032. "lsr r6, r5, #16\n\t"
  192033. #endif
  192034. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192035. "lsls r5, r5, #16\n\t"
  192036. #else
  192037. "lsl r5, r5, #16\n\t"
  192038. #endif
  192039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192040. "adds r2, r2, r5\n\t"
  192041. #else
  192042. "add r2, r2, r5\n\t"
  192043. #endif
  192044. #ifdef WOLFSSL_KEIL
  192045. "adcs r3, r3, r6\n\t"
  192046. #elif defined(__clang__)
  192047. "adcs r3, r6\n\t"
  192048. #else
  192049. "adc r3, r6\n\t"
  192050. #endif
  192051. #ifdef WOLFSSL_KEIL
  192052. "adcs r4, r4, %[r]\n\t"
  192053. #elif defined(__clang__)
  192054. "adcs r4, %[r]\n\t"
  192055. #else
  192056. "adc r4, %[r]\n\t"
  192057. #endif
  192058. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192059. "adds r2, r2, r5\n\t"
  192060. #else
  192061. "add r2, r2, r5\n\t"
  192062. #endif
  192063. #ifdef WOLFSSL_KEIL
  192064. "adcs r3, r3, r6\n\t"
  192065. #elif defined(__clang__)
  192066. "adcs r3, r6\n\t"
  192067. #else
  192068. "adc r3, r6\n\t"
  192069. #endif
  192070. #ifdef WOLFSSL_KEIL
  192071. "adcs r4, r4, %[r]\n\t"
  192072. #elif defined(__clang__)
  192073. "adcs r4, %[r]\n\t"
  192074. #else
  192075. "adc r4, %[r]\n\t"
  192076. #endif
  192077. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192078. "lsrs r5, %[a], #16\n\t"
  192079. #else
  192080. "lsr r5, %[a], #16\n\t"
  192081. #endif
  192082. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192083. "lsrs r6, r7, #16\n\t"
  192084. #else
  192085. "lsr r6, r7, #16\n\t"
  192086. #endif
  192087. #ifdef WOLFSSL_KEIL
  192088. "muls r6, r5, r6\n\t"
  192089. #elif defined(__clang__)
  192090. "muls r6, r5\n\t"
  192091. #else
  192092. "mul r6, r5\n\t"
  192093. #endif
  192094. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192095. "adds r3, r3, r6\n\t"
  192096. #else
  192097. "add r3, 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 r3, r3, r6\n\t"
  192108. #else
  192109. "add r3, r3, r6\n\t"
  192110. #endif
  192111. #ifdef WOLFSSL_KEIL
  192112. "adcs r4, r4, %[r]\n\t"
  192113. #elif defined(__clang__)
  192114. "adcs r4, %[r]\n\t"
  192115. #else
  192116. "adc r4, %[r]\n\t"
  192117. #endif
  192118. "uxth r6, r7\n\t"
  192119. #ifdef WOLFSSL_KEIL
  192120. "muls r5, r6, r5\n\t"
  192121. #elif defined(__clang__)
  192122. "muls r5, r6\n\t"
  192123. #else
  192124. "mul r5, r6\n\t"
  192125. #endif
  192126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192127. "lsrs r6, r5, #16\n\t"
  192128. #else
  192129. "lsr r6, r5, #16\n\t"
  192130. #endif
  192131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192132. "lsls r5, r5, #16\n\t"
  192133. #else
  192134. "lsl r5, r5, #16\n\t"
  192135. #endif
  192136. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192137. "adds r2, r2, r5\n\t"
  192138. #else
  192139. "add r2, r2, r5\n\t"
  192140. #endif
  192141. #ifdef WOLFSSL_KEIL
  192142. "adcs r3, r3, r6\n\t"
  192143. #elif defined(__clang__)
  192144. "adcs r3, r6\n\t"
  192145. #else
  192146. "adc r3, r6\n\t"
  192147. #endif
  192148. #ifdef WOLFSSL_KEIL
  192149. "adcs r4, r4, %[r]\n\t"
  192150. #elif defined(__clang__)
  192151. "adcs r4, %[r]\n\t"
  192152. #else
  192153. "adc r4, %[r]\n\t"
  192154. #endif
  192155. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192156. "adds r2, r2, r5\n\t"
  192157. #else
  192158. "add r2, r2, r5\n\t"
  192159. #endif
  192160. #ifdef WOLFSSL_KEIL
  192161. "adcs r3, r3, r6\n\t"
  192162. #elif defined(__clang__)
  192163. "adcs r3, r6\n\t"
  192164. #else
  192165. "adc r3, r6\n\t"
  192166. #endif
  192167. #ifdef WOLFSSL_KEIL
  192168. "adcs r4, r4, %[r]\n\t"
  192169. #elif defined(__clang__)
  192170. "adcs r4, %[r]\n\t"
  192171. #else
  192172. "adc r4, %[r]\n\t"
  192173. #endif
  192174. "mov %[r], r8\n\t"
  192175. "str r2, [%[r], #84]\n\t"
  192176. "movs %[r], #0\n\t"
  192177. "# A[15] * A[7]\n\t"
  192178. "movs r2, #0\n\t"
  192179. "mov %[a], r9\n\t"
  192180. "ldr r7, [%[a], #28]\n\t"
  192181. "mov %[a], lr\n\t"
  192182. "uxth r5, %[a]\n\t"
  192183. "uxth r6, r7\n\t"
  192184. #ifdef WOLFSSL_KEIL
  192185. "muls r6, r5, r6\n\t"
  192186. #elif defined(__clang__)
  192187. "muls r6, r5\n\t"
  192188. #else
  192189. "mul r6, r5\n\t"
  192190. #endif
  192191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192192. "adds r3, r3, r6\n\t"
  192193. #else
  192194. "add r3, r3, r6\n\t"
  192195. #endif
  192196. #ifdef WOLFSSL_KEIL
  192197. "adcs r4, r4, %[r]\n\t"
  192198. #elif defined(__clang__)
  192199. "adcs r4, %[r]\n\t"
  192200. #else
  192201. "adc r4, %[r]\n\t"
  192202. #endif
  192203. #ifdef WOLFSSL_KEIL
  192204. "adcs r2, r2, %[r]\n\t"
  192205. #elif defined(__clang__)
  192206. "adcs r2, %[r]\n\t"
  192207. #else
  192208. "adc r2, %[r]\n\t"
  192209. #endif
  192210. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192211. "adds r3, r3, r6\n\t"
  192212. #else
  192213. "add r3, r3, r6\n\t"
  192214. #endif
  192215. #ifdef WOLFSSL_KEIL
  192216. "adcs r4, r4, %[r]\n\t"
  192217. #elif defined(__clang__)
  192218. "adcs r4, %[r]\n\t"
  192219. #else
  192220. "adc r4, %[r]\n\t"
  192221. #endif
  192222. #ifdef WOLFSSL_KEIL
  192223. "adcs r2, r2, %[r]\n\t"
  192224. #elif defined(__clang__)
  192225. "adcs r2, %[r]\n\t"
  192226. #else
  192227. "adc r2, %[r]\n\t"
  192228. #endif
  192229. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192230. "lsrs r6, r7, #16\n\t"
  192231. #else
  192232. "lsr r6, r7, #16\n\t"
  192233. #endif
  192234. #ifdef WOLFSSL_KEIL
  192235. "muls r5, r6, r5\n\t"
  192236. #elif defined(__clang__)
  192237. "muls r5, r6\n\t"
  192238. #else
  192239. "mul r5, r6\n\t"
  192240. #endif
  192241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192242. "lsrs r6, r5, #16\n\t"
  192243. #else
  192244. "lsr r6, r5, #16\n\t"
  192245. #endif
  192246. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192247. "lsls r5, r5, #16\n\t"
  192248. #else
  192249. "lsl r5, r5, #16\n\t"
  192250. #endif
  192251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192252. "adds r3, r3, r5\n\t"
  192253. #else
  192254. "add r3, r3, r5\n\t"
  192255. #endif
  192256. #ifdef WOLFSSL_KEIL
  192257. "adcs r4, r4, r6\n\t"
  192258. #elif defined(__clang__)
  192259. "adcs r4, r6\n\t"
  192260. #else
  192261. "adc r4, r6\n\t"
  192262. #endif
  192263. #ifdef WOLFSSL_KEIL
  192264. "adcs r2, r2, %[r]\n\t"
  192265. #elif defined(__clang__)
  192266. "adcs r2, %[r]\n\t"
  192267. #else
  192268. "adc r2, %[r]\n\t"
  192269. #endif
  192270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192271. "adds r3, r3, r5\n\t"
  192272. #else
  192273. "add r3, r3, r5\n\t"
  192274. #endif
  192275. #ifdef WOLFSSL_KEIL
  192276. "adcs r4, r4, r6\n\t"
  192277. #elif defined(__clang__)
  192278. "adcs r4, r6\n\t"
  192279. #else
  192280. "adc r4, r6\n\t"
  192281. #endif
  192282. #ifdef WOLFSSL_KEIL
  192283. "adcs r2, r2, %[r]\n\t"
  192284. #elif defined(__clang__)
  192285. "adcs r2, %[r]\n\t"
  192286. #else
  192287. "adc r2, %[r]\n\t"
  192288. #endif
  192289. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192290. "lsrs r5, %[a], #16\n\t"
  192291. #else
  192292. "lsr r5, %[a], #16\n\t"
  192293. #endif
  192294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192295. "lsrs r6, r7, #16\n\t"
  192296. #else
  192297. "lsr r6, r7, #16\n\t"
  192298. #endif
  192299. #ifdef WOLFSSL_KEIL
  192300. "muls r6, r5, r6\n\t"
  192301. #elif defined(__clang__)
  192302. "muls r6, r5\n\t"
  192303. #else
  192304. "mul r6, r5\n\t"
  192305. #endif
  192306. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192307. "adds r4, r4, r6\n\t"
  192308. #else
  192309. "add r4, r4, r6\n\t"
  192310. #endif
  192311. #ifdef WOLFSSL_KEIL
  192312. "adcs r2, r2, %[r]\n\t"
  192313. #elif defined(__clang__)
  192314. "adcs r2, %[r]\n\t"
  192315. #else
  192316. "adc r2, %[r]\n\t"
  192317. #endif
  192318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192319. "adds r4, r4, r6\n\t"
  192320. #else
  192321. "add r4, r4, r6\n\t"
  192322. #endif
  192323. #ifdef WOLFSSL_KEIL
  192324. "adcs r2, r2, %[r]\n\t"
  192325. #elif defined(__clang__)
  192326. "adcs r2, %[r]\n\t"
  192327. #else
  192328. "adc r2, %[r]\n\t"
  192329. #endif
  192330. "uxth r6, r7\n\t"
  192331. #ifdef WOLFSSL_KEIL
  192332. "muls r5, r6, r5\n\t"
  192333. #elif defined(__clang__)
  192334. "muls r5, r6\n\t"
  192335. #else
  192336. "mul r5, r6\n\t"
  192337. #endif
  192338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192339. "lsrs r6, r5, #16\n\t"
  192340. #else
  192341. "lsr r6, r5, #16\n\t"
  192342. #endif
  192343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192344. "lsls r5, r5, #16\n\t"
  192345. #else
  192346. "lsl r5, r5, #16\n\t"
  192347. #endif
  192348. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192349. "adds r3, r3, r5\n\t"
  192350. #else
  192351. "add r3, r3, r5\n\t"
  192352. #endif
  192353. #ifdef WOLFSSL_KEIL
  192354. "adcs r4, r4, r6\n\t"
  192355. #elif defined(__clang__)
  192356. "adcs r4, r6\n\t"
  192357. #else
  192358. "adc r4, r6\n\t"
  192359. #endif
  192360. #ifdef WOLFSSL_KEIL
  192361. "adcs r2, r2, %[r]\n\t"
  192362. #elif defined(__clang__)
  192363. "adcs r2, %[r]\n\t"
  192364. #else
  192365. "adc r2, %[r]\n\t"
  192366. #endif
  192367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192368. "adds r3, r3, r5\n\t"
  192369. #else
  192370. "add r3, r3, r5\n\t"
  192371. #endif
  192372. #ifdef WOLFSSL_KEIL
  192373. "adcs r4, r4, r6\n\t"
  192374. #elif defined(__clang__)
  192375. "adcs r4, r6\n\t"
  192376. #else
  192377. "adc r4, r6\n\t"
  192378. #endif
  192379. #ifdef WOLFSSL_KEIL
  192380. "adcs r2, r2, %[r]\n\t"
  192381. #elif defined(__clang__)
  192382. "adcs r2, %[r]\n\t"
  192383. #else
  192384. "adc r2, %[r]\n\t"
  192385. #endif
  192386. "# A[14] * A[8]\n\t"
  192387. "mov %[a], r9\n\t"
  192388. "ldr r7, [%[a], #32]\n\t"
  192389. "mov %[a], r12\n\t"
  192390. "uxth r5, %[a]\n\t"
  192391. "uxth r6, r7\n\t"
  192392. #ifdef WOLFSSL_KEIL
  192393. "muls r6, r5, r6\n\t"
  192394. #elif defined(__clang__)
  192395. "muls r6, r5\n\t"
  192396. #else
  192397. "mul r6, r5\n\t"
  192398. #endif
  192399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192400. "adds r3, r3, r6\n\t"
  192401. #else
  192402. "add r3, r3, r6\n\t"
  192403. #endif
  192404. #ifdef WOLFSSL_KEIL
  192405. "adcs r4, r4, %[r]\n\t"
  192406. #elif defined(__clang__)
  192407. "adcs r4, %[r]\n\t"
  192408. #else
  192409. "adc r4, %[r]\n\t"
  192410. #endif
  192411. #ifdef WOLFSSL_KEIL
  192412. "adcs r2, r2, %[r]\n\t"
  192413. #elif defined(__clang__)
  192414. "adcs r2, %[r]\n\t"
  192415. #else
  192416. "adc r2, %[r]\n\t"
  192417. #endif
  192418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192419. "adds r3, r3, r6\n\t"
  192420. #else
  192421. "add r3, r3, r6\n\t"
  192422. #endif
  192423. #ifdef WOLFSSL_KEIL
  192424. "adcs r4, r4, %[r]\n\t"
  192425. #elif defined(__clang__)
  192426. "adcs r4, %[r]\n\t"
  192427. #else
  192428. "adc r4, %[r]\n\t"
  192429. #endif
  192430. #ifdef WOLFSSL_KEIL
  192431. "adcs r2, r2, %[r]\n\t"
  192432. #elif defined(__clang__)
  192433. "adcs r2, %[r]\n\t"
  192434. #else
  192435. "adc r2, %[r]\n\t"
  192436. #endif
  192437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192438. "lsrs r6, r7, #16\n\t"
  192439. #else
  192440. "lsr r6, r7, #16\n\t"
  192441. #endif
  192442. #ifdef WOLFSSL_KEIL
  192443. "muls r5, r6, r5\n\t"
  192444. #elif defined(__clang__)
  192445. "muls r5, r6\n\t"
  192446. #else
  192447. "mul r5, r6\n\t"
  192448. #endif
  192449. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192450. "lsrs r6, r5, #16\n\t"
  192451. #else
  192452. "lsr r6, r5, #16\n\t"
  192453. #endif
  192454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192455. "lsls r5, r5, #16\n\t"
  192456. #else
  192457. "lsl r5, r5, #16\n\t"
  192458. #endif
  192459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192460. "adds r3, r3, r5\n\t"
  192461. #else
  192462. "add r3, r3, r5\n\t"
  192463. #endif
  192464. #ifdef WOLFSSL_KEIL
  192465. "adcs r4, r4, r6\n\t"
  192466. #elif defined(__clang__)
  192467. "adcs r4, r6\n\t"
  192468. #else
  192469. "adc r4, r6\n\t"
  192470. #endif
  192471. #ifdef WOLFSSL_KEIL
  192472. "adcs r2, r2, %[r]\n\t"
  192473. #elif defined(__clang__)
  192474. "adcs r2, %[r]\n\t"
  192475. #else
  192476. "adc r2, %[r]\n\t"
  192477. #endif
  192478. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192479. "adds r3, r3, r5\n\t"
  192480. #else
  192481. "add r3, r3, r5\n\t"
  192482. #endif
  192483. #ifdef WOLFSSL_KEIL
  192484. "adcs r4, r4, r6\n\t"
  192485. #elif defined(__clang__)
  192486. "adcs r4, r6\n\t"
  192487. #else
  192488. "adc r4, r6\n\t"
  192489. #endif
  192490. #ifdef WOLFSSL_KEIL
  192491. "adcs r2, r2, %[r]\n\t"
  192492. #elif defined(__clang__)
  192493. "adcs r2, %[r]\n\t"
  192494. #else
  192495. "adc r2, %[r]\n\t"
  192496. #endif
  192497. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192498. "lsrs r5, %[a], #16\n\t"
  192499. #else
  192500. "lsr r5, %[a], #16\n\t"
  192501. #endif
  192502. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192503. "lsrs r6, r7, #16\n\t"
  192504. #else
  192505. "lsr r6, r7, #16\n\t"
  192506. #endif
  192507. #ifdef WOLFSSL_KEIL
  192508. "muls r6, r5, r6\n\t"
  192509. #elif defined(__clang__)
  192510. "muls r6, r5\n\t"
  192511. #else
  192512. "mul r6, r5\n\t"
  192513. #endif
  192514. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192515. "adds r4, r4, r6\n\t"
  192516. #else
  192517. "add r4, r4, r6\n\t"
  192518. #endif
  192519. #ifdef WOLFSSL_KEIL
  192520. "adcs r2, r2, %[r]\n\t"
  192521. #elif defined(__clang__)
  192522. "adcs r2, %[r]\n\t"
  192523. #else
  192524. "adc r2, %[r]\n\t"
  192525. #endif
  192526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192527. "adds r4, r4, r6\n\t"
  192528. #else
  192529. "add r4, r4, r6\n\t"
  192530. #endif
  192531. #ifdef WOLFSSL_KEIL
  192532. "adcs r2, r2, %[r]\n\t"
  192533. #elif defined(__clang__)
  192534. "adcs r2, %[r]\n\t"
  192535. #else
  192536. "adc r2, %[r]\n\t"
  192537. #endif
  192538. "uxth r6, r7\n\t"
  192539. #ifdef WOLFSSL_KEIL
  192540. "muls r5, r6, r5\n\t"
  192541. #elif defined(__clang__)
  192542. "muls r5, r6\n\t"
  192543. #else
  192544. "mul r5, r6\n\t"
  192545. #endif
  192546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192547. "lsrs r6, r5, #16\n\t"
  192548. #else
  192549. "lsr r6, r5, #16\n\t"
  192550. #endif
  192551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192552. "lsls r5, r5, #16\n\t"
  192553. #else
  192554. "lsl r5, r5, #16\n\t"
  192555. #endif
  192556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192557. "adds r3, r3, r5\n\t"
  192558. #else
  192559. "add r3, r3, r5\n\t"
  192560. #endif
  192561. #ifdef WOLFSSL_KEIL
  192562. "adcs r4, r4, r6\n\t"
  192563. #elif defined(__clang__)
  192564. "adcs r4, r6\n\t"
  192565. #else
  192566. "adc r4, r6\n\t"
  192567. #endif
  192568. #ifdef WOLFSSL_KEIL
  192569. "adcs r2, r2, %[r]\n\t"
  192570. #elif defined(__clang__)
  192571. "adcs r2, %[r]\n\t"
  192572. #else
  192573. "adc r2, %[r]\n\t"
  192574. #endif
  192575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192576. "adds r3, r3, r5\n\t"
  192577. #else
  192578. "add r3, r3, r5\n\t"
  192579. #endif
  192580. #ifdef WOLFSSL_KEIL
  192581. "adcs r4, r4, r6\n\t"
  192582. #elif defined(__clang__)
  192583. "adcs r4, r6\n\t"
  192584. #else
  192585. "adc r4, r6\n\t"
  192586. #endif
  192587. #ifdef WOLFSSL_KEIL
  192588. "adcs r2, r2, %[r]\n\t"
  192589. #elif defined(__clang__)
  192590. "adcs r2, %[r]\n\t"
  192591. #else
  192592. "adc r2, %[r]\n\t"
  192593. #endif
  192594. "# A[13] * A[9]\n\t"
  192595. "mov %[a], r9\n\t"
  192596. "ldr r7, [%[a], #36]\n\t"
  192597. "mov %[a], r11\n\t"
  192598. "uxth r5, %[a]\n\t"
  192599. "uxth r6, r7\n\t"
  192600. #ifdef WOLFSSL_KEIL
  192601. "muls r6, r5, r6\n\t"
  192602. #elif defined(__clang__)
  192603. "muls r6, r5\n\t"
  192604. #else
  192605. "mul r6, r5\n\t"
  192606. #endif
  192607. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192608. "adds r3, r3, r6\n\t"
  192609. #else
  192610. "add r3, r3, r6\n\t"
  192611. #endif
  192612. #ifdef WOLFSSL_KEIL
  192613. "adcs r4, r4, %[r]\n\t"
  192614. #elif defined(__clang__)
  192615. "adcs r4, %[r]\n\t"
  192616. #else
  192617. "adc r4, %[r]\n\t"
  192618. #endif
  192619. #ifdef WOLFSSL_KEIL
  192620. "adcs r2, r2, %[r]\n\t"
  192621. #elif defined(__clang__)
  192622. "adcs r2, %[r]\n\t"
  192623. #else
  192624. "adc r2, %[r]\n\t"
  192625. #endif
  192626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192627. "adds r3, r3, r6\n\t"
  192628. #else
  192629. "add r3, r3, r6\n\t"
  192630. #endif
  192631. #ifdef WOLFSSL_KEIL
  192632. "adcs r4, r4, %[r]\n\t"
  192633. #elif defined(__clang__)
  192634. "adcs r4, %[r]\n\t"
  192635. #else
  192636. "adc r4, %[r]\n\t"
  192637. #endif
  192638. #ifdef WOLFSSL_KEIL
  192639. "adcs r2, r2, %[r]\n\t"
  192640. #elif defined(__clang__)
  192641. "adcs r2, %[r]\n\t"
  192642. #else
  192643. "adc r2, %[r]\n\t"
  192644. #endif
  192645. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192646. "lsrs r6, r7, #16\n\t"
  192647. #else
  192648. "lsr r6, r7, #16\n\t"
  192649. #endif
  192650. #ifdef WOLFSSL_KEIL
  192651. "muls r5, r6, r5\n\t"
  192652. #elif defined(__clang__)
  192653. "muls r5, r6\n\t"
  192654. #else
  192655. "mul r5, r6\n\t"
  192656. #endif
  192657. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192658. "lsrs r6, r5, #16\n\t"
  192659. #else
  192660. "lsr r6, r5, #16\n\t"
  192661. #endif
  192662. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192663. "lsls r5, r5, #16\n\t"
  192664. #else
  192665. "lsl r5, r5, #16\n\t"
  192666. #endif
  192667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192668. "adds r3, r3, r5\n\t"
  192669. #else
  192670. "add r3, r3, r5\n\t"
  192671. #endif
  192672. #ifdef WOLFSSL_KEIL
  192673. "adcs r4, r4, r6\n\t"
  192674. #elif defined(__clang__)
  192675. "adcs r4, r6\n\t"
  192676. #else
  192677. "adc r4, r6\n\t"
  192678. #endif
  192679. #ifdef WOLFSSL_KEIL
  192680. "adcs r2, r2, %[r]\n\t"
  192681. #elif defined(__clang__)
  192682. "adcs r2, %[r]\n\t"
  192683. #else
  192684. "adc r2, %[r]\n\t"
  192685. #endif
  192686. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192687. "adds r3, r3, r5\n\t"
  192688. #else
  192689. "add r3, r3, r5\n\t"
  192690. #endif
  192691. #ifdef WOLFSSL_KEIL
  192692. "adcs r4, r4, r6\n\t"
  192693. #elif defined(__clang__)
  192694. "adcs r4, r6\n\t"
  192695. #else
  192696. "adc r4, r6\n\t"
  192697. #endif
  192698. #ifdef WOLFSSL_KEIL
  192699. "adcs r2, r2, %[r]\n\t"
  192700. #elif defined(__clang__)
  192701. "adcs r2, %[r]\n\t"
  192702. #else
  192703. "adc r2, %[r]\n\t"
  192704. #endif
  192705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192706. "lsrs r5, %[a], #16\n\t"
  192707. #else
  192708. "lsr r5, %[a], #16\n\t"
  192709. #endif
  192710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192711. "lsrs r6, r7, #16\n\t"
  192712. #else
  192713. "lsr r6, r7, #16\n\t"
  192714. #endif
  192715. #ifdef WOLFSSL_KEIL
  192716. "muls r6, r5, r6\n\t"
  192717. #elif defined(__clang__)
  192718. "muls r6, r5\n\t"
  192719. #else
  192720. "mul r6, r5\n\t"
  192721. #endif
  192722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192723. "adds r4, r4, r6\n\t"
  192724. #else
  192725. "add r4, 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 r4, r4, r6\n\t"
  192736. #else
  192737. "add r4, r4, r6\n\t"
  192738. #endif
  192739. #ifdef WOLFSSL_KEIL
  192740. "adcs r2, r2, %[r]\n\t"
  192741. #elif defined(__clang__)
  192742. "adcs r2, %[r]\n\t"
  192743. #else
  192744. "adc r2, %[r]\n\t"
  192745. #endif
  192746. "uxth r6, r7\n\t"
  192747. #ifdef WOLFSSL_KEIL
  192748. "muls r5, r6, r5\n\t"
  192749. #elif defined(__clang__)
  192750. "muls r5, r6\n\t"
  192751. #else
  192752. "mul r5, r6\n\t"
  192753. #endif
  192754. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192755. "lsrs r6, r5, #16\n\t"
  192756. #else
  192757. "lsr r6, r5, #16\n\t"
  192758. #endif
  192759. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192760. "lsls r5, r5, #16\n\t"
  192761. #else
  192762. "lsl r5, r5, #16\n\t"
  192763. #endif
  192764. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192765. "adds r3, r3, r5\n\t"
  192766. #else
  192767. "add r3, r3, r5\n\t"
  192768. #endif
  192769. #ifdef WOLFSSL_KEIL
  192770. "adcs r4, r4, r6\n\t"
  192771. #elif defined(__clang__)
  192772. "adcs r4, r6\n\t"
  192773. #else
  192774. "adc r4, r6\n\t"
  192775. #endif
  192776. #ifdef WOLFSSL_KEIL
  192777. "adcs r2, r2, %[r]\n\t"
  192778. #elif defined(__clang__)
  192779. "adcs r2, %[r]\n\t"
  192780. #else
  192781. "adc r2, %[r]\n\t"
  192782. #endif
  192783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192784. "adds r3, r3, r5\n\t"
  192785. #else
  192786. "add r3, r3, r5\n\t"
  192787. #endif
  192788. #ifdef WOLFSSL_KEIL
  192789. "adcs r4, r4, r6\n\t"
  192790. #elif defined(__clang__)
  192791. "adcs r4, r6\n\t"
  192792. #else
  192793. "adc r4, r6\n\t"
  192794. #endif
  192795. #ifdef WOLFSSL_KEIL
  192796. "adcs r2, r2, %[r]\n\t"
  192797. #elif defined(__clang__)
  192798. "adcs r2, %[r]\n\t"
  192799. #else
  192800. "adc r2, %[r]\n\t"
  192801. #endif
  192802. "# A[12] * A[10]\n\t"
  192803. "mov %[a], r9\n\t"
  192804. "ldr r7, [%[a], #40]\n\t"
  192805. "mov %[a], r10\n\t"
  192806. "uxth r5, %[a]\n\t"
  192807. "uxth r6, r7\n\t"
  192808. #ifdef WOLFSSL_KEIL
  192809. "muls r6, r5, r6\n\t"
  192810. #elif defined(__clang__)
  192811. "muls r6, r5\n\t"
  192812. #else
  192813. "mul r6, r5\n\t"
  192814. #endif
  192815. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192816. "adds r3, r3, r6\n\t"
  192817. #else
  192818. "add r3, r3, r6\n\t"
  192819. #endif
  192820. #ifdef WOLFSSL_KEIL
  192821. "adcs r4, r4, %[r]\n\t"
  192822. #elif defined(__clang__)
  192823. "adcs r4, %[r]\n\t"
  192824. #else
  192825. "adc r4, %[r]\n\t"
  192826. #endif
  192827. #ifdef WOLFSSL_KEIL
  192828. "adcs r2, r2, %[r]\n\t"
  192829. #elif defined(__clang__)
  192830. "adcs r2, %[r]\n\t"
  192831. #else
  192832. "adc r2, %[r]\n\t"
  192833. #endif
  192834. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192835. "adds r3, r3, r6\n\t"
  192836. #else
  192837. "add r3, r3, r6\n\t"
  192838. #endif
  192839. #ifdef WOLFSSL_KEIL
  192840. "adcs r4, r4, %[r]\n\t"
  192841. #elif defined(__clang__)
  192842. "adcs r4, %[r]\n\t"
  192843. #else
  192844. "adc r4, %[r]\n\t"
  192845. #endif
  192846. #ifdef WOLFSSL_KEIL
  192847. "adcs r2, r2, %[r]\n\t"
  192848. #elif defined(__clang__)
  192849. "adcs r2, %[r]\n\t"
  192850. #else
  192851. "adc r2, %[r]\n\t"
  192852. #endif
  192853. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192854. "lsrs r6, r7, #16\n\t"
  192855. #else
  192856. "lsr r6, r7, #16\n\t"
  192857. #endif
  192858. #ifdef WOLFSSL_KEIL
  192859. "muls r5, r6, r5\n\t"
  192860. #elif defined(__clang__)
  192861. "muls r5, r6\n\t"
  192862. #else
  192863. "mul r5, r6\n\t"
  192864. #endif
  192865. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192866. "lsrs r6, r5, #16\n\t"
  192867. #else
  192868. "lsr r6, r5, #16\n\t"
  192869. #endif
  192870. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192871. "lsls r5, r5, #16\n\t"
  192872. #else
  192873. "lsl r5, r5, #16\n\t"
  192874. #endif
  192875. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192876. "adds r3, r3, r5\n\t"
  192877. #else
  192878. "add r3, r3, r5\n\t"
  192879. #endif
  192880. #ifdef WOLFSSL_KEIL
  192881. "adcs r4, r4, r6\n\t"
  192882. #elif defined(__clang__)
  192883. "adcs r4, r6\n\t"
  192884. #else
  192885. "adc r4, r6\n\t"
  192886. #endif
  192887. #ifdef WOLFSSL_KEIL
  192888. "adcs r2, r2, %[r]\n\t"
  192889. #elif defined(__clang__)
  192890. "adcs r2, %[r]\n\t"
  192891. #else
  192892. "adc r2, %[r]\n\t"
  192893. #endif
  192894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192895. "adds r3, r3, r5\n\t"
  192896. #else
  192897. "add r3, r3, r5\n\t"
  192898. #endif
  192899. #ifdef WOLFSSL_KEIL
  192900. "adcs r4, r4, r6\n\t"
  192901. #elif defined(__clang__)
  192902. "adcs r4, r6\n\t"
  192903. #else
  192904. "adc r4, r6\n\t"
  192905. #endif
  192906. #ifdef WOLFSSL_KEIL
  192907. "adcs r2, r2, %[r]\n\t"
  192908. #elif defined(__clang__)
  192909. "adcs r2, %[r]\n\t"
  192910. #else
  192911. "adc r2, %[r]\n\t"
  192912. #endif
  192913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192914. "lsrs r5, %[a], #16\n\t"
  192915. #else
  192916. "lsr r5, %[a], #16\n\t"
  192917. #endif
  192918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192919. "lsrs r6, r7, #16\n\t"
  192920. #else
  192921. "lsr r6, r7, #16\n\t"
  192922. #endif
  192923. #ifdef WOLFSSL_KEIL
  192924. "muls r6, r5, r6\n\t"
  192925. #elif defined(__clang__)
  192926. "muls r6, r5\n\t"
  192927. #else
  192928. "mul r6, r5\n\t"
  192929. #endif
  192930. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192931. "adds r4, r4, r6\n\t"
  192932. #else
  192933. "add r4, 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 r4, r4, r6\n\t"
  192944. #else
  192945. "add r4, r4, r6\n\t"
  192946. #endif
  192947. #ifdef WOLFSSL_KEIL
  192948. "adcs r2, r2, %[r]\n\t"
  192949. #elif defined(__clang__)
  192950. "adcs r2, %[r]\n\t"
  192951. #else
  192952. "adc r2, %[r]\n\t"
  192953. #endif
  192954. "uxth r6, r7\n\t"
  192955. #ifdef WOLFSSL_KEIL
  192956. "muls r5, r6, r5\n\t"
  192957. #elif defined(__clang__)
  192958. "muls r5, r6\n\t"
  192959. #else
  192960. "mul r5, r6\n\t"
  192961. #endif
  192962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192963. "lsrs r6, r5, #16\n\t"
  192964. #else
  192965. "lsr r6, r5, #16\n\t"
  192966. #endif
  192967. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192968. "lsls r5, r5, #16\n\t"
  192969. #else
  192970. "lsl r5, r5, #16\n\t"
  192971. #endif
  192972. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192973. "adds r3, r3, r5\n\t"
  192974. #else
  192975. "add r3, r3, r5\n\t"
  192976. #endif
  192977. #ifdef WOLFSSL_KEIL
  192978. "adcs r4, r4, r6\n\t"
  192979. #elif defined(__clang__)
  192980. "adcs r4, r6\n\t"
  192981. #else
  192982. "adc r4, r6\n\t"
  192983. #endif
  192984. #ifdef WOLFSSL_KEIL
  192985. "adcs r2, r2, %[r]\n\t"
  192986. #elif defined(__clang__)
  192987. "adcs r2, %[r]\n\t"
  192988. #else
  192989. "adc r2, %[r]\n\t"
  192990. #endif
  192991. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  192992. "adds r3, r3, r5\n\t"
  192993. #else
  192994. "add r3, r3, r5\n\t"
  192995. #endif
  192996. #ifdef WOLFSSL_KEIL
  192997. "adcs r4, r4, r6\n\t"
  192998. #elif defined(__clang__)
  192999. "adcs r4, r6\n\t"
  193000. #else
  193001. "adc r4, r6\n\t"
  193002. #endif
  193003. #ifdef WOLFSSL_KEIL
  193004. "adcs r2, r2, %[r]\n\t"
  193005. #elif defined(__clang__)
  193006. "adcs r2, %[r]\n\t"
  193007. #else
  193008. "adc r2, %[r]\n\t"
  193009. #endif
  193010. "# A[11] * A[11]\n\t"
  193011. "mov %[a], r9\n\t"
  193012. "ldr r7, [%[a], #44]\n\t"
  193013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193014. "lsrs r6, r7, #16\n\t"
  193015. #else
  193016. "lsr r6, r7, #16\n\t"
  193017. #endif
  193018. "uxth r5, r7\n\t"
  193019. #ifdef WOLFSSL_KEIL
  193020. "muls r5, r5, r5\n\t"
  193021. #elif defined(__clang__)
  193022. "muls r5, r5\n\t"
  193023. #else
  193024. "mul r5, r5\n\t"
  193025. #endif
  193026. #ifdef WOLFSSL_KEIL
  193027. "muls r6, r6, r6\n\t"
  193028. #elif defined(__clang__)
  193029. "muls r6, r6\n\t"
  193030. #else
  193031. "mul r6, r6\n\t"
  193032. #endif
  193033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193034. "adds r3, r3, r5\n\t"
  193035. #else
  193036. "add r3, r3, r5\n\t"
  193037. #endif
  193038. #ifdef WOLFSSL_KEIL
  193039. "adcs r4, r4, r6\n\t"
  193040. #elif defined(__clang__)
  193041. "adcs r4, r6\n\t"
  193042. #else
  193043. "adc r4, r6\n\t"
  193044. #endif
  193045. #ifdef WOLFSSL_KEIL
  193046. "adcs r2, r2, %[r]\n\t"
  193047. #elif defined(__clang__)
  193048. "adcs r2, %[r]\n\t"
  193049. #else
  193050. "adc r2, %[r]\n\t"
  193051. #endif
  193052. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193053. "lsrs r6, r7, #16\n\t"
  193054. #else
  193055. "lsr r6, r7, #16\n\t"
  193056. #endif
  193057. "uxth r5, r7\n\t"
  193058. #ifdef WOLFSSL_KEIL
  193059. "muls r5, r6, r5\n\t"
  193060. #elif defined(__clang__)
  193061. "muls r5, r6\n\t"
  193062. #else
  193063. "mul r5, r6\n\t"
  193064. #endif
  193065. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193066. "lsrs r6, r5, #15\n\t"
  193067. #else
  193068. "lsr r6, r5, #15\n\t"
  193069. #endif
  193070. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193071. "lsls r5, r5, #17\n\t"
  193072. #else
  193073. "lsl r5, r5, #17\n\t"
  193074. #endif
  193075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193076. "adds r3, r3, r5\n\t"
  193077. #else
  193078. "add r3, r3, r5\n\t"
  193079. #endif
  193080. #ifdef WOLFSSL_KEIL
  193081. "adcs r4, r4, r6\n\t"
  193082. #elif defined(__clang__)
  193083. "adcs r4, r6\n\t"
  193084. #else
  193085. "adc r4, r6\n\t"
  193086. #endif
  193087. #ifdef WOLFSSL_KEIL
  193088. "adcs r2, r2, %[r]\n\t"
  193089. #elif defined(__clang__)
  193090. "adcs r2, %[r]\n\t"
  193091. #else
  193092. "adc r2, %[r]\n\t"
  193093. #endif
  193094. "mov %[r], r8\n\t"
  193095. "str r3, [%[r], #88]\n\t"
  193096. "movs %[r], #0\n\t"
  193097. "# A[12] * A[11]\n\t"
  193098. "movs r3, #0\n\t"
  193099. "mov %[a], r10\n\t"
  193100. "uxth r5, %[a]\n\t"
  193101. "uxth r6, r7\n\t"
  193102. #ifdef WOLFSSL_KEIL
  193103. "muls r6, r5, r6\n\t"
  193104. #elif defined(__clang__)
  193105. "muls r6, r5\n\t"
  193106. #else
  193107. "mul r6, r5\n\t"
  193108. #endif
  193109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193110. "adds r4, r4, r6\n\t"
  193111. #else
  193112. "add r4, r4, r6\n\t"
  193113. #endif
  193114. #ifdef WOLFSSL_KEIL
  193115. "adcs r2, r2, %[r]\n\t"
  193116. #elif defined(__clang__)
  193117. "adcs r2, %[r]\n\t"
  193118. #else
  193119. "adc r2, %[r]\n\t"
  193120. #endif
  193121. #ifdef WOLFSSL_KEIL
  193122. "adcs r3, r3, %[r]\n\t"
  193123. #elif defined(__clang__)
  193124. "adcs r3, %[r]\n\t"
  193125. #else
  193126. "adc r3, %[r]\n\t"
  193127. #endif
  193128. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193129. "adds r4, r4, r6\n\t"
  193130. #else
  193131. "add r4, r4, r6\n\t"
  193132. #endif
  193133. #ifdef WOLFSSL_KEIL
  193134. "adcs r2, r2, %[r]\n\t"
  193135. #elif defined(__clang__)
  193136. "adcs r2, %[r]\n\t"
  193137. #else
  193138. "adc r2, %[r]\n\t"
  193139. #endif
  193140. #ifdef WOLFSSL_KEIL
  193141. "adcs r3, r3, %[r]\n\t"
  193142. #elif defined(__clang__)
  193143. "adcs r3, %[r]\n\t"
  193144. #else
  193145. "adc r3, %[r]\n\t"
  193146. #endif
  193147. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193148. "lsrs r6, r7, #16\n\t"
  193149. #else
  193150. "lsr r6, r7, #16\n\t"
  193151. #endif
  193152. #ifdef WOLFSSL_KEIL
  193153. "muls r5, r6, r5\n\t"
  193154. #elif defined(__clang__)
  193155. "muls r5, r6\n\t"
  193156. #else
  193157. "mul r5, r6\n\t"
  193158. #endif
  193159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193160. "lsrs r6, r5, #16\n\t"
  193161. #else
  193162. "lsr r6, r5, #16\n\t"
  193163. #endif
  193164. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193165. "lsls r5, r5, #16\n\t"
  193166. #else
  193167. "lsl r5, r5, #16\n\t"
  193168. #endif
  193169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193170. "adds r4, r4, r5\n\t"
  193171. #else
  193172. "add r4, r4, r5\n\t"
  193173. #endif
  193174. #ifdef WOLFSSL_KEIL
  193175. "adcs r2, r2, r6\n\t"
  193176. #elif defined(__clang__)
  193177. "adcs r2, r6\n\t"
  193178. #else
  193179. "adc r2, r6\n\t"
  193180. #endif
  193181. #ifdef WOLFSSL_KEIL
  193182. "adcs r3, r3, %[r]\n\t"
  193183. #elif defined(__clang__)
  193184. "adcs r3, %[r]\n\t"
  193185. #else
  193186. "adc r3, %[r]\n\t"
  193187. #endif
  193188. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193189. "adds r4, r4, r5\n\t"
  193190. #else
  193191. "add r4, r4, r5\n\t"
  193192. #endif
  193193. #ifdef WOLFSSL_KEIL
  193194. "adcs r2, r2, r6\n\t"
  193195. #elif defined(__clang__)
  193196. "adcs r2, r6\n\t"
  193197. #else
  193198. "adc r2, r6\n\t"
  193199. #endif
  193200. #ifdef WOLFSSL_KEIL
  193201. "adcs r3, r3, %[r]\n\t"
  193202. #elif defined(__clang__)
  193203. "adcs r3, %[r]\n\t"
  193204. #else
  193205. "adc r3, %[r]\n\t"
  193206. #endif
  193207. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193208. "lsrs r5, %[a], #16\n\t"
  193209. #else
  193210. "lsr r5, %[a], #16\n\t"
  193211. #endif
  193212. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193213. "lsrs r6, r7, #16\n\t"
  193214. #else
  193215. "lsr r6, r7, #16\n\t"
  193216. #endif
  193217. #ifdef WOLFSSL_KEIL
  193218. "muls r6, r5, r6\n\t"
  193219. #elif defined(__clang__)
  193220. "muls r6, r5\n\t"
  193221. #else
  193222. "mul r6, r5\n\t"
  193223. #endif
  193224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193225. "adds r2, r2, r6\n\t"
  193226. #else
  193227. "add r2, r2, r6\n\t"
  193228. #endif
  193229. #ifdef WOLFSSL_KEIL
  193230. "adcs r3, r3, %[r]\n\t"
  193231. #elif defined(__clang__)
  193232. "adcs r3, %[r]\n\t"
  193233. #else
  193234. "adc r3, %[r]\n\t"
  193235. #endif
  193236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193237. "adds r2, r2, r6\n\t"
  193238. #else
  193239. "add r2, r2, r6\n\t"
  193240. #endif
  193241. #ifdef WOLFSSL_KEIL
  193242. "adcs r3, r3, %[r]\n\t"
  193243. #elif defined(__clang__)
  193244. "adcs r3, %[r]\n\t"
  193245. #else
  193246. "adc r3, %[r]\n\t"
  193247. #endif
  193248. "uxth r6, r7\n\t"
  193249. #ifdef WOLFSSL_KEIL
  193250. "muls r5, r6, r5\n\t"
  193251. #elif defined(__clang__)
  193252. "muls r5, r6\n\t"
  193253. #else
  193254. "mul r5, r6\n\t"
  193255. #endif
  193256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193257. "lsrs r6, r5, #16\n\t"
  193258. #else
  193259. "lsr r6, r5, #16\n\t"
  193260. #endif
  193261. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193262. "lsls r5, r5, #16\n\t"
  193263. #else
  193264. "lsl r5, r5, #16\n\t"
  193265. #endif
  193266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193267. "adds r4, r4, r5\n\t"
  193268. #else
  193269. "add r4, r4, r5\n\t"
  193270. #endif
  193271. #ifdef WOLFSSL_KEIL
  193272. "adcs r2, r2, r6\n\t"
  193273. #elif defined(__clang__)
  193274. "adcs r2, r6\n\t"
  193275. #else
  193276. "adc r2, r6\n\t"
  193277. #endif
  193278. #ifdef WOLFSSL_KEIL
  193279. "adcs r3, r3, %[r]\n\t"
  193280. #elif defined(__clang__)
  193281. "adcs r3, %[r]\n\t"
  193282. #else
  193283. "adc r3, %[r]\n\t"
  193284. #endif
  193285. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193286. "adds r4, r4, r5\n\t"
  193287. #else
  193288. "add r4, r4, r5\n\t"
  193289. #endif
  193290. #ifdef WOLFSSL_KEIL
  193291. "adcs r2, r2, r6\n\t"
  193292. #elif defined(__clang__)
  193293. "adcs r2, r6\n\t"
  193294. #else
  193295. "adc r2, r6\n\t"
  193296. #endif
  193297. #ifdef WOLFSSL_KEIL
  193298. "adcs r3, r3, %[r]\n\t"
  193299. #elif defined(__clang__)
  193300. "adcs r3, %[r]\n\t"
  193301. #else
  193302. "adc r3, %[r]\n\t"
  193303. #endif
  193304. "# A[13] * A[10]\n\t"
  193305. "mov %[a], r9\n\t"
  193306. "ldr r7, [%[a], #40]\n\t"
  193307. "mov %[a], r11\n\t"
  193308. "uxth r5, %[a]\n\t"
  193309. "uxth r6, r7\n\t"
  193310. #ifdef WOLFSSL_KEIL
  193311. "muls r6, r5, r6\n\t"
  193312. #elif defined(__clang__)
  193313. "muls r6, r5\n\t"
  193314. #else
  193315. "mul r6, r5\n\t"
  193316. #endif
  193317. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193318. "adds r4, r4, r6\n\t"
  193319. #else
  193320. "add r4, r4, r6\n\t"
  193321. #endif
  193322. #ifdef WOLFSSL_KEIL
  193323. "adcs r2, r2, %[r]\n\t"
  193324. #elif defined(__clang__)
  193325. "adcs r2, %[r]\n\t"
  193326. #else
  193327. "adc r2, %[r]\n\t"
  193328. #endif
  193329. #ifdef WOLFSSL_KEIL
  193330. "adcs r3, r3, %[r]\n\t"
  193331. #elif defined(__clang__)
  193332. "adcs r3, %[r]\n\t"
  193333. #else
  193334. "adc r3, %[r]\n\t"
  193335. #endif
  193336. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193337. "adds r4, r4, r6\n\t"
  193338. #else
  193339. "add r4, r4, r6\n\t"
  193340. #endif
  193341. #ifdef WOLFSSL_KEIL
  193342. "adcs r2, r2, %[r]\n\t"
  193343. #elif defined(__clang__)
  193344. "adcs r2, %[r]\n\t"
  193345. #else
  193346. "adc r2, %[r]\n\t"
  193347. #endif
  193348. #ifdef WOLFSSL_KEIL
  193349. "adcs r3, r3, %[r]\n\t"
  193350. #elif defined(__clang__)
  193351. "adcs r3, %[r]\n\t"
  193352. #else
  193353. "adc r3, %[r]\n\t"
  193354. #endif
  193355. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193356. "lsrs r6, r7, #16\n\t"
  193357. #else
  193358. "lsr r6, r7, #16\n\t"
  193359. #endif
  193360. #ifdef WOLFSSL_KEIL
  193361. "muls r5, r6, r5\n\t"
  193362. #elif defined(__clang__)
  193363. "muls r5, r6\n\t"
  193364. #else
  193365. "mul r5, r6\n\t"
  193366. #endif
  193367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193368. "lsrs r6, r5, #16\n\t"
  193369. #else
  193370. "lsr r6, r5, #16\n\t"
  193371. #endif
  193372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193373. "lsls r5, r5, #16\n\t"
  193374. #else
  193375. "lsl r5, r5, #16\n\t"
  193376. #endif
  193377. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193378. "adds r4, r4, r5\n\t"
  193379. #else
  193380. "add r4, r4, r5\n\t"
  193381. #endif
  193382. #ifdef WOLFSSL_KEIL
  193383. "adcs r2, r2, r6\n\t"
  193384. #elif defined(__clang__)
  193385. "adcs r2, r6\n\t"
  193386. #else
  193387. "adc r2, r6\n\t"
  193388. #endif
  193389. #ifdef WOLFSSL_KEIL
  193390. "adcs r3, r3, %[r]\n\t"
  193391. #elif defined(__clang__)
  193392. "adcs r3, %[r]\n\t"
  193393. #else
  193394. "adc r3, %[r]\n\t"
  193395. #endif
  193396. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193397. "adds r4, r4, r5\n\t"
  193398. #else
  193399. "add r4, r4, r5\n\t"
  193400. #endif
  193401. #ifdef WOLFSSL_KEIL
  193402. "adcs r2, r2, r6\n\t"
  193403. #elif defined(__clang__)
  193404. "adcs r2, r6\n\t"
  193405. #else
  193406. "adc r2, r6\n\t"
  193407. #endif
  193408. #ifdef WOLFSSL_KEIL
  193409. "adcs r3, r3, %[r]\n\t"
  193410. #elif defined(__clang__)
  193411. "adcs r3, %[r]\n\t"
  193412. #else
  193413. "adc r3, %[r]\n\t"
  193414. #endif
  193415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193416. "lsrs r5, %[a], #16\n\t"
  193417. #else
  193418. "lsr r5, %[a], #16\n\t"
  193419. #endif
  193420. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193421. "lsrs r6, r7, #16\n\t"
  193422. #else
  193423. "lsr r6, r7, #16\n\t"
  193424. #endif
  193425. #ifdef WOLFSSL_KEIL
  193426. "muls r6, r5, r6\n\t"
  193427. #elif defined(__clang__)
  193428. "muls r6, r5\n\t"
  193429. #else
  193430. "mul r6, r5\n\t"
  193431. #endif
  193432. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193433. "adds r2, r2, r6\n\t"
  193434. #else
  193435. "add r2, r2, r6\n\t"
  193436. #endif
  193437. #ifdef WOLFSSL_KEIL
  193438. "adcs r3, r3, %[r]\n\t"
  193439. #elif defined(__clang__)
  193440. "adcs r3, %[r]\n\t"
  193441. #else
  193442. "adc r3, %[r]\n\t"
  193443. #endif
  193444. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193445. "adds r2, r2, r6\n\t"
  193446. #else
  193447. "add r2, r2, r6\n\t"
  193448. #endif
  193449. #ifdef WOLFSSL_KEIL
  193450. "adcs r3, r3, %[r]\n\t"
  193451. #elif defined(__clang__)
  193452. "adcs r3, %[r]\n\t"
  193453. #else
  193454. "adc r3, %[r]\n\t"
  193455. #endif
  193456. "uxth r6, r7\n\t"
  193457. #ifdef WOLFSSL_KEIL
  193458. "muls r5, r6, r5\n\t"
  193459. #elif defined(__clang__)
  193460. "muls r5, r6\n\t"
  193461. #else
  193462. "mul r5, r6\n\t"
  193463. #endif
  193464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193465. "lsrs r6, r5, #16\n\t"
  193466. #else
  193467. "lsr r6, r5, #16\n\t"
  193468. #endif
  193469. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193470. "lsls r5, r5, #16\n\t"
  193471. #else
  193472. "lsl r5, r5, #16\n\t"
  193473. #endif
  193474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193475. "adds r4, r4, r5\n\t"
  193476. #else
  193477. "add r4, r4, r5\n\t"
  193478. #endif
  193479. #ifdef WOLFSSL_KEIL
  193480. "adcs r2, r2, r6\n\t"
  193481. #elif defined(__clang__)
  193482. "adcs r2, r6\n\t"
  193483. #else
  193484. "adc r2, r6\n\t"
  193485. #endif
  193486. #ifdef WOLFSSL_KEIL
  193487. "adcs r3, r3, %[r]\n\t"
  193488. #elif defined(__clang__)
  193489. "adcs r3, %[r]\n\t"
  193490. #else
  193491. "adc r3, %[r]\n\t"
  193492. #endif
  193493. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193494. "adds r4, r4, r5\n\t"
  193495. #else
  193496. "add r4, r4, r5\n\t"
  193497. #endif
  193498. #ifdef WOLFSSL_KEIL
  193499. "adcs r2, r2, r6\n\t"
  193500. #elif defined(__clang__)
  193501. "adcs r2, r6\n\t"
  193502. #else
  193503. "adc r2, r6\n\t"
  193504. #endif
  193505. #ifdef WOLFSSL_KEIL
  193506. "adcs r3, r3, %[r]\n\t"
  193507. #elif defined(__clang__)
  193508. "adcs r3, %[r]\n\t"
  193509. #else
  193510. "adc r3, %[r]\n\t"
  193511. #endif
  193512. "# A[14] * A[9]\n\t"
  193513. "mov %[a], r9\n\t"
  193514. "ldr r7, [%[a], #36]\n\t"
  193515. "mov %[a], r12\n\t"
  193516. "uxth r5, %[a]\n\t"
  193517. "uxth r6, r7\n\t"
  193518. #ifdef WOLFSSL_KEIL
  193519. "muls r6, r5, r6\n\t"
  193520. #elif defined(__clang__)
  193521. "muls r6, r5\n\t"
  193522. #else
  193523. "mul r6, r5\n\t"
  193524. #endif
  193525. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193526. "adds r4, r4, r6\n\t"
  193527. #else
  193528. "add r4, r4, r6\n\t"
  193529. #endif
  193530. #ifdef WOLFSSL_KEIL
  193531. "adcs r2, r2, %[r]\n\t"
  193532. #elif defined(__clang__)
  193533. "adcs r2, %[r]\n\t"
  193534. #else
  193535. "adc r2, %[r]\n\t"
  193536. #endif
  193537. #ifdef WOLFSSL_KEIL
  193538. "adcs r3, r3, %[r]\n\t"
  193539. #elif defined(__clang__)
  193540. "adcs r3, %[r]\n\t"
  193541. #else
  193542. "adc r3, %[r]\n\t"
  193543. #endif
  193544. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193545. "adds r4, r4, r6\n\t"
  193546. #else
  193547. "add r4, r4, r6\n\t"
  193548. #endif
  193549. #ifdef WOLFSSL_KEIL
  193550. "adcs r2, r2, %[r]\n\t"
  193551. #elif defined(__clang__)
  193552. "adcs r2, %[r]\n\t"
  193553. #else
  193554. "adc r2, %[r]\n\t"
  193555. #endif
  193556. #ifdef WOLFSSL_KEIL
  193557. "adcs r3, r3, %[r]\n\t"
  193558. #elif defined(__clang__)
  193559. "adcs r3, %[r]\n\t"
  193560. #else
  193561. "adc r3, %[r]\n\t"
  193562. #endif
  193563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193564. "lsrs r6, r7, #16\n\t"
  193565. #else
  193566. "lsr r6, r7, #16\n\t"
  193567. #endif
  193568. #ifdef WOLFSSL_KEIL
  193569. "muls r5, r6, r5\n\t"
  193570. #elif defined(__clang__)
  193571. "muls r5, r6\n\t"
  193572. #else
  193573. "mul r5, r6\n\t"
  193574. #endif
  193575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193576. "lsrs r6, r5, #16\n\t"
  193577. #else
  193578. "lsr r6, r5, #16\n\t"
  193579. #endif
  193580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193581. "lsls r5, r5, #16\n\t"
  193582. #else
  193583. "lsl r5, r5, #16\n\t"
  193584. #endif
  193585. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193586. "adds r4, r4, r5\n\t"
  193587. #else
  193588. "add r4, r4, r5\n\t"
  193589. #endif
  193590. #ifdef WOLFSSL_KEIL
  193591. "adcs r2, r2, r6\n\t"
  193592. #elif defined(__clang__)
  193593. "adcs r2, r6\n\t"
  193594. #else
  193595. "adc r2, r6\n\t"
  193596. #endif
  193597. #ifdef WOLFSSL_KEIL
  193598. "adcs r3, r3, %[r]\n\t"
  193599. #elif defined(__clang__)
  193600. "adcs r3, %[r]\n\t"
  193601. #else
  193602. "adc r3, %[r]\n\t"
  193603. #endif
  193604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193605. "adds r4, r4, r5\n\t"
  193606. #else
  193607. "add r4, r4, r5\n\t"
  193608. #endif
  193609. #ifdef WOLFSSL_KEIL
  193610. "adcs r2, r2, r6\n\t"
  193611. #elif defined(__clang__)
  193612. "adcs r2, r6\n\t"
  193613. #else
  193614. "adc r2, r6\n\t"
  193615. #endif
  193616. #ifdef WOLFSSL_KEIL
  193617. "adcs r3, r3, %[r]\n\t"
  193618. #elif defined(__clang__)
  193619. "adcs r3, %[r]\n\t"
  193620. #else
  193621. "adc r3, %[r]\n\t"
  193622. #endif
  193623. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193624. "lsrs r5, %[a], #16\n\t"
  193625. #else
  193626. "lsr r5, %[a], #16\n\t"
  193627. #endif
  193628. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193629. "lsrs r6, r7, #16\n\t"
  193630. #else
  193631. "lsr r6, r7, #16\n\t"
  193632. #endif
  193633. #ifdef WOLFSSL_KEIL
  193634. "muls r6, r5, r6\n\t"
  193635. #elif defined(__clang__)
  193636. "muls r6, r5\n\t"
  193637. #else
  193638. "mul r6, r5\n\t"
  193639. #endif
  193640. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193641. "adds r2, r2, r6\n\t"
  193642. #else
  193643. "add r2, 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 r2, r2, r6\n\t"
  193654. #else
  193655. "add r2, r2, r6\n\t"
  193656. #endif
  193657. #ifdef WOLFSSL_KEIL
  193658. "adcs r3, r3, %[r]\n\t"
  193659. #elif defined(__clang__)
  193660. "adcs r3, %[r]\n\t"
  193661. #else
  193662. "adc r3, %[r]\n\t"
  193663. #endif
  193664. "uxth r6, r7\n\t"
  193665. #ifdef WOLFSSL_KEIL
  193666. "muls r5, r6, r5\n\t"
  193667. #elif defined(__clang__)
  193668. "muls r5, r6\n\t"
  193669. #else
  193670. "mul r5, r6\n\t"
  193671. #endif
  193672. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193673. "lsrs r6, r5, #16\n\t"
  193674. #else
  193675. "lsr r6, r5, #16\n\t"
  193676. #endif
  193677. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193678. "lsls r5, r5, #16\n\t"
  193679. #else
  193680. "lsl r5, r5, #16\n\t"
  193681. #endif
  193682. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193683. "adds r4, r4, r5\n\t"
  193684. #else
  193685. "add r4, r4, r5\n\t"
  193686. #endif
  193687. #ifdef WOLFSSL_KEIL
  193688. "adcs r2, r2, r6\n\t"
  193689. #elif defined(__clang__)
  193690. "adcs r2, r6\n\t"
  193691. #else
  193692. "adc r2, r6\n\t"
  193693. #endif
  193694. #ifdef WOLFSSL_KEIL
  193695. "adcs r3, r3, %[r]\n\t"
  193696. #elif defined(__clang__)
  193697. "adcs r3, %[r]\n\t"
  193698. #else
  193699. "adc r3, %[r]\n\t"
  193700. #endif
  193701. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193702. "adds r4, r4, r5\n\t"
  193703. #else
  193704. "add r4, r4, r5\n\t"
  193705. #endif
  193706. #ifdef WOLFSSL_KEIL
  193707. "adcs r2, r2, r6\n\t"
  193708. #elif defined(__clang__)
  193709. "adcs r2, r6\n\t"
  193710. #else
  193711. "adc r2, r6\n\t"
  193712. #endif
  193713. #ifdef WOLFSSL_KEIL
  193714. "adcs r3, r3, %[r]\n\t"
  193715. #elif defined(__clang__)
  193716. "adcs r3, %[r]\n\t"
  193717. #else
  193718. "adc r3, %[r]\n\t"
  193719. #endif
  193720. "# A[15] * A[8]\n\t"
  193721. "mov %[a], r9\n\t"
  193722. "ldr r7, [%[a], #32]\n\t"
  193723. "mov %[a], lr\n\t"
  193724. "uxth r5, %[a]\n\t"
  193725. "uxth r6, r7\n\t"
  193726. #ifdef WOLFSSL_KEIL
  193727. "muls r6, r5, r6\n\t"
  193728. #elif defined(__clang__)
  193729. "muls r6, r5\n\t"
  193730. #else
  193731. "mul r6, r5\n\t"
  193732. #endif
  193733. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193734. "adds r4, r4, r6\n\t"
  193735. #else
  193736. "add r4, r4, r6\n\t"
  193737. #endif
  193738. #ifdef WOLFSSL_KEIL
  193739. "adcs r2, r2, %[r]\n\t"
  193740. #elif defined(__clang__)
  193741. "adcs r2, %[r]\n\t"
  193742. #else
  193743. "adc r2, %[r]\n\t"
  193744. #endif
  193745. #ifdef WOLFSSL_KEIL
  193746. "adcs r3, r3, %[r]\n\t"
  193747. #elif defined(__clang__)
  193748. "adcs r3, %[r]\n\t"
  193749. #else
  193750. "adc r3, %[r]\n\t"
  193751. #endif
  193752. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193753. "adds r4, r4, r6\n\t"
  193754. #else
  193755. "add r4, r4, r6\n\t"
  193756. #endif
  193757. #ifdef WOLFSSL_KEIL
  193758. "adcs r2, r2, %[r]\n\t"
  193759. #elif defined(__clang__)
  193760. "adcs r2, %[r]\n\t"
  193761. #else
  193762. "adc r2, %[r]\n\t"
  193763. #endif
  193764. #ifdef WOLFSSL_KEIL
  193765. "adcs r3, r3, %[r]\n\t"
  193766. #elif defined(__clang__)
  193767. "adcs r3, %[r]\n\t"
  193768. #else
  193769. "adc r3, %[r]\n\t"
  193770. #endif
  193771. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193772. "lsrs r6, r7, #16\n\t"
  193773. #else
  193774. "lsr r6, r7, #16\n\t"
  193775. #endif
  193776. #ifdef WOLFSSL_KEIL
  193777. "muls r5, r6, r5\n\t"
  193778. #elif defined(__clang__)
  193779. "muls r5, r6\n\t"
  193780. #else
  193781. "mul r5, r6\n\t"
  193782. #endif
  193783. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193784. "lsrs r6, r5, #16\n\t"
  193785. #else
  193786. "lsr r6, r5, #16\n\t"
  193787. #endif
  193788. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193789. "lsls r5, r5, #16\n\t"
  193790. #else
  193791. "lsl r5, r5, #16\n\t"
  193792. #endif
  193793. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193794. "adds r4, r4, r5\n\t"
  193795. #else
  193796. "add r4, r4, r5\n\t"
  193797. #endif
  193798. #ifdef WOLFSSL_KEIL
  193799. "adcs r2, r2, r6\n\t"
  193800. #elif defined(__clang__)
  193801. "adcs r2, r6\n\t"
  193802. #else
  193803. "adc r2, r6\n\t"
  193804. #endif
  193805. #ifdef WOLFSSL_KEIL
  193806. "adcs r3, r3, %[r]\n\t"
  193807. #elif defined(__clang__)
  193808. "adcs r3, %[r]\n\t"
  193809. #else
  193810. "adc r3, %[r]\n\t"
  193811. #endif
  193812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193813. "adds r4, r4, r5\n\t"
  193814. #else
  193815. "add r4, r4, r5\n\t"
  193816. #endif
  193817. #ifdef WOLFSSL_KEIL
  193818. "adcs r2, r2, r6\n\t"
  193819. #elif defined(__clang__)
  193820. "adcs r2, r6\n\t"
  193821. #else
  193822. "adc r2, r6\n\t"
  193823. #endif
  193824. #ifdef WOLFSSL_KEIL
  193825. "adcs r3, r3, %[r]\n\t"
  193826. #elif defined(__clang__)
  193827. "adcs r3, %[r]\n\t"
  193828. #else
  193829. "adc r3, %[r]\n\t"
  193830. #endif
  193831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193832. "lsrs r5, %[a], #16\n\t"
  193833. #else
  193834. "lsr r5, %[a], #16\n\t"
  193835. #endif
  193836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193837. "lsrs r6, r7, #16\n\t"
  193838. #else
  193839. "lsr r6, r7, #16\n\t"
  193840. #endif
  193841. #ifdef WOLFSSL_KEIL
  193842. "muls r6, r5, r6\n\t"
  193843. #elif defined(__clang__)
  193844. "muls r6, r5\n\t"
  193845. #else
  193846. "mul r6, r5\n\t"
  193847. #endif
  193848. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193849. "adds r2, r2, r6\n\t"
  193850. #else
  193851. "add r2, 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 r2, r2, r6\n\t"
  193862. #else
  193863. "add r2, r2, r6\n\t"
  193864. #endif
  193865. #ifdef WOLFSSL_KEIL
  193866. "adcs r3, r3, %[r]\n\t"
  193867. #elif defined(__clang__)
  193868. "adcs r3, %[r]\n\t"
  193869. #else
  193870. "adc r3, %[r]\n\t"
  193871. #endif
  193872. "uxth r6, r7\n\t"
  193873. #ifdef WOLFSSL_KEIL
  193874. "muls r5, r6, r5\n\t"
  193875. #elif defined(__clang__)
  193876. "muls r5, r6\n\t"
  193877. #else
  193878. "mul r5, r6\n\t"
  193879. #endif
  193880. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193881. "lsrs r6, r5, #16\n\t"
  193882. #else
  193883. "lsr r6, r5, #16\n\t"
  193884. #endif
  193885. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193886. "lsls r5, r5, #16\n\t"
  193887. #else
  193888. "lsl r5, r5, #16\n\t"
  193889. #endif
  193890. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193891. "adds r4, r4, r5\n\t"
  193892. #else
  193893. "add r4, r4, r5\n\t"
  193894. #endif
  193895. #ifdef WOLFSSL_KEIL
  193896. "adcs r2, r2, r6\n\t"
  193897. #elif defined(__clang__)
  193898. "adcs r2, r6\n\t"
  193899. #else
  193900. "adc r2, r6\n\t"
  193901. #endif
  193902. #ifdef WOLFSSL_KEIL
  193903. "adcs r3, r3, %[r]\n\t"
  193904. #elif defined(__clang__)
  193905. "adcs r3, %[r]\n\t"
  193906. #else
  193907. "adc r3, %[r]\n\t"
  193908. #endif
  193909. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193910. "adds r4, r4, r5\n\t"
  193911. #else
  193912. "add r4, r4, r5\n\t"
  193913. #endif
  193914. #ifdef WOLFSSL_KEIL
  193915. "adcs r2, r2, r6\n\t"
  193916. #elif defined(__clang__)
  193917. "adcs r2, r6\n\t"
  193918. #else
  193919. "adc r2, r6\n\t"
  193920. #endif
  193921. #ifdef WOLFSSL_KEIL
  193922. "adcs r3, r3, %[r]\n\t"
  193923. #elif defined(__clang__)
  193924. "adcs r3, %[r]\n\t"
  193925. #else
  193926. "adc r3, %[r]\n\t"
  193927. #endif
  193928. "mov %[r], r8\n\t"
  193929. "str r4, [%[r], #92]\n\t"
  193930. "movs %[r], #0\n\t"
  193931. "# A[15] * A[9]\n\t"
  193932. "movs r4, #0\n\t"
  193933. "mov %[a], r9\n\t"
  193934. "ldr r7, [%[a], #36]\n\t"
  193935. "mov %[a], lr\n\t"
  193936. "uxth r5, %[a]\n\t"
  193937. "uxth r6, r7\n\t"
  193938. #ifdef WOLFSSL_KEIL
  193939. "muls r6, r5, r6\n\t"
  193940. #elif defined(__clang__)
  193941. "muls r6, r5\n\t"
  193942. #else
  193943. "mul r6, r5\n\t"
  193944. #endif
  193945. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193946. "adds r2, r2, r6\n\t"
  193947. #else
  193948. "add r2, r2, r6\n\t"
  193949. #endif
  193950. #ifdef WOLFSSL_KEIL
  193951. "adcs r3, r3, %[r]\n\t"
  193952. #elif defined(__clang__)
  193953. "adcs r3, %[r]\n\t"
  193954. #else
  193955. "adc r3, %[r]\n\t"
  193956. #endif
  193957. #ifdef WOLFSSL_KEIL
  193958. "adcs r4, r4, %[r]\n\t"
  193959. #elif defined(__clang__)
  193960. "adcs r4, %[r]\n\t"
  193961. #else
  193962. "adc r4, %[r]\n\t"
  193963. #endif
  193964. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193965. "adds r2, r2, r6\n\t"
  193966. #else
  193967. "add r2, r2, r6\n\t"
  193968. #endif
  193969. #ifdef WOLFSSL_KEIL
  193970. "adcs r3, r3, %[r]\n\t"
  193971. #elif defined(__clang__)
  193972. "adcs r3, %[r]\n\t"
  193973. #else
  193974. "adc r3, %[r]\n\t"
  193975. #endif
  193976. #ifdef WOLFSSL_KEIL
  193977. "adcs r4, r4, %[r]\n\t"
  193978. #elif defined(__clang__)
  193979. "adcs r4, %[r]\n\t"
  193980. #else
  193981. "adc r4, %[r]\n\t"
  193982. #endif
  193983. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193984. "lsrs r6, r7, #16\n\t"
  193985. #else
  193986. "lsr r6, r7, #16\n\t"
  193987. #endif
  193988. #ifdef WOLFSSL_KEIL
  193989. "muls r5, r6, r5\n\t"
  193990. #elif defined(__clang__)
  193991. "muls r5, r6\n\t"
  193992. #else
  193993. "mul r5, r6\n\t"
  193994. #endif
  193995. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  193996. "lsrs r6, r5, #16\n\t"
  193997. #else
  193998. "lsr r6, r5, #16\n\t"
  193999. #endif
  194000. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194001. "lsls r5, r5, #16\n\t"
  194002. #else
  194003. "lsl r5, r5, #16\n\t"
  194004. #endif
  194005. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194006. "adds r2, r2, r5\n\t"
  194007. #else
  194008. "add r2, r2, r5\n\t"
  194009. #endif
  194010. #ifdef WOLFSSL_KEIL
  194011. "adcs r3, r3, r6\n\t"
  194012. #elif defined(__clang__)
  194013. "adcs r3, r6\n\t"
  194014. #else
  194015. "adc r3, r6\n\t"
  194016. #endif
  194017. #ifdef WOLFSSL_KEIL
  194018. "adcs r4, r4, %[r]\n\t"
  194019. #elif defined(__clang__)
  194020. "adcs r4, %[r]\n\t"
  194021. #else
  194022. "adc r4, %[r]\n\t"
  194023. #endif
  194024. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194025. "adds r2, r2, r5\n\t"
  194026. #else
  194027. "add r2, r2, r5\n\t"
  194028. #endif
  194029. #ifdef WOLFSSL_KEIL
  194030. "adcs r3, r3, r6\n\t"
  194031. #elif defined(__clang__)
  194032. "adcs r3, r6\n\t"
  194033. #else
  194034. "adc r3, r6\n\t"
  194035. #endif
  194036. #ifdef WOLFSSL_KEIL
  194037. "adcs r4, r4, %[r]\n\t"
  194038. #elif defined(__clang__)
  194039. "adcs r4, %[r]\n\t"
  194040. #else
  194041. "adc r4, %[r]\n\t"
  194042. #endif
  194043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194044. "lsrs r5, %[a], #16\n\t"
  194045. #else
  194046. "lsr r5, %[a], #16\n\t"
  194047. #endif
  194048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194049. "lsrs r6, r7, #16\n\t"
  194050. #else
  194051. "lsr r6, r7, #16\n\t"
  194052. #endif
  194053. #ifdef WOLFSSL_KEIL
  194054. "muls r6, r5, r6\n\t"
  194055. #elif defined(__clang__)
  194056. "muls r6, r5\n\t"
  194057. #else
  194058. "mul r6, r5\n\t"
  194059. #endif
  194060. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194061. "adds r3, r3, r6\n\t"
  194062. #else
  194063. "add r3, r3, r6\n\t"
  194064. #endif
  194065. #ifdef WOLFSSL_KEIL
  194066. "adcs r4, r4, %[r]\n\t"
  194067. #elif defined(__clang__)
  194068. "adcs r4, %[r]\n\t"
  194069. #else
  194070. "adc r4, %[r]\n\t"
  194071. #endif
  194072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194073. "adds r3, r3, r6\n\t"
  194074. #else
  194075. "add r3, r3, r6\n\t"
  194076. #endif
  194077. #ifdef WOLFSSL_KEIL
  194078. "adcs r4, r4, %[r]\n\t"
  194079. #elif defined(__clang__)
  194080. "adcs r4, %[r]\n\t"
  194081. #else
  194082. "adc r4, %[r]\n\t"
  194083. #endif
  194084. "uxth r6, r7\n\t"
  194085. #ifdef WOLFSSL_KEIL
  194086. "muls r5, r6, r5\n\t"
  194087. #elif defined(__clang__)
  194088. "muls r5, r6\n\t"
  194089. #else
  194090. "mul r5, r6\n\t"
  194091. #endif
  194092. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194093. "lsrs r6, r5, #16\n\t"
  194094. #else
  194095. "lsr r6, r5, #16\n\t"
  194096. #endif
  194097. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194098. "lsls r5, r5, #16\n\t"
  194099. #else
  194100. "lsl r5, r5, #16\n\t"
  194101. #endif
  194102. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194103. "adds r2, r2, r5\n\t"
  194104. #else
  194105. "add r2, r2, r5\n\t"
  194106. #endif
  194107. #ifdef WOLFSSL_KEIL
  194108. "adcs r3, r3, r6\n\t"
  194109. #elif defined(__clang__)
  194110. "adcs r3, r6\n\t"
  194111. #else
  194112. "adc r3, r6\n\t"
  194113. #endif
  194114. #ifdef WOLFSSL_KEIL
  194115. "adcs r4, r4, %[r]\n\t"
  194116. #elif defined(__clang__)
  194117. "adcs r4, %[r]\n\t"
  194118. #else
  194119. "adc r4, %[r]\n\t"
  194120. #endif
  194121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194122. "adds r2, r2, r5\n\t"
  194123. #else
  194124. "add r2, r2, r5\n\t"
  194125. #endif
  194126. #ifdef WOLFSSL_KEIL
  194127. "adcs r3, r3, r6\n\t"
  194128. #elif defined(__clang__)
  194129. "adcs r3, r6\n\t"
  194130. #else
  194131. "adc r3, r6\n\t"
  194132. #endif
  194133. #ifdef WOLFSSL_KEIL
  194134. "adcs r4, r4, %[r]\n\t"
  194135. #elif defined(__clang__)
  194136. "adcs r4, %[r]\n\t"
  194137. #else
  194138. "adc r4, %[r]\n\t"
  194139. #endif
  194140. "# A[14] * A[10]\n\t"
  194141. "mov %[a], r9\n\t"
  194142. "ldr r7, [%[a], #40]\n\t"
  194143. "mov %[a], r12\n\t"
  194144. "uxth r5, %[a]\n\t"
  194145. "uxth r6, r7\n\t"
  194146. #ifdef WOLFSSL_KEIL
  194147. "muls r6, r5, r6\n\t"
  194148. #elif defined(__clang__)
  194149. "muls r6, r5\n\t"
  194150. #else
  194151. "mul r6, r5\n\t"
  194152. #endif
  194153. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194154. "adds r2, r2, r6\n\t"
  194155. #else
  194156. "add r2, r2, r6\n\t"
  194157. #endif
  194158. #ifdef WOLFSSL_KEIL
  194159. "adcs r3, r3, %[r]\n\t"
  194160. #elif defined(__clang__)
  194161. "adcs r3, %[r]\n\t"
  194162. #else
  194163. "adc r3, %[r]\n\t"
  194164. #endif
  194165. #ifdef WOLFSSL_KEIL
  194166. "adcs r4, r4, %[r]\n\t"
  194167. #elif defined(__clang__)
  194168. "adcs r4, %[r]\n\t"
  194169. #else
  194170. "adc r4, %[r]\n\t"
  194171. #endif
  194172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194173. "adds r2, r2, r6\n\t"
  194174. #else
  194175. "add r2, r2, r6\n\t"
  194176. #endif
  194177. #ifdef WOLFSSL_KEIL
  194178. "adcs r3, r3, %[r]\n\t"
  194179. #elif defined(__clang__)
  194180. "adcs r3, %[r]\n\t"
  194181. #else
  194182. "adc r3, %[r]\n\t"
  194183. #endif
  194184. #ifdef WOLFSSL_KEIL
  194185. "adcs r4, r4, %[r]\n\t"
  194186. #elif defined(__clang__)
  194187. "adcs r4, %[r]\n\t"
  194188. #else
  194189. "adc r4, %[r]\n\t"
  194190. #endif
  194191. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194192. "lsrs r6, r7, #16\n\t"
  194193. #else
  194194. "lsr r6, r7, #16\n\t"
  194195. #endif
  194196. #ifdef WOLFSSL_KEIL
  194197. "muls r5, r6, r5\n\t"
  194198. #elif defined(__clang__)
  194199. "muls r5, r6\n\t"
  194200. #else
  194201. "mul r5, r6\n\t"
  194202. #endif
  194203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194204. "lsrs r6, r5, #16\n\t"
  194205. #else
  194206. "lsr r6, r5, #16\n\t"
  194207. #endif
  194208. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194209. "lsls r5, r5, #16\n\t"
  194210. #else
  194211. "lsl r5, r5, #16\n\t"
  194212. #endif
  194213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194214. "adds r2, r2, r5\n\t"
  194215. #else
  194216. "add r2, r2, r5\n\t"
  194217. #endif
  194218. #ifdef WOLFSSL_KEIL
  194219. "adcs r3, r3, r6\n\t"
  194220. #elif defined(__clang__)
  194221. "adcs r3, r6\n\t"
  194222. #else
  194223. "adc r3, r6\n\t"
  194224. #endif
  194225. #ifdef WOLFSSL_KEIL
  194226. "adcs r4, r4, %[r]\n\t"
  194227. #elif defined(__clang__)
  194228. "adcs r4, %[r]\n\t"
  194229. #else
  194230. "adc r4, %[r]\n\t"
  194231. #endif
  194232. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194233. "adds r2, r2, r5\n\t"
  194234. #else
  194235. "add r2, r2, r5\n\t"
  194236. #endif
  194237. #ifdef WOLFSSL_KEIL
  194238. "adcs r3, r3, r6\n\t"
  194239. #elif defined(__clang__)
  194240. "adcs r3, r6\n\t"
  194241. #else
  194242. "adc r3, r6\n\t"
  194243. #endif
  194244. #ifdef WOLFSSL_KEIL
  194245. "adcs r4, r4, %[r]\n\t"
  194246. #elif defined(__clang__)
  194247. "adcs r4, %[r]\n\t"
  194248. #else
  194249. "adc r4, %[r]\n\t"
  194250. #endif
  194251. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194252. "lsrs r5, %[a], #16\n\t"
  194253. #else
  194254. "lsr r5, %[a], #16\n\t"
  194255. #endif
  194256. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194257. "lsrs r6, r7, #16\n\t"
  194258. #else
  194259. "lsr r6, r7, #16\n\t"
  194260. #endif
  194261. #ifdef WOLFSSL_KEIL
  194262. "muls r6, r5, r6\n\t"
  194263. #elif defined(__clang__)
  194264. "muls r6, r5\n\t"
  194265. #else
  194266. "mul r6, r5\n\t"
  194267. #endif
  194268. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194269. "adds r3, r3, r6\n\t"
  194270. #else
  194271. "add r3, r3, r6\n\t"
  194272. #endif
  194273. #ifdef WOLFSSL_KEIL
  194274. "adcs r4, r4, %[r]\n\t"
  194275. #elif defined(__clang__)
  194276. "adcs r4, %[r]\n\t"
  194277. #else
  194278. "adc r4, %[r]\n\t"
  194279. #endif
  194280. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194281. "adds r3, r3, r6\n\t"
  194282. #else
  194283. "add r3, r3, r6\n\t"
  194284. #endif
  194285. #ifdef WOLFSSL_KEIL
  194286. "adcs r4, r4, %[r]\n\t"
  194287. #elif defined(__clang__)
  194288. "adcs r4, %[r]\n\t"
  194289. #else
  194290. "adc r4, %[r]\n\t"
  194291. #endif
  194292. "uxth r6, r7\n\t"
  194293. #ifdef WOLFSSL_KEIL
  194294. "muls r5, r6, r5\n\t"
  194295. #elif defined(__clang__)
  194296. "muls r5, r6\n\t"
  194297. #else
  194298. "mul r5, r6\n\t"
  194299. #endif
  194300. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194301. "lsrs r6, r5, #16\n\t"
  194302. #else
  194303. "lsr r6, r5, #16\n\t"
  194304. #endif
  194305. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194306. "lsls r5, r5, #16\n\t"
  194307. #else
  194308. "lsl r5, r5, #16\n\t"
  194309. #endif
  194310. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194311. "adds r2, r2, r5\n\t"
  194312. #else
  194313. "add r2, r2, r5\n\t"
  194314. #endif
  194315. #ifdef WOLFSSL_KEIL
  194316. "adcs r3, r3, r6\n\t"
  194317. #elif defined(__clang__)
  194318. "adcs r3, r6\n\t"
  194319. #else
  194320. "adc r3, r6\n\t"
  194321. #endif
  194322. #ifdef WOLFSSL_KEIL
  194323. "adcs r4, r4, %[r]\n\t"
  194324. #elif defined(__clang__)
  194325. "adcs r4, %[r]\n\t"
  194326. #else
  194327. "adc r4, %[r]\n\t"
  194328. #endif
  194329. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194330. "adds r2, r2, r5\n\t"
  194331. #else
  194332. "add r2, r2, r5\n\t"
  194333. #endif
  194334. #ifdef WOLFSSL_KEIL
  194335. "adcs r3, r3, r6\n\t"
  194336. #elif defined(__clang__)
  194337. "adcs r3, r6\n\t"
  194338. #else
  194339. "adc r3, r6\n\t"
  194340. #endif
  194341. #ifdef WOLFSSL_KEIL
  194342. "adcs r4, r4, %[r]\n\t"
  194343. #elif defined(__clang__)
  194344. "adcs r4, %[r]\n\t"
  194345. #else
  194346. "adc r4, %[r]\n\t"
  194347. #endif
  194348. "# A[13] * A[11]\n\t"
  194349. "mov %[a], r9\n\t"
  194350. "ldr r7, [%[a], #44]\n\t"
  194351. "mov %[a], r11\n\t"
  194352. "uxth r5, %[a]\n\t"
  194353. "uxth r6, r7\n\t"
  194354. #ifdef WOLFSSL_KEIL
  194355. "muls r6, r5, r6\n\t"
  194356. #elif defined(__clang__)
  194357. "muls r6, r5\n\t"
  194358. #else
  194359. "mul r6, r5\n\t"
  194360. #endif
  194361. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194362. "adds r2, r2, r6\n\t"
  194363. #else
  194364. "add r2, r2, r6\n\t"
  194365. #endif
  194366. #ifdef WOLFSSL_KEIL
  194367. "adcs r3, r3, %[r]\n\t"
  194368. #elif defined(__clang__)
  194369. "adcs r3, %[r]\n\t"
  194370. #else
  194371. "adc r3, %[r]\n\t"
  194372. #endif
  194373. #ifdef WOLFSSL_KEIL
  194374. "adcs r4, r4, %[r]\n\t"
  194375. #elif defined(__clang__)
  194376. "adcs r4, %[r]\n\t"
  194377. #else
  194378. "adc r4, %[r]\n\t"
  194379. #endif
  194380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194381. "adds r2, r2, r6\n\t"
  194382. #else
  194383. "add r2, r2, r6\n\t"
  194384. #endif
  194385. #ifdef WOLFSSL_KEIL
  194386. "adcs r3, r3, %[r]\n\t"
  194387. #elif defined(__clang__)
  194388. "adcs r3, %[r]\n\t"
  194389. #else
  194390. "adc r3, %[r]\n\t"
  194391. #endif
  194392. #ifdef WOLFSSL_KEIL
  194393. "adcs r4, r4, %[r]\n\t"
  194394. #elif defined(__clang__)
  194395. "adcs r4, %[r]\n\t"
  194396. #else
  194397. "adc r4, %[r]\n\t"
  194398. #endif
  194399. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194400. "lsrs r6, r7, #16\n\t"
  194401. #else
  194402. "lsr r6, r7, #16\n\t"
  194403. #endif
  194404. #ifdef WOLFSSL_KEIL
  194405. "muls r5, r6, r5\n\t"
  194406. #elif defined(__clang__)
  194407. "muls r5, r6\n\t"
  194408. #else
  194409. "mul r5, r6\n\t"
  194410. #endif
  194411. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194412. "lsrs r6, r5, #16\n\t"
  194413. #else
  194414. "lsr r6, r5, #16\n\t"
  194415. #endif
  194416. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194417. "lsls r5, r5, #16\n\t"
  194418. #else
  194419. "lsl r5, r5, #16\n\t"
  194420. #endif
  194421. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194422. "adds r2, r2, r5\n\t"
  194423. #else
  194424. "add r2, r2, r5\n\t"
  194425. #endif
  194426. #ifdef WOLFSSL_KEIL
  194427. "adcs r3, r3, r6\n\t"
  194428. #elif defined(__clang__)
  194429. "adcs r3, r6\n\t"
  194430. #else
  194431. "adc r3, r6\n\t"
  194432. #endif
  194433. #ifdef WOLFSSL_KEIL
  194434. "adcs r4, r4, %[r]\n\t"
  194435. #elif defined(__clang__)
  194436. "adcs r4, %[r]\n\t"
  194437. #else
  194438. "adc r4, %[r]\n\t"
  194439. #endif
  194440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194441. "adds r2, r2, r5\n\t"
  194442. #else
  194443. "add r2, r2, r5\n\t"
  194444. #endif
  194445. #ifdef WOLFSSL_KEIL
  194446. "adcs r3, r3, r6\n\t"
  194447. #elif defined(__clang__)
  194448. "adcs r3, r6\n\t"
  194449. #else
  194450. "adc r3, r6\n\t"
  194451. #endif
  194452. #ifdef WOLFSSL_KEIL
  194453. "adcs r4, r4, %[r]\n\t"
  194454. #elif defined(__clang__)
  194455. "adcs r4, %[r]\n\t"
  194456. #else
  194457. "adc r4, %[r]\n\t"
  194458. #endif
  194459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194460. "lsrs r5, %[a], #16\n\t"
  194461. #else
  194462. "lsr r5, %[a], #16\n\t"
  194463. #endif
  194464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194465. "lsrs r6, r7, #16\n\t"
  194466. #else
  194467. "lsr r6, r7, #16\n\t"
  194468. #endif
  194469. #ifdef WOLFSSL_KEIL
  194470. "muls r6, r5, r6\n\t"
  194471. #elif defined(__clang__)
  194472. "muls r6, r5\n\t"
  194473. #else
  194474. "mul r6, r5\n\t"
  194475. #endif
  194476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194477. "adds r3, r3, r6\n\t"
  194478. #else
  194479. "add r3, 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 r3, r3, r6\n\t"
  194490. #else
  194491. "add r3, r3, r6\n\t"
  194492. #endif
  194493. #ifdef WOLFSSL_KEIL
  194494. "adcs r4, r4, %[r]\n\t"
  194495. #elif defined(__clang__)
  194496. "adcs r4, %[r]\n\t"
  194497. #else
  194498. "adc r4, %[r]\n\t"
  194499. #endif
  194500. "uxth r6, r7\n\t"
  194501. #ifdef WOLFSSL_KEIL
  194502. "muls r5, r6, r5\n\t"
  194503. #elif defined(__clang__)
  194504. "muls r5, r6\n\t"
  194505. #else
  194506. "mul r5, r6\n\t"
  194507. #endif
  194508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194509. "lsrs r6, r5, #16\n\t"
  194510. #else
  194511. "lsr r6, r5, #16\n\t"
  194512. #endif
  194513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194514. "lsls r5, r5, #16\n\t"
  194515. #else
  194516. "lsl r5, r5, #16\n\t"
  194517. #endif
  194518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194519. "adds r2, r2, r5\n\t"
  194520. #else
  194521. "add r2, r2, r5\n\t"
  194522. #endif
  194523. #ifdef WOLFSSL_KEIL
  194524. "adcs r3, r3, r6\n\t"
  194525. #elif defined(__clang__)
  194526. "adcs r3, r6\n\t"
  194527. #else
  194528. "adc r3, r6\n\t"
  194529. #endif
  194530. #ifdef WOLFSSL_KEIL
  194531. "adcs r4, r4, %[r]\n\t"
  194532. #elif defined(__clang__)
  194533. "adcs r4, %[r]\n\t"
  194534. #else
  194535. "adc r4, %[r]\n\t"
  194536. #endif
  194537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194538. "adds r2, r2, r5\n\t"
  194539. #else
  194540. "add r2, r2, r5\n\t"
  194541. #endif
  194542. #ifdef WOLFSSL_KEIL
  194543. "adcs r3, r3, r6\n\t"
  194544. #elif defined(__clang__)
  194545. "adcs r3, r6\n\t"
  194546. #else
  194547. "adc r3, r6\n\t"
  194548. #endif
  194549. #ifdef WOLFSSL_KEIL
  194550. "adcs r4, r4, %[r]\n\t"
  194551. #elif defined(__clang__)
  194552. "adcs r4, %[r]\n\t"
  194553. #else
  194554. "adc r4, %[r]\n\t"
  194555. #endif
  194556. "# A[12] * A[12]\n\t"
  194557. "mov r7, r10\n\t"
  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. "uxth r5, r7\n\t"
  194564. #ifdef WOLFSSL_KEIL
  194565. "muls r5, r5, r5\n\t"
  194566. #elif defined(__clang__)
  194567. "muls r5, r5\n\t"
  194568. #else
  194569. "mul r5, r5\n\t"
  194570. #endif
  194571. #ifdef WOLFSSL_KEIL
  194572. "muls r6, r6, r6\n\t"
  194573. #elif defined(__clang__)
  194574. "muls r6, r6\n\t"
  194575. #else
  194576. "mul r6, r6\n\t"
  194577. #endif
  194578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194579. "adds r2, r2, r5\n\t"
  194580. #else
  194581. "add r2, r2, r5\n\t"
  194582. #endif
  194583. #ifdef WOLFSSL_KEIL
  194584. "adcs r3, r3, r6\n\t"
  194585. #elif defined(__clang__)
  194586. "adcs r3, r6\n\t"
  194587. #else
  194588. "adc r3, r6\n\t"
  194589. #endif
  194590. #ifdef WOLFSSL_KEIL
  194591. "adcs r4, r4, %[r]\n\t"
  194592. #elif defined(__clang__)
  194593. "adcs r4, %[r]\n\t"
  194594. #else
  194595. "adc r4, %[r]\n\t"
  194596. #endif
  194597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194598. "lsrs r6, r7, #16\n\t"
  194599. #else
  194600. "lsr r6, r7, #16\n\t"
  194601. #endif
  194602. "uxth r5, r7\n\t"
  194603. #ifdef WOLFSSL_KEIL
  194604. "muls r5, r6, r5\n\t"
  194605. #elif defined(__clang__)
  194606. "muls r5, r6\n\t"
  194607. #else
  194608. "mul r5, r6\n\t"
  194609. #endif
  194610. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194611. "lsrs r6, r5, #15\n\t"
  194612. #else
  194613. "lsr r6, r5, #15\n\t"
  194614. #endif
  194615. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194616. "lsls r5, r5, #17\n\t"
  194617. #else
  194618. "lsl r5, r5, #17\n\t"
  194619. #endif
  194620. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194621. "adds r2, r2, r5\n\t"
  194622. #else
  194623. "add r2, r2, r5\n\t"
  194624. #endif
  194625. #ifdef WOLFSSL_KEIL
  194626. "adcs r3, r3, r6\n\t"
  194627. #elif defined(__clang__)
  194628. "adcs r3, r6\n\t"
  194629. #else
  194630. "adc r3, r6\n\t"
  194631. #endif
  194632. #ifdef WOLFSSL_KEIL
  194633. "adcs r4, r4, %[r]\n\t"
  194634. #elif defined(__clang__)
  194635. "adcs r4, %[r]\n\t"
  194636. #else
  194637. "adc r4, %[r]\n\t"
  194638. #endif
  194639. "mov %[r], r8\n\t"
  194640. "str r2, [%[r], #96]\n\t"
  194641. "movs %[r], #0\n\t"
  194642. "# A[13] * A[12]\n\t"
  194643. "movs r2, #0\n\t"
  194644. "mov %[a], r9\n\t"
  194645. "mov %[a], r11\n\t"
  194646. "uxth r5, %[a]\n\t"
  194647. "uxth r6, r7\n\t"
  194648. #ifdef WOLFSSL_KEIL
  194649. "muls r6, r5, r6\n\t"
  194650. #elif defined(__clang__)
  194651. "muls r6, r5\n\t"
  194652. #else
  194653. "mul r6, r5\n\t"
  194654. #endif
  194655. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194656. "adds r3, r3, r6\n\t"
  194657. #else
  194658. "add r3, r3, r6\n\t"
  194659. #endif
  194660. #ifdef WOLFSSL_KEIL
  194661. "adcs r4, r4, %[r]\n\t"
  194662. #elif defined(__clang__)
  194663. "adcs r4, %[r]\n\t"
  194664. #else
  194665. "adc r4, %[r]\n\t"
  194666. #endif
  194667. #ifdef WOLFSSL_KEIL
  194668. "adcs r2, r2, %[r]\n\t"
  194669. #elif defined(__clang__)
  194670. "adcs r2, %[r]\n\t"
  194671. #else
  194672. "adc r2, %[r]\n\t"
  194673. #endif
  194674. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194675. "adds r3, r3, r6\n\t"
  194676. #else
  194677. "add r3, r3, r6\n\t"
  194678. #endif
  194679. #ifdef WOLFSSL_KEIL
  194680. "adcs r4, r4, %[r]\n\t"
  194681. #elif defined(__clang__)
  194682. "adcs r4, %[r]\n\t"
  194683. #else
  194684. "adc r4, %[r]\n\t"
  194685. #endif
  194686. #ifdef WOLFSSL_KEIL
  194687. "adcs r2, r2, %[r]\n\t"
  194688. #elif defined(__clang__)
  194689. "adcs r2, %[r]\n\t"
  194690. #else
  194691. "adc r2, %[r]\n\t"
  194692. #endif
  194693. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194694. "lsrs r6, r7, #16\n\t"
  194695. #else
  194696. "lsr r6, r7, #16\n\t"
  194697. #endif
  194698. #ifdef WOLFSSL_KEIL
  194699. "muls r5, r6, r5\n\t"
  194700. #elif defined(__clang__)
  194701. "muls r5, r6\n\t"
  194702. #else
  194703. "mul r5, r6\n\t"
  194704. #endif
  194705. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194706. "lsrs r6, r5, #16\n\t"
  194707. #else
  194708. "lsr r6, r5, #16\n\t"
  194709. #endif
  194710. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194711. "lsls r5, r5, #16\n\t"
  194712. #else
  194713. "lsl r5, r5, #16\n\t"
  194714. #endif
  194715. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194716. "adds r3, r3, r5\n\t"
  194717. #else
  194718. "add r3, r3, r5\n\t"
  194719. #endif
  194720. #ifdef WOLFSSL_KEIL
  194721. "adcs r4, r4, r6\n\t"
  194722. #elif defined(__clang__)
  194723. "adcs r4, r6\n\t"
  194724. #else
  194725. "adc r4, r6\n\t"
  194726. #endif
  194727. #ifdef WOLFSSL_KEIL
  194728. "adcs r2, r2, %[r]\n\t"
  194729. #elif defined(__clang__)
  194730. "adcs r2, %[r]\n\t"
  194731. #else
  194732. "adc r2, %[r]\n\t"
  194733. #endif
  194734. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194735. "adds r3, r3, r5\n\t"
  194736. #else
  194737. "add r3, r3, r5\n\t"
  194738. #endif
  194739. #ifdef WOLFSSL_KEIL
  194740. "adcs r4, r4, r6\n\t"
  194741. #elif defined(__clang__)
  194742. "adcs r4, r6\n\t"
  194743. #else
  194744. "adc r4, r6\n\t"
  194745. #endif
  194746. #ifdef WOLFSSL_KEIL
  194747. "adcs r2, r2, %[r]\n\t"
  194748. #elif defined(__clang__)
  194749. "adcs r2, %[r]\n\t"
  194750. #else
  194751. "adc r2, %[r]\n\t"
  194752. #endif
  194753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194754. "lsrs r5, %[a], #16\n\t"
  194755. #else
  194756. "lsr r5, %[a], #16\n\t"
  194757. #endif
  194758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194759. "lsrs r6, r7, #16\n\t"
  194760. #else
  194761. "lsr r6, r7, #16\n\t"
  194762. #endif
  194763. #ifdef WOLFSSL_KEIL
  194764. "muls r6, r5, r6\n\t"
  194765. #elif defined(__clang__)
  194766. "muls r6, r5\n\t"
  194767. #else
  194768. "mul r6, r5\n\t"
  194769. #endif
  194770. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194771. "adds r4, r4, r6\n\t"
  194772. #else
  194773. "add r4, r4, r6\n\t"
  194774. #endif
  194775. #ifdef WOLFSSL_KEIL
  194776. "adcs r2, r2, %[r]\n\t"
  194777. #elif defined(__clang__)
  194778. "adcs r2, %[r]\n\t"
  194779. #else
  194780. "adc r2, %[r]\n\t"
  194781. #endif
  194782. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194783. "adds r4, r4, r6\n\t"
  194784. #else
  194785. "add r4, r4, r6\n\t"
  194786. #endif
  194787. #ifdef WOLFSSL_KEIL
  194788. "adcs r2, r2, %[r]\n\t"
  194789. #elif defined(__clang__)
  194790. "adcs r2, %[r]\n\t"
  194791. #else
  194792. "adc r2, %[r]\n\t"
  194793. #endif
  194794. "uxth r6, r7\n\t"
  194795. #ifdef WOLFSSL_KEIL
  194796. "muls r5, r6, r5\n\t"
  194797. #elif defined(__clang__)
  194798. "muls r5, r6\n\t"
  194799. #else
  194800. "mul r5, r6\n\t"
  194801. #endif
  194802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194803. "lsrs r6, r5, #16\n\t"
  194804. #else
  194805. "lsr r6, r5, #16\n\t"
  194806. #endif
  194807. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194808. "lsls r5, r5, #16\n\t"
  194809. #else
  194810. "lsl r5, r5, #16\n\t"
  194811. #endif
  194812. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194813. "adds r3, r3, r5\n\t"
  194814. #else
  194815. "add r3, r3, r5\n\t"
  194816. #endif
  194817. #ifdef WOLFSSL_KEIL
  194818. "adcs r4, r4, r6\n\t"
  194819. #elif defined(__clang__)
  194820. "adcs r4, r6\n\t"
  194821. #else
  194822. "adc r4, r6\n\t"
  194823. #endif
  194824. #ifdef WOLFSSL_KEIL
  194825. "adcs r2, r2, %[r]\n\t"
  194826. #elif defined(__clang__)
  194827. "adcs r2, %[r]\n\t"
  194828. #else
  194829. "adc r2, %[r]\n\t"
  194830. #endif
  194831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194832. "adds r3, r3, r5\n\t"
  194833. #else
  194834. "add r3, r3, r5\n\t"
  194835. #endif
  194836. #ifdef WOLFSSL_KEIL
  194837. "adcs r4, r4, r6\n\t"
  194838. #elif defined(__clang__)
  194839. "adcs r4, r6\n\t"
  194840. #else
  194841. "adc r4, r6\n\t"
  194842. #endif
  194843. #ifdef WOLFSSL_KEIL
  194844. "adcs r2, r2, %[r]\n\t"
  194845. #elif defined(__clang__)
  194846. "adcs r2, %[r]\n\t"
  194847. #else
  194848. "adc r2, %[r]\n\t"
  194849. #endif
  194850. "# A[14] * A[11]\n\t"
  194851. "mov %[a], r9\n\t"
  194852. "ldr r7, [%[a], #44]\n\t"
  194853. "mov %[a], r12\n\t"
  194854. "uxth r5, %[a]\n\t"
  194855. "uxth r6, r7\n\t"
  194856. #ifdef WOLFSSL_KEIL
  194857. "muls r6, r5, r6\n\t"
  194858. #elif defined(__clang__)
  194859. "muls r6, r5\n\t"
  194860. #else
  194861. "mul r6, r5\n\t"
  194862. #endif
  194863. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194864. "adds r3, r3, r6\n\t"
  194865. #else
  194866. "add r3, r3, r6\n\t"
  194867. #endif
  194868. #ifdef WOLFSSL_KEIL
  194869. "adcs r4, r4, %[r]\n\t"
  194870. #elif defined(__clang__)
  194871. "adcs r4, %[r]\n\t"
  194872. #else
  194873. "adc r4, %[r]\n\t"
  194874. #endif
  194875. #ifdef WOLFSSL_KEIL
  194876. "adcs r2, r2, %[r]\n\t"
  194877. #elif defined(__clang__)
  194878. "adcs r2, %[r]\n\t"
  194879. #else
  194880. "adc r2, %[r]\n\t"
  194881. #endif
  194882. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194883. "adds r3, r3, r6\n\t"
  194884. #else
  194885. "add r3, r3, r6\n\t"
  194886. #endif
  194887. #ifdef WOLFSSL_KEIL
  194888. "adcs r4, r4, %[r]\n\t"
  194889. #elif defined(__clang__)
  194890. "adcs r4, %[r]\n\t"
  194891. #else
  194892. "adc r4, %[r]\n\t"
  194893. #endif
  194894. #ifdef WOLFSSL_KEIL
  194895. "adcs r2, r2, %[r]\n\t"
  194896. #elif defined(__clang__)
  194897. "adcs r2, %[r]\n\t"
  194898. #else
  194899. "adc r2, %[r]\n\t"
  194900. #endif
  194901. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194902. "lsrs r6, r7, #16\n\t"
  194903. #else
  194904. "lsr r6, r7, #16\n\t"
  194905. #endif
  194906. #ifdef WOLFSSL_KEIL
  194907. "muls r5, r6, r5\n\t"
  194908. #elif defined(__clang__)
  194909. "muls r5, r6\n\t"
  194910. #else
  194911. "mul r5, r6\n\t"
  194912. #endif
  194913. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194914. "lsrs r6, r5, #16\n\t"
  194915. #else
  194916. "lsr r6, r5, #16\n\t"
  194917. #endif
  194918. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194919. "lsls r5, r5, #16\n\t"
  194920. #else
  194921. "lsl r5, r5, #16\n\t"
  194922. #endif
  194923. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194924. "adds r3, r3, r5\n\t"
  194925. #else
  194926. "add r3, r3, r5\n\t"
  194927. #endif
  194928. #ifdef WOLFSSL_KEIL
  194929. "adcs r4, r4, r6\n\t"
  194930. #elif defined(__clang__)
  194931. "adcs r4, r6\n\t"
  194932. #else
  194933. "adc r4, r6\n\t"
  194934. #endif
  194935. #ifdef WOLFSSL_KEIL
  194936. "adcs r2, r2, %[r]\n\t"
  194937. #elif defined(__clang__)
  194938. "adcs r2, %[r]\n\t"
  194939. #else
  194940. "adc r2, %[r]\n\t"
  194941. #endif
  194942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194943. "adds r3, r3, r5\n\t"
  194944. #else
  194945. "add r3, r3, r5\n\t"
  194946. #endif
  194947. #ifdef WOLFSSL_KEIL
  194948. "adcs r4, r4, r6\n\t"
  194949. #elif defined(__clang__)
  194950. "adcs r4, r6\n\t"
  194951. #else
  194952. "adc r4, r6\n\t"
  194953. #endif
  194954. #ifdef WOLFSSL_KEIL
  194955. "adcs r2, r2, %[r]\n\t"
  194956. #elif defined(__clang__)
  194957. "adcs r2, %[r]\n\t"
  194958. #else
  194959. "adc r2, %[r]\n\t"
  194960. #endif
  194961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194962. "lsrs r5, %[a], #16\n\t"
  194963. #else
  194964. "lsr r5, %[a], #16\n\t"
  194965. #endif
  194966. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194967. "lsrs r6, r7, #16\n\t"
  194968. #else
  194969. "lsr r6, r7, #16\n\t"
  194970. #endif
  194971. #ifdef WOLFSSL_KEIL
  194972. "muls r6, r5, r6\n\t"
  194973. #elif defined(__clang__)
  194974. "muls r6, r5\n\t"
  194975. #else
  194976. "mul r6, r5\n\t"
  194977. #endif
  194978. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194979. "adds r4, r4, r6\n\t"
  194980. #else
  194981. "add r4, r4, r6\n\t"
  194982. #endif
  194983. #ifdef WOLFSSL_KEIL
  194984. "adcs r2, r2, %[r]\n\t"
  194985. #elif defined(__clang__)
  194986. "adcs r2, %[r]\n\t"
  194987. #else
  194988. "adc r2, %[r]\n\t"
  194989. #endif
  194990. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  194991. "adds r4, r4, r6\n\t"
  194992. #else
  194993. "add r4, r4, r6\n\t"
  194994. #endif
  194995. #ifdef WOLFSSL_KEIL
  194996. "adcs r2, r2, %[r]\n\t"
  194997. #elif defined(__clang__)
  194998. "adcs r2, %[r]\n\t"
  194999. #else
  195000. "adc r2, %[r]\n\t"
  195001. #endif
  195002. "uxth r6, r7\n\t"
  195003. #ifdef WOLFSSL_KEIL
  195004. "muls r5, r6, r5\n\t"
  195005. #elif defined(__clang__)
  195006. "muls r5, r6\n\t"
  195007. #else
  195008. "mul r5, r6\n\t"
  195009. #endif
  195010. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195011. "lsrs r6, r5, #16\n\t"
  195012. #else
  195013. "lsr r6, r5, #16\n\t"
  195014. #endif
  195015. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195016. "lsls r5, r5, #16\n\t"
  195017. #else
  195018. "lsl r5, r5, #16\n\t"
  195019. #endif
  195020. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195021. "adds r3, r3, r5\n\t"
  195022. #else
  195023. "add r3, r3, r5\n\t"
  195024. #endif
  195025. #ifdef WOLFSSL_KEIL
  195026. "adcs r4, r4, r6\n\t"
  195027. #elif defined(__clang__)
  195028. "adcs r4, r6\n\t"
  195029. #else
  195030. "adc r4, r6\n\t"
  195031. #endif
  195032. #ifdef WOLFSSL_KEIL
  195033. "adcs r2, r2, %[r]\n\t"
  195034. #elif defined(__clang__)
  195035. "adcs r2, %[r]\n\t"
  195036. #else
  195037. "adc r2, %[r]\n\t"
  195038. #endif
  195039. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195040. "adds r3, r3, r5\n\t"
  195041. #else
  195042. "add r3, r3, r5\n\t"
  195043. #endif
  195044. #ifdef WOLFSSL_KEIL
  195045. "adcs r4, r4, r6\n\t"
  195046. #elif defined(__clang__)
  195047. "adcs r4, r6\n\t"
  195048. #else
  195049. "adc r4, r6\n\t"
  195050. #endif
  195051. #ifdef WOLFSSL_KEIL
  195052. "adcs r2, r2, %[r]\n\t"
  195053. #elif defined(__clang__)
  195054. "adcs r2, %[r]\n\t"
  195055. #else
  195056. "adc r2, %[r]\n\t"
  195057. #endif
  195058. "# A[15] * A[10]\n\t"
  195059. "mov %[a], r9\n\t"
  195060. "ldr r7, [%[a], #40]\n\t"
  195061. "mov %[a], lr\n\t"
  195062. "uxth r5, %[a]\n\t"
  195063. "uxth r6, r7\n\t"
  195064. #ifdef WOLFSSL_KEIL
  195065. "muls r6, r5, r6\n\t"
  195066. #elif defined(__clang__)
  195067. "muls r6, r5\n\t"
  195068. #else
  195069. "mul r6, r5\n\t"
  195070. #endif
  195071. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195072. "adds r3, r3, r6\n\t"
  195073. #else
  195074. "add r3, r3, r6\n\t"
  195075. #endif
  195076. #ifdef WOLFSSL_KEIL
  195077. "adcs r4, r4, %[r]\n\t"
  195078. #elif defined(__clang__)
  195079. "adcs r4, %[r]\n\t"
  195080. #else
  195081. "adc r4, %[r]\n\t"
  195082. #endif
  195083. #ifdef WOLFSSL_KEIL
  195084. "adcs r2, r2, %[r]\n\t"
  195085. #elif defined(__clang__)
  195086. "adcs r2, %[r]\n\t"
  195087. #else
  195088. "adc r2, %[r]\n\t"
  195089. #endif
  195090. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195091. "adds r3, r3, r6\n\t"
  195092. #else
  195093. "add r3, r3, r6\n\t"
  195094. #endif
  195095. #ifdef WOLFSSL_KEIL
  195096. "adcs r4, r4, %[r]\n\t"
  195097. #elif defined(__clang__)
  195098. "adcs r4, %[r]\n\t"
  195099. #else
  195100. "adc r4, %[r]\n\t"
  195101. #endif
  195102. #ifdef WOLFSSL_KEIL
  195103. "adcs r2, r2, %[r]\n\t"
  195104. #elif defined(__clang__)
  195105. "adcs r2, %[r]\n\t"
  195106. #else
  195107. "adc r2, %[r]\n\t"
  195108. #endif
  195109. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195110. "lsrs r6, r7, #16\n\t"
  195111. #else
  195112. "lsr r6, r7, #16\n\t"
  195113. #endif
  195114. #ifdef WOLFSSL_KEIL
  195115. "muls r5, r6, r5\n\t"
  195116. #elif defined(__clang__)
  195117. "muls r5, r6\n\t"
  195118. #else
  195119. "mul r5, r6\n\t"
  195120. #endif
  195121. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195122. "lsrs r6, r5, #16\n\t"
  195123. #else
  195124. "lsr r6, r5, #16\n\t"
  195125. #endif
  195126. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195127. "lsls r5, r5, #16\n\t"
  195128. #else
  195129. "lsl r5, r5, #16\n\t"
  195130. #endif
  195131. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195132. "adds r3, r3, r5\n\t"
  195133. #else
  195134. "add r3, r3, r5\n\t"
  195135. #endif
  195136. #ifdef WOLFSSL_KEIL
  195137. "adcs r4, r4, r6\n\t"
  195138. #elif defined(__clang__)
  195139. "adcs r4, r6\n\t"
  195140. #else
  195141. "adc r4, r6\n\t"
  195142. #endif
  195143. #ifdef WOLFSSL_KEIL
  195144. "adcs r2, r2, %[r]\n\t"
  195145. #elif defined(__clang__)
  195146. "adcs r2, %[r]\n\t"
  195147. #else
  195148. "adc r2, %[r]\n\t"
  195149. #endif
  195150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195151. "adds r3, r3, r5\n\t"
  195152. #else
  195153. "add r3, r3, r5\n\t"
  195154. #endif
  195155. #ifdef WOLFSSL_KEIL
  195156. "adcs r4, r4, r6\n\t"
  195157. #elif defined(__clang__)
  195158. "adcs r4, r6\n\t"
  195159. #else
  195160. "adc r4, r6\n\t"
  195161. #endif
  195162. #ifdef WOLFSSL_KEIL
  195163. "adcs r2, r2, %[r]\n\t"
  195164. #elif defined(__clang__)
  195165. "adcs r2, %[r]\n\t"
  195166. #else
  195167. "adc r2, %[r]\n\t"
  195168. #endif
  195169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195170. "lsrs r5, %[a], #16\n\t"
  195171. #else
  195172. "lsr r5, %[a], #16\n\t"
  195173. #endif
  195174. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195175. "lsrs r6, r7, #16\n\t"
  195176. #else
  195177. "lsr r6, r7, #16\n\t"
  195178. #endif
  195179. #ifdef WOLFSSL_KEIL
  195180. "muls r6, r5, r6\n\t"
  195181. #elif defined(__clang__)
  195182. "muls r6, r5\n\t"
  195183. #else
  195184. "mul r6, r5\n\t"
  195185. #endif
  195186. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195187. "adds r4, r4, r6\n\t"
  195188. #else
  195189. "add r4, 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 r4, r4, r6\n\t"
  195200. #else
  195201. "add r4, r4, r6\n\t"
  195202. #endif
  195203. #ifdef WOLFSSL_KEIL
  195204. "adcs r2, r2, %[r]\n\t"
  195205. #elif defined(__clang__)
  195206. "adcs r2, %[r]\n\t"
  195207. #else
  195208. "adc r2, %[r]\n\t"
  195209. #endif
  195210. "uxth r6, r7\n\t"
  195211. #ifdef WOLFSSL_KEIL
  195212. "muls r5, r6, r5\n\t"
  195213. #elif defined(__clang__)
  195214. "muls r5, r6\n\t"
  195215. #else
  195216. "mul r5, r6\n\t"
  195217. #endif
  195218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195219. "lsrs r6, r5, #16\n\t"
  195220. #else
  195221. "lsr r6, r5, #16\n\t"
  195222. #endif
  195223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195224. "lsls r5, r5, #16\n\t"
  195225. #else
  195226. "lsl r5, r5, #16\n\t"
  195227. #endif
  195228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195229. "adds r3, r3, r5\n\t"
  195230. #else
  195231. "add r3, r3, r5\n\t"
  195232. #endif
  195233. #ifdef WOLFSSL_KEIL
  195234. "adcs r4, r4, r6\n\t"
  195235. #elif defined(__clang__)
  195236. "adcs r4, r6\n\t"
  195237. #else
  195238. "adc r4, r6\n\t"
  195239. #endif
  195240. #ifdef WOLFSSL_KEIL
  195241. "adcs r2, r2, %[r]\n\t"
  195242. #elif defined(__clang__)
  195243. "adcs r2, %[r]\n\t"
  195244. #else
  195245. "adc r2, %[r]\n\t"
  195246. #endif
  195247. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195248. "adds r3, r3, r5\n\t"
  195249. #else
  195250. "add r3, r3, r5\n\t"
  195251. #endif
  195252. #ifdef WOLFSSL_KEIL
  195253. "adcs r4, r4, r6\n\t"
  195254. #elif defined(__clang__)
  195255. "adcs r4, r6\n\t"
  195256. #else
  195257. "adc r4, r6\n\t"
  195258. #endif
  195259. #ifdef WOLFSSL_KEIL
  195260. "adcs r2, r2, %[r]\n\t"
  195261. #elif defined(__clang__)
  195262. "adcs r2, %[r]\n\t"
  195263. #else
  195264. "adc r2, %[r]\n\t"
  195265. #endif
  195266. "mov %[r], r8\n\t"
  195267. "str r3, [%[r], #100]\n\t"
  195268. "movs %[r], #0\n\t"
  195269. "# A[15] * A[11]\n\t"
  195270. "movs r3, #0\n\t"
  195271. "mov %[a], r9\n\t"
  195272. "ldr r7, [%[a], #44]\n\t"
  195273. "mov %[a], lr\n\t"
  195274. "uxth r5, %[a]\n\t"
  195275. "uxth r6, r7\n\t"
  195276. #ifdef WOLFSSL_KEIL
  195277. "muls r6, r5, r6\n\t"
  195278. #elif defined(__clang__)
  195279. "muls r6, r5\n\t"
  195280. #else
  195281. "mul r6, r5\n\t"
  195282. #endif
  195283. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195284. "adds r4, r4, r6\n\t"
  195285. #else
  195286. "add r4, r4, r6\n\t"
  195287. #endif
  195288. #ifdef WOLFSSL_KEIL
  195289. "adcs r2, r2, %[r]\n\t"
  195290. #elif defined(__clang__)
  195291. "adcs r2, %[r]\n\t"
  195292. #else
  195293. "adc r2, %[r]\n\t"
  195294. #endif
  195295. #ifdef WOLFSSL_KEIL
  195296. "adcs r3, r3, %[r]\n\t"
  195297. #elif defined(__clang__)
  195298. "adcs r3, %[r]\n\t"
  195299. #else
  195300. "adc r3, %[r]\n\t"
  195301. #endif
  195302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195303. "adds r4, r4, r6\n\t"
  195304. #else
  195305. "add r4, r4, r6\n\t"
  195306. #endif
  195307. #ifdef WOLFSSL_KEIL
  195308. "adcs r2, r2, %[r]\n\t"
  195309. #elif defined(__clang__)
  195310. "adcs r2, %[r]\n\t"
  195311. #else
  195312. "adc r2, %[r]\n\t"
  195313. #endif
  195314. #ifdef WOLFSSL_KEIL
  195315. "adcs r3, r3, %[r]\n\t"
  195316. #elif defined(__clang__)
  195317. "adcs r3, %[r]\n\t"
  195318. #else
  195319. "adc r3, %[r]\n\t"
  195320. #endif
  195321. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195322. "lsrs r6, r7, #16\n\t"
  195323. #else
  195324. "lsr r6, r7, #16\n\t"
  195325. #endif
  195326. #ifdef WOLFSSL_KEIL
  195327. "muls r5, r6, r5\n\t"
  195328. #elif defined(__clang__)
  195329. "muls r5, r6\n\t"
  195330. #else
  195331. "mul r5, r6\n\t"
  195332. #endif
  195333. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195334. "lsrs r6, r5, #16\n\t"
  195335. #else
  195336. "lsr r6, r5, #16\n\t"
  195337. #endif
  195338. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195339. "lsls r5, r5, #16\n\t"
  195340. #else
  195341. "lsl r5, r5, #16\n\t"
  195342. #endif
  195343. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195344. "adds r4, r4, r5\n\t"
  195345. #else
  195346. "add r4, r4, r5\n\t"
  195347. #endif
  195348. #ifdef WOLFSSL_KEIL
  195349. "adcs r2, r2, r6\n\t"
  195350. #elif defined(__clang__)
  195351. "adcs r2, r6\n\t"
  195352. #else
  195353. "adc r2, r6\n\t"
  195354. #endif
  195355. #ifdef WOLFSSL_KEIL
  195356. "adcs r3, r3, %[r]\n\t"
  195357. #elif defined(__clang__)
  195358. "adcs r3, %[r]\n\t"
  195359. #else
  195360. "adc r3, %[r]\n\t"
  195361. #endif
  195362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195363. "adds r4, r4, r5\n\t"
  195364. #else
  195365. "add r4, r4, r5\n\t"
  195366. #endif
  195367. #ifdef WOLFSSL_KEIL
  195368. "adcs r2, r2, r6\n\t"
  195369. #elif defined(__clang__)
  195370. "adcs r2, r6\n\t"
  195371. #else
  195372. "adc r2, r6\n\t"
  195373. #endif
  195374. #ifdef WOLFSSL_KEIL
  195375. "adcs r3, r3, %[r]\n\t"
  195376. #elif defined(__clang__)
  195377. "adcs r3, %[r]\n\t"
  195378. #else
  195379. "adc r3, %[r]\n\t"
  195380. #endif
  195381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195382. "lsrs r5, %[a], #16\n\t"
  195383. #else
  195384. "lsr r5, %[a], #16\n\t"
  195385. #endif
  195386. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195387. "lsrs r6, r7, #16\n\t"
  195388. #else
  195389. "lsr r6, r7, #16\n\t"
  195390. #endif
  195391. #ifdef WOLFSSL_KEIL
  195392. "muls r6, r5, r6\n\t"
  195393. #elif defined(__clang__)
  195394. "muls r6, r5\n\t"
  195395. #else
  195396. "mul r6, r5\n\t"
  195397. #endif
  195398. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195399. "adds r2, r2, r6\n\t"
  195400. #else
  195401. "add r2, r2, r6\n\t"
  195402. #endif
  195403. #ifdef WOLFSSL_KEIL
  195404. "adcs r3, r3, %[r]\n\t"
  195405. #elif defined(__clang__)
  195406. "adcs r3, %[r]\n\t"
  195407. #else
  195408. "adc r3, %[r]\n\t"
  195409. #endif
  195410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195411. "adds r2, r2, r6\n\t"
  195412. #else
  195413. "add r2, r2, r6\n\t"
  195414. #endif
  195415. #ifdef WOLFSSL_KEIL
  195416. "adcs r3, r3, %[r]\n\t"
  195417. #elif defined(__clang__)
  195418. "adcs r3, %[r]\n\t"
  195419. #else
  195420. "adc r3, %[r]\n\t"
  195421. #endif
  195422. "uxth r6, r7\n\t"
  195423. #ifdef WOLFSSL_KEIL
  195424. "muls r5, r6, r5\n\t"
  195425. #elif defined(__clang__)
  195426. "muls r5, r6\n\t"
  195427. #else
  195428. "mul r5, r6\n\t"
  195429. #endif
  195430. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195431. "lsrs r6, r5, #16\n\t"
  195432. #else
  195433. "lsr r6, r5, #16\n\t"
  195434. #endif
  195435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195436. "lsls r5, r5, #16\n\t"
  195437. #else
  195438. "lsl r5, r5, #16\n\t"
  195439. #endif
  195440. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195441. "adds r4, r4, r5\n\t"
  195442. #else
  195443. "add r4, r4, r5\n\t"
  195444. #endif
  195445. #ifdef WOLFSSL_KEIL
  195446. "adcs r2, r2, r6\n\t"
  195447. #elif defined(__clang__)
  195448. "adcs r2, r6\n\t"
  195449. #else
  195450. "adc r2, r6\n\t"
  195451. #endif
  195452. #ifdef WOLFSSL_KEIL
  195453. "adcs r3, r3, %[r]\n\t"
  195454. #elif defined(__clang__)
  195455. "adcs r3, %[r]\n\t"
  195456. #else
  195457. "adc r3, %[r]\n\t"
  195458. #endif
  195459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195460. "adds r4, r4, r5\n\t"
  195461. #else
  195462. "add r4, r4, r5\n\t"
  195463. #endif
  195464. #ifdef WOLFSSL_KEIL
  195465. "adcs r2, r2, r6\n\t"
  195466. #elif defined(__clang__)
  195467. "adcs r2, r6\n\t"
  195468. #else
  195469. "adc r2, r6\n\t"
  195470. #endif
  195471. #ifdef WOLFSSL_KEIL
  195472. "adcs r3, r3, %[r]\n\t"
  195473. #elif defined(__clang__)
  195474. "adcs r3, %[r]\n\t"
  195475. #else
  195476. "adc r3, %[r]\n\t"
  195477. #endif
  195478. "# A[14] * A[12]\n\t"
  195479. "mov %[a], r9\n\t"
  195480. "mov r7, r10\n\t"
  195481. "mov %[a], r12\n\t"
  195482. "uxth r5, %[a]\n\t"
  195483. "uxth r6, r7\n\t"
  195484. #ifdef WOLFSSL_KEIL
  195485. "muls r6, r5, r6\n\t"
  195486. #elif defined(__clang__)
  195487. "muls r6, r5\n\t"
  195488. #else
  195489. "mul r6, r5\n\t"
  195490. #endif
  195491. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195492. "adds r4, r4, r6\n\t"
  195493. #else
  195494. "add r4, r4, r6\n\t"
  195495. #endif
  195496. #ifdef WOLFSSL_KEIL
  195497. "adcs r2, r2, %[r]\n\t"
  195498. #elif defined(__clang__)
  195499. "adcs r2, %[r]\n\t"
  195500. #else
  195501. "adc r2, %[r]\n\t"
  195502. #endif
  195503. #ifdef WOLFSSL_KEIL
  195504. "adcs r3, r3, %[r]\n\t"
  195505. #elif defined(__clang__)
  195506. "adcs r3, %[r]\n\t"
  195507. #else
  195508. "adc r3, %[r]\n\t"
  195509. #endif
  195510. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195511. "adds r4, r4, r6\n\t"
  195512. #else
  195513. "add r4, r4, r6\n\t"
  195514. #endif
  195515. #ifdef WOLFSSL_KEIL
  195516. "adcs r2, r2, %[r]\n\t"
  195517. #elif defined(__clang__)
  195518. "adcs r2, %[r]\n\t"
  195519. #else
  195520. "adc r2, %[r]\n\t"
  195521. #endif
  195522. #ifdef WOLFSSL_KEIL
  195523. "adcs r3, r3, %[r]\n\t"
  195524. #elif defined(__clang__)
  195525. "adcs r3, %[r]\n\t"
  195526. #else
  195527. "adc r3, %[r]\n\t"
  195528. #endif
  195529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195530. "lsrs r6, r7, #16\n\t"
  195531. #else
  195532. "lsr r6, r7, #16\n\t"
  195533. #endif
  195534. #ifdef WOLFSSL_KEIL
  195535. "muls r5, r6, r5\n\t"
  195536. #elif defined(__clang__)
  195537. "muls r5, r6\n\t"
  195538. #else
  195539. "mul r5, r6\n\t"
  195540. #endif
  195541. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195542. "lsrs r6, r5, #16\n\t"
  195543. #else
  195544. "lsr r6, r5, #16\n\t"
  195545. #endif
  195546. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195547. "lsls r5, r5, #16\n\t"
  195548. #else
  195549. "lsl r5, r5, #16\n\t"
  195550. #endif
  195551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195552. "adds r4, r4, r5\n\t"
  195553. #else
  195554. "add r4, r4, r5\n\t"
  195555. #endif
  195556. #ifdef WOLFSSL_KEIL
  195557. "adcs r2, r2, r6\n\t"
  195558. #elif defined(__clang__)
  195559. "adcs r2, r6\n\t"
  195560. #else
  195561. "adc r2, r6\n\t"
  195562. #endif
  195563. #ifdef WOLFSSL_KEIL
  195564. "adcs r3, r3, %[r]\n\t"
  195565. #elif defined(__clang__)
  195566. "adcs r3, %[r]\n\t"
  195567. #else
  195568. "adc r3, %[r]\n\t"
  195569. #endif
  195570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195571. "adds r4, r4, r5\n\t"
  195572. #else
  195573. "add r4, r4, r5\n\t"
  195574. #endif
  195575. #ifdef WOLFSSL_KEIL
  195576. "adcs r2, r2, r6\n\t"
  195577. #elif defined(__clang__)
  195578. "adcs r2, r6\n\t"
  195579. #else
  195580. "adc r2, r6\n\t"
  195581. #endif
  195582. #ifdef WOLFSSL_KEIL
  195583. "adcs r3, r3, %[r]\n\t"
  195584. #elif defined(__clang__)
  195585. "adcs r3, %[r]\n\t"
  195586. #else
  195587. "adc r3, %[r]\n\t"
  195588. #endif
  195589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195590. "lsrs r5, %[a], #16\n\t"
  195591. #else
  195592. "lsr r5, %[a], #16\n\t"
  195593. #endif
  195594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195595. "lsrs r6, r7, #16\n\t"
  195596. #else
  195597. "lsr r6, r7, #16\n\t"
  195598. #endif
  195599. #ifdef WOLFSSL_KEIL
  195600. "muls r6, r5, r6\n\t"
  195601. #elif defined(__clang__)
  195602. "muls r6, r5\n\t"
  195603. #else
  195604. "mul r6, r5\n\t"
  195605. #endif
  195606. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195607. "adds r2, r2, r6\n\t"
  195608. #else
  195609. "add r2, r2, r6\n\t"
  195610. #endif
  195611. #ifdef WOLFSSL_KEIL
  195612. "adcs r3, r3, %[r]\n\t"
  195613. #elif defined(__clang__)
  195614. "adcs r3, %[r]\n\t"
  195615. #else
  195616. "adc r3, %[r]\n\t"
  195617. #endif
  195618. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195619. "adds r2, r2, r6\n\t"
  195620. #else
  195621. "add r2, r2, r6\n\t"
  195622. #endif
  195623. #ifdef WOLFSSL_KEIL
  195624. "adcs r3, r3, %[r]\n\t"
  195625. #elif defined(__clang__)
  195626. "adcs r3, %[r]\n\t"
  195627. #else
  195628. "adc r3, %[r]\n\t"
  195629. #endif
  195630. "uxth r6, r7\n\t"
  195631. #ifdef WOLFSSL_KEIL
  195632. "muls r5, r6, r5\n\t"
  195633. #elif defined(__clang__)
  195634. "muls r5, r6\n\t"
  195635. #else
  195636. "mul r5, r6\n\t"
  195637. #endif
  195638. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195639. "lsrs r6, r5, #16\n\t"
  195640. #else
  195641. "lsr r6, r5, #16\n\t"
  195642. #endif
  195643. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195644. "lsls r5, r5, #16\n\t"
  195645. #else
  195646. "lsl r5, r5, #16\n\t"
  195647. #endif
  195648. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195649. "adds r4, r4, r5\n\t"
  195650. #else
  195651. "add r4, r4, r5\n\t"
  195652. #endif
  195653. #ifdef WOLFSSL_KEIL
  195654. "adcs r2, r2, r6\n\t"
  195655. #elif defined(__clang__)
  195656. "adcs r2, r6\n\t"
  195657. #else
  195658. "adc r2, r6\n\t"
  195659. #endif
  195660. #ifdef WOLFSSL_KEIL
  195661. "adcs r3, r3, %[r]\n\t"
  195662. #elif defined(__clang__)
  195663. "adcs r3, %[r]\n\t"
  195664. #else
  195665. "adc r3, %[r]\n\t"
  195666. #endif
  195667. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195668. "adds r4, r4, r5\n\t"
  195669. #else
  195670. "add r4, r4, r5\n\t"
  195671. #endif
  195672. #ifdef WOLFSSL_KEIL
  195673. "adcs r2, r2, r6\n\t"
  195674. #elif defined(__clang__)
  195675. "adcs r2, r6\n\t"
  195676. #else
  195677. "adc r2, r6\n\t"
  195678. #endif
  195679. #ifdef WOLFSSL_KEIL
  195680. "adcs r3, r3, %[r]\n\t"
  195681. #elif defined(__clang__)
  195682. "adcs r3, %[r]\n\t"
  195683. #else
  195684. "adc r3, %[r]\n\t"
  195685. #endif
  195686. "# A[13] * A[13]\n\t"
  195687. "mov r7, r11\n\t"
  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. "uxth r5, r7\n\t"
  195694. #ifdef WOLFSSL_KEIL
  195695. "muls r5, r5, r5\n\t"
  195696. #elif defined(__clang__)
  195697. "muls r5, r5\n\t"
  195698. #else
  195699. "mul r5, r5\n\t"
  195700. #endif
  195701. #ifdef WOLFSSL_KEIL
  195702. "muls r6, r6, r6\n\t"
  195703. #elif defined(__clang__)
  195704. "muls r6, r6\n\t"
  195705. #else
  195706. "mul r6, r6\n\t"
  195707. #endif
  195708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195709. "adds r4, r4, r5\n\t"
  195710. #else
  195711. "add r4, r4, r5\n\t"
  195712. #endif
  195713. #ifdef WOLFSSL_KEIL
  195714. "adcs r2, r2, r6\n\t"
  195715. #elif defined(__clang__)
  195716. "adcs r2, r6\n\t"
  195717. #else
  195718. "adc r2, r6\n\t"
  195719. #endif
  195720. #ifdef WOLFSSL_KEIL
  195721. "adcs r3, r3, %[r]\n\t"
  195722. #elif defined(__clang__)
  195723. "adcs r3, %[r]\n\t"
  195724. #else
  195725. "adc r3, %[r]\n\t"
  195726. #endif
  195727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195728. "lsrs r6, r7, #16\n\t"
  195729. #else
  195730. "lsr r6, r7, #16\n\t"
  195731. #endif
  195732. "uxth r5, r7\n\t"
  195733. #ifdef WOLFSSL_KEIL
  195734. "muls r5, r6, r5\n\t"
  195735. #elif defined(__clang__)
  195736. "muls r5, r6\n\t"
  195737. #else
  195738. "mul r5, r6\n\t"
  195739. #endif
  195740. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195741. "lsrs r6, r5, #15\n\t"
  195742. #else
  195743. "lsr r6, r5, #15\n\t"
  195744. #endif
  195745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195746. "lsls r5, r5, #17\n\t"
  195747. #else
  195748. "lsl r5, r5, #17\n\t"
  195749. #endif
  195750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195751. "adds r4, r4, r5\n\t"
  195752. #else
  195753. "add r4, r4, r5\n\t"
  195754. #endif
  195755. #ifdef WOLFSSL_KEIL
  195756. "adcs r2, r2, r6\n\t"
  195757. #elif defined(__clang__)
  195758. "adcs r2, r6\n\t"
  195759. #else
  195760. "adc r2, r6\n\t"
  195761. #endif
  195762. #ifdef WOLFSSL_KEIL
  195763. "adcs r3, r3, %[r]\n\t"
  195764. #elif defined(__clang__)
  195765. "adcs r3, %[r]\n\t"
  195766. #else
  195767. "adc r3, %[r]\n\t"
  195768. #endif
  195769. "mov %[r], r8\n\t"
  195770. "str r4, [%[r], #104]\n\t"
  195771. "movs %[r], #0\n\t"
  195772. "# A[14] * A[13]\n\t"
  195773. "movs r4, #0\n\t"
  195774. "mov %[a], r9\n\t"
  195775. "mov %[a], r12\n\t"
  195776. "uxth r5, %[a]\n\t"
  195777. "uxth r6, r7\n\t"
  195778. #ifdef WOLFSSL_KEIL
  195779. "muls r6, r5, r6\n\t"
  195780. #elif defined(__clang__)
  195781. "muls r6, r5\n\t"
  195782. #else
  195783. "mul r6, r5\n\t"
  195784. #endif
  195785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195786. "adds r2, r2, r6\n\t"
  195787. #else
  195788. "add r2, r2, r6\n\t"
  195789. #endif
  195790. #ifdef WOLFSSL_KEIL
  195791. "adcs r3, r3, %[r]\n\t"
  195792. #elif defined(__clang__)
  195793. "adcs r3, %[r]\n\t"
  195794. #else
  195795. "adc r3, %[r]\n\t"
  195796. #endif
  195797. #ifdef WOLFSSL_KEIL
  195798. "adcs r4, r4, %[r]\n\t"
  195799. #elif defined(__clang__)
  195800. "adcs r4, %[r]\n\t"
  195801. #else
  195802. "adc r4, %[r]\n\t"
  195803. #endif
  195804. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195805. "adds r2, r2, r6\n\t"
  195806. #else
  195807. "add r2, r2, r6\n\t"
  195808. #endif
  195809. #ifdef WOLFSSL_KEIL
  195810. "adcs r3, r3, %[r]\n\t"
  195811. #elif defined(__clang__)
  195812. "adcs r3, %[r]\n\t"
  195813. #else
  195814. "adc r3, %[r]\n\t"
  195815. #endif
  195816. #ifdef WOLFSSL_KEIL
  195817. "adcs r4, r4, %[r]\n\t"
  195818. #elif defined(__clang__)
  195819. "adcs r4, %[r]\n\t"
  195820. #else
  195821. "adc r4, %[r]\n\t"
  195822. #endif
  195823. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195824. "lsrs r6, r7, #16\n\t"
  195825. #else
  195826. "lsr r6, r7, #16\n\t"
  195827. #endif
  195828. #ifdef WOLFSSL_KEIL
  195829. "muls r5, r6, r5\n\t"
  195830. #elif defined(__clang__)
  195831. "muls r5, r6\n\t"
  195832. #else
  195833. "mul r5, r6\n\t"
  195834. #endif
  195835. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195836. "lsrs r6, r5, #16\n\t"
  195837. #else
  195838. "lsr r6, r5, #16\n\t"
  195839. #endif
  195840. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195841. "lsls r5, r5, #16\n\t"
  195842. #else
  195843. "lsl r5, r5, #16\n\t"
  195844. #endif
  195845. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195846. "adds r2, r2, r5\n\t"
  195847. #else
  195848. "add r2, r2, r5\n\t"
  195849. #endif
  195850. #ifdef WOLFSSL_KEIL
  195851. "adcs r3, r3, r6\n\t"
  195852. #elif defined(__clang__)
  195853. "adcs r3, r6\n\t"
  195854. #else
  195855. "adc r3, r6\n\t"
  195856. #endif
  195857. #ifdef WOLFSSL_KEIL
  195858. "adcs r4, r4, %[r]\n\t"
  195859. #elif defined(__clang__)
  195860. "adcs r4, %[r]\n\t"
  195861. #else
  195862. "adc r4, %[r]\n\t"
  195863. #endif
  195864. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195865. "adds r2, r2, r5\n\t"
  195866. #else
  195867. "add r2, r2, r5\n\t"
  195868. #endif
  195869. #ifdef WOLFSSL_KEIL
  195870. "adcs r3, r3, r6\n\t"
  195871. #elif defined(__clang__)
  195872. "adcs r3, r6\n\t"
  195873. #else
  195874. "adc r3, r6\n\t"
  195875. #endif
  195876. #ifdef WOLFSSL_KEIL
  195877. "adcs r4, r4, %[r]\n\t"
  195878. #elif defined(__clang__)
  195879. "adcs r4, %[r]\n\t"
  195880. #else
  195881. "adc r4, %[r]\n\t"
  195882. #endif
  195883. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195884. "lsrs r5, %[a], #16\n\t"
  195885. #else
  195886. "lsr r5, %[a], #16\n\t"
  195887. #endif
  195888. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195889. "lsrs r6, r7, #16\n\t"
  195890. #else
  195891. "lsr r6, r7, #16\n\t"
  195892. #endif
  195893. #ifdef WOLFSSL_KEIL
  195894. "muls r6, r5, r6\n\t"
  195895. #elif defined(__clang__)
  195896. "muls r6, r5\n\t"
  195897. #else
  195898. "mul r6, r5\n\t"
  195899. #endif
  195900. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195901. "adds r3, r3, r6\n\t"
  195902. #else
  195903. "add r3, r3, r6\n\t"
  195904. #endif
  195905. #ifdef WOLFSSL_KEIL
  195906. "adcs r4, r4, %[r]\n\t"
  195907. #elif defined(__clang__)
  195908. "adcs r4, %[r]\n\t"
  195909. #else
  195910. "adc r4, %[r]\n\t"
  195911. #endif
  195912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195913. "adds r3, r3, r6\n\t"
  195914. #else
  195915. "add r3, r3, r6\n\t"
  195916. #endif
  195917. #ifdef WOLFSSL_KEIL
  195918. "adcs r4, r4, %[r]\n\t"
  195919. #elif defined(__clang__)
  195920. "adcs r4, %[r]\n\t"
  195921. #else
  195922. "adc r4, %[r]\n\t"
  195923. #endif
  195924. "uxth r6, r7\n\t"
  195925. #ifdef WOLFSSL_KEIL
  195926. "muls r5, r6, r5\n\t"
  195927. #elif defined(__clang__)
  195928. "muls r5, r6\n\t"
  195929. #else
  195930. "mul r5, r6\n\t"
  195931. #endif
  195932. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195933. "lsrs r6, r5, #16\n\t"
  195934. #else
  195935. "lsr r6, r5, #16\n\t"
  195936. #endif
  195937. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195938. "lsls r5, r5, #16\n\t"
  195939. #else
  195940. "lsl r5, r5, #16\n\t"
  195941. #endif
  195942. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195943. "adds r2, r2, r5\n\t"
  195944. #else
  195945. "add r2, r2, r5\n\t"
  195946. #endif
  195947. #ifdef WOLFSSL_KEIL
  195948. "adcs r3, r3, r6\n\t"
  195949. #elif defined(__clang__)
  195950. "adcs r3, r6\n\t"
  195951. #else
  195952. "adc r3, r6\n\t"
  195953. #endif
  195954. #ifdef WOLFSSL_KEIL
  195955. "adcs r4, r4, %[r]\n\t"
  195956. #elif defined(__clang__)
  195957. "adcs r4, %[r]\n\t"
  195958. #else
  195959. "adc r4, %[r]\n\t"
  195960. #endif
  195961. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195962. "adds r2, r2, r5\n\t"
  195963. #else
  195964. "add r2, r2, r5\n\t"
  195965. #endif
  195966. #ifdef WOLFSSL_KEIL
  195967. "adcs r3, r3, r6\n\t"
  195968. #elif defined(__clang__)
  195969. "adcs r3, r6\n\t"
  195970. #else
  195971. "adc r3, r6\n\t"
  195972. #endif
  195973. #ifdef WOLFSSL_KEIL
  195974. "adcs r4, r4, %[r]\n\t"
  195975. #elif defined(__clang__)
  195976. "adcs r4, %[r]\n\t"
  195977. #else
  195978. "adc r4, %[r]\n\t"
  195979. #endif
  195980. "# A[15] * A[12]\n\t"
  195981. "mov %[a], r9\n\t"
  195982. "mov r7, r10\n\t"
  195983. "mov %[a], lr\n\t"
  195984. "uxth r5, %[a]\n\t"
  195985. "uxth r6, r7\n\t"
  195986. #ifdef WOLFSSL_KEIL
  195987. "muls r6, r5, r6\n\t"
  195988. #elif defined(__clang__)
  195989. "muls r6, r5\n\t"
  195990. #else
  195991. "mul r6, r5\n\t"
  195992. #endif
  195993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  195994. "adds r2, r2, r6\n\t"
  195995. #else
  195996. "add r2, r2, r6\n\t"
  195997. #endif
  195998. #ifdef WOLFSSL_KEIL
  195999. "adcs r3, r3, %[r]\n\t"
  196000. #elif defined(__clang__)
  196001. "adcs r3, %[r]\n\t"
  196002. #else
  196003. "adc r3, %[r]\n\t"
  196004. #endif
  196005. #ifdef WOLFSSL_KEIL
  196006. "adcs r4, r4, %[r]\n\t"
  196007. #elif defined(__clang__)
  196008. "adcs r4, %[r]\n\t"
  196009. #else
  196010. "adc r4, %[r]\n\t"
  196011. #endif
  196012. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196013. "adds r2, r2, r6\n\t"
  196014. #else
  196015. "add r2, r2, r6\n\t"
  196016. #endif
  196017. #ifdef WOLFSSL_KEIL
  196018. "adcs r3, r3, %[r]\n\t"
  196019. #elif defined(__clang__)
  196020. "adcs r3, %[r]\n\t"
  196021. #else
  196022. "adc r3, %[r]\n\t"
  196023. #endif
  196024. #ifdef WOLFSSL_KEIL
  196025. "adcs r4, r4, %[r]\n\t"
  196026. #elif defined(__clang__)
  196027. "adcs r4, %[r]\n\t"
  196028. #else
  196029. "adc r4, %[r]\n\t"
  196030. #endif
  196031. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196032. "lsrs r6, r7, #16\n\t"
  196033. #else
  196034. "lsr r6, r7, #16\n\t"
  196035. #endif
  196036. #ifdef WOLFSSL_KEIL
  196037. "muls r5, r6, r5\n\t"
  196038. #elif defined(__clang__)
  196039. "muls r5, r6\n\t"
  196040. #else
  196041. "mul r5, r6\n\t"
  196042. #endif
  196043. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196044. "lsrs r6, r5, #16\n\t"
  196045. #else
  196046. "lsr r6, r5, #16\n\t"
  196047. #endif
  196048. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196049. "lsls r5, r5, #16\n\t"
  196050. #else
  196051. "lsl r5, r5, #16\n\t"
  196052. #endif
  196053. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196054. "adds r2, r2, r5\n\t"
  196055. #else
  196056. "add r2, r2, r5\n\t"
  196057. #endif
  196058. #ifdef WOLFSSL_KEIL
  196059. "adcs r3, r3, r6\n\t"
  196060. #elif defined(__clang__)
  196061. "adcs r3, r6\n\t"
  196062. #else
  196063. "adc r3, r6\n\t"
  196064. #endif
  196065. #ifdef WOLFSSL_KEIL
  196066. "adcs r4, r4, %[r]\n\t"
  196067. #elif defined(__clang__)
  196068. "adcs r4, %[r]\n\t"
  196069. #else
  196070. "adc r4, %[r]\n\t"
  196071. #endif
  196072. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196073. "adds r2, r2, r5\n\t"
  196074. #else
  196075. "add r2, r2, r5\n\t"
  196076. #endif
  196077. #ifdef WOLFSSL_KEIL
  196078. "adcs r3, r3, r6\n\t"
  196079. #elif defined(__clang__)
  196080. "adcs r3, r6\n\t"
  196081. #else
  196082. "adc r3, r6\n\t"
  196083. #endif
  196084. #ifdef WOLFSSL_KEIL
  196085. "adcs r4, r4, %[r]\n\t"
  196086. #elif defined(__clang__)
  196087. "adcs r4, %[r]\n\t"
  196088. #else
  196089. "adc r4, %[r]\n\t"
  196090. #endif
  196091. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196092. "lsrs r5, %[a], #16\n\t"
  196093. #else
  196094. "lsr r5, %[a], #16\n\t"
  196095. #endif
  196096. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196097. "lsrs r6, r7, #16\n\t"
  196098. #else
  196099. "lsr r6, r7, #16\n\t"
  196100. #endif
  196101. #ifdef WOLFSSL_KEIL
  196102. "muls r6, r5, r6\n\t"
  196103. #elif defined(__clang__)
  196104. "muls r6, r5\n\t"
  196105. #else
  196106. "mul r6, r5\n\t"
  196107. #endif
  196108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196109. "adds r3, r3, r6\n\t"
  196110. #else
  196111. "add r3, r3, r6\n\t"
  196112. #endif
  196113. #ifdef WOLFSSL_KEIL
  196114. "adcs r4, r4, %[r]\n\t"
  196115. #elif defined(__clang__)
  196116. "adcs r4, %[r]\n\t"
  196117. #else
  196118. "adc r4, %[r]\n\t"
  196119. #endif
  196120. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196121. "adds r3, r3, r6\n\t"
  196122. #else
  196123. "add r3, r3, r6\n\t"
  196124. #endif
  196125. #ifdef WOLFSSL_KEIL
  196126. "adcs r4, r4, %[r]\n\t"
  196127. #elif defined(__clang__)
  196128. "adcs r4, %[r]\n\t"
  196129. #else
  196130. "adc r4, %[r]\n\t"
  196131. #endif
  196132. "uxth r6, r7\n\t"
  196133. #ifdef WOLFSSL_KEIL
  196134. "muls r5, r6, r5\n\t"
  196135. #elif defined(__clang__)
  196136. "muls r5, r6\n\t"
  196137. #else
  196138. "mul r5, r6\n\t"
  196139. #endif
  196140. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196141. "lsrs r6, r5, #16\n\t"
  196142. #else
  196143. "lsr r6, r5, #16\n\t"
  196144. #endif
  196145. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196146. "lsls r5, r5, #16\n\t"
  196147. #else
  196148. "lsl r5, r5, #16\n\t"
  196149. #endif
  196150. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196151. "adds r2, r2, r5\n\t"
  196152. #else
  196153. "add r2, r2, r5\n\t"
  196154. #endif
  196155. #ifdef WOLFSSL_KEIL
  196156. "adcs r3, r3, r6\n\t"
  196157. #elif defined(__clang__)
  196158. "adcs r3, r6\n\t"
  196159. #else
  196160. "adc r3, r6\n\t"
  196161. #endif
  196162. #ifdef WOLFSSL_KEIL
  196163. "adcs r4, r4, %[r]\n\t"
  196164. #elif defined(__clang__)
  196165. "adcs r4, %[r]\n\t"
  196166. #else
  196167. "adc r4, %[r]\n\t"
  196168. #endif
  196169. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196170. "adds r2, r2, r5\n\t"
  196171. #else
  196172. "add r2, r2, r5\n\t"
  196173. #endif
  196174. #ifdef WOLFSSL_KEIL
  196175. "adcs r3, r3, r6\n\t"
  196176. #elif defined(__clang__)
  196177. "adcs r3, r6\n\t"
  196178. #else
  196179. "adc r3, r6\n\t"
  196180. #endif
  196181. #ifdef WOLFSSL_KEIL
  196182. "adcs r4, r4, %[r]\n\t"
  196183. #elif defined(__clang__)
  196184. "adcs r4, %[r]\n\t"
  196185. #else
  196186. "adc r4, %[r]\n\t"
  196187. #endif
  196188. "mov %[r], r8\n\t"
  196189. "str r2, [%[r], #108]\n\t"
  196190. "movs %[r], #0\n\t"
  196191. "# A[15] * A[13]\n\t"
  196192. "movs r2, #0\n\t"
  196193. "mov %[a], r9\n\t"
  196194. "mov r7, r11\n\t"
  196195. "mov %[a], lr\n\t"
  196196. "uxth r5, %[a]\n\t"
  196197. "uxth r6, r7\n\t"
  196198. #ifdef WOLFSSL_KEIL
  196199. "muls r6, r5, r6\n\t"
  196200. #elif defined(__clang__)
  196201. "muls r6, r5\n\t"
  196202. #else
  196203. "mul r6, r5\n\t"
  196204. #endif
  196205. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196206. "adds r3, r3, r6\n\t"
  196207. #else
  196208. "add r3, r3, r6\n\t"
  196209. #endif
  196210. #ifdef WOLFSSL_KEIL
  196211. "adcs r4, r4, %[r]\n\t"
  196212. #elif defined(__clang__)
  196213. "adcs r4, %[r]\n\t"
  196214. #else
  196215. "adc r4, %[r]\n\t"
  196216. #endif
  196217. #ifdef WOLFSSL_KEIL
  196218. "adcs r2, r2, %[r]\n\t"
  196219. #elif defined(__clang__)
  196220. "adcs r2, %[r]\n\t"
  196221. #else
  196222. "adc r2, %[r]\n\t"
  196223. #endif
  196224. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196225. "adds r3, r3, r6\n\t"
  196226. #else
  196227. "add r3, r3, r6\n\t"
  196228. #endif
  196229. #ifdef WOLFSSL_KEIL
  196230. "adcs r4, r4, %[r]\n\t"
  196231. #elif defined(__clang__)
  196232. "adcs r4, %[r]\n\t"
  196233. #else
  196234. "adc r4, %[r]\n\t"
  196235. #endif
  196236. #ifdef WOLFSSL_KEIL
  196237. "adcs r2, r2, %[r]\n\t"
  196238. #elif defined(__clang__)
  196239. "adcs r2, %[r]\n\t"
  196240. #else
  196241. "adc r2, %[r]\n\t"
  196242. #endif
  196243. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196244. "lsrs r6, r7, #16\n\t"
  196245. #else
  196246. "lsr r6, r7, #16\n\t"
  196247. #endif
  196248. #ifdef WOLFSSL_KEIL
  196249. "muls r5, r6, r5\n\t"
  196250. #elif defined(__clang__)
  196251. "muls r5, r6\n\t"
  196252. #else
  196253. "mul r5, r6\n\t"
  196254. #endif
  196255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196256. "lsrs r6, r5, #16\n\t"
  196257. #else
  196258. "lsr r6, r5, #16\n\t"
  196259. #endif
  196260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196261. "lsls r5, r5, #16\n\t"
  196262. #else
  196263. "lsl r5, r5, #16\n\t"
  196264. #endif
  196265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196266. "adds r3, r3, r5\n\t"
  196267. #else
  196268. "add r3, r3, r5\n\t"
  196269. #endif
  196270. #ifdef WOLFSSL_KEIL
  196271. "adcs r4, r4, r6\n\t"
  196272. #elif defined(__clang__)
  196273. "adcs r4, r6\n\t"
  196274. #else
  196275. "adc r4, r6\n\t"
  196276. #endif
  196277. #ifdef WOLFSSL_KEIL
  196278. "adcs r2, r2, %[r]\n\t"
  196279. #elif defined(__clang__)
  196280. "adcs r2, %[r]\n\t"
  196281. #else
  196282. "adc r2, %[r]\n\t"
  196283. #endif
  196284. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196285. "adds r3, r3, r5\n\t"
  196286. #else
  196287. "add r3, r3, r5\n\t"
  196288. #endif
  196289. #ifdef WOLFSSL_KEIL
  196290. "adcs r4, r4, r6\n\t"
  196291. #elif defined(__clang__)
  196292. "adcs r4, r6\n\t"
  196293. #else
  196294. "adc r4, r6\n\t"
  196295. #endif
  196296. #ifdef WOLFSSL_KEIL
  196297. "adcs r2, r2, %[r]\n\t"
  196298. #elif defined(__clang__)
  196299. "adcs r2, %[r]\n\t"
  196300. #else
  196301. "adc r2, %[r]\n\t"
  196302. #endif
  196303. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196304. "lsrs r5, %[a], #16\n\t"
  196305. #else
  196306. "lsr r5, %[a], #16\n\t"
  196307. #endif
  196308. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196309. "lsrs r6, r7, #16\n\t"
  196310. #else
  196311. "lsr r6, r7, #16\n\t"
  196312. #endif
  196313. #ifdef WOLFSSL_KEIL
  196314. "muls r6, r5, r6\n\t"
  196315. #elif defined(__clang__)
  196316. "muls r6, r5\n\t"
  196317. #else
  196318. "mul r6, r5\n\t"
  196319. #endif
  196320. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196321. "adds r4, r4, r6\n\t"
  196322. #else
  196323. "add r4, r4, r6\n\t"
  196324. #endif
  196325. #ifdef WOLFSSL_KEIL
  196326. "adcs r2, r2, %[r]\n\t"
  196327. #elif defined(__clang__)
  196328. "adcs r2, %[r]\n\t"
  196329. #else
  196330. "adc r2, %[r]\n\t"
  196331. #endif
  196332. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196333. "adds r4, r4, r6\n\t"
  196334. #else
  196335. "add r4, r4, r6\n\t"
  196336. #endif
  196337. #ifdef WOLFSSL_KEIL
  196338. "adcs r2, r2, %[r]\n\t"
  196339. #elif defined(__clang__)
  196340. "adcs r2, %[r]\n\t"
  196341. #else
  196342. "adc r2, %[r]\n\t"
  196343. #endif
  196344. "uxth r6, r7\n\t"
  196345. #ifdef WOLFSSL_KEIL
  196346. "muls r5, r6, r5\n\t"
  196347. #elif defined(__clang__)
  196348. "muls r5, r6\n\t"
  196349. #else
  196350. "mul r5, r6\n\t"
  196351. #endif
  196352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196353. "lsrs r6, r5, #16\n\t"
  196354. #else
  196355. "lsr r6, r5, #16\n\t"
  196356. #endif
  196357. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196358. "lsls r5, r5, #16\n\t"
  196359. #else
  196360. "lsl r5, r5, #16\n\t"
  196361. #endif
  196362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196363. "adds r3, r3, r5\n\t"
  196364. #else
  196365. "add r3, r3, r5\n\t"
  196366. #endif
  196367. #ifdef WOLFSSL_KEIL
  196368. "adcs r4, r4, r6\n\t"
  196369. #elif defined(__clang__)
  196370. "adcs r4, r6\n\t"
  196371. #else
  196372. "adc r4, r6\n\t"
  196373. #endif
  196374. #ifdef WOLFSSL_KEIL
  196375. "adcs r2, r2, %[r]\n\t"
  196376. #elif defined(__clang__)
  196377. "adcs r2, %[r]\n\t"
  196378. #else
  196379. "adc r2, %[r]\n\t"
  196380. #endif
  196381. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196382. "adds r3, r3, r5\n\t"
  196383. #else
  196384. "add r3, r3, r5\n\t"
  196385. #endif
  196386. #ifdef WOLFSSL_KEIL
  196387. "adcs r4, r4, r6\n\t"
  196388. #elif defined(__clang__)
  196389. "adcs r4, r6\n\t"
  196390. #else
  196391. "adc r4, r6\n\t"
  196392. #endif
  196393. #ifdef WOLFSSL_KEIL
  196394. "adcs r2, r2, %[r]\n\t"
  196395. #elif defined(__clang__)
  196396. "adcs r2, %[r]\n\t"
  196397. #else
  196398. "adc r2, %[r]\n\t"
  196399. #endif
  196400. "# A[14] * A[14]\n\t"
  196401. "mov r7, r12\n\t"
  196402. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196403. "lsrs r6, r7, #16\n\t"
  196404. #else
  196405. "lsr r6, r7, #16\n\t"
  196406. #endif
  196407. "uxth r5, r7\n\t"
  196408. #ifdef WOLFSSL_KEIL
  196409. "muls r5, r5, r5\n\t"
  196410. #elif defined(__clang__)
  196411. "muls r5, r5\n\t"
  196412. #else
  196413. "mul r5, r5\n\t"
  196414. #endif
  196415. #ifdef WOLFSSL_KEIL
  196416. "muls r6, r6, r6\n\t"
  196417. #elif defined(__clang__)
  196418. "muls r6, r6\n\t"
  196419. #else
  196420. "mul r6, r6\n\t"
  196421. #endif
  196422. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196423. "adds r3, r3, r5\n\t"
  196424. #else
  196425. "add r3, r3, r5\n\t"
  196426. #endif
  196427. #ifdef WOLFSSL_KEIL
  196428. "adcs r4, r4, r6\n\t"
  196429. #elif defined(__clang__)
  196430. "adcs r4, r6\n\t"
  196431. #else
  196432. "adc r4, r6\n\t"
  196433. #endif
  196434. #ifdef WOLFSSL_KEIL
  196435. "adcs r2, r2, %[r]\n\t"
  196436. #elif defined(__clang__)
  196437. "adcs r2, %[r]\n\t"
  196438. #else
  196439. "adc r2, %[r]\n\t"
  196440. #endif
  196441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196442. "lsrs r6, r7, #16\n\t"
  196443. #else
  196444. "lsr r6, r7, #16\n\t"
  196445. #endif
  196446. "uxth r5, r7\n\t"
  196447. #ifdef WOLFSSL_KEIL
  196448. "muls r5, r6, r5\n\t"
  196449. #elif defined(__clang__)
  196450. "muls r5, r6\n\t"
  196451. #else
  196452. "mul r5, r6\n\t"
  196453. #endif
  196454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196455. "lsrs r6, r5, #15\n\t"
  196456. #else
  196457. "lsr r6, r5, #15\n\t"
  196458. #endif
  196459. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196460. "lsls r5, r5, #17\n\t"
  196461. #else
  196462. "lsl r5, r5, #17\n\t"
  196463. #endif
  196464. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196465. "adds r3, r3, r5\n\t"
  196466. #else
  196467. "add r3, r3, r5\n\t"
  196468. #endif
  196469. #ifdef WOLFSSL_KEIL
  196470. "adcs r4, r4, r6\n\t"
  196471. #elif defined(__clang__)
  196472. "adcs r4, r6\n\t"
  196473. #else
  196474. "adc r4, r6\n\t"
  196475. #endif
  196476. #ifdef WOLFSSL_KEIL
  196477. "adcs r2, r2, %[r]\n\t"
  196478. #elif defined(__clang__)
  196479. "adcs r2, %[r]\n\t"
  196480. #else
  196481. "adc r2, %[r]\n\t"
  196482. #endif
  196483. "mov %[r], r8\n\t"
  196484. "str r3, [%[r], #112]\n\t"
  196485. "movs %[r], #0\n\t"
  196486. "# A[15] * A[14]\n\t"
  196487. "movs r3, #0\n\t"
  196488. "mov %[a], r9\n\t"
  196489. "mov %[a], lr\n\t"
  196490. "uxth r5, %[a]\n\t"
  196491. "uxth r6, r7\n\t"
  196492. #ifdef WOLFSSL_KEIL
  196493. "muls r6, r5, r6\n\t"
  196494. #elif defined(__clang__)
  196495. "muls r6, r5\n\t"
  196496. #else
  196497. "mul r6, r5\n\t"
  196498. #endif
  196499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196500. "adds r4, r4, r6\n\t"
  196501. #else
  196502. "add r4, r4, r6\n\t"
  196503. #endif
  196504. #ifdef WOLFSSL_KEIL
  196505. "adcs r2, r2, %[r]\n\t"
  196506. #elif defined(__clang__)
  196507. "adcs r2, %[r]\n\t"
  196508. #else
  196509. "adc r2, %[r]\n\t"
  196510. #endif
  196511. #ifdef WOLFSSL_KEIL
  196512. "adcs r3, r3, %[r]\n\t"
  196513. #elif defined(__clang__)
  196514. "adcs r3, %[r]\n\t"
  196515. #else
  196516. "adc r3, %[r]\n\t"
  196517. #endif
  196518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196519. "adds r4, r4, r6\n\t"
  196520. #else
  196521. "add r4, r4, r6\n\t"
  196522. #endif
  196523. #ifdef WOLFSSL_KEIL
  196524. "adcs r2, r2, %[r]\n\t"
  196525. #elif defined(__clang__)
  196526. "adcs r2, %[r]\n\t"
  196527. #else
  196528. "adc r2, %[r]\n\t"
  196529. #endif
  196530. #ifdef WOLFSSL_KEIL
  196531. "adcs r3, r3, %[r]\n\t"
  196532. #elif defined(__clang__)
  196533. "adcs r3, %[r]\n\t"
  196534. #else
  196535. "adc r3, %[r]\n\t"
  196536. #endif
  196537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196538. "lsrs r6, r7, #16\n\t"
  196539. #else
  196540. "lsr r6, r7, #16\n\t"
  196541. #endif
  196542. #ifdef WOLFSSL_KEIL
  196543. "muls r5, r6, r5\n\t"
  196544. #elif defined(__clang__)
  196545. "muls r5, r6\n\t"
  196546. #else
  196547. "mul r5, r6\n\t"
  196548. #endif
  196549. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196550. "lsrs r6, r5, #16\n\t"
  196551. #else
  196552. "lsr r6, r5, #16\n\t"
  196553. #endif
  196554. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196555. "lsls r5, r5, #16\n\t"
  196556. #else
  196557. "lsl r5, r5, #16\n\t"
  196558. #endif
  196559. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196560. "adds r4, r4, r5\n\t"
  196561. #else
  196562. "add r4, r4, r5\n\t"
  196563. #endif
  196564. #ifdef WOLFSSL_KEIL
  196565. "adcs r2, r2, r6\n\t"
  196566. #elif defined(__clang__)
  196567. "adcs r2, r6\n\t"
  196568. #else
  196569. "adc r2, r6\n\t"
  196570. #endif
  196571. #ifdef WOLFSSL_KEIL
  196572. "adcs r3, r3, %[r]\n\t"
  196573. #elif defined(__clang__)
  196574. "adcs r3, %[r]\n\t"
  196575. #else
  196576. "adc r3, %[r]\n\t"
  196577. #endif
  196578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196579. "adds r4, r4, r5\n\t"
  196580. #else
  196581. "add r4, r4, r5\n\t"
  196582. #endif
  196583. #ifdef WOLFSSL_KEIL
  196584. "adcs r2, r2, r6\n\t"
  196585. #elif defined(__clang__)
  196586. "adcs r2, r6\n\t"
  196587. #else
  196588. "adc r2, r6\n\t"
  196589. #endif
  196590. #ifdef WOLFSSL_KEIL
  196591. "adcs r3, r3, %[r]\n\t"
  196592. #elif defined(__clang__)
  196593. "adcs r3, %[r]\n\t"
  196594. #else
  196595. "adc r3, %[r]\n\t"
  196596. #endif
  196597. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196598. "lsrs r5, %[a], #16\n\t"
  196599. #else
  196600. "lsr r5, %[a], #16\n\t"
  196601. #endif
  196602. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196603. "lsrs r6, r7, #16\n\t"
  196604. #else
  196605. "lsr r6, r7, #16\n\t"
  196606. #endif
  196607. #ifdef WOLFSSL_KEIL
  196608. "muls r6, r5, r6\n\t"
  196609. #elif defined(__clang__)
  196610. "muls r6, r5\n\t"
  196611. #else
  196612. "mul r6, r5\n\t"
  196613. #endif
  196614. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196615. "adds r2, r2, r6\n\t"
  196616. #else
  196617. "add r2, r2, r6\n\t"
  196618. #endif
  196619. #ifdef WOLFSSL_KEIL
  196620. "adcs r3, r3, %[r]\n\t"
  196621. #elif defined(__clang__)
  196622. "adcs r3, %[r]\n\t"
  196623. #else
  196624. "adc r3, %[r]\n\t"
  196625. #endif
  196626. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196627. "adds r2, r2, r6\n\t"
  196628. #else
  196629. "add r2, r2, r6\n\t"
  196630. #endif
  196631. #ifdef WOLFSSL_KEIL
  196632. "adcs r3, r3, %[r]\n\t"
  196633. #elif defined(__clang__)
  196634. "adcs r3, %[r]\n\t"
  196635. #else
  196636. "adc r3, %[r]\n\t"
  196637. #endif
  196638. "uxth r6, r7\n\t"
  196639. #ifdef WOLFSSL_KEIL
  196640. "muls r5, r6, r5\n\t"
  196641. #elif defined(__clang__)
  196642. "muls r5, r6\n\t"
  196643. #else
  196644. "mul r5, r6\n\t"
  196645. #endif
  196646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196647. "lsrs r6, r5, #16\n\t"
  196648. #else
  196649. "lsr r6, r5, #16\n\t"
  196650. #endif
  196651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196652. "lsls r5, r5, #16\n\t"
  196653. #else
  196654. "lsl r5, r5, #16\n\t"
  196655. #endif
  196656. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196657. "adds r4, r4, r5\n\t"
  196658. #else
  196659. "add r4, r4, r5\n\t"
  196660. #endif
  196661. #ifdef WOLFSSL_KEIL
  196662. "adcs r2, r2, r6\n\t"
  196663. #elif defined(__clang__)
  196664. "adcs r2, r6\n\t"
  196665. #else
  196666. "adc r2, r6\n\t"
  196667. #endif
  196668. #ifdef WOLFSSL_KEIL
  196669. "adcs r3, r3, %[r]\n\t"
  196670. #elif defined(__clang__)
  196671. "adcs r3, %[r]\n\t"
  196672. #else
  196673. "adc r3, %[r]\n\t"
  196674. #endif
  196675. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196676. "adds r4, r4, r5\n\t"
  196677. #else
  196678. "add r4, r4, r5\n\t"
  196679. #endif
  196680. #ifdef WOLFSSL_KEIL
  196681. "adcs r2, r2, r6\n\t"
  196682. #elif defined(__clang__)
  196683. "adcs r2, r6\n\t"
  196684. #else
  196685. "adc r2, r6\n\t"
  196686. #endif
  196687. #ifdef WOLFSSL_KEIL
  196688. "adcs r3, r3, %[r]\n\t"
  196689. #elif defined(__clang__)
  196690. "adcs r3, %[r]\n\t"
  196691. #else
  196692. "adc r3, %[r]\n\t"
  196693. #endif
  196694. "mov %[r], r8\n\t"
  196695. "str r4, [%[r], #116]\n\t"
  196696. "movs %[r], #0\n\t"
  196697. "# A[15] * A[15]\n\t"
  196698. "mov %[a], r9\n\t"
  196699. "mov r7, lr\n\t"
  196700. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196701. "lsrs r6, r7, #16\n\t"
  196702. #else
  196703. "lsr r6, r7, #16\n\t"
  196704. #endif
  196705. "uxth r5, r7\n\t"
  196706. #ifdef WOLFSSL_KEIL
  196707. "muls r5, r5, r5\n\t"
  196708. #elif defined(__clang__)
  196709. "muls r5, r5\n\t"
  196710. #else
  196711. "mul r5, r5\n\t"
  196712. #endif
  196713. #ifdef WOLFSSL_KEIL
  196714. "muls r6, r6, r6\n\t"
  196715. #elif defined(__clang__)
  196716. "muls r6, r6\n\t"
  196717. #else
  196718. "mul r6, r6\n\t"
  196719. #endif
  196720. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196721. "adds r2, r2, r5\n\t"
  196722. #else
  196723. "add r2, r2, r5\n\t"
  196724. #endif
  196725. #ifdef WOLFSSL_KEIL
  196726. "adcs r3, r3, r6\n\t"
  196727. #elif defined(__clang__)
  196728. "adcs r3, r6\n\t"
  196729. #else
  196730. "adc r3, r6\n\t"
  196731. #endif
  196732. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196733. "lsrs r6, r7, #16\n\t"
  196734. #else
  196735. "lsr r6, r7, #16\n\t"
  196736. #endif
  196737. "uxth r5, r7\n\t"
  196738. #ifdef WOLFSSL_KEIL
  196739. "muls r5, r6, r5\n\t"
  196740. #elif defined(__clang__)
  196741. "muls r5, r6\n\t"
  196742. #else
  196743. "mul r5, r6\n\t"
  196744. #endif
  196745. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196746. "lsrs r6, r5, #15\n\t"
  196747. #else
  196748. "lsr r6, r5, #15\n\t"
  196749. #endif
  196750. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196751. "lsls r5, r5, #17\n\t"
  196752. #else
  196753. "lsl r5, r5, #17\n\t"
  196754. #endif
  196755. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196756. "adds r2, r2, r5\n\t"
  196757. #else
  196758. "add r2, r2, r5\n\t"
  196759. #endif
  196760. #ifdef WOLFSSL_KEIL
  196761. "adcs r3, r3, r6\n\t"
  196762. #elif defined(__clang__)
  196763. "adcs r3, r6\n\t"
  196764. #else
  196765. "adc r3, r6\n\t"
  196766. #endif
  196767. "mov %[r], r8\n\t"
  196768. "str r2, [%[r], #120]\n\t"
  196769. "str r3, [%[r], #124]\n\t"
  196770. "pop {r2, r3, r4, r5}\n\t"
  196771. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  196772. "pop {r2, r3, r4, r5}\n\t"
  196773. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  196774. "pop {r2, r3, r4, r5}\n\t"
  196775. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  196776. "pop {r2, r3, r4, r5}\n\t"
  196777. "stm %[r]!, {r2, r3, r4, r5}\n\t"
  196778. : [r] "+l" (r), [a] "+l" (a)
  196779. :
  196780. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  196781. );
  196782. }
  196783. #endif /* !WOLFSSL_SP_LARGE_CODE */
  196784. /* Add b to a into r. (r = a + b)
  196785. *
  196786. * r A single precision integer.
  196787. * a A single precision integer.
  196788. * b A single precision integer.
  196789. */
  196790. SP_NOINLINE static sp_digit sp_1024_add_16(sp_digit* r, const sp_digit* a,
  196791. const sp_digit* b)
  196792. {
  196793. __asm__ __volatile__ (
  196794. "ldm %[b]!, {r5, r6}\n\t"
  196795. "ldm %[a]!, {r3, r4}\n\t"
  196796. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196797. "adds r3, r3, r5\n\t"
  196798. #else
  196799. "add r3, r3, r5\n\t"
  196800. #endif
  196801. #ifdef WOLFSSL_KEIL
  196802. "adcs r4, r4, r6\n\t"
  196803. #elif defined(__clang__)
  196804. "adcs r4, r6\n\t"
  196805. #else
  196806. "adc r4, r6\n\t"
  196807. #endif
  196808. "stm %[r]!, {r3, r4}\n\t"
  196809. "ldm %[b]!, {r5, r6}\n\t"
  196810. "ldm %[a]!, {r3, r4}\n\t"
  196811. #ifdef WOLFSSL_KEIL
  196812. "adcs r3, r3, r5\n\t"
  196813. #elif defined(__clang__)
  196814. "adcs r3, r5\n\t"
  196815. #else
  196816. "adc r3, r5\n\t"
  196817. #endif
  196818. #ifdef WOLFSSL_KEIL
  196819. "adcs r4, r4, r6\n\t"
  196820. #elif defined(__clang__)
  196821. "adcs r4, r6\n\t"
  196822. #else
  196823. "adc r4, r6\n\t"
  196824. #endif
  196825. "stm %[r]!, {r3, r4}\n\t"
  196826. "ldm %[b]!, {r5, r6}\n\t"
  196827. "ldm %[a]!, {r3, r4}\n\t"
  196828. #ifdef WOLFSSL_KEIL
  196829. "adcs r3, r3, r5\n\t"
  196830. #elif defined(__clang__)
  196831. "adcs r3, r5\n\t"
  196832. #else
  196833. "adc r3, r5\n\t"
  196834. #endif
  196835. #ifdef WOLFSSL_KEIL
  196836. "adcs r4, r4, r6\n\t"
  196837. #elif defined(__clang__)
  196838. "adcs r4, r6\n\t"
  196839. #else
  196840. "adc r4, r6\n\t"
  196841. #endif
  196842. "stm %[r]!, {r3, r4}\n\t"
  196843. "ldm %[b]!, {r5, r6}\n\t"
  196844. "ldm %[a]!, {r3, r4}\n\t"
  196845. #ifdef WOLFSSL_KEIL
  196846. "adcs r3, r3, r5\n\t"
  196847. #elif defined(__clang__)
  196848. "adcs r3, r5\n\t"
  196849. #else
  196850. "adc r3, r5\n\t"
  196851. #endif
  196852. #ifdef WOLFSSL_KEIL
  196853. "adcs r4, r4, r6\n\t"
  196854. #elif defined(__clang__)
  196855. "adcs r4, r6\n\t"
  196856. #else
  196857. "adc r4, r6\n\t"
  196858. #endif
  196859. "stm %[r]!, {r3, r4}\n\t"
  196860. "ldm %[b]!, {r5, r6}\n\t"
  196861. "ldm %[a]!, {r3, r4}\n\t"
  196862. #ifdef WOLFSSL_KEIL
  196863. "adcs r3, r3, r5\n\t"
  196864. #elif defined(__clang__)
  196865. "adcs r3, r5\n\t"
  196866. #else
  196867. "adc r3, r5\n\t"
  196868. #endif
  196869. #ifdef WOLFSSL_KEIL
  196870. "adcs r4, r4, r6\n\t"
  196871. #elif defined(__clang__)
  196872. "adcs r4, r6\n\t"
  196873. #else
  196874. "adc r4, r6\n\t"
  196875. #endif
  196876. "stm %[r]!, {r3, r4}\n\t"
  196877. "ldm %[b]!, {r5, r6}\n\t"
  196878. "ldm %[a]!, {r3, r4}\n\t"
  196879. #ifdef WOLFSSL_KEIL
  196880. "adcs r3, r3, r5\n\t"
  196881. #elif defined(__clang__)
  196882. "adcs r3, r5\n\t"
  196883. #else
  196884. "adc r3, r5\n\t"
  196885. #endif
  196886. #ifdef WOLFSSL_KEIL
  196887. "adcs r4, r4, r6\n\t"
  196888. #elif defined(__clang__)
  196889. "adcs r4, r6\n\t"
  196890. #else
  196891. "adc r4, r6\n\t"
  196892. #endif
  196893. "stm %[r]!, {r3, r4}\n\t"
  196894. "ldm %[b]!, {r5, r6}\n\t"
  196895. "ldm %[a]!, {r3, r4}\n\t"
  196896. #ifdef WOLFSSL_KEIL
  196897. "adcs r3, r3, r5\n\t"
  196898. #elif defined(__clang__)
  196899. "adcs r3, r5\n\t"
  196900. #else
  196901. "adc r3, r5\n\t"
  196902. #endif
  196903. #ifdef WOLFSSL_KEIL
  196904. "adcs r4, r4, r6\n\t"
  196905. #elif defined(__clang__)
  196906. "adcs r4, r6\n\t"
  196907. #else
  196908. "adc r4, r6\n\t"
  196909. #endif
  196910. "stm %[r]!, {r3, r4}\n\t"
  196911. "ldm %[b]!, {r5, r6}\n\t"
  196912. "ldm %[a]!, {r3, r4}\n\t"
  196913. #ifdef WOLFSSL_KEIL
  196914. "adcs r3, r3, r5\n\t"
  196915. #elif defined(__clang__)
  196916. "adcs r3, r5\n\t"
  196917. #else
  196918. "adc r3, r5\n\t"
  196919. #endif
  196920. #ifdef WOLFSSL_KEIL
  196921. "adcs r4, r4, r6\n\t"
  196922. #elif defined(__clang__)
  196923. "adcs r4, r6\n\t"
  196924. #else
  196925. "adc r4, r6\n\t"
  196926. #endif
  196927. "stm %[r]!, {r3, r4}\n\t"
  196928. "movs %[r], #0\n\t"
  196929. #ifdef WOLFSSL_KEIL
  196930. "adcs %[r], %[r], %[r]\n\t"
  196931. #elif defined(__clang__)
  196932. "adcs %[r], %[r]\n\t"
  196933. #else
  196934. "adc %[r], %[r]\n\t"
  196935. #endif
  196936. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  196937. :
  196938. : "memory", "r3", "r4", "r5", "r6"
  196939. );
  196940. return (uint32_t)(size_t)r;
  196941. }
  196942. /* Add b to a into r. (r = a + b)
  196943. *
  196944. * r A single precision integer.
  196945. * a A single precision integer.
  196946. * b A single precision integer.
  196947. */
  196948. SP_NOINLINE static sp_digit sp_1024_add_word_16(sp_digit* r, const sp_digit* a,
  196949. sp_digit b)
  196950. {
  196951. __asm__ __volatile__ (
  196952. "movs r5, #0\n\t"
  196953. "ldm %[a]!, {r3, r4}\n\t"
  196954. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  196955. "adds r3, r3, %[b]\n\t"
  196956. #else
  196957. "add r3, r3, %[b]\n\t"
  196958. #endif
  196959. #ifdef WOLFSSL_KEIL
  196960. "adcs r4, r4, r5\n\t"
  196961. #elif defined(__clang__)
  196962. "adcs r4, r5\n\t"
  196963. #else
  196964. "adc r4, r5\n\t"
  196965. #endif
  196966. "stm %[r]!, {r3, r4}\n\t"
  196967. "ldm %[a]!, {r3, r4}\n\t"
  196968. #ifdef WOLFSSL_KEIL
  196969. "adcs r3, r3, r5\n\t"
  196970. #elif defined(__clang__)
  196971. "adcs r3, r5\n\t"
  196972. #else
  196973. "adc r3, r5\n\t"
  196974. #endif
  196975. #ifdef WOLFSSL_KEIL
  196976. "adcs r4, r4, r5\n\t"
  196977. #elif defined(__clang__)
  196978. "adcs r4, r5\n\t"
  196979. #else
  196980. "adc r4, r5\n\t"
  196981. #endif
  196982. "stm %[r]!, {r3, r4}\n\t"
  196983. "ldm %[a]!, {r3, r4}\n\t"
  196984. #ifdef WOLFSSL_KEIL
  196985. "adcs r3, r3, r5\n\t"
  196986. #elif defined(__clang__)
  196987. "adcs r3, r5\n\t"
  196988. #else
  196989. "adc r3, r5\n\t"
  196990. #endif
  196991. #ifdef WOLFSSL_KEIL
  196992. "adcs r4, r4, r5\n\t"
  196993. #elif defined(__clang__)
  196994. "adcs r4, r5\n\t"
  196995. #else
  196996. "adc r4, r5\n\t"
  196997. #endif
  196998. "stm %[r]!, {r3, r4}\n\t"
  196999. "ldm %[a]!, {r3, r4}\n\t"
  197000. #ifdef WOLFSSL_KEIL
  197001. "adcs r3, r3, r5\n\t"
  197002. #elif defined(__clang__)
  197003. "adcs r3, r5\n\t"
  197004. #else
  197005. "adc r3, r5\n\t"
  197006. #endif
  197007. #ifdef WOLFSSL_KEIL
  197008. "adcs r4, r4, r5\n\t"
  197009. #elif defined(__clang__)
  197010. "adcs r4, r5\n\t"
  197011. #else
  197012. "adc r4, r5\n\t"
  197013. #endif
  197014. "stm %[r]!, {r3, r4}\n\t"
  197015. "ldm %[a]!, {r3, r4}\n\t"
  197016. #ifdef WOLFSSL_KEIL
  197017. "adcs r3, r3, r5\n\t"
  197018. #elif defined(__clang__)
  197019. "adcs r3, r5\n\t"
  197020. #else
  197021. "adc r3, r5\n\t"
  197022. #endif
  197023. #ifdef WOLFSSL_KEIL
  197024. "adcs r4, r4, r5\n\t"
  197025. #elif defined(__clang__)
  197026. "adcs r4, r5\n\t"
  197027. #else
  197028. "adc r4, r5\n\t"
  197029. #endif
  197030. "stm %[r]!, {r3, r4}\n\t"
  197031. "ldm %[a]!, {r3, r4}\n\t"
  197032. #ifdef WOLFSSL_KEIL
  197033. "adcs r3, r3, r5\n\t"
  197034. #elif defined(__clang__)
  197035. "adcs r3, r5\n\t"
  197036. #else
  197037. "adc r3, r5\n\t"
  197038. #endif
  197039. #ifdef WOLFSSL_KEIL
  197040. "adcs r4, r4, r5\n\t"
  197041. #elif defined(__clang__)
  197042. "adcs r4, r5\n\t"
  197043. #else
  197044. "adc r4, r5\n\t"
  197045. #endif
  197046. "stm %[r]!, {r3, r4}\n\t"
  197047. "ldm %[a]!, {r3, r4}\n\t"
  197048. #ifdef WOLFSSL_KEIL
  197049. "adcs r3, r3, r5\n\t"
  197050. #elif defined(__clang__)
  197051. "adcs r3, r5\n\t"
  197052. #else
  197053. "adc r3, r5\n\t"
  197054. #endif
  197055. #ifdef WOLFSSL_KEIL
  197056. "adcs r4, r4, r5\n\t"
  197057. #elif defined(__clang__)
  197058. "adcs r4, r5\n\t"
  197059. #else
  197060. "adc r4, r5\n\t"
  197061. #endif
  197062. "stm %[r]!, {r3, r4}\n\t"
  197063. "ldm %[a]!, {r3, r4}\n\t"
  197064. #ifdef WOLFSSL_KEIL
  197065. "adcs r3, r3, r5\n\t"
  197066. #elif defined(__clang__)
  197067. "adcs r3, r5\n\t"
  197068. #else
  197069. "adc r3, r5\n\t"
  197070. #endif
  197071. #ifdef WOLFSSL_KEIL
  197072. "adcs r4, r4, r5\n\t"
  197073. #elif defined(__clang__)
  197074. "adcs r4, r5\n\t"
  197075. #else
  197076. "adc r4, r5\n\t"
  197077. #endif
  197078. "stm %[r]!, {r3, r4}\n\t"
  197079. "movs %[r], #0\n\t"
  197080. #ifdef WOLFSSL_KEIL
  197081. "adcs %[r], %[r], %[r]\n\t"
  197082. #elif defined(__clang__)
  197083. "adcs %[r], %[r]\n\t"
  197084. #else
  197085. "adc %[r], %[r]\n\t"
  197086. #endif
  197087. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  197088. :
  197089. : "memory", "r3", "r4", "r5"
  197090. );
  197091. return (uint32_t)(size_t)r;
  197092. }
  197093. /* Sub b from a into a. (a -= b)
  197094. *
  197095. * a A single precision integer.
  197096. * b A single precision integer.
  197097. */
  197098. SP_NOINLINE static sp_digit sp_1024_sub_in_place_32(sp_digit* a,
  197099. const sp_digit* b)
  197100. {
  197101. __asm__ __volatile__ (
  197102. "ldm %[b]!, {r4, r5}\n\t"
  197103. "ldr r2, [%[a]]\n\t"
  197104. "ldr r3, [%[a], #4]\n\t"
  197105. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197106. "subs r2, r2, r4\n\t"
  197107. #else
  197108. "sub r2, r2, r4\n\t"
  197109. #endif
  197110. #ifdef WOLFSSL_KEIL
  197111. "sbcs r3, r3, r5\n\t"
  197112. #elif defined(__clang__)
  197113. "sbcs r3, r5\n\t"
  197114. #else
  197115. "sbc r3, r5\n\t"
  197116. #endif
  197117. "stm %[a]!, {r2, r3}\n\t"
  197118. "ldm %[b]!, {r4, r5}\n\t"
  197119. "ldr r2, [%[a]]\n\t"
  197120. "ldr r3, [%[a], #4]\n\t"
  197121. #ifdef WOLFSSL_KEIL
  197122. "sbcs r2, r2, r4\n\t"
  197123. #elif defined(__clang__)
  197124. "sbcs r2, r4\n\t"
  197125. #else
  197126. "sbc r2, r4\n\t"
  197127. #endif
  197128. #ifdef WOLFSSL_KEIL
  197129. "sbcs r3, r3, r5\n\t"
  197130. #elif defined(__clang__)
  197131. "sbcs r3, r5\n\t"
  197132. #else
  197133. "sbc r3, r5\n\t"
  197134. #endif
  197135. "stm %[a]!, {r2, r3}\n\t"
  197136. "ldm %[b]!, {r4, r5}\n\t"
  197137. "ldr r2, [%[a]]\n\t"
  197138. "ldr r3, [%[a], #4]\n\t"
  197139. #ifdef WOLFSSL_KEIL
  197140. "sbcs r2, r2, r4\n\t"
  197141. #elif defined(__clang__)
  197142. "sbcs r2, r4\n\t"
  197143. #else
  197144. "sbc r2, r4\n\t"
  197145. #endif
  197146. #ifdef WOLFSSL_KEIL
  197147. "sbcs r3, r3, r5\n\t"
  197148. #elif defined(__clang__)
  197149. "sbcs r3, r5\n\t"
  197150. #else
  197151. "sbc r3, r5\n\t"
  197152. #endif
  197153. "stm %[a]!, {r2, r3}\n\t"
  197154. "ldm %[b]!, {r4, r5}\n\t"
  197155. "ldr r2, [%[a]]\n\t"
  197156. "ldr r3, [%[a], #4]\n\t"
  197157. #ifdef WOLFSSL_KEIL
  197158. "sbcs r2, r2, r4\n\t"
  197159. #elif defined(__clang__)
  197160. "sbcs r2, r4\n\t"
  197161. #else
  197162. "sbc r2, r4\n\t"
  197163. #endif
  197164. #ifdef WOLFSSL_KEIL
  197165. "sbcs r3, r3, r5\n\t"
  197166. #elif defined(__clang__)
  197167. "sbcs r3, r5\n\t"
  197168. #else
  197169. "sbc r3, r5\n\t"
  197170. #endif
  197171. "stm %[a]!, {r2, r3}\n\t"
  197172. "ldm %[b]!, {r4, r5}\n\t"
  197173. "ldr r2, [%[a]]\n\t"
  197174. "ldr r3, [%[a], #4]\n\t"
  197175. #ifdef WOLFSSL_KEIL
  197176. "sbcs r2, r2, r4\n\t"
  197177. #elif defined(__clang__)
  197178. "sbcs r2, r4\n\t"
  197179. #else
  197180. "sbc r2, r4\n\t"
  197181. #endif
  197182. #ifdef WOLFSSL_KEIL
  197183. "sbcs r3, r3, r5\n\t"
  197184. #elif defined(__clang__)
  197185. "sbcs r3, r5\n\t"
  197186. #else
  197187. "sbc r3, r5\n\t"
  197188. #endif
  197189. "stm %[a]!, {r2, r3}\n\t"
  197190. "ldm %[b]!, {r4, r5}\n\t"
  197191. "ldr r2, [%[a]]\n\t"
  197192. "ldr r3, [%[a], #4]\n\t"
  197193. #ifdef WOLFSSL_KEIL
  197194. "sbcs r2, r2, r4\n\t"
  197195. #elif defined(__clang__)
  197196. "sbcs r2, r4\n\t"
  197197. #else
  197198. "sbc r2, r4\n\t"
  197199. #endif
  197200. #ifdef WOLFSSL_KEIL
  197201. "sbcs r3, r3, r5\n\t"
  197202. #elif defined(__clang__)
  197203. "sbcs r3, r5\n\t"
  197204. #else
  197205. "sbc r3, r5\n\t"
  197206. #endif
  197207. "stm %[a]!, {r2, r3}\n\t"
  197208. "ldm %[b]!, {r4, r5}\n\t"
  197209. "ldr r2, [%[a]]\n\t"
  197210. "ldr r3, [%[a], #4]\n\t"
  197211. #ifdef WOLFSSL_KEIL
  197212. "sbcs r2, r2, r4\n\t"
  197213. #elif defined(__clang__)
  197214. "sbcs r2, r4\n\t"
  197215. #else
  197216. "sbc r2, r4\n\t"
  197217. #endif
  197218. #ifdef WOLFSSL_KEIL
  197219. "sbcs r3, r3, r5\n\t"
  197220. #elif defined(__clang__)
  197221. "sbcs r3, r5\n\t"
  197222. #else
  197223. "sbc r3, r5\n\t"
  197224. #endif
  197225. "stm %[a]!, {r2, r3}\n\t"
  197226. "ldm %[b]!, {r4, r5}\n\t"
  197227. "ldr r2, [%[a]]\n\t"
  197228. "ldr r3, [%[a], #4]\n\t"
  197229. #ifdef WOLFSSL_KEIL
  197230. "sbcs r2, r2, r4\n\t"
  197231. #elif defined(__clang__)
  197232. "sbcs r2, r4\n\t"
  197233. #else
  197234. "sbc r2, r4\n\t"
  197235. #endif
  197236. #ifdef WOLFSSL_KEIL
  197237. "sbcs r3, r3, r5\n\t"
  197238. #elif defined(__clang__)
  197239. "sbcs r3, r5\n\t"
  197240. #else
  197241. "sbc r3, r5\n\t"
  197242. #endif
  197243. "stm %[a]!, {r2, r3}\n\t"
  197244. "ldm %[b]!, {r4, r5}\n\t"
  197245. "ldr r2, [%[a]]\n\t"
  197246. "ldr r3, [%[a], #4]\n\t"
  197247. #ifdef WOLFSSL_KEIL
  197248. "sbcs r2, r2, r4\n\t"
  197249. #elif defined(__clang__)
  197250. "sbcs r2, r4\n\t"
  197251. #else
  197252. "sbc r2, r4\n\t"
  197253. #endif
  197254. #ifdef WOLFSSL_KEIL
  197255. "sbcs r3, r3, r5\n\t"
  197256. #elif defined(__clang__)
  197257. "sbcs r3, r5\n\t"
  197258. #else
  197259. "sbc r3, r5\n\t"
  197260. #endif
  197261. "stm %[a]!, {r2, r3}\n\t"
  197262. "ldm %[b]!, {r4, r5}\n\t"
  197263. "ldr r2, [%[a]]\n\t"
  197264. "ldr r3, [%[a], #4]\n\t"
  197265. #ifdef WOLFSSL_KEIL
  197266. "sbcs r2, r2, r4\n\t"
  197267. #elif defined(__clang__)
  197268. "sbcs r2, r4\n\t"
  197269. #else
  197270. "sbc r2, r4\n\t"
  197271. #endif
  197272. #ifdef WOLFSSL_KEIL
  197273. "sbcs r3, r3, r5\n\t"
  197274. #elif defined(__clang__)
  197275. "sbcs r3, r5\n\t"
  197276. #else
  197277. "sbc r3, r5\n\t"
  197278. #endif
  197279. "stm %[a]!, {r2, r3}\n\t"
  197280. "ldm %[b]!, {r4, r5}\n\t"
  197281. "ldr r2, [%[a]]\n\t"
  197282. "ldr r3, [%[a], #4]\n\t"
  197283. #ifdef WOLFSSL_KEIL
  197284. "sbcs r2, r2, r4\n\t"
  197285. #elif defined(__clang__)
  197286. "sbcs r2, r4\n\t"
  197287. #else
  197288. "sbc r2, r4\n\t"
  197289. #endif
  197290. #ifdef WOLFSSL_KEIL
  197291. "sbcs r3, r3, r5\n\t"
  197292. #elif defined(__clang__)
  197293. "sbcs r3, r5\n\t"
  197294. #else
  197295. "sbc r3, r5\n\t"
  197296. #endif
  197297. "stm %[a]!, {r2, r3}\n\t"
  197298. "ldm %[b]!, {r4, r5}\n\t"
  197299. "ldr r2, [%[a]]\n\t"
  197300. "ldr r3, [%[a], #4]\n\t"
  197301. #ifdef WOLFSSL_KEIL
  197302. "sbcs r2, r2, r4\n\t"
  197303. #elif defined(__clang__)
  197304. "sbcs r2, r4\n\t"
  197305. #else
  197306. "sbc r2, r4\n\t"
  197307. #endif
  197308. #ifdef WOLFSSL_KEIL
  197309. "sbcs r3, r3, r5\n\t"
  197310. #elif defined(__clang__)
  197311. "sbcs r3, r5\n\t"
  197312. #else
  197313. "sbc r3, r5\n\t"
  197314. #endif
  197315. "stm %[a]!, {r2, r3}\n\t"
  197316. "ldm %[b]!, {r4, r5}\n\t"
  197317. "ldr r2, [%[a]]\n\t"
  197318. "ldr r3, [%[a], #4]\n\t"
  197319. #ifdef WOLFSSL_KEIL
  197320. "sbcs r2, r2, r4\n\t"
  197321. #elif defined(__clang__)
  197322. "sbcs r2, r4\n\t"
  197323. #else
  197324. "sbc r2, r4\n\t"
  197325. #endif
  197326. #ifdef WOLFSSL_KEIL
  197327. "sbcs r3, r3, r5\n\t"
  197328. #elif defined(__clang__)
  197329. "sbcs r3, r5\n\t"
  197330. #else
  197331. "sbc r3, r5\n\t"
  197332. #endif
  197333. "stm %[a]!, {r2, r3}\n\t"
  197334. "ldm %[b]!, {r4, r5}\n\t"
  197335. "ldr r2, [%[a]]\n\t"
  197336. "ldr r3, [%[a], #4]\n\t"
  197337. #ifdef WOLFSSL_KEIL
  197338. "sbcs r2, r2, r4\n\t"
  197339. #elif defined(__clang__)
  197340. "sbcs r2, r4\n\t"
  197341. #else
  197342. "sbc r2, r4\n\t"
  197343. #endif
  197344. #ifdef WOLFSSL_KEIL
  197345. "sbcs r3, r3, r5\n\t"
  197346. #elif defined(__clang__)
  197347. "sbcs r3, r5\n\t"
  197348. #else
  197349. "sbc r3, r5\n\t"
  197350. #endif
  197351. "stm %[a]!, {r2, r3}\n\t"
  197352. "ldm %[b]!, {r4, r5}\n\t"
  197353. "ldr r2, [%[a]]\n\t"
  197354. "ldr r3, [%[a], #4]\n\t"
  197355. #ifdef WOLFSSL_KEIL
  197356. "sbcs r2, r2, r4\n\t"
  197357. #elif defined(__clang__)
  197358. "sbcs r2, r4\n\t"
  197359. #else
  197360. "sbc r2, r4\n\t"
  197361. #endif
  197362. #ifdef WOLFSSL_KEIL
  197363. "sbcs r3, r3, r5\n\t"
  197364. #elif defined(__clang__)
  197365. "sbcs r3, r5\n\t"
  197366. #else
  197367. "sbc r3, r5\n\t"
  197368. #endif
  197369. "stm %[a]!, {r2, r3}\n\t"
  197370. "ldm %[b]!, {r4, r5}\n\t"
  197371. "ldr r2, [%[a]]\n\t"
  197372. "ldr r3, [%[a], #4]\n\t"
  197373. #ifdef WOLFSSL_KEIL
  197374. "sbcs r2, r2, r4\n\t"
  197375. #elif defined(__clang__)
  197376. "sbcs r2, r4\n\t"
  197377. #else
  197378. "sbc r2, r4\n\t"
  197379. #endif
  197380. #ifdef WOLFSSL_KEIL
  197381. "sbcs r3, r3, r5\n\t"
  197382. #elif defined(__clang__)
  197383. "sbcs r3, r5\n\t"
  197384. #else
  197385. "sbc r3, r5\n\t"
  197386. #endif
  197387. "stm %[a]!, {r2, r3}\n\t"
  197388. #ifdef WOLFSSL_KEIL
  197389. "sbcs %[a], %[a], %[a]\n\t"
  197390. #elif defined(__clang__)
  197391. "sbcs %[a], %[a]\n\t"
  197392. #else
  197393. "sbc %[a], %[a]\n\t"
  197394. #endif
  197395. : [a] "+l" (a), [b] "+l" (b)
  197396. :
  197397. : "memory", "r2", "r3", "r4", "r5"
  197398. );
  197399. return (uint32_t)(size_t)a;
  197400. }
  197401. /* Add b to a into r. (r = a + b)
  197402. *
  197403. * r A single precision integer.
  197404. * a A single precision integer.
  197405. * b A single precision integer.
  197406. */
  197407. SP_NOINLINE static sp_digit sp_1024_add_32(sp_digit* r, const sp_digit* a,
  197408. const sp_digit* b)
  197409. {
  197410. __asm__ __volatile__ (
  197411. "ldm %[b]!, {r5, r6}\n\t"
  197412. "ldm %[a]!, {r3, r4}\n\t"
  197413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197414. "adds r3, r3, r5\n\t"
  197415. #else
  197416. "add r3, r3, r5\n\t"
  197417. #endif
  197418. #ifdef WOLFSSL_KEIL
  197419. "adcs r4, r4, r6\n\t"
  197420. #elif defined(__clang__)
  197421. "adcs r4, r6\n\t"
  197422. #else
  197423. "adc r4, r6\n\t"
  197424. #endif
  197425. "stm %[r]!, {r3, r4}\n\t"
  197426. "ldm %[b]!, {r5, r6}\n\t"
  197427. "ldm %[a]!, {r3, r4}\n\t"
  197428. #ifdef WOLFSSL_KEIL
  197429. "adcs r3, r3, r5\n\t"
  197430. #elif defined(__clang__)
  197431. "adcs r3, r5\n\t"
  197432. #else
  197433. "adc r3, r5\n\t"
  197434. #endif
  197435. #ifdef WOLFSSL_KEIL
  197436. "adcs r4, r4, r6\n\t"
  197437. #elif defined(__clang__)
  197438. "adcs r4, r6\n\t"
  197439. #else
  197440. "adc r4, r6\n\t"
  197441. #endif
  197442. "stm %[r]!, {r3, r4}\n\t"
  197443. "ldm %[b]!, {r5, r6}\n\t"
  197444. "ldm %[a]!, {r3, r4}\n\t"
  197445. #ifdef WOLFSSL_KEIL
  197446. "adcs r3, r3, r5\n\t"
  197447. #elif defined(__clang__)
  197448. "adcs r3, r5\n\t"
  197449. #else
  197450. "adc r3, r5\n\t"
  197451. #endif
  197452. #ifdef WOLFSSL_KEIL
  197453. "adcs r4, r4, r6\n\t"
  197454. #elif defined(__clang__)
  197455. "adcs r4, r6\n\t"
  197456. #else
  197457. "adc r4, r6\n\t"
  197458. #endif
  197459. "stm %[r]!, {r3, r4}\n\t"
  197460. "ldm %[b]!, {r5, r6}\n\t"
  197461. "ldm %[a]!, {r3, r4}\n\t"
  197462. #ifdef WOLFSSL_KEIL
  197463. "adcs r3, r3, r5\n\t"
  197464. #elif defined(__clang__)
  197465. "adcs r3, r5\n\t"
  197466. #else
  197467. "adc r3, r5\n\t"
  197468. #endif
  197469. #ifdef WOLFSSL_KEIL
  197470. "adcs r4, r4, r6\n\t"
  197471. #elif defined(__clang__)
  197472. "adcs r4, r6\n\t"
  197473. #else
  197474. "adc r4, r6\n\t"
  197475. #endif
  197476. "stm %[r]!, {r3, r4}\n\t"
  197477. "ldm %[b]!, {r5, r6}\n\t"
  197478. "ldm %[a]!, {r3, r4}\n\t"
  197479. #ifdef WOLFSSL_KEIL
  197480. "adcs r3, r3, r5\n\t"
  197481. #elif defined(__clang__)
  197482. "adcs r3, r5\n\t"
  197483. #else
  197484. "adc r3, r5\n\t"
  197485. #endif
  197486. #ifdef WOLFSSL_KEIL
  197487. "adcs r4, r4, r6\n\t"
  197488. #elif defined(__clang__)
  197489. "adcs r4, r6\n\t"
  197490. #else
  197491. "adc r4, r6\n\t"
  197492. #endif
  197493. "stm %[r]!, {r3, r4}\n\t"
  197494. "ldm %[b]!, {r5, r6}\n\t"
  197495. "ldm %[a]!, {r3, r4}\n\t"
  197496. #ifdef WOLFSSL_KEIL
  197497. "adcs r3, r3, r5\n\t"
  197498. #elif defined(__clang__)
  197499. "adcs r3, r5\n\t"
  197500. #else
  197501. "adc r3, r5\n\t"
  197502. #endif
  197503. #ifdef WOLFSSL_KEIL
  197504. "adcs r4, r4, r6\n\t"
  197505. #elif defined(__clang__)
  197506. "adcs r4, r6\n\t"
  197507. #else
  197508. "adc r4, r6\n\t"
  197509. #endif
  197510. "stm %[r]!, {r3, r4}\n\t"
  197511. "ldm %[b]!, {r5, r6}\n\t"
  197512. "ldm %[a]!, {r3, r4}\n\t"
  197513. #ifdef WOLFSSL_KEIL
  197514. "adcs r3, r3, r5\n\t"
  197515. #elif defined(__clang__)
  197516. "adcs r3, r5\n\t"
  197517. #else
  197518. "adc r3, r5\n\t"
  197519. #endif
  197520. #ifdef WOLFSSL_KEIL
  197521. "adcs r4, r4, r6\n\t"
  197522. #elif defined(__clang__)
  197523. "adcs r4, r6\n\t"
  197524. #else
  197525. "adc r4, r6\n\t"
  197526. #endif
  197527. "stm %[r]!, {r3, r4}\n\t"
  197528. "ldm %[b]!, {r5, r6}\n\t"
  197529. "ldm %[a]!, {r3, r4}\n\t"
  197530. #ifdef WOLFSSL_KEIL
  197531. "adcs r3, r3, r5\n\t"
  197532. #elif defined(__clang__)
  197533. "adcs r3, r5\n\t"
  197534. #else
  197535. "adc r3, r5\n\t"
  197536. #endif
  197537. #ifdef WOLFSSL_KEIL
  197538. "adcs r4, r4, r6\n\t"
  197539. #elif defined(__clang__)
  197540. "adcs r4, r6\n\t"
  197541. #else
  197542. "adc r4, r6\n\t"
  197543. #endif
  197544. "stm %[r]!, {r3, r4}\n\t"
  197545. "ldm %[b]!, {r5, r6}\n\t"
  197546. "ldm %[a]!, {r3, r4}\n\t"
  197547. #ifdef WOLFSSL_KEIL
  197548. "adcs r3, r3, r5\n\t"
  197549. #elif defined(__clang__)
  197550. "adcs r3, r5\n\t"
  197551. #else
  197552. "adc r3, r5\n\t"
  197553. #endif
  197554. #ifdef WOLFSSL_KEIL
  197555. "adcs r4, r4, r6\n\t"
  197556. #elif defined(__clang__)
  197557. "adcs r4, r6\n\t"
  197558. #else
  197559. "adc r4, r6\n\t"
  197560. #endif
  197561. "stm %[r]!, {r3, r4}\n\t"
  197562. "ldm %[b]!, {r5, r6}\n\t"
  197563. "ldm %[a]!, {r3, r4}\n\t"
  197564. #ifdef WOLFSSL_KEIL
  197565. "adcs r3, r3, r5\n\t"
  197566. #elif defined(__clang__)
  197567. "adcs r3, r5\n\t"
  197568. #else
  197569. "adc r3, r5\n\t"
  197570. #endif
  197571. #ifdef WOLFSSL_KEIL
  197572. "adcs r4, r4, r6\n\t"
  197573. #elif defined(__clang__)
  197574. "adcs r4, r6\n\t"
  197575. #else
  197576. "adc r4, r6\n\t"
  197577. #endif
  197578. "stm %[r]!, {r3, r4}\n\t"
  197579. "ldm %[b]!, {r5, r6}\n\t"
  197580. "ldm %[a]!, {r3, r4}\n\t"
  197581. #ifdef WOLFSSL_KEIL
  197582. "adcs r3, r3, r5\n\t"
  197583. #elif defined(__clang__)
  197584. "adcs r3, r5\n\t"
  197585. #else
  197586. "adc r3, r5\n\t"
  197587. #endif
  197588. #ifdef WOLFSSL_KEIL
  197589. "adcs r4, r4, r6\n\t"
  197590. #elif defined(__clang__)
  197591. "adcs r4, r6\n\t"
  197592. #else
  197593. "adc r4, r6\n\t"
  197594. #endif
  197595. "stm %[r]!, {r3, r4}\n\t"
  197596. "ldm %[b]!, {r5, r6}\n\t"
  197597. "ldm %[a]!, {r3, r4}\n\t"
  197598. #ifdef WOLFSSL_KEIL
  197599. "adcs r3, r3, r5\n\t"
  197600. #elif defined(__clang__)
  197601. "adcs r3, r5\n\t"
  197602. #else
  197603. "adc r3, r5\n\t"
  197604. #endif
  197605. #ifdef WOLFSSL_KEIL
  197606. "adcs r4, r4, r6\n\t"
  197607. #elif defined(__clang__)
  197608. "adcs r4, r6\n\t"
  197609. #else
  197610. "adc r4, r6\n\t"
  197611. #endif
  197612. "stm %[r]!, {r3, r4}\n\t"
  197613. "ldm %[b]!, {r5, r6}\n\t"
  197614. "ldm %[a]!, {r3, r4}\n\t"
  197615. #ifdef WOLFSSL_KEIL
  197616. "adcs r3, r3, r5\n\t"
  197617. #elif defined(__clang__)
  197618. "adcs r3, r5\n\t"
  197619. #else
  197620. "adc r3, r5\n\t"
  197621. #endif
  197622. #ifdef WOLFSSL_KEIL
  197623. "adcs r4, r4, r6\n\t"
  197624. #elif defined(__clang__)
  197625. "adcs r4, r6\n\t"
  197626. #else
  197627. "adc r4, r6\n\t"
  197628. #endif
  197629. "stm %[r]!, {r3, r4}\n\t"
  197630. "ldm %[b]!, {r5, r6}\n\t"
  197631. "ldm %[a]!, {r3, r4}\n\t"
  197632. #ifdef WOLFSSL_KEIL
  197633. "adcs r3, r3, r5\n\t"
  197634. #elif defined(__clang__)
  197635. "adcs r3, r5\n\t"
  197636. #else
  197637. "adc r3, r5\n\t"
  197638. #endif
  197639. #ifdef WOLFSSL_KEIL
  197640. "adcs r4, r4, r6\n\t"
  197641. #elif defined(__clang__)
  197642. "adcs r4, r6\n\t"
  197643. #else
  197644. "adc r4, r6\n\t"
  197645. #endif
  197646. "stm %[r]!, {r3, r4}\n\t"
  197647. "ldm %[b]!, {r5, r6}\n\t"
  197648. "ldm %[a]!, {r3, r4}\n\t"
  197649. #ifdef WOLFSSL_KEIL
  197650. "adcs r3, r3, r5\n\t"
  197651. #elif defined(__clang__)
  197652. "adcs r3, r5\n\t"
  197653. #else
  197654. "adc r3, r5\n\t"
  197655. #endif
  197656. #ifdef WOLFSSL_KEIL
  197657. "adcs r4, r4, r6\n\t"
  197658. #elif defined(__clang__)
  197659. "adcs r4, r6\n\t"
  197660. #else
  197661. "adc r4, r6\n\t"
  197662. #endif
  197663. "stm %[r]!, {r3, r4}\n\t"
  197664. "ldm %[b]!, {r5, r6}\n\t"
  197665. "ldm %[a]!, {r3, r4}\n\t"
  197666. #ifdef WOLFSSL_KEIL
  197667. "adcs r3, r3, r5\n\t"
  197668. #elif defined(__clang__)
  197669. "adcs r3, r5\n\t"
  197670. #else
  197671. "adc r3, r5\n\t"
  197672. #endif
  197673. #ifdef WOLFSSL_KEIL
  197674. "adcs r4, r4, r6\n\t"
  197675. #elif defined(__clang__)
  197676. "adcs r4, r6\n\t"
  197677. #else
  197678. "adc r4, r6\n\t"
  197679. #endif
  197680. "stm %[r]!, {r3, r4}\n\t"
  197681. "movs %[r], #0\n\t"
  197682. #ifdef WOLFSSL_KEIL
  197683. "adcs %[r], %[r], %[r]\n\t"
  197684. #elif defined(__clang__)
  197685. "adcs %[r], %[r]\n\t"
  197686. #else
  197687. "adc %[r], %[r]\n\t"
  197688. #endif
  197689. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  197690. :
  197691. : "memory", "r3", "r4", "r5", "r6"
  197692. );
  197693. return (uint32_t)(size_t)r;
  197694. }
  197695. /* AND m into each word of a and store in r.
  197696. *
  197697. * r A single precision integer.
  197698. * a A single precision integer.
  197699. * m Mask to AND against each digit.
  197700. */
  197701. static void sp_1024_mask_16(sp_digit* r, const sp_digit* a, sp_digit m)
  197702. {
  197703. #ifdef WOLFSSL_SP_SMALL
  197704. int i;
  197705. for (i=0; i<16; i++) {
  197706. r[i] = a[i] & m;
  197707. }
  197708. #else
  197709. int i;
  197710. for (i = 0; i < 16; i += 8) {
  197711. r[i+0] = a[i+0] & m;
  197712. r[i+1] = a[i+1] & m;
  197713. r[i+2] = a[i+2] & m;
  197714. r[i+3] = a[i+3] & m;
  197715. r[i+4] = a[i+4] & m;
  197716. r[i+5] = a[i+5] & m;
  197717. r[i+6] = a[i+6] & m;
  197718. r[i+7] = a[i+7] & m;
  197719. }
  197720. #endif
  197721. }
  197722. /* Multiply a and b into r. (r = a * b)
  197723. *
  197724. * r A single precision integer.
  197725. * a A single precision integer.
  197726. * b A single precision integer.
  197727. */
  197728. SP_NOINLINE static void sp_1024_mul_32(sp_digit* r, const sp_digit* a,
  197729. const sp_digit* b)
  197730. {
  197731. sp_digit* z0 = r;
  197732. sp_digit z1[32];
  197733. sp_digit a1[16];
  197734. sp_digit b1[16];
  197735. sp_digit* z2 = r + 32;
  197736. sp_digit u;
  197737. sp_digit ca;
  197738. sp_digit cb;
  197739. ca = sp_1024_add_16(a1, a, &a[16]);
  197740. cb = sp_1024_add_16(b1, b, &b[16]);
  197741. u = ca & cb;
  197742. sp_1024_mul_16(z2, &a[16], &b[16]);
  197743. sp_1024_mul_16(z0, a, b);
  197744. sp_1024_mul_16(z1, a1, b1);
  197745. u += sp_1024_sub_in_place_32(z1, z0);
  197746. u += sp_1024_sub_in_place_32(z1, z2);
  197747. sp_1024_mask_16(a1, a1, 0 - cb);
  197748. u += sp_1024_add_16(z1 + 16, z1 + 16, a1);
  197749. sp_1024_mask_16(b1, b1, 0 - ca);
  197750. u += sp_1024_add_16(z1 + 16, z1 + 16, b1);
  197751. u += sp_1024_add_32(r + 16, r + 16, z1);
  197752. (void)sp_1024_add_word_16(r + 48, r + 48, u);
  197753. }
  197754. /* Sub b from a into r. (r = a - b)
  197755. *
  197756. * r A single precision integer.
  197757. * a A single precision integer.
  197758. * b A single precision integer.
  197759. */
  197760. SP_NOINLINE static sp_digit sp_1024_sub_16(sp_digit* r, const sp_digit* a,
  197761. const sp_digit* b)
  197762. {
  197763. __asm__ __volatile__ (
  197764. "ldm %[b]!, {r5, r6}\n\t"
  197765. "ldm %[a]!, {r3, r4}\n\t"
  197766. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197767. "subs r3, r3, r5\n\t"
  197768. #else
  197769. "sub r3, r3, r5\n\t"
  197770. #endif
  197771. #ifdef WOLFSSL_KEIL
  197772. "sbcs r4, r4, r6\n\t"
  197773. #elif defined(__clang__)
  197774. "sbcs r4, r6\n\t"
  197775. #else
  197776. "sbc r4, r6\n\t"
  197777. #endif
  197778. "stm %[r]!, {r3, r4}\n\t"
  197779. "ldm %[b]!, {r5, r6}\n\t"
  197780. "ldm %[a]!, {r3, r4}\n\t"
  197781. #ifdef WOLFSSL_KEIL
  197782. "sbcs r3, r3, r5\n\t"
  197783. #elif defined(__clang__)
  197784. "sbcs r3, r5\n\t"
  197785. #else
  197786. "sbc r3, r5\n\t"
  197787. #endif
  197788. #ifdef WOLFSSL_KEIL
  197789. "sbcs r4, r4, r6\n\t"
  197790. #elif defined(__clang__)
  197791. "sbcs r4, r6\n\t"
  197792. #else
  197793. "sbc r4, r6\n\t"
  197794. #endif
  197795. "stm %[r]!, {r3, r4}\n\t"
  197796. "ldm %[b]!, {r5, r6}\n\t"
  197797. "ldm %[a]!, {r3, r4}\n\t"
  197798. #ifdef WOLFSSL_KEIL
  197799. "sbcs r3, r3, r5\n\t"
  197800. #elif defined(__clang__)
  197801. "sbcs r3, r5\n\t"
  197802. #else
  197803. "sbc r3, r5\n\t"
  197804. #endif
  197805. #ifdef WOLFSSL_KEIL
  197806. "sbcs r4, r4, r6\n\t"
  197807. #elif defined(__clang__)
  197808. "sbcs r4, r6\n\t"
  197809. #else
  197810. "sbc r4, r6\n\t"
  197811. #endif
  197812. "stm %[r]!, {r3, r4}\n\t"
  197813. "ldm %[b]!, {r5, r6}\n\t"
  197814. "ldm %[a]!, {r3, r4}\n\t"
  197815. #ifdef WOLFSSL_KEIL
  197816. "sbcs r3, r3, r5\n\t"
  197817. #elif defined(__clang__)
  197818. "sbcs r3, r5\n\t"
  197819. #else
  197820. "sbc r3, r5\n\t"
  197821. #endif
  197822. #ifdef WOLFSSL_KEIL
  197823. "sbcs r4, r4, r6\n\t"
  197824. #elif defined(__clang__)
  197825. "sbcs r4, r6\n\t"
  197826. #else
  197827. "sbc r4, r6\n\t"
  197828. #endif
  197829. "stm %[r]!, {r3, r4}\n\t"
  197830. "ldm %[b]!, {r5, r6}\n\t"
  197831. "ldm %[a]!, {r3, r4}\n\t"
  197832. #ifdef WOLFSSL_KEIL
  197833. "sbcs r3, r3, r5\n\t"
  197834. #elif defined(__clang__)
  197835. "sbcs r3, r5\n\t"
  197836. #else
  197837. "sbc r3, r5\n\t"
  197838. #endif
  197839. #ifdef WOLFSSL_KEIL
  197840. "sbcs r4, r4, r6\n\t"
  197841. #elif defined(__clang__)
  197842. "sbcs r4, r6\n\t"
  197843. #else
  197844. "sbc r4, r6\n\t"
  197845. #endif
  197846. "stm %[r]!, {r3, r4}\n\t"
  197847. "ldm %[b]!, {r5, r6}\n\t"
  197848. "ldm %[a]!, {r3, r4}\n\t"
  197849. #ifdef WOLFSSL_KEIL
  197850. "sbcs r3, r3, r5\n\t"
  197851. #elif defined(__clang__)
  197852. "sbcs r3, r5\n\t"
  197853. #else
  197854. "sbc r3, r5\n\t"
  197855. #endif
  197856. #ifdef WOLFSSL_KEIL
  197857. "sbcs r4, r4, r6\n\t"
  197858. #elif defined(__clang__)
  197859. "sbcs r4, r6\n\t"
  197860. #else
  197861. "sbc r4, r6\n\t"
  197862. #endif
  197863. "stm %[r]!, {r3, r4}\n\t"
  197864. "ldm %[b]!, {r5, r6}\n\t"
  197865. "ldm %[a]!, {r3, r4}\n\t"
  197866. #ifdef WOLFSSL_KEIL
  197867. "sbcs r3, r3, r5\n\t"
  197868. #elif defined(__clang__)
  197869. "sbcs r3, r5\n\t"
  197870. #else
  197871. "sbc r3, r5\n\t"
  197872. #endif
  197873. #ifdef WOLFSSL_KEIL
  197874. "sbcs r4, r4, r6\n\t"
  197875. #elif defined(__clang__)
  197876. "sbcs r4, r6\n\t"
  197877. #else
  197878. "sbc r4, r6\n\t"
  197879. #endif
  197880. "stm %[r]!, {r3, r4}\n\t"
  197881. "ldm %[b]!, {r5, r6}\n\t"
  197882. "ldm %[a]!, {r3, r4}\n\t"
  197883. #ifdef WOLFSSL_KEIL
  197884. "sbcs r3, r3, r5\n\t"
  197885. #elif defined(__clang__)
  197886. "sbcs r3, r5\n\t"
  197887. #else
  197888. "sbc r3, r5\n\t"
  197889. #endif
  197890. #ifdef WOLFSSL_KEIL
  197891. "sbcs r4, r4, r6\n\t"
  197892. #elif defined(__clang__)
  197893. "sbcs r4, r6\n\t"
  197894. #else
  197895. "sbc r4, r6\n\t"
  197896. #endif
  197897. "stm %[r]!, {r3, r4}\n\t"
  197898. #ifdef WOLFSSL_KEIL
  197899. "sbcs %[r], %[r], %[r]\n\t"
  197900. #elif defined(__clang__)
  197901. "sbcs %[r], %[r]\n\t"
  197902. #else
  197903. "sbc %[r], %[r]\n\t"
  197904. #endif
  197905. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  197906. :
  197907. : "memory", "r3", "r4", "r5", "r6"
  197908. );
  197909. return (uint32_t)(size_t)r;
  197910. }
  197911. /* Square a and put result in r. (r = a * a)
  197912. *
  197913. * r A single precision integer.
  197914. * a A single precision integer.
  197915. */
  197916. SP_NOINLINE static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a)
  197917. {
  197918. sp_digit* z0 = r;
  197919. sp_digit* z2 = r + 32;
  197920. sp_digit z1[32];
  197921. sp_digit* a1 = z1;
  197922. sp_digit* zero = z1 + 16;
  197923. sp_digit u;
  197924. sp_digit mask;
  197925. sp_digit* p1;
  197926. sp_digit* p2;
  197927. XMEMSET(zero, 0, sizeof(sp_digit) * 16);
  197928. mask = sp_1024_sub_16(a1, a, &a[16]);
  197929. p1 = (sp_digit*)(((sp_digit)zero & mask ) | ((sp_digit)a1 & (~mask)));
  197930. p2 = (sp_digit*)(((sp_digit)zero & (~mask)) | ((sp_digit)a1 & mask ));
  197931. (void)sp_1024_sub_16(a1, p1, p2);
  197932. sp_1024_sqr_16(z2, &a[16]);
  197933. sp_1024_sqr_16(z0, a);
  197934. sp_1024_sqr_16(z1, a1);
  197935. u = 0;
  197936. u -= sp_1024_sub_in_place_32(z1, z2);
  197937. u -= sp_1024_sub_in_place_32(z1, z0);
  197938. u += sp_1024_sub_in_place_32(r + 16, z1);
  197939. sp_1024_add_word_16(r + 48, r + 48, u);
  197940. }
  197941. #else
  197942. /* Multiply a and b into r. (r = a * b)
  197943. *
  197944. * r A single precision integer.
  197945. * a A single precision integer.
  197946. * b A single precision integer.
  197947. */
  197948. SP_NOINLINE static void sp_1024_mul_32(sp_digit* r, const sp_digit* a,
  197949. const sp_digit* b)
  197950. {
  197951. sp_digit t[32 * 2];
  197952. sp_digit* tmp = t;
  197953. __asm__ __volatile__ (
  197954. "movs r3, #0\n\t"
  197955. "movs r4, #0\n\t"
  197956. "mov r8, r3\n\t"
  197957. "mov r11, %[tmp]\n\t"
  197958. "mov r9, %[a]\n\t"
  197959. "mov r10, %[b]\n\t"
  197960. "movs r6, #0x80\n\t"
  197961. "add r6, r6, r9\n\t"
  197962. "mov r12, r6\n\t"
  197963. "\n"
  197964. "L_sp_1024_mul_32_words_%=:\n\t"
  197965. "movs %[tmp], #0\n\t"
  197966. "movs r5, #0\n\t"
  197967. "movs r6, #0x7c\n\t"
  197968. "mov %[a], r8\n\t"
  197969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197970. "subs %[a], %[a], r6\n\t"
  197971. #else
  197972. "sub %[a], %[a], r6\n\t"
  197973. #endif
  197974. #ifdef WOLFSSL_KEIL
  197975. "sbcs r6, r6, r6\n\t"
  197976. #elif defined(__clang__)
  197977. "sbcs r6, r6\n\t"
  197978. #else
  197979. "sbc r6, r6\n\t"
  197980. #endif
  197981. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197982. "mvns r6, r6\n\t"
  197983. #else
  197984. "mvn r6, r6\n\t"
  197985. #endif
  197986. #ifdef WOLFSSL_KEIL
  197987. "ands %[a], %[a], r6\n\t"
  197988. #elif defined(__clang__)
  197989. "ands %[a], r6\n\t"
  197990. #else
  197991. "and %[a], r6\n\t"
  197992. #endif
  197993. "mov %[b], r8\n\t"
  197994. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  197995. "subs %[b], %[b], %[a]\n\t"
  197996. #else
  197997. "sub %[b], %[b], %[a]\n\t"
  197998. #endif
  197999. "add %[a], %[a], r9\n\t"
  198000. "add %[b], %[b], r10\n\t"
  198001. "\n"
  198002. "L_sp_1024_mul_32_mul_%=:\n\t"
  198003. "# Multiply Start\n\t"
  198004. "ldrh r6, [%[a]]\n\t"
  198005. "ldrh r7, [%[b]]\n\t"
  198006. #ifdef WOLFSSL_KEIL
  198007. "muls r7, r6, r7\n\t"
  198008. #elif defined(__clang__)
  198009. "muls r7, r6\n\t"
  198010. #else
  198011. "mul r7, r6\n\t"
  198012. #endif
  198013. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198014. "adds r3, r3, r7\n\t"
  198015. #else
  198016. "add r3, r3, r7\n\t"
  198017. #endif
  198018. #ifdef WOLFSSL_KEIL
  198019. "adcs r4, r4, %[tmp]\n\t"
  198020. #elif defined(__clang__)
  198021. "adcs r4, %[tmp]\n\t"
  198022. #else
  198023. "adc r4, %[tmp]\n\t"
  198024. #endif
  198025. #ifdef WOLFSSL_KEIL
  198026. "adcs r5, r5, %[tmp]\n\t"
  198027. #elif defined(__clang__)
  198028. "adcs r5, %[tmp]\n\t"
  198029. #else
  198030. "adc r5, %[tmp]\n\t"
  198031. #endif
  198032. "ldr r7, [%[b]]\n\t"
  198033. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198034. "lsrs r7, r7, #16\n\t"
  198035. #else
  198036. "lsr r7, r7, #16\n\t"
  198037. #endif
  198038. #ifdef WOLFSSL_KEIL
  198039. "muls r6, r7, r6\n\t"
  198040. #elif defined(__clang__)
  198041. "muls r6, r7\n\t"
  198042. #else
  198043. "mul r6, r7\n\t"
  198044. #endif
  198045. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198046. "lsrs r7, r6, #16\n\t"
  198047. #else
  198048. "lsr r7, r6, #16\n\t"
  198049. #endif
  198050. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198051. "lsls r6, r6, #16\n\t"
  198052. #else
  198053. "lsl r6, r6, #16\n\t"
  198054. #endif
  198055. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198056. "adds r3, r3, r6\n\t"
  198057. #else
  198058. "add r3, r3, r6\n\t"
  198059. #endif
  198060. #ifdef WOLFSSL_KEIL
  198061. "adcs r4, r4, r7\n\t"
  198062. #elif defined(__clang__)
  198063. "adcs r4, r7\n\t"
  198064. #else
  198065. "adc r4, r7\n\t"
  198066. #endif
  198067. #ifdef WOLFSSL_KEIL
  198068. "adcs r5, r5, %[tmp]\n\t"
  198069. #elif defined(__clang__)
  198070. "adcs r5, %[tmp]\n\t"
  198071. #else
  198072. "adc r5, %[tmp]\n\t"
  198073. #endif
  198074. "ldr r6, [%[a]]\n\t"
  198075. "ldr r7, [%[b]]\n\t"
  198076. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198077. "lsrs r6, r6, #16\n\t"
  198078. #else
  198079. "lsr r6, r6, #16\n\t"
  198080. #endif
  198081. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198082. "lsrs r7, r7, #16\n\t"
  198083. #else
  198084. "lsr r7, r7, #16\n\t"
  198085. #endif
  198086. #ifdef WOLFSSL_KEIL
  198087. "muls r7, r6, r7\n\t"
  198088. #elif defined(__clang__)
  198089. "muls r7, r6\n\t"
  198090. #else
  198091. "mul r7, r6\n\t"
  198092. #endif
  198093. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198094. "adds r4, r4, r7\n\t"
  198095. #else
  198096. "add r4, r4, r7\n\t"
  198097. #endif
  198098. #ifdef WOLFSSL_KEIL
  198099. "adcs r5, r5, %[tmp]\n\t"
  198100. #elif defined(__clang__)
  198101. "adcs r5, %[tmp]\n\t"
  198102. #else
  198103. "adc r5, %[tmp]\n\t"
  198104. #endif
  198105. "ldrh r7, [%[b]]\n\t"
  198106. #ifdef WOLFSSL_KEIL
  198107. "muls r6, r7, r6\n\t"
  198108. #elif defined(__clang__)
  198109. "muls r6, r7\n\t"
  198110. #else
  198111. "mul r6, r7\n\t"
  198112. #endif
  198113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198114. "lsrs r7, r6, #16\n\t"
  198115. #else
  198116. "lsr r7, r6, #16\n\t"
  198117. #endif
  198118. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198119. "lsls r6, r6, #16\n\t"
  198120. #else
  198121. "lsl r6, r6, #16\n\t"
  198122. #endif
  198123. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198124. "adds r3, r3, r6\n\t"
  198125. #else
  198126. "add r3, r3, r6\n\t"
  198127. #endif
  198128. #ifdef WOLFSSL_KEIL
  198129. "adcs r4, r4, r7\n\t"
  198130. #elif defined(__clang__)
  198131. "adcs r4, r7\n\t"
  198132. #else
  198133. "adc r4, r7\n\t"
  198134. #endif
  198135. #ifdef WOLFSSL_KEIL
  198136. "adcs r5, r5, %[tmp]\n\t"
  198137. #elif defined(__clang__)
  198138. "adcs r5, %[tmp]\n\t"
  198139. #else
  198140. "adc r5, %[tmp]\n\t"
  198141. #endif
  198142. "# Multiply Done\n\t"
  198143. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198144. "adds %[a], %[a], #4\n\t"
  198145. #else
  198146. "add %[a], %[a], #4\n\t"
  198147. #endif
  198148. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198149. "subs %[b], %[b], #4\n\t"
  198150. #else
  198151. "sub %[b], %[b], #4\n\t"
  198152. #endif
  198153. "cmp %[a], r12\n\t"
  198154. "beq L_sp_1024_mul_32_done_mul_%=\n\t"
  198155. "mov r6, r8\n\t"
  198156. "add r6, r6, r9\n\t"
  198157. "cmp %[a], r6\n\t"
  198158. "ble L_sp_1024_mul_32_mul_%=\n\t"
  198159. "\n"
  198160. "L_sp_1024_mul_32_done_mul_%=:\n\t"
  198161. "mov %[tmp], r11\n\t"
  198162. "mov r7, r8\n\t"
  198163. "str r3, [%[tmp], r7]\n\t"
  198164. "movs r3, r4\n\t"
  198165. "movs r4, r5\n\t"
  198166. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198167. "adds r7, r7, #4\n\t"
  198168. #else
  198169. "add r7, r7, #4\n\t"
  198170. #endif
  198171. "mov r8, r7\n\t"
  198172. "movs r6, #0xf8\n\t"
  198173. "cmp r7, r6\n\t"
  198174. "ble L_sp_1024_mul_32_words_%=\n\t"
  198175. "str r3, [%[tmp], r7]\n\t"
  198176. "mov %[a], r9\n\t"
  198177. "mov %[b], r10\n\t"
  198178. : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp)
  198179. :
  198180. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  198181. );
  198182. XMEMCPY(r, t, sizeof(t));
  198183. }
  198184. /* Square a and put result in r. (r = a * a)
  198185. *
  198186. * r A single precision integer.
  198187. * a A single precision integer.
  198188. */
  198189. SP_NOINLINE static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a)
  198190. {
  198191. __asm__ __volatile__ (
  198192. "movs r3, #0\n\t"
  198193. "movs r4, #0\n\t"
  198194. "movs r5, #0\n\t"
  198195. "mov r8, r3\n\t"
  198196. "mov r11, %[r]\n\t"
  198197. "movs r6, #0xff\n\t"
  198198. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198199. "adds r6, r6, #1\n\t"
  198200. #else
  198201. "add r6, r6, #1\n\t"
  198202. #endif
  198203. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198204. "negs r6, r6\n\t"
  198205. #else
  198206. "neg r6, r6\n\t"
  198207. #endif
  198208. "add sp, sp, r6\n\t"
  198209. "mov r10, sp\n\t"
  198210. "mov r9, %[a]\n\t"
  198211. "\n"
  198212. "L_sp_1024_sqr_32_words_%=:\n\t"
  198213. "movs %[r], #0\n\t"
  198214. "movs r6, #0x7c\n\t"
  198215. "mov %[a], r8\n\t"
  198216. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198217. "subs %[a], %[a], r6\n\t"
  198218. #else
  198219. "sub %[a], %[a], r6\n\t"
  198220. #endif
  198221. #ifdef WOLFSSL_KEIL
  198222. "sbcs r6, r6, r6\n\t"
  198223. #elif defined(__clang__)
  198224. "sbcs r6, r6\n\t"
  198225. #else
  198226. "sbc r6, r6\n\t"
  198227. #endif
  198228. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198229. "mvns r6, r6\n\t"
  198230. #else
  198231. "mvn r6, r6\n\t"
  198232. #endif
  198233. #ifdef WOLFSSL_KEIL
  198234. "ands %[a], %[a], r6\n\t"
  198235. #elif defined(__clang__)
  198236. "ands %[a], r6\n\t"
  198237. #else
  198238. "and %[a], r6\n\t"
  198239. #endif
  198240. "mov r2, r8\n\t"
  198241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198242. "subs r2, r2, %[a]\n\t"
  198243. #else
  198244. "sub r2, r2, %[a]\n\t"
  198245. #endif
  198246. "add %[a], %[a], r9\n\t"
  198247. "add r2, r2, r9\n\t"
  198248. "\n"
  198249. "L_sp_1024_sqr_32_mul_%=:\n\t"
  198250. "cmp r2, %[a]\n\t"
  198251. "beq L_sp_1024_sqr_32_sqr_%=\n\t"
  198252. "# Multiply * 2: Start\n\t"
  198253. "ldrh r6, [%[a]]\n\t"
  198254. "ldrh r7, [r2]\n\t"
  198255. #ifdef WOLFSSL_KEIL
  198256. "muls r7, r6, r7\n\t"
  198257. #elif defined(__clang__)
  198258. "muls r7, r6\n\t"
  198259. #else
  198260. "mul r7, r6\n\t"
  198261. #endif
  198262. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198263. "adds r3, r3, r7\n\t"
  198264. #else
  198265. "add r3, r3, r7\n\t"
  198266. #endif
  198267. #ifdef WOLFSSL_KEIL
  198268. "adcs r4, r4, %[r]\n\t"
  198269. #elif defined(__clang__)
  198270. "adcs r4, %[r]\n\t"
  198271. #else
  198272. "adc r4, %[r]\n\t"
  198273. #endif
  198274. #ifdef WOLFSSL_KEIL
  198275. "adcs r5, r5, %[r]\n\t"
  198276. #elif defined(__clang__)
  198277. "adcs r5, %[r]\n\t"
  198278. #else
  198279. "adc r5, %[r]\n\t"
  198280. #endif
  198281. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198282. "adds r3, r3, r7\n\t"
  198283. #else
  198284. "add r3, r3, r7\n\t"
  198285. #endif
  198286. #ifdef WOLFSSL_KEIL
  198287. "adcs r4, r4, %[r]\n\t"
  198288. #elif defined(__clang__)
  198289. "adcs r4, %[r]\n\t"
  198290. #else
  198291. "adc r4, %[r]\n\t"
  198292. #endif
  198293. #ifdef WOLFSSL_KEIL
  198294. "adcs r5, r5, %[r]\n\t"
  198295. #elif defined(__clang__)
  198296. "adcs r5, %[r]\n\t"
  198297. #else
  198298. "adc r5, %[r]\n\t"
  198299. #endif
  198300. "ldr r7, [r2]\n\t"
  198301. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198302. "lsrs r7, r7, #16\n\t"
  198303. #else
  198304. "lsr r7, r7, #16\n\t"
  198305. #endif
  198306. #ifdef WOLFSSL_KEIL
  198307. "muls r6, r7, r6\n\t"
  198308. #elif defined(__clang__)
  198309. "muls r6, r7\n\t"
  198310. #else
  198311. "mul r6, r7\n\t"
  198312. #endif
  198313. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198314. "lsrs r7, r6, #16\n\t"
  198315. #else
  198316. "lsr r7, r6, #16\n\t"
  198317. #endif
  198318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198319. "lsls r6, r6, #16\n\t"
  198320. #else
  198321. "lsl r6, r6, #16\n\t"
  198322. #endif
  198323. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198324. "adds r3, r3, r6\n\t"
  198325. #else
  198326. "add r3, r3, r6\n\t"
  198327. #endif
  198328. #ifdef WOLFSSL_KEIL
  198329. "adcs r4, r4, r7\n\t"
  198330. #elif defined(__clang__)
  198331. "adcs r4, r7\n\t"
  198332. #else
  198333. "adc r4, r7\n\t"
  198334. #endif
  198335. #ifdef WOLFSSL_KEIL
  198336. "adcs r5, r5, %[r]\n\t"
  198337. #elif defined(__clang__)
  198338. "adcs r5, %[r]\n\t"
  198339. #else
  198340. "adc r5, %[r]\n\t"
  198341. #endif
  198342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198343. "adds r3, r3, r6\n\t"
  198344. #else
  198345. "add r3, r3, r6\n\t"
  198346. #endif
  198347. #ifdef WOLFSSL_KEIL
  198348. "adcs r4, r4, r7\n\t"
  198349. #elif defined(__clang__)
  198350. "adcs r4, r7\n\t"
  198351. #else
  198352. "adc r4, r7\n\t"
  198353. #endif
  198354. #ifdef WOLFSSL_KEIL
  198355. "adcs r5, r5, %[r]\n\t"
  198356. #elif defined(__clang__)
  198357. "adcs r5, %[r]\n\t"
  198358. #else
  198359. "adc r5, %[r]\n\t"
  198360. #endif
  198361. "ldr r6, [%[a]]\n\t"
  198362. "ldr r7, [r2]\n\t"
  198363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198364. "lsrs r6, r6, #16\n\t"
  198365. #else
  198366. "lsr r6, r6, #16\n\t"
  198367. #endif
  198368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198369. "lsrs r7, r7, #16\n\t"
  198370. #else
  198371. "lsr r7, r7, #16\n\t"
  198372. #endif
  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 r4, r4, r7\n\t"
  198382. #else
  198383. "add r4, r4, r7\n\t"
  198384. #endif
  198385. #ifdef WOLFSSL_KEIL
  198386. "adcs r5, r5, %[r]\n\t"
  198387. #elif defined(__clang__)
  198388. "adcs r5, %[r]\n\t"
  198389. #else
  198390. "adc r5, %[r]\n\t"
  198391. #endif
  198392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198393. "adds r4, r4, r7\n\t"
  198394. #else
  198395. "add r4, r4, r7\n\t"
  198396. #endif
  198397. #ifdef WOLFSSL_KEIL
  198398. "adcs r5, r5, %[r]\n\t"
  198399. #elif defined(__clang__)
  198400. "adcs r5, %[r]\n\t"
  198401. #else
  198402. "adc r5, %[r]\n\t"
  198403. #endif
  198404. "ldrh r7, [r2]\n\t"
  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, %[r]\n\t"
  198436. #elif defined(__clang__)
  198437. "adcs r5, %[r]\n\t"
  198438. #else
  198439. "adc r5, %[r]\n\t"
  198440. #endif
  198441. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198442. "adds r3, r3, r6\n\t"
  198443. #else
  198444. "add r3, r3, r6\n\t"
  198445. #endif
  198446. #ifdef WOLFSSL_KEIL
  198447. "adcs r4, r4, r7\n\t"
  198448. #elif defined(__clang__)
  198449. "adcs r4, r7\n\t"
  198450. #else
  198451. "adc r4, r7\n\t"
  198452. #endif
  198453. #ifdef WOLFSSL_KEIL
  198454. "adcs r5, r5, %[r]\n\t"
  198455. #elif defined(__clang__)
  198456. "adcs r5, %[r]\n\t"
  198457. #else
  198458. "adc r5, %[r]\n\t"
  198459. #endif
  198460. "# Multiply * 2: Done\n\t"
  198461. "bal L_sp_1024_sqr_32_done_sqr_%=\n\t"
  198462. "\n"
  198463. "L_sp_1024_sqr_32_sqr_%=:\n\t"
  198464. "mov r12, r2\n\t"
  198465. "ldr r2, [%[a]]\n\t"
  198466. "# Square: Start\n\t"
  198467. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198468. "lsrs r7, r2, #16\n\t"
  198469. #else
  198470. "lsr r7, r2, #16\n\t"
  198471. #endif
  198472. "uxth r6, r2\n\t"
  198473. #ifdef WOLFSSL_KEIL
  198474. "muls r6, r6, r6\n\t"
  198475. #elif defined(__clang__)
  198476. "muls r6, r6\n\t"
  198477. #else
  198478. "mul r6, r6\n\t"
  198479. #endif
  198480. #ifdef WOLFSSL_KEIL
  198481. "muls r7, r7, r7\n\t"
  198482. #elif defined(__clang__)
  198483. "muls r7, r7\n\t"
  198484. #else
  198485. "mul r7, r7\n\t"
  198486. #endif
  198487. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198488. "adds r3, r3, r6\n\t"
  198489. #else
  198490. "add r3, r3, r6\n\t"
  198491. #endif
  198492. #ifdef WOLFSSL_KEIL
  198493. "adcs r4, r4, r7\n\t"
  198494. #elif defined(__clang__)
  198495. "adcs r4, r7\n\t"
  198496. #else
  198497. "adc r4, r7\n\t"
  198498. #endif
  198499. #ifdef WOLFSSL_KEIL
  198500. "adcs r5, r5, %[r]\n\t"
  198501. #elif defined(__clang__)
  198502. "adcs r5, %[r]\n\t"
  198503. #else
  198504. "adc r5, %[r]\n\t"
  198505. #endif
  198506. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198507. "lsrs r7, r2, #16\n\t"
  198508. #else
  198509. "lsr r7, r2, #16\n\t"
  198510. #endif
  198511. "uxth r6, r2\n\t"
  198512. #ifdef WOLFSSL_KEIL
  198513. "muls r6, r7, r6\n\t"
  198514. #elif defined(__clang__)
  198515. "muls r6, r7\n\t"
  198516. #else
  198517. "mul r6, r7\n\t"
  198518. #endif
  198519. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198520. "lsrs r7, r6, #15\n\t"
  198521. #else
  198522. "lsr r7, r6, #15\n\t"
  198523. #endif
  198524. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198525. "lsls r6, r6, #17\n\t"
  198526. #else
  198527. "lsl r6, r6, #17\n\t"
  198528. #endif
  198529. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198530. "adds r3, r3, r6\n\t"
  198531. #else
  198532. "add r3, r3, r6\n\t"
  198533. #endif
  198534. #ifdef WOLFSSL_KEIL
  198535. "adcs r4, r4, r7\n\t"
  198536. #elif defined(__clang__)
  198537. "adcs r4, r7\n\t"
  198538. #else
  198539. "adc r4, r7\n\t"
  198540. #endif
  198541. #ifdef WOLFSSL_KEIL
  198542. "adcs r5, r5, %[r]\n\t"
  198543. #elif defined(__clang__)
  198544. "adcs r5, %[r]\n\t"
  198545. #else
  198546. "adc r5, %[r]\n\t"
  198547. #endif
  198548. "# Square: Done\n\t"
  198549. "mov r2, r12\n\t"
  198550. "\n"
  198551. "L_sp_1024_sqr_32_done_sqr_%=:\n\t"
  198552. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198553. "adds %[a], %[a], #4\n\t"
  198554. #else
  198555. "add %[a], %[a], #4\n\t"
  198556. #endif
  198557. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198558. "subs r2, r2, #4\n\t"
  198559. #else
  198560. "sub r2, r2, #4\n\t"
  198561. #endif
  198562. "movs r6, #0x80\n\t"
  198563. "add r6, r6, r9\n\t"
  198564. "cmp %[a], r6\n\t"
  198565. "beq L_sp_1024_sqr_32_done_mul_%=\n\t"
  198566. "cmp %[a], r2\n\t"
  198567. "bgt L_sp_1024_sqr_32_done_mul_%=\n\t"
  198568. "mov r7, r8\n\t"
  198569. "add r7, r7, r9\n\t"
  198570. "cmp %[a], r7\n\t"
  198571. "ble L_sp_1024_sqr_32_mul_%=\n\t"
  198572. "\n"
  198573. "L_sp_1024_sqr_32_done_mul_%=:\n\t"
  198574. "mov %[r], r10\n\t"
  198575. "mov r7, r8\n\t"
  198576. "str r3, [%[r], r7]\n\t"
  198577. "movs r3, r4\n\t"
  198578. "movs r4, r5\n\t"
  198579. "movs r5, #0\n\t"
  198580. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198581. "adds r7, r7, #4\n\t"
  198582. #else
  198583. "add r7, r7, #4\n\t"
  198584. #endif
  198585. "mov r8, r7\n\t"
  198586. "movs r6, #0xf8\n\t"
  198587. "cmp r7, r6\n\t"
  198588. "ble L_sp_1024_sqr_32_words_%=\n\t"
  198589. "mov %[a], r9\n\t"
  198590. "str r3, [%[r], r7]\n\t"
  198591. "mov %[r], r11\n\t"
  198592. "mov %[a], r10\n\t"
  198593. "movs r3, #0xfc\n\t"
  198594. "\n"
  198595. "L_sp_1024_sqr_32_store_%=:\n\t"
  198596. "ldr r6, [%[a], r3]\n\t"
  198597. "str r6, [%[r], r3]\n\t"
  198598. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198599. "subs r3, r3, #4\n\t"
  198600. #else
  198601. "sub r3, r3, #4\n\t"
  198602. #endif
  198603. "bge L_sp_1024_sqr_32_store_%=\n\t"
  198604. "movs r6, #0xff\n\t"
  198605. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198606. "adds r6, r6, #1\n\t"
  198607. #else
  198608. "add r6, r6, #1\n\t"
  198609. #endif
  198610. "add sp, sp, r6\n\t"
  198611. : [r] "+l" (r), [a] "+l" (a)
  198612. :
  198613. : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
  198614. );
  198615. }
  198616. #endif /* !WOLFSSL_SP_SMALL */
  198617. /* The modulus (prime) of the curve P1024. */
  198618. static const sp_digit p1024_mod[32] = {
  198619. 0xfea85feb,0x666d807a,0xac7ace87,0x80c5df10,0x89857db0,0xfce3e823,
  198620. 0x56971f1f,0x9f94d6af,0x1c3c09aa,0xa7cf3c52,0x31852a82,0xb6aff4a8,
  198621. 0x65681ce1,0x512ac5cd,0x326b4cd4,0xe26c6487,0xa666a6d0,0x356d27f4,
  198622. 0xf7c88a19,0xe791b39f,0x31a59cb0,0x228730d5,0xe2fc0f1b,0xf40aab27,
  198623. 0xb3e01a2e,0xbe9ae358,0x9cb48261,0x416c0ce1,0xdad0657a,0x65c61198,
  198624. 0x0a563fda,0x997abb1f
  198625. };
  198626. /* The Montgomery normalizer for modulus of the curve P1024. */
  198627. static const sp_digit p1024_norm_mod[32] = {
  198628. 0x0157a015,0x99927f85,0x53853178,0x7f3a20ef,0x767a824f,0x031c17dc,
  198629. 0xa968e0e0,0x606b2950,0xe3c3f655,0x5830c3ad,0xce7ad57d,0x49500b57,
  198630. 0x9a97e31e,0xaed53a32,0xcd94b32b,0x1d939b78,0x5999592f,0xca92d80b,
  198631. 0x083775e6,0x186e4c60,0xce5a634f,0xdd78cf2a,0x1d03f0e4,0x0bf554d8,
  198632. 0x4c1fe5d1,0x41651ca7,0x634b7d9e,0xbe93f31e,0x252f9a85,0x9a39ee67,
  198633. 0xf5a9c025,0x668544e0
  198634. };
  198635. /* The Montgomery multiplier for modulus of the curve P1024. */
  198636. static sp_digit p1024_mp_mod = 0x7c8f2f3d;
  198637. #if defined(WOLFSSL_SP_SMALL) || defined(HAVE_ECC_CHECK_KEY)
  198638. /* The order of the curve P1024. */
  198639. static const sp_digit p1024_order[32] = {
  198640. 0xbfaa17fb,0xd99b601e,0x2b1eb3a1,0x203177c4,0xe2615f6c,0xff38fa08,
  198641. 0xd5a5c7c7,0xa7e535ab,0x870f026a,0xa9f3cf14,0x0c614aa0,0x6dabfd2a,
  198642. 0x595a0738,0x144ab173,0xcc9ad335,0x389b1921,0x2999a9b4,0x4d5b49fd,
  198643. 0xfdf22286,0x39e46ce7,0x4c69672c,0xc8a1cc35,0xf8bf03c6,0xbd02aac9,
  198644. 0x2cf8068b,0x6fa6b8d6,0x672d2098,0x905b0338,0x36b4195e,0x99718466,
  198645. 0xc2958ff6,0x265eaec7
  198646. };
  198647. #endif
  198648. /* The base point of curve P1024. */
  198649. static const sp_point_1024 p1024_base = {
  198650. /* X ordinate */
  198651. {
  198652. 0xeae63895,0x880dc8ab,0x967e0979,0x80ec46c4,0xb63f73ec,0xee9163a5,
  198653. 0x80728d87,0xd5cfb4cc,0xba66910d,0xa7c1514d,0x7a60de74,0xa702c339,
  198654. 0x8b72f2e1,0x337c8654,0x5dd5bccb,0x9760af76,0x406ce890,0x718bd9e7,
  198655. 0xdb9dfa55,0x43d5f22c,0x30b09e10,0xab10db90,0xf6ce2308,0xb5edb6c0,
  198656. 0xb6ff7cbf,0x98b2f204,0x0aec69c6,0x2b1a2fd6,0x3ed9b52a,0x0a799005,
  198657. 0x332c29ad,0x53fc09ee,
  198658. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198659. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198660. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198661. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198662. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198663. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198664. (sp_digit)0, (sp_digit)0
  198665. },
  198666. /* Y ordinate */
  198667. {
  198668. 0x1bef16d7,0x75573fd7,0x6a67dcde,0xadb9b570,0xd5bb4636,0x80bdad5a,
  198669. 0xe9cb99a9,0x13515ad7,0xc5a4d5f2,0x492d979f,0x164aa989,0xac6f1e80,
  198670. 0xb7652fe0,0xcad696b5,0xad547c6c,0x70dae117,0xa9e032b9,0x416cff0c,
  198671. 0x9a140b2e,0x6b598ccf,0xf0de55f6,0xe7f7f5e5,0x654ec2b9,0xf5ea69f4,
  198672. 0x1e141178,0x3d778d82,0x02990696,0xd3e82016,0x3634a135,0xf9f1f053,
  198673. 0x3f6009f1,0x0a824906,
  198674. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198675. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198676. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198677. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198678. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198679. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198680. (sp_digit)0, (sp_digit)0
  198681. },
  198682. /* Z ordinate */
  198683. {
  198684. 0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  198685. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  198686. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  198687. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  198688. 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,
  198689. 0x00000000,0x00000000,
  198690. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198691. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198692. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198693. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198694. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198695. (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0, (sp_digit)0,
  198696. (sp_digit)0, (sp_digit)0
  198697. },
  198698. /* infinity */
  198699. 0
  198700. };
  198701. #ifdef WOLFSSL_SP_SMALL
  198702. /* Sub b from a into a. (a -= b)
  198703. *
  198704. * a A single precision integer.
  198705. * b A single precision integer.
  198706. */
  198707. SP_NOINLINE static sp_digit sp_1024_sub_in_place_32(sp_digit* a,
  198708. const sp_digit* b)
  198709. {
  198710. __asm__ __volatile__ (
  198711. "movs r7, %[a]\n\t"
  198712. "movs r2, #0\n\t"
  198713. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198714. "adds r7, r7, #0x80\n\t"
  198715. #else
  198716. "add r7, r7, #0x80\n\t"
  198717. #endif
  198718. "\n"
  198719. "L_sp_1024_sub_in_place_32_words_%=:\n\t"
  198720. "movs r5, #0\n\t"
  198721. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198722. "subs r5, r5, r2\n\t"
  198723. #else
  198724. "sub r5, r5, r2\n\t"
  198725. #endif
  198726. "ldr r3, [%[a]]\n\t"
  198727. "ldr r4, [%[a], #4]\n\t"
  198728. "ldr r5, [%[b]]\n\t"
  198729. "ldr r6, [%[b], #4]\n\t"
  198730. #ifdef WOLFSSL_KEIL
  198731. "sbcs r3, r3, r5\n\t"
  198732. #elif defined(__clang__)
  198733. "sbcs r3, r5\n\t"
  198734. #else
  198735. "sbc r3, r5\n\t"
  198736. #endif
  198737. #ifdef WOLFSSL_KEIL
  198738. "sbcs r4, r4, r6\n\t"
  198739. #elif defined(__clang__)
  198740. "sbcs r4, r6\n\t"
  198741. #else
  198742. "sbc r4, r6\n\t"
  198743. #endif
  198744. "str r3, [%[a]]\n\t"
  198745. "str r4, [%[a], #4]\n\t"
  198746. #ifdef WOLFSSL_KEIL
  198747. "sbcs r2, r2, r2\n\t"
  198748. #elif defined(__clang__)
  198749. "sbcs r2, r2\n\t"
  198750. #else
  198751. "sbc r2, r2\n\t"
  198752. #endif
  198753. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198754. "adds %[a], %[a], #8\n\t"
  198755. #else
  198756. "add %[a], %[a], #8\n\t"
  198757. #endif
  198758. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198759. "adds %[b], %[b], #8\n\t"
  198760. #else
  198761. "add %[b], %[b], #8\n\t"
  198762. #endif
  198763. "cmp %[a], r7\n\t"
  198764. "bne L_sp_1024_sub_in_place_32_words_%=\n\t"
  198765. "movs %[a], r2\n\t"
  198766. : [a] "+l" (a), [b] "+l" (b)
  198767. :
  198768. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  198769. );
  198770. return (uint32_t)(size_t)a;
  198771. }
  198772. #endif /* WOLFSSL_SP_SMALL */
  198773. /* Conditionally subtract b from a using the mask m.
  198774. * m is -1 to subtract and 0 when not copying.
  198775. *
  198776. * r A single precision number representing condition subtract result.
  198777. * a A single precision number to subtract from.
  198778. * b A single precision number to subtract.
  198779. * m Mask value to apply.
  198780. */
  198781. SP_NOINLINE static sp_digit sp_1024_cond_sub_32(sp_digit* r, const sp_digit* a,
  198782. const sp_digit* b, sp_digit m)
  198783. {
  198784. __asm__ __volatile__ (
  198785. "movs r4, #0\n\t"
  198786. "movs r5, #0x80\n\t"
  198787. "mov r8, r5\n\t"
  198788. "movs r7, #0\n\t"
  198789. "\n"
  198790. "L_sp_1024_cond_sub_32_words_%=:\n\t"
  198791. "ldr r6, [%[b], r7]\n\t"
  198792. #ifdef WOLFSSL_KEIL
  198793. "ands r6, r6, %[m]\n\t"
  198794. #elif defined(__clang__)
  198795. "ands r6, %[m]\n\t"
  198796. #else
  198797. "and r6, %[m]\n\t"
  198798. #endif
  198799. "movs r5, #0\n\t"
  198800. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198801. "subs r5, r5, r4\n\t"
  198802. #else
  198803. "sub r5, r5, r4\n\t"
  198804. #endif
  198805. "ldr r5, [%[a], r7]\n\t"
  198806. #ifdef WOLFSSL_KEIL
  198807. "sbcs r5, r5, r6\n\t"
  198808. #elif defined(__clang__)
  198809. "sbcs r5, r6\n\t"
  198810. #else
  198811. "sbc r5, r6\n\t"
  198812. #endif
  198813. #ifdef WOLFSSL_KEIL
  198814. "sbcs r4, r4, r4\n\t"
  198815. #elif defined(__clang__)
  198816. "sbcs r4, r4\n\t"
  198817. #else
  198818. "sbc r4, r4\n\t"
  198819. #endif
  198820. "str r5, [%[r], r7]\n\t"
  198821. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198822. "adds r7, r7, #4\n\t"
  198823. #else
  198824. "add r7, r7, #4\n\t"
  198825. #endif
  198826. "cmp r7, r8\n\t"
  198827. "blt L_sp_1024_cond_sub_32_words_%=\n\t"
  198828. "movs %[r], r4\n\t"
  198829. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  198830. :
  198831. : "memory", "r4", "r5", "r6", "r7", "r8"
  198832. );
  198833. return (uint32_t)(size_t)r;
  198834. }
  198835. #ifdef WOLFSSL_SP_SMALL
  198836. /* Add b to a into r. (r = a + b)
  198837. *
  198838. * r A single precision integer.
  198839. * a A single precision integer.
  198840. * b A single precision integer.
  198841. */
  198842. SP_NOINLINE static sp_digit sp_1024_add_32(sp_digit* r, const sp_digit* a,
  198843. const sp_digit* b)
  198844. {
  198845. __asm__ __volatile__ (
  198846. "movs r6, %[a]\n\t"
  198847. "movs r7, #0\n\t"
  198848. "movs r3, #0\n\t"
  198849. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198850. "adds r6, r6, #0x80\n\t"
  198851. #else
  198852. "add r6, r6, #0x80\n\t"
  198853. #endif
  198854. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198855. "subs r7, r7, #1\n\t"
  198856. #else
  198857. "sub r7, r7, #1\n\t"
  198858. #endif
  198859. "\n"
  198860. "L_sp_1024_add_32_word_%=:\n\t"
  198861. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198862. "adds r3, r3, r7\n\t"
  198863. #else
  198864. "add r3, r3, r7\n\t"
  198865. #endif
  198866. "ldr r4, [%[a]]\n\t"
  198867. "ldr r5, [%[b]]\n\t"
  198868. #ifdef WOLFSSL_KEIL
  198869. "adcs r4, r4, r5\n\t"
  198870. #elif defined(__clang__)
  198871. "adcs r4, r5\n\t"
  198872. #else
  198873. "adc r4, r5\n\t"
  198874. #endif
  198875. "str r4, [%[r]]\n\t"
  198876. "movs r3, #0\n\t"
  198877. #ifdef WOLFSSL_KEIL
  198878. "adcs r3, r3, r3\n\t"
  198879. #elif defined(__clang__)
  198880. "adcs r3, r3\n\t"
  198881. #else
  198882. "adc r3, r3\n\t"
  198883. #endif
  198884. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198885. "adds %[a], %[a], #4\n\t"
  198886. #else
  198887. "add %[a], %[a], #4\n\t"
  198888. #endif
  198889. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198890. "adds %[b], %[b], #4\n\t"
  198891. #else
  198892. "add %[b], %[b], #4\n\t"
  198893. #endif
  198894. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198895. "adds %[r], %[r], #4\n\t"
  198896. #else
  198897. "add %[r], %[r], #4\n\t"
  198898. #endif
  198899. "cmp %[a], r6\n\t"
  198900. "bne L_sp_1024_add_32_word_%=\n\t"
  198901. "movs %[r], r3\n\t"
  198902. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  198903. :
  198904. : "memory", "r3", "r4", "r5", "r6", "r7"
  198905. );
  198906. return (uint32_t)(size_t)r;
  198907. }
  198908. #endif /* WOLFSSL_SP_SMALL */
  198909. /* Mul a by digit b into r. (r = a * b)
  198910. *
  198911. * r A single precision integer.
  198912. * a A single precision integer.
  198913. * b A single precision digit.
  198914. */
  198915. SP_NOINLINE static void sp_1024_mul_d_32(sp_digit* r, const sp_digit* a,
  198916. sp_digit b)
  198917. {
  198918. __asm__ __volatile__ (
  198919. "movs r6, #0x80\n\t"
  198920. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198921. "adds r6, r6, %[a]\n\t"
  198922. #else
  198923. "add r6, r6, %[a]\n\t"
  198924. #endif
  198925. "mov r8, %[r]\n\t"
  198926. "mov r9, r6\n\t"
  198927. "movs r3, #0\n\t"
  198928. "movs r4, #0\n\t"
  198929. "\n"
  198930. "L_sp_1024_mul_d_32_%=:\n\t"
  198931. "movs %[r], #0\n\t"
  198932. "movs r5, #0\n\t"
  198933. "# A[] * B\n\t"
  198934. "ldrh r6, [%[a]]\n\t"
  198935. "uxth r7, %[b]\n\t"
  198936. #ifdef WOLFSSL_KEIL
  198937. "muls r7, r6, r7\n\t"
  198938. #elif defined(__clang__)
  198939. "muls r7, r6\n\t"
  198940. #else
  198941. "mul r7, r6\n\t"
  198942. #endif
  198943. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198944. "adds r3, r3, r7\n\t"
  198945. #else
  198946. "add r3, r3, r7\n\t"
  198947. #endif
  198948. #ifdef WOLFSSL_KEIL
  198949. "adcs r4, r4, %[r]\n\t"
  198950. #elif defined(__clang__)
  198951. "adcs r4, %[r]\n\t"
  198952. #else
  198953. "adc r4, %[r]\n\t"
  198954. #endif
  198955. #ifdef WOLFSSL_KEIL
  198956. "adcs r5, r5, %[r]\n\t"
  198957. #elif defined(__clang__)
  198958. "adcs r5, %[r]\n\t"
  198959. #else
  198960. "adc r5, %[r]\n\t"
  198961. #endif
  198962. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198963. "lsrs r7, %[b], #16\n\t"
  198964. #else
  198965. "lsr r7, %[b], #16\n\t"
  198966. #endif
  198967. #ifdef WOLFSSL_KEIL
  198968. "muls r6, r7, r6\n\t"
  198969. #elif defined(__clang__)
  198970. "muls r6, r7\n\t"
  198971. #else
  198972. "mul r6, r7\n\t"
  198973. #endif
  198974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198975. "lsrs r7, r6, #16\n\t"
  198976. #else
  198977. "lsr r7, r6, #16\n\t"
  198978. #endif
  198979. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198980. "lsls r6, r6, #16\n\t"
  198981. #else
  198982. "lsl r6, r6, #16\n\t"
  198983. #endif
  198984. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  198985. "adds r3, r3, r6\n\t"
  198986. #else
  198987. "add r3, r3, r6\n\t"
  198988. #endif
  198989. #ifdef WOLFSSL_KEIL
  198990. "adcs r4, r4, r7\n\t"
  198991. #elif defined(__clang__)
  198992. "adcs r4, r7\n\t"
  198993. #else
  198994. "adc r4, r7\n\t"
  198995. #endif
  198996. #ifdef WOLFSSL_KEIL
  198997. "adcs r5, r5, %[r]\n\t"
  198998. #elif defined(__clang__)
  198999. "adcs r5, %[r]\n\t"
  199000. #else
  199001. "adc r5, %[r]\n\t"
  199002. #endif
  199003. "ldr r6, [%[a]]\n\t"
  199004. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199005. "lsrs r6, r6, #16\n\t"
  199006. #else
  199007. "lsr r6, r6, #16\n\t"
  199008. #endif
  199009. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199010. "lsrs r7, %[b], #16\n\t"
  199011. #else
  199012. "lsr r7, %[b], #16\n\t"
  199013. #endif
  199014. #ifdef WOLFSSL_KEIL
  199015. "muls r7, r6, r7\n\t"
  199016. #elif defined(__clang__)
  199017. "muls r7, r6\n\t"
  199018. #else
  199019. "mul r7, r6\n\t"
  199020. #endif
  199021. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199022. "adds r4, r4, r7\n\t"
  199023. #else
  199024. "add r4, r4, r7\n\t"
  199025. #endif
  199026. #ifdef WOLFSSL_KEIL
  199027. "adcs r5, r5, %[r]\n\t"
  199028. #elif defined(__clang__)
  199029. "adcs r5, %[r]\n\t"
  199030. #else
  199031. "adc r5, %[r]\n\t"
  199032. #endif
  199033. "uxth r7, %[b]\n\t"
  199034. #ifdef WOLFSSL_KEIL
  199035. "muls r6, r7, r6\n\t"
  199036. #elif defined(__clang__)
  199037. "muls r6, r7\n\t"
  199038. #else
  199039. "mul r6, r7\n\t"
  199040. #endif
  199041. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199042. "lsrs r7, r6, #16\n\t"
  199043. #else
  199044. "lsr r7, r6, #16\n\t"
  199045. #endif
  199046. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199047. "lsls r6, r6, #16\n\t"
  199048. #else
  199049. "lsl r6, r6, #16\n\t"
  199050. #endif
  199051. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199052. "adds r3, r3, r6\n\t"
  199053. #else
  199054. "add r3, r3, r6\n\t"
  199055. #endif
  199056. #ifdef WOLFSSL_KEIL
  199057. "adcs r4, r4, r7\n\t"
  199058. #elif defined(__clang__)
  199059. "adcs r4, r7\n\t"
  199060. #else
  199061. "adc r4, r7\n\t"
  199062. #endif
  199063. #ifdef WOLFSSL_KEIL
  199064. "adcs r5, r5, %[r]\n\t"
  199065. #elif defined(__clang__)
  199066. "adcs r5, %[r]\n\t"
  199067. #else
  199068. "adc r5, %[r]\n\t"
  199069. #endif
  199070. "# A[] * B - Done\n\t"
  199071. "mov %[r], r8\n\t"
  199072. "str r3, [%[r]]\n\t"
  199073. "movs r3, r4\n\t"
  199074. "movs r4, r5\n\t"
  199075. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199076. "adds %[r], %[r], #4\n\t"
  199077. #else
  199078. "add %[r], %[r], #4\n\t"
  199079. #endif
  199080. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199081. "adds %[a], %[a], #4\n\t"
  199082. #else
  199083. "add %[a], %[a], #4\n\t"
  199084. #endif
  199085. "mov r8, %[r]\n\t"
  199086. "cmp %[a], r9\n\t"
  199087. "blt L_sp_1024_mul_d_32_%=\n\t"
  199088. "str r3, [%[r]]\n\t"
  199089. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  199090. :
  199091. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  199092. );
  199093. }
  199094. /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div)
  199095. *
  199096. * d1 The high order half of the number to divide.
  199097. * d0 The low order half of the number to divide.
  199098. * div The divisor.
  199099. * returns the result of the division.
  199100. *
  199101. * Note that this is an approximate div. It may give an answer 1 larger.
  199102. */
  199103. SP_NOINLINE static sp_digit div_1024_word_32(sp_digit d1, sp_digit d0,
  199104. sp_digit div)
  199105. {
  199106. __asm__ __volatile__ (
  199107. "movs r3, #0\n\t"
  199108. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199109. "lsrs r5, %[div], #1\n\t"
  199110. #else
  199111. "lsr r5, %[div], #1\n\t"
  199112. #endif
  199113. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199114. "adds r5, r5, #1\n\t"
  199115. #else
  199116. "add r5, r5, #1\n\t"
  199117. #endif
  199118. "mov r8, %[d0]\n\t"
  199119. "mov r9, %[d1]\n\t"
  199120. "# Do top 32\n\t"
  199121. "movs r6, r5\n\t"
  199122. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199123. "subs r6, r6, %[d1]\n\t"
  199124. #else
  199125. "sub r6, r6, %[d1]\n\t"
  199126. #endif
  199127. #ifdef WOLFSSL_KEIL
  199128. "sbcs r6, r6, r6\n\t"
  199129. #elif defined(__clang__)
  199130. "sbcs r6, r6\n\t"
  199131. #else
  199132. "sbc r6, r6\n\t"
  199133. #endif
  199134. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199135. "adds r3, r3, r3\n\t"
  199136. #else
  199137. "add r3, r3, r3\n\t"
  199138. #endif
  199139. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199140. "subs r3, r3, r6\n\t"
  199141. #else
  199142. "sub r3, r3, r6\n\t"
  199143. #endif
  199144. #ifdef WOLFSSL_KEIL
  199145. "ands r6, r6, r5\n\t"
  199146. #elif defined(__clang__)
  199147. "ands r6, r5\n\t"
  199148. #else
  199149. "and r6, r5\n\t"
  199150. #endif
  199151. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199152. "subs %[d1], %[d1], r6\n\t"
  199153. #else
  199154. "sub %[d1], %[d1], r6\n\t"
  199155. #endif
  199156. "movs r4, #29\n\t"
  199157. "\n"
  199158. "L_div_1024_word_32_loop_%=:\n\t"
  199159. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199160. "lsls %[d0], %[d0], #1\n\t"
  199161. #else
  199162. "lsl %[d0], %[d0], #1\n\t"
  199163. #endif
  199164. #ifdef WOLFSSL_KEIL
  199165. "adcs %[d1], %[d1], %[d1]\n\t"
  199166. #elif defined(__clang__)
  199167. "adcs %[d1], %[d1]\n\t"
  199168. #else
  199169. "adc %[d1], %[d1]\n\t"
  199170. #endif
  199171. "movs r6, r5\n\t"
  199172. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199173. "subs r6, r6, %[d1]\n\t"
  199174. #else
  199175. "sub r6, r6, %[d1]\n\t"
  199176. #endif
  199177. #ifdef WOLFSSL_KEIL
  199178. "sbcs r6, r6, r6\n\t"
  199179. #elif defined(__clang__)
  199180. "sbcs r6, r6\n\t"
  199181. #else
  199182. "sbc r6, r6\n\t"
  199183. #endif
  199184. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199185. "adds r3, r3, r3\n\t"
  199186. #else
  199187. "add r3, r3, r3\n\t"
  199188. #endif
  199189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199190. "subs r3, r3, r6\n\t"
  199191. #else
  199192. "sub r3, r3, r6\n\t"
  199193. #endif
  199194. #ifdef WOLFSSL_KEIL
  199195. "ands r6, r6, r5\n\t"
  199196. #elif defined(__clang__)
  199197. "ands r6, r5\n\t"
  199198. #else
  199199. "and r6, r5\n\t"
  199200. #endif
  199201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199202. "subs %[d1], %[d1], r6\n\t"
  199203. #else
  199204. "sub %[d1], %[d1], r6\n\t"
  199205. #endif
  199206. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199207. "subs r4, r4, #1\n\t"
  199208. #else
  199209. "sub r4, r4, #1\n\t"
  199210. #endif
  199211. "bpl L_div_1024_word_32_loop_%=\n\t"
  199212. "movs r7, #0\n\t"
  199213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199214. "adds r3, r3, r3\n\t"
  199215. #else
  199216. "add r3, r3, r3\n\t"
  199217. #endif
  199218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199219. "adds r3, r3, #1\n\t"
  199220. #else
  199221. "add r3, r3, #1\n\t"
  199222. #endif
  199223. "# r * div - Start\n\t"
  199224. "uxth %[d1], r3\n\t"
  199225. "uxth r4, %[div]\n\t"
  199226. #ifdef WOLFSSL_KEIL
  199227. "muls r4, %[d1], r4\n\t"
  199228. #elif defined(__clang__)
  199229. "muls r4, %[d1]\n\t"
  199230. #else
  199231. "mul r4, %[d1]\n\t"
  199232. #endif
  199233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199234. "lsrs r6, %[div], #16\n\t"
  199235. #else
  199236. "lsr r6, %[div], #16\n\t"
  199237. #endif
  199238. #ifdef WOLFSSL_KEIL
  199239. "muls %[d1], r6, %[d1]\n\t"
  199240. #elif defined(__clang__)
  199241. "muls %[d1], r6\n\t"
  199242. #else
  199243. "mul %[d1], r6\n\t"
  199244. #endif
  199245. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199246. "lsrs r5, %[d1], #16\n\t"
  199247. #else
  199248. "lsr r5, %[d1], #16\n\t"
  199249. #endif
  199250. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199251. "lsls %[d1], %[d1], #16\n\t"
  199252. #else
  199253. "lsl %[d1], %[d1], #16\n\t"
  199254. #endif
  199255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199256. "adds r4, r4, %[d1]\n\t"
  199257. #else
  199258. "add r4, r4, %[d1]\n\t"
  199259. #endif
  199260. #ifdef WOLFSSL_KEIL
  199261. "adcs r5, r5, r7\n\t"
  199262. #elif defined(__clang__)
  199263. "adcs r5, r7\n\t"
  199264. #else
  199265. "adc r5, r7\n\t"
  199266. #endif
  199267. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199268. "lsrs %[d1], r3, #16\n\t"
  199269. #else
  199270. "lsr %[d1], r3, #16\n\t"
  199271. #endif
  199272. #ifdef WOLFSSL_KEIL
  199273. "muls r6, %[d1], r6\n\t"
  199274. #elif defined(__clang__)
  199275. "muls r6, %[d1]\n\t"
  199276. #else
  199277. "mul r6, %[d1]\n\t"
  199278. #endif
  199279. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199280. "adds r5, r5, r6\n\t"
  199281. #else
  199282. "add r5, r5, r6\n\t"
  199283. #endif
  199284. "uxth r6, %[div]\n\t"
  199285. #ifdef WOLFSSL_KEIL
  199286. "muls %[d1], r6, %[d1]\n\t"
  199287. #elif defined(__clang__)
  199288. "muls %[d1], r6\n\t"
  199289. #else
  199290. "mul %[d1], r6\n\t"
  199291. #endif
  199292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199293. "lsrs r6, %[d1], #16\n\t"
  199294. #else
  199295. "lsr r6, %[d1], #16\n\t"
  199296. #endif
  199297. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199298. "lsls %[d1], %[d1], #16\n\t"
  199299. #else
  199300. "lsl %[d1], %[d1], #16\n\t"
  199301. #endif
  199302. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199303. "adds r4, r4, %[d1]\n\t"
  199304. #else
  199305. "add r4, r4, %[d1]\n\t"
  199306. #endif
  199307. #ifdef WOLFSSL_KEIL
  199308. "adcs r5, r5, r6\n\t"
  199309. #elif defined(__clang__)
  199310. "adcs r5, r6\n\t"
  199311. #else
  199312. "adc r5, r6\n\t"
  199313. #endif
  199314. "# r * div - Done\n\t"
  199315. "mov %[d1], r8\n\t"
  199316. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199317. "subs %[d1], %[d1], r4\n\t"
  199318. #else
  199319. "sub %[d1], %[d1], r4\n\t"
  199320. #endif
  199321. "movs r4, %[d1]\n\t"
  199322. "mov %[d1], r9\n\t"
  199323. #ifdef WOLFSSL_KEIL
  199324. "sbcs %[d1], %[d1], r5\n\t"
  199325. #elif defined(__clang__)
  199326. "sbcs %[d1], r5\n\t"
  199327. #else
  199328. "sbc %[d1], r5\n\t"
  199329. #endif
  199330. "movs r5, %[d1]\n\t"
  199331. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199332. "adds r3, r3, r5\n\t"
  199333. #else
  199334. "add r3, r3, r5\n\t"
  199335. #endif
  199336. "# r * div - Start\n\t"
  199337. "uxth %[d1], r3\n\t"
  199338. "uxth r4, %[div]\n\t"
  199339. #ifdef WOLFSSL_KEIL
  199340. "muls r4, %[d1], r4\n\t"
  199341. #elif defined(__clang__)
  199342. "muls r4, %[d1]\n\t"
  199343. #else
  199344. "mul r4, %[d1]\n\t"
  199345. #endif
  199346. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199347. "lsrs r6, %[div], #16\n\t"
  199348. #else
  199349. "lsr r6, %[div], #16\n\t"
  199350. #endif
  199351. #ifdef WOLFSSL_KEIL
  199352. "muls %[d1], r6, %[d1]\n\t"
  199353. #elif defined(__clang__)
  199354. "muls %[d1], r6\n\t"
  199355. #else
  199356. "mul %[d1], r6\n\t"
  199357. #endif
  199358. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199359. "lsrs r5, %[d1], #16\n\t"
  199360. #else
  199361. "lsr r5, %[d1], #16\n\t"
  199362. #endif
  199363. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199364. "lsls %[d1], %[d1], #16\n\t"
  199365. #else
  199366. "lsl %[d1], %[d1], #16\n\t"
  199367. #endif
  199368. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199369. "adds r4, r4, %[d1]\n\t"
  199370. #else
  199371. "add r4, r4, %[d1]\n\t"
  199372. #endif
  199373. #ifdef WOLFSSL_KEIL
  199374. "adcs r5, r5, r7\n\t"
  199375. #elif defined(__clang__)
  199376. "adcs r5, r7\n\t"
  199377. #else
  199378. "adc r5, r7\n\t"
  199379. #endif
  199380. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199381. "lsrs %[d1], r3, #16\n\t"
  199382. #else
  199383. "lsr %[d1], r3, #16\n\t"
  199384. #endif
  199385. #ifdef WOLFSSL_KEIL
  199386. "muls r6, %[d1], r6\n\t"
  199387. #elif defined(__clang__)
  199388. "muls r6, %[d1]\n\t"
  199389. #else
  199390. "mul r6, %[d1]\n\t"
  199391. #endif
  199392. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199393. "adds r5, r5, r6\n\t"
  199394. #else
  199395. "add r5, r5, r6\n\t"
  199396. #endif
  199397. "uxth r6, %[div]\n\t"
  199398. #ifdef WOLFSSL_KEIL
  199399. "muls %[d1], r6, %[d1]\n\t"
  199400. #elif defined(__clang__)
  199401. "muls %[d1], r6\n\t"
  199402. #else
  199403. "mul %[d1], r6\n\t"
  199404. #endif
  199405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199406. "lsrs r6, %[d1], #16\n\t"
  199407. #else
  199408. "lsr r6, %[d1], #16\n\t"
  199409. #endif
  199410. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199411. "lsls %[d1], %[d1], #16\n\t"
  199412. #else
  199413. "lsl %[d1], %[d1], #16\n\t"
  199414. #endif
  199415. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199416. "adds r4, r4, %[d1]\n\t"
  199417. #else
  199418. "add r4, r4, %[d1]\n\t"
  199419. #endif
  199420. #ifdef WOLFSSL_KEIL
  199421. "adcs r5, r5, r6\n\t"
  199422. #elif defined(__clang__)
  199423. "adcs r5, r6\n\t"
  199424. #else
  199425. "adc r5, r6\n\t"
  199426. #endif
  199427. "# r * div - Done\n\t"
  199428. "mov %[d1], r8\n\t"
  199429. "mov r6, r9\n\t"
  199430. #ifdef WOLFSSL_KEIL
  199431. "subs r4, %[d1], r4\n\t"
  199432. #else
  199433. #ifdef __clang__
  199434. "subs r4, %[d1], r4\n\t"
  199435. #else
  199436. "sub r4, %[d1], r4\n\t"
  199437. #endif
  199438. #endif
  199439. #ifdef WOLFSSL_KEIL
  199440. "sbcs r6, r6, r5\n\t"
  199441. #elif defined(__clang__)
  199442. "sbcs r6, r5\n\t"
  199443. #else
  199444. "sbc r6, r5\n\t"
  199445. #endif
  199446. "movs r5, r6\n\t"
  199447. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199448. "adds r3, r3, r5\n\t"
  199449. #else
  199450. "add r3, r3, r5\n\t"
  199451. #endif
  199452. "# r * div - Start\n\t"
  199453. "uxth %[d1], r3\n\t"
  199454. "uxth r4, %[div]\n\t"
  199455. #ifdef WOLFSSL_KEIL
  199456. "muls r4, %[d1], r4\n\t"
  199457. #elif defined(__clang__)
  199458. "muls r4, %[d1]\n\t"
  199459. #else
  199460. "mul r4, %[d1]\n\t"
  199461. #endif
  199462. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199463. "lsrs r6, %[div], #16\n\t"
  199464. #else
  199465. "lsr r6, %[div], #16\n\t"
  199466. #endif
  199467. #ifdef WOLFSSL_KEIL
  199468. "muls %[d1], r6, %[d1]\n\t"
  199469. #elif defined(__clang__)
  199470. "muls %[d1], r6\n\t"
  199471. #else
  199472. "mul %[d1], r6\n\t"
  199473. #endif
  199474. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199475. "lsrs r5, %[d1], #16\n\t"
  199476. #else
  199477. "lsr r5, %[d1], #16\n\t"
  199478. #endif
  199479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199480. "lsls %[d1], %[d1], #16\n\t"
  199481. #else
  199482. "lsl %[d1], %[d1], #16\n\t"
  199483. #endif
  199484. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199485. "adds r4, r4, %[d1]\n\t"
  199486. #else
  199487. "add r4, r4, %[d1]\n\t"
  199488. #endif
  199489. #ifdef WOLFSSL_KEIL
  199490. "adcs r5, r5, r7\n\t"
  199491. #elif defined(__clang__)
  199492. "adcs r5, r7\n\t"
  199493. #else
  199494. "adc r5, r7\n\t"
  199495. #endif
  199496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199497. "lsrs %[d1], r3, #16\n\t"
  199498. #else
  199499. "lsr %[d1], r3, #16\n\t"
  199500. #endif
  199501. #ifdef WOLFSSL_KEIL
  199502. "muls r6, %[d1], r6\n\t"
  199503. #elif defined(__clang__)
  199504. "muls r6, %[d1]\n\t"
  199505. #else
  199506. "mul r6, %[d1]\n\t"
  199507. #endif
  199508. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199509. "adds r5, r5, r6\n\t"
  199510. #else
  199511. "add r5, r5, r6\n\t"
  199512. #endif
  199513. "uxth r6, %[div]\n\t"
  199514. #ifdef WOLFSSL_KEIL
  199515. "muls %[d1], r6, %[d1]\n\t"
  199516. #elif defined(__clang__)
  199517. "muls %[d1], r6\n\t"
  199518. #else
  199519. "mul %[d1], r6\n\t"
  199520. #endif
  199521. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199522. "lsrs r6, %[d1], #16\n\t"
  199523. #else
  199524. "lsr r6, %[d1], #16\n\t"
  199525. #endif
  199526. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199527. "lsls %[d1], %[d1], #16\n\t"
  199528. #else
  199529. "lsl %[d1], %[d1], #16\n\t"
  199530. #endif
  199531. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199532. "adds r4, r4, %[d1]\n\t"
  199533. #else
  199534. "add r4, r4, %[d1]\n\t"
  199535. #endif
  199536. #ifdef WOLFSSL_KEIL
  199537. "adcs r5, r5, r6\n\t"
  199538. #elif defined(__clang__)
  199539. "adcs r5, r6\n\t"
  199540. #else
  199541. "adc r5, r6\n\t"
  199542. #endif
  199543. "# r * div - Done\n\t"
  199544. "mov %[d1], r8\n\t"
  199545. "mov r6, r9\n\t"
  199546. #ifdef WOLFSSL_KEIL
  199547. "subs r4, %[d1], r4\n\t"
  199548. #else
  199549. #ifdef __clang__
  199550. "subs r4, %[d1], r4\n\t"
  199551. #else
  199552. "sub r4, %[d1], r4\n\t"
  199553. #endif
  199554. #endif
  199555. #ifdef WOLFSSL_KEIL
  199556. "sbcs r6, r6, r5\n\t"
  199557. #elif defined(__clang__)
  199558. "sbcs r6, r5\n\t"
  199559. #else
  199560. "sbc r6, r5\n\t"
  199561. #endif
  199562. "movs r5, r6\n\t"
  199563. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199564. "adds r3, r3, r5\n\t"
  199565. #else
  199566. "add r3, r3, r5\n\t"
  199567. #endif
  199568. "# r * div - Start\n\t"
  199569. "uxth %[d1], r3\n\t"
  199570. "uxth r4, %[div]\n\t"
  199571. #ifdef WOLFSSL_KEIL
  199572. "muls r4, %[d1], r4\n\t"
  199573. #elif defined(__clang__)
  199574. "muls r4, %[d1]\n\t"
  199575. #else
  199576. "mul r4, %[d1]\n\t"
  199577. #endif
  199578. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199579. "lsrs r6, %[div], #16\n\t"
  199580. #else
  199581. "lsr r6, %[div], #16\n\t"
  199582. #endif
  199583. #ifdef WOLFSSL_KEIL
  199584. "muls %[d1], r6, %[d1]\n\t"
  199585. #elif defined(__clang__)
  199586. "muls %[d1], r6\n\t"
  199587. #else
  199588. "mul %[d1], r6\n\t"
  199589. #endif
  199590. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199591. "lsrs r5, %[d1], #16\n\t"
  199592. #else
  199593. "lsr r5, %[d1], #16\n\t"
  199594. #endif
  199595. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199596. "lsls %[d1], %[d1], #16\n\t"
  199597. #else
  199598. "lsl %[d1], %[d1], #16\n\t"
  199599. #endif
  199600. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199601. "adds r4, r4, %[d1]\n\t"
  199602. #else
  199603. "add r4, r4, %[d1]\n\t"
  199604. #endif
  199605. #ifdef WOLFSSL_KEIL
  199606. "adcs r5, r5, r7\n\t"
  199607. #elif defined(__clang__)
  199608. "adcs r5, r7\n\t"
  199609. #else
  199610. "adc r5, r7\n\t"
  199611. #endif
  199612. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199613. "lsrs %[d1], r3, #16\n\t"
  199614. #else
  199615. "lsr %[d1], r3, #16\n\t"
  199616. #endif
  199617. #ifdef WOLFSSL_KEIL
  199618. "muls r6, %[d1], r6\n\t"
  199619. #elif defined(__clang__)
  199620. "muls r6, %[d1]\n\t"
  199621. #else
  199622. "mul r6, %[d1]\n\t"
  199623. #endif
  199624. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199625. "adds r5, r5, r6\n\t"
  199626. #else
  199627. "add r5, r5, r6\n\t"
  199628. #endif
  199629. "uxth r6, %[div]\n\t"
  199630. #ifdef WOLFSSL_KEIL
  199631. "muls %[d1], r6, %[d1]\n\t"
  199632. #elif defined(__clang__)
  199633. "muls %[d1], r6\n\t"
  199634. #else
  199635. "mul %[d1], r6\n\t"
  199636. #endif
  199637. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199638. "lsrs r6, %[d1], #16\n\t"
  199639. #else
  199640. "lsr r6, %[d1], #16\n\t"
  199641. #endif
  199642. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199643. "lsls %[d1], %[d1], #16\n\t"
  199644. #else
  199645. "lsl %[d1], %[d1], #16\n\t"
  199646. #endif
  199647. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199648. "adds r4, r4, %[d1]\n\t"
  199649. #else
  199650. "add r4, r4, %[d1]\n\t"
  199651. #endif
  199652. #ifdef WOLFSSL_KEIL
  199653. "adcs r5, r5, r6\n\t"
  199654. #elif defined(__clang__)
  199655. "adcs r5, r6\n\t"
  199656. #else
  199657. "adc r5, r6\n\t"
  199658. #endif
  199659. "# r * div - Done\n\t"
  199660. "mov %[d1], r8\n\t"
  199661. "mov r6, r9\n\t"
  199662. #ifdef WOLFSSL_KEIL
  199663. "subs r4, %[d1], r4\n\t"
  199664. #else
  199665. #ifdef __clang__
  199666. "subs r4, %[d1], r4\n\t"
  199667. #else
  199668. "sub r4, %[d1], r4\n\t"
  199669. #endif
  199670. #endif
  199671. #ifdef WOLFSSL_KEIL
  199672. "sbcs r6, r6, r5\n\t"
  199673. #elif defined(__clang__)
  199674. "sbcs r6, r5\n\t"
  199675. #else
  199676. "sbc r6, r5\n\t"
  199677. #endif
  199678. "movs r5, r6\n\t"
  199679. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199680. "adds r3, r3, r5\n\t"
  199681. #else
  199682. "add r3, r3, r5\n\t"
  199683. #endif
  199684. "movs r6, %[div]\n\t"
  199685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199686. "subs r6, r6, r4\n\t"
  199687. #else
  199688. "sub r6, r6, r4\n\t"
  199689. #endif
  199690. #ifdef WOLFSSL_KEIL
  199691. "sbcs r6, r6, r6\n\t"
  199692. #elif defined(__clang__)
  199693. "sbcs r6, r6\n\t"
  199694. #else
  199695. "sbc r6, r6\n\t"
  199696. #endif
  199697. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199698. "subs r3, r3, r6\n\t"
  199699. #else
  199700. "sub r3, r3, r6\n\t"
  199701. #endif
  199702. "movs %[d1], r3\n\t"
  199703. : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div)
  199704. :
  199705. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9"
  199706. );
  199707. return (uint32_t)(size_t)d1;
  199708. }
  199709. /* AND m into each word of a and store in r.
  199710. *
  199711. * r A single precision integer.
  199712. * a A single precision integer.
  199713. * m Mask to AND against each digit.
  199714. */
  199715. static void sp_1024_mask_32(sp_digit* r, const sp_digit* a, sp_digit m)
  199716. {
  199717. #ifdef WOLFSSL_SP_SMALL
  199718. int i;
  199719. for (i=0; i<32; i++) {
  199720. r[i] = a[i] & m;
  199721. }
  199722. #else
  199723. int i;
  199724. for (i = 0; i < 32; i += 8) {
  199725. r[i+0] = a[i+0] & m;
  199726. r[i+1] = a[i+1] & m;
  199727. r[i+2] = a[i+2] & m;
  199728. r[i+3] = a[i+3] & m;
  199729. r[i+4] = a[i+4] & m;
  199730. r[i+5] = a[i+5] & m;
  199731. r[i+6] = a[i+6] & m;
  199732. r[i+7] = a[i+7] & m;
  199733. }
  199734. #endif
  199735. }
  199736. /* Compare a with b in constant time.
  199737. *
  199738. * a A single precision integer.
  199739. * b A single precision integer.
  199740. * return -ve, 0 or +ve if a is less than, equal to or greater than b
  199741. * respectively.
  199742. */
  199743. SP_NOINLINE static sp_int32 sp_1024_cmp_32(const sp_digit* a, const sp_digit* b)
  199744. {
  199745. __asm__ __volatile__ (
  199746. "movs r2, #0\n\t"
  199747. "movs r3, #0\n\t"
  199748. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199749. "mvns r3, r3\n\t"
  199750. #else
  199751. "mvn r3, r3\n\t"
  199752. #endif
  199753. "movs r6, #0x7c\n\t"
  199754. "\n"
  199755. "L_sp_1024_cmp_32_words_%=:\n\t"
  199756. "ldr r7, [%[a], r6]\n\t"
  199757. "ldr r5, [%[b], r6]\n\t"
  199758. #ifdef WOLFSSL_KEIL
  199759. "ands r7, r7, r3\n\t"
  199760. #elif defined(__clang__)
  199761. "ands r7, r3\n\t"
  199762. #else
  199763. "and r7, r3\n\t"
  199764. #endif
  199765. #ifdef WOLFSSL_KEIL
  199766. "ands r5, r5, r3\n\t"
  199767. #elif defined(__clang__)
  199768. "ands r5, r3\n\t"
  199769. #else
  199770. "and r5, r3\n\t"
  199771. #endif
  199772. "movs r4, r7\n\t"
  199773. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199774. "subs r7, r7, r5\n\t"
  199775. #else
  199776. "sub r7, r7, r5\n\t"
  199777. #endif
  199778. #ifdef WOLFSSL_KEIL
  199779. "sbcs r7, r7, r7\n\t"
  199780. #elif defined(__clang__)
  199781. "sbcs r7, r7\n\t"
  199782. #else
  199783. "sbc r7, r7\n\t"
  199784. #endif
  199785. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199786. "adds r2, r2, r7\n\t"
  199787. #else
  199788. "add r2, r2, r7\n\t"
  199789. #endif
  199790. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199791. "mvns r7, r7\n\t"
  199792. #else
  199793. "mvn r7, r7\n\t"
  199794. #endif
  199795. #ifdef WOLFSSL_KEIL
  199796. "ands r3, r3, r7\n\t"
  199797. #elif defined(__clang__)
  199798. "ands r3, r7\n\t"
  199799. #else
  199800. "and r3, r7\n\t"
  199801. #endif
  199802. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199803. "subs r5, r5, r4\n\t"
  199804. #else
  199805. "sub r5, r5, r4\n\t"
  199806. #endif
  199807. #ifdef WOLFSSL_KEIL
  199808. "sbcs r7, r7, r7\n\t"
  199809. #elif defined(__clang__)
  199810. "sbcs r7, r7\n\t"
  199811. #else
  199812. "sbc r7, r7\n\t"
  199813. #endif
  199814. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199815. "subs r2, r2, r7\n\t"
  199816. #else
  199817. "sub r2, r2, r7\n\t"
  199818. #endif
  199819. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199820. "mvns r7, r7\n\t"
  199821. #else
  199822. "mvn r7, r7\n\t"
  199823. #endif
  199824. #ifdef WOLFSSL_KEIL
  199825. "ands r3, r3, r7\n\t"
  199826. #elif defined(__clang__)
  199827. "ands r3, r7\n\t"
  199828. #else
  199829. "and r3, r7\n\t"
  199830. #endif
  199831. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  199832. "subs r6, r6, #4\n\t"
  199833. #else
  199834. "sub r6, r6, #4\n\t"
  199835. #endif
  199836. "bge L_sp_1024_cmp_32_words_%=\n\t"
  199837. "movs %[a], r2\n\t"
  199838. : [a] "+l" (a), [b] "+l" (b)
  199839. :
  199840. : "memory", "r2", "r3", "r4", "r5", "r6", "r7"
  199841. );
  199842. return (uint32_t)(size_t)a;
  199843. }
  199844. /* Divide d in a and put remainder into r (m*d + r = a)
  199845. * m is not calculated as it is not needed at this time.
  199846. *
  199847. * a Number to be divided.
  199848. * d Number to divide with.
  199849. * m Multiplier result.
  199850. * r Remainder from the division.
  199851. * returns MP_OKAY indicating success.
  199852. */
  199853. static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m,
  199854. sp_digit* r)
  199855. {
  199856. sp_digit t1[64], t2[33];
  199857. sp_digit div, r1;
  199858. int i;
  199859. (void)m;
  199860. div = d[31];
  199861. XMEMCPY(t1, a, sizeof(*t1) * 2 * 32);
  199862. r1 = sp_1024_cmp_32(&t1[32], d) >= 0;
  199863. sp_1024_cond_sub_32(&t1[32], &t1[32], d, (sp_digit)0 - r1);
  199864. for (i = 31; i >= 0; i--) {
  199865. sp_digit mask = 0 - (t1[32 + i] == div);
  199866. sp_digit hi = t1[32 + i] + mask;
  199867. r1 = div_1024_word_32(hi, t1[32 + i - 1], div);
  199868. r1 |= mask;
  199869. sp_1024_mul_d_32(t2, d, r1);
  199870. t1[32 + i] += sp_1024_sub_in_place_32(&t1[i], t2);
  199871. t1[32 + i] -= t2[32];
  199872. sp_1024_mask_32(t2, d, t1[32 + i]);
  199873. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  199874. sp_1024_mask_32(t2, d, t1[32 + i]);
  199875. t1[32 + i] += sp_1024_add_32(&t1[i], &t1[i], t2);
  199876. }
  199877. r1 = sp_1024_cmp_32(t1, d) >= 0;
  199878. sp_1024_cond_sub_32(r, t1, d, (sp_digit)0 - r1);
  199879. return MP_OKAY;
  199880. }
  199881. /* Reduce a modulo m into r. (r = a mod m)
  199882. *
  199883. * r A single precision number that is the reduced result.
  199884. * a A single precision number that is to be reduced.
  199885. * m A single precision number that is the modulus to reduce with.
  199886. * returns MP_OKAY indicating success.
  199887. */
  199888. static WC_INLINE int sp_1024_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m)
  199889. {
  199890. int ret;
  199891. ret = sp_1024_div_32(a, m, NULL, r);
  199892. return ret;
  199893. }
  199894. /* Multiply a number by Montgomery normalizer mod modulus (prime).
  199895. *
  199896. * r The resulting Montgomery form number.
  199897. * a The number to convert.
  199898. * m The modulus (prime).
  199899. * returns MEMORY_E when memory allocation fails and MP_OKAY otherwise.
  199900. */
  199901. static int sp_1024_mod_mul_norm_32(sp_digit* r, const sp_digit* a,
  199902. const sp_digit* m)
  199903. {
  199904. sp_1024_mul_32(r, a, p1024_norm_mod);
  199905. return sp_1024_mod_32(r, r, m);
  199906. }
  199907. #ifdef WOLFCRYPT_HAVE_SAKKE
  199908. /* Create a new point.
  199909. *
  199910. * heap [in] Buffer to allocate dynamic memory from.
  199911. * sp [in] Data for point - only if not allocating.
  199912. * p [out] New point.
  199913. * returns MEMORY_E when dynamic memory allocation fails and 0 otherwise.
  199914. */
  199915. static int sp_1024_point_new_ex_32(void* heap, sp_point_1024* sp,
  199916. sp_point_1024** p)
  199917. {
  199918. int ret = MP_OKAY;
  199919. (void)heap;
  199920. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
  199921. (void)sp;
  199922. *p = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap, DYNAMIC_TYPE_ECC);
  199923. #else
  199924. *p = sp;
  199925. #endif
  199926. if (*p == NULL) {
  199927. ret = MEMORY_E;
  199928. }
  199929. return ret;
  199930. }
  199931. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
  199932. /* Allocate memory for point and return error. */
  199933. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), NULL, &(p))
  199934. #else
  199935. /* Set pointer to data and return no error. */
  199936. #define sp_1024_point_new_32(heap, sp, p) sp_1024_point_new_ex_32((heap), &(sp), &(p))
  199937. #endif
  199938. #endif /* WOLFCRYPT_HAVE_SAKKE */
  199939. #ifdef WOLFCRYPT_HAVE_SAKKE
  199940. /* Free the point.
  199941. *
  199942. * p [in,out] Point to free.
  199943. * clear [in] Indicates whether to zeroize point.
  199944. * heap [in] Buffer from which dynamic memory was allocate from.
  199945. */
  199946. static void sp_1024_point_free_32(sp_point_1024* p, int clear, void* heap)
  199947. {
  199948. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && !defined(WOLFSSL_SP_NO_MALLOC)
  199949. /* If valid pointer then clear point data if requested and free data. */
  199950. if (p != NULL) {
  199951. if (clear != 0) {
  199952. XMEMSET(p, 0, sizeof(*p));
  199953. }
  199954. XFREE(p, heap, DYNAMIC_TYPE_ECC);
  199955. }
  199956. #else
  199957. /* Clear point data if requested. */
  199958. if ((p != NULL) && (clear != 0)) {
  199959. XMEMSET(p, 0, sizeof(*p));
  199960. }
  199961. #endif
  199962. (void)heap;
  199963. }
  199964. #endif /* WOLFCRYPT_HAVE_SAKKE */
  199965. /* Convert an mp_int to an array of sp_digit.
  199966. *
  199967. * r A single precision integer.
  199968. * size Maximum number of bytes to convert
  199969. * a A multi-precision integer.
  199970. */
  199971. static void sp_1024_from_mp(sp_digit* r, int size, const mp_int* a)
  199972. {
  199973. #if DIGIT_BIT == 32
  199974. int j;
  199975. XMEMCPY(r, a->dp, sizeof(sp_digit) * a->used);
  199976. for (j = a->used; j < size; j++) {
  199977. r[j] = 0;
  199978. }
  199979. #elif DIGIT_BIT > 32
  199980. int i;
  199981. int j = 0;
  199982. word32 s = 0;
  199983. r[0] = 0;
  199984. for (i = 0; i < a->used && j < size; i++) {
  199985. r[j] |= ((sp_digit)a->dp[i] << s);
  199986. r[j] &= 0xffffffff;
  199987. s = 32U - s;
  199988. if (j + 1 >= size) {
  199989. break;
  199990. }
  199991. /* lint allow cast of mismatch word32 and mp_digit */
  199992. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  199993. while ((s + 32U) <= (word32)DIGIT_BIT) {
  199994. s += 32U;
  199995. r[j] &= 0xffffffff;
  199996. if (j + 1 >= size) {
  199997. break;
  199998. }
  199999. if (s < (word32)DIGIT_BIT) {
  200000. /* lint allow cast of mismatch word32 and mp_digit */
  200001. r[++j] = (sp_digit)(a->dp[i] >> s); /*lint !e9033*/
  200002. }
  200003. else {
  200004. r[++j] = (sp_digit)0;
  200005. }
  200006. }
  200007. s = (word32)DIGIT_BIT - s;
  200008. }
  200009. for (j++; j < size; j++) {
  200010. r[j] = 0;
  200011. }
  200012. #else
  200013. int i;
  200014. int j = 0;
  200015. int s = 0;
  200016. r[0] = 0;
  200017. for (i = 0; i < a->used && j < size; i++) {
  200018. r[j] |= ((sp_digit)a->dp[i]) << s;
  200019. if (s + DIGIT_BIT >= 32) {
  200020. r[j] &= 0xffffffff;
  200021. if (j + 1 >= size) {
  200022. break;
  200023. }
  200024. s = 32 - s;
  200025. if (s == DIGIT_BIT) {
  200026. r[++j] = 0;
  200027. s = 0;
  200028. }
  200029. else {
  200030. r[++j] = a->dp[i] >> s;
  200031. s = DIGIT_BIT - s;
  200032. }
  200033. }
  200034. else {
  200035. s += DIGIT_BIT;
  200036. }
  200037. }
  200038. for (j++; j < size; j++) {
  200039. r[j] = 0;
  200040. }
  200041. #endif
  200042. }
  200043. /* Convert a point of type ecc_point to type sp_point_1024.
  200044. *
  200045. * p Point of type sp_point_1024 (result).
  200046. * pm Point of type ecc_point.
  200047. */
  200048. static void sp_1024_point_from_ecc_point_32(sp_point_1024* p,
  200049. const ecc_point* pm)
  200050. {
  200051. XMEMSET(p->x, 0, sizeof(p->x));
  200052. XMEMSET(p->y, 0, sizeof(p->y));
  200053. XMEMSET(p->z, 0, sizeof(p->z));
  200054. sp_1024_from_mp(p->x, 32, pm->x);
  200055. sp_1024_from_mp(p->y, 32, pm->y);
  200056. sp_1024_from_mp(p->z, 32, pm->z);
  200057. p->infinity = 0;
  200058. }
  200059. /* Convert an array of sp_digit to an mp_int.
  200060. *
  200061. * a A single precision integer.
  200062. * r A multi-precision integer.
  200063. */
  200064. static int sp_1024_to_mp(const sp_digit* a, mp_int* r)
  200065. {
  200066. int err;
  200067. err = mp_grow(r, (1024 + DIGIT_BIT - 1) / DIGIT_BIT);
  200068. if (err == MP_OKAY) { /*lint !e774 case where err is always MP_OKAY*/
  200069. #if DIGIT_BIT == 32
  200070. XMEMCPY(r->dp, a, sizeof(sp_digit) * 32);
  200071. r->used = 32;
  200072. mp_clamp(r);
  200073. #elif DIGIT_BIT < 32
  200074. int i;
  200075. int j = 0;
  200076. int s = 0;
  200077. r->dp[0] = 0;
  200078. for (i = 0; i < 32; i++) {
  200079. r->dp[j] |= (mp_digit)(a[i] << s);
  200080. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  200081. s = DIGIT_BIT - s;
  200082. r->dp[++j] = (mp_digit)(a[i] >> s);
  200083. while (s + DIGIT_BIT <= 32) {
  200084. s += DIGIT_BIT;
  200085. r->dp[j++] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  200086. if (s == SP_WORD_SIZE) {
  200087. r->dp[j] = 0;
  200088. }
  200089. else {
  200090. r->dp[j] = (mp_digit)(a[i] >> s);
  200091. }
  200092. }
  200093. s = 32 - s;
  200094. }
  200095. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  200096. mp_clamp(r);
  200097. #else
  200098. int i;
  200099. int j = 0;
  200100. int s = 0;
  200101. r->dp[0] = 0;
  200102. for (i = 0; i < 32; i++) {
  200103. r->dp[j] |= ((mp_digit)a[i]) << s;
  200104. if (s + 32 >= DIGIT_BIT) {
  200105. #if DIGIT_BIT != 32 && DIGIT_BIT != 64
  200106. r->dp[j] &= ((sp_digit)1 << DIGIT_BIT) - 1;
  200107. #endif
  200108. s = DIGIT_BIT - s;
  200109. r->dp[++j] = a[i] >> s;
  200110. s = 32 - s;
  200111. }
  200112. else {
  200113. s += 32;
  200114. }
  200115. }
  200116. r->used = (1024 + DIGIT_BIT - 1) / DIGIT_BIT;
  200117. mp_clamp(r);
  200118. #endif
  200119. }
  200120. return err;
  200121. }
  200122. /* Convert a point of type sp_point_1024 to type ecc_point.
  200123. *
  200124. * p Point of type sp_point_1024.
  200125. * pm Point of type ecc_point (result).
  200126. * returns MEMORY_E when allocation of memory in ecc_point fails otherwise
  200127. * MP_OKAY.
  200128. */
  200129. static int sp_1024_point_to_ecc_point_32(const sp_point_1024* p, ecc_point* pm)
  200130. {
  200131. int err;
  200132. err = sp_1024_to_mp(p->x, pm->x);
  200133. if (err == MP_OKAY) {
  200134. err = sp_1024_to_mp(p->y, pm->y);
  200135. }
  200136. if (err == MP_OKAY) {
  200137. err = sp_1024_to_mp(p->z, pm->z);
  200138. }
  200139. return err;
  200140. }
  200141. /* Reduce the number back to 1024 bits using Montgomery reduction.
  200142. *
  200143. * a A single precision number to reduce in place.
  200144. * m The single precision number representing the modulus.
  200145. * mp The digit representing the negative inverse of m mod 2^n.
  200146. */
  200147. SP_NOINLINE static void sp_1024_mont_reduce_32(sp_digit* a, const sp_digit* m,
  200148. sp_digit mp)
  200149. {
  200150. __asm__ __volatile__ (
  200151. "movs r7, #0\n\t"
  200152. "mov r8, %[mp]\n\t"
  200153. "mov r12, r7\n\t"
  200154. "mov lr, %[m]\n\t"
  200155. "mov r9, %[a]\n\t"
  200156. "mov r11, %[a]\n\t"
  200157. "movs r5, #0x7c\n\t"
  200158. "movs r6, #0x80\n\t"
  200159. "add r9, r9, r5\n\t"
  200160. "add r11, r11, r6\n\t"
  200161. "\n"
  200162. "L_sp_1024_mont_reduce_32_mod_%=:\n\t"
  200163. "movs r7, #0\n\t"
  200164. "movs r4, #0\n\t"
  200165. "# a[i] += m[0] * mu\n\t"
  200166. "ldm %[m]!, {%[mp]}\n\t"
  200167. "ldm %[a]!, {r3}\n\t"
  200168. "# mu = a[i] * mp\n\t"
  200169. "mov r5, r8\n\t"
  200170. #ifdef WOLFSSL_KEIL
  200171. "muls r5, r3, r5\n\t"
  200172. #elif defined(__clang__)
  200173. "muls r5, r3\n\t"
  200174. #else
  200175. "mul r5, r3\n\t"
  200176. #endif
  200177. "mov r10, r5\n\t"
  200178. "# Multiply m[0] and mu - Start\n\t"
  200179. "mov r5, r10\n\t"
  200180. "uxth r6, %[mp]\n\t"
  200181. "uxth r5, r5\n\t"
  200182. #ifdef WOLFSSL_KEIL
  200183. "muls r6, r5, r6\n\t"
  200184. #elif defined(__clang__)
  200185. "muls r6, r5\n\t"
  200186. #else
  200187. "mul r6, r5\n\t"
  200188. #endif
  200189. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200190. "adds r3, r3, r6\n\t"
  200191. #else
  200192. "add r3, r3, r6\n\t"
  200193. #endif
  200194. #ifdef WOLFSSL_KEIL
  200195. "adcs r4, r4, r7\n\t"
  200196. #elif defined(__clang__)
  200197. "adcs r4, r7\n\t"
  200198. #else
  200199. "adc r4, r7\n\t"
  200200. #endif
  200201. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200202. "lsrs r6, %[mp], #16\n\t"
  200203. #else
  200204. "lsr r6, %[mp], #16\n\t"
  200205. #endif
  200206. #ifdef WOLFSSL_KEIL
  200207. "muls r5, r6, r5\n\t"
  200208. #elif defined(__clang__)
  200209. "muls r5, r6\n\t"
  200210. #else
  200211. "mul r5, r6\n\t"
  200212. #endif
  200213. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200214. "lsrs r6, r5, #16\n\t"
  200215. #else
  200216. "lsr r6, r5, #16\n\t"
  200217. #endif
  200218. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200219. "lsls r5, r5, #16\n\t"
  200220. #else
  200221. "lsl r5, r5, #16\n\t"
  200222. #endif
  200223. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200224. "adds r3, r3, r5\n\t"
  200225. #else
  200226. "add r3, r3, r5\n\t"
  200227. #endif
  200228. #ifdef WOLFSSL_KEIL
  200229. "adcs r4, r4, r6\n\t"
  200230. #elif defined(__clang__)
  200231. "adcs r4, r6\n\t"
  200232. #else
  200233. "adc r4, r6\n\t"
  200234. #endif
  200235. "mov r5, r10\n\t"
  200236. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200237. "lsrs r6, %[mp], #16\n\t"
  200238. #else
  200239. "lsr r6, %[mp], #16\n\t"
  200240. #endif
  200241. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200242. "lsrs r5, r5, #16\n\t"
  200243. #else
  200244. "lsr r5, r5, #16\n\t"
  200245. #endif
  200246. #ifdef WOLFSSL_KEIL
  200247. "muls r6, r5, r6\n\t"
  200248. #elif defined(__clang__)
  200249. "muls r6, r5\n\t"
  200250. #else
  200251. "mul r6, r5\n\t"
  200252. #endif
  200253. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200254. "adds r4, r4, r6\n\t"
  200255. #else
  200256. "add r4, r4, r6\n\t"
  200257. #endif
  200258. "uxth r6, %[mp]\n\t"
  200259. #ifdef WOLFSSL_KEIL
  200260. "muls r5, r6, r5\n\t"
  200261. #elif defined(__clang__)
  200262. "muls r5, r6\n\t"
  200263. #else
  200264. "mul r5, r6\n\t"
  200265. #endif
  200266. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200267. "lsrs r6, r5, #16\n\t"
  200268. #else
  200269. "lsr r6, r5, #16\n\t"
  200270. #endif
  200271. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200272. "lsls r5, r5, #16\n\t"
  200273. #else
  200274. "lsl r5, r5, #16\n\t"
  200275. #endif
  200276. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200277. "adds r3, r3, r5\n\t"
  200278. #else
  200279. "add r3, r3, r5\n\t"
  200280. #endif
  200281. #ifdef WOLFSSL_KEIL
  200282. "adcs r4, r4, r6\n\t"
  200283. #elif defined(__clang__)
  200284. "adcs r4, r6\n\t"
  200285. #else
  200286. "adc r4, r6\n\t"
  200287. #endif
  200288. "# Multiply m[0] and mu - Done\n\t"
  200289. "\n"
  200290. "L_sp_1024_mont_reduce_32_word_%=:\n\t"
  200291. "# a[i+j] += m[j] * mu\n\t"
  200292. "ldr r3, [%[a]]\n\t"
  200293. "ldm %[m]!, {%[mp]}\n\t"
  200294. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200295. "adds r3, r3, r4\n\t"
  200296. #else
  200297. "add r3, r3, r4\n\t"
  200298. #endif
  200299. "movs r4, #0\n\t"
  200300. #ifdef WOLFSSL_KEIL
  200301. "adcs r4, r4, r7\n\t"
  200302. #elif defined(__clang__)
  200303. "adcs r4, r7\n\t"
  200304. #else
  200305. "adc r4, r7\n\t"
  200306. #endif
  200307. "# Multiply m[j] and mu - Start\n\t"
  200308. "mov r5, r10\n\t"
  200309. "uxth r6, %[mp]\n\t"
  200310. "uxth r5, r5\n\t"
  200311. #ifdef WOLFSSL_KEIL
  200312. "muls r6, r5, r6\n\t"
  200313. #elif defined(__clang__)
  200314. "muls r6, r5\n\t"
  200315. #else
  200316. "mul r6, r5\n\t"
  200317. #endif
  200318. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200319. "adds r3, r3, r6\n\t"
  200320. #else
  200321. "add r3, r3, r6\n\t"
  200322. #endif
  200323. #ifdef WOLFSSL_KEIL
  200324. "adcs r4, r4, r7\n\t"
  200325. #elif defined(__clang__)
  200326. "adcs r4, r7\n\t"
  200327. #else
  200328. "adc r4, r7\n\t"
  200329. #endif
  200330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200331. "lsrs r6, %[mp], #16\n\t"
  200332. #else
  200333. "lsr r6, %[mp], #16\n\t"
  200334. #endif
  200335. #ifdef WOLFSSL_KEIL
  200336. "muls r5, r6, r5\n\t"
  200337. #elif defined(__clang__)
  200338. "muls r5, r6\n\t"
  200339. #else
  200340. "mul r5, r6\n\t"
  200341. #endif
  200342. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200343. "lsrs r6, r5, #16\n\t"
  200344. #else
  200345. "lsr r6, r5, #16\n\t"
  200346. #endif
  200347. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200348. "lsls r5, r5, #16\n\t"
  200349. #else
  200350. "lsl r5, r5, #16\n\t"
  200351. #endif
  200352. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200353. "adds r3, r3, r5\n\t"
  200354. #else
  200355. "add r3, r3, r5\n\t"
  200356. #endif
  200357. #ifdef WOLFSSL_KEIL
  200358. "adcs r4, r4, r6\n\t"
  200359. #elif defined(__clang__)
  200360. "adcs r4, r6\n\t"
  200361. #else
  200362. "adc r4, r6\n\t"
  200363. #endif
  200364. "mov r5, r10\n\t"
  200365. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200366. "lsrs r6, %[mp], #16\n\t"
  200367. #else
  200368. "lsr r6, %[mp], #16\n\t"
  200369. #endif
  200370. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200371. "lsrs r5, r5, #16\n\t"
  200372. #else
  200373. "lsr r5, r5, #16\n\t"
  200374. #endif
  200375. #ifdef WOLFSSL_KEIL
  200376. "muls r6, r5, r6\n\t"
  200377. #elif defined(__clang__)
  200378. "muls r6, r5\n\t"
  200379. #else
  200380. "mul r6, r5\n\t"
  200381. #endif
  200382. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200383. "adds r4, r4, r6\n\t"
  200384. #else
  200385. "add r4, r4, r6\n\t"
  200386. #endif
  200387. "uxth r6, %[mp]\n\t"
  200388. #ifdef WOLFSSL_KEIL
  200389. "muls r5, r6, r5\n\t"
  200390. #elif defined(__clang__)
  200391. "muls r5, r6\n\t"
  200392. #else
  200393. "mul r5, r6\n\t"
  200394. #endif
  200395. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200396. "lsrs r6, r5, #16\n\t"
  200397. #else
  200398. "lsr r6, r5, #16\n\t"
  200399. #endif
  200400. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200401. "lsls r5, r5, #16\n\t"
  200402. #else
  200403. "lsl r5, r5, #16\n\t"
  200404. #endif
  200405. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200406. "adds r3, r3, r5\n\t"
  200407. #else
  200408. "add r3, r3, r5\n\t"
  200409. #endif
  200410. #ifdef WOLFSSL_KEIL
  200411. "adcs r4, r4, r6\n\t"
  200412. #elif defined(__clang__)
  200413. "adcs r4, r6\n\t"
  200414. #else
  200415. "adc r4, r6\n\t"
  200416. #endif
  200417. "# Multiply m[j] and mu - Done\n\t"
  200418. "stm %[a]!, {r3}\n\t"
  200419. "cmp %[a], r9\n\t"
  200420. "blt L_sp_1024_mont_reduce_32_word_%=\n\t"
  200421. "# a[i+31] += m[31] * mu\n\t"
  200422. "ldr %[mp], [%[m]]\n\t"
  200423. "mov r3, r12\n\t"
  200424. "# Multiply m[31] and mu - Start\n\t"
  200425. "mov r5, r10\n\t"
  200426. "uxth r6, %[mp]\n\t"
  200427. "uxth r5, r5\n\t"
  200428. #ifdef WOLFSSL_KEIL
  200429. "muls r6, r5, r6\n\t"
  200430. #elif defined(__clang__)
  200431. "muls r6, r5\n\t"
  200432. #else
  200433. "mul r6, r5\n\t"
  200434. #endif
  200435. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200436. "adds r4, r4, r6\n\t"
  200437. #else
  200438. "add r4, r4, r6\n\t"
  200439. #endif
  200440. #ifdef WOLFSSL_KEIL
  200441. "adcs r3, r3, r7\n\t"
  200442. #elif defined(__clang__)
  200443. "adcs r3, r7\n\t"
  200444. #else
  200445. "adc r3, r7\n\t"
  200446. #endif
  200447. #ifdef WOLFSSL_KEIL
  200448. "adcs r7, r7, r7\n\t"
  200449. #elif defined(__clang__)
  200450. "adcs r7, r7\n\t"
  200451. #else
  200452. "adc r7, r7\n\t"
  200453. #endif
  200454. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200455. "lsrs r6, %[mp], #16\n\t"
  200456. #else
  200457. "lsr r6, %[mp], #16\n\t"
  200458. #endif
  200459. #ifdef WOLFSSL_KEIL
  200460. "muls r5, r6, r5\n\t"
  200461. #elif defined(__clang__)
  200462. "muls r5, r6\n\t"
  200463. #else
  200464. "mul r5, r6\n\t"
  200465. #endif
  200466. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200467. "lsrs r6, r5, #16\n\t"
  200468. #else
  200469. "lsr r6, r5, #16\n\t"
  200470. #endif
  200471. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200472. "lsls r5, r5, #16\n\t"
  200473. #else
  200474. "lsl r5, r5, #16\n\t"
  200475. #endif
  200476. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200477. "adds r4, r4, r5\n\t"
  200478. #else
  200479. "add r4, r4, r5\n\t"
  200480. #endif
  200481. #ifdef WOLFSSL_KEIL
  200482. "adcs r3, r3, r6\n\t"
  200483. #elif defined(__clang__)
  200484. "adcs r3, r6\n\t"
  200485. #else
  200486. "adc r3, r6\n\t"
  200487. #endif
  200488. #ifdef WOLFSSL_KEIL
  200489. "adcs r7, r7, r7\n\t"
  200490. #elif defined(__clang__)
  200491. "adcs r7, r7\n\t"
  200492. #else
  200493. "adc r7, r7\n\t"
  200494. #endif
  200495. "mov r5, r10\n\t"
  200496. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200497. "lsrs r6, %[mp], #16\n\t"
  200498. #else
  200499. "lsr r6, %[mp], #16\n\t"
  200500. #endif
  200501. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200502. "lsrs r5, r5, #16\n\t"
  200503. #else
  200504. "lsr r5, r5, #16\n\t"
  200505. #endif
  200506. #ifdef WOLFSSL_KEIL
  200507. "muls r6, r5, r6\n\t"
  200508. #elif defined(__clang__)
  200509. "muls r6, r5\n\t"
  200510. #else
  200511. "mul r6, r5\n\t"
  200512. #endif
  200513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200514. "adds r3, r3, r6\n\t"
  200515. #else
  200516. "add r3, r3, r6\n\t"
  200517. #endif
  200518. #ifdef WOLFSSL_KEIL
  200519. "adcs r7, r7, r7\n\t"
  200520. #elif defined(__clang__)
  200521. "adcs r7, r7\n\t"
  200522. #else
  200523. "adc r7, r7\n\t"
  200524. #endif
  200525. "uxth r6, %[mp]\n\t"
  200526. #ifdef WOLFSSL_KEIL
  200527. "muls r5, r6, r5\n\t"
  200528. #elif defined(__clang__)
  200529. "muls r5, r6\n\t"
  200530. #else
  200531. "mul r5, r6\n\t"
  200532. #endif
  200533. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200534. "lsrs r6, r5, #16\n\t"
  200535. #else
  200536. "lsr r6, r5, #16\n\t"
  200537. #endif
  200538. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200539. "lsls r5, r5, #16\n\t"
  200540. #else
  200541. "lsl r5, r5, #16\n\t"
  200542. #endif
  200543. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200544. "adds r4, r4, r5\n\t"
  200545. #else
  200546. "add r4, r4, r5\n\t"
  200547. #endif
  200548. #ifdef WOLFSSL_KEIL
  200549. "adcs r3, r3, r6\n\t"
  200550. #elif defined(__clang__)
  200551. "adcs r3, r6\n\t"
  200552. #else
  200553. "adc r3, r6\n\t"
  200554. #endif
  200555. #ifdef WOLFSSL_KEIL
  200556. "adcs r7, r7, r7\n\t"
  200557. #elif defined(__clang__)
  200558. "adcs r7, r7\n\t"
  200559. #else
  200560. "adc r7, r7\n\t"
  200561. #endif
  200562. "# Multiply m[31] and mu - Done\n\t"
  200563. "ldr r5, [%[a]]\n\t"
  200564. "ldr r6, [%[a], #4]\n\t"
  200565. "movs %[mp], #0\n\t"
  200566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200567. "adds r5, r5, r4\n\t"
  200568. #else
  200569. "add r5, r5, r4\n\t"
  200570. #endif
  200571. #ifdef WOLFSSL_KEIL
  200572. "adcs r6, r6, r3\n\t"
  200573. #elif defined(__clang__)
  200574. "adcs r6, r3\n\t"
  200575. #else
  200576. "adc r6, r3\n\t"
  200577. #endif
  200578. #ifdef WOLFSSL_KEIL
  200579. "adcs r7, r7, %[mp]\n\t"
  200580. #elif defined(__clang__)
  200581. "adcs r7, %[mp]\n\t"
  200582. #else
  200583. "adc r7, %[mp]\n\t"
  200584. #endif
  200585. "stm %[a]!, {r5, r6}\n\t"
  200586. "# i += 1\n\t"
  200587. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200588. "subs %[a], %[a], #4\n\t"
  200589. #else
  200590. "sub %[a], %[a], #4\n\t"
  200591. #endif
  200592. "movs r3, #0x7c\n\t"
  200593. "mov r9, %[a]\n\t"
  200594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200595. "subs %[a], %[a], r3\n\t"
  200596. #else
  200597. "sub %[a], %[a], r3\n\t"
  200598. #endif
  200599. "mov r12, r7\n\t"
  200600. "mov %[m], lr\n\t"
  200601. "cmp r11, %[a]\n\t"
  200602. "bgt L_sp_1024_mont_reduce_32_mod_%=\n\t"
  200603. "ldr r5, [%[m], #124]\n\t"
  200604. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200605. "negs r7, r7\n\t"
  200606. #else
  200607. "neg r7, r7\n\t"
  200608. #endif
  200609. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200610. "subs r5, r5, r6\n\t"
  200611. #else
  200612. "sub r5, r5, r6\n\t"
  200613. #endif
  200614. #ifdef WOLFSSL_KEIL
  200615. "sbcs r5, r5, r5\n\t"
  200616. #elif defined(__clang__)
  200617. "sbcs r5, r5\n\t"
  200618. #else
  200619. "sbc r5, r5\n\t"
  200620. #endif
  200621. #ifdef WOLFSSL_KEIL
  200622. "orrs r7, r7, r5\n\t"
  200623. #elif defined(__clang__)
  200624. "orrs r7, r5\n\t"
  200625. #else
  200626. "orr r7, r5\n\t"
  200627. #endif
  200628. "# Subtract masked modulus\n\t"
  200629. "movs r4, #0x80\n\t"
  200630. "movs %[mp], #0\n\t"
  200631. "movs r3, #0\n\t"
  200632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200633. "subs %[a], %[a], r4\n\t"
  200634. #else
  200635. "sub %[a], %[a], r4\n\t"
  200636. #endif
  200637. #ifndef WOLFSSL_SP_LARGE_CODE
  200638. "\n"
  200639. "L_sp_1024_mont_reduce_32_sub_mask_%=:\n\t"
  200640. "ldm %[m]!, {r6}\n\t"
  200641. "movs r5, #0\n\t"
  200642. #ifdef WOLFSSL_KEIL
  200643. "ands r6, r6, r7\n\t"
  200644. #elif defined(__clang__)
  200645. "ands r6, r7\n\t"
  200646. #else
  200647. "and r6, r7\n\t"
  200648. #endif
  200649. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200650. "subs r5, r5, %[mp]\n\t"
  200651. #else
  200652. "sub r5, r5, %[mp]\n\t"
  200653. #endif
  200654. "ldr r5, [%[a], r4]\n\t"
  200655. #ifdef WOLFSSL_KEIL
  200656. "sbcs r5, r5, r6\n\t"
  200657. #elif defined(__clang__)
  200658. "sbcs r5, r6\n\t"
  200659. #else
  200660. "sbc r5, r6\n\t"
  200661. #endif
  200662. #ifdef WOLFSSL_KEIL
  200663. "sbcs %[mp], %[mp], %[mp]\n\t"
  200664. #elif defined(__clang__)
  200665. "sbcs %[mp], %[mp]\n\t"
  200666. #else
  200667. "sbc %[mp], %[mp]\n\t"
  200668. #endif
  200669. "stm %[a]!, {r5}\n\t"
  200670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200671. "adds r3, r3, #4\n\t"
  200672. #else
  200673. "add r3, r3, #4\n\t"
  200674. #endif
  200675. "cmp r3, r4\n\t"
  200676. "blt L_sp_1024_mont_reduce_32_sub_mask_%=\n\t"
  200677. #else /* WOLFSSL_SP_LARGE_CODE */
  200678. "ldm %[m]!, {r6}\n\t"
  200679. #ifdef WOLFSSL_KEIL
  200680. "ands r6, r6, r7\n\t"
  200681. #elif defined(__clang__)
  200682. "ands r6, r7\n\t"
  200683. #else
  200684. "and r6, r7\n\t"
  200685. #endif
  200686. "ldr r5, [%[a], r4]\n\t"
  200687. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  200688. "subs r5, r5, r6\n\t"
  200689. #else
  200690. "sub r5, r5, r6\n\t"
  200691. #endif
  200692. "stm %[a]!, {r5}\n\t"
  200693. "ldm %[m]!, {r6}\n\t"
  200694. #ifdef WOLFSSL_KEIL
  200695. "ands r6, r6, r7\n\t"
  200696. #elif defined(__clang__)
  200697. "ands r6, r7\n\t"
  200698. #else
  200699. "and r6, r7\n\t"
  200700. #endif
  200701. "ldr r5, [%[a], r4]\n\t"
  200702. #ifdef WOLFSSL_KEIL
  200703. "sbcs r5, r5, r6\n\t"
  200704. #elif defined(__clang__)
  200705. "sbcs r5, r6\n\t"
  200706. #else
  200707. "sbc r5, r6\n\t"
  200708. #endif
  200709. "stm %[a]!, {r5}\n\t"
  200710. "ldm %[m]!, {r6}\n\t"
  200711. #ifdef WOLFSSL_KEIL
  200712. "ands r6, r6, r7\n\t"
  200713. #elif defined(__clang__)
  200714. "ands r6, r7\n\t"
  200715. #else
  200716. "and r6, r7\n\t"
  200717. #endif
  200718. "ldr r5, [%[a], r4]\n\t"
  200719. #ifdef WOLFSSL_KEIL
  200720. "sbcs r5, r5, r6\n\t"
  200721. #elif defined(__clang__)
  200722. "sbcs r5, r6\n\t"
  200723. #else
  200724. "sbc r5, r6\n\t"
  200725. #endif
  200726. "stm %[a]!, {r5}\n\t"
  200727. "ldm %[m]!, {r6}\n\t"
  200728. #ifdef WOLFSSL_KEIL
  200729. "ands r6, r6, r7\n\t"
  200730. #elif defined(__clang__)
  200731. "ands r6, r7\n\t"
  200732. #else
  200733. "and r6, r7\n\t"
  200734. #endif
  200735. "ldr r5, [%[a], r4]\n\t"
  200736. #ifdef WOLFSSL_KEIL
  200737. "sbcs r5, r5, r6\n\t"
  200738. #elif defined(__clang__)
  200739. "sbcs r5, r6\n\t"
  200740. #else
  200741. "sbc r5, r6\n\t"
  200742. #endif
  200743. "stm %[a]!, {r5}\n\t"
  200744. "ldm %[m]!, {r6}\n\t"
  200745. #ifdef WOLFSSL_KEIL
  200746. "ands r6, r6, r7\n\t"
  200747. #elif defined(__clang__)
  200748. "ands r6, r7\n\t"
  200749. #else
  200750. "and r6, r7\n\t"
  200751. #endif
  200752. "ldr r5, [%[a], r4]\n\t"
  200753. #ifdef WOLFSSL_KEIL
  200754. "sbcs r5, r5, r6\n\t"
  200755. #elif defined(__clang__)
  200756. "sbcs r5, r6\n\t"
  200757. #else
  200758. "sbc r5, r6\n\t"
  200759. #endif
  200760. "stm %[a]!, {r5}\n\t"
  200761. "ldm %[m]!, {r6}\n\t"
  200762. #ifdef WOLFSSL_KEIL
  200763. "ands r6, r6, r7\n\t"
  200764. #elif defined(__clang__)
  200765. "ands r6, r7\n\t"
  200766. #else
  200767. "and r6, r7\n\t"
  200768. #endif
  200769. "ldr r5, [%[a], r4]\n\t"
  200770. #ifdef WOLFSSL_KEIL
  200771. "sbcs r5, r5, r6\n\t"
  200772. #elif defined(__clang__)
  200773. "sbcs r5, r6\n\t"
  200774. #else
  200775. "sbc r5, r6\n\t"
  200776. #endif
  200777. "stm %[a]!, {r5}\n\t"
  200778. "ldm %[m]!, {r6}\n\t"
  200779. #ifdef WOLFSSL_KEIL
  200780. "ands r6, r6, r7\n\t"
  200781. #elif defined(__clang__)
  200782. "ands r6, r7\n\t"
  200783. #else
  200784. "and r6, r7\n\t"
  200785. #endif
  200786. "ldr r5, [%[a], r4]\n\t"
  200787. #ifdef WOLFSSL_KEIL
  200788. "sbcs r5, r5, r6\n\t"
  200789. #elif defined(__clang__)
  200790. "sbcs r5, r6\n\t"
  200791. #else
  200792. "sbc r5, r6\n\t"
  200793. #endif
  200794. "stm %[a]!, {r5}\n\t"
  200795. "ldm %[m]!, {r6}\n\t"
  200796. #ifdef WOLFSSL_KEIL
  200797. "ands r6, r6, r7\n\t"
  200798. #elif defined(__clang__)
  200799. "ands r6, r7\n\t"
  200800. #else
  200801. "and r6, r7\n\t"
  200802. #endif
  200803. "ldr r5, [%[a], r4]\n\t"
  200804. #ifdef WOLFSSL_KEIL
  200805. "sbcs r5, r5, r6\n\t"
  200806. #elif defined(__clang__)
  200807. "sbcs r5, r6\n\t"
  200808. #else
  200809. "sbc r5, r6\n\t"
  200810. #endif
  200811. "stm %[a]!, {r5}\n\t"
  200812. "ldm %[m]!, {r6}\n\t"
  200813. #ifdef WOLFSSL_KEIL
  200814. "ands r6, r6, r7\n\t"
  200815. #elif defined(__clang__)
  200816. "ands r6, r7\n\t"
  200817. #else
  200818. "and r6, r7\n\t"
  200819. #endif
  200820. "ldr r5, [%[a], r4]\n\t"
  200821. #ifdef WOLFSSL_KEIL
  200822. "sbcs r5, r5, r6\n\t"
  200823. #elif defined(__clang__)
  200824. "sbcs r5, r6\n\t"
  200825. #else
  200826. "sbc r5, r6\n\t"
  200827. #endif
  200828. "stm %[a]!, {r5}\n\t"
  200829. "ldm %[m]!, {r6}\n\t"
  200830. #ifdef WOLFSSL_KEIL
  200831. "ands r6, r6, r7\n\t"
  200832. #elif defined(__clang__)
  200833. "ands r6, r7\n\t"
  200834. #else
  200835. "and r6, r7\n\t"
  200836. #endif
  200837. "ldr r5, [%[a], r4]\n\t"
  200838. #ifdef WOLFSSL_KEIL
  200839. "sbcs r5, r5, r6\n\t"
  200840. #elif defined(__clang__)
  200841. "sbcs r5, r6\n\t"
  200842. #else
  200843. "sbc r5, r6\n\t"
  200844. #endif
  200845. "stm %[a]!, {r5}\n\t"
  200846. "ldm %[m]!, {r6}\n\t"
  200847. #ifdef WOLFSSL_KEIL
  200848. "ands r6, r6, r7\n\t"
  200849. #elif defined(__clang__)
  200850. "ands r6, r7\n\t"
  200851. #else
  200852. "and r6, r7\n\t"
  200853. #endif
  200854. "ldr r5, [%[a], r4]\n\t"
  200855. #ifdef WOLFSSL_KEIL
  200856. "sbcs r5, r5, r6\n\t"
  200857. #elif defined(__clang__)
  200858. "sbcs r5, r6\n\t"
  200859. #else
  200860. "sbc r5, r6\n\t"
  200861. #endif
  200862. "stm %[a]!, {r5}\n\t"
  200863. "ldm %[m]!, {r6}\n\t"
  200864. #ifdef WOLFSSL_KEIL
  200865. "ands r6, r6, r7\n\t"
  200866. #elif defined(__clang__)
  200867. "ands r6, r7\n\t"
  200868. #else
  200869. "and r6, r7\n\t"
  200870. #endif
  200871. "ldr r5, [%[a], r4]\n\t"
  200872. #ifdef WOLFSSL_KEIL
  200873. "sbcs r5, r5, r6\n\t"
  200874. #elif defined(__clang__)
  200875. "sbcs r5, r6\n\t"
  200876. #else
  200877. "sbc r5, r6\n\t"
  200878. #endif
  200879. "stm %[a]!, {r5}\n\t"
  200880. "ldm %[m]!, {r6}\n\t"
  200881. #ifdef WOLFSSL_KEIL
  200882. "ands r6, r6, r7\n\t"
  200883. #elif defined(__clang__)
  200884. "ands r6, r7\n\t"
  200885. #else
  200886. "and r6, r7\n\t"
  200887. #endif
  200888. "ldr r5, [%[a], r4]\n\t"
  200889. #ifdef WOLFSSL_KEIL
  200890. "sbcs r5, r5, r6\n\t"
  200891. #elif defined(__clang__)
  200892. "sbcs r5, r6\n\t"
  200893. #else
  200894. "sbc r5, r6\n\t"
  200895. #endif
  200896. "stm %[a]!, {r5}\n\t"
  200897. "ldm %[m]!, {r6}\n\t"
  200898. #ifdef WOLFSSL_KEIL
  200899. "ands r6, r6, r7\n\t"
  200900. #elif defined(__clang__)
  200901. "ands r6, r7\n\t"
  200902. #else
  200903. "and r6, r7\n\t"
  200904. #endif
  200905. "ldr r5, [%[a], r4]\n\t"
  200906. #ifdef WOLFSSL_KEIL
  200907. "sbcs r5, r5, r6\n\t"
  200908. #elif defined(__clang__)
  200909. "sbcs r5, r6\n\t"
  200910. #else
  200911. "sbc r5, r6\n\t"
  200912. #endif
  200913. "stm %[a]!, {r5}\n\t"
  200914. "ldm %[m]!, {r6}\n\t"
  200915. #ifdef WOLFSSL_KEIL
  200916. "ands r6, r6, r7\n\t"
  200917. #elif defined(__clang__)
  200918. "ands r6, r7\n\t"
  200919. #else
  200920. "and r6, r7\n\t"
  200921. #endif
  200922. "ldr r5, [%[a], r4]\n\t"
  200923. #ifdef WOLFSSL_KEIL
  200924. "sbcs r5, r5, r6\n\t"
  200925. #elif defined(__clang__)
  200926. "sbcs r5, r6\n\t"
  200927. #else
  200928. "sbc r5, r6\n\t"
  200929. #endif
  200930. "stm %[a]!, {r5}\n\t"
  200931. "ldm %[m]!, {r6}\n\t"
  200932. #ifdef WOLFSSL_KEIL
  200933. "ands r6, r6, r7\n\t"
  200934. #elif defined(__clang__)
  200935. "ands r6, r7\n\t"
  200936. #else
  200937. "and r6, r7\n\t"
  200938. #endif
  200939. "ldr r5, [%[a], r4]\n\t"
  200940. #ifdef WOLFSSL_KEIL
  200941. "sbcs r5, r5, r6\n\t"
  200942. #elif defined(__clang__)
  200943. "sbcs r5, r6\n\t"
  200944. #else
  200945. "sbc r5, r6\n\t"
  200946. #endif
  200947. "stm %[a]!, {r5}\n\t"
  200948. "ldm %[m]!, {r6}\n\t"
  200949. #ifdef WOLFSSL_KEIL
  200950. "ands r6, r6, r7\n\t"
  200951. #elif defined(__clang__)
  200952. "ands r6, r7\n\t"
  200953. #else
  200954. "and r6, r7\n\t"
  200955. #endif
  200956. "ldr r5, [%[a], r4]\n\t"
  200957. #ifdef WOLFSSL_KEIL
  200958. "sbcs r5, r5, r6\n\t"
  200959. #elif defined(__clang__)
  200960. "sbcs r5, r6\n\t"
  200961. #else
  200962. "sbc r5, r6\n\t"
  200963. #endif
  200964. "stm %[a]!, {r5}\n\t"
  200965. "ldm %[m]!, {r6}\n\t"
  200966. #ifdef WOLFSSL_KEIL
  200967. "ands r6, r6, r7\n\t"
  200968. #elif defined(__clang__)
  200969. "ands r6, r7\n\t"
  200970. #else
  200971. "and r6, r7\n\t"
  200972. #endif
  200973. "ldr r5, [%[a], r4]\n\t"
  200974. #ifdef WOLFSSL_KEIL
  200975. "sbcs r5, r5, r6\n\t"
  200976. #elif defined(__clang__)
  200977. "sbcs r5, r6\n\t"
  200978. #else
  200979. "sbc r5, r6\n\t"
  200980. #endif
  200981. "stm %[a]!, {r5}\n\t"
  200982. "ldm %[m]!, {r6}\n\t"
  200983. #ifdef WOLFSSL_KEIL
  200984. "ands r6, r6, r7\n\t"
  200985. #elif defined(__clang__)
  200986. "ands r6, r7\n\t"
  200987. #else
  200988. "and r6, r7\n\t"
  200989. #endif
  200990. "ldr r5, [%[a], r4]\n\t"
  200991. #ifdef WOLFSSL_KEIL
  200992. "sbcs r5, r5, r6\n\t"
  200993. #elif defined(__clang__)
  200994. "sbcs r5, r6\n\t"
  200995. #else
  200996. "sbc r5, r6\n\t"
  200997. #endif
  200998. "stm %[a]!, {r5}\n\t"
  200999. "ldm %[m]!, {r6}\n\t"
  201000. #ifdef WOLFSSL_KEIL
  201001. "ands r6, r6, r7\n\t"
  201002. #elif defined(__clang__)
  201003. "ands r6, r7\n\t"
  201004. #else
  201005. "and r6, r7\n\t"
  201006. #endif
  201007. "ldr r5, [%[a], r4]\n\t"
  201008. #ifdef WOLFSSL_KEIL
  201009. "sbcs r5, r5, r6\n\t"
  201010. #elif defined(__clang__)
  201011. "sbcs r5, r6\n\t"
  201012. #else
  201013. "sbc r5, r6\n\t"
  201014. #endif
  201015. "stm %[a]!, {r5}\n\t"
  201016. "ldm %[m]!, {r6}\n\t"
  201017. #ifdef WOLFSSL_KEIL
  201018. "ands r6, r6, r7\n\t"
  201019. #elif defined(__clang__)
  201020. "ands r6, r7\n\t"
  201021. #else
  201022. "and r6, r7\n\t"
  201023. #endif
  201024. "ldr r5, [%[a], r4]\n\t"
  201025. #ifdef WOLFSSL_KEIL
  201026. "sbcs r5, r5, r6\n\t"
  201027. #elif defined(__clang__)
  201028. "sbcs r5, r6\n\t"
  201029. #else
  201030. "sbc r5, r6\n\t"
  201031. #endif
  201032. "stm %[a]!, {r5}\n\t"
  201033. "ldm %[m]!, {r6}\n\t"
  201034. #ifdef WOLFSSL_KEIL
  201035. "ands r6, r6, r7\n\t"
  201036. #elif defined(__clang__)
  201037. "ands r6, r7\n\t"
  201038. #else
  201039. "and r6, r7\n\t"
  201040. #endif
  201041. "ldr r5, [%[a], r4]\n\t"
  201042. #ifdef WOLFSSL_KEIL
  201043. "sbcs r5, r5, r6\n\t"
  201044. #elif defined(__clang__)
  201045. "sbcs r5, r6\n\t"
  201046. #else
  201047. "sbc r5, r6\n\t"
  201048. #endif
  201049. "stm %[a]!, {r5}\n\t"
  201050. "ldm %[m]!, {r6}\n\t"
  201051. #ifdef WOLFSSL_KEIL
  201052. "ands r6, r6, r7\n\t"
  201053. #elif defined(__clang__)
  201054. "ands r6, r7\n\t"
  201055. #else
  201056. "and r6, r7\n\t"
  201057. #endif
  201058. "ldr r5, [%[a], r4]\n\t"
  201059. #ifdef WOLFSSL_KEIL
  201060. "sbcs r5, r5, r6\n\t"
  201061. #elif defined(__clang__)
  201062. "sbcs r5, r6\n\t"
  201063. #else
  201064. "sbc r5, r6\n\t"
  201065. #endif
  201066. "stm %[a]!, {r5}\n\t"
  201067. "ldm %[m]!, {r6}\n\t"
  201068. #ifdef WOLFSSL_KEIL
  201069. "ands r6, r6, r7\n\t"
  201070. #elif defined(__clang__)
  201071. "ands r6, r7\n\t"
  201072. #else
  201073. "and r6, r7\n\t"
  201074. #endif
  201075. "ldr r5, [%[a], r4]\n\t"
  201076. #ifdef WOLFSSL_KEIL
  201077. "sbcs r5, r5, r6\n\t"
  201078. #elif defined(__clang__)
  201079. "sbcs r5, r6\n\t"
  201080. #else
  201081. "sbc r5, r6\n\t"
  201082. #endif
  201083. "stm %[a]!, {r5}\n\t"
  201084. "ldm %[m]!, {r6}\n\t"
  201085. #ifdef WOLFSSL_KEIL
  201086. "ands r6, r6, r7\n\t"
  201087. #elif defined(__clang__)
  201088. "ands r6, r7\n\t"
  201089. #else
  201090. "and r6, r7\n\t"
  201091. #endif
  201092. "ldr r5, [%[a], r4]\n\t"
  201093. #ifdef WOLFSSL_KEIL
  201094. "sbcs r5, r5, r6\n\t"
  201095. #elif defined(__clang__)
  201096. "sbcs r5, r6\n\t"
  201097. #else
  201098. "sbc r5, r6\n\t"
  201099. #endif
  201100. "stm %[a]!, {r5}\n\t"
  201101. "ldm %[m]!, {r6}\n\t"
  201102. #ifdef WOLFSSL_KEIL
  201103. "ands r6, r6, r7\n\t"
  201104. #elif defined(__clang__)
  201105. "ands r6, r7\n\t"
  201106. #else
  201107. "and r6, r7\n\t"
  201108. #endif
  201109. "ldr r5, [%[a], r4]\n\t"
  201110. #ifdef WOLFSSL_KEIL
  201111. "sbcs r5, r5, r6\n\t"
  201112. #elif defined(__clang__)
  201113. "sbcs r5, r6\n\t"
  201114. #else
  201115. "sbc r5, r6\n\t"
  201116. #endif
  201117. "stm %[a]!, {r5}\n\t"
  201118. "ldm %[m]!, {r6}\n\t"
  201119. #ifdef WOLFSSL_KEIL
  201120. "ands r6, r6, r7\n\t"
  201121. #elif defined(__clang__)
  201122. "ands r6, r7\n\t"
  201123. #else
  201124. "and r6, r7\n\t"
  201125. #endif
  201126. "ldr r5, [%[a], r4]\n\t"
  201127. #ifdef WOLFSSL_KEIL
  201128. "sbcs r5, r5, r6\n\t"
  201129. #elif defined(__clang__)
  201130. "sbcs r5, r6\n\t"
  201131. #else
  201132. "sbc r5, r6\n\t"
  201133. #endif
  201134. "stm %[a]!, {r5}\n\t"
  201135. "ldm %[m]!, {r6}\n\t"
  201136. #ifdef WOLFSSL_KEIL
  201137. "ands r6, r6, r7\n\t"
  201138. #elif defined(__clang__)
  201139. "ands r6, r7\n\t"
  201140. #else
  201141. "and r6, r7\n\t"
  201142. #endif
  201143. "ldr r5, [%[a], r4]\n\t"
  201144. #ifdef WOLFSSL_KEIL
  201145. "sbcs r5, r5, r6\n\t"
  201146. #elif defined(__clang__)
  201147. "sbcs r5, r6\n\t"
  201148. #else
  201149. "sbc r5, r6\n\t"
  201150. #endif
  201151. "stm %[a]!, {r5}\n\t"
  201152. "ldm %[m]!, {r6}\n\t"
  201153. #ifdef WOLFSSL_KEIL
  201154. "ands r6, r6, r7\n\t"
  201155. #elif defined(__clang__)
  201156. "ands r6, r7\n\t"
  201157. #else
  201158. "and r6, r7\n\t"
  201159. #endif
  201160. "ldr r5, [%[a], r4]\n\t"
  201161. #ifdef WOLFSSL_KEIL
  201162. "sbcs r5, r5, r6\n\t"
  201163. #elif defined(__clang__)
  201164. "sbcs r5, r6\n\t"
  201165. #else
  201166. "sbc r5, r6\n\t"
  201167. #endif
  201168. "stm %[a]!, {r5}\n\t"
  201169. "ldm %[m]!, {r6}\n\t"
  201170. #ifdef WOLFSSL_KEIL
  201171. "ands r6, r6, r7\n\t"
  201172. #elif defined(__clang__)
  201173. "ands r6, r7\n\t"
  201174. #else
  201175. "and r6, r7\n\t"
  201176. #endif
  201177. "ldr r5, [%[a], r4]\n\t"
  201178. #ifdef WOLFSSL_KEIL
  201179. "sbcs r5, r5, r6\n\t"
  201180. #elif defined(__clang__)
  201181. "sbcs r5, r6\n\t"
  201182. #else
  201183. "sbc r5, r6\n\t"
  201184. #endif
  201185. "stm %[a]!, {r5}\n\t"
  201186. "ldm %[m]!, {r6}\n\t"
  201187. #ifdef WOLFSSL_KEIL
  201188. "ands r6, r6, r7\n\t"
  201189. #elif defined(__clang__)
  201190. "ands r6, r7\n\t"
  201191. #else
  201192. "and r6, r7\n\t"
  201193. #endif
  201194. "ldr r5, [%[a], r4]\n\t"
  201195. #ifdef WOLFSSL_KEIL
  201196. "sbcs r5, r5, r6\n\t"
  201197. #elif defined(__clang__)
  201198. "sbcs r5, r6\n\t"
  201199. #else
  201200. "sbc r5, r6\n\t"
  201201. #endif
  201202. "stm %[a]!, {r5}\n\t"
  201203. "ldm %[m]!, {r6}\n\t"
  201204. #ifdef WOLFSSL_KEIL
  201205. "ands r6, r6, r7\n\t"
  201206. #elif defined(__clang__)
  201207. "ands r6, r7\n\t"
  201208. #else
  201209. "and r6, r7\n\t"
  201210. #endif
  201211. "ldr r5, [%[a], r4]\n\t"
  201212. #ifdef WOLFSSL_KEIL
  201213. "sbcs r5, r5, r6\n\t"
  201214. #elif defined(__clang__)
  201215. "sbcs r5, r6\n\t"
  201216. #else
  201217. "sbc r5, r6\n\t"
  201218. #endif
  201219. "stm %[a]!, {r5}\n\t"
  201220. #endif /* WOLFSSL_SP_LARGE_CODE */
  201221. : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp)
  201222. :
  201223. : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr"
  201224. );
  201225. }
  201226. /* Multiply two Montgomery form numbers mod the modulus (prime).
  201227. * (r = a * b mod m)
  201228. *
  201229. * r Result of multiplication.
  201230. * a First number to multiply in Montgomery form.
  201231. * b Second number to multiply in Montgomery form.
  201232. * m Modulus (prime).
  201233. * mp Montgomery mulitplier.
  201234. */
  201235. SP_NOINLINE static void sp_1024_mont_mul_32(sp_digit* r, const sp_digit* a,
  201236. const sp_digit* b, const sp_digit* m, sp_digit mp)
  201237. {
  201238. sp_1024_mul_32(r, a, b);
  201239. sp_1024_mont_reduce_32(r, m, mp);
  201240. }
  201241. /* Square the Montgomery form number. (r = a * a mod m)
  201242. *
  201243. * r Result of squaring.
  201244. * a Number to square in Montgomery form.
  201245. * m Modulus (prime).
  201246. * mp Montgomery mulitplier.
  201247. */
  201248. SP_NOINLINE static void sp_1024_mont_sqr_32(sp_digit* r, const sp_digit* a,
  201249. const sp_digit* m, sp_digit mp)
  201250. {
  201251. sp_1024_sqr_32(r, a);
  201252. sp_1024_mont_reduce_32(r, m, mp);
  201253. }
  201254. /* Mod-2 for the P1024 curve. */
  201255. static const uint8_t p1024_mod_minus_2[] = {
  201256. 6,0x06, 7,0x0f, 7,0x0b, 6,0x0c, 7,0x1e, 9,0x09, 7,0x0c, 7,0x1f,
  201257. 6,0x16, 6,0x06, 7,0x0e, 8,0x10, 6,0x03, 8,0x11, 6,0x0d, 7,0x14,
  201258. 9,0x12, 6,0x0f, 7,0x04, 9,0x0d, 6,0x00, 7,0x13, 6,0x01, 6,0x07,
  201259. 8,0x0d, 8,0x00, 6,0x06, 9,0x17, 6,0x14, 6,0x15, 6,0x11, 6,0x0b,
  201260. 9,0x0c, 6,0x1e, 13,0x14, 7,0x0e, 6,0x1d, 12,0x0a, 6,0x0b, 8,0x07,
  201261. 6,0x18, 6,0x0f, 6,0x10, 8,0x1c, 7,0x16, 7,0x02, 6,0x01, 6,0x13,
  201262. 10,0x15, 7,0x06, 8,0x14, 6,0x0c, 6,0x19, 7,0x10, 6,0x19, 6,0x19,
  201263. 9,0x16, 7,0x19, 6,0x1f, 6,0x17, 6,0x12, 8,0x02, 6,0x01, 6,0x04,
  201264. 6,0x15, 7,0x16, 6,0x04, 6,0x1f, 6,0x09, 7,0x06, 7,0x13, 7,0x09,
  201265. 6,0x0d, 10,0x18, 6,0x06, 6,0x11, 6,0x04, 6,0x01, 6,0x13, 8,0x06,
  201266. 6,0x0d, 8,0x13, 7,0x08, 6,0x08, 6,0x05, 7,0x0c, 7,0x0e, 7,0x15,
  201267. 6,0x05, 7,0x14, 10,0x19, 6,0x10, 6,0x16, 6,0x15, 7,0x1f, 6,0x14,
  201268. 6,0x0a, 10,0x11, 6,0x01, 7,0x05, 7,0x08, 8,0x0a, 7,0x1e, 7,0x1c,
  201269. 6,0x1c, 7,0x09, 10,0x18, 7,0x1c, 10,0x06, 6,0x0a, 6,0x07, 6,0x19,
  201270. 7,0x06, 6,0x0d, 7,0x0f, 7,0x0b, 7,0x05, 6,0x11, 6,0x1c, 7,0x1f,
  201271. 6,0x1e, 7,0x18, 6,0x1e, 6,0x00, 6,0x03, 6,0x02, 7,0x10, 6,0x0b,
  201272. 6,0x1b, 7,0x10, 6,0x00, 8,0x11, 7,0x1b, 6,0x18, 6,0x01, 7,0x0c,
  201273. 7,0x1d, 7,0x13, 6,0x08, 7,0x1b, 8,0x13, 7,0x16, 13,0x1d, 7,0x1f,
  201274. 6,0x0a, 6,0x01, 7,0x1f, 6,0x14, 1,0x01
  201275. };
  201276. /* Invert the number, in Montgomery form, modulo the modulus (prime) of the
  201277. * P1024 curve. (r = 1 / a mod m)
  201278. *
  201279. * r Inverse result.
  201280. * a Number to invert.
  201281. * td Temporary data.
  201282. */
  201283. static void sp_1024_mont_inv_32(sp_digit* r, const sp_digit* a,
  201284. sp_digit* td)
  201285. {
  201286. sp_digit* t = td;
  201287. int i;
  201288. int j;
  201289. sp_digit table[32][2 * 32];
  201290. XMEMCPY(table[0], a, sizeof(sp_digit) * 32);
  201291. for (i = 1; i < 6; i++) {
  201292. sp_1024_mont_sqr_32(table[0], table[0], p1024_mod, p1024_mp_mod);
  201293. }
  201294. for (i = 1; i < 32; i++) {
  201295. sp_1024_mont_mul_32(table[i], table[i-1], a, p1024_mod, p1024_mp_mod);
  201296. }
  201297. XMEMCPY(t, table[p1024_mod_minus_2[1]], sizeof(sp_digit) * 32);
  201298. for (i = 2; i < (int)sizeof(p1024_mod_minus_2) - 2; i += 2) {
  201299. for (j = 0; j < p1024_mod_minus_2[i]; j++) {
  201300. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  201301. }
  201302. sp_1024_mont_mul_32(t, t, table[p1024_mod_minus_2[i+1]], p1024_mod,
  201303. p1024_mp_mod);
  201304. }
  201305. sp_1024_mont_sqr_32(t, t, p1024_mod, p1024_mp_mod);
  201306. sp_1024_mont_mul_32(r, t, a, p1024_mod, p1024_mp_mod);
  201307. }
  201308. /* Normalize the values in each word to 32.
  201309. *
  201310. * a Array of sp_digit to normalize.
  201311. */
  201312. #define sp_1024_norm_32(a)
  201313. /* Map the Montgomery form projective coordinate point to an affine point.
  201314. *
  201315. * r Resulting affine coordinate point.
  201316. * p Montgomery form projective coordinate point.
  201317. * t Temporary ordinate data.
  201318. */
  201319. static void sp_1024_map_32(sp_point_1024* r, const sp_point_1024* p,
  201320. sp_digit* t)
  201321. {
  201322. sp_digit* t1 = t;
  201323. sp_digit* t2 = t + 2*32;
  201324. sp_int32 n;
  201325. sp_1024_mont_inv_32(t1, p->z, t + 2*32);
  201326. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  201327. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  201328. /* x /= z^2 */
  201329. sp_1024_mont_mul_32(r->x, p->x, t2, p1024_mod, p1024_mp_mod);
  201330. XMEMSET(r->x + 32, 0, sizeof(r->x) / 2U);
  201331. sp_1024_mont_reduce_32(r->x, p1024_mod, p1024_mp_mod);
  201332. /* Reduce x to less than modulus */
  201333. n = sp_1024_cmp_32(r->x, p1024_mod);
  201334. sp_1024_cond_sub_32(r->x, r->x, p1024_mod, ~(n >> 31));
  201335. sp_1024_norm_32(r->x);
  201336. /* y /= z^3 */
  201337. sp_1024_mont_mul_32(r->y, p->y, t1, p1024_mod, p1024_mp_mod);
  201338. XMEMSET(r->y + 32, 0, sizeof(r->y) / 2U);
  201339. sp_1024_mont_reduce_32(r->y, p1024_mod, p1024_mp_mod);
  201340. /* Reduce y to less than modulus */
  201341. n = sp_1024_cmp_32(r->y, p1024_mod);
  201342. sp_1024_cond_sub_32(r->y, r->y, p1024_mod, ~(n >> 31));
  201343. sp_1024_norm_32(r->y);
  201344. XMEMSET(r->z, 0, sizeof(r->z) / 2);
  201345. r->z[0] = 1;
  201346. }
  201347. /* Add two Montgomery form numbers (r = a + b % m).
  201348. *
  201349. * r Result of addition.
  201350. * a First number to add in Montgomery form.
  201351. * b Second number to add in Montgomery form.
  201352. * m Modulus (prime).
  201353. */
  201354. SP_NOINLINE static void sp_1024_mont_add_32(sp_digit* r, const sp_digit* a,
  201355. const sp_digit* b, const sp_digit* m)
  201356. {
  201357. __asm__ __volatile__ (
  201358. "ldr r4, [%[a]]\n\t"
  201359. "ldr r5, [%[a], #4]\n\t"
  201360. "ldr r6, [%[b]]\n\t"
  201361. "ldr r7, [%[b], #4]\n\t"
  201362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201363. "adds r4, r4, r6\n\t"
  201364. #else
  201365. "add r4, r4, r6\n\t"
  201366. #endif
  201367. #ifdef WOLFSSL_KEIL
  201368. "adcs r5, r5, r7\n\t"
  201369. #elif defined(__clang__)
  201370. "adcs r5, r7\n\t"
  201371. #else
  201372. "adc r5, r7\n\t"
  201373. #endif
  201374. "str r4, [%[r]]\n\t"
  201375. "str r5, [%[r], #4]\n\t"
  201376. "ldr r4, [%[a], #8]\n\t"
  201377. "ldr r5, [%[a], #12]\n\t"
  201378. "ldr r6, [%[b], #8]\n\t"
  201379. "ldr r7, [%[b], #12]\n\t"
  201380. #ifdef WOLFSSL_KEIL
  201381. "adcs r4, r4, r6\n\t"
  201382. #elif defined(__clang__)
  201383. "adcs r4, r6\n\t"
  201384. #else
  201385. "adc r4, r6\n\t"
  201386. #endif
  201387. #ifdef WOLFSSL_KEIL
  201388. "adcs r5, r5, r7\n\t"
  201389. #elif defined(__clang__)
  201390. "adcs r5, r7\n\t"
  201391. #else
  201392. "adc r5, r7\n\t"
  201393. #endif
  201394. "str r4, [%[r], #8]\n\t"
  201395. "str r5, [%[r], #12]\n\t"
  201396. "ldr r4, [%[a], #16]\n\t"
  201397. "ldr r5, [%[a], #20]\n\t"
  201398. "ldr r6, [%[b], #16]\n\t"
  201399. "ldr r7, [%[b], #20]\n\t"
  201400. #ifdef WOLFSSL_KEIL
  201401. "adcs r4, r4, r6\n\t"
  201402. #elif defined(__clang__)
  201403. "adcs r4, r6\n\t"
  201404. #else
  201405. "adc r4, r6\n\t"
  201406. #endif
  201407. #ifdef WOLFSSL_KEIL
  201408. "adcs r5, r5, r7\n\t"
  201409. #elif defined(__clang__)
  201410. "adcs r5, r7\n\t"
  201411. #else
  201412. "adc r5, r7\n\t"
  201413. #endif
  201414. "str r4, [%[r], #16]\n\t"
  201415. "str r5, [%[r], #20]\n\t"
  201416. "ldr r4, [%[a], #24]\n\t"
  201417. "ldr r5, [%[a], #28]\n\t"
  201418. "ldr r6, [%[b], #24]\n\t"
  201419. "ldr r7, [%[b], #28]\n\t"
  201420. #ifdef WOLFSSL_KEIL
  201421. "adcs r4, r4, r6\n\t"
  201422. #elif defined(__clang__)
  201423. "adcs r4, r6\n\t"
  201424. #else
  201425. "adc r4, r6\n\t"
  201426. #endif
  201427. #ifdef WOLFSSL_KEIL
  201428. "adcs r5, r5, r7\n\t"
  201429. #elif defined(__clang__)
  201430. "adcs r5, r7\n\t"
  201431. #else
  201432. "adc r5, r7\n\t"
  201433. #endif
  201434. "str r4, [%[r], #24]\n\t"
  201435. "str r5, [%[r], #28]\n\t"
  201436. "ldr r4, [%[a], #32]\n\t"
  201437. "ldr r5, [%[a], #36]\n\t"
  201438. "ldr r6, [%[b], #32]\n\t"
  201439. "ldr r7, [%[b], #36]\n\t"
  201440. #ifdef WOLFSSL_KEIL
  201441. "adcs r4, r4, r6\n\t"
  201442. #elif defined(__clang__)
  201443. "adcs r4, r6\n\t"
  201444. #else
  201445. "adc r4, r6\n\t"
  201446. #endif
  201447. #ifdef WOLFSSL_KEIL
  201448. "adcs r5, r5, r7\n\t"
  201449. #elif defined(__clang__)
  201450. "adcs r5, r7\n\t"
  201451. #else
  201452. "adc r5, r7\n\t"
  201453. #endif
  201454. "str r4, [%[r], #32]\n\t"
  201455. "str r5, [%[r], #36]\n\t"
  201456. "ldr r4, [%[a], #40]\n\t"
  201457. "ldr r5, [%[a], #44]\n\t"
  201458. "ldr r6, [%[b], #40]\n\t"
  201459. "ldr r7, [%[b], #44]\n\t"
  201460. #ifdef WOLFSSL_KEIL
  201461. "adcs r4, r4, r6\n\t"
  201462. #elif defined(__clang__)
  201463. "adcs r4, r6\n\t"
  201464. #else
  201465. "adc r4, r6\n\t"
  201466. #endif
  201467. #ifdef WOLFSSL_KEIL
  201468. "adcs r5, r5, r7\n\t"
  201469. #elif defined(__clang__)
  201470. "adcs r5, r7\n\t"
  201471. #else
  201472. "adc r5, r7\n\t"
  201473. #endif
  201474. "str r4, [%[r], #40]\n\t"
  201475. "str r5, [%[r], #44]\n\t"
  201476. "ldr r4, [%[a], #48]\n\t"
  201477. "ldr r5, [%[a], #52]\n\t"
  201478. "ldr r6, [%[b], #48]\n\t"
  201479. "ldr r7, [%[b], #52]\n\t"
  201480. #ifdef WOLFSSL_KEIL
  201481. "adcs r4, r4, r6\n\t"
  201482. #elif defined(__clang__)
  201483. "adcs r4, r6\n\t"
  201484. #else
  201485. "adc r4, r6\n\t"
  201486. #endif
  201487. #ifdef WOLFSSL_KEIL
  201488. "adcs r5, r5, r7\n\t"
  201489. #elif defined(__clang__)
  201490. "adcs r5, r7\n\t"
  201491. #else
  201492. "adc r5, r7\n\t"
  201493. #endif
  201494. "str r4, [%[r], #48]\n\t"
  201495. "str r5, [%[r], #52]\n\t"
  201496. "ldr r4, [%[a], #56]\n\t"
  201497. "ldr r5, [%[a], #60]\n\t"
  201498. "ldr r6, [%[b], #56]\n\t"
  201499. "ldr r7, [%[b], #60]\n\t"
  201500. #ifdef WOLFSSL_KEIL
  201501. "adcs r4, r4, r6\n\t"
  201502. #elif defined(__clang__)
  201503. "adcs r4, r6\n\t"
  201504. #else
  201505. "adc r4, r6\n\t"
  201506. #endif
  201507. #ifdef WOLFSSL_KEIL
  201508. "adcs r5, r5, r7\n\t"
  201509. #elif defined(__clang__)
  201510. "adcs r5, r7\n\t"
  201511. #else
  201512. "adc r5, r7\n\t"
  201513. #endif
  201514. "str r4, [%[r], #56]\n\t"
  201515. "str r5, [%[r], #60]\n\t"
  201516. "ldr r4, [%[a], #64]\n\t"
  201517. "ldr r5, [%[a], #68]\n\t"
  201518. "ldr r6, [%[b], #64]\n\t"
  201519. "ldr r7, [%[b], #68]\n\t"
  201520. #ifdef WOLFSSL_KEIL
  201521. "adcs r4, r4, r6\n\t"
  201522. #elif defined(__clang__)
  201523. "adcs r4, r6\n\t"
  201524. #else
  201525. "adc r4, r6\n\t"
  201526. #endif
  201527. #ifdef WOLFSSL_KEIL
  201528. "adcs r5, r5, r7\n\t"
  201529. #elif defined(__clang__)
  201530. "adcs r5, r7\n\t"
  201531. #else
  201532. "adc r5, r7\n\t"
  201533. #endif
  201534. "str r4, [%[r], #64]\n\t"
  201535. "str r5, [%[r], #68]\n\t"
  201536. "ldr r4, [%[a], #72]\n\t"
  201537. "ldr r5, [%[a], #76]\n\t"
  201538. "ldr r6, [%[b], #72]\n\t"
  201539. "ldr r7, [%[b], #76]\n\t"
  201540. #ifdef WOLFSSL_KEIL
  201541. "adcs r4, r4, r6\n\t"
  201542. #elif defined(__clang__)
  201543. "adcs r4, r6\n\t"
  201544. #else
  201545. "adc r4, r6\n\t"
  201546. #endif
  201547. #ifdef WOLFSSL_KEIL
  201548. "adcs r5, r5, r7\n\t"
  201549. #elif defined(__clang__)
  201550. "adcs r5, r7\n\t"
  201551. #else
  201552. "adc r5, r7\n\t"
  201553. #endif
  201554. "str r4, [%[r], #72]\n\t"
  201555. "str r5, [%[r], #76]\n\t"
  201556. "ldr r4, [%[a], #80]\n\t"
  201557. "ldr r5, [%[a], #84]\n\t"
  201558. "ldr r6, [%[b], #80]\n\t"
  201559. "ldr r7, [%[b], #84]\n\t"
  201560. #ifdef WOLFSSL_KEIL
  201561. "adcs r4, r4, r6\n\t"
  201562. #elif defined(__clang__)
  201563. "adcs r4, r6\n\t"
  201564. #else
  201565. "adc r4, r6\n\t"
  201566. #endif
  201567. #ifdef WOLFSSL_KEIL
  201568. "adcs r5, r5, r7\n\t"
  201569. #elif defined(__clang__)
  201570. "adcs r5, r7\n\t"
  201571. #else
  201572. "adc r5, r7\n\t"
  201573. #endif
  201574. "str r4, [%[r], #80]\n\t"
  201575. "str r5, [%[r], #84]\n\t"
  201576. "ldr r4, [%[a], #88]\n\t"
  201577. "ldr r5, [%[a], #92]\n\t"
  201578. "ldr r6, [%[b], #88]\n\t"
  201579. "ldr r7, [%[b], #92]\n\t"
  201580. #ifdef WOLFSSL_KEIL
  201581. "adcs r4, r4, r6\n\t"
  201582. #elif defined(__clang__)
  201583. "adcs r4, r6\n\t"
  201584. #else
  201585. "adc r4, r6\n\t"
  201586. #endif
  201587. #ifdef WOLFSSL_KEIL
  201588. "adcs r5, r5, r7\n\t"
  201589. #elif defined(__clang__)
  201590. "adcs r5, r7\n\t"
  201591. #else
  201592. "adc r5, r7\n\t"
  201593. #endif
  201594. "str r4, [%[r], #88]\n\t"
  201595. "str r5, [%[r], #92]\n\t"
  201596. "ldr r4, [%[a], #96]\n\t"
  201597. "ldr r5, [%[a], #100]\n\t"
  201598. "ldr r6, [%[b], #96]\n\t"
  201599. "ldr r7, [%[b], #100]\n\t"
  201600. #ifdef WOLFSSL_KEIL
  201601. "adcs r4, r4, r6\n\t"
  201602. #elif defined(__clang__)
  201603. "adcs r4, r6\n\t"
  201604. #else
  201605. "adc r4, r6\n\t"
  201606. #endif
  201607. #ifdef WOLFSSL_KEIL
  201608. "adcs r5, r5, r7\n\t"
  201609. #elif defined(__clang__)
  201610. "adcs r5, r7\n\t"
  201611. #else
  201612. "adc r5, r7\n\t"
  201613. #endif
  201614. "str r4, [%[r], #96]\n\t"
  201615. "str r5, [%[r], #100]\n\t"
  201616. "ldr r4, [%[a], #104]\n\t"
  201617. "ldr r5, [%[a], #108]\n\t"
  201618. "ldr r6, [%[b], #104]\n\t"
  201619. "ldr r7, [%[b], #108]\n\t"
  201620. #ifdef WOLFSSL_KEIL
  201621. "adcs r4, r4, r6\n\t"
  201622. #elif defined(__clang__)
  201623. "adcs r4, r6\n\t"
  201624. #else
  201625. "adc r4, r6\n\t"
  201626. #endif
  201627. #ifdef WOLFSSL_KEIL
  201628. "adcs r5, r5, r7\n\t"
  201629. #elif defined(__clang__)
  201630. "adcs r5, r7\n\t"
  201631. #else
  201632. "adc r5, r7\n\t"
  201633. #endif
  201634. "str r4, [%[r], #104]\n\t"
  201635. "str r5, [%[r], #108]\n\t"
  201636. "ldr r4, [%[a], #112]\n\t"
  201637. "ldr r5, [%[a], #116]\n\t"
  201638. "ldr r6, [%[b], #112]\n\t"
  201639. "ldr r7, [%[b], #116]\n\t"
  201640. #ifdef WOLFSSL_KEIL
  201641. "adcs r4, r4, r6\n\t"
  201642. #elif defined(__clang__)
  201643. "adcs r4, r6\n\t"
  201644. #else
  201645. "adc r4, r6\n\t"
  201646. #endif
  201647. #ifdef WOLFSSL_KEIL
  201648. "adcs r5, r5, r7\n\t"
  201649. #elif defined(__clang__)
  201650. "adcs r5, r7\n\t"
  201651. #else
  201652. "adc r5, r7\n\t"
  201653. #endif
  201654. "str r4, [%[r], #112]\n\t"
  201655. "str r5, [%[r], #116]\n\t"
  201656. "ldr r4, [%[a], #120]\n\t"
  201657. "ldr r5, [%[a], #124]\n\t"
  201658. "ldr r6, [%[b], #120]\n\t"
  201659. "ldr r7, [%[b], #124]\n\t"
  201660. #ifdef WOLFSSL_KEIL
  201661. "adcs r4, r4, r6\n\t"
  201662. #elif defined(__clang__)
  201663. "adcs r4, r6\n\t"
  201664. #else
  201665. "adc r4, r6\n\t"
  201666. #endif
  201667. #ifdef WOLFSSL_KEIL
  201668. "adcs r5, r5, r7\n\t"
  201669. #elif defined(__clang__)
  201670. "adcs r5, r7\n\t"
  201671. #else
  201672. "adc r5, r7\n\t"
  201673. #endif
  201674. "str r4, [%[r], #120]\n\t"
  201675. "str r5, [%[r], #124]\n\t"
  201676. "movs %[b], #0\n\t"
  201677. "ldr r7, [%[m], #124]\n\t"
  201678. #ifdef WOLFSSL_KEIL
  201679. "adcs %[b], %[b], %[b]\n\t"
  201680. #elif defined(__clang__)
  201681. "adcs %[b], %[b]\n\t"
  201682. #else
  201683. "adc %[b], %[b]\n\t"
  201684. #endif
  201685. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201686. "subs r7, r7, r5\n\t"
  201687. #else
  201688. "sub r7, r7, r5\n\t"
  201689. #endif
  201690. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201691. "negs %[b], %[b]\n\t"
  201692. #else
  201693. "neg %[b], %[b]\n\t"
  201694. #endif
  201695. #ifdef WOLFSSL_KEIL
  201696. "sbcs r7, r7, r7\n\t"
  201697. #elif defined(__clang__)
  201698. "sbcs r7, r7\n\t"
  201699. #else
  201700. "sbc r7, r7\n\t"
  201701. #endif
  201702. #ifdef WOLFSSL_KEIL
  201703. "orrs %[b], %[b], r7\n\t"
  201704. #elif defined(__clang__)
  201705. "orrs %[b], r7\n\t"
  201706. #else
  201707. "orr %[b], r7\n\t"
  201708. #endif
  201709. "ldr r4, [%[r]]\n\t"
  201710. "ldr r5, [%[r], #4]\n\t"
  201711. "ldr r6, [%[m]]\n\t"
  201712. "ldr r7, [%[m], #4]\n\t"
  201713. #ifdef WOLFSSL_KEIL
  201714. "ands r6, r6, %[b]\n\t"
  201715. #elif defined(__clang__)
  201716. "ands r6, %[b]\n\t"
  201717. #else
  201718. "and r6, %[b]\n\t"
  201719. #endif
  201720. #ifdef WOLFSSL_KEIL
  201721. "ands r7, r7, %[b]\n\t"
  201722. #elif defined(__clang__)
  201723. "ands r7, %[b]\n\t"
  201724. #else
  201725. "and r7, %[b]\n\t"
  201726. #endif
  201727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  201728. "subs r4, r4, r6\n\t"
  201729. #else
  201730. "sub r4, r4, r6\n\t"
  201731. #endif
  201732. #ifdef WOLFSSL_KEIL
  201733. "sbcs r5, r5, r7\n\t"
  201734. #elif defined(__clang__)
  201735. "sbcs r5, r7\n\t"
  201736. #else
  201737. "sbc r5, r7\n\t"
  201738. #endif
  201739. "str r4, [%[r]]\n\t"
  201740. "str r5, [%[r], #4]\n\t"
  201741. "ldr r4, [%[r], #8]\n\t"
  201742. "ldr r5, [%[r], #12]\n\t"
  201743. "ldr r6, [%[m], #8]\n\t"
  201744. "ldr r7, [%[m], #12]\n\t"
  201745. #ifdef WOLFSSL_KEIL
  201746. "ands r6, r6, %[b]\n\t"
  201747. #elif defined(__clang__)
  201748. "ands r6, %[b]\n\t"
  201749. #else
  201750. "and r6, %[b]\n\t"
  201751. #endif
  201752. #ifdef WOLFSSL_KEIL
  201753. "ands r7, r7, %[b]\n\t"
  201754. #elif defined(__clang__)
  201755. "ands r7, %[b]\n\t"
  201756. #else
  201757. "and r7, %[b]\n\t"
  201758. #endif
  201759. #ifdef WOLFSSL_KEIL
  201760. "sbcs r4, r4, r6\n\t"
  201761. #elif defined(__clang__)
  201762. "sbcs r4, r6\n\t"
  201763. #else
  201764. "sbc r4, r6\n\t"
  201765. #endif
  201766. #ifdef WOLFSSL_KEIL
  201767. "sbcs r5, r5, r7\n\t"
  201768. #elif defined(__clang__)
  201769. "sbcs r5, r7\n\t"
  201770. #else
  201771. "sbc r5, r7\n\t"
  201772. #endif
  201773. "str r4, [%[r], #8]\n\t"
  201774. "str r5, [%[r], #12]\n\t"
  201775. "ldr r4, [%[r], #16]\n\t"
  201776. "ldr r5, [%[r], #20]\n\t"
  201777. "ldr r6, [%[m], #16]\n\t"
  201778. "ldr r7, [%[m], #20]\n\t"
  201779. #ifdef WOLFSSL_KEIL
  201780. "ands r6, r6, %[b]\n\t"
  201781. #elif defined(__clang__)
  201782. "ands r6, %[b]\n\t"
  201783. #else
  201784. "and r6, %[b]\n\t"
  201785. #endif
  201786. #ifdef WOLFSSL_KEIL
  201787. "ands r7, r7, %[b]\n\t"
  201788. #elif defined(__clang__)
  201789. "ands r7, %[b]\n\t"
  201790. #else
  201791. "and r7, %[b]\n\t"
  201792. #endif
  201793. #ifdef WOLFSSL_KEIL
  201794. "sbcs r4, r4, r6\n\t"
  201795. #elif defined(__clang__)
  201796. "sbcs r4, r6\n\t"
  201797. #else
  201798. "sbc r4, r6\n\t"
  201799. #endif
  201800. #ifdef WOLFSSL_KEIL
  201801. "sbcs r5, r5, r7\n\t"
  201802. #elif defined(__clang__)
  201803. "sbcs r5, r7\n\t"
  201804. #else
  201805. "sbc r5, r7\n\t"
  201806. #endif
  201807. "str r4, [%[r], #16]\n\t"
  201808. "str r5, [%[r], #20]\n\t"
  201809. "ldr r4, [%[r], #24]\n\t"
  201810. "ldr r5, [%[r], #28]\n\t"
  201811. "ldr r6, [%[m], #24]\n\t"
  201812. "ldr r7, [%[m], #28]\n\t"
  201813. #ifdef WOLFSSL_KEIL
  201814. "ands r6, r6, %[b]\n\t"
  201815. #elif defined(__clang__)
  201816. "ands r6, %[b]\n\t"
  201817. #else
  201818. "and r6, %[b]\n\t"
  201819. #endif
  201820. #ifdef WOLFSSL_KEIL
  201821. "ands r7, r7, %[b]\n\t"
  201822. #elif defined(__clang__)
  201823. "ands r7, %[b]\n\t"
  201824. #else
  201825. "and r7, %[b]\n\t"
  201826. #endif
  201827. #ifdef WOLFSSL_KEIL
  201828. "sbcs r4, r4, r6\n\t"
  201829. #elif defined(__clang__)
  201830. "sbcs r4, r6\n\t"
  201831. #else
  201832. "sbc r4, r6\n\t"
  201833. #endif
  201834. #ifdef WOLFSSL_KEIL
  201835. "sbcs r5, r5, r7\n\t"
  201836. #elif defined(__clang__)
  201837. "sbcs r5, r7\n\t"
  201838. #else
  201839. "sbc r5, r7\n\t"
  201840. #endif
  201841. "str r4, [%[r], #24]\n\t"
  201842. "str r5, [%[r], #28]\n\t"
  201843. "ldr r4, [%[r], #32]\n\t"
  201844. "ldr r5, [%[r], #36]\n\t"
  201845. "ldr r6, [%[m], #32]\n\t"
  201846. "ldr r7, [%[m], #36]\n\t"
  201847. #ifdef WOLFSSL_KEIL
  201848. "ands r6, r6, %[b]\n\t"
  201849. #elif defined(__clang__)
  201850. "ands r6, %[b]\n\t"
  201851. #else
  201852. "and r6, %[b]\n\t"
  201853. #endif
  201854. #ifdef WOLFSSL_KEIL
  201855. "ands r7, r7, %[b]\n\t"
  201856. #elif defined(__clang__)
  201857. "ands r7, %[b]\n\t"
  201858. #else
  201859. "and r7, %[b]\n\t"
  201860. #endif
  201861. #ifdef WOLFSSL_KEIL
  201862. "sbcs r4, r4, r6\n\t"
  201863. #elif defined(__clang__)
  201864. "sbcs r4, r6\n\t"
  201865. #else
  201866. "sbc r4, r6\n\t"
  201867. #endif
  201868. #ifdef WOLFSSL_KEIL
  201869. "sbcs r5, r5, r7\n\t"
  201870. #elif defined(__clang__)
  201871. "sbcs r5, r7\n\t"
  201872. #else
  201873. "sbc r5, r7\n\t"
  201874. #endif
  201875. "str r4, [%[r], #32]\n\t"
  201876. "str r5, [%[r], #36]\n\t"
  201877. "ldr r4, [%[r], #40]\n\t"
  201878. "ldr r5, [%[r], #44]\n\t"
  201879. "ldr r6, [%[m], #40]\n\t"
  201880. "ldr r7, [%[m], #44]\n\t"
  201881. #ifdef WOLFSSL_KEIL
  201882. "ands r6, r6, %[b]\n\t"
  201883. #elif defined(__clang__)
  201884. "ands r6, %[b]\n\t"
  201885. #else
  201886. "and r6, %[b]\n\t"
  201887. #endif
  201888. #ifdef WOLFSSL_KEIL
  201889. "ands r7, r7, %[b]\n\t"
  201890. #elif defined(__clang__)
  201891. "ands r7, %[b]\n\t"
  201892. #else
  201893. "and r7, %[b]\n\t"
  201894. #endif
  201895. #ifdef WOLFSSL_KEIL
  201896. "sbcs r4, r4, r6\n\t"
  201897. #elif defined(__clang__)
  201898. "sbcs r4, r6\n\t"
  201899. #else
  201900. "sbc r4, r6\n\t"
  201901. #endif
  201902. #ifdef WOLFSSL_KEIL
  201903. "sbcs r5, r5, r7\n\t"
  201904. #elif defined(__clang__)
  201905. "sbcs r5, r7\n\t"
  201906. #else
  201907. "sbc r5, r7\n\t"
  201908. #endif
  201909. "str r4, [%[r], #40]\n\t"
  201910. "str r5, [%[r], #44]\n\t"
  201911. "ldr r4, [%[r], #48]\n\t"
  201912. "ldr r5, [%[r], #52]\n\t"
  201913. "ldr r6, [%[m], #48]\n\t"
  201914. "ldr r7, [%[m], #52]\n\t"
  201915. #ifdef WOLFSSL_KEIL
  201916. "ands r6, r6, %[b]\n\t"
  201917. #elif defined(__clang__)
  201918. "ands r6, %[b]\n\t"
  201919. #else
  201920. "and r6, %[b]\n\t"
  201921. #endif
  201922. #ifdef WOLFSSL_KEIL
  201923. "ands r7, r7, %[b]\n\t"
  201924. #elif defined(__clang__)
  201925. "ands r7, %[b]\n\t"
  201926. #else
  201927. "and r7, %[b]\n\t"
  201928. #endif
  201929. #ifdef WOLFSSL_KEIL
  201930. "sbcs r4, r4, r6\n\t"
  201931. #elif defined(__clang__)
  201932. "sbcs r4, r6\n\t"
  201933. #else
  201934. "sbc r4, r6\n\t"
  201935. #endif
  201936. #ifdef WOLFSSL_KEIL
  201937. "sbcs r5, r5, r7\n\t"
  201938. #elif defined(__clang__)
  201939. "sbcs r5, r7\n\t"
  201940. #else
  201941. "sbc r5, r7\n\t"
  201942. #endif
  201943. "str r4, [%[r], #48]\n\t"
  201944. "str r5, [%[r], #52]\n\t"
  201945. "ldr r4, [%[r], #56]\n\t"
  201946. "ldr r5, [%[r], #60]\n\t"
  201947. "ldr r6, [%[m], #56]\n\t"
  201948. "ldr r7, [%[m], #60]\n\t"
  201949. #ifdef WOLFSSL_KEIL
  201950. "ands r6, r6, %[b]\n\t"
  201951. #elif defined(__clang__)
  201952. "ands r6, %[b]\n\t"
  201953. #else
  201954. "and r6, %[b]\n\t"
  201955. #endif
  201956. #ifdef WOLFSSL_KEIL
  201957. "ands r7, r7, %[b]\n\t"
  201958. #elif defined(__clang__)
  201959. "ands r7, %[b]\n\t"
  201960. #else
  201961. "and r7, %[b]\n\t"
  201962. #endif
  201963. #ifdef WOLFSSL_KEIL
  201964. "sbcs r4, r4, r6\n\t"
  201965. #elif defined(__clang__)
  201966. "sbcs r4, r6\n\t"
  201967. #else
  201968. "sbc r4, r6\n\t"
  201969. #endif
  201970. #ifdef WOLFSSL_KEIL
  201971. "sbcs r5, r5, r7\n\t"
  201972. #elif defined(__clang__)
  201973. "sbcs r5, r7\n\t"
  201974. #else
  201975. "sbc r5, r7\n\t"
  201976. #endif
  201977. "str r4, [%[r], #56]\n\t"
  201978. "str r5, [%[r], #60]\n\t"
  201979. "ldr r4, [%[r], #64]\n\t"
  201980. "ldr r5, [%[r], #68]\n\t"
  201981. "ldr r6, [%[m], #64]\n\t"
  201982. "ldr r7, [%[m], #68]\n\t"
  201983. #ifdef WOLFSSL_KEIL
  201984. "ands r6, r6, %[b]\n\t"
  201985. #elif defined(__clang__)
  201986. "ands r6, %[b]\n\t"
  201987. #else
  201988. "and r6, %[b]\n\t"
  201989. #endif
  201990. #ifdef WOLFSSL_KEIL
  201991. "ands r7, r7, %[b]\n\t"
  201992. #elif defined(__clang__)
  201993. "ands r7, %[b]\n\t"
  201994. #else
  201995. "and r7, %[b]\n\t"
  201996. #endif
  201997. #ifdef WOLFSSL_KEIL
  201998. "sbcs r4, r4, r6\n\t"
  201999. #elif defined(__clang__)
  202000. "sbcs r4, r6\n\t"
  202001. #else
  202002. "sbc r4, r6\n\t"
  202003. #endif
  202004. #ifdef WOLFSSL_KEIL
  202005. "sbcs r5, r5, r7\n\t"
  202006. #elif defined(__clang__)
  202007. "sbcs r5, r7\n\t"
  202008. #else
  202009. "sbc r5, r7\n\t"
  202010. #endif
  202011. "str r4, [%[r], #64]\n\t"
  202012. "str r5, [%[r], #68]\n\t"
  202013. "ldr r4, [%[r], #72]\n\t"
  202014. "ldr r5, [%[r], #76]\n\t"
  202015. "ldr r6, [%[m], #72]\n\t"
  202016. "ldr r7, [%[m], #76]\n\t"
  202017. #ifdef WOLFSSL_KEIL
  202018. "ands r6, r6, %[b]\n\t"
  202019. #elif defined(__clang__)
  202020. "ands r6, %[b]\n\t"
  202021. #else
  202022. "and r6, %[b]\n\t"
  202023. #endif
  202024. #ifdef WOLFSSL_KEIL
  202025. "ands r7, r7, %[b]\n\t"
  202026. #elif defined(__clang__)
  202027. "ands r7, %[b]\n\t"
  202028. #else
  202029. "and r7, %[b]\n\t"
  202030. #endif
  202031. #ifdef WOLFSSL_KEIL
  202032. "sbcs r4, r4, r6\n\t"
  202033. #elif defined(__clang__)
  202034. "sbcs r4, r6\n\t"
  202035. #else
  202036. "sbc r4, r6\n\t"
  202037. #endif
  202038. #ifdef WOLFSSL_KEIL
  202039. "sbcs r5, r5, r7\n\t"
  202040. #elif defined(__clang__)
  202041. "sbcs r5, r7\n\t"
  202042. #else
  202043. "sbc r5, r7\n\t"
  202044. #endif
  202045. "str r4, [%[r], #72]\n\t"
  202046. "str r5, [%[r], #76]\n\t"
  202047. "ldr r4, [%[r], #80]\n\t"
  202048. "ldr r5, [%[r], #84]\n\t"
  202049. "ldr r6, [%[m], #80]\n\t"
  202050. "ldr r7, [%[m], #84]\n\t"
  202051. #ifdef WOLFSSL_KEIL
  202052. "ands r6, r6, %[b]\n\t"
  202053. #elif defined(__clang__)
  202054. "ands r6, %[b]\n\t"
  202055. #else
  202056. "and r6, %[b]\n\t"
  202057. #endif
  202058. #ifdef WOLFSSL_KEIL
  202059. "ands r7, r7, %[b]\n\t"
  202060. #elif defined(__clang__)
  202061. "ands r7, %[b]\n\t"
  202062. #else
  202063. "and r7, %[b]\n\t"
  202064. #endif
  202065. #ifdef WOLFSSL_KEIL
  202066. "sbcs r4, r4, r6\n\t"
  202067. #elif defined(__clang__)
  202068. "sbcs r4, r6\n\t"
  202069. #else
  202070. "sbc r4, r6\n\t"
  202071. #endif
  202072. #ifdef WOLFSSL_KEIL
  202073. "sbcs r5, r5, r7\n\t"
  202074. #elif defined(__clang__)
  202075. "sbcs r5, r7\n\t"
  202076. #else
  202077. "sbc r5, r7\n\t"
  202078. #endif
  202079. "str r4, [%[r], #80]\n\t"
  202080. "str r5, [%[r], #84]\n\t"
  202081. "ldr r4, [%[r], #88]\n\t"
  202082. "ldr r5, [%[r], #92]\n\t"
  202083. "ldr r6, [%[m], #88]\n\t"
  202084. "ldr r7, [%[m], #92]\n\t"
  202085. #ifdef WOLFSSL_KEIL
  202086. "ands r6, r6, %[b]\n\t"
  202087. #elif defined(__clang__)
  202088. "ands r6, %[b]\n\t"
  202089. #else
  202090. "and r6, %[b]\n\t"
  202091. #endif
  202092. #ifdef WOLFSSL_KEIL
  202093. "ands r7, r7, %[b]\n\t"
  202094. #elif defined(__clang__)
  202095. "ands r7, %[b]\n\t"
  202096. #else
  202097. "and r7, %[b]\n\t"
  202098. #endif
  202099. #ifdef WOLFSSL_KEIL
  202100. "sbcs r4, r4, r6\n\t"
  202101. #elif defined(__clang__)
  202102. "sbcs r4, r6\n\t"
  202103. #else
  202104. "sbc r4, r6\n\t"
  202105. #endif
  202106. #ifdef WOLFSSL_KEIL
  202107. "sbcs r5, r5, r7\n\t"
  202108. #elif defined(__clang__)
  202109. "sbcs r5, r7\n\t"
  202110. #else
  202111. "sbc r5, r7\n\t"
  202112. #endif
  202113. "str r4, [%[r], #88]\n\t"
  202114. "str r5, [%[r], #92]\n\t"
  202115. "ldr r4, [%[r], #96]\n\t"
  202116. "ldr r5, [%[r], #100]\n\t"
  202117. "ldr r6, [%[m], #96]\n\t"
  202118. "ldr r7, [%[m], #100]\n\t"
  202119. #ifdef WOLFSSL_KEIL
  202120. "ands r6, r6, %[b]\n\t"
  202121. #elif defined(__clang__)
  202122. "ands r6, %[b]\n\t"
  202123. #else
  202124. "and r6, %[b]\n\t"
  202125. #endif
  202126. #ifdef WOLFSSL_KEIL
  202127. "ands r7, r7, %[b]\n\t"
  202128. #elif defined(__clang__)
  202129. "ands r7, %[b]\n\t"
  202130. #else
  202131. "and r7, %[b]\n\t"
  202132. #endif
  202133. #ifdef WOLFSSL_KEIL
  202134. "sbcs r4, r4, r6\n\t"
  202135. #elif defined(__clang__)
  202136. "sbcs r4, r6\n\t"
  202137. #else
  202138. "sbc r4, r6\n\t"
  202139. #endif
  202140. #ifdef WOLFSSL_KEIL
  202141. "sbcs r5, r5, r7\n\t"
  202142. #elif defined(__clang__)
  202143. "sbcs r5, r7\n\t"
  202144. #else
  202145. "sbc r5, r7\n\t"
  202146. #endif
  202147. "str r4, [%[r], #96]\n\t"
  202148. "str r5, [%[r], #100]\n\t"
  202149. "ldr r4, [%[r], #104]\n\t"
  202150. "ldr r5, [%[r], #108]\n\t"
  202151. "ldr r6, [%[m], #104]\n\t"
  202152. "ldr r7, [%[m], #108]\n\t"
  202153. #ifdef WOLFSSL_KEIL
  202154. "ands r6, r6, %[b]\n\t"
  202155. #elif defined(__clang__)
  202156. "ands r6, %[b]\n\t"
  202157. #else
  202158. "and r6, %[b]\n\t"
  202159. #endif
  202160. #ifdef WOLFSSL_KEIL
  202161. "ands r7, r7, %[b]\n\t"
  202162. #elif defined(__clang__)
  202163. "ands r7, %[b]\n\t"
  202164. #else
  202165. "and r7, %[b]\n\t"
  202166. #endif
  202167. #ifdef WOLFSSL_KEIL
  202168. "sbcs r4, r4, r6\n\t"
  202169. #elif defined(__clang__)
  202170. "sbcs r4, r6\n\t"
  202171. #else
  202172. "sbc r4, r6\n\t"
  202173. #endif
  202174. #ifdef WOLFSSL_KEIL
  202175. "sbcs r5, r5, r7\n\t"
  202176. #elif defined(__clang__)
  202177. "sbcs r5, r7\n\t"
  202178. #else
  202179. "sbc r5, r7\n\t"
  202180. #endif
  202181. "str r4, [%[r], #104]\n\t"
  202182. "str r5, [%[r], #108]\n\t"
  202183. "ldr r4, [%[r], #112]\n\t"
  202184. "ldr r5, [%[r], #116]\n\t"
  202185. "ldr r6, [%[m], #112]\n\t"
  202186. "ldr r7, [%[m], #116]\n\t"
  202187. #ifdef WOLFSSL_KEIL
  202188. "ands r6, r6, %[b]\n\t"
  202189. #elif defined(__clang__)
  202190. "ands r6, %[b]\n\t"
  202191. #else
  202192. "and r6, %[b]\n\t"
  202193. #endif
  202194. #ifdef WOLFSSL_KEIL
  202195. "ands r7, r7, %[b]\n\t"
  202196. #elif defined(__clang__)
  202197. "ands r7, %[b]\n\t"
  202198. #else
  202199. "and r7, %[b]\n\t"
  202200. #endif
  202201. #ifdef WOLFSSL_KEIL
  202202. "sbcs r4, r4, r6\n\t"
  202203. #elif defined(__clang__)
  202204. "sbcs r4, r6\n\t"
  202205. #else
  202206. "sbc r4, r6\n\t"
  202207. #endif
  202208. #ifdef WOLFSSL_KEIL
  202209. "sbcs r5, r5, r7\n\t"
  202210. #elif defined(__clang__)
  202211. "sbcs r5, r7\n\t"
  202212. #else
  202213. "sbc r5, r7\n\t"
  202214. #endif
  202215. "str r4, [%[r], #112]\n\t"
  202216. "str r5, [%[r], #116]\n\t"
  202217. "ldr r4, [%[r], #120]\n\t"
  202218. "ldr r5, [%[r], #124]\n\t"
  202219. "ldr r6, [%[m], #120]\n\t"
  202220. "ldr r7, [%[m], #124]\n\t"
  202221. #ifdef WOLFSSL_KEIL
  202222. "ands r6, r6, %[b]\n\t"
  202223. #elif defined(__clang__)
  202224. "ands r6, %[b]\n\t"
  202225. #else
  202226. "and r6, %[b]\n\t"
  202227. #endif
  202228. #ifdef WOLFSSL_KEIL
  202229. "ands r7, r7, %[b]\n\t"
  202230. #elif defined(__clang__)
  202231. "ands r7, %[b]\n\t"
  202232. #else
  202233. "and r7, %[b]\n\t"
  202234. #endif
  202235. #ifdef WOLFSSL_KEIL
  202236. "sbcs r4, r4, r6\n\t"
  202237. #elif defined(__clang__)
  202238. "sbcs r4, r6\n\t"
  202239. #else
  202240. "sbc r4, r6\n\t"
  202241. #endif
  202242. #ifdef WOLFSSL_KEIL
  202243. "sbcs r5, r5, r7\n\t"
  202244. #elif defined(__clang__)
  202245. "sbcs r5, r7\n\t"
  202246. #else
  202247. "sbc r5, r7\n\t"
  202248. #endif
  202249. "str r4, [%[r], #120]\n\t"
  202250. "str r5, [%[r], #124]\n\t"
  202251. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  202252. :
  202253. : "memory", "r4", "r5", "r6", "r7"
  202254. );
  202255. }
  202256. /* Double a Montgomery form number (r = a + a % m).
  202257. *
  202258. * r Result of doubling.
  202259. * a Number to double in Montgomery form.
  202260. * m Modulus (prime).
  202261. */
  202262. SP_NOINLINE static void sp_1024_mont_dbl_32(sp_digit* r, const sp_digit* a,
  202263. const sp_digit* m)
  202264. {
  202265. __asm__ __volatile__ (
  202266. "ldr r4, [%[a]]\n\t"
  202267. "ldr r5, [%[a], #4]\n\t"
  202268. "ldr r6, [%[a], #8]\n\t"
  202269. "ldr r7, [%[a], #12]\n\t"
  202270. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202271. "adds r4, r4, r4\n\t"
  202272. #else
  202273. "add r4, r4, r4\n\t"
  202274. #endif
  202275. #ifdef WOLFSSL_KEIL
  202276. "adcs r5, r5, r5\n\t"
  202277. #elif defined(__clang__)
  202278. "adcs r5, r5\n\t"
  202279. #else
  202280. "adc r5, r5\n\t"
  202281. #endif
  202282. #ifdef WOLFSSL_KEIL
  202283. "adcs r6, r6, r6\n\t"
  202284. #elif defined(__clang__)
  202285. "adcs r6, r6\n\t"
  202286. #else
  202287. "adc r6, r6\n\t"
  202288. #endif
  202289. #ifdef WOLFSSL_KEIL
  202290. "adcs r7, r7, r7\n\t"
  202291. #elif defined(__clang__)
  202292. "adcs r7, r7\n\t"
  202293. #else
  202294. "adc r7, r7\n\t"
  202295. #endif
  202296. "str r4, [%[r]]\n\t"
  202297. "str r5, [%[r], #4]\n\t"
  202298. "str r6, [%[r], #8]\n\t"
  202299. "str r7, [%[r], #12]\n\t"
  202300. "ldr r4, [%[a], #16]\n\t"
  202301. "ldr r5, [%[a], #20]\n\t"
  202302. "ldr r6, [%[a], #24]\n\t"
  202303. "ldr r7, [%[a], #28]\n\t"
  202304. #ifdef WOLFSSL_KEIL
  202305. "adcs r4, r4, r4\n\t"
  202306. #elif defined(__clang__)
  202307. "adcs r4, r4\n\t"
  202308. #else
  202309. "adc r4, r4\n\t"
  202310. #endif
  202311. #ifdef WOLFSSL_KEIL
  202312. "adcs r5, r5, r5\n\t"
  202313. #elif defined(__clang__)
  202314. "adcs r5, r5\n\t"
  202315. #else
  202316. "adc r5, r5\n\t"
  202317. #endif
  202318. #ifdef WOLFSSL_KEIL
  202319. "adcs r6, r6, r6\n\t"
  202320. #elif defined(__clang__)
  202321. "adcs r6, r6\n\t"
  202322. #else
  202323. "adc r6, r6\n\t"
  202324. #endif
  202325. #ifdef WOLFSSL_KEIL
  202326. "adcs r7, r7, r7\n\t"
  202327. #elif defined(__clang__)
  202328. "adcs r7, r7\n\t"
  202329. #else
  202330. "adc r7, r7\n\t"
  202331. #endif
  202332. "str r4, [%[r], #16]\n\t"
  202333. "str r5, [%[r], #20]\n\t"
  202334. "str r6, [%[r], #24]\n\t"
  202335. "str r7, [%[r], #28]\n\t"
  202336. "ldr r4, [%[a], #32]\n\t"
  202337. "ldr r5, [%[a], #36]\n\t"
  202338. "ldr r6, [%[a], #40]\n\t"
  202339. "ldr r7, [%[a], #44]\n\t"
  202340. #ifdef WOLFSSL_KEIL
  202341. "adcs r4, r4, r4\n\t"
  202342. #elif defined(__clang__)
  202343. "adcs r4, r4\n\t"
  202344. #else
  202345. "adc r4, r4\n\t"
  202346. #endif
  202347. #ifdef WOLFSSL_KEIL
  202348. "adcs r5, r5, r5\n\t"
  202349. #elif defined(__clang__)
  202350. "adcs r5, r5\n\t"
  202351. #else
  202352. "adc r5, r5\n\t"
  202353. #endif
  202354. #ifdef WOLFSSL_KEIL
  202355. "adcs r6, r6, r6\n\t"
  202356. #elif defined(__clang__)
  202357. "adcs r6, r6\n\t"
  202358. #else
  202359. "adc r6, r6\n\t"
  202360. #endif
  202361. #ifdef WOLFSSL_KEIL
  202362. "adcs r7, r7, r7\n\t"
  202363. #elif defined(__clang__)
  202364. "adcs r7, r7\n\t"
  202365. #else
  202366. "adc r7, r7\n\t"
  202367. #endif
  202368. "str r4, [%[r], #32]\n\t"
  202369. "str r5, [%[r], #36]\n\t"
  202370. "str r6, [%[r], #40]\n\t"
  202371. "str r7, [%[r], #44]\n\t"
  202372. "ldr r4, [%[a], #48]\n\t"
  202373. "ldr r5, [%[a], #52]\n\t"
  202374. "ldr r6, [%[a], #56]\n\t"
  202375. "ldr r7, [%[a], #60]\n\t"
  202376. #ifdef WOLFSSL_KEIL
  202377. "adcs r4, r4, r4\n\t"
  202378. #elif defined(__clang__)
  202379. "adcs r4, r4\n\t"
  202380. #else
  202381. "adc r4, r4\n\t"
  202382. #endif
  202383. #ifdef WOLFSSL_KEIL
  202384. "adcs r5, r5, r5\n\t"
  202385. #elif defined(__clang__)
  202386. "adcs r5, r5\n\t"
  202387. #else
  202388. "adc r5, r5\n\t"
  202389. #endif
  202390. #ifdef WOLFSSL_KEIL
  202391. "adcs r6, r6, r6\n\t"
  202392. #elif defined(__clang__)
  202393. "adcs r6, r6\n\t"
  202394. #else
  202395. "adc r6, r6\n\t"
  202396. #endif
  202397. #ifdef WOLFSSL_KEIL
  202398. "adcs r7, r7, r7\n\t"
  202399. #elif defined(__clang__)
  202400. "adcs r7, r7\n\t"
  202401. #else
  202402. "adc r7, r7\n\t"
  202403. #endif
  202404. "str r4, [%[r], #48]\n\t"
  202405. "str r5, [%[r], #52]\n\t"
  202406. "str r6, [%[r], #56]\n\t"
  202407. "str r7, [%[r], #60]\n\t"
  202408. "ldr r4, [%[a], #64]\n\t"
  202409. "ldr r5, [%[a], #68]\n\t"
  202410. "ldr r6, [%[a], #72]\n\t"
  202411. "ldr r7, [%[a], #76]\n\t"
  202412. #ifdef WOLFSSL_KEIL
  202413. "adcs r4, r4, r4\n\t"
  202414. #elif defined(__clang__)
  202415. "adcs r4, r4\n\t"
  202416. #else
  202417. "adc r4, r4\n\t"
  202418. #endif
  202419. #ifdef WOLFSSL_KEIL
  202420. "adcs r5, r5, r5\n\t"
  202421. #elif defined(__clang__)
  202422. "adcs r5, r5\n\t"
  202423. #else
  202424. "adc r5, r5\n\t"
  202425. #endif
  202426. #ifdef WOLFSSL_KEIL
  202427. "adcs r6, r6, r6\n\t"
  202428. #elif defined(__clang__)
  202429. "adcs r6, r6\n\t"
  202430. #else
  202431. "adc r6, r6\n\t"
  202432. #endif
  202433. #ifdef WOLFSSL_KEIL
  202434. "adcs r7, r7, r7\n\t"
  202435. #elif defined(__clang__)
  202436. "adcs r7, r7\n\t"
  202437. #else
  202438. "adc r7, r7\n\t"
  202439. #endif
  202440. "str r4, [%[r], #64]\n\t"
  202441. "str r5, [%[r], #68]\n\t"
  202442. "str r6, [%[r], #72]\n\t"
  202443. "str r7, [%[r], #76]\n\t"
  202444. "ldr r4, [%[a], #80]\n\t"
  202445. "ldr r5, [%[a], #84]\n\t"
  202446. "ldr r6, [%[a], #88]\n\t"
  202447. "ldr r7, [%[a], #92]\n\t"
  202448. #ifdef WOLFSSL_KEIL
  202449. "adcs r4, r4, r4\n\t"
  202450. #elif defined(__clang__)
  202451. "adcs r4, r4\n\t"
  202452. #else
  202453. "adc r4, r4\n\t"
  202454. #endif
  202455. #ifdef WOLFSSL_KEIL
  202456. "adcs r5, r5, r5\n\t"
  202457. #elif defined(__clang__)
  202458. "adcs r5, r5\n\t"
  202459. #else
  202460. "adc r5, r5\n\t"
  202461. #endif
  202462. #ifdef WOLFSSL_KEIL
  202463. "adcs r6, r6, r6\n\t"
  202464. #elif defined(__clang__)
  202465. "adcs r6, r6\n\t"
  202466. #else
  202467. "adc r6, r6\n\t"
  202468. #endif
  202469. #ifdef WOLFSSL_KEIL
  202470. "adcs r7, r7, r7\n\t"
  202471. #elif defined(__clang__)
  202472. "adcs r7, r7\n\t"
  202473. #else
  202474. "adc r7, r7\n\t"
  202475. #endif
  202476. "str r4, [%[r], #80]\n\t"
  202477. "str r5, [%[r], #84]\n\t"
  202478. "str r6, [%[r], #88]\n\t"
  202479. "str r7, [%[r], #92]\n\t"
  202480. "ldr r4, [%[a], #96]\n\t"
  202481. "ldr r5, [%[a], #100]\n\t"
  202482. "ldr r6, [%[a], #104]\n\t"
  202483. "ldr r7, [%[a], #108]\n\t"
  202484. #ifdef WOLFSSL_KEIL
  202485. "adcs r4, r4, r4\n\t"
  202486. #elif defined(__clang__)
  202487. "adcs r4, r4\n\t"
  202488. #else
  202489. "adc r4, r4\n\t"
  202490. #endif
  202491. #ifdef WOLFSSL_KEIL
  202492. "adcs r5, r5, r5\n\t"
  202493. #elif defined(__clang__)
  202494. "adcs r5, r5\n\t"
  202495. #else
  202496. "adc r5, r5\n\t"
  202497. #endif
  202498. #ifdef WOLFSSL_KEIL
  202499. "adcs r6, r6, r6\n\t"
  202500. #elif defined(__clang__)
  202501. "adcs r6, r6\n\t"
  202502. #else
  202503. "adc r6, r6\n\t"
  202504. #endif
  202505. #ifdef WOLFSSL_KEIL
  202506. "adcs r7, r7, r7\n\t"
  202507. #elif defined(__clang__)
  202508. "adcs r7, r7\n\t"
  202509. #else
  202510. "adc r7, r7\n\t"
  202511. #endif
  202512. "str r4, [%[r], #96]\n\t"
  202513. "str r5, [%[r], #100]\n\t"
  202514. "str r6, [%[r], #104]\n\t"
  202515. "str r7, [%[r], #108]\n\t"
  202516. "ldr r4, [%[a], #112]\n\t"
  202517. "ldr r5, [%[a], #116]\n\t"
  202518. "ldr r6, [%[a], #120]\n\t"
  202519. "ldr r7, [%[a], #124]\n\t"
  202520. #ifdef WOLFSSL_KEIL
  202521. "adcs r4, r4, r4\n\t"
  202522. #elif defined(__clang__)
  202523. "adcs r4, r4\n\t"
  202524. #else
  202525. "adc r4, r4\n\t"
  202526. #endif
  202527. #ifdef WOLFSSL_KEIL
  202528. "adcs r5, r5, r5\n\t"
  202529. #elif defined(__clang__)
  202530. "adcs r5, r5\n\t"
  202531. #else
  202532. "adc r5, r5\n\t"
  202533. #endif
  202534. #ifdef WOLFSSL_KEIL
  202535. "adcs r6, r6, r6\n\t"
  202536. #elif defined(__clang__)
  202537. "adcs r6, r6\n\t"
  202538. #else
  202539. "adc r6, r6\n\t"
  202540. #endif
  202541. #ifdef WOLFSSL_KEIL
  202542. "adcs r7, r7, r7\n\t"
  202543. #elif defined(__clang__)
  202544. "adcs r7, r7\n\t"
  202545. #else
  202546. "adc r7, r7\n\t"
  202547. #endif
  202548. "str r4, [%[r], #112]\n\t"
  202549. "str r5, [%[r], #116]\n\t"
  202550. "str r6, [%[r], #120]\n\t"
  202551. "str r7, [%[r], #124]\n\t"
  202552. "movs r3, #0\n\t"
  202553. "ldr r4, [%[m], #124]\n\t"
  202554. #ifdef WOLFSSL_KEIL
  202555. "adcs r3, r3, r3\n\t"
  202556. #elif defined(__clang__)
  202557. "adcs r3, r3\n\t"
  202558. #else
  202559. "adc r3, r3\n\t"
  202560. #endif
  202561. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202562. "subs r4, r4, r7\n\t"
  202563. #else
  202564. "sub r4, r4, r7\n\t"
  202565. #endif
  202566. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202567. "negs r3, r3\n\t"
  202568. #else
  202569. "neg r3, r3\n\t"
  202570. #endif
  202571. #ifdef WOLFSSL_KEIL
  202572. "sbcs r4, r4, r4\n\t"
  202573. #elif defined(__clang__)
  202574. "sbcs r4, r4\n\t"
  202575. #else
  202576. "sbc r4, r4\n\t"
  202577. #endif
  202578. #ifdef WOLFSSL_KEIL
  202579. "orrs r3, r3, r4\n\t"
  202580. #elif defined(__clang__)
  202581. "orrs r3, r4\n\t"
  202582. #else
  202583. "orr r3, r4\n\t"
  202584. #endif
  202585. "ldr r4, [%[r]]\n\t"
  202586. "ldr r5, [%[r], #4]\n\t"
  202587. "ldr r6, [%[m]]\n\t"
  202588. "ldr r7, [%[m], #4]\n\t"
  202589. #ifdef WOLFSSL_KEIL
  202590. "ands r6, r6, r3\n\t"
  202591. #elif defined(__clang__)
  202592. "ands r6, r3\n\t"
  202593. #else
  202594. "and r6, r3\n\t"
  202595. #endif
  202596. #ifdef WOLFSSL_KEIL
  202597. "ands r7, r7, r3\n\t"
  202598. #elif defined(__clang__)
  202599. "ands r7, r3\n\t"
  202600. #else
  202601. "and r7, r3\n\t"
  202602. #endif
  202603. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  202604. "subs r4, r4, r6\n\t"
  202605. #else
  202606. "sub r4, r4, r6\n\t"
  202607. #endif
  202608. #ifdef WOLFSSL_KEIL
  202609. "sbcs r5, r5, r7\n\t"
  202610. #elif defined(__clang__)
  202611. "sbcs r5, r7\n\t"
  202612. #else
  202613. "sbc r5, r7\n\t"
  202614. #endif
  202615. "str r4, [%[r]]\n\t"
  202616. "str r5, [%[r], #4]\n\t"
  202617. "ldr r4, [%[r], #8]\n\t"
  202618. "ldr r5, [%[r], #12]\n\t"
  202619. "ldr r6, [%[m], #8]\n\t"
  202620. "ldr r7, [%[m], #12]\n\t"
  202621. #ifdef WOLFSSL_KEIL
  202622. "ands r6, r6, r3\n\t"
  202623. #elif defined(__clang__)
  202624. "ands r6, r3\n\t"
  202625. #else
  202626. "and r6, r3\n\t"
  202627. #endif
  202628. #ifdef WOLFSSL_KEIL
  202629. "ands r7, r7, r3\n\t"
  202630. #elif defined(__clang__)
  202631. "ands r7, r3\n\t"
  202632. #else
  202633. "and r7, r3\n\t"
  202634. #endif
  202635. #ifdef WOLFSSL_KEIL
  202636. "sbcs r4, r4, r6\n\t"
  202637. #elif defined(__clang__)
  202638. "sbcs r4, r6\n\t"
  202639. #else
  202640. "sbc r4, r6\n\t"
  202641. #endif
  202642. #ifdef WOLFSSL_KEIL
  202643. "sbcs r5, r5, r7\n\t"
  202644. #elif defined(__clang__)
  202645. "sbcs r5, r7\n\t"
  202646. #else
  202647. "sbc r5, r7\n\t"
  202648. #endif
  202649. "str r4, [%[r], #8]\n\t"
  202650. "str r5, [%[r], #12]\n\t"
  202651. "ldr r4, [%[r], #16]\n\t"
  202652. "ldr r5, [%[r], #20]\n\t"
  202653. "ldr r6, [%[m], #16]\n\t"
  202654. "ldr r7, [%[m], #20]\n\t"
  202655. #ifdef WOLFSSL_KEIL
  202656. "ands r6, r6, r3\n\t"
  202657. #elif defined(__clang__)
  202658. "ands r6, r3\n\t"
  202659. #else
  202660. "and r6, r3\n\t"
  202661. #endif
  202662. #ifdef WOLFSSL_KEIL
  202663. "ands r7, r7, r3\n\t"
  202664. #elif defined(__clang__)
  202665. "ands r7, r3\n\t"
  202666. #else
  202667. "and r7, r3\n\t"
  202668. #endif
  202669. #ifdef WOLFSSL_KEIL
  202670. "sbcs r4, r4, r6\n\t"
  202671. #elif defined(__clang__)
  202672. "sbcs r4, r6\n\t"
  202673. #else
  202674. "sbc r4, r6\n\t"
  202675. #endif
  202676. #ifdef WOLFSSL_KEIL
  202677. "sbcs r5, r5, r7\n\t"
  202678. #elif defined(__clang__)
  202679. "sbcs r5, r7\n\t"
  202680. #else
  202681. "sbc r5, r7\n\t"
  202682. #endif
  202683. "str r4, [%[r], #16]\n\t"
  202684. "str r5, [%[r], #20]\n\t"
  202685. "ldr r4, [%[r], #24]\n\t"
  202686. "ldr r5, [%[r], #28]\n\t"
  202687. "ldr r6, [%[m], #24]\n\t"
  202688. "ldr r7, [%[m], #28]\n\t"
  202689. #ifdef WOLFSSL_KEIL
  202690. "ands r6, r6, r3\n\t"
  202691. #elif defined(__clang__)
  202692. "ands r6, r3\n\t"
  202693. #else
  202694. "and r6, r3\n\t"
  202695. #endif
  202696. #ifdef WOLFSSL_KEIL
  202697. "ands r7, r7, r3\n\t"
  202698. #elif defined(__clang__)
  202699. "ands r7, r3\n\t"
  202700. #else
  202701. "and r7, r3\n\t"
  202702. #endif
  202703. #ifdef WOLFSSL_KEIL
  202704. "sbcs r4, r4, r6\n\t"
  202705. #elif defined(__clang__)
  202706. "sbcs r4, r6\n\t"
  202707. #else
  202708. "sbc r4, r6\n\t"
  202709. #endif
  202710. #ifdef WOLFSSL_KEIL
  202711. "sbcs r5, r5, r7\n\t"
  202712. #elif defined(__clang__)
  202713. "sbcs r5, r7\n\t"
  202714. #else
  202715. "sbc r5, r7\n\t"
  202716. #endif
  202717. "str r4, [%[r], #24]\n\t"
  202718. "str r5, [%[r], #28]\n\t"
  202719. "ldr r4, [%[r], #32]\n\t"
  202720. "ldr r5, [%[r], #36]\n\t"
  202721. "ldr r6, [%[m], #32]\n\t"
  202722. "ldr r7, [%[m], #36]\n\t"
  202723. #ifdef WOLFSSL_KEIL
  202724. "ands r6, r6, r3\n\t"
  202725. #elif defined(__clang__)
  202726. "ands r6, r3\n\t"
  202727. #else
  202728. "and r6, r3\n\t"
  202729. #endif
  202730. #ifdef WOLFSSL_KEIL
  202731. "ands r7, r7, r3\n\t"
  202732. #elif defined(__clang__)
  202733. "ands r7, r3\n\t"
  202734. #else
  202735. "and r7, r3\n\t"
  202736. #endif
  202737. #ifdef WOLFSSL_KEIL
  202738. "sbcs r4, r4, r6\n\t"
  202739. #elif defined(__clang__)
  202740. "sbcs r4, r6\n\t"
  202741. #else
  202742. "sbc r4, r6\n\t"
  202743. #endif
  202744. #ifdef WOLFSSL_KEIL
  202745. "sbcs r5, r5, r7\n\t"
  202746. #elif defined(__clang__)
  202747. "sbcs r5, r7\n\t"
  202748. #else
  202749. "sbc r5, r7\n\t"
  202750. #endif
  202751. "str r4, [%[r], #32]\n\t"
  202752. "str r5, [%[r], #36]\n\t"
  202753. "ldr r4, [%[r], #40]\n\t"
  202754. "ldr r5, [%[r], #44]\n\t"
  202755. "ldr r6, [%[m], #40]\n\t"
  202756. "ldr r7, [%[m], #44]\n\t"
  202757. #ifdef WOLFSSL_KEIL
  202758. "ands r6, r6, r3\n\t"
  202759. #elif defined(__clang__)
  202760. "ands r6, r3\n\t"
  202761. #else
  202762. "and r6, r3\n\t"
  202763. #endif
  202764. #ifdef WOLFSSL_KEIL
  202765. "ands r7, r7, r3\n\t"
  202766. #elif defined(__clang__)
  202767. "ands r7, r3\n\t"
  202768. #else
  202769. "and r7, r3\n\t"
  202770. #endif
  202771. #ifdef WOLFSSL_KEIL
  202772. "sbcs r4, r4, r6\n\t"
  202773. #elif defined(__clang__)
  202774. "sbcs r4, r6\n\t"
  202775. #else
  202776. "sbc r4, r6\n\t"
  202777. #endif
  202778. #ifdef WOLFSSL_KEIL
  202779. "sbcs r5, r5, r7\n\t"
  202780. #elif defined(__clang__)
  202781. "sbcs r5, r7\n\t"
  202782. #else
  202783. "sbc r5, r7\n\t"
  202784. #endif
  202785. "str r4, [%[r], #40]\n\t"
  202786. "str r5, [%[r], #44]\n\t"
  202787. "ldr r4, [%[r], #48]\n\t"
  202788. "ldr r5, [%[r], #52]\n\t"
  202789. "ldr r6, [%[m], #48]\n\t"
  202790. "ldr r7, [%[m], #52]\n\t"
  202791. #ifdef WOLFSSL_KEIL
  202792. "ands r6, r6, r3\n\t"
  202793. #elif defined(__clang__)
  202794. "ands r6, r3\n\t"
  202795. #else
  202796. "and r6, r3\n\t"
  202797. #endif
  202798. #ifdef WOLFSSL_KEIL
  202799. "ands r7, r7, r3\n\t"
  202800. #elif defined(__clang__)
  202801. "ands r7, r3\n\t"
  202802. #else
  202803. "and r7, r3\n\t"
  202804. #endif
  202805. #ifdef WOLFSSL_KEIL
  202806. "sbcs r4, r4, r6\n\t"
  202807. #elif defined(__clang__)
  202808. "sbcs r4, r6\n\t"
  202809. #else
  202810. "sbc r4, r6\n\t"
  202811. #endif
  202812. #ifdef WOLFSSL_KEIL
  202813. "sbcs r5, r5, r7\n\t"
  202814. #elif defined(__clang__)
  202815. "sbcs r5, r7\n\t"
  202816. #else
  202817. "sbc r5, r7\n\t"
  202818. #endif
  202819. "str r4, [%[r], #48]\n\t"
  202820. "str r5, [%[r], #52]\n\t"
  202821. "ldr r4, [%[r], #56]\n\t"
  202822. "ldr r5, [%[r], #60]\n\t"
  202823. "ldr r6, [%[m], #56]\n\t"
  202824. "ldr r7, [%[m], #60]\n\t"
  202825. #ifdef WOLFSSL_KEIL
  202826. "ands r6, r6, r3\n\t"
  202827. #elif defined(__clang__)
  202828. "ands r6, r3\n\t"
  202829. #else
  202830. "and r6, r3\n\t"
  202831. #endif
  202832. #ifdef WOLFSSL_KEIL
  202833. "ands r7, r7, r3\n\t"
  202834. #elif defined(__clang__)
  202835. "ands r7, r3\n\t"
  202836. #else
  202837. "and r7, r3\n\t"
  202838. #endif
  202839. #ifdef WOLFSSL_KEIL
  202840. "sbcs r4, r4, r6\n\t"
  202841. #elif defined(__clang__)
  202842. "sbcs r4, r6\n\t"
  202843. #else
  202844. "sbc r4, r6\n\t"
  202845. #endif
  202846. #ifdef WOLFSSL_KEIL
  202847. "sbcs r5, r5, r7\n\t"
  202848. #elif defined(__clang__)
  202849. "sbcs r5, r7\n\t"
  202850. #else
  202851. "sbc r5, r7\n\t"
  202852. #endif
  202853. "str r4, [%[r], #56]\n\t"
  202854. "str r5, [%[r], #60]\n\t"
  202855. "ldr r4, [%[r], #64]\n\t"
  202856. "ldr r5, [%[r], #68]\n\t"
  202857. "ldr r6, [%[m], #64]\n\t"
  202858. "ldr r7, [%[m], #68]\n\t"
  202859. #ifdef WOLFSSL_KEIL
  202860. "ands r6, r6, r3\n\t"
  202861. #elif defined(__clang__)
  202862. "ands r6, r3\n\t"
  202863. #else
  202864. "and r6, r3\n\t"
  202865. #endif
  202866. #ifdef WOLFSSL_KEIL
  202867. "ands r7, r7, r3\n\t"
  202868. #elif defined(__clang__)
  202869. "ands r7, r3\n\t"
  202870. #else
  202871. "and r7, r3\n\t"
  202872. #endif
  202873. #ifdef WOLFSSL_KEIL
  202874. "sbcs r4, r4, r6\n\t"
  202875. #elif defined(__clang__)
  202876. "sbcs r4, r6\n\t"
  202877. #else
  202878. "sbc r4, r6\n\t"
  202879. #endif
  202880. #ifdef WOLFSSL_KEIL
  202881. "sbcs r5, r5, r7\n\t"
  202882. #elif defined(__clang__)
  202883. "sbcs r5, r7\n\t"
  202884. #else
  202885. "sbc r5, r7\n\t"
  202886. #endif
  202887. "str r4, [%[r], #64]\n\t"
  202888. "str r5, [%[r], #68]\n\t"
  202889. "ldr r4, [%[r], #72]\n\t"
  202890. "ldr r5, [%[r], #76]\n\t"
  202891. "ldr r6, [%[m], #72]\n\t"
  202892. "ldr r7, [%[m], #76]\n\t"
  202893. #ifdef WOLFSSL_KEIL
  202894. "ands r6, r6, r3\n\t"
  202895. #elif defined(__clang__)
  202896. "ands r6, r3\n\t"
  202897. #else
  202898. "and r6, r3\n\t"
  202899. #endif
  202900. #ifdef WOLFSSL_KEIL
  202901. "ands r7, r7, r3\n\t"
  202902. #elif defined(__clang__)
  202903. "ands r7, r3\n\t"
  202904. #else
  202905. "and r7, r3\n\t"
  202906. #endif
  202907. #ifdef WOLFSSL_KEIL
  202908. "sbcs r4, r4, r6\n\t"
  202909. #elif defined(__clang__)
  202910. "sbcs r4, r6\n\t"
  202911. #else
  202912. "sbc r4, r6\n\t"
  202913. #endif
  202914. #ifdef WOLFSSL_KEIL
  202915. "sbcs r5, r5, r7\n\t"
  202916. #elif defined(__clang__)
  202917. "sbcs r5, r7\n\t"
  202918. #else
  202919. "sbc r5, r7\n\t"
  202920. #endif
  202921. "str r4, [%[r], #72]\n\t"
  202922. "str r5, [%[r], #76]\n\t"
  202923. "ldr r4, [%[r], #80]\n\t"
  202924. "ldr r5, [%[r], #84]\n\t"
  202925. "ldr r6, [%[m], #80]\n\t"
  202926. "ldr r7, [%[m], #84]\n\t"
  202927. #ifdef WOLFSSL_KEIL
  202928. "ands r6, r6, r3\n\t"
  202929. #elif defined(__clang__)
  202930. "ands r6, r3\n\t"
  202931. #else
  202932. "and r6, r3\n\t"
  202933. #endif
  202934. #ifdef WOLFSSL_KEIL
  202935. "ands r7, r7, r3\n\t"
  202936. #elif defined(__clang__)
  202937. "ands r7, r3\n\t"
  202938. #else
  202939. "and r7, r3\n\t"
  202940. #endif
  202941. #ifdef WOLFSSL_KEIL
  202942. "sbcs r4, r4, r6\n\t"
  202943. #elif defined(__clang__)
  202944. "sbcs r4, r6\n\t"
  202945. #else
  202946. "sbc r4, r6\n\t"
  202947. #endif
  202948. #ifdef WOLFSSL_KEIL
  202949. "sbcs r5, r5, r7\n\t"
  202950. #elif defined(__clang__)
  202951. "sbcs r5, r7\n\t"
  202952. #else
  202953. "sbc r5, r7\n\t"
  202954. #endif
  202955. "str r4, [%[r], #80]\n\t"
  202956. "str r5, [%[r], #84]\n\t"
  202957. "ldr r4, [%[r], #88]\n\t"
  202958. "ldr r5, [%[r], #92]\n\t"
  202959. "ldr r6, [%[m], #88]\n\t"
  202960. "ldr r7, [%[m], #92]\n\t"
  202961. #ifdef WOLFSSL_KEIL
  202962. "ands r6, r6, r3\n\t"
  202963. #elif defined(__clang__)
  202964. "ands r6, r3\n\t"
  202965. #else
  202966. "and r6, r3\n\t"
  202967. #endif
  202968. #ifdef WOLFSSL_KEIL
  202969. "ands r7, r7, r3\n\t"
  202970. #elif defined(__clang__)
  202971. "ands r7, r3\n\t"
  202972. #else
  202973. "and r7, r3\n\t"
  202974. #endif
  202975. #ifdef WOLFSSL_KEIL
  202976. "sbcs r4, r4, r6\n\t"
  202977. #elif defined(__clang__)
  202978. "sbcs r4, r6\n\t"
  202979. #else
  202980. "sbc r4, r6\n\t"
  202981. #endif
  202982. #ifdef WOLFSSL_KEIL
  202983. "sbcs r5, r5, r7\n\t"
  202984. #elif defined(__clang__)
  202985. "sbcs r5, r7\n\t"
  202986. #else
  202987. "sbc r5, r7\n\t"
  202988. #endif
  202989. "str r4, [%[r], #88]\n\t"
  202990. "str r5, [%[r], #92]\n\t"
  202991. "ldr r4, [%[r], #96]\n\t"
  202992. "ldr r5, [%[r], #100]\n\t"
  202993. "ldr r6, [%[m], #96]\n\t"
  202994. "ldr r7, [%[m], #100]\n\t"
  202995. #ifdef WOLFSSL_KEIL
  202996. "ands r6, r6, r3\n\t"
  202997. #elif defined(__clang__)
  202998. "ands r6, r3\n\t"
  202999. #else
  203000. "and r6, r3\n\t"
  203001. #endif
  203002. #ifdef WOLFSSL_KEIL
  203003. "ands r7, r7, r3\n\t"
  203004. #elif defined(__clang__)
  203005. "ands r7, r3\n\t"
  203006. #else
  203007. "and r7, r3\n\t"
  203008. #endif
  203009. #ifdef WOLFSSL_KEIL
  203010. "sbcs r4, r4, r6\n\t"
  203011. #elif defined(__clang__)
  203012. "sbcs r4, r6\n\t"
  203013. #else
  203014. "sbc r4, r6\n\t"
  203015. #endif
  203016. #ifdef WOLFSSL_KEIL
  203017. "sbcs r5, r5, r7\n\t"
  203018. #elif defined(__clang__)
  203019. "sbcs r5, r7\n\t"
  203020. #else
  203021. "sbc r5, r7\n\t"
  203022. #endif
  203023. "str r4, [%[r], #96]\n\t"
  203024. "str r5, [%[r], #100]\n\t"
  203025. "ldr r4, [%[r], #104]\n\t"
  203026. "ldr r5, [%[r], #108]\n\t"
  203027. "ldr r6, [%[m], #104]\n\t"
  203028. "ldr r7, [%[m], #108]\n\t"
  203029. #ifdef WOLFSSL_KEIL
  203030. "ands r6, r6, r3\n\t"
  203031. #elif defined(__clang__)
  203032. "ands r6, r3\n\t"
  203033. #else
  203034. "and r6, r3\n\t"
  203035. #endif
  203036. #ifdef WOLFSSL_KEIL
  203037. "ands r7, r7, r3\n\t"
  203038. #elif defined(__clang__)
  203039. "ands r7, r3\n\t"
  203040. #else
  203041. "and r7, r3\n\t"
  203042. #endif
  203043. #ifdef WOLFSSL_KEIL
  203044. "sbcs r4, r4, r6\n\t"
  203045. #elif defined(__clang__)
  203046. "sbcs r4, r6\n\t"
  203047. #else
  203048. "sbc r4, r6\n\t"
  203049. #endif
  203050. #ifdef WOLFSSL_KEIL
  203051. "sbcs r5, r5, r7\n\t"
  203052. #elif defined(__clang__)
  203053. "sbcs r5, r7\n\t"
  203054. #else
  203055. "sbc r5, r7\n\t"
  203056. #endif
  203057. "str r4, [%[r], #104]\n\t"
  203058. "str r5, [%[r], #108]\n\t"
  203059. "ldr r4, [%[r], #112]\n\t"
  203060. "ldr r5, [%[r], #116]\n\t"
  203061. "ldr r6, [%[m], #112]\n\t"
  203062. "ldr r7, [%[m], #116]\n\t"
  203063. #ifdef WOLFSSL_KEIL
  203064. "ands r6, r6, r3\n\t"
  203065. #elif defined(__clang__)
  203066. "ands r6, r3\n\t"
  203067. #else
  203068. "and r6, r3\n\t"
  203069. #endif
  203070. #ifdef WOLFSSL_KEIL
  203071. "ands r7, r7, r3\n\t"
  203072. #elif defined(__clang__)
  203073. "ands r7, r3\n\t"
  203074. #else
  203075. "and r7, r3\n\t"
  203076. #endif
  203077. #ifdef WOLFSSL_KEIL
  203078. "sbcs r4, r4, r6\n\t"
  203079. #elif defined(__clang__)
  203080. "sbcs r4, r6\n\t"
  203081. #else
  203082. "sbc r4, r6\n\t"
  203083. #endif
  203084. #ifdef WOLFSSL_KEIL
  203085. "sbcs r5, r5, r7\n\t"
  203086. #elif defined(__clang__)
  203087. "sbcs r5, r7\n\t"
  203088. #else
  203089. "sbc r5, r7\n\t"
  203090. #endif
  203091. "str r4, [%[r], #112]\n\t"
  203092. "str r5, [%[r], #116]\n\t"
  203093. "ldr r4, [%[r], #120]\n\t"
  203094. "ldr r5, [%[r], #124]\n\t"
  203095. "ldr r6, [%[m], #120]\n\t"
  203096. "ldr r7, [%[m], #124]\n\t"
  203097. #ifdef WOLFSSL_KEIL
  203098. "ands r6, r6, r3\n\t"
  203099. #elif defined(__clang__)
  203100. "ands r6, r3\n\t"
  203101. #else
  203102. "and r6, r3\n\t"
  203103. #endif
  203104. #ifdef WOLFSSL_KEIL
  203105. "ands r7, r7, r3\n\t"
  203106. #elif defined(__clang__)
  203107. "ands r7, r3\n\t"
  203108. #else
  203109. "and r7, r3\n\t"
  203110. #endif
  203111. #ifdef WOLFSSL_KEIL
  203112. "sbcs r4, r4, r6\n\t"
  203113. #elif defined(__clang__)
  203114. "sbcs r4, r6\n\t"
  203115. #else
  203116. "sbc r4, r6\n\t"
  203117. #endif
  203118. #ifdef WOLFSSL_KEIL
  203119. "sbcs r5, r5, r7\n\t"
  203120. #elif defined(__clang__)
  203121. "sbcs r5, r7\n\t"
  203122. #else
  203123. "sbc r5, r7\n\t"
  203124. #endif
  203125. "str r4, [%[r], #120]\n\t"
  203126. "str r5, [%[r], #124]\n\t"
  203127. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  203128. :
  203129. : "memory", "r3", "r4", "r5", "r6", "r7"
  203130. );
  203131. }
  203132. /* Triple a Montgomery form number (r = a + a + a % m).
  203133. *
  203134. * r Result of Tripling.
  203135. * a Number to triple in Montgomery form.
  203136. * m Modulus (prime).
  203137. */
  203138. SP_NOINLINE static void sp_1024_mont_tpl_32(sp_digit* r, const sp_digit* a,
  203139. const sp_digit* m)
  203140. {
  203141. __asm__ __volatile__ (
  203142. "ldr r4, [%[a]]\n\t"
  203143. "ldr r5, [%[a], #4]\n\t"
  203144. "ldr r6, [%[a], #8]\n\t"
  203145. "ldr r7, [%[a], #12]\n\t"
  203146. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203147. "adds r4, r4, r4\n\t"
  203148. #else
  203149. "add r4, r4, r4\n\t"
  203150. #endif
  203151. #ifdef WOLFSSL_KEIL
  203152. "adcs r5, r5, r5\n\t"
  203153. #elif defined(__clang__)
  203154. "adcs r5, r5\n\t"
  203155. #else
  203156. "adc r5, r5\n\t"
  203157. #endif
  203158. #ifdef WOLFSSL_KEIL
  203159. "adcs r6, r6, r6\n\t"
  203160. #elif defined(__clang__)
  203161. "adcs r6, r6\n\t"
  203162. #else
  203163. "adc r6, r6\n\t"
  203164. #endif
  203165. #ifdef WOLFSSL_KEIL
  203166. "adcs r7, r7, r7\n\t"
  203167. #elif defined(__clang__)
  203168. "adcs r7, r7\n\t"
  203169. #else
  203170. "adc r7, r7\n\t"
  203171. #endif
  203172. "str r4, [%[r]]\n\t"
  203173. "str r5, [%[r], #4]\n\t"
  203174. "str r6, [%[r], #8]\n\t"
  203175. "str r7, [%[r], #12]\n\t"
  203176. "ldr r4, [%[a], #16]\n\t"
  203177. "ldr r5, [%[a], #20]\n\t"
  203178. "ldr r6, [%[a], #24]\n\t"
  203179. "ldr r7, [%[a], #28]\n\t"
  203180. #ifdef WOLFSSL_KEIL
  203181. "adcs r4, r4, r4\n\t"
  203182. #elif defined(__clang__)
  203183. "adcs r4, r4\n\t"
  203184. #else
  203185. "adc r4, r4\n\t"
  203186. #endif
  203187. #ifdef WOLFSSL_KEIL
  203188. "adcs r5, r5, r5\n\t"
  203189. #elif defined(__clang__)
  203190. "adcs r5, r5\n\t"
  203191. #else
  203192. "adc r5, r5\n\t"
  203193. #endif
  203194. #ifdef WOLFSSL_KEIL
  203195. "adcs r6, r6, r6\n\t"
  203196. #elif defined(__clang__)
  203197. "adcs r6, r6\n\t"
  203198. #else
  203199. "adc r6, r6\n\t"
  203200. #endif
  203201. #ifdef WOLFSSL_KEIL
  203202. "adcs r7, r7, r7\n\t"
  203203. #elif defined(__clang__)
  203204. "adcs r7, r7\n\t"
  203205. #else
  203206. "adc r7, r7\n\t"
  203207. #endif
  203208. "str r4, [%[r], #16]\n\t"
  203209. "str r5, [%[r], #20]\n\t"
  203210. "str r6, [%[r], #24]\n\t"
  203211. "str r7, [%[r], #28]\n\t"
  203212. "ldr r4, [%[a], #32]\n\t"
  203213. "ldr r5, [%[a], #36]\n\t"
  203214. "ldr r6, [%[a], #40]\n\t"
  203215. "ldr r7, [%[a], #44]\n\t"
  203216. #ifdef WOLFSSL_KEIL
  203217. "adcs r4, r4, r4\n\t"
  203218. #elif defined(__clang__)
  203219. "adcs r4, r4\n\t"
  203220. #else
  203221. "adc r4, r4\n\t"
  203222. #endif
  203223. #ifdef WOLFSSL_KEIL
  203224. "adcs r5, r5, r5\n\t"
  203225. #elif defined(__clang__)
  203226. "adcs r5, r5\n\t"
  203227. #else
  203228. "adc r5, r5\n\t"
  203229. #endif
  203230. #ifdef WOLFSSL_KEIL
  203231. "adcs r6, r6, r6\n\t"
  203232. #elif defined(__clang__)
  203233. "adcs r6, r6\n\t"
  203234. #else
  203235. "adc r6, r6\n\t"
  203236. #endif
  203237. #ifdef WOLFSSL_KEIL
  203238. "adcs r7, r7, r7\n\t"
  203239. #elif defined(__clang__)
  203240. "adcs r7, r7\n\t"
  203241. #else
  203242. "adc r7, r7\n\t"
  203243. #endif
  203244. "str r4, [%[r], #32]\n\t"
  203245. "str r5, [%[r], #36]\n\t"
  203246. "str r6, [%[r], #40]\n\t"
  203247. "str r7, [%[r], #44]\n\t"
  203248. "ldr r4, [%[a], #48]\n\t"
  203249. "ldr r5, [%[a], #52]\n\t"
  203250. "ldr r6, [%[a], #56]\n\t"
  203251. "ldr r7, [%[a], #60]\n\t"
  203252. #ifdef WOLFSSL_KEIL
  203253. "adcs r4, r4, r4\n\t"
  203254. #elif defined(__clang__)
  203255. "adcs r4, r4\n\t"
  203256. #else
  203257. "adc r4, r4\n\t"
  203258. #endif
  203259. #ifdef WOLFSSL_KEIL
  203260. "adcs r5, r5, r5\n\t"
  203261. #elif defined(__clang__)
  203262. "adcs r5, r5\n\t"
  203263. #else
  203264. "adc r5, r5\n\t"
  203265. #endif
  203266. #ifdef WOLFSSL_KEIL
  203267. "adcs r6, r6, r6\n\t"
  203268. #elif defined(__clang__)
  203269. "adcs r6, r6\n\t"
  203270. #else
  203271. "adc r6, r6\n\t"
  203272. #endif
  203273. #ifdef WOLFSSL_KEIL
  203274. "adcs r7, r7, r7\n\t"
  203275. #elif defined(__clang__)
  203276. "adcs r7, r7\n\t"
  203277. #else
  203278. "adc r7, r7\n\t"
  203279. #endif
  203280. "str r4, [%[r], #48]\n\t"
  203281. "str r5, [%[r], #52]\n\t"
  203282. "str r6, [%[r], #56]\n\t"
  203283. "str r7, [%[r], #60]\n\t"
  203284. "ldr r4, [%[a], #64]\n\t"
  203285. "ldr r5, [%[a], #68]\n\t"
  203286. "ldr r6, [%[a], #72]\n\t"
  203287. "ldr r7, [%[a], #76]\n\t"
  203288. #ifdef WOLFSSL_KEIL
  203289. "adcs r4, r4, r4\n\t"
  203290. #elif defined(__clang__)
  203291. "adcs r4, r4\n\t"
  203292. #else
  203293. "adc r4, r4\n\t"
  203294. #endif
  203295. #ifdef WOLFSSL_KEIL
  203296. "adcs r5, r5, r5\n\t"
  203297. #elif defined(__clang__)
  203298. "adcs r5, r5\n\t"
  203299. #else
  203300. "adc r5, r5\n\t"
  203301. #endif
  203302. #ifdef WOLFSSL_KEIL
  203303. "adcs r6, r6, r6\n\t"
  203304. #elif defined(__clang__)
  203305. "adcs r6, r6\n\t"
  203306. #else
  203307. "adc r6, r6\n\t"
  203308. #endif
  203309. #ifdef WOLFSSL_KEIL
  203310. "adcs r7, r7, r7\n\t"
  203311. #elif defined(__clang__)
  203312. "adcs r7, r7\n\t"
  203313. #else
  203314. "adc r7, r7\n\t"
  203315. #endif
  203316. "str r4, [%[r], #64]\n\t"
  203317. "str r5, [%[r], #68]\n\t"
  203318. "str r6, [%[r], #72]\n\t"
  203319. "str r7, [%[r], #76]\n\t"
  203320. "ldr r4, [%[a], #80]\n\t"
  203321. "ldr r5, [%[a], #84]\n\t"
  203322. "ldr r6, [%[a], #88]\n\t"
  203323. "ldr r7, [%[a], #92]\n\t"
  203324. #ifdef WOLFSSL_KEIL
  203325. "adcs r4, r4, r4\n\t"
  203326. #elif defined(__clang__)
  203327. "adcs r4, r4\n\t"
  203328. #else
  203329. "adc r4, r4\n\t"
  203330. #endif
  203331. #ifdef WOLFSSL_KEIL
  203332. "adcs r5, r5, r5\n\t"
  203333. #elif defined(__clang__)
  203334. "adcs r5, r5\n\t"
  203335. #else
  203336. "adc r5, r5\n\t"
  203337. #endif
  203338. #ifdef WOLFSSL_KEIL
  203339. "adcs r6, r6, r6\n\t"
  203340. #elif defined(__clang__)
  203341. "adcs r6, r6\n\t"
  203342. #else
  203343. "adc r6, r6\n\t"
  203344. #endif
  203345. #ifdef WOLFSSL_KEIL
  203346. "adcs r7, r7, r7\n\t"
  203347. #elif defined(__clang__)
  203348. "adcs r7, r7\n\t"
  203349. #else
  203350. "adc r7, r7\n\t"
  203351. #endif
  203352. "str r4, [%[r], #80]\n\t"
  203353. "str r5, [%[r], #84]\n\t"
  203354. "str r6, [%[r], #88]\n\t"
  203355. "str r7, [%[r], #92]\n\t"
  203356. "ldr r4, [%[a], #96]\n\t"
  203357. "ldr r5, [%[a], #100]\n\t"
  203358. "ldr r6, [%[a], #104]\n\t"
  203359. "ldr r7, [%[a], #108]\n\t"
  203360. #ifdef WOLFSSL_KEIL
  203361. "adcs r4, r4, r4\n\t"
  203362. #elif defined(__clang__)
  203363. "adcs r4, r4\n\t"
  203364. #else
  203365. "adc r4, r4\n\t"
  203366. #endif
  203367. #ifdef WOLFSSL_KEIL
  203368. "adcs r5, r5, r5\n\t"
  203369. #elif defined(__clang__)
  203370. "adcs r5, r5\n\t"
  203371. #else
  203372. "adc r5, r5\n\t"
  203373. #endif
  203374. #ifdef WOLFSSL_KEIL
  203375. "adcs r6, r6, r6\n\t"
  203376. #elif defined(__clang__)
  203377. "adcs r6, r6\n\t"
  203378. #else
  203379. "adc r6, r6\n\t"
  203380. #endif
  203381. #ifdef WOLFSSL_KEIL
  203382. "adcs r7, r7, r7\n\t"
  203383. #elif defined(__clang__)
  203384. "adcs r7, r7\n\t"
  203385. #else
  203386. "adc r7, r7\n\t"
  203387. #endif
  203388. "str r4, [%[r], #96]\n\t"
  203389. "str r5, [%[r], #100]\n\t"
  203390. "str r6, [%[r], #104]\n\t"
  203391. "str r7, [%[r], #108]\n\t"
  203392. "ldr r4, [%[a], #112]\n\t"
  203393. "ldr r5, [%[a], #116]\n\t"
  203394. "ldr r6, [%[a], #120]\n\t"
  203395. "ldr r7, [%[a], #124]\n\t"
  203396. #ifdef WOLFSSL_KEIL
  203397. "adcs r4, r4, r4\n\t"
  203398. #elif defined(__clang__)
  203399. "adcs r4, r4\n\t"
  203400. #else
  203401. "adc r4, r4\n\t"
  203402. #endif
  203403. #ifdef WOLFSSL_KEIL
  203404. "adcs r5, r5, r5\n\t"
  203405. #elif defined(__clang__)
  203406. "adcs r5, r5\n\t"
  203407. #else
  203408. "adc r5, r5\n\t"
  203409. #endif
  203410. #ifdef WOLFSSL_KEIL
  203411. "adcs r6, r6, r6\n\t"
  203412. #elif defined(__clang__)
  203413. "adcs r6, r6\n\t"
  203414. #else
  203415. "adc r6, r6\n\t"
  203416. #endif
  203417. #ifdef WOLFSSL_KEIL
  203418. "adcs r7, r7, r7\n\t"
  203419. #elif defined(__clang__)
  203420. "adcs r7, r7\n\t"
  203421. #else
  203422. "adc r7, r7\n\t"
  203423. #endif
  203424. "str r4, [%[r], #112]\n\t"
  203425. "str r5, [%[r], #116]\n\t"
  203426. "str r6, [%[r], #120]\n\t"
  203427. "str r7, [%[r], #124]\n\t"
  203428. "movs r3, #0\n\t"
  203429. "ldr r4, [%[m], #124]\n\t"
  203430. #ifdef WOLFSSL_KEIL
  203431. "adcs r3, r3, r3\n\t"
  203432. #elif defined(__clang__)
  203433. "adcs r3, r3\n\t"
  203434. #else
  203435. "adc r3, r3\n\t"
  203436. #endif
  203437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203438. "subs r4, r4, r7\n\t"
  203439. #else
  203440. "sub r4, r4, r7\n\t"
  203441. #endif
  203442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203443. "negs r3, r3\n\t"
  203444. #else
  203445. "neg r3, r3\n\t"
  203446. #endif
  203447. #ifdef WOLFSSL_KEIL
  203448. "sbcs r4, r4, r4\n\t"
  203449. #elif defined(__clang__)
  203450. "sbcs r4, r4\n\t"
  203451. #else
  203452. "sbc r4, r4\n\t"
  203453. #endif
  203454. #ifdef WOLFSSL_KEIL
  203455. "orrs r3, r3, r4\n\t"
  203456. #elif defined(__clang__)
  203457. "orrs r3, r4\n\t"
  203458. #else
  203459. "orr r3, r4\n\t"
  203460. #endif
  203461. "ldr r4, [%[r]]\n\t"
  203462. "ldr r5, [%[r], #4]\n\t"
  203463. "ldr r6, [%[m]]\n\t"
  203464. "ldr r7, [%[m], #4]\n\t"
  203465. #ifdef WOLFSSL_KEIL
  203466. "ands r6, r6, r3\n\t"
  203467. #elif defined(__clang__)
  203468. "ands r6, r3\n\t"
  203469. #else
  203470. "and r6, r3\n\t"
  203471. #endif
  203472. #ifdef WOLFSSL_KEIL
  203473. "ands r7, r7, r3\n\t"
  203474. #elif defined(__clang__)
  203475. "ands r7, r3\n\t"
  203476. #else
  203477. "and r7, r3\n\t"
  203478. #endif
  203479. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  203480. "subs r4, r4, r6\n\t"
  203481. #else
  203482. "sub r4, r4, r6\n\t"
  203483. #endif
  203484. #ifdef WOLFSSL_KEIL
  203485. "sbcs r5, r5, r7\n\t"
  203486. #elif defined(__clang__)
  203487. "sbcs r5, r7\n\t"
  203488. #else
  203489. "sbc r5, r7\n\t"
  203490. #endif
  203491. "str r4, [%[r]]\n\t"
  203492. "str r5, [%[r], #4]\n\t"
  203493. "ldr r4, [%[r], #8]\n\t"
  203494. "ldr r5, [%[r], #12]\n\t"
  203495. "ldr r6, [%[m], #8]\n\t"
  203496. "ldr r7, [%[m], #12]\n\t"
  203497. #ifdef WOLFSSL_KEIL
  203498. "ands r6, r6, r3\n\t"
  203499. #elif defined(__clang__)
  203500. "ands r6, r3\n\t"
  203501. #else
  203502. "and r6, r3\n\t"
  203503. #endif
  203504. #ifdef WOLFSSL_KEIL
  203505. "ands r7, r7, r3\n\t"
  203506. #elif defined(__clang__)
  203507. "ands r7, r3\n\t"
  203508. #else
  203509. "and r7, r3\n\t"
  203510. #endif
  203511. #ifdef WOLFSSL_KEIL
  203512. "sbcs r4, r4, r6\n\t"
  203513. #elif defined(__clang__)
  203514. "sbcs r4, r6\n\t"
  203515. #else
  203516. "sbc r4, r6\n\t"
  203517. #endif
  203518. #ifdef WOLFSSL_KEIL
  203519. "sbcs r5, r5, r7\n\t"
  203520. #elif defined(__clang__)
  203521. "sbcs r5, r7\n\t"
  203522. #else
  203523. "sbc r5, r7\n\t"
  203524. #endif
  203525. "str r4, [%[r], #8]\n\t"
  203526. "str r5, [%[r], #12]\n\t"
  203527. "ldr r4, [%[r], #16]\n\t"
  203528. "ldr r5, [%[r], #20]\n\t"
  203529. "ldr r6, [%[m], #16]\n\t"
  203530. "ldr r7, [%[m], #20]\n\t"
  203531. #ifdef WOLFSSL_KEIL
  203532. "ands r6, r6, r3\n\t"
  203533. #elif defined(__clang__)
  203534. "ands r6, r3\n\t"
  203535. #else
  203536. "and r6, r3\n\t"
  203537. #endif
  203538. #ifdef WOLFSSL_KEIL
  203539. "ands r7, r7, r3\n\t"
  203540. #elif defined(__clang__)
  203541. "ands r7, r3\n\t"
  203542. #else
  203543. "and r7, r3\n\t"
  203544. #endif
  203545. #ifdef WOLFSSL_KEIL
  203546. "sbcs r4, r4, r6\n\t"
  203547. #elif defined(__clang__)
  203548. "sbcs r4, r6\n\t"
  203549. #else
  203550. "sbc r4, r6\n\t"
  203551. #endif
  203552. #ifdef WOLFSSL_KEIL
  203553. "sbcs r5, r5, r7\n\t"
  203554. #elif defined(__clang__)
  203555. "sbcs r5, r7\n\t"
  203556. #else
  203557. "sbc r5, r7\n\t"
  203558. #endif
  203559. "str r4, [%[r], #16]\n\t"
  203560. "str r5, [%[r], #20]\n\t"
  203561. "ldr r4, [%[r], #24]\n\t"
  203562. "ldr r5, [%[r], #28]\n\t"
  203563. "ldr r6, [%[m], #24]\n\t"
  203564. "ldr r7, [%[m], #28]\n\t"
  203565. #ifdef WOLFSSL_KEIL
  203566. "ands r6, r6, r3\n\t"
  203567. #elif defined(__clang__)
  203568. "ands r6, r3\n\t"
  203569. #else
  203570. "and r6, r3\n\t"
  203571. #endif
  203572. #ifdef WOLFSSL_KEIL
  203573. "ands r7, r7, r3\n\t"
  203574. #elif defined(__clang__)
  203575. "ands r7, r3\n\t"
  203576. #else
  203577. "and r7, r3\n\t"
  203578. #endif
  203579. #ifdef WOLFSSL_KEIL
  203580. "sbcs r4, r4, r6\n\t"
  203581. #elif defined(__clang__)
  203582. "sbcs r4, r6\n\t"
  203583. #else
  203584. "sbc r4, r6\n\t"
  203585. #endif
  203586. #ifdef WOLFSSL_KEIL
  203587. "sbcs r5, r5, r7\n\t"
  203588. #elif defined(__clang__)
  203589. "sbcs r5, r7\n\t"
  203590. #else
  203591. "sbc r5, r7\n\t"
  203592. #endif
  203593. "str r4, [%[r], #24]\n\t"
  203594. "str r5, [%[r], #28]\n\t"
  203595. "ldr r4, [%[r], #32]\n\t"
  203596. "ldr r5, [%[r], #36]\n\t"
  203597. "ldr r6, [%[m], #32]\n\t"
  203598. "ldr r7, [%[m], #36]\n\t"
  203599. #ifdef WOLFSSL_KEIL
  203600. "ands r6, r6, r3\n\t"
  203601. #elif defined(__clang__)
  203602. "ands r6, r3\n\t"
  203603. #else
  203604. "and r6, r3\n\t"
  203605. #endif
  203606. #ifdef WOLFSSL_KEIL
  203607. "ands r7, r7, r3\n\t"
  203608. #elif defined(__clang__)
  203609. "ands r7, r3\n\t"
  203610. #else
  203611. "and r7, r3\n\t"
  203612. #endif
  203613. #ifdef WOLFSSL_KEIL
  203614. "sbcs r4, r4, r6\n\t"
  203615. #elif defined(__clang__)
  203616. "sbcs r4, r6\n\t"
  203617. #else
  203618. "sbc r4, r6\n\t"
  203619. #endif
  203620. #ifdef WOLFSSL_KEIL
  203621. "sbcs r5, r5, r7\n\t"
  203622. #elif defined(__clang__)
  203623. "sbcs r5, r7\n\t"
  203624. #else
  203625. "sbc r5, r7\n\t"
  203626. #endif
  203627. "str r4, [%[r], #32]\n\t"
  203628. "str r5, [%[r], #36]\n\t"
  203629. "ldr r4, [%[r], #40]\n\t"
  203630. "ldr r5, [%[r], #44]\n\t"
  203631. "ldr r6, [%[m], #40]\n\t"
  203632. "ldr r7, [%[m], #44]\n\t"
  203633. #ifdef WOLFSSL_KEIL
  203634. "ands r6, r6, r3\n\t"
  203635. #elif defined(__clang__)
  203636. "ands r6, r3\n\t"
  203637. #else
  203638. "and r6, r3\n\t"
  203639. #endif
  203640. #ifdef WOLFSSL_KEIL
  203641. "ands r7, r7, r3\n\t"
  203642. #elif defined(__clang__)
  203643. "ands r7, r3\n\t"
  203644. #else
  203645. "and r7, r3\n\t"
  203646. #endif
  203647. #ifdef WOLFSSL_KEIL
  203648. "sbcs r4, r4, r6\n\t"
  203649. #elif defined(__clang__)
  203650. "sbcs r4, r6\n\t"
  203651. #else
  203652. "sbc r4, r6\n\t"
  203653. #endif
  203654. #ifdef WOLFSSL_KEIL
  203655. "sbcs r5, r5, r7\n\t"
  203656. #elif defined(__clang__)
  203657. "sbcs r5, r7\n\t"
  203658. #else
  203659. "sbc r5, r7\n\t"
  203660. #endif
  203661. "str r4, [%[r], #40]\n\t"
  203662. "str r5, [%[r], #44]\n\t"
  203663. "ldr r4, [%[r], #48]\n\t"
  203664. "ldr r5, [%[r], #52]\n\t"
  203665. "ldr r6, [%[m], #48]\n\t"
  203666. "ldr r7, [%[m], #52]\n\t"
  203667. #ifdef WOLFSSL_KEIL
  203668. "ands r6, r6, r3\n\t"
  203669. #elif defined(__clang__)
  203670. "ands r6, r3\n\t"
  203671. #else
  203672. "and r6, r3\n\t"
  203673. #endif
  203674. #ifdef WOLFSSL_KEIL
  203675. "ands r7, r7, r3\n\t"
  203676. #elif defined(__clang__)
  203677. "ands r7, r3\n\t"
  203678. #else
  203679. "and r7, r3\n\t"
  203680. #endif
  203681. #ifdef WOLFSSL_KEIL
  203682. "sbcs r4, r4, r6\n\t"
  203683. #elif defined(__clang__)
  203684. "sbcs r4, r6\n\t"
  203685. #else
  203686. "sbc r4, r6\n\t"
  203687. #endif
  203688. #ifdef WOLFSSL_KEIL
  203689. "sbcs r5, r5, r7\n\t"
  203690. #elif defined(__clang__)
  203691. "sbcs r5, r7\n\t"
  203692. #else
  203693. "sbc r5, r7\n\t"
  203694. #endif
  203695. "str r4, [%[r], #48]\n\t"
  203696. "str r5, [%[r], #52]\n\t"
  203697. "ldr r4, [%[r], #56]\n\t"
  203698. "ldr r5, [%[r], #60]\n\t"
  203699. "ldr r6, [%[m], #56]\n\t"
  203700. "ldr r7, [%[m], #60]\n\t"
  203701. #ifdef WOLFSSL_KEIL
  203702. "ands r6, r6, r3\n\t"
  203703. #elif defined(__clang__)
  203704. "ands r6, r3\n\t"
  203705. #else
  203706. "and r6, r3\n\t"
  203707. #endif
  203708. #ifdef WOLFSSL_KEIL
  203709. "ands r7, r7, r3\n\t"
  203710. #elif defined(__clang__)
  203711. "ands r7, r3\n\t"
  203712. #else
  203713. "and r7, r3\n\t"
  203714. #endif
  203715. #ifdef WOLFSSL_KEIL
  203716. "sbcs r4, r4, r6\n\t"
  203717. #elif defined(__clang__)
  203718. "sbcs r4, r6\n\t"
  203719. #else
  203720. "sbc r4, r6\n\t"
  203721. #endif
  203722. #ifdef WOLFSSL_KEIL
  203723. "sbcs r5, r5, r7\n\t"
  203724. #elif defined(__clang__)
  203725. "sbcs r5, r7\n\t"
  203726. #else
  203727. "sbc r5, r7\n\t"
  203728. #endif
  203729. "str r4, [%[r], #56]\n\t"
  203730. "str r5, [%[r], #60]\n\t"
  203731. "ldr r4, [%[r], #64]\n\t"
  203732. "ldr r5, [%[r], #68]\n\t"
  203733. "ldr r6, [%[m], #64]\n\t"
  203734. "ldr r7, [%[m], #68]\n\t"
  203735. #ifdef WOLFSSL_KEIL
  203736. "ands r6, r6, r3\n\t"
  203737. #elif defined(__clang__)
  203738. "ands r6, r3\n\t"
  203739. #else
  203740. "and r6, r3\n\t"
  203741. #endif
  203742. #ifdef WOLFSSL_KEIL
  203743. "ands r7, r7, r3\n\t"
  203744. #elif defined(__clang__)
  203745. "ands r7, r3\n\t"
  203746. #else
  203747. "and r7, r3\n\t"
  203748. #endif
  203749. #ifdef WOLFSSL_KEIL
  203750. "sbcs r4, r4, r6\n\t"
  203751. #elif defined(__clang__)
  203752. "sbcs r4, r6\n\t"
  203753. #else
  203754. "sbc r4, r6\n\t"
  203755. #endif
  203756. #ifdef WOLFSSL_KEIL
  203757. "sbcs r5, r5, r7\n\t"
  203758. #elif defined(__clang__)
  203759. "sbcs r5, r7\n\t"
  203760. #else
  203761. "sbc r5, r7\n\t"
  203762. #endif
  203763. "str r4, [%[r], #64]\n\t"
  203764. "str r5, [%[r], #68]\n\t"
  203765. "ldr r4, [%[r], #72]\n\t"
  203766. "ldr r5, [%[r], #76]\n\t"
  203767. "ldr r6, [%[m], #72]\n\t"
  203768. "ldr r7, [%[m], #76]\n\t"
  203769. #ifdef WOLFSSL_KEIL
  203770. "ands r6, r6, r3\n\t"
  203771. #elif defined(__clang__)
  203772. "ands r6, r3\n\t"
  203773. #else
  203774. "and r6, r3\n\t"
  203775. #endif
  203776. #ifdef WOLFSSL_KEIL
  203777. "ands r7, r7, r3\n\t"
  203778. #elif defined(__clang__)
  203779. "ands r7, r3\n\t"
  203780. #else
  203781. "and r7, r3\n\t"
  203782. #endif
  203783. #ifdef WOLFSSL_KEIL
  203784. "sbcs r4, r4, r6\n\t"
  203785. #elif defined(__clang__)
  203786. "sbcs r4, r6\n\t"
  203787. #else
  203788. "sbc r4, r6\n\t"
  203789. #endif
  203790. #ifdef WOLFSSL_KEIL
  203791. "sbcs r5, r5, r7\n\t"
  203792. #elif defined(__clang__)
  203793. "sbcs r5, r7\n\t"
  203794. #else
  203795. "sbc r5, r7\n\t"
  203796. #endif
  203797. "str r4, [%[r], #72]\n\t"
  203798. "str r5, [%[r], #76]\n\t"
  203799. "ldr r4, [%[r], #80]\n\t"
  203800. "ldr r5, [%[r], #84]\n\t"
  203801. "ldr r6, [%[m], #80]\n\t"
  203802. "ldr r7, [%[m], #84]\n\t"
  203803. #ifdef WOLFSSL_KEIL
  203804. "ands r6, r6, r3\n\t"
  203805. #elif defined(__clang__)
  203806. "ands r6, r3\n\t"
  203807. #else
  203808. "and r6, r3\n\t"
  203809. #endif
  203810. #ifdef WOLFSSL_KEIL
  203811. "ands r7, r7, r3\n\t"
  203812. #elif defined(__clang__)
  203813. "ands r7, r3\n\t"
  203814. #else
  203815. "and r7, r3\n\t"
  203816. #endif
  203817. #ifdef WOLFSSL_KEIL
  203818. "sbcs r4, r4, r6\n\t"
  203819. #elif defined(__clang__)
  203820. "sbcs r4, r6\n\t"
  203821. #else
  203822. "sbc r4, r6\n\t"
  203823. #endif
  203824. #ifdef WOLFSSL_KEIL
  203825. "sbcs r5, r5, r7\n\t"
  203826. #elif defined(__clang__)
  203827. "sbcs r5, r7\n\t"
  203828. #else
  203829. "sbc r5, r7\n\t"
  203830. #endif
  203831. "str r4, [%[r], #80]\n\t"
  203832. "str r5, [%[r], #84]\n\t"
  203833. "ldr r4, [%[r], #88]\n\t"
  203834. "ldr r5, [%[r], #92]\n\t"
  203835. "ldr r6, [%[m], #88]\n\t"
  203836. "ldr r7, [%[m], #92]\n\t"
  203837. #ifdef WOLFSSL_KEIL
  203838. "ands r6, r6, r3\n\t"
  203839. #elif defined(__clang__)
  203840. "ands r6, r3\n\t"
  203841. #else
  203842. "and r6, r3\n\t"
  203843. #endif
  203844. #ifdef WOLFSSL_KEIL
  203845. "ands r7, r7, r3\n\t"
  203846. #elif defined(__clang__)
  203847. "ands r7, r3\n\t"
  203848. #else
  203849. "and r7, r3\n\t"
  203850. #endif
  203851. #ifdef WOLFSSL_KEIL
  203852. "sbcs r4, r4, r6\n\t"
  203853. #elif defined(__clang__)
  203854. "sbcs r4, r6\n\t"
  203855. #else
  203856. "sbc r4, r6\n\t"
  203857. #endif
  203858. #ifdef WOLFSSL_KEIL
  203859. "sbcs r5, r5, r7\n\t"
  203860. #elif defined(__clang__)
  203861. "sbcs r5, r7\n\t"
  203862. #else
  203863. "sbc r5, r7\n\t"
  203864. #endif
  203865. "str r4, [%[r], #88]\n\t"
  203866. "str r5, [%[r], #92]\n\t"
  203867. "ldr r4, [%[r], #96]\n\t"
  203868. "ldr r5, [%[r], #100]\n\t"
  203869. "ldr r6, [%[m], #96]\n\t"
  203870. "ldr r7, [%[m], #100]\n\t"
  203871. #ifdef WOLFSSL_KEIL
  203872. "ands r6, r6, r3\n\t"
  203873. #elif defined(__clang__)
  203874. "ands r6, r3\n\t"
  203875. #else
  203876. "and r6, r3\n\t"
  203877. #endif
  203878. #ifdef WOLFSSL_KEIL
  203879. "ands r7, r7, r3\n\t"
  203880. #elif defined(__clang__)
  203881. "ands r7, r3\n\t"
  203882. #else
  203883. "and r7, r3\n\t"
  203884. #endif
  203885. #ifdef WOLFSSL_KEIL
  203886. "sbcs r4, r4, r6\n\t"
  203887. #elif defined(__clang__)
  203888. "sbcs r4, r6\n\t"
  203889. #else
  203890. "sbc r4, r6\n\t"
  203891. #endif
  203892. #ifdef WOLFSSL_KEIL
  203893. "sbcs r5, r5, r7\n\t"
  203894. #elif defined(__clang__)
  203895. "sbcs r5, r7\n\t"
  203896. #else
  203897. "sbc r5, r7\n\t"
  203898. #endif
  203899. "str r4, [%[r], #96]\n\t"
  203900. "str r5, [%[r], #100]\n\t"
  203901. "ldr r4, [%[r], #104]\n\t"
  203902. "ldr r5, [%[r], #108]\n\t"
  203903. "ldr r6, [%[m], #104]\n\t"
  203904. "ldr r7, [%[m], #108]\n\t"
  203905. #ifdef WOLFSSL_KEIL
  203906. "ands r6, r6, r3\n\t"
  203907. #elif defined(__clang__)
  203908. "ands r6, r3\n\t"
  203909. #else
  203910. "and r6, r3\n\t"
  203911. #endif
  203912. #ifdef WOLFSSL_KEIL
  203913. "ands r7, r7, r3\n\t"
  203914. #elif defined(__clang__)
  203915. "ands r7, r3\n\t"
  203916. #else
  203917. "and r7, r3\n\t"
  203918. #endif
  203919. #ifdef WOLFSSL_KEIL
  203920. "sbcs r4, r4, r6\n\t"
  203921. #elif defined(__clang__)
  203922. "sbcs r4, r6\n\t"
  203923. #else
  203924. "sbc r4, r6\n\t"
  203925. #endif
  203926. #ifdef WOLFSSL_KEIL
  203927. "sbcs r5, r5, r7\n\t"
  203928. #elif defined(__clang__)
  203929. "sbcs r5, r7\n\t"
  203930. #else
  203931. "sbc r5, r7\n\t"
  203932. #endif
  203933. "str r4, [%[r], #104]\n\t"
  203934. "str r5, [%[r], #108]\n\t"
  203935. "ldr r4, [%[r], #112]\n\t"
  203936. "ldr r5, [%[r], #116]\n\t"
  203937. "ldr r6, [%[m], #112]\n\t"
  203938. "ldr r7, [%[m], #116]\n\t"
  203939. #ifdef WOLFSSL_KEIL
  203940. "ands r6, r6, r3\n\t"
  203941. #elif defined(__clang__)
  203942. "ands r6, r3\n\t"
  203943. #else
  203944. "and r6, r3\n\t"
  203945. #endif
  203946. #ifdef WOLFSSL_KEIL
  203947. "ands r7, r7, r3\n\t"
  203948. #elif defined(__clang__)
  203949. "ands r7, r3\n\t"
  203950. #else
  203951. "and r7, r3\n\t"
  203952. #endif
  203953. #ifdef WOLFSSL_KEIL
  203954. "sbcs r4, r4, r6\n\t"
  203955. #elif defined(__clang__)
  203956. "sbcs r4, r6\n\t"
  203957. #else
  203958. "sbc r4, r6\n\t"
  203959. #endif
  203960. #ifdef WOLFSSL_KEIL
  203961. "sbcs r5, r5, r7\n\t"
  203962. #elif defined(__clang__)
  203963. "sbcs r5, r7\n\t"
  203964. #else
  203965. "sbc r5, r7\n\t"
  203966. #endif
  203967. "str r4, [%[r], #112]\n\t"
  203968. "str r5, [%[r], #116]\n\t"
  203969. "ldr r4, [%[r], #120]\n\t"
  203970. "ldr r5, [%[r], #124]\n\t"
  203971. "ldr r6, [%[m], #120]\n\t"
  203972. "ldr r7, [%[m], #124]\n\t"
  203973. #ifdef WOLFSSL_KEIL
  203974. "ands r6, r6, r3\n\t"
  203975. #elif defined(__clang__)
  203976. "ands r6, r3\n\t"
  203977. #else
  203978. "and r6, r3\n\t"
  203979. #endif
  203980. #ifdef WOLFSSL_KEIL
  203981. "ands r7, r7, r3\n\t"
  203982. #elif defined(__clang__)
  203983. "ands r7, r3\n\t"
  203984. #else
  203985. "and r7, r3\n\t"
  203986. #endif
  203987. #ifdef WOLFSSL_KEIL
  203988. "sbcs r4, r4, r6\n\t"
  203989. #elif defined(__clang__)
  203990. "sbcs r4, r6\n\t"
  203991. #else
  203992. "sbc r4, r6\n\t"
  203993. #endif
  203994. #ifdef WOLFSSL_KEIL
  203995. "sbcs r5, r5, r7\n\t"
  203996. #elif defined(__clang__)
  203997. "sbcs r5, r7\n\t"
  203998. #else
  203999. "sbc r5, r7\n\t"
  204000. #endif
  204001. "str r4, [%[r], #120]\n\t"
  204002. "str r5, [%[r], #124]\n\t"
  204003. "ldr r4, [%[a]]\n\t"
  204004. "ldr r5, [%[a], #4]\n\t"
  204005. "ldr r6, [%[r]]\n\t"
  204006. "ldr r7, [%[r], #4]\n\t"
  204007. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204008. "adds r6, r6, r4\n\t"
  204009. #else
  204010. "add r6, r6, r4\n\t"
  204011. #endif
  204012. #ifdef WOLFSSL_KEIL
  204013. "adcs r7, r7, r5\n\t"
  204014. #elif defined(__clang__)
  204015. "adcs r7, r5\n\t"
  204016. #else
  204017. "adc r7, r5\n\t"
  204018. #endif
  204019. "str r6, [%[r]]\n\t"
  204020. "str r7, [%[r], #4]\n\t"
  204021. "ldr r4, [%[a], #8]\n\t"
  204022. "ldr r5, [%[a], #12]\n\t"
  204023. "ldr r6, [%[r], #8]\n\t"
  204024. "ldr r7, [%[r], #12]\n\t"
  204025. #ifdef WOLFSSL_KEIL
  204026. "adcs r6, r6, r4\n\t"
  204027. #elif defined(__clang__)
  204028. "adcs r6, r4\n\t"
  204029. #else
  204030. "adc r6, r4\n\t"
  204031. #endif
  204032. #ifdef WOLFSSL_KEIL
  204033. "adcs r7, r7, r5\n\t"
  204034. #elif defined(__clang__)
  204035. "adcs r7, r5\n\t"
  204036. #else
  204037. "adc r7, r5\n\t"
  204038. #endif
  204039. "str r6, [%[r], #8]\n\t"
  204040. "str r7, [%[r], #12]\n\t"
  204041. "ldr r4, [%[a], #16]\n\t"
  204042. "ldr r5, [%[a], #20]\n\t"
  204043. "ldr r6, [%[r], #16]\n\t"
  204044. "ldr r7, [%[r], #20]\n\t"
  204045. #ifdef WOLFSSL_KEIL
  204046. "adcs r6, r6, r4\n\t"
  204047. #elif defined(__clang__)
  204048. "adcs r6, r4\n\t"
  204049. #else
  204050. "adc r6, r4\n\t"
  204051. #endif
  204052. #ifdef WOLFSSL_KEIL
  204053. "adcs r7, r7, r5\n\t"
  204054. #elif defined(__clang__)
  204055. "adcs r7, r5\n\t"
  204056. #else
  204057. "adc r7, r5\n\t"
  204058. #endif
  204059. "str r6, [%[r], #16]\n\t"
  204060. "str r7, [%[r], #20]\n\t"
  204061. "ldr r4, [%[a], #24]\n\t"
  204062. "ldr r5, [%[a], #28]\n\t"
  204063. "ldr r6, [%[r], #24]\n\t"
  204064. "ldr r7, [%[r], #28]\n\t"
  204065. #ifdef WOLFSSL_KEIL
  204066. "adcs r6, r6, r4\n\t"
  204067. #elif defined(__clang__)
  204068. "adcs r6, r4\n\t"
  204069. #else
  204070. "adc r6, r4\n\t"
  204071. #endif
  204072. #ifdef WOLFSSL_KEIL
  204073. "adcs r7, r7, r5\n\t"
  204074. #elif defined(__clang__)
  204075. "adcs r7, r5\n\t"
  204076. #else
  204077. "adc r7, r5\n\t"
  204078. #endif
  204079. "str r6, [%[r], #24]\n\t"
  204080. "str r7, [%[r], #28]\n\t"
  204081. "ldr r4, [%[a], #32]\n\t"
  204082. "ldr r5, [%[a], #36]\n\t"
  204083. "ldr r6, [%[r], #32]\n\t"
  204084. "ldr r7, [%[r], #36]\n\t"
  204085. #ifdef WOLFSSL_KEIL
  204086. "adcs r6, r6, r4\n\t"
  204087. #elif defined(__clang__)
  204088. "adcs r6, r4\n\t"
  204089. #else
  204090. "adc r6, r4\n\t"
  204091. #endif
  204092. #ifdef WOLFSSL_KEIL
  204093. "adcs r7, r7, r5\n\t"
  204094. #elif defined(__clang__)
  204095. "adcs r7, r5\n\t"
  204096. #else
  204097. "adc r7, r5\n\t"
  204098. #endif
  204099. "str r6, [%[r], #32]\n\t"
  204100. "str r7, [%[r], #36]\n\t"
  204101. "ldr r4, [%[a], #40]\n\t"
  204102. "ldr r5, [%[a], #44]\n\t"
  204103. "ldr r6, [%[r], #40]\n\t"
  204104. "ldr r7, [%[r], #44]\n\t"
  204105. #ifdef WOLFSSL_KEIL
  204106. "adcs r6, r6, r4\n\t"
  204107. #elif defined(__clang__)
  204108. "adcs r6, r4\n\t"
  204109. #else
  204110. "adc r6, r4\n\t"
  204111. #endif
  204112. #ifdef WOLFSSL_KEIL
  204113. "adcs r7, r7, r5\n\t"
  204114. #elif defined(__clang__)
  204115. "adcs r7, r5\n\t"
  204116. #else
  204117. "adc r7, r5\n\t"
  204118. #endif
  204119. "str r6, [%[r], #40]\n\t"
  204120. "str r7, [%[r], #44]\n\t"
  204121. "ldr r4, [%[a], #48]\n\t"
  204122. "ldr r5, [%[a], #52]\n\t"
  204123. "ldr r6, [%[r], #48]\n\t"
  204124. "ldr r7, [%[r], #52]\n\t"
  204125. #ifdef WOLFSSL_KEIL
  204126. "adcs r6, r6, r4\n\t"
  204127. #elif defined(__clang__)
  204128. "adcs r6, r4\n\t"
  204129. #else
  204130. "adc r6, r4\n\t"
  204131. #endif
  204132. #ifdef WOLFSSL_KEIL
  204133. "adcs r7, r7, r5\n\t"
  204134. #elif defined(__clang__)
  204135. "adcs r7, r5\n\t"
  204136. #else
  204137. "adc r7, r5\n\t"
  204138. #endif
  204139. "str r6, [%[r], #48]\n\t"
  204140. "str r7, [%[r], #52]\n\t"
  204141. "ldr r4, [%[a], #56]\n\t"
  204142. "ldr r5, [%[a], #60]\n\t"
  204143. "ldr r6, [%[r], #56]\n\t"
  204144. "ldr r7, [%[r], #60]\n\t"
  204145. #ifdef WOLFSSL_KEIL
  204146. "adcs r6, r6, r4\n\t"
  204147. #elif defined(__clang__)
  204148. "adcs r6, r4\n\t"
  204149. #else
  204150. "adc r6, r4\n\t"
  204151. #endif
  204152. #ifdef WOLFSSL_KEIL
  204153. "adcs r7, r7, r5\n\t"
  204154. #elif defined(__clang__)
  204155. "adcs r7, r5\n\t"
  204156. #else
  204157. "adc r7, r5\n\t"
  204158. #endif
  204159. "str r6, [%[r], #56]\n\t"
  204160. "str r7, [%[r], #60]\n\t"
  204161. "ldr r4, [%[a], #64]\n\t"
  204162. "ldr r5, [%[a], #68]\n\t"
  204163. "ldr r6, [%[r], #64]\n\t"
  204164. "ldr r7, [%[r], #68]\n\t"
  204165. #ifdef WOLFSSL_KEIL
  204166. "adcs r6, r6, r4\n\t"
  204167. #elif defined(__clang__)
  204168. "adcs r6, r4\n\t"
  204169. #else
  204170. "adc r6, r4\n\t"
  204171. #endif
  204172. #ifdef WOLFSSL_KEIL
  204173. "adcs r7, r7, r5\n\t"
  204174. #elif defined(__clang__)
  204175. "adcs r7, r5\n\t"
  204176. #else
  204177. "adc r7, r5\n\t"
  204178. #endif
  204179. "str r6, [%[r], #64]\n\t"
  204180. "str r7, [%[r], #68]\n\t"
  204181. "ldr r4, [%[a], #72]\n\t"
  204182. "ldr r5, [%[a], #76]\n\t"
  204183. "ldr r6, [%[r], #72]\n\t"
  204184. "ldr r7, [%[r], #76]\n\t"
  204185. #ifdef WOLFSSL_KEIL
  204186. "adcs r6, r6, r4\n\t"
  204187. #elif defined(__clang__)
  204188. "adcs r6, r4\n\t"
  204189. #else
  204190. "adc r6, r4\n\t"
  204191. #endif
  204192. #ifdef WOLFSSL_KEIL
  204193. "adcs r7, r7, r5\n\t"
  204194. #elif defined(__clang__)
  204195. "adcs r7, r5\n\t"
  204196. #else
  204197. "adc r7, r5\n\t"
  204198. #endif
  204199. "str r6, [%[r], #72]\n\t"
  204200. "str r7, [%[r], #76]\n\t"
  204201. "ldr r4, [%[a], #80]\n\t"
  204202. "ldr r5, [%[a], #84]\n\t"
  204203. "ldr r6, [%[r], #80]\n\t"
  204204. "ldr r7, [%[r], #84]\n\t"
  204205. #ifdef WOLFSSL_KEIL
  204206. "adcs r6, r6, r4\n\t"
  204207. #elif defined(__clang__)
  204208. "adcs r6, r4\n\t"
  204209. #else
  204210. "adc r6, r4\n\t"
  204211. #endif
  204212. #ifdef WOLFSSL_KEIL
  204213. "adcs r7, r7, r5\n\t"
  204214. #elif defined(__clang__)
  204215. "adcs r7, r5\n\t"
  204216. #else
  204217. "adc r7, r5\n\t"
  204218. #endif
  204219. "str r6, [%[r], #80]\n\t"
  204220. "str r7, [%[r], #84]\n\t"
  204221. "ldr r4, [%[a], #88]\n\t"
  204222. "ldr r5, [%[a], #92]\n\t"
  204223. "ldr r6, [%[r], #88]\n\t"
  204224. "ldr r7, [%[r], #92]\n\t"
  204225. #ifdef WOLFSSL_KEIL
  204226. "adcs r6, r6, r4\n\t"
  204227. #elif defined(__clang__)
  204228. "adcs r6, r4\n\t"
  204229. #else
  204230. "adc r6, r4\n\t"
  204231. #endif
  204232. #ifdef WOLFSSL_KEIL
  204233. "adcs r7, r7, r5\n\t"
  204234. #elif defined(__clang__)
  204235. "adcs r7, r5\n\t"
  204236. #else
  204237. "adc r7, r5\n\t"
  204238. #endif
  204239. "str r6, [%[r], #88]\n\t"
  204240. "str r7, [%[r], #92]\n\t"
  204241. "ldr r4, [%[a], #96]\n\t"
  204242. "ldr r5, [%[a], #100]\n\t"
  204243. "ldr r6, [%[r], #96]\n\t"
  204244. "ldr r7, [%[r], #100]\n\t"
  204245. #ifdef WOLFSSL_KEIL
  204246. "adcs r6, r6, r4\n\t"
  204247. #elif defined(__clang__)
  204248. "adcs r6, r4\n\t"
  204249. #else
  204250. "adc r6, r4\n\t"
  204251. #endif
  204252. #ifdef WOLFSSL_KEIL
  204253. "adcs r7, r7, r5\n\t"
  204254. #elif defined(__clang__)
  204255. "adcs r7, r5\n\t"
  204256. #else
  204257. "adc r7, r5\n\t"
  204258. #endif
  204259. "str r6, [%[r], #96]\n\t"
  204260. "str r7, [%[r], #100]\n\t"
  204261. "ldr r4, [%[a], #104]\n\t"
  204262. "ldr r5, [%[a], #108]\n\t"
  204263. "ldr r6, [%[r], #104]\n\t"
  204264. "ldr r7, [%[r], #108]\n\t"
  204265. #ifdef WOLFSSL_KEIL
  204266. "adcs r6, r6, r4\n\t"
  204267. #elif defined(__clang__)
  204268. "adcs r6, r4\n\t"
  204269. #else
  204270. "adc r6, r4\n\t"
  204271. #endif
  204272. #ifdef WOLFSSL_KEIL
  204273. "adcs r7, r7, r5\n\t"
  204274. #elif defined(__clang__)
  204275. "adcs r7, r5\n\t"
  204276. #else
  204277. "adc r7, r5\n\t"
  204278. #endif
  204279. "str r6, [%[r], #104]\n\t"
  204280. "str r7, [%[r], #108]\n\t"
  204281. "ldr r4, [%[a], #112]\n\t"
  204282. "ldr r5, [%[a], #116]\n\t"
  204283. "ldr r6, [%[r], #112]\n\t"
  204284. "ldr r7, [%[r], #116]\n\t"
  204285. #ifdef WOLFSSL_KEIL
  204286. "adcs r6, r6, r4\n\t"
  204287. #elif defined(__clang__)
  204288. "adcs r6, r4\n\t"
  204289. #else
  204290. "adc r6, r4\n\t"
  204291. #endif
  204292. #ifdef WOLFSSL_KEIL
  204293. "adcs r7, r7, r5\n\t"
  204294. #elif defined(__clang__)
  204295. "adcs r7, r5\n\t"
  204296. #else
  204297. "adc r7, r5\n\t"
  204298. #endif
  204299. "str r6, [%[r], #112]\n\t"
  204300. "str r7, [%[r], #116]\n\t"
  204301. "ldr r4, [%[a], #120]\n\t"
  204302. "ldr r5, [%[a], #124]\n\t"
  204303. "ldr r6, [%[r], #120]\n\t"
  204304. "ldr r7, [%[r], #124]\n\t"
  204305. #ifdef WOLFSSL_KEIL
  204306. "adcs r6, r6, r4\n\t"
  204307. #elif defined(__clang__)
  204308. "adcs r6, r4\n\t"
  204309. #else
  204310. "adc r6, r4\n\t"
  204311. #endif
  204312. #ifdef WOLFSSL_KEIL
  204313. "adcs r7, r7, r5\n\t"
  204314. #elif defined(__clang__)
  204315. "adcs r7, r5\n\t"
  204316. #else
  204317. "adc r7, r5\n\t"
  204318. #endif
  204319. "str r6, [%[r], #120]\n\t"
  204320. "str r7, [%[r], #124]\n\t"
  204321. "movs r3, #0\n\t"
  204322. "ldr r5, [%[m], #124]\n\t"
  204323. #ifdef WOLFSSL_KEIL
  204324. "adcs r3, r3, r3\n\t"
  204325. #elif defined(__clang__)
  204326. "adcs r3, r3\n\t"
  204327. #else
  204328. "adc r3, r3\n\t"
  204329. #endif
  204330. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204331. "subs r5, r5, r7\n\t"
  204332. #else
  204333. "sub r5, r5, r7\n\t"
  204334. #endif
  204335. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204336. "negs r3, r3\n\t"
  204337. #else
  204338. "neg r3, r3\n\t"
  204339. #endif
  204340. #ifdef WOLFSSL_KEIL
  204341. "sbcs r5, r5, r5\n\t"
  204342. #elif defined(__clang__)
  204343. "sbcs r5, r5\n\t"
  204344. #else
  204345. "sbc r5, r5\n\t"
  204346. #endif
  204347. #ifdef WOLFSSL_KEIL
  204348. "orrs r3, r3, r5\n\t"
  204349. #elif defined(__clang__)
  204350. "orrs r3, r5\n\t"
  204351. #else
  204352. "orr r3, r5\n\t"
  204353. #endif
  204354. "ldr r6, [%[r]]\n\t"
  204355. "ldr r7, [%[r], #4]\n\t"
  204356. "ldr r4, [%[m]]\n\t"
  204357. "ldr r5, [%[m], #4]\n\t"
  204358. #ifdef WOLFSSL_KEIL
  204359. "ands r4, r4, r3\n\t"
  204360. #elif defined(__clang__)
  204361. "ands r4, r3\n\t"
  204362. #else
  204363. "and r4, r3\n\t"
  204364. #endif
  204365. #ifdef WOLFSSL_KEIL
  204366. "ands r5, r5, r3\n\t"
  204367. #elif defined(__clang__)
  204368. "ands r5, r3\n\t"
  204369. #else
  204370. "and r5, r3\n\t"
  204371. #endif
  204372. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204373. "subs r6, r6, r4\n\t"
  204374. #else
  204375. "sub r6, r6, r4\n\t"
  204376. #endif
  204377. #ifdef WOLFSSL_KEIL
  204378. "sbcs r7, r7, r5\n\t"
  204379. #elif defined(__clang__)
  204380. "sbcs r7, r5\n\t"
  204381. #else
  204382. "sbc r7, r5\n\t"
  204383. #endif
  204384. "str r6, [%[r]]\n\t"
  204385. "str r7, [%[r], #4]\n\t"
  204386. "ldr r6, [%[r], #8]\n\t"
  204387. "ldr r7, [%[r], #12]\n\t"
  204388. "ldr r4, [%[m], #8]\n\t"
  204389. "ldr r5, [%[m], #12]\n\t"
  204390. #ifdef WOLFSSL_KEIL
  204391. "ands r4, r4, r3\n\t"
  204392. #elif defined(__clang__)
  204393. "ands r4, r3\n\t"
  204394. #else
  204395. "and r4, r3\n\t"
  204396. #endif
  204397. #ifdef WOLFSSL_KEIL
  204398. "ands r5, r5, r3\n\t"
  204399. #elif defined(__clang__)
  204400. "ands r5, r3\n\t"
  204401. #else
  204402. "and r5, r3\n\t"
  204403. #endif
  204404. #ifdef WOLFSSL_KEIL
  204405. "sbcs r6, r6, r4\n\t"
  204406. #elif defined(__clang__)
  204407. "sbcs r6, r4\n\t"
  204408. #else
  204409. "sbc r6, r4\n\t"
  204410. #endif
  204411. #ifdef WOLFSSL_KEIL
  204412. "sbcs r7, r7, r5\n\t"
  204413. #elif defined(__clang__)
  204414. "sbcs r7, r5\n\t"
  204415. #else
  204416. "sbc r7, r5\n\t"
  204417. #endif
  204418. "str r6, [%[r], #8]\n\t"
  204419. "str r7, [%[r], #12]\n\t"
  204420. "ldr r6, [%[r], #16]\n\t"
  204421. "ldr r7, [%[r], #20]\n\t"
  204422. "ldr r4, [%[m], #16]\n\t"
  204423. "ldr r5, [%[m], #20]\n\t"
  204424. #ifdef WOLFSSL_KEIL
  204425. "ands r4, r4, r3\n\t"
  204426. #elif defined(__clang__)
  204427. "ands r4, r3\n\t"
  204428. #else
  204429. "and r4, r3\n\t"
  204430. #endif
  204431. #ifdef WOLFSSL_KEIL
  204432. "ands r5, r5, r3\n\t"
  204433. #elif defined(__clang__)
  204434. "ands r5, r3\n\t"
  204435. #else
  204436. "and r5, r3\n\t"
  204437. #endif
  204438. #ifdef WOLFSSL_KEIL
  204439. "sbcs r6, r6, r4\n\t"
  204440. #elif defined(__clang__)
  204441. "sbcs r6, r4\n\t"
  204442. #else
  204443. "sbc r6, r4\n\t"
  204444. #endif
  204445. #ifdef WOLFSSL_KEIL
  204446. "sbcs r7, r7, r5\n\t"
  204447. #elif defined(__clang__)
  204448. "sbcs r7, r5\n\t"
  204449. #else
  204450. "sbc r7, r5\n\t"
  204451. #endif
  204452. "str r6, [%[r], #16]\n\t"
  204453. "str r7, [%[r], #20]\n\t"
  204454. "ldr r6, [%[r], #24]\n\t"
  204455. "ldr r7, [%[r], #28]\n\t"
  204456. "ldr r4, [%[m], #24]\n\t"
  204457. "ldr r5, [%[m], #28]\n\t"
  204458. #ifdef WOLFSSL_KEIL
  204459. "ands r4, r4, r3\n\t"
  204460. #elif defined(__clang__)
  204461. "ands r4, r3\n\t"
  204462. #else
  204463. "and r4, r3\n\t"
  204464. #endif
  204465. #ifdef WOLFSSL_KEIL
  204466. "ands r5, r5, r3\n\t"
  204467. #elif defined(__clang__)
  204468. "ands r5, r3\n\t"
  204469. #else
  204470. "and r5, r3\n\t"
  204471. #endif
  204472. #ifdef WOLFSSL_KEIL
  204473. "sbcs r6, r6, r4\n\t"
  204474. #elif defined(__clang__)
  204475. "sbcs r6, r4\n\t"
  204476. #else
  204477. "sbc r6, r4\n\t"
  204478. #endif
  204479. #ifdef WOLFSSL_KEIL
  204480. "sbcs r7, r7, r5\n\t"
  204481. #elif defined(__clang__)
  204482. "sbcs r7, r5\n\t"
  204483. #else
  204484. "sbc r7, r5\n\t"
  204485. #endif
  204486. "str r6, [%[r], #24]\n\t"
  204487. "str r7, [%[r], #28]\n\t"
  204488. "ldr r6, [%[r], #32]\n\t"
  204489. "ldr r7, [%[r], #36]\n\t"
  204490. "ldr r4, [%[m], #32]\n\t"
  204491. "ldr r5, [%[m], #36]\n\t"
  204492. #ifdef WOLFSSL_KEIL
  204493. "ands r4, r4, r3\n\t"
  204494. #elif defined(__clang__)
  204495. "ands r4, r3\n\t"
  204496. #else
  204497. "and r4, r3\n\t"
  204498. #endif
  204499. #ifdef WOLFSSL_KEIL
  204500. "ands r5, r5, r3\n\t"
  204501. #elif defined(__clang__)
  204502. "ands r5, r3\n\t"
  204503. #else
  204504. "and r5, r3\n\t"
  204505. #endif
  204506. #ifdef WOLFSSL_KEIL
  204507. "sbcs r6, r6, r4\n\t"
  204508. #elif defined(__clang__)
  204509. "sbcs r6, r4\n\t"
  204510. #else
  204511. "sbc r6, r4\n\t"
  204512. #endif
  204513. #ifdef WOLFSSL_KEIL
  204514. "sbcs r7, r7, r5\n\t"
  204515. #elif defined(__clang__)
  204516. "sbcs r7, r5\n\t"
  204517. #else
  204518. "sbc r7, r5\n\t"
  204519. #endif
  204520. "str r6, [%[r], #32]\n\t"
  204521. "str r7, [%[r], #36]\n\t"
  204522. "ldr r6, [%[r], #40]\n\t"
  204523. "ldr r7, [%[r], #44]\n\t"
  204524. "ldr r4, [%[m], #40]\n\t"
  204525. "ldr r5, [%[m], #44]\n\t"
  204526. #ifdef WOLFSSL_KEIL
  204527. "ands r4, r4, r3\n\t"
  204528. #elif defined(__clang__)
  204529. "ands r4, r3\n\t"
  204530. #else
  204531. "and r4, r3\n\t"
  204532. #endif
  204533. #ifdef WOLFSSL_KEIL
  204534. "ands r5, r5, r3\n\t"
  204535. #elif defined(__clang__)
  204536. "ands r5, r3\n\t"
  204537. #else
  204538. "and r5, r3\n\t"
  204539. #endif
  204540. #ifdef WOLFSSL_KEIL
  204541. "sbcs r6, r6, r4\n\t"
  204542. #elif defined(__clang__)
  204543. "sbcs r6, r4\n\t"
  204544. #else
  204545. "sbc r6, r4\n\t"
  204546. #endif
  204547. #ifdef WOLFSSL_KEIL
  204548. "sbcs r7, r7, r5\n\t"
  204549. #elif defined(__clang__)
  204550. "sbcs r7, r5\n\t"
  204551. #else
  204552. "sbc r7, r5\n\t"
  204553. #endif
  204554. "str r6, [%[r], #40]\n\t"
  204555. "str r7, [%[r], #44]\n\t"
  204556. "ldr r6, [%[r], #48]\n\t"
  204557. "ldr r7, [%[r], #52]\n\t"
  204558. "ldr r4, [%[m], #48]\n\t"
  204559. "ldr r5, [%[m], #52]\n\t"
  204560. #ifdef WOLFSSL_KEIL
  204561. "ands r4, r4, r3\n\t"
  204562. #elif defined(__clang__)
  204563. "ands r4, r3\n\t"
  204564. #else
  204565. "and r4, r3\n\t"
  204566. #endif
  204567. #ifdef WOLFSSL_KEIL
  204568. "ands r5, r5, r3\n\t"
  204569. #elif defined(__clang__)
  204570. "ands r5, r3\n\t"
  204571. #else
  204572. "and r5, r3\n\t"
  204573. #endif
  204574. #ifdef WOLFSSL_KEIL
  204575. "sbcs r6, r6, r4\n\t"
  204576. #elif defined(__clang__)
  204577. "sbcs r6, r4\n\t"
  204578. #else
  204579. "sbc r6, r4\n\t"
  204580. #endif
  204581. #ifdef WOLFSSL_KEIL
  204582. "sbcs r7, r7, r5\n\t"
  204583. #elif defined(__clang__)
  204584. "sbcs r7, r5\n\t"
  204585. #else
  204586. "sbc r7, r5\n\t"
  204587. #endif
  204588. "str r6, [%[r], #48]\n\t"
  204589. "str r7, [%[r], #52]\n\t"
  204590. "ldr r6, [%[r], #56]\n\t"
  204591. "ldr r7, [%[r], #60]\n\t"
  204592. "ldr r4, [%[m], #56]\n\t"
  204593. "ldr r5, [%[m], #60]\n\t"
  204594. #ifdef WOLFSSL_KEIL
  204595. "ands r4, r4, r3\n\t"
  204596. #elif defined(__clang__)
  204597. "ands r4, r3\n\t"
  204598. #else
  204599. "and r4, r3\n\t"
  204600. #endif
  204601. #ifdef WOLFSSL_KEIL
  204602. "ands r5, r5, r3\n\t"
  204603. #elif defined(__clang__)
  204604. "ands r5, r3\n\t"
  204605. #else
  204606. "and r5, r3\n\t"
  204607. #endif
  204608. #ifdef WOLFSSL_KEIL
  204609. "sbcs r6, r6, r4\n\t"
  204610. #elif defined(__clang__)
  204611. "sbcs r6, r4\n\t"
  204612. #else
  204613. "sbc r6, r4\n\t"
  204614. #endif
  204615. #ifdef WOLFSSL_KEIL
  204616. "sbcs r7, r7, r5\n\t"
  204617. #elif defined(__clang__)
  204618. "sbcs r7, r5\n\t"
  204619. #else
  204620. "sbc r7, r5\n\t"
  204621. #endif
  204622. "str r6, [%[r], #56]\n\t"
  204623. "str r7, [%[r], #60]\n\t"
  204624. "ldr r6, [%[r], #64]\n\t"
  204625. "ldr r7, [%[r], #68]\n\t"
  204626. "ldr r4, [%[m], #64]\n\t"
  204627. "ldr r5, [%[m], #68]\n\t"
  204628. #ifdef WOLFSSL_KEIL
  204629. "ands r4, r4, r3\n\t"
  204630. #elif defined(__clang__)
  204631. "ands r4, r3\n\t"
  204632. #else
  204633. "and r4, r3\n\t"
  204634. #endif
  204635. #ifdef WOLFSSL_KEIL
  204636. "ands r5, r5, r3\n\t"
  204637. #elif defined(__clang__)
  204638. "ands r5, r3\n\t"
  204639. #else
  204640. "and r5, r3\n\t"
  204641. #endif
  204642. #ifdef WOLFSSL_KEIL
  204643. "sbcs r6, r6, r4\n\t"
  204644. #elif defined(__clang__)
  204645. "sbcs r6, r4\n\t"
  204646. #else
  204647. "sbc r6, r4\n\t"
  204648. #endif
  204649. #ifdef WOLFSSL_KEIL
  204650. "sbcs r7, r7, r5\n\t"
  204651. #elif defined(__clang__)
  204652. "sbcs r7, r5\n\t"
  204653. #else
  204654. "sbc r7, r5\n\t"
  204655. #endif
  204656. "str r6, [%[r], #64]\n\t"
  204657. "str r7, [%[r], #68]\n\t"
  204658. "ldr r6, [%[r], #72]\n\t"
  204659. "ldr r7, [%[r], #76]\n\t"
  204660. "ldr r4, [%[m], #72]\n\t"
  204661. "ldr r5, [%[m], #76]\n\t"
  204662. #ifdef WOLFSSL_KEIL
  204663. "ands r4, r4, r3\n\t"
  204664. #elif defined(__clang__)
  204665. "ands r4, r3\n\t"
  204666. #else
  204667. "and r4, r3\n\t"
  204668. #endif
  204669. #ifdef WOLFSSL_KEIL
  204670. "ands r5, r5, r3\n\t"
  204671. #elif defined(__clang__)
  204672. "ands r5, r3\n\t"
  204673. #else
  204674. "and r5, r3\n\t"
  204675. #endif
  204676. #ifdef WOLFSSL_KEIL
  204677. "sbcs r6, r6, r4\n\t"
  204678. #elif defined(__clang__)
  204679. "sbcs r6, r4\n\t"
  204680. #else
  204681. "sbc r6, r4\n\t"
  204682. #endif
  204683. #ifdef WOLFSSL_KEIL
  204684. "sbcs r7, r7, r5\n\t"
  204685. #elif defined(__clang__)
  204686. "sbcs r7, r5\n\t"
  204687. #else
  204688. "sbc r7, r5\n\t"
  204689. #endif
  204690. "str r6, [%[r], #72]\n\t"
  204691. "str r7, [%[r], #76]\n\t"
  204692. "ldr r6, [%[r], #80]\n\t"
  204693. "ldr r7, [%[r], #84]\n\t"
  204694. "ldr r4, [%[m], #80]\n\t"
  204695. "ldr r5, [%[m], #84]\n\t"
  204696. #ifdef WOLFSSL_KEIL
  204697. "ands r4, r4, r3\n\t"
  204698. #elif defined(__clang__)
  204699. "ands r4, r3\n\t"
  204700. #else
  204701. "and r4, r3\n\t"
  204702. #endif
  204703. #ifdef WOLFSSL_KEIL
  204704. "ands r5, r5, r3\n\t"
  204705. #elif defined(__clang__)
  204706. "ands r5, r3\n\t"
  204707. #else
  204708. "and r5, r3\n\t"
  204709. #endif
  204710. #ifdef WOLFSSL_KEIL
  204711. "sbcs r6, r6, r4\n\t"
  204712. #elif defined(__clang__)
  204713. "sbcs r6, r4\n\t"
  204714. #else
  204715. "sbc r6, r4\n\t"
  204716. #endif
  204717. #ifdef WOLFSSL_KEIL
  204718. "sbcs r7, r7, r5\n\t"
  204719. #elif defined(__clang__)
  204720. "sbcs r7, r5\n\t"
  204721. #else
  204722. "sbc r7, r5\n\t"
  204723. #endif
  204724. "str r6, [%[r], #80]\n\t"
  204725. "str r7, [%[r], #84]\n\t"
  204726. "ldr r6, [%[r], #88]\n\t"
  204727. "ldr r7, [%[r], #92]\n\t"
  204728. "ldr r4, [%[m], #88]\n\t"
  204729. "ldr r5, [%[m], #92]\n\t"
  204730. #ifdef WOLFSSL_KEIL
  204731. "ands r4, r4, r3\n\t"
  204732. #elif defined(__clang__)
  204733. "ands r4, r3\n\t"
  204734. #else
  204735. "and r4, r3\n\t"
  204736. #endif
  204737. #ifdef WOLFSSL_KEIL
  204738. "ands r5, r5, r3\n\t"
  204739. #elif defined(__clang__)
  204740. "ands r5, r3\n\t"
  204741. #else
  204742. "and r5, r3\n\t"
  204743. #endif
  204744. #ifdef WOLFSSL_KEIL
  204745. "sbcs r6, r6, r4\n\t"
  204746. #elif defined(__clang__)
  204747. "sbcs r6, r4\n\t"
  204748. #else
  204749. "sbc r6, r4\n\t"
  204750. #endif
  204751. #ifdef WOLFSSL_KEIL
  204752. "sbcs r7, r7, r5\n\t"
  204753. #elif defined(__clang__)
  204754. "sbcs r7, r5\n\t"
  204755. #else
  204756. "sbc r7, r5\n\t"
  204757. #endif
  204758. "str r6, [%[r], #88]\n\t"
  204759. "str r7, [%[r], #92]\n\t"
  204760. "ldr r6, [%[r], #96]\n\t"
  204761. "ldr r7, [%[r], #100]\n\t"
  204762. "ldr r4, [%[m], #96]\n\t"
  204763. "ldr r5, [%[m], #100]\n\t"
  204764. #ifdef WOLFSSL_KEIL
  204765. "ands r4, r4, r3\n\t"
  204766. #elif defined(__clang__)
  204767. "ands r4, r3\n\t"
  204768. #else
  204769. "and r4, r3\n\t"
  204770. #endif
  204771. #ifdef WOLFSSL_KEIL
  204772. "ands r5, r5, r3\n\t"
  204773. #elif defined(__clang__)
  204774. "ands r5, r3\n\t"
  204775. #else
  204776. "and r5, r3\n\t"
  204777. #endif
  204778. #ifdef WOLFSSL_KEIL
  204779. "sbcs r6, r6, r4\n\t"
  204780. #elif defined(__clang__)
  204781. "sbcs r6, r4\n\t"
  204782. #else
  204783. "sbc r6, r4\n\t"
  204784. #endif
  204785. #ifdef WOLFSSL_KEIL
  204786. "sbcs r7, r7, r5\n\t"
  204787. #elif defined(__clang__)
  204788. "sbcs r7, r5\n\t"
  204789. #else
  204790. "sbc r7, r5\n\t"
  204791. #endif
  204792. "str r6, [%[r], #96]\n\t"
  204793. "str r7, [%[r], #100]\n\t"
  204794. "ldr r6, [%[r], #104]\n\t"
  204795. "ldr r7, [%[r], #108]\n\t"
  204796. "ldr r4, [%[m], #104]\n\t"
  204797. "ldr r5, [%[m], #108]\n\t"
  204798. #ifdef WOLFSSL_KEIL
  204799. "ands r4, r4, r3\n\t"
  204800. #elif defined(__clang__)
  204801. "ands r4, r3\n\t"
  204802. #else
  204803. "and r4, r3\n\t"
  204804. #endif
  204805. #ifdef WOLFSSL_KEIL
  204806. "ands r5, r5, r3\n\t"
  204807. #elif defined(__clang__)
  204808. "ands r5, r3\n\t"
  204809. #else
  204810. "and r5, r3\n\t"
  204811. #endif
  204812. #ifdef WOLFSSL_KEIL
  204813. "sbcs r6, r6, r4\n\t"
  204814. #elif defined(__clang__)
  204815. "sbcs r6, r4\n\t"
  204816. #else
  204817. "sbc r6, r4\n\t"
  204818. #endif
  204819. #ifdef WOLFSSL_KEIL
  204820. "sbcs r7, r7, r5\n\t"
  204821. #elif defined(__clang__)
  204822. "sbcs r7, r5\n\t"
  204823. #else
  204824. "sbc r7, r5\n\t"
  204825. #endif
  204826. "str r6, [%[r], #104]\n\t"
  204827. "str r7, [%[r], #108]\n\t"
  204828. "ldr r6, [%[r], #112]\n\t"
  204829. "ldr r7, [%[r], #116]\n\t"
  204830. "ldr r4, [%[m], #112]\n\t"
  204831. "ldr r5, [%[m], #116]\n\t"
  204832. #ifdef WOLFSSL_KEIL
  204833. "ands r4, r4, r3\n\t"
  204834. #elif defined(__clang__)
  204835. "ands r4, r3\n\t"
  204836. #else
  204837. "and r4, r3\n\t"
  204838. #endif
  204839. #ifdef WOLFSSL_KEIL
  204840. "ands r5, r5, r3\n\t"
  204841. #elif defined(__clang__)
  204842. "ands r5, r3\n\t"
  204843. #else
  204844. "and r5, r3\n\t"
  204845. #endif
  204846. #ifdef WOLFSSL_KEIL
  204847. "sbcs r6, r6, r4\n\t"
  204848. #elif defined(__clang__)
  204849. "sbcs r6, r4\n\t"
  204850. #else
  204851. "sbc r6, r4\n\t"
  204852. #endif
  204853. #ifdef WOLFSSL_KEIL
  204854. "sbcs r7, r7, r5\n\t"
  204855. #elif defined(__clang__)
  204856. "sbcs r7, r5\n\t"
  204857. #else
  204858. "sbc r7, r5\n\t"
  204859. #endif
  204860. "str r6, [%[r], #112]\n\t"
  204861. "str r7, [%[r], #116]\n\t"
  204862. "ldr r6, [%[r], #120]\n\t"
  204863. "ldr r7, [%[r], #124]\n\t"
  204864. "ldr r4, [%[m], #120]\n\t"
  204865. "ldr r5, [%[m], #124]\n\t"
  204866. #ifdef WOLFSSL_KEIL
  204867. "ands r4, r4, r3\n\t"
  204868. #elif defined(__clang__)
  204869. "ands r4, r3\n\t"
  204870. #else
  204871. "and r4, r3\n\t"
  204872. #endif
  204873. #ifdef WOLFSSL_KEIL
  204874. "ands r5, r5, r3\n\t"
  204875. #elif defined(__clang__)
  204876. "ands r5, r3\n\t"
  204877. #else
  204878. "and r5, r3\n\t"
  204879. #endif
  204880. #ifdef WOLFSSL_KEIL
  204881. "sbcs r6, r6, r4\n\t"
  204882. #elif defined(__clang__)
  204883. "sbcs r6, r4\n\t"
  204884. #else
  204885. "sbc r6, r4\n\t"
  204886. #endif
  204887. #ifdef WOLFSSL_KEIL
  204888. "sbcs r7, r7, r5\n\t"
  204889. #elif defined(__clang__)
  204890. "sbcs r7, r5\n\t"
  204891. #else
  204892. "sbc r7, r5\n\t"
  204893. #endif
  204894. "str r6, [%[r], #120]\n\t"
  204895. "str r7, [%[r], #124]\n\t"
  204896. : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m)
  204897. :
  204898. : "memory", "r3", "r4", "r5", "r6", "r7"
  204899. );
  204900. }
  204901. /* Subtract two Montgomery form numbers (r = a - b % m).
  204902. *
  204903. * r Result of subtration.
  204904. * a Number to subtract from in Montgomery form.
  204905. * b Number to subtract with in Montgomery form.
  204906. * m Modulus (prime).
  204907. */
  204908. SP_NOINLINE static void sp_1024_mont_sub_32(sp_digit* r, const sp_digit* a,
  204909. const sp_digit* b, const sp_digit* m)
  204910. {
  204911. __asm__ __volatile__ (
  204912. "ldr r4, [%[a]]\n\t"
  204913. "ldr r5, [%[a], #4]\n\t"
  204914. "ldr r6, [%[b]]\n\t"
  204915. "ldr r7, [%[b], #4]\n\t"
  204916. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  204917. "subs r4, r4, r6\n\t"
  204918. #else
  204919. "sub r4, r4, r6\n\t"
  204920. #endif
  204921. #ifdef WOLFSSL_KEIL
  204922. "sbcs r5, r5, r7\n\t"
  204923. #elif defined(__clang__)
  204924. "sbcs r5, r7\n\t"
  204925. #else
  204926. "sbc r5, r7\n\t"
  204927. #endif
  204928. "str r4, [%[r]]\n\t"
  204929. "str r5, [%[r], #4]\n\t"
  204930. "ldr r4, [%[a], #8]\n\t"
  204931. "ldr r5, [%[a], #12]\n\t"
  204932. "ldr r6, [%[b], #8]\n\t"
  204933. "ldr r7, [%[b], #12]\n\t"
  204934. #ifdef WOLFSSL_KEIL
  204935. "sbcs r4, r4, r6\n\t"
  204936. #elif defined(__clang__)
  204937. "sbcs r4, r6\n\t"
  204938. #else
  204939. "sbc r4, r6\n\t"
  204940. #endif
  204941. #ifdef WOLFSSL_KEIL
  204942. "sbcs r5, r5, r7\n\t"
  204943. #elif defined(__clang__)
  204944. "sbcs r5, r7\n\t"
  204945. #else
  204946. "sbc r5, r7\n\t"
  204947. #endif
  204948. "str r4, [%[r], #8]\n\t"
  204949. "str r5, [%[r], #12]\n\t"
  204950. "ldr r4, [%[a], #16]\n\t"
  204951. "ldr r5, [%[a], #20]\n\t"
  204952. "ldr r6, [%[b], #16]\n\t"
  204953. "ldr r7, [%[b], #20]\n\t"
  204954. #ifdef WOLFSSL_KEIL
  204955. "sbcs r4, r4, r6\n\t"
  204956. #elif defined(__clang__)
  204957. "sbcs r4, r6\n\t"
  204958. #else
  204959. "sbc r4, r6\n\t"
  204960. #endif
  204961. #ifdef WOLFSSL_KEIL
  204962. "sbcs r5, r5, r7\n\t"
  204963. #elif defined(__clang__)
  204964. "sbcs r5, r7\n\t"
  204965. #else
  204966. "sbc r5, r7\n\t"
  204967. #endif
  204968. "str r4, [%[r], #16]\n\t"
  204969. "str r5, [%[r], #20]\n\t"
  204970. "ldr r4, [%[a], #24]\n\t"
  204971. "ldr r5, [%[a], #28]\n\t"
  204972. "ldr r6, [%[b], #24]\n\t"
  204973. "ldr r7, [%[b], #28]\n\t"
  204974. #ifdef WOLFSSL_KEIL
  204975. "sbcs r4, r4, r6\n\t"
  204976. #elif defined(__clang__)
  204977. "sbcs r4, r6\n\t"
  204978. #else
  204979. "sbc r4, r6\n\t"
  204980. #endif
  204981. #ifdef WOLFSSL_KEIL
  204982. "sbcs r5, r5, r7\n\t"
  204983. #elif defined(__clang__)
  204984. "sbcs r5, r7\n\t"
  204985. #else
  204986. "sbc r5, r7\n\t"
  204987. #endif
  204988. "str r4, [%[r], #24]\n\t"
  204989. "str r5, [%[r], #28]\n\t"
  204990. "ldr r4, [%[a], #32]\n\t"
  204991. "ldr r5, [%[a], #36]\n\t"
  204992. "ldr r6, [%[b], #32]\n\t"
  204993. "ldr r7, [%[b], #36]\n\t"
  204994. #ifdef WOLFSSL_KEIL
  204995. "sbcs r4, r4, r6\n\t"
  204996. #elif defined(__clang__)
  204997. "sbcs r4, r6\n\t"
  204998. #else
  204999. "sbc r4, r6\n\t"
  205000. #endif
  205001. #ifdef WOLFSSL_KEIL
  205002. "sbcs r5, r5, r7\n\t"
  205003. #elif defined(__clang__)
  205004. "sbcs r5, r7\n\t"
  205005. #else
  205006. "sbc r5, r7\n\t"
  205007. #endif
  205008. "str r4, [%[r], #32]\n\t"
  205009. "str r5, [%[r], #36]\n\t"
  205010. "ldr r4, [%[a], #40]\n\t"
  205011. "ldr r5, [%[a], #44]\n\t"
  205012. "ldr r6, [%[b], #40]\n\t"
  205013. "ldr r7, [%[b], #44]\n\t"
  205014. #ifdef WOLFSSL_KEIL
  205015. "sbcs r4, r4, r6\n\t"
  205016. #elif defined(__clang__)
  205017. "sbcs r4, r6\n\t"
  205018. #else
  205019. "sbc r4, r6\n\t"
  205020. #endif
  205021. #ifdef WOLFSSL_KEIL
  205022. "sbcs r5, r5, r7\n\t"
  205023. #elif defined(__clang__)
  205024. "sbcs r5, r7\n\t"
  205025. #else
  205026. "sbc r5, r7\n\t"
  205027. #endif
  205028. "str r4, [%[r], #40]\n\t"
  205029. "str r5, [%[r], #44]\n\t"
  205030. "ldr r4, [%[a], #48]\n\t"
  205031. "ldr r5, [%[a], #52]\n\t"
  205032. "ldr r6, [%[b], #48]\n\t"
  205033. "ldr r7, [%[b], #52]\n\t"
  205034. #ifdef WOLFSSL_KEIL
  205035. "sbcs r4, r4, r6\n\t"
  205036. #elif defined(__clang__)
  205037. "sbcs r4, r6\n\t"
  205038. #else
  205039. "sbc r4, r6\n\t"
  205040. #endif
  205041. #ifdef WOLFSSL_KEIL
  205042. "sbcs r5, r5, r7\n\t"
  205043. #elif defined(__clang__)
  205044. "sbcs r5, r7\n\t"
  205045. #else
  205046. "sbc r5, r7\n\t"
  205047. #endif
  205048. "str r4, [%[r], #48]\n\t"
  205049. "str r5, [%[r], #52]\n\t"
  205050. "ldr r4, [%[a], #56]\n\t"
  205051. "ldr r5, [%[a], #60]\n\t"
  205052. "ldr r6, [%[b], #56]\n\t"
  205053. "ldr r7, [%[b], #60]\n\t"
  205054. #ifdef WOLFSSL_KEIL
  205055. "sbcs r4, r4, r6\n\t"
  205056. #elif defined(__clang__)
  205057. "sbcs r4, r6\n\t"
  205058. #else
  205059. "sbc r4, r6\n\t"
  205060. #endif
  205061. #ifdef WOLFSSL_KEIL
  205062. "sbcs r5, r5, r7\n\t"
  205063. #elif defined(__clang__)
  205064. "sbcs r5, r7\n\t"
  205065. #else
  205066. "sbc r5, r7\n\t"
  205067. #endif
  205068. "str r4, [%[r], #56]\n\t"
  205069. "str r5, [%[r], #60]\n\t"
  205070. "ldr r4, [%[a], #64]\n\t"
  205071. "ldr r5, [%[a], #68]\n\t"
  205072. "ldr r6, [%[b], #64]\n\t"
  205073. "ldr r7, [%[b], #68]\n\t"
  205074. #ifdef WOLFSSL_KEIL
  205075. "sbcs r4, r4, r6\n\t"
  205076. #elif defined(__clang__)
  205077. "sbcs r4, r6\n\t"
  205078. #else
  205079. "sbc r4, r6\n\t"
  205080. #endif
  205081. #ifdef WOLFSSL_KEIL
  205082. "sbcs r5, r5, r7\n\t"
  205083. #elif defined(__clang__)
  205084. "sbcs r5, r7\n\t"
  205085. #else
  205086. "sbc r5, r7\n\t"
  205087. #endif
  205088. "str r4, [%[r], #64]\n\t"
  205089. "str r5, [%[r], #68]\n\t"
  205090. "ldr r4, [%[a], #72]\n\t"
  205091. "ldr r5, [%[a], #76]\n\t"
  205092. "ldr r6, [%[b], #72]\n\t"
  205093. "ldr r7, [%[b], #76]\n\t"
  205094. #ifdef WOLFSSL_KEIL
  205095. "sbcs r4, r4, r6\n\t"
  205096. #elif defined(__clang__)
  205097. "sbcs r4, r6\n\t"
  205098. #else
  205099. "sbc r4, r6\n\t"
  205100. #endif
  205101. #ifdef WOLFSSL_KEIL
  205102. "sbcs r5, r5, r7\n\t"
  205103. #elif defined(__clang__)
  205104. "sbcs r5, r7\n\t"
  205105. #else
  205106. "sbc r5, r7\n\t"
  205107. #endif
  205108. "str r4, [%[r], #72]\n\t"
  205109. "str r5, [%[r], #76]\n\t"
  205110. "ldr r4, [%[a], #80]\n\t"
  205111. "ldr r5, [%[a], #84]\n\t"
  205112. "ldr r6, [%[b], #80]\n\t"
  205113. "ldr r7, [%[b], #84]\n\t"
  205114. #ifdef WOLFSSL_KEIL
  205115. "sbcs r4, r4, r6\n\t"
  205116. #elif defined(__clang__)
  205117. "sbcs r4, r6\n\t"
  205118. #else
  205119. "sbc r4, r6\n\t"
  205120. #endif
  205121. #ifdef WOLFSSL_KEIL
  205122. "sbcs r5, r5, r7\n\t"
  205123. #elif defined(__clang__)
  205124. "sbcs r5, r7\n\t"
  205125. #else
  205126. "sbc r5, r7\n\t"
  205127. #endif
  205128. "str r4, [%[r], #80]\n\t"
  205129. "str r5, [%[r], #84]\n\t"
  205130. "ldr r4, [%[a], #88]\n\t"
  205131. "ldr r5, [%[a], #92]\n\t"
  205132. "ldr r6, [%[b], #88]\n\t"
  205133. "ldr r7, [%[b], #92]\n\t"
  205134. #ifdef WOLFSSL_KEIL
  205135. "sbcs r4, r4, r6\n\t"
  205136. #elif defined(__clang__)
  205137. "sbcs r4, r6\n\t"
  205138. #else
  205139. "sbc r4, r6\n\t"
  205140. #endif
  205141. #ifdef WOLFSSL_KEIL
  205142. "sbcs r5, r5, r7\n\t"
  205143. #elif defined(__clang__)
  205144. "sbcs r5, r7\n\t"
  205145. #else
  205146. "sbc r5, r7\n\t"
  205147. #endif
  205148. "str r4, [%[r], #88]\n\t"
  205149. "str r5, [%[r], #92]\n\t"
  205150. "ldr r4, [%[a], #96]\n\t"
  205151. "ldr r5, [%[a], #100]\n\t"
  205152. "ldr r6, [%[b], #96]\n\t"
  205153. "ldr r7, [%[b], #100]\n\t"
  205154. #ifdef WOLFSSL_KEIL
  205155. "sbcs r4, r4, r6\n\t"
  205156. #elif defined(__clang__)
  205157. "sbcs r4, r6\n\t"
  205158. #else
  205159. "sbc r4, r6\n\t"
  205160. #endif
  205161. #ifdef WOLFSSL_KEIL
  205162. "sbcs r5, r5, r7\n\t"
  205163. #elif defined(__clang__)
  205164. "sbcs r5, r7\n\t"
  205165. #else
  205166. "sbc r5, r7\n\t"
  205167. #endif
  205168. "str r4, [%[r], #96]\n\t"
  205169. "str r5, [%[r], #100]\n\t"
  205170. "ldr r4, [%[a], #104]\n\t"
  205171. "ldr r5, [%[a], #108]\n\t"
  205172. "ldr r6, [%[b], #104]\n\t"
  205173. "ldr r7, [%[b], #108]\n\t"
  205174. #ifdef WOLFSSL_KEIL
  205175. "sbcs r4, r4, r6\n\t"
  205176. #elif defined(__clang__)
  205177. "sbcs r4, r6\n\t"
  205178. #else
  205179. "sbc r4, r6\n\t"
  205180. #endif
  205181. #ifdef WOLFSSL_KEIL
  205182. "sbcs r5, r5, r7\n\t"
  205183. #elif defined(__clang__)
  205184. "sbcs r5, r7\n\t"
  205185. #else
  205186. "sbc r5, r7\n\t"
  205187. #endif
  205188. "str r4, [%[r], #104]\n\t"
  205189. "str r5, [%[r], #108]\n\t"
  205190. "ldr r4, [%[a], #112]\n\t"
  205191. "ldr r5, [%[a], #116]\n\t"
  205192. "ldr r6, [%[b], #112]\n\t"
  205193. "ldr r7, [%[b], #116]\n\t"
  205194. #ifdef WOLFSSL_KEIL
  205195. "sbcs r4, r4, r6\n\t"
  205196. #elif defined(__clang__)
  205197. "sbcs r4, r6\n\t"
  205198. #else
  205199. "sbc r4, r6\n\t"
  205200. #endif
  205201. #ifdef WOLFSSL_KEIL
  205202. "sbcs r5, r5, r7\n\t"
  205203. #elif defined(__clang__)
  205204. "sbcs r5, r7\n\t"
  205205. #else
  205206. "sbc r5, r7\n\t"
  205207. #endif
  205208. "str r4, [%[r], #112]\n\t"
  205209. "str r5, [%[r], #116]\n\t"
  205210. "ldr r4, [%[a], #120]\n\t"
  205211. "ldr r5, [%[a], #124]\n\t"
  205212. "ldr r6, [%[b], #120]\n\t"
  205213. "ldr r7, [%[b], #124]\n\t"
  205214. #ifdef WOLFSSL_KEIL
  205215. "sbcs r4, r4, r6\n\t"
  205216. #elif defined(__clang__)
  205217. "sbcs r4, r6\n\t"
  205218. #else
  205219. "sbc r4, r6\n\t"
  205220. #endif
  205221. #ifdef WOLFSSL_KEIL
  205222. "sbcs r5, r5, r7\n\t"
  205223. #elif defined(__clang__)
  205224. "sbcs r5, r7\n\t"
  205225. #else
  205226. "sbc r5, r7\n\t"
  205227. #endif
  205228. "str r4, [%[r], #120]\n\t"
  205229. "str r5, [%[r], #124]\n\t"
  205230. #ifdef WOLFSSL_KEIL
  205231. "sbcs %[b], %[b], %[b]\n\t"
  205232. #elif defined(__clang__)
  205233. "sbcs %[b], %[b]\n\t"
  205234. #else
  205235. "sbc %[b], %[b]\n\t"
  205236. #endif
  205237. "ldr r4, [%[r]]\n\t"
  205238. "ldr r5, [%[r], #4]\n\t"
  205239. "ldr r6, [%[m]]\n\t"
  205240. "ldr r7, [%[m], #4]\n\t"
  205241. #ifdef WOLFSSL_KEIL
  205242. "ands r6, r6, %[b]\n\t"
  205243. #elif defined(__clang__)
  205244. "ands r6, %[b]\n\t"
  205245. #else
  205246. "and r6, %[b]\n\t"
  205247. #endif
  205248. #ifdef WOLFSSL_KEIL
  205249. "ands r7, r7, %[b]\n\t"
  205250. #elif defined(__clang__)
  205251. "ands r7, %[b]\n\t"
  205252. #else
  205253. "and r7, %[b]\n\t"
  205254. #endif
  205255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  205256. "adds r4, r4, r6\n\t"
  205257. #else
  205258. "add r4, r4, r6\n\t"
  205259. #endif
  205260. #ifdef WOLFSSL_KEIL
  205261. "adcs r5, r5, r7\n\t"
  205262. #elif defined(__clang__)
  205263. "adcs r5, r7\n\t"
  205264. #else
  205265. "adc r5, r7\n\t"
  205266. #endif
  205267. "str r4, [%[r]]\n\t"
  205268. "str r5, [%[r], #4]\n\t"
  205269. "ldr r4, [%[r], #8]\n\t"
  205270. "ldr r5, [%[r], #12]\n\t"
  205271. "ldr r6, [%[m], #8]\n\t"
  205272. "ldr r7, [%[m], #12]\n\t"
  205273. #ifdef WOLFSSL_KEIL
  205274. "ands r6, r6, %[b]\n\t"
  205275. #elif defined(__clang__)
  205276. "ands r6, %[b]\n\t"
  205277. #else
  205278. "and r6, %[b]\n\t"
  205279. #endif
  205280. #ifdef WOLFSSL_KEIL
  205281. "ands r7, r7, %[b]\n\t"
  205282. #elif defined(__clang__)
  205283. "ands r7, %[b]\n\t"
  205284. #else
  205285. "and r7, %[b]\n\t"
  205286. #endif
  205287. #ifdef WOLFSSL_KEIL
  205288. "adcs r4, r4, r6\n\t"
  205289. #elif defined(__clang__)
  205290. "adcs r4, r6\n\t"
  205291. #else
  205292. "adc r4, r6\n\t"
  205293. #endif
  205294. #ifdef WOLFSSL_KEIL
  205295. "adcs r5, r5, r7\n\t"
  205296. #elif defined(__clang__)
  205297. "adcs r5, r7\n\t"
  205298. #else
  205299. "adc r5, r7\n\t"
  205300. #endif
  205301. "str r4, [%[r], #8]\n\t"
  205302. "str r5, [%[r], #12]\n\t"
  205303. "ldr r4, [%[r], #16]\n\t"
  205304. "ldr r5, [%[r], #20]\n\t"
  205305. "ldr r6, [%[m], #16]\n\t"
  205306. "ldr r7, [%[m], #20]\n\t"
  205307. #ifdef WOLFSSL_KEIL
  205308. "ands r6, r6, %[b]\n\t"
  205309. #elif defined(__clang__)
  205310. "ands r6, %[b]\n\t"
  205311. #else
  205312. "and r6, %[b]\n\t"
  205313. #endif
  205314. #ifdef WOLFSSL_KEIL
  205315. "ands r7, r7, %[b]\n\t"
  205316. #elif defined(__clang__)
  205317. "ands r7, %[b]\n\t"
  205318. #else
  205319. "and r7, %[b]\n\t"
  205320. #endif
  205321. #ifdef WOLFSSL_KEIL
  205322. "adcs r4, r4, r6\n\t"
  205323. #elif defined(__clang__)
  205324. "adcs r4, r6\n\t"
  205325. #else
  205326. "adc r4, r6\n\t"
  205327. #endif
  205328. #ifdef WOLFSSL_KEIL
  205329. "adcs r5, r5, r7\n\t"
  205330. #elif defined(__clang__)
  205331. "adcs r5, r7\n\t"
  205332. #else
  205333. "adc r5, r7\n\t"
  205334. #endif
  205335. "str r4, [%[r], #16]\n\t"
  205336. "str r5, [%[r], #20]\n\t"
  205337. "ldr r4, [%[r], #24]\n\t"
  205338. "ldr r5, [%[r], #28]\n\t"
  205339. "ldr r6, [%[m], #24]\n\t"
  205340. "ldr r7, [%[m], #28]\n\t"
  205341. #ifdef WOLFSSL_KEIL
  205342. "ands r6, r6, %[b]\n\t"
  205343. #elif defined(__clang__)
  205344. "ands r6, %[b]\n\t"
  205345. #else
  205346. "and r6, %[b]\n\t"
  205347. #endif
  205348. #ifdef WOLFSSL_KEIL
  205349. "ands r7, r7, %[b]\n\t"
  205350. #elif defined(__clang__)
  205351. "ands r7, %[b]\n\t"
  205352. #else
  205353. "and r7, %[b]\n\t"
  205354. #endif
  205355. #ifdef WOLFSSL_KEIL
  205356. "adcs r4, r4, r6\n\t"
  205357. #elif defined(__clang__)
  205358. "adcs r4, r6\n\t"
  205359. #else
  205360. "adc r4, r6\n\t"
  205361. #endif
  205362. #ifdef WOLFSSL_KEIL
  205363. "adcs r5, r5, r7\n\t"
  205364. #elif defined(__clang__)
  205365. "adcs r5, r7\n\t"
  205366. #else
  205367. "adc r5, r7\n\t"
  205368. #endif
  205369. "str r4, [%[r], #24]\n\t"
  205370. "str r5, [%[r], #28]\n\t"
  205371. "ldr r4, [%[r], #32]\n\t"
  205372. "ldr r5, [%[r], #36]\n\t"
  205373. "ldr r6, [%[m], #32]\n\t"
  205374. "ldr r7, [%[m], #36]\n\t"
  205375. #ifdef WOLFSSL_KEIL
  205376. "ands r6, r6, %[b]\n\t"
  205377. #elif defined(__clang__)
  205378. "ands r6, %[b]\n\t"
  205379. #else
  205380. "and r6, %[b]\n\t"
  205381. #endif
  205382. #ifdef WOLFSSL_KEIL
  205383. "ands r7, r7, %[b]\n\t"
  205384. #elif defined(__clang__)
  205385. "ands r7, %[b]\n\t"
  205386. #else
  205387. "and r7, %[b]\n\t"
  205388. #endif
  205389. #ifdef WOLFSSL_KEIL
  205390. "adcs r4, r4, r6\n\t"
  205391. #elif defined(__clang__)
  205392. "adcs r4, r6\n\t"
  205393. #else
  205394. "adc r4, r6\n\t"
  205395. #endif
  205396. #ifdef WOLFSSL_KEIL
  205397. "adcs r5, r5, r7\n\t"
  205398. #elif defined(__clang__)
  205399. "adcs r5, r7\n\t"
  205400. #else
  205401. "adc r5, r7\n\t"
  205402. #endif
  205403. "str r4, [%[r], #32]\n\t"
  205404. "str r5, [%[r], #36]\n\t"
  205405. "ldr r4, [%[r], #40]\n\t"
  205406. "ldr r5, [%[r], #44]\n\t"
  205407. "ldr r6, [%[m], #40]\n\t"
  205408. "ldr r7, [%[m], #44]\n\t"
  205409. #ifdef WOLFSSL_KEIL
  205410. "ands r6, r6, %[b]\n\t"
  205411. #elif defined(__clang__)
  205412. "ands r6, %[b]\n\t"
  205413. #else
  205414. "and r6, %[b]\n\t"
  205415. #endif
  205416. #ifdef WOLFSSL_KEIL
  205417. "ands r7, r7, %[b]\n\t"
  205418. #elif defined(__clang__)
  205419. "ands r7, %[b]\n\t"
  205420. #else
  205421. "and r7, %[b]\n\t"
  205422. #endif
  205423. #ifdef WOLFSSL_KEIL
  205424. "adcs r4, r4, r6\n\t"
  205425. #elif defined(__clang__)
  205426. "adcs r4, r6\n\t"
  205427. #else
  205428. "adc r4, r6\n\t"
  205429. #endif
  205430. #ifdef WOLFSSL_KEIL
  205431. "adcs r5, r5, r7\n\t"
  205432. #elif defined(__clang__)
  205433. "adcs r5, r7\n\t"
  205434. #else
  205435. "adc r5, r7\n\t"
  205436. #endif
  205437. "str r4, [%[r], #40]\n\t"
  205438. "str r5, [%[r], #44]\n\t"
  205439. "ldr r4, [%[r], #48]\n\t"
  205440. "ldr r5, [%[r], #52]\n\t"
  205441. "ldr r6, [%[m], #48]\n\t"
  205442. "ldr r7, [%[m], #52]\n\t"
  205443. #ifdef WOLFSSL_KEIL
  205444. "ands r6, r6, %[b]\n\t"
  205445. #elif defined(__clang__)
  205446. "ands r6, %[b]\n\t"
  205447. #else
  205448. "and r6, %[b]\n\t"
  205449. #endif
  205450. #ifdef WOLFSSL_KEIL
  205451. "ands r7, r7, %[b]\n\t"
  205452. #elif defined(__clang__)
  205453. "ands r7, %[b]\n\t"
  205454. #else
  205455. "and r7, %[b]\n\t"
  205456. #endif
  205457. #ifdef WOLFSSL_KEIL
  205458. "adcs r4, r4, r6\n\t"
  205459. #elif defined(__clang__)
  205460. "adcs r4, r6\n\t"
  205461. #else
  205462. "adc r4, r6\n\t"
  205463. #endif
  205464. #ifdef WOLFSSL_KEIL
  205465. "adcs r5, r5, r7\n\t"
  205466. #elif defined(__clang__)
  205467. "adcs r5, r7\n\t"
  205468. #else
  205469. "adc r5, r7\n\t"
  205470. #endif
  205471. "str r4, [%[r], #48]\n\t"
  205472. "str r5, [%[r], #52]\n\t"
  205473. "ldr r4, [%[r], #56]\n\t"
  205474. "ldr r5, [%[r], #60]\n\t"
  205475. "ldr r6, [%[m], #56]\n\t"
  205476. "ldr r7, [%[m], #60]\n\t"
  205477. #ifdef WOLFSSL_KEIL
  205478. "ands r6, r6, %[b]\n\t"
  205479. #elif defined(__clang__)
  205480. "ands r6, %[b]\n\t"
  205481. #else
  205482. "and r6, %[b]\n\t"
  205483. #endif
  205484. #ifdef WOLFSSL_KEIL
  205485. "ands r7, r7, %[b]\n\t"
  205486. #elif defined(__clang__)
  205487. "ands r7, %[b]\n\t"
  205488. #else
  205489. "and r7, %[b]\n\t"
  205490. #endif
  205491. #ifdef WOLFSSL_KEIL
  205492. "adcs r4, r4, r6\n\t"
  205493. #elif defined(__clang__)
  205494. "adcs r4, r6\n\t"
  205495. #else
  205496. "adc r4, r6\n\t"
  205497. #endif
  205498. #ifdef WOLFSSL_KEIL
  205499. "adcs r5, r5, r7\n\t"
  205500. #elif defined(__clang__)
  205501. "adcs r5, r7\n\t"
  205502. #else
  205503. "adc r5, r7\n\t"
  205504. #endif
  205505. "str r4, [%[r], #56]\n\t"
  205506. "str r5, [%[r], #60]\n\t"
  205507. "ldr r4, [%[r], #64]\n\t"
  205508. "ldr r5, [%[r], #68]\n\t"
  205509. "ldr r6, [%[m], #64]\n\t"
  205510. "ldr r7, [%[m], #68]\n\t"
  205511. #ifdef WOLFSSL_KEIL
  205512. "ands r6, r6, %[b]\n\t"
  205513. #elif defined(__clang__)
  205514. "ands r6, %[b]\n\t"
  205515. #else
  205516. "and r6, %[b]\n\t"
  205517. #endif
  205518. #ifdef WOLFSSL_KEIL
  205519. "ands r7, r7, %[b]\n\t"
  205520. #elif defined(__clang__)
  205521. "ands r7, %[b]\n\t"
  205522. #else
  205523. "and r7, %[b]\n\t"
  205524. #endif
  205525. #ifdef WOLFSSL_KEIL
  205526. "adcs r4, r4, r6\n\t"
  205527. #elif defined(__clang__)
  205528. "adcs r4, r6\n\t"
  205529. #else
  205530. "adc r4, r6\n\t"
  205531. #endif
  205532. #ifdef WOLFSSL_KEIL
  205533. "adcs r5, r5, r7\n\t"
  205534. #elif defined(__clang__)
  205535. "adcs r5, r7\n\t"
  205536. #else
  205537. "adc r5, r7\n\t"
  205538. #endif
  205539. "str r4, [%[r], #64]\n\t"
  205540. "str r5, [%[r], #68]\n\t"
  205541. "ldr r4, [%[r], #72]\n\t"
  205542. "ldr r5, [%[r], #76]\n\t"
  205543. "ldr r6, [%[m], #72]\n\t"
  205544. "ldr r7, [%[m], #76]\n\t"
  205545. #ifdef WOLFSSL_KEIL
  205546. "ands r6, r6, %[b]\n\t"
  205547. #elif defined(__clang__)
  205548. "ands r6, %[b]\n\t"
  205549. #else
  205550. "and r6, %[b]\n\t"
  205551. #endif
  205552. #ifdef WOLFSSL_KEIL
  205553. "ands r7, r7, %[b]\n\t"
  205554. #elif defined(__clang__)
  205555. "ands r7, %[b]\n\t"
  205556. #else
  205557. "and r7, %[b]\n\t"
  205558. #endif
  205559. #ifdef WOLFSSL_KEIL
  205560. "adcs r4, r4, r6\n\t"
  205561. #elif defined(__clang__)
  205562. "adcs r4, r6\n\t"
  205563. #else
  205564. "adc r4, r6\n\t"
  205565. #endif
  205566. #ifdef WOLFSSL_KEIL
  205567. "adcs r5, r5, r7\n\t"
  205568. #elif defined(__clang__)
  205569. "adcs r5, r7\n\t"
  205570. #else
  205571. "adc r5, r7\n\t"
  205572. #endif
  205573. "str r4, [%[r], #72]\n\t"
  205574. "str r5, [%[r], #76]\n\t"
  205575. "ldr r4, [%[r], #80]\n\t"
  205576. "ldr r5, [%[r], #84]\n\t"
  205577. "ldr r6, [%[m], #80]\n\t"
  205578. "ldr r7, [%[m], #84]\n\t"
  205579. #ifdef WOLFSSL_KEIL
  205580. "ands r6, r6, %[b]\n\t"
  205581. #elif defined(__clang__)
  205582. "ands r6, %[b]\n\t"
  205583. #else
  205584. "and r6, %[b]\n\t"
  205585. #endif
  205586. #ifdef WOLFSSL_KEIL
  205587. "ands r7, r7, %[b]\n\t"
  205588. #elif defined(__clang__)
  205589. "ands r7, %[b]\n\t"
  205590. #else
  205591. "and r7, %[b]\n\t"
  205592. #endif
  205593. #ifdef WOLFSSL_KEIL
  205594. "adcs r4, r4, r6\n\t"
  205595. #elif defined(__clang__)
  205596. "adcs r4, r6\n\t"
  205597. #else
  205598. "adc r4, r6\n\t"
  205599. #endif
  205600. #ifdef WOLFSSL_KEIL
  205601. "adcs r5, r5, r7\n\t"
  205602. #elif defined(__clang__)
  205603. "adcs r5, r7\n\t"
  205604. #else
  205605. "adc r5, r7\n\t"
  205606. #endif
  205607. "str r4, [%[r], #80]\n\t"
  205608. "str r5, [%[r], #84]\n\t"
  205609. "ldr r4, [%[r], #88]\n\t"
  205610. "ldr r5, [%[r], #92]\n\t"
  205611. "ldr r6, [%[m], #88]\n\t"
  205612. "ldr r7, [%[m], #92]\n\t"
  205613. #ifdef WOLFSSL_KEIL
  205614. "ands r6, r6, %[b]\n\t"
  205615. #elif defined(__clang__)
  205616. "ands r6, %[b]\n\t"
  205617. #else
  205618. "and r6, %[b]\n\t"
  205619. #endif
  205620. #ifdef WOLFSSL_KEIL
  205621. "ands r7, r7, %[b]\n\t"
  205622. #elif defined(__clang__)
  205623. "ands r7, %[b]\n\t"
  205624. #else
  205625. "and r7, %[b]\n\t"
  205626. #endif
  205627. #ifdef WOLFSSL_KEIL
  205628. "adcs r4, r4, r6\n\t"
  205629. #elif defined(__clang__)
  205630. "adcs r4, r6\n\t"
  205631. #else
  205632. "adc r4, r6\n\t"
  205633. #endif
  205634. #ifdef WOLFSSL_KEIL
  205635. "adcs r5, r5, r7\n\t"
  205636. #elif defined(__clang__)
  205637. "adcs r5, r7\n\t"
  205638. #else
  205639. "adc r5, r7\n\t"
  205640. #endif
  205641. "str r4, [%[r], #88]\n\t"
  205642. "str r5, [%[r], #92]\n\t"
  205643. "ldr r4, [%[r], #96]\n\t"
  205644. "ldr r5, [%[r], #100]\n\t"
  205645. "ldr r6, [%[m], #96]\n\t"
  205646. "ldr r7, [%[m], #100]\n\t"
  205647. #ifdef WOLFSSL_KEIL
  205648. "ands r6, r6, %[b]\n\t"
  205649. #elif defined(__clang__)
  205650. "ands r6, %[b]\n\t"
  205651. #else
  205652. "and r6, %[b]\n\t"
  205653. #endif
  205654. #ifdef WOLFSSL_KEIL
  205655. "ands r7, r7, %[b]\n\t"
  205656. #elif defined(__clang__)
  205657. "ands r7, %[b]\n\t"
  205658. #else
  205659. "and r7, %[b]\n\t"
  205660. #endif
  205661. #ifdef WOLFSSL_KEIL
  205662. "adcs r4, r4, r6\n\t"
  205663. #elif defined(__clang__)
  205664. "adcs r4, r6\n\t"
  205665. #else
  205666. "adc r4, r6\n\t"
  205667. #endif
  205668. #ifdef WOLFSSL_KEIL
  205669. "adcs r5, r5, r7\n\t"
  205670. #elif defined(__clang__)
  205671. "adcs r5, r7\n\t"
  205672. #else
  205673. "adc r5, r7\n\t"
  205674. #endif
  205675. "str r4, [%[r], #96]\n\t"
  205676. "str r5, [%[r], #100]\n\t"
  205677. "ldr r4, [%[r], #104]\n\t"
  205678. "ldr r5, [%[r], #108]\n\t"
  205679. "ldr r6, [%[m], #104]\n\t"
  205680. "ldr r7, [%[m], #108]\n\t"
  205681. #ifdef WOLFSSL_KEIL
  205682. "ands r6, r6, %[b]\n\t"
  205683. #elif defined(__clang__)
  205684. "ands r6, %[b]\n\t"
  205685. #else
  205686. "and r6, %[b]\n\t"
  205687. #endif
  205688. #ifdef WOLFSSL_KEIL
  205689. "ands r7, r7, %[b]\n\t"
  205690. #elif defined(__clang__)
  205691. "ands r7, %[b]\n\t"
  205692. #else
  205693. "and r7, %[b]\n\t"
  205694. #endif
  205695. #ifdef WOLFSSL_KEIL
  205696. "adcs r4, r4, r6\n\t"
  205697. #elif defined(__clang__)
  205698. "adcs r4, r6\n\t"
  205699. #else
  205700. "adc r4, r6\n\t"
  205701. #endif
  205702. #ifdef WOLFSSL_KEIL
  205703. "adcs r5, r5, r7\n\t"
  205704. #elif defined(__clang__)
  205705. "adcs r5, r7\n\t"
  205706. #else
  205707. "adc r5, r7\n\t"
  205708. #endif
  205709. "str r4, [%[r], #104]\n\t"
  205710. "str r5, [%[r], #108]\n\t"
  205711. "ldr r4, [%[r], #112]\n\t"
  205712. "ldr r5, [%[r], #116]\n\t"
  205713. "ldr r6, [%[m], #112]\n\t"
  205714. "ldr r7, [%[m], #116]\n\t"
  205715. #ifdef WOLFSSL_KEIL
  205716. "ands r6, r6, %[b]\n\t"
  205717. #elif defined(__clang__)
  205718. "ands r6, %[b]\n\t"
  205719. #else
  205720. "and r6, %[b]\n\t"
  205721. #endif
  205722. #ifdef WOLFSSL_KEIL
  205723. "ands r7, r7, %[b]\n\t"
  205724. #elif defined(__clang__)
  205725. "ands r7, %[b]\n\t"
  205726. #else
  205727. "and r7, %[b]\n\t"
  205728. #endif
  205729. #ifdef WOLFSSL_KEIL
  205730. "adcs r4, r4, r6\n\t"
  205731. #elif defined(__clang__)
  205732. "adcs r4, r6\n\t"
  205733. #else
  205734. "adc r4, r6\n\t"
  205735. #endif
  205736. #ifdef WOLFSSL_KEIL
  205737. "adcs r5, r5, r7\n\t"
  205738. #elif defined(__clang__)
  205739. "adcs r5, r7\n\t"
  205740. #else
  205741. "adc r5, r7\n\t"
  205742. #endif
  205743. "str r4, [%[r], #112]\n\t"
  205744. "str r5, [%[r], #116]\n\t"
  205745. "ldr r4, [%[r], #120]\n\t"
  205746. "ldr r5, [%[r], #124]\n\t"
  205747. "ldr r6, [%[m], #120]\n\t"
  205748. "ldr r7, [%[m], #124]\n\t"
  205749. #ifdef WOLFSSL_KEIL
  205750. "ands r6, r6, %[b]\n\t"
  205751. #elif defined(__clang__)
  205752. "ands r6, %[b]\n\t"
  205753. #else
  205754. "and r6, %[b]\n\t"
  205755. #endif
  205756. #ifdef WOLFSSL_KEIL
  205757. "ands r7, r7, %[b]\n\t"
  205758. #elif defined(__clang__)
  205759. "ands r7, %[b]\n\t"
  205760. #else
  205761. "and r7, %[b]\n\t"
  205762. #endif
  205763. #ifdef WOLFSSL_KEIL
  205764. "adcs r4, r4, r6\n\t"
  205765. #elif defined(__clang__)
  205766. "adcs r4, r6\n\t"
  205767. #else
  205768. "adc r4, r6\n\t"
  205769. #endif
  205770. #ifdef WOLFSSL_KEIL
  205771. "adcs r5, r5, r7\n\t"
  205772. #elif defined(__clang__)
  205773. "adcs r5, r7\n\t"
  205774. #else
  205775. "adc r5, r7\n\t"
  205776. #endif
  205777. "str r4, [%[r], #120]\n\t"
  205778. "str r5, [%[r], #124]\n\t"
  205779. "movs r6, #0\n\t"
  205780. #ifdef WOLFSSL_KEIL
  205781. "adcs %[b], %[b], r6\n\t"
  205782. #elif defined(__clang__)
  205783. "adcs %[b], r6\n\t"
  205784. #else
  205785. "adc %[b], r6\n\t"
  205786. #endif
  205787. "ldr r4, [%[r]]\n\t"
  205788. "ldr r5, [%[r], #4]\n\t"
  205789. "ldr r6, [%[m]]\n\t"
  205790. "ldr r7, [%[m], #4]\n\t"
  205791. #ifdef WOLFSSL_KEIL
  205792. "ands r6, r6, %[b]\n\t"
  205793. #elif defined(__clang__)
  205794. "ands r6, %[b]\n\t"
  205795. #else
  205796. "and r6, %[b]\n\t"
  205797. #endif
  205798. #ifdef WOLFSSL_KEIL
  205799. "ands r7, r7, %[b]\n\t"
  205800. #elif defined(__clang__)
  205801. "ands r7, %[b]\n\t"
  205802. #else
  205803. "and r7, %[b]\n\t"
  205804. #endif
  205805. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  205806. "adds r4, r4, r6\n\t"
  205807. #else
  205808. "add r4, r4, r6\n\t"
  205809. #endif
  205810. #ifdef WOLFSSL_KEIL
  205811. "adcs r5, r5, r7\n\t"
  205812. #elif defined(__clang__)
  205813. "adcs r5, r7\n\t"
  205814. #else
  205815. "adc r5, r7\n\t"
  205816. #endif
  205817. "str r4, [%[r]]\n\t"
  205818. "str r5, [%[r], #4]\n\t"
  205819. "ldr r4, [%[r], #8]\n\t"
  205820. "ldr r5, [%[r], #12]\n\t"
  205821. "ldr r6, [%[m], #8]\n\t"
  205822. "ldr r7, [%[m], #12]\n\t"
  205823. #ifdef WOLFSSL_KEIL
  205824. "ands r6, r6, %[b]\n\t"
  205825. #elif defined(__clang__)
  205826. "ands r6, %[b]\n\t"
  205827. #else
  205828. "and r6, %[b]\n\t"
  205829. #endif
  205830. #ifdef WOLFSSL_KEIL
  205831. "ands r7, r7, %[b]\n\t"
  205832. #elif defined(__clang__)
  205833. "ands r7, %[b]\n\t"
  205834. #else
  205835. "and r7, %[b]\n\t"
  205836. #endif
  205837. #ifdef WOLFSSL_KEIL
  205838. "adcs r4, r4, r6\n\t"
  205839. #elif defined(__clang__)
  205840. "adcs r4, r6\n\t"
  205841. #else
  205842. "adc r4, r6\n\t"
  205843. #endif
  205844. #ifdef WOLFSSL_KEIL
  205845. "adcs r5, r5, r7\n\t"
  205846. #elif defined(__clang__)
  205847. "adcs r5, r7\n\t"
  205848. #else
  205849. "adc r5, r7\n\t"
  205850. #endif
  205851. "str r4, [%[r], #8]\n\t"
  205852. "str r5, [%[r], #12]\n\t"
  205853. "ldr r4, [%[r], #16]\n\t"
  205854. "ldr r5, [%[r], #20]\n\t"
  205855. "ldr r6, [%[m], #16]\n\t"
  205856. "ldr r7, [%[m], #20]\n\t"
  205857. #ifdef WOLFSSL_KEIL
  205858. "ands r6, r6, %[b]\n\t"
  205859. #elif defined(__clang__)
  205860. "ands r6, %[b]\n\t"
  205861. #else
  205862. "and r6, %[b]\n\t"
  205863. #endif
  205864. #ifdef WOLFSSL_KEIL
  205865. "ands r7, r7, %[b]\n\t"
  205866. #elif defined(__clang__)
  205867. "ands r7, %[b]\n\t"
  205868. #else
  205869. "and r7, %[b]\n\t"
  205870. #endif
  205871. #ifdef WOLFSSL_KEIL
  205872. "adcs r4, r4, r6\n\t"
  205873. #elif defined(__clang__)
  205874. "adcs r4, r6\n\t"
  205875. #else
  205876. "adc r4, r6\n\t"
  205877. #endif
  205878. #ifdef WOLFSSL_KEIL
  205879. "adcs r5, r5, r7\n\t"
  205880. #elif defined(__clang__)
  205881. "adcs r5, r7\n\t"
  205882. #else
  205883. "adc r5, r7\n\t"
  205884. #endif
  205885. "str r4, [%[r], #16]\n\t"
  205886. "str r5, [%[r], #20]\n\t"
  205887. "ldr r4, [%[r], #24]\n\t"
  205888. "ldr r5, [%[r], #28]\n\t"
  205889. "ldr r6, [%[m], #24]\n\t"
  205890. "ldr r7, [%[m], #28]\n\t"
  205891. #ifdef WOLFSSL_KEIL
  205892. "ands r6, r6, %[b]\n\t"
  205893. #elif defined(__clang__)
  205894. "ands r6, %[b]\n\t"
  205895. #else
  205896. "and r6, %[b]\n\t"
  205897. #endif
  205898. #ifdef WOLFSSL_KEIL
  205899. "ands r7, r7, %[b]\n\t"
  205900. #elif defined(__clang__)
  205901. "ands r7, %[b]\n\t"
  205902. #else
  205903. "and r7, %[b]\n\t"
  205904. #endif
  205905. #ifdef WOLFSSL_KEIL
  205906. "adcs r4, r4, r6\n\t"
  205907. #elif defined(__clang__)
  205908. "adcs r4, r6\n\t"
  205909. #else
  205910. "adc r4, r6\n\t"
  205911. #endif
  205912. #ifdef WOLFSSL_KEIL
  205913. "adcs r5, r5, r7\n\t"
  205914. #elif defined(__clang__)
  205915. "adcs r5, r7\n\t"
  205916. #else
  205917. "adc r5, r7\n\t"
  205918. #endif
  205919. "str r4, [%[r], #24]\n\t"
  205920. "str r5, [%[r], #28]\n\t"
  205921. "ldr r4, [%[r], #32]\n\t"
  205922. "ldr r5, [%[r], #36]\n\t"
  205923. "ldr r6, [%[m], #32]\n\t"
  205924. "ldr r7, [%[m], #36]\n\t"
  205925. #ifdef WOLFSSL_KEIL
  205926. "ands r6, r6, %[b]\n\t"
  205927. #elif defined(__clang__)
  205928. "ands r6, %[b]\n\t"
  205929. #else
  205930. "and r6, %[b]\n\t"
  205931. #endif
  205932. #ifdef WOLFSSL_KEIL
  205933. "ands r7, r7, %[b]\n\t"
  205934. #elif defined(__clang__)
  205935. "ands r7, %[b]\n\t"
  205936. #else
  205937. "and r7, %[b]\n\t"
  205938. #endif
  205939. #ifdef WOLFSSL_KEIL
  205940. "adcs r4, r4, r6\n\t"
  205941. #elif defined(__clang__)
  205942. "adcs r4, r6\n\t"
  205943. #else
  205944. "adc r4, r6\n\t"
  205945. #endif
  205946. #ifdef WOLFSSL_KEIL
  205947. "adcs r5, r5, r7\n\t"
  205948. #elif defined(__clang__)
  205949. "adcs r5, r7\n\t"
  205950. #else
  205951. "adc r5, r7\n\t"
  205952. #endif
  205953. "str r4, [%[r], #32]\n\t"
  205954. "str r5, [%[r], #36]\n\t"
  205955. "ldr r4, [%[r], #40]\n\t"
  205956. "ldr r5, [%[r], #44]\n\t"
  205957. "ldr r6, [%[m], #40]\n\t"
  205958. "ldr r7, [%[m], #44]\n\t"
  205959. #ifdef WOLFSSL_KEIL
  205960. "ands r6, r6, %[b]\n\t"
  205961. #elif defined(__clang__)
  205962. "ands r6, %[b]\n\t"
  205963. #else
  205964. "and r6, %[b]\n\t"
  205965. #endif
  205966. #ifdef WOLFSSL_KEIL
  205967. "ands r7, r7, %[b]\n\t"
  205968. #elif defined(__clang__)
  205969. "ands r7, %[b]\n\t"
  205970. #else
  205971. "and r7, %[b]\n\t"
  205972. #endif
  205973. #ifdef WOLFSSL_KEIL
  205974. "adcs r4, r4, r6\n\t"
  205975. #elif defined(__clang__)
  205976. "adcs r4, r6\n\t"
  205977. #else
  205978. "adc r4, r6\n\t"
  205979. #endif
  205980. #ifdef WOLFSSL_KEIL
  205981. "adcs r5, r5, r7\n\t"
  205982. #elif defined(__clang__)
  205983. "adcs r5, r7\n\t"
  205984. #else
  205985. "adc r5, r7\n\t"
  205986. #endif
  205987. "str r4, [%[r], #40]\n\t"
  205988. "str r5, [%[r], #44]\n\t"
  205989. "ldr r4, [%[r], #48]\n\t"
  205990. "ldr r5, [%[r], #52]\n\t"
  205991. "ldr r6, [%[m], #48]\n\t"
  205992. "ldr r7, [%[m], #52]\n\t"
  205993. #ifdef WOLFSSL_KEIL
  205994. "ands r6, r6, %[b]\n\t"
  205995. #elif defined(__clang__)
  205996. "ands r6, %[b]\n\t"
  205997. #else
  205998. "and r6, %[b]\n\t"
  205999. #endif
  206000. #ifdef WOLFSSL_KEIL
  206001. "ands r7, r7, %[b]\n\t"
  206002. #elif defined(__clang__)
  206003. "ands r7, %[b]\n\t"
  206004. #else
  206005. "and r7, %[b]\n\t"
  206006. #endif
  206007. #ifdef WOLFSSL_KEIL
  206008. "adcs r4, r4, r6\n\t"
  206009. #elif defined(__clang__)
  206010. "adcs r4, r6\n\t"
  206011. #else
  206012. "adc r4, r6\n\t"
  206013. #endif
  206014. #ifdef WOLFSSL_KEIL
  206015. "adcs r5, r5, r7\n\t"
  206016. #elif defined(__clang__)
  206017. "adcs r5, r7\n\t"
  206018. #else
  206019. "adc r5, r7\n\t"
  206020. #endif
  206021. "str r4, [%[r], #48]\n\t"
  206022. "str r5, [%[r], #52]\n\t"
  206023. "ldr r4, [%[r], #56]\n\t"
  206024. "ldr r5, [%[r], #60]\n\t"
  206025. "ldr r6, [%[m], #56]\n\t"
  206026. "ldr r7, [%[m], #60]\n\t"
  206027. #ifdef WOLFSSL_KEIL
  206028. "ands r6, r6, %[b]\n\t"
  206029. #elif defined(__clang__)
  206030. "ands r6, %[b]\n\t"
  206031. #else
  206032. "and r6, %[b]\n\t"
  206033. #endif
  206034. #ifdef WOLFSSL_KEIL
  206035. "ands r7, r7, %[b]\n\t"
  206036. #elif defined(__clang__)
  206037. "ands r7, %[b]\n\t"
  206038. #else
  206039. "and r7, %[b]\n\t"
  206040. #endif
  206041. #ifdef WOLFSSL_KEIL
  206042. "adcs r4, r4, r6\n\t"
  206043. #elif defined(__clang__)
  206044. "adcs r4, r6\n\t"
  206045. #else
  206046. "adc r4, r6\n\t"
  206047. #endif
  206048. #ifdef WOLFSSL_KEIL
  206049. "adcs r5, r5, r7\n\t"
  206050. #elif defined(__clang__)
  206051. "adcs r5, r7\n\t"
  206052. #else
  206053. "adc r5, r7\n\t"
  206054. #endif
  206055. "str r4, [%[r], #56]\n\t"
  206056. "str r5, [%[r], #60]\n\t"
  206057. "ldr r4, [%[r], #64]\n\t"
  206058. "ldr r5, [%[r], #68]\n\t"
  206059. "ldr r6, [%[m], #64]\n\t"
  206060. "ldr r7, [%[m], #68]\n\t"
  206061. #ifdef WOLFSSL_KEIL
  206062. "ands r6, r6, %[b]\n\t"
  206063. #elif defined(__clang__)
  206064. "ands r6, %[b]\n\t"
  206065. #else
  206066. "and r6, %[b]\n\t"
  206067. #endif
  206068. #ifdef WOLFSSL_KEIL
  206069. "ands r7, r7, %[b]\n\t"
  206070. #elif defined(__clang__)
  206071. "ands r7, %[b]\n\t"
  206072. #else
  206073. "and r7, %[b]\n\t"
  206074. #endif
  206075. #ifdef WOLFSSL_KEIL
  206076. "adcs r4, r4, r6\n\t"
  206077. #elif defined(__clang__)
  206078. "adcs r4, r6\n\t"
  206079. #else
  206080. "adc r4, r6\n\t"
  206081. #endif
  206082. #ifdef WOLFSSL_KEIL
  206083. "adcs r5, r5, r7\n\t"
  206084. #elif defined(__clang__)
  206085. "adcs r5, r7\n\t"
  206086. #else
  206087. "adc r5, r7\n\t"
  206088. #endif
  206089. "str r4, [%[r], #64]\n\t"
  206090. "str r5, [%[r], #68]\n\t"
  206091. "ldr r4, [%[r], #72]\n\t"
  206092. "ldr r5, [%[r], #76]\n\t"
  206093. "ldr r6, [%[m], #72]\n\t"
  206094. "ldr r7, [%[m], #76]\n\t"
  206095. #ifdef WOLFSSL_KEIL
  206096. "ands r6, r6, %[b]\n\t"
  206097. #elif defined(__clang__)
  206098. "ands r6, %[b]\n\t"
  206099. #else
  206100. "and r6, %[b]\n\t"
  206101. #endif
  206102. #ifdef WOLFSSL_KEIL
  206103. "ands r7, r7, %[b]\n\t"
  206104. #elif defined(__clang__)
  206105. "ands r7, %[b]\n\t"
  206106. #else
  206107. "and r7, %[b]\n\t"
  206108. #endif
  206109. #ifdef WOLFSSL_KEIL
  206110. "adcs r4, r4, r6\n\t"
  206111. #elif defined(__clang__)
  206112. "adcs r4, r6\n\t"
  206113. #else
  206114. "adc r4, r6\n\t"
  206115. #endif
  206116. #ifdef WOLFSSL_KEIL
  206117. "adcs r5, r5, r7\n\t"
  206118. #elif defined(__clang__)
  206119. "adcs r5, r7\n\t"
  206120. #else
  206121. "adc r5, r7\n\t"
  206122. #endif
  206123. "str r4, [%[r], #72]\n\t"
  206124. "str r5, [%[r], #76]\n\t"
  206125. "ldr r4, [%[r], #80]\n\t"
  206126. "ldr r5, [%[r], #84]\n\t"
  206127. "ldr r6, [%[m], #80]\n\t"
  206128. "ldr r7, [%[m], #84]\n\t"
  206129. #ifdef WOLFSSL_KEIL
  206130. "ands r6, r6, %[b]\n\t"
  206131. #elif defined(__clang__)
  206132. "ands r6, %[b]\n\t"
  206133. #else
  206134. "and r6, %[b]\n\t"
  206135. #endif
  206136. #ifdef WOLFSSL_KEIL
  206137. "ands r7, r7, %[b]\n\t"
  206138. #elif defined(__clang__)
  206139. "ands r7, %[b]\n\t"
  206140. #else
  206141. "and r7, %[b]\n\t"
  206142. #endif
  206143. #ifdef WOLFSSL_KEIL
  206144. "adcs r4, r4, r6\n\t"
  206145. #elif defined(__clang__)
  206146. "adcs r4, r6\n\t"
  206147. #else
  206148. "adc r4, r6\n\t"
  206149. #endif
  206150. #ifdef WOLFSSL_KEIL
  206151. "adcs r5, r5, r7\n\t"
  206152. #elif defined(__clang__)
  206153. "adcs r5, r7\n\t"
  206154. #else
  206155. "adc r5, r7\n\t"
  206156. #endif
  206157. "str r4, [%[r], #80]\n\t"
  206158. "str r5, [%[r], #84]\n\t"
  206159. "ldr r4, [%[r], #88]\n\t"
  206160. "ldr r5, [%[r], #92]\n\t"
  206161. "ldr r6, [%[m], #88]\n\t"
  206162. "ldr r7, [%[m], #92]\n\t"
  206163. #ifdef WOLFSSL_KEIL
  206164. "ands r6, r6, %[b]\n\t"
  206165. #elif defined(__clang__)
  206166. "ands r6, %[b]\n\t"
  206167. #else
  206168. "and r6, %[b]\n\t"
  206169. #endif
  206170. #ifdef WOLFSSL_KEIL
  206171. "ands r7, r7, %[b]\n\t"
  206172. #elif defined(__clang__)
  206173. "ands r7, %[b]\n\t"
  206174. #else
  206175. "and r7, %[b]\n\t"
  206176. #endif
  206177. #ifdef WOLFSSL_KEIL
  206178. "adcs r4, r4, r6\n\t"
  206179. #elif defined(__clang__)
  206180. "adcs r4, r6\n\t"
  206181. #else
  206182. "adc r4, r6\n\t"
  206183. #endif
  206184. #ifdef WOLFSSL_KEIL
  206185. "adcs r5, r5, r7\n\t"
  206186. #elif defined(__clang__)
  206187. "adcs r5, r7\n\t"
  206188. #else
  206189. "adc r5, r7\n\t"
  206190. #endif
  206191. "str r4, [%[r], #88]\n\t"
  206192. "str r5, [%[r], #92]\n\t"
  206193. "ldr r4, [%[r], #96]\n\t"
  206194. "ldr r5, [%[r], #100]\n\t"
  206195. "ldr r6, [%[m], #96]\n\t"
  206196. "ldr r7, [%[m], #100]\n\t"
  206197. #ifdef WOLFSSL_KEIL
  206198. "ands r6, r6, %[b]\n\t"
  206199. #elif defined(__clang__)
  206200. "ands r6, %[b]\n\t"
  206201. #else
  206202. "and r6, %[b]\n\t"
  206203. #endif
  206204. #ifdef WOLFSSL_KEIL
  206205. "ands r7, r7, %[b]\n\t"
  206206. #elif defined(__clang__)
  206207. "ands r7, %[b]\n\t"
  206208. #else
  206209. "and r7, %[b]\n\t"
  206210. #endif
  206211. #ifdef WOLFSSL_KEIL
  206212. "adcs r4, r4, r6\n\t"
  206213. #elif defined(__clang__)
  206214. "adcs r4, r6\n\t"
  206215. #else
  206216. "adc r4, r6\n\t"
  206217. #endif
  206218. #ifdef WOLFSSL_KEIL
  206219. "adcs r5, r5, r7\n\t"
  206220. #elif defined(__clang__)
  206221. "adcs r5, r7\n\t"
  206222. #else
  206223. "adc r5, r7\n\t"
  206224. #endif
  206225. "str r4, [%[r], #96]\n\t"
  206226. "str r5, [%[r], #100]\n\t"
  206227. "ldr r4, [%[r], #104]\n\t"
  206228. "ldr r5, [%[r], #108]\n\t"
  206229. "ldr r6, [%[m], #104]\n\t"
  206230. "ldr r7, [%[m], #108]\n\t"
  206231. #ifdef WOLFSSL_KEIL
  206232. "ands r6, r6, %[b]\n\t"
  206233. #elif defined(__clang__)
  206234. "ands r6, %[b]\n\t"
  206235. #else
  206236. "and r6, %[b]\n\t"
  206237. #endif
  206238. #ifdef WOLFSSL_KEIL
  206239. "ands r7, r7, %[b]\n\t"
  206240. #elif defined(__clang__)
  206241. "ands r7, %[b]\n\t"
  206242. #else
  206243. "and r7, %[b]\n\t"
  206244. #endif
  206245. #ifdef WOLFSSL_KEIL
  206246. "adcs r4, r4, r6\n\t"
  206247. #elif defined(__clang__)
  206248. "adcs r4, r6\n\t"
  206249. #else
  206250. "adc r4, r6\n\t"
  206251. #endif
  206252. #ifdef WOLFSSL_KEIL
  206253. "adcs r5, r5, r7\n\t"
  206254. #elif defined(__clang__)
  206255. "adcs r5, r7\n\t"
  206256. #else
  206257. "adc r5, r7\n\t"
  206258. #endif
  206259. "str r4, [%[r], #104]\n\t"
  206260. "str r5, [%[r], #108]\n\t"
  206261. "ldr r4, [%[r], #112]\n\t"
  206262. "ldr r5, [%[r], #116]\n\t"
  206263. "ldr r6, [%[m], #112]\n\t"
  206264. "ldr r7, [%[m], #116]\n\t"
  206265. #ifdef WOLFSSL_KEIL
  206266. "ands r6, r6, %[b]\n\t"
  206267. #elif defined(__clang__)
  206268. "ands r6, %[b]\n\t"
  206269. #else
  206270. "and r6, %[b]\n\t"
  206271. #endif
  206272. #ifdef WOLFSSL_KEIL
  206273. "ands r7, r7, %[b]\n\t"
  206274. #elif defined(__clang__)
  206275. "ands r7, %[b]\n\t"
  206276. #else
  206277. "and r7, %[b]\n\t"
  206278. #endif
  206279. #ifdef WOLFSSL_KEIL
  206280. "adcs r4, r4, r6\n\t"
  206281. #elif defined(__clang__)
  206282. "adcs r4, r6\n\t"
  206283. #else
  206284. "adc r4, r6\n\t"
  206285. #endif
  206286. #ifdef WOLFSSL_KEIL
  206287. "adcs r5, r5, r7\n\t"
  206288. #elif defined(__clang__)
  206289. "adcs r5, r7\n\t"
  206290. #else
  206291. "adc r5, r7\n\t"
  206292. #endif
  206293. "str r4, [%[r], #112]\n\t"
  206294. "str r5, [%[r], #116]\n\t"
  206295. "ldr r4, [%[r], #120]\n\t"
  206296. "ldr r5, [%[r], #124]\n\t"
  206297. "ldr r6, [%[m], #120]\n\t"
  206298. "ldr r7, [%[m], #124]\n\t"
  206299. #ifdef WOLFSSL_KEIL
  206300. "ands r6, r6, %[b]\n\t"
  206301. #elif defined(__clang__)
  206302. "ands r6, %[b]\n\t"
  206303. #else
  206304. "and r6, %[b]\n\t"
  206305. #endif
  206306. #ifdef WOLFSSL_KEIL
  206307. "ands r7, r7, %[b]\n\t"
  206308. #elif defined(__clang__)
  206309. "ands r7, %[b]\n\t"
  206310. #else
  206311. "and r7, %[b]\n\t"
  206312. #endif
  206313. #ifdef WOLFSSL_KEIL
  206314. "adcs r4, r4, r6\n\t"
  206315. #elif defined(__clang__)
  206316. "adcs r4, r6\n\t"
  206317. #else
  206318. "adc r4, r6\n\t"
  206319. #endif
  206320. #ifdef WOLFSSL_KEIL
  206321. "adcs r5, r5, r7\n\t"
  206322. #elif defined(__clang__)
  206323. "adcs r5, r7\n\t"
  206324. #else
  206325. "adc r5, r7\n\t"
  206326. #endif
  206327. "str r4, [%[r], #120]\n\t"
  206328. "str r5, [%[r], #124]\n\t"
  206329. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  206330. :
  206331. : "memory", "r4", "r5", "r6", "r7"
  206332. );
  206333. }
  206334. #define sp_1024_mont_sub_lower_32 sp_1024_mont_sub_32
  206335. /* Conditionally add a and b using the mask m.
  206336. * m is -1 to add and 0 when not.
  206337. *
  206338. * r A single precision number representing conditional add result.
  206339. * a A single precision number to add with.
  206340. * b A single precision number to add.
  206341. * m Mask value to apply.
  206342. */
  206343. SP_NOINLINE static sp_digit sp_1024_cond_add_32(sp_digit* r, const sp_digit* a,
  206344. const sp_digit* b, sp_digit m)
  206345. {
  206346. __asm__ __volatile__ (
  206347. "movs r4, #0\n\t"
  206348. "movs r5, #0x80\n\t"
  206349. "mov r8, r5\n\t"
  206350. "movs r7, #0\n\t"
  206351. "\n"
  206352. "L_sp_1024_cond_add_32_words_%=:\n\t"
  206353. "ldr r6, [%[b], r7]\n\t"
  206354. #ifdef WOLFSSL_KEIL
  206355. "ands r6, r6, %[m]\n\t"
  206356. #elif defined(__clang__)
  206357. "ands r6, %[m]\n\t"
  206358. #else
  206359. "and r6, %[m]\n\t"
  206360. #endif
  206361. "movs r5, #0\n\t"
  206362. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206363. "subs r5, r5, #1\n\t"
  206364. #else
  206365. "sub r5, r5, #1\n\t"
  206366. #endif
  206367. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206368. "adds r5, r5, r4\n\t"
  206369. #else
  206370. "add r5, r5, r4\n\t"
  206371. #endif
  206372. "ldr r5, [%[a], r7]\n\t"
  206373. #ifdef WOLFSSL_KEIL
  206374. "adcs r5, r5, r6\n\t"
  206375. #elif defined(__clang__)
  206376. "adcs r5, r6\n\t"
  206377. #else
  206378. "adc r5, r6\n\t"
  206379. #endif
  206380. "movs r4, #0\n\t"
  206381. #ifdef WOLFSSL_KEIL
  206382. "adcs r4, r4, r4\n\t"
  206383. #elif defined(__clang__)
  206384. "adcs r4, r4\n\t"
  206385. #else
  206386. "adc r4, r4\n\t"
  206387. #endif
  206388. "str r5, [%[r], r7]\n\t"
  206389. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206390. "adds r7, r7, #4\n\t"
  206391. #else
  206392. "add r7, r7, #4\n\t"
  206393. #endif
  206394. "cmp r7, r8\n\t"
  206395. "blt L_sp_1024_cond_add_32_words_%=\n\t"
  206396. "movs %[r], r4\n\t"
  206397. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m)
  206398. :
  206399. : "memory", "r4", "r5", "r6", "r7", "r8"
  206400. );
  206401. return (uint32_t)(size_t)r;
  206402. }
  206403. /* Right shift a by 1 bit into r. (r = a >> 1)
  206404. *
  206405. * r A single precision integer.
  206406. * a A single precision integer.
  206407. */
  206408. static void sp_1024_rshift1_32(sp_digit* r, const sp_digit* a)
  206409. {
  206410. __asm__ __volatile__ (
  206411. "ldr r2, [%[a]]\n\t"
  206412. "ldr r3, [%[a], #4]\n\t"
  206413. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206414. "lsrs r2, r2, #1\n\t"
  206415. #else
  206416. "lsr r2, r2, #1\n\t"
  206417. #endif
  206418. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206419. "lsls r5, r3, #31\n\t"
  206420. #else
  206421. "lsl r5, r3, #31\n\t"
  206422. #endif
  206423. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206424. "lsrs r3, r3, #1\n\t"
  206425. #else
  206426. "lsr r3, r3, #1\n\t"
  206427. #endif
  206428. #ifdef WOLFSSL_KEIL
  206429. "orrs r2, r2, r5\n\t"
  206430. #elif defined(__clang__)
  206431. "orrs r2, r5\n\t"
  206432. #else
  206433. "orr r2, r5\n\t"
  206434. #endif
  206435. "ldr r4, [%[a], #8]\n\t"
  206436. "str r2, [%[r]]\n\t"
  206437. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206438. "lsls r5, r4, #31\n\t"
  206439. #else
  206440. "lsl r5, r4, #31\n\t"
  206441. #endif
  206442. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206443. "lsrs r4, r4, #1\n\t"
  206444. #else
  206445. "lsr r4, r4, #1\n\t"
  206446. #endif
  206447. #ifdef WOLFSSL_KEIL
  206448. "orrs r3, r3, r5\n\t"
  206449. #elif defined(__clang__)
  206450. "orrs r3, r5\n\t"
  206451. #else
  206452. "orr r3, r5\n\t"
  206453. #endif
  206454. "ldr r2, [%[a], #12]\n\t"
  206455. "str r3, [%[r], #4]\n\t"
  206456. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206457. "lsls r5, r2, #31\n\t"
  206458. #else
  206459. "lsl r5, r2, #31\n\t"
  206460. #endif
  206461. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206462. "lsrs r2, r2, #1\n\t"
  206463. #else
  206464. "lsr r2, r2, #1\n\t"
  206465. #endif
  206466. #ifdef WOLFSSL_KEIL
  206467. "orrs r4, r4, r5\n\t"
  206468. #elif defined(__clang__)
  206469. "orrs r4, r5\n\t"
  206470. #else
  206471. "orr r4, r5\n\t"
  206472. #endif
  206473. "ldr r3, [%[a], #16]\n\t"
  206474. "str r4, [%[r], #8]\n\t"
  206475. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206476. "lsls r5, r3, #31\n\t"
  206477. #else
  206478. "lsl r5, r3, #31\n\t"
  206479. #endif
  206480. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206481. "lsrs r3, r3, #1\n\t"
  206482. #else
  206483. "lsr r3, r3, #1\n\t"
  206484. #endif
  206485. #ifdef WOLFSSL_KEIL
  206486. "orrs r2, r2, r5\n\t"
  206487. #elif defined(__clang__)
  206488. "orrs r2, r5\n\t"
  206489. #else
  206490. "orr r2, r5\n\t"
  206491. #endif
  206492. "ldr r4, [%[a], #20]\n\t"
  206493. "str r2, [%[r], #12]\n\t"
  206494. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206495. "lsls r5, r4, #31\n\t"
  206496. #else
  206497. "lsl r5, r4, #31\n\t"
  206498. #endif
  206499. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206500. "lsrs r4, r4, #1\n\t"
  206501. #else
  206502. "lsr r4, r4, #1\n\t"
  206503. #endif
  206504. #ifdef WOLFSSL_KEIL
  206505. "orrs r3, r3, r5\n\t"
  206506. #elif defined(__clang__)
  206507. "orrs r3, r5\n\t"
  206508. #else
  206509. "orr r3, r5\n\t"
  206510. #endif
  206511. "ldr r2, [%[a], #24]\n\t"
  206512. "str r3, [%[r], #16]\n\t"
  206513. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206514. "lsls r5, r2, #31\n\t"
  206515. #else
  206516. "lsl r5, r2, #31\n\t"
  206517. #endif
  206518. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206519. "lsrs r2, r2, #1\n\t"
  206520. #else
  206521. "lsr r2, r2, #1\n\t"
  206522. #endif
  206523. #ifdef WOLFSSL_KEIL
  206524. "orrs r4, r4, r5\n\t"
  206525. #elif defined(__clang__)
  206526. "orrs r4, r5\n\t"
  206527. #else
  206528. "orr r4, r5\n\t"
  206529. #endif
  206530. "ldr r3, [%[a], #28]\n\t"
  206531. "str r4, [%[r], #20]\n\t"
  206532. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206533. "lsls r5, r3, #31\n\t"
  206534. #else
  206535. "lsl r5, r3, #31\n\t"
  206536. #endif
  206537. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206538. "lsrs r3, r3, #1\n\t"
  206539. #else
  206540. "lsr r3, r3, #1\n\t"
  206541. #endif
  206542. #ifdef WOLFSSL_KEIL
  206543. "orrs r2, r2, r5\n\t"
  206544. #elif defined(__clang__)
  206545. "orrs r2, r5\n\t"
  206546. #else
  206547. "orr r2, r5\n\t"
  206548. #endif
  206549. "ldr r4, [%[a], #32]\n\t"
  206550. "str r2, [%[r], #24]\n\t"
  206551. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206552. "lsls r5, r4, #31\n\t"
  206553. #else
  206554. "lsl r5, r4, #31\n\t"
  206555. #endif
  206556. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206557. "lsrs r4, r4, #1\n\t"
  206558. #else
  206559. "lsr r4, r4, #1\n\t"
  206560. #endif
  206561. #ifdef WOLFSSL_KEIL
  206562. "orrs r3, r3, r5\n\t"
  206563. #elif defined(__clang__)
  206564. "orrs r3, r5\n\t"
  206565. #else
  206566. "orr r3, r5\n\t"
  206567. #endif
  206568. "ldr r2, [%[a], #36]\n\t"
  206569. "str r3, [%[r], #28]\n\t"
  206570. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206571. "lsls r5, r2, #31\n\t"
  206572. #else
  206573. "lsl r5, r2, #31\n\t"
  206574. #endif
  206575. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206576. "lsrs r2, r2, #1\n\t"
  206577. #else
  206578. "lsr r2, r2, #1\n\t"
  206579. #endif
  206580. #ifdef WOLFSSL_KEIL
  206581. "orrs r4, r4, r5\n\t"
  206582. #elif defined(__clang__)
  206583. "orrs r4, r5\n\t"
  206584. #else
  206585. "orr r4, r5\n\t"
  206586. #endif
  206587. "ldr r3, [%[a], #40]\n\t"
  206588. "str r4, [%[r], #32]\n\t"
  206589. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206590. "lsls r5, r3, #31\n\t"
  206591. #else
  206592. "lsl r5, r3, #31\n\t"
  206593. #endif
  206594. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206595. "lsrs r3, r3, #1\n\t"
  206596. #else
  206597. "lsr r3, r3, #1\n\t"
  206598. #endif
  206599. #ifdef WOLFSSL_KEIL
  206600. "orrs r2, r2, r5\n\t"
  206601. #elif defined(__clang__)
  206602. "orrs r2, r5\n\t"
  206603. #else
  206604. "orr r2, r5\n\t"
  206605. #endif
  206606. "ldr r4, [%[a], #44]\n\t"
  206607. "str r2, [%[r], #36]\n\t"
  206608. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206609. "lsls r5, r4, #31\n\t"
  206610. #else
  206611. "lsl r5, r4, #31\n\t"
  206612. #endif
  206613. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206614. "lsrs r4, r4, #1\n\t"
  206615. #else
  206616. "lsr r4, r4, #1\n\t"
  206617. #endif
  206618. #ifdef WOLFSSL_KEIL
  206619. "orrs r3, r3, r5\n\t"
  206620. #elif defined(__clang__)
  206621. "orrs r3, r5\n\t"
  206622. #else
  206623. "orr r3, r5\n\t"
  206624. #endif
  206625. "ldr r2, [%[a], #48]\n\t"
  206626. "str r3, [%[r], #40]\n\t"
  206627. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206628. "lsls r5, r2, #31\n\t"
  206629. #else
  206630. "lsl r5, r2, #31\n\t"
  206631. #endif
  206632. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206633. "lsrs r2, r2, #1\n\t"
  206634. #else
  206635. "lsr r2, r2, #1\n\t"
  206636. #endif
  206637. #ifdef WOLFSSL_KEIL
  206638. "orrs r4, r4, r5\n\t"
  206639. #elif defined(__clang__)
  206640. "orrs r4, r5\n\t"
  206641. #else
  206642. "orr r4, r5\n\t"
  206643. #endif
  206644. "ldr r3, [%[a], #52]\n\t"
  206645. "str r4, [%[r], #44]\n\t"
  206646. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206647. "lsls r5, r3, #31\n\t"
  206648. #else
  206649. "lsl r5, r3, #31\n\t"
  206650. #endif
  206651. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206652. "lsrs r3, r3, #1\n\t"
  206653. #else
  206654. "lsr r3, r3, #1\n\t"
  206655. #endif
  206656. #ifdef WOLFSSL_KEIL
  206657. "orrs r2, r2, r5\n\t"
  206658. #elif defined(__clang__)
  206659. "orrs r2, r5\n\t"
  206660. #else
  206661. "orr r2, r5\n\t"
  206662. #endif
  206663. "ldr r4, [%[a], #56]\n\t"
  206664. "str r2, [%[r], #48]\n\t"
  206665. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206666. "lsls r5, r4, #31\n\t"
  206667. #else
  206668. "lsl r5, r4, #31\n\t"
  206669. #endif
  206670. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206671. "lsrs r4, r4, #1\n\t"
  206672. #else
  206673. "lsr r4, r4, #1\n\t"
  206674. #endif
  206675. #ifdef WOLFSSL_KEIL
  206676. "orrs r3, r3, r5\n\t"
  206677. #elif defined(__clang__)
  206678. "orrs r3, r5\n\t"
  206679. #else
  206680. "orr r3, r5\n\t"
  206681. #endif
  206682. "ldr r2, [%[a], #60]\n\t"
  206683. "str r3, [%[r], #52]\n\t"
  206684. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206685. "lsls r5, r2, #31\n\t"
  206686. #else
  206687. "lsl r5, r2, #31\n\t"
  206688. #endif
  206689. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206690. "lsrs r2, r2, #1\n\t"
  206691. #else
  206692. "lsr r2, r2, #1\n\t"
  206693. #endif
  206694. #ifdef WOLFSSL_KEIL
  206695. "orrs r4, r4, r5\n\t"
  206696. #elif defined(__clang__)
  206697. "orrs r4, r5\n\t"
  206698. #else
  206699. "orr r4, r5\n\t"
  206700. #endif
  206701. "ldr r3, [%[a], #64]\n\t"
  206702. "str r4, [%[r], #56]\n\t"
  206703. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206704. "lsls r5, r3, #31\n\t"
  206705. #else
  206706. "lsl r5, r3, #31\n\t"
  206707. #endif
  206708. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206709. "lsrs r3, r3, #1\n\t"
  206710. #else
  206711. "lsr r3, r3, #1\n\t"
  206712. #endif
  206713. #ifdef WOLFSSL_KEIL
  206714. "orrs r2, r2, r5\n\t"
  206715. #elif defined(__clang__)
  206716. "orrs r2, r5\n\t"
  206717. #else
  206718. "orr r2, r5\n\t"
  206719. #endif
  206720. "ldr r4, [%[a], #68]\n\t"
  206721. "str r2, [%[r], #60]\n\t"
  206722. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206723. "lsls r5, r4, #31\n\t"
  206724. #else
  206725. "lsl r5, r4, #31\n\t"
  206726. #endif
  206727. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206728. "lsrs r4, r4, #1\n\t"
  206729. #else
  206730. "lsr r4, r4, #1\n\t"
  206731. #endif
  206732. #ifdef WOLFSSL_KEIL
  206733. "orrs r3, r3, r5\n\t"
  206734. #elif defined(__clang__)
  206735. "orrs r3, r5\n\t"
  206736. #else
  206737. "orr r3, r5\n\t"
  206738. #endif
  206739. "ldr r2, [%[a], #72]\n\t"
  206740. "str r3, [%[r], #64]\n\t"
  206741. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206742. "lsls r5, r2, #31\n\t"
  206743. #else
  206744. "lsl r5, r2, #31\n\t"
  206745. #endif
  206746. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206747. "lsrs r2, r2, #1\n\t"
  206748. #else
  206749. "lsr r2, r2, #1\n\t"
  206750. #endif
  206751. #ifdef WOLFSSL_KEIL
  206752. "orrs r4, r4, r5\n\t"
  206753. #elif defined(__clang__)
  206754. "orrs r4, r5\n\t"
  206755. #else
  206756. "orr r4, r5\n\t"
  206757. #endif
  206758. "ldr r3, [%[a], #76]\n\t"
  206759. "str r4, [%[r], #68]\n\t"
  206760. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206761. "lsls r5, r3, #31\n\t"
  206762. #else
  206763. "lsl r5, r3, #31\n\t"
  206764. #endif
  206765. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206766. "lsrs r3, r3, #1\n\t"
  206767. #else
  206768. "lsr r3, r3, #1\n\t"
  206769. #endif
  206770. #ifdef WOLFSSL_KEIL
  206771. "orrs r2, r2, r5\n\t"
  206772. #elif defined(__clang__)
  206773. "orrs r2, r5\n\t"
  206774. #else
  206775. "orr r2, r5\n\t"
  206776. #endif
  206777. "ldr r4, [%[a], #80]\n\t"
  206778. "str r2, [%[r], #72]\n\t"
  206779. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206780. "lsls r5, r4, #31\n\t"
  206781. #else
  206782. "lsl r5, r4, #31\n\t"
  206783. #endif
  206784. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206785. "lsrs r4, r4, #1\n\t"
  206786. #else
  206787. "lsr r4, r4, #1\n\t"
  206788. #endif
  206789. #ifdef WOLFSSL_KEIL
  206790. "orrs r3, r3, r5\n\t"
  206791. #elif defined(__clang__)
  206792. "orrs r3, r5\n\t"
  206793. #else
  206794. "orr r3, r5\n\t"
  206795. #endif
  206796. "ldr r2, [%[a], #84]\n\t"
  206797. "str r3, [%[r], #76]\n\t"
  206798. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206799. "lsls r5, r2, #31\n\t"
  206800. #else
  206801. "lsl r5, r2, #31\n\t"
  206802. #endif
  206803. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206804. "lsrs r2, r2, #1\n\t"
  206805. #else
  206806. "lsr r2, r2, #1\n\t"
  206807. #endif
  206808. #ifdef WOLFSSL_KEIL
  206809. "orrs r4, r4, r5\n\t"
  206810. #elif defined(__clang__)
  206811. "orrs r4, r5\n\t"
  206812. #else
  206813. "orr r4, r5\n\t"
  206814. #endif
  206815. "ldr r3, [%[a], #88]\n\t"
  206816. "str r4, [%[r], #80]\n\t"
  206817. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206818. "lsls r5, r3, #31\n\t"
  206819. #else
  206820. "lsl r5, r3, #31\n\t"
  206821. #endif
  206822. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206823. "lsrs r3, r3, #1\n\t"
  206824. #else
  206825. "lsr r3, r3, #1\n\t"
  206826. #endif
  206827. #ifdef WOLFSSL_KEIL
  206828. "orrs r2, r2, r5\n\t"
  206829. #elif defined(__clang__)
  206830. "orrs r2, r5\n\t"
  206831. #else
  206832. "orr r2, r5\n\t"
  206833. #endif
  206834. "ldr r4, [%[a], #92]\n\t"
  206835. "str r2, [%[r], #84]\n\t"
  206836. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206837. "lsls r5, r4, #31\n\t"
  206838. #else
  206839. "lsl r5, r4, #31\n\t"
  206840. #endif
  206841. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206842. "lsrs r4, r4, #1\n\t"
  206843. #else
  206844. "lsr r4, r4, #1\n\t"
  206845. #endif
  206846. #ifdef WOLFSSL_KEIL
  206847. "orrs r3, r3, r5\n\t"
  206848. #elif defined(__clang__)
  206849. "orrs r3, r5\n\t"
  206850. #else
  206851. "orr r3, r5\n\t"
  206852. #endif
  206853. "ldr r2, [%[a], #96]\n\t"
  206854. "str r3, [%[r], #88]\n\t"
  206855. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206856. "lsls r5, r2, #31\n\t"
  206857. #else
  206858. "lsl r5, r2, #31\n\t"
  206859. #endif
  206860. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206861. "lsrs r2, r2, #1\n\t"
  206862. #else
  206863. "lsr r2, r2, #1\n\t"
  206864. #endif
  206865. #ifdef WOLFSSL_KEIL
  206866. "orrs r4, r4, r5\n\t"
  206867. #elif defined(__clang__)
  206868. "orrs r4, r5\n\t"
  206869. #else
  206870. "orr r4, r5\n\t"
  206871. #endif
  206872. "ldr r3, [%[a], #100]\n\t"
  206873. "str r4, [%[r], #92]\n\t"
  206874. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206875. "lsls r5, r3, #31\n\t"
  206876. #else
  206877. "lsl r5, r3, #31\n\t"
  206878. #endif
  206879. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206880. "lsrs r3, r3, #1\n\t"
  206881. #else
  206882. "lsr r3, r3, #1\n\t"
  206883. #endif
  206884. #ifdef WOLFSSL_KEIL
  206885. "orrs r2, r2, r5\n\t"
  206886. #elif defined(__clang__)
  206887. "orrs r2, r5\n\t"
  206888. #else
  206889. "orr r2, r5\n\t"
  206890. #endif
  206891. "ldr r4, [%[a], #104]\n\t"
  206892. "str r2, [%[r], #96]\n\t"
  206893. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206894. "lsls r5, r4, #31\n\t"
  206895. #else
  206896. "lsl r5, r4, #31\n\t"
  206897. #endif
  206898. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206899. "lsrs r4, r4, #1\n\t"
  206900. #else
  206901. "lsr r4, r4, #1\n\t"
  206902. #endif
  206903. #ifdef WOLFSSL_KEIL
  206904. "orrs r3, r3, r5\n\t"
  206905. #elif defined(__clang__)
  206906. "orrs r3, r5\n\t"
  206907. #else
  206908. "orr r3, r5\n\t"
  206909. #endif
  206910. "ldr r2, [%[a], #108]\n\t"
  206911. "str r3, [%[r], #100]\n\t"
  206912. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206913. "lsls r5, r2, #31\n\t"
  206914. #else
  206915. "lsl r5, r2, #31\n\t"
  206916. #endif
  206917. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206918. "lsrs r2, r2, #1\n\t"
  206919. #else
  206920. "lsr r2, r2, #1\n\t"
  206921. #endif
  206922. #ifdef WOLFSSL_KEIL
  206923. "orrs r4, r4, r5\n\t"
  206924. #elif defined(__clang__)
  206925. "orrs r4, r5\n\t"
  206926. #else
  206927. "orr r4, r5\n\t"
  206928. #endif
  206929. "ldr r3, [%[a], #112]\n\t"
  206930. "str r4, [%[r], #104]\n\t"
  206931. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206932. "lsls r5, r3, #31\n\t"
  206933. #else
  206934. "lsl r5, r3, #31\n\t"
  206935. #endif
  206936. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206937. "lsrs r3, r3, #1\n\t"
  206938. #else
  206939. "lsr r3, r3, #1\n\t"
  206940. #endif
  206941. #ifdef WOLFSSL_KEIL
  206942. "orrs r2, r2, r5\n\t"
  206943. #elif defined(__clang__)
  206944. "orrs r2, r5\n\t"
  206945. #else
  206946. "orr r2, r5\n\t"
  206947. #endif
  206948. "ldr r4, [%[a], #116]\n\t"
  206949. "str r2, [%[r], #108]\n\t"
  206950. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206951. "lsls r5, r4, #31\n\t"
  206952. #else
  206953. "lsl r5, r4, #31\n\t"
  206954. #endif
  206955. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206956. "lsrs r4, r4, #1\n\t"
  206957. #else
  206958. "lsr r4, r4, #1\n\t"
  206959. #endif
  206960. #ifdef WOLFSSL_KEIL
  206961. "orrs r3, r3, r5\n\t"
  206962. #elif defined(__clang__)
  206963. "orrs r3, r5\n\t"
  206964. #else
  206965. "orr r3, r5\n\t"
  206966. #endif
  206967. "ldr r2, [%[a], #120]\n\t"
  206968. "str r3, [%[r], #112]\n\t"
  206969. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206970. "lsls r5, r2, #31\n\t"
  206971. #else
  206972. "lsl r5, r2, #31\n\t"
  206973. #endif
  206974. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206975. "lsrs r2, r2, #1\n\t"
  206976. #else
  206977. "lsr r2, r2, #1\n\t"
  206978. #endif
  206979. #ifdef WOLFSSL_KEIL
  206980. "orrs r4, r4, r5\n\t"
  206981. #elif defined(__clang__)
  206982. "orrs r4, r5\n\t"
  206983. #else
  206984. "orr r4, r5\n\t"
  206985. #endif
  206986. "ldr r3, [%[a], #124]\n\t"
  206987. "str r4, [%[r], #116]\n\t"
  206988. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206989. "lsls r5, r3, #31\n\t"
  206990. #else
  206991. "lsl r5, r3, #31\n\t"
  206992. #endif
  206993. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  206994. "lsrs r3, r3, #1\n\t"
  206995. #else
  206996. "lsr r3, r3, #1\n\t"
  206997. #endif
  206998. #ifdef WOLFSSL_KEIL
  206999. "orrs r2, r2, r5\n\t"
  207000. #elif defined(__clang__)
  207001. "orrs r2, r5\n\t"
  207002. #else
  207003. "orr r2, r5\n\t"
  207004. #endif
  207005. "str r2, [%[r], #120]\n\t"
  207006. "str r3, [%[r], #124]\n\t"
  207007. : [r] "+l" (r), [a] "+l" (a)
  207008. :
  207009. : "memory", "r2", "r3", "r4", "r5"
  207010. );
  207011. }
  207012. /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m)
  207013. *
  207014. * r Result of division by 2.
  207015. * a Number to divide.
  207016. * m Modulus (prime).
  207017. */
  207018. SP_NOINLINE static void sp_1024_div2_32(sp_digit* r, const sp_digit* a,
  207019. const sp_digit* m)
  207020. {
  207021. sp_digit o;
  207022. o = sp_1024_cond_add_32(r, a, m, 0 - (a[0] & 1));
  207023. sp_1024_rshift1_32(r, r);
  207024. r[31] |= o << 31;
  207025. }
  207026. /* Double the Montgomery form projective point p.
  207027. *
  207028. * r Result of doubling point.
  207029. * p Point to double.
  207030. * t Temporary ordinate data.
  207031. */
  207032. #ifdef WOLFSSL_SP_NONBLOCK
  207033. typedef struct sp_1024_proj_point_dbl_32_ctx {
  207034. int state;
  207035. sp_digit* t1;
  207036. sp_digit* t2;
  207037. sp_digit* x;
  207038. sp_digit* y;
  207039. sp_digit* z;
  207040. } sp_1024_proj_point_dbl_32_ctx;
  207041. 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)
  207042. {
  207043. int err = FP_WOULDBLOCK;
  207044. sp_1024_proj_point_dbl_32_ctx* ctx = (sp_1024_proj_point_dbl_32_ctx*)sp_ctx->data;
  207045. typedef char ctx_size_test[sizeof(sp_1024_proj_point_dbl_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  207046. (void)sizeof(ctx_size_test);
  207047. switch (ctx->state) {
  207048. case 0:
  207049. ctx->t1 = t;
  207050. ctx->t2 = t + 2*32;
  207051. ctx->x = r->x;
  207052. ctx->y = r->y;
  207053. ctx->z = r->z;
  207054. /* Put infinity into result. */
  207055. if (r != p) {
  207056. r->infinity = p->infinity;
  207057. }
  207058. ctx->state = 1;
  207059. break;
  207060. case 1:
  207061. /* T1 = Z * Z */
  207062. sp_1024_mont_sqr_32(ctx->t1, p->z, p1024_mod, p1024_mp_mod);
  207063. ctx->state = 2;
  207064. break;
  207065. case 2:
  207066. /* Z = Y * Z */
  207067. sp_1024_mont_mul_32(ctx->z, p->y, p->z, p1024_mod, p1024_mp_mod);
  207068. ctx->state = 3;
  207069. break;
  207070. case 3:
  207071. /* Z = 2Z */
  207072. sp_1024_mont_dbl_32(ctx->z, ctx->z, p1024_mod);
  207073. ctx->state = 4;
  207074. break;
  207075. case 4:
  207076. /* T2 = X - T1 */
  207077. sp_1024_mont_sub_32(ctx->t2, p->x, ctx->t1, p1024_mod);
  207078. ctx->state = 5;
  207079. break;
  207080. case 5:
  207081. /* T1 = X + T1 */
  207082. sp_1024_mont_add_32(ctx->t1, p->x, ctx->t1, p1024_mod);
  207083. ctx->state = 6;
  207084. break;
  207085. case 6:
  207086. /* T2 = T1 * T2 */
  207087. sp_1024_mont_mul_32(ctx->t2, ctx->t1, ctx->t2, p1024_mod, p1024_mp_mod);
  207088. ctx->state = 7;
  207089. break;
  207090. case 7:
  207091. /* T1 = 3T2 */
  207092. sp_1024_mont_tpl_32(ctx->t1, ctx->t2, p1024_mod);
  207093. ctx->state = 8;
  207094. break;
  207095. case 8:
  207096. /* Y = 2Y */
  207097. sp_1024_mont_dbl_32(ctx->y, p->y, p1024_mod);
  207098. ctx->state = 9;
  207099. break;
  207100. case 9:
  207101. /* Y = Y * Y */
  207102. sp_1024_mont_sqr_32(ctx->y, ctx->y, p1024_mod, p1024_mp_mod);
  207103. ctx->state = 10;
  207104. break;
  207105. case 10:
  207106. /* T2 = Y * Y */
  207107. sp_1024_mont_sqr_32(ctx->t2, ctx->y, p1024_mod, p1024_mp_mod);
  207108. ctx->state = 11;
  207109. break;
  207110. case 11:
  207111. /* T2 = T2/2 */
  207112. sp_1024_div2_32(ctx->t2, ctx->t2, p1024_mod);
  207113. ctx->state = 12;
  207114. break;
  207115. case 12:
  207116. /* Y = Y * X */
  207117. sp_1024_mont_mul_32(ctx->y, ctx->y, p->x, p1024_mod, p1024_mp_mod);
  207118. ctx->state = 13;
  207119. break;
  207120. case 13:
  207121. /* X = T1 * T1 */
  207122. sp_1024_mont_sqr_32(ctx->x, ctx->t1, p1024_mod, p1024_mp_mod);
  207123. ctx->state = 14;
  207124. break;
  207125. case 14:
  207126. /* X = X - Y */
  207127. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  207128. ctx->state = 15;
  207129. break;
  207130. case 15:
  207131. /* X = X - Y */
  207132. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->y, p1024_mod);
  207133. ctx->state = 16;
  207134. break;
  207135. case 16:
  207136. /* Y = Y - X */
  207137. sp_1024_mont_sub_lower_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  207138. ctx->state = 17;
  207139. break;
  207140. case 17:
  207141. /* Y = Y * T1 */
  207142. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t1, p1024_mod, p1024_mp_mod);
  207143. ctx->state = 18;
  207144. break;
  207145. case 18:
  207146. /* Y = Y - T2 */
  207147. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t2, p1024_mod);
  207148. ctx->state = 19;
  207149. /* fall-through */
  207150. case 19:
  207151. err = MP_OKAY;
  207152. break;
  207153. }
  207154. if (err == MP_OKAY && ctx->state != 19) {
  207155. err = FP_WOULDBLOCK;
  207156. }
  207157. return err;
  207158. }
  207159. #endif /* WOLFSSL_SP_NONBLOCK */
  207160. static void sp_1024_proj_point_dbl_32(sp_point_1024* r, const sp_point_1024* p,
  207161. sp_digit* t)
  207162. {
  207163. sp_digit* t1 = t;
  207164. sp_digit* t2 = t + 2*32;
  207165. sp_digit* x;
  207166. sp_digit* y;
  207167. sp_digit* z;
  207168. x = r->x;
  207169. y = r->y;
  207170. z = r->z;
  207171. /* Put infinity into result. */
  207172. if (r != p) {
  207173. r->infinity = p->infinity;
  207174. }
  207175. /* T1 = Z * Z */
  207176. sp_1024_mont_sqr_32(t1, p->z, p1024_mod, p1024_mp_mod);
  207177. /* Z = Y * Z */
  207178. sp_1024_mont_mul_32(z, p->y, p->z, p1024_mod, p1024_mp_mod);
  207179. /* Z = 2Z */
  207180. sp_1024_mont_dbl_32(z, z, p1024_mod);
  207181. /* T2 = X - T1 */
  207182. sp_1024_mont_sub_32(t2, p->x, t1, p1024_mod);
  207183. /* T1 = X + T1 */
  207184. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  207185. /* T2 = T1 * T2 */
  207186. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  207187. /* T1 = 3T2 */
  207188. sp_1024_mont_tpl_32(t1, t2, p1024_mod);
  207189. /* Y = 2Y */
  207190. sp_1024_mont_dbl_32(y, p->y, p1024_mod);
  207191. /* Y = Y * Y */
  207192. sp_1024_mont_sqr_32(y, y, p1024_mod, p1024_mp_mod);
  207193. /* T2 = Y * Y */
  207194. sp_1024_mont_sqr_32(t2, y, p1024_mod, p1024_mp_mod);
  207195. /* T2 = T2/2 */
  207196. sp_1024_div2_32(t2, t2, p1024_mod);
  207197. /* Y = Y * X */
  207198. sp_1024_mont_mul_32(y, y, p->x, p1024_mod, p1024_mp_mod);
  207199. /* X = T1 * T1 */
  207200. sp_1024_mont_sqr_32(x, t1, p1024_mod, p1024_mp_mod);
  207201. /* X = X - Y */
  207202. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  207203. /* X = X - Y */
  207204. sp_1024_mont_sub_32(x, x, y, p1024_mod);
  207205. /* Y = Y - X */
  207206. sp_1024_mont_sub_lower_32(y, y, x, p1024_mod);
  207207. /* Y = Y * T1 */
  207208. sp_1024_mont_mul_32(y, y, t1, p1024_mod, p1024_mp_mod);
  207209. /* Y = Y - T2 */
  207210. sp_1024_mont_sub_32(y, y, t2, p1024_mod);
  207211. }
  207212. #ifdef WOLFSSL_SP_SMALL
  207213. /* Sub b from a into r. (r = a - b)
  207214. *
  207215. * r A single precision integer.
  207216. * a A single precision integer.
  207217. * b A single precision integer.
  207218. */
  207219. SP_NOINLINE static sp_digit sp_1024_sub_32(sp_digit* r, const sp_digit* a,
  207220. const sp_digit* b)
  207221. {
  207222. __asm__ __volatile__ (
  207223. "movs r6, %[a]\n\t"
  207224. "movs r3, #0\n\t"
  207225. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207226. "adds r6, r6, #0x80\n\t"
  207227. #else
  207228. "add r6, r6, #0x80\n\t"
  207229. #endif
  207230. "\n"
  207231. "L_sp_1024_sub_32_word_%=:\n\t"
  207232. "movs r5, #0\n\t"
  207233. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207234. "subs r5, r5, r3\n\t"
  207235. #else
  207236. "sub r5, r5, r3\n\t"
  207237. #endif
  207238. "ldr r4, [%[a]]\n\t"
  207239. "ldr r5, [%[b]]\n\t"
  207240. #ifdef WOLFSSL_KEIL
  207241. "sbcs r4, r4, r5\n\t"
  207242. #elif defined(__clang__)
  207243. "sbcs r4, r5\n\t"
  207244. #else
  207245. "sbc r4, r5\n\t"
  207246. #endif
  207247. "str r4, [%[r]]\n\t"
  207248. #ifdef WOLFSSL_KEIL
  207249. "sbcs r3, r3, r3\n\t"
  207250. #elif defined(__clang__)
  207251. "sbcs r3, r3\n\t"
  207252. #else
  207253. "sbc r3, r3\n\t"
  207254. #endif
  207255. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207256. "adds %[a], %[a], #4\n\t"
  207257. #else
  207258. "add %[a], %[a], #4\n\t"
  207259. #endif
  207260. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207261. "adds %[b], %[b], #4\n\t"
  207262. #else
  207263. "add %[b], %[b], #4\n\t"
  207264. #endif
  207265. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207266. "adds %[r], %[r], #4\n\t"
  207267. #else
  207268. "add %[r], %[r], #4\n\t"
  207269. #endif
  207270. "cmp %[a], r6\n\t"
  207271. "bne L_sp_1024_sub_32_word_%=\n\t"
  207272. "movs %[r], r3\n\t"
  207273. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  207274. :
  207275. : "memory", "r3", "r4", "r5", "r6"
  207276. );
  207277. return (uint32_t)(size_t)r;
  207278. }
  207279. #else
  207280. /* Sub b from a into r. (r = a - b)
  207281. *
  207282. * r A single precision integer.
  207283. * a A single precision integer.
  207284. * b A single precision integer.
  207285. */
  207286. SP_NOINLINE static sp_digit sp_1024_sub_32(sp_digit* r, const sp_digit* a,
  207287. const sp_digit* b)
  207288. {
  207289. __asm__ __volatile__ (
  207290. "ldm %[b]!, {r5, r6}\n\t"
  207291. "ldm %[a]!, {r3, r4}\n\t"
  207292. #if defined(__clang__) || defined(WOLFSSL_KEIL)
  207293. "subs r3, r3, r5\n\t"
  207294. #else
  207295. "sub r3, r3, r5\n\t"
  207296. #endif
  207297. #ifdef WOLFSSL_KEIL
  207298. "sbcs r4, r4, r6\n\t"
  207299. #elif defined(__clang__)
  207300. "sbcs r4, r6\n\t"
  207301. #else
  207302. "sbc r4, r6\n\t"
  207303. #endif
  207304. "stm %[r]!, {r3, r4}\n\t"
  207305. "ldm %[b]!, {r5, r6}\n\t"
  207306. "ldm %[a]!, {r3, r4}\n\t"
  207307. #ifdef WOLFSSL_KEIL
  207308. "sbcs r3, r3, r5\n\t"
  207309. #elif defined(__clang__)
  207310. "sbcs r3, r5\n\t"
  207311. #else
  207312. "sbc r3, r5\n\t"
  207313. #endif
  207314. #ifdef WOLFSSL_KEIL
  207315. "sbcs r4, r4, r6\n\t"
  207316. #elif defined(__clang__)
  207317. "sbcs r4, r6\n\t"
  207318. #else
  207319. "sbc r4, r6\n\t"
  207320. #endif
  207321. "stm %[r]!, {r3, r4}\n\t"
  207322. "ldm %[b]!, {r5, r6}\n\t"
  207323. "ldm %[a]!, {r3, r4}\n\t"
  207324. #ifdef WOLFSSL_KEIL
  207325. "sbcs r3, r3, r5\n\t"
  207326. #elif defined(__clang__)
  207327. "sbcs r3, r5\n\t"
  207328. #else
  207329. "sbc r3, r5\n\t"
  207330. #endif
  207331. #ifdef WOLFSSL_KEIL
  207332. "sbcs r4, r4, r6\n\t"
  207333. #elif defined(__clang__)
  207334. "sbcs r4, r6\n\t"
  207335. #else
  207336. "sbc r4, r6\n\t"
  207337. #endif
  207338. "stm %[r]!, {r3, r4}\n\t"
  207339. "ldm %[b]!, {r5, r6}\n\t"
  207340. "ldm %[a]!, {r3, r4}\n\t"
  207341. #ifdef WOLFSSL_KEIL
  207342. "sbcs r3, r3, r5\n\t"
  207343. #elif defined(__clang__)
  207344. "sbcs r3, r5\n\t"
  207345. #else
  207346. "sbc r3, r5\n\t"
  207347. #endif
  207348. #ifdef WOLFSSL_KEIL
  207349. "sbcs r4, r4, r6\n\t"
  207350. #elif defined(__clang__)
  207351. "sbcs r4, r6\n\t"
  207352. #else
  207353. "sbc r4, r6\n\t"
  207354. #endif
  207355. "stm %[r]!, {r3, r4}\n\t"
  207356. "ldm %[b]!, {r5, r6}\n\t"
  207357. "ldm %[a]!, {r3, r4}\n\t"
  207358. #ifdef WOLFSSL_KEIL
  207359. "sbcs r3, r3, r5\n\t"
  207360. #elif defined(__clang__)
  207361. "sbcs r3, r5\n\t"
  207362. #else
  207363. "sbc r3, r5\n\t"
  207364. #endif
  207365. #ifdef WOLFSSL_KEIL
  207366. "sbcs r4, r4, r6\n\t"
  207367. #elif defined(__clang__)
  207368. "sbcs r4, r6\n\t"
  207369. #else
  207370. "sbc r4, r6\n\t"
  207371. #endif
  207372. "stm %[r]!, {r3, r4}\n\t"
  207373. "ldm %[b]!, {r5, r6}\n\t"
  207374. "ldm %[a]!, {r3, r4}\n\t"
  207375. #ifdef WOLFSSL_KEIL
  207376. "sbcs r3, r3, r5\n\t"
  207377. #elif defined(__clang__)
  207378. "sbcs r3, r5\n\t"
  207379. #else
  207380. "sbc r3, r5\n\t"
  207381. #endif
  207382. #ifdef WOLFSSL_KEIL
  207383. "sbcs r4, r4, r6\n\t"
  207384. #elif defined(__clang__)
  207385. "sbcs r4, r6\n\t"
  207386. #else
  207387. "sbc r4, r6\n\t"
  207388. #endif
  207389. "stm %[r]!, {r3, r4}\n\t"
  207390. "ldm %[b]!, {r5, r6}\n\t"
  207391. "ldm %[a]!, {r3, r4}\n\t"
  207392. #ifdef WOLFSSL_KEIL
  207393. "sbcs r3, r3, r5\n\t"
  207394. #elif defined(__clang__)
  207395. "sbcs r3, r5\n\t"
  207396. #else
  207397. "sbc r3, r5\n\t"
  207398. #endif
  207399. #ifdef WOLFSSL_KEIL
  207400. "sbcs r4, r4, r6\n\t"
  207401. #elif defined(__clang__)
  207402. "sbcs r4, r6\n\t"
  207403. #else
  207404. "sbc r4, r6\n\t"
  207405. #endif
  207406. "stm %[r]!, {r3, r4}\n\t"
  207407. "ldm %[b]!, {r5, r6}\n\t"
  207408. "ldm %[a]!, {r3, r4}\n\t"
  207409. #ifdef WOLFSSL_KEIL
  207410. "sbcs r3, r3, r5\n\t"
  207411. #elif defined(__clang__)
  207412. "sbcs r3, r5\n\t"
  207413. #else
  207414. "sbc r3, r5\n\t"
  207415. #endif
  207416. #ifdef WOLFSSL_KEIL
  207417. "sbcs r4, r4, r6\n\t"
  207418. #elif defined(__clang__)
  207419. "sbcs r4, r6\n\t"
  207420. #else
  207421. "sbc r4, r6\n\t"
  207422. #endif
  207423. "stm %[r]!, {r3, r4}\n\t"
  207424. "ldm %[b]!, {r5, r6}\n\t"
  207425. "ldm %[a]!, {r3, r4}\n\t"
  207426. #ifdef WOLFSSL_KEIL
  207427. "sbcs r3, r3, r5\n\t"
  207428. #elif defined(__clang__)
  207429. "sbcs r3, r5\n\t"
  207430. #else
  207431. "sbc r3, r5\n\t"
  207432. #endif
  207433. #ifdef WOLFSSL_KEIL
  207434. "sbcs r4, r4, r6\n\t"
  207435. #elif defined(__clang__)
  207436. "sbcs r4, r6\n\t"
  207437. #else
  207438. "sbc r4, r6\n\t"
  207439. #endif
  207440. "stm %[r]!, {r3, r4}\n\t"
  207441. "ldm %[b]!, {r5, r6}\n\t"
  207442. "ldm %[a]!, {r3, r4}\n\t"
  207443. #ifdef WOLFSSL_KEIL
  207444. "sbcs r3, r3, r5\n\t"
  207445. #elif defined(__clang__)
  207446. "sbcs r3, r5\n\t"
  207447. #else
  207448. "sbc r3, r5\n\t"
  207449. #endif
  207450. #ifdef WOLFSSL_KEIL
  207451. "sbcs r4, r4, r6\n\t"
  207452. #elif defined(__clang__)
  207453. "sbcs r4, r6\n\t"
  207454. #else
  207455. "sbc r4, r6\n\t"
  207456. #endif
  207457. "stm %[r]!, {r3, r4}\n\t"
  207458. "ldm %[b]!, {r5, r6}\n\t"
  207459. "ldm %[a]!, {r3, r4}\n\t"
  207460. #ifdef WOLFSSL_KEIL
  207461. "sbcs r3, r3, r5\n\t"
  207462. #elif defined(__clang__)
  207463. "sbcs r3, r5\n\t"
  207464. #else
  207465. "sbc r3, r5\n\t"
  207466. #endif
  207467. #ifdef WOLFSSL_KEIL
  207468. "sbcs r4, r4, r6\n\t"
  207469. #elif defined(__clang__)
  207470. "sbcs r4, r6\n\t"
  207471. #else
  207472. "sbc r4, r6\n\t"
  207473. #endif
  207474. "stm %[r]!, {r3, r4}\n\t"
  207475. "ldm %[b]!, {r5, r6}\n\t"
  207476. "ldm %[a]!, {r3, r4}\n\t"
  207477. #ifdef WOLFSSL_KEIL
  207478. "sbcs r3, r3, r5\n\t"
  207479. #elif defined(__clang__)
  207480. "sbcs r3, r5\n\t"
  207481. #else
  207482. "sbc r3, r5\n\t"
  207483. #endif
  207484. #ifdef WOLFSSL_KEIL
  207485. "sbcs r4, r4, r6\n\t"
  207486. #elif defined(__clang__)
  207487. "sbcs r4, r6\n\t"
  207488. #else
  207489. "sbc r4, r6\n\t"
  207490. #endif
  207491. "stm %[r]!, {r3, r4}\n\t"
  207492. "ldm %[b]!, {r5, r6}\n\t"
  207493. "ldm %[a]!, {r3, r4}\n\t"
  207494. #ifdef WOLFSSL_KEIL
  207495. "sbcs r3, r3, r5\n\t"
  207496. #elif defined(__clang__)
  207497. "sbcs r3, r5\n\t"
  207498. #else
  207499. "sbc r3, r5\n\t"
  207500. #endif
  207501. #ifdef WOLFSSL_KEIL
  207502. "sbcs r4, r4, r6\n\t"
  207503. #elif defined(__clang__)
  207504. "sbcs r4, r6\n\t"
  207505. #else
  207506. "sbc r4, r6\n\t"
  207507. #endif
  207508. "stm %[r]!, {r3, r4}\n\t"
  207509. "ldm %[b]!, {r5, r6}\n\t"
  207510. "ldm %[a]!, {r3, r4}\n\t"
  207511. #ifdef WOLFSSL_KEIL
  207512. "sbcs r3, r3, r5\n\t"
  207513. #elif defined(__clang__)
  207514. "sbcs r3, r5\n\t"
  207515. #else
  207516. "sbc r3, r5\n\t"
  207517. #endif
  207518. #ifdef WOLFSSL_KEIL
  207519. "sbcs r4, r4, r6\n\t"
  207520. #elif defined(__clang__)
  207521. "sbcs r4, r6\n\t"
  207522. #else
  207523. "sbc r4, r6\n\t"
  207524. #endif
  207525. "stm %[r]!, {r3, r4}\n\t"
  207526. "ldm %[b]!, {r5, r6}\n\t"
  207527. "ldm %[a]!, {r3, r4}\n\t"
  207528. #ifdef WOLFSSL_KEIL
  207529. "sbcs r3, r3, r5\n\t"
  207530. #elif defined(__clang__)
  207531. "sbcs r3, r5\n\t"
  207532. #else
  207533. "sbc r3, r5\n\t"
  207534. #endif
  207535. #ifdef WOLFSSL_KEIL
  207536. "sbcs r4, r4, r6\n\t"
  207537. #elif defined(__clang__)
  207538. "sbcs r4, r6\n\t"
  207539. #else
  207540. "sbc r4, r6\n\t"
  207541. #endif
  207542. "stm %[r]!, {r3, r4}\n\t"
  207543. "ldm %[b]!, {r5, r6}\n\t"
  207544. "ldm %[a]!, {r3, r4}\n\t"
  207545. #ifdef WOLFSSL_KEIL
  207546. "sbcs r3, r3, r5\n\t"
  207547. #elif defined(__clang__)
  207548. "sbcs r3, r5\n\t"
  207549. #else
  207550. "sbc r3, r5\n\t"
  207551. #endif
  207552. #ifdef WOLFSSL_KEIL
  207553. "sbcs r4, r4, r6\n\t"
  207554. #elif defined(__clang__)
  207555. "sbcs r4, r6\n\t"
  207556. #else
  207557. "sbc r4, r6\n\t"
  207558. #endif
  207559. "stm %[r]!, {r3, r4}\n\t"
  207560. #ifdef WOLFSSL_KEIL
  207561. "sbcs %[r], %[r], %[r]\n\t"
  207562. #elif defined(__clang__)
  207563. "sbcs %[r], %[r]\n\t"
  207564. #else
  207565. "sbc %[r], %[r]\n\t"
  207566. #endif
  207567. : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b)
  207568. :
  207569. : "memory", "r3", "r4", "r5", "r6"
  207570. );
  207571. return (uint32_t)(size_t)r;
  207572. }
  207573. #endif /* WOLFSSL_SP_SMALL */
  207574. /* Compare two numbers to determine if they are equal.
  207575. * Constant time implementation.
  207576. *
  207577. * a First number to compare.
  207578. * b Second number to compare.
  207579. * returns 1 when equal and 0 otherwise.
  207580. */
  207581. static int sp_1024_cmp_equal_32(const sp_digit* a, const sp_digit* b)
  207582. {
  207583. return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) |
  207584. (a[3] ^ b[3]) | (a[4] ^ b[4]) | (a[5] ^ b[5]) |
  207585. (a[6] ^ b[6]) | (a[7] ^ b[7]) | (a[8] ^ b[8]) |
  207586. (a[9] ^ b[9]) | (a[10] ^ b[10]) | (a[11] ^ b[11]) |
  207587. (a[12] ^ b[12]) | (a[13] ^ b[13]) | (a[14] ^ b[14]) |
  207588. (a[15] ^ b[15]) | (a[16] ^ b[16]) | (a[17] ^ b[17]) |
  207589. (a[18] ^ b[18]) | (a[19] ^ b[19]) | (a[20] ^ b[20]) |
  207590. (a[21] ^ b[21]) | (a[22] ^ b[22]) | (a[23] ^ b[23]) |
  207591. (a[24] ^ b[24]) | (a[25] ^ b[25]) | (a[26] ^ b[26]) |
  207592. (a[27] ^ b[27]) | (a[28] ^ b[28]) | (a[29] ^ b[29]) |
  207593. (a[30] ^ b[30]) | (a[31] ^ b[31])) == 0;
  207594. }
  207595. /* Returns 1 if the number of zero.
  207596. * Implementation is constant time.
  207597. *
  207598. * a Number to check.
  207599. * returns 1 if the number is zero and 0 otherwise.
  207600. */
  207601. static int sp_1024_iszero_32(const sp_digit* a)
  207602. {
  207603. return (a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
  207604. a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] | a[15] |
  207605. a[16] | a[17] | a[18] | a[19] | a[20] | a[21] | a[22] | a[23] |
  207606. a[24] | a[25] | a[26] | a[27] | a[28] | a[29] | a[30] | a[31]) == 0;
  207607. }
  207608. /* Add two Montgomery form projective points.
  207609. *
  207610. * r Result of addition.
  207611. * p First point to add.
  207612. * q Second point to add.
  207613. * t Temporary ordinate data.
  207614. */
  207615. #ifdef WOLFSSL_SP_NONBLOCK
  207616. typedef struct sp_1024_proj_point_add_32_ctx {
  207617. int state;
  207618. sp_1024_proj_point_dbl_32_ctx dbl_ctx;
  207619. const sp_point_1024* ap[2];
  207620. sp_point_1024* rp[2];
  207621. sp_digit* t1;
  207622. sp_digit* t2;
  207623. sp_digit* t3;
  207624. sp_digit* t4;
  207625. sp_digit* t5;
  207626. sp_digit* t6;
  207627. sp_digit* x;
  207628. sp_digit* y;
  207629. sp_digit* z;
  207630. } sp_1024_proj_point_add_32_ctx;
  207631. static int sp_1024_proj_point_add_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r,
  207632. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  207633. {
  207634. int err = FP_WOULDBLOCK;
  207635. sp_1024_proj_point_add_32_ctx* ctx = (sp_1024_proj_point_add_32_ctx*)sp_ctx->data;
  207636. /* Ensure only the first point is the same as the result. */
  207637. if (q == r) {
  207638. const sp_point_1024* a = p;
  207639. p = q;
  207640. q = a;
  207641. }
  207642. typedef char ctx_size_test[sizeof(sp_1024_proj_point_add_32_ctx) >= sizeof(*sp_ctx) ? -1 : 1];
  207643. (void)sizeof(ctx_size_test);
  207644. switch (ctx->state) {
  207645. case 0: /* INIT */
  207646. ctx->t1 = t;
  207647. ctx->t2 = t + 2*32;
  207648. ctx->t3 = t + 4*32;
  207649. ctx->t4 = t + 6*32;
  207650. ctx->t5 = t + 8*32;
  207651. ctx->t6 = t + 10*32;
  207652. ctx->x = ctx->t6;
  207653. ctx->y = ctx->t1;
  207654. ctx->z = ctx->t2;
  207655. ctx->state = 1;
  207656. break;
  207657. case 1:
  207658. /* Check double */
  207659. (void)sp_1024_sub_32(ctx->t1, p1024_mod, q->y);
  207660. sp_1024_norm_32(ctx->t1);
  207661. if ((~p->infinity & ~q->infinity &
  207662. sp_1024_cmp_equal_32(p->x, q->x) & sp_1024_cmp_equal_32(p->z, q->z) &
  207663. (sp_1024_cmp_equal_32(p->y, q->y) | sp_1024_cmp_equal_32(p->y, ctx->t1))) != 0)
  207664. {
  207665. XMEMSET(&ctx->dbl_ctx, 0, sizeof(ctx->dbl_ctx));
  207666. ctx->state = 2;
  207667. }
  207668. else {
  207669. ctx->state = 3;
  207670. }
  207671. break;
  207672. case 2:
  207673. err = sp_1024_proj_point_dbl_32_nb((sp_ecc_ctx_t*)&ctx->dbl_ctx, r, p, t);
  207674. if (err == MP_OKAY)
  207675. ctx->state = 27; /* done */
  207676. break;
  207677. case 3:
  207678. {
  207679. ctx->state = 4;
  207680. break;
  207681. }
  207682. case 4:
  207683. /* U1 = X1*Z2^2 */
  207684. sp_1024_mont_sqr_32(ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  207685. ctx->state = 5;
  207686. break;
  207687. case 5:
  207688. sp_1024_mont_mul_32(ctx->t3, ctx->t1, q->z, p1024_mod, p1024_mp_mod);
  207689. ctx->state = 6;
  207690. break;
  207691. case 6:
  207692. sp_1024_mont_mul_32(ctx->t1, ctx->t1, p->x, p1024_mod, p1024_mp_mod);
  207693. ctx->state = 7;
  207694. break;
  207695. case 7:
  207696. /* U2 = X2*Z1^2 */
  207697. sp_1024_mont_sqr_32(ctx->t2, p->z, p1024_mod, p1024_mp_mod);
  207698. ctx->state = 8;
  207699. break;
  207700. case 8:
  207701. sp_1024_mont_mul_32(ctx->t4, ctx->t2, p->z, p1024_mod, p1024_mp_mod);
  207702. ctx->state = 9;
  207703. break;
  207704. case 9:
  207705. sp_1024_mont_mul_32(ctx->t2, ctx->t2, q->x, p1024_mod, p1024_mp_mod);
  207706. ctx->state = 10;
  207707. break;
  207708. case 10:
  207709. /* S1 = Y1*Z2^3 */
  207710. sp_1024_mont_mul_32(ctx->t3, ctx->t3, p->y, p1024_mod, p1024_mp_mod);
  207711. ctx->state = 11;
  207712. break;
  207713. case 11:
  207714. /* S2 = Y2*Z1^3 */
  207715. sp_1024_mont_mul_32(ctx->t4, ctx->t4, q->y, p1024_mod, p1024_mp_mod);
  207716. ctx->state = 12;
  207717. break;
  207718. case 12:
  207719. /* H = U2 - U1 */
  207720. sp_1024_mont_sub_32(ctx->t2, ctx->t2, ctx->t1, p1024_mod);
  207721. ctx->state = 13;
  207722. break;
  207723. case 13:
  207724. /* R = S2 - S1 */
  207725. sp_1024_mont_sub_32(ctx->t4, ctx->t4, ctx->t3, p1024_mod);
  207726. ctx->state = 14;
  207727. break;
  207728. case 14:
  207729. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  207730. sp_1024_mont_sqr_32(ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  207731. ctx->state = 15;
  207732. break;
  207733. case 15:
  207734. sp_1024_mont_mul_32(ctx->y, ctx->t1, ctx->t5, p1024_mod, p1024_mp_mod);
  207735. ctx->state = 16;
  207736. break;
  207737. case 16:
  207738. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t2, p1024_mod, p1024_mp_mod);
  207739. ctx->state = 17;
  207740. break;
  207741. case 17:
  207742. /* Z3 = H*Z1*Z2 */
  207743. sp_1024_mont_mul_32(ctx->z, p->z, ctx->t2, p1024_mod, p1024_mp_mod);
  207744. ctx->state = 18;
  207745. break;
  207746. case 18:
  207747. sp_1024_mont_mul_32(ctx->z, ctx->z, q->z, p1024_mod, p1024_mp_mod);
  207748. ctx->state = 19;
  207749. break;
  207750. case 19:
  207751. sp_1024_mont_sqr_32(ctx->x, ctx->t4, p1024_mod, p1024_mp_mod);
  207752. ctx->state = 20;
  207753. break;
  207754. case 20:
  207755. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t5, p1024_mod);
  207756. ctx->state = 21;
  207757. break;
  207758. case 21:
  207759. sp_1024_mont_mul_32(ctx->t5, ctx->t5, ctx->t3, p1024_mod, p1024_mp_mod);
  207760. ctx->state = 22;
  207761. break;
  207762. case 22:
  207763. sp_1024_mont_dbl_32(ctx->t3, ctx->y, p1024_mod);
  207764. ctx->state = 23;
  207765. break;
  207766. case 23:
  207767. sp_1024_mont_sub_32(ctx->x, ctx->x, ctx->t3, p1024_mod);
  207768. ctx->state = 24;
  207769. break;
  207770. case 24:
  207771. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  207772. sp_1024_mont_sub_lower_32(ctx->y, ctx->y, ctx->x, p1024_mod);
  207773. ctx->state = 25;
  207774. break;
  207775. case 25:
  207776. sp_1024_mont_mul_32(ctx->y, ctx->y, ctx->t4, p1024_mod, p1024_mp_mod);
  207777. ctx->state = 26;
  207778. break;
  207779. case 26:
  207780. sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->t5, p1024_mod);
  207781. ctx->state = 27;
  207782. /* fall-through */
  207783. case 27:
  207784. {
  207785. int i;
  207786. sp_digit maskp = 0 - (q->infinity & (!p->infinity));
  207787. sp_digit maskq = 0 - (p->infinity & (!q->infinity));
  207788. sp_digit maskt = ~(maskp | maskq);
  207789. for (i = 0; i < 32; i++) {
  207790. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  207791. (ctx->x[i] & maskt);
  207792. }
  207793. for (i = 0; i < 32; i++) {
  207794. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  207795. (ctx->y[i] & maskt);
  207796. }
  207797. for (i = 0; i < 32; i++) {
  207798. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  207799. (ctx->z[i] & maskt);
  207800. }
  207801. r->z[0] |= p->infinity & q->infinity;
  207802. r->infinity = p->infinity & q->infinity;
  207803. err = MP_OKAY;
  207804. break;
  207805. }
  207806. }
  207807. if (err == MP_OKAY && ctx->state != 27) {
  207808. err = FP_WOULDBLOCK;
  207809. }
  207810. return err;
  207811. }
  207812. #endif /* WOLFSSL_SP_NONBLOCK */
  207813. static void sp_1024_proj_point_add_32(sp_point_1024* r,
  207814. const sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  207815. {
  207816. sp_digit* t1 = t;
  207817. sp_digit* t2 = t + 2*32;
  207818. sp_digit* t3 = t + 4*32;
  207819. sp_digit* t4 = t + 6*32;
  207820. sp_digit* t5 = t + 8*32;
  207821. sp_digit* t6 = t + 10*32;
  207822. /* Check double */
  207823. (void)sp_1024_mont_sub_32(t1, p1024_mod, q->y, p1024_mod);
  207824. sp_1024_norm_32(t1);
  207825. if ((~p->infinity & ~q->infinity &
  207826. sp_1024_cmp_equal_32(p->x, q->x) & sp_1024_cmp_equal_32(p->z, q->z) &
  207827. (sp_1024_cmp_equal_32(p->y, q->y) | sp_1024_cmp_equal_32(p->y, t1))) != 0) {
  207828. sp_1024_proj_point_dbl_32(r, p, t);
  207829. }
  207830. else {
  207831. sp_digit maskp;
  207832. sp_digit maskq;
  207833. sp_digit maskt;
  207834. sp_digit* x = t6;
  207835. sp_digit* y = t1;
  207836. sp_digit* z = t2;
  207837. int i;
  207838. maskp = 0 - (q->infinity & (!p->infinity));
  207839. maskq = 0 - (p->infinity & (!q->infinity));
  207840. maskt = ~(maskp | maskq);
  207841. /* U1 = X1*Z2^2 */
  207842. sp_1024_mont_sqr_32(t1, q->z, p1024_mod, p1024_mp_mod);
  207843. sp_1024_mont_mul_32(t3, t1, q->z, p1024_mod, p1024_mp_mod);
  207844. sp_1024_mont_mul_32(t1, t1, p->x, p1024_mod, p1024_mp_mod);
  207845. /* U2 = X2*Z1^2 */
  207846. sp_1024_mont_sqr_32(t2, p->z, p1024_mod, p1024_mp_mod);
  207847. sp_1024_mont_mul_32(t4, t2, p->z, p1024_mod, p1024_mp_mod);
  207848. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  207849. /* S1 = Y1*Z2^3 */
  207850. sp_1024_mont_mul_32(t3, t3, p->y, p1024_mod, p1024_mp_mod);
  207851. /* S2 = Y2*Z1^3 */
  207852. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  207853. /* H = U2 - U1 */
  207854. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  207855. /* R = S2 - S1 */
  207856. sp_1024_mont_sub_32(t4, t4, t3, p1024_mod);
  207857. if (~p->infinity & ~q->infinity &
  207858. sp_1024_iszero_32(t2) & sp_1024_iszero_32(t4) & maskt) {
  207859. sp_1024_proj_point_dbl_32(r, p, t);
  207860. }
  207861. else {
  207862. /* X3 = R^2 - H^3 - 2*U1*H^2 */
  207863. sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod);
  207864. sp_1024_mont_mul_32(y, t1, t5, p1024_mod, p1024_mp_mod);
  207865. sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod);
  207866. /* Z3 = H*Z1*Z2 */
  207867. sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod);
  207868. sp_1024_mont_mul_32(z, z, q->z, p1024_mod, p1024_mp_mod);
  207869. sp_1024_mont_sqr_32(x, t4, p1024_mod, p1024_mp_mod);
  207870. sp_1024_mont_sub_32(x, x, t5, p1024_mod);
  207871. sp_1024_mont_mul_32(t5, t5, t3, p1024_mod, p1024_mp_mod);
  207872. sp_1024_mont_dbl_32(t3, y, p1024_mod);
  207873. sp_1024_mont_sub_32(x, x, t3, p1024_mod);
  207874. /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */
  207875. sp_1024_mont_sub_lower_32(y, y, x, p1024_mod);
  207876. sp_1024_mont_mul_32(y, y, t4, p1024_mod, p1024_mp_mod);
  207877. sp_1024_mont_sub_32(y, y, t5, p1024_mod);
  207878. for (i = 0; i < 32; i++) {
  207879. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) |
  207880. (x[i] & maskt);
  207881. }
  207882. for (i = 0; i < 32; i++) {
  207883. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) |
  207884. (y[i] & maskt);
  207885. }
  207886. for (i = 0; i < 32; i++) {
  207887. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) |
  207888. (z[i] & maskt);
  207889. }
  207890. r->z[0] |= p->infinity & q->infinity;
  207891. r->infinity = p->infinity & q->infinity;
  207892. }
  207893. }
  207894. }
  207895. /* Multiply the point by the scalar and return the result.
  207896. * If map is true then convert result to affine coordinates.
  207897. *
  207898. * Fast implementation that generates a pre-computation table.
  207899. * 4 bits of window (no sliding!).
  207900. * Uses add and double for calculating table.
  207901. * 1024 doubles.
  207902. * 268 adds.
  207903. *
  207904. * r Resulting point.
  207905. * g Point to multiply.
  207906. * k Scalar to multiply by.
  207907. * map Indicates whether to convert result to affine.
  207908. * ct Constant time required.
  207909. * heap Heap to use for allocation.
  207910. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  207911. */
  207912. static int sp_1024_ecc_mulmod_fast_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  207913. int map, int ct, void* heap)
  207914. {
  207915. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  207916. sp_point_1024* t = NULL;
  207917. sp_digit* tmp = NULL;
  207918. #else
  207919. sp_point_1024 t[16 + 1];
  207920. sp_digit tmp[2 * 32 * 6];
  207921. #endif
  207922. sp_point_1024* rt = NULL;
  207923. sp_digit n;
  207924. int i;
  207925. int c;
  207926. int y;
  207927. int err = MP_OKAY;
  207928. /* Constant time used for cache attack resistance implementation. */
  207929. (void)ct;
  207930. (void)heap;
  207931. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  207932. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * (16 + 1),
  207933. heap, DYNAMIC_TYPE_ECC);
  207934. if (t == NULL)
  207935. err = MEMORY_E;
  207936. if (err == MP_OKAY) {
  207937. tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 6, heap,
  207938. DYNAMIC_TYPE_ECC);
  207939. if (tmp == NULL)
  207940. err = MEMORY_E;
  207941. }
  207942. #endif
  207943. if (err == MP_OKAY) {
  207944. rt = t + 16;
  207945. /* t[0] = {0, 0, 1} * norm */
  207946. XMEMSET(&t[0], 0, sizeof(t[0]));
  207947. t[0].infinity = 1;
  207948. /* t[1] = {g->x, g->y, g->z} * norm */
  207949. (void)sp_1024_mod_mul_norm_32(t[1].x, g->x, p1024_mod);
  207950. (void)sp_1024_mod_mul_norm_32(t[1].y, g->y, p1024_mod);
  207951. (void)sp_1024_mod_mul_norm_32(t[1].z, g->z, p1024_mod);
  207952. t[1].infinity = 0;
  207953. sp_1024_proj_point_dbl_32(&t[ 2], &t[ 1], tmp);
  207954. t[ 2].infinity = 0;
  207955. sp_1024_proj_point_add_32(&t[ 3], &t[ 2], &t[ 1], tmp);
  207956. t[ 3].infinity = 0;
  207957. sp_1024_proj_point_dbl_32(&t[ 4], &t[ 2], tmp);
  207958. t[ 4].infinity = 0;
  207959. sp_1024_proj_point_add_32(&t[ 5], &t[ 3], &t[ 2], tmp);
  207960. t[ 5].infinity = 0;
  207961. sp_1024_proj_point_dbl_32(&t[ 6], &t[ 3], tmp);
  207962. t[ 6].infinity = 0;
  207963. sp_1024_proj_point_add_32(&t[ 7], &t[ 4], &t[ 3], tmp);
  207964. t[ 7].infinity = 0;
  207965. sp_1024_proj_point_dbl_32(&t[ 8], &t[ 4], tmp);
  207966. t[ 8].infinity = 0;
  207967. sp_1024_proj_point_add_32(&t[ 9], &t[ 5], &t[ 4], tmp);
  207968. t[ 9].infinity = 0;
  207969. sp_1024_proj_point_dbl_32(&t[10], &t[ 5], tmp);
  207970. t[10].infinity = 0;
  207971. sp_1024_proj_point_add_32(&t[11], &t[ 6], &t[ 5], tmp);
  207972. t[11].infinity = 0;
  207973. sp_1024_proj_point_dbl_32(&t[12], &t[ 6], tmp);
  207974. t[12].infinity = 0;
  207975. sp_1024_proj_point_add_32(&t[13], &t[ 7], &t[ 6], tmp);
  207976. t[13].infinity = 0;
  207977. sp_1024_proj_point_dbl_32(&t[14], &t[ 7], tmp);
  207978. t[14].infinity = 0;
  207979. sp_1024_proj_point_add_32(&t[15], &t[ 8], &t[ 7], tmp);
  207980. t[15].infinity = 0;
  207981. i = 30;
  207982. n = k[i+1] << 0;
  207983. c = 28;
  207984. y = (int)(n >> 28);
  207985. XMEMCPY(rt, &t[y], sizeof(sp_point_1024));
  207986. n <<= 4;
  207987. for (; i>=0 || c>=4; ) {
  207988. if (c < 4) {
  207989. n |= k[i--];
  207990. c += 32;
  207991. }
  207992. y = (n >> 28) & 0xf;
  207993. n <<= 4;
  207994. c -= 4;
  207995. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  207996. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  207997. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  207998. sp_1024_proj_point_dbl_32(rt, rt, tmp);
  207999. sp_1024_proj_point_add_32(rt, rt, &t[y], tmp);
  208000. }
  208001. if (map != 0) {
  208002. sp_1024_map_32(r, rt, tmp);
  208003. }
  208004. else {
  208005. XMEMCPY(r, rt, sizeof(sp_point_1024));
  208006. }
  208007. }
  208008. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208009. if (tmp != NULL)
  208010. #endif
  208011. {
  208012. ForceZero(tmp, sizeof(sp_digit) * 2 * 32 * 6);
  208013. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208014. XFREE(tmp, heap, DYNAMIC_TYPE_ECC);
  208015. #endif
  208016. }
  208017. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208018. if (t != NULL)
  208019. #endif
  208020. {
  208021. ForceZero(t, sizeof(sp_point_1024) * 17);
  208022. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208023. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208024. #endif
  208025. }
  208026. return err;
  208027. }
  208028. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  208029. #define sp_1024_mont_dbl_lower_32 sp_1024_mont_dbl_32
  208030. #define sp_1024_mont_tpl_lower_32 sp_1024_mont_tpl_32
  208031. /* Double the Montgomery form projective point p a number of times.
  208032. *
  208033. * r Result of repeated doubling of point.
  208034. * p Point to double.
  208035. * n Number of times to double
  208036. * t Temporary ordinate data.
  208037. */
  208038. static void sp_1024_proj_point_dbl_n_32(sp_point_1024* p, int i,
  208039. sp_digit* t)
  208040. {
  208041. sp_digit* w = t;
  208042. sp_digit* a = t + 2*32;
  208043. sp_digit* b = t + 4*32;
  208044. sp_digit* t1 = t + 6*32;
  208045. sp_digit* t2 = t + 8*32;
  208046. sp_digit* x;
  208047. sp_digit* y;
  208048. sp_digit* z;
  208049. volatile int n = i;
  208050. x = p->x;
  208051. y = p->y;
  208052. z = p->z;
  208053. /* Y = 2*Y */
  208054. sp_1024_mont_dbl_32(y, y, p1024_mod);
  208055. /* W = Z^4 */
  208056. sp_1024_mont_sqr_32(w, z, p1024_mod, p1024_mp_mod);
  208057. sp_1024_mont_sqr_32(w, w, p1024_mod, p1024_mp_mod);
  208058. #ifndef WOLFSSL_SP_SMALL
  208059. while (--n > 0)
  208060. #else
  208061. while (--n >= 0)
  208062. #endif
  208063. {
  208064. /* A = 3*(X^2 - W) */
  208065. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  208066. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  208067. sp_1024_mont_tpl_lower_32(a, t1, p1024_mod);
  208068. /* B = X*Y^2 */
  208069. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  208070. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  208071. /* X = A^2 - 2B */
  208072. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  208073. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  208074. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  208075. /* b = 2.(B - X) */
  208076. sp_1024_mont_sub_lower_32(t2, b, x, p1024_mod);
  208077. sp_1024_mont_dbl_lower_32(b, t2, p1024_mod);
  208078. /* Z = Z*Y */
  208079. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  208080. /* t1 = Y^4 */
  208081. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  208082. #ifdef WOLFSSL_SP_SMALL
  208083. if (n != 0)
  208084. #endif
  208085. {
  208086. /* W = W*Y^4 */
  208087. sp_1024_mont_mul_32(w, w, t1, p1024_mod, p1024_mp_mod);
  208088. }
  208089. /* y = 2*A*(B - X) - Y^4 */
  208090. sp_1024_mont_mul_32(y, b, a, p1024_mod, p1024_mp_mod);
  208091. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  208092. }
  208093. #ifndef WOLFSSL_SP_SMALL
  208094. /* A = 3*(X^2 - W) */
  208095. sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod);
  208096. sp_1024_mont_sub_32(t1, t1, w, p1024_mod);
  208097. sp_1024_mont_tpl_lower_32(a, t1, p1024_mod);
  208098. /* B = X*Y^2 */
  208099. sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod);
  208100. sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod);
  208101. /* X = A^2 - 2B */
  208102. sp_1024_mont_sqr_32(x, a, p1024_mod, p1024_mp_mod);
  208103. sp_1024_mont_dbl_32(t2, b, p1024_mod);
  208104. sp_1024_mont_sub_32(x, x, t2, p1024_mod);
  208105. /* b = 2.(B - X) */
  208106. sp_1024_mont_sub_lower_32(t2, b, x, p1024_mod);
  208107. sp_1024_mont_dbl_lower_32(b, t2, p1024_mod);
  208108. /* Z = Z*Y */
  208109. sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod);
  208110. /* t1 = Y^4 */
  208111. sp_1024_mont_sqr_32(t1, t1, p1024_mod, p1024_mp_mod);
  208112. /* y = 2*A*(B - X) - Y^4 */
  208113. sp_1024_mont_mul_32(y, b, a, p1024_mod, p1024_mp_mod);
  208114. sp_1024_mont_sub_32(y, y, t1, p1024_mod);
  208115. #endif
  208116. /* Y = Y/2 */
  208117. sp_1024_div2_32(y, y, p1024_mod);
  208118. }
  208119. /* Convert the projective point to affine.
  208120. * Ordinates are in Montgomery form.
  208121. *
  208122. * a Point to convert.
  208123. * t Temporary data.
  208124. */
  208125. static void sp_1024_proj_to_affine_32(sp_point_1024* a, sp_digit* t)
  208126. {
  208127. sp_digit* t1 = t;
  208128. sp_digit* t2 = t + 2 * 32;
  208129. sp_digit* tmp = t + 4 * 32;
  208130. sp_1024_mont_inv_32(t1, a->z, tmp);
  208131. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  208132. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  208133. sp_1024_mont_mul_32(a->x, a->x, t2, p1024_mod, p1024_mp_mod);
  208134. sp_1024_mont_mul_32(a->y, a->y, t1, p1024_mod, p1024_mp_mod);
  208135. XMEMCPY(a->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208136. }
  208137. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  208138. /* A table entry for pre-computed points. */
  208139. typedef struct sp_table_entry_1024 {
  208140. sp_digit x[32];
  208141. sp_digit y[32];
  208142. } sp_table_entry_1024;
  208143. #ifdef FP_ECC
  208144. #endif /* FP_ECC */
  208145. /* Add two Montgomery form projective points. The second point has a q value of
  208146. * one.
  208147. * Only the first point can be the same pointer as the result point.
  208148. *
  208149. * r Result of addition.
  208150. * p First point to add.
  208151. * q Second point to add.
  208152. * t Temporary ordinate data.
  208153. */
  208154. static void sp_1024_proj_point_add_qz1_32(sp_point_1024* r, const sp_point_1024* p,
  208155. const sp_point_1024* q, sp_digit* t)
  208156. {
  208157. sp_digit* t1 = t;
  208158. sp_digit* t2 = t + 2*32;
  208159. sp_digit* t3 = t + 4*32;
  208160. sp_digit* t4 = t + 6*32;
  208161. sp_digit* t5 = t + 8*32;
  208162. sp_digit* t6 = t + 10*32;
  208163. /* Check double */
  208164. (void)sp_1024_mont_sub_32(t1, p1024_mod, q->y, p1024_mod);
  208165. sp_1024_norm_32(t1);
  208166. if ((~p->infinity & ~q->infinity &
  208167. sp_1024_cmp_equal_32(p->x, q->x) & sp_1024_cmp_equal_32(p->z, q->z) &
  208168. (sp_1024_cmp_equal_32(p->y, q->y) | sp_1024_cmp_equal_32(p->y, t1))) != 0) {
  208169. sp_1024_proj_point_dbl_32(r, p, t);
  208170. }
  208171. else {
  208172. sp_digit maskp;
  208173. sp_digit maskq;
  208174. sp_digit maskt;
  208175. sp_digit* x = t2;
  208176. sp_digit* y = t5;
  208177. sp_digit* z = t6;
  208178. int i;
  208179. /* U2 = X2*Z1^2 */
  208180. sp_1024_mont_sqr_32(t2, p->z, p1024_mod, p1024_mp_mod);
  208181. sp_1024_mont_mul_32(t4, t2, p->z, p1024_mod, p1024_mp_mod);
  208182. sp_1024_mont_mul_32(t2, t2, q->x, p1024_mod, p1024_mp_mod);
  208183. /* S2 = Y2*Z1^3 */
  208184. sp_1024_mont_mul_32(t4, t4, q->y, p1024_mod, p1024_mp_mod);
  208185. /* H = U2 - X1 */
  208186. sp_1024_mont_sub_32(t2, t2, p->x, p1024_mod);
  208187. /* R = S2 - Y1 */
  208188. sp_1024_mont_sub_32(t4, t4, p->y, p1024_mod);
  208189. /* Z3 = H*Z1 */
  208190. sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod);
  208191. /* X3 = R^2 - H^3 - 2*X1*H^2 */
  208192. sp_1024_mont_sqr_32(t1, t4, p1024_mod, p1024_mp_mod);
  208193. sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod);
  208194. sp_1024_mont_mul_32(t3, p->x, t5, p1024_mod, p1024_mp_mod);
  208195. sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod);
  208196. sp_1024_mont_sub_32(x, t1, t5, p1024_mod);
  208197. sp_1024_mont_dbl_32(t1, t3, p1024_mod);
  208198. sp_1024_mont_sub_32(x, x, t1, p1024_mod);
  208199. /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */
  208200. sp_1024_mont_sub_lower_32(t3, t3, x, p1024_mod);
  208201. sp_1024_mont_mul_32(t3, t3, t4, p1024_mod, p1024_mp_mod);
  208202. sp_1024_mont_mul_32(t5, t5, p->y, p1024_mod, p1024_mp_mod);
  208203. sp_1024_mont_sub_32(y, t3, t5, p1024_mod);
  208204. maskp = 0 - (q->infinity & (!p->infinity));
  208205. maskq = 0 - (p->infinity & (!q->infinity));
  208206. maskt = ~(maskp | maskq);
  208207. for (i = 0; i < 32; i++) {
  208208. r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt);
  208209. }
  208210. for (i = 0; i < 32; i++) {
  208211. r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt);
  208212. }
  208213. for (i = 0; i < 32; i++) {
  208214. r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt);
  208215. }
  208216. r->z[0] |= p->infinity & q->infinity;
  208217. r->infinity = p->infinity & q->infinity;
  208218. }
  208219. }
  208220. #ifdef WOLFSSL_SP_SMALL
  208221. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  208222. /* Generate the pre-computed table of points for the base point.
  208223. *
  208224. * width = 4
  208225. * 16 entries
  208226. * 256 bits between
  208227. *
  208228. * a The base point.
  208229. * table Place to store generated point data.
  208230. * tmp Temporary data.
  208231. * heap Heap to use for allocation.
  208232. */
  208233. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  208234. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  208235. {
  208236. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208237. sp_point_1024* t = NULL;
  208238. #else
  208239. sp_point_1024 t[3];
  208240. #endif
  208241. sp_point_1024* s1 = NULL;
  208242. sp_point_1024* s2 = NULL;
  208243. int i;
  208244. int j;
  208245. int err = MP_OKAY;
  208246. (void)heap;
  208247. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208248. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  208249. DYNAMIC_TYPE_ECC);
  208250. if (t == NULL)
  208251. err = MEMORY_E;
  208252. #endif
  208253. if (err == MP_OKAY) {
  208254. s1 = t + 1;
  208255. s2 = t + 2;
  208256. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  208257. }
  208258. if (err == MP_OKAY) {
  208259. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  208260. }
  208261. if (err == MP_OKAY) {
  208262. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  208263. }
  208264. if (err == MP_OKAY) {
  208265. t->infinity = 0;
  208266. sp_1024_proj_to_affine_32(t, tmp);
  208267. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208268. s1->infinity = 0;
  208269. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208270. s2->infinity = 0;
  208271. /* table[0] = {0, 0, infinity} */
  208272. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  208273. /* table[1] = Affine version of 'a' in Montgomery form */
  208274. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  208275. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  208276. for (i=1; i<4; i++) {
  208277. sp_1024_proj_point_dbl_n_32(t, 256, tmp);
  208278. sp_1024_proj_to_affine_32(t, tmp);
  208279. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  208280. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  208281. }
  208282. for (i=1; i<4; i++) {
  208283. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  208284. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  208285. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  208286. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  208287. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  208288. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  208289. sp_1024_proj_to_affine_32(t, tmp);
  208290. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  208291. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  208292. }
  208293. }
  208294. }
  208295. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208296. if (t != NULL)
  208297. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208298. #endif
  208299. return err;
  208300. }
  208301. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  208302. /* Multiply the point by the scalar and return the result.
  208303. * If map is true then convert result to affine coordinates.
  208304. *
  208305. * Stripe implementation.
  208306. * Pre-generated: 2^0, 2^256, ...
  208307. * Pre-generated: products of all combinations of above.
  208308. * 4 doubles and adds (with qz=1)
  208309. *
  208310. * r Resulting point.
  208311. * k Scalar to multiply by.
  208312. * table Pre-computed table.
  208313. * map Indicates whether to convert result to affine.
  208314. * ct Constant time required.
  208315. * heap Heap to use for allocation.
  208316. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208317. */
  208318. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  208319. const sp_table_entry_1024* table, const sp_digit* k, int map,
  208320. int ct, void* heap)
  208321. {
  208322. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208323. sp_point_1024* rt = NULL;
  208324. sp_digit* t = NULL;
  208325. #else
  208326. sp_point_1024 rt[2];
  208327. sp_digit t[2 * 32 * 6];
  208328. #endif
  208329. sp_point_1024* p = NULL;
  208330. int i;
  208331. int j;
  208332. int y;
  208333. int x;
  208334. int err = MP_OKAY;
  208335. (void)g;
  208336. /* Constant time used for cache attack resistance implementation. */
  208337. (void)ct;
  208338. (void)heap;
  208339. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208340. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  208341. DYNAMIC_TYPE_ECC);
  208342. if (rt == NULL)
  208343. err = MEMORY_E;
  208344. if (err == MP_OKAY) {
  208345. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 6, heap,
  208346. DYNAMIC_TYPE_ECC);
  208347. if (t == NULL)
  208348. err = MEMORY_E;
  208349. }
  208350. #endif
  208351. if (err == MP_OKAY) {
  208352. p = rt + 1;
  208353. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208354. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208355. y = 0;
  208356. x = 255;
  208357. for (j=0; j<4; j++) {
  208358. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  208359. x += 256;
  208360. }
  208361. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  208362. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  208363. rt->infinity = !y;
  208364. for (i=254; i>=0; i--) {
  208365. y = 0;
  208366. x = i;
  208367. for (j=0; j<4; j++) {
  208368. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  208369. x += 256;
  208370. }
  208371. sp_1024_proj_point_dbl_32(rt, rt, t);
  208372. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  208373. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  208374. p->infinity = !y;
  208375. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  208376. }
  208377. if (map != 0) {
  208378. sp_1024_map_32(r, rt, t);
  208379. }
  208380. else {
  208381. XMEMCPY(r, rt, sizeof(sp_point_1024));
  208382. }
  208383. }
  208384. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208385. if (t != NULL)
  208386. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208387. if (rt != NULL)
  208388. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  208389. #endif
  208390. return err;
  208391. }
  208392. #ifdef FP_ECC
  208393. #ifndef FP_ENTRIES
  208394. #define FP_ENTRIES 16
  208395. #endif
  208396. /* Cache entry - holds precomputation tables for a point. */
  208397. typedef struct sp_cache_1024_t {
  208398. /* X ordinate of point that table was generated from. */
  208399. sp_digit x[32];
  208400. /* Y ordinate of point that table was generated from. */
  208401. sp_digit y[32];
  208402. /* Precomputation table for point. */
  208403. sp_table_entry_1024 table[16];
  208404. /* Count of entries in table. */
  208405. uint32_t cnt;
  208406. /* Point and table set in entry. */
  208407. int set;
  208408. } sp_cache_1024_t;
  208409. /* Cache of tables. */
  208410. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  208411. /* Index of last entry in cache. */
  208412. static THREAD_LS_T int sp_cache_1024_last = -1;
  208413. /* Cache has been initialized. */
  208414. static THREAD_LS_T int sp_cache_1024_inited = 0;
  208415. #ifndef HAVE_THREAD_LS
  208416. static volatile int initCacheMutex_1024 = 0;
  208417. static wolfSSL_Mutex sp_cache_1024_lock;
  208418. #endif
  208419. /* Get the cache entry for the point.
  208420. *
  208421. * g [in] Point scalar multipling.
  208422. * cache [out] Cache table to use.
  208423. */
  208424. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  208425. {
  208426. int i;
  208427. int j;
  208428. uint32_t least;
  208429. if (sp_cache_1024_inited == 0) {
  208430. for (i=0; i<FP_ENTRIES; i++) {
  208431. sp_cache_1024[i].set = 0;
  208432. }
  208433. sp_cache_1024_inited = 1;
  208434. }
  208435. /* Compare point with those in cache. */
  208436. for (i=0; i<FP_ENTRIES; i++) {
  208437. if (!sp_cache_1024[i].set)
  208438. continue;
  208439. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  208440. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  208441. sp_cache_1024[i].cnt++;
  208442. break;
  208443. }
  208444. }
  208445. /* No match. */
  208446. if (i == FP_ENTRIES) {
  208447. /* Find empty entry. */
  208448. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  208449. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  208450. if (!sp_cache_1024[i].set) {
  208451. break;
  208452. }
  208453. }
  208454. /* Evict least used. */
  208455. if (i == sp_cache_1024_last) {
  208456. least = sp_cache_1024[0].cnt;
  208457. for (j=1; j<FP_ENTRIES; j++) {
  208458. if (sp_cache_1024[j].cnt < least) {
  208459. i = j;
  208460. least = sp_cache_1024[i].cnt;
  208461. }
  208462. }
  208463. }
  208464. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  208465. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  208466. sp_cache_1024[i].set = 1;
  208467. sp_cache_1024[i].cnt = 1;
  208468. }
  208469. *cache = &sp_cache_1024[i];
  208470. sp_cache_1024_last = i;
  208471. }
  208472. #endif /* FP_ECC */
  208473. /* Multiply the base point of P1024 by the scalar and return the result.
  208474. * If map is true then convert result to affine coordinates.
  208475. *
  208476. * r Resulting point.
  208477. * g Point to multiply.
  208478. * k Scalar to multiply by.
  208479. * map Indicates whether to convert result to affine.
  208480. * ct Constant time required.
  208481. * heap Heap to use for allocation.
  208482. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208483. */
  208484. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  208485. int map, int ct, void* heap)
  208486. {
  208487. #ifndef FP_ECC
  208488. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  208489. #else
  208490. sp_digit tmp[2 * 32 * 6];
  208491. sp_cache_1024_t* cache;
  208492. int err = MP_OKAY;
  208493. #ifndef HAVE_THREAD_LS
  208494. if (initCacheMutex_1024 == 0) {
  208495. wc_InitMutex(&sp_cache_1024_lock);
  208496. initCacheMutex_1024 = 1;
  208497. }
  208498. if (wc_LockMutex(&sp_cache_1024_lock) != 0)
  208499. err = BAD_MUTEX_E;
  208500. #endif /* HAVE_THREAD_LS */
  208501. if (err == MP_OKAY) {
  208502. sp_ecc_get_cache_1024(g, &cache);
  208503. if (cache->cnt == 2)
  208504. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  208505. #ifndef HAVE_THREAD_LS
  208506. wc_UnLockMutex(&sp_cache_1024_lock);
  208507. #endif /* HAVE_THREAD_LS */
  208508. if (cache->cnt < 2) {
  208509. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  208510. }
  208511. else {
  208512. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  208513. map, ct, heap);
  208514. }
  208515. }
  208516. return err;
  208517. #endif
  208518. }
  208519. #else
  208520. #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL)
  208521. /* Generate the pre-computed table of points for the base point.
  208522. *
  208523. * width = 8
  208524. * 256 entries
  208525. * 128 bits between
  208526. *
  208527. * a The base point.
  208528. * table Place to store generated point data.
  208529. * tmp Temporary data.
  208530. * heap Heap to use for allocation.
  208531. */
  208532. static int sp_1024_gen_stripe_table_32(const sp_point_1024* a,
  208533. sp_table_entry_1024* table, sp_digit* tmp, void* heap)
  208534. {
  208535. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208536. sp_point_1024* t = NULL;
  208537. #else
  208538. sp_point_1024 t[3];
  208539. #endif
  208540. sp_point_1024* s1 = NULL;
  208541. sp_point_1024* s2 = NULL;
  208542. int i;
  208543. int j;
  208544. int err = MP_OKAY;
  208545. (void)heap;
  208546. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208547. t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 3, heap,
  208548. DYNAMIC_TYPE_ECC);
  208549. if (t == NULL)
  208550. err = MEMORY_E;
  208551. #endif
  208552. if (err == MP_OKAY) {
  208553. s1 = t + 1;
  208554. s2 = t + 2;
  208555. err = sp_1024_mod_mul_norm_32(t->x, a->x, p1024_mod);
  208556. }
  208557. if (err == MP_OKAY) {
  208558. err = sp_1024_mod_mul_norm_32(t->y, a->y, p1024_mod);
  208559. }
  208560. if (err == MP_OKAY) {
  208561. err = sp_1024_mod_mul_norm_32(t->z, a->z, p1024_mod);
  208562. }
  208563. if (err == MP_OKAY) {
  208564. t->infinity = 0;
  208565. sp_1024_proj_to_affine_32(t, tmp);
  208566. XMEMCPY(s1->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208567. s1->infinity = 0;
  208568. XMEMCPY(s2->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208569. s2->infinity = 0;
  208570. /* table[0] = {0, 0, infinity} */
  208571. XMEMSET(&table[0], 0, sizeof(sp_table_entry_1024));
  208572. /* table[1] = Affine version of 'a' in Montgomery form */
  208573. XMEMCPY(table[1].x, t->x, sizeof(table->x));
  208574. XMEMCPY(table[1].y, t->y, sizeof(table->y));
  208575. for (i=1; i<8; i++) {
  208576. sp_1024_proj_point_dbl_n_32(t, 128, tmp);
  208577. sp_1024_proj_to_affine_32(t, tmp);
  208578. XMEMCPY(table[1<<i].x, t->x, sizeof(table->x));
  208579. XMEMCPY(table[1<<i].y, t->y, sizeof(table->y));
  208580. }
  208581. for (i=1; i<8; i++) {
  208582. XMEMCPY(s1->x, table[1<<i].x, sizeof(table->x));
  208583. XMEMCPY(s1->y, table[1<<i].y, sizeof(table->y));
  208584. for (j=(1<<i)+1; j<(1<<(i+1)); j++) {
  208585. XMEMCPY(s2->x, table[j-(1<<i)].x, sizeof(table->x));
  208586. XMEMCPY(s2->y, table[j-(1<<i)].y, sizeof(table->y));
  208587. sp_1024_proj_point_add_qz1_32(t, s1, s2, tmp);
  208588. sp_1024_proj_to_affine_32(t, tmp);
  208589. XMEMCPY(table[j].x, t->x, sizeof(table->x));
  208590. XMEMCPY(table[j].y, t->y, sizeof(table->y));
  208591. }
  208592. }
  208593. }
  208594. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208595. if (t != NULL)
  208596. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208597. #endif
  208598. return err;
  208599. }
  208600. #endif /* FP_ECC || !WOLFSSL_SP_SMALL */
  208601. /* Multiply the point by the scalar and return the result.
  208602. * If map is true then convert result to affine coordinates.
  208603. *
  208604. * Stripe implementation.
  208605. * Pre-generated: 2^0, 2^128, ...
  208606. * Pre-generated: products of all combinations of above.
  208607. * 8 doubles and adds (with qz=1)
  208608. *
  208609. * r Resulting point.
  208610. * k Scalar to multiply by.
  208611. * table Pre-computed table.
  208612. * map Indicates whether to convert result to affine.
  208613. * ct Constant time required.
  208614. * heap Heap to use for allocation.
  208615. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208616. */
  208617. static int sp_1024_ecc_mulmod_stripe_32(sp_point_1024* r, const sp_point_1024* g,
  208618. const sp_table_entry_1024* table, const sp_digit* k, int map,
  208619. int ct, void* heap)
  208620. {
  208621. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208622. sp_point_1024* rt = NULL;
  208623. sp_digit* t = NULL;
  208624. #else
  208625. sp_point_1024 rt[2];
  208626. sp_digit t[2 * 32 * 6];
  208627. #endif
  208628. sp_point_1024* p = NULL;
  208629. int i;
  208630. int j;
  208631. int y;
  208632. int x;
  208633. int err = MP_OKAY;
  208634. (void)g;
  208635. /* Constant time used for cache attack resistance implementation. */
  208636. (void)ct;
  208637. (void)heap;
  208638. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208639. rt = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  208640. DYNAMIC_TYPE_ECC);
  208641. if (rt == NULL)
  208642. err = MEMORY_E;
  208643. if (err == MP_OKAY) {
  208644. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 32 * 6, heap,
  208645. DYNAMIC_TYPE_ECC);
  208646. if (t == NULL)
  208647. err = MEMORY_E;
  208648. }
  208649. #endif
  208650. if (err == MP_OKAY) {
  208651. p = rt + 1;
  208652. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208653. XMEMCPY(rt->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  208654. y = 0;
  208655. x = 127;
  208656. for (j=0; j<8; j++) {
  208657. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  208658. x += 128;
  208659. }
  208660. XMEMCPY(rt->x, table[y].x, sizeof(table[y].x));
  208661. XMEMCPY(rt->y, table[y].y, sizeof(table[y].y));
  208662. rt->infinity = !y;
  208663. for (i=126; i>=0; i--) {
  208664. y = 0;
  208665. x = i;
  208666. for (j=0; j<8; j++) {
  208667. y |= (int)(((k[x / 32] >> (x % 32)) & 1) << j);
  208668. x += 128;
  208669. }
  208670. sp_1024_proj_point_dbl_32(rt, rt, t);
  208671. XMEMCPY(p->x, table[y].x, sizeof(table[y].x));
  208672. XMEMCPY(p->y, table[y].y, sizeof(table[y].y));
  208673. p->infinity = !y;
  208674. sp_1024_proj_point_add_qz1_32(rt, rt, p, t);
  208675. }
  208676. if (map != 0) {
  208677. sp_1024_map_32(r, rt, t);
  208678. }
  208679. else {
  208680. XMEMCPY(r, rt, sizeof(sp_point_1024));
  208681. }
  208682. }
  208683. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208684. if (t != NULL)
  208685. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  208686. if (rt != NULL)
  208687. XFREE(rt, heap, DYNAMIC_TYPE_ECC);
  208688. #endif
  208689. return err;
  208690. }
  208691. #ifdef FP_ECC
  208692. #ifndef FP_ENTRIES
  208693. #define FP_ENTRIES 16
  208694. #endif
  208695. /* Cache entry - holds precomputation tables for a point. */
  208696. typedef struct sp_cache_1024_t {
  208697. /* X ordinate of point that table was generated from. */
  208698. sp_digit x[32];
  208699. /* Y ordinate of point that table was generated from. */
  208700. sp_digit y[32];
  208701. /* Precomputation table for point. */
  208702. sp_table_entry_1024 table[256];
  208703. /* Count of entries in table. */
  208704. uint32_t cnt;
  208705. /* Point and table set in entry. */
  208706. int set;
  208707. } sp_cache_1024_t;
  208708. /* Cache of tables. */
  208709. static THREAD_LS_T sp_cache_1024_t sp_cache_1024[FP_ENTRIES];
  208710. /* Index of last entry in cache. */
  208711. static THREAD_LS_T int sp_cache_1024_last = -1;
  208712. /* Cache has been initialized. */
  208713. static THREAD_LS_T int sp_cache_1024_inited = 0;
  208714. #ifndef HAVE_THREAD_LS
  208715. static volatile int initCacheMutex_1024 = 0;
  208716. static wolfSSL_Mutex sp_cache_1024_lock;
  208717. #endif
  208718. /* Get the cache entry for the point.
  208719. *
  208720. * g [in] Point scalar multipling.
  208721. * cache [out] Cache table to use.
  208722. */
  208723. static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache)
  208724. {
  208725. int i;
  208726. int j;
  208727. uint32_t least;
  208728. if (sp_cache_1024_inited == 0) {
  208729. for (i=0; i<FP_ENTRIES; i++) {
  208730. sp_cache_1024[i].set = 0;
  208731. }
  208732. sp_cache_1024_inited = 1;
  208733. }
  208734. /* Compare point with those in cache. */
  208735. for (i=0; i<FP_ENTRIES; i++) {
  208736. if (!sp_cache_1024[i].set)
  208737. continue;
  208738. if (sp_1024_cmp_equal_32(g->x, sp_cache_1024[i].x) &
  208739. sp_1024_cmp_equal_32(g->y, sp_cache_1024[i].y)) {
  208740. sp_cache_1024[i].cnt++;
  208741. break;
  208742. }
  208743. }
  208744. /* No match. */
  208745. if (i == FP_ENTRIES) {
  208746. /* Find empty entry. */
  208747. i = (sp_cache_1024_last + 1) % FP_ENTRIES;
  208748. for (; i != sp_cache_1024_last; i=(i+1)%FP_ENTRIES) {
  208749. if (!sp_cache_1024[i].set) {
  208750. break;
  208751. }
  208752. }
  208753. /* Evict least used. */
  208754. if (i == sp_cache_1024_last) {
  208755. least = sp_cache_1024[0].cnt;
  208756. for (j=1; j<FP_ENTRIES; j++) {
  208757. if (sp_cache_1024[j].cnt < least) {
  208758. i = j;
  208759. least = sp_cache_1024[i].cnt;
  208760. }
  208761. }
  208762. }
  208763. XMEMCPY(sp_cache_1024[i].x, g->x, sizeof(sp_cache_1024[i].x));
  208764. XMEMCPY(sp_cache_1024[i].y, g->y, sizeof(sp_cache_1024[i].y));
  208765. sp_cache_1024[i].set = 1;
  208766. sp_cache_1024[i].cnt = 1;
  208767. }
  208768. *cache = &sp_cache_1024[i];
  208769. sp_cache_1024_last = i;
  208770. }
  208771. #endif /* FP_ECC */
  208772. /* Multiply the base point of P1024 by the scalar and return the result.
  208773. * If map is true then convert result to affine coordinates.
  208774. *
  208775. * r Resulting point.
  208776. * g Point to multiply.
  208777. * k Scalar to multiply by.
  208778. * map Indicates whether to convert result to affine.
  208779. * ct Constant time required.
  208780. * heap Heap to use for allocation.
  208781. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208782. */
  208783. static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k,
  208784. int map, int ct, void* heap)
  208785. {
  208786. #ifndef FP_ECC
  208787. return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  208788. #else
  208789. sp_digit tmp[2 * 32 * 6];
  208790. sp_cache_1024_t* cache;
  208791. int err = MP_OKAY;
  208792. #ifndef HAVE_THREAD_LS
  208793. if (initCacheMutex_1024 == 0) {
  208794. wc_InitMutex(&sp_cache_1024_lock);
  208795. initCacheMutex_1024 = 1;
  208796. }
  208797. if (wc_LockMutex(&sp_cache_1024_lock) != 0)
  208798. err = BAD_MUTEX_E;
  208799. #endif /* HAVE_THREAD_LS */
  208800. if (err == MP_OKAY) {
  208801. sp_ecc_get_cache_1024(g, &cache);
  208802. if (cache->cnt == 2)
  208803. sp_1024_gen_stripe_table_32(g, cache->table, tmp, heap);
  208804. #ifndef HAVE_THREAD_LS
  208805. wc_UnLockMutex(&sp_cache_1024_lock);
  208806. #endif /* HAVE_THREAD_LS */
  208807. if (cache->cnt < 2) {
  208808. err = sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap);
  208809. }
  208810. else {
  208811. err = sp_1024_ecc_mulmod_stripe_32(r, g, cache->table, k,
  208812. map, ct, heap);
  208813. }
  208814. }
  208815. return err;
  208816. #endif
  208817. }
  208818. #endif /* WOLFSSL_SP_SMALL */
  208819. /* Multiply the point by the scalar and return the result.
  208820. * If map is true then convert result to affine coordinates.
  208821. *
  208822. * km Scalar to multiply by.
  208823. * p Point to multiply.
  208824. * r Resulting point.
  208825. * map Indicates whether to convert result to affine.
  208826. * heap Heap to use for allocation.
  208827. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  208828. */
  208829. int sp_ecc_mulmod_1024(const mp_int* km, const ecc_point* gm, ecc_point* r,
  208830. int map, void* heap)
  208831. {
  208832. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208833. sp_point_1024* point = NULL;
  208834. sp_digit* k = NULL;
  208835. #else
  208836. sp_point_1024 point[1];
  208837. sp_digit k[32];
  208838. #endif
  208839. int err = MP_OKAY;
  208840. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208841. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  208842. DYNAMIC_TYPE_ECC);
  208843. if (point == NULL)
  208844. err = MEMORY_E;
  208845. if (err == MP_OKAY) {
  208846. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  208847. DYNAMIC_TYPE_ECC);
  208848. if (k == NULL)
  208849. err = MEMORY_E;
  208850. }
  208851. #endif
  208852. if (err == MP_OKAY) {
  208853. sp_1024_from_mp(k, 32, km);
  208854. sp_1024_point_from_ecc_point_32(point, gm);
  208855. err = sp_1024_ecc_mulmod_32(point, point, k, map, 1, heap);
  208856. }
  208857. if (err == MP_OKAY) {
  208858. err = sp_1024_point_to_ecc_point_32(point, r);
  208859. }
  208860. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  208861. if (k != NULL)
  208862. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  208863. if (point != NULL)
  208864. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  208865. #endif
  208866. return err;
  208867. }
  208868. #ifdef WOLFSSL_SP_SMALL
  208869. /* Striping precomputation table.
  208870. * 4 points combined into a table of 16 points.
  208871. * Distance of 256 between points.
  208872. */
  208873. static const sp_table_entry_1024 p1024_table[16] = {
  208874. /* 0 */
  208875. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  208876. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  208877. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  208878. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  208879. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  208880. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  208881. /* 1 */
  208882. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  208883. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  208884. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  208885. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  208886. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  208887. 0x1c49f80b,0x8dfff96a },
  208888. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  208889. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  208890. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  208891. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  208892. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  208893. 0xde3c01f3,0x2aa1207b } },
  208894. /* 2 */
  208895. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  208896. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  208897. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  208898. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  208899. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  208900. 0xdf9398a4,0x40247985 },
  208901. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  208902. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  208903. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  208904. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  208905. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  208906. 0xc8b79d80,0x1a6fd1e6 } },
  208907. /* 3 */
  208908. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  208909. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  208910. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  208911. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  208912. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  208913. 0x15614750,0x29b7d4dc },
  208914. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  208915. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  208916. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  208917. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  208918. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  208919. 0x5382497e,0x5d092802 } },
  208920. /* 4 */
  208921. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  208922. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  208923. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  208924. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  208925. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  208926. 0x0f1fa7d7,0x2ab3bd47 },
  208927. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  208928. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  208929. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  208930. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  208931. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  208932. 0x4c27d229,0x93a4b416 } },
  208933. /* 5 */
  208934. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  208935. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  208936. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  208937. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  208938. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  208939. 0x32ee7763,0x342ce0d7 },
  208940. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  208941. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  208942. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  208943. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  208944. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  208945. 0xe156fd20,0x455f4af3 } },
  208946. /* 6 */
  208947. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  208948. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  208949. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  208950. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  208951. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  208952. 0x5c37c334,0x65713c29 },
  208953. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  208954. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  208955. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  208956. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  208957. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  208958. 0x3bae3c38,0x6b0e996c } },
  208959. /* 7 */
  208960. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  208961. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  208962. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  208963. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  208964. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  208965. 0x678223f8,0x4022a205 },
  208966. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  208967. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  208968. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  208969. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  208970. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  208971. 0x24a6a956,0x312179cb } },
  208972. /* 8 */
  208973. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  208974. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  208975. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  208976. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  208977. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  208978. 0x04ecf056,0x325d2796 },
  208979. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  208980. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  208981. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  208982. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  208983. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  208984. 0xe32a79d3,0x19d48546 } },
  208985. /* 9 */
  208986. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  208987. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  208988. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  208989. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  208990. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  208991. 0xb4e453b0,0x1b3ace6c },
  208992. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  208993. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  208994. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  208995. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  208996. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  208997. 0x192f0a14,0x538ec33e } },
  208998. /* 10 */
  208999. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  209000. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  209001. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  209002. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  209003. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  209004. 0xb6f8aa25,0x13cbee76 },
  209005. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  209006. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  209007. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  209008. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  209009. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  209010. 0xe02e8967,0x4e0a1ada } },
  209011. /* 11 */
  209012. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  209013. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  209014. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  209015. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  209016. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  209017. 0x9f99c999,0x733e30d9 },
  209018. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  209019. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  209020. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  209021. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  209022. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  209023. 0xb79a5c0c,0x56facb39 } },
  209024. /* 12 */
  209025. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  209026. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  209027. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  209028. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  209029. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  209030. 0xf18c2b91,0x57ea2b4b },
  209031. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  209032. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  209033. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  209034. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  209035. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  209036. 0xea7935c9,0x60480b46 } },
  209037. /* 13 */
  209038. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  209039. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  209040. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  209041. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  209042. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  209043. 0x9a8f88cc,0x0774a0d3 },
  209044. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  209045. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  209046. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  209047. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  209048. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  209049. 0x2432014b,0x08151954 } },
  209050. /* 14 */
  209051. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  209052. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  209053. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  209054. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  209055. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  209056. 0xf0860497,0x1fe09f94 },
  209057. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  209058. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  209059. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  209060. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  209061. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  209062. 0xdb62526a,0x4de95786 } },
  209063. /* 15 */
  209064. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  209065. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  209066. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  209067. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  209068. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  209069. 0xe636980c,0x1c94418b },
  209070. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  209071. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  209072. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  209073. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  209074. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  209075. 0xb55235ba,0x611bfbb2 } },
  209076. };
  209077. /* Multiply the base point of P1024 by the scalar and return the result.
  209078. * If map is true then convert result to affine coordinates.
  209079. *
  209080. * Stripe implementation.
  209081. * Pre-generated: 2^0, 2^256, ...
  209082. * Pre-generated: products of all combinations of above.
  209083. * 4 doubles and adds (with qz=1)
  209084. *
  209085. * r Resulting point.
  209086. * k Scalar to multiply by.
  209087. * map Indicates whether to convert result to affine.
  209088. * ct Constant time required.
  209089. * heap Heap to use for allocation.
  209090. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  209091. */
  209092. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  209093. int map, int ct, void* heap)
  209094. {
  209095. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  209096. k, map, ct, heap);
  209097. }
  209098. #else
  209099. /* Striping precomputation table.
  209100. * 8 points combined into a table of 256 points.
  209101. * Distance of 128 between points.
  209102. */
  209103. static const sp_table_entry_1024 p1024_table[256] = {
  209104. /* 0 */
  209105. { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209106. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209107. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
  209108. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209109. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209110. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
  209111. /* 1 */
  209112. { { 0xe0162bc2,0xbf9c7ec6,0x10a89289,0xddecc6e3,0x9e499d81,0x5d599df0,
  209113. 0x6d358218,0x9a96ea28,0x70c5f8db,0x01aec7d3,0x8cf5d066,0xe72e4995,
  209114. 0x3e91d7f8,0xc2e7297d,0xda9f2f5a,0x8621db92,0x5a5679ed,0x4b26c867,
  209115. 0x2c56aac1,0x233385df,0xc6a13f99,0xb88e74d4,0xffa8ec11,0x1214b173,
  209116. 0x1f3f9fef,0xa0386a27,0xc0e7b44e,0xbd9b1b4e,0xeecd3496,0xafe528dc,
  209117. 0x1c49f80b,0x8dfff96a },
  209118. { 0xc03c0c83,0xb4a4753a,0xabcdcd75,0x68e69d18,0xf775b649,0xe3839b88,
  209119. 0xbf58f352,0x803f949a,0xbd0bc15c,0x5f702679,0x8ff298c2,0x85bf5d16,
  209120. 0xc6c7976e,0x3f6ebd98,0x45e3e1b4,0x20618af4,0x54e64093,0x67d5598e,
  209121. 0x504fed9e,0xb047283b,0x70d87517,0x450cabfd,0x3f5addbe,0x47d628bf,
  209122. 0x78cb4cca,0x0037ef30,0x6b1c4908,0x4e148d3c,0x4fcfd837,0xe256d329,
  209123. 0xde3c01f3,0x2aa1207b } },
  209124. /* 2 */
  209125. { { 0x01900955,0xa95b6dae,0xceb4656d,0xa5dc9cc1,0xe72fe95b,0x50c78907,
  209126. 0xa040c334,0xa1ae5447,0x7952ea6e,0x91191370,0x6d097305,0x54ff7343,
  209127. 0xbda4d10f,0xa4db0074,0x91644070,0xfd5306f1,0x8b24522c,0x14b9fe73,
  209128. 0x7849f762,0x1468dad6,0xb0dcd2e4,0x87b29a18,0x5e1ad492,0xadd7f1a1,
  209129. 0xdbba2a1a,0x9ac63a81,0x81223379,0x01379c5b,0xb0e53bc8,0xf402b2f0,
  209130. 0x0bf13b61,0x8c3eb27f },
  209131. { 0xe513696f,0x9a4ad3e1,0x18c81ffa,0x0350ba5c,0x3c033d13,0x1e2fc136,
  209132. 0x17a531bc,0x53da6e71,0x1aed610d,0x42ec6490,0xe99ff567,0xd33e8df7,
  209133. 0x3deed12a,0xe4aad73e,0x180f4deb,0xd983b465,0x502f30b4,0x99365269,
  209134. 0xa8918d7f,0x7e2799ab,0x700fc79a,0x0ffe84b6,0x40bfd8c2,0x7b4400d6,
  209135. 0x5d2641bd,0xc3a21d21,0xc32621cb,0x79839442,0xb1401e83,0xace6500b,
  209136. 0x251c4310,0x7bf4163e } },
  209137. /* 3 */
  209138. { { 0xe3fd589e,0x1c174f88,0xdf974a03,0xdb501790,0x3e70549f,0xd09623e3,
  209139. 0x15924f34,0x8d091eff,0xf9b65ac5,0xeef79cad,0x3f69c2cf,0xd2cc4262,
  209140. 0x52cd82bc,0x817d9032,0xa5f1dddd,0xacf4f4d9,0x5011b6bd,0xd0612635,
  209141. 0x2ed140c9,0x9f74490d,0x4db686d2,0x64092e8c,0x776b0fcc,0x225eef16,
  209142. 0xdf16aeb6,0x0e8c01e9,0x84bbd82a,0x62836741,0x8956e337,0x757574e2,
  209143. 0x705a7f07,0x9871edc6 },
  209144. { 0x776535f7,0xbd0b76d5,0x2635b3b8,0x5214d602,0x9d216f64,0xc0c25ad9,
  209145. 0x5515bf75,0xfd4df3a7,0x5e9f1675,0x24a625bc,0x406873e7,0x3c35efb7,
  209146. 0xbb2e5c4a,0xef5c9a33,0x806b198a,0xa971b35e,0xa3c690ed,0x9f5c0ca5,
  209147. 0x8e1e2341,0xa8d5dd89,0x955ad9e4,0x4cecbcce,0x248d3416,0x2ecf4407,
  209148. 0x45c0af6e,0x1abb3811,0x1c780fff,0x3f4bee82,0xc272ed57,0xd14df768,
  209149. 0x371637ad,0x397ed10a } },
  209150. /* 4 */
  209151. { { 0x755c2a27,0xcf3e0bb2,0x59585c44,0xd38e42f9,0x19285e60,0x46b13e0f,
  209152. 0x76273d0f,0xc3ecd0c0,0x193c569a,0x7800f085,0x4351818a,0xf04e74ab,
  209153. 0x8496363b,0x9258aa38,0xb8c894fe,0x8456617c,0x2af969a0,0x8bc62aaa,
  209154. 0x5a4668d9,0x66c2280b,0xa992f4fa,0xbc9df58e,0x3f401e99,0x5db0b7d9,
  209155. 0xc4c38c0e,0xe0614fe1,0x2ccdf6b3,0xd531151c,0xe143b618,0x1c7575ec,
  209156. 0xdf9398a4,0x40247985 },
  209157. { 0x8f055746,0xfba25178,0x0ab1e6e0,0xc5ba0040,0xac292697,0xe1b194fb,
  209158. 0x5b4f4740,0x77152119,0x9bb7ba54,0x250091d0,0xb9a139a4,0x7a674861,
  209159. 0xf353aa7e,0xba8413b3,0x2443ceee,0xafe77192,0x3847bbd0,0x14468d36,
  209160. 0x3da4942d,0x61f79ff6,0xd425b456,0x1563a1c1,0x75ff4630,0x3c270fcd,
  209161. 0xeb2802c9,0x42072090,0xc85c7004,0x68f0cdcb,0xfa032e74,0xca4372fb,
  209162. 0xc8b79d80,0x1a6fd1e6 } },
  209163. /* 5 */
  209164. { { 0x8d5116a3,0x967a901a,0xb2f5f47f,0x0b844394,0x60ebaf3b,0xe39ad452,
  209165. 0x60ccfc0c,0x1e1be617,0xcc3f53f2,0xac07e3d2,0x1ed11bb6,0xdd838e0e,
  209166. 0x1c15b0c2,0x45475307,0x920fe5b8,0x70dd4748,0xe471896d,0x1a20be2d,
  209167. 0x59276c7c,0x3c3fad8a,0xc886ee07,0x026a1cc3,0x6e831ac4,0x9fdb6f37,
  209168. 0xac501d65,0x26a35d1a,0x40da8574,0x0ae98905,0xabd734e5,0x65dde0a4,
  209169. 0x15614750,0x29b7d4dc },
  209170. { 0xcbf4e20b,0x44b3c2cb,0x58cc44c5,0x1c3f548f,0x5b0cac1f,0x39809b54,
  209171. 0x00f80621,0x0c0f02b5,0x066905e0,0xe612b890,0x8350188c,0x8f158ed7,
  209172. 0x3f5576b2,0xc01dc458,0xa45492e0,0x29803272,0x0ff92443,0x77a5623a,
  209173. 0x29d0dc41,0xd12a2b00,0x2780e87a,0xb4125459,0x0d53f272,0x1ebcf903,
  209174. 0x24301e8d,0xbae6ea40,0xa37d0798,0x1e5f3f2f,0x22b4126c,0x9342c310,
  209175. 0x5382497e,0x5d092802 } },
  209176. /* 6 */
  209177. { { 0xff2f780d,0x583a2b7e,0xd7d76b1d,0x34d26820,0x86f74aec,0xe3c32847,
  209178. 0x10823feb,0x0fd42212,0xfb5e7bf4,0x227e417e,0xa568f8cd,0x510d49b6,
  209179. 0x1781bbec,0x53bce7d6,0x2f3718b7,0x9cfe3f22,0xd9de6c1f,0x7f44e89f,
  209180. 0x3fac9b55,0xf1cc553f,0xe6f300bc,0x9d2d0846,0x9f0ae6b1,0x976c82a2,
  209181. 0x24b8bbe0,0xe63dbf5e,0x973a5aa7,0x4cac7f45,0x84dd33c7,0xc6eb6237,
  209182. 0x142fee5d,0x0a26e434 },
  209183. { 0xacaa9a08,0x8081339f,0x5246ece1,0x40f31105,0x61393747,0x892c8170,
  209184. 0x242f02e1,0x8d8d4103,0x3b5de98a,0x482bfd20,0x5abbe952,0x89ef946b,
  209185. 0x37698249,0xb8d218b9,0x66617c7a,0xd5268e89,0x8b7d2b91,0x962e7551,
  209186. 0xfe8d67c3,0x2c5c7973,0x2b017c51,0x42e3150a,0xc1a29469,0x6f4e5ebc,
  209187. 0x531c7083,0xa39910ce,0xb77b9e50,0xaf4f6eb4,0xda120ad0,0x68cbb175,
  209188. 0xb92636ec,0x19497c61 } },
  209189. /* 7 */
  209190. { { 0x417659a8,0x6920b0c6,0x92cb28ff,0xc77ab9c7,0xb687797f,0x55b67180,
  209191. 0xe7759363,0x4caf58c1,0x5561b186,0x5155bdb6,0x780f4946,0x2e64e355,
  209192. 0x229a8b20,0xeb0ac9b7,0x2571bd60,0x88594d78,0xe3fa78f9,0x5dcc0939,
  209193. 0x2ac2d379,0x7b8b4830,0xb90f1444,0x505fbf60,0x3ce4b3c1,0xac610e81,
  209194. 0xd59b5c18,0x39a4f27a,0x7cea0222,0x5fa33973,0x8dff1c7b,0xe578730b,
  209195. 0x517bf7a6,0x96b91b8b },
  209196. { 0x9aac087c,0xc1a991f4,0x6cfdb28d,0xce62f74e,0x5f7600d6,0x08d6ff9a,
  209197. 0xf917f9c9,0xd781cd04,0x3de52dbf,0x7796f5f6,0x2ed72180,0xe7db64e0,
  209198. 0x6fa4137d,0x0f0876f6,0x3ca1f716,0x3271ee64,0x7c4ab8a3,0xcb9b2058,
  209199. 0x39481047,0xcba17107,0x598c5c37,0xdf9a190d,0x6f20e125,0x0cb6e72a,
  209200. 0xf4f2902d,0xa3142204,0x7ce2dcfb,0x42d28cb9,0xa3d3c351,0xdf261b8a,
  209201. 0xcffc249d,0x73f3d315 } },
  209202. /* 8 */
  209203. { { 0xe6fd3673,0x5d86855b,0x9d214b7b,0x309b70af,0xdcc46cd3,0x8d332f90,
  209204. 0x595510de,0xe553c015,0x38c1251c,0x5746a096,0x85cc1bc9,0xcd7cea5b,
  209205. 0x002eba8f,0x4ffa1468,0x22fcd77c,0x10a3cb70,0xc4ea05e3,0xb6999dfb,
  209206. 0x4efa756e,0x3375a0d0,0xdced5fd8,0x4d90279e,0x251fd56e,0x48192403,
  209207. 0x82a4c5f1,0xe87633a4,0x1b34105b,0x3170d130,0x7247e578,0x93998b0f,
  209208. 0x436ba1fa,0x88934f64 },
  209209. { 0x4713eabc,0xf09f43b0,0xaccdc517,0x4ca7dd91,0xef13ca7c,0x27daa63b,
  209210. 0x2588184b,0x8b2e5a7a,0xd95dc269,0x0a8cb612,0xe1f2f14c,0x346975a2,
  209211. 0xe172935c,0x1f29b8ed,0xd40bc1e3,0xc3cbfd6e,0x132623da,0xd3f46b3f,
  209212. 0xfb0b7681,0xc115be6d,0x56da4344,0x5e31c345,0xa8e43d98,0xa7c63f18,
  209213. 0x4bddb4ea,0x55cb2083,0x4a54f58c,0xb16a0c38,0x46fd69d9,0x74eacca2,
  209214. 0x153548e1,0x0d1898bb } },
  209215. /* 9 */
  209216. { { 0xe35ef043,0x4ea73461,0x3496b564,0x107b67d9,0xd0f83a3c,0xd62c173b,
  209217. 0x51d29c35,0xfad4b038,0x71b1c1a4,0x3f42882a,0x54b43b9e,0x5d2bcf66,
  209218. 0x2abdf543,0xc77b15aa,0xdabe3dc1,0x5cb38a80,0xa481673b,0x15fda0ae,
  209219. 0xe7b90ebe,0x86996b4d,0x2bc8f3d8,0x84f87e25,0x37c4e424,0xaded03d6,
  209220. 0xd7a7afd8,0xe5ede666,0xa1ccb93a,0x80dd95a2,0x46fba391,0xa55cfd25,
  209221. 0x46f82e60,0x2bdab1dc },
  209222. { 0xfa6fed61,0x7a4de22b,0xcc8dd94e,0xca458aa5,0x071222f5,0x3e372df1,
  209223. 0xe5aff377,0x06a4b44f,0x4a738e6d,0xbc2d0ba7,0x5f31f136,0x1a470e1d,
  209224. 0xe102a911,0x77ff933a,0x310c7885,0x8b380a50,0x783fc5ac,0x9f3c0228,
  209225. 0x44725d06,0xec668925,0x5ac84221,0x878f0e16,0xcfda6e8a,0x9a3af1af,
  209226. 0x78cd2aba,0x0183ed37,0x826d0eae,0x32cdbd60,0xcbee6415,0xb3234661,
  209227. 0xb9c10120,0x353eb892 } },
  209228. /* 10 */
  209229. { { 0x10b5521e,0xc8fdcad6,0x52e702f0,0x1a11b440,0x8ffda49c,0x6302680d,
  209230. 0xcbf36bad,0xcdb9654a,0x4c10a2d7,0x7b58ce11,0xe630e7e0,0x1e5d1f7d,
  209231. 0x6760a813,0x8cbe3d7d,0x6480d77f,0xeb35866b,0x7f036219,0x58728cf3,
  209232. 0x42a8a757,0xdd5865ed,0x906a2870,0x283f1f1d,0xa51f906b,0x79e23fa4,
  209233. 0x543b20a8,0xf2ac6e83,0xb81e7754,0x4f0b6379,0x840016ee,0x57fbc0d4,
  209234. 0xe621b67d,0x8da20771 },
  209235. { 0xecce65ec,0x3c855004,0xb748185e,0x76d10d1f,0x78797ad2,0x64be7bca,
  209236. 0x77e54aad,0x43444db0,0xbe0df0ff,0x17b6b0c9,0x055086a4,0x8fc4256c,
  209237. 0xfd74d5a3,0xf952c43b,0x01c4edb8,0x501e005a,0x4a57e328,0xd5172dfc,
  209238. 0x535d6ee3,0xdb40ce4e,0x0c650918,0xbaef1e5c,0x857561fc,0xe85145e7,
  209239. 0x34a224c6,0xe468536a,0x0ec0e0a2,0x69a8e227,0x242b03fc,0xb3f52247,
  209240. 0xc3bebd5f,0x862f55e2 } },
  209241. /* 11 */
  209242. { { 0x226049fe,0x2d6a390f,0xdcbbc9fb,0xcc92a578,0x97634fb7,0xa52feca4,
  209243. 0x3dea5893,0x2b340cb6,0x2a49e916,0xa39f338a,0x949e41f3,0x26b2df3d,
  209244. 0x065a7e40,0xc71c7cdb,0x468281a2,0x4a9b84a0,0x731eeeca,0x63eeb503,
  209245. 0x76cbb725,0xe6d09134,0xb94a678c,0x0cf979a9,0x808fd9f1,0xb44d8c3b,
  209246. 0xe0afc5b9,0xe60da613,0x3ea5be69,0x52dce7de,0xdc1ee74f,0x3a5d6864,
  209247. 0x3bc80790,0x71ab2891 },
  209248. { 0x3b5b60ad,0xcf618fc4,0x4a0c3184,0x0afb5e30,0xbc403302,0xd22381cc,
  209249. 0xdb1c0c66,0x33cf8953,0xa6112a8d,0x9c994e4d,0xd1967a86,0xd7aae2c3,
  209250. 0x5b7acd29,0xc28d5493,0x6c9a57fb,0x8075bd13,0x9c8427f9,0xc9c0373e,
  209251. 0x193225f5,0x2cbca18d,0x442c018c,0x73777d13,0xfbb3a727,0xebe5ed47,
  209252. 0x1962dc18,0x70437d49,0x2dc08806,0xf39c1e09,0x15fff35c,0x03e9c6f7,
  209253. 0x5e360a65,0x8d087bb6 } },
  209254. /* 12 */
  209255. { { 0x3fdc1844,0xbe212302,0x105eac56,0x6eca27ef,0xf168a348,0x2183a606,
  209256. 0xe1d7a4cb,0x295f807d,0x7ef5d43e,0x7246a632,0xc77025c7,0xae143205,
  209257. 0xf3484e3e,0x4bdfc7ca,0xdf52c075,0xec939895,0xd7a9cac0,0x82e655f6,
  209258. 0x8baeddb0,0x985dfe20,0x527de731,0x79c817e4,0x313de1ea,0x30ce0fbc,
  209259. 0xcc4f6cbb,0x9df95b89,0xf5bb20cd,0xf2aedf1e,0x1a8cfb01,0xfc1e0a89,
  209260. 0x63edb7ec,0x225ed34a },
  209261. { 0xbabb1a85,0x3e13154d,0x1e6a565a,0xd3d8dae7,0xab4b100f,0xd3217d56,
  209262. 0xebc78e1a,0xd44d934e,0x48e73d37,0x0215321b,0x201e43cb,0xbbc90bfa,
  209263. 0x27500905,0x3c23f1d0,0xc86691a1,0x2a2e5000,0x6065841c,0x08b2bad2,
  209264. 0x30026b60,0x15d41caf,0x5276ce61,0x1712c2f4,0x15932ffb,0x01c4c3e7,
  209265. 0x6a74caf2,0x7894e13d,0x0c0537a4,0x02d6f5df,0xc2b1c97e,0xa8fb7602,
  209266. 0xd0887c7b,0x612b60e5 } },
  209267. /* 13 */
  209268. { { 0xba245d6b,0xefd495cf,0xa2ce3ff6,0x5cf0cbb7,0xdff5feee,0x24da2ac0,
  209269. 0xcf28c6a3,0x90c914f8,0x4308a56b,0x72fdb50d,0x13d72034,0x03dbf779,
  209270. 0x822ac9e9,0xcfa5ec91,0x3aea3e81,0x0dde73c8,0x66289139,0x545ba962,
  209271. 0xca6acbd3,0xa52f648b,0x98a0683a,0xff6f276e,0xa378ed52,0x2536d3ac,
  209272. 0x885ac1d9,0x353c2c54,0x00bc84a7,0xcaff52da,0x37684167,0x3971f81c,
  209273. 0xd2d7986e,0x0f7334e1 },
  209274. { 0x6596067e,0xafbb5c83,0x38c19806,0x33e54e19,0x39cb0dcc,0x8285d967,
  209275. 0x424035f9,0x2b53f43d,0xdfef9095,0x38c531f8,0xdb0f571a,0x90fbe8e4,
  209276. 0xa39ca787,0x9a0c1ed2,0x606f2620,0x2fecc1d6,0x72b7cb4a,0x9dc890b1,
  209277. 0xccbb7868,0xc33ca6fb,0xfe73ee49,0xd1b11082,0xfcb66c48,0x590b7d17,
  209278. 0x86e14573,0x9356b0a6,0x053ead85,0x75d682c4,0xc54d30fb,0xb2ae55fa,
  209279. 0xf8aee949,0x67636a72 } },
  209280. /* 14 */
  209281. { { 0xb91d6bea,0x638063bc,0x923ecb96,0xae263a2e,0xc627aca6,0x9d7b0992,
  209282. 0x77af9e7e,0xc6ed001a,0x24aafebb,0x9214accf,0x78055a90,0xa3564b96,
  209283. 0xe027499d,0x00999b1c,0xe46a06a5,0xe413a4e1,0x2e51efe7,0xa05d13f6,
  209284. 0x9ba843be,0x35e87d34,0x3183159e,0x0a633825,0x54601923,0x6023e8ba,
  209285. 0xb7fd1cf2,0x9b107721,0xfdf2fd53,0x46b5542b,0x1c18af38,0xb314f4f8,
  209286. 0x60ac8965,0x086f9876 },
  209287. { 0x8cbb9850,0x76701954,0xa20d2c8c,0x6210b730,0x5335670c,0x4084d057,
  209288. 0x0324baea,0x3ecdc595,0xc76ee9b4,0x607fc5f2,0x440ffa64,0xf393d00f,
  209289. 0x2dc1463c,0xe0111796,0x9c7725e7,0xf00b8251,0x5bd1d186,0x35e60736,
  209290. 0x2cf72aac,0xf3d8554c,0xefa3497d,0xb4dd0fde,0xf646ad11,0xd712268c,
  209291. 0x9f7b8ead,0x07c20afb,0xfc06dfe5,0x630969d4,0x7245549a,0x76b7df1c,
  209292. 0xe61ae810,0x681f9403 } },
  209293. /* 15 */
  209294. { { 0xc9a0623b,0x7cad5163,0x67fab8d4,0xdbf82957,0x81af7c7c,0x2ccab0ec,
  209295. 0xe966d5c2,0x469e38c8,0xf0d4e41c,0x34430d52,0xa52b359c,0x426075a2,
  209296. 0x33bd0127,0x242dd3e3,0x9fed2341,0xcda3f635,0xd7d52ffa,0x4df33730,
  209297. 0x7640c3ef,0x5fff56f0,0x1bbde57c,0x4783c21c,0xeb8bb336,0xd8784a2a,
  209298. 0xead08405,0x1ec7c533,0xf9b62bd4,0x4b7f1423,0x7075d4af,0x5543145c,
  209299. 0xba60590a,0x0c9de94a },
  209300. { 0x95d5682b,0x8ed72735,0x2ec276ed,0x711c4283,0x8b36a0d2,0xd1f4aed5,
  209301. 0x8498a88f,0x62ab40c4,0x4480f451,0x58c8fc62,0xb79cffe2,0x8bc8ca4b,
  209302. 0x701a359d,0x90ab583c,0x3fd5d15d,0xaee31a73,0xc912333c,0x02a5597b,
  209303. 0xb6c3e3c2,0x1019cae4,0x29938088,0xe513042c,0xf47c8199,0x0e00283d,
  209304. 0xf2a00e92,0x90d68e58,0xa775ae3b,0x69e2df41,0x871c30b2,0xb8d2eca5,
  209305. 0xbb1de396,0x733dca0e } },
  209306. /* 16 */
  209307. { { 0x4b59213a,0xf5b495d0,0x8d70200e,0xca672039,0x2b6771c1,0x4bcb09a6,
  209308. 0x2b9eb0cb,0x26adeed4,0x8cdba212,0xeb544754,0xf08890d1,0x0e1abfcd,
  209309. 0x698e46b4,0x52509963,0x82e9c138,0xe1bff0b0,0x51099a71,0xa189e4cd,
  209310. 0xc9b91cc7,0x2360c9bc,0x137ec4be,0x9bd4d7dc,0xd1519f6e,0xd0356521,
  209311. 0xcf832503,0xbf5f6d78,0x8deea2b4,0xe4301031,0xef4c319c,0xc3132494,
  209312. 0x0f1fa7d7,0x2ab3bd47 },
  209313. { 0x922c9fbb,0x5753b680,0x0f16c6d1,0x869e7dc8,0xbac16efc,0x83445135,
  209314. 0x846d1d9b,0x4326a3b4,0xb2d62c21,0xb517fee3,0x0b292ad5,0x6905afa2,
  209315. 0x2cadac13,0x2a57131a,0xebdbca8d,0xcd904d8f,0x3f365fb2,0xdfeda86f,
  209316. 0xdc7eaa1c,0x7097b208,0xa45e77c0,0x89a35a84,0xcf5d118e,0x417a062c,
  209317. 0x1f6e99e8,0x3c0c04a8,0xba7a087d,0xc44704b0,0x3ea22ad2,0x6f8a27d1,
  209318. 0x4c27d229,0x93a4b416 } },
  209319. /* 17 */
  209320. { { 0x1f1efb7a,0xd4271bc1,0x33fccc0d,0xae4e68e6,0xb11f50a8,0x9d9bc8f1,
  209321. 0xaf076089,0x5430398f,0x443d0e03,0x45e242fb,0xf6e3d4c1,0x73ec2519,
  209322. 0xba9bad09,0xab70f790,0xf9add10f,0xde612ad5,0x14e942b4,0xb837e54e,
  209323. 0xddb8b68a,0x175a56d3,0x1ac2a408,0xe85b233c,0xf0c80f94,0xf8ff6c30,
  209324. 0x898db4f9,0x4b7f3fb7,0x45a7dcdd,0xa2c6044f,0xfe3d3895,0xf3abb2f6,
  209325. 0x32ee7763,0x342ce0d7 },
  209326. { 0xcf491b1f,0xeb261394,0x1909e395,0xdcaaeed7,0x9fe4dbea,0xdcc4055a,
  209327. 0x493d604d,0x17a6611d,0x1ce5ebef,0xba445a3a,0xe3989cb5,0xe82e2858,
  209328. 0x83f58406,0xb96f4282,0xa156cf55,0x99877b99,0x4e166a0e,0xaf906a66,
  209329. 0xb2976d13,0xcea1d353,0x36c61a01,0xefc16f27,0xb0f55d86,0xdb04c433,
  209330. 0x8eb34c01,0x3cb4b269,0x2ae60280,0x38d07f78,0x43be3ec5,0x43ac3bcb,
  209331. 0xe156fd20,0x455f4af3 } },
  209332. /* 18 */
  209333. { { 0x754ec21c,0xc057f262,0xe3a1ba38,0x3eacd4c9,0x116c1fe9,0x3a0210d1,
  209334. 0xeacc8ab6,0xe4ea4e94,0xea6f32ca,0x31c00c9a,0x86b975ce,0x5cb6239d,
  209335. 0xa14ea1e9,0x654d5d8c,0x5067fc8b,0x230d31f4,0x6355fecb,0x48bb90cb,
  209336. 0xdc172e8e,0x78f81ece,0xcb006737,0x288380a8,0xe162d012,0x19b02e01,
  209337. 0xc5af145c,0x0e087a06,0xb72dc354,0xf04dc8b7,0x8de3c066,0xf70ef214,
  209338. 0x13009fb7,0x4f148243 },
  209339. { 0x6e2055e2,0x5e004fce,0x86c32067,0x89e247ea,0x5f9daaa2,0x4ebcbd95,
  209340. 0xceb7f63b,0xd15f212f,0x863784a0,0x5ecc5c1f,0x75760251,0x53b3800b,
  209341. 0x8a6a2954,0xeb9301c3,0xa13cdd19,0x0f16ba18,0x887c2d24,0x8313d251,
  209342. 0x9a9413f6,0xf9923585,0xfe3fd7c5,0x423405e6,0x16e0ee05,0x678aeb34,
  209343. 0x3fadaab0,0x1f3be7bb,0x82884471,0x7901fa2c,0x4d662ff6,0xc950db30,
  209344. 0x3c01170b,0x74d5d2d4 } },
  209345. /* 19 */
  209346. { { 0x2b5bfe11,0xa3002dc0,0x52d321e7,0x0733410d,0x9679ba89,0x15920f65,
  209347. 0x685b236e,0x0e248c14,0x346f6040,0x8cfab594,0x40c717f0,0x9f57afb7,
  209348. 0x66044576,0x0dbab28c,0x9cdc3247,0x0fa09968,0xc230ed05,0x41e02ae2,
  209349. 0xe45bef74,0x0d961554,0xce4d7b6f,0x9688a982,0x5e62d22e,0xfadefac7,
  209350. 0xbd2cba28,0xaf1512a6,0xbe7c749f,0x78868e62,0xae9f5a6b,0x88048d81,
  209351. 0xc5857a29,0x6b1a5442 },
  209352. { 0x43242066,0x9f5ab9ad,0x2ccca2ae,0x0afef1b5,0x988edc4e,0xb1b43ec7,
  209353. 0x0341b0d5,0x0d0c00f1,0xb50aab37,0x4d68b8f7,0xf3a64a99,0x9a8e4e6f,
  209354. 0x7f1a684e,0x198338fb,0x351a0f5c,0x8bc0e748,0xdac44515,0x2cacf2cd,
  209355. 0x5e9ff76b,0xc14d3999,0x16393055,0x54a01b3f,0x888d8376,0x6ac3eea5,
  209356. 0x723277b1,0xb84d9a9a,0xe11dbbbf,0x99132691,0xabb67178,0x597717ae,
  209357. 0x8bb14ac8,0x4c213526 } },
  209358. /* 20 */
  209359. { { 0x95532833,0x2e6fe0a6,0xd626d067,0xabca228e,0x649e73bd,0x22aef3d9,
  209360. 0xf03c4c0c,0x2083a87a,0x35169b45,0xe954e75d,0x74506a89,0x577509ee,
  209361. 0x2aeacf90,0x49cb276e,0xfa409f91,0x08275d77,0xf0bbd6b9,0x61eb6f3d,
  209362. 0xe4132704,0x948202cb,0xb1c498b1,0x35f3fc21,0x361fee59,0x76c68ba8,
  209363. 0x50e051f3,0xa18cbbd9,0x318e7042,0x2384a879,0x80dd1e8b,0x292abead,
  209364. 0x5c37c334,0x65713c29 },
  209365. { 0xceb77b9a,0xdccca8e9,0x23b69469,0x2f97e727,0xa01d6b28,0xc76abee6,
  209366. 0x5abecdfe,0x3925203d,0x29290d70,0x89448082,0xb0314438,0xf9931424,
  209367. 0x7cd447c3,0x04209df1,0xc855c827,0x7c6f2059,0x56c0e069,0xd97d7862,
  209368. 0x412d94c4,0x5a9db6fe,0x994c41dd,0x19a64591,0xc89e21a3,0x12348aa1,
  209369. 0xc6a03f0e,0xd6904b50,0xa616feac,0x55c15156,0x7cc7693b,0x4e36d1b5,
  209370. 0x3bae3c38,0x6b0e996c } },
  209371. /* 21 */
  209372. { { 0xcceced00,0x32789fab,0xe5b7aa66,0x3237e71a,0x2ddebcdf,0x87b2e269,
  209373. 0xb61dad8f,0xb7245120,0xd35f803c,0xe11e5e48,0x98e50f0d,0xfb4df5d7,
  209374. 0xbcd2ab92,0x60ee68b4,0x1ce3363d,0x98ab2f5c,0x7cd42647,0x15ba39da,
  209375. 0x83f4fb3f,0x1a6572eb,0xe56f08db,0x0f77de88,0x172562c2,0x1743761e,
  209376. 0x8a58f0f4,0xbe349ff8,0x84d1d6e2,0xe04da71b,0x9e9ff3b4,0x368f0342,
  209377. 0x678223f8,0x4022a205 },
  209378. { 0x83847375,0x527bbd05,0x3f451af0,0x3ae56b62,0x4b2c7f18,0x6198f24d,
  209379. 0x4525b98d,0xee323f5b,0x0e0884b5,0xa9d8d39a,0xfb12c776,0xd005d7f6,
  209380. 0x708bc154,0xd71c483e,0x742541bc,0x8ca6fd28,0xf8397ddb,0x0af3dccd,
  209381. 0x3eccf243,0xb80d3125,0x58d81b8d,0xc743a108,0x71391f68,0x3f48eb21,
  209382. 0x33bb657f,0x493aff88,0x07e47e31,0x1d15ed66,0xe08279f6,0x10159b11,
  209383. 0x24a6a956,0x312179cb } },
  209384. /* 22 */
  209385. { { 0x07615ac2,0xa94cc3ca,0x121ad581,0x85865e64,0xa7986b79,0xae47616f,
  209386. 0x9d5e0f1d,0x395a40eb,0x3d9457ea,0xa9143264,0xfa2865d9,0x8de6d6a3,
  209387. 0x1014ae8c,0x0771db96,0x976a87cb,0x77a7cce6,0x143a0f60,0xa7de42e1,
  209388. 0xd993d934,0xe203cc09,0x98ec4c3d,0x92018693,0x3a25df4b,0xd77546d8,
  209389. 0x62b02d6b,0x0ad9eb47,0xd05a7189,0xfaaaf208,0x431221bb,0x5238181f,
  209390. 0x733511ea,0x417d6c78 },
  209391. { 0x0e91e9a8,0x3cbd81b7,0xc370d6b3,0x73340418,0x8eaa2373,0x825db10a,
  209392. 0x6c7d6756,0x8f2b09e4,0x94c33ded,0xe288ee9b,0x1695e3fb,0xcd8426bb,
  209393. 0xdce9e888,0xa6176c86,0x6165e362,0x3f4c8922,0x6063fb09,0x514e411f,
  209394. 0xc8f9e04c,0x6907ac20,0xdfd2ad61,0xcef7469c,0x8452199a,0xba30bae4,
  209395. 0x12ac3462,0x30681293,0xc92d482d,0x011be873,0xe8330995,0xff4cbf89,
  209396. 0xd1470a0a,0x02189d52 } },
  209397. /* 23 */
  209398. { { 0x92599c69,0x73e419dd,0x7fec32ca,0x5b94221b,0x09bbfbfd,0xb2bf9bd2,
  209399. 0x63ed895b,0x61ea97a4,0x3f486f79,0x6609146b,0xfd141a39,0xbd1c7a05,
  209400. 0x83d64135,0xc79ec8cf,0x9883507b,0x7f8fd42f,0x17b3d027,0xafcb53b7,
  209401. 0x67ca5a21,0x86658dcd,0xcd149786,0xa6a6c0ac,0x34b95067,0x16f3d70e,
  209402. 0xdf44958c,0x371208e3,0xec280212,0xd2dd64e6,0x30782c71,0x33b2c4ab,
  209403. 0x521176fa,0x7bbf8abd },
  209404. { 0xa78b981a,0xbe9e4aaf,0x304ec828,0x788b4e36,0x3959dea3,0x0c45cf39,
  209405. 0x240b39c7,0x70a9bdd3,0x28383b7d,0x499cd7dd,0x307a1026,0x30690b2e,
  209406. 0xee92f1b3,0x2262d598,0xb4725a48,0xc62d77de,0x7bc3aa0e,0xa16f25bc,
  209407. 0xd15ef7fa,0x62dd8b65,0x0b96d68f,0xd979221d,0xa00f1906,0xb92885c3,
  209408. 0xeb74c740,0xfa476b9b,0xc7576222,0x217ddbb5,0x5788504f,0xc2782c30,
  209409. 0xf812716b,0x860d096c } },
  209410. /* 24 */
  209411. { { 0x4d79bbf9,0xfebc337d,0x69f74f80,0x5d53eab8,0x33104d53,0xff36a095,
  209412. 0x196f8b97,0x2ab820da,0x75ce6909,0x961d3d1f,0x04683754,0xb197ec04,
  209413. 0x93a6cb9b,0xa68ce1bf,0xc5f021a3,0x503456ff,0x8940ffdb,0xb50a2db1,
  209414. 0xef004209,0x77c50f8f,0x04965875,0xd635d177,0x8bb8770a,0x725766d9,
  209415. 0xa078e53e,0x8e19b028,0xf9fc8378,0x364d4cca,0xf0dd39a0,0x1a3df411,
  209416. 0x03adf920,0x7e80e442 },
  209417. { 0x539a1ddf,0x4b5f8a57,0xee486562,0xd248e7ae,0x816021e1,0x1c7b491d,
  209418. 0xfd36d2c4,0x2e7b871b,0x0aec00d9,0xda38b504,0x6193f1b3,0xf2827612,
  209419. 0xfb1f78d6,0x69c3fe86,0xe827ac33,0x56c8b786,0x3487c8f7,0x1687f6c7,
  209420. 0x19dee5bc,0xab8f2217,0xff399418,0x04e8473f,0xa9027c80,0xf384c014,
  209421. 0xaa1d2e28,0x9967be9a,0xe065eef1,0x869686d3,0xc7bd837c,0x737c6b08,
  209422. 0x9e8bd863,0x5dcab5d1 } },
  209423. /* 25 */
  209424. { { 0x9a7d772b,0x0784283a,0xe540959b,0x6b49e525,0x86414ab5,0x546bb008,
  209425. 0x9d74b2a9,0xd4448162,0x203b0b1b,0x267890ad,0xc8d3f86b,0x1e7a82bc,
  209426. 0xd85a83c7,0x1352bfb5,0xfad07ccf,0xf29f16e3,0x41e0c43f,0xc02a63b8,
  209427. 0x6b379fef,0x904f22c5,0xb1244f26,0x19d8a653,0x3a28bdea,0x6635b6df,
  209428. 0xf6d455ce,0x18b68851,0x9cff3735,0x74ac2818,0x8b2cbdab,0xad40f9df,
  209429. 0xadc9d498,0x08cc2d9e },
  209430. { 0xc170c84b,0x2e6a6866,0x5a49a484,0xbb989e8b,0xd04c8992,0x7b0e00e0,
  209431. 0x61b3a423,0x55ad3478,0xb0d01899,0x3c952450,0xe3100cb3,0xe3922155,
  209432. 0xf03276d0,0x19265b6e,0x76d42b53,0x0fe8595a,0xfc6353b6,0x0a96dee0,
  209433. 0x246f893e,0x761e0dc8,0xf0a74cba,0x4ec902be,0x3fdfad9b,0x61008684,
  209434. 0x4fdb6975,0x5d6a60e4,0x7ef7590a,0x3f53aac8,0x12870a37,0xd29e6be0,
  209435. 0x55aa55b0,0x991fadc1 } },
  209436. /* 26 */
  209437. { { 0xb4844ffe,0x82bc4b0f,0x60f8b871,0x73922714,0x4ce3f1f3,0x8ac000e2,
  209438. 0x163519ec,0xf0d548b4,0x88288b5f,0x7aaf842b,0x2bdc9a70,0x9e8b0c4c,
  209439. 0x4ba5fd67,0xa06d5152,0xf93cdec3,0xd0b1afa0,0xdf89f8f0,0x280955ba,
  209440. 0xeea32c92,0x86cbe92d,0x3fe05be4,0x0cae3f99,0xfa6919aa,0xf2607095,
  209441. 0x6e0f1b8b,0x0f54741e,0x30ecf988,0x2aed1f74,0x734991d7,0x9296f76b,
  209442. 0x259f0fe9,0x66cf8d28 },
  209443. { 0x226f5868,0x9b01905b,0x16909e9e,0xc102e88c,0x4a37eb54,0x2bd08916,
  209444. 0xc9816323,0xf72253e8,0x86bac53c,0x37f84e9d,0xafeaaaf7,0x2e352454,
  209445. 0x2ca0046e,0x67c86f77,0x6663372e,0x86bce50e,0xb6950a04,0xf6a3a960,
  209446. 0xfc1aba93,0x61f994d7,0xc1326e6e,0x1957c12b,0x2e56b005,0x9b658fe4,
  209447. 0x8592740c,0x9cd297fc,0x177f26a5,0x7654ce9b,0xa79d2ebb,0xaaa699db,
  209448. 0x0ecb6448,0x5fca0c5a } },
  209449. /* 27 */
  209450. { { 0x569a6663,0xe26e25f3,0xe6aa4ca7,0x09597ee7,0x8d18b80c,0x25a4cda6,
  209451. 0x22926730,0x450602b5,0x07387209,0x9af5f650,0x26733a53,0xfeeedb34,
  209452. 0x86572951,0x0f5ce768,0x8398ae9a,0x872a360b,0x2b30f6c3,0x60347a80,
  209453. 0x1a162158,0xd2113b23,0xee6c6dec,0x6fd9cf92,0x5cbcf9e6,0x85f0a5a8,
  209454. 0x2ba3fe84,0xd7a5a6e4,0x51ecd727,0xaafe6720,0xa2081a10,0xe09c6bb2,
  209455. 0xb973b0b4,0x657acbf0 },
  209456. { 0xc274c8d4,0x3130466f,0x30a994d1,0x42765176,0x7079435f,0x217258ca,
  209457. 0xeb897a06,0x44850406,0x561ee130,0xf38dfeee,0xaa1778bb,0x11f4facf,
  209458. 0xb9abb9e9,0x765c6617,0xd8f10932,0xb135499b,0xa73b9159,0xc0eb6337,
  209459. 0x6f7e8b6a,0xf2c1ccf1,0x187def53,0x5b32c03a,0x830b9c62,0x89ad1d49,
  209460. 0x2f10e538,0x1735eae3,0x9d5f55bc,0xb1cbd9c2,0xe539db0d,0x42428c47,
  209461. 0xc852b3bb,0x3d2da412 } },
  209462. /* 28 */
  209463. { { 0x871f2865,0x97702b6e,0x142920d6,0x56cb639f,0x45b58611,0x328522a0,
  209464. 0xf3b13812,0xf3943ad1,0x712206e8,0xe6c2200a,0xa34d59ea,0xc2890e5a,
  209465. 0xf6b7f759,0xab52fd40,0x180bf567,0xf522c8de,0xaccee396,0x181e97b2,
  209466. 0xc4ea5cbb,0xe0375819,0xab51d3ef,0x0d9985e8,0xbcb50fd8,0xe26c96ca,
  209467. 0x97e1c80d,0xfb9d6b13,0xf796357d,0x582b1814,0x07f4c7fb,0x89a78221,
  209468. 0xc0357e61,0x02aeef2d },
  209469. { 0x2c7ec9be,0x2ba7926f,0x7258b201,0x292f307e,0xc6fa6b4a,0x74e62a10,
  209470. 0xe2bcc5ab,0x80c08549,0x7bb8c073,0xb4160db8,0x329f194d,0xd5ef0529,
  209471. 0x6dda4a9c,0x0eb8da14,0x15ea23d1,0x0b5d43d2,0xfc34bfae,0x6cebef02,
  209472. 0x848757a7,0xacd364d0,0x2d34cca3,0xc1401368,0x1d2d95e2,0x09ca6742,
  209473. 0x786eaa28,0xc3fd1d6e,0xa2965fec,0x9eb1136d,0xc0779203,0x48871baa,
  209474. 0x4b15aeb0,0x6b446c01 } },
  209475. /* 29 */
  209476. { { 0x25e8fe80,0xc819eb2e,0x98238a17,0x2b5f7906,0x81e41849,0xd6f1e996,
  209477. 0x98ea6d45,0x58ad8ad6,0xbfd02e40,0x5bae5ad4,0xa812416d,0x016dc327,
  209478. 0xa3347ca1,0x8b31a985,0x82a65391,0x0b4da610,0xb48c35fb,0x1cb91b2d,
  209479. 0xd2aaf8c4,0x9e96817c,0xcdfdcdc0,0x1a630483,0x12b69254,0x70559361,
  209480. 0xf8a2a097,0x5fdcd712,0x35cc5281,0x59ab623a,0x932b6095,0x30c8ebe0,
  209481. 0xb08e052f,0x8613424b },
  209482. { 0xb2231d8a,0x28902063,0xd9a61667,0xb0f62329,0x071a9f27,0xaafa0fe7,
  209483. 0x603f047e,0x6bcd8960,0xfd92a1c3,0x118cca76,0x71d483b6,0x3414e62b,
  209484. 0xba705262,0xa123ccdd,0xfd9b5c5a,0x1a576437,0x4c8d0fa3,0xa5301bc2,
  209485. 0x102427cd,0x96f0ad44,0xd3aa6c02,0x0e6fb5e0,0x072a3996,0xcd8c4880,
  209486. 0x840d3fad,0x4dafca12,0xde91d541,0x29f4ca3d,0x8441734d,0x0037c598,
  209487. 0x9ccfe57c,0x86333a99 } },
  209488. /* 30 */
  209489. { { 0xecf53b40,0xd213a751,0x2f78a542,0xcff2c6f2,0xf13ae56d,0x0f59f0e2,
  209490. 0x0e61748e,0x91f8ccbf,0xd72c4145,0x0aadecb9,0x4c9cdcb7,0x6b2ed852,
  209491. 0x1eaffc70,0x8e00b72c,0xaa728102,0x89b24285,0xb679cafa,0xaa7ea7e0,
  209492. 0x4f0a6f6f,0x5d2b8c26,0x0e804397,0x7ed7b173,0xc8573049,0x5a93eb45,
  209493. 0x0986e93e,0xc92bf5d4,0x6a20c0af,0x526b5a9c,0xb99dc3af,0x0adf47c9,
  209494. 0xba202cc9,0x12b25fe2 },
  209495. { 0x33eea395,0x09b8d78a,0xf633fc5c,0xc7a93618,0x270eceef,0x7e821629,
  209496. 0xc628ed0c,0x524779b8,0xa1d68939,0x91db5ca1,0x586edc90,0x8626e18e,
  209497. 0xfeb3f3bf,0xfe023e8b,0x0250171c,0x6279fde1,0x55e172de,0xe52ec7dc,
  209498. 0xc6d4ca45,0x445e8695,0xbdbc10f1,0x42de3878,0x6fc3835e,0x2b114de8,
  209499. 0x7e10b652,0x9faba456,0x390e78fe,0x4111d82a,0xaedf0aca,0x576b61c2,
  209500. 0x74accb74,0x216279a9 } },
  209501. /* 31 */
  209502. { { 0x4047f747,0xc14cdabf,0xc1315a1e,0x03ca233d,0x40e5d0a7,0x59e7cbd3,
  209503. 0xbb413869,0x1fd0c4e9,0x0f01fbd8,0x189d08b1,0xa76b823d,0x50449c42,
  209504. 0x398b00a1,0x81c224a1,0x8e8179e4,0x08084e4f,0x698e41e9,0xfd8af994,
  209505. 0x5610bf2e,0x1e30e37c,0xa7d2790f,0x4e6a043f,0xb3195388,0x9d96e60c,
  209506. 0x03799dfd,0xe75f986d,0xf8ff902f,0x3b4a8f11,0x7588416e,0xfa945378,
  209507. 0x9827535e,0x20683e3f },
  209508. { 0xd0378878,0xcb582e26,0xa7945787,0x9e214c23,0x8f6688b3,0x13d000bf,
  209509. 0x40515270,0x7548d4f5,0x40111f5d,0x7113c15d,0xa8bff902,0x3bf5a526,
  209510. 0x9b4945cc,0xbda6b010,0xbc2f3a05,0x83dcc74e,0x43efdfa1,0x2aef6284,
  209511. 0x565c5bf4,0xd2e60ee9,0x592f243a,0x4f0fa10d,0x1bc3bf51,0x6ae58b32,
  209512. 0x60576a74,0x813b0868,0x4d73081a,0x0bc023f8,0x32dcee59,0x9fd03aa0,
  209513. 0x27d6c795,0x5e416bf5 } },
  209514. /* 32 */
  209515. { { 0x026cc23c,0x24313760,0xb5b29058,0xf819aaee,0xc5d2ee17,0xa92272f8,
  209516. 0xee5cc402,0x8048e7cb,0x77def07d,0xdbc7d6ee,0xf6af821e,0x61d69244,
  209517. 0x996cbb89,0x5f7966ed,0x96a155a4,0xf81b17ea,0x03f3ed56,0xb2d9ef70,
  209518. 0xe882a5b2,0x5e6e5906,0xae947180,0x86fa1072,0x658c76f4,0x34d9fc51,
  209519. 0xcb035aa0,0x9f603dc0,0x75be6481,0xb7b39feb,0xcf04a9ef,0xca87554a,
  209520. 0x87b4fde3,0x4ff682ec },
  209521. { 0xd0a10ad5,0x3125627f,0x968e6f45,0x7fd45c72,0x806a1163,0x2981bd6b,
  209522. 0xde5033e3,0xb92de1cd,0xbf4f8988,0x3b44b45e,0xdae7e1dc,0xca1b9896,
  209523. 0x0778d878,0x52166e5a,0xa5116847,0x82d472be,0xf2895445,0xfbdd382a,
  209524. 0x5d6ec4c9,0x22ed1602,0xb6552b02,0x3614eb1c,0xa1e6210f,0x63c5df73,
  209525. 0x021a74a7,0xe9160285,0xc65cbd4d,0xa44ca400,0x0f15e299,0x48cb187e,
  209526. 0x3402507c,0x51eb818e } },
  209527. /* 33 */
  209528. { { 0xb92100ab,0x1fc1d178,0x9605b839,0xdf2e3d60,0xb71e59d0,0x12a7c255,
  209529. 0x14fcbe04,0x3f8b6675,0x59fd06af,0x0e8a3935,0x12020d07,0x56326502,
  209530. 0x528e7be5,0x6696fcd1,0x0c7b7654,0x6588514b,0x5912a5b5,0x0cd80f8c,
  209531. 0xf324cb7f,0x8bafef04,0xc6da3d75,0x6b53eecf,0x31d1df2f,0xedef48d8,
  209532. 0x73812b6d,0xf336b965,0xee626031,0xc82eae4a,0xd244f09b,0x300abd32,
  209533. 0x31d9647f,0x8b0af955 },
  209534. { 0x2e603544,0xb770180a,0x221acd9e,0x2b573ac3,0x62407032,0x3a17f665,
  209535. 0xb89abc3d,0xad3e74ad,0xd793225a,0x8a3d2e3a,0xef02564b,0x457bba04,
  209536. 0xfc2dd2b5,0x8875652f,0xe67143e8,0xd2905d15,0x02e48d70,0x6d884b42,
  209537. 0xc7636a57,0x06f99219,0x35e378df,0xa8dc3421,0x10c64a02,0x95c1d73d,
  209538. 0xcc157a66,0xcd6a4ece,0x8e24a354,0xbadcc1c8,0x9839329d,0x8024f1b2,
  209539. 0x4da48ad0,0x5363e549 } },
  209540. /* 34 */
  209541. { { 0xe23fc641,0x1f5523b7,0x86667063,0xfe54e72f,0x8e009d2f,0x294a15f5,
  209542. 0x8c57f5e1,0xf203997f,0xb16d64dc,0xa229724c,0x4baa2ffb,0x697be4fd,
  209543. 0x0a6e8ed6,0x3f507e46,0x78508536,0x0afe3a5d,0x95408208,0xeeef6cdd,
  209544. 0xf2c4237c,0x701fd889,0x5c385253,0x496d883a,0x72a212f1,0xe25c67ed,
  209545. 0x1ff78fcd,0x4b416783,0xc16f4146,0xe9967004,0xc45b0697,0xfa45c3a1,
  209546. 0x3fbd30c3,0x63334018 },
  209547. { 0xa2fbbbce,0x39c9a0cc,0xaa0cb744,0x876f6e5c,0x3438ece3,0x9ce6010e,
  209548. 0x13802d82,0x0aad148e,0x9cd45a1b,0x9c3e5c60,0x7bcfc1e0,0x875cb859,
  209549. 0xd8584dd0,0xb19ff790,0xd81c2a2b,0x2598b81e,0x02be07e3,0x118bdf2f,
  209550. 0xb9765ce9,0x074fc8ee,0xb24f95ae,0x125e9d88,0x0c98f09d,0x3bb12cdc,
  209551. 0xa0b74b27,0x4a6aee07,0xc08077ce,0x4723d2f9,0xbea8026f,0x959447d6,
  209552. 0x16280b73,0x93a7075c } },
  209553. /* 35 */
  209554. { { 0x715b27f9,0x26bbefe2,0x2a280923,0xa935a5e2,0xfd58a26a,0x5ddf23af,
  209555. 0x7c138694,0x54c83e16,0x892a2153,0x44799bc9,0x9b8d09f5,0x4e6e4710,
  209556. 0xd588ea68,0xc63af616,0x883ab1b6,0x5e896706,0x3d209336,0x3c1393a0,
  209557. 0x92c23dda,0xd02f2921,0xdcf6ea43,0xab70cb7a,0x791559e1,0x12434ea8,
  209558. 0x6d70ff0b,0x040680db,0x2832ba45,0x1a10fe52,0xe5f0cb8f,0xd69f9c08,
  209559. 0x44b141fd,0x1a7422ac },
  209560. { 0x9f40b675,0xc3a9dd2e,0xfcc71f39,0x2a7c6603,0x1948e342,0x18939a61,
  209561. 0xed0ab484,0x8f3b6158,0xee31ca6b,0xa3aa7d97,0xf7a8db63,0xbc1e865e,
  209562. 0x2c7c62e4,0x315f8c09,0x9f5c6d0f,0xa260788f,0x4b6f3ec5,0xb1833129,
  209563. 0x36b4d849,0x73adbcd6,0xbc699a9b,0x66e14890,0x2a1175e7,0xbf3790d8,
  209564. 0xfc53ca4f,0x7f43605a,0x87ff6091,0x577f6c47,0x600c82b6,0x827c7552,
  209565. 0x9d25599c,0x0944d630 } },
  209566. /* 36 */
  209567. { { 0xe6ab9620,0xcfdeb63e,0x786cd808,0xdff4fa6d,0x456320b3,0x145edd82,
  209568. 0xc4943915,0x2ae5f862,0xb73b3f87,0x9508e813,0xe52f97a9,0x3bd805f3,
  209569. 0xc9829b62,0xf71b5c28,0x86e0cefc,0xb394c70e,0x23bdb36e,0x534fb1a9,
  209570. 0xdbe27e5a,0xd64f5862,0x83ab6169,0xbae23df3,0x27c828cb,0xdd6df1b1,
  209571. 0x3a307a8a,0x1901899f,0x811ddf66,0x36cc8659,0x79943b77,0xa3cb7774,
  209572. 0x6fd86576,0x7d89f383 },
  209573. { 0xc9f92b2b,0xf8564242,0xc46e32bd,0x700c6a75,0x7f99a5c5,0x93e768b7,
  209574. 0x03149568,0xb6efe858,0xc2ce6709,0xbbfe8a19,0xee6ec493,0x721a3b1b,
  209575. 0xc371c28d,0x26eeeea9,0x15177e1d,0xd798115e,0xb068a5a5,0xd7bf3bce,
  209576. 0x46d2b4b2,0xdf8da220,0x59be9dfc,0x3df0995b,0x77640b79,0xc96897bc,
  209577. 0x5a2bd3c5,0xce0cf4c2,0x89afe744,0x16f45d6e,0x3a8509bb,0xb53f3acb,
  209578. 0x63f2a6e6,0x449af81f } },
  209579. /* 37 */
  209580. { { 0xa16d9377,0xc2fcf132,0x7e1a2f9e,0x9ab377b3,0x86d19ae5,0x72e1a12e,
  209581. 0xd013bbb1,0xd2b12e66,0xcb5f66ba,0x0972e055,0x399eab50,0xd11de1c0,
  209582. 0xc65f5ec2,0xc1f314fd,0x8a9ff593,0xfc311841,0xe05246e6,0xdf73c1ec,
  209583. 0x1625056d,0xc28d1363,0x6fb25e19,0x30a9dbd7,0x845cd2d7,0x049ed244,
  209584. 0xd36e852d,0xc779b83f,0xf68c8a83,0x85a35fc7,0xc95e8033,0x299bf1e1,
  209585. 0x20891af5,0x0e8617c3 },
  209586. { 0x67c81b5c,0x53720602,0xe737873c,0x2fa89dcd,0xa8144fd0,0x2a7430b0,
  209587. 0x26208c83,0x3006c5a7,0xd8ea40f5,0x4e066660,0x896413a4,0x9dd025f9,
  209588. 0x46b9149f,0xbdf380cc,0x0a125cc2,0x80156619,0x52793c37,0x04d6a3b7,
  209589. 0x6b7a62f2,0xb6001374,0x585d5978,0xa9cfe268,0x8395fe66,0xdcad0cb8,
  209590. 0x46b261f6,0xbab468fc,0x9d9d9218,0xca0ef5ef,0x5e452402,0xc507d4a8,
  209591. 0x326cf687,0x6f4404f1 } },
  209592. /* 38 */
  209593. { { 0x4febd3ff,0xa3e1920b,0xfdfd2bba,0xca6234d8,0xe19a9829,0xb7d1af2a,
  209594. 0xc6f5bc20,0x23de1610,0xdaa39ca9,0xe204dbf3,0x6d8c70ab,0x2a2de9b8,
  209595. 0x7c9d370b,0x272e0c37,0xe565510e,0x80914c06,0x57cbb6b0,0xb611e7a8,
  209596. 0xd8266a6e,0x076fc6ef,0x3095801c,0xdfac34ee,0xb9e24063,0x69ff40a2,
  209597. 0x787aa5c5,0xa7ba31a9,0x33c70cd2,0x0e4d1fdf,0x6895f074,0x903e3132,
  209598. 0x7fb671e2,0x905771f8 },
  209599. { 0xa4062bee,0x5199ba0d,0x94d7d9f9,0x18e7238c,0x1e0922c0,0xf53f29bc,
  209600. 0xb12d855f,0xde9b2a81,0x6d68ca29,0x649f3eed,0xc50c097f,0x64adfc34,
  209601. 0x9db398a0,0x81964ab9,0x7a587224,0x00d59c47,0x74c5903a,0x09fea396,
  209602. 0x15043dd0,0x6aafd8ee,0x5f1ecc20,0xc5721a6e,0x0db9b7b4,0xb6d6a483,
  209603. 0x66c8d52a,0x06ffc617,0xacc82a27,0x3de241d6,0x27f2f7a8,0x0605f052,
  209604. 0x6404decc,0x6a22953b } },
  209605. /* 39 */
  209606. { { 0x74fce389,0x92452d8f,0x2afa5564,0x059634c0,0xf0ed7825,0x9377ccbb,
  209607. 0x37718e0d,0x89f4045b,0x9fa69a4d,0x11074e7d,0x7295b0ba,0x5d70bb07,
  209608. 0xf107ede6,0xb22d54ad,0xa1a29c7b,0x5c39a3d8,0xd795e3ab,0x37236c02,
  209609. 0x2b589951,0xf7282d00,0x5790bee2,0x5e2265be,0xa8e65ea2,0x91e0ea11,
  209610. 0x6001cebd,0x0e71a708,0x2c1c5402,0x16900f5a,0x357f6981,0xc3b2d5c0,
  209611. 0x619e3427,0x528c9ea0 },
  209612. { 0x5f26c577,0x1edc86b4,0x9438bd45,0xf8074708,0x792582a7,0x2dfe1013,
  209613. 0xde1e569f,0xe08eaca0,0x9a55a356,0x5f952efa,0xe4976216,0xa4d80b53,
  209614. 0xcd5d71f2,0xd2b65855,0x66cea3f0,0x246704bf,0x492323ca,0x193f641f,
  209615. 0x9adb1325,0xa681855c,0x2d19d652,0x86d522ce,0x5b82ed7b,0x53609f10,
  209616. 0x8e150d29,0x3b0f0094,0x0b13e891,0x23ad8bfb,0xf794b449,0xcbb1556c,
  209617. 0x738bcf57,0x200f9093 } },
  209618. /* 40 */
  209619. { { 0x8388387f,0xf9b22fc5,0x28e883c5,0xcf26f170,0xd1b7973c,0x447cab90,
  209620. 0xf6ec9171,0x8d5d4ea2,0xc30cdbc0,0x2e16f498,0x48623c2b,0xdc92910c,
  209621. 0x30dbc545,0xeb1491b0,0x14de21b0,0x631deb2e,0x2fe830f4,0x04a21066,
  209622. 0x379c1f3f,0xa4c6979c,0xfb06a795,0x8a732b68,0x1619dfa9,0x3a44327a,
  209623. 0x8dbe2c9b,0x91a307d3,0x03989fea,0x939bc8d2,0x0f4a331f,0x3daabaf2,
  209624. 0xdd0f55dc,0x5c307e98 },
  209625. { 0x35b233da,0xbbc4e0c4,0x22f6f985,0xe3d29085,0xa8b02468,0x99dd2d21,
  209626. 0xa96916e7,0x978f40e9,0x614bcced,0x0327d86c,0xb290762c,0x95e95502,
  209627. 0xa879f2ed,0x0ffd2197,0x50e0bd33,0xc4365137,0x0827c4c4,0x26c3148a,
  209628. 0x3fcfc0b2,0xc79812a8,0x31928589,0xc3d8d17e,0x8830f42d,0x8b572cfe,
  209629. 0x4b07f83f,0x7cd9ff92,0x0a51148f,0x331ca950,0x4c59f9ac,0xd0c53968,
  209630. 0xc1434785,0x1df16dfa } },
  209631. /* 41 */
  209632. { { 0x68bcacc3,0xcc7bb4ac,0x430f58cf,0x06ded34f,0xd461855a,0xc59f9f4f,
  209633. 0x45c9f0bc,0xf5491994,0x4375c892,0xdc5f7ec6,0x3c85983a,0x1b8708f1,
  209634. 0x82fcd087,0xb32a5cc4,0x2d6b4c0f,0xefdcdc35,0x8ac6fb2d,0x4bb24f04,
  209635. 0x33906471,0x5982d4f5,0xb83a3ac4,0x162eb52f,0x2337a223,0x7130df28,
  209636. 0xcbc3dbd3,0xdce7b802,0x2467ac0e,0x8b395959,0x1b56717e,0x21d3d2e8,
  209637. 0x46512617,0x729a7f50 },
  209638. { 0x8420f90a,0x874ed1aa,0x0fe4c855,0x6368e19e,0xb0be74af,0xb62d4aaa,
  209639. 0x8ca60ca9,0x76fcc480,0x7645a867,0xf310b5a5,0xddb1b24c,0x131bac9b,
  209640. 0x2dea5b44,0xef77d71d,0x72fcc64e,0x4706d210,0x673d77f0,0x29b92691,
  209641. 0xe89e0663,0x22e00bf3,0x74077d40,0x472d0cd3,0x829232e2,0x3e21040d,
  209642. 0x38dc8533,0x2f916dfb,0x14b8f667,0x48bbb59b,0xd44be19d,0x19de9f4a,
  209643. 0x232d9d5c,0x7f6d3649 } },
  209644. /* 42 */
  209645. { { 0x6e794819,0x3bd064de,0xf82ebda1,0x5a6b694e,0xb91e2804,0x1f017fe0,
  209646. 0x07a43cd2,0x190d31f3,0x630433e9,0x6c26f226,0x0abfdcb4,0xba488aa7,
  209647. 0xa46411c0,0x418d9085,0xbffb5880,0x1b934fe6,0xe200f849,0x75d1e237,
  209648. 0xa55413db,0xdf04d63f,0xe23b3f77,0xe216ed75,0x0f91bd30,0xa05866cb,
  209649. 0x7729c509,0x84c395d9,0x452ab2d7,0xec97e188,0x0093d686,0x8cb7c1f9,
  209650. 0x628f086c,0x2d032395 },
  209651. { 0x4a44b4c5,0xa81c9407,0xcc702c98,0xb9846879,0xceb0dc97,0xcb502287,
  209652. 0x6e3aa321,0x30301126,0xe4c256c2,0xc0ac8763,0xe55b4845,0x65034d20,
  209653. 0xf240f35b,0xaa96a040,0x7cf7eedc,0x046d26d3,0x3b810656,0x62a5a8e1,
  209654. 0x83d70c2b,0x86044b97,0x59e4da8f,0x2fbaff88,0x5457f5d1,0x929d901a,
  209655. 0xb531b757,0xd29e1eb2,0x9e4e9739,0x214dabdc,0x4eaa9bd9,0x5bd724fc,
  209656. 0x1ef9bb9b,0x734c12b3 } },
  209657. /* 43 */
  209658. { { 0x92f9b086,0x98fe3c2e,0xb3fd4544,0x4641b93e,0x5c02c65c,0x47ce208b,
  209659. 0xc4f03242,0x8a52dca1,0x679d29f6,0xb5ec17d9,0x9406f5f4,0x11d2fed0,
  209660. 0x0d9ba811,0x260f63dc,0x15472a3f,0xde2b056f,0x007290e6,0x1b170d9f,
  209661. 0xb6b5c8f9,0xa2e23e8d,0xcf34c3ee,0x345a2839,0x1b973ee2,0x9bdc5461,
  209662. 0xbb24d1c5,0x65bda6c2,0x3c6141a1,0x97d52ba3,0x9d2eb201,0x47bb1612,
  209663. 0x21fbe49f,0x7c558a87 },
  209664. { 0x3f350fec,0xb9485a52,0x6a38d4c0,0x016678c5,0x0d5aa64d,0x8ef346a2,
  209665. 0xd96da2e4,0xb85daa02,0x4f647b3c,0x845ec4ea,0x0d5e946c,0xc0d1a6ca,
  209666. 0x4fa9f4ab,0x41d8d1c1,0x9c8b1303,0x43972cc5,0x434ffbfb,0x67e1f48d,
  209667. 0x819d2318,0x350ce93a,0x6ddef23f,0x49f53090,0x200cf12c,0x3c2e6cf9,
  209668. 0x640432fc,0x42691cc1,0x72496b52,0xbfff74b4,0x020a97be,0x44527c9f,
  209669. 0x7b3c4348,0x34cd7dca } },
  209670. /* 44 */
  209671. { { 0x59e7fe87,0xf031761a,0x0047cd72,0xb1eae31a,0xfae30f62,0x27902e68,
  209672. 0xb71db143,0xa666f48d,0x0e0038f4,0x75ee6678,0x02bdd76d,0x3b45ac67,
  209673. 0xa0d6cd5c,0x0d2fb828,0x9d8c5b11,0x27ce7f1d,0x120b5e96,0x141fe0e4,
  209674. 0xb9267c37,0x95a1b984,0xd60312cd,0x5206e589,0xda549356,0x1867342e,
  209675. 0x070c74ac,0x374520b9,0x9557b0b3,0x2703cbb5,0xa6ed8c14,0xf621f59c,
  209676. 0xabf7b887,0x7ceb1cc2 },
  209677. { 0xdb7fd65b,0x0647a5bb,0x36c9457c,0xd8d45cc0,0x9e12718a,0xc6da99db,
  209678. 0xe93a7fb1,0xed1dbbf4,0xbd1566a1,0x4512c95c,0xdbc0c919,0x4861ba00,
  209679. 0x9e7f5269,0x3c6cc298,0x0941aaae,0x67196150,0xc8c538e3,0xbfcf5d0f,
  209680. 0xa25a551f,0xad6e9929,0x17ca0f26,0x90710985,0xfa89ef7e,0x743b78ea,
  209681. 0x71ab4549,0x39d5ea31,0xe6d1c36d,0x7442f3f3,0x059d568d,0x25a683e0,
  209682. 0x227ced5c,0x1f629a99 } },
  209683. /* 45 */
  209684. { { 0xe45a1c3e,0x8925ddac,0x41f7545f,0x72d29365,0x37e7f828,0x45622fcb,
  209685. 0x3e4c79d2,0x88234513,0x9c2645d6,0x5dffaf84,0x994802b9,0x3078f4dd,
  209686. 0x9d339fa0,0x566927f0,0x9fd91dcc,0x9a500a1e,0x0ab0abd7,0xce008180,
  209687. 0x8194e5df,0xd97135a3,0x98adf088,0x9e876307,0x9a45a2a7,0x3baf01b8,
  209688. 0x788b4399,0x6fed6154,0xe77a997d,0x980e5722,0x2a378eed,0xaac90ffa,
  209689. 0x8bd805a2,0x4a75fda2 },
  209690. { 0x55e74cbc,0xd09a8fbb,0xfab18f25,0x737738ce,0x9764ec3a,0x0fc23ad6,
  209691. 0xe7e0ad31,0xc5a7d35b,0xe481cc9b,0xe75e068e,0x3d4aec34,0xf0c2ea99,
  209692. 0x0d4a63c4,0xf1324fe8,0x99b0592c,0x5dbb7c16,0xa7e0f46b,0x442d674d,
  209693. 0xa300faea,0x5a5d66c7,0x3333ac83,0xe83dc821,0x8c408496,0x70ef812e,
  209694. 0x99ef5fc1,0x96e1dcb6,0x1734e862,0x6e2b771b,0x583507d8,0x04629cdc,
  209695. 0x23d8179a,0x5819f9ae } },
  209696. /* 46 */
  209697. { { 0x6aa78811,0xd9969121,0x2103e7c3,0xf64ee8f4,0x22b9e698,0xddf01070,
  209698. 0x4f582cde,0xe6001f9e,0x2ecfac1a,0x24a608af,0x06393009,0x6ef4c784,
  209699. 0xebf72911,0x5262eae6,0x8c4ee5a0,0xddbd0af5,0xecd87bc7,0x875aff90,
  209700. 0x6f24f114,0x2fddb34c,0xe865f172,0x48104281,0x886c1b9a,0x95692426,
  209701. 0x9ef4231f,0x6f5f3208,0xd0a7e82e,0xaf587acf,0x9ac395c8,0xd6571917,
  209702. 0x1364a750,0x7459603c },
  209703. { 0xf41ae519,0x1c2475bf,0x4af8f251,0x34401fb1,0xaefb2c3d,0x70ddfcd2,
  209704. 0x51cdaf08,0x9b2d385b,0x8208bb19,0x8531c256,0x4c33f3f6,0x16c89df6,
  209705. 0x24571769,0xc23cfa99,0x86d010ba,0x2339b51e,0x22638313,0x08db0e8d,
  209706. 0x00fedeb7,0xf769e179,0xa3687ef1,0x3fd96dcb,0x91476475,0xcd046b23,
  209707. 0x0c45c8dd,0xf3ff2064,0xb8343d78,0xefd167bd,0x4b77ee90,0x493ccb6d,
  209708. 0xb3cf7b45,0x33025513 } },
  209709. /* 47 */
  209710. { { 0x35eaaca1,0x36f00469,0x89119102,0x0c384b75,0xe6d2954c,0xcb375665,
  209711. 0xb1e9d6d7,0xcb9199b9,0xc29c2757,0x75852349,0xb8e738d0,0x89cbd1ba,
  209712. 0x5923a427,0x9b8dbe90,0x18fe1889,0xa237793e,0xa742e083,0xa4271757,
  209713. 0x4eebd613,0x8c4979d2,0xd4f2cf77,0x40325054,0x958705de,0xa3b8a091,
  209714. 0x33d999ba,0x1b191bd9,0x3b0fee1e,0xbafefba4,0x3facdf14,0xb3bad184,
  209715. 0x4387561c,0x9328adb0 },
  209716. { 0xf906b872,0xabe84e80,0x78262665,0x705523a0,0x3398ccf7,0xd89c6a7e,
  209717. 0xf55b5323,0x2fab551d,0x0554dea8,0xa0578eca,0x375589cd,0xef26523d,
  209718. 0x864ad750,0xd8fd6242,0x178fe1fe,0x93f27fc5,0x9df87422,0x7b3e6f30,
  209719. 0x3750d054,0x2862e49e,0x5dc038a1,0x7d90c6b2,0x84db682b,0xc1a1ae22,
  209720. 0x9881930a,0x47f3dab7,0xbaf3e0a4,0x30e6bd52,0xf62d25c5,0x0680025b,
  209721. 0xadd0d5e7,0x0aa1f3cf } },
  209722. /* 48 */
  209723. { { 0x22a10453,0xa9822190,0x2a03a10b,0xdd1eb91c,0x96646f3b,0xafbb5d95,
  209724. 0xf38b6fc6,0xa58de344,0xb8cfca1d,0xce47c3e5,0x0f70da04,0xfcd8e16d,
  209725. 0xda262ed6,0xac44349b,0xc56e2f8e,0x9320d87b,0x19138e58,0x9ce3ea08,
  209726. 0xa2b236c0,0xa5862dff,0x8e7efb0d,0x6b0f9a5c,0x16ac78eb,0x4b53432b,
  209727. 0x709b51af,0x6ff43105,0x8f519628,0x08e236f8,0xeed403ad,0x1f93f176,
  209728. 0x9636545e,0x559337e0 },
  209729. { 0xd8fd807a,0x30ddf738,0xab131222,0xf4e0ec9d,0x625afbc3,0x14a2f4db,
  209730. 0x9f12f895,0xd5b70604,0xac3044fd,0xb46f3c23,0xf540148f,0x1b232d1f,
  209731. 0x39b4e554,0x61b458f5,0x0dd70b75,0xf694b24a,0x289581d9,0x0fc64299,
  209732. 0xee5fe22d,0xc05d49be,0x6a18bf63,0x7af3447f,0x7f1929d6,0xe96a1dc2,
  209733. 0xc1551e8c,0x6afe6028,0x2b5d4fa2,0x27dacaf3,0x545c2cb4,0x4a1631bc,
  209734. 0xb0c914d3,0x930070f9 } },
  209735. /* 49 */
  209736. { { 0x69a9bc05,0xd2f32c5e,0x589c4b73,0x0a5c19c6,0x94665f9c,0x095c9e5e,
  209737. 0xbcfb4c39,0x8ab0f293,0x1ddb7c31,0xb9070877,0x66b38048,0x894e9658,
  209738. 0x606bd9bd,0xf19a90cf,0xb6fd2d69,0xcc1d58df,0x461d8a69,0x886dcc4e,
  209739. 0xf9ce4831,0xc455c277,0x765f8a82,0x749a5996,0xc3badc8d,0x2ffc668c,
  209740. 0x9112cdab,0x38018396,0xb243c7cb,0xa98795c3,0x010a2224,0x8775f310,
  209741. 0x587b5e14,0x043a2141 },
  209742. { 0x3a873752,0x7bbe9dbc,0x2f442fee,0xee1493f4,0xc18c2181,0x981ca2c8,
  209743. 0xe29769e7,0x00ce3090,0xde768c5f,0xb4626ac8,0x34d7677e,0x33e9ce46,
  209744. 0xe0fa94e6,0xf89c2cad,0x41f5b5bf,0x04f5cc11,0x2228c12c,0x2565f736,
  209745. 0x0c05cce5,0xf1bf706a,0xbe487c4f,0x5d07ffff,0xa499f1a4,0x3ec43c09,
  209746. 0x98d94800,0x4f4e79bb,0x073f12f8,0x8a335a16,0x0f970d6d,0x4bb5eaf7,
  209747. 0xf24d0ae8,0x18d0747b } },
  209748. /* 50 */
  209749. { { 0x84601faf,0x58d3c77c,0xaf1c1f72,0xc9465be2,0xd116d806,0xff626798,
  209750. 0xd5b0d93c,0x3996c0c6,0x5ec6723a,0x2fa1ad75,0x03ba5349,0x966a8144,
  209751. 0x2ac34d8a,0xdc4c9422,0xed675865,0xddf471de,0x953d528f,0xd8aca597,
  209752. 0x24ebf67d,0xb2e463b5,0x7e25b4d3,0x25824871,0x43159daa,0x23c5adba,
  209753. 0x83357540,0x5458f9c6,0xf938b1a6,0xcf685da7,0xcefed231,0x981a4fda,
  209754. 0x08bb5e59,0x711093ed },
  209755. { 0x401f161a,0x12aa3fc6,0x974c5e87,0xf7358560,0x17b5df82,0x4aa252fb,
  209756. 0xa48e6299,0xb0b82b07,0x29dd847d,0x00234157,0x4529c5a6,0xf1e54d00,
  209757. 0x6d98f538,0xcc1c539e,0x28d3abcb,0x36162b53,0x2a84f0cd,0x75a37938,
  209758. 0x4dee7484,0xf717a81b,0x4c23bf1b,0x16cf35fb,0x787e8b3e,0x7fd1c29f,
  209759. 0x59b79ab0,0xb7da7e68,0x85f6c60b,0x072100a0,0xe7ed48b5,0x31840159,
  209760. 0x4d9c97d4,0x17898bda } },
  209761. /* 51 */
  209762. { { 0xae1b8cf8,0xcd8483d8,0xe9a28856,0x323d4b42,0x204a4bc2,0x7633584f,
  209763. 0xca7a69fa,0x4e0b2228,0xf757bab2,0x8afbda8b,0x6cc5f9ca,0x85b24088,
  209764. 0xd41a95c3,0x47fb4813,0xc2aabe6b,0x3f1bc53c,0x1ad1599d,0xf22cda3f,
  209765. 0xc31ea9b1,0x1b2ec081,0x01614ac1,0x048f304b,0xc6afa7ab,0xce31cee9,
  209766. 0x4140dc3d,0x55af7633,0xdce8abba,0x84b7ab37,0xc7cf3efe,0x50de7648,
  209767. 0x15356ab2,0x73a88dcf },
  209768. { 0x06e83b39,0x3f868288,0x9f44037d,0x477a4413,0x17dbc841,0xf9058b0f,
  209769. 0x54d17549,0x2db64f4f,0xf2307ffe,0xa23cea6a,0x4f126261,0x393efd55,
  209770. 0x10f37f26,0x2f4e658a,0xf4ee1e35,0xa4437ce3,0xa93cde8b,0x64ef42a7,
  209771. 0x939aa901,0x1debc9f4,0x3d7b5cd4,0x44223d6a,0xf88a3acc,0x789a6a11,
  209772. 0x2c608a2d,0x56fb9df8,0xbbf56c06,0xe79db8e3,0x668fa300,0x73c56af2,
  209773. 0xae396a1e,0x52f32b17 } },
  209774. /* 52 */
  209775. { { 0xe714f71a,0x56f524c1,0x9add8519,0xc1be1262,0x65cadbe3,0xad9189d8,
  209776. 0x5a0fb649,0xd88bf5c8,0x21d192d9,0x9efa6a92,0x6f724b6f,0xe3fe8389,
  209777. 0xb250119c,0xec3fae24,0x2ae0d3c0,0x4b6af9f6,0xd619624d,0x8fceba0b,
  209778. 0x2fdb6e3a,0x7dc3092b,0x3263cd29,0xc91da376,0xf95c43bd,0x30c0761e,
  209779. 0xcdeb44d9,0x89136400,0x43c0d31d,0xfd7dce84,0x9871899f,0x78fec3b1,
  209780. 0xefdf58c1,0x79e14d28 },
  209781. { 0x9bb40c55,0xe3822235,0x0ed07a42,0x0a27202d,0x4838c1f4,0x48e6c1a9,
  209782. 0xd864a78e,0x2b5f24a7,0x0c6c55c9,0x7e7f140a,0xce12d508,0xe62c104a,
  209783. 0xc11b1e10,0x9b0a1a7e,0xafbb3dd5,0xfd8a275f,0x9a3b6b30,0xdff354fe,
  209784. 0x46602a01,0x5a105d9e,0x93bb65f7,0x3d371b4d,0x0f82fdeb,0xda5cbf0b,
  209785. 0xde468545,0x4601229b,0xc73d517e,0x505e10b9,0x672ff492,0x77cfa541,
  209786. 0x99566ce2,0x0d8ec28a } },
  209787. /* 53 */
  209788. { { 0xcbeee995,0x014cf73e,0xd491e80c,0xb2eb88bc,0xd9aba5d4,0x615a6cad,
  209789. 0x9304c84d,0x2f7d4633,0x8ab03c9a,0xba0501d2,0x91babb94,0xc8f723de,
  209790. 0x50405772,0xc885f977,0xc7fcb094,0xb5e1d2b3,0xdf96c71a,0x61ee7995,
  209791. 0x3464499e,0xb8c8daab,0x5f607932,0xdb425ddd,0xb1243587,0x70251ca1,
  209792. 0x9fc74340,0x26d7d3be,0xc902ac89,0x8c179310,0x4559a74f,0x72522c15,
  209793. 0xc3734afc,0x86001e27 },
  209794. { 0xe7693947,0x13b00ba5,0x012c062b,0x6478641e,0xe85490a8,0xe1a438e0,
  209795. 0xd9574d5e,0x5173dbbf,0x9bd3ba61,0x9532eb8c,0x5f3ea075,0x1f41bcb8,
  209796. 0x8cbb92b9,0xac1cc247,0x1ef901b4,0x0f34648e,0xd2b3b2ee,0xdd929d1e,
  209797. 0xc3d75bfc,0x470f1eab,0x139cf4d2,0x5cdbc6f7,0xf0424953,0xcd86454d,
  209798. 0x47fcb383,0x1e079812,0x17df930c,0xb9f209b4,0x114ebc00,0x4225fc31,
  209799. 0x347946c1,0x020591cb } },
  209800. /* 54 */
  209801. { { 0x275e0af4,0xe3003721,0xe78a4a4b,0x721141ef,0xd1757485,0x666cfcf6,
  209802. 0x168e659e,0x5fa1d737,0x0e2842ee,0x263e3e54,0x948bd5f6,0xadecc3d4,
  209803. 0x246b104a,0x019de03d,0xf343d818,0xf8a9e903,0x5b0c0d31,0xcb57ba4a,
  209804. 0x51e2765f,0x8246c506,0x6519bf67,0x80c5751f,0xf2119a01,0x5f05c200,
  209805. 0x7821d4f4,0x7e6487b8,0x261c3a06,0x262f94aa,0x72146052,0x56cfe489,
  209806. 0xa1df05ef,0x5119985f },
  209807. { 0xb18586c0,0x5819497d,0xc6eeaa62,0x004415d6,0x97cda28b,0x7c6a46b6,
  209808. 0x7c194594,0x9a149b28,0x4ed3a506,0xb56369fa,0x43c94cb4,0x7092aa66,
  209809. 0xa9e9eee2,0x55bce73a,0x77893509,0x34bb2870,0x06eb5326,0x8af95fb0,
  209810. 0x9638f485,0x87cd0323,0x5ba75bf8,0x29376268,0x9d42d581,0xf32d6f3d,
  209811. 0x65c6d64d,0xa4cad574,0xb2cded41,0x985f50fb,0x9006a067,0xcf34ce0e,
  209812. 0x58a57f9a,0x59eaf265 } },
  209813. /* 55 */
  209814. { { 0x6ec3876f,0x7b407efb,0xf0f48648,0x780c6123,0xbf893039,0x2abb56ff,
  209815. 0x45a91ab0,0x9592eaa0,0x78811b82,0xce5b84d7,0x1f9f3fc9,0x86a71a34,
  209816. 0xf0e7e13b,0xc17fdd86,0x655a0880,0x88ed8297,0x81d5e666,0x75d6dc74,
  209817. 0x1d171797,0xeffc9df6,0xe3f79e1f,0x36ad4c8d,0x2046192e,0xdb15317d,
  209818. 0x274fda62,0x78c9fa7a,0x82dd9914,0x04ec924f,0x3a64971c,0x059d1e38,
  209819. 0x2620bbfb,0x3b4450ea },
  209820. { 0xc776dcdb,0x3db7a955,0x81c8ba47,0x35c4a57c,0x505760fb,0xae285003,
  209821. 0xb3aec353,0xe3e80691,0x47117be5,0x380335be,0x056ccf61,0xe1c47e3a,
  209822. 0x33977916,0x253cfdeb,0xf5cb7ee1,0x3decdfba,0x7cf4b704,0xf3c9794f,
  209823. 0x9ff81462,0x2401680c,0xbe3daa9f,0x4e440e11,0x69f91d8a,0xc5d04377,
  209824. 0xcb5e9c5d,0x4106c7a8,0x33b7d24d,0x191909a1,0x3764b4a2,0xe893c838,
  209825. 0xc429b614,0x4a7fe30c } },
  209826. /* 56 */
  209827. { { 0x2455c7c5,0xe78f3a70,0x70157754,0x5b7636e8,0x7623262c,0xf32c4524,
  209828. 0x1bc780c7,0x2c98b11e,0x915ed877,0xd48eaeac,0x199265f4,0xbb04d3c0,
  209829. 0xcfa5200f,0x6b52b19b,0x93ea3fe8,0xc46a0981,0xba758059,0xd82c733d,
  209830. 0x1896aacc,0xd324bbd6,0xce8ecd51,0xac09a2fc,0x02fc44b3,0x529918fd,
  209831. 0xaaa1784b,0xf0c45e4a,0xfe22085c,0x35626340,0xc50c7d61,0x53cbb676,
  209832. 0x65126b23,0x83fa1ea3 },
  209833. { 0x10ccc646,0x60ac86da,0x7b0451e9,0x2ce0637f,0x8a088610,0xbbbcf630,
  209834. 0x20349982,0x23c19019,0xfc0bcda0,0x707fc39c,0x1bd4fd7d,0x7f4d1f15,
  209835. 0x44713bbb,0xd6a64e74,0xc5ac9e60,0x57bdc676,0x37b61169,0x456c5303,
  209836. 0xdcf40a1d,0xd3451396,0x4997d2c7,0xf3edec25,0xc2c4a739,0x534ae9a4,
  209837. 0x6a6ad2e2,0x1401397e,0x23e95f81,0x20769d4d,0xde98fabf,0xcee007c6,
  209838. 0x931c51e0,0x61409779 } },
  209839. /* 57 */
  209840. { { 0x15156623,0x3ddb32db,0xab7a67c2,0x68137fbc,0x6f19e3c2,0x26011f50,
  209841. 0x89924c61,0x34218b02,0xc6804c1c,0x492a0b0f,0xafaae6a7,0xd65be706,
  209842. 0x0d01be61,0x3b13d23e,0xf87f4c69,0x44545b47,0x04dc1aa3,0xd42236e2,
  209843. 0x3c5161ec,0x6135261d,0xbd88bc07,0x1eb46a63,0x1599d720,0x78c6d836,
  209844. 0x69baf0f3,0xf6955fe1,0x17072820,0x467eebd6,0x3e3a340a,0x2f1b8a2a,
  209845. 0x2d0b5f88,0x636dac76 },
  209846. { 0xb4c80af3,0x94280db9,0x4e3892ab,0x9a189cd1,0xd1477ddc,0x26e702e0,
  209847. 0x68f9f14f,0xe91aee38,0x80baa0b2,0x2864f63a,0x8b714a29,0xacd81f73,
  209848. 0xc5fe7cb6,0x30e1b870,0xb10837fd,0x883ea1c3,0x6b20489f,0x2da27953,
  209849. 0x58a2da5f,0x3aeb2a68,0x03a8fa14,0xe2330bf2,0xdc70b1c4,0xb5c488b5,
  209850. 0x299678f4,0x0a78c4d9,0x25df675c,0x233bd098,0x7b67d368,0x37b5c076,
  209851. 0x4d0bef3f,0x2f6dbdfe } },
  209852. /* 58 */
  209853. { { 0x2e4da7c7,0x2f8472fd,0xae677932,0x708cfc91,0x3dc268e2,0x364af08a,
  209854. 0x799a2424,0x0f10dfe0,0x71d58bff,0xef912d58,0x988962e6,0x6bf35dfc,
  209855. 0x5f47ea0a,0x28b96fa9,0xaad308c1,0x734a79ea,0x9f437bba,0x95730337,
  209856. 0x6cf54f75,0x002cbd8e,0xe7632eec,0x47606dcf,0x53193104,0x404b5ecb,
  209857. 0x0acf729d,0x0ae0897c,0x3bddf1de,0x89628b86,0xf87d7448,0xeced154e,
  209858. 0x458d5d4e,0x5cb6e197 },
  209859. { 0x008c75ed,0x98cef197,0xf6eeaaf8,0x7cf49d3e,0x1875e96d,0x1d6f9e02,
  209860. 0xdd9b0d8a,0xfcec2cfe,0xb9576daa,0x38a61cfe,0x36a7dbb8,0x10003f39,
  209861. 0x23b814f4,0xb37c3868,0xb80e3153,0x9fb66dcb,0x059847a8,0x9e7e2eba,
  209862. 0x35a72770,0xa4ec63fd,0xfc9e0ed0,0x311f3d91,0xd515baa4,0x3c1dc094,
  209863. 0xa08cd4e3,0x75a06ebc,0x2ed5eeaa,0xab617238,0xe1f52c1f,0x2e82bbb0,
  209864. 0x5175d6e5,0x2149d630 } },
  209865. /* 59 */
  209866. { { 0x5f9311f6,0xee1a8e6f,0xbabc1f85,0xc97e3c9f,0xb494209a,0x4fa7c52e,
  209867. 0x19774fe1,0x04c2f51c,0x8555844f,0x5cefd122,0xb5873ab3,0xb53862a3,
  209868. 0xcbed19fc,0x768efdd6,0xee58469a,0xcdc12479,0x3d80c09c,0x11237e31,
  209869. 0xc044c28c,0xdd74a290,0xbd47e287,0x9ee6517a,0xad0ffeef,0xc2421228,
  209870. 0x818d281f,0x4273088f,0x43ec0de1,0xebc744bc,0xb415bd73,0x5b26eccf,
  209871. 0xcb07c26c,0x14e2f350 },
  209872. { 0x4216946b,0x548d2a10,0x7a4bd92d,0x6e801f07,0x43695160,0x5996d0a3,
  209873. 0x63a197c9,0x0f1b5c2f,0x061f77c9,0x79da3c4f,0x93ff7b22,0x1c1cd634,
  209874. 0xa234123f,0x5e61b650,0xf284033c,0x826b34c5,0xc2f34214,0x718b90e8,
  209875. 0xae806ec5,0xa5f35620,0xe324a9b4,0xa2fae345,0x8b53cb51,0x8c0bb95e,
  209876. 0xf9965778,0xc94f6ac2,0x6b9def32,0x07ec607d,0xd0ed8f27,0x63bf1dba,
  209877. 0xdcb61e4f,0x58537e02 } },
  209878. /* 60 */
  209879. { { 0x64f80ba2,0x1f64b064,0x0559a45b,0xe8e055e7,0xf1f4b634,0xc3262b34,
  209880. 0xde8c8482,0xef4f7d5f,0xc30c780a,0x9d55dea0,0xcfa1e693,0x1740afb9,
  209881. 0x7460c34b,0x2cfe6a66,0x1187c1ee,0xf6695941,0x5f974d94,0x1382f277,
  209882. 0x004549eb,0x1ca0ace4,0xbabded02,0xf8244b3f,0x4e3653ea,0xc36f4d06,
  209883. 0xc55c5f83,0xeab9f0dc,0xacebce90,0xd93b9cef,0x19061425,0x16658e72,
  209884. 0x82d7970d,0x4857835f },
  209885. { 0xd2576210,0xdcd525bc,0xd51b5443,0x9f378aa7,0x1bd83994,0xfe97bf17,
  209886. 0xf38ac621,0x930d0f63,0x818408cc,0xaf8f2c17,0x260f53f6,0x2692c87e,
  209887. 0xdb0a75e4,0x0ee45407,0xffdb1b37,0x0ec47ae5,0x7aa6a44b,0x769129dc,
  209888. 0x2e40b75d,0xb6f932b2,0x95ef3b77,0xe06764d0,0x68bc63e8,0x28fd47f5,
  209889. 0x9c0014c0,0xd1810494,0xd7995d8e,0x90e2d3fd,0x6c2a85af,0xeb39a05d,
  209890. 0xa21f3128,0x6c0277bd } },
  209891. /* 61 */
  209892. { { 0xb509e7ef,0xe41b7086,0x3d7f9f91,0x8842ec7b,0x5526b88b,0xcd285f94,
  209893. 0x051dd0ab,0x6e44e064,0x774f1ceb,0x90198c10,0x123e661b,0x6ecabe98,
  209894. 0x32f647d9,0x44811136,0x26c52aee,0x1dd82b45,0x939dc9d5,0xd650907f,
  209895. 0xfcd455bf,0xbd5eeef2,0x8d2e5d7c,0x7815a4dd,0x88bc9f2a,0x5ad4ec92,
  209896. 0x57a3b322,0xc6f10d0b,0x20b9cbdb,0xe8d0c1e7,0x9b774ee8,0x5a0b071a,
  209897. 0xf22fcf8f,0x3067bc9a },
  209898. { 0xb7ca9326,0xe0e589f2,0xb1224f63,0x17a106fd,0x747a57bd,0xb2354521,
  209899. 0x62b0882e,0x2614982d,0x4391ffcf,0x7f3af544,0xa84e440d,0x1aaa337b,
  209900. 0x941bb071,0x28ea37b0,0x2e4a7f54,0xa957dcb4,0x1a6ad5fb,0xe7ab662c,
  209901. 0xf7c36a20,0xd135e381,0x9baa0b6b,0x42e7980c,0x94e4671f,0x4237030c,
  209902. 0x8b0922e3,0x24cc63ff,0x445a589f,0xd10d5279,0xa870ff6c,0xbb99d316,
  209903. 0xa996c195,0x390c83ca } },
  209904. /* 62 */
  209905. { { 0xffc4a73f,0x50d3fa82,0x3bd53303,0x2665d635,0x264bb77d,0x80a06f8a,
  209906. 0x22d73d84,0x81c04a6e,0x0323b8aa,0x2409cff5,0x8c4c4d5a,0x31dce217,
  209907. 0x0c0f9c19,0x374aa80e,0x00186bb8,0x0b25a387,0xaaf1487f,0xd0b77a10,
  209908. 0xab498de1,0x15f39ad5,0x1aa0c116,0x92e32da6,0x96e25ce8,0x228e3dbd,
  209909. 0x5e8646d1,0xb57c88dc,0x267b1c68,0x672b1164,0x600bdec5,0x5d0d807f,
  209910. 0x223e573a,0x3ea4007d },
  209911. { 0xa595d0a3,0xd76debd0,0xaff0b3b4,0xa6bd76cb,0x9b1bdb97,0xbf2c154f,
  209912. 0x4c714c71,0x62b19ab4,0x221af663,0xc9bf33b9,0x8c941ef6,0x23d87c49,
  209913. 0xd79f0f6d,0x255804c3,0x2a7acbc1,0x6f1a1005,0x550528af,0x5dab79d9,
  209914. 0xc8d16213,0xfd77a6f0,0xde5e1029,0x40508b6d,0xf95da12b,0xd95ac0f2,
  209915. 0x758a8ba1,0x8860af71,0x7160c8fb,0x0b194c83,0xce004d34,0xa40e6c80,
  209916. 0x6b14aaa0,0x09f82a17 } },
  209917. /* 63 */
  209918. { { 0xc21366dc,0x60abe588,0xaf75daf9,0x729c0a4f,0xacb93ed4,0x70501fd9,
  209919. 0x87a16d70,0xb97e744e,0x98e7361b,0xa42e0a7a,0x28b54cf3,0x1acdaff2,
  209920. 0xb7bd9078,0xf087ccbb,0x663250e7,0xda6f3983,0xbaf07c09,0x66d693ee,
  209921. 0x8cbaf157,0x79baf4c3,0xdfca99d0,0x5a984e07,0xf26d8dab,0xab4d3247,
  209922. 0x7eba36f9,0x4d0be701,0x0e8dd216,0x37bb9e65,0x531c4f03,0x72aa4e24,
  209923. 0xb753d85a,0x77d1e984 },
  209924. { 0xd8e62367,0xd9373239,0xb9820cf1,0x3361848b,0x5a9c97c4,0x00c7e344,
  209925. 0x14f960fc,0x9a0ec9ae,0x740474b5,0xcf41f0cf,0xece065d5,0xa5eede8f,
  209926. 0x9e808610,0xb1de5a4e,0xae0cf75d,0x17c44ae4,0x6b148d0b,0x2fa56323,
  209927. 0xd29ff2dc,0x64fa740f,0x88cb212e,0xc605eb8a,0x6a863016,0xf2c771ad,
  209928. 0x607b4c17,0x6d6112e7,0x40d49785,0xfe90ec07,0xe256e0e5,0x599be18b,
  209929. 0xca54adb0,0x4e6eabec } },
  209930. /* 64 */
  209931. { { 0xfb99cfe6,0x950323d3,0xc9334178,0x7b09bc26,0x7cbdfb6f,0x64111e41,
  209932. 0x89a75760,0x91141744,0x10919cb0,0x4c633df9,0x396bfd2f,0x715fc7c7,
  209933. 0x8cab62db,0x8ca19512,0x4db81aac,0x30672473,0xb4c4c54a,0xe67a246b,
  209934. 0xbf229646,0xd77ea0fa,0xfa5b5d70,0x5bed15f1,0xc2f192f3,0xa5686da5,
  209935. 0x7f6690ad,0xdecac72a,0xcaa50b7d,0x0c4af2a2,0x6049ad2f,0xf44631c1,
  209936. 0x04ecf056,0x325d2796 },
  209937. { 0x4848c144,0xee11fb55,0xb6a7af32,0x4e062925,0x369e0f9a,0x125b68e1,
  209938. 0xca53b21e,0xad9bdae6,0x2e98ea1b,0xf50d605c,0x9f2fa395,0xbdb9e153,
  209939. 0xe91532f5,0x4570e32d,0x46a250d7,0x810698ae,0xad9d9145,0x7fd9546c,
  209940. 0x11e97a5e,0xabf67721,0x249f82e9,0xca29f7d5,0x9851df63,0xa9c539a9,
  209941. 0x71d0e3e5,0xfd84d54b,0x041d2b56,0xd1e0459c,0xfd80096a,0xceb3eb6e,
  209942. 0xe32a79d3,0x19d48546 } },
  209943. /* 65 */
  209944. { { 0xb540f5e5,0xfe19ee8f,0x04e68d17,0x86d2a52f,0xadbdc871,0xd2320db0,
  209945. 0xd03a7fc8,0xa83ad5a8,0x08bcb916,0x54bf83c7,0x2e51e840,0x092133ea,
  209946. 0xcb52dddf,0xbce38424,0x31063583,0xd5c7be40,0x458e3176,0xc1ebb9df,
  209947. 0xbc4dabbf,0xafb19639,0xc05725a8,0x36350fe4,0x84e1cd24,0xac4a0634,
  209948. 0xc145b8de,0xadf73154,0xb3483237,0x0aa6dd9e,0xcbff2720,0xa3345c3d,
  209949. 0xb4e453b0,0x1b3ace6c },
  209950. { 0x90a8bdc5,0x0343e5e9,0x6306a089,0xa203bf9d,0x8e48520e,0x98489a35,
  209951. 0xde7d1d06,0xbd17debe,0x5f795d3f,0x8fafa6d7,0x387b0a3f,0xa4ceb630,
  209952. 0xffddeafa,0xe0166b32,0x7e764e02,0xa2fe2054,0xe871f304,0x55ab9824,
  209953. 0x952ec45e,0xa2bd36bb,0xa90d20ca,0x7b4c1484,0x75bcfb53,0x5319f387,
  209954. 0x6982c4e5,0x34238a4a,0xa102921d,0xa2bb61c7,0xdb3ab17e,0x1e061b64,
  209955. 0x192f0a14,0x538ec33e } },
  209956. /* 66 */
  209957. { { 0xa19b56cf,0x193496fe,0x7bb99acd,0x663d77f4,0x57d0a881,0x8f04afa8,
  209958. 0x082835fd,0xcced3da2,0x5d82cec7,0x7e21faed,0xf8009c85,0x6e175b99,
  209959. 0x2d05a307,0xd9c6e31b,0x81487d82,0x96948d4a,0xd46f6655,0x86ebd3f2,
  209960. 0x773ccc49,0x86851aa8,0x8b1640a6,0x3e220f22,0x41a20b75,0x9f06e3a8,
  209961. 0x90ac0a6f,0x2cfffe5e,0x8ebeb3fb,0xf5a9b1da,0x6e08e2c9,0x2587d997,
  209962. 0x03e9f401,0x6fd60298 },
  209963. { 0x8eb7516a,0x54709f8d,0xbdc598ab,0x83058a74,0x87e801ce,0xd234dd98,
  209964. 0xd17b8a96,0xfd0f9d90,0x6e90f6ab,0xaa1e549f,0x5a7ed55b,0x2496ff80,
  209965. 0x6c254c19,0x0d9f657a,0xb8962575,0x3cdea49c,0x2dff27de,0xb685a3f0,
  209966. 0xdb8bc04b,0x3c50e7fd,0x987236b0,0x904ff0ff,0xbb0d5055,0x494298fd,
  209967. 0xe14be8d0,0x34b3386d,0x7c3d30d6,0x7ad34e9c,0xe159fdd9,0x1f2b32bd,
  209968. 0xc761e5c0,0x84cfa23c } },
  209969. /* 67 */
  209970. { { 0x8b99b964,0x13bc11eb,0x58e2fc47,0x8e280c0a,0xd4c9a54b,0x870fbc49,
  209971. 0xbf6e20fa,0x37a334a2,0xd7c88cfa,0xee583d0d,0xef4af1da,0x05e029a8,
  209972. 0x0c2ef8a6,0x6d55e234,0x209e9b62,0x61b6fdfe,0xbb8e080f,0x3b1dad26,
  209973. 0x9392fc1a,0x5adbc162,0x0aae3f4e,0x02ac0fe6,0xc2bf4d5b,0x8d99801a,
  209974. 0xc282fed2,0x2333f93f,0xb52db33f,0x16dcb10c,0xc55752e7,0x09f90f84,
  209975. 0xc84a0d8e,0x287d4c51 },
  209976. { 0x0e9867da,0x5fa58201,0x1a874cda,0x614589b3,0xfbdee22e,0x005e27c5,
  209977. 0xe612bda8,0xe357fef5,0x2d3635f9,0x4e0dbedf,0x6f125a86,0x62be70e4,
  209978. 0x0d94a2e5,0xa09b9884,0x28b5e5d1,0x7eb99a15,0x751028b5,0x21b9416e,
  209979. 0xe06d2cc4,0x1b137fd7,0xfea09845,0x6fa1f517,0xffcecbd7,0x3ba1e966,
  209980. 0x832f453e,0xd4c89a4a,0xeca68fa1,0x07b1e2af,0x4bd395a3,0xd0fb4453,
  209981. 0xd8ef9e13,0x0132a3dc } },
  209982. /* 68 */
  209983. { { 0x576374c2,0xe53c7785,0x84727040,0xe60526d1,0x228ca044,0x8a066dc8,
  209984. 0xf1ce1313,0x1fe1c1b2,0xcdeb0c5d,0x2aeec832,0x9cbf826f,0xa7596699,
  209985. 0xde77a589,0xcd188e81,0x118d1254,0xe5ce0fe0,0x0790b86a,0xa142a984,
  209986. 0x39ac28ce,0xe28f043f,0x87de5804,0x4eef8290,0xf639a8c5,0x83c31b32,
  209987. 0x5887794f,0xd70454a7,0x18b1b391,0xca635d50,0x31d9c795,0xcefea076,
  209988. 0xb6f8aa25,0x13cbee76 },
  209989. { 0x8d3f34f3,0x79cabe0f,0xa3617fe3,0xbda9c31c,0xdd9426a1,0xb26dee23,
  209990. 0xf29c9104,0xe9dd9627,0xe2c6cd3b,0x033eb169,0xfcba2196,0x8a73f492,
  209991. 0xb858c83c,0x92e37e0b,0x23b3fbb7,0xe4f2aca6,0x64be00a2,0x8101fb1e,
  209992. 0x948f6448,0x91a7826a,0x907260e7,0x414067b4,0xe30bb835,0xf774aa50,
  209993. 0xc999c06e,0xf922ca80,0x0ba08511,0x6b8635b9,0x25fa04f0,0xbf936b5c,
  209994. 0xe02e8967,0x4e0a1ada } },
  209995. /* 69 */
  209996. { { 0x8ba29c4d,0x00ca6670,0x22988094,0xc08240ce,0x16dda752,0x21c5ca67,
  209997. 0xabbbfa34,0x689c0e45,0x3ed28b72,0x1d7545fd,0xd7c56ab4,0x5f221198,
  209998. 0x38759d65,0x4b3d8f74,0x8fe50b89,0x93490dfb,0xe80eba16,0xb641f5d7,
  209999. 0x79acb537,0x7b0da5eb,0x0c1d5e5e,0xab6b1497,0xa5da429a,0x2338e68d,
  210000. 0x2f6d2f25,0xe010c437,0x6530f3a7,0x226f16d2,0xcbef08bc,0xefb0f7b6,
  210001. 0x9f99c999,0x733e30d9 },
  210002. { 0xa42a38f9,0xecfe1582,0x4730b500,0xaec2d58e,0xde976b2c,0x2ee2f2a7,
  210003. 0xa969c1bb,0xf0539db5,0xfcecdb4a,0x31954168,0xe7a8e902,0xf2f7348a,
  210004. 0x3121541f,0x1d58d7cc,0x2202ae52,0x5d25b75c,0xf40835a7,0xdea9965a,
  210005. 0x529b4e46,0x3feb6a41,0xbd27ad9b,0x5c97fb6f,0x261f900b,0xd87554c0,
  210006. 0x04d5b19e,0xb43031d9,0xcb219b9c,0x33d5e9b8,0x3ee00bcf,0x7a43d492,
  210007. 0xb79a5c0c,0x56facb39 } },
  210008. /* 70 */
  210009. { { 0xa3018bfa,0x019165a2,0x9ffad984,0x100c6b24,0x55341a9b,0xbbf1b1f6,
  210010. 0x25dc4cc9,0xe6bd1d97,0x2bfffe60,0x52850ed5,0x7e5509ab,0x24e992cc,
  210011. 0x4ceb59f1,0xff6c502e,0x1aa7d148,0x2f0b3573,0xe7e3aa46,0xe90c1ddd,
  210012. 0xd1142880,0xbaec9f45,0x65be5dd5,0x475cfd26,0x1febce13,0x83abb14e,
  210013. 0x80942d30,0x6aba4829,0x297e82c8,0x1e1b235d,0x50d8218d,0xb771cdbe,
  210014. 0xd94d6cbb,0x88599266 },
  210015. { 0x155ccaf2,0x08847290,0x7c5b773e,0x8679ebc7,0xb2dd08ed,0xa88b2dd1,
  210016. 0x87d475db,0x960a180e,0x6694d02a,0x80fdb6b7,0x3f3f9e96,0x3e8758c9,
  210017. 0x4ad836c4,0xbda3f6fa,0x32fb387d,0x9400c581,0x2550200f,0x25a78542,
  210018. 0x776ecf18,0x2a97c351,0x566db59a,0x03ebf46e,0x26545eda,0x4743a280,
  210019. 0xcf74ab44,0xed169d84,0x88cb3f69,0xbaab931d,0xd8257196,0x70ae932c,
  210020. 0xa0c09719,0x797224a6 } },
  210021. /* 71 */
  210022. { { 0x441f3567,0x632923f8,0x2e24bf1d,0xc11c3168,0xb7671fff,0x4b97726b,
  210023. 0x7a5e1a22,0x601746a7,0x3addb417,0x53dddea0,0x7f59b846,0x57867a3c,
  210024. 0x56cd7ff7,0xb012a987,0xf19ba9a8,0x1bd5fec9,0xf8306748,0x750379a2,
  210025. 0xab8c05d1,0x7763445d,0x7903f42a,0x5d7f441b,0xa903e46d,0xc011674d,
  210026. 0xadd126c1,0x1b1d3c4d,0x61455b40,0xa2752aac,0x555c356e,0x4da42a68,
  210027. 0xd820852c,0x3ff09c15 },
  210028. { 0xf9cb7784,0x4c0a1bce,0x2422f305,0xaec539bc,0x0c414aa7,0x5f40f9fd,
  210029. 0xffd42bc4,0xd3aa316c,0x2f358e15,0x42f5a4c3,0xd6e27682,0x00bdcd9e,
  210030. 0xf8a5ecee,0x069f789f,0x05e14f5d,0x8078018e,0x8b40c741,0x2bb3e493,
  210031. 0x7917f72d,0x5dbc8c1d,0xcc57150c,0xe0eea664,0xc3fa8920,0xa25ecc5a,
  210032. 0x1c797164,0x3c21b0f5,0x634ad16b,0x8f09a2f2,0x58391d9a,0x8e730fc5,
  210033. 0x4fdfae4c,0x47ef1805 } },
  210034. /* 72 */
  210035. { { 0x3da285e4,0x9965f3d1,0x3a01e3f4,0xba7d4dba,0x61214ad0,0x4738413a,
  210036. 0x22397549,0xd3b7d535,0x5a730b92,0xa53dbdcf,0x332d165d,0x3130d92b,
  210037. 0x82f97ef4,0x44a28541,0x44dce1b6,0xbf62221c,0x7e2a0ec9,0xbba13858,
  210038. 0xcbfad998,0x33f32c8d,0xb5fed44b,0x409e5f3f,0xc66217bb,0x5c328c65,
  210039. 0xfcdf71a9,0xb00db69f,0xb8920788,0xa23c2a21,0x3ae6464b,0xf8ab28e6,
  210040. 0xb8de0861,0x1a6b6e9c },
  210041. { 0x06af77aa,0xaf6ec2b6,0xa887f065,0x2e60f5cd,0x9f498c56,0x87d21400,
  210042. 0xfcbaaf4b,0xdb595b59,0x271ab855,0x0fb592a1,0xd4349b0c,0xa0ce10e5,
  210043. 0x887d8c9c,0x9d6187d8,0x154bd6db,0x03ee95f9,0x5d06c999,0x8fe53213,
  210044. 0xfb6a64d0,0xf4a7bc30,0x66a4cb60,0x3d22af0d,0x5d37367c,0x16952cef,
  210045. 0x997d8e55,0x6f0ea734,0x731732d0,0xb447c70f,0xa9cb3942,0x00ab3034,
  210046. 0x28510fd0,0x79dd0180 } },
  210047. /* 73 */
  210048. { { 0x3ac7424e,0x04e0033a,0x60fda4d0,0xdb06b688,0xbcb772fb,0x236a9766,
  210049. 0xf297cda4,0x294a8e2b,0xdb013c6e,0x4b0aab85,0x8723a3ad,0x3d2aec98,
  210050. 0x13c84a6b,0x0cae32cd,0x70ec169e,0x21888f5e,0x42a88262,0x739633bd,
  210051. 0x7b60d9b8,0x68ac792e,0x10769fe1,0x89f2b722,0xd24bed34,0x8f3fcfe6,
  210052. 0xa3eb24aa,0xd35efb88,0x484c706b,0xddecfa3f,0x929ece0d,0x7cc119a9,
  210053. 0x8d405436,0x87e5ad45 },
  210054. { 0x7d1000a7,0xba99aa9d,0xae823833,0x8b94affc,0xdfb83dc5,0xc8229628,
  210055. 0x845a418d,0x2f59fe11,0x5d417054,0xa8b970f8,0x72b71581,0x8918c265,
  210056. 0xc0d1dd17,0xe4ef477d,0x3afad7c0,0xb50b4cf3,0x01870a5b,0x21baea79,
  210057. 0xbb3a2868,0xc77087f9,0x124a59cd,0x7857531e,0x57f43239,0xed74c26f,
  210058. 0x0164c94a,0xd5f5ae25,0xf094bf74,0x6608b7e2,0xfdceea32,0xf4cdb5ba,
  210059. 0x990cc045,0x0b712519 } },
  210060. /* 74 */
  210061. { { 0x88d5c64d,0x5a290ca1,0xa7492534,0x0596d749,0x2a00e925,0xa04b0d3d,
  210062. 0xcaf7b66b,0x082cd02c,0xecdded83,0x912b50c2,0xff31646e,0x813ce9de,
  210063. 0xc75fff95,0x62ae70c7,0x7e2a4615,0x6f6852e0,0x03804fd1,0x320fd7d0,
  210064. 0x8218e8d9,0xb1a2a4dd,0xafc645d7,0x4918a6fb,0xe8d9fdbe,0xfb080fa1,
  210065. 0x4470b6ee,0x33d4d08a,0x6d974ef7,0xd2ba2077,0x69dae5d2,0x8ecb95a7,
  210066. 0x7d69596d,0x7a3f423a },
  210067. { 0x9a929387,0x362d2ca6,0xcb1c1fff,0xabdb7581,0x7e51b6cb,0xd892ec9f,
  210068. 0x3a4e131f,0xee8d8632,0x5bd87561,0x4680e3f1,0xd4e7e732,0xe3a597e1,
  210069. 0x5581fefe,0x3cc72b7c,0xca8cae0b,0xf3e77f8a,0x5e2fd4af,0xfcc7d7dc,
  210070. 0x21355b79,0xdd3a4552,0xa2c07177,0x546b24f2,0x0689621f,0x415b532d,
  210071. 0x3f78163e,0x2be9af51,0x33d7ed21,0x27d63b9b,0x96802943,0xab019ef2,
  210072. 0x1623faf4,0x2da5fc55 } },
  210073. /* 75 */
  210074. { { 0xc8a5c600,0x62429cf3,0x3fe33e7c,0xa7a80c22,0x0a57ddcb,0x9ffda740,
  210075. 0x925b0c74,0xd1ae156d,0x6b100eb0,0x097a43f9,0xef943c81,0x169e945c,
  210076. 0x1128cf24,0xa1f734e5,0x419f0133,0x04387c4a,0x01044024,0xc007868b,
  210077. 0x90359cf2,0xe5416abf,0x478d54e3,0xf9c76fee,0x42a2173e,0x66219da6,
  210078. 0x9fe30141,0x61e03156,0x93ef247e,0xa0ff5ce3,0x072b6592,0x811792ba,
  210079. 0x70c854d3,0x855f0219 },
  210080. { 0x847314c4,0x61fbfb6c,0xeb45b96a,0x97906155,0x6ba2afac,0x7102e146,
  210081. 0xab949781,0xed51f975,0xc110c4fe,0x9d2f5b17,0xaff57667,0x7ac8ce70,
  210082. 0x6eb244e7,0xe7366a21,0x551c65c7,0xdd1bbcec,0xe1a859de,0xb525060a,
  210083. 0x8ba7d2e7,0x7a048174,0xab8ea8c4,0xe1a2c541,0x6fdff078,0x6e7824c3,
  210084. 0x14874b04,0x79b49fc7,0x06b1f733,0x22ae337f,0x6f8fe6cf,0x1c352192,
  210085. 0x525d0797,0x292236cf } },
  210086. /* 76 */
  210087. { { 0x7d8b29dc,0xcdb8d80a,0x08ea648a,0xd17a2024,0xae92be91,0x7db12c5e,
  210088. 0xfda72fbc,0x1f347d18,0x9e760c6f,0x11374b40,0xd8e38d91,0x7361e8f1,
  210089. 0x739ac1f4,0x7714be9d,0xb4df5c4e,0xc1f9701c,0x6f72cae1,0xd9138ed8,
  210090. 0x6ad180c4,0x1c7fe1f7,0x9e2dbf9c,0xf8c185be,0x7c70c44d,0x835db269,
  210091. 0xb0d15b5f,0xf997cfea,0x61e6545e,0x5101445a,0x25184e5e,0x16b06884,
  210092. 0x7521e7aa,0x7cfac359 },
  210093. { 0x3c0bc53a,0x81182167,0x7e751367,0x84b5ede3,0xa3657a18,0x3ca255fd,
  210094. 0xba1fdd98,0x096abbf4,0xc5da77d8,0x9ce8369f,0xaab342c5,0xf27b9ae7,
  210095. 0x972059f1,0x06c91bd6,0x914ecfe9,0xee0dab30,0x93f53f12,0xbb647fbb,
  210096. 0xffa57e0e,0x30c38a7a,0x9f2ad607,0x517d06ef,0xbb99dcc9,0x49728d87,
  210097. 0x446080a1,0xb0034af1,0x12b9c17d,0xcc810c3f,0x772a22a0,0x7225f14f,
  210098. 0x1ddf82bd,0x6ce3dc7f } },
  210099. /* 77 */
  210100. { { 0xa4397830,0xc07cd835,0xf4733306,0x4dd9290c,0x29989e8c,0xdd35d3a8,
  210101. 0x563d8152,0x79902559,0xe87de61b,0xf278d911,0x1024e35c,0x9c7340c7,
  210102. 0x4a0d0e59,0x2d444461,0xf32626a1,0x63e7608f,0xc4c9baa9,0x627a37e9,
  210103. 0x76fffd25,0x0c56dc51,0xcef2a1cd,0xcb6defc8,0xefc559d9,0xcbcc0d56,
  210104. 0x041cb692,0xe45f3fc5,0xe5161e09,0xcd05c239,0x5c3b559c,0x2a731ee9,
  210105. 0xa3d0a16d,0x85151122 },
  210106. { 0x86ff19e2,0x782d0335,0x1da28603,0xc2c60daa,0x557c7eed,0xb2e78cfe,
  210107. 0x1bc4e8b0,0xa8f6f984,0x3df35c67,0xcc1f9b4b,0x4764462a,0x96e13603,
  210108. 0x7c7ae0b0,0xbf910b97,0x51435956,0x27c7f305,0xf631eae5,0xc14db15c,
  210109. 0x7e69b34c,0xa51d6142,0x5fc12ff2,0xdec82851,0xfb887162,0xfcceae13,
  210110. 0xde1488bd,0xda332ac1,0x2ee3e74c,0xa20374e2,0xf0ae069c,0x597ea1a1,
  210111. 0x77bdec04,0x8b1159f2 } },
  210112. /* 78 */
  210113. { { 0x2f961d30,0x4af71a44,0x7ac7248f,0xbdf968a8,0xb1a906cd,0xd32df87c,
  210114. 0x04abf925,0x00c10e26,0xb9f04d4c,0xb8711759,0x939705da,0x00d54e60,
  210115. 0xc9f80849,0xf7587433,0x6a7a2375,0x2e9abade,0x94ac17ac,0x5676d478,
  210116. 0xc202d99c,0x4ca0525b,0xabfae73d,0x95b8bcad,0x3405991b,0x2371ed38,
  210117. 0x458a99c3,0x2b69e47a,0x2b78c866,0x7cac0b18,0xe0232c7c,0x6ceaa79b,
  210118. 0x588f7459,0x0bd86433 },
  210119. { 0x7e734189,0xdea1a8b4,0xcfe5fa17,0x52c5ac88,0x11437664,0x444a4d4e,
  210120. 0xaf9e9750,0xc2522308,0xd30c6b3b,0x78b1d0c3,0x4c6df477,0x2edae5f0,
  210121. 0x2ee88dd7,0x53131d9a,0xacc93e34,0xc4e380ee,0xa8db0e8e,0xd499b1ac,
  210122. 0x7f5d49d7,0x77348c16,0x1556ccd7,0xc9663257,0x2611d13d,0x65ce0e8c,
  210123. 0xb5a2fdcc,0x2c95fe66,0x8658faa1,0x26698832,0x31c32c98,0xda87d1f4,
  210124. 0xfcd91907,0x46650598 } },
  210125. /* 79 */
  210126. { { 0x6b4a5efa,0x4c6c13cc,0x1d07b265,0xc481989b,0x8bdc69c0,0x10b966ce,
  210127. 0x2c2531d4,0xf54cfaa2,0xcad0a100,0xcb5f1808,0xee5da449,0xbeb52538,
  210128. 0xbedd83cc,0xa6240085,0xd6255c78,0xe792dacf,0x2062058f,0x88371906,
  210129. 0xed1658c1,0x96615e83,0x7d28d542,0x4b549b27,0x83b75df3,0xeaf127db,
  210130. 0x17fbb942,0x4f60df6d,0xf6f7c930,0xd08631db,0x6018789f,0x17c38f98,
  210131. 0xb9a9280c,0x0c43574a },
  210132. { 0x1d20cad0,0x76eb324c,0x8c61108a,0x90decb09,0x6f06d36d,0xa6e9d39c,
  210133. 0xbc0da197,0x6cd978ba,0x507ac5ce,0x5948b1c0,0xc5497eb5,0x2bd47164,
  210134. 0x4d5914e3,0x2a9c4c0f,0xa759f03c,0x772c5046,0x69ac847e,0xe7d7328a,
  210135. 0x3048b330,0xa8d57d0c,0x40f7bace,0xe60034e0,0xa85f1790,0x823d9193,
  210136. 0x5c859736,0xa6e9b66c,0x679e1022,0x22ca2c7a,0x09023fa4,0x00e7a19c,
  210137. 0x2726d5b9,0x324999f1 } },
  210138. /* 80 */
  210139. { { 0x7c834915,0x667eaed6,0xbc5eb64d,0x9f77aa6a,0x25d62011,0x729ebcb6,
  210140. 0x699fd9c2,0x0aee24f2,0x2b8d4f6c,0xe1eb5874,0x14c976d6,0x7f12710c,
  210141. 0xf6d9ea65,0x91390335,0x06b50064,0x668b7049,0x0876ee4f,0x65969a0e,
  210142. 0x2f9d9360,0xf901bf3f,0xb499e3ce,0xfb1a8651,0xf2dbcaaa,0x80b953fb,
  210143. 0x973b06b6,0x312cc566,0x3af36c64,0x3534d9c3,0x10ffd815,0xe4463a52,
  210144. 0xf18c2b91,0x57ea2b4b },
  210145. { 0x8aa0f2f2,0x00f5e162,0x0e46bcaa,0x8c7e75c5,0xa4a2c42d,0x97ab479a,
  210146. 0x14baa202,0xb4f308ea,0x6943cc2e,0xa901bd14,0xeed58804,0xbb125fee,
  210147. 0x9d180f7c,0x6502c8f9,0x1580c61c,0xe5353919,0x27101ee3,0x7e278069,
  210148. 0xfaa72717,0x7a0a40a1,0x4c75b153,0x32edce02,0x538f1c22,0xda23660b,
  210149. 0xbe307d2e,0x4d511e98,0x9baee0b4,0x24276e40,0x7ff1f307,0xa78c3927,
  210150. 0xea7935c9,0x60480b46 } },
  210151. /* 81 */
  210152. { { 0x3872ece3,0x31087d66,0x955b70f8,0x5f29be7d,0x9cf95bb8,0xb50b4fc7,
  210153. 0xdbffa621,0xbae3b58d,0xe022ba5d,0x0e61d280,0x4181449c,0x78ae5117,
  210154. 0xcf555485,0x0b132840,0xb8ce0b0e,0x800ed1b6,0x78d5de3d,0x35dffdd5,
  210155. 0x69a56b47,0xf7e42374,0x8d910ae7,0xd5e32369,0x6313c7c7,0xb6ff52a0,
  210156. 0xa92de9e5,0x5a2fe20d,0xd12110bb,0x41b347d3,0x40c16f23,0xc5905edb,
  210157. 0x9a8f88cc,0x0774a0d3 },
  210158. { 0xe3b6c106,0x3ae181ab,0x8de150b7,0x4ebe163f,0x6f354836,0xcf75b82f,
  210159. 0x3ac7ac16,0xaa0d2063,0x291722af,0x5c680668,0x11545553,0x73941e61,
  210160. 0xbf5de3f7,0x17127e38,0x1afb41da,0x32cfdf03,0x87bc8663,0xc6893c91,
  210161. 0xa62c9c99,0x75046744,0x962c1947,0x96866e2d,0x378cdf4c,0x489ec8df,
  210162. 0x3407fa32,0x3a60709b,0x551290d1,0xd37d2159,0xbab92273,0x9623d303,
  210163. 0x2432014b,0x08151954 } },
  210164. /* 82 */
  210165. { { 0xfb7b2108,0xf9236d89,0xad75f9aa,0x3ecc83cc,0xb4e1da11,0xf7c72b15,
  210166. 0x0315c362,0x552aeaef,0xf272fe3f,0x11e140ed,0x87843ee8,0x99d79bf6,
  210167. 0x1d9bb25b,0xce6b54fd,0x5b1bad74,0xb20b0e21,0x5b84c90d,0x54a0214f,
  210168. 0xfca6cec9,0x459bbf52,0x9e4df76f,0xe363c48d,0xd64cf17e,0x3045f84e,
  210169. 0xf62ada48,0x8402a167,0x6a74ca01,0x2c9e1bf3,0xf691c42d,0xe8cf9d41,
  210170. 0xc2c4b874,0x5abf2178 },
  210171. { 0xf3b3bccd,0x4777966b,0xbe3e0caa,0x0047e0f0,0x8c7d5043,0xcb8383b3,
  210172. 0x946fd5fc,0xe77e3baf,0xe9ec0e87,0x79baa785,0xc8a18d25,0xd83c557c,
  210173. 0x25befcfe,0x9b96e5af,0x98c71b61,0x4f05d15e,0x77e62da1,0x081f991a,
  210174. 0xcbaa3821,0x1c6ec781,0xe54d9bfb,0x7522f65d,0x44ed1430,0xf5d05573,
  210175. 0x95cafdda,0x3035b31f,0x6378f5bf,0x47e67f43,0x5270b9d9,0x029f7cad,
  210176. 0x4d916a48,0x15ad1587 } },
  210177. /* 83 */
  210178. { { 0xaa588ae4,0x00de2ece,0xa371a232,0x552ebc58,0x71230444,0xd00ea934,
  210179. 0xe4b1832d,0xafbfa67d,0xb689e843,0x29216341,0x61f4e2e8,0x1f96bbbd,
  210180. 0x04c29dc5,0x95420684,0x42317fd1,0xc7fe3827,0x63483162,0xe0a0aec6,
  210181. 0x0700184f,0xfc2b94d1,0xfe1fbd85,0x07219973,0xfb074352,0x648b6ab1,
  210182. 0xc46e5392,0x23bbdaad,0x00fa56ff,0x0db8dd1f,0x866725f6,0x104815eb,
  210183. 0x52e81963,0x3f9c4cca },
  210184. { 0x32ce637e,0xff36b297,0xf5d25cdd,0x81a15f2d,0x8b02ad97,0x1a1d052d,
  210185. 0xcfbab3e9,0x2e5f3bbc,0x614eeb75,0x60d2cbd7,0xcd5a793a,0xd4491843,
  210186. 0xcdba2144,0x2242cf75,0x88b99766,0xa20705e7,0xec77e132,0x64e12cc0,
  210187. 0xb61a9b05,0xb1c14df6,0x74825b5a,0x8fd97f04,0x3da31223,0x95604821,
  210188. 0x4d30c70d,0xde486727,0x1c12ee69,0xbcab8f15,0x668d893d,0x5dc638b4,
  210189. 0x223f574b,0x6479dad6 } },
  210190. /* 84 */
  210191. { { 0xb05f2b26,0x569044f3,0x80b9f76c,0xb35a294a,0x4290f6ae,0x8839fe28,
  210192. 0x026a5877,0x761cfb23,0x2e5ff9c3,0x768926b6,0x0b11c576,0xbae6cd20,
  210193. 0x72a03efe,0xdc857756,0xe1bad63a,0x0cae074a,0xd709d99c,0x3fe491a1,
  210194. 0x6501d9c1,0x76c5ded6,0xc32aeff7,0x1da6eca1,0xc57683e8,0x50849d55,
  210195. 0xdf98d847,0x9e392e9c,0x64d9a564,0xfad7982f,0xa37b98b2,0xf7c3bdb7,
  210196. 0xf0860497,0x1fe09f94 },
  210197. { 0x7648cc63,0x49a7eaae,0x67cfa714,0x13ea2511,0x653f4559,0xfc8b923c,
  210198. 0x81a16e86,0xd957619b,0x3c864674,0x0c7e804b,0x1616599a,0xfc88134a,
  210199. 0x0a652328,0x366ea969,0x4bc9029e,0x41532960,0xae2aad2b,0xef9e1994,
  210200. 0x7f10bef5,0x9e2a8c52,0xc67bf860,0x73dcb586,0x844cc25d,0xf61a43fa,
  210201. 0x74eb3653,0xd74e7eea,0xdd240f02,0xf3356706,0xfd83bcb4,0xeec7694c,
  210202. 0xdb62526a,0x4de95786 } },
  210203. /* 85 */
  210204. { { 0x3deac2f7,0x4867d315,0xb61d9a8e,0xa084778a,0x0ab7b2d5,0xf3b76f96,
  210205. 0xcfdf4f79,0x00b30056,0x31ab8f4b,0xd0701e15,0x9c779d01,0x07f948d5,
  210206. 0x82675371,0x7c994ebc,0x48bad4c0,0x1104d4ee,0xbfc9d058,0x798ce0b5,
  210207. 0x309fa80b,0xc7ca898d,0xacb33eaf,0x0244f225,0x5b2f3175,0xd51e8dfc,
  210208. 0xa4d7be34,0x3e49ba6b,0xbda02b43,0x1760f4c7,0x4435275a,0x37e36a7e,
  210209. 0xe636980c,0x1c94418b },
  210210. { 0x09dc1414,0x43a21313,0x43c93537,0x060765fc,0xdf5f79ce,0x6ff3207a,
  210211. 0x85d4cfca,0x6f18b1fa,0x63e995ab,0xf5c4272e,0xa82b3002,0x121a09e4,
  210212. 0x97147f16,0x82b65d1b,0x20a7fe26,0x4993c20c,0xe6716726,0x99c9cb98,
  210213. 0xfeb440a0,0x5a02d673,0x251b4bc5,0x3f3fa9e1,0xa05338ea,0x75dbc474,
  210214. 0x7b09f6cb,0x3cb4044b,0x80434609,0x6767da18,0x098ceac2,0x97851422,
  210215. 0xb55235ba,0x611bfbb2 } },
  210216. /* 86 */
  210217. { { 0xf00ad2a1,0xbdbaa55e,0x14a290d7,0x29efa85e,0xe92b1694,0x3b4a4768,
  210218. 0x11ec8130,0x67111bcd,0x88bd27b2,0x0e425702,0xd9a03c06,0xf28cf2a3,
  210219. 0xf318884a,0xbb7c8d2d,0xe3aaeb20,0xe2ea1462,0x43b85d77,0x33535804,
  210220. 0x554ee9bd,0x81ee4482,0xe6aa198f,0xeb2eee9e,0xc26c5944,0x7a5aa804,
  210221. 0x82ab167c,0xa0ef2da5,0x02fe21a5,0x5a2ab476,0x3370298e,0x169cb3b8,
  210222. 0x0eb3aa8d,0x86e6c544 },
  210223. { 0x0b793d9b,0xede03321,0x1ddb5ece,0xf79fade1,0x68930b64,0xf73fda92,
  210224. 0xfe4fd1b2,0x06aad97d,0x92a4dc88,0x073a5b1d,0xbc976d75,0x8af8cbd8,
  210225. 0x63ce26c0,0x60b4abb1,0xdcb1fb06,0x9c8300a9,0xda95b3d3,0x335a594c,
  210226. 0xb37eac87,0x1f97d7d4,0x20eefaab,0xa3d2eba2,0xf3e828c8,0x3258c906,
  210227. 0x85ab7781,0xc832616f,0x8c28b617,0x72597192,0x3233b82d,0xcd7196bc,
  210228. 0x19fa126d,0x83867eb9 } },
  210229. /* 87 */
  210230. { { 0x22474edb,0x774fe73e,0x1a84e1ae,0x2a766394,0x9c6dd6e3,0x270329ad,
  210231. 0x14f8bf5d,0x00c4a415,0xd2267b90,0x3ce2ea37,0x11d24fae,0x12753015,
  210232. 0x263a1b78,0x7c14d854,0x1ae0b206,0x20c8401b,0x081f49fc,0xf32a011b,
  210233. 0x959c6df8,0x1e8123fb,0x800e1d06,0xa328dc7c,0x24259a9a,0x5876a378,
  210234. 0xb7ef6c37,0x23ada8b5,0xa93d4c9f,0x023f6b6e,0xffb6389f,0x89f5414d,
  210235. 0xe628b39e,0x4b26bba2 },
  210236. { 0x5d318454,0xd30b1cb4,0xd7436cb6,0x123b749f,0x568a7461,0x3110c726,
  210237. 0x1c84fd1e,0xc85de123,0x08403d55,0xa5f8d6e6,0x9b1fabf8,0x395b6e13,
  210238. 0x3cfedce0,0xfe6d68c3,0x94b91110,0x1d90381f,0x2dcc6eb7,0xf0a8ea81,
  210239. 0x7e90ca2b,0x59e80413,0xc8a25c5a,0xbeb5fc07,0x5d84663c,0x009c253a,
  210240. 0x910b6a7c,0x00b15073,0x4108f8d5,0x8607da4c,0xcb901e65,0x02c3d9c3,
  210241. 0x2c9615c6,0x4d697bc5 } },
  210242. /* 88 */
  210243. { { 0xefa8fb40,0xe0db1ef0,0x5ba3989c,0x29021c5b,0x809d19df,0xa8d6fb15,
  210244. 0x4c1219e1,0x6b787b73,0x14ef05e2,0x6417e168,0x8f9796e2,0x449342db,
  210245. 0xbf84421b,0x2f878a5e,0xe94a4536,0xe71916d7,0xae119693,0x9818bba3,
  210246. 0x5768804e,0xec674be9,0xf8424f8a,0x0a26074c,0x466ce6ab,0xdbc93b9d,
  210247. 0xc920078b,0xb3f15a98,0x3870f1a3,0x9d10fd0d,0xe4e785a7,0xa61241d9,
  210248. 0xe6c8cd80,0x76ca87a1 },
  210249. { 0xe02e48b7,0x4357fb56,0xcc09e9c6,0xfbd14b13,0x24069cf0,0xdb5f2435,
  210250. 0x2c3b01a9,0xf878165c,0xe6956dad,0xe549e7c4,0xbbd60b68,0xf2fe9538,
  210251. 0x059dc653,0x952f856b,0xb377fe9b,0xd3f60225,0xbfe908c4,0x6a0c7328,
  210252. 0xbc8f5f2d,0xce6aa2d3,0x24425050,0xf7213443,0x3d3b3ce5,0x17e1266a,
  210253. 0xc1677512,0x75b5e43f,0x37fb894a,0x15927062,0x2be3e375,0x15260753,
  210254. 0x6da3b7be,0x27e7f2c6 } },
  210255. /* 89 */
  210256. { { 0xe6a15883,0x638f65ad,0x66afdb33,0xd4a7e68c,0xd3f12de5,0x6207b6ab,
  210257. 0x37b87810,0x1c6ff950,0x64acf6d3,0xc0d44cb2,0xf2be78c2,0x163ac601,
  210258. 0x1636980e,0x1c63cc5a,0x95c9349b,0x3e92cfe8,0x41ec7220,0x7738e0d8,
  210259. 0x2d5fa961,0x6169d764,0xc3e028e9,0x2aa776c1,0xb16d5409,0x93dc5646,
  210260. 0x706df4d9,0xa0b27fb5,0xce9c6b97,0x9e991170,0x53c85f40,0xea8e42be,
  210261. 0x83246528,0x02e96437 },
  210262. { 0xae78ea1f,0x91540add,0x7b670e96,0x51a1b74d,0xf7006826,0xf9936441,
  210263. 0x7d7520c7,0x8f97d6ea,0x69ce12e1,0x0faa6a02,0x79208342,0x2590aca8,
  210264. 0x75614436,0x7a483863,0xf381408f,0x07c6149e,0xd7853406,0x733bf584,
  210265. 0x9abbb6f7,0x8761b010,0xf528a09a,0xe4eb249f,0x2e00ae3c,0x08781ed8,
  210266. 0x2178effa,0x864c1b25,0x9d513a7e,0xcc1e62a2,0x1919062f,0xedb8b94e,
  210267. 0x4f16527d,0x739f53da } },
  210268. /* 90 */
  210269. { { 0x924adc5f,0x7a5f4a88,0xa818f56d,0x95646c16,0x7795f954,0x0ec49129,
  210270. 0xd19c5400,0x2b48753d,0x205912b4,0x16fa236b,0xe87a4946,0x6b3d65f3,
  210271. 0x045fd066,0xa7174a01,0x12a5e140,0xb6350313,0xa96b8623,0xa79c4b44,
  210272. 0x9ab003d5,0x7a339d65,0x3826f31a,0xc72f30c6,0x6f7090cd,0xb4e7390c,
  210273. 0x906ebe24,0x59ac6c36,0xbba4505a,0x39a7f06d,0xc58c413a,0x839991e1,
  210274. 0xa20e0e84,0x020c23ff },
  210275. { 0xafc74661,0x120e4ada,0x277fc065,0x37bbcf63,0xb6dce799,0x41049cf6,
  210276. 0x7b161ba1,0x5b8d6b53,0xa9610fb2,0x22218431,0xdfdde769,0xde9ec9d1,
  210277. 0x42d80630,0xd32bfa4d,0x6244df4b,0x3885702a,0x45592dfb,0xcdedd1ed,
  210278. 0xfb4e01b8,0x0e1df45b,0x86e215b0,0x8f4bded2,0x6a937e6a,0x80935487,
  210279. 0x8130f723,0x415278ba,0x38a821f8,0xc6dc4692,0xfd8b4f8a,0x2207b119,
  210280. 0xf9269cef,0x76e7bf53 } },
  210281. /* 91 */
  210282. { { 0x27ebd187,0x5f128428,0xb65aadbb,0x8d3320ab,0x72258695,0xb042765a,
  210283. 0x8f0986ab,0xda3f33f9,0xaebff503,0x411807a7,0x825f71a5,0x25c776ca,
  210284. 0xff7df24b,0xc0de7bed,0x165f1fb4,0xda8b0f42,0x731f3ae3,0x5f3ff737,
  210285. 0x193e0a52,0x4cd1d7e7,0xb6b3ba46,0x8df84aa3,0xaa1f3782,0xba84b897,
  210286. 0xe7733ac7,0x6e7960cc,0x50981a21,0x4d46d6ab,0x7cbb80ed,0x1ec12c25,
  210287. 0x2b96ef09,0x79e7ad27 },
  210288. { 0x8f30caae,0x3cd970dc,0x0a6ebef4,0x85cabcf1,0xc714616d,0x63c1863e,
  210289. 0x519e3a98,0x1c50db0b,0x64cb13d6,0xf39b8963,0x22547b69,0xdf67d81f,
  210290. 0xd67db0cc,0x7157abb9,0x889491b7,0xccca25ba,0x7a27e0dc,0xf689207c,
  210291. 0x0fd43281,0x34ae8fbe,0x5720ec09,0xa5d91f73,0xcdfd7bed,0xb2f61909,
  210292. 0x4a039e32,0x1ec10232,0xdb0d8fdc,0xd3c3d65e,0x4fe5005d,0x32c916c8,
  210293. 0x4c0bea94,0x7f8c37ac } },
  210294. /* 92 */
  210295. { { 0x43ac05e5,0x33ec1e54,0xcd8d3825,0xda4a4da4,0x88bf9e2b,0x86d88c0b,
  210296. 0xb53811dc,0x34d71dd0,0xa3c3aba4,0x655040d2,0xb61611be,0x2bc40949,
  210297. 0x279a4fa0,0x1c2d426e,0x3b065ac3,0x535a5aa2,0xc52ea890,0xdaa8a32f,
  210298. 0x9fddad22,0x5a5deca7,0x2ab3b26f,0x911f05fd,0xf37cd81e,0x5dace7db,
  210299. 0x90d16b8c,0x0e0e44e7,0xe4f5894e,0x15e68aed,0xfc92a74f,0xafe04999,
  210300. 0x970e7c2f,0x1d7703aa },
  210301. { 0x3f0062a9,0xa8a4c81d,0xd96a20ba,0xe31eb2b8,0x864bd101,0x66dd98df,
  210302. 0x4413b614,0xba05f592,0xe9a555f8,0x51a67a0d,0x2e4b52d1,0xacc2f097,
  210303. 0x7184ab23,0xab5daaec,0x7c7f691b,0xce08b43e,0x76c427f4,0x520e530b,
  210304. 0xe423ebdc,0x7d352069,0x34df14ce,0x6b5e39e8,0x446305ac,0x3dcbf295,
  210305. 0xfe34cdc1,0x682cb2e1,0x111f5afb,0xd4ac45d1,0x47f296f9,0xc5ef63cd,
  210306. 0x93c20871,0x0a2c40ec } },
  210307. /* 93 */
  210308. { { 0xaf5747db,0x09bc384f,0xc06ab86b,0x3bad6086,0x9e7c1547,0xa406882e,
  210309. 0x55977abf,0x2d5326d1,0xda81deb0,0x063a9a05,0x524b6111,0x9a86e4a7,
  210310. 0x4ab2eb90,0x1402f87a,0xd5c600ba,0x7d0721d4,0xf289fdbf,0x1a2fd9a9,
  210311. 0xecde6f07,0xf5dce66d,0xdab9fa73,0x62171277,0x6c474bab,0x6d2dc49f,
  210312. 0x76eed033,0xdc017e1f,0x4da825d3,0xb97175c0,0x54b05e43,0x6c297e3d,
  210313. 0x56c9c87e,0x2efb4546 },
  210314. { 0x8b21c064,0xa4712b00,0x4a70629e,0xd186fe42,0x9b74f0af,0x6435b340,
  210315. 0x7ec9e629,0x6965aa43,0xc4c60d08,0xdda14673,0xbf3057aa,0x0b656670,
  210316. 0x3ce86f60,0x7f05e840,0x04401a16,0xc05073a9,0x294e607e,0x16b1e638,
  210317. 0x69cf7046,0x20783252,0xe8ce7d3a,0x2941141b,0x7577053d,0xd38ad8d3,
  210318. 0xcaa6630d,0xdba68fb3,0xe9504350,0xecbeaff1,0x1d2d760b,0x9f5166d5,
  210319. 0x462891e4,0x337532ce } },
  210320. /* 94 */
  210321. { { 0x3a00bb9b,0x3f111853,0x45f66685,0x2d2ffbae,0xd4aee24d,0x9ae11a85,
  210322. 0x0341856e,0x18ba1e1b,0x2731349f,0xa9ac8178,0x545715b5,0xc13dfd4a,
  210323. 0x5daad2ea,0xa5f7423c,0x535b76a7,0x30a483b9,0xff873e9b,0x92e9ada4,
  210324. 0x723a1055,0x15662d84,0x8edac4e0,0xb935497b,0x39d8fa70,0x61b6441a,
  210325. 0x40d1589f,0x1541d756,0xf0a05f0a,0x62994237,0x6bb28908,0xfd8b0034,
  210326. 0xd4cd32bf,0x192a2b5d },
  210327. { 0x365ced07,0x63576628,0x05de1d1f,0x029f32fb,0xbf40a7aa,0x6d17b9bc,
  210328. 0x9bb50a47,0x1b1b2a08,0x795a6278,0x9389abbb,0xb34fc19b,0x52cff60f,
  210329. 0x387d8739,0xf3ab9492,0x6920ccd6,0xa8f053e6,0x63a9b4f0,0x3ef2dd4b,
  210330. 0x51e82129,0x9ab0ede1,0x0838bfa1,0xafba0c0b,0x9ffc11be,0x2bd5a7ac,
  210331. 0x95cc0878,0x058bfd95,0xf8c2f0c6,0x686d48a3,0x1d9b31ba,0xc33abaaf,
  210332. 0x3bc0c268,0x632e2289 } },
  210333. /* 95 */
  210334. { { 0x15a1ccca,0x1c851d20,0x7e522bc3,0x4efe290c,0x18eab053,0x0b741d55,
  210335. 0xbc85e217,0xae656197,0x01cf8b29,0xae13141e,0x66948478,0x2e2cb593,
  210336. 0xc31bd8ae,0xeb57bb0f,0xc264e788,0xdecef5d6,0x9cb96d86,0x6fa856cc,
  210337. 0x279183da,0x2db16813,0x383d796a,0xf03f3820,0x1d0c6fed,0x58a456ff,
  210338. 0x8a6abd9b,0x25589805,0x83f96f19,0x339f52c5,0xda7e9ea7,0xcf6ded8f,
  210339. 0x5d1ccd45,0x68c3d9c1 },
  210340. { 0xe6b392b7,0x67e26265,0x775d9509,0xcec1d9bf,0xd76514f7,0xe16abcd4,
  210341. 0x0de72e1c,0xd86f59b2,0x1adfb033,0xa66e43cd,0x05e457cc,0xdb344340,
  210342. 0x5681daa2,0xb67a7916,0xf0114731,0xc32e7bab,0xd3b1e961,0x066fe16e,
  210343. 0xf63d26e6,0x924e298e,0x541add6d,0x9bea0dd8,0x9982f971,0xef9500df,
  210344. 0xc5f076ac,0x5c876e63,0xb23d396b,0x55e12ae5,0x2ec6747a,0x09efbb36,
  210345. 0x233286a5,0x8f2055ee } },
  210346. /* 96 */
  210347. { { 0xb82c1af0,0x4a4ab9e3,0xf2cae264,0xfc65e9e7,0x60187d46,0x4feaac0a,
  210348. 0xe393b363,0x27d3f335,0x819bacce,0x9c9f7c00,0xb8aa6611,0x3f7418b5,
  210349. 0x372aae95,0xffa94557,0x8db38589,0x937d7804,0x6f1fbc1c,0xd10c86df,
  210350. 0xa2f0a0ce,0x48aebd89,0x367439eb,0xae5d5fa2,0x3f17d2d8,0x103a6a0b,
  210351. 0x411d9894,0xf233f68a,0x218b67a2,0x7fece8b3,0x2319bf06,0x0422540f,
  210352. 0x340d322e,0x1292c8c9 },
  210353. { 0x0386463d,0xf5eb5587,0x0371d97f,0xd4bbc2b2,0x0b819c5a,0x1b364571,
  210354. 0xcf04ad41,0x0cbb42d6,0x66939ec1,0x5d819c76,0xa01847e7,0x8745ac13,
  210355. 0x1c7232e4,0x4f704b02,0xacb05780,0x2c9e58a0,0xb561e295,0x9523b8b3,
  210356. 0x79f9ba35,0x3384df00,0x1eaa9628,0x78231fc2,0x8aea2b90,0xa2eac54f,
  210357. 0x30d1c263,0x8075ed77,0xfb339000,0xacb44ed5,0xf011293a,0x92546ac2,
  210358. 0xeb821764,0x7c78762b } },
  210359. /* 97 */
  210360. { { 0x067902b6,0xb8f7d6fb,0xd1735980,0xb2823a43,0x59741ddd,0x062cfb12,
  210361. 0x4033f95c,0x6e391b07,0x68589b8c,0x3831d0a3,0x522290f2,0xe3474d49,
  210362. 0x222e1f3a,0x4dab14d6,0x53f08d39,0x8f00fcde,0x707f28f5,0x559917ae,
  210363. 0x068e607c,0x166aa0ba,0xd7e1f824,0x602713e7,0x4d6a328f,0x7c255540,
  210364. 0x9890cd2a,0x0d2e3264,0xeca0b20a,0xf2207944,0x52f4e09c,0x5c98dc07,
  210365. 0xd84de81d,0x69403504 },
  210366. { 0xe5407206,0xf8b7b366,0x0d88fa8c,0x1ecf54cf,0xf7272e6f,0x6fefe548,
  210367. 0x81ab4468,0xd6531372,0x4e474408,0x52cb5f0e,0x6490737f,0x9e426b3a,
  210368. 0x4980d071,0x2576c19b,0x0f272caf,0x91f34628,0x468f31c9,0x78e60a4f,
  210369. 0x90844d89,0x8776a329,0xb951582b,0x8a55700c,0x14b1adbf,0xab1af365,
  210370. 0xfbd343ef,0x22ebff92,0xb7d81f34,0x32f9fb01,0xba6b30e1,0xad850e06,
  210371. 0xbc5f9546,0x6da9e027 } },
  210372. /* 98 */
  210373. { { 0x5c9490ce,0x21eee4c2,0x0df68381,0xa96ec4a3,0xa4a9368e,0xe6c607e0,
  210374. 0x4bc262f3,0xd8b0492a,0x460c34ff,0x0846a210,0x28df33cd,0xf7ff7a64,
  210375. 0x21827612,0x10c55044,0x149bcd01,0x9d25fce9,0xcfc613dc,0x725611cd,
  210376. 0x97f51ce5,0x159f7e88,0x4e8c08b5,0x3fa3bf31,0x75e7538f,0xea156115,
  210377. 0x91c84020,0xd1e0a951,0xcf02ad0a,0x0d2268ba,0x058b8e5f,0xa04c6ac4,
  210378. 0xb3515912,0x773b40b9 },
  210379. { 0x3631cfd2,0x00ff2cdc,0x807737bc,0x14c4c2d3,0x338a5270,0xd600616a,
  210380. 0xb32cabde,0xd0e3306d,0xa70b17ca,0x336738ea,0x79f353ee,0xf2f4aa8d,
  210381. 0x576f3ad3,0x712f6ad9,0x89b2bce0,0xe4279852,0xda92ca30,0x05d8f94d,
  210382. 0xd8492dd9,0x9891d475,0x4d15e4bd,0x3e06a5ca,0x254eabbd,0x4725d4eb,
  210383. 0xc0ed513c,0x31394ace,0xbbfaae6c,0x7e0f9859,0x833fd137,0xdc125546,
  210384. 0xc56c4f75,0x12b46385 } },
  210385. /* 99 */
  210386. { { 0x932951de,0x810dbebd,0x5aa69c94,0x96959d42,0xecb2f08d,0x5fc49c04,
  210387. 0x2250b82c,0xac74f0cc,0x3aec4e1d,0x96a439a5,0x90499acd,0xc33cab9a,
  210388. 0x54d9b3af,0x2fccde66,0x3863ae8b,0xf4af285c,0x46febf88,0x2373373e,
  210389. 0x3c9ab7ed,0x751d672c,0xfe12020c,0xc1c51130,0x52f3e56e,0xad82402f,
  210390. 0xa4a64a81,0x3489ab7a,0xd9f163f2,0x0a1fb661,0x0e553317,0x17c69be1,
  210391. 0x7d88d417,0x61c1935e },
  210392. { 0x3492ae43,0x2e722d9b,0x0538f05a,0x1ef89d95,0x200aab63,0xae77e588,
  210393. 0xeba4b117,0x2872c120,0x3a461cb8,0x5c2432c8,0xcb938f26,0x315b3434,
  210394. 0x8c4c7dc0,0x05bf2ac5,0x596b378d,0xd2e501dd,0xcb890c30,0xa8506c9f,
  210395. 0x7c361f0c,0x3d0af461,0x5a35cbae,0x21f7b718,0xf3fc0138,0xbd1035f1,
  210396. 0x8b248edf,0x74628af5,0x48c9cae0,0x8d6421d0,0x2ca18773,0x75e3da39,
  210397. 0x71d3db94,0x27ad0df2 } },
  210398. /* 100 */
  210399. { { 0x305b5aed,0x9e3bda79,0x5998d6a7,0x2c67d4a4,0x0f7eb700,0xc855e1d3,
  210400. 0x147d1c44,0xc18a7e9e,0xc89540ed,0x3ea99618,0x7e6bfd20,0xa53be20a,
  210401. 0xecc14437,0xc9487e64,0x34ef85c6,0x72979207,0xd5e1ebd5,0xfa0d4e71,
  210402. 0x4d48d6b6,0xfda2b1e6,0x66e200d4,0x782a1e05,0x5a5366a1,0x2a3c70da,
  210403. 0x1a473738,0xfe3fbd2b,0x7fe020e8,0xd7ef8c06,0xeacfb665,0xec686fde,
  210404. 0x6dd1542f,0x5d9b5e27 },
  210405. { 0xcb3e472e,0x3637c5a5,0x30a1405e,0x2153d927,0xb4498558,0x009992e5,
  210406. 0xf39a0851,0x18f00ccd,0xb5c6c560,0x26237c11,0x1343540e,0x418ed408,
  210407. 0x7e7f3184,0xfef7cbf0,0xbf48576b,0xecd92366,0xbc94c91a,0x1b75be1a,
  210408. 0x4a162276,0x8e1778de,0xc5c6bcb8,0xc52e57d3,0x5ab71858,0x5cc382c7,
  210409. 0x3f6e39f9,0xe12c2c28,0xd62735fc,0x4c7e0ef2,0x835a5996,0xe071deb1,
  210410. 0xcbb8c766,0x24f891cd } },
  210411. /* 101 */
  210412. { { 0x6778c1e2,0x24ef60bf,0x00d5be5c,0xff49c03d,0x2f01a09f,0xec11986e,
  210413. 0xae096e58,0x59a728a4,0x7077984c,0xaabbcedb,0x870ca5a5,0xfb473bd2,
  210414. 0x4de30e3d,0x8c928c61,0x4f67abca,0x3fae7f9a,0xec21a9cf,0x83c2b2eb,
  210415. 0x9cd9b5de,0xafa70d62,0xc60b18df,0xadeaea59,0x4049b54c,0xd5fef7be,
  210416. 0x6dd310e3,0xfceebc76,0x8f6321cc,0x7748efe3,0x18ee8af5,0xfe9c32b1,
  210417. 0xd42df612,0x863ac3cf },
  210418. { 0xb85a2fe2,0x0a36fca7,0xee429dc6,0xf3e70d08,0x141c3944,0x8c9ba209,
  210419. 0x67272a0a,0x306a8106,0xf968bd06,0xe69a1555,0x153c603d,0xb86f7e47,
  210420. 0xef56e4fa,0x9706614a,0x98780b4c,0xc0dc36b8,0x3a1d3263,0x43657fe2,
  210421. 0x435522c9,0x01f97a86,0xedfef679,0xd91897f6,0x6daa17a0,0xebbe31d4,
  210422. 0x85accfbd,0x6f179100,0x8f9fc1de,0xe0da6e32,0xe1e7142c,0x1c9d53db,
  210423. 0x8b86725a,0x3e3f1b1e } },
  210424. /* 102 */
  210425. { { 0x7b7fbf05,0xb7ea15c0,0x1f1a3882,0x992f11b6,0xd1dcd1bc,0xc9ddd95a,
  210426. 0xad0f7e8b,0x31f5b7fa,0xfca7ab79,0x2936e5eb,0x19a55be6,0x30f417dc,
  210427. 0x43cde554,0x1f6f4e43,0x82f044bf,0x971f5e65,0x4288c408,0x73c3b8e4,
  210428. 0xb807f575,0x61aac59f,0x818b58f0,0xa64ee2dd,0x97a3b0d3,0x6f7a0a60,
  210429. 0x0394b058,0x8b85ecc8,0xbfb3517d,0x9a059474,0xa79c3f06,0x89ad5977,
  210430. 0x700a8025,0x81208ed8 },
  210431. { 0x14c4ce37,0x10935099,0xa1aa48a6,0xf34bb843,0x580d58e8,0x86007024,
  210432. 0xb375b8ba,0x6db42c49,0xed3bde83,0xac365524,0x649233b6,0x5521e1b4,
  210433. 0x64dd946f,0xbc7cc5d5,0xbfb5b6ae,0x9c14b035,0x0146c1a3,0x7f22ba18,
  210434. 0x872214f5,0x0b62fbbc,0xb4921764,0x3acfd7f7,0xcb4d6df1,0x5ff10da1,
  210435. 0x62600a91,0x660e2620,0x81d9167f,0x7ac7da9d,0xb6e7a199,0x6e8e260c,
  210436. 0x80deb3c2,0x44383fb8 } },
  210437. /* 103 */
  210438. { { 0xe44f9af6,0xe107f01d,0x8cb1fa1c,0x36381a4d,0xfb7dd493,0xe65be3ec,
  210439. 0x26a8839f,0xd0b8435a,0x3ec789d8,0xee60f915,0x2bcc5e1f,0xe25fea50,
  210440. 0x7e44a81c,0x0477c0c5,0x230ba5b8,0x349e9f83,0xde180dd9,0xdd42f32f,
  210441. 0x64a3d11c,0x8b039eaf,0xbeb7083a,0x80ef884e,0xf12742cb,0x288e60c4,
  210442. 0x720a0262,0x44156cc5,0x7253b77f,0xcd547de6,0xa6013a59,0x9829a6ec,
  210443. 0x0d548445,0x8aee708f },
  210444. { 0x32c54409,0x18f22d9c,0x75ebaac4,0xa9ebfa46,0x86284981,0x90e2e928,
  210445. 0x6b3a8e0c,0xd0201f6f,0xbd77641e,0xc973016c,0x70170575,0xf926f2f0,
  210446. 0xfec0ce01,0x4984048f,0xf319d304,0xbf696211,0xc91a88c4,0x74b5c844,
  210447. 0xe0030a82,0x4c40fbce,0xe4f6d521,0xbed67525,0x29d67d1e,0xaf7e47cc,
  210448. 0xc21d3536,0xfa307db8,0xbbb29405,0x56b6c46a,0x033e805f,0xf059a7e3,
  210449. 0x6096a5a0,0x970f61fe } },
  210450. /* 104 */
  210451. { { 0x1bec8e4a,0x1bc53d23,0x35a6034c,0x8809ac14,0x509e464d,0x4ee081da,
  210452. 0x8a488235,0x496ae1fd,0x325864b6,0xa1ae9863,0x74cd069f,0xbaca13e9,
  210453. 0xb1d8a6b4,0x3738cc58,0xe76b9da4,0x5fa71f58,0xc7eb16fb,0xc919be88,
  210454. 0xad4e429d,0xf5c8f13f,0x2499f9ed,0x4583b671,0xa10d8bd7,0xbce20115,
  210455. 0x5790bb7e,0xf66d7605,0x482b78dd,0x9316aede,0x75f855fa,0xe0d8fb2d,
  210456. 0x5a7dcca7,0x404b5b94 },
  210457. { 0x517a15c7,0xf9ee682a,0xef880202,0xaae4cfbc,0x5106a354,0xcee2c139,
  210458. 0x170febe7,0x5de60192,0x73d0c54b,0x589e39fd,0x8c9092b7,0x195c7135,
  210459. 0x0a7bfe5f,0xcb7ed53f,0xf61cc979,0x2bd9242a,0x5395f7d9,0x8d2ef16c,
  210460. 0x70b32f09,0x0d4ac1ca,0x52d185c1,0xa587526d,0x942d6195,0x2932b04a,
  210461. 0xa500b0ac,0xfe25a979,0x562fd230,0x5fa1f4ae,0x20da253c,0x60f55af2,
  210462. 0x83146002,0x7faa11b5 } },
  210463. /* 105 */
  210464. { { 0x6e402149,0xb0ba4f0c,0x963cc119,0x3584cc1d,0xa6527476,0x7740dc1a,
  210465. 0xc95715f2,0x3f77ff75,0x3f89fb0e,0xb2f234ad,0xef9be3ff,0x55159032,
  210466. 0x04237e82,0xfc9fb21d,0xa153ed93,0xeb2eff38,0x10041d13,0x89d53ae0,
  210467. 0x7f1bd828,0xcf2e545b,0x43953ea5,0xdd4a27ce,0xd85e75c8,0x00d2e5d4,
  210468. 0x241be1c3,0xeb93ed62,0x0242032d,0x1e53f25f,0xc3a4e701,0xb9957636,
  210469. 0xed98febf,0x14b63a52 },
  210470. { 0x71c43336,0x7610b553,0x23a4824b,0x19dfd4a6,0x0286051b,0x7b97a2e0,
  210471. 0x8f5f1edb,0x86abbb9c,0x9b67daad,0x67a57d77,0xcd5ffafb,0x8ace506d,
  210472. 0x89ac3c63,0x85da9f95,0x75a3d150,0x081cbaa8,0xe9346ed2,0x03353d8f,
  210473. 0xa1f9a02d,0xb2ab61f1,0x3a659c71,0xb0cb0937,0x4f5df8a1,0xb7e0e30b,
  210474. 0xeb7d5a1d,0x77c4c741,0x728e5cf0,0x8f046c9c,0xf7c171ac,0x32dd0bc7,
  210475. 0x836d2655,0x02485873 } },
  210476. /* 106 */
  210477. { { 0x75a4cd8d,0xcd40dd23,0x97bcba78,0x132ca433,0x258d61f5,0x30c5cd84,
  210478. 0xda1e8e68,0x0a7ec059,0x1d65d40a,0x07a8f171,0xf4350d76,0x869e655e,
  210479. 0x5983ae42,0xb98ce6f0,0x9d8bebd0,0x7b61391d,0xb1ba5d49,0x3a529e25,
  210480. 0x1f6b2cf6,0x46f732e9,0x3fa3b629,0xbd66ec6a,0xc3ef0ed2,0x397950ec,
  210481. 0x5f08b476,0xee9008cb,0x965a0e2e,0xfd6be425,0x1177bc87,0x78ed513c,
  210482. 0xfe512dae,0x6798cedf },
  210483. { 0x1b97c5c6,0x49e3f8fd,0x78c3b33f,0x39fbab3e,0x40f595ba,0x44274412,
  210484. 0x5d7d4376,0x174225b9,0x79c44777,0x880b3fcc,0x3296b245,0xdc3aca83,
  210485. 0x1734e184,0x55913df7,0x9c934472,0xa4db23d3,0xd1420a11,0xcebb3733,
  210486. 0xf3608bdc,0xb9d20cf9,0x30cfe13f,0xa618acf6,0x5f30874c,0x75f06b31,
  210487. 0x9f0005a5,0x506efe7f,0x01bfc9db,0x8aaea78c,0xf78e7c41,0xf9179255,
  210488. 0x52e96395,0x3ea7aed2 } },
  210489. /* 107 */
  210490. { { 0x5b06ae25,0x98617e04,0xcb5750ef,0xbcac148d,0x604c2ba2,0x91ea2f0e,
  210491. 0x76b78975,0x00c19f6b,0x651da181,0x79b9b6d0,0xc945705b,0xf3225beb,
  210492. 0x5c005bf1,0x30b435f3,0xbc24d86d,0x440b4482,0xd6373777,0x2b8f0996,
  210493. 0x1c44b4dc,0x65fd6c56,0x30906999,0xe9405ee6,0x08aa1ec1,0x19ff0924,
  210494. 0x3d2f2895,0xeef3246a,0xbc746797,0x016c3765,0xd0705f7e,0x62d2569f,
  210495. 0x05250044,0x6a8ad39c },
  210496. { 0x46be7282,0xe45f020d,0x21380f12,0x9405afed,0xd5da6ad0,0x4cdca5bd,
  210497. 0x7f8be61e,0xc2d6f184,0x596b8178,0x20132953,0x7a8df954,0x8d3b1e7b,
  210498. 0x39572b4d,0x757c61bb,0x80cc3b56,0xd749b57b,0x37b3ffec,0x9590ff93,
  210499. 0x145dc94d,0x39bbb653,0x2335e573,0x70c1c606,0xf763feba,0x9c2e72d7,
  210500. 0xcc61b732,0x4768e424,0xaa73f2ca,0x777d2fa6,0xc5cb58cd,0xdee4dbaa,
  210501. 0x9cfae1aa,0x1a181179 } },
  210502. /* 108 */
  210503. { { 0x77575ed0,0x6f6ff62f,0x7d1da99b,0x18f14fa9,0x69efd7f6,0x2e72aefb,
  210504. 0xddc28633,0xc45ab4cb,0x586c5834,0xb0e20d48,0x39775dd8,0xd397011a,
  210505. 0xf4134498,0x0130c808,0xf5115ed8,0x2d408eba,0x0260ded9,0xc506a05c,
  210506. 0x19cab911,0x9e5b7362,0xe8693a86,0x4cf508c6,0xcc773617,0x4e71245f,
  210507. 0x95d89ca3,0x2f71aa1f,0x607bbc98,0x4bba7c6a,0x212b7fd2,0xf3a515e7,
  210508. 0x9230f5a8,0x7d2ddc75 },
  210509. { 0x4ed2cae8,0x3d05816d,0xb9c00377,0x4cf6bc7d,0x646b08d4,0xc23e98e6,
  210510. 0x4b9c0180,0xf9ee6c61,0xef9179c1,0xe11c9a13,0x8ed9688a,0xa5b6147e,
  210511. 0xd06670a7,0x7afeb648,0x17685275,0xd670333c,0x75f9e8f2,0xa89dd969,
  210512. 0x37a68ade,0xbb57228d,0x454cb186,0x21a05d5e,0x063dd550,0x4810158f,
  210513. 0x4cb6caf3,0x92dd4f08,0x7854abe7,0x70c4d852,0x6e729d76,0x845969dc,
  210514. 0xb1bf40ba,0x5a52f87a } },
  210515. /* 109 */
  210516. { { 0x09ecacbd,0xed019e91,0x7b89bdea,0x6544023d,0x5707371e,0x7cc51f0b,
  210517. 0x16c8e217,0x14832b04,0x81259ab5,0xb1aa6682,0x23e361d4,0x6e100f92,
  210518. 0xe3a95c2a,0xe593eee9,0x16c10e26,0x699b6bbd,0x9473a13f,0xad487873,
  210519. 0xb274987c,0xf1c14dc5,0x2559e2e9,0x57dc0075,0xc3d47ad2,0x8449849d,
  210520. 0xdd527793,0x83df278a,0xeefd5b99,0x770e3ec8,0x76bd02a0,0x2ae58446,
  210521. 0x3e705ffe,0x17f02764 },
  210522. { 0x29abea1f,0xdda4010d,0x2407ac4c,0x636b9695,0x0433218b,0x96a60129,
  210523. 0x163d534a,0xf221fc3b,0xccc20565,0x05ba15be,0x96285577,0x1238e54d,
  210524. 0x878804d3,0x1b144257,0xa89a9fe4,0x96fbf304,0x4be642b1,0xc8a7f06c,
  210525. 0x6e2b085e,0xdd1a20e8,0xff4a591d,0x8f7f27c2,0xa4a343b8,0xc17b0753,
  210526. 0xbb173d4d,0x684b1e88,0x3dc07bbe,0x3accea44,0x4c441d77,0xdb15c88d,
  210527. 0x53e5957e,0x0ef0309a } },
  210528. /* 110 */
  210529. { { 0xfa8e5b60,0x4fc25721,0x691c0bb2,0x646938ad,0x0b0a2248,0xe46d4b76,
  210530. 0x7de16877,0x863f9ac2,0x2721c630,0x503bb6ef,0x0b67fb02,0xf8c199df,
  210531. 0xe07abd39,0x78c1ed72,0xb32f0dda,0xcf9deb7b,0x6c3c89f3,0xaff726f0,
  210532. 0x1972225a,0xb7008b2d,0x4f145f5c,0x8f5a6117,0x457c4f37,0x4e0e6f8c,
  210533. 0x1c453c64,0x8bbdaa44,0xa6e92c80,0x57be326d,0x5d773561,0xa9bc3fd9,
  210534. 0xbb37b72a,0x3d3b6cc6 },
  210535. { 0x9722c880,0x6e6f12cc,0x286b6889,0x3a1b6ae7,0xad2fafec,0xba1cc09b,
  210536. 0x43bb8bef,0xad64ad7a,0x97c3f4c3,0xa5af6a00,0xc353a91b,0x2afcb0d9,
  210537. 0x69ccbf6b,0xca13fcab,0xf2abc190,0x699a1391,0x23a247e5,0x2dbd5542,
  210538. 0x95488d9a,0xe206180f,0x1244cc3c,0xba9e7bff,0x87d3a365,0x29297abe,
  210539. 0xfa4ca5e2,0x4054fa38,0x67be1b6c,0xb390623d,0x78f41a44,0x1fa67c57,
  210540. 0xc7b544e7,0x2e946e43 } },
  210541. /* 111 */
  210542. { { 0xc60934ae,0x2980fddf,0x164206d1,0x2c3e7eff,0x416ed75a,0xf75e7f96,
  210543. 0x5cd0b2dc,0xfac60cf3,0x1faad87b,0xddc4bece,0x9849e5dd,0x753fa87c,
  210544. 0x2c1bf1ae,0xc5d516a3,0x14732b4b,0x565dbea8,0xce48696b,0x007ebe3a,
  210545. 0xcdb97694,0x40ca74d6,0x65e4e7be,0x3f5cd270,0x3aac4ebc,0x74847c01,
  210546. 0x43d6c3a1,0x6762e034,0x467a076a,0x690d8c95,0x1eda677d,0x768d78d6,
  210547. 0x0181d8c2,0x0997ce55 },
  210548. { 0x965a0b81,0x9297746c,0xe5e12dfa,0x48b58be6,0x715f437f,0x5573b3c4,
  210549. 0xb565c459,0xe425e907,0x1582797c,0x4f43f512,0x8ea5474f,0xe5dafa6f,
  210550. 0x13de04ac,0x2aeb8fbe,0xe8a07c83,0xed7f95f0,0x662c09fe,0x3e012a6e,
  210551. 0xc742cf17,0xbf96e9b8,0xe28a1c45,0x8ea5759a,0x5cf4e2f3,0x475941b4,
  210552. 0xf901a019,0x7dd3c02d,0x70916b2e,0xe7a4deea,0x2fa9b988,0x50b272b5,
  210553. 0xd0917fe6,0x96f9f09f } },
  210554. /* 112 */
  210555. { { 0x2c310a96,0x78e8aac4,0xf7a2a734,0x32a98303,0x23962207,0xc46ca83d,
  210556. 0xd9541280,0xad131e6e,0x2cabe911,0x5791fc5e,0x841b6c68,0x50cb77eb,
  210557. 0x3d3c8878,0xaff93dea,0xf1007bce,0x06541f1d,0x55cdf1fd,0x4ee729c2,
  210558. 0x323e3972,0xe0f71317,0xad4d08c1,0xa2de7a41,0xa35e22bf,0xa9912abf,
  210559. 0x89b03325,0xa050122b,0x06514d4e,0x8b9e51f4,0x79d3e0ab,0x423c7aad,
  210560. 0x40b8fea5,0x71998e26 },
  210561. { 0xceb6ed78,0x40140fcd,0x18534516,0x653cf377,0xe8d60dcc,0x0450b65a,
  210562. 0x9dac55f8,0xce6c1a76,0xae05686c,0x8a96a92d,0x12712562,0x2fe44762,
  210563. 0xa4f39425,0x747bcb50,0xfc531fc2,0xf0ec6ff2,0x10fe9ff0,0xc97c3447,
  210564. 0x9c792cff,0xfb488783,0x026fb019,0x552c5248,0xd804c290,0x4001a29c,
  210565. 0x35c8ca73,0x742b5ad8,0x6ee5dfa0,0xc3781f17,0x3dfa4ab1,0xca6b85f0,
  210566. 0x0b0d32ac,0x8389941a } },
  210567. /* 113 */
  210568. { { 0xde067dff,0xc0f062a2,0xbcb80162,0xd4f32690,0x0707a2bd,0x98cd990d,
  210569. 0xfae4a391,0x5afc63b8,0xb32ad814,0x684f1b7b,0xf199dfb1,0xb0a2dce2,
  210570. 0x48f25848,0x2260e17f,0xc2d5e862,0x7393db00,0x338cf171,0x9e88f854,
  210571. 0x02acf522,0x00679429,0x6835af3d,0x19157cb8,0xb8a2614c,0x2faa6f92,
  210572. 0x134ec46c,0x04ff95f5,0xfb7a8135,0xcf00626e,0xb37a4704,0x454b3d05,
  210573. 0x2694ec25,0x1fbfda31 },
  210574. { 0xc8f69c77,0xfdebb657,0xa3df88fa,0x92a8278b,0xc1fb78b4,0x463b5571,
  210575. 0x11c71a33,0xd2066a1a,0x089958b0,0x10c88143,0xcf9d67a6,0xb975c7e0,
  210576. 0x73037b8f,0xdaa5d208,0x40bf5861,0x5ee5005d,0x7dba69a9,0x300e6ce7,
  210577. 0xc962cc74,0x893c3cb3,0x4cf84055,0x0ac98629,0x225c9d70,0x0a7ef63a,
  210578. 0xb91e47e8,0xfe184869,0x8c2f84be,0x1b9d7deb,0xc0e278bf,0x67788915,
  210579. 0xc426f19e,0x4f9488ca } },
  210580. /* 114 */
  210581. { { 0xdd51b8ce,0x610dfcd4,0x36230e80,0x08579278,0x36599562,0xedc7ff1c,
  210582. 0xe2cae877,0x905ead4b,0xe7967608,0xa1c325d9,0xbd38926c,0x3e39eddd,
  210583. 0x5f6f0a4e,0xda92c868,0xf47a0fa4,0xe16f800a,0xe5f60aab,0x50b4db5b,
  210584. 0x983853d3,0x3665412f,0x9b79789c,0x64b62250,0x4e0e72b2,0xea560058,
  210585. 0xe555c2bb,0xabbd4901,0x17292e11,0x378419a7,0xe174218f,0x6e0b5aaa,
  210586. 0x8f796b92,0x688e0684 },
  210587. { 0x313b8f64,0xcdfef641,0x942c7462,0xaef11b7b,0x5c0d8abd,0x067cfb77,
  210588. 0xaf4041a9,0x608ea5f0,0x6935210f,0x23d5bd82,0x27917a08,0x5ab904fc,
  210589. 0x45d22d21,0x85dbb1fe,0x4d36159f,0xc3d5e509,0x1d39b8f2,0xaebb528e,
  210590. 0xf44acef0,0xdd5ca828,0x20c57a54,0x24209adf,0x78f95f44,0x5742b433,
  210591. 0xa9337d37,0xd11fa7d9,0xc64cfdb7,0xd66a0c09,0x9bb817ec,0x56e55b8f,
  210592. 0xe4c41265,0x1723c7e3 } },
  210593. /* 115 */
  210594. { { 0xdc8b43f3,0x9a6486d8,0x26409e68,0xfc3e0e61,0xd9b46003,0x1889c437,
  210595. 0x6284ec7b,0x3a850335,0x6a9dbaea,0x5a3665c4,0xe978933c,0x7bf6941d,
  210596. 0x69341490,0x1ed5a510,0x8cb8002d,0x664a7b7a,0x60ed0a59,0x603f76e4,
  210597. 0x1f4ebf27,0xc3e06ba3,0xf2c38a7f,0x296ced41,0xcf1db08a,0x2ac18f79,
  210598. 0xcde7a3b6,0xc919e882,0xdbf68b06,0x15e77d29,0x4e947cb5,0x21978baa,
  210599. 0x7630993a,0x84bf542b },
  210600. { 0xe364f21e,0xc1decda9,0x012e557e,0x0d6cf345,0x588f90e1,0xba246848,
  210601. 0xe3b104b8,0x9f6dda4b,0xe3aef57a,0x6bf7a346,0xe8327ea9,0x210299fe,
  210602. 0xda95e6c7,0xaa99f487,0xd2cdf645,0x24ff813e,0x8bd414b8,0xd1dbb2d2,
  210603. 0xcafa1a61,0x065101af,0x9cdebda4,0x7d9f4b9a,0xe41039e4,0xaf41b395,
  210604. 0xc50adf42,0xe3e9e6ba,0x341e9e49,0x4f2133ae,0xcb157f23,0x4968c0f3,
  210605. 0xda068153,0x383f827b } },
  210606. /* 116 */
  210607. { { 0x6583ff4c,0x2ec46a21,0x4ad709e7,0x4e645a29,0xc04ca12a,0xdc66e9cf,
  210608. 0x9160a7e5,0x82f128f4,0x569c762e,0xbfb227b1,0xc2edb8e7,0xf80c7963,
  210609. 0x49a0f688,0xa7dafe06,0x2d14b8cc,0xb7e41754,0x86de40be,0x3a0c5c53,
  210610. 0x1db79331,0xf0d05286,0xfbfe071b,0xb902ce69,0x210e9903,0x61e46956,
  210611. 0xf703ebb8,0xfaef874e,0xdd5f78b6,0xf668947e,0x5af5ea3a,0x6fe86547,
  210612. 0x43f94625,0x3b121f15 },
  210613. { 0x659275e9,0x5b26e847,0x6d0fce50,0x47581cfd,0x8aa3f1ef,0x55f5cbfd,
  210614. 0xe484e60e,0x1e7be315,0xfe9698e4,0xd8f1a20f,0x7ab04784,0x25d46da9,
  210615. 0x834cdb3e,0xa526db75,0x8d08a009,0x1fd408d9,0x5b5ca816,0xfc004b20,
  210616. 0x65e4bbe8,0x5b3e3bb3,0x759bb6ef,0xf50cc125,0xc2fac737,0xf05fa817,
  210617. 0xd273951a,0x9ee102d2,0xfecb3367,0x2a8e540b,0x2a6a515f,0x673446fb,
  210618. 0x37290c83,0x5505e1d1 } },
  210619. /* 117 */
  210620. { { 0xd15e68a6,0x0c3014a1,0x64dd35e5,0x6f9f0b26,0x03ad67f9,0x18c3742d,
  210621. 0xd2c14484,0x74818c0e,0x0d41a3cb,0xc5181169,0xc49f3e9e,0x65c8c83f,
  210622. 0x2c279386,0x9b260c61,0xced04e9c,0xf6086fae,0xfd7c4758,0xa7b2cceb,
  210623. 0x90297fd8,0x4b3c3133,0x09701ac8,0xca8264e8,0x508b3762,0x9f976a87,
  210624. 0x983a8dfe,0x5d582714,0xd9d598e9,0x350d2669,0x0f6fd348,0x85cb89cb,
  210625. 0xa574317c,0x617d80d4 },
  210626. { 0x70022b67,0x4cef267e,0x3768b94a,0x80536bb5,0xd2784462,0x3153a566,
  210627. 0x38243919,0x49054d44,0x5df78c4a,0x8d11e172,0xd5a1e35a,0x9b252a71,
  210628. 0x8171e31d,0x07866c80,0x1b38a00e,0x0a8501db,0xce770236,0x2ed932b8,
  210629. 0x8edaf7d0,0xa2d77609,0xb93006e9,0x3aee5dab,0xbbfeb036,0xfaffc8c4,
  210630. 0x4e21b38b,0x077b9678,0xdca8e069,0x491fc59f,0x0e938471,0x3f624f55,
  210631. 0x7cd1780b,0x5156f508 } },
  210632. /* 118 */
  210633. { { 0x0206e8d0,0x58234e22,0x7f15af32,0xf5f6f5d4,0xd638950f,0xafab7289,
  210634. 0x7d4495f4,0x66ec4d09,0x68da80a9,0xad890c5d,0x64f8a36b,0xe4aa0920,
  210635. 0x0f4d5c5f,0x799e257e,0x24495e31,0x44c677ae,0xa5b8e352,0x720387b3,
  210636. 0x75a287b9,0x703790f4,0xc3c1f2f7,0x54895cc5,0x41a7fa41,0xb8680f9b,
  210637. 0xb00b008b,0xfcd47458,0xba6473cb,0x149cc838,0xac9be19a,0x78ed5f7a,
  210638. 0xb33765ba,0x5254599c },
  210639. { 0xa21b54c4,0x08739679,0xb6497d9d,0x029ece2a,0xc8488640,0xf14f1a92,
  210640. 0xe9fa79d9,0xae48dcff,0x46c208db,0x14b911c2,0xdae3f69e,0x5ab0fbf2,
  210641. 0xd1edb838,0x180ac87e,0x188586bb,0x146fd718,0x5467cbd0,0x210eb654,
  210642. 0x1667cfee,0xaa239408,0xb73d1a60,0xdb125c1a,0x881c1cbe,0xde685300,
  210643. 0x37c30232,0xfe34c713,0x6f3c8d18,0xc6c6070e,0xb4af4e83,0x07e365ba,
  210644. 0xdcf82b45,0x22f0a7ed } },
  210645. /* 119 */
  210646. { { 0xea7f1b7f,0xe262791f,0xdcff09d4,0x9c3d8c5d,0x39c7dc58,0x86c2a9c3,
  210647. 0x4276e8c0,0x4dad4017,0xe9fe1d56,0x0a918f59,0x2aa810c9,0xb8d79670,
  210648. 0x4aa5cdc4,0xeb7a8836,0xe7afa72e,0xfc4c23bb,0x4ac86908,0x4dbb5c9e,
  210649. 0x6a0c7e6f,0x37e39013,0x49c218d2,0x855d7001,0x94b324a2,0xe475bc67,
  210650. 0x6287a071,0xc98a8dc6,0x5fb4323c,0x395a299b,0x0c0389e9,0xe186c3ee,
  210651. 0x16734c46,0x79f81e6f },
  210652. { 0x364f3c4e,0x83f2c1f3,0x1367e14b,0x536b2ac5,0x5933e43d,0x44a6dcfc,
  210653. 0x10d961fe,0x34e59475,0x7e3f2aae,0x08234ece,0xbdea7f25,0xcb92e00a,
  210654. 0xa791a124,0x1efba4f0,0x1192d53a,0xc2086fd2,0xb51c8af6,0xfec0d0fc,
  210655. 0xdc0f1b5f,0x48d1b2ca,0x812dbe19,0xb07a388f,0xdedbdd45,0x40873a6a,
  210656. 0xd702589a,0xbc2a1268,0x17e27b64,0xbbf6e3a8,0x6d386e85,0x73ee5663,
  210657. 0x9de7c000,0x442ecd37 } },
  210658. /* 120 */
  210659. { { 0x8a2f90a6,0xb4cd1ae6,0x6f5ad0cc,0xf277d41d,0x401d4b8e,0x6a3828c4,
  210660. 0xd8376631,0xe817a134,0xf5e1124b,0x142b758d,0xfd6b95e4,0x25fbc69d,
  210661. 0xd74a9e3e,0xa30c9f5f,0xd89663ce,0x5ac0f163,0x0ce6386d,0x32a9eef7,
  210662. 0xd8ed5544,0x7a690ea5,0x9889427a,0x5de23ff0,0xeaaced58,0x75ad36a5,
  210663. 0xd3e18465,0x3514a6c1,0x7f093910,0x3d9162c3,0xe33d56e8,0x5c10add9,
  210664. 0x06aa691e,0x85176b73 },
  210665. { 0x28a21e38,0xa32110fa,0x5773d538,0x97b6379d,0x2d020dc4,0xd3697bbf,
  210666. 0x961833cd,0x59177593,0xe5fa8516,0x6d7045fa,0x786ab5d2,0x3390f29a,
  210667. 0xdc4f5b70,0xac0bda30,0xdcc615c6,0xcca0240a,0xc5146d91,0x8e1f1702,
  210668. 0xa72cef87,0xceb472d0,0x0b669ba1,0x84840708,0x7e61aa0a,0x79b08f9d,
  210669. 0x4669560b,0x388160be,0x948eb71e,0x23935c2d,0x9431590c,0xd7fd83c0,
  210670. 0x6e5768b3,0x8ab154bb } },
  210671. /* 121 */
  210672. { { 0x353c4a96,0x28686003,0x905cd835,0x4e5c60e8,0x8f66f8cc,0xbd591364,
  210673. 0x9faccf9e,0xb6b80b98,0xe32639e5,0xbc1c1fae,0x278aadeb,0x2f6396d2,
  210674. 0x1898202d,0x00a796d0,0x3a474835,0x18ab548f,0xb31b0e3e,0xacd056c3,
  210675. 0x0164512d,0x15ba68dd,0x4b03f3bc,0x203836d9,0xd8f206c5,0xd64eca6b,
  210676. 0x9f1779b6,0x931a361e,0x52ab34a8,0xd82690fc,0x92922e22,0x342bb8e0,
  210677. 0xe00b02a9,0x1bfcdd84 },
  210678. { 0x75a365d9,0x310b9a43,0x08d8fb03,0xd4ade15e,0xd742df83,0x9c9753d7,
  210679. 0xde318742,0xcf7309d4,0x3360ace0,0x1228e212,0xf7669643,0x1043d238,
  210680. 0xf90f5a53,0xfc2adbed,0x7b5f9397,0x41d64cb7,0xc446d010,0x5200b30a,
  210681. 0x231720fe,0xc3c8642d,0xb9aa2075,0xfcc0122d,0x041eae47,0x856e3b12,
  210682. 0x68c876a4,0x45864455,0x233606b1,0x1a1c7842,0x227757bf,0x9b766d1f,
  210683. 0xf7b9d4f1,0x25b78a3b } },
  210684. /* 122 */
  210685. { { 0x156707ce,0x90835718,0x4314f90a,0x9bdc2398,0x8be57dbd,0x017c885a,
  210686. 0xad63a4b8,0xd4bba225,0x15aacffd,0x5ce71b86,0x72954722,0x5f266475,
  210687. 0x4f0ad3dd,0x0a80f1f7,0xfc352ed7,0x010538a3,0x4203c6ca,0xf8a64045,
  210688. 0x330c73b4,0x2b2c7a88,0x02dcac1b,0xb3433ee6,0xed2b17c7,0x2e0499cf,
  210689. 0xbd6329c7,0x9f8681a4,0x36fadc37,0x38979946,0x92b7895b,0xdc5650c8,
  210690. 0x65a51cf0,0x70ab9570 },
  210691. { 0x7b585d93,0x46778ec4,0xa633fe4e,0xca6d3610,0x4ea0311a,0x21da154e,
  210692. 0xbd64002f,0xaf22190b,0xd91cb7a9,0x9e633ac7,0xee6837d7,0xed13c31f,
  210693. 0x1616ee8a,0xda4a07d7,0x3afcd616,0xd78a2732,0xba14d694,0xc06696e5,
  210694. 0x4df58420,0x733754d7,0x2778e3c9,0xe85e504e,0x55b5a5c2,0x3055aa0c,
  210695. 0x8a3acb5c,0x313df538,0x2a088eda,0x5896acb5,0x84c85dde,0xfc8842a0,
  210696. 0x51dde6be,0x5fec9f79 } },
  210697. /* 123 */
  210698. { { 0xfe519f99,0x5ebc2c7c,0xe5410353,0xe396bd80,0x8a3988f3,0xaded9402,
  210699. 0xd601bda1,0x1c03b735,0x14ce64ac,0xfd302036,0x01240290,0x5837ebe9,
  210700. 0xa554097d,0xcaaea1a3,0xb0b88139,0xdce73d25,0xecb090b9,0x35ed412b,
  210701. 0xd63dab3c,0x99029ff7,0x062db071,0x555437d9,0x42a4c11d,0x277d2f56,
  210702. 0x24fc9109,0x477fa645,0x2799254d,0x7b12e9b7,0xd84c618c,0x7ad2ae22,
  210703. 0xce8ed195,0x0a8d5663 },
  210704. { 0x0a21fde1,0x43ac5163,0x6903d849,0xcfcf5dd6,0x5fdd6281,0x6d2499ee,
  210705. 0x77a49a34,0x4dedc6f0,0x2875c06f,0x46bda2c0,0x347b8046,0xd0e0e0f6,
  210706. 0x5e67836f,0x1058169b,0xde8a8042,0xc961912a,0xa93b3d32,0xdf3fea0a,
  210707. 0x0c576bc5,0x9f138edb,0xd8d37e47,0x7971ad6e,0xcce5e7cb,0xeab85739,
  210708. 0x1d202b40,0x88a4b434,0xe3a1fd26,0x5d842557,0xb3a86f91,0x872fabd5,
  210709. 0x6aa4629f,0x95b93493 } },
  210710. /* 124 */
  210711. { { 0x99f951de,0x9998a701,0xf058db45,0x8fade596,0xf3d03dd3,0x4d479c1e,
  210712. 0x33b141d3,0x6e928d5d,0xacfe8a40,0x9a465800,0xc1cefa3d,0xd108ad2f,
  210713. 0xe013726e,0x64b96921,0x8e83bb9f,0xb9b6a6b6,0x1242e544,0x29f1e6dc,
  210714. 0x2f65966b,0xd3f8f676,0x5e105b41,0xa34dd096,0x16011e1c,0xd4e9139a,
  210715. 0x2515541b,0xeea4dc68,0xc822166d,0x6f8030ac,0x31d16124,0xbdc7ae1d,
  210716. 0x621afa7d,0x2e25ef51 },
  210717. { 0xdd8e7357,0x2533cf8f,0xeaceddb8,0x333ba218,0x0784d2ac,0x68e3e31d,
  210718. 0xf2804ae2,0x1c927f36,0x77e7ad7e,0x01433d22,0x587f78a0,0x0b401cf0,
  210719. 0xaa0027ae,0x9dfcf036,0x1d9a46b5,0xc9e46c8b,0x1f288d32,0xaa6de486,
  210720. 0x1b8a043d,0xdd56da2f,0xf2d0bb56,0x346230e5,0x19defb56,0x19f0b6e4,
  210721. 0x21d2c874,0x55ec37cd,0xb70e45b3,0x3dbf0397,0xac7ce852,0xf0862a8d,
  210722. 0xe141f3d6,0x87979ea7 } },
  210723. /* 125 */
  210724. { { 0x7f1c747f,0x9b7e7b3f,0xc6e63369,0x151a4c1d,0xb372dba0,0x4273ff70,
  210725. 0xd3ee54fe,0xca6d2234,0xd33cae0f,0x12fc8e0c,0x5dd6f10c,0x27328538,
  210726. 0xf01a9cf9,0xc86f3fbd,0xe36cae91,0x5322677f,0x2fefea44,0x39a70033,
  210727. 0xce8af217,0x2c9ca328,0xf6a731f4,0xc0256776,0x66a96813,0xc687b3df,
  210728. 0x8db2eda8,0x194aab12,0xeec4febd,0xde30dc5a,0x979241b2,0xc052236a,
  210729. 0xc23d4c16,0x3ec98802 },
  210730. { 0x4072f74d,0x0f9e760c,0xab594059,0xe78eb0de,0xc9b009c2,0xdb3dea40,
  210731. 0x38b59ae5,0x47e875f0,0x2b4daa06,0xf40eb436,0x090f3788,0x9a6a4f92,
  210732. 0xedbfaf8b,0xefebe9af,0x9867e256,0xf87f96a5,0x75ab6aeb,0x1e6fed23,
  210733. 0x3fdb13cb,0x17f2782a,0x70fa2621,0x5102c71e,0xfd4c0dbe,0x5d2b06ec,
  210734. 0x30347297,0x537cc268,0x2b67e780,0x8dbf5e2b,0xba25da32,0x2f633f3a,
  210735. 0xefaec914,0x3e9315e8 } },
  210736. /* 126 */
  210737. { { 0x239a9ea9,0x9255cfa5,0x0be33a62,0x20f3c690,0x9cb642bd,0x759eeb4b,
  210738. 0x00bae718,0x3316c546,0xf3410f84,0x874a76d5,0x90f129b6,0x123b502e,
  210739. 0x12851f1c,0xadc8f9a8,0x1b62408c,0xf57b764a,0x1a80777b,0x116ec01f,
  210740. 0x1f0ddc5c,0x746ecef2,0xe5a6a5a7,0x3c49d47c,0x06e955ba,0x1e15dbe7,
  210741. 0xb45d79b0,0x629c0c79,0x778d1087,0x11278308,0x8c6a22d7,0x22585dc7,
  210742. 0x0a682791,0x2ed02a0d },
  210743. { 0x4daa2682,0x53043416,0x01359625,0x0e26d32b,0xbd867097,0x449c834a,
  210744. 0xee77ae2e,0x11a19d2b,0x3af6c169,0x39bd529a,0x5cd61054,0x36cca5c0,
  210745. 0xdc6c0fe1,0x6370a59b,0xb93d5135,0xca420d27,0x554c451a,0xd8730d45,
  210746. 0x96cdebf2,0xebd258c9,0xa50f9a05,0x0cb1b990,0x7b0f0151,0x69a8c97a,
  210747. 0x11d217e1,0x2cc36d34,0x752f75e8,0xf117688a,0xa09b2a61,0x1db01394,
  210748. 0xa9efd7dd,0x14627844 } },
  210749. /* 127 */
  210750. { { 0x232803cf,0x6bca3aed,0x9a96ff34,0xc1e4398b,0x74ab788b,0xcaf6757f,
  210751. 0x7e68c04d,0xc3a53e00,0x5cb7cd20,0x5f969c19,0xdc068bca,0xf28b65a6,
  210752. 0x1d863032,0xe3ca01d3,0x87808e14,0x9b733b81,0xefe618be,0xb5d704d9,
  210753. 0xb01b946d,0x276f3542,0xfbedddbf,0xe057e19e,0x903275ce,0x7d182f2b,
  210754. 0x880f7bc6,0x3cdc5f77,0x78476c14,0xd6f03d3f,0xa9ba5072,0x035f5557,
  210755. 0xb4029628,0x7acb57b6 },
  210756. { 0x44e6b07c,0xd2413569,0xe1c7345d,0x451c4cc9,0xe273b9fb,0x407444d8,
  210757. 0xb88e34fc,0xfe496079,0xf152776d,0x77d184cf,0xc742299c,0x6d1033b9,
  210758. 0x77bf2897,0x29a0a684,0xee8f0420,0x59ffdf10,0x44bb56d6,0x4e17146c,
  210759. 0xfb9ae855,0x831d06c2,0xd93e7cd5,0xb2cb82db,0x3c96b607,0x83381c46,
  210760. 0x7549e2a8,0x06aed251,0x774a21d4,0xef97891c,0x8675fbdd,0xae9807c7,
  210761. 0x6363516c,0x6a5a05b9 } },
  210762. /* 128 */
  210763. { { 0x6a8f4f33,0x92e71ea6,0x4dea8f4a,0xf2fc6fc6,0xfee88461,0xd356252c,
  210764. 0x08954d08,0x59b0a83e,0x468ab766,0x5bd68c23,0x900f8d04,0x40281357,
  210765. 0x52b867ae,0x181c19c0,0x18764c41,0x986a5169,0x13575d24,0xcb01dfae,
  210766. 0x593677b7,0x17269ae5,0x46dc9b19,0xf6d17025,0xc40097c8,0x8de68499,
  210767. 0x259c407b,0x76df0032,0x17d29d8b,0x4091aad9,0x4a7ab5f6,0xa7f46d21,
  210768. 0x70ece48c,0x688054b4 },
  210769. { 0x51a5b86c,0xf0d168aa,0x95777247,0x2437e4d8,0xf1720329,0xae844076,
  210770. 0x9647a54e,0x0a7ac87d,0x0405622c,0x1e597a4b,0xf0a79f2f,0xedefe5c6,
  210771. 0x4d55156d,0xaf3ef0c2,0xef047cf6,0x917fb04e,0x54b62137,0x3792799f,
  210772. 0x314be0b8,0x875ea32f,0x0c466b0c,0xe157c65b,0x7e218978,0xd28c90ce,
  210773. 0xcde587af,0xb90fc3ba,0x8b877bed,0xdd32d71c,0xca8e10cd,0x3b432200,
  210774. 0xd94f6e53,0x0021f419 } },
  210775. /* 129 */
  210776. { { 0x43519d26,0x2191122c,0x40a51845,0xbdafac1d,0x548bb89f,0xcc6f71e9,
  210777. 0x16844bf9,0x9ef3375c,0x178e8d55,0xe7789f79,0x1f8be1c5,0x04f599b6,
  210778. 0x2cbbde40,0x8088c99a,0x893206c9,0x8939a260,0xfcd30851,0xa1ae4bff,
  210779. 0xe08feafe,0x664cb3fe,0xff14aabc,0x61f38099,0x2a841ef9,0x0d8394cc,
  210780. 0x17f01db6,0x75fad8ad,0x6debb773,0x6fc34576,0xa4252512,0x1e716b05,
  210781. 0x29e1ed9f,0x79855880 },
  210782. { 0x95106473,0xa2cb3aaa,0x5a61da04,0x95fafa41,0x539563c0,0xfd3c9362,
  210783. 0x95312b87,0xbaa48091,0xbf885c76,0x6c7e7582,0x230c78d5,0x70f6dab6,
  210784. 0x7747440d,0x8ce3051c,0xffdb6186,0x6dbebd14,0x190e4096,0xb0e041fa,
  210785. 0x6ee62e2a,0xba10c466,0x74f333d6,0x93d57e2a,0xfe7b9b66,0x006aadc4,
  210786. 0x06d2837d,0xfaf72f6c,0x910741ea,0x318cc5e6,0x65692477,0x9c502609,
  210787. 0x1d0fb08d,0x95d823c3 } },
  210788. /* 130 */
  210789. { { 0x140528a5,0x6aeebd86,0x53979bc8,0xf268c2ba,0x4ec144ab,0xb1bc9b8a,
  210790. 0x82a7d7ed,0x1efabb0d,0x4e0118d8,0xf12c70d1,0xa1c1558e,0x31607168,
  210791. 0xe4b7e73e,0x33e428b7,0x83aec9dd,0x63176637,0xe12ac35c,0x5172ffbe,
  210792. 0xbc17b2a4,0x37df0bfb,0x741f812a,0x4212f870,0xe2888f9c,0x3dcecbdb,
  210793. 0x756ca55d,0xa9dc15aa,0xb9028e41,0xf31918ec,0x6aeadb03,0x7ede0285,
  210794. 0x78654f54,0x0e2708d5 },
  210795. { 0xcde20f88,0x2270cc53,0x5f5b1039,0x9338272c,0x5dcb1dbf,0x5042e19e,
  210796. 0xb72d74c1,0x4b3de219,0x2aaaaa55,0x16c49a8b,0xbba86ba6,0x008443e5,
  210797. 0x20cf1695,0xee6bcd72,0xa89abd11,0x59ffac6b,0xf115639d,0x2831217b,
  210798. 0xf34cba52,0xe4d28af2,0x0727a906,0xf27f03e7,0x69017766,0x6842c79f,
  210799. 0x7a81123e,0xcb3469bd,0xa42973b8,0x48c0f346,0x23990dbd,0xfc5784a6,
  210800. 0xfb299678,0x0d3dab3b } },
  210801. /* 131 */
  210802. { { 0xce29c3cc,0x8f8376e6,0xf016cbc6,0xcb0507ec,0x5e394ce1,0xdebff996,
  210803. 0x73c50d41,0x24fc526f,0x2d16ce3d,0x4edd5a54,0x91c13141,0xbb37bdd9,
  210804. 0xe33a8606,0xe3442ef2,0xc0629da8,0x2ae90337,0x592ab331,0x57faec64,
  210805. 0xd82b857b,0x1a938997,0xa3373176,0xad6c8cb9,0x9086751f,0x82595de2,
  210806. 0x18c17196,0xa81e97fb,0xbf697357,0xe4f48a13,0x5cb89f69,0xa1387c2e,
  210807. 0x5874b426,0x530b4eeb },
  210808. { 0xbab7b5ae,0xe9f275a1,0x03a57bf4,0xbb69dc4d,0xa45c505b,0xc974dc4a,
  210809. 0x416ac402,0x726369f3,0xaed985dc,0x735e4e78,0xcdd446a1,0x0548d879,
  210810. 0x9e16b02a,0x84ceb069,0x789b11a6,0xf73f6fa4,0xb2a4e784,0x6aa0c41f,
  210811. 0x93a9b697,0xb1f76902,0xf03a8ab2,0x814cce00,0x844d66c1,0x64cb255b,
  210812. 0x30952201,0xb794e7d6,0x3da32271,0xe052d4e4,0x08b6a4d9,0x5278b2e7,
  210813. 0x80c6577f,0x90942552 } },
  210814. /* 132 */
  210815. { { 0x0d5b4c2f,0xd269a14d,0x5c8a649c,0x2b8fc59b,0xb0e37d4a,0x95becb3a,
  210816. 0x9111037e,0xfda1a768,0x94e35322,0x5810e05a,0xa178fafc,0xa24dcc12,
  210817. 0x8e3dce62,0x5c2c63b2,0x9452c444,0x995c3f17,0x42d45161,0x35330ec3,
  210818. 0xb4ef8129,0xa025a60a,0x8bae9c13,0x85493252,0xe2e3caf8,0x25d1a606,
  210819. 0x3649bf47,0xd44091ab,0x704ec5f1,0xc7d0afbf,0xbd8b3333,0x27bd1d62,
  210820. 0xcfe616f5,0x50570111 },
  210821. { 0xf534356b,0xd0084ace,0x4b4b0fbc,0x9df1de05,0xcee04dc1,0x021afe05,
  210822. 0x361b78e1,0x64bde688,0xef78d38b,0xa324fcc7,0xeb0a5e4e,0xfeb372ce,
  210823. 0x65811996,0xef04fcb3,0x5eb0ab4e,0x7dce5d50,0x238c586e,0x1e29b588,
  210824. 0xbcd80037,0xde5e3197,0x4806b9cf,0x8bf5e451,0xd18e67ab,0x4330968b,
  210825. 0xf9f63fad,0x26a7d04e,0xb5c18bb4,0xa1c7f123,0x25dce22c,0x485b8482,
  210826. 0xd540e79f,0x8ff0b36f } },
  210827. /* 133 */
  210828. { { 0x3ff42cff,0x99f2e2f4,0x1c35317c,0xa3c19f9d,0xaba1b545,0xdb749392,
  210829. 0x4afa9a32,0x84232b05,0xd7dcd436,0x0b855d46,0x45cf9915,0x8ac35e20,
  210830. 0xf001a218,0xd7cf22c7,0xed408305,0x057d35ae,0x553ccfcd,0x25a4a519,
  210831. 0x93e2b939,0x5e565793,0x3422ec27,0xa20332b0,0x3ac53958,0x9b09005e,
  210832. 0x79e9b163,0x628051a3,0xfc6618d6,0xb4a0dc09,0x6748e7af,0x9e0e857f,
  210833. 0xc577d63e,0x71b28eee },
  210834. { 0x99726bf8,0x4942b0cd,0x1c208f3c,0x1290a3b9,0xb0598eaa,0xfd7290e7,
  210835. 0xa25a9128,0xc6a7791f,0xc037d7da,0x2d33db24,0x70e2837b,0xc21efeb0,
  210836. 0xe3dae2a0,0xbf70d96e,0x85076027,0x43ed8191,0x4d4ad7e3,0x4aeb0aa8,
  210837. 0xe8c5b74c,0xbc75101f,0xad26ebdd,0xdbfb2a6e,0x6b78aa4e,0xba812068,
  210838. 0xe1159848,0xc94aa8f2,0x3eba5c4e,0x0d10d9db,0x6318295a,0xce7fec47,
  210839. 0x330d925a,0x7294711a } },
  210840. /* 134 */
  210841. { { 0x32bbd495,0xfce45904,0xbe54973f,0x330f4dd1,0x5d9c3f4e,0x006bee1d,
  210842. 0x59ba7204,0x40ee6078,0x42c2c768,0xc194fd3f,0xe9fe88be,0xa0e76b12,
  210843. 0xec2b0210,0x17cddddb,0x00811ec7,0x689d436b,0x284be9e4,0xa6a6ba37,
  210844. 0x007d4114,0xabc395b2,0x0f11e744,0xf8cdf9f3,0xe9396402,0xc5febec8,
  210845. 0xeeb46285,0x8a751743,0xc6e0d137,0x99bf8782,0xbeb292e3,0x3965e170,
  210846. 0x5801fd5f,0x001c39d8 },
  210847. { 0xda4a0912,0xf4805cb9,0x4410bca4,0xd27cb76a,0xec71d65b,0xef3dcb8e,
  210848. 0x4816849a,0x780fbb2b,0xa8b24635,0xef6a7026,0x12c44e68,0x15625c88,
  210849. 0x4d7a74a8,0x624c232c,0x4b1631e4,0x81a77037,0xdb917c2e,0x04e4f7f1,
  210850. 0x1f61ed95,0x1d0465fd,0xcbde6e3d,0xb1048049,0xd7131fcf,0x637ce0c1,
  210851. 0x8ada4715,0x22e4dbc2,0xace99726,0xf7530c5c,0xee287450,0xa0160dcc,
  210852. 0xbb91af13,0x9132e670 } },
  210853. /* 135 */
  210854. { { 0x7996099d,0x8057efe2,0xa06e608c,0xb72344db,0xd0958588,0xeb4a8740,
  210855. 0x79e5aee9,0xe53daf06,0x908a2fad,0xc9560a9a,0x107e706a,0x7f4be131,
  210856. 0x2830246a,0x6d5f3d9b,0x27cca3e6,0xa5f8e8da,0x4c28f292,0xeb51dca6,
  210857. 0xf31dfd78,0x4cfa310e,0x2ca073e5,0x92e0c7c2,0xa40da683,0x102f1694,
  210858. 0x750d38fc,0x16bb07cc,0xbadae035,0x703e83e2,0xb4d3c9dd,0xea93c066,
  210859. 0x79940ed1,0x7d0b03e5 },
  210860. { 0x4dd94c63,0x5fe7ea30,0x738b0b3a,0x57ef01c5,0xa14e6b4b,0x9534a78c,
  210861. 0xa5353276,0x07622cde,0x7c22d006,0xaf696a07,0x7d46b209,0x733c1886,
  210862. 0x626c2b4a,0x9654ccbb,0xa84f3c4c,0xa098d3a1,0x2d734b74,0x3596f9ed,
  210863. 0x5d551c90,0xdfd3021a,0x1ec5123f,0xe2ba7d2f,0xb2c1aa39,0xf9726925,
  210864. 0xf8eb2927,0xd2e75d0e,0x19192a6f,0xfaba712e,0x9b83e50e,0xa606b43a,
  210865. 0xdab5de60,0x31b1782f } },
  210866. /* 136 */
  210867. { { 0x4034db92,0x878dba45,0x8f34dc4d,0xa3977901,0xdf754c33,0x8d004f2e,
  210868. 0xcd563a88,0xeaa5954a,0xbb5ffad1,0xa29d6c89,0xb0d8bdb8,0xa8adf655,
  210869. 0x8cdbdb47,0xf7fb842d,0x80d3205b,0xb72e3a03,0x7cac7ca9,0xc335b0b2,
  210870. 0xd8a5475d,0xffc60bcb,0xeba4d25f,0x736f7719,0x0c50fca6,0x3d901c38,
  210871. 0x80c01900,0x1fdacf7b,0x5681f84d,0x75cf658f,0x5cefbbc1,0x57a7e634,
  210872. 0x3e07ed1f,0x6fc0fbe5 },
  210873. { 0xb81b0e5f,0x496d116b,0x2ac853b8,0xd82dd2a5,0x327387f0,0x357e22d4,
  210874. 0xba912c59,0x3e332a84,0x49d5dcc1,0x8b71c643,0x438d85d3,0x0c982ee9,
  210875. 0xbf7fcd4e,0x90b9553c,0x38fed5e3,0x2cb39bbc,0x5ac42903,0xa2c67c9c,
  210876. 0xbf07da55,0xebf21217,0xa0b9e4ee,0x55ac05ad,0x8ee9e0c6,0x10bb12c2,
  210877. 0x48bb6e3f,0x5cf3aee5,0x8b046e91,0x4ae7269c,0xaa0e553f,0xcb266012,
  210878. 0xa94c8fc8,0x701935a1 } },
  210879. /* 137 */
  210880. { { 0xa4626dea,0xde58d41d,0x15b9039f,0x25ef66ca,0x3164e65b,0x99a810a4,
  210881. 0x748cfccf,0x9fe6daad,0x2f142fa9,0x7ab9a6bd,0x5d471796,0xa4cba168,
  210882. 0x6bc3a39b,0x12d30b36,0x8bf45076,0x1f46a5dc,0x1421ac0e,0xb868e529,
  210883. 0x59bba1c4,0x7a686206,0xda698b90,0x2b4b552e,0xe5453707,0x5039dcd4,
  210884. 0x9e90165f,0x42a07a9e,0xd7d45dfc,0xa838fff3,0x3b5ceb30,0x41991e5a,
  210885. 0x969ca600,0x6c961ec8 },
  210886. { 0xc4e7eb46,0x703bdc1b,0x596c7b48,0xd6bac557,0x66afd74d,0x4f9917cd,
  210887. 0x656ce6f3,0x56355105,0x32497175,0x3d1fb50c,0x63effb2d,0xfda6783e,
  210888. 0xeefaa2bd,0xbd79f1f3,0x17af9ef7,0xa4efbe54,0x5a55b7a4,0x6cef6462,
  210889. 0x1a713304,0x116f3238,0xb95625a3,0xdb2a2a7f,0x0b027e96,0x6a0aa43a,
  210890. 0x4832b3bc,0x458fe5d2,0x5adfaac0,0x523418df,0xc49e7f9a,0xc05a89cb,
  210891. 0x69e24b53,0x830883d8 } },
  210892. /* 138 */
  210893. { { 0x02557389,0x959b1c62,0xadefc0bc,0x5fe5ce97,0x8330f383,0x893bbe7f,
  210894. 0x16cfb81e,0x27e0c6af,0xd04428fd,0x6f64e65b,0xb79e6182,0x53de9245,
  210895. 0x487e11ca,0x08a313c1,0x445bce93,0x65cec3b9,0xd67ed49e,0x33bc0314,
  210896. 0x30782352,0x69f36b24,0x93ad31d2,0xd78e5daf,0xc780890c,0xf2682b70,
  210897. 0x9e45efe9,0x7015c34f,0xe6cbafea,0x135d4ba4,0x7e3fcc6c,0x43a378a4,
  210898. 0x96638f8c,0x2376f97f },
  210899. { 0xae575b99,0x0a6e1ec0,0x81b970dc,0x7e14cb4f,0xd3a73947,0xf00a3824,
  210900. 0xfb235a9d,0x0b4b9c81,0x5bf62944,0x8d15115f,0x1e165d7a,0xcfd35b43,
  210901. 0xb2ee3e3b,0x5d12fea2,0xf5182e7b,0x629984a6,0xc365d08e,0x4e43e2f3,
  210902. 0x30f36e72,0x99327091,0xfd345401,0x698b4a00,0xbaf96dce,0x23c4fd0e,
  210903. 0x23675554,0xa60ba0ae,0xb0325784,0x51bdac2d,0x215464a1,0x8ab4190a,
  210904. 0x6bf10296,0x8c461661 } },
  210905. /* 139 */
  210906. { { 0x2d1f36a5,0xeffca258,0x894c5f2d,0x0eded2b2,0x43ced84f,0x35a5cdb8,
  210907. 0xdb0e3b9b,0x290f8982,0x0719a112,0xcce0eaf0,0x39a362d6,0xd0e657e4,
  210908. 0x62697e47,0x5516a55d,0x8e636514,0x269e1f77,0xd50269bc,0x5e3dedcb,
  210909. 0x441c57c5,0xecec2300,0xc705578d,0xdb83f31c,0x1e489eab,0x1bdefb73,
  210910. 0x395fcdb4,0x20b678cf,0xff9db001,0x908cf91c,0x55f52cc8,0xcbebc6f4,
  210911. 0xb4c61162,0x155ea622 },
  210912. { 0x876fa42e,0x94be2f1f,0x7fadeee7,0xab5e8749,0x38c865af,0x692e70f5,
  210913. 0xdf8059b0,0x16e99b84,0x8b5a7ac9,0x0ceb606e,0x2d463d2b,0xced23357,
  210914. 0x2a9a09a0,0x2d0f2623,0x3861fbdf,0x2529998c,0xc1be310b,0x711888a7,
  210915. 0x0d8aade3,0x9b1229c5,0x3b13533d,0xdbcf9b78,0xff029708,0x3ca746f8,
  210916. 0xda83ef88,0xa5a013a1,0x4ab28444,0x8e904d18,0xbcbd4aba,0x2fe84b3d,
  210917. 0x259058c3,0x8f570f24 } },
  210918. /* 140 */
  210919. { { 0x2ca9c508,0xdeb66c8a,0x69d6b780,0x2dc5bec2,0x88ead600,0x16d61266,
  210920. 0x49d72614,0x61841b97,0xce472e6f,0x41e40e6c,0x1fa7a876,0xada24264,
  210921. 0xcc3997a0,0x45b9fd33,0x7c15dcf4,0xb25e8fa9,0x12e9629d,0x0124ceb2,
  210922. 0x7db3d956,0x3a8c72c6,0x7c1a7844,0x8e2ded2b,0x6dd027ff,0x94ab09c6,
  210923. 0x7e7a2bc6,0xf89a057d,0xcf70c763,0xad8bf226,0xc8a26212,0x4cb268e7,
  210924. 0xb2c44c1d,0x3d171e87 },
  210925. { 0x8ce49820,0x382ac16e,0xc0c44dc9,0x24ee45e2,0x73e858c4,0x0ec67912,
  210926. 0x46327cf9,0x918cb25c,0xc6159c1f,0x43e3876b,0x37545cb3,0xb6b6e0e0,
  210927. 0x5d12347e,0x64b839ab,0xa300d541,0x72e09274,0x881c1169,0x26ab28e6,
  210928. 0xeb75a843,0x4a580fff,0x359120df,0x0a5802ca,0x3209f4a3,0x7fee82d0,
  210929. 0x8e6a9380,0xb518016b,0xc2ee11ca,0xb99c6c70,0xab9d4ec7,0x16105af1,
  210930. 0x34cd9004,0x234e98f8 } },
  210931. /* 141 */
  210932. { { 0x14db9cda,0xff435208,0x96adec90,0x99cfdc47,0xaf458b6d,0x843aaa6f,
  210933. 0x743eaa31,0x3f1f7415,0x61735d81,0x915e192e,0x0ac595d5,0x3441a22d,
  210934. 0xc044bc8d,0x704bbf67,0xbe23a236,0x2f960471,0x15d1d557,0xcc326388,
  210935. 0x76b1dd94,0x9410230b,0x0c1c8a67,0xf2e5439f,0x833c910d,0x56b141ac,
  210936. 0x865b84df,0x467c999f,0x21f02b7b,0x1b0251fa,0x96216950,0xde5b5260,
  210937. 0xce3a1e93,0x6a2130e3 },
  210938. { 0x4b3ca1a7,0xd21b67a0,0x00c0ce80,0xaf42ed53,0x932cf07a,0x22ccd368,
  210939. 0x5c25c35a,0x36523a81,0x8dd04d06,0xecdd3958,0xb2f93a3b,0x73da3502,
  210940. 0xd5e5b530,0x4c5e0c3c,0x13268777,0xef9f5486,0x1e742292,0xed87fefc,
  210941. 0xa24e5ede,0x6d9ac29e,0x33849f1a,0x08abc9f0,0x40f23905,0xb09b2292,
  210942. 0x7f934353,0x6791072c,0xe6aeb550,0x102a6381,0x96feb870,0x3ee07409,
  210943. 0x9c4d2830,0x34f06faa } },
  210944. /* 142 */
  210945. { { 0x2348f005,0x869dc79f,0xdf4920b1,0x9b5c5d71,0x6dee64a4,0xfd1b57ca,
  210946. 0xe82a4fb4,0x21b7f734,0xb9578366,0x637cb834,0x7d287d96,0xc934101b,
  210947. 0x0392ecab,0x1590f8ac,0x7f75f4e3,0x280dc373,0x6a61ac62,0x8b36f50f,
  210948. 0xa65568da,0x74f58304,0xd930870a,0x80d792a9,0xfc8895cc,0x6d17b192,
  210949. 0x4914939f,0x498392fa,0xd41d5b9e,0xaf36027d,0x5caa82b5,0x452d79e2,
  210950. 0xf4115d1a,0x764d47b1 },
  210951. { 0xa2ee8b9c,0x5df22303,0x85dfcd48,0x1b9f72d3,0x10813a37,0x6b42b983,
  210952. 0x3de741f5,0xe28c523b,0xf303bb5b,0x0857625a,0xac9bf9af,0x926f299a,
  210953. 0x0d445b34,0x21beac08,0xd6ba2c0e,0x6a523a02,0x7fce2864,0xe302a1b1,
  210954. 0xe300c1ea,0x4516a235,0x7b4a9311,0x4543736a,0xc0cc89f7,0xd3c0b9e8,
  210955. 0x40ed88de,0x0481904f,0x3cb7fc70,0x4f269b56,0x321b9738,0x09a1d53a,
  210956. 0x230a3810,0x1c0dd9c3 } },
  210957. /* 143 */
  210958. { { 0xc46a7d9a,0xffaa1f67,0xbedf91cc,0x64743334,0x47a42f2e,0x45833a74,
  210959. 0x241ffaa9,0x67980051,0x335efe6b,0x70979a84,0xf08b2403,0x5f0613f5,
  210960. 0x64f211dc,0x6bb22fcd,0xa0572cfc,0xe1b8b2a3,0x7950a14a,0x19e0eb41,
  210961. 0x3eb6cd4c,0xe634bb29,0x470a25ff,0x31a04b25,0xa3d15a0a,0xa41f7ac9,
  210962. 0xbf2fede9,0xefed85ec,0x81b94a00,0x1f581f5f,0x9ef4a15c,0xaa3996b0,
  210963. 0xb06041bc,0x52d8be39 },
  210964. { 0xfd631a2f,0xbd1536f6,0xb351a8dc,0x91fae7f0,0x9b126212,0xd1a590c7,
  210965. 0x2bd0f435,0x52d4875f,0x92b0ea70,0x9aedb6d3,0xb83ab89e,0x0bd0abdc,
  210966. 0x89fe192c,0x827a1062,0x102a0bda,0x6566a960,0xce036814,0xda083037,
  210967. 0x58639405,0x30bed79f,0xdbca8df9,0x972019b6,0xefdaa3f5,0x89201286,
  210968. 0x5236b892,0xb337b996,0x28fc2e73,0x11d3e38e,0x880e8da3,0x70787f41,
  210969. 0xdae4a45d,0x6cff6367 } },
  210970. /* 144 */
  210971. { { 0xf89a8bb4,0xbd3d0433,0x93b98f71,0x42144c33,0x03470a2d,0x82b616c8,
  210972. 0xe5da089e,0x98fcc757,0x7bf5fda6,0x542354ef,0x9ebd34cc,0x1885c253,
  210973. 0xbec5dd0d,0x2e20b285,0x782a1bca,0xe71bbbe1,0x9b854ef0,0x959ded30,
  210974. 0x8997fa6a,0x17249979,0xd81f3c45,0x50cf8fa8,0x60c11152,0xa9a3b517,
  210975. 0xecf845ea,0xc9b0ef7d,0xb9fed11b,0xc9339e23,0x28256080,0xc93e9c5c,
  210976. 0x613ec1e7,0x1d2c8217 },
  210977. { 0x987cfc93,0x7381347d,0xf187f810,0x047603bb,0x1250ca31,0x3fa6bc9d,
  210978. 0xbb055bf3,0x480091e0,0x3a3af87c,0xbdf95f1a,0x140540ab,0xe2687770,
  210979. 0xd7fe045b,0x998df730,0xb723bc2d,0xb398135f,0x15ebec46,0xac230f8c,
  210980. 0x5f5561c0,0xe08e1830,0xda60a47f,0x7c0fbf4c,0xe16d4bfc,0x06e95c24,
  210981. 0x74617e92,0x74163495,0x4ae0c20e,0x39719869,0x2131e2b6,0xfe269312,
  210982. 0x0a537722,0x25486e36 } },
  210983. /* 145 */
  210984. { { 0x53572806,0x618795ca,0x656968e1,0xb2c89449,0x3fb323ae,0x149c2c97,
  210985. 0x409bc7d6,0xfb15de26,0xc79121b3,0xa90cda72,0x204cabbb,0x6d2fa14e,
  210986. 0x91604125,0xcbcda6f7,0xb435f947,0x25086261,0xc282eb10,0xdb686c38,
  210987. 0xf1a791cb,0x51016d62,0x61a2266c,0x6b1c7ed1,0x271d74a6,0x26780666,
  210988. 0x824287a4,0xb5ffeda1,0xbbe4f0f3,0xcbe503ff,0xb9482a74,0xd7f7f0be,
  210989. 0x088493f1,0x751b2358 },
  210990. { 0xe9c9be68,0xd597b9d6,0x67d10c6c,0x1794b5c4,0x7762b2f4,0xa88cdc3d,
  210991. 0xa1b44e11,0x6d94a63a,0xaaa8eca8,0xfb0bbbb9,0xc963d87f,0xf4b0f2d0,
  210992. 0x5dc7075d,0xb753062c,0x49933989,0xfed726ac,0x57f9ccde,0x5da60638,
  210993. 0x75f8c766,0x221c392a,0x5dc672ca,0xcd264d95,0xb66ecc8d,0x7004ff22,
  210994. 0x18a458ba,0xfb1aa9ae,0x8babd653,0xea9644df,0x2ba0de7c,0xa9378e80,
  210995. 0xca2c6c75,0x144cc12d } },
  210996. /* 146 */
  210997. { { 0x2989aa3a,0x593a0a1d,0x59e6e64d,0xd83f2283,0xd32e732e,0xe938b0cb,
  210998. 0x3c3cb249,0xf4c464c5,0xf89ea6ac,0x9750a5f8,0x346cfc32,0x467e5bbf,
  210999. 0x37b2b809,0xc9bfab9d,0x3b339c6d,0xf8eb7453,0x3b766dee,0x3fe01fbe,
  211000. 0xef6aea27,0xb3154254,0x7be61b10,0x555c3df2,0xdd818488,0x70fb6d81,
  211001. 0xbbe714f9,0xda1af3a4,0x9d18f693,0x575f2017,0x2465b839,0xdc08fc6b,
  211002. 0x6b84a951,0x874ecf33 },
  211003. { 0xbbb3f6be,0x624af83e,0x08bb423d,0xf578fbb9,0xd7873527,0x5623b0ba,
  211004. 0xa62e0442,0xc3659bd8,0xfe236f79,0x2903b167,0xe53f26a6,0x55a430c6,
  211005. 0x3ad712cf,0x222547ae,0x76eb272b,0xb73890d7,0x3d628df9,0x95b4f70b,
  211006. 0x53eae4ac,0x9f0e13b0,0xe7f2174e,0x5b4f5138,0x98dbae17,0x75482cf9,
  211007. 0x44518480,0x2b69bbde,0xcafef15c,0x4f279652,0xb6bcaf19,0xa0a3ef2b,
  211008. 0xce4c634f,0x31fb8581 } },
  211009. /* 147 */
  211010. { { 0x615cd607,0x398306d1,0xaa32c3a6,0x680c9faa,0x7779131d,0xe87a705b,
  211011. 0x36708b00,0x1031013a,0x9445297f,0x814fa0e1,0xa6a79b56,0x70c5583a,
  211012. 0x4b16bed4,0x03039cbf,0xaaaaf8d3,0x18a7ca8d,0x5cdb68a5,0xf33159e7,
  211013. 0xd23814fa,0xdea0e738,0x8d0f4f9f,0xeb352718,0xdcdff032,0xb0b76609,
  211014. 0x3d48338b,0x65ba8ea9,0x55dd507a,0x18044d82,0x4a4a50b4,0x844a223e,
  211015. 0x18e19e54,0x98323000 },
  211016. { 0x57f3d5a6,0x28a21027,0x6e8cadcd,0xffce5648,0x02551f3b,0x9590381b,
  211017. 0x935ebdf1,0xb26cc64f,0xc083aa6e,0x60611291,0x88e4cf41,0xcd988a66,
  211018. 0xdd53b1b5,0x581c3f73,0x77fc621d,0x78c804a9,0xfadca2fa,0x31874330,
  211019. 0xc83ccf02,0xf7008da4,0xa79a4707,0xc4122a1d,0x4a915eb5,0x9a8e0d3f,
  211020. 0xd0123660,0xa2de157d,0x65ead2a0,0x45ef43b2,0x188db285,0xd0a22ade,
  211021. 0x922e0caa,0x8abbe39e } },
  211022. /* 148 */
  211023. { { 0x3a2d2f01,0xb4446905,0x5dc6685c,0xd27c3193,0x1d74a027,0x6a908bbf,
  211024. 0x5b50ec1d,0x01da350f,0x3f3c2e26,0x1d3dd45e,0xb836ee92,0xf66e11d0,
  211025. 0x474b979c,0x7e03908f,0x98b87834,0x19e7c5b9,0xbd3d1de9,0xa741d3fe,
  211026. 0x1ef6059b,0x63c68e8d,0x3674e247,0x9b9ff939,0x3e7e67f6,0x1d7d53e7,
  211027. 0xaee9e248,0x698dc326,0xb3bd984c,0x52f23eda,0x6f8fe8a7,0xf95e31b0,
  211028. 0xc3d0ba95,0x0f15b4d0 },
  211029. { 0x790a8d85,0x8f2f6635,0xe2595af1,0x51bffbae,0x24b51287,0xd15b7ec6,
  211030. 0x3234715d,0x7639b6ab,0x2bc5441d,0x0cdd5299,0xf6d05833,0x54800ea4,
  211031. 0xf6d6e360,0x21efd752,0x19290613,0xc0b7ffe5,0xeea898cd,0xb68a5825,
  211032. 0x22982266,0xecedba92,0xbbd06bb2,0x678a91b0,0x4bb6b0cb,0xb2436dc0,
  211033. 0xcaf8ea98,0xcf7a99e7,0x71aa05bb,0xb92d0e6e,0xf5993eb1,0xbf8d0471,
  211034. 0x20385ddb,0x515db378 } },
  211035. /* 149 */
  211036. { { 0x6f5bef22,0xee43eaaa,0x20348712,0x952d2698,0x7a3af6c6,0x1e4c484e,
  211037. 0x9a8c9403,0x18d434c6,0x5001899a,0x63e5d741,0xfe8ea40c,0x5238dbbc,
  211038. 0x96798721,0xca6cc8d2,0x04acbde8,0x73db6aee,0xb7f993ce,0xbf69328d,
  211039. 0xad45e334,0xa3f79bbf,0x7c1f1630,0x8c51ec93,0x9b00a6de,0x4907325f,
  211040. 0x12d82bc3,0x49e6acb4,0x0ec59fc9,0x5901b36d,0x9cf34e3b,0xcb09b710,
  211041. 0x1abf4c02,0x2de0487e },
  211042. { 0x8dd9d484,0x18b722f3,0x7c77bacc,0x83349393,0x93d92b8a,0x58dbb8f1,
  211043. 0x8e3fac25,0x80d78d50,0x745f4a7d,0xf0500981,0x877cc29d,0xd072bfed,
  211044. 0xc30a89f8,0x67abf8f2,0x9a0820d7,0x92c567ea,0x8a3a5738,0x425ab12e,
  211045. 0xf055521b,0xc162faeb,0xb94ea5e9,0xee1c4f26,0x3d71e546,0x1e414994,
  211046. 0x43e8be1d,0x258183b8,0xef9eae0b,0x44917c82,0x73874a30,0x6813a457,
  211047. 0xcc42f86e,0x6f6ac071 } },
  211048. /* 150 */
  211049. { { 0x4dd6e3b1,0xd38822ad,0xad620869,0xfc78e1cc,0x2cacde80,0xe7843845,
  211050. 0xa8469fe3,0x121cc14a,0xe67e8ef2,0x8e8f3da7,0x4d347448,0xdb83d16e,
  211051. 0x798631f4,0x3ba1dd98,0x0a4c4c17,0xdfab5977,0x3edc701f,0x1f0a1306,
  211052. 0x6cd8ff28,0x4649d601,0xbcc55bc9,0x2267230b,0x5760412a,0x02a19c60,
  211053. 0x328faef6,0xc719d5f1,0xf67eaad9,0x27cb969e,0x719bafb5,0xf342530e,
  211054. 0xff5a82cb,0x6e2c24cc },
  211055. { 0xadaf8793,0x6313024b,0x035c948e,0x944bccf1,0x953500bf,0xe9a066b7,
  211056. 0x1d116765,0x7991a946,0x9fd93c78,0x95addb2e,0xe92e5495,0x05d2c037,
  211057. 0x9f03e5cf,0xcb145b18,0x95aa1f72,0x81ae48ca,0x135a6e4f,0x203f2702,
  211058. 0x49b2a7d5,0x2bcef5a2,0x02d7f2a3,0x0687a900,0x6c6745b0,0x2f7d3228,
  211059. 0x86507305,0x3da8a875,0x2e8dc58f,0xbe38b884,0xdbf11185,0x6b48bf34,
  211060. 0x97c08f91,0x5af7fd0d } },
  211061. /* 151 */
  211062. { { 0xf4a224a5,0x55f9b950,0xcc50273a,0x41904574,0x643f1fd5,0x34f81330,
  211063. 0x0e50f783,0x996801bb,0x89581712,0x866d7403,0xa4091d36,0xdb9a405d,
  211064. 0x16a46fe7,0xf1e379df,0x83bf9168,0x8d04a93f,0x32b20bca,0xae4c8335,
  211065. 0xf72a1c10,0x99d334b1,0xd8195db4,0x8fbc9977,0xfba14b5d,0xcaeb3dff,
  211066. 0x76daf476,0x60fef022,0xdb5b72f4,0x4b948dfe,0xb6dfb062,0x5185c925,
  211067. 0x9609d4ae,0x27a9c381 },
  211068. { 0xf12a93af,0x73c37346,0x5536634d,0x028b707c,0x498193d1,0x8efa58d5,
  211069. 0xef21b69d,0x4f83a5cc,0xa788a0e2,0x05cbb0a3,0x65b13c98,0x01031781,
  211070. 0x2b73784c,0xfea20e58,0xe50361f2,0xdf9713a0,0xd0cc22d9,0x31449a0f,
  211071. 0x7c5e2e1b,0x183752e7,0xb67044cf,0x6e44d6bd,0x733e177a,0x012dde95,
  211072. 0x08ee2c23,0x68b49669,0x1f5f1949,0xd9bb0541,0x6acd886f,0x95182c71,
  211073. 0xfbde9244,0x1c690694 } },
  211074. /* 152 */
  211075. { { 0x3a880026,0x5db67d17,0x125d95f2,0x89c4f0a0,0x3f6cb7a4,0x29050551,
  211076. 0x5cbbdca5,0x3eb231d1,0x972bcbd3,0xf8cffc99,0xad55a03a,0xcb4ef4d4,
  211077. 0x22867c2f,0x944d47ca,0x0ead1aa5,0x96d88548,0xcbc8b045,0x76a57cf8,
  211078. 0x005e55a0,0xdfe5844b,0x1d18a097,0x5e9e7e19,0x52923c74,0x957a26e8,
  211079. 0x7f5db339,0xd0867b79,0x63bed0c8,0x2553408e,0x689ad23c,0x1596e5d5,
  211080. 0xa504c339,0x7b8c13d6 },
  211081. { 0x52fb6901,0x2fc43aad,0x16ca253b,0x1c0313f9,0x515aadc6,0x1475830a,
  211082. 0x7f577dc2,0xc93d1926,0xf723c0dd,0x26e52e8e,0x3eb9f6da,0x2f1e0eb8,
  211083. 0xf180376d,0x9979de82,0xb0834939,0x43e28ecb,0xa39c38e7,0x9a2d51dc,
  211084. 0xa8e3f6b5,0x6e6063a9,0x4b9b3270,0x4cf1da3a,0xd2f8915d,0x6e5348a2,
  211085. 0x50507912,0x5e75e3e0,0x20d383fa,0xaeffce57,0x8fd2fb29,0x1d6d53cc,
  211086. 0x696f4cd0,0x0e3c3ef6 } },
  211087. /* 153 */
  211088. { { 0x21ee1d83,0x3bc337c1,0x787b7788,0x97e08f6d,0x138fa4ce,0xbf709fcc,
  211089. 0xa0348e58,0xbaf77647,0xa55e672d,0x04f8babc,0x7d5ec5dd,0x0ed2919d,
  211090. 0x33e99218,0x8ce64bff,0x24b059af,0xac09fc57,0xdc5e32ba,0x506831f9,
  211091. 0x465af6a9,0x26a22677,0xc97f1ff8,0x3c5efe66,0xbc6087fd,0x1515e0d6,
  211092. 0xaa8edc6b,0xb1a39c5e,0x0e79ed29,0x3dd816bb,0xbc3788b8,0x6cc13769,
  211093. 0xc092a51c,0x463098e3 },
  211094. { 0xc8bd0fa7,0x3a6408c7,0xce6bde49,0xd1764311,0x283ef7be,0xe315e108,
  211095. 0x99b5d938,0x8213cc77,0x45a49a6b,0xaf7f1581,0xe529e4d1,0xd00fdb0f,
  211096. 0xce66c9d6,0x55d38f77,0x1bd4b952,0xb4f7ccc0,0xaf71f986,0x8d975b49,
  211097. 0xcd64d00a,0x12b59fcb,0xa5a3bad7,0x1860e504,0x2b5c89f1,0x6d976044,
  211098. 0x7a3e231f,0xfed0c659,0x178cba92,0x58114c33,0x6698e11e,0xe2e74c06,
  211099. 0xa348b85a,0x7f8fd093 } },
  211100. /* 154 */
  211101. { { 0xc19428af,0xf24592ca,0x3a308665,0x192a1c81,0xe30bbd7f,0x42589812,
  211102. 0x836c6bb9,0x10db0723,0x598e4987,0x9c7a41e9,0x6ead6f4b,0x8aff179e,
  211103. 0x75862c44,0x70f8f9b9,0x6f21983e,0x6b3b0237,0x98e65152,0x25d83e9b,
  211104. 0xd751218a,0x3b2d26a8,0x9d6f1da6,0x9508281a,0xa5a81f74,0x8df78d05,
  211105. 0xe4687471,0xd79ee559,0x6787d8cc,0x2060ca57,0xa8476c95,0x427a84ff,
  211106. 0xe6435131,0x87b64c51 },
  211107. { 0x4b30d3c4,0x87f46f65,0x23b4ef14,0xcdec4c5c,0x63ca4d68,0xb3b74766,
  211108. 0xcf3fb56d,0x1df34269,0x0fd7d46a,0xd4f139c4,0x6a69a8bd,0xa3b7c7c7,
  211109. 0xcbadd7d2,0xee56b4c9,0xac942334,0xb28ff342,0x786f1da3,0x0046fdfa,
  211110. 0xb700c82e,0xce5d149c,0x50966597,0xca30ef81,0xfcff4bdd,0x44a20609,
  211111. 0x44925268,0x0f2f65e7,0xd4021f38,0xe5b6552c,0x042dbbd0,0x77ea9c2a,
  211112. 0xd9c062f5,0x8c95267c } },
  211113. /* 155 */
  211114. { { 0x5fc1abb1,0x6655032e,0x12fe4743,0x2215af54,0x29f05ef5,0xfd657560,
  211115. 0xdc191be9,0xb0e73325,0xc08639b0,0x7ab3c65e,0x1c3e6673,0x67507f51,
  211116. 0xc8615555,0x638befc3,0x42f0c4ad,0x5d0188cf,0xd896186d,0x843a301c,
  211117. 0xb2c6741e,0x045603f7,0xfa3cd1d0,0xf7545c0c,0x4a40672e,0xf612affd,
  211118. 0x45b9e8dd,0x56197c9f,0x87922d74,0xb453237d,0x4b2d59bf,0xbf132e3a,
  211119. 0xb84a6a16,0x8afa1b73 },
  211120. { 0xe793ac70,0x6b3596ea,0xeef6dd10,0x4c94ef8e,0x70422e40,0x926b4fa2,
  211121. 0xe9e5d763,0xc8c71dce,0xf512aadf,0x352fcb70,0xa883975f,0x1b7ba138,
  211122. 0x058c3b13,0x57991390,0x97740fd1,0x9692092a,0x160b0697,0x19ad945b,
  211123. 0x10837ab2,0xbc634388,0xf174bb71,0x76ee11c4,0xab1b80eb,0x6111bfc1,
  211124. 0x70ec458a,0xbc82bac8,0x312d3325,0xeee60127,0xb240adc8,0xb4118b1a,
  211125. 0x2b5a093c,0x67211191 } },
  211126. /* 156 */
  211127. { { 0xf55cf9bf,0x91e99306,0xa46b96d9,0x9b045308,0x9e7a65df,0xae3c1e1d,
  211128. 0xc731bcbb,0x453cb151,0xa4d58a61,0x14be5227,0x97c74cc2,0x39dac922,
  211129. 0x822e00d6,0x4d0f7a45,0xc62b03df,0xafeb1d51,0xbaa18b2d,0xbb1dc3a4,
  211130. 0xdf2b74f0,0x7f3c7178,0x896b6a33,0xfcd328a6,0x1dce055f,0xe95ed454,
  211131. 0x6a4e2b87,0x97fbc76b,0xfa59dce9,0xe5ec67f1,0xcc0367c1,0x052368ac,
  211132. 0x54e4a3fe,0x7c863916 },
  211133. { 0xca7388cf,0x55e94b5e,0xc0335d38,0x17cc0a60,0x616f85ba,0x9b69b78b,
  211134. 0x10122980,0x705d02ef,0x1cfd0a79,0x565a6e80,0x7d1ee352,0xeb74a96d,
  211135. 0x427b9dad,0x5c8832ed,0xe6d5330f,0x96ea8528,0x18d24ee8,0x30d8862b,
  211136. 0x9ff939f7,0x9cd38ed5,0x01060252,0x690fc9a2,0x2303b3ff,0xc62d88b8,
  211137. 0xdd52b469,0xfc42d7a4,0x8cad2d93,0x06f8dfa2,0x60920438,0x50236090,
  211138. 0xfce855ad,0x32582758 } },
  211139. /* 157 */
  211140. { { 0x359e8c60,0xeb20e45f,0x364ca186,0xc71bb8a5,0xdff8e110,0x02b15071,
  211141. 0x4c93e578,0x074e91d3,0xb829d0d8,0xc0326e00,0x626a83fa,0x3c192258,
  211142. 0xfb29a09e,0x387a64d5,0xe5ac5c82,0xcaaa3d34,0xada2da29,0x8ed685e5,
  211143. 0xeb29650e,0x92720267,0x763802f3,0xf7184b19,0xdf6b1aea,0x23f5dd0e,
  211144. 0x25e6125d,0xbe1fa347,0x0c872a1a,0xd6287f9d,0xac57c3af,0x49aa93d2,
  211145. 0x5bda7656,0x1a4e6a71 },
  211146. { 0x554d1267,0x1a126ede,0x1cd02b48,0x37f94533,0xce31fb1d,0xd70af04c,
  211147. 0x097dc012,0xcf410b0b,0x36c7b6c5,0x930e1d17,0xc6891085,0x902fee41,
  211148. 0x79fb638f,0x349ba4a7,0xacd6f8df,0xa16c5821,0x2e076ace,0xfb3b83c1,
  211149. 0xe501d14d,0x6b8d033b,0x20f2d2da,0x0593d452,0x99df1880,0x3752526d,
  211150. 0x9feb33a6,0xca32351c,0x1f6ef456,0xd91343bc,0x35b9dc8a,0xc74857db,
  211151. 0x85b4e832,0x856a7c93 } },
  211152. /* 158 */
  211153. { { 0x0d0a5583,0xa007d002,0xeda4658a,0x2f1301dd,0x34d939be,0x91c07964,
  211154. 0xa70c0836,0xa0cb6780,0xbe81e540,0xc0b4df95,0x5d4ac8b8,0x6cbbcd34,
  211155. 0x54756239,0x57c52ed0,0x1805ceb6,0xcac2dca4,0x79344255,0x915ee6ab,
  211156. 0x24c9a2a6,0x366def31,0x8c12c674,0xbd3b962f,0x7dbb7c3b,0xaab64f1b,
  211157. 0xe22bb95b,0x3c0e4553,0xc4c63b74,0x2408feba,0x2a4da631,0x3ca77312,
  211158. 0xc636da40,0x62889084 },
  211159. { 0x8cb8d208,0xa457fd53,0x543f06d4,0x7a8f8009,0xf2eff2ab,0xb66de154,
  211160. 0xf72517e7,0xfddb28eb,0xf9389d2c,0x0149fe66,0xd85b88ce,0x79e8773f,
  211161. 0x0ba543f7,0x452e090b,0xb0b03fc0,0xdeb9b5cf,0x6c5ed77b,0x3113448a,
  211162. 0x8ffc0372,0x3609f3cf,0x5c1b4c4a,0x2bc9c46d,0x8fa59be9,0xe66f3bf3,
  211163. 0xcdb02691,0x1396bf5f,0x009f88f9,0xf1ec59d4,0x2ad9dfe3,0xc2903456,
  211164. 0x5ada4d58,0x79d8122c } },
  211165. /* 159 */
  211166. { { 0xaa529507,0x14d4e4ce,0x74655d00,0x056a0814,0x4f0fc474,0xc0d30a38,
  211167. 0x3443cb8e,0x8a8203ea,0x97f1728d,0x33c62fb0,0xb520ef52,0x8a38dcfd,
  211168. 0x7cac9d3e,0xa0f90d5d,0x873cea50,0x28a7b0bf,0x6c6c41cb,0xd115ae3a,
  211169. 0xa13812c1,0xa35171da,0x624d507e,0x25d4bba5,0x7e98f42f,0x91dad289,
  211170. 0x96a41371,0xffd6b1e9,0xb69e5b77,0xd46c2125,0x20c4f707,0xc7d2b424,
  211171. 0x8142557a,0x2ab3af95 },
  211172. { 0x6a5372a6,0x86ca074c,0x56292ba7,0x728fb83e,0x77741cf5,0x745596dc,
  211173. 0x520ef49d,0x70b4cea1,0x61e46472,0x1472fe34,0x3fb8ac5d,0xf4d6bd66,
  211174. 0xc10bc071,0x46e52cc9,0x371a3461,0x28794efe,0x276fe877,0xa4850718,
  211175. 0x9bef5ab4,0xedad5773,0x3f15c815,0x24c2d9ff,0x8f8395c3,0x188950e5,
  211176. 0x80b6a855,0xbae40996,0x8a8803e1,0x4f53e22c,0x039d25ee,0xaf233f61,
  211177. 0x250409ca,0x07db2c35 } },
  211178. /* 160 */
  211179. { { 0x037d4703,0xc7f3b8db,0xc5f488b9,0xe83708df,0x8471d402,0x1fba830f,
  211180. 0x5a2faae9,0xa55ee8d2,0x5404fc1e,0xc2e5bf10,0xaa2d5651,0x647d5027,
  211181. 0x7ebaf5f9,0x37a53c0c,0x95b30abf,0x7adf0bb2,0xd64c93ba,0x5a62e1fe,
  211182. 0xe2ef4a78,0x7ffc18c0,0x4d2cd04f,0x139dd9d9,0x5ea0af02,0x253fbab7,
  211183. 0x0fef9acf,0x7c8100ea,0xc8615aa7,0x74c5384d,0x9fe52069,0xcb28682d,
  211184. 0xcf7dd759,0x08b6ca8f },
  211185. { 0x036c3b5a,0xe04e5bea,0x7f9f2b4b,0x38726102,0x29797c0f,0xa9fca570,
  211186. 0x82879ea3,0x1656180b,0x607f0ddf,0x153389bb,0x67b0e087,0x99a1223c,
  211187. 0x9d897fc7,0x0d1808ec,0x916edf19,0x9470711a,0x07217118,0xf8f52f2b,
  211188. 0xd18888b6,0x5d8b29ff,0x4cc6f900,0xef1e22c5,0xeb24877f,0xc4036165,
  211189. 0x35479525,0xfda95233,0x6861468a,0xd622a421,0x74faba08,0x5d043b07,
  211190. 0x0d31a7d2,0x2c337b02 } },
  211191. /* 161 */
  211192. { { 0xea22fa65,0x7b2305bc,0xd159f63a,0xbe183ef4,0x3f35923f,0x3473d87d,
  211193. 0xc11d7753,0xb27fb306,0x2a054cff,0x702e7e6b,0xaf185619,0x3ce9f97c,
  211194. 0x4e7d51c5,0x83550243,0xf356ac5b,0xa63e3d82,0xd7645131,0x867b7caa,
  211195. 0xa671fc9d,0xee85e6af,0x2b07cd77,0x3b985ede,0xffda5193,0x07d598b0,
  211196. 0xa942dc36,0xb10eca39,0x506218a9,0x17f3dcee,0x06b7d5ca,0x3d94e8d1,
  211197. 0xed8831c9,0x509b2634 },
  211198. { 0x48caed54,0xb1b9414e,0xcbf51e97,0x77a78c6c,0x4de9b258,0xa4688c8d,
  211199. 0x91ee3d78,0x0024137c,0xe30ee64c,0xa68f9234,0x88190d78,0x573255bc,
  211200. 0xba80690b,0x41e8e05f,0xec354f4c,0x50038d84,0xdfa52816,0xb18f02d6,
  211201. 0xccb63fda,0xc47f9007,0xe98ae455,0x29d480fb,0x5d0e319d,0x4ac45d22,
  211202. 0x026db719,0xd06f3575,0x2c3587b9,0x733b9e20,0x2c317727,0x22483992,
  211203. 0x54bb8752,0x1592d5a7 } },
  211204. /* 162 */
  211205. { { 0xcf7453f0,0x5778d9a2,0xed83c1f0,0xaffb899a,0xe0a82ba7,0xae6506d3,
  211206. 0xea3d5081,0x32c84e1a,0x810aa38b,0x9ad528c0,0xbd37d041,0xb1fdb020,
  211207. 0xd06ce41f,0x78d6cbe1,0x2e74b7f6,0xd287f0f0,0xc43bb022,0xf5cd2575,
  211208. 0xf81a71b3,0x6d28f2f3,0xc633e7f4,0xe65bb1f5,0xc4fc580e,0x32e5fc1c,
  211209. 0xbb7b07a5,0xcd55539f,0xc3caaf3a,0xb5a94471,0x4cc22d2d,0xb958bdf4,
  211210. 0x77a2777c,0x1614bdbd },
  211211. { 0xed0ab04d,0x4c1f0230,0x6e2082ea,0xae347b00,0xc42c5b5f,0x9f10bc63,
  211212. 0xde019935,0xb0539e6f,0x65dd0825,0xd89bd4e7,0xbbceda16,0x92260fef,
  211213. 0xe62aca32,0x8aaa755c,0x5ec82c5f,0xed762fa9,0x18650768,0x99e64c01,
  211214. 0xc92e348c,0x57dd6245,0x31ea6d68,0x0db88a77,0x07b44736,0xef0012ab,
  211215. 0x171d70fe,0xb9356b94,0x03f891b0,0xe68b0628,0xb79c20a2,0x3a54a53a,
  211216. 0xb00b0728,0x489656c7 } },
  211217. /* 163 */
  211218. { { 0x71353c25,0xe43649ba,0x13f67e24,0x517f27a1,0x1c1eb9e3,0x10bd333a,
  211219. 0x78e29bf9,0x94e1c05c,0x4743f15d,0x84fe7d97,0x90da2df0,0x9c874908,
  211220. 0x53673be1,0x82403fa7,0x1baea1b1,0x7ebf5db4,0x24180ead,0xcfe0ae35,
  211221. 0xc2f50c3f,0x1d15873f,0x70661cd9,0x16851ad6,0xa51e8c2c,0x802968d9,
  211222. 0xe0161099,0xe7d1a9cd,0xa8a7ea56,0x2b153c89,0x06e3c498,0x6d41b789,
  211223. 0xd6769dcb,0x082bb2e9 },
  211224. { 0xc4d6615f,0x6180ef46,0x01b9829c,0xfc629dc1,0x0fb264ca,0xde222ec0,
  211225. 0x10ecc2c4,0xc5457e06,0x1eea2c4d,0x95ce599f,0x8f9c5b2c,0x0433fa72,
  211226. 0xcd6310f9,0xee035462,0xce2e2253,0x84c57c3b,0x96d87e44,0x6c8ec31a,
  211227. 0xa452c5a7,0x30bfe393,0xa047b235,0xc592b140,0xc018545e,0x7bd8be18,
  211228. 0x5c178c46,0x794e0107,0x2e23005b,0x48471946,0x622a54f3,0x2665e237,
  211229. 0x901c9042,0x36451a46 } },
  211230. /* 164 */
  211231. { { 0x19893e71,0x17802d18,0x539a2082,0xa1765d8b,0x2302ecfc,0xfc6aea01,
  211232. 0x365bf59d,0x8d4cf51b,0x0d232a80,0x87741d72,0x18e80427,0xac343eb3,
  211233. 0xe74739ec,0x553ecb2f,0x1a8b07ca,0xaeca79a8,0x56f4ab3a,0x089ff322,
  211234. 0x3fa1d1f7,0x5e95d729,0xf62a9a16,0x260569ae,0xaa08ddc2,0x5e776232,
  211235. 0x1b7bb54a,0x93fabec3,0x743d56e7,0x48a20956,0xeb0ebeff,0x749cdb12,
  211236. 0x69b8fcf1,0x705307a4 },
  211237. { 0xe488310b,0x7a8e4c04,0x5325cd7b,0x12726e32,0x4983efac,0x5d0fd8b0,
  211238. 0x02ddb913,0x796e552c,0x77b9685c,0x0eeca3f7,0xb15f24a3,0x9b766e89,
  211239. 0x48efc979,0x7c2736d6,0xa8021c6c,0x3d619685,0xa0b2f1ea,0xfe33e278,
  211240. 0xb676d6b0,0x95c69879,0x1af4e0be,0xa0747319,0x36c4ee55,0xa2fab5f1,
  211241. 0x59e5f3b9,0x6938b8ff,0x39cafe6e,0x1e114da4,0x6a6ad120,0xc9595ec3,
  211242. 0x57e62aec,0x80f79bd0 } },
  211243. /* 165 */
  211244. { { 0x60af09b3,0x3cef42a7,0x933dfe14,0x3c016ebd,0xed85eaa8,0x720cf1e0,
  211245. 0xceaa3bc9,0xd4f5e99f,0xb7106f97,0x7216b9d2,0xc9668ad2,0x65f34c36,
  211246. 0x5b0c651f,0xa8fb82bc,0xf2fda4de,0x20f42f1c,0xd21f659e,0xeb31ab2c,
  211247. 0xa13d1618,0xb7a776c7,0x38662be5,0xec441022,0xcad08e0b,0xc825da70,
  211248. 0x022c0180,0x99299079,0x2aef9ffd,0x7623bda0,0xf5c58b50,0xde84f4f3,
  211249. 0xd824ff19,0x5f5a5da4 },
  211250. { 0x7e8311dc,0x5737257e,0x466cf136,0xdef94f51,0xb05ca21a,0xa73e1645,
  211251. 0x02e4ab37,0x38ea9b3c,0x8579165b,0x7760eac9,0xc24b01a4,0xdffdd047,
  211252. 0x3fb95584,0x188d4fd1,0x25548bda,0xfaac38b8,0x59e9dcac,0x1a79a6f0,
  211253. 0x09a2700f,0x983f720f,0xfb8a7e48,0x8cbba554,0x47a1fad5,0x38a19968,
  211254. 0x5abd6b5e,0x11856547,0xf3716ec2,0x75113d31,0x4212907b,0x1391e781,
  211255. 0x0dc15889,0x5319c801 } },
  211256. /* 166 */
  211257. { { 0x6b61c3af,0x2320136e,0x07b4bb68,0x1d40f2de,0x380c97f0,0x651dee7f,
  211258. 0x6a8c313a,0xa978ba70,0x2011ca10,0x22c587d6,0xab1f445b,0x48bba218,
  211259. 0xe50444e6,0x8c5eaf07,0x442fccf9,0x5549f02a,0x3d80493d,0x2564746f,
  211260. 0x79c04591,0x42d24f61,0xabdc8887,0x1600fa18,0xded38f8f,0x5cb8600a,
  211261. 0x923aeb46,0xa4bf9b90,0x1e1c578a,0xd63fee35,0xebb9ea14,0xf3c9c5ac,
  211262. 0xf11a4ff0,0x3d13314d },
  211263. { 0xb4513d1e,0xe5cc662d,0xd55952bd,0xde78a8c5,0xe7f86d0a,0xe8a37a3f,
  211264. 0x7a04f0c5,0xca2d12a4,0x2e25d06c,0x4c6696e4,0xb2136071,0x52614698,
  211265. 0x89f6e1cb,0xf4d2701b,0x80efd95e,0xaafd6177,0xc5bb6907,0xe6d73ac4,
  211266. 0x420db35a,0x49e874ac,0xf2751fa0,0x11631de4,0xa1fa2edd,0xb29f7336,
  211267. 0xb7fd794d,0x4c406864,0xe22f92a6,0x73cb21d3,0x2043cc76,0xeae904e6,
  211268. 0xb322c6ad,0x67f28a9f } },
  211269. /* 167 */
  211270. { { 0xca148ab5,0x7c17b258,0xb3c60051,0xb9a1976f,0xc8f28df9,0xea260698,
  211271. 0xe8d45017,0x87b2cc74,0x0578a422,0x37257329,0x17bec732,0x81d5ee25,
  211272. 0x1d48bbc4,0xd7411fcf,0x487f5cfe,0x46217e6b,0x41eb8e1b,0xcb007ac5,
  211273. 0xe05a00c8,0xc41c57a6,0xd2f9fa99,0x1f954d2b,0x40941cad,0x370bd5db,
  211274. 0x3829509d,0xe487879c,0x5ceca5ee,0x4c137552,0xfd3efb9e,0xe8ef7fa4,
  211275. 0x1bd1bdb2,0x5ff09174 },
  211276. { 0x579c6632,0x791912a4,0xb8a20815,0xbb19a44f,0x535639d3,0xf4f97b84,
  211277. 0xbc3c9bce,0xe57e2bcb,0xf19e6410,0x122b3f2b,0x1357d9ad,0x1f0189da,
  211278. 0x79e5ff66,0x675573bb,0xef2f3c4c,0x444e5c98,0x04d10731,0xd6f61e20,
  211279. 0xac75d635,0x0dfa366f,0x2c854f23,0x9fc47c86,0x0ad0850b,0xc04ae43e,
  211280. 0x2f720c32,0x5ce94f64,0xa753bc9d,0x67efae65,0xb0373a63,0xc27d30d3,
  211281. 0x29721646,0x6681013a } },
  211282. /* 168 */
  211283. { { 0xe84509df,0x1385d913,0xcf339376,0xe978bedd,0x3423a148,0x2df425d3,
  211284. 0xee8cb579,0x43fa0ae3,0x31c4553c,0xf015369d,0xdfbf1d48,0x05cf08bb,
  211285. 0x9444244a,0xadff4be6,0xa35dda33,0x01635f81,0xe76fab7c,0x085c8949,
  211286. 0x16737783,0x4bd7fcde,0xa254f8d2,0xfd8cb52c,0x413ec985,0x62168a66,
  211287. 0x7a9026cc,0xf2db9741,0x50e1e1b7,0x3962ee56,0xd3beffde,0xbee0a346,
  211288. 0x0bdfab1f,0x3b35b72f },
  211289. { 0x535c3749,0xbff8de9f,0x8add9c48,0x23c1f20f,0xc8f8f663,0xa975b37b,
  211290. 0xe8f3ae49,0x2529e475,0x1d5e2628,0xc32f10d5,0x67862f1d,0x5ac0d297,
  211291. 0x854cbe36,0x13c79338,0x4b67e462,0x48f004ef,0xe5d10ee1,0xfa37a150,
  211292. 0xd28288a0,0x4974778d,0xcfb73f4d,0x96830a66,0x07804952,0x9f444013,
  211293. 0x9760b694,0x8233c709,0x25b75c99,0x8340cca5,0xc771f99c,0x3f62e40b,
  211294. 0xcd95c685,0x47d0a1eb } },
  211295. /* 169 */
  211296. { { 0x652811f1,0x266f4fff,0x62ef3002,0xeaacaa93,0x50cba0ca,0x6c387a55,
  211297. 0x007f5467,0xa350142a,0x202f2673,0xc7fd102a,0x33dc6e65,0x5daee570,
  211298. 0x064a63d9,0x60682ec3,0x462b251e,0x46cf0bb0,0x5da936e7,0x0e030ca5,
  211299. 0x434265b5,0xc87a60f2,0x69b4e8f5,0x9637b2bb,0x7ad7770a,0x601fb58c,
  211300. 0xed3a15a6,0x1f2147f6,0x2995e961,0x05b47d5e,0x83213a16,0xcb0ca9b3,
  211301. 0x4995a85c,0x8f4b614a },
  211302. { 0x4b4eb3c1,0x5aa8ec19,0x20323a70,0x8c549ac4,0x4f6cc6aa,0x00d49322,
  211303. 0x45f9a5a3,0x0e53b9bb,0x0897abbb,0xe46ef110,0xd7acd7d0,0xfe873e57,
  211304. 0x0f7cb588,0x7cfccfe5,0xc85557d1,0x0ea53d65,0x7288f2e2,0xfdd9eb44,
  211305. 0xc0eb68a8,0xab2dedfa,0x08603a0c,0x58221470,0x00feb06c,0x69464689,
  211306. 0x25e5caac,0x804cf5bf,0x9fc91ae9,0xd8559858,0x73c45eae,0xed9378b1,
  211307. 0x524c9801,0x8f942d02 } },
  211308. /* 170 */
  211309. { { 0x8e845808,0x1f1ec302,0xb77abfc5,0xc302bffa,0xf8d97dc7,0x26afd4b9,
  211310. 0x3aac594b,0x3d3a83c4,0x674d94dc,0xe3b74bd1,0xcaa5911c,0x4464b737,
  211311. 0x871c2cd2,0x62925773,0x3b4440fe,0x419f2485,0xe052ad7d,0xdda6a0f3,
  211312. 0x846c86c0,0x645280d6,0xf8324f42,0xa25689fa,0x07cf117a,0xc74ad1e8,
  211313. 0x8ddc9db7,0x5626dea0,0x966fc85d,0x52620373,0xf3b1eb53,0xe0ad57c3,
  211314. 0x949c1acb,0x38300252 },
  211315. { 0x5e744723,0xa0ef5a40,0x1ae08481,0xdb5bcf75,0xfec1f76f,0xabfad8cc,
  211316. 0xfab37fc6,0xfba5d831,0xc8fedb78,0xbe39e248,0xad93f310,0xa5cfad5f,
  211317. 0x913d5c24,0x747fdb1e,0x4518b7f5,0x052a47c9,0x7cfb4327,0x9e208d6c,
  211318. 0x70e538be,0xb135cb9c,0x5bb17916,0x36352759,0x5b3106c7,0xa2c07880,
  211319. 0xc209bb06,0xd2d42a06,0xd3c504ad,0xb525b471,0x822ce034,0xc9f4b368,
  211320. 0xeb4185a5,0x15f18796 } },
  211321. /* 171 */
  211322. { { 0x0aee4684,0x094dea06,0x7cdbdbc8,0x42b21f06,0xb1931319,0xa439e149,
  211323. 0x81a7dba6,0xea4bdd41,0x3c2ae80f,0xc6213706,0x12823dc2,0xb58b0967,
  211324. 0x832611b1,0x7443d515,0x13c20384,0x2e16f831,0x2bd992d2,0x0ce204d6,
  211325. 0xf419388b,0x499dbcd6,0x1d3778c7,0x492ded1d,0xc5ddae73,0x9d5bd74f,
  211326. 0x994b6259,0xd4813d52,0x0e86ca68,0x191d9cf6,0xf3e9c2ac,0x562179ea,
  211327. 0x9fee1238,0x6146f1f3 },
  211328. { 0x078e2aa6,0xbd06d33e,0x9dee9265,0x693af7f7,0xdaa40e84,0xd56e0f81,
  211329. 0x9b9a407e,0x05fbbb88,0xede99519,0xdcf44adc,0x092dba39,0x7f71f8d3,
  211330. 0x4231774b,0x675b5da5,0xa5f605eb,0x7456a251,0x87a39a9e,0x9031d4af,
  211331. 0x05b474bd,0xdb430006,0xb665aa91,0xbda5dbf2,0x6631eeb4,0x5d1a3df5,
  211332. 0x62377c58,0x028149ef,0x685d0bff,0x2e1af4e9,0x82a465de,0xe0ea0875,
  211333. 0x06bd0050,0x95543f9e } },
  211334. /* 172 */
  211335. { { 0x85d7c6ef,0xf7cbc6f4,0x63b1bc24,0xcad8084d,0xbf8cba62,0xdf90ce88,
  211336. 0xb455c192,0x98e4b686,0x774fc6ed,0x6146b8d5,0x7ae20077,0x70e2389e,
  211337. 0x61c22529,0x5241c479,0x3884e5f5,0x7d221510,0x17e28273,0xd6d20ce2,
  211338. 0x4f2674f8,0xe3119f51,0x70c011db,0x85459055,0xfcfb760e,0xdfab75d9,
  211339. 0x9e8c2a19,0x9546362a,0x4a7d4b27,0x4b6d3f8a,0xee5d698c,0xa5c87104,
  211340. 0x2ba296ff,0x6db43478 },
  211341. { 0x5c3f0d95,0x06486493,0x4e748895,0x8917db82,0x6b2f3e44,0xf73fdf62,
  211342. 0x2b7f574b,0xc60edc54,0xaf732723,0xbe1c09a2,0x7cad114c,0x7d34669d,
  211343. 0x321aaff9,0x9646600a,0xed0cd61c,0xb94e2bba,0xdec4750e,0x866e1a41,
  211344. 0xb1a89f58,0xa1be990d,0xf2759693,0xc39e4d6c,0xc0e0dddf,0x11cfb780,
  211345. 0xd99c8a41,0xf0afcd7f,0x6e1c3050,0xcebffadb,0x96d2c6e4,0x4f3981b0,
  211346. 0x2ae27a94,0x07a791e7 } },
  211347. /* 173 */
  211348. { { 0x1e9f0300,0xe70e9047,0xbccdf904,0xe0253ad9,0xff053078,0x51c0289d,
  211349. 0xae893462,0xf1ef092e,0xa4846845,0x2c90a91a,0xf1dad4b4,0x1946eda0,
  211350. 0x33df67b2,0xf07650f3,0x0b15a014,0xc6e988db,0xb542f0f9,0x72e0c66e,
  211351. 0xe0c0378f,0x5d4b6311,0xae86950d,0x548badaa,0xb35f1c8f,0x6801638d,
  211352. 0x944d1ad4,0x129e3216,0x40471d32,0x9951bac8,0x85e94dde,0x03cc29f3,
  211353. 0x4543ecac,0x6d6acc2e },
  211354. { 0x57b2d299,0xeb999e95,0xe3d721cd,0x3a2bcd9b,0xbb4cb444,0x2e60384f,
  211355. 0xdc060faa,0xae177709,0x8c987cde,0x74f0e6d3,0x1076fbed,0x9a237cf8,
  211356. 0x7983fbff,0x69af1513,0x323f9584,0x6c3f7a1d,0x6db64398,0x3e21cacf,
  211357. 0x96703d92,0x7cd8134f,0xb8393f76,0x0755898f,0x2e825222,0x1b5b28bc,
  211358. 0x7924aa7c,0xb78799c1,0x81427a8a,0x1db378f2,0xff289492,0xd5a451b1,
  211359. 0x3d3c46ee,0x79d18212 } },
  211360. /* 174 */
  211361. { { 0x109d5589,0x1a3edff9,0x029b4499,0xded52eb4,0xb4b54adf,0x13eb9d30,
  211362. 0xa27bff67,0x4f9214c1,0x67f0f460,0x4c817ee7,0xc3a50e28,0xbadf8d83,
  211363. 0x94026237,0xc5dc03c9,0x966647c1,0x5f29581b,0x8a0687f3,0x10b6a089,
  211364. 0x31634517,0xae787cec,0x62e75188,0x2001dba5,0x45e2c3fb,0x55d4e1a7,
  211365. 0xb67d3395,0xbfcacdeb,0xbc6842ee,0xa1a0af9c,0x3e88580b,0x50590a2b,
  211366. 0xa784cdc8,0x73104491 },
  211367. { 0x2648d676,0x44ca2cdf,0x4f1b12b1,0x9a85eca5,0x2980e1eb,0x1b9dac94,
  211368. 0x1ac8aa89,0xf30d3709,0xc719e195,0x73072ab7,0x2f703797,0xba518c82,
  211369. 0xac0067f6,0xac090e14,0x8dcd2927,0x0e6cfc70,0x21e7da63,0x4f5889e2,
  211370. 0x8371c7c6,0xb4aaa40b,0x8f7878c9,0x1f9dabe2,0xd84caf3f,0xf78aed6b,
  211371. 0x9e0e1d92,0x3c39dd07,0x122424dc,0x680be5fb,0x0bdc0099,0xf41b214d,
  211372. 0x5180c54f,0x6a8f8fc9 } },
  211373. /* 175 */
  211374. { { 0x53235132,0x62a1ed63,0x59dba88b,0x1db233f1,0x291efdd8,0x85625452,
  211375. 0xb25111ae,0xc7505297,0x1d701bd8,0xb5921af9,0x9774f45d,0xb4d05d72,
  211376. 0xf18e73ff,0x6e3d4c5e,0x899b3038,0x897d985f,0xc89b1558,0x8a9c30fb,
  211377. 0x4d13181c,0x3c92d1a3,0x2223320e,0x292e86ba,0x01ceed02,0xcf2454c2,
  211378. 0x583f309f,0x27a45f74,0xad0fd1a3,0x75a6102c,0xcb9c7538,0xdb4f45d2,
  211379. 0xdb283fd7,0x4752d8c1 },
  211380. { 0xd5dff4d5,0x514d6cea,0x45a827f4,0x74cd5fdb,0x4fc7135e,0x1070a60c,
  211381. 0x1be5778e,0xdec0bb78,0x58dc6b08,0x271e12cd,0x54bc2496,0xb765089b,
  211382. 0x619098ac,0x6ddf2c63,0x67528832,0xfd6ebac6,0xc2508af1,0xeaa2d025,
  211383. 0x4dcfc1f0,0x13c2cda8,0x45510be0,0x1c7836a8,0x1a886801,0x3904688d,
  211384. 0xafaf2545,0x643132aa,0x2830a88d,0x49685577,0x8744b470,0x569491ca,
  211385. 0x75fb8552,0x3a6518f3 } },
  211386. /* 176 */
  211387. { { 0x224042a0,0xaaa8ed50,0x2452f1e6,0x6cb4e3b0,0x768211d8,0xedca5f4c,
  211388. 0xef4d5d3f,0x4e0fe3f9,0x522d46e5,0x33a8e2a4,0xf1446775,0x5998e21f,
  211389. 0xf592d01b,0x1496c50e,0x83a67739,0x69104c2f,0x472bbf00,0x28670bcb,
  211390. 0x503177bd,0x8ea883b2,0x7d2712a2,0xc5d8bc05,0xb439c994,0x41ef9317,
  211391. 0xdcda1aff,0x9801d3a8,0x7038f6fb,0xd686eeb5,0xfbfbf820,0xe80c5cd0,
  211392. 0xedc25817,0x540ac363 },
  211393. { 0xfe7f43df,0xa71969a9,0x2c1b9e4c,0xe6653808,0x859c2917,0xad9677d8,
  211394. 0x96aa4404,0xbaca9545,0xff1297da,0x0e9d855f,0x22aea7de,0x1f61897b,
  211395. 0x36f13f8e,0x96edccfd,0x16e200df,0x627d3070,0xc98988a4,0x729f0736,
  211396. 0x97f231d2,0x95e25e60,0xf6048752,0xaf7f221b,0x4019b299,0xd6682609,
  211397. 0x26b4b1d9,0x1d99de09,0x1acdd7a3,0xec47cf66,0x6ebe15e9,0x4de9f2b3,
  211398. 0xfa16974f,0x17db32ec } },
  211399. /* 177 */
  211400. { { 0x6cf40599,0x75ef6919,0x00c020ea,0x7ea10dfb,0xfcaaf679,0x3da5ae7b,
  211401. 0x88ddd678,0x0d663ca3,0x255bcfcd,0x5a21f8fe,0xe344bc7e,0xe9c3f538,
  211402. 0x548e0632,0x35f62b1d,0x43c6e64d,0x654f2425,0x26993627,0xc755a7a6,
  211403. 0xb0f41324,0xa3b7c5f7,0x3a2180f3,0x05697f79,0x1e81675b,0x6cf85fb1,
  211404. 0xe53428f5,0x6d3cdb35,0x52d28b02,0xe3aa1591,0xf7a3fb78,0xa8470255,
  211405. 0xa194445d,0x460bd01b },
  211406. { 0xc24d8077,0xbc34dc23,0x4c720d2c,0x82f4b580,0x6f5d1ffe,0xa29da911,
  211407. 0x92783ce2,0x578af520,0xb5904af3,0xe29f51ab,0xf7aa1190,0x46c570d7,
  211408. 0x571bddf0,0x4a522fba,0xae89bb51,0xbf4e2a06,0x59f3444d,0x799b35cc,
  211409. 0x26cc2557,0xc3028367,0xafcec177,0x94a4e985,0x7c36cbd0,0xadaf7dcb,
  211410. 0x75d39077,0xed31b787,0x2d3e24bc,0x52d6904f,0x1f95421b,0xc5ca2669,
  211411. 0x1734878d,0x7d342c3c } },
  211412. /* 178 */
  211413. { { 0x11fd127f,0xe5cf2c0a,0x119e4c5e,0x66d36bb8,0x6ef56ac3,0x621ab252,
  211414. 0xe5430675,0x30cfeaee,0xac3e9619,0x2ede27d2,0xf8fce671,0x6413513a,
  211415. 0x075f4c3d,0x6159c61b,0x59069d98,0xd447efe9,0xea76aea9,0xaf8d6f68,
  211416. 0x0f5bd164,0xac5dc61b,0x1e88bb98,0xdbab446e,0x1ba92320,0x618b8b16,
  211417. 0x78989865,0xa0eafb3c,0xc08b7e82,0x0c7abcc2,0x20d160bb,0x10f09b6e,
  211418. 0x8e4c63a7,0x5be0afa6 },
  211419. { 0x1bbbf49c,0x82ab6d38,0x8c0703fe,0x3e09ce49,0xe10f4263,0xeca58b5d,
  211420. 0xda5a4532,0xd9cc6581,0xf618f7b7,0x07e18876,0x250f7fe7,0x0419a5e3,
  211421. 0xde6b86be,0xbb1a9e90,0x37359169,0x584a7deb,0x5149db2c,0x38eb3489,
  211422. 0xb0ebabb8,0x14546a33,0xc2f88a92,0x0067f0b0,0x0a2db019,0xbde0dfe7,
  211423. 0xc63e6f3e,0xba51b06c,0xe9206fad,0xa19127b9,0xfe80dc0a,0xe4eb5e87,
  211424. 0xd4de30ae,0x1e6fccf5 } },
  211425. /* 179 */
  211426. { { 0xaa8ac924,0xb57dff66,0xc298b3e8,0x06e9ad31,0x65fb080c,0xd140e329,
  211427. 0x1d95c93f,0x7dab211d,0x8a180caa,0x6d68d842,0xa20ded69,0x1a929408,
  211428. 0x38df461f,0xa8151753,0x60eae932,0xff5604ae,0x7dae4c0b,0x901b9e49,
  211429. 0xde262e89,0x4573a97f,0xf1084983,0xed69d9a4,0x64724f1d,0x8ffa022f,
  211430. 0xea85a15f,0xd5f1c2e4,0x01453794,0x4c626ce9,0xbf0907dd,0x80440cd6,
  211431. 0x5ddaa837,0x4522d461 },
  211432. { 0xebfbe7c5,0x8895f079,0x84ef3446,0x30ea1ded,0xd4a1ab96,0x716a9eb6,
  211433. 0x50a30c68,0x1a4a5d22,0x0043bbaa,0x5a16631c,0x5010e5f5,0xbd107502,
  211434. 0x3d8c0556,0xbffe3e9d,0x07772419,0x31b30b18,0x84b82297,0x90ff7ef0,
  211435. 0xf21a18c3,0x00c37d75,0x565bb8f8,0x18d0a635,0x45e3bceb,0xbac1da2a,
  211436. 0x23f0b08d,0x1c38e90c,0x5fbc5ac5,0xf1ba1aa2,0xdda71fc6,0x09d5256b,
  211437. 0x6d7e40ba,0x346501a9 } },
  211438. /* 180 */
  211439. { { 0xcc2b0f1d,0x86be448c,0xac4c3703,0xe3eb45c9,0x9fc96bbf,0x5387f65d,
  211440. 0x5ae27fda,0xcef3c4e9,0x1bc18089,0xa008f776,0x22ca18a1,0xf374a084,
  211441. 0x53b73371,0xee882842,0x7cc09354,0xcb6fc6d8,0x61496d6b,0x8489ec1b,
  211442. 0x49e325c4,0xa92c29b9,0x7bdec166,0x15c6ca52,0xdcea2813,0x95444eee,
  211443. 0x3a21154f,0x34683eb3,0xd39061cf,0x8fb26f98,0x06c940bb,0xc3b08aa8,
  211444. 0xe554c96d,0x7c1d42cf },
  211445. { 0xdc110aa7,0x766e703f,0xf362e378,0xab7b79d7,0x5aadca3c,0xd259c75d,
  211446. 0x60be3373,0x2a6eca79,0x06c4e8ff,0xf4744a4b,0xf3b705bf,0xb2842cce,
  211447. 0xae304b53,0x1a3af5aa,0x1b2d31b8,0x7bbfa201,0x4bee88d9,0xc4ba6eba,
  211448. 0x565cb839,0x2d3565ce,0xdaf7ece8,0x24808696,0xe6959745,0x2c7ccce7,
  211449. 0xe94f9837,0xefd6eb3c,0x3811a326,0x0a33b4cf,0xfffa93a6,0x14203f43,
  211450. 0x73c31d90,0x031e9828 } },
  211451. /* 181 */
  211452. { { 0x765a17ff,0x4fefecfc,0xd1290a65,0xa09f3888,0x938da038,0xbf265c46,
  211453. 0xa169ad46,0x4bb6145d,0x23a62fe8,0x33cf8214,0xabc860a5,0x562df571,
  211454. 0x815c38c4,0xbf2a90fa,0x17eda875,0x45ba1d6e,0x946fa5e1,0x799d881a,
  211455. 0xb90f5a3b,0x6c1be784,0xb10ff52a,0x0910a37c,0xa4f4fd36,0xc38c1fe4,
  211456. 0x8e2d3ba0,0xc3180fc5,0xb17a6187,0x3e2ff050,0x943a35c2,0x3a00059b,
  211457. 0xa28cc51c,0x494d3645 },
  211458. { 0x4ba021f8,0x398426b6,0x796deb6c,0xd14c9083,0x7e36c762,0x6d2e5395,
  211459. 0x751cf216,0x8f556eca,0x19b24a19,0xdaca1e00,0x4b20c2ae,0x47887da4,
  211460. 0xff41a733,0x93ed4ccd,0x5c7c0cd7,0x8d717c44,0x91bf7009,0xcc48634a,
  211461. 0x3b59bbaf,0xa1f146f9,0xe5624f15,0xdd38bb39,0x303f8443,0x96d41aad,
  211462. 0x4bf104fc,0x6b670f03,0x29706582,0x0503f9ed,0xb34200f5,0x768e1f47,
  211463. 0xbbd4c6f3,0x3cfdcc5e } },
  211464. /* 182 */
  211465. { { 0xb523e13d,0x536c2a86,0x2920d0a0,0x1014a458,0xe7571296,0x3d52b478,
  211466. 0x7eb51bea,0x05746066,0x87b0e919,0x709f7861,0x686888e8,0x028aed88,
  211467. 0xd94afcd4,0x79a809d7,0xe2129af3,0x50c6032f,0x983c4082,0x75e4be72,
  211468. 0x7ab3be8e,0x98331bbb,0xb618c728,0xd31a032c,0x3f59c4a4,0x36dd85a1,
  211469. 0xed4f61e2,0xdbece345,0x1e571715,0xba7aaccd,0x64a1ebd7,0x138c58da,
  211470. 0x3d1aeea1,0x89296d0f },
  211471. { 0xcca82c97,0xb165288f,0x1427e8dc,0x26c6c12d,0x4c3edda9,0x66a94f07,
  211472. 0xeaa01ebe,0x94600e1e,0x30f5e86d,0x14abce7c,0xcb456a31,0x741d7020,
  211473. 0x279f42c2,0xab05aa13,0xd4238468,0x70b60faf,0x318d39e6,0xa18efec1,
  211474. 0x8920b318,0xeb07f1ac,0xd8399e03,0x01e3cba8,0x3c81a301,0x65f8932e,
  211475. 0xccc667d8,0xae8bca7d,0xa268607c,0xcee1ae79,0xcac0a12c,0x3182e64c,
  211476. 0x2b1a4c54,0x9233a2f7 } },
  211477. /* 183 */
  211478. { { 0x0acbee17,0x717e8df6,0x5c24fcdc,0x0f0959c2,0xe54ffcb0,0x46f09887,
  211479. 0xd285116b,0xb993deca,0xbba1fa51,0x0bfaa4f8,0xd0f2183e,0x9c9249ef,
  211480. 0x96847779,0xf93cb358,0x2322d421,0x284bfb7f,0xd42af009,0x40cc709a,
  211481. 0x9bb1d615,0xc69f2274,0x717c3c6a,0x76f50b3a,0xbb9c5eeb,0x8b21e985,
  211482. 0xa4783b5f,0x58fb19ae,0x52e1c3e7,0x04c86b9b,0xf2971ac8,0xaca59092,
  211483. 0x21ed8291,0x2bb26a69 },
  211484. { 0x15f81416,0x98a34435,0xaaff5bb4,0x086e72e7,0x0317261c,0x3d1f64de,
  211485. 0x5c0a1cfe,0x31c0786c,0xb3683401,0x542ea4d8,0x1a39b4cd,0x2f77273a,
  211486. 0xcbef27f1,0x14fe7ee1,0x16bb27dc,0xee7fc09e,0x410e5dc7,0xc0dccc17,
  211487. 0x1943b3dd,0xa3466742,0x3f31c1b7,0x92934b60,0xc22c1070,0x0186ded9,
  211488. 0x799f966b,0xa37ee8ba,0x249b0893,0x0f3bfcb4,0x2e92d4de,0xbae61447,
  211489. 0xe196eb08,0x937cb3f8 } },
  211490. /* 184 */
  211491. { { 0x16fbfdce,0x57c0e77c,0xc98d4cc0,0xea034cc9,0x42572d20,0xe7606d72,
  211492. 0x0019a83c,0x9861b55c,0xf1597162,0x80ba2803,0x05a0fd7b,0x0f4141dd,
  211493. 0x4b0daaa2,0x8865913b,0xaa3848ec,0xe6685746,0x3e0485d2,0x16d15a5a,
  211494. 0x3b6905dd,0x81c0c774,0x818af2ba,0xcec31b7d,0xd2b74b78,0x80d8f194,
  211495. 0x543e2f28,0xca659db2,0x9fb07c1c,0x31b83a7d,0x1f1048c0,0x86537fdc,
  211496. 0x78586a11,0x4d57bb07 },
  211497. { 0x53b396b6,0xbc4b768a,0x93b51dac,0xbc8b24c4,0xa30ae1b3,0x33e511eb,
  211498. 0x945147c5,0x893bbd95,0x179fe3ce,0x6cc86031,0x3f920bd4,0x34b0a167,
  211499. 0x6b256160,0xb32912eb,0x9d168d83,0xbc69a2a4,0xef0dd128,0xb4949e7a,
  211500. 0x872699e1,0x2613419a,0xbf21376b,0x06c58477,0xa4f97147,0xe55b1909,
  211501. 0x7b9b745f,0x63d6eb75,0x08df3c85,0xb5365b29,0x55fcfae3,0x0e257e43,
  211502. 0x979f2aa8,0x1067c118 } },
  211503. /* 185 */
  211504. { { 0x32bf8883,0xc8455084,0x6fd06667,0x4755286a,0x77c2335d,0xd70b0f8f,
  211505. 0x2f4a2c94,0x678e60da,0xd118acf5,0xa468d8ac,0xbf5b90d9,0xce93830b,
  211506. 0xed4e9104,0xea4b1c74,0x27776ea4,0xac67316d,0x361bab12,0xb98ad75c,
  211507. 0x99122451,0xc323d482,0x530a43ae,0x26440220,0x3292d5a5,0x3a44532e,
  211508. 0x5fecf1bc,0xdb48694b,0xc667b8b8,0xe4e0516e,0xa4306ade,0xb3aa595f,
  211509. 0xf34e9725,0x7e4f7091 },
  211510. { 0xb7f70919,0x3f3816e9,0x16b003f5,0x765216ed,0x778c99e5,0x46c6cff4,
  211511. 0x30a51810,0xe6a5abe8,0x45e728db,0xef6f49e6,0xcaccefd6,0x6fdd73ea,
  211512. 0x8c37f3f7,0xec394e6f,0xb6407fc3,0x73320802,0x96625cbd,0x988e8f7a,
  211513. 0x7cabfb00,0x83292363,0x407f359a,0x258ba9df,0xccbfae50,0xff01aee5,
  211514. 0xfe251813,0xfbeaeace,0x83f1cba1,0x9c69f161,0x9eadcdb5,0x512c58ad,
  211515. 0x6ccce8bd,0x2ae49cd4 } },
  211516. /* 186 */
  211517. { { 0xc40849f2,0x1239b0e3,0xa441098c,0x5136a4cd,0xe547f649,0x61535a99,
  211518. 0x7a9bbac6,0x92e4bdc4,0x53547af6,0x195a1646,0x8b47a74a,0x85ecb319,
  211519. 0x9de6a2b2,0x278553fc,0x0e2ba52d,0x471c038a,0x35bcba93,0x12ba1b88,
  211520. 0x6f31eca2,0xd4bf50da,0x802b32c6,0xd146e3f6,0x3c64c8c4,0x0c9c0131,
  211521. 0xeed21297,0xad30f12d,0x9c68530f,0x9b75bffb,0x8918de51,0x23c0ad3e,
  211522. 0xa73771b7,0x180e9d52 },
  211523. { 0x29ab77b0,0xc316542f,0xf7aee628,0xdd411d9c,0x353c2f40,0x044c0685,
  211524. 0x4b0ae4cf,0x638dc7e4,0x95fc266f,0xa0924185,0xfd2feb7d,0x639da671,
  211525. 0x5ea39798,0x56858ed5,0x58f3832a,0x7a694f31,0xd316d831,0xa94233c6,
  211526. 0x30a35a7b,0x2fcacb26,0xf1ff713b,0xfef8f7dd,0x59eee2f3,0x8b9b4525,
  211527. 0x156d064a,0xd1b4f91b,0x2f5cfcfc,0x177866c2,0x3777eb41,0x12bc2566,
  211528. 0xd8ab85b4,0x21ca6f3c } },
  211529. /* 187 */
  211530. { { 0xa3e66635,0x0e162b13,0x2a9f76af,0x1ef20a2b,0x46db3356,0xab473a30,
  211531. 0x7802bb8d,0x0840bd77,0xa699b44c,0x5b6baf5e,0x1b2207f1,0xc6e11900,
  211532. 0x790b0105,0xe5de16a9,0xdb67f004,0x22b12f15,0x8a025d25,0x185fad45,
  211533. 0xdf0a1142,0xbccf6953,0xf45034c0,0x4c42129b,0x1c277bff,0x0f740400,
  211534. 0x280a9e18,0x6e440b4c,0x842aa2b4,0x767de8f5,0x05e8d94f,0x3de20ab8,
  211535. 0x20227635,0x5aff5859 },
  211536. { 0xa8458e40,0x805acd20,0x149732bd,0x5a5557d8,0x5f1ca72d,0xc7074131,
  211537. 0x952b5323,0x7f2e269c,0x6494fadf,0x5c592556,0x1a7d2666,0x153b7acd,
  211538. 0x86fe2865,0xa6df063d,0x57d53b6b,0x1e91db13,0xe93ead01,0x9195bb89,
  211539. 0x2963bfe6,0x3d71e1af,0x88278886,0xfab2b9c2,0x3b859b6f,0x77836692,
  211540. 0xf7029dd1,0x6e695174,0x7b984561,0xc7987876,0x5907d849,0x64fb4f1d,
  211541. 0x88d8a977,0x3eab7e1c } },
  211542. /* 188 */
  211543. { { 0x52e5718b,0xc73a94b6,0xf4cee1e9,0xe3aefa54,0x553eedea,0x654e9e63,
  211544. 0x5f3aca1a,0xf2541e1b,0x0d083316,0xd7129489,0xfb7f950e,0x7965af63,
  211545. 0xc74e3e4a,0xd8fc9e0d,0xeaf79ebc,0xb4ee48d2,0x8b7787e6,0xa458a86a,
  211546. 0xf7cceaf0,0xd8c7621f,0xdf67980d,0x8228eeff,0xf9106727,0x210d4742,
  211547. 0xb07e3629,0x91f63501,0x7971e29d,0x441761c6,0x03a3b8a5,0xc0ccc65f,
  211548. 0x38e09544,0x3491da4f },
  211549. { 0xcb062eae,0x6706d046,0x5d08776d,0xee7db735,0x292315d2,0x80de8052,
  211550. 0xc402bbdb,0x40785662,0x26ed3337,0x5f93525c,0x7d568ed3,0x6cea14d6,
  211551. 0x66888b1e,0x916a1189,0x5dc71675,0x0fbd5205,0xe4575df2,0x833d1077,
  211552. 0xec092335,0x4e93100a,0x6cd85389,0x2f9e1d01,0x43226368,0xeebd3725,
  211553. 0x1ba4cfd7,0x401d172b,0x574c5838,0x377dab9d,0x80d517de,0xaeaa6958,
  211554. 0x6ad15a18,0x0c843dfd } },
  211555. /* 189 */
  211556. { { 0xc9373300,0x455811ff,0x99fdc300,0x1c39332a,0x353cb655,0xe19bb81c,
  211557. 0x96a83d27,0x774b924a,0xb2ee3f1a,0xcbfc8fcb,0x010d56c7,0xaf278ec4,
  211558. 0xe0abaf79,0x6fde682f,0x7339aebf,0x7566d072,0x71205db6,0xbd35ad5d,
  211559. 0x7051c9d0,0xb5bbe694,0xd3a3067c,0x577db480,0x572d7530,0x2c70ff54,
  211560. 0xe06d853d,0xe8615aec,0x05abfb5d,0x71999ccb,0xea0a8ed7,0xeeefc96b,
  211561. 0x35f6df69,0x2dcc469d },
  211562. { 0xc65f0e77,0xcca6cd06,0xbd71b14a,0xddcc7980,0x3c93cc00,0xb6221f8b,
  211563. 0xae8cbf57,0xddfcd5b3,0x76f8e63f,0xbc92973f,0x06e132b7,0xe9848a34,
  211564. 0xd51ec9e2,0x4cc59a03,0x3a33081a,0x9c9d32bb,0x80e8466b,0x00121052,
  211565. 0x1bbe7295,0xc2b0032a,0x24938448,0xdbfc6572,0xb6bba0ff,0xe972a0ce,
  211566. 0xc0a94802,0xf60c0a4f,0x599d8bc7,0xf62c41cc,0x312da0b8,0x820c96ee,
  211567. 0xcdbdf9fc,0x5a1a65db } },
  211568. /* 190 */
  211569. { { 0x42485684,0xbfba691a,0x29c470c9,0x613116b9,0xe62a0519,0xb4b01971,
  211570. 0x5ff499da,0xf3245aa6,0xa5238eff,0xc2ef87f4,0xcc9d5515,0xc16dc6ba,
  211571. 0x2dbdacac,0x5a7f227e,0xa9bbaecb,0x8dedaac4,0x2e7c9885,0xff308a6d,
  211572. 0xe6895593,0x4c6f2fc2,0x177e0611,0x3655f285,0x300b1bee,0xa63e8d06,
  211573. 0x13c17b54,0xbed0ce79,0xc4974262,0xca4abe35,0xbc4e4037,0xf4b44a17,
  211574. 0xefe5fbd9,0x5ae95099 },
  211575. { 0x804f7455,0x122e5ee7,0x22066682,0x341a4997,0x7795e333,0x97d24c31,
  211576. 0xe48efced,0x12f4123c,0x19fbc21c,0xe8738d92,0x0663a3ae,0xbb3bdc61,
  211577. 0x8593a6db,0x3603d8c2,0xe3c1ac75,0x926227f2,0x5eaae519,0xfea92ac0,
  211578. 0xfd6812ac,0x5b596f0b,0xfc2a82dc,0x3ce7e844,0x63522b27,0x3840481a,
  211579. 0x52867895,0x836088b1,0x26588688,0x21ffb7cc,0x2f4a7cac,0x0ca33161,
  211580. 0xa3edd298,0x4110667e } },
  211581. /* 191 */
  211582. { { 0xc2d04b63,0x81830357,0xf4929a18,0x3fc5a34d,0x22d195df,0xc73bf6da,
  211583. 0xcb432473,0x14df2f89,0xe997f138,0x345afe5c,0x8b9604f4,0xd8e3f5f9,
  211584. 0x50c10ae5,0xad7942e9,0xeed25ff3,0xcefd5447,0x0e73c0cc,0xbf68e51e,
  211585. 0xab54fa4c,0x5b1ad591,0x12b61c8c,0x8bbc1105,0xb5abf760,0xbb932913,
  211586. 0x01e79649,0xdb1231be,0x040ccbe7,0xd0a83e91,0x90a96db9,0x3dde426f,
  211587. 0x34df11ea,0x1cceb645 },
  211588. { 0x0c6d0f55,0x2d210c4f,0x9c673c9d,0x6cadf61b,0xa9ce3fbb,0xdd7f9919,
  211589. 0x93b063e4,0x135f494c,0x145a93be,0x580bdb3c,0x0f52ef7c,0x4d872332,
  211590. 0x8814bb6a,0x74d876e8,0xc7a97dee,0x4f6f723a,0x3e3cd833,0x7de2b8f0,
  211591. 0xae720270,0x6162f082,0xddfa486e,0xe88ec2d4,0x8d3a17c6,0xd965c859,
  211592. 0x3980171a,0x62e59e54,0xbbef6b22,0x0ab6285d,0x4d48b203,0x3cf45195,
  211593. 0x4ea25ea3,0x1f175233 } },
  211594. /* 192 */
  211595. { { 0x3467ea91,0x808a765b,0xfd2d9c45,0x3f4632ee,0x9cf2bc6f,0x7b75dc6d,
  211596. 0x359813ae,0xefc8d240,0xe44cbd8d,0x23ecb209,0x21525622,0x59ba10e3,
  211597. 0x3f1ee19a,0xfa14d934,0xfb0c48f7,0xdf97c21b,0xea30d437,0xc4e62890,
  211598. 0x651475c2,0xb286e2a4,0x126672a5,0x291f01e4,0x31aab3b8,0x9c6fda5c,
  211599. 0xe17d22ec,0xb7277a5a,0x914f0bad,0xbd88ed83,0x6a2392e1,0xd0b05d1b,
  211600. 0x65893c2b,0x4cb8af90 },
  211601. { 0xbb4b1953,0xa2b02057,0xf597f6ee,0x4ce08b44,0x5e6412c8,0x854f5d9b,
  211602. 0xb3cd4919,0x1913262d,0x6e42bb5d,0x902762e4,0xd78e7f60,0x8355c8e6,
  211603. 0x38b6c16c,0x8efaa824,0xe550f618,0xd0173790,0xe57d778e,0x118af462,
  211604. 0x715b4714,0xa16ad5e8,0x41dea4f9,0x900596c3,0x280ca610,0x2a957c32,
  211605. 0x374c65a1,0x2faee800,0x50080414,0xdb105127,0xff080fa1,0x8c1db931,
  211606. 0xd79878fc,0x486a5c25 } },
  211607. /* 193 */
  211608. { { 0x941b4f36,0x0521e213,0xf803b4f9,0xbaacfb14,0x52a54ba8,0xfdf1e22e,
  211609. 0x8fe4796c,0xacfabbba,0x58dbacb6,0xae0788db,0xc19dfa51,0xdf98d736,
  211610. 0x35a716ee,0x155c286a,0x9c86461b,0xbe7d4676,0x63a64a5e,0x50b6380f,
  211611. 0x9f609262,0x14b41914,0xa2dfc5b3,0x0919a7d0,0xcef466ac,0xc454da55,
  211612. 0x6986aaec,0x93fa4a24,0x71a49ced,0x5090b171,0xc1fa75ad,0x602f1d6c,
  211613. 0x78e4c054,0x5d269f89 },
  211614. { 0x14920419,0x3a74030c,0x90968739,0x0845d868,0xeeb70fa6,0x81b994c4,
  211615. 0xd9fc5bcb,0xabcaa06d,0xf58f8f2d,0x06539427,0xb1dc52aa,0x35c85f67,
  211616. 0x2c911baa,0x5a7d8d72,0xaec2d834,0x4041005c,0x7a8e5347,0xb5868a44,
  211617. 0x8de512c3,0x04ee180b,0x211168eb,0x4daa66e5,0x2317cd8a,0xc0bd5dab,
  211618. 0x61164df6,0xa1d4185d,0x1dbad7c9,0xacedca26,0x09b02683,0x0fe4b5ac,
  211619. 0x26d9550f,0x8ac9995a } },
  211620. /* 194 */
  211621. { { 0x2640a39d,0xb2c8dc9b,0xede0c9f9,0x21ff0b38,0xa1ecba0a,0x74f469bd,
  211622. 0x080d0417,0x8a902ccd,0xf4994604,0xe956fa32,0x9776ab15,0x348f85cf,
  211623. 0x0066f492,0xc21fc6ee,0xfeeef367,0x35b1ebfe,0x4613e5ed,0x7804581c,
  211624. 0xea6ba071,0xcbdfe8e6,0x950d73ed,0xddfcaa32,0x1da48889,0xc9747936,
  211625. 0xdbaffbd1,0xce867c8c,0x1cbaeae7,0xd267431f,0x897912c8,0x68255045,
  211626. 0xd7ea1e4d,0x0c7c1ddc },
  211627. { 0x1ce963a7,0x53aa30cc,0xc4c5fade,0x7352f64c,0x2828afbf,0x2b9aa2f8,
  211628. 0xca212107,0x64273c56,0x85a576dc,0xaadd7654,0x90b5c77c,0x6196ac3e,
  211629. 0xd1aaf39b,0x20d43e9f,0xcd05cbc4,0xfc392062,0x4c0ff2fd,0x14163872,
  211630. 0x2ae821e6,0xcf32b8d8,0x3fa7a3f0,0x5f58f943,0xf644ca92,0xaebf1d2d,
  211631. 0x1918a75f,0x0c061563,0x6b876118,0x7989b5ed,0xad412441,0xbf342445,
  211632. 0x1df633ab,0x24ffc9ae } },
  211633. /* 195 */
  211634. { { 0x93c7cb2b,0x89fcdc05,0x590053fb,0xc1243b95,0x6182343c,0x601debcf,
  211635. 0x66c18a63,0x364546ef,0xec913287,0xa5290701,0xf9788c31,0xc35b8026,
  211636. 0x92d1f7d7,0x852b862a,0x0aa79728,0x1809cb05,0xa3cb2005,0x897d467c,
  211637. 0x9ef5b946,0xf20c77c0,0xf2241984,0xc3372c42,0xf35bb206,0xda053e0d,
  211638. 0xa9c140b5,0xbc26c6d0,0xcb56fb33,0x61cfcc0c,0x299b3968,0x1c3cf9ef,
  211639. 0x40621ba4,0x89e4d3d1 },
  211640. { 0xa45a9be3,0xd35e80e7,0x07356fbd,0xc4daa578,0xb967bc2f,0x0186d62e,
  211641. 0x47cd16e3,0xa702679e,0x5f30ce9b,0xca2f1c02,0x1f864f50,0xf1205b46,
  211642. 0x85061d66,0x7fd6d797,0x8a08809e,0x47edc4f6,0x9a4d3ae2,0x5dac0449,
  211643. 0x6d1f9da8,0xf844664a,0xd7a83a71,0x9f30ce84,0xeaac33f1,0xe9382bac,
  211644. 0x948622ab,0x1f033831,0xf7681eb2,0xb037a4ba,0x99a1b5c7,0xd156a908,
  211645. 0xe6f1d0fb,0x675d3e6f } },
  211646. /* 196 */
  211647. { { 0x707193e5,0xd9767ffd,0x810358e5,0xe478aa91,0x328d8ef7,0x5634f9ff,
  211648. 0x6dbbd9a7,0x913a0ee8,0x7e215686,0x379b2968,0x89d9da38,0x903f410a,
  211649. 0x1b1334d2,0xd9f8d7b9,0xbd82efb5,0x9fe74229,0x3803c778,0xdb568b62,
  211650. 0xd3d25344,0x93e9a350,0x724497e8,0x559c35b0,0xa169e23b,0xc472d436,
  211651. 0xcc5b4c69,0x09864632,0x83c7f531,0x9f6d759d,0x1e497888,0xa91cf1db,
  211652. 0x60af1a4b,0x5f7f92fe },
  211653. { 0x0545167e,0xf18a1cc6,0xaffa88e0,0x55ee2e02,0x432a7bcf,0x24cdff51,
  211654. 0xa7510866,0x7382da42,0x40511af7,0xe894c11f,0x2aaf1423,0xaa4e4e31,
  211655. 0xf63dd2ae,0x8c3d36f0,0xd7660635,0xfc5c9550,0x37ea7eab,0x01253731,
  211656. 0x39b950f6,0x2a5cd598,0x40e63442,0x95a0f601,0xf2ac7045,0x905e238e,
  211657. 0x446b0f73,0x44bacc0e,0xc448578a,0x4cd4206e,0xa5bd7803,0x367b1aaa,
  211658. 0x0a2b458d,0x25beced9 } },
  211659. /* 197 */
  211660. { { 0x0c33a8fb,0x079a7382,0x0f25dc1d,0xcfbf6cd1,0xc6d482b6,0x4ffc73f8,
  211661. 0x07bf844a,0x3e51f18c,0x599162f0,0xa7651236,0x14013811,0xac59a74e,
  211662. 0xe55018a0,0x957a6865,0xe3ca09b1,0xe1ec51bd,0xa960253f,0xbc0c7eb3,
  211663. 0x7de03f84,0xe83bfd14,0x52fbdb09,0xc0540ed1,0xcea15ec1,0x6ba52edd,
  211664. 0x4b261307,0xf3d30ed5,0xe8397206,0x9bd7bae8,0x096373aa,0xf20d8692,
  211665. 0xc3b0bf63,0x0a616a4b },
  211666. { 0x6e1339c9,0x2075f3ed,0xbf8b00a6,0x7afaa072,0xbccd9b47,0xdfafec82,
  211667. 0x00ca54c7,0x4713158f,0x38bc31ae,0x449102f1,0x310dfc8a,0xaf98f158,
  211668. 0x59e954d4,0xc9ef2075,0xc527a0c4,0xe8021af9,0x7a192023,0x6e801277,
  211669. 0x7fb02377,0x635f538c,0xe8c9e951,0x5df1974f,0x15cc9097,0x0287faed,
  211670. 0xf7a5115c,0xfa0728f0,0x0fac623d,0x90dbfbe6,0x0311ba09,0xa8d40fd4,
  211671. 0x07c6464c,0x876d154e } },
  211672. /* 198 */
  211673. { { 0xc2d3ea8a,0xd3a4d6d2,0xa842600e,0x36be681b,0xe4070672,0xc53f100d,
  211674. 0x6a7d7a7b,0xe3e5b6fe,0x5d5e1a83,0x6e6994f9,0x76097c2a,0x07cacd22,
  211675. 0xa6791011,0x12d98dba,0x102e0e24,0xddfc4461,0xd493272a,0x4815dbc2,
  211676. 0xa9436696,0x7e38e64b,0x32b2bf90,0x4960eb1a,0xd928e28b,0xda457525,
  211677. 0x2a077c9e,0x72f75b39,0x7fd61d00,0x27760cbb,0x0f4b1456,0xaf235d1b,
  211678. 0xe76d1700,0x3040c23b },
  211679. { 0x4efa9a70,0xb10dc55b,0x53e86610,0xd4de414f,0x09f8a27f,0x3d95c113,
  211680. 0x06661d3c,0x505109a5,0x60eb513e,0xcaa2994a,0x1e7d338b,0x3ee41537,
  211681. 0x4651e71f,0x4fd145fc,0xcbc313b4,0x51bbf838,0x1eb92150,0xb039e078,
  211682. 0x14bf5ac7,0xe8696b44,0x8be0d48c,0x2d667188,0xdd8f2b6f,0xbe93b2f5,
  211683. 0xeb8a7f8a,0xc1dfd1e7,0x90f751c5,0x862b3dd9,0xa32a74be,0x1eb1ad58,
  211684. 0x1ebbc9a2,0x5486d79a } },
  211685. /* 199 */
  211686. { { 0xa1359e13,0xcb2e34ff,0x28196051,0x202d8dbf,0x23564b5e,0xe95e023d,
  211687. 0x42f6ac12,0xfb1340b6,0xb653725d,0x543ba852,0x8d2466ad,0x81aedcd6,
  211688. 0x547c728b,0xbf780224,0x9569fb65,0x559f8a11,0xdfb22ec9,0x505b7a62,
  211689. 0x9eed5e52,0x07107540,0x299f6f11,0x9c899288,0x3db6f8c7,0xa7d69261,
  211690. 0xb3ca79a9,0x30eb7fb3,0xfb2160b0,0xcab99bb8,0xd28b409a,0xd2012568,
  211691. 0x5ac45f8b,0x380f1b0f },
  211692. { 0xe6a0068f,0xc0b99e6b,0xc8a73753,0x4b67cf2a,0xb2faeb7c,0xa6c9a548,
  211693. 0x340260c3,0x7f417f99,0xcc0f739e,0x8ee56855,0x780949da,0xf08b510f,
  211694. 0x8d5c6eff,0xb1770fc2,0xfd96a7bb,0xb4f5abee,0xf2665a2a,0xa07b1136,
  211695. 0xb601dcf9,0x2fb380a4,0x162becc6,0xcc803614,0xee6b83b3,0x3498fb96,
  211696. 0xa8c17eeb,0xea9b0fd6,0xa177efc2,0x5834b5ba,0x5b110b3e,0x929044f5,
  211697. 0xebd7285e,0x4abedded } },
  211698. /* 200 */
  211699. { { 0x700ef376,0x3355e1b9,0x66cdabff,0xd56e5d9a,0x47e87646,0xb3dc2575,
  211700. 0x00f79369,0x28f44b8a,0xa0c52e29,0x08c32b1e,0x3729b392,0x5a78de12,
  211701. 0xb26d239d,0x4184519a,0xe0ce4a6b,0x23f6b4b7,0xacb2a9f9,0x235f6f8a,
  211702. 0xe2064a59,0xbb8bc454,0x1bf3062e,0x37efd034,0x94dff6f9,0x6bac683b,
  211703. 0x8aa7fa06,0xc3364b1e,0xce0b3745,0x0616772a,0xd1e3fb0f,0x46f08d08,
  211704. 0x18e132d3,0x6a20abb3 },
  211705. { 0x6a85cbc7,0xea831016,0x934f9aa7,0xd0990946,0xe778f1b3,0xc2211088,
  211706. 0x2247b799,0x7ea4ff8f,0x454484ce,0xb3171d71,0x4f98c364,0x29403949,
  211707. 0x97df1458,0x5da911f3,0x09439116,0xa6b58093,0x174238bc,0x75f9509a,
  211708. 0x8209758d,0xfeb51821,0xa47925d0,0xae0c6021,0xaf8a315e,0x0e946694,
  211709. 0x6bad04b7,0xae7af8a3,0xf072447d,0x44c15e7f,0xa5456ffe,0x5184668a,
  211710. 0xbf36b977,0x45e353a7 } },
  211711. /* 201 */
  211712. { { 0x93092f71,0x76056764,0xf5b92d71,0xeb66b6c2,0xe2c8b6c5,0x9db3149b,
  211713. 0x20c0363e,0xf62f583a,0x03cd7097,0x688acd33,0xebb916ac,0x85d0c0f8,
  211714. 0x84c19b0e,0x1bf7462c,0x7c4a6ad1,0xc76ed5f9,0xd119f369,0xec8b88ba,
  211715. 0xebe50b83,0x59b8371b,0x866706a6,0x0cc69508,0xf8373d2c,0x531c75a3,
  211716. 0x2a5a02fb,0x4e1cd3a3,0xda39a1d0,0xe8274778,0x75da333e,0xedfc5bbb,
  211717. 0xca79bd36,0x15941f24 },
  211718. { 0xa77dd512,0x42e8c0f8,0x1dc365f6,0xa91b59a7,0x08753862,0xe80d14cd,
  211719. 0xd272faca,0x1624230d,0x4027cb5a,0xeea3ec16,0xc1ef9f03,0xc1700b59,
  211720. 0x0da3148d,0xd411c127,0xc4181af1,0x801ee448,0x9e3a900b,0xedf28559,
  211721. 0x0d09affd,0x5d67b0bd,0x8b370024,0xd839df96,0xe6f836b8,0x3b6307e0,
  211722. 0xbd3201c9,0x5382e588,0x7a1d02bb,0x636d8a6b,0x968641e9,0x70b7db76,
  211723. 0x118fad03,0x6d17c34a } },
  211724. /* 202 */
  211725. { { 0xc181c99b,0xcf608841,0xc87bdcaf,0xb65dc901,0x3720dabe,0xb460b447,
  211726. 0x5377515b,0x4c79c396,0x0a96c277,0xd447f22e,0x2ac0f440,0x0d952130,
  211727. 0xc90583ad,0x8330b26b,0x928904a0,0xe25e977a,0x85c50b18,0x1deaffd9,
  211728. 0xa5ad5f6a,0xcf4dbcb7,0xc8a37ed5,0xcbcd0019,0x1e9850b6,0x7846dd90,
  211729. 0xb0b8e605,0x1ac8194a,0x34132f90,0xb9728571,0xf56ee28b,0x4ce9f149,
  211730. 0x3e9e1d4e,0x1ab9b5a4 },
  211731. { 0x314fa7a3,0x206dab92,0x478ff963,0xcc4af0f0,0x904d9fdb,0x4cce1713,
  211732. 0x12c045fe,0xac20a2eb,0xfd8f6d7d,0x44fc5478,0xca7b6ffa,0x886e72c5,
  211733. 0x6fd6f758,0x7fa4529b,0x92a820d5,0x4df1d1b1,0x2789f149,0x3d812f9f,
  211734. 0xaabb53d2,0x9842f083,0x2a03ab32,0x2648539b,0xb1512502,0x631ce090,
  211735. 0x731f6bd5,0xe1294d15,0x9436e634,0xb229361d,0x3ca966af,0x8c4281c4,
  211736. 0xc21ab3ed,0x24b34956 } },
  211737. /* 203 */
  211738. { { 0x659824e2,0x49bdcb86,0x4e13e74c,0x6dc4ce48,0x6bbe1eea,0xa4c01a26,
  211739. 0x1e3ec457,0x47b2b8e7,0x2f5a8e4b,0x7e8b15e0,0xe333530d,0xe81eb6e6,
  211740. 0x17a45202,0xacba369e,0xd70e4c9f,0x81241431,0x3e12beb8,0xc190af4b,
  211741. 0x11f486fd,0x53270523,0x29fb2bce,0x9f6c41e1,0xb70f6c08,0xbe6287eb,
  211742. 0x3feb4477,0x1479850a,0x9bcf18bb,0xfcfdfb11,0xda80d040,0x925c292f,
  211743. 0x7e3c5bf9,0x212d65e5 },
  211744. { 0xca15cf08,0x23adb386,0x81e172eb,0x4dfa4ac4,0x4d42d0c0,0x9d1dbf93,
  211745. 0x74404dc7,0xd9cf6073,0xe932bfcd,0x60508441,0x1c682a98,0x9ae910ca,
  211746. 0x41ac1cc0,0x9528fc18,0xdbbed630,0xe6a120ae,0x30ccf250,0x94e0e1ec,
  211747. 0xe58bbf2f,0xfe84ba54,0x9faa4415,0xc66d0b4f,0xecee7ce5,0x0c58f1e7,
  211748. 0x6fa6873a,0x7a1d43eb,0x399f1348,0x96c6c5a0,0xe6727ab7,0xe6ef9aaa,
  211749. 0x9a5c2447,0x66afa554 } },
  211750. /* 204 */
  211751. { { 0xc980e91d,0xda5aaba8,0x6ac98efa,0xa93cf509,0x8da32662,0xb0990e0a,
  211752. 0x0081453e,0x01d21530,0x3d71de84,0x2bb0d33e,0x3e19a012,0x465f6d80,
  211753. 0x78a838e7,0x5902ff4c,0x1931348c,0x74e2afb7,0x9cfb057b,0xa4932757,
  211754. 0x3ad03f8f,0x761ea642,0x58ffa40a,0xb7d4c245,0x77a87e30,0xb5e9c0d9,
  211755. 0xc9c84d26,0xd1c5edba,0x3d1963a0,0xeca8839a,0xebf6bf0d,0xbc6f2f35,
  211756. 0x0d58abdf,0x01ef0631 },
  211757. { 0x3ecdcbb0,0x2bf90316,0x27c1c955,0x19e2d728,0x9575c930,0x9e527030,
  211758. 0x96983930,0x0dc1c5a9,0x7cd082df,0xef9f80ff,0xdf97e051,0xcd915075,
  211759. 0x9cc61b55,0xf286fffe,0x80f24cc4,0x352db38f,0x36523ae3,0xed9b99ec,
  211760. 0x10b104a9,0x109a8ca8,0x305203ad,0xc2700fe7,0x769400f5,0x2a2ee24e,
  211761. 0xee0c452c,0xd595d399,0xf7f02a41,0x0ab75d6a,0x0db730b7,0x34108099,
  211762. 0x5e8d1202,0x0e4f5ffd } },
  211763. /* 205 */
  211764. { { 0x0ff14c38,0xbd1c6444,0xaece11f2,0x9a5b59fa,0x22af6330,0xaa4605a7,
  211765. 0x82af24ee,0xddc9f65a,0xeb9a1159,0xf4ee4bfe,0x74e84eaf,0x2463d076,
  211766. 0x0e0baace,0x88cbe1e0,0xd5fabdcb,0x7ca568ea,0xc57eb99d,0xbd80d524,
  211767. 0xe9be9873,0x9c46572c,0x7300b85e,0x918a1dcd,0x40f54176,0x49221312,
  211768. 0xb5b14236,0xf7e324ff,0x2434f16a,0x40dda501,0xa133d97c,0x08833421,
  211769. 0x0876f020,0x33d41161 },
  211770. { 0x9878e5ec,0x7531a36b,0x46918232,0x5de3e321,0xd0a30464,0xd15f9a33,
  211771. 0xaa173659,0x734c1b87,0xf925d4fe,0xac2094a2,0xc262b0f4,0x43c965a1,
  211772. 0x447d5cbc,0x759c903e,0x05239300,0x92af215e,0x1f593f34,0xfffb6d5f,
  211773. 0xc3cddb5f,0x65943b4b,0xbfdd5408,0x9d03a29c,0x198d76c0,0x8f7cda6b,
  211774. 0xc0f27b59,0xc0790a22,0x8cb58ccf,0xba557a84,0x76c54fdc,0x5922052d,
  211775. 0x47b6b466,0x2d3de7aa } },
  211776. /* 206 */
  211777. { { 0x65add3b7,0xaade7462,0xabf24c2a,0xe5888f35,0xe1a57d93,0xd41549ca,
  211778. 0x2c76f7bf,0x0e22e18e,0xbe3202b3,0x67f288ea,0x1d1d0f0a,0xb79a66ba,
  211779. 0x2881ad18,0x0e0ab749,0xc7adb0e9,0x7d424086,0x2842132f,0x870c32c5,
  211780. 0x58f9a09e,0x858477f1,0xec025589,0x422a9372,0xa5098777,0xbe428c5c,
  211781. 0x57660058,0x45b79564,0x957f37cf,0x6c7fc631,0xd6316289,0x8b7023dd,
  211782. 0x5b1c12a6,0x47003bb6 },
  211783. { 0xc91c1c96,0xd99401c1,0x27a12970,0xaa5dcdf9,0xc3c29107,0x3ab92e17,
  211784. 0xa3fe4710,0x26fce8f7,0x4ee998ee,0xb0d09d5e,0x8e3a41f8,0xafa62204,
  211785. 0xa26ca506,0xb1c012a5,0x99b57252,0x2c6f734c,0x512f7fe1,0x1093d79f,
  211786. 0xacee19a6,0x2f30906e,0x056d1ea6,0x6bff8381,0xeff35f21,0x61c75856,
  211787. 0xc1ad2224,0x6e07e978,0x6b20fde8,0x2cca6ca1,0x633fe81b,0xab4d6d2d,
  211788. 0xb06a2ce6,0x73dff504 } },
  211789. /* 207 */
  211790. { { 0xd8e20fb8,0x8b615805,0x82b533f0,0x7c6873e4,0x56a854ca,0x5205f001,
  211791. 0xcb369211,0x87fec6ac,0xc7f092b7,0x1fa3c0ec,0xe845fe4c,0x5b36647e,
  211792. 0xf8b1f112,0xd4781e85,0x8b0f1a6f,0xc6526839,0xdcb8eb92,0xceeb8c6c,
  211793. 0x8e5f6d52,0x133f0ead,0xc8d934dc,0x31883e23,0x428ac45a,0x214ed5bd,
  211794. 0xdbbfca85,0xf77ca492,0x07e5ae13,0xdf4113fe,0x72ab05fb,0x63e4a0d2,
  211795. 0x7148f535,0x7544d0b7 },
  211796. { 0x80797ace,0x4fe8d134,0xaf86d97e,0x216d6aa0,0xef5a68fc,0xdbf0a688,
  211797. 0x9f9b2684,0x18b26f45,0x8999d2fc,0x52fefcfa,0x62423955,0xd5af8d82,
  211798. 0xf63a3780,0x8f123469,0xdcd4feaf,0x2933454f,0xa73b5d09,0xba8018b7,
  211799. 0xe5552c18,0x9af1f276,0xff26bb1c,0xc5d4773d,0x06dd4f44,0x9ef49410,
  211800. 0x5f39ba49,0xad8f12f9,0xf66ca4f2,0x5767f6dc,0x7922f59a,0xba8773f1,
  211801. 0xc1e42d49,0x220081ea } },
  211802. /* 208 */
  211803. { { 0xba37a0ba,0x3043d573,0xdd176df6,0x05a431bc,0xc42070f7,0x03322cfc,
  211804. 0x67c2d109,0x5cabd30e,0xcbf8bcfa,0x362c95de,0x7787b10b,0xd767d277,
  211805. 0x6ec05e64,0x612c915e,0xce69c30e,0x9e669631,0x682e2635,0x27c9dd8f,
  211806. 0x95ffcc38,0x79021f12,0x8a2adca2,0x06a8ee79,0x4b5d500a,0x8e00e784,
  211807. 0x8d80d6c5,0x87746fc7,0x915f10cc,0x246053be,0x219f6fd8,0x844e328b,
  211808. 0x11bd3733,0x620541ac },
  211809. { 0x509e5a29,0x0f7fd382,0xb432531e,0x8748d7d0,0xcd3883b9,0x8f749354,
  211810. 0x8bfbb17a,0xc6b8ac74,0x05f2d2c5,0xa4616a66,0x1bcb1b83,0xb3d96625,
  211811. 0x2fee265a,0xcf753104,0xdb225058,0xc70d73fb,0xf0c2d556,0x1211d434,
  211812. 0x54b259b3,0x862061d8,0xc42b3f7d,0xffe4606d,0xe86a4949,0x4c5c8585,
  211813. 0x160eedac,0x04ddcc8b,0x568e2420,0x1804ce67,0x42141656,0x91f3855a,
  211814. 0xf932be97,0x7f378198 } },
  211815. /* 209 */
  211816. { { 0xdfa6639a,0x9a374bda,0x02ab7391,0x0cbd48d4,0x47031e2d,0x5c5ef236,
  211817. 0xd0599d1f,0xb49ee2bc,0xe0d38443,0xd285eb60,0x269392e8,0xdbbea92f,
  211818. 0xb8bc538f,0x91455fbf,0xe469b768,0xae259ff1,0x41de5682,0xc1cecb1f,
  211819. 0x9952d1ae,0xc876f071,0xe7bf7446,0x1ce25181,0x282ad2f1,0xcb93ad86,
  211820. 0x6ba4ef67,0x8fa3cd31,0xe507aa3e,0xfce68a04,0xa61bb608,0xced74170,
  211821. 0xf6ac10d0,0x6de716b3 },
  211822. { 0x172d6dc5,0xd4e58d04,0x6397c65c,0xbed2cde6,0x0c9eb4e8,0x7ae77e18,
  211823. 0x75fa2edb,0x56275468,0xa91e6738,0x4b30324e,0x235c8b2e,0x6023a856,
  211824. 0xa8f92887,0x9df6d6c2,0xf6f5e8b5,0xec2c185f,0x3ad5748a,0x7892e12b,
  211825. 0xd54aefbc,0x7aebb4f2,0xee868821,0x14915448,0xb1d9bd5b,0xa26c5f71,
  211826. 0x2ff00df7,0xe5ccd166,0xb95b1dee,0xebc99f17,0x3fe1f774,0x90983616,
  211827. 0xbb3d25b0,0x51f90830 } },
  211828. /* 210 */
  211829. { { 0xf2922461,0x49376fa1,0x1650d0d1,0xdbb1b1c3,0x0dd8608d,0x92b91c33,
  211830. 0x36b89906,0x3e612c4b,0xdf560052,0xe1977b0b,0x636a2545,0xf8afff70,
  211831. 0x11723d8e,0xcda7d278,0x81bde7ba,0x0b0bc4bb,0xed2a578e,0x3cb080b2,
  211832. 0x171b2e02,0x5bda0d0d,0x941bb9ae,0xf6df38cf,0xc14a65c5,0x85dd81db,
  211833. 0xc19dd98e,0x7f98c82d,0x52206f93,0xc613747f,0x5f5bbe78,0x9e13a2c2,
  211834. 0x0aa34be7,0x5eed218e },
  211835. { 0x01d4dc0b,0xe1565754,0xf566bb07,0xa1ae5f27,0xb82225d5,0xe985ebeb,
  211836. 0x1189ec6b,0x5f3ad21c,0xecce4d9d,0x17da518c,0xd6b65b59,0xc84a2d3e,
  211837. 0x8ffa771c,0x7f988175,0x2ac69a7a,0x50d6ae12,0xc6e6846d,0xcb7f30b1,
  211838. 0x5bd0bb13,0x8c023a60,0xd73f2407,0x9a10fecd,0xe5f0a996,0x8c5158cc,
  211839. 0xbd8f5806,0xd26bf615,0x915a46e1,0xaf32ea87,0x0287d308,0xeaf74e81,
  211840. 0xa6264254,0x8c14ba06 } },
  211841. /* 211 */
  211842. { { 0xb17ee201,0x0c877895,0x88e57a77,0xc05aa471,0x97822456,0x19c3e763,
  211843. 0xc9c3ba1d,0x0be6f8c0,0xb4389ebe,0xfe85f4ff,0x0ce7fbb6,0x538bccce,
  211844. 0x65266c64,0x876eab2a,0xcf9a3842,0x5c9ac690,0xccc8f981,0x9f5cf3b1,
  211845. 0x9cf687de,0xfa17be6a,0x83835c15,0xfcfc10fc,0x150ef2eb,0x086b0fdb,
  211846. 0x884a52e6,0x9f97ecd9,0xb0cd1eb8,0x416e6fa2,0x3ecc03ba,0xe2bd1599,
  211847. 0xeabb165e,0x645c0a5d },
  211848. { 0x50aa7e31,0xd94c4205,0x2f851da5,0xaec8df0c,0x3c726e6a,0x99646909,
  211849. 0x2619bf9a,0x72dbdc36,0xe253fbd5,0x1b4260e0,0x8c709e06,0x97c259fb,
  211850. 0xcddaec5b,0xfabf7cbb,0xe4b703e9,0xb4d5e8b1,0x0734efdd,0x1b06e56e,
  211851. 0x1f55f8a5,0x02d4a4f9,0x3f565c8d,0x7f8608ba,0x816d1d94,0x822f47d2,
  211852. 0x5ce7b136,0x0cc36156,0x31d04242,0xe46ee5ef,0x683567f6,0xb2a65f70,
  211853. 0xd2fa6c91,0x27e9ff40 } },
  211854. /* 212 */
  211855. { { 0xd7e952e7,0x75251893,0xc735bf18,0x15b30583,0x96fe0491,0x732b5992,
  211856. 0x806d2fca,0x27451858,0x1b885ed9,0x71ab76a0,0x6d9f55ec,0xbdce9d97,
  211857. 0x48f2ba9c,0x3da60b20,0x592b132b,0x6977c086,0x099051d7,0xb6dca9cb,
  211858. 0xd188ae25,0xd9c2ab23,0xe20aaf3d,0x9f469f3f,0x5aad74d0,0xdbd1f7cf,
  211859. 0x22a9eb3b,0x3d5efe5c,0x137010c4,0x8c5edfa2,0x57870260,0xada2217b,
  211860. 0x3dac9776,0x4feee567 },
  211861. { 0xb5d3d780,0x30e18d52,0x07166744,0x4dadb5d3,0x5a742156,0x320d386e,
  211862. 0x8d6bbb86,0x5d8c290e,0x2d263dd1,0x981a4323,0x98984636,0x33d0e7ca,
  211863. 0xa519acb1,0x5138784d,0xdddc81ff,0x832e3fab,0x3199a43a,0xfc278594,
  211864. 0x32743163,0x5b4cabcf,0x74f94fa7,0x9fa010bd,0x5694a627,0xc28a743d,
  211865. 0xcb657a24,0xc1d2a888,0xe86a25ea,0x7eef2503,0x04c561ff,0xed11a5d3,
  211866. 0x9c9ede0e,0x4fe818e7 } },
  211867. /* 213 */
  211868. { { 0x7fc1c7ff,0x00252c9d,0x9fa89ad1,0xa9bd419d,0x4064e9cc,0xc93a124a,
  211869. 0x43942ecc,0x384cbcb8,0x8749695b,0x004c21fd,0x421165bf,0x69c81d9f,
  211870. 0xdde01102,0xe2325628,0x5a9b004d,0xec937457,0xf6dcfc21,0xfb3346bf,
  211871. 0x4d372c7d,0xac4da64b,0xf20494e2,0xcecb7ad3,0xe867c150,0x562c41b5,
  211872. 0xc2b723d8,0x299395ce,0x7ee53231,0xc91adfc5,0xf10b6597,0xe06f1161,
  211873. 0xb74d3ffc,0x81915529 },
  211874. { 0x6ed9d4ee,0x8ec12431,0x689aff01,0x3dffa154,0x2a89a3f4,0x4aba349f,
  211875. 0xd467efb2,0x2db1e8e2,0x039102e2,0x18dea354,0xe52f082b,0x422ab853,
  211876. 0xed36dd47,0x7130a2c1,0x0295d1ee,0xca60e86d,0x7c7f5ad3,0xe6ac6808,
  211877. 0xde864658,0x0f83cecf,0x461d1265,0x72e66c21,0xbd385099,0xfeef4150,
  211878. 0xa6632289,0x0f183f3a,0x792dc795,0x275454be,0x11367702,0x2744c11b,
  211879. 0xe8ea6ef3,0x7d06bcc7 } },
  211880. /* 214 */
  211881. { { 0x7090212f,0x89285942,0x5521e844,0x691b7d4c,0xbe2dbb92,0x4c038422,
  211882. 0xbd81f880,0x317721ed,0xac89bc36,0xc136cbee,0x7b8f004d,0x4f71b60b,
  211883. 0x4e218ab8,0x269132d0,0xe6cc814d,0xb0e2496e,0x75fadc15,0x0b2ce317,
  211884. 0x66d223c5,0x82e3c084,0x4c612f8b,0x9721caa6,0xa4b65355,0x59a751eb,
  211885. 0xc7d3d9d1,0x3433aad5,0xe80d4246,0x1e61b9d2,0xfc673caa,0x149f655f,
  211886. 0xd0f9cb92,0x48b52b99 },
  211887. { 0xefdc05be,0xa3915399,0x13e095e9,0xde70db18,0xcddb3fda,0x447862e9,
  211888. 0x1a009451,0xa2b03162,0x23920ea3,0x4b27980c,0xa23b8feb,0xac5394f1,
  211889. 0x3e5616d4,0x163f7256,0xb714219a,0xaa0ff93f,0x93d62474,0xd26f96d2,
  211890. 0x7dcfe276,0xdd212ea8,0x47038d15,0xab27bf2f,0xf418168e,0xe58c8325,
  211891. 0xb32a989a,0xe3704222,0xbfc9f13b,0xa3694390,0x0d0684ad,0xf16e2606,
  211892. 0x9d8c76ec,0x17c0de87 } },
  211893. /* 215 */
  211894. { { 0xdcc01958,0xbca5f453,0x1ce88393,0x7d945954,0x561f5b6d,0x5e6350a1,
  211895. 0x7e2d36bc,0x291c3c86,0xa5ac3a6c,0xf6c7ed84,0xd98006cd,0x7913c40b,
  211896. 0x5671ec3b,0xf78bb087,0xb43e89a9,0x1c928f6e,0xae1ea1ed,0xfdf28df3,
  211897. 0xb924b2b5,0x62bba5b1,0x1a116e05,0x491d2705,0x167ed3e3,0x08ec02b7,
  211898. 0x5bc0b046,0xe291cf7b,0x8c5d7f59,0x30e50169,0xf5c799b7,0x0c7c350d,
  211899. 0x0ac6e1d7,0x6862b9e2 },
  211900. { 0x9ffa1f64,0x56c6f4e7,0xa1e24349,0xfed6a91a,0xcdb75232,0xe9a0ee0c,
  211901. 0x0322d607,0xbfc90b37,0x462fef87,0x29480ad2,0xc2bfcf34,0xfc214969,
  211902. 0xa539e38f,0x6e5211e0,0x12a5149c,0x2a59ec26,0xd706b532,0x195fe212,
  211903. 0xe99c8429,0xf77fb108,0x5dc80482,0x74ceaea3,0xbd92d298,0xa5a6030b,
  211904. 0xaaea15ee,0xad42dca5,0x4987109c,0xd6ac3bc7,0x290af649,0xc64e1c40,
  211905. 0x51f8de6c,0x5093fa2d } },
  211906. /* 216 */
  211907. { { 0x4c2d553b,0xc4cf3280,0x3b966c29,0xdc1abe22,0x2296914a,0x556a549c,
  211908. 0x999976c9,0xd8c9f8b5,0x776e83f3,0xc22c57bd,0x7c85ec57,0x4f2942ab,
  211909. 0x6e2c61f5,0xef3407e5,0xf213db48,0xf005e8ca,0xf32698c7,0x470c853d,
  211910. 0xcac0a54b,0xe6f488d7,0x60b7501e,0xb6bd6bed,0x714a4bd9,0xf0103106,
  211911. 0x6e098894,0x5285bc3b,0xf5f92a00,0xec06741a,0xef7ef24a,0x32f16426,
  211912. 0x6c77a438,0x12f9c44d },
  211913. { 0x83313a1c,0x1951e964,0x33c58b37,0x98edd3da,0xc7ac4044,0x4edbbf52,
  211914. 0x0dcb5ee8,0x866ca6f7,0x6dd422f8,0xec0ae8f5,0x0661ec2e,0x1077bc54,
  211915. 0xd422523c,0x6d39913a,0x58e7cb3e,0xd105e1e8,0xc979bb45,0x47c9397f,
  211916. 0x0997b592,0x3221d4a9,0xe8952fe7,0x0ef628a3,0x4e946241,0xd08d5827,
  211917. 0x59780f40,0x64cbed0f,0x08e110ec,0x13d7c227,0x7679b1a3,0xd186d866,
  211918. 0x26ae1d18,0x02f75e4e } },
  211919. /* 217 */
  211920. { { 0x47f307d7,0x1b637ebf,0xd0141477,0x6b644a6a,0x2e05a80c,0x82a33d65,
  211921. 0xfed07b31,0xc8f1a0f3,0x3696e597,0xc09ee7f9,0xc7ffc01e,0xcdaa7ec3,
  211922. 0xf8f373b9,0x549f88fe,0xc3bb8989,0xc88d1961,0xdfcaa7b7,0xd92a4fe9,
  211923. 0x3ae4ab20,0x12ff9ee2,0xf5ecb1a5,0xf5aea641,0xe32fb47d,0xe769237f,
  211924. 0x25d085c0,0x96a5c420,0x26c755a2,0xdc912558,0x9bce9723,0x580b985f,
  211925. 0x63961941,0x72b1b566 },
  211926. { 0x790e5558,0x9d708a08,0x0689af80,0x98536041,0x42313b5f,0xe85e7b8a,
  211927. 0x55a49d1a,0xe6ba1292,0xac371b0b,0x5e76c4b0,0x938e6e19,0x58504f39,
  211928. 0x60ae9a21,0x8dd41422,0x968485ce,0xd8b04e9b,0x887efe43,0xf94c4ba5,
  211929. 0xf11c5e73,0x11268e67,0xcf6b99c4,0x92623e28,0x7a0a9662,0xf2d0aaa8,
  211930. 0x4ca02ed3,0xb266772a,0x2d63b551,0x68ee8e4e,0x2e78b5b5,0xcdebb299,
  211931. 0xe17225ad,0x5df19216 } },
  211932. /* 218 */
  211933. { { 0x8df2e7e3,0x20027e1e,0xd8da07de,0xb183cc68,0x4b4ae694,0xce35ba69,
  211934. 0x3ca62e88,0x896d97df,0x52efed2c,0x3de4713b,0x26bd084f,0xd006c40e,
  211935. 0xfc81923b,0x1e9b71bb,0x1aacc6b0,0x9991c7b6,0x8f656840,0x650c9364,
  211936. 0x87f47524,0x138561d1,0xbffd3ca2,0x610f2b11,0xfa191418,0x96915faf,
  211937. 0x955e5309,0x8f1236de,0xa1872d79,0x613cbeea,0x66a2a48b,0x7f7b44ea,
  211938. 0xe0a89c32,0x452265c2 },
  211939. { 0x25430010,0x4ad5ec79,0xebd090c0,0xcac786ff,0x20a9d3f5,0xa5f9f4ff,
  211940. 0xa3edc65f,0xfcbf4112,0x0cf3eb11,0x8824839c,0x8aa5b700,0xb8dd6d4e,
  211941. 0xb7568ab8,0xe2271dfd,0xb744560e,0xe43ec373,0x1cf75296,0x78eaf926,
  211942. 0x3fa96d9b,0x1809ae0e,0xdc25dfd5,0x0b312d2d,0x6bab7711,0x6b8f78b4,
  211943. 0xb5ecf1e4,0x069efc8d,0x609fecaa,0xc1952bae,0x5f4dbde1,0x43e302ed,
  211944. 0x1e078555,0x14b02bf9 } },
  211945. /* 219 */
  211946. { { 0xb87e5b57,0x2c71c768,0xf531a557,0x0bcc78f7,0xf7597dc8,0x4ff93f8b,
  211947. 0x139e175f,0xb28e026d,0xcb94ca6c,0x6b83b727,0x0079f7fc,0x2eafe3b2,
  211948. 0xcf3bd170,0x2aca54de,0x6af0dc6c,0x17c4133c,0xccf5e35e,0xbea1e665,
  211949. 0x345505c6,0xa6691a48,0xe6100b89,0x2633abd0,0xc17d0388,0x966c6706,
  211950. 0x1a0cf90c,0x7aefffbe,0xd0add64c,0x4d847be7,0xaea2aa46,0xd49bcdfb,
  211951. 0x2cc7d0a5,0x85e07e74 },
  211952. { 0x0bc25bca,0x23aae0a6,0xe44f64ec,0x6e8e55f1,0xb607b773,0xe1e696d8,
  211953. 0xd3005909,0xaa90a746,0x2cbc4990,0x072b1ccd,0xc68e2f5d,0x0d0fe6c6,
  211954. 0x53e28ec9,0x920ec5f0,0xf0040cc1,0x79b21fb4,0xfcc4a2c7,0xa7375bd3,
  211955. 0xe1bac7dd,0xf5f5def9,0x35c0f8d3,0xdc315d79,0x2cacd318,0x7117c170,
  211956. 0xe926f71c,0x6f2823c4,0xed02f39a,0x38db58bb,0x7db69323,0xe5b49231,
  211957. 0x8d49f430,0x0964039f } },
  211958. /* 220 */
  211959. { { 0x56999eba,0x21774f16,0xb1de6305,0x3d8ee287,0xde0b2669,0xd81af726,
  211960. 0x3f8942a1,0x37446939,0xea03e13c,0xbcf6b615,0x94e273cf,0xd30c0c35,
  211961. 0xc6725c56,0x4fd33a56,0xa8be97a2,0xa57534ad,0x7c22a251,0x799242a6,
  211962. 0x9d0c5c49,0x4e51bdb5,0xc6a42768,0xd7cd76cc,0xd426bf59,0x914097ac,
  211963. 0x66e9beb2,0x59404a2c,0x5c96e3e9,0x4738fe98,0xaad666d0,0xbcbb3e0e,
  211964. 0x63bc5e56,0x626b0fd2 },
  211965. { 0xe1a1ec42,0x47217dba,0xab5acc50,0xaa6ae7db,0x865331d1,0xb7e1ab1e,
  211966. 0x3d30126f,0xb8453070,0xdee61851,0x280649e0,0xea689544,0x8806f4a3,
  211967. 0xcb56f632,0x4bbe43ad,0xbcaff94f,0x036b9bda,0xbd0637be,0x0d941e65,
  211968. 0x686f3abb,0x82179d44,0xaad6afd6,0x1486912c,0xff7e1534,0x9a3b891e,
  211969. 0xeb86fd96,0x88c426ce,0x117928c3,0xb56e6a81,0x96399e00,0x933e7135,
  211970. 0xa17b6ac1,0x09bbddd9 } },
  211971. /* 221 */
  211972. { { 0xe4fd3673,0x75e39c1d,0xa65c8e07,0xf880d9d1,0x7289c7fe,0x4725c1dc,
  211973. 0x3529d200,0x5b6735ee,0x3c747af3,0xc1f8f2ed,0x912efdf5,0x5cf3998f,
  211974. 0x49859c39,0xed722618,0x0e69795d,0x23793a2f,0x86b1d2a7,0x8a6ab8d6,
  211975. 0x22a882e4,0x00c815de,0xf9db8d7e,0xbe77d6fc,0x02267547,0x0886fb32,
  211976. 0x49c10edc,0xb62687d4,0x7c83ed4c,0x9f1c3e17,0x5af366ea,0xe6d5d7f0,
  211977. 0xd1efad24,0x2eaa01b8 },
  211978. { 0x1f357c74,0x5e47fb70,0xa9e3b794,0x93085c4a,0x6e85a905,0x4f098733,
  211979. 0xbe0244c9,0xf53808ff,0xa3b5660d,0x91dddf93,0xf3b95ed6,0x8b76377b,
  211980. 0xbb3920d4,0x91b911b7,0x86a13cf3,0x7ccf08bf,0xea018e58,0x53ed8f97,
  211981. 0x78c55194,0xb1ea4343,0xe0d2d5a6,0x8e6adde9,0x9b96259a,0xfc2b248f,
  211982. 0xeef17ddd,0x96ebceae,0x557f9c85,0xf694b443,0x07d5bba8,0x48cd150f,
  211983. 0xb4c1986b,0x02d31de9 } },
  211984. /* 222 */
  211985. { { 0xde79499d,0xa6bb9e1e,0xfd0fc2ad,0xf6ca8ff8,0x1a7d9356,0xbec0f8e8,
  211986. 0xe8f06327,0xbc3d1c9f,0x3b300beb,0x805c7217,0x413c181b,0x00420a08,
  211987. 0xf0ca9d01,0x9e9a167e,0x1aeeddd6,0x076c909d,0x8e3a8a72,0x64a1997f,
  211988. 0xa77b429e,0x3ce7f7a7,0x5c94d3e9,0xaac0fbf4,0xe6d48407,0xf37694a7,
  211989. 0xa91921e7,0xf56679e2,0xee1dbbd6,0xf23fe0f3,0xcbf9fa99,0xc7917566,
  211990. 0xe0f4d765,0x965860f2 },
  211991. { 0x7fa5f79c,0xe734702b,0x5af2d26d,0x930bd426,0x6c73e0ce,0x45bd8b98,
  211992. 0x4ee44a2d,0x7dbe7bed,0x956c8a1a,0xc129e024,0x77cdf80e,0x6fdc05ac,
  211993. 0x589ca59b,0x70a6ba2b,0x999825af,0xfc484021,0x7a23f0b6,0x1d284b54,
  211994. 0x28a0a8af,0xb1da10a4,0x2b2af6d8,0xb1eb1b31,0x33935ee3,0xf051443a,
  211995. 0x8effa6ec,0x7a07eb26,0xd662654c,0x16ee4086,0x4549ee4c,0x7a7bc501,
  211996. 0x1fa98a52,0x65081032 } },
  211997. /* 223 */
  211998. { { 0xb67ed9b2,0x49f0e460,0xc36d93d2,0x0cda0fd0,0x88c75e1c,0xbb5963e9,
  211999. 0x614bc0c9,0x757bbe93,0x9a768605,0x9a9b8801,0x48edc544,0xa8b7e2af,
  212000. 0xb51a5985,0x9e77ed9e,0xebbf024c,0xdd025274,0x1545c636,0x598b6288,
  212001. 0x4800dba0,0x39bdaed0,0x81e2a23a,0x7fc20139,0x550cb4f2,0xdc66fd5c,
  212002. 0xb52068c7,0xad27032f,0x8169fa15,0xc9a0bcae,0x3a7ca8a2,0x60606f21,
  212003. 0x9862652f,0x98295046 },
  212004. { 0x2e11c128,0x3e374600,0x0e6dca7e,0x80dfae5d,0xd9552264,0xe44016e2,
  212005. 0x880b7143,0xf65f88f2,0x526b881c,0xca3d28d4,0xdfb86afe,0xf9c59dd1,
  212006. 0x4c74f958,0x548860c2,0x9cb69f4f,0xd06ea43c,0x7334ecec,0x5343c9ae,
  212007. 0x35329713,0x5cc2ccd6,0x5f3a6c0c,0xa95ff403,0xb372653b,0x2e01a1cc,
  212008. 0xa250523d,0x31510fdf,0xa6227eb2,0xeee538e2,0xca23cd10,0xeadfc8a0,
  212009. 0x3e78f54b,0x4b7e6e1b } },
  212010. /* 224 */
  212011. { { 0xdb5f928b,0x79c9076f,0xb7347cec,0xe6250bb6,0xac00ec41,0x54b67798,
  212012. 0x9d9619c7,0x900d20ba,0x59e4343f,0xed42c0d0,0x451935d7,0x3df39e85,
  212013. 0x64f701ce,0x26391182,0xe1f87aac,0xce8f2554,0x65f91aaa,0xfddd6789,
  212014. 0xa324539f,0x96cd163f,0x4bace995,0x5c815f2c,0xa94f9ea5,0xd78c8c2a,
  212015. 0xef24e455,0x7ab2aff4,0x1cddc26a,0xf0ed6409,0x00ca2822,0x954a420b,
  212016. 0xd3297658,0x0611c4c5 },
  212017. { 0xa9e81829,0xf192001c,0x08a282cc,0xded33320,0x8f9ded9b,0x0bfd7de1,
  212018. 0xb7889003,0x6793ac0d,0x3577a5dd,0xbb00d91d,0x802d3c2b,0xe17a23a7,
  212019. 0xfb549014,0xff95f88c,0xc71b6e07,0x7cd1bf4b,0x23588c8b,0x2e3b24a0,
  212020. 0xa4112076,0x9b5335b8,0xc4056d30,0x2481c05e,0xe916a1b5,0x55c7410c,
  212021. 0x850179f4,0xbbe03271,0xb3cd1208,0x15e6c177,0x90cbfe50,0x509a24c0,
  212022. 0x1c108566,0x82079529 } },
  212023. /* 225 */
  212024. { { 0x1c7d353e,0x5d2d3cff,0x7de0ce3b,0xd5e7eccd,0x6ca87635,0xb4b1075f,
  212025. 0x25f9ad3e,0xda8404e0,0x205cb5ae,0x6b963e89,0x09f221a1,0x9e5ee0d8,
  212026. 0xea41aca4,0xd64c85d9,0x34442a34,0x6a46c4e9,0x3cf655a4,0xac6ff97e,
  212027. 0xe5417d7c,0x76565c1e,0xeebf9c4c,0x681009a9,0x88da6388,0x95b61d39,
  212028. 0xf6b472c6,0x6402b46a,0x0b7f1171,0x1fde5165,0xbe0c05e3,0x94f8f273,
  212029. 0xa88344a7,0x7487b036 },
  212030. { 0x9c3e2370,0xa860e575,0xf8048719,0x19d58193,0xa6e2f9aa,0x3a0dbf3c,
  212031. 0x6144719b,0xb6c7e959,0xdeffec21,0xa9049c74,0x3f50cebf,0x8ba064b2,
  212032. 0x49a1de15,0xb12822c0,0xb1d527f2,0xb654b7d9,0x0ffd0430,0xc470859d,
  212033. 0x4f05446b,0x37c74a67,0xa3add995,0xe553251b,0xe33533b5,0x4a3ed6cb,
  212034. 0x27e419ce,0x2f2f44d0,0xa5d1b979,0x2d84ee82,0xdb6fa69f,0xcc76b123,
  212035. 0x21fa3bdd,0x834f85c5 } },
  212036. /* 226 */
  212037. { { 0x2ce9b31a,0x329347c1,0xfe3fb3b7,0x1d88522a,0x52ff90fd,0x4bcefb4d,
  212038. 0x2b1a081d,0x53b17386,0x2a411f08,0x538c11ba,0x141b603a,0x7895b93c,
  212039. 0xb10bd741,0x2993b9aa,0x09912986,0xccbbd046,0xeea0aba5,0x669fafb0,
  212040. 0x35661897,0xd4844622,0x367ffa54,0x4a63b89c,0x1c3478da,0xcbad5d1d,
  212041. 0xaa6034f7,0xc5339227,0xe61b1391,0x0e6d705f,0xf74ff515,0xdd14b660,
  212042. 0x5332b54c,0x639d8b0a },
  212043. { 0x162217cd,0xfa423162,0x811c28e6,0x2e0e4a2a,0x21766dc0,0x68d9ce18,
  212044. 0x046a06ef,0x51263739,0xdde92101,0x44eea231,0x114298d3,0x0607c8f2,
  212045. 0x63d957e9,0x27f272ba,0xa5e8cae1,0xe7ce80cc,0x24f7a63f,0x5816ebe2,
  212046. 0x89673e34,0x4dece5a7,0x536babd4,0x13756a22,0xe3bf77af,0x644d61ae,
  212047. 0x2bcf98bc,0x60b2bf6e,0x29fa962c,0x3b0b59f3,0xabb50023,0xb0769a1a,
  212048. 0x0c75402c,0x40903136 } },
  212049. /* 227 */
  212050. { { 0x1670433f,0x84d2873a,0x25493dfc,0xc9394df6,0x80fcf89e,0xeb05a19a,
  212051. 0xdb297616,0xe39e4310,0xd9e63046,0x50742dc9,0x1de9ca9e,0xf31ad8c8,
  212052. 0xfb7b1d0d,0x86aabf94,0x1b3c82d1,0x36cda27a,0x39702d84,0xfb1a2ef4,
  212053. 0x46081299,0x280bfddc,0xd2396238,0xe4b2b48d,0x7b3c9353,0x2db2c2f3,
  212054. 0x12fb8a69,0xd5b5b317,0x08180474,0xf9b87a3b,0x1e952578,0xd8590986,
  212055. 0xf37a2bc8,0x80668eed },
  212056. { 0xb39a0249,0xe2edcd35,0xb2f8aeae,0xaf230cd4,0x7223df05,0x295b15e4,
  212057. 0xe0e937f4,0xbb66982a,0x8cbc9162,0x019d2b72,0xcf49dca1,0x5c512ae9,
  212058. 0x630f07b4,0x11b491a7,0xa03874e9,0x48d4f34c,0x44cb7433,0xc1fd0ea6,
  212059. 0xf95b30c3,0x13f79ae1,0xed8b60ac,0x40362d4d,0x61ead81c,0x9e8314ff,
  212060. 0x498c3d28,0xed600dd4,0xc2521702,0x5fcb1c19,0x3a9c1f33,0x592329fc,
  212061. 0x1bde6ce9,0x04677548 } },
  212062. /* 228 */
  212063. { { 0x39233c96,0xee3de56e,0x80737eaf,0x868c409c,0x201abc68,0xacae11bd,
  212064. 0x2b486205,0x0f2cea9b,0x6f19056c,0xe32387e1,0xa5dc2a41,0xea75365a,
  212065. 0x12b4be86,0x76c29acc,0x8d63294d,0xa01fcab7,0x0cab9f24,0x81dbe88b,
  212066. 0xf414c054,0x76646e5b,0xcb96b7aa,0xfe111893,0x7664e097,0xb649f5b1,
  212067. 0x53fcf5a9,0xa196422e,0x0b7ff634,0x5978c9bd,0x3c229895,0xb5feb38e,
  212068. 0x0833c456,0x038a49fb },
  212069. { 0x13e93257,0x35e3818c,0xa612741b,0x14cebc9d,0x7caac06b,0x4f6e9249,
  212070. 0x3daa1116,0x82278e33,0x4de2034a,0xe7cc565e,0x0a1ba630,0xbb7dc95f,
  212071. 0x66956fbd,0x81dd9f23,0xbb132dd6,0xc63e6319,0xfc241337,0x6e22b022,
  212072. 0x7e8beb1c,0x23848193,0xd8c938ac,0x83b1994d,0xa6bb5644,0xb54cfaca,
  212073. 0x06f91807,0x1a7cd44e,0xa8f8d9f3,0x1dd439bb,0x7f74a8e6,0x660c2a78,
  212074. 0x121b5660,0x4bb76e22 } },
  212075. /* 229 */
  212076. { { 0xe6354817,0x7a151e8a,0xf038b438,0x33d494ea,0x85958986,0x4c86c688,
  212077. 0x1dcbac12,0x72153827,0xc0edad06,0xf487af8c,0xe500e5d6,0xad33051f,
  212078. 0xd6e47f55,0x0a711b1b,0x8c746ad5,0xa68709a7,0x6402f35e,0x27f17262,
  212079. 0xfb30c130,0xc6d08efa,0xc06c7497,0x9ef1c041,0xdcc3e2da,0xd0c74ece,
  212080. 0x092e1073,0x30c5f96e,0x2aa12b74,0x0f1393cf,0x2107eb02,0x24584016,
  212081. 0x7b76f98b,0x8843d25f },
  212082. { 0xedb2a83e,0x4e1501dc,0x2bb8d724,0xbcfe8fb0,0xd925df62,0x09020659,
  212083. 0x42ab6fc3,0x3c715dcf,0xa0f09dfd,0x73c05055,0xe3590aea,0x126745d8,
  212084. 0x76ff749e,0x5382f4d8,0xa920c663,0xfc69feef,0x9fd711ca,0xde160211,
  212085. 0x9075c4d5,0x4219c3bd,0x3ded6bf2,0x3800cbd1,0x6263a116,0x8c7ea0eb,
  212086. 0x7d264c37,0x35bd7958,0x7159c98c,0x56e22e45,0xfa7373b5,0x71bf2a2d,
  212087. 0x8935c949,0x0503f939 } },
  212088. /* 230 */
  212089. { { 0x71dad4f6,0x65addc66,0x024bea1b,0x238e4889,0xf605d3dd,0xfb76c8e2,
  212090. 0xb0d96b89,0x13d5f5de,0x6601b2cb,0xe0b5ba35,0x83e3d254,0xe37d491d,
  212091. 0x240c8ea7,0xe8860423,0xe91c99ba,0x374182f3,0xa87ad919,0x26c2caf9,
  212092. 0xf574f295,0x4b13040a,0x944000a3,0x5b9bced1,0x06df42e7,0x4ccc57be,
  212093. 0x4bd1089d,0x22e8ec50,0xdddbb500,0x0c53177a,0x9ecfeadb,0x690d31d2,
  212094. 0x176668f9,0x735778fe },
  212095. { 0x843c1137,0x0f86ee3e,0x3f0b73cd,0x3c1c42fa,0x8ab20e3a,0x0e75679d,
  212096. 0x16242fae,0x6f95f1f4,0x39b092e4,0x7b88e11c,0x4c236ac0,0x1629403e,
  212097. 0x2dac02e6,0x66105f41,0x862e0632,0x74dc28a7,0xf3b23c8d,0x2118ffb2,
  212098. 0x0745ffbf,0x1182417c,0x4c05711e,0x49b55a04,0xcefbe4de,0x2c665b74,
  212099. 0x97bf7107,0x1cc4c01d,0xc54f0676,0xb2ca06da,0x7450d0f8,0xfc599daa,
  212100. 0x1a3182a1,0x52e637a6 } },
  212101. /* 231 */
  212102. { { 0x6bebc6db,0x481700f1,0xf9503d92,0x4a6b45db,0x5d153919,0xc715cd3c,
  212103. 0xe5ad2abc,0x942a1c05,0xab7b466f,0x36a82433,0xba13918b,0xba413bed,
  212104. 0x90f4e6ce,0x698a5624,0xf3f1f3ca,0xbb720da6,0x63471ab3,0x2116d41d,
  212105. 0x303d3609,0xe00d2227,0x463ba69e,0x7fd4cc00,0x62845fd1,0xac609e4d,
  212106. 0x80adc9c7,0x63603b2c,0x45fafbca,0xbf16fc9a,0xc4bc94ab,0x41007f7f,
  212107. 0xa74b1698,0x7c916b4f },
  212108. { 0x78bac2d4,0xc1026f91,0x2601a875,0x8a2e8098,0x0073d640,0xad2f276e,
  212109. 0xfcc1fb88,0x443610c4,0xca6b291f,0x5727b822,0x88ec60fc,0x0645532c,
  212110. 0xed9ad48b,0x51e48899,0xf543f103,0x841b48b5,0xd591ceeb,0xa6ccb1be,
  212111. 0x9dcf5a8b,0xfc4adf0f,0xb347ddb4,0x3a7ca020,0xcb44c521,0xaa1accc2,
  212112. 0x0527c0c4,0x773b6828,0x7023cf50,0xaa374c10,0x6b74c926,0x733d1000,
  212113. 0x77a8d07c,0x1ff3916f } },
  212114. /* 232 */
  212115. { { 0xf997939d,0xaa218fe4,0x791583b3,0x3d4dfbbb,0x87f7560b,0xb3a7b5da,
  212116. 0x5da92c98,0xa9c02801,0x46666f4a,0xe1eb4aad,0x14ce9dd7,0x2eb17a51,
  212117. 0xef8f3076,0xf46a66a4,0x810e546e,0x900b45c6,0x4baf04dd,0xf7af2258,
  212118. 0x5c84d42f,0x3cc1c872,0x8e4c83de,0x3093f225,0x170d88b2,0x62fade41,
  212119. 0xac076e44,0xe19612e4,0x32dd141b,0xf48d7346,0x925e34da,0xc1b1f759,
  212120. 0x072b90c9,0x19ed1a56 },
  212121. { 0x6c735473,0x9cf7fcde,0x6003bc3e,0xaab88e67,0xfb199bb8,0x12187cbc,
  212122. 0x9accccbd,0xbb730441,0xb0f65459,0x214aff3c,0x6f926282,0x6aec81a3,
  212123. 0x9f9d20b8,0xaa82cb32,0x5773cc90,0x82f3f90f,0xf62257e1,0x4af60e6b,
  212124. 0xbd4762df,0xf18b44bf,0xdb970753,0x3948b129,0x7c22c18e,0xc6e920e9,
  212125. 0x57be97ad,0x393d6208,0x46b637f9,0xe8d7382c,0xf1fed1d5,0xf6625ccb,
  212126. 0x68681599,0x6f31e0f9 } },
  212127. /* 233 */
  212128. { { 0x82b8f204,0xc45afe55,0xd358b54a,0xac0441b6,0xacd5f5ed,0x7213e7bf,
  212129. 0x139bcd93,0x1914c70b,0x96dbcbb0,0x714b4581,0x1ed35d21,0xe9297d35,
  212130. 0x6a3e1f20,0x8f640837,0x2f3cd705,0x150a8a9d,0xdcdd9f6d,0xfb36e801,
  212131. 0x5cf56d82,0x5a54eb65,0x92aa5a21,0x7610500c,0x3b089f03,0xd10d0ae2,
  212132. 0xc42b66e8,0x491b2079,0x0eee8d48,0x4af1ae3d,0x41556f45,0x137e4c28,
  212133. 0x63d8a7e6,0x875e3308 },
  212134. { 0xaf6c0acc,0xdc80fddc,0xbb1e7c08,0xd5ad1e66,0x828585ad,0xdc717ae1,
  212135. 0x275c7da6,0xbdc54340,0xd26b9e15,0xf4b4c852,0x6a05fa50,0x5f0a1fbf,
  212136. 0x817bcb32,0xc6f81e47,0x70ff2e1d,0x2cbd4328,0x67c7f7fc,0x8a249016,
  212137. 0xb585a6c4,0xd045acb7,0x4666c057,0x2e972ad4,0xe6d7d63d,0xc74d87cf,
  212138. 0x0e274144,0xf7067d87,0x8b2584ae,0xb2ca157a,0x75f0fdeb,0x495c5bfb,
  212139. 0xf386e009,0x5abb0581 } },
  212140. /* 234 */
  212141. { { 0xf0c97f57,0x8be62d2b,0x962f28c7,0x0fe04871,0x47b50abb,0xc548a467,
  212142. 0x44fa09ed,0xf6b26e03,0xab05a96e,0xfd44c6e3,0x70e6ae82,0xedb0032c,
  212143. 0xd7e4899d,0x28bd402b,0x9b7c11c2,0x43f2e963,0xce913716,0x0ec3fc0e,
  212144. 0x02fd0f8c,0x769b8bc9,0x7cabc3ac,0x9d9cb3aa,0x06924cc9,0xe88a8892,
  212145. 0x42609014,0xa51461aa,0x962e79e0,0xc7f4aa8b,0x8b1b3e80,0x4ef0210a,
  212146. 0x1bfee4bc,0x70544680 },
  212147. { 0x121901c1,0xfab3d713,0xfead54aa,0xe90a2627,0xbc08ba23,0x64f6d285,
  212148. 0x36ec227e,0x8d993015,0x06c191ab,0x99a16ab9,0xf649ce2c,0x86b1cf5b,
  212149. 0x66be3a80,0x59206759,0xccba2cf0,0x18836279,0xeff53486,0x2c157b87,
  212150. 0x4b223af2,0xbfac9896,0x0aae7a57,0xcd0fd4f0,0x63218a80,0xdaddb940,
  212151. 0xdf88f14e,0x3844bb79,0xb71ed9fd,0xc1b3e3d4,0xd6205036,0x6c634a13,
  212152. 0xb8680a6b,0x6f56aecf } },
  212153. /* 235 */
  212154. { { 0xd9205c5d,0xb01dc803,0x67123929,0x68955f7d,0x9d9b6565,0x3debbffd,
  212155. 0xd3b1acfe,0xb844395e,0x6094eeff,0x04328b21,0x22991feb,0x6631ffa8,
  212156. 0x190dd075,0x0dde66e6,0xe8577c05,0x75b03c55,0x91722407,0x6c91ce5f,
  212157. 0x8ebb3a3f,0x9a288a40,0x058a1396,0x1d376f8a,0x9a6e0676,0xf3a59457,
  212158. 0x7b71d288,0x103029c5,0xb44c30c0,0x0843f428,0x730e0b9c,0xd8e6aff8,
  212159. 0x4ed644ad,0x7b6be811 },
  212160. { 0x3d3aa54e,0x3ec38e4a,0xd83d509a,0x10233943,0x243955e2,0xf84aa621,
  212161. 0xf51d3d44,0x29104717,0x7eca4e37,0x62d2442c,0x85fa55de,0x8c5a523d,
  212162. 0x851da1b5,0xc6f5ccda,0x20001468,0x044bcaa8,0xe01702e0,0xf7501e68,
  212163. 0xe6a0acec,0xf0819359,0xac0ef0b2,0x33dda6ad,0xfd964f01,0x97aeedc8,
  212164. 0x530b90d8,0x48dacd0e,0xb84122eb,0x4c5fad6f,0xd700a1de,0x2284ec1e,
  212165. 0xdbca5474,0x86f9a835 } },
  212166. /* 236 */
  212167. { { 0x450cc69f,0x0e1d9055,0xc9edf98f,0x50eb14bc,0xee7eba01,0x1bb94e77,
  212168. 0x998f8e53,0x5f7a6737,0x1b16eef0,0x588384e3,0xd85c5e15,0xbb928723,
  212169. 0xcbd952aa,0xfe51e345,0x7e241674,0xc5d0ee28,0x100182f0,0xfdc146ef,
  212170. 0xe7f5be2c,0x0f739e92,0xb656bd3e,0x501ab3af,0x5168e289,0xb1552dde,
  212171. 0xb8ee104a,0x940dfe31,0xc4304475,0x42923603,0xc460a913,0x9306f114,
  212172. 0x03b51f86,0x5bfa9faf },
  212173. { 0x107b258e,0x2a23f52c,0xd66341dc,0x989e82bb,0x823cff1a,0x54a3ced8,
  212174. 0x719b491f,0xf45b7794,0x2433dfb8,0x898c2218,0xc49250ee,0x0f9dd91c,
  212175. 0x4fa17655,0x50c2a2ae,0x2c327f45,0xf7aa1ce4,0x583b1e41,0x13a15ad6,
  212176. 0xa1bfad9e,0x9aa0d5a5,0x8e1fbdcd,0x9b1caa28,0x915f7f87,0xaf9283b6,
  212177. 0x87e81a1e,0xc10e4e0c,0x1080d296,0x04fdca56,0x12755bd8,0x6acc9616,
  212178. 0x828feeda,0x1b1266aa } },
  212179. /* 237 */
  212180. { { 0x774ee49c,0x4ebc0a00,0xcb6237d7,0x776f6852,0x5df938a3,0xfc0544ac,
  212181. 0xb6fbfbbd,0xc3388ec8,0x745f2eae,0x84ac8bcd,0xb1ece937,0xa9c56609,
  212182. 0x7de8fa13,0x656fb6ac,0xa532b871,0x5f8ded74,0xaa889f09,0xab0d428b,
  212183. 0x10b7aec2,0x43b27f28,0xfeecb34c,0x26426e1e,0x9e89c2db,0x44431b6b,
  212184. 0x39211090,0xaac4bc5d,0x4fd81058,0x926f7368,0x471ef60e,0x452fa691,
  212185. 0x218d7a23,0x33517fdb },
  212186. { 0x593c4a36,0xa9c33f46,0x36b1a9ee,0xac69d718,0x4277beec,0x55a20c1d,
  212187. 0x7e4f179c,0x3e8ca24e,0xd46d88a2,0x57373369,0x730702f8,0x71ceb1cc,
  212188. 0x35eed574,0x8b184d97,0x0704cec2,0x7f4517a2,0xd7062a53,0x7f129d18,
  212189. 0xb1d77e1c,0x07a4571b,0x8350d8b2,0x774ac309,0x61fab8ef,0x27b2919f,
  212190. 0xb5dd801b,0xa7c4cc13,0x1434591f,0xe7e6255b,0x5a3592b3,0x349937b8,
  212191. 0x30c77549,0x31fac63d } },
  212192. /* 238 */
  212193. { { 0x04913fb6,0x2ee8cf1b,0x1769a6b3,0x7e401350,0x783e61f0,0x790ebb71,
  212194. 0xe27f2ffe,0x1e5107f9,0xedaf89bf,0x124ba67f,0xe58de68d,0x189200e1,
  212195. 0x6df5abee,0x962732a3,0xacbeb4aa,0x72cc37cf,0xe93c5a76,0xb0c5fa96,
  212196. 0xde63393b,0x4c2a317c,0x830b2d6c,0x97f65e67,0x1be5b96a,0x4afc3504,
  212197. 0x730ce66d,0x0bf40a60,0x9340d84f,0x96a1ba79,0x07626b08,0x3ee18254,
  212198. 0x7ab0cbf5,0x01db35db },
  212199. { 0xac0efee2,0x6e0fbc2d,0xd71dbb45,0x8406ebcd,0x19b69abe,0xe72bde3e,
  212200. 0x37e01822,0x49cb7e61,0x11458b4c,0xcbb8c01c,0x687c5d63,0x420b4847,
  212201. 0x454c6776,0x1847dfa1,0xd1839d18,0xbede911d,0x278df046,0x1b9dc9c9,
  212202. 0x881a336c,0x294bd62b,0x93e77adc,0x7f096879,0x43ce3ba7,0x7ac90665,
  212203. 0x7764eefc,0x148695fd,0x9ac465cf,0xe0c20f0b,0xa6e2cdb1,0x636e8d28,
  212204. 0xd755341d,0x7b6ba98c } },
  212205. /* 239 */
  212206. { { 0xc1881ab4,0xcb1d9e03,0xb3168c88,0x19c25d55,0x282364ce,0xa82d3d47,
  212207. 0xf161aa24,0x95994390,0xe1ebb2c9,0x7838bc00,0xbdec7a75,0x8fd5dfcc,
  212208. 0x4ff7220a,0x4dd203c2,0x0efeff48,0x5ec173b3,0x16428b35,0x99f1d2b3,
  212209. 0x056e813f,0xc06bd9e5,0xc0b319f1,0x929172ba,0xfd223b15,0x6ae0e384,
  212210. 0x98d091ed,0xbd01059e,0xa654648e,0x6b3168e4,0x3375e798,0x2211447f,
  212211. 0x71eb4508,0x47e81019 },
  212212. { 0xbc8c290d,0x7045d45a,0x810fb33a,0xa33d1355,0x46fbbf2f,0x2baf0092,
  212213. 0x385c7cd9,0xacff3f1b,0xe161985c,0xc5b150ec,0x2a888748,0xc6ee0a7f,
  212214. 0x5e88dcc8,0x9d888c8e,0xccb86443,0x4dd735f2,0x3c40f6f2,0xcc1e13b7,
  212215. 0xf3fed691,0xfc3a25ff,0x257ee5c7,0x4cb43b17,0xf32db135,0xaa654f93,
  212216. 0x02dff2d3,0x44f58d0a,0xa8ca6394,0x78e3f188,0xf3e86697,0x39646cce,
  212217. 0xe0dce87b,0x785b1902 } },
  212218. /* 240 */
  212219. { { 0xa92f9a20,0xfcce2361,0x9d64540e,0xb7bdca87,0x1d00d7c5,0xd4739a85,
  212220. 0x2e97c926,0x067ac8dc,0x78da6a8b,0x2aea3ffe,0x63c51b69,0x6828bf54,
  212221. 0x7155141a,0x76f1c479,0x3977d810,0xf4bcbef6,0x541bce7a,0x75bc4949,
  212222. 0xd17041a5,0xe01f4066,0x87755eaf,0xd282d5bd,0x59e7ae80,0x6e2107dd,
  212223. 0x382ab36f,0xaa56e166,0xb9d1d634,0x65ee8ef6,0xce4ed844,0x99a2160a,
  212224. 0xb7712c27,0x6557c367 },
  212225. { 0xd75b6e52,0x561b0268,0x118d0e89,0xb0813640,0x6a2eb1ae,0xcff53330,
  212226. 0x6d090894,0x4e462226,0xb5fc1d48,0xbb351227,0x57a3062d,0x9365ea07,
  212227. 0xd66e2dc5,0x4caca37b,0xb9095887,0x220d7d23,0x8c4473bf,0x9c0fd393,
  212228. 0x6787da4f,0xadff370a,0xd057f4b8,0xef0aebcc,0x1173f33a,0x205e744c,
  212229. 0x925a26b4,0xb8d1f0a5,0x722fbbfd,0xa9364f49,0x8227d284,0xc891ae77,
  212230. 0xa0e08ab4,0x15c40d04 } },
  212231. /* 241 */
  212232. { { 0x2a0e18d1,0x9baf169a,0x4c0327c2,0x9971c017,0x7bc262ce,0xd81a323f,
  212233. 0x818ff379,0x2099db8d,0x4cd3c330,0x663f663d,0x011a0553,0xef5325c3,
  212234. 0xf980a470,0x9cd70bdc,0x1c9ed070,0xe64452d1,0xac676e13,0xafbf43f4,
  212235. 0xae85c2a5,0x97bec0a6,0x470490c4,0x2faae550,0x491e6ba9,0x0ab97a87,
  212236. 0xaafa9914,0x4055f537,0x36726557,0xfc95adbb,0xd119d6bf,0x646343b9,
  212237. 0x9d341e37,0x788e94a0 },
  212238. { 0x9c53461a,0x053a6fe5,0x08e3b6ed,0x75ec897e,0x0768d939,0xa8f5d2f3,
  212239. 0xcc213d4f,0x9bd6bff6,0x05b0147c,0x590c7b41,0x7c7b8169,0x20a3628b,
  212240. 0x5bce78e9,0xc66a086e,0x4dec1d8f,0x3dd4d282,0xc19dcce9,0x890acf44,
  212241. 0xd8435a7e,0x6632d875,0xea6381b2,0x590167c1,0xf0dcc128,0xb2259797,
  212242. 0x46f8d463,0x91a612b4,0xc15efa39,0x42185d78,0x119f6788,0xdf55ec37,
  212243. 0x780dea93,0x91b19cc6 } },
  212244. /* 242 */
  212245. { { 0xcb5d8b80,0xebf2709d,0xfc35660e,0x03b96182,0x055ef969,0xb873d991,
  212246. 0xe47c4342,0xd1ea4b4d,0xd54f8867,0xcc4b9244,0xfd8d77ef,0x93b1a2ca,
  212247. 0xe8c1f563,0x068d24e7,0x49973056,0x5f5fabb6,0x0542374f,0x83248c50,
  212248. 0x3f38e913,0xc36de2b5,0x7bb680be,0xed07e8eb,0xd8f313b5,0x964813d7,
  212249. 0xafd2d392,0x7bb6a069,0x0848a31a,0xc06d848e,0xe4f0c325,0x6867fb2f,
  212250. 0x067343af,0x3c2ba834 },
  212251. { 0x9d3ad63b,0xab62d775,0x59e0eb1f,0x3f9cab97,0x3885e117,0x70332a63,
  212252. 0xe20b2f9e,0xf22cafce,0x49eca947,0xb529ba7e,0x6228d88d,0x24954216,
  212253. 0x39239561,0x80ea23ec,0xd4370644,0x1b8907e7,0x563e4e44,0x4b7fa455,
  212254. 0xb2a4b0fa,0xcca9829e,0x48060792,0xd0a720a4,0x246991ce,0x8ccdda0c,
  212255. 0x348d086b,0x37a2325b,0xf60aee13,0x566ed509,0x147f253f,0x3d30e091,
  212256. 0xc1073bd8,0x1fa627a5 } },
  212257. /* 243 */
  212258. { { 0x42478fd4,0xa11222a2,0x670b2000,0xacf4c6f1,0x8359c6de,0xf71bb04f,
  212259. 0x7b93cdbc,0x618e2829,0x230db60b,0x96e1bae3,0x965b3b29,0xf17fd3b4,
  212260. 0xbc7055dd,0xa58639c6,0x4b817d7f,0xc3ea92ed,0xd23b08a4,0x9082b2a6,
  212261. 0xdc17010e,0x8471228a,0x20e89d97,0x753b9e46,0x03ff77c9,0xcf7e4f97,
  212262. 0x2bbe60e5,0x6c3f8245,0xb80e017d,0x9e432cbc,0xc0a45edb,0x150a5acd,
  212263. 0x4798743e,0x67b8bd05 },
  212264. { 0xf4797cf7,0xe66079b4,0xd03fde02,0xe31c998a,0x54caaef1,0x5aa3763a,
  212265. 0xf7649711,0x64d9a1fe,0xaf29b1a7,0x7ce0dc73,0xfb66ca93,0x6661b083,
  212266. 0x32fb6a78,0xbf4d74fe,0xdf00a561,0x25f6ef09,0x831d1159,0x2bc4383f,
  212267. 0x536bde37,0x6d5cc10c,0x882cc65b,0xd4945f9f,0x451a99b8,0x81f48f13,
  212268. 0x6bac11a4,0x140161cd,0xf18a4a0a,0x9d94d4ed,0xa467a824,0x65363165,
  212269. 0xa4c9aedf,0x74297aa9 } },
  212270. /* 244 */
  212271. { { 0xe21124ba,0xc49758a4,0xa87ffbd2,0x99bd8198,0x3d6638a8,0x45fbcdd1,
  212272. 0x15f7bf76,0x94645ff8,0xc4e6d57e,0x5fa6736f,0x92e61db9,0x1eae6475,
  212273. 0xcbdf944a,0x79575c0c,0x25b31d74,0xa3d13047,0x4cab5ae6,0x7881df22,
  212274. 0x1a2887f2,0x8dbfd299,0xa26ac459,0x23d07590,0xd8661d4a,0x2e589852,
  212275. 0x8a0140f7,0x37b5c13b,0x3fb3782a,0x0f94199e,0x1bc14e90,0x722aa059,
  212276. 0xd55bbb12,0x89aab7ba },
  212277. { 0xd656bdc7,0x8b345a96,0xe176cd3b,0x43bdc8af,0x32d64c43,0xd69518b6,
  212278. 0x79b82b41,0xfcf364a7,0xffb0cf82,0x907b344e,0x5101287b,0xf3d0c83c,
  212279. 0x34cd90ef,0xe9f26a59,0x07082b5c,0xe5f5aaf2,0xece7c165,0x4eb72c75,
  212280. 0xbe986cd6,0xe9590a81,0xff1536aa,0xfeef498f,0xa8263d5e,0x04560243,
  212281. 0x54ae872b,0x940be14f,0xe3207686,0xbee7bcc9,0xc1bc4d7a,0xd496a27d,
  212282. 0x5940ab46,0x002dc297 } },
  212283. /* 245 */
  212284. { { 0xb69d60c3,0xee533937,0xfe972755,0x260be552,0xc0c725a6,0xb11fb78d,
  212285. 0xcab2e7c2,0x6982c27e,0xee2322cb,0x4bceedd9,0x122704f7,0x952b19ed,
  212286. 0x854a6165,0x2df4c285,0x7b192485,0xba40b5bf,0x0119f52a,0xfcbca950,
  212287. 0xe5add86f,0x7467d1cb,0xd9d0f2c1,0x9bf536fb,0xb8d4ebc9,0x3c296e34,
  212288. 0x05a81317,0x0495f8f4,0x73335f76,0x8c59e8d6,0xe0542122,0x0b53d324,
  212289. 0x3c3bda73,0x4d564535 },
  212290. { 0x7e5c0877,0x7322f800,0x0ca9a764,0x481b43e6,0xa2c12716,0x231f4f4b,
  212291. 0xed3136c2,0x09596857,0x38db30de,0xae826322,0x99908ebc,0x652fad40,
  212292. 0xaf0d231e,0x0b8d1814,0x09cbc349,0x2680c54b,0x4bf3bf8e,0xfd4562f3,
  212293. 0x092b595f,0x2985090b,0x5e15fc34,0xe6f39ca4,0xbc378168,0x70175191,
  212294. 0x845a4a87,0x906944b3,0x82a1541a,0xacc6d74a,0xb155c8b4,0xadc9bab3,
  212295. 0x77306c62,0x1f2f89ce } },
  212296. /* 246 */
  212297. { { 0x9affefdf,0x8253ef41,0x4cf9256b,0x05d7ece5,0xb444e483,0x377002f2,
  212298. 0xcba5471f,0xb189755f,0xd5cbe015,0xc88483cb,0x6a0b8429,0x254f7c69,
  212299. 0x61f3f61d,0x18850bd4,0x0a247157,0x7ba21089,0xd92eeb0d,0x35abbc2e,
  212300. 0x965dec89,0xfb56cabe,0xbc55684a,0x9da23724,0x6a7a7492,0xd8ba396f,
  212301. 0x2ef4ba46,0xfcb90db7,0x9909b27a,0xdd234fe0,0x76f4366e,0xbdf3c164,
  212302. 0x17e50d47,0x09c8097f },
  212303. { 0x60050c07,0x6a04b140,0x43a8e37e,0xc29e8318,0xbb55e41f,0xcb9429b2,
  212304. 0x2ce60e3a,0xed2fea5a,0xdb9d82f4,0xdc7b1ff3,0x687d37fa,0x48ebecc3,
  212305. 0xecb07539,0x79153e32,0x57075692,0x6a60054f,0x800759ba,0x3871cd0c,
  212306. 0x30922df1,0x17a7386f,0x83357b7c,0x4e9fc59e,0x39415186,0x1d26b3a9,
  212307. 0xd34db889,0x912a0222,0x59fcdb71,0x6672fcf4,0x44ff3036,0x5a3f268d,
  212308. 0x6911e16c,0x6f113ed3 } },
  212309. /* 247 */
  212310. { { 0x1836f1c9,0x52a9df59,0x4232307d,0xfa6519f5,0x5ded285a,0x8406c701,
  212311. 0xaf627f75,0x0a1545ca,0xace0417d,0xae1111ee,0xa6113443,0xfb28bdf6,
  212312. 0x52dbcbcb,0xde9ef0ab,0x7813e658,0xe9dc181b,0x99127225,0x0b1dabdb,
  212313. 0x22814c59,0x5f0598e3,0xd934ee7e,0x5c3b966e,0xb99ba4bf,0x4eb84eda,
  212314. 0x3c1b55e7,0xb2919a34,0x94aa860f,0xa9addb49,0xf6811ff6,0x1b7220df,
  212315. 0xd1a183e2,0x6636a23b },
  212316. { 0x20587283,0xdf5d5a2d,0xef07fc5d,0x0b3822c9,0x0ef6de38,0x1786bd55,
  212317. 0x25d1671d,0x163cf907,0x1cdb1def,0x74bf971f,0x0842fc4a,0x5749e830,
  212318. 0x27f854f7,0x0e2edbc7,0xbce24acb,0xbb27bbda,0x05bed08d,0xc1b19cec,
  212319. 0xf7c904bc,0xaada123e,0xd89982db,0x02429f1b,0x65f6e632,0x49d3616e,
  212320. 0xee59fd32,0xa3789fa8,0xfe9f29f5,0x160ba3ba,0xaf5378a0,0x0f2d3b61,
  212321. 0x73c2a6f8,0x7aeecc76 } },
  212322. /* 248 */
  212323. { { 0xdc43b0db,0xf3a4757c,0x98119cad,0x3d8a4e85,0x4616c156,0xf8095bf6,
  212324. 0x4f533e97,0x3e2a07bc,0x39cfc5ad,0xa9824367,0xcd68052c,0x18a6ba3a,
  212325. 0x8a1cec66,0xbd60e590,0x02b1b695,0xae3841a5,0x190a195b,0x986dff12,
  212326. 0xad31fd9b,0x2df2beac,0xcc728f7b,0x7d893224,0x0cf0a992,0xc38ea738,
  212327. 0x586a44ea,0xa8439a80,0x1615f03c,0xede7f7f0,0x27a1f885,0x48249908,
  212328. 0xb78a7645,0x28ec4006 },
  212329. { 0xa2fe0009,0xe1820c2e,0xf13874e9,0xe11ba5d2,0xc524db52,0x97522454,
  212330. 0x7fede529,0x4d477426,0x9b2500d4,0x01d3419a,0x1869244b,0xce08a492,
  212331. 0xdd1be1b9,0xba169023,0x32a301e0,0x242c3e54,0x70906788,0x9b56f7ba,
  212332. 0xc74a8cc4,0xf0ad2a09,0xd76f9439,0x99cd1841,0x621fb60e,0xeddafe0b,
  212333. 0xbc397634,0x056bee54,0xff7f0a84,0x4653f860,0x2011c0af,0x6bd4876f,
  212334. 0x0c9525c3,0x134f4cc7 } },
  212335. /* 249 */
  212336. { { 0xe938dff4,0x9621a3ec,0x486a79a3,0x7d101a7b,0xde950537,0xf2c4ef97,
  212337. 0xe65d87db,0xf3184099,0x373b8cfa,0xb89c7ffb,0xe842916e,0x68baa505,
  212338. 0x4ebea764,0xa790fd09,0xe592892b,0x679df6d4,0xfcfed741,0x2023331c,
  212339. 0x9880ff21,0x0bf4efd2,0xd0344501,0x7ca78ddd,0x342858c8,0x2cb09ecb,
  212340. 0x2575487a,0x9e5eb6dc,0xebcb0491,0x50675a15,0x7381d471,0x09d2e74f,
  212341. 0x83d3d6f4,0x6ea37829 },
  212342. { 0x4e5cc40a,0xc65c094b,0x1af37dfb,0x7a2e3f6a,0xf9026e44,0xef677e9d,
  212343. 0x93880f53,0xb7878c95,0x7f644aa9,0x4aa30b07,0x2f208c3c,0xa0c51683,
  212344. 0x658d663b,0x7c0277ae,0xae1d9130,0xef0b3c38,0x695c3ea4,0x302f37a7,
  212345. 0x6a0c5e0d,0xe004c1c5,0x20cbcf9f,0x9fd495c4,0x568a0e7c,0x706d5b9d,
  212346. 0x59286454,0x8b225dff,0x8d9a709c,0x527d4465,0x87c08d68,0x47c558da,
  212347. 0xbb4ef07d,0x606ee6e6 } },
  212348. /* 250 */
  212349. { { 0x57c621f6,0x02d99fc7,0x7fe83d48,0x292e40c1,0x9ef199b0,0x1bdfc7a1,
  212350. 0xe62c7666,0x78a04102,0xe6738753,0x16cda370,0x1e3a65af,0xbc81974d,
  212351. 0xf78fe209,0x19742048,0xbf5981c6,0xc83a058a,0x9c89702d,0xf26b2434,
  212352. 0x9d1a678a,0x988b2f1e,0xff29ae29,0x472bf9b0,0x1d7cf5ec,0xa143e398,
  212353. 0xb268ddd8,0x9c9d7e45,0x5fc4ff76,0x166cda55,0xa4aa7673,0x6044cdf0,
  212354. 0xe9148707,0x49dba6f7 },
  212355. { 0xa758e37a,0x20e47fb2,0x2d8eaf66,0xaf6b31d7,0x6f9c2210,0x352ad5f9,
  212356. 0x90efc32b,0x0093f727,0x41e4b264,0x435c99dc,0x05b15795,0xbfa878e0,
  212357. 0x0e673575,0x99c520a4,0x87eea759,0xca682594,0xf12a348b,0x029f7b81,
  212358. 0x2aa2ce35,0xa547cc18,0xead5e2c5,0xa11d874b,0x55682cdf,0x9af0349b,
  212359. 0x8bbe8e66,0xf86ebfea,0xf55394ab,0x3dab8782,0xebc8eb8f,0x458bf797,
  212360. 0x9b7de78c,0x4890a7a4 } },
  212361. /* 251 */
  212362. { { 0x8da995f6,0xd7299689,0xec6156ef,0xd39eaae7,0x356a82d5,0x6959040c,
  212363. 0xc135bcfe,0xb2046b21,0x0f595c78,0xea720b64,0xe7c5fb40,0x02824efa,
  212364. 0x0edb3bfc,0x97d8fd4c,0x79f24ebe,0x12f02905,0x187ea6b9,0x16fc47cf,
  212365. 0x789d5c23,0xc219fd27,0x89263ecc,0x233a6b6c,0x8b6d30a6,0x823634b2,
  212366. 0xc9b33680,0xca352e25,0x40c77456,0x9388d6ca,0x3c92065b,0xf8e55b0b,
  212367. 0x02439a76,0x5c17474b },
  212368. { 0x8aaccab5,0xd888e7c2,0xaaced05b,0x18027836,0xccec0f65,0x185b877d,
  212369. 0x125c2882,0x93cadc1c,0x67fdc54c,0x45df540a,0xc2788a33,0x4f3c86e2,
  212370. 0xe3a0fa2c,0x3e874469,0x273983cf,0xc59daa47,0x4a96d8a5,0x3063c48b,
  212371. 0xc2e58915,0xc38d2bcf,0x84e428c3,0x90e78b87,0xf0c4fd53,0x900a292c,
  212372. 0x941e6005,0xb7f92db7,0x6ca53a1c,0x95679241,0xb1ab0fa7,0x35f6f31d,
  212373. 0x7b58408c,0x5d675eb4 } },
  212374. /* 252 */
  212375. { { 0x870c6025,0xaeee1a77,0x91a2dfca,0xfc4a23b7,0x386b64c4,0x7b0e60c4,
  212376. 0xe5ae72b1,0xd5d5b17d,0x9eefa212,0x6dfc88ac,0xd4038b96,0x4feaefbe,
  212377. 0x8e2d2ecc,0x099ac356,0x012af207,0x548ea612,0x89c31218,0x4ffed9db,
  212378. 0xe0e67331,0x1c1e91c4,0xaf8300e0,0x009bb64f,0x6773c3be,0x8780501c,
  212379. 0xc08219fa,0xe0cd6ede,0xf81b06ff,0x7c055e07,0xe080b36f,0x82b63f9c,
  212380. 0x0a9feca3,0x02fccbaf },
  212381. { 0xb47cac61,0x9991d4d1,0xab86e12c,0x2e9d1687,0x2b94f042,0x8c6855ec,
  212382. 0x48e648e5,0xca400519,0xef89ac57,0x9ba91fb2,0x1be792cd,0x4f419206,
  212383. 0xbd0f1e15,0x82d221cb,0xfc444019,0x062eb13b,0x99790fdc,0xf3a97c32,
  212384. 0x6067a64b,0x4e796d94,0x6d23775a,0xc46dd300,0xed7f0f23,0x8672c4d5,
  212385. 0x3b4f63d7,0x821851dc,0xd26273f2,0x50a3ae0c,0xeac60f6f,0x800e58fc,
  212386. 0x13845545,0x56f1e456 } },
  212387. /* 253 */
  212388. { { 0x32c24f3b,0x01ccb3f6,0x06d817e6,0x99eb1c7f,0x6aa26776,0x8dc640bb,
  212389. 0x0845d5e0,0x7838affe,0xf81a79a8,0xf34fecb1,0x3e6819b0,0x6a2e282d,
  212390. 0x8237a4b8,0xc4b977ce,0x87636439,0x0f46b3db,0x97970497,0xa465f540,
  212391. 0x8791be43,0xd7e08762,0x34198ec6,0x00220b6c,0x093d94bb,0x57b38637,
  212392. 0x29d690b2,0x84012e16,0x20aad1a4,0x02ec9db5,0x85dc34e3,0xafee2fc6,
  212393. 0x25500cf8,0x911d1936 },
  212394. { 0xf5e5af5b,0x13b1bd58,0x7b6a22a7,0xa7ca263b,0xf3af2adc,0xab6bec4d,
  212395. 0xa04420bd,0x16651e59,0x4ba36c11,0x3b448b3b,0xff424310,0x3c62bfcd,
  212396. 0xf1a96cbb,0xde15c4a5,0xe4d1f980,0xbe0ad8a1,0x36673a3a,0x812bd14e,
  212397. 0x9212acdd,0x40303af6,0x576095ce,0x8f6dab9c,0x107f5ca5,0x7df1882a,
  212398. 0x8896a3b0,0xb903e63c,0xd863b3f0,0xf5048544,0xc09887de,0x5e5019b9,
  212399. 0xa0f53865,0x2be744fe } },
  212400. /* 254 */
  212401. { { 0x5b50f324,0x054cd05f,0x1ea3c7a2,0xb9b1eb24,0x7ff8e6b7,0x4a858a5c,
  212402. 0xec040882,0xd83902fe,0xd0cba9bd,0x72b26494,0xb29c9e1e,0xd0176f90,
  212403. 0xcebadb81,0x05d4eb02,0x372b8bfc,0x874405b1,0x79ead190,0x5c412881,
  212404. 0xec2b48cd,0xd44a3dd3,0x3f4d5033,0x84499a77,0x564c3a09,0xb37b38cd,
  212405. 0xf42e803b,0x80e99497,0xb8f518b2,0xc07b47a0,0x3568fde4,0xc710e3c5,
  212406. 0xcead0e7a,0x735f542f },
  212407. { 0x38380039,0xcaa9a171,0xf74d19c8,0xadfafe17,0xccbc1a8b,0x92d4393e,
  212408. 0xfe029705,0x3c5dbf39,0x930e9b36,0x4552b5ab,0x2afd494a,0x7ee63032,
  212409. 0x3f02ac43,0x826a9ad7,0x99356298,0x98c53562,0x7342bb39,0x0c869f87,
  212410. 0xe4f9b79a,0xd7510020,0xd34789a9,0x6361d1a4,0xcfa85637,0xf0ded5ba,
  212411. 0x88ac07e4,0x407ee73f,0x09ef1cbd,0xfac7d03f,0x4d475bad,0x25d697cb,
  212412. 0x14bd399e,0x1e984c9d } },
  212413. /* 255 */
  212414. { { 0x4850c817,0xc76d0561,0x3489812d,0xb08a5b19,0x5e58cbbe,0x7273d154,
  212415. 0x4be61e5a,0x8900b5fa,0xd7aeb8e1,0xaa088691,0xd35a3d4b,0xe66666af,
  212416. 0x57ec7d3d,0x38a2c199,0x668d6f5c,0xa0648e8f,0x7adc1746,0x1f9fc92c,
  212417. 0x843065c3,0x23a116c0,0x61e6ae69,0x36370a20,0x2aa47e73,0x626c3736,
  212418. 0xdeff6d84,0x540c25f2,0xcdbed2d4,0x9804824c,0x039a9492,0x4b5bfce0,
  212419. 0x76942e01,0x6c474a56 },
  212420. { 0x7d88e3a1,0x3aeb9a41,0xc484742a,0x105d3c88,0x3fe61131,0xe59de8d1,
  212421. 0x1a869e8b,0x148f5b6b,0xaa75d90a,0x7a8abc59,0x62146013,0x2f0c9bc7,
  212422. 0xc3824cd9,0x43faa747,0x6a5d0b92,0x81763a18,0x9bcbaebc,0xbbc341bc,
  212423. 0xf745d1dd,0xe1813160,0xb75ce5f4,0xa53ce52d,0xd50de4c2,0x15eae66c,
  212424. 0x75d7656d,0x5ed8996c,0xc4ca552a,0xe4ff5711,0x3c5305b4,0x215e985a,
  212425. 0xfa1ba2ce,0x6b258954 } },
  212426. };
  212427. /* Multiply the base point of P1024 by the scalar and return the result.
  212428. * If map is true then convert result to affine coordinates.
  212429. *
  212430. * Stripe implementation.
  212431. * Pre-generated: 2^0, 2^128, ...
  212432. * Pre-generated: products of all combinations of above.
  212433. * 8 doubles and adds (with qz=1)
  212434. *
  212435. * r Resulting point.
  212436. * k Scalar to multiply by.
  212437. * map Indicates whether to convert result to affine.
  212438. * ct Constant time required.
  212439. * heap Heap to use for allocation.
  212440. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  212441. */
  212442. static int sp_1024_ecc_mulmod_base_32(sp_point_1024* r, const sp_digit* k,
  212443. int map, int ct, void* heap)
  212444. {
  212445. return sp_1024_ecc_mulmod_stripe_32(r, &p1024_base, p1024_table,
  212446. k, map, ct, heap);
  212447. }
  212448. #endif
  212449. /* Multiply the base point of P1024 by the scalar and return the result.
  212450. * If map is true then convert result to affine coordinates.
  212451. *
  212452. * km Scalar to multiply by.
  212453. * r Resulting point.
  212454. * map Indicates whether to convert result to affine.
  212455. * heap Heap to use for allocation.
  212456. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  212457. */
  212458. int sp_ecc_mulmod_base_1024(const mp_int* km, ecc_point* r, int map, void* heap)
  212459. {
  212460. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212461. sp_point_1024* point = NULL;
  212462. sp_digit* k = NULL;
  212463. #else
  212464. sp_point_1024 point[1];
  212465. sp_digit k[32];
  212466. #endif
  212467. int err = MP_OKAY;
  212468. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212469. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  212470. DYNAMIC_TYPE_ECC);
  212471. if (point == NULL)
  212472. err = MEMORY_E;
  212473. if (err == MP_OKAY) {
  212474. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  212475. DYNAMIC_TYPE_ECC);
  212476. if (k == NULL)
  212477. err = MEMORY_E;
  212478. }
  212479. #endif
  212480. if (err == MP_OKAY) {
  212481. sp_1024_from_mp(k, 32, km);
  212482. err = sp_1024_ecc_mulmod_base_32(point, k, map, 1, heap);
  212483. }
  212484. if (err == MP_OKAY) {
  212485. err = sp_1024_point_to_ecc_point_32(point, r);
  212486. }
  212487. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212488. if (k != NULL)
  212489. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  212490. if (point != NULL)
  212491. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  212492. #endif
  212493. return err;
  212494. }
  212495. /* Multiply the base point of P1024 by the scalar, add point a and return
  212496. * the result. If map is true then convert result to affine coordinates.
  212497. *
  212498. * km Scalar to multiply by.
  212499. * am Point to add to scalar mulitply result.
  212500. * inMont Point to add is in montgomery form.
  212501. * r Resulting point.
  212502. * map Indicates whether to convert result to affine.
  212503. * heap Heap to use for allocation.
  212504. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  212505. */
  212506. int sp_ecc_mulmod_base_add_1024(const mp_int* km, const ecc_point* am,
  212507. int inMont, ecc_point* r, int map, void* heap)
  212508. {
  212509. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212510. sp_point_1024* point = NULL;
  212511. sp_digit* k = NULL;
  212512. #else
  212513. sp_point_1024 point[2];
  212514. sp_digit k[32 + 32 * 2 * 6];
  212515. #endif
  212516. sp_point_1024* addP = NULL;
  212517. sp_digit* tmp = NULL;
  212518. int err = MP_OKAY;
  212519. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212520. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  212521. DYNAMIC_TYPE_ECC);
  212522. if (point == NULL)
  212523. err = MEMORY_E;
  212524. if (err == MP_OKAY) {
  212525. k = (sp_digit*)XMALLOC(
  212526. sizeof(sp_digit) * (32 + 32 * 2 * 6),
  212527. heap, DYNAMIC_TYPE_ECC);
  212528. if (k == NULL)
  212529. err = MEMORY_E;
  212530. }
  212531. #endif
  212532. if (err == MP_OKAY) {
  212533. addP = point + 1;
  212534. tmp = k + 32;
  212535. sp_1024_from_mp(k, 32, km);
  212536. sp_1024_point_from_ecc_point_32(addP, am);
  212537. }
  212538. if ((err == MP_OKAY) && (!inMont)) {
  212539. err = sp_1024_mod_mul_norm_32(addP->x, addP->x, p1024_mod);
  212540. }
  212541. if ((err == MP_OKAY) && (!inMont)) {
  212542. err = sp_1024_mod_mul_norm_32(addP->y, addP->y, p1024_mod);
  212543. }
  212544. if ((err == MP_OKAY) && (!inMont)) {
  212545. err = sp_1024_mod_mul_norm_32(addP->z, addP->z, p1024_mod);
  212546. }
  212547. if (err == MP_OKAY) {
  212548. err = sp_1024_ecc_mulmod_base_32(point, k, 0, 0, heap);
  212549. }
  212550. if (err == MP_OKAY) {
  212551. sp_1024_proj_point_add_32(point, point, addP, tmp);
  212552. if (map) {
  212553. sp_1024_map_32(point, point, tmp);
  212554. }
  212555. err = sp_1024_point_to_ecc_point_32(point, r);
  212556. }
  212557. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212558. if (k != NULL)
  212559. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  212560. if (point)
  212561. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  212562. #endif
  212563. return err;
  212564. }
  212565. #ifndef WOLFSSL_SP_SMALL
  212566. /* Generate a pre-computation table for the point.
  212567. *
  212568. * gm Point to generate table for.
  212569. * table Buffer to hold pre-computed points table.
  212570. * len Length of table.
  212571. * heap Heap to use for allocation.
  212572. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  212573. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  212574. */
  212575. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  212576. void* heap)
  212577. {
  212578. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212579. sp_point_1024* point = NULL;
  212580. sp_digit* t = NULL;
  212581. #else
  212582. sp_point_1024 point[1];
  212583. sp_digit t[6 * 2 * 32];
  212584. #endif
  212585. int err = MP_OKAY;
  212586. if ((gm == NULL) || (len == NULL)) {
  212587. err = BAD_FUNC_ARG;
  212588. }
  212589. if ((err == MP_OKAY) && (table == NULL)) {
  212590. *len = sizeof(sp_table_entry_1024) * 256;
  212591. err = LENGTH_ONLY_E;
  212592. }
  212593. if ((err == MP_OKAY) && (*len < (int)(sizeof(sp_table_entry_1024) * 256))) {
  212594. err = BUFFER_E;
  212595. }
  212596. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212597. if (err == MP_OKAY) {
  212598. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  212599. DYNAMIC_TYPE_ECC);
  212600. if (point == NULL)
  212601. err = MEMORY_E;
  212602. }
  212603. if (err == MP_OKAY) {
  212604. t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 2 * 32, heap,
  212605. DYNAMIC_TYPE_ECC);
  212606. if (t == NULL)
  212607. err = MEMORY_E;
  212608. }
  212609. #endif
  212610. if (err == MP_OKAY) {
  212611. sp_1024_point_from_ecc_point_32(point, gm);
  212612. err = sp_1024_gen_stripe_table_32(point,
  212613. (sp_table_entry_1024*)table, t, heap);
  212614. }
  212615. if (err == 0) {
  212616. *len = sizeof(sp_table_entry_1024) * 256;
  212617. }
  212618. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212619. if (t != NULL)
  212620. XFREE(t, heap, DYNAMIC_TYPE_ECC);
  212621. if (point != NULL)
  212622. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  212623. #endif
  212624. return err;
  212625. }
  212626. #else
  212627. /* Generate a pre-computation table for the point.
  212628. *
  212629. * gm Point to generate table for.
  212630. * table Buffer to hold pre-computed points table.
  212631. * len Length of table.
  212632. * heap Heap to use for allocation.
  212633. * returns BAD_FUNC_ARG when gm or len is NULL, LENGTH_ONLY_E when table is
  212634. * NULL and length is returned, BUFFER_E if length is too small and 0 otherwise.
  212635. */
  212636. int sp_ecc_gen_table_1024(const ecc_point* gm, byte* table, word32* len,
  212637. void* heap)
  212638. {
  212639. int err = 0;
  212640. if ((gm == NULL) || (len == NULL)) {
  212641. err = BAD_FUNC_ARG;
  212642. }
  212643. if ((err == 0) && (table == NULL)) {
  212644. *len = 0;
  212645. err = LENGTH_ONLY_E;
  212646. }
  212647. if ((err == 0) && (*len != 0)) {
  212648. err = BUFFER_E;
  212649. }
  212650. if (err == 0) {
  212651. *len = 0;
  212652. }
  212653. (void)heap;
  212654. return err;
  212655. }
  212656. #endif
  212657. /* Multiply the point by the scalar and return the result.
  212658. * If map is true then convert result to affine coordinates.
  212659. *
  212660. * km Scalar to multiply by.
  212661. * gm Point to multiply.
  212662. * table Pre-computed points.
  212663. * r Resulting point.
  212664. * map Indicates whether to convert result to affine.
  212665. * heap Heap to use for allocation.
  212666. * returns MEMORY_E when memory allocation fails and MP_OKAY on success.
  212667. */
  212668. int sp_ecc_mulmod_table_1024(const mp_int* km, const ecc_point* gm, byte* table,
  212669. ecc_point* r, int map, void* heap)
  212670. {
  212671. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212672. sp_point_1024* point = NULL;
  212673. sp_digit* k = NULL;
  212674. #else
  212675. sp_point_1024 point[1];
  212676. sp_digit k[32];
  212677. #endif
  212678. int err = MP_OKAY;
  212679. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212680. point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), heap,
  212681. DYNAMIC_TYPE_ECC);
  212682. if (point == NULL) {
  212683. err = MEMORY_E;
  212684. }
  212685. if (err == MP_OKAY) {
  212686. k = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap, DYNAMIC_TYPE_ECC);
  212687. if (k == NULL)
  212688. err = MEMORY_E;
  212689. }
  212690. #endif
  212691. if (err == MP_OKAY) {
  212692. sp_1024_from_mp(k, 32, km);
  212693. sp_1024_point_from_ecc_point_32(point, gm);
  212694. #ifndef WOLFSSL_SP_SMALL
  212695. err = sp_1024_ecc_mulmod_stripe_32(point, point,
  212696. (const sp_table_entry_1024*)table, k, map, 0, heap);
  212697. #else
  212698. (void)table;
  212699. err = sp_1024_ecc_mulmod_32(point, point, k, map, 0, heap);
  212700. #endif
  212701. }
  212702. if (err == MP_OKAY) {
  212703. err = sp_1024_point_to_ecc_point_32(point, r);
  212704. }
  212705. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  212706. if (k != NULL)
  212707. XFREE(k, heap, DYNAMIC_TYPE_ECC);
  212708. if (point != NULL)
  212709. XFREE(point, heap, DYNAMIC_TYPE_ECC);
  212710. #endif
  212711. return err;
  212712. }
  212713. /* Multiply p* in projective co-ordinates by q*.
  212714. *
  212715. * r.x = p.x - (p.y * q.y)
  212716. * r.y = (p.x * q.y) + p.y
  212717. *
  212718. * px [in,out] A single precision integer - X ordinate of number to multiply.
  212719. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  212720. * q [in] A single precision integer - multiplier.
  212721. * t [in] Two single precision integers - temps.
  212722. */
  212723. static void sp_1024_proj_mul_qx1_32(sp_digit* px, sp_digit* py,
  212724. const sp_digit* q, sp_digit* t)
  212725. {
  212726. sp_digit* t1 = t;
  212727. sp_digit* t2 = t + 2 * 32;
  212728. /* t1 = p.x * q.y */
  212729. sp_1024_mont_mul_32(t1, px, q, p1024_mod, p1024_mp_mod);
  212730. /* t2 = p.y * q.y */
  212731. sp_1024_mont_mul_32(t2, py, q, p1024_mod, p1024_mp_mod);
  212732. /* r.x = p.x - (p.y * q.y) */
  212733. sp_1024_mont_sub_32(px, px, t2, p1024_mod);
  212734. /* r.y = (p.x * q.y) + p.y */
  212735. sp_1024_mont_add_32(py, t1, py, p1024_mod);
  212736. }
  212737. /* Square p* in projective co-ordinates.
  212738. *
  212739. * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2
  212740. * py' = 2 * p.x * p.y
  212741. *
  212742. * px [in,out] A single precision integer - X ordinate of number to square.
  212743. * py [in,out] A single precision integer - Y ordinate of number to square.
  212744. * t [in] Two single precision integers - temps.
  212745. */
  212746. static void sp_1024_proj_sqr_32(sp_digit* px, sp_digit* py, sp_digit* t)
  212747. {
  212748. sp_digit* t1 = t;
  212749. sp_digit* t2 = t + 2 * 32;
  212750. /* t1 = p.x + p.y */
  212751. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  212752. /* t2 = p.x - p.y */
  212753. sp_1024_mont_sub_32(t2, px, py, p1024_mod);
  212754. /* r.y = p.x * p.y */
  212755. sp_1024_mont_mul_32(py, px, py, p1024_mod, p1024_mp_mod);
  212756. /* r.x = (p.x + p.y) * (p.x - p.y) */
  212757. sp_1024_mont_mul_32(px, t1, t2, p1024_mod, p1024_mp_mod);
  212758. /* r.y = (p.x * p.y) * 2 */
  212759. sp_1024_mont_dbl_32(py, py, p1024_mod);
  212760. }
  212761. #ifdef WOLFSSL_SP_SMALL
  212762. /* Perform the modular exponentiation in Fp* for SAKKE.
  212763. *
  212764. * Simple square and multiply when expontent bit is one algorithm.
  212765. * Square and multiply performed in Fp*.
  212766. *
  212767. * base [in] Base. MP integer.
  212768. * exp [in] Exponent. MP integer.
  212769. * res [out] Result. MP integer.
  212770. * returns 0 on success and MEMORY_E if memory allocation fails.
  212771. */
  212772. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  212773. {
  212774. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  212775. !defined(WOLFSSL_SP_NO_MALLOC)
  212776. sp_digit* td;
  212777. sp_digit* t;
  212778. sp_digit* tx;
  212779. sp_digit* ty;
  212780. sp_digit* b;
  212781. sp_digit* e;
  212782. #else
  212783. sp_digit t[4 * 2 * 32];
  212784. sp_digit tx[2 * 32];
  212785. sp_digit ty[2 * 32];
  212786. sp_digit b[2 * 32];
  212787. sp_digit e[2 * 32];
  212788. #endif
  212789. sp_digit* r;
  212790. int err = MP_OKAY;
  212791. int bits;
  212792. int i;
  212793. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  212794. !defined(WOLFSSL_SP_NO_MALLOC)
  212795. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 8 * 32 * 2, NULL,
  212796. DYNAMIC_TYPE_TMP_BUFFER);
  212797. if (td == NULL) {
  212798. err = MEMORY_E;
  212799. }
  212800. #endif
  212801. if (err == MP_OKAY) {
  212802. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  212803. !defined(WOLFSSL_SP_NO_MALLOC)
  212804. t = td;
  212805. tx = td + 4 * 32 * 2;
  212806. ty = td + 5 * 32 * 2;
  212807. b = td + 6 * 32 * 2;
  212808. e = td + 7 * 32 * 2;
  212809. #endif
  212810. r = ty;
  212811. bits = mp_count_bits(exp);
  212812. sp_1024_from_mp(b, 32, base);
  212813. sp_1024_from_mp(e, 32, exp);
  212814. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  212815. sp_1024_mul_32(b, b, p1024_norm_mod);
  212816. err = sp_1024_mod_32(b, b, p1024_mod);
  212817. }
  212818. if (err == MP_OKAY) {
  212819. XMEMCPY(ty, b, sizeof(sp_digit) * 32);
  212820. for (i = bits - 2; i >= 0; i--) {
  212821. sp_1024_proj_sqr_32(tx, ty, t);
  212822. if ((e[i / 32] >> (i % 32)) & 1) {
  212823. sp_1024_proj_mul_qx1_32(tx, ty, b, t);
  212824. }
  212825. }
  212826. }
  212827. if (err == MP_OKAY) {
  212828. sp_1024_mont_inv_32(tx, tx, t);
  212829. XMEMSET(tx + 32, 0, sizeof(sp_digit) * 32);
  212830. sp_1024_mont_reduce_32(tx, p1024_mod, p1024_mp_mod);
  212831. XMEMSET(ty + 32, 0, sizeof(sp_digit) * 32);
  212832. sp_1024_mont_reduce_32(ty, p1024_mod, p1024_mp_mod);
  212833. sp_1024_mul_32(r, tx, ty);
  212834. err = sp_1024_mod_32(r, r, p1024_mod);
  212835. }
  212836. if (err == MP_OKAY) {
  212837. err = sp_1024_to_mp(r, res);
  212838. }
  212839. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  212840. !defined(WOLFSSL_SP_NO_MALLOC)
  212841. if (td != NULL) {
  212842. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  212843. }
  212844. #endif
  212845. return err;
  212846. }
  212847. #else
  212848. /* Pre-computed table for exponentiating g.
  212849. * Striping: 8 points at a distance of (128 combined for
  212850. * a total of 256 points.
  212851. */
  212852. static const sp_digit sp_1024_g_table[256][32] = {
  212853. { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  212854. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  212855. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  212856. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  212857. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  212858. 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
  212859. 0x00000000, 0x00000000 },
  212860. { 0x335c1685, 0x170a46d2, 0xe1007a58, 0xeac9e971, 0x43ca4a73,
  212861. 0x40e8f3df, 0x82642475, 0x2646f815, 0xb36576d1, 0x3af49bb4,
  212862. 0x72bf1afb, 0xd89e2d14, 0x2fd151e6, 0x27be882c, 0x8f88717c,
  212863. 0xaddedc85, 0x16ac6c6f, 0xd6d859bf, 0x2d8eae58, 0x0e741a1b,
  212864. 0x61c1f30d, 0x6faf7a00, 0x9b67e096, 0x66dbd09a, 0x7d3b4f7d,
  212865. 0x21f11c06, 0xc727c98e, 0x6152ba02, 0xe86cb221, 0xafd58891,
  212866. 0x6bd3baf4, 0x59e93c6a },
  212867. { 0x71dd4594, 0xe54dd36f, 0x00aef1e6, 0xbbc9cc9f, 0xa19f6530,
  212868. 0x9ea5a44e, 0x3f520928, 0x8588aa99, 0x8f5c1418, 0x9753794c,
  212869. 0xc11399fa, 0x118bd792, 0xf5cb6ab5, 0xb9bd3afd, 0x2ecb9652,
  212870. 0x813d1cb2, 0x40389813, 0xfd456267, 0x4ac8431c, 0x51f7119b,
  212871. 0x0a180eb6, 0xdd9f6a91, 0x9f7bfa2e, 0x13946d17, 0x50a9d0d9,
  212872. 0x16f18631, 0x6f8373d3, 0x5f19c20d, 0x9b6a52b9, 0xbe85ac6a,
  212873. 0x74f62e03, 0x63ef187b },
  212874. { 0x016f45e7, 0x7c376b7f, 0x2bec82f8, 0x1c1bdb57, 0xce429b60,
  212875. 0x7392f741, 0xc7afd81d, 0x6fdbf0a2, 0x7241098b, 0xbda41b1f,
  212876. 0xbb60f8cf, 0x5b407474, 0xb330bc4d, 0x933e0d41, 0x733fa3be,
  212877. 0xae182830, 0x0f5c6cd1, 0xa0ed299b, 0x3f9860c8, 0x7ff3354e,
  212878. 0x15559c41, 0xb1360986, 0x129f85cb, 0xab0cb63c, 0x47685fbe,
  212879. 0x682ecc49, 0xeb199633, 0x505e8ec2, 0xddac2cda, 0x90dcc794,
  212880. 0xf192da23, 0x4fe6791c },
  212881. { 0x05e8733c, 0x94a423d5, 0x1d5717c1, 0xcc845e65, 0xe961b322,
  212882. 0x237c7e88, 0xdb4181cc, 0x0c4471c6, 0x713bd721, 0x00c875e2,
  212883. 0xb2c17b09, 0x9dfde9ed, 0xe88ceaf6, 0x430a6de5, 0x7b81cea6,
  212884. 0xaaa7a61a, 0x233f98d5, 0xea52d026, 0x60689a9a, 0xb55efdd0,
  212885. 0x5cac4aab, 0x30cfa7ce, 0x8e950761, 0xfa4db114, 0x4e9a1e52,
  212886. 0x309570c4, 0x1a040170, 0x18c21f61, 0xbe78d9d2, 0x555d1ffe,
  212887. 0x561db297, 0x04482a18 },
  212888. { 0x73d486d8, 0xe7758ac2, 0x61cdc1e7, 0x8169f946, 0x2188ab4f,
  212889. 0x723c99fc, 0xf3373630, 0xa0e54f02, 0xbd8c2260, 0x560bee25,
  212890. 0x4531bc60, 0x28fc307c, 0x7e44feb5, 0xd6f21f1a, 0x57128d37,
  212891. 0xc8e4499c, 0xd7b2ea45, 0x963b053e, 0x32a3d222, 0x40c27a04,
  212892. 0x35459668, 0x5b51854d, 0xd73557e9, 0x66e1a49f, 0x8692077a,
  212893. 0x0d267fd9, 0xe7342702, 0xfa1350d3, 0x68ccdb44, 0x1a9c3f25,
  212894. 0xdedbf89f, 0x833a0ff8 },
  212895. { 0xab376b76, 0xa8c419c7, 0x27d0f0cc, 0x3b7294f3, 0xa90c514d,
  212896. 0xe56bb9e2, 0xa62575a6, 0x931ba51e, 0x098c0a88, 0x56fee07b,
  212897. 0xb4c16a2a, 0x04be5aee, 0xe6eb260b, 0xe513350b, 0xa1d5c270,
  212898. 0x339edad6, 0xe9dbadd1, 0xf366ed59, 0x2dd06ec0, 0x4213be88,
  212899. 0xcb1187db, 0x22d639c8, 0xd8a1058a, 0x1fec95e1, 0xa2b744f1,
  212900. 0x03f73ea6, 0xf4f05c0c, 0x741fd51a, 0x85f811a0, 0x2e2df95a,
  212901. 0xeb24965f, 0x692b3ce3 },
  212902. { 0xd2a127b4, 0x0ce6cb72, 0x8f92816f, 0x66a46ea5, 0x47a37616,
  212903. 0x43ecf463, 0xe0ab96ee, 0x163d9a01, 0xb2edbe8c, 0xc8145c6d,
  212904. 0x4de4e665, 0x2f426cae, 0x74e252f9, 0x174d0b40, 0x7d2af831,
  212905. 0x54c240d7, 0x3d652936, 0x581fa397, 0xa09d4695, 0x05b9491c,
  212906. 0x5452643c, 0x8c4e8533, 0xd4128327, 0x32d64331, 0x70361f25,
  212907. 0x64479038, 0x89ef09f2, 0x774191b1, 0x81de5fe0, 0xc0cf0aaf,
  212908. 0xf40042d6, 0x333e430a },
  212909. { 0xcf26d3b7, 0x5df04de4, 0xb53f79be, 0x57a77306, 0x1808b664,
  212910. 0xa4013c5f, 0x85037360, 0xef291ea4, 0x0b061037, 0x1ffc9d7d,
  212911. 0x65c913bb, 0xd9d04dd9, 0xf13b8587, 0x948a37af, 0xfe3ee755,
  212912. 0xb5443483, 0x04631386, 0x3fc21e74, 0xcddeb58c, 0xb3a104e5,
  212913. 0x6572cd52, 0x94fe1862, 0x15aaa408, 0xeb9a71a1, 0x459ea462,
  212914. 0x8adc6fe5, 0x4aeb02a3, 0xbb18d175, 0x2f7791d1, 0xae127636,
  212915. 0xd6bbd708, 0x10e8b31d },
  212916. { 0x3ed9f1af, 0xb87f03e5, 0x56676166, 0x03ad2477, 0x74ce15b8,
  212917. 0x38dcd630, 0x26b1e85b, 0x1877e2b0, 0x1af99c15, 0xb1654d17,
  212918. 0x9382547a, 0x9782e9e4, 0x26d55ef5, 0x6dc7fc7c, 0x2fbeb54c,
  212919. 0x9038f95d, 0x036c0357, 0xfe590dfe, 0x4fdc3f7f, 0xcfcb6eae,
  212920. 0xf35e1a88, 0xcb1fbc54, 0xda0a5568, 0x3c8e1db2, 0x5b6f5557,
  212921. 0x9a87393f, 0xe7ac0a06, 0x38646b32, 0x2a8495ab, 0xfd261c83,
  212922. 0x0cdcc4bc, 0x6485524c },
  212923. { 0xc4a6ff2a, 0x1abfb3e2, 0x35a6428a, 0x2aa03fba, 0x89aff742,
  212924. 0x884227f0, 0xba5dbd93, 0x2337883a, 0xd2a182cb, 0x38186ae9,
  212925. 0x49a01f05, 0xb9f0764d, 0x917b1e7a, 0x92411feb, 0x570cbb5b,
  212926. 0x700b1903, 0xb914be7c, 0x5d5181d5, 0x1981182d, 0x135c4437,
  212927. 0x574b9997, 0x32758d24, 0x632d28b2, 0xa650a8f5, 0xfa383f09,
  212928. 0x24078bac, 0x00a33d80, 0x6546a60c, 0x2df8b449, 0xa4061c7a,
  212929. 0xf234563c, 0x1f76f3f2 },
  212930. { 0x44c436b0, 0x9aa2c143, 0x1f69c87a, 0x79070556, 0x5f6db2df,
  212931. 0x35f3117b, 0xed56ba82, 0x85761f41, 0x7d0afa48, 0xf831464f,
  212932. 0x3adce71e, 0xa99f2915, 0x116b7488, 0xb27bf693, 0x9bb9443a,
  212933. 0xa98a5a8c, 0x2ee5fde8, 0x7f878026, 0x1812acb7, 0x3a6f93dd,
  212934. 0xdc84bc92, 0xaf92a4cc, 0xf1d4995a, 0x3c2562af, 0x04ed899d,
  212935. 0xfd9fc33c, 0x4ed2a538, 0xc028ca94, 0x049ea726, 0xd0f367bb,
  212936. 0x3d108e05, 0x04924ffb },
  212937. { 0xc673562f, 0x06548e3d, 0xe2eae48c, 0xd3b33025, 0x5e1c6977,
  212938. 0xe61fd32b, 0x6ebe557b, 0x424e2064, 0x41d6e18e, 0x767391c0,
  212939. 0x14d7e95b, 0x4b8ebb8e, 0x20991b8c, 0x4ae8b7d4, 0xe01290d3,
  212940. 0xf8a0df66, 0x925e5f4e, 0xc97e24a3, 0x1508272a, 0x79a7b2cb,
  212941. 0x25072661, 0xb40b072e, 0x9062fa49, 0xdad9e182, 0xf3c53bce,
  212942. 0x8780a784, 0x9f142799, 0x58a82b76, 0xc1468426, 0x08cd849c,
  212943. 0xc380ae35, 0x4dfce809 },
  212944. { 0xd527b780, 0x45069cb2, 0x977930dd, 0xd52da015, 0xe27d0263,
  212945. 0x10cc600b, 0xbb2d1b2b, 0x34102c26, 0x554adf3c, 0x4c652623,
  212946. 0x45f0ff47, 0xd6891382, 0xca916e7c, 0x83fa8cc5, 0xd15c8d8a,
  212947. 0x1e10f139, 0x81dc56b3, 0xf173dc2e, 0x5c4ed9ba, 0x7fcecb04,
  212948. 0x47d01228, 0x307fd7d8, 0x9f3a532f, 0x24a57153, 0xe2153c22,
  212949. 0x59e9e81d, 0xe428a408, 0xc562595d, 0x9339bd23, 0xdc7daff8,
  212950. 0xb8a06802, 0x0d075908 },
  212951. { 0xde085f2a, 0x870af2a7, 0xbe99b2e5, 0x88fcd24f, 0x59ca413b,
  212952. 0x88c0d261, 0x8559f851, 0x1f02a2e4, 0xf622da0d, 0x83b96021,
  212953. 0x6dca3615, 0x5c05c2f5, 0x7910c682, 0x0148cf1c, 0x272695be,
  212954. 0x392f2896, 0xa8d64ef6, 0x883d0bb5, 0x1cfcbc52, 0xef0d2244,
  212955. 0x526117e5, 0xf5dafcec, 0xf04928e9, 0xb68612b9, 0x393f2e2a,
  212956. 0x283f744d, 0x700c1151, 0xfbeed7ed, 0xa4360dfe, 0xf2cde215,
  212957. 0x2f08535a, 0x24fa961c },
  212958. { 0x616df7f6, 0x0767db3f, 0xfbd90326, 0x643057d8, 0x6e82d544,
  212959. 0x174daa90, 0x689643db, 0x2284f345, 0xcc89a060, 0x18b191df,
  212960. 0xd6c27d12, 0xbab46af4, 0xc9895145, 0x5a57f486, 0xcc942f9e,
  212961. 0xc03214e9, 0x41950158, 0x273e1c8f, 0x39ad43ab, 0x8ceb759f,
  212962. 0xe50ee173, 0x5e1b8b7f, 0x8f4d7d4e, 0xf635b1fc, 0x755603f3,
  212963. 0x8eff77e3, 0x7752fa60, 0x201f61d1, 0x4a6fb6e1, 0x94d7a03d,
  212964. 0xfc4f0114, 0x371cc23d },
  212965. { 0xda90c351, 0x289b115d, 0x364d9c06, 0x6d196ebf, 0xf650b31b,
  212966. 0x77a89202, 0x6f57642f, 0xcc28c164, 0x08100127, 0xdc4f7e36,
  212967. 0xdc4c807b, 0x8836cd08, 0xe00240f2, 0x1280f156, 0x99cb3953,
  212968. 0x3f9a6d78, 0x3a802038, 0x40a494d3, 0xe87d3474, 0x45697e91,
  212969. 0x26dde24a, 0x70d97d07, 0x7640c30e, 0x06f6a58d, 0x5ba6e6c6,
  212970. 0x03c2c0e8, 0xf1bc13e8, 0x330f6a7a, 0xc9f4d78f, 0x3e602e4f,
  212971. 0x0c80fb7f, 0x92b6bca0 },
  212972. { 0x5f00822e, 0x2e3d5c83, 0xb8b16f12, 0x0e825712, 0x92b0a330,
  212973. 0x81c329c4, 0xa7cc1954, 0x6b4e32ad, 0x1bb1413f, 0x0bee9cee,
  212974. 0x4a92ca27, 0xedfb7baa, 0xea3b9153, 0xcd472afa, 0x00f0c0f9,
  212975. 0xe8f09e7e, 0x5cdebb70, 0xa4e1d872, 0x4a9b63b6, 0xfe2bae08,
  212976. 0x3fd58f65, 0xf40141b8, 0xa3b62759, 0xd7ec5eda, 0x790e3088,
  212977. 0x9aaf6e67, 0x1f277e31, 0x215ad830, 0xcf33871c, 0xe7db4b98,
  212978. 0x4f02f89d, 0x71ff62c9 },
  212979. { 0x2a4a84d9, 0xaa4c7102, 0x5ebc71e6, 0xe2ee4acd, 0xf1cd6578,
  212980. 0x3b11a8a5, 0xfff120a5, 0x83f5ef9f, 0x09e65033, 0xa4c598e1,
  212981. 0xca044180, 0xe1e9f990, 0xf59828c1, 0x8b832d46, 0x33af536b,
  212982. 0x753f28a0, 0xb6d4f68a, 0x92edc4b1, 0x72ccd1f0, 0xedde692a,
  212983. 0xd2226432, 0xd3aa0f7d, 0xa3d2661c, 0x38dbb63e, 0xfdc37dda,
  212984. 0xf1e19fc6, 0x84ef6b4c, 0x6c18b350, 0xdf1bba69, 0xe6a83fe9,
  212985. 0x5f958273, 0x40fd47e7 },
  212986. { 0x267140a4, 0x5b88b746, 0xeab6f2fb, 0x6dbbfc1e, 0x69862548,
  212987. 0xdd9ec88e, 0x2eb6efc2, 0x69beeba1, 0x8ac8ff88, 0xcfc2214a,
  212988. 0xb5a21950, 0x95d5c96e, 0x4171fb69, 0x93389c05, 0x1b468337,
  212989. 0x2d85d452, 0x4113425c, 0x14d68a08, 0xec6c2174, 0xe52c0139,
  212990. 0xf730084d, 0x20cf0b97, 0x1f578aa3, 0x1ac16a26, 0xf9b6ae43,
  212991. 0x18b9fab3, 0xd854a695, 0x68d82111, 0xdffbe286, 0x0b334d98,
  212992. 0xe639338c, 0x5b1c1157 },
  212993. { 0x72b6bb8f, 0x90edaab1, 0x02fc92c2, 0x8dc64ed2, 0xfe694c73,
  212994. 0xf42ba3c5, 0xcb54dce4, 0x316dc65f, 0x632420dc, 0xcb2d66a3,
  212995. 0x056dcf94, 0x16e706e7, 0xa4f32c9d, 0x2809c764, 0xea6edca8,
  212996. 0xab18d830, 0x81c65f57, 0x4fd1ace6, 0x7da12c10, 0x1f91651c,
  212997. 0xc7791a48, 0x0ac3bd66, 0x785e67a3, 0xb6ad1cf4, 0xda0fd591,
  212998. 0xe4d3fc44, 0x6e1c6344, 0xce164801, 0x33e50ab3, 0x84de9cb8,
  212999. 0xa756eef4, 0x963ab83a },
  213000. { 0xdf4ea5a3, 0x944b47d8, 0x5cfe45fe, 0x96568815, 0x8a3c3564,
  213001. 0xd16e7d58, 0xe7c99e15, 0x84e55b3e, 0xf55071bc, 0x3fee204d,
  213002. 0x04057dce, 0x71006f29, 0xbba75570, 0xfe8c390d, 0x3319adac,
  213003. 0x3645bcb6, 0x7c20bfd8, 0x8189e8b0, 0x7d7d9578, 0x8e550969,
  213004. 0xb99f4e3b, 0x037d1321, 0xa60cfb6a, 0x011b2521, 0x837382da,
  213005. 0x66594aaa, 0x83c1dc07, 0xc89b91fd, 0x076b9884, 0x6b82b899,
  213006. 0xbe45c558, 0x443480fc },
  213007. { 0x9114221a, 0xf8ffffb4, 0x3e857a7a, 0x4aec4f2e, 0x0fa54787,
  213008. 0x42e2d0e4, 0xd6f96152, 0xef3e6b31, 0xfbfe9b77, 0xb2296537,
  213009. 0xfb43a86a, 0xc2a9d0f2, 0x24572ac6, 0x241284ed, 0xe721ba7b,
  213010. 0xa3868917, 0xc117a78d, 0xdbef7c00, 0xd31605ac, 0x38149071,
  213011. 0x065a8ee9, 0xc2dada9e, 0xc442be82, 0xd5b138d8, 0xf6d72b58,
  213012. 0x9b6c224b, 0x8eb03e6d, 0xb9d355cf, 0xa1700371, 0xab6d1eb0,
  213013. 0xcffaa7eb, 0x97118a88 },
  213014. { 0xcdecb5d8, 0xbf9c59a2, 0xa93a6866, 0x8083c81b, 0x04774fbf,
  213015. 0x24e0dd81, 0xa02070b4, 0xe779a3ca, 0x0fbfb781, 0x9d352fbb,
  213016. 0x3ef2a1c4, 0xa8b0d820, 0x14b3e501, 0xb858637b, 0x8a882ff2,
  213017. 0x5ba70a49, 0x3b06efa5, 0xa2730083, 0x102fee2a, 0xa42c02f4,
  213018. 0x8a0223a5, 0xe4e76299, 0x85c3fc72, 0xdba2ba26, 0xfe52eae7,
  213019. 0x554fe763, 0x270f45f6, 0x30b5405a, 0xa573387c, 0xd56a177a,
  213020. 0x4b71fa82, 0x17c0778d },
  213021. { 0x2735e37b, 0x0e6dff1d, 0x656ec572, 0xc9884e56, 0x9ebba978,
  213022. 0xa2f5ac9d, 0xba09f3c4, 0x40fa4518, 0xf5b04377, 0x8c3fa177,
  213023. 0x967a2eca, 0xa1a1decd, 0x0528bd40, 0x768bca70, 0x18691c4a,
  213024. 0xf224952b, 0xe86d5fd5, 0x16e12c45, 0x37859a6a, 0x7a0d9157,
  213025. 0xa0ffce0e, 0x723f4309, 0xa96cc9a3, 0x5a8db79b, 0x1ad23a38,
  213026. 0x6dd12ae0, 0xe2bf5d84, 0x9ffec3a1, 0xa452ed66, 0xd6ce84e1,
  213027. 0x571fe4c6, 0x1219d5c8 },
  213028. { 0x262969eb, 0x43eaa67f, 0x2f03e773, 0x3a3ab39d, 0x57bb0909,
  213029. 0xe6127e51, 0x8d150274, 0x0f82b0ed, 0xe580bdbd, 0xffffcad8,
  213030. 0xa9743e6b, 0x51d3d075, 0x8bac11d6, 0x1484bdb1, 0xeb24c388,
  213031. 0x95cd9990, 0x7fac67c6, 0x216a61d0, 0xa04e6b87, 0x4308f762,
  213032. 0xcba57cc8, 0x2865dd61, 0xd234a07a, 0x3c296b0d, 0x3a0793f9,
  213033. 0x76f92839, 0x0be29ece, 0x70b57e1f, 0x7e626f42, 0x1314a82f,
  213034. 0xd657f230, 0x2c8d7ab2 },
  213035. { 0x0825e4d6, 0x67cf5892, 0x6ef83b44, 0xdf51eaa5, 0x1310108d,
  213036. 0x63e665d8, 0x8dd0963f, 0x229f89f5, 0x9df6436a, 0x8c4b14dd,
  213037. 0xd45ebba7, 0x99dae469, 0x5a4df381, 0x118aab77, 0x29e37feb,
  213038. 0xda8978bd, 0xaca2d7ef, 0x69ced5aa, 0xc67d6a8a, 0x6c98d05d,
  213039. 0x77f84a34, 0x7474bf0d, 0xed8cd59a, 0xd4428b2e, 0xd1d398fb,
  213040. 0xb0fd1cd5, 0x94a20b11, 0x596013db, 0x1b404c44, 0x96eb705a,
  213041. 0x4b09d958, 0x2299d277 },
  213042. { 0xc64397e6, 0x5b9cd58d, 0xbf6dd31e, 0xac198f1e, 0x3e9f1db2,
  213043. 0x5866d8e1, 0x8fcdc68c, 0x405ae287, 0xe53c01fd, 0xa4b280cd,
  213044. 0x411db5f6, 0xdc963f2d, 0xbec4f8a0, 0xed5d5189, 0x916ee98b,
  213045. 0x336fd13d, 0x042df48e, 0x6925b1b3, 0xace0074e, 0x0cf56291,
  213046. 0x25317e95, 0xe8d38b48, 0x821c446b, 0xc7ad1d2b, 0xf0b65934,
  213047. 0x71c44135, 0x52ca0d50, 0x971b736f, 0x27b46c26, 0xaf9ffa57,
  213048. 0x1936618e, 0x21ac6779 },
  213049. { 0x2d7fbcd2, 0xab420e3f, 0x97bdfc18, 0x12722473, 0x4df5d4b4,
  213050. 0x492033f8, 0x3807b7d3, 0x6fcd4236, 0xb33c3625, 0xdfc19b09,
  213051. 0xa0f22814, 0x13d6f375, 0x037c19b8, 0x70978a59, 0x0ff27b9c,
  213052. 0x4f398997, 0x615a4389, 0xfc0e1a45, 0x3e602f74, 0xffa3496a,
  213053. 0xb261ca1c, 0xc3f1c431, 0xee0164cd, 0x612211db, 0xe7f7be9f,
  213054. 0x30463ee4, 0x92c2e1bb, 0x015f7e78, 0x24483a56, 0x663d88d6,
  213055. 0x0e62d9d8, 0x0e8ec1e7 },
  213056. { 0x8a0878dd, 0xa88ccc29, 0x6640071a, 0x99ac175d, 0xa5173617,
  213057. 0x90344820, 0xdd58a315, 0x316d023e, 0x88d221a1, 0x30785bd4,
  213058. 0x959c48e3, 0xb74b3de7, 0x4c67a771, 0x42ee0382, 0xe0b91453,
  213059. 0x59ef6cdd, 0x9b237e91, 0x7830ae28, 0x495d8325, 0xe1847a4c,
  213060. 0xd0773666, 0x67b1217e, 0xa294a325, 0x58192c86, 0x864d8326,
  213061. 0x76aa0f56, 0xf4b13e5b, 0xe2a2bd12, 0x1b6b73fd, 0xd850c1c0,
  213062. 0x5d103635, 0x653a795f },
  213063. { 0x50dcb199, 0xcfe28985, 0x7fa02b60, 0xb35b8e5e, 0xc97603d0,
  213064. 0xbca7d7c3, 0x27f131b5, 0xb0e5288d, 0xe2b12d52, 0x3aa704de,
  213065. 0x1db725c7, 0xe206b1d8, 0xc5d1b113, 0x0b12839a, 0xdb45d763,
  213066. 0x14f970cb, 0xb2125e8e, 0xc997f93e, 0xee7daa26, 0xbd75739c,
  213067. 0x1fef20e9, 0x46ecbd3f, 0x7c6a42b1, 0xf994a114, 0x27fb0fd1,
  213068. 0xd289eb4f, 0x9a40da4b, 0x11186d31, 0xfb9d7976, 0x083f65a5,
  213069. 0xd444675e, 0x30dfc47b },
  213070. { 0x9eaadfe8, 0xbcfc5ae2, 0xb4d4e812, 0x25027e54, 0x8b533561,
  213071. 0xab0702df, 0x56a6a214, 0xa2b9c204, 0x3059068e, 0xb1a3df7a,
  213072. 0x9883110f, 0xa3514b21, 0xc4b78e1c, 0xb7be2336, 0x3e2f6984,
  213073. 0x17073ce6, 0x2ddf7ac6, 0x86e114a6, 0x07d7c3c8, 0x276192bf,
  213074. 0xeb1ae289, 0x5da69e0b, 0x25184939, 0x983af175, 0x407a3aa0,
  213075. 0x9ac52a4d, 0xae0fe218, 0x1535c7da, 0x397f2501, 0xe16fe872,
  213076. 0x54c212cf, 0x572a591f },
  213077. { 0x09a5553a, 0x49668419, 0x327733bc, 0x3f054318, 0x3eefd690,
  213078. 0xf9ceb4b2, 0xf22126d4, 0xbd3cbf9b, 0x2fed9578, 0x6d9671c0,
  213079. 0xca0306d8, 0xbba597ce, 0x3d674fe5, 0xb705ed61, 0x67f33f76,
  213080. 0xf1d3622b, 0x11cb8c31, 0x15bcf3c6, 0xe53d1aa9, 0xa38467dc,
  213081. 0xf908ab43, 0x902fe929, 0x8d15767a, 0x6e3e499d, 0x90afd07b,
  213082. 0x8142db5c, 0x6c8b190e, 0x120c6fbc, 0x24919a4e, 0x80c86553,
  213083. 0xd8c82c3c, 0x65c2cbe1 },
  213084. { 0xa660bb63, 0x684cda20, 0x86e86245, 0x27dc3b0a, 0x6ba0eed7,
  213085. 0x76472cf6, 0x679dd158, 0x79c162e5, 0x08452d44, 0xb6884277,
  213086. 0x413f579e, 0x829bc6b3, 0x95011770, 0x92ea15ec, 0x47738183,
  213087. 0x5e34e300, 0x73e1d2f1, 0x8c3ca349, 0x229bd3de, 0xa5c4f1dc,
  213088. 0x94ef7ed3, 0x783eff1b, 0xdfae7a1a, 0x46db738d, 0x1a099852,
  213089. 0x4353d72e, 0xa0dcf4ab, 0x2533ad58, 0x0e7888b9, 0xd8055016,
  213090. 0x3ba77f66, 0x831440d5 },
  213091. { 0xf611b2da, 0xf43e2e32, 0xd0fa46ac, 0x5d066e29, 0x820b3c0d,
  213092. 0xe897f3e8, 0x1d3e44f0, 0xc45c28e6, 0xdfd27a66, 0x929d7f66,
  213093. 0x101e8517, 0x735b860a, 0x3de078dd, 0xea3fce98, 0x638ce11a,
  213094. 0xc9977db5, 0x48536b3b, 0x0488382f, 0x64cadfc6, 0x7e0c7a3c,
  213095. 0x82147b71, 0x3cd17f7f, 0x1b411e3e, 0xe95663cc, 0x985fb46d,
  213096. 0x5739ac8f, 0xbcf119ca, 0x385399cd, 0xe15a2815, 0x4a985a70,
  213097. 0x6d5f4566, 0x504c3a8a },
  213098. { 0xb8fa53c7, 0x00b55283, 0x509474e3, 0x985cff38, 0x437ce25f,
  213099. 0x234d241c, 0xe5a129ed, 0x29832430, 0xaabcc674, 0x6ad38956,
  213100. 0x7ee81ee1, 0xa2dc001d, 0x670b2702, 0x4c23c6b6, 0xa6e8a3bb,
  213101. 0xb35e567e, 0xa69673ea, 0xbc70b3ce, 0xe6e28eac, 0x85a7a9c3,
  213102. 0x5537b7da, 0x2ae684de, 0x6de937dc, 0x5ecac3e5, 0xf8430422,
  213103. 0xbf2ea6c9, 0x77fdc520, 0x38caf7d0, 0x69f56add, 0xc27af0b1,
  213104. 0xc71d21d2, 0x496e4699 },
  213105. { 0x9fa93467, 0xba14fc82, 0x0eb2a614, 0xc2e37684, 0x4833e09b,
  213106. 0x659bcfaf, 0x3686bdcc, 0xbc859752, 0x81f3216a, 0x40bfd080,
  213107. 0x17c081b8, 0xc463bda6, 0xbb04793b, 0xbd01fa86, 0x2cd640c5,
  213108. 0x5a21ece6, 0x2203d5c4, 0x97bf6a54, 0x951167b7, 0xceb40edc,
  213109. 0x765ba268, 0xd67aacaf, 0xaeab51f9, 0x8ba0d9e9, 0xb0d6863a,
  213110. 0xc14b215e, 0xe5f06952, 0x354cdcdb, 0xcb3744b5, 0x4f2b5ccf,
  213111. 0x13037fe8, 0x13389173 },
  213112. { 0x45003cd1, 0xee680640, 0x44ae2ac6, 0xfdac17bc, 0xde8e5314,
  213113. 0x4bcd419f, 0xc7cea95c, 0x81e34eb9, 0x38f37e01, 0xbb57762d,
  213114. 0x260990c8, 0xecc4cfb0, 0x50a34a7b, 0x0bc493f9, 0x543304ef,
  213115. 0x68074172, 0x6bc8aa2a, 0xaec0fcb2, 0x3b45fea5, 0x9e7a9b46,
  213116. 0x55fbdbac, 0x4bb2952e, 0x0485dff4, 0x50f0c0a6, 0x4dea4796,
  213117. 0x02c5104d, 0x695e3a02, 0xd2cefa09, 0x6da1f345, 0x4c8102b4,
  213118. 0xf3833fbd, 0x422eb573 },
  213119. { 0xa6ad3f47, 0xac592eb6, 0x9714ba0e, 0xb0861f6d, 0x07281459,
  213120. 0x57c1e919, 0x64ea5803, 0xcf7c94e2, 0x54b12723, 0x725376ac,
  213121. 0xdafb736a, 0xf2a6ba41, 0xcba03cdc, 0xc89e8920, 0x5b0fd3ad,
  213122. 0xf2e20cb4, 0xd66059fe, 0x26ea5a54, 0x889df8bc, 0xee63fa8b,
  213123. 0x66a3f2bf, 0x40f1c7e1, 0x747312e1, 0x09febc9c, 0x727999ff,
  213124. 0x7d19b9c2, 0xb7fd2b05, 0xa9fbbb4c, 0xa0da2dc6, 0xcfba27d7,
  213125. 0x2c252582, 0x368541cf },
  213126. { 0x22799d37, 0x510d3c9e, 0xacfa333a, 0x1b677de5, 0x080f795b,
  213127. 0x4e6ae18f, 0xafc8dfc2, 0x69b53c2a, 0x0e842dc2, 0x797541b6,
  213128. 0xac067fe8, 0xd5a6f2af, 0xbd07d877, 0xd0208a03, 0x654be2f2,
  213129. 0x34b473f0, 0xf515e23e, 0xe67c102a, 0x2ac1af48, 0xb00dbf9d,
  213130. 0xb6a13d00, 0xe264fa41, 0x97e94c11, 0x1669786a, 0x86a586f4,
  213131. 0x09d8cf2d, 0xc7f927e9, 0x073bf869, 0x2241a566, 0xb8977880,
  213132. 0x22261334, 0x59a5bf59 },
  213133. { 0x81347191, 0xe9d1c91e, 0xeb969972, 0x186c1abc, 0xa9d46a7f,
  213134. 0x07888767, 0xdaa7d397, 0xda93cfcc, 0xd91b9aa0, 0x08bee9f1,
  213135. 0xf8dd3c6c, 0x8267fd78, 0x94228100, 0xf93860d0, 0xdadb47fb,
  213136. 0x6a6a71aa, 0xa6156f8a, 0x9caa06b7, 0x39848bc9, 0xaa1b05e0,
  213137. 0x2aaa9135, 0x36ddc237, 0xb13f3bd1, 0x77e7e079, 0x4acc5f4d,
  213138. 0x8d0b5cbe, 0x984cfd36, 0x04da45f8, 0xd3d3e0f8, 0xf14ef618,
  213139. 0x43eb799c, 0x467564c1 },
  213140. { 0xb6fff5d7, 0x8d725904, 0x92dc4752, 0x037f33af, 0x6d20b8aa,
  213141. 0x9095d575, 0x43baec39, 0x32235fc1, 0x68a2b9b0, 0xa2feb4af,
  213142. 0x94d35c61, 0x61c50318, 0xea877486, 0xac92b6a2, 0x011bc6f3,
  213143. 0x8eb48b15, 0xc79edcb2, 0xa28fe128, 0xa5d2a006, 0x9f71bc0c,
  213144. 0x2f15b850, 0xf3167732, 0x7a036218, 0xfe8d728c, 0x4f81e09e,
  213145. 0x068f39cb, 0x7b7c50d9, 0x1773f016, 0xed6a1e03, 0x0d0f7adb,
  213146. 0x4ee984d5, 0x8a0dee16 },
  213147. { 0x47366e6f, 0x504991bf, 0xe86c3005, 0xb8084d9f, 0xa40cce36,
  213148. 0x14c4c751, 0x3f1961e2, 0xbbb46aa6, 0x40445e43, 0x56a785f9,
  213149. 0xc91e215f, 0xdb8d1b57, 0xc7ee808d, 0x6a8e453e, 0xbbaa1e8c,
  213150. 0xc0367ef8, 0xe3e18109, 0x310d91f1, 0x7e20a2c3, 0xf97cfd0e,
  213151. 0x554cc277, 0xf1e80c84, 0x7b628403, 0xe89bbc1d, 0x3fe0a17c,
  213152. 0x7778a966, 0xc1f00073, 0x9e9db19f, 0xb6f6bed2, 0x2ce7fe7d,
  213153. 0xee97ce23, 0x7b04b5d2 },
  213154. { 0x82c5faf8, 0x5b546bc7, 0x8eb81097, 0x1a734c5e, 0xe77851e0,
  213155. 0x3d566861, 0xe956d51f, 0x833a1013, 0xc3c3c37c, 0xc7351731,
  213156. 0xe0c148ec, 0x607738fb, 0xe1bbef41, 0x2ec6f0bb, 0xcfa51857,
  213157. 0x0aa2ac6e, 0x66e3adf0, 0x072902d7, 0xc622d6e3, 0xcd4d5089,
  213158. 0xa6dd802f, 0x3ae21b23, 0x33886372, 0xe5465a55, 0xa8d81822,
  213159. 0xd85119a0, 0x3786977a, 0x4f14d032, 0x9c7b272c, 0x515b081c,
  213160. 0xc99be31c, 0x1c6a95a4 },
  213161. { 0xc2821363, 0xa6b14ad5, 0x4d17de1c, 0x829c1823, 0xccade848,
  213162. 0xaef5d2c4, 0x82489e27, 0xf412ab39, 0xf081d927, 0x92c9c098,
  213163. 0x75cbad1f, 0x6f87bdf4, 0x1a1d9fb1, 0xf4aadab8, 0xb75f3b76,
  213164. 0x475a7923, 0xdbbba8fe, 0x99dd0ad6, 0x4b70ab45, 0x836f6164,
  213165. 0x34bd9af1, 0x2a464881, 0xba9abda3, 0x5c91226e, 0xe65625fb,
  213166. 0x4cec8709, 0x0818e4be, 0xd4b3919e, 0x14f6879c, 0xa5c09c84,
  213167. 0x30a864c9, 0x72708a02 },
  213168. { 0xf34a466c, 0x4f33c0b1, 0x7f9d45ba, 0xa1bae09c, 0x0e28785c,
  213169. 0xd70f0fee, 0x90880881, 0x824c7146, 0xbb043da3, 0xe2416c2a,
  213170. 0xcec6f432, 0x733da713, 0xc9793e1c, 0x2b590649, 0xb35c9365,
  213171. 0xdb62d5b0, 0x3e5c1b2a, 0x355eb6e2, 0xbb16b515, 0xcfe8b5ce,
  213172. 0xf709691c, 0x9e081869, 0x61a85bd5, 0xc865f9fb, 0xfae103f7,
  213173. 0xf169d3cc, 0x73467e9d, 0x9525c473, 0x43695113, 0x7db55c0b,
  213174. 0x73265d21, 0x7491c74c },
  213175. { 0x80d2b94d, 0x312ed5bf, 0xba4b260b, 0x1b8ac633, 0xd62219a1,
  213176. 0xac86c58c, 0xaeb82c8e, 0x317ccf6b, 0x59ef9ced, 0x2dfb29ee,
  213177. 0xe42bcd5a, 0xdaa7d898, 0x5974b201, 0x93e295c8, 0xd9fc5adc,
  213178. 0x69e75784, 0x012aa3ba, 0xd6c4709f, 0xc85d3cb9, 0x1fda9f37,
  213179. 0xd3dd4abd, 0xe5487e25, 0x0b3ba22e, 0x00fd4b01, 0xc6e8dcbb,
  213180. 0xcb591493, 0xbce68664, 0xb7329fab, 0x68906b76, 0x6829d1c2,
  213181. 0x74176841, 0x8bcfd3e5 },
  213182. { 0xd3c8c314, 0x06882734, 0x11870833, 0x95f0b2f1, 0xc068ba16,
  213183. 0xb937f7c3, 0x77924787, 0x5365e0d8, 0x1f992227, 0x15527e5e,
  213184. 0x27dffd4f, 0x0a069648, 0x2f586389, 0xd58b3df2, 0x6af20ead,
  213185. 0x83446b89, 0x50746257, 0x09d7970b, 0x4022a691, 0xd9e8d206,
  213186. 0x671ec379, 0xd1e5f8af, 0x057fe91e, 0x6f542509, 0x52890418,
  213187. 0xf14dda81, 0x1db932ad, 0xbd78010e, 0x905a9378, 0x3e18d1e4,
  213188. 0xbd37ab49, 0x53cadcf7 },
  213189. { 0x5e53d0ff, 0x1bb5edf7, 0x888abf67, 0xd886606c, 0x12206d15,
  213190. 0x6491b0f8, 0xe22b6a33, 0xb3018345, 0xb173b317, 0xaba6794b,
  213191. 0x7dc9e595, 0x8c1e5867, 0x239624d1, 0x4e106482, 0xda55dd53,
  213192. 0x61752e59, 0x9e42879c, 0x018b4eab, 0x491f2bed, 0xcaf6784b,
  213193. 0x1e79429e, 0x3dcdb9d2, 0x10f26224, 0x36941485, 0xa650ec5c,
  213194. 0x106f190a, 0xb69a9760, 0x7542a5ae, 0xc32d1046, 0x69bd75e9,
  213195. 0xbf8c62b1, 0x90849964 },
  213196. { 0x5a93c661, 0xb1390cf6, 0x9db5f056, 0x18486264, 0xa51a1788,
  213197. 0x92a93a9d, 0x6772de9a, 0x1b0cbb8f, 0x7c71487c, 0x6e67febd,
  213198. 0x4e62423e, 0xf9b4382d, 0xbb5a42f8, 0x96fda50e, 0x6089a4f2,
  213199. 0xc921b337, 0x875ec516, 0x49d32d7b, 0xc410124b, 0xbd86d2ca,
  213200. 0xc421fb7a, 0xf6862209, 0xf6b7de33, 0x3e1949ab, 0xe93c9268,
  213201. 0xcdee18f0, 0x08dc4cc0, 0xd4edbd5e, 0x73580d22, 0xc2b75be4,
  213202. 0x468cd7e8, 0x3d7f6ffa },
  213203. { 0xdffbd5d1, 0xea7b290c, 0x970338df, 0x9d759da6, 0x90feedc9,
  213204. 0x56680b08, 0x42dce68e, 0xbc690af5, 0xb2ae4d82, 0x8519df2b,
  213205. 0x7f195b60, 0x5612467f, 0xd83c21f4, 0x659a342c, 0x55651633,
  213206. 0x55771bf5, 0x548ba562, 0x5fc68935, 0x9492f23a, 0xb5419203,
  213207. 0x9c9c6017, 0x567528e3, 0x511e6019, 0x3f064ed4, 0x1d16a555,
  213208. 0x303f9eb9, 0x2254abee, 0x3e18c4fd, 0xfd434e7c, 0x40994d6f,
  213209. 0x6dde74e6, 0x8fb12d3f },
  213210. { 0x293cb7a4, 0x6c6381a2, 0xb87b7e4d, 0x453e09f0, 0x078ac3ef,
  213211. 0x4f212823, 0x578cae91, 0xe89ffad0, 0x716ba4dd, 0x4a2b696a,
  213212. 0xf6f580a0, 0x14681a14, 0x4c2f1307, 0x1358f97b, 0x2932fb89,
  213213. 0x87896996, 0x268a5af7, 0x29dd850a, 0xfe239f83, 0xaf771f6d,
  213214. 0x4f47499d, 0x5f20fd2e, 0x867ca0e9, 0x9b643e77, 0x375981ec,
  213215. 0xe7858ecd, 0x19ab1c97, 0xbe946a59, 0x06ff3453, 0x4f9303a2,
  213216. 0x75d237b1, 0x3fcc6731 },
  213217. { 0xdf21f920, 0x509debd5, 0xc1401b90, 0xfaf70e1f, 0x95a64aaf,
  213218. 0x2429cbfd, 0x2c37a122, 0xf2120855, 0x7deb926b, 0x1d4c93f4,
  213219. 0x9fb3f1dc, 0x12f3e4c0, 0x5b51bc46, 0x56085a59, 0xf10fdbd2,
  213220. 0x2a2f5d62, 0xdf0cb3c2, 0x60dd62cf, 0x6b0f254b, 0x154424a3,
  213221. 0x564612b7, 0xc3a5a05d, 0xa1f5249c, 0xbebe30cf, 0x7e62a188,
  213222. 0x24ec6903, 0xaf429939, 0x75f0fbac, 0xb3fa8685, 0xd41345dc,
  213223. 0xc7151c34, 0x645146fd },
  213224. { 0xba1924f9, 0xecec633a, 0x006326e1, 0xbba6f136, 0x7e50fc17,
  213225. 0x203757ac, 0xef3d8e00, 0xca531919, 0x51dc5a74, 0x9545a6aa,
  213226. 0xd31412b8, 0x6e21d58f, 0x7bb1d000, 0x01bc3005, 0x6ed1a9c3,
  213227. 0xf1789c69, 0x9858fa48, 0x7af2d35f, 0x8197be85, 0x434d09b9,
  213228. 0x29aa265d, 0x1dc07755, 0xc058fa80, 0xcad03be7, 0x54ba14ce,
  213229. 0x92d70a9f, 0x6c050a74, 0x6dc78505, 0x4d005dda, 0x2a7ca4a9,
  213230. 0xabfb9f2e, 0x448d3d72 },
  213231. { 0x29b33989, 0xdc56f145, 0xa9ae815a, 0x868351bc, 0x4b074414,
  213232. 0xb3f45613, 0x3cd9f33b, 0x955ce42a, 0x5ff6e4a3, 0x13ade4ec,
  213233. 0xa50eaa91, 0xd3aac715, 0x5666efdf, 0x0c61ec99, 0xf6a4470a,
  213234. 0x108a28b8, 0xe54844c9, 0x402ef584, 0xd0e2f337, 0xb825b162,
  213235. 0xb46f7cbc, 0x3dcd131f, 0x96f2fd89, 0x208178ec, 0x25928c78,
  213236. 0x4d8c5d67, 0x9963c459, 0x285a33df, 0xd92a309f, 0x72497175,
  213237. 0xcb7019a5, 0x76881479 },
  213238. { 0x91767eed, 0xba43a114, 0x92bf65db, 0x5e11b9ad, 0x03a5e21a,
  213239. 0xe8a22ce0, 0x2a335415, 0x63604421, 0x4a9ead62, 0xc2c563b4,
  213240. 0xa0b2aee5, 0x4bc06264, 0x8bf2e1d7, 0x75b8d575, 0xd08a265d,
  213241. 0x1cff0ee7, 0xb0b712a7, 0x17914e1d, 0x4b18692d, 0xc35925d0,
  213242. 0x56cce815, 0xde253f4c, 0x9fff0e3a, 0xa479241c, 0xddabed19,
  213243. 0x50b9d06e, 0x59fae506, 0x67135260, 0x532ce180, 0xf37600fb,
  213244. 0x5e5a8626, 0x670eb01c },
  213245. { 0x73cdbb43, 0xdf73c0af, 0x7f2431ad, 0xcf08ecc5, 0x2a1a3845,
  213246. 0x91780541, 0x9224ddf1, 0x69a104f2, 0xbeac7eff, 0x4352f38d,
  213247. 0x7c2d1322, 0xfc3b3b4e, 0xb5e4b476, 0xa69e9430, 0x975a46f0,
  213248. 0x7d932340, 0x5d64eece, 0x8093899e, 0xdb2345e9, 0x7b821250,
  213249. 0x7f4b796b, 0x23552932, 0x4bb90b1f, 0x2ee9cc15, 0x9112f7d6,
  213250. 0x1fa9c8f5, 0x1cbaae32, 0x2d0f2f98, 0x0075166a, 0xb77f0366,
  213251. 0x635dff27, 0x504852e7 },
  213252. { 0xa2f392fa, 0x2f0f3ce5, 0xec6c9078, 0x326c076a, 0x84baaaf6,
  213253. 0xad01de92, 0xcbe8e993, 0xb01b16d3, 0x2d950908, 0x71305c24,
  213254. 0x3853af38, 0xc66fd617, 0xd3c429a0, 0x7735140e, 0x1fabf027,
  213255. 0x8a31b12a, 0x058b3177, 0xa0530002, 0xa9c7deb9, 0xabffd9fc,
  213256. 0xe8667d30, 0xd05ef69b, 0xe9a9e13f, 0x2f3a7308, 0xb91eae9c,
  213257. 0x3f4c9a19, 0x618ce6c4, 0x50d0cee7, 0x5240f8b0, 0xfb24dc40,
  213258. 0xf7e90cc4, 0x992fe151 },
  213259. { 0x38f197aa, 0x4454db31, 0x87872f98, 0xa4ded69d, 0x44f0a828,
  213260. 0x97b427b0, 0xa31e48c6, 0x9821e1ae, 0xdd98efec, 0xe38cb09f,
  213261. 0x480cb3ae, 0x20b84fa8, 0x47475573, 0xba5bb4a8, 0xcd50e96b,
  213262. 0xa9be080a, 0xef103550, 0xc4451e9c, 0xc441325c, 0x626ee75f,
  213263. 0x38a5e33d, 0x6eea5e98, 0xa2b0abd2, 0x7321beb9, 0x9b6082a9,
  213264. 0xca92e484, 0x992bcc2a, 0x1dc8168a, 0x9c8eb9fb, 0x134ecf4b,
  213265. 0x4c5b71e0, 0x5a68bfa8 },
  213266. { 0xff0a2bfb, 0xb4ff3b45, 0x5502f8b0, 0xd105fff9, 0x5b1c0c26,
  213267. 0x14de5885, 0x0d3b9d04, 0xed16865b, 0x026d3917, 0x2f5a2453,
  213268. 0xf4db3c0e, 0x6a22f493, 0xe2418f2e, 0x4871548a, 0x509bef61,
  213269. 0x6ab363a8, 0xb8cbbbec, 0x91ca1e3a, 0x4011a396, 0x71e0dc98,
  213270. 0x0d5ca577, 0xff982e0a, 0x81897bc1, 0xeb40b045, 0x085ad5e7,
  213271. 0x4bc24a46, 0xa6337b7c, 0xd15c8fa0, 0xbef1628f, 0x56ce6ef7,
  213272. 0x9f5ef439, 0x78acfdf9 },
  213273. { 0xf8520189, 0x45bf7f15, 0xc77f61c4, 0x954202a0, 0xdfa22e1b,
  213274. 0x39edc6b9, 0x1f4a3487, 0xd2d60267, 0x4814cc52, 0xcd933929,
  213275. 0x05e9f123, 0xde76a124, 0xae36b6f7, 0xe2306ea0, 0xb83a58e0,
  213276. 0x53815218, 0xa041231a, 0x9862bb76, 0xbf31be71, 0xe8da253c,
  213277. 0x37de861f, 0x2dfc5332, 0x90ae4890, 0xf25c93f6, 0x8baa6ed2,
  213278. 0x66bcb8f0, 0x908b4a29, 0x6f10ae0f, 0xb061c949, 0x8cb4b48c,
  213279. 0xd075a366, 0x0ad92d73 },
  213280. { 0xc2ca548a, 0xbfb95fed, 0x80cd89ab, 0x4778c620, 0x3466c280,
  213281. 0xbe99154b, 0xd4be8902, 0xea3be093, 0x13e681ed, 0x847b7995,
  213282. 0x02f40161, 0xf22a8f4b, 0x4aeb7fe8, 0x3ef2cb4d, 0xb3aed5f6,
  213283. 0x9adc5151, 0x98c31163, 0xec1ccfd1, 0xa3d7d88f, 0xdc2ac17b,
  213284. 0x46421097, 0x08fa64d3, 0x94b90bcf, 0x5ebf80b7, 0x0b50a9eb,
  213285. 0x1b78b4ba, 0x279aa66b, 0x1a4fe934, 0x075b3ced, 0x8ef4dcaf,
  213286. 0x70a6e9ae, 0x95bbd8a0 },
  213287. { 0xe614bbd0, 0x59f92495, 0xb823e363, 0x7567a887, 0xfc1bd6a7,
  213288. 0xe247c9ec, 0x8e835c42, 0x2bfaaf47, 0xaade066a, 0x314ef4e0,
  213289. 0x5c16d336, 0x072baa63, 0xe2f0e389, 0xfa429c71, 0xbd07d90f,
  213290. 0xcac1e5d0, 0x514f5c04, 0x69ff35ea, 0xc0554ec1, 0x893053fc,
  213291. 0x2a35947f, 0xab1d86b7, 0x2aebe487, 0xe29fb060, 0xdfb9cf21,
  213292. 0xa0a10d6d, 0xf20dfcf5, 0xad147059, 0xb8867a2a, 0x480dc66f,
  213293. 0xc125a919, 0x375a884f },
  213294. { 0x1217f7ea, 0x178cbe2e, 0x875c6dab, 0x1a161e2a, 0x1bdb1a54,
  213295. 0xf7707ec0, 0xe4fd73ca, 0x678864a0, 0xd13a0d86, 0xbaebc664,
  213296. 0xc8d30668, 0x40325f99, 0x2f1c5950, 0xb93ed9c9, 0x541e0667,
  213297. 0xfdf36763, 0xb91a6763, 0xfd97fbb0, 0x6079c9a0, 0x26aa69ea,
  213298. 0x1eaa8c47, 0xc7303c80, 0xafa63c55, 0xdec75c81, 0x4fd12adb,
  213299. 0x01cdcde2, 0x1968838a, 0x9fe0dda7, 0x38415379, 0x66bb093b,
  213300. 0x08cb84ec, 0x268d818b },
  213301. { 0x41580555, 0x73dae358, 0x473d103b, 0x4fc32e67, 0xbeccc1ab,
  213302. 0x240c1013, 0xb24ee9de, 0xda4099f2, 0x9fa8e066, 0x37b0cb5b,
  213303. 0x6438d7ee, 0xb5ae04e4, 0x2b720140, 0x7f7d3164, 0x339e4a78,
  213304. 0x86ef4edb, 0x3a7d8375, 0xa5e77eed, 0xbd707c2e, 0x883fad37,
  213305. 0x0f979189, 0x816b633a, 0x2e7a208e, 0xe24c028a, 0x4435516a,
  213306. 0x1171fe3c, 0x4f5f2bf5, 0x3eb93b33, 0x01b53a56, 0x8419ed4b,
  213307. 0x056ca44b, 0x8b02735c },
  213308. { 0xe1019195, 0xb89bb464, 0xf3fc28c1, 0x1de4c026, 0x2bfc3b21,
  213309. 0xac120e6e, 0x91bdf92f, 0xec71bc5a, 0x0d995bc9, 0x485d7ab4,
  213310. 0xe6491ffe, 0x97c6768e, 0xafbce265, 0xd9552d19, 0x8e1b76c2,
  213311. 0xbae6c7fe, 0xd7e3ad1b, 0x167d8281, 0x5e989734, 0x3e149af9,
  213312. 0x8a0c8182, 0xd1f0024c, 0xc3006c0d, 0xf571ffdb, 0x58773d4c,
  213313. 0xb32ecf7e, 0xfd3540d8, 0x5822a782, 0x04365042, 0x5ab45c3f,
  213314. 0x4b4d85fe, 0x400e3aa0 },
  213315. { 0x5e46e4a2, 0x47321649, 0x24136074, 0x37a2ed64, 0xc60ec77d,
  213316. 0x659223b1, 0xe5e0ac2e, 0x5e13aac3, 0xc5107ab7, 0xda17c41b,
  213317. 0x73c253db, 0x65b22ec9, 0xa5012296, 0xff3867b8, 0x0621a99b,
  213318. 0xfed660d5, 0xc89fc3f5, 0xa3c28506, 0xf16451a7, 0x3ed350b9,
  213319. 0x67cb586f, 0x27c3e032, 0x967185b1, 0xc807c779, 0x4a13009b,
  213320. 0x09c157d4, 0xadaf1f4d, 0x362f7647, 0xf3a6a198, 0x4a42b9ac,
  213321. 0x8da6e039, 0x131c3da2 },
  213322. { 0xa7da83ba, 0x4a785ff1, 0xd04f4436, 0xf415b425, 0xec03f812,
  213323. 0x7c0899bd, 0x80f5f4a2, 0xc58d411a, 0xfda251b9, 0x3d32d610,
  213324. 0xcd3b2f32, 0x99bb4504, 0xf4c2083c, 0x198c444b, 0x730e83fd,
  213325. 0x60c261af, 0xcb02db90, 0x060ca4df, 0x9df1e7c8, 0x0ff7838b,
  213326. 0xc4c690c9, 0x6b79cf97, 0x5d75f154, 0x131514d7, 0x1cb0e8ff,
  213327. 0xa7c074f1, 0xb2c17615, 0xb920aac1, 0x44aa0ff0, 0xde8098ad,
  213328. 0x34545ce9, 0x71d1a46a },
  213329. { 0xfa1b382e, 0x76178f76, 0x772dda0d, 0xa0d8ecc3, 0xc5d4d130,
  213330. 0xaa5aab2a, 0x8d72622c, 0x27d38ba4, 0xca3bed06, 0xc5410db6,
  213331. 0x793ceccf, 0xf637a588, 0x6e65e3d7, 0x1f65dafd, 0x60a45641,
  213332. 0xc3b44a85, 0x4f78540b, 0x0f47b3a8, 0x5e4d60f6, 0x824fdadd,
  213333. 0x17d3b6d5, 0xd8ccf90c, 0x325fc13a, 0x008eabdf, 0x3648fab9,
  213334. 0x3e90d716, 0x24c52d4b, 0x3964ff3a, 0x533d0acb, 0xb95cc416,
  213335. 0x1167f521, 0x6cd2699f },
  213336. { 0x12f4f3ac, 0x2d8c0b3b, 0x99d1bdfb, 0xb03dcfe2, 0x30f37326,
  213337. 0x540034f8, 0x7c5a8c82, 0x22dd6893, 0xcd8f1442, 0xeb7093d0,
  213338. 0x585742f2, 0x892795a7, 0x087adadd, 0xe15f282c, 0x16ab7b5e,
  213339. 0x7bbdc749, 0xa58acbb4, 0xd30fe40b, 0xe2bac39b, 0x0de417eb,
  213340. 0xc61a04bc, 0x4b4b19a6, 0xf2735569, 0x9338c34d, 0x30ab196f,
  213341. 0xe8f03742, 0x6c88c965, 0xfa2efcb8, 0xc7eeb826, 0x19eee274,
  213342. 0xda345dc2, 0x327c063f },
  213343. { 0x5b47cd53, 0xab399eff, 0x1943aefe, 0xbbe9869d, 0x1402a866,
  213344. 0xe64ecc7b, 0xb1c25a16, 0xc3e7c2aa, 0x022de271, 0xc4216b79,
  213345. 0x366d6a5f, 0xe58dfcc8, 0xda813336, 0xd159509e, 0x130bfb7c,
  213346. 0x370400f2, 0x93b48780, 0x1be4e059, 0x39f3cd22, 0x0623a1fe,
  213347. 0xeecb4f87, 0x72aa22b2, 0x6c27b83b, 0x1af4c496, 0xda5fa5bf,
  213348. 0x7a42a94b, 0x48b01af2, 0x9afba822, 0x3670112c, 0xeb6b9d2a,
  213349. 0xc0df6856, 0x020f19d1 },
  213350. { 0xa4dbba20, 0x37051a86, 0xdb1de5c5, 0xb618ebc6, 0xe6525840,
  213351. 0x9a780a19, 0xd2bccc4d, 0x9440302d, 0x10285a24, 0xe9ff023d,
  213352. 0x3a486268, 0x3b937ee3, 0x4cd61147, 0xe37ee2f2, 0xa3d057cf,
  213353. 0x79fbbfd3, 0xccddefce, 0x5fba16d3, 0x5b231727, 0x916058ec,
  213354. 0x720c3adb, 0x47699ebe, 0x8b4f6bba, 0x26274386, 0xf18a0770,
  213355. 0x54b0092a, 0xacca1160, 0x99d090eb, 0x0c888f60, 0xf757e1ff,
  213356. 0xb0050544, 0x79e72720 },
  213357. { 0x2820a239, 0x632acf25, 0xaae6b310, 0xb1a3974e, 0x48c0a1df,
  213358. 0xd61fd6ba, 0x5a3ee7aa, 0xd2453c39, 0xb980446d, 0x548455a0,
  213359. 0xde16676f, 0x9f29d97b, 0x789375a1, 0xf252ca0c, 0x7743a985,
  213360. 0xe961af3e, 0x66cdbd8d, 0x70c79c56, 0xcbc538f9, 0x14a3854e,
  213361. 0xa126851c, 0x58daa73a, 0x2a9f558c, 0xe9b5bb45, 0xfbd15e05,
  213362. 0x37af7f83, 0x38a1939d, 0xa4487927, 0x9511a056, 0xe428b2b5,
  213363. 0x7015846d, 0x001d3ce3 },
  213364. { 0xe145b1d7, 0xd6be36b9, 0x009c5664, 0xf3e3938a, 0xe7c0f6db,
  213365. 0x2e562e7d, 0xc343f539, 0x951044e6, 0xd90897b1, 0xa5ab62b8,
  213366. 0x512f797c, 0xb1a1f70b, 0x750f28e4, 0x91cdd754, 0xffb8165d,
  213367. 0xb4c80e2f, 0x594d02b3, 0x65ed39c7, 0x56833edc, 0xcc12a49d,
  213368. 0xf3693a18, 0xe73694bc, 0xfcd2c404, 0x34cc134a, 0x11d40194,
  213369. 0x071bd5fc, 0xfc585e46, 0x05759047, 0x790b7a04, 0xb3280360,
  213370. 0x40afc684, 0x4bb8c6fc },
  213371. { 0xfd0f8796, 0x3120e2dd, 0xb133c9de, 0x6968a40d, 0xa9369c6e,
  213372. 0xfea366c0, 0x6007273b, 0x37e5b6d6, 0x8cb81439, 0x39e4ecf0,
  213373. 0x9febc005, 0x487fe9cd, 0x0199b53c, 0xeb8af444, 0x293519eb,
  213374. 0x2f124e3b, 0xc82c9c16, 0x860c218a, 0x709dc590, 0xacd1d6f2,
  213375. 0x36d50529, 0x5696d545, 0x59120bfc, 0xc03f5df9, 0x10ffa690,
  213376. 0x99a3e88d, 0x6c432827, 0xd4f9cfa5, 0x9a135d89, 0x2e8fea9e,
  213377. 0xb6a77e78, 0x3699a881 },
  213378. { 0x1eb1c64d, 0x5bca3372, 0xf1d28154, 0xe9cf3a2d, 0x6537106f,
  213379. 0xb7e2e9b3, 0x4f7cbf4d, 0x06c17151, 0x2058b37f, 0xcbde416e,
  213380. 0x8834e9c5, 0x82c53a7e, 0xe9ac3a75, 0x94dbdfe2, 0xc5e67c02,
  213381. 0x795ec6cb, 0x1426a80d, 0x8c23c25f, 0x6a8d4f9f, 0xee2cd20d,
  213382. 0xd3b7c235, 0x838daa54, 0x3d7a4d52, 0xb9e08ec0, 0x781cb473,
  213383. 0xca9475e9, 0x5ec31caa, 0x7271f39e, 0x82535187, 0x1df08e9f,
  213384. 0x208aff8b, 0x4f3a4b03 },
  213385. { 0x1ed095f8, 0x0f7b8107, 0xda226d4e, 0x23e37fa6, 0xafb36d1d,
  213386. 0x8b0f9852, 0x07d8e311, 0xb114634e, 0xe3e0f16e, 0xb9634a97,
  213387. 0x421eec37, 0x2454bb9c, 0xd72b21c1, 0xb4ecd5db, 0x6df20d7c,
  213388. 0xf9603868, 0xdf86e0a2, 0x9f5359fd, 0x5ac488aa, 0xc43d54fa,
  213389. 0xd1049df4, 0x56d714ab, 0xb020607a, 0x13152b3e, 0x7a02325e,
  213390. 0x49be1c18, 0x52ae84db, 0x44f24f4a, 0x0b5a7b80, 0x9e525c03,
  213391. 0xa6d179fd, 0x6d874446 },
  213392. { 0xbe9a42f5, 0xd29d07aa, 0x3781ccc8, 0x1fd5316c, 0x9dc69ea1,
  213393. 0x71a75a6d, 0x88fee91a, 0x4e19e0df, 0xf8d44f12, 0x99c2b4dc,
  213394. 0x31ae94e4, 0x05f6df92, 0xcf28ccc2, 0x27fba876, 0xf57f7ceb,
  213395. 0x6e1a0f01, 0xf3fd3b74, 0xe03f1f34, 0x42c1d213, 0xa0edc4a7,
  213396. 0x7deb8580, 0x5caac270, 0xaf0848bc, 0x0f5d791f, 0x07ac759d,
  213397. 0x17f514ad, 0x904fc531, 0x95a39734, 0x7bb70f3d, 0x95a4aca9,
  213398. 0xff9c5609, 0x3cf384c9 },
  213399. { 0xce1fc9e3, 0x700506ba, 0x676b0399, 0x49721742, 0xe72bf7b3,
  213400. 0x2b4a1b8d, 0x79b209f7, 0xca8602a8, 0xce26a8e1, 0x90580b90,
  213401. 0xfe24f39a, 0x1ef339b7, 0x629362e1, 0xb6c5d991, 0x577b24f4,
  213402. 0x51174e1a, 0x05e451e9, 0xf380fcb5, 0x148321bd, 0xf4d97afb,
  213403. 0x747e5d2a, 0x099806bb, 0xbe99a608, 0x85525d65, 0xd455e820,
  213404. 0x264828d9, 0xd8560a65, 0x8c8c5405, 0x71030770, 0x3c67e73c,
  213405. 0xee73df26, 0x2b248850 },
  213406. { 0x8541159f, 0x2173cde6, 0x4fb410b2, 0x78224c18, 0x1f2ca1c7,
  213407. 0x07a28619, 0xa8b23e40, 0x52c207d6, 0xa6b2344a, 0x071a0210,
  213408. 0xb5ed2945, 0xdb0e587c, 0x810fcc6c, 0x6c56b8ef, 0x62d843b9,
  213409. 0x1248c58f, 0x74c66975, 0x4b90363d, 0xe66c66f6, 0x6348f7f2,
  213410. 0xc126bcbe, 0xb2f9d441, 0x73ce49e8, 0xac07f2a3, 0xe81b0df0,
  213411. 0x52486758, 0x1d4621d1, 0xa108b54d, 0x74414a1c, 0x17261ece,
  213412. 0x6a3ac215, 0x938b3bcc },
  213413. { 0xe4ded340, 0xa9e4a16b, 0x80e88036, 0x8e65fb2a, 0xdcd73acb,
  213414. 0x97089606, 0xaaa657a9, 0x1c3a0434, 0x49101b06, 0xf304fc58,
  213415. 0xda0bb64c, 0xe60fb61a, 0xf5542df5, 0x818c2aec, 0x56f76d5f,
  213416. 0x74020576, 0x92533d97, 0xb566b790, 0x74d6eb5f, 0xae4655e5,
  213417. 0xa55b44b7, 0x60f7a1b5, 0x93747ea5, 0x7970179b, 0xf2dace56,
  213418. 0x8ae7e0e8, 0x84e83c06, 0x98474607, 0x15307341, 0x24e8c9ed,
  213419. 0xd9e89d6b, 0x6cff58a5 },
  213420. { 0x03e51f68, 0x508c01b0, 0x1d2fe7d6, 0xe1d1f225, 0x09bd8805,
  213421. 0xf7998d0b, 0x03e415b7, 0x255e907a, 0x607d9798, 0xd148467d,
  213422. 0x9b453896, 0x055c3b1e, 0x809f50f4, 0x35001013, 0xd0233fdc,
  213423. 0xfbbb2fa6, 0xff1820b8, 0x0b680b0a, 0x38d317e0, 0xb1d404dc,
  213424. 0xccc8c7df, 0x133d5444, 0x6ec13f84, 0x7fa847e6, 0x046e2e48,
  213425. 0xc33f83d8, 0x4863b3ac, 0x3c627fc5, 0xeb936af7, 0x5f67f8aa,
  213426. 0x31b79327, 0x5fe4ac8f },
  213427. { 0x8b6f401e, 0x581aa4bf, 0xad5c7ed4, 0x05db12a3, 0x6fb07b4a,
  213428. 0x7b018726, 0x9c22bcd4, 0xfdd11f04, 0x69371c95, 0x5454a7d4,
  213429. 0x99a46eaf, 0x066c55fb, 0x7fef96d0, 0x18637c7c, 0x6b83e95c,
  213430. 0xbafc1d34, 0x00bb42dc, 0x55c38593, 0x34e7e712, 0xdd8dec2b,
  213431. 0xb184cee8, 0x69c9cfb0, 0x49a27864, 0x8dcc0c42, 0x2010f2e7,
  213432. 0x290d95f2, 0x6977a420, 0x86e254c9, 0xeb2abdad, 0x20931c89,
  213433. 0x121c0548, 0x81377164 },
  213434. { 0x9c5a8edf, 0x6266b25e, 0x1078a7ad, 0x6e1388c2, 0x4876eedf,
  213435. 0x5f02737d, 0x62744617, 0x242fa7f9, 0xb385382a, 0x3e2cfbd9,
  213436. 0x02f71bef, 0xbadad7b1, 0x677d0a92, 0x562abcfa, 0x51fdff34,
  213437. 0x573ebd17, 0x7c250c78, 0xd7f65852, 0xc47ca896, 0xe0cf16ee,
  213438. 0x67622c9e, 0x8ccd79b0, 0xf8f2c075, 0x31fc5882, 0xa6008515,
  213439. 0x9232b37e, 0x82e8c5ba, 0x4d7bb361, 0xd2f146fe, 0xbf24735c,
  213440. 0x9cd2db98, 0x79c280ee },
  213441. { 0xf2b48122, 0xbdcc8203, 0xb04ac48e, 0xa8c04916, 0x9fc4885e,
  213442. 0xacf064dc, 0x82c1001c, 0xab838997, 0x676de250, 0x7339e721,
  213443. 0x8e1ab820, 0x17aa5aea, 0x6bc14b2e, 0x24d28ca0, 0x816b6230,
  213444. 0x570c5bb7, 0xcee6b606, 0x6c51235c, 0x183eae42, 0x1b2bf89f,
  213445. 0x9c66274b, 0x3e3af3c6, 0xb51e38bc, 0xe0b04426, 0x73e40e3b,
  213446. 0x26dbc58e, 0xb5be5be4, 0x3f9dd578, 0x52c8f408, 0x9fd9f791,
  213447. 0xa9e3ff4f, 0x758073a4 },
  213448. { 0x8691ca22, 0x7d27b057, 0x13a2a1b6, 0xf206bfd6, 0xac795413,
  213449. 0xe84bd385, 0x75536607, 0xc5d18a2a, 0xc8a0e24c, 0x2e166de7,
  213450. 0x3c474dbd, 0x56d5750c, 0x1366843a, 0xdef444c1, 0xcf4b8432,
  213451. 0x14646e53, 0xa9fd9783, 0x4bc0d030, 0x297ee203, 0xbda4c824,
  213452. 0xfd7be6c7, 0x3d0b10bf, 0x08c7f3ff, 0x2d216476, 0xb4fd4c45,
  213453. 0x06e52599, 0x49e9e104, 0xfbab9fa1, 0x8661d32d, 0x9342a7fa,
  213454. 0xfaf66aa8, 0x3f3e3458 },
  213455. { 0x951597aa, 0x51ec35af, 0x49df64eb, 0xb677d4ac, 0x9bf4eff5,
  213456. 0x0276cd9c, 0x515a2935, 0x423eca49, 0xfd9bb9c3, 0x8a696553,
  213457. 0xede1f09c, 0xf99ee9df, 0x199e5f98, 0xb8fa2956, 0x35292c32,
  213458. 0xb7638758, 0xfc40e81b, 0x8734eddc, 0x65457d95, 0xd82d5e9f,
  213459. 0x30c78d2b, 0xc8ee323e, 0xc1433d67, 0xe77b2e4c, 0x3c8314ae,
  213460. 0x56d9f807, 0x2a0e2f63, 0x441eede2, 0x6c48295e, 0x1e9e17ed,
  213461. 0x34c294ef, 0x640d20c4 },
  213462. { 0x3284d513, 0x4e9a0b8e, 0xf315053a, 0x074c3545, 0x45acd52a,
  213463. 0xb36e7407, 0x1de50db7, 0xd80bdcfc, 0x2549fc46, 0x8d9d47dc,
  213464. 0x303f07a8, 0x29b6ef13, 0x6d4ad4c2, 0x4e461aca, 0xfc9f1b73,
  213465. 0xca8e351d, 0x57460e65, 0x8bc4094d, 0x0f32d367, 0xb6302b33,
  213466. 0x285742e8, 0x69a074b6, 0x876c29c3, 0xdfe52b11, 0x912bd17a,
  213467. 0xf39e4609, 0x349aa639, 0x8ee40d66, 0xc72e05c1, 0xb968902a,
  213468. 0xc0d92816, 0x0f9c1ca8 },
  213469. { 0x67433df3, 0x1ebbaab3, 0x15d3628c, 0xb6aa5347, 0x97f0c5cc,
  213470. 0x13a320d8, 0x65e408f9, 0x72c918cb, 0xd5373451, 0x4b638854,
  213471. 0x0b4dca09, 0x731399a3, 0x0a3b1326, 0xcf256730, 0x6608b388,
  213472. 0x5ea60dfa, 0x7b290dfd, 0x58ad74b0, 0xd7694f9b, 0x83202789,
  213473. 0xb6630fb1, 0x48593db8, 0xc65e3eaf, 0x3db47f70, 0x3e7263f8,
  213474. 0x63949c91, 0xe6e6ff33, 0x9b9acec6, 0x098a8240, 0x34bd9ba7,
  213475. 0x45d36ec5, 0x7e31c12f },
  213476. { 0x0dfd2dd7, 0xbe281d68, 0x24ab61d8, 0x1efacb00, 0x94431f97,
  213477. 0xb9c3005f, 0x959cb3bc, 0x660c8dfa, 0xcffbb406, 0xfdd5fc30,
  213478. 0x7969a10d, 0x7a4631be, 0xde13fd1b, 0x336e309e, 0xfc947076,
  213479. 0x76b3bfad, 0xdcc72223, 0xfa91925d, 0x156c4ee1, 0x741f0d73,
  213480. 0x0e2b3747, 0x4f64ee41, 0xefc4d93c, 0x86be92d3, 0xfc4fbb2e,
  213481. 0xc53b7e03, 0x337ca1bb, 0xac196cf5, 0x7e23ba60, 0x4de41a30,
  213482. 0x326d5357, 0x1a219c45 },
  213483. { 0xaa4db0bc, 0xfdcf7ef8, 0x7b6c9963, 0x2e231806, 0x3d8a192f,
  213484. 0xc2639067, 0xffdc7771, 0xc0cec2e2, 0xa2fc0edb, 0x997c8e35,
  213485. 0x82cc6043, 0x78e10ec1, 0x2b0c8120, 0xfd0de2cb, 0x69e57f8e,
  213486. 0x4d6c457f, 0x5b53f1c3, 0x953e69b2, 0xc4f89cb8, 0x422a330a,
  213487. 0x95566be6, 0x92ff2329, 0x437442d1, 0x73cd502d, 0xbea69403,
  213488. 0xf04ce590, 0xf8030662, 0x6ac1537e, 0xb6d0bf93, 0xe02bcf77,
  213489. 0xbc90192f, 0x17aaa999 },
  213490. { 0x8e55db2e, 0x0d3d5643, 0x3b946851, 0x835dee43, 0x5b88462f,
  213491. 0x1a1440e5, 0xea17e27c, 0xa6ff3b35, 0xdd95f7a9, 0x23f99c36,
  213492. 0xbdd672cf, 0x7217fdd9, 0xdd2045c0, 0xf400ac1e, 0x4ff06b25,
  213493. 0x94b55c87, 0x0e4a49be, 0x0a44a0e5, 0xb43b6813, 0xe8925e91,
  213494. 0x214f96c5, 0x78bedde1, 0x0f97fa97, 0x0f456a4c, 0xa5bfd267,
  213495. 0xa28fd86b, 0xbe7608ef, 0x3b4b2d8f, 0x226474bc, 0xfbd5ff8c,
  213496. 0xa5f3b24a, 0x6b282af0 },
  213497. { 0x6341a595, 0x78fc025f, 0xa445e28c, 0x591c38d6, 0xeb446842,
  213498. 0x72bd6e3d, 0x75547833, 0x3f9466d3, 0x083e16c4, 0x911414d3,
  213499. 0x95a7acb4, 0x145d9466, 0x8fd2fb64, 0x102ddf09, 0x0bfd87b1,
  213500. 0x2a2b2d2d, 0x59455088, 0x69e9be5c, 0xa80245de, 0xee378bf4,
  213501. 0xb2306b0e, 0x80b0bd68, 0xc2be9f3d, 0x76a545c6, 0x4802c245,
  213502. 0x429d167b, 0x2b412dfb, 0x13e64427, 0xee8d9762, 0xb664f529,
  213503. 0x54706ebf, 0x6d4f5d23 },
  213504. { 0x00ba9f88, 0x35c8f2b6, 0x7bb6d0bf, 0xfdc807e0, 0xb3b81e5b,
  213505. 0x0a126d42, 0xa7ac781e, 0x335ce6ce, 0xf37dcba6, 0x3e308e6f,
  213506. 0x63c96487, 0x028dca62, 0x8818434d, 0x72eba57e, 0x79b78a26,
  213507. 0xa9e3d59f, 0x2f07aea3, 0xd2f0a7dd, 0x24d05f74, 0xe0fe4678,
  213508. 0x0116deb6, 0xb2085170, 0x58f37580, 0x9c2a5e92, 0x74070bb3,
  213509. 0xe78bd7a5, 0xb9977d90, 0x551fc872, 0x40db81b4, 0x6eda93c4,
  213510. 0xd65d34ad, 0x4aaf0b4f },
  213511. { 0x3514c7af, 0x9bef2506, 0xbc181ead, 0xb09e7dad, 0x8fa3ec58,
  213512. 0xef3cae87, 0x173b8685, 0xd8dbfab5, 0x921d32dd, 0xb2490fc0,
  213513. 0x8bd9c466, 0x4eef386b, 0xa061dbdb, 0xc1cdd52f, 0x25bc04db,
  213514. 0x64de989a, 0x85728636, 0x06f9836b, 0x8be44aa0, 0x11a5a804,
  213515. 0x097018c7, 0x16dede4e, 0xb2c11fb1, 0x72aec577, 0xa721ecd9,
  213516. 0x144dade1, 0xd6ebf3a9, 0xf99c526b, 0x1c2e14d7, 0xa1d4165b,
  213517. 0x82bc6337, 0x8b2cbd39 },
  213518. { 0x8a52e991, 0x28ec1bf2, 0xcf9d42ec, 0x0ba202f6, 0xc634ea45,
  213519. 0x8307d130, 0xc5762b9c, 0x3fc257b3, 0x487c2a2d, 0xbd3298d1,
  213520. 0xa319488a, 0xca14f1a7, 0x06ba06d2, 0xc70ca93b, 0xee405e89,
  213521. 0x9aa3f4b3, 0x35deeae7, 0xcc64eeb3, 0x03bf1d4c, 0xd155f578,
  213522. 0x45616bfd, 0x041ec0b5, 0x086e33f6, 0x23df80e6, 0xf0243cf5,
  213523. 0x399a79c8, 0x874ccd58, 0x86c2824e, 0x8fc5c831, 0x220eeaec,
  213524. 0x7dbe3670, 0x57e28304 },
  213525. { 0xfbcdf666, 0x6e60b698, 0x8bebb1d2, 0xbdd06a99, 0x80498436,
  213526. 0x4044adba, 0x522bc88d, 0xd76bf75e, 0x28423b20, 0x655c4b9b,
  213527. 0x53398a72, 0x65c0f492, 0x0ca37601, 0x76d4f2b7, 0x2030fa5a,
  213528. 0x46989925, 0xb6054705, 0x96b37e87, 0x53de1b2f, 0xef96f731,
  213529. 0xad54ef05, 0x5ecbbc8c, 0xa93617b0, 0xeb289d0a, 0x7cba217d,
  213530. 0x3ac0fbd5, 0x19d4a2d7, 0xd0d3cb56, 0xc91d6063, 0xe8bee9d4,
  213531. 0x696ffda6, 0x4f12e037 },
  213532. { 0x15f1a610, 0x4ccfa422, 0x3786519a, 0x804a5c55, 0x73838134,
  213533. 0x1246a454, 0x4b284e2a, 0xfa15b484, 0x146d1320, 0x36464c65,
  213534. 0x70a8a0fa, 0xfb6ba88c, 0x93c4804e, 0x74e7cee7, 0xb95ae16a,
  213535. 0x8c34d22c, 0xf9c1d4dd, 0x9d9ed89f, 0x32025371, 0x61a0866d,
  213536. 0x9bd6444a, 0x45b232b2, 0xf277bab1, 0xf888e92c, 0xa9448b02,
  213537. 0x73e69c6e, 0x5b521ecb, 0x1a496ea9, 0x5858afb2, 0xa8f78ea7,
  213538. 0xb1266f91, 0x83d2333e },
  213539. { 0x67b478d7, 0x1c633288, 0x50a2fc9c, 0xa1ee1ae1, 0x18d2241b,
  213540. 0x05b6ab30, 0x893cd696, 0x69f1f288, 0xa8117a87, 0x159d6660,
  213541. 0x70e73d77, 0xe8120119, 0x93f55f0a, 0x528fef00, 0xd854dfb2,
  213542. 0xb3978db8, 0xf45d9fbb, 0xd6b43ef6, 0xd5bee397, 0x17de4bfe,
  213543. 0x6bf76dad, 0xa01e0f59, 0x3d40754c, 0x28b2280e, 0xf8e86ef3,
  213544. 0x8edb6122, 0xb7d1e586, 0x8226b6af, 0x2f40a55b, 0x46353215,
  213545. 0xc5a31621, 0x7362f13e },
  213546. { 0x73c0c430, 0x792eb27c, 0xa51c3657, 0x8cc0a65f, 0xd2194f1b,
  213547. 0x50a5cece, 0x814b4947, 0x18945688, 0x4b6fbbf4, 0xbbf0a81a,
  213548. 0xf0aa8608, 0x376f4f58, 0x3987795e, 0xd9361d68, 0xe3a8d0d5,
  213549. 0xb6510cd8, 0xb6c1a455, 0x63e2fdbf, 0xaec891f9, 0x2c91154e,
  213550. 0xff568f64, 0x0eb1e715, 0x2f2b399e, 0xe7af9cd7, 0x89f0bf0b,
  213551. 0x1fc39bac, 0x90983695, 0xf0861d92, 0xda0a20a8, 0xd9b16f02,
  213552. 0xa38c0ead, 0x2f10693f },
  213553. { 0x0c06ded2, 0x07a6ce91, 0x2fd9087b, 0xf974842f, 0xa9f635a6,
  213554. 0xe468bfd6, 0x1ed60626, 0x04b61891, 0x369ee548, 0x1fb2f89f,
  213555. 0xdc96a201, 0x9cbd1113, 0x10d633ac, 0x6759acfe, 0x8faa629e,
  213556. 0x64ba66fc, 0x47f38283, 0xa686ae49, 0xd59cda99, 0x828c3a05,
  213557. 0x08ea2f6e, 0x7c7afb14, 0xaf3953c8, 0x2551c8e4, 0x9daa9e4f,
  213558. 0x5b53d279, 0xad6f1940, 0x1eff68d4, 0x96437cdb, 0x2775dbdd,
  213559. 0x4fe7a043, 0x985f83e4 },
  213560. { 0xeaf45294, 0x89603c16, 0xc24b5751, 0x70131160, 0x39d6b52d,
  213561. 0x4c112018, 0xed943340, 0x7079cf02, 0x74f41b68, 0x0c5b028b,
  213562. 0x9c8ac1e1, 0x3dc3f076, 0xf8b24f0e, 0x5ac5eea3, 0xe34c5c22,
  213563. 0xee6684ba, 0x9abc452a, 0xa5259e63, 0xe9df45cc, 0xb07d2cd1,
  213564. 0x1a443cfa, 0x07019c93, 0x92c003b3, 0x68fddaa9, 0x0d8cbc2e,
  213565. 0x2d9f179c, 0x1e781ca7, 0xbbf15a6f, 0x50dcc799, 0x54d779d5,
  213566. 0x0fe962f1, 0x0c88e540 },
  213567. { 0xe8f44357, 0x84f71a6a, 0x3a3cab6a, 0xf75b4bf6, 0x5aebc680,
  213568. 0x334c9d9e, 0x8a753ef2, 0xcecaf084, 0x075e3c8e, 0xe28014c1,
  213569. 0xf74f8d3a, 0xbb9d5a38, 0xb80e32ae, 0x75988464, 0xf2bc3792,
  213570. 0x7b328e6f, 0xeed0e197, 0xebbb1faf, 0x5a33065a, 0x674eac95,
  213571. 0x922dbce8, 0x8c19fd8f, 0x987b907a, 0x8c17ae85, 0x3b3a2cd7,
  213572. 0x89f33627, 0xfa87772f, 0xebaea019, 0x3a25ced6, 0x4e5de499,
  213573. 0xaf110715, 0x8e2560b8 },
  213574. { 0x3141aba6, 0x56d3746c, 0xbab2cf9e, 0x45a1079f, 0x9cdd27c7,
  213575. 0xb6382831, 0x9dfd950e, 0x22237632, 0x3a9408ff, 0x1e0b15cd,
  213576. 0xb1160118, 0x49a80200, 0xa383bba7, 0x2719db5d, 0x651046d5,
  213577. 0x6078340a, 0x97523b1f, 0x8929d4de, 0x8e0a28ab, 0x4040345c,
  213578. 0x0adf09c7, 0x61275ac2, 0x2331d611, 0xb41ab265, 0x5391ca50,
  213579. 0x230cc77c, 0x8f922315, 0x88be0c92, 0x92fd9a29, 0xfef3d92b,
  213580. 0x8324f2e5, 0x59005f22 },
  213581. { 0x3c4c1c74, 0x6bb1750c, 0xe966fb79, 0xbe73aac0, 0x66c5973f,
  213582. 0x85a75d92, 0x3a8656b6, 0x8c97f932, 0x50446cde, 0x2b7043b1,
  213583. 0x3ff3897f, 0x548916f7, 0xb18b72b2, 0x913dd01c, 0x488c0de6,
  213584. 0xd0a751f1, 0x8558ca58, 0x19175714, 0x44a663da, 0x97714301,
  213585. 0xb0e08618, 0x2df190ac, 0xf39ead9c, 0x0080fc0c, 0x17382da1,
  213586. 0x0085ac6e, 0x3262a338, 0xe9791851, 0xb43bae8d, 0xe4495936,
  213587. 0xd783df6e, 0x57a78e26 },
  213588. { 0x40dbddd8, 0x161b346f, 0x9410c3ac, 0x2b49a927, 0x1886cf3b,
  213589. 0x8c542783, 0x33b93deb, 0x72df3232, 0x40df579d, 0x9c8d59f5,
  213590. 0xc20ef500, 0xe5d7a67d, 0x67f08643, 0xc46b3918, 0xad96adc3,
  213591. 0xecfa2445, 0x0c4544d0, 0x658f589b, 0xe08417d7, 0xe6ec9301,
  213592. 0xc454e288, 0x6ca5ef6a, 0xac0f462d, 0x4191048f, 0x08d8a036,
  213593. 0x852407d8, 0xf6d35b7e, 0xb4c533a7, 0x8f6ada87, 0x3251e412,
  213594. 0x81c472e8, 0x1ca370c5 },
  213595. { 0xa801b68a, 0x94bd5171, 0xfd1998b3, 0x7312879c, 0x41163202,
  213596. 0x4905aabf, 0xf5b01fdb, 0xb5fe87f4, 0x9cda128b, 0x78de523a,
  213597. 0xc7bd31f7, 0x0bf161a1, 0x23904c35, 0xb5decfd0, 0xe188f12d,
  213598. 0x224b2882, 0xf99dae74, 0x0dd2801d, 0x08cd1cd2, 0xcad467b5,
  213599. 0xc0867e39, 0x6c311c3d, 0x2b425072, 0x71a11720, 0x2efd9003,
  213600. 0x83bf464e, 0x1dbd3b03, 0x53d0448a, 0xe6265baa, 0x32db52f4,
  213601. 0x4c33ac79, 0x2584b34c },
  213602. { 0x2aeec688, 0x3cb86389, 0x45fbe523, 0xa5e740ba, 0xfd60b5f8,
  213603. 0x422e71f7, 0x4874913d, 0x455d185c, 0xfa17d80d, 0x04c2bb36,
  213604. 0xac054524, 0x3f271854, 0xa8b9a657, 0x76dd3045, 0x62ee7cc8,
  213605. 0x2e42c3e1, 0x4df6c7d0, 0x00266706, 0xdc7cb488, 0x5927dd51,
  213606. 0x187897e0, 0x6b3faabe, 0xf2d5737c, 0xfe6ad22e, 0xff51a9ff,
  213607. 0xafb60269, 0x69807baa, 0xe1c83545, 0x951ca49a, 0xacddb6ff,
  213608. 0x3f9ab085, 0x7e811374 },
  213609. { 0x830a88b1, 0xad722a8b, 0xce1117e1, 0x91918ea8, 0x0409b47d,
  213610. 0x3e02d0b8, 0x6c46d1d3, 0xb53812d3, 0xe589669c, 0x2fd09db0,
  213611. 0x15b0cd5e, 0x9845cd06, 0x2386c453, 0x0c1c155a, 0xf5ff43cb,
  213612. 0xda774de5, 0xe391c0cd, 0xbb076b98, 0x5004f286, 0x97d71eff,
  213613. 0xaeec0bfe, 0x23e0b46c, 0x32a1ad94, 0xe4538667, 0x396da422,
  213614. 0xfe0c9f81, 0x63db2bfe, 0x6376c1a2, 0xba56fa91, 0x001c7918,
  213615. 0xdf8485a6, 0x436b8c64 },
  213616. { 0x8ab764bc, 0x88117e9d, 0xa077df84, 0xdfa61e94, 0x0c18eebd,
  213617. 0x5a7765d3, 0xfc9451dc, 0x548916af, 0x071a347a, 0x01a52e33,
  213618. 0xb23b41df, 0x633b95de, 0x43c8c286, 0xdd7d68c9, 0x18d97068,
  213619. 0xe4f9d41e, 0x8c92799d, 0x79908b90, 0xd47394a3, 0xe614148e,
  213620. 0xcd51e53f, 0xe5018517, 0x0243dcb6, 0x5060075e, 0x17954405,
  213621. 0xe5dcde62, 0x537da5ff, 0x6f7c90e1, 0x0768cb66, 0x1df7aae4,
  213622. 0x6dbe95e1, 0x5266ca9e },
  213623. { 0x1386b3db, 0x84ddee6d, 0x7c38e540, 0xf9e4af5a, 0xeb04f49d,
  213624. 0xb3418440, 0xfde5a4fd, 0x2138a1e8, 0x30257cfc, 0x3e6e6924,
  213625. 0x19fd70c1, 0x3519c6e3, 0x86c31ff0, 0x8f34e174, 0x940ce1e8,
  213626. 0xf1e298fd, 0x14960d7c, 0x6fb8cb1d, 0x2b2f3bff, 0x207c1347,
  213627. 0x146ef8ff, 0x899a20b4, 0x7bd3e220, 0x7dec362b, 0x626bea27,
  213628. 0xa975044e, 0x4fb4cb67, 0x0f32b449, 0x1fc6703a, 0xc17a0920,
  213629. 0x9cd84a2b, 0x41f325b9 },
  213630. { 0xce2843a4, 0x312ed513, 0x00728afc, 0xe748498e, 0x4d864ce5,
  213631. 0xa8ef2822, 0xa620083b, 0x34064704, 0x4bed338d, 0x5905e1d9,
  213632. 0x063e7b38, 0x2a578cb5, 0x289e7bb9, 0x98276d96, 0xf17b7341,
  213633. 0xdfe2dc47, 0x1dac8944, 0x5923521f, 0x23400aa7, 0x3db6d28d,
  213634. 0xa761ba43, 0xc647705e, 0x9bfd07dd, 0x8947ba6d, 0x242ca8fd,
  213635. 0x00f2e3ac, 0xeb8c3468, 0x49ef4670, 0xd9aa18fd, 0x7db3d37b,
  213636. 0xe58cea9e, 0x56b30fb6 },
  213637. { 0xcd80a428, 0x07ecdcaa, 0x8732c891, 0x7af922dc, 0x3ada441f,
  213638. 0x20d88798, 0x924b008a, 0x3bed9a44, 0xb2e81c3a, 0x2123533c,
  213639. 0x65f807d3, 0xc34e4075, 0x1f2faecb, 0x0bfaefa5, 0xade8a88d,
  213640. 0x78b634a5, 0x94392a91, 0xc4e0b7f8, 0x90bb1cd8, 0x30922377,
  213641. 0xf87204ae, 0xdea9b4fa, 0x85d3cd83, 0x3edf81f5, 0xc6523a79,
  213642. 0x58f88c51, 0x17c0d969, 0xe472fb8b, 0xdccf7f07, 0x899081e5,
  213643. 0x58bdd146, 0x1353cc57 },
  213644. { 0x39bf6e18, 0x28a56497, 0x649b89c7, 0x59e8b5a2, 0xdce8b8e7,
  213645. 0x8d9434a0, 0x2047040c, 0xd935bf51, 0x6a7b8e82, 0x2ab3a164,
  213646. 0x27f81294, 0xf1583ed6, 0x72d67297, 0x8416a7e0, 0xcd39e42b,
  213647. 0x49685d86, 0x958ddbad, 0x8a797fc7, 0x155ce6de, 0xa558f928,
  213648. 0xf8a36235, 0x75f4e570, 0x52877ae5, 0xbc69cfc0, 0xa6b16ebd,
  213649. 0x8f4193a9, 0xbb1cc1f1, 0x8d1df43c, 0x5a21e789, 0x723a830e,
  213650. 0xf451df58, 0x3ec2185d },
  213651. { 0x1f0bc2d7, 0xb9d4c7d7, 0x6e51d412, 0x6982c6cc, 0xa09f80f6,
  213652. 0x92e02d93, 0x047ae09c, 0xb7dd2d25, 0x37f351f9, 0x3503149f,
  213653. 0xc77850be, 0x69d49ce1, 0x12f0d2c8, 0x60242acb, 0x7bc28b9d,
  213654. 0xba188c56, 0x06bc0550, 0x8e406121, 0x8d7d4329, 0xb0d84b1f,
  213655. 0xd38951e0, 0xb4a67ae7, 0x8bc97607, 0xb527c57b, 0x5497aa72,
  213656. 0xbc93c5f3, 0x39bdd666, 0x5f1de8cc, 0xe9d447a3, 0x3087dc5c,
  213657. 0xa211abe5, 0x89b356b6 },
  213658. { 0xdfdcc837, 0xed6db0af, 0xa871b7a9, 0x0fb80baa, 0x1c1d4b72,
  213659. 0x413abfc9, 0xadac9e5c, 0xf5b56bf7, 0x8b8657a3, 0x5664a2da,
  213660. 0x0e41d94e, 0x11b04f72, 0x37433658, 0x63e11d26, 0xf426daea,
  213661. 0xee628ece, 0xcb162dc2, 0x011619c9, 0x87648643, 0x9cf5817f,
  213662. 0x5584bc86, 0xe1bb9702, 0x00bf7928, 0x2cc27cef, 0xdc60eee5,
  213663. 0x4ef3a80e, 0x87adc2f9, 0x7e1202be, 0x8a0d4f52, 0x656f18e0,
  213664. 0x57c5d126, 0x39c4f10d },
  213665. { 0xe88aecd3, 0xb3a9b68c, 0xa518aa9d, 0x555b0918, 0x4bd4ee54,
  213666. 0xedc1cdad, 0x02068d84, 0x79b68b67, 0x811ac72d, 0x7dac80d0,
  213667. 0xa81a0a78, 0x6d1e6d35, 0x3bd16283, 0xc841e9ea, 0x894c4444,
  213668. 0xa7bc1775, 0xf1aa1202, 0xf2b63725, 0xc7d4c556, 0xbec7767e,
  213669. 0xd46ff51b, 0x2817ebb3, 0x73f7e339, 0xfde5be8d, 0x5aed24c4,
  213670. 0x44c6c977, 0xb6e579cf, 0x0b9a1707, 0x9069fbcc, 0xcff16478,
  213671. 0x49152b00, 0x414b542d },
  213672. { 0x606e173b, 0x33c31e58, 0x90e6713a, 0x5b7f4e1b, 0xdebb20af,
  213673. 0x425fb512, 0x05120e70, 0xc788c617, 0x9013e4ec, 0x3ef05602,
  213674. 0x81c6e6d7, 0x9f9d35ac, 0x9450690a, 0xe131e88f, 0x44af082e,
  213675. 0x708f9b32, 0x1ba2aea9, 0xb2e4d66c, 0x740db29c, 0xaf1f4a6e,
  213676. 0xd1843007, 0x74ab9248, 0xed556a6c, 0x13338ef8, 0x270d17a6,
  213677. 0xf48e623e, 0x9608f5bf, 0x3c7362fa, 0x444e8515, 0x43977874,
  213678. 0xe00b8b2a, 0x52678d6a },
  213679. { 0xdf36aeb4, 0x5dff1c59, 0xa92bc0ab, 0x52d6653c, 0x927a5f81,
  213680. 0x0e03f496, 0x2dfd491f, 0x8509d414, 0xa571f89b, 0x258c2c52,
  213681. 0x93334485, 0x2bd61804, 0x3f7d9e09, 0x1a33e94f, 0x2c1bf906,
  213682. 0xfab418d3, 0x5aa5695c, 0xf39c490e, 0xf6d2d7ff, 0x0e41196e,
  213683. 0x0f7948a9, 0x3ecd4075, 0xd3053b4f, 0x4b58f9b2, 0x5d9974c9,
  213684. 0xb8ee842a, 0xbf22f682, 0x23a59c1d, 0xc8efcea6, 0x045ac614,
  213685. 0xc10ceedd, 0x7040ba5b },
  213686. { 0x515a1a96, 0x2c364f81, 0x184327e0, 0x31a63503, 0x1ad93d4f,
  213687. 0x0a096650, 0x273b6173, 0x9d7694f1, 0xd2cda9d2, 0x8886d876,
  213688. 0x2814c177, 0x1e01a742, 0x8667696b, 0x3492276b, 0x5b25f006,
  213689. 0x2fd4f0c6, 0xfb294c4a, 0x6527349f, 0xde1d336f, 0xc1fe0d8a,
  213690. 0xe7e3860e, 0xaf9a23e8, 0xb774c31e, 0x97d2b721, 0x4365784a,
  213691. 0xfac3e582, 0x70f4eaa3, 0xff2dff4e, 0xfe873248, 0x3d281e1a,
  213692. 0x0bd1c9c1, 0x9043a6d6 },
  213693. { 0x766c7937, 0x1511a0fe, 0xabbc3be3, 0x1b2ded5c, 0xe00888ac,
  213694. 0x2ac160cc, 0x616200f3, 0x928754bd, 0x34a2ea06, 0xb801c83d,
  213695. 0x9cbe106f, 0x8ad7a03a, 0xcedfcd94, 0x996b0822, 0xe4069880,
  213696. 0xc3c3463a, 0xf597f663, 0xfb12ea4d, 0x40c92af9, 0x2c8d3834,
  213697. 0x4e8da154, 0x79bc85c6, 0xdb4e801a, 0x95771fa2, 0x1e3579b2,
  213698. 0x7bd2c138, 0xffaad078, 0xe45c75df, 0xb73eac46, 0xb0760a3c,
  213699. 0x3a125f35, 0x26362b48 },
  213700. { 0xeefc3e89, 0x25c68d28, 0x69e9ee71, 0x2d0ee877, 0xaf5e4b75,
  213701. 0x8b07bb86, 0xcb86b333, 0xdb709072, 0xff552bac, 0xfd3d20ea,
  213702. 0x4c0da1e9, 0xa5eeb2b1, 0x44f97145, 0x391f688a, 0x1e06d485,
  213703. 0x21fbd310, 0xbea9cd49, 0x45e4f2a5, 0xa7bf21da, 0x7b60d464,
  213704. 0x054d5471, 0x193f88c8, 0xbee0f2e9, 0x5ace53d1, 0xc1439273,
  213705. 0x92c26563, 0x96c6b5ee, 0x9c86e0b2, 0x09ff59ba, 0x452fe231,
  213706. 0x555c935e, 0x2e952b20 },
  213707. { 0xd75f886e, 0x2a846bca, 0xd43dfc58, 0xe68a5dbe, 0x007b1b86,
  213708. 0x103e45b6, 0x355ff2b5, 0x580e2ec9, 0xa263ecc9, 0xbc702f26,
  213709. 0x181e5e33, 0x2835b386, 0x6c122076, 0x025113ec, 0x7fbd856d,
  213710. 0xa5c26e3a, 0x9d6ebcb1, 0x8ef83fb3, 0xa44d2fa8, 0x7aaa53f2,
  213711. 0x53b1fa97, 0x7c14ef33, 0x17559a30, 0xff604a11, 0xb09377e0,
  213712. 0x2bcd96b0, 0xdb2f0273, 0xa5c14896, 0xeb53ef06, 0x1c0a84c9,
  213713. 0x30378e4b, 0x1236d017 },
  213714. { 0xc084373b, 0xd7481c8f, 0x646097ae, 0x29ae4768, 0x613bc34b,
  213715. 0x1300dfa0, 0x934bc2b0, 0x3712714c, 0x0e2be7e2, 0x86524629,
  213716. 0xed010800, 0x554fbb9f, 0x42314576, 0xf0ec0b38, 0x330a3282,
  213717. 0x65baf594, 0x706ef817, 0x3bdde1a8, 0xba7530e9, 0x7d2c727d,
  213718. 0x74cc95cb, 0xbb0c5d66, 0x2438906d, 0xb3fcd365, 0xd14658f3,
  213719. 0x19881941, 0x6c97f0e9, 0xe616f555, 0x4b9ec7ea, 0x353c2d85,
  213720. 0x620cb56e, 0x02a48014 },
  213721. { 0x506ccd38, 0x11d6d23d, 0x9059baa6, 0x229a1c54, 0x69d011c5,
  213722. 0x717c9c27, 0xd828937d, 0xe87e1b46, 0x83835083, 0xf5d63bbb,
  213723. 0xaadac258, 0xf0a7b427, 0x9f154d1f, 0x99ab26bd, 0x8ec955fd,
  213724. 0xdec0ffbf, 0x49fcb880, 0xee957c67, 0x1e0114de, 0x32395dee,
  213725. 0x369f46c7, 0x192a64b7, 0x91eb2599, 0x43044660, 0xa2e8c3da,
  213726. 0xbe2da887, 0xc3556d18, 0xa44e2c25, 0xb55f75f3, 0x31390414,
  213727. 0x8f217fe0, 0x1d8bde6f },
  213728. { 0xa2028924, 0x03cd39f8, 0xb06ecb9f, 0x6e54f19c, 0xd6f05846,
  213729. 0x862bbcb7, 0x5a060776, 0xdbe06716, 0xb10fec10, 0x9397c97a,
  213730. 0x6f1bb65c, 0xf4213826, 0xa672ba38, 0x414deccb, 0xf88b05e6,
  213731. 0x594d4d43, 0xac94d4d1, 0x7993f57a, 0xbfb17638, 0x74fc2a6a,
  213732. 0xb6fc655a, 0xd8196b5b, 0xee8d2139, 0xdc375c84, 0x360d3a26,
  213733. 0xb9b00a02, 0xdeb93b87, 0xb36ed35c, 0xcc83209e, 0xf565b28b,
  213734. 0xc61013c1, 0x349c6943 },
  213735. { 0x4de6c88a, 0xd1b39444, 0x4700207e, 0xd5c2c471, 0x21c2b780,
  213736. 0xb6f458a2, 0x0850993e, 0x749f7564, 0xbaef0c18, 0x400ba579,
  213737. 0x737c70f0, 0x2d742938, 0x21467ebf, 0xc5a8e2ec, 0x5337f453,
  213738. 0x243a666e, 0xed0bd50a, 0xc991f1c7, 0xf4bd1f91, 0x3a7f3e90,
  213739. 0x5f0e129b, 0x96089e8a, 0x07389635, 0xd0d3a177, 0x27182ac9,
  213740. 0x9cf842d5, 0x0817c5c2, 0x21195299, 0x87255769, 0xa32f327e,
  213741. 0x89c2d8fa, 0x056587ab },
  213742. { 0x1ce4733d, 0x008562ed, 0x98e51444, 0x5faff7cb, 0xa9ab46b9,
  213743. 0x5f03021f, 0xb61a8c13, 0x89494c5e, 0x36b35976, 0x57c95036,
  213744. 0x2ac2d2f6, 0x6be84c8f, 0x9bd2703e, 0x0e5b34d8, 0x7e872abb,
  213745. 0xc4ad918f, 0xc4052ee1, 0xc2a89e9f, 0x3190b51e, 0xc2caee3f,
  213746. 0x6fff254f, 0x58fd1437, 0x883e0972, 0x6f3c0d68, 0x0fb15438,
  213747. 0x63d0a0e9, 0xf6caae00, 0xc438764b, 0x3f1d0f6c, 0x815f1565,
  213748. 0xb86cdbde, 0x1b87f2ed },
  213749. { 0x2b0b15b1, 0x35792bbb, 0xce6ba779, 0xa3e4b5a7, 0xdd8f3779,
  213750. 0xfbacffd9, 0xc298d1ef, 0x005450bd, 0xc47031c6, 0x0e3f5556,
  213751. 0x95d68066, 0x0770f07a, 0x2d1052c2, 0xce3e84e0, 0x7aa8cc54,
  213752. 0xb050791e, 0xba3223a3, 0x4d621e73, 0x39632990, 0x87b9b94d,
  213753. 0x7eb8056d, 0x8df9cb47, 0xedfca0cc, 0xe2430de8, 0x9712a0ca,
  213754. 0x374bf416, 0x88848a99, 0xbe3f3c77, 0xc4a3e59e, 0xb22b87b1,
  213755. 0x3e95bc23, 0x8e0227c4 },
  213756. { 0x3210964d, 0x000e22a8, 0xff056eeb, 0xdccd5df5, 0xdaf1ead7,
  213757. 0x02173a1f, 0x67cdcae3, 0xd02833e0, 0x8bdcc90c, 0x1cc574cb,
  213758. 0x3224b4f5, 0x86eca714, 0xbb3f8298, 0xd00e603a, 0x0c1a8deb,
  213759. 0xb98ece1b, 0x378c261d, 0x228a46e4, 0xa6165e5d, 0xc6f9dd0d,
  213760. 0x4b7ef0e2, 0xb3ae3899, 0xbda9f306, 0x3a3c16b3, 0x38a084db,
  213761. 0x5e9a26d3, 0x5394e950, 0x528e5993, 0x4ea206bc, 0x848ecb11,
  213762. 0x40545d6e, 0x14b15ab5 },
  213763. { 0x664c59a2, 0x0f6d86c9, 0x60fd7aa5, 0x3dfe2be1, 0x9072cb8e,
  213764. 0x33f9b569, 0x8176a7e0, 0x5f2325d9, 0x4587080b, 0x79a0d4e7,
  213765. 0x0d5d4e05, 0xa4ee0def, 0xc87b28e1, 0xc0ad9ffa, 0x3f09b4ee,
  213766. 0xd6f18d2f, 0x292e9d87, 0xcc896ae7, 0x6094763c, 0xca88953d,
  213767. 0x18fbf9fa, 0xdbee97a8, 0x4b63d701, 0xdf20e0e9, 0x47ea722f,
  213768. 0xcbba6e30, 0x612b571f, 0xce57e1ca, 0x009a55f5, 0x1e16ac76,
  213769. 0xc4389e2e, 0x742bbed8 },
  213770. { 0xc1dc2c73, 0x23ea86dc, 0xc1643abf, 0x4bbbfd5b, 0x24d8ca1f,
  213771. 0x07f8fa1f, 0x8cb5cac7, 0xde68a6e0, 0x54e66a7d, 0x7d54c64b,
  213772. 0xa9b7ad78, 0x789dba22, 0xe364ab94, 0x4d88d540, 0x1f72e011,
  213773. 0xc8c2e02d, 0x46e2a278, 0x4c826057, 0x4b187c7d, 0xe6c35bb3,
  213774. 0xeb8fe0c9, 0xed8b3dfe, 0x7d11e415, 0xb6bc34e8, 0xb865c7f9,
  213775. 0xb3908bbf, 0xe1ecc17c, 0x717d1ce6, 0xf7cdd69b, 0x151e3308,
  213776. 0xb5c94124, 0x97bd5a14 },
  213777. { 0x81e82861, 0xe01c62fe, 0xdd42c40e, 0x703d4b6d, 0xe65e91e5,
  213778. 0x7e52e55b, 0x5abbbfdd, 0xb8b49374, 0xc72a45f4, 0xb4f15f52,
  213779. 0x550f29d8, 0xce8435a8, 0x582de75f, 0x9df76b9b, 0xa20c8b96,
  213780. 0x52e84c5f, 0x0a8a0af4, 0xaf77d2d1, 0xca6013c3, 0x0389bbd8,
  213781. 0x26f8305f, 0xb0d9b9ba, 0x0cec8b9a, 0xf053e848, 0xffabda18,
  213782. 0x4d63367a, 0xa6424c2a, 0x50f53be4, 0x864fba2e, 0xf892c58c,
  213783. 0x48cc5469, 0x317c6d31 },
  213784. { 0x2cb7d42b, 0x0c3525b0, 0x310facae, 0x55240bc9, 0xff20408f,
  213785. 0x8d5d2022, 0xe0c10ea0, 0x6b01402f, 0x718eb23d, 0x7fbef68a,
  213786. 0x41252a19, 0xa0146b5a, 0x110e0d6e, 0x59afce48, 0x022de181,
  213787. 0xe9a1d27f, 0xdc3f49da, 0x6db96d16, 0xefbe4008, 0xfc1ae3f5,
  213788. 0xeccbc11c, 0xf9d70641, 0x525f8636, 0x49022279, 0xc2763c30,
  213789. 0x3769796a, 0x1d90630b, 0x9cc3483c, 0xee3d3f17, 0x451651f0,
  213790. 0x9da0b8fd, 0x6ae59739 },
  213791. { 0xbff4d2ee, 0x57b13bc7, 0x30b173d8, 0x20754229, 0x0794936c,
  213792. 0xb6254bd5, 0x5efd55be, 0x1d5f232a, 0x4e0c3389, 0xc06f4a85,
  213793. 0x8e61f944, 0xcf2c5b59, 0xfd5f87b7, 0xc564861f, 0x5a2afa4c,
  213794. 0xee261fb1, 0x2d97a774, 0xb0ff7226, 0xd6cf007a, 0x1a89ae22,
  213795. 0xd346f214, 0x28880534, 0x97b6497e, 0x8fe73bff, 0xfa2afffc,
  213796. 0x8a8595b2, 0xf151a726, 0x9ef9cf3e, 0xe744b82b, 0xa84ee5f1,
  213797. 0xbc63fe72, 0x6649048d },
  213798. { 0x1e8b760d, 0x91b7bb78, 0x25aadaa0, 0xd47b0bd8, 0xfab5226f,
  213799. 0x81493d9f, 0xbffc148e, 0x4a6dd226, 0xa29be3db, 0x5a032f8a,
  213800. 0x34b0ab0b, 0x318dbc70, 0x7d654868, 0xdcccbfb5, 0x9c581e46,
  213801. 0x8506ab37, 0x2830ece2, 0x09136a6e, 0xcf6c80c7, 0x48b79356,
  213802. 0xef6b1e86, 0xfa176377, 0x83f0f1c9, 0x2c9c1cc1, 0x16abeddd,
  213803. 0x96f0526d, 0xa93b0de4, 0x3e0e98e2, 0x0f13873a, 0x6f2d7ada,
  213804. 0xf3fa49ec, 0x4eb93b5c },
  213805. { 0xe11fae32, 0xbd89f7e5, 0xc4023f51, 0xd13d74f5, 0x491c3f6f,
  213806. 0x1b0014df, 0x555279b7, 0x1d849a57, 0x05ba0068, 0xbb9e8897,
  213807. 0xc13ca2ca, 0x82222419, 0xfd33676f, 0xafbbb685, 0x75878a2a,
  213808. 0x931c3f52, 0xef3d5173, 0x12aeefef, 0xbd8a6878, 0x189a5cc8,
  213809. 0xd99f0c16, 0x82cffdb3, 0xa19d48b6, 0xbf565406, 0xe9c6c4e0,
  213810. 0x5605e223, 0x86804172, 0x53e781de, 0xc7001cc8, 0xcdf5c90b,
  213811. 0x7c043f68, 0x2b582d93 },
  213812. { 0x81abc2ae, 0xa1165c82, 0xe2b69eca, 0xa73380f5, 0x07fff66f,
  213813. 0xc097b3d2, 0x54776506, 0x5d603826, 0xb57fa21c, 0xdcbac9f3,
  213814. 0xc98dbdd5, 0x78750db4, 0xd9eff32a, 0x85e21103, 0x2f11c41c,
  213815. 0xceed172c, 0x9e348c09, 0xa8e39264, 0x831eddfb, 0x71cb936b,
  213816. 0xf50864a3, 0x915c3d06, 0xe93acfcd, 0xfe8e33cd, 0xb3f2f7aa,
  213817. 0x4bee10d7, 0xeb7cee9a, 0xc1d8eb48, 0xfa574afd, 0x4fa49ce3,
  213818. 0x862db4c0, 0x78615109 },
  213819. { 0x7ae72c21, 0x3fe3f480, 0xfd0f0da5, 0x631aa144, 0xf8c3a454,
  213820. 0xc76ee1e8, 0x51b4f1ab, 0x379ae094, 0xd7cdbb24, 0x2a3a4397,
  213821. 0x82bd5fcd, 0x7a14cffe, 0xf427ef5a, 0xbbe4ed12, 0x284d3ccf,
  213822. 0x9b0a43ee, 0x8eec6e1e, 0x57b78b93, 0x67b8e87b, 0x18d404e4,
  213823. 0x34374c20, 0x0c8adc05, 0x5428deb5, 0x64373605, 0xc3afa2cf,
  213824. 0xb4d80ec0, 0x3aa956f9, 0x6d51f93c, 0x84161c68, 0x9f9a28ab,
  213825. 0x6bc9c025, 0x540b6bb7 },
  213826. { 0x321d315d, 0x04e1734c, 0xd86e05d0, 0x4ef56612, 0xbba8cd81,
  213827. 0xeafae145, 0xacdc789a, 0x1fb07a49, 0x5877570f, 0x6a21e9ad,
  213828. 0xb9bc53de, 0x2e4a837e, 0x1d6298eb, 0x436db293, 0xea362f45,
  213829. 0x43afbc78, 0xaabf6585, 0x2a973d97, 0x0c924d60, 0xdce7dabe,
  213830. 0x7cadf0e9, 0xf69d98f0, 0x75020538, 0xe0b505a1, 0x4461cd29,
  213831. 0x3db7d1a3, 0x5e20e818, 0xe1c28776, 0x52dd50f6, 0x2ca25867,
  213832. 0x92e0388c, 0x897cab14 },
  213833. { 0x0d8bab8a, 0x59ed3813, 0xa438200a, 0xc11d364c, 0x40581415,
  213834. 0x0687bf2c, 0x7ac89674, 0x86ad0d3a, 0xb97411a0, 0x44928105,
  213835. 0xf383371c, 0x74984b11, 0x0d1a831e, 0x70d2ed84, 0x6c912fe0,
  213836. 0xd883628b, 0x14fa88d2, 0x44f8f7fb, 0xcf0ac93e, 0x564f2a4d,
  213837. 0xa6c24fa6, 0x82f629aa, 0xbf6cd949, 0xab906ba3, 0x20a5182d,
  213838. 0x2c822e67, 0x30eb93a5, 0x2ff47dac, 0xfff673aa, 0xdc62c4a4,
  213839. 0x476b0ec5, 0x64b00763 },
  213840. { 0xb3c9a404, 0x1e3f533e, 0xb7ef9952, 0xb1db7f73, 0x6c253693,
  213841. 0xc7f13e29, 0x0738eed4, 0x7ce7f4c4, 0xce26cad0, 0xccfd3b33,
  213842. 0x01ec5cf1, 0xd8784935, 0xdc084e01, 0x3f8fc09d, 0xc39b5acf,
  213843. 0x217cab32, 0x9ef5551c, 0x42daf0bb, 0xe1217a95, 0xfbc76f56,
  213844. 0xc237002a, 0x80178b12, 0xb070a293, 0x0b52c39f, 0x576ca964,
  213845. 0xe3925153, 0x19d68e36, 0x25559424, 0x09e50e84, 0x291fb82c,
  213846. 0x6618ed8c, 0x7dd22ea6 },
  213847. { 0x49cbb3bf, 0x7ffe844b, 0x5562fb25, 0xde0cc704, 0x9f5a845a,
  213848. 0x1e6ee537, 0xe51277fc, 0x956d7f26, 0x30635718, 0x2c75d4b9,
  213849. 0x96957f34, 0x39a14892, 0x82e5742b, 0x8cf4eb32, 0x83247b72,
  213850. 0x6b0d3ddd, 0x201a4237, 0x67a9f633, 0x1414a485, 0x416403c1,
  213851. 0xb6f6a916, 0x60afd447, 0xdac6f790, 0x95f94930, 0xbd3b9d82,
  213852. 0x685ff94b, 0x51cadf0f, 0x5c8f98fc, 0xb13b7489, 0x9559c88a,
  213853. 0x5f18fcc8, 0x31377c66 },
  213854. { 0x7dcfb35f, 0x35c5de09, 0x01cc36f8, 0x2dccca9f, 0x7576cb63,
  213855. 0x7e93e85d, 0xf7b4b375, 0x0c2dd48a, 0xb09a19b5, 0x9d95cd4f,
  213856. 0x71bfe607, 0x752ed159, 0x2596dad2, 0x439880cf, 0x69e90a6f,
  213857. 0xe52efb53, 0x03d3e60a, 0x44097663, 0xa95070e0, 0xfcf364fa,
  213858. 0x05624dd2, 0xd8f993b6, 0x00d5e467, 0xb35a9824, 0x0c8f4524,
  213859. 0xe289d024, 0x648a0179, 0xef45423c, 0x587edabd, 0x3a5fd695,
  213860. 0xa11e5271, 0x3dacc50c },
  213861. { 0x6499ae4c, 0xcb3e4f94, 0x7053c527, 0xa46dcbe1, 0xbe782e8a,
  213862. 0x807f5ce9, 0xd8481e45, 0xb6c64d28, 0xaa286fd0, 0xf35e4518,
  213863. 0xdf1cdb49, 0xf7b7b9ba, 0xaec23eaf, 0xf3fb6210, 0xb9bfd2fb,
  213864. 0x0a9ba385, 0x8807f3a0, 0xe51a0d53, 0xb17b2842, 0x7ab24404,
  213865. 0xf9dd9f0a, 0x6fd57687, 0xf3e9df64, 0xcd1efdb4, 0x60df194d,
  213866. 0x5dd2df7a, 0xe069df05, 0xbed3f2c3, 0x23248a31, 0x469b7561,
  213867. 0x694744f7, 0x866949e1 },
  213868. { 0x3f4ab07a, 0x3a9a0da5, 0xf54a6fbf, 0x2cd6f333, 0xb23cf290,
  213869. 0x0c92e921, 0x848e3d58, 0xc9581c3e, 0xd3b218ab, 0x93af1fbd,
  213870. 0x066cb4d7, 0x38598ea1, 0x990c03a0, 0x5001394e, 0x7d0877b5,
  213871. 0x3b664b1e, 0xd74c7091, 0xd79db1bb, 0x4e2d5dd0, 0x852d4435,
  213872. 0x3329db82, 0x0d2b841b, 0x7b96d480, 0xfa844eb0, 0xc295dc46,
  213873. 0x37a50569, 0x94f7ec4e, 0xc2d38373, 0x5b083177, 0xdc3884ff,
  213874. 0x8b1fa598, 0x574352b8 },
  213875. { 0x0d5d7ce9, 0xed2193f7, 0x0b487eaf, 0x3c19fd26, 0x7be65fd0,
  213876. 0x7c44ab59, 0x78270d56, 0xdd9da860, 0xbaa70198, 0x8a84ec00,
  213877. 0x285985df, 0x2ec27e49, 0xde2028d8, 0x996ccaf0, 0x61c2201d,
  213878. 0x4e7648c7, 0x091c19eb, 0xa96335bc, 0xf0d6782b, 0x253a3a69,
  213879. 0xd2946493, 0x3f204340, 0x099f6873, 0x444521a1, 0x6996011a,
  213880. 0x5fcbcc09, 0xf853a94e, 0x3884d5d8, 0xd3b6a3a1, 0x2418c624,
  213881. 0x06ae3c4f, 0x3e431af2 },
  213882. { 0x83d381f1, 0xf967d939, 0xd0c033c3, 0x36501aae, 0x54410768,
  213883. 0xbf3af4d0, 0x5093a6d3, 0xa86d1598, 0xd92f2900, 0x43ae0741,
  213884. 0x36f0b755, 0xfeb2afa6, 0xaa456d6f, 0xd090a6a3, 0xaefdb646,
  213885. 0x336a4fda, 0x1a942f7d, 0xfd1bfe44, 0x851ee41e, 0x7fc2a3ed,
  213886. 0x11e935c5, 0x4f1c9686, 0x53bbb343, 0xcd577666, 0xad896c2a,
  213887. 0xf26931ba, 0x86bbfa41, 0x8a0fbbd1, 0xa203cef1, 0x1c3d7d82,
  213888. 0xe2664d35, 0x6dad3f15 },
  213889. { 0x12ec35a1, 0xd1940b7d, 0xe7dfb128, 0x6219c5b6, 0xf13321d5,
  213890. 0x2cc278c6, 0x33c58eb6, 0x5e76904a, 0xd9903c43, 0x15090f55,
  213891. 0xc3d96a19, 0x061bc926, 0x8c0acba7, 0x974a9f03, 0x7198b21b,
  213892. 0x7a414021, 0xf8958c6f, 0xb069599d, 0xbebd0129, 0x517f2f1d,
  213893. 0xdf3a8dc3, 0x1109a613, 0x672375c5, 0x08e58448, 0x9383d2d3,
  213894. 0x56590ba4, 0x0bff837c, 0xfc3ee7c6, 0x27d2d55f, 0xc87a5390,
  213895. 0x5f517a3f, 0x2438e9d4 },
  213896. { 0x8815af3c, 0xc4a45308, 0xf3c9bed5, 0xe55f1a32, 0x97b65ddf,
  213897. 0xaef1cdc9, 0x12e51eb5, 0x61c61d94, 0xe63f2490, 0xbd0dac54,
  213898. 0xd0b3e231, 0x6f14429c, 0xf1da6010, 0xf737c3c2, 0x6bbc4fb1,
  213899. 0x7150e04b, 0x1be281cb, 0x205b4c89, 0xd7701f5b, 0xf1b4633c,
  213900. 0x2a513490, 0x8b33ef46, 0x68f1f7f2, 0xddb47c73, 0xbd416b67,
  213901. 0xf4ada511, 0xff795bb3, 0x9d2a97cd, 0x96200e67, 0x00a8b7b2,
  213902. 0xafe30e01, 0x13f39011 },
  213903. { 0x7bd0c827, 0x3dd296ef, 0x4a29ff46, 0x506110f3, 0x1c9a515a,
  213904. 0xf8793068, 0x268bca77, 0xde8d8045, 0x998045df, 0xcbb83024,
  213905. 0x68c0e584, 0x3f90d710, 0x263b6062, 0x2a838ca8, 0x535c5d0b,
  213906. 0x293bb5e7, 0x56415110, 0xceea99d5, 0x1bbda005, 0xfe311ad0,
  213907. 0xa4d8d018, 0x2497e0bf, 0x1cf2b866, 0x33dd77a0, 0xd8c4ba8b,
  213908. 0xbc075b73, 0x722b7bc9, 0x298466d4, 0xcbda1b0b, 0x17a7ce24,
  213909. 0x680703b6, 0x458d4b6b },
  213910. { 0x4d54d8b2, 0x8a26a20e, 0x4d320a0d, 0x05a5696e, 0xf994f700,
  213911. 0x698b5858, 0x2f6549a8, 0x7a4adc3c, 0x3694d00d, 0x1812e819,
  213912. 0x730402bd, 0x46b9b000, 0xa1b36410, 0xe10a1449, 0x99230220,
  213913. 0xeae95ea5, 0x1b4820c3, 0x3efc2e9b, 0x85c9eb8a, 0xfe5b5cb5,
  213914. 0x97847064, 0x21ae0319, 0x8f27d49f, 0x68ef0b70, 0x2f72556b,
  213915. 0x3259ef18, 0x624db01a, 0x00ae0457, 0x5668f95c, 0x628e3b06,
  213916. 0xb6fbbf91, 0x5f13f5fa },
  213917. { 0x3a9b0dc6, 0x7c6ed9ae, 0x6f883ec8, 0xaea1bde9, 0xea8b3677,
  213918. 0xea66bf88, 0x9a66e3ab, 0xdefa6abc, 0x68217ffd, 0xc4d3317b,
  213919. 0x290df05c, 0xf741c8f2, 0x7d11674e, 0x1f0fdf17, 0xc35989ca,
  213920. 0xfdf0ece7, 0x6b9c482d, 0x0eed92df, 0x55bf1ca7, 0x73713e66,
  213921. 0x25cec99c, 0x90acb290, 0xe803e69c, 0x37c9e3a2, 0x17713a1a,
  213922. 0x7c0a3c53, 0x6f5a174d, 0x350dc565, 0x05f802f6, 0x11625a44,
  213923. 0xa37ba4a2, 0x2196495d },
  213924. { 0x13142680, 0x00cb2fd3, 0x65d14cf4, 0xab9e91d7, 0xdfe2669e,
  213925. 0xc6a0ceab, 0x0ae22bc5, 0xbeefce58, 0xcb6ec250, 0x3c2b7986,
  213926. 0xd738f1ff, 0x84adb1a2, 0x516ec8ec, 0x9709bc28, 0x8e8f7db5,
  213927. 0xf3693129, 0x95b197f9, 0xc48efc6b, 0x9aaaa404, 0x9ff10952,
  213928. 0x144154b0, 0x2c3c8cbd, 0x427f3435, 0x33ef7bc3, 0xd21897c1,
  213929. 0x04a17940, 0x6ce548a0, 0x5aa0c47d, 0x3d56fa62, 0x2971cea7,
  213930. 0x04475f08, 0x93ad0eb0 },
  213931. { 0x988a9963, 0x7a0b6967, 0x6515e8dd, 0x61e477f7, 0x3b6b50f2,
  213932. 0x6274e386, 0xd33922de, 0x63a9b8d5, 0x687a5b3d, 0x3c38d3fb,
  213933. 0x1302e323, 0x18f6f09c, 0xe02fcccf, 0x254c05c3, 0x26e662f7,
  213934. 0xc04ed0b7, 0x143fe079, 0x1d5646b8, 0xc9016c8c, 0xef8a9448,
  213935. 0xf823d797, 0xe5674c4b, 0xbccde451, 0x0586f72f, 0x4417eade,
  213936. 0xc5fc88d5, 0x576e588d, 0x2b952209, 0x5844d1f9, 0x4408dd42,
  213937. 0xea41c034, 0x73f8c3f0 },
  213938. { 0x5df763dd, 0x89534fc8, 0x3ac71836, 0x3b1427f3, 0x6e8f15a0,
  213939. 0x0db5be17, 0xcb20888e, 0x1d390944, 0x857caea6, 0x7804c9ad,
  213940. 0x519f7bf3, 0xaa584428, 0x293aa8cf, 0x626eecf1, 0xea36a015,
  213941. 0x749e0d98, 0x3321edcd, 0xefff6dae, 0x28b791cc, 0x963deea6,
  213942. 0x2d16e361, 0xa14e0552, 0xb15ae206, 0xa2e058fc, 0xfca325e4,
  213943. 0x0f268745, 0x21341a8a, 0x7cf9d407, 0x7caa51b8, 0xdfed25d9,
  213944. 0xadbedd75, 0x0108ae39 },
  213945. { 0xa9e88f63, 0x54d178f3, 0xab0c7325, 0xaa05b11e, 0xe261d8a6,
  213946. 0x773a53e6, 0x8d0b91c8, 0x24db7dae, 0xe9bb004d, 0xde10b073,
  213947. 0x54e3090b, 0xfc8befe7, 0x0cc69c89, 0x16af0599, 0x9d59511a,
  213948. 0xddc83803, 0x46c5dafc, 0xc3f65b99, 0x1ee0a599, 0xfbbe4be8,
  213949. 0xfb3a9b17, 0x88891e36, 0x445dad00, 0x0c9aad75, 0xd5097e1f,
  213950. 0xdffc46ab, 0xac85a4e1, 0x8848089b, 0xa0c45233, 0x348bb42f,
  213951. 0xeb13c1df, 0x807c06d8 },
  213952. { 0x98ee0ef6, 0x00a969ec, 0x8bb7b7af, 0xba9d5483, 0xa02f8fdb,
  213953. 0x24484c92, 0x8b70557c, 0x7bdb201a, 0x60ad1af2, 0xe59343e4,
  213954. 0x998c95fb, 0x53a9a942, 0xda861d3b, 0x974db3de, 0xed399c0e,
  213955. 0xce1525c9, 0xf72109bd, 0x89b56881, 0x998211a4, 0x08ff7d15,
  213956. 0xef0f275a, 0x5df76b3a, 0xfa2f358b, 0x93f180f7, 0xc39b0634,
  213957. 0xaac4ffcf, 0x17583b53, 0x2692c626, 0xb55399fc, 0xb2fdfa36,
  213958. 0x99607a61, 0x16424c6c },
  213959. { 0xdd2744a9, 0x5dd65c55, 0xfe3af418, 0x2544c1c2, 0xefe8b089,
  213960. 0x32c82e99, 0xa9df691a, 0x30b7ab25, 0x9be99674, 0x98384550,
  213961. 0xcaf2d122, 0xbcecd258, 0xbcc77272, 0x88ae4098, 0x4b8efa0c,
  213962. 0xd4396141, 0xed64d12c, 0x44ff67b9, 0x2e7f3404, 0xa9e655e4,
  213963. 0x45b0e9eb, 0x3d16fc45, 0xf03ded28, 0x474a3e14, 0xacccb85c,
  213964. 0xa3c9adff, 0x7253a51b, 0x3dfe6bc1, 0xfb5831b1, 0xdddaf4b9,
  213965. 0xa4f4478a, 0x5544e602 },
  213966. { 0xbaa80b4f, 0x897c5313, 0x63bdc8ef, 0x0122716f, 0x7b42c5a8,
  213967. 0xae2742db, 0x0883308c, 0xe9d9e1e9, 0x2d341ab1, 0x352c8c3f,
  213968. 0xed945870, 0x163d0500, 0xc290d9d8, 0x8349dd73, 0x1f6c7d29,
  213969. 0x2053c5e0, 0xcb42033c, 0x83107446, 0x09d09af1, 0x76c88bd2,
  213970. 0xb2794681, 0xd0f70e6e, 0x19b1b540, 0x720b59de, 0x22994b43,
  213971. 0x80b7ecdc, 0x2dec53cf, 0xc1a4cdce, 0x1ed60f42, 0xdd7d3edd,
  213972. 0xe241d261, 0x5735995c },
  213973. { 0xa0237056, 0xdc4ba3fb, 0x33ab3388, 0x6856c164, 0x271ec612,
  213974. 0xc01eebbd, 0xe3031bec, 0xabdeb033, 0x6118a1f5, 0x4eee4419,
  213975. 0x5b600f33, 0xec497421, 0x08868773, 0x1b7185cf, 0x7c1b7dfd,
  213976. 0x7b0c46cd, 0x4a4c5e89, 0xd143b2da, 0xbb1ff94d, 0xdb9a5984,
  213977. 0xc9cf3465, 0xac3904e4, 0xeace64c9, 0xf8729bc0, 0x768ad99a,
  213978. 0x5cc22821, 0x8a9540c2, 0xbbd3b081, 0x049a6917, 0xe468ed5f,
  213979. 0x3ec45ef0, 0x885486df },
  213980. { 0x4bdff464, 0x6a942c93, 0x25a7b451, 0x3db2719f, 0x325be324,
  213981. 0xccb0070b, 0x19fe3339, 0x2055a31b, 0x241ee8ff, 0xaca69ae8,
  213982. 0x55ef8def, 0x7607dd08, 0x1a1b73c6, 0x9e24960f, 0x71d36810,
  213983. 0xbcb0e8a2, 0x6885e6b9, 0x29e11aa2, 0x185eae19, 0x98b5d0ab,
  213984. 0x0f81f91c, 0x1a0b96e4, 0x994fc503, 0x4d0e8bcf, 0xf119d6e0,
  213985. 0x33d81697, 0xaaa4ce0c, 0x29083287, 0xc91ff9d7, 0xc5dd4d3e,
  213986. 0xd4ab962d, 0x31cecfe8 },
  213987. { 0xfc8b21e8, 0x437bfd9a, 0xb19436df, 0xe5dd32b3, 0x921c36a0,
  213988. 0xfe5902d4, 0xa3d0fa90, 0x8e9de84d, 0x5bb523bd, 0x9663e6ad,
  213989. 0xaecd6975, 0x9800a23f, 0xb4fbb59c, 0x1009c0d9, 0xc9d20ff1,
  213990. 0x839aa7bd, 0xecd6fa3d, 0xf502f66d, 0xc5516ca9, 0x480ed4fb,
  213991. 0x6c742ac4, 0x65ffa5f6, 0xff3252f8, 0x2b7c7945, 0x75d9cb3d,
  213992. 0x72fefc05, 0xd6d6f1d2, 0x11b0863b, 0x9a6a4ec3, 0x5d8f3cf0,
  213993. 0xda2547b3, 0x6961b46a },
  213994. { 0xcb35e2ac, 0xd07b587e, 0x57af14d9, 0x1ed5546b, 0xdb28a04c,
  213995. 0xeca17a5b, 0x709d54f0, 0xa1f91d44, 0x9c6f400e, 0xa6e719fd,
  213996. 0xfb8ce190, 0x4e4b88ed, 0x246e3fd2, 0xf9781edd, 0xb655af5d,
  213997. 0xd67120e6, 0x93413ca7, 0xda782d1d, 0x9707fa21, 0x697e20a2,
  213998. 0x54e84123, 0x1eb51f32, 0x36051f9f, 0x2e254d9e, 0x73ce5be9,
  213999. 0xddaec42b, 0xcd3f794f, 0x89a9a32e, 0x0781aad9, 0x1964e22f,
  214000. 0x53755212, 0x6a63a90c },
  214001. { 0x3d7acbbb, 0x76554e00, 0xb74f6108, 0x2c01668a, 0x388c519b,
  214002. 0xe4a29672, 0x3eb94d4f, 0x01667714, 0x0cd6d2f6, 0x086a3cdf,
  214003. 0x7b370f7f, 0xf8658021, 0x5a4d3e7c, 0x658880c1, 0x5ba3f4a1,
  214004. 0xd6ed5816, 0x5ca471dd, 0xabcc7813, 0xe844a576, 0x809bf074,
  214005. 0x6ea502ea, 0xa53a81b3, 0x0e021ed3, 0xc20b9307, 0x8617f165,
  214006. 0x8c27f892, 0x8235cd0b, 0xa5476446, 0x82552961, 0xffc89ffd,
  214007. 0xd151d90e, 0x51ed4a22 },
  214008. { 0x449701b4, 0x37d6963a, 0xbb27caf2, 0xea8d91a3, 0xb572965f,
  214009. 0x3ef9be15, 0xdb50bf7d, 0x75a7a055, 0xce643b9b, 0xfd67480e,
  214010. 0x6ceb5d5e, 0xf2a60d2d, 0x5ed7c897, 0x68fc320c, 0x28ce685f,
  214011. 0x41c53cf6, 0x7106615e, 0x0e29711f, 0x23500ecc, 0x7a872138,
  214012. 0x6c29fe48, 0xaf0a9260, 0xe1ef9712, 0x93df3f2a, 0xd2d169bf,
  214013. 0x0d5f6fb1, 0x74a9793c, 0xeb7afe26, 0xe9f49256, 0x4173d94a,
  214014. 0x2b8b5ce5, 0x2d6951bc },
  214015. { 0x904e222e, 0xdd007d9f, 0x86f4e109, 0x333f248f, 0x8f429eee,
  214016. 0xd4994e8b, 0xcfc77518, 0x29573415, 0x0b0f42f1, 0x6e7fea3a,
  214017. 0xc2743519, 0xc795cb7d, 0x711e71a0, 0x820a8f66, 0x2b874f55,
  214018. 0x83d95d9c, 0xe70e1627, 0xd4b64d78, 0x8b92a742, 0x924353f5,
  214019. 0x447b5e6d, 0x322048b1, 0xbcf931a0, 0x0bad730c, 0xa7af2268,
  214020. 0x75c4d089, 0xb83b93f9, 0x464904c1, 0x165b3aee, 0xa24eba02,
  214021. 0xe08cc5f0, 0x65c48e78 },
  214022. { 0xde222c22, 0x1a1c73ce, 0xfcea23b4, 0x5683d8cd, 0xb2143b06,
  214023. 0x0301cb14, 0x59fcec77, 0x284adf8f, 0x31204cef, 0xfb1c581c,
  214024. 0x94735107, 0xf54d3eee, 0x4d3188c0, 0xdbf67f0b, 0x10f18d12,
  214025. 0x76a3f2d1, 0x07d3e013, 0x3809fa28, 0x25e7ece0, 0xf06f0a46,
  214026. 0xb2895d2e, 0xd82867ed, 0x08b0553a, 0xe106f489, 0xef245445,
  214027. 0xe2280fa6, 0xa8d9a3cb, 0x402d5785, 0xd438ba2d, 0xf63dd9ff,
  214028. 0x7a6b226f, 0x36b5cd2c },
  214029. { 0x545679a7, 0x87ff4e20, 0x4520c750, 0x64d80b41, 0x9b459cd8,
  214030. 0x90a357fa, 0xc85af1a3, 0xa19eaf39, 0x8d935a5e, 0x0d475d79,
  214031. 0x781a678a, 0x74501983, 0x0cc2e810, 0x74839779, 0x2f412244,
  214032. 0xc6a21d11, 0x36a51a37, 0x8d0e85f9, 0xeaa74df8, 0xff50151e,
  214033. 0x93cf99c4, 0x14e182a7, 0x376a9ab6, 0x45593df1, 0x522389ff,
  214034. 0x18f73caf, 0xf7445e8a, 0xd27cc960, 0x39a51dc8, 0x0692f4c5,
  214035. 0xdb39bfd8, 0x08d7c144 },
  214036. { 0x3ecca773, 0x809c0d96, 0xd48c2156, 0x87ea9192, 0xdb6bd641,
  214037. 0xf0eccd74, 0x2a678cdf, 0x77312374, 0xd1587b7e, 0x7a966d8b,
  214038. 0x6130a4c6, 0xf3c1a101, 0x5fce17bd, 0x7cc6e838, 0xa8de7aa4,
  214039. 0x95e95bb8, 0x898308e3, 0x3fe1e8b5, 0xe347694a, 0x0197243e,
  214040. 0xbb0cd2bf, 0xf3fe9c42, 0x0f9b2b49, 0xb5905264, 0xc7367d1f,
  214041. 0x4c385e8b, 0xb5ee147b, 0x1d3050ae, 0x04004ad9, 0x8e2c3879,
  214042. 0xbab70202, 0x5f2aa8ee },
  214043. { 0x1266524b, 0xe208d464, 0xd0a19f66, 0xb7bf3880, 0xda106ebf,
  214044. 0xa5aa685e, 0xe642dd46, 0x0a69e8d3, 0xc682e4d6, 0xef349c61,
  214045. 0x0fcb534c, 0x26f6ee3b, 0x05eb67b8, 0x7daba127, 0x18be05f6,
  214046. 0x2babb27e, 0x8e2d85d1, 0x959afcba, 0xe2d9d386, 0xedcf2d1a,
  214047. 0x1ea6f06e, 0x59dc52e6, 0x866e5ae8, 0xc28278b4, 0x02bcd3c7,
  214048. 0xd9ff0340, 0x784be82f, 0xe884ac76, 0x83c9f224, 0xa3164980,
  214049. 0xb46ff949, 0x62501a98 },
  214050. { 0xad264086, 0x563f7d9a, 0xa5e0e4bd, 0xca6a33db, 0x8c8d3d67,
  214051. 0xe8253002, 0x46e64b19, 0xa288dac8, 0x20aa4536, 0xfa3c9197,
  214052. 0xed553eac, 0x8130c9b0, 0x2ea8abd3, 0x622806e0, 0xceccfe77,
  214053. 0x52fbf54d, 0x4f0d1b70, 0xbd9a8e31, 0xd59b1741, 0x519d2133,
  214054. 0x9a6fea8a, 0xfd74101c, 0xb5c4eb10, 0xd1acf7a0, 0x91f9da5e,
  214055. 0x78499b73, 0xc0dea586, 0xabaa4c49, 0xa1f3531a, 0xcc9c5f73,
  214056. 0xfd3fc665, 0x497b15fe },
  214057. { 0xf45568e9, 0x8a56cbaa, 0xc7192a6f, 0xf491a0fe, 0x9ab2539a,
  214058. 0xdbb03dd3, 0x4ac37da9, 0xc86522f8, 0x02a0f5b4, 0x8c8cdba2,
  214059. 0xa29c539f, 0x8109fc75, 0xca90f02e, 0x9cd06d31, 0x3e216dbf,
  214060. 0x8f31f044, 0xba3ebd91, 0x99aa68ac, 0x42c007f4, 0x2a80d0d2,
  214061. 0x86a9b7ce, 0xdd8dffbf, 0xd6308edc, 0x405d3e84, 0x068012ca,
  214062. 0xdafa33fe, 0xedea1071, 0xc2eebd13, 0x2ff637e6, 0xb7ae7e5c,
  214063. 0x9e514cb7, 0x18d46a6c },
  214064. { 0xa78b7802, 0x868cbb22, 0x497cbaf4, 0x0745ddb2, 0x42ae8add,
  214065. 0xc4eb2f3e, 0xb4ceb4e4, 0xac0abcda, 0xa325fd40, 0x2e0d8325,
  214066. 0x13ac7345, 0x6cfe0571, 0xb14171b9, 0x7407a788, 0x6da7a52b,
  214067. 0x70eb0603, 0xd85176ac, 0xab0b36f9, 0x7c2954f3, 0x14109d29,
  214068. 0xdcd705ad, 0x370de9c8, 0x7bb5e751, 0x3f0db5cd, 0xa06e708c,
  214069. 0x45f93d41, 0x7e93050d, 0x10d54f8a, 0x5a38fef9, 0x69e6f8e4,
  214070. 0xd3f62e40, 0x55044601 },
  214071. { 0x06cb9cc9, 0xd1c5c910, 0x41d00014, 0x542074d7, 0x11236fb8,
  214072. 0x7cd8663e, 0x29ad5f82, 0x39721ffe, 0x2951fc83, 0x1d21fbfa,
  214073. 0x400d144f, 0x1cde06e7, 0x91792e6b, 0x9042596b, 0x29ad5166,
  214074. 0x3365c8e5, 0x9aeefe98, 0xe2220e85, 0x70c2aee3, 0xbcb53189,
  214075. 0x9ff100bc, 0x477ca3db, 0xf532973f, 0x27074176, 0x9a2bd01b,
  214076. 0xa12118ac, 0x3dd79f93, 0xf3425209, 0xc6f5d7db, 0x563a8ff7,
  214077. 0xd7b0ec4f, 0x0da313fc },
  214078. { 0x15aa2557, 0x37125a8c, 0x00893e9c, 0xca21d70c, 0x67b8a823,
  214079. 0x48713994, 0x7cb0042a, 0x0d3e9a74, 0xc9e2ce18, 0x2d2bf4ff,
  214080. 0x049aeac2, 0xd5531a0d, 0xf03d0660, 0x4d29a616, 0x1f1b7f00,
  214081. 0x473d50d6, 0xca3de50c, 0x3af0ecbb, 0x09c28f27, 0xe2959bea,
  214082. 0xf8704664, 0x6d7c2ea0, 0x731083ef, 0xadfae4e1, 0x941c2554,
  214083. 0x50940c26, 0xa1162d03, 0x44167410, 0x1e82290e, 0x620230d8,
  214084. 0xdb414acc, 0x63630be8 },
  214085. { 0x8a7d2e41, 0xbf8d5222, 0xeb62f879, 0x49e75823, 0x6c402d89,
  214086. 0x1b4d33dd, 0xde2c59ad, 0x883e04d6, 0x49b9dc38, 0xbf3f38f4,
  214087. 0xb4b70c4c, 0x9d997d18, 0x13cea045, 0x1f69b20c, 0x58e2606d,
  214088. 0xca3d7025, 0x261d1b79, 0x3d4fd977, 0x5a1436fa, 0x56aeafa8,
  214089. 0xbb443c07, 0x369b3e98, 0xe558f6be, 0xfce5186c, 0xf8ac8f89,
  214090. 0xeb0cd478, 0xd5e5aa72, 0x68074f37, 0x68544eb0, 0x295845c0,
  214091. 0xf16688ed, 0x306a9871 },
  214092. { 0x634ec136, 0xbc451e9d, 0x0e6f658f, 0x1edf27ca, 0xc0db4120,
  214093. 0xa9be0152, 0xc5bfee67, 0x87b6ef20, 0x9a2d6023, 0x35283238,
  214094. 0xc7afb899, 0x60e564d8, 0x0ac9c2de, 0x4af22bc0, 0x82a9d22b,
  214095. 0x28e6f631, 0xf532701b, 0xc075c701, 0x82075f91, 0xf6d418f8,
  214096. 0x1beaa511, 0xf9fa628d, 0x6e72a13d, 0x551e7a17, 0x77f4c01c,
  214097. 0x9306215b, 0x93c9d588, 0x71aba731, 0x58e57cd4, 0x6443ebe0,
  214098. 0xe8103e37, 0x2833ac41 },
  214099. { 0x8da5ec5c, 0x7e564b86, 0x1c08db24, 0xac3d9da8, 0x8c57a728,
  214100. 0x9d7c1f0b, 0x9d343dc2, 0x3512afe7, 0xfdc60339, 0xb438e4cf,
  214101. 0xdcfa1941, 0x7d5a2700, 0x27320449, 0xd5f323f8, 0x1393c6e6,
  214102. 0x1b87a58e, 0x04baa431, 0xecb68bd1, 0x4722b4d7, 0xc09c1c5a,
  214103. 0x206b5faa, 0xf42faa97, 0x9976327e, 0xe1dcbcd6, 0x087787d9,
  214104. 0x655ba9e4, 0xde5c0191, 0xbd59c757, 0x0bcf3538, 0x673020ed,
  214105. 0xa49d6303, 0x120cd454 },
  214106. { 0xcab0f9ee, 0xebfdb8f4, 0x2cce58ee, 0xbc003ef0, 0x5a8d0665,
  214107. 0x9b6a6841, 0x9b957774, 0x642ed3a6, 0x4721ab5c, 0x3de487f0,
  214108. 0x21a4f0d3, 0xef2ff380, 0x29dbddcd, 0xbd16f558, 0x0e93dff2,
  214109. 0x2ef05b4b, 0x0bc9aec1, 0xde1faa12, 0xd467fa92, 0x66dae2c2,
  214110. 0x5eb33e34, 0x758daf64, 0x8f0103cb, 0xa67ad9f6, 0x9be02430,
  214111. 0x151f693a, 0xeb4054bc, 0xd5698496, 0x7019336e, 0x8ef1677e,
  214112. 0x7fdeea3e, 0x021cfd16 },
  214113. { 0xdf5c36f3, 0x5c73715f, 0xd64ad254, 0x703bde37, 0xf2cf7713,
  214114. 0x55368d10, 0x0f3993c8, 0x1e5ec7b7, 0x304ae4ca, 0xfdb16776,
  214115. 0x3d3bb18b, 0x0d8f717e, 0x66343d5a, 0x5267073f, 0x156008b5,
  214116. 0xfaeb52ef, 0x224a470f, 0xb97ad5f9, 0xed2ab51a, 0xaf86e391,
  214117. 0x9974302c, 0xdc0c7e57, 0xfd0ae28a, 0xc88fa817, 0xbf8ed59c,
  214118. 0x807c22df, 0xeb128bb6, 0x5dedc231, 0xa20595a3, 0x71edcd9c,
  214119. 0xc73cf78e, 0x07265b46 },
  214120. { 0xbd66232f, 0x73dd99f0, 0xc4027716, 0xc59aaf89, 0x5b860fc4,
  214121. 0xaf826dfa, 0x7a943f3b, 0x239ea8aa, 0x523c428d, 0x0e0e1b1a,
  214122. 0x6973b95a, 0x55ea0e3a, 0x2557753b, 0xea399caa, 0x06957b1f,
  214123. 0xf8adf72f, 0x3bd34302, 0x0389f341, 0xf8a43a97, 0x333f27d0,
  214124. 0xadaf796f, 0xcd9c0c08, 0x49c12aa2, 0x6dcca49b, 0x7a0ac6e9,
  214125. 0xdd88deee, 0x0644080e, 0x8f47575d, 0x0cc2f4bd, 0x6e9d667d,
  214126. 0x31d1496c, 0x36c5754b },
  214127. { 0xf323d84b, 0x9120046e, 0x7e789c4f, 0xa6991122, 0x921b8055,
  214128. 0x4b0eaf4e, 0x8079974e, 0x6339844a, 0x740f8c79, 0xc905466a,
  214129. 0xcd6def49, 0x1c18d0f7, 0x4b23e4ba, 0x5297da6b, 0xc41800c5,
  214130. 0x1c09dff3, 0x37ef6777, 0x6c49075b, 0x50513ded, 0xa94c3a40,
  214131. 0x6b0b1705, 0x3d6742e9, 0xc48af5ae, 0xc0784494, 0xc95822de,
  214132. 0x40c01532, 0xc164d94f, 0xa2ddade5, 0xa2975eb5, 0xfc8a8ac9,
  214133. 0x1946944e, 0x06fbf861 },
  214134. { 0x3f45aa97, 0x2d65338e, 0x1d040feb, 0xd83b58c8, 0x0fdef8b9,
  214135. 0x05fef59b, 0xe4d7417c, 0x7beb071a, 0xb30a1a23, 0x982b61f5,
  214136. 0xfb65bd03, 0x4c5f2a2a, 0x5cbf6bf3, 0xe40abc9d, 0xf06612a5,
  214137. 0x422c326d, 0x9571ae28, 0xc921e69d, 0x23d3434e, 0x7c88b10b,
  214138. 0x9da07933, 0x96d2e957, 0x3619cf4d, 0x833d46a1, 0xd95eefa1,
  214139. 0xd9d19653, 0xa03e8f0e, 0x2a7d8411, 0x04bb5ab1, 0x5e642953,
  214140. 0x1f0fa9ea, 0x5e9ca0fd },
  214141. { 0x197c5dc4, 0x5bd54571, 0xe78a95a2, 0xe2da40bf, 0xffdb0eb2,
  214142. 0x65fb9efc, 0x0d17467c, 0xe952dc2c, 0xc758c6a3, 0xc1fc9c7b,
  214143. 0xd4034a9a, 0xfc79562c, 0x61f64b56, 0x26e36fbe, 0x1e84728b,
  214144. 0x6adc4b9e, 0xa8f9ac8a, 0x7f165fd3, 0x03e3e013, 0x7bc93a45,
  214145. 0x656478e3, 0xeacc5513, 0x064ddc77, 0xd3391717, 0x76936914,
  214146. 0x75b318dc, 0x362424a6, 0x69b1f1c7, 0x49955f34, 0x8cc2045b,
  214147. 0xc6836af8, 0x940622b3 },
  214148. { 0x0d997973, 0x4710ccb7, 0xd3f8f115, 0x3b29625d, 0x5b97abd5,
  214149. 0x8cf0c4d5, 0x673e14a5, 0xc6321e0a, 0x3d262246, 0x0541af9d,
  214150. 0x6fc83b11, 0xde6d8754, 0xf01652a4, 0x47e97da8, 0xad9802b6,
  214151. 0x0f82b3a6, 0xae9c44b2, 0x69aa4075, 0xced2bf77, 0xaf3f5de2,
  214152. 0x497a40da, 0x1ef1ea8a, 0x3c23ba9c, 0x2e0f8608, 0xf190a2c8,
  214153. 0xd8a998a4, 0xcfde3368, 0xe2b49c8c, 0xbde6bd71, 0xb9f49824,
  214154. 0x785bedb6, 0x80bb1664 },
  214155. { 0xfd145cb5, 0x05e575fe, 0xac5e6883, 0x155ee561, 0x8793b273,
  214156. 0x461e70cf, 0x133b2338, 0x9f1553de, 0xa2a7ba07, 0x2fb9e0c3,
  214157. 0x3e7086fa, 0xc3bfd6a8, 0x8bb4cb93, 0xb6ba8500, 0x76f82dbd,
  214158. 0x0b66d789, 0x54eb49ff, 0x7d5a6ff6, 0x1f20b322, 0xcd65d237,
  214159. 0x54e29cdc, 0x79ea49c2, 0xcb118ff9, 0x64975963, 0xcc58000b,
  214160. 0x969598dd, 0x110c779c, 0x95107918, 0x63b85a35, 0xedfc1548,
  214161. 0x41212350, 0x077ba5ea },
  214162. { 0xcdd86f61, 0x0b3a38d3, 0x0502a0ab, 0x43121445, 0x806d0272,
  214163. 0x1912edc5, 0x8a32f10f, 0x01dc1f98, 0x0e80c760, 0xbb1d31d1,
  214164. 0xf464e8b3, 0xd46ec7e5, 0x9abf49ee, 0xd569af36, 0x2cdade77,
  214165. 0x9d286ea7, 0x45ad5920, 0x2be7020d, 0x6299ae7f, 0xabe5236e,
  214166. 0xd3f55c07, 0xc93179bd, 0x52350e80, 0x8138995a, 0xaff07586,
  214167. 0x0901265c, 0xf4739653, 0x5b3c81b2, 0x9bc77d21, 0xbaf7581d,
  214168. 0x4591a2e2, 0x6b2006df },
  214169. { 0x965b1bc1, 0xb2fe50a8, 0x962bb4fd, 0x931f536a, 0x000e7f99,
  214170. 0xd5718d33, 0x53d5125e, 0x84728f25, 0xd2125caf, 0x4f8a6184,
  214171. 0x357f679e, 0x54f1a701, 0x1531c05a, 0x70a9f40c, 0x6fa8b775,
  214172. 0x10d0cb97, 0x9dc12ce9, 0xb476f41e, 0x2755f894, 0x5c8d7a75,
  214173. 0x625741a4, 0xd6c12e10, 0xc917b16c, 0x262a6fb8, 0x38d6b0a0,
  214174. 0x24d116e6, 0x32c38e83, 0x849540c0, 0x66868afc, 0x855b911c,
  214175. 0xbd26b550, 0x53217ea6 },
  214176. { 0x259f52b4, 0xfc840473, 0xe621146c, 0x968da9cb, 0xcacbd26e,
  214177. 0x964eb85e, 0xe4a54344, 0xab7daa2d, 0x381a4ff7, 0x6dc3b848,
  214178. 0x41c815ef, 0xa07a96b3, 0xc3d4b1e1, 0xc4fae9e8, 0x42ce9ea8,
  214179. 0x0f938d1e, 0x35cc052f, 0xa727dacc, 0xe9a06f07, 0xc81e01c9,
  214180. 0x4a6d65a1, 0xa9e08dcb, 0x6044a9a6, 0xf8e2d173, 0xf2bd295b,
  214181. 0x99893dd0, 0xf9781b12, 0xa08d3379, 0x61830ac2, 0x64bd6001,
  214182. 0xd9adbeef, 0x0386931e },
  214183. { 0xd09885a5, 0xd0d7abb3, 0xe355bb07, 0xed9d2b67, 0x536ebaed,
  214184. 0x3bc238cf, 0x699ce4d6, 0x61ca2e78, 0x111594cd, 0x354ff447,
  214185. 0x03316ad2, 0x55cbe709, 0x49fff5c4, 0x418679fd, 0x0f9c6c40,
  214186. 0x75bacd75, 0x2972721a, 0x677edc88, 0xe5ef502f, 0x82596887,
  214187. 0xbf320e0e, 0x459e9367, 0x8bbdccb2, 0x81ce36ef, 0xb766863d,
  214188. 0x1ba097fc, 0xd58c6db8, 0xcd3a21d6, 0xb4a8748b, 0x0e4967cd,
  214189. 0x15041c20, 0x2caaf749 },
  214190. { 0x6ed20424, 0x44f98006, 0x22471545, 0xb3e4ea23, 0x781a8c86,
  214191. 0x268ed1a5, 0x7ae5b70b, 0x48d0ab75, 0x356d3982, 0x6ca8b320,
  214192. 0x2df31fa4, 0x9ce8e681, 0xd925dcf2, 0xb909d232, 0xf56723de,
  214193. 0x302c8f78, 0xabac96f9, 0x11725d69, 0x57d1a170, 0x656a47ca,
  214194. 0xc18a2be7, 0x6bb5d511, 0xad50d9d9, 0xb56e45f1, 0x70b05518,
  214195. 0x36e886e2, 0x09d8ff91, 0xc7c71f3d, 0x9350361e, 0x65a1bbe2,
  214196. 0x45fe3bd8, 0x86d7f532 },
  214197. { 0xb0bf719a, 0x99f16eb6, 0x8bc3d913, 0xb6975098, 0x26cd01b4,
  214198. 0xfae50e52, 0x90898d1c, 0xd3e3ac54, 0x887ec666, 0x4da3b9db,
  214199. 0xfbea45b8, 0x58300644, 0x8355b058, 0x369f3bd9, 0x579bcc13,
  214200. 0x0fb239a8, 0x6e2bd811, 0x4f5b4539, 0x24198fd2, 0x007f3baf,
  214201. 0x8837d51d, 0x68a676db, 0xeae75b16, 0x68eeea62, 0x3db6083c,
  214202. 0x5ffe5f94, 0x7d836c5a, 0x52c94d0f, 0xcbc1ff85, 0x5a4c3c6f,
  214203. 0x86c0b4dd, 0x682a55e3 },
  214204. { 0x587495aa, 0xc8f235a4, 0x34c7245d, 0x2276026c, 0xb75a46e3,
  214205. 0xd6ae0cc5, 0xecc3e5e7, 0x890d3965, 0x14296629, 0x1b13342f,
  214206. 0x8a877227, 0xc89927e6, 0x2324a68b, 0x1543f27e, 0x49cdc21a,
  214207. 0x6c447684, 0x1452d0ac, 0x9bc7fd4f, 0xff4b045c, 0x2cc30a31,
  214208. 0x852f7611, 0x415d46a0, 0xc6fdd7a6, 0xad737052, 0x7b4c7c91,
  214209. 0xdcecc3ab, 0x7688d70c, 0xd2cdf01b, 0xe40d3905, 0x054f2542,
  214210. 0xfefe4dcd, 0x02227fa6 },
  214211. { 0xb751948b, 0x1805efd9, 0xfdfd225d, 0x8efeed46, 0x4f2c8b22,
  214212. 0xcb128e09, 0x96f7c5e5, 0x9d1090bf, 0xb4cbeca0, 0x0959d044,
  214213. 0x8e08cb04, 0x21c955f9, 0x68fa4fce, 0xbc1f279d, 0x0710ae9a,
  214214. 0xb021e14e, 0x881167f4, 0x64d16e9f, 0xbbc9f1a5, 0xf5a5c22e,
  214215. 0xe3420eea, 0x5f3716df, 0xd5c4e843, 0x971eb915, 0x28ffba81,
  214216. 0x64fc55fc, 0x7dd37578, 0x3427e54d, 0x15ebc7d0, 0x446e6a62,
  214217. 0x29269778, 0x547e249a },
  214218. { 0xa1ffda27, 0x4706868a, 0x7955cf50, 0xb4e6cdcc, 0x0a63f3d8,
  214219. 0xf65151e1, 0x9de5e70a, 0x5b4127ea, 0xf9342823, 0x3d2c09ba,
  214220. 0xaa2f7d51, 0x18c99d83, 0xddeec025, 0xa0c5bb1d, 0x03dcf1ce,
  214221. 0x7ffddf84, 0x616fdeda, 0xe57e4d29, 0x7932a1f0, 0xd2456569,
  214222. 0x3191d4e3, 0x7475e0e8, 0xc220218b, 0x3479bea1, 0x8bcb2505,
  214223. 0xfceb5c90, 0x3c6132e6, 0x1c685cea, 0xbfe6c1eb, 0xc42dc745,
  214224. 0xd2b08eea, 0x45a41cc0 },
  214225. { 0x4dbbf0e1, 0x3ea9b2c7, 0xa17cf70e, 0x41ff962f, 0x5eeb4c66,
  214226. 0xdc1ea758, 0xa9beb17e, 0x4f5412d2, 0xa285741a, 0x2c9e4f52,
  214227. 0x984fd11f, 0x93df7da4, 0x0df3184e, 0xb2afbddc, 0x2421e375,
  214228. 0x96323d25, 0x49df781e, 0xc87be1e4, 0x3d589bea, 0x145601ed,
  214229. 0x28fff6dd, 0x0f0bd9bd, 0x8a0f298c, 0x2d3259d4, 0xd88e6944,
  214230. 0x362d7a77, 0xb6ac2af6, 0xa84c06b6, 0xd087da02, 0xba850ac9,
  214231. 0x42ee40c8, 0x128763c9 },
  214232. { 0xacbac178, 0x29a80f07, 0x34b08f6e, 0x7cc20044, 0x70feded2,
  214233. 0xe9631d14, 0x86615767, 0xb2115da3, 0xcb088548, 0x7c75f5c4,
  214234. 0x9a2e8e03, 0x5b29d213, 0x8b881752, 0xfe9fda66, 0xc1de7ebc,
  214235. 0x3f1d8d88, 0x03218123, 0xb476565e, 0xb1c995f3, 0x07365561,
  214236. 0xb13eb71b, 0x2160cb18, 0x99b3a0eb, 0x7e8da513, 0xb20fcd74,
  214237. 0x5e8ca1f9, 0xb4126d72, 0x6a7e0067, 0x68bb637f, 0x1e8204b7,
  214238. 0xfc4f74d2, 0x75e96bcc },
  214239. { 0x0d19716e, 0x189d1fdc, 0x7c384525, 0xdf585058, 0xea987d2a,
  214240. 0x64a846d1, 0x6c07150f, 0x12b6bf83, 0x4d6fd5b7, 0x91d85d46,
  214241. 0x4f53f55f, 0xa9788836, 0x81509129, 0x60083bd8, 0xea876f48,
  214242. 0xa7672683, 0xc15b2489, 0xe80b2e7a, 0x42d1d992, 0x985ef8d2,
  214243. 0xcf3de492, 0x9c57b029, 0xb1487627, 0xfe02f83c, 0x8ae5b687,
  214244. 0xaeba4fe4, 0x5d6b8196, 0x8a86f09b, 0xa16e523d, 0xd88f566b,
  214245. 0xba268949, 0x309a6e9a },
  214246. { 0xbdfbe97a, 0xef27ee50, 0xb8c50c4d, 0x1a5fe70f, 0x7fe09f5c,
  214247. 0xcc7beb01, 0xbed36cc5, 0x8fa15a85, 0x7550ed3a, 0xc0c3acdb,
  214248. 0xeb908681, 0xc581ef87, 0xc49d5ccb, 0xa15b3362, 0x1fa264e8,
  214249. 0x0fbb1714, 0x8e1eee88, 0x267f8d8f, 0x21c2b63d, 0xd31ccfd6,
  214250. 0x53be7efd, 0x924dbe7d, 0xdb2a358a, 0xd42e877f, 0x75d68ac1,
  214251. 0xcf9673c7, 0x714fea55, 0xe35978fd, 0x5769b202, 0xeeb36653,
  214252. 0xd7593789, 0x0458258a },
  214253. { 0xa042dbdf, 0x5df71a74, 0x5779dfa2, 0x2d405857, 0x0d2e6657,
  214254. 0x0e66cba7, 0xca2e892e, 0x285d6745, 0x0f0e6b5f, 0xf56a8def,
  214255. 0xa30767c3, 0xe0ee851d, 0x43346b9c, 0x98c05658, 0xd6b3c742,
  214256. 0xb35fce26, 0x39777e00, 0xc0895bff, 0xe7b6d886, 0x83c8f6a6,
  214257. 0x4f02904b, 0xbee14843, 0x2e84ec34, 0x7f74915b, 0x96d10991,
  214258. 0xbaaf663c, 0xe41facc0, 0x004b8757, 0x6f86c029, 0xa2b880e5,
  214259. 0x95b77358, 0x53f4a3e0 },
  214260. { 0x89fc48e7, 0x11bb08ce, 0xafab5aeb, 0xba60c577, 0xa0c1cb5a,
  214261. 0xf06bcbf8, 0x79757cb6, 0x7d2efaea, 0x76319160, 0xe26d90b1,
  214262. 0x2b77b7a9, 0x42aa1ab6, 0x285df2bf, 0x38eec0cd, 0xf3a8f7f0,
  214263. 0xd35947f5, 0xfc1cb5b5, 0x97c8dc0e, 0xc45845cf, 0xfeb8cca0,
  214264. 0x249e26f2, 0x16e8d989, 0x483ed89a, 0x7c264e6d, 0x51d91073,
  214265. 0x13a3f145, 0x305e99f0, 0x8501562e, 0x6908d563, 0xaaf98d74,
  214266. 0xd723d236, 0x0a99e653 },
  214267. { 0xabbc0559, 0x23536f46, 0x9aa1a160, 0xc163067b, 0x0c1681b5,
  214268. 0x229fd229, 0x1378e907, 0x61254be1, 0xab793a2d, 0xc60ff57a,
  214269. 0x466552db, 0xa6f2df8b, 0x8c170a36, 0x9ad31893, 0x29b74d9a,
  214270. 0xc5cd9abe, 0xf7848523, 0xcf747273, 0x0d0e3063, 0xc126a93a,
  214271. 0x4248e3d8, 0xfe2021e3, 0x8323ddfa, 0xd97343ee, 0x332639e7,
  214272. 0x9f768775, 0x75325548, 0x9650fc31, 0x3eebf7ea, 0xb595dbd1,
  214273. 0x010fcbc0, 0x3a95cb45 },
  214274. { 0x39d7ff2e, 0x954e68cb, 0xc1d5c48f, 0x8dd1cb4b, 0x7169438a,
  214275. 0x02a92c77, 0x91cad8ce, 0x7965c0b0, 0x32cd08d2, 0x0c5798ab,
  214276. 0xa6902bda, 0x1a5bc3c3, 0x5186d218, 0x545d0925, 0xd27e64db,
  214277. 0xf0077cdb, 0x8cd092da, 0x0157caa4, 0x24532ab3, 0x2a2fa3a0,
  214278. 0x41ccaba3, 0xa5fb639b, 0x4744aee6, 0x01702dc1, 0xcdba93da,
  214279. 0x485bb436, 0x329784f1, 0x93597f66, 0xdad672c3, 0x5d713c1d,
  214280. 0x030b7245, 0x366d222e },
  214281. { 0x573ea5b2, 0xd50b4875, 0xa90da44d, 0x0fce401b, 0x7a1a0310,
  214282. 0x7b53fa65, 0xcf114460, 0x722a80a5, 0xa538bf49, 0x0b8ebf05,
  214283. 0xd32acd21, 0xae141147, 0x7b5ad07d, 0x6692712c, 0x3f48ca07,
  214284. 0x6dc5fee7, 0x2b8a78d8, 0x98ed1499, 0xdd2f1759, 0x4e8b3145,
  214285. 0x5f971b8e, 0x43408de1, 0xadf1b368, 0x055ea6dd, 0xe5932b7e,
  214286. 0x4bb76e73, 0xd30893fd, 0x44287153, 0x0661bfda, 0x173dccd2,
  214287. 0x79defd25, 0x9072ba99 },
  214288. { 0x9620ea39, 0x474de4dd, 0xc831cee8, 0xfbf1649f, 0xcd3a9c43,
  214289. 0x0b0e8bb1, 0x3f3df1d5, 0x6a38286f, 0x8f0ec9b3, 0x4ed072b3,
  214290. 0x729c09e3, 0xa6e4c987, 0x8ad12242, 0xea3e8ac6, 0xfbdfa5ba,
  214291. 0x6ae0e22b, 0xb0a0f592, 0x56171ecf, 0x6b871f8d, 0x33b2886d,
  214292. 0x35e11bda, 0x6b19bea9, 0x7f0f153f, 0x4d815a40, 0x7d6c02ee,
  214293. 0x7e608d97, 0xb6a88f46, 0x7e8f23d9, 0x439d1654, 0x26ac9652,
  214294. 0x35546c29, 0x8d92c6bd },
  214295. { 0xabeb0ff7, 0xb3e0d7ce, 0x3e0e42f8, 0xfbe35254, 0xde808499,
  214296. 0x57d1b226, 0x1cd44bc3, 0x9ece2e1f, 0x435cfee1, 0x1245adbc,
  214297. 0xf93f581c, 0x874ee840, 0xbda0b947, 0x916a779c, 0xfa57ae0a,
  214298. 0xabcc815a, 0xf0a621b0, 0x97adec2d, 0x81f90bdc, 0xbe6a502b,
  214299. 0x53bde63d, 0x54bf9de1, 0x78884c25, 0xa88fdabf, 0xcbbb5470,
  214300. 0x30aa52b1, 0x29053ef5, 0xf805396c, 0x8dd827ea, 0x8d43d898,
  214301. 0x5c1ae5c0, 0x4e4bec17 },
  214302. { 0xfcc09676, 0xbf8483a2, 0x19ea9a94, 0x457c4a3f, 0xd702a5dd,
  214303. 0xa6852ef3, 0x843fe7d8, 0xe7915fd2, 0x16e35158, 0x644bba98,
  214304. 0x9ed746f0, 0x8d1b95d0, 0xb90af0b5, 0x47704581, 0xd4fd135e,
  214305. 0x0bd4bc6b, 0xb4e833a5, 0xa6dce067, 0xff56a9a1, 0x2c0e8f30,
  214306. 0xec2c63fe, 0xa9c80800, 0x98f508a8, 0x449c20a5, 0x3292813a,
  214307. 0x02b94cb3, 0xec7e81a2, 0x647e3d28, 0xb4877677, 0x72e67d1a,
  214308. 0x6f9ded24, 0x7a4aa3f5 },
  214309. { 0xe27a0045, 0x559ef1ba, 0xb242cb50, 0xdc812d4f, 0x39cf8d24,
  214310. 0x23a478e4, 0x9b3f9c54, 0x97544fc5, 0xaffa1fcf, 0x5ac68132,
  214311. 0x34a2c83b, 0x74f8fee0, 0xcd3f4bb7, 0x96cc640f, 0xb0512ea6,
  214312. 0x775dce9d, 0xcdce381e, 0x67dca19d, 0xa9d3fe55, 0xc1eeb3f3,
  214313. 0x1a19274f, 0x38e0bf42, 0x28d69b12, 0x15992fb4, 0x9fd09df8,
  214314. 0x48fcebde, 0xb41ab5df, 0xdc9dfa4f, 0xc0a269c5, 0x0cbd7dc8,
  214315. 0xf7f0ade1, 0x60282a7b },
  214316. { 0xdceea2e7, 0x7c07e538, 0x3c42061d, 0x38a322c8, 0x4f1f6516,
  214317. 0x676828f9, 0xc7776a10, 0xf21b69fb, 0xb5e6b405, 0xc63a3417,
  214318. 0x91a7b642, 0x4c99f258, 0x2cad1440, 0x38692ca8, 0x00869bcd,
  214319. 0xf1e82ffe, 0x16fe466a, 0xc30b714e, 0x19019138, 0x5fb742f9,
  214320. 0x0fa516ae, 0xe90166d0, 0xd8c73a43, 0x5550f7ac, 0xfbc5c372,
  214321. 0x2d6a407d, 0x68cc39ed, 0xe47a7539, 0x4a5fbe70, 0x3fd286d9,
  214322. 0x23c6b942, 0x5f4ae9c7 },
  214323. { 0x53f4d561, 0xd96a2dda, 0x16da1992, 0x286d45d0, 0xfdd4b051,
  214324. 0x449a01fb, 0x9f2195ea, 0x25488a0d, 0xa37661b3, 0xc4151b0a,
  214325. 0xf9e5ee02, 0xb98c471e, 0xa8658817, 0xa4bca86e, 0x7a68fc0a,
  214326. 0xbbcadb87, 0x6b7366a9, 0x88b34649, 0x15661c2d, 0x32ee98d4,
  214327. 0xc901420c, 0xf5b3b4c6, 0x2f2752af, 0xa2352735, 0x510e4d9c,
  214328. 0x2f64ce73, 0xaca4aa80, 0x939a7f26, 0x401aa503, 0x9cd3e291,
  214329. 0xdc46afd2, 0x92a01423 },
  214330. { 0x1c2f7dbd, 0xe9f24be1, 0xb7d527fa, 0xda8c900f, 0x8648f128,
  214331. 0x963e25bb, 0x48141941, 0x9ab713e2, 0x7a6756fb, 0xe87f7d01,
  214332. 0x058d90bd, 0x274dd85e, 0x82566abd, 0x823fee7a, 0x74240195,
  214333. 0x9f6230d7, 0xacb5e46e, 0x04579f2c, 0x16a4c87e, 0x2a226263,
  214334. 0xd99b0857, 0x9ca19a43, 0xe488789e, 0x86dc2ba3, 0x9406c3bd,
  214335. 0xf960b5b9, 0x8960957e, 0x6f2c428b, 0x161c515b, 0x90748706,
  214336. 0xaa88cb9b, 0x0fc8fe1e },
  214337. { 0xfeb90f2d, 0x68ae1bed, 0xa48b1559, 0xf393bb3c, 0xf64e9635,
  214338. 0x2be62f9c, 0xf8be75c2, 0x354c2410, 0x5e6f7529, 0xbd7ea703,
  214339. 0x162cab31, 0xc264868e, 0xc860f3ff, 0xb1391e70, 0x1d89837e,
  214340. 0xdf367c75, 0x2bf32941, 0xe150b6b4, 0x78c1318f, 0x95e8f46e,
  214341. 0xa2c4b160, 0x2b3f1dab, 0x701afbf3, 0xc6ccf5ce, 0x5e8874c5,
  214342. 0x3ad27530, 0x5dc6dcbe, 0x39285e51, 0xd99892dd, 0x3c954d86,
  214343. 0xdfd3789f, 0x2d0ba862 },
  214344. { 0xb472e1af, 0xeacd8ee8, 0xb76abbcc, 0xeb354eae, 0xd0d93fbd,
  214345. 0x9b520bf8, 0xfe6fc706, 0xfccd60d7, 0xa4ee2f39, 0xa9353dde,
  214346. 0x9a81e51e, 0x5eb0925e, 0xd1366777, 0xee334da1, 0xd5354d69,
  214347. 0xc1d28c9f, 0x92a5ed54, 0xb9771755, 0xb7f70d81, 0x5d3e367f,
  214348. 0xa933ae7a, 0x7be7eeca, 0xe23cfbb7, 0x264cf1f9, 0x89497681,
  214349. 0x0d129f4a, 0x09b6235b, 0x705375a4, 0x48a376da, 0xccf64c75,
  214350. 0x4d41dbfc, 0x963c8712 },
  214351. { 0xde36a814, 0xbae290cb, 0x733b12b5, 0x9bdb0195, 0xf77fe0e1,
  214352. 0x0ebad867, 0x29720cea, 0x0a7d19fd, 0x9029ec72, 0x434d7651,
  214353. 0xbb51911e, 0x856aff17, 0xd80a7f60, 0xd0a25d9a, 0xf848c106,
  214354. 0xffca86af, 0x43ad749c, 0x53e8bdf9, 0xe3e696bb, 0xfb9e0284,
  214355. 0xeeee4215, 0x3eb6630a, 0x2ecf3c63, 0x9d8fbb9e, 0x4e00c0c0,
  214356. 0x71da4ffa, 0x5d57beac, 0xb296be59, 0xa8cec7ef, 0x1751fbad,
  214357. 0xff55d7bd, 0x2d03eb3c },
  214358. { 0x04f2ec1d, 0xeb16925f, 0x0d147ee2, 0xa878f276, 0xaad9d9e0,
  214359. 0x442df604, 0x3f71035b, 0x891df44b, 0x8cb95d5b, 0xc28272b3,
  214360. 0x5ee8ed23, 0x6f14efb5, 0x13b0f3e3, 0xf3c4460f, 0x6bd7335e,
  214361. 0x889f9bd7, 0xf755ba6e, 0x889ee771, 0xed219b6c, 0x626984fe,
  214362. 0xec2ee411, 0x2d44c737, 0x63efcd37, 0xb94385a2, 0x6637826b,
  214363. 0xd909321b, 0x3ee6b7a7, 0xc24f8a79, 0xa7cf61b7, 0xa3ca8d24,
  214364. 0xc54bacd9, 0x842e40c1 },
  214365. { 0xa661d843, 0x5a268ed6, 0x4f5b30cd, 0x02328cca, 0x1311e177,
  214366. 0x16e6fed1, 0xc6695967, 0x690decb4, 0x57b2e280, 0xbdac5bf6,
  214367. 0x1efe42d0, 0x827f82ca, 0xca5fca2f, 0xc554ec0a, 0xdde45506,
  214368. 0xac5276c1, 0xe3077513, 0xb7f4cb08, 0xcc8797cc, 0x8caf6d9a,
  214369. 0x0d9332d2, 0xd5964814, 0x285a409f, 0xcc6ae297, 0x6223d093,
  214370. 0x7773c2a5, 0x5128fc09, 0x2d5266ac, 0xbc31fe6c, 0xa596b7cb,
  214371. 0xcac91328, 0x0e63319a },
  214372. { 0xf0360ac2, 0xb5cd2fad, 0x285e605a, 0x86b660de, 0xe25b9b14,
  214373. 0x82c6cf10, 0xaa9ac554, 0x9d5fa38d, 0x526c070e, 0x3dfcf1b8,
  214374. 0x3fccc52d, 0x0379a96b, 0x0bfcc7f5, 0xe3659c29, 0x69d3e6a1,
  214375. 0x5b1a3db5, 0x9b7b42d5, 0xb41528b5, 0x9c22a006, 0x934defa4,
  214376. 0x9b4ce3b6, 0x90f38018, 0xb3abaf32, 0xb073bc04, 0xff8389e2,
  214377. 0x27a5a222, 0xffa5a35b, 0x0b7a9d51, 0x28e1a7c2, 0x4939ecef,
  214378. 0x1872705a, 0x88839da2 },
  214379. { 0x701ce29a, 0x56b66c30, 0x58981d50, 0x3acaf126, 0x105f9f21,
  214380. 0xd4dafc0c, 0x373e3d13, 0xfee571e6, 0xfa2ee3ca, 0xe7269c86,
  214381. 0xdd20385a, 0xf5cca64a, 0x3000e9ac, 0x217f2757, 0x0e7273ef,
  214382. 0xc934db47, 0x355b6776, 0x4294f4f7, 0x6fc05180, 0x1faa36b9,
  214383. 0xb052190b, 0x8f88b1db, 0xe9eaef52, 0x35791b90, 0xdb681b90,
  214384. 0xf37fb2eb, 0x4415c369, 0x39d0a51d, 0x1d2e21c9, 0xfc59cca7,
  214385. 0xa1f50c26, 0x64128cfe },
  214386. { 0xe8f5b0b5, 0xf03678a2, 0xd340f059, 0x5c7e249c, 0x93ca7cec,
  214387. 0x41440441, 0xbc83af98, 0x075ca346, 0xfaa8bbb0, 0xf39f0033,
  214388. 0xf38230f7, 0x3d18f0ed, 0xd448f345, 0x78dff00c, 0xd51aa475,
  214389. 0x849228c0, 0x30c928d1, 0xdd4e2708, 0x8f12cfd3, 0xc66ba686,
  214390. 0x88b3a206, 0x091049db, 0x016dae01, 0xd865d059, 0xe253e37d,
  214391. 0x4599e905, 0x7ce9871b, 0x322cf0c2, 0x174a132e, 0x014f54da,
  214392. 0xbdabcbda, 0x93634a09 },
  214393. { 0xa9a2e304, 0x62826b27, 0xc1a4c124, 0xc57e1866, 0x22381710,
  214394. 0x913ab832, 0xa9847cfe, 0x7e9b6b85, 0x2b5f46fd, 0x29655cf1,
  214395. 0x8038e66d, 0x7295572b, 0x6fa95eab, 0xe4cba601, 0xb9deda81,
  214396. 0xbbc11071, 0x3f1cf61e, 0x97f0009a, 0x373e0cfb, 0x5372777b,
  214397. 0xd139d63b, 0x302f909c, 0x4f87d78e, 0x1ed672da, 0xb4048763,
  214398. 0x362077a3, 0x9dcc22b2, 0xc408c32d, 0x26deeee7, 0x4b4c5bf2,
  214399. 0xbc06357e, 0x266cb467 },
  214400. { 0xb56363e8, 0x6faa4154, 0x3c1aa4db, 0x4b4fd078, 0x2b9e6597,
  214401. 0x14358dde, 0xfa004b84, 0x5b34ae3e, 0xf19911a6, 0xcf44b2ec,
  214402. 0xa536bf78, 0x55caa833, 0x8870dc95, 0x606e1eb9, 0x09f3511d,
  214403. 0xe3c3287d, 0x9d5cf364, 0x68b2f4eb, 0x63ab8c9e, 0xc154e892,
  214404. 0xc36ab611, 0x1548828e, 0xa1b7d120, 0x0932bfcb, 0x5315b8d7,
  214405. 0x7ee7b5bc, 0xf7473ac1, 0x782fd0d1, 0x3c8f2af3, 0xbcb029a8,
  214406. 0x52454ee1, 0x4b1d5a1b },
  214407. { 0x63d52c0c, 0x12fe5174, 0x188c099d, 0x3735525e, 0x360e3956,
  214408. 0x5c621563, 0xacfa5a43, 0x88b3f1ca, 0x797e8107, 0x90123a0a,
  214409. 0xb15e080a, 0xba31f6b5, 0xfca3dada, 0xd7de5e12, 0x0df511c8,
  214410. 0x3287361b, 0x65757d4e, 0x7cc800d4, 0x5207ec91, 0x10810f3d,
  214411. 0x30eea0e3, 0x0d4e56f1, 0x3ea5a2ec, 0xbbf7ee13, 0xbe6abbd0,
  214412. 0x6fc07762, 0x120bf619, 0xc831fdce, 0xb622d42a, 0xe07439fa,
  214413. 0x508e4b27, 0x8186b93f },
  214414. { 0x09312867, 0xc619d154, 0xbfaf7db4, 0x7e042c05, 0x1f5f5dda,
  214415. 0xc1cf1668, 0xa4fc3d82, 0x50aa5057, 0xce68b8fe, 0xed30ed65,
  214416. 0xbeb4d644, 0xecb01c0b, 0x831c0497, 0x7b5dc444, 0x9b7d9b1c,
  214417. 0x351e6a00, 0xd9477c91, 0x4bb863b9, 0x05d4110a, 0xaba65891,
  214418. 0x43580b7a, 0x30086cf4, 0x90be357e, 0xb139c076, 0x27b5214e,
  214419. 0x12bfff1a, 0x22c3ab57, 0x79cfc6d7, 0xf34a9bfa, 0x4743de57,
  214420. 0xc9ee2b2a, 0x0bf97e97 },
  214421. { 0xdda19e96, 0x96ec4ec8, 0x6c306e8b, 0x54ce18ea, 0x65f6918a,
  214422. 0x7e83612b, 0x0d9a0d99, 0x1ac6f68b, 0x62fdcc09, 0x98a697a4,
  214423. 0x95bc3e13, 0x65ce25f1, 0xb3939730, 0x1896ecda, 0x32f12806,
  214424. 0x9eb81a0f, 0x1d2dc7df, 0xd3d7416e, 0xad473599, 0xe22c7976,
  214425. 0x9f5ef439, 0x3de37a9a, 0x9e69d94e, 0x6b7ac0ab, 0x0a9d0bc8,
  214426. 0xe6bfa9e0, 0x5676f120, 0x576a870d, 0xfeaac23f, 0x3bd91bb4,
  214427. 0x3e40aabb, 0x8fe5482c },
  214428. { 0xce9a4d1e, 0x85ae67c2, 0x4f1d2038, 0x4c3eb803, 0x25d06192,
  214429. 0x5c6c8f3a, 0x308fb41c, 0x803de0ad, 0xe71c294e, 0x9961f5bc,
  214430. 0xf02eb0da, 0xdc62078d, 0xb64ae8b6, 0xc87ef515, 0x50b4d18f,
  214431. 0x69679f1e, 0x52199f43, 0xc5c009a1, 0x0f640a5f, 0xa7d484be,
  214432. 0x23dab566, 0x4c918bb1, 0x64275d2c, 0xa67c114c, 0xcad2ded6,
  214433. 0x95a913b9, 0x6b4b5c8d, 0x189ed18b, 0xb42d3bf6, 0x4aeb6206,
  214434. 0xbbc8bc3f, 0x3928c669 },
  214435. { 0xdacb4b64, 0xde4bea4a, 0xf26179a1, 0x03f62a44, 0x7a9112a4,
  214436. 0xf3aac94e, 0xd36f331e, 0x90448fbd, 0x407b85c4, 0x426042bc,
  214437. 0x2121b77b, 0x5ad8a596, 0x67cee984, 0x31674a4f, 0x4e3b2f0d,
  214438. 0x7fae8bbe, 0xa7c930eb, 0x681df6dd, 0xc259d0d4, 0xadeefa98,
  214439. 0xbea1c1fd, 0x1b14d9e6, 0x21d405d1, 0x3baadc8b, 0x73892754,
  214440. 0xf01dff93, 0xf071cde4, 0x81c35b3e, 0x9150d0d9, 0x1704d2e1,
  214441. 0x355134f6, 0x6ccc888f },
  214442. { 0x7ad7504c, 0xf8d36f0e, 0xf7959ddd, 0xbca3265f, 0xfede67aa,
  214443. 0x0dcd1ede, 0xbaebf32f, 0x1276f4ce, 0x014edcfc, 0x6825a6e6,
  214444. 0x99ad8eb7, 0x0b8c1a82, 0x09b8ce1e, 0x312024a9, 0x9cbd351a,
  214445. 0xcb8fd98b, 0xfab1e8be, 0xa4841378, 0x3973cacf, 0x17ed0f5d,
  214446. 0x259d5254, 0xa17e1484, 0x74b91393, 0x53d5b843, 0x1aca3ce9,
  214447. 0x8f792b21, 0xc8c0f815, 0x035ff110, 0xad4ed7bd, 0x6afa6357,
  214448. 0xb26faef9, 0x2f151980 },
  214449. { 0x29d2d439, 0x0c8631da, 0xbc039955, 0x121fbbc2, 0x6c05b75b,
  214450. 0x3e5a9792, 0xb6ce47ec, 0x6d6cf4c0, 0x9d88c658, 0xbaaa1767,
  214451. 0xf3355a17, 0x031db9e7, 0x0aef5a85, 0x8381e3d8, 0x15a31bdf,
  214452. 0xc71db290, 0x9498fd7d, 0x638f6b74, 0x13beeef6, 0x44edf3f9,
  214453. 0xf4ab67b3, 0xe6173271, 0xfd22df11, 0x3a202c70, 0x205c4e92,
  214454. 0xf7be0389, 0xa8eb9920, 0x1c219085, 0xbeb54aaa, 0x6c805ce8,
  214455. 0x0ac58d65, 0x354b05b7 },
  214456. { 0x7a9170e9, 0x7171e236, 0x4cad50cd, 0x01eec42d, 0x3cddccfb,
  214457. 0xffbe824f, 0xa66cae1a, 0xa73e8ce3, 0x965c7d01, 0xb7138a7f,
  214458. 0x5c3d971e, 0x00058e3f, 0x2ff0a72b, 0x52591ac3, 0xbbbce76f,
  214459. 0xa32fb5bc, 0xa9f81a18, 0xf3241ab8, 0xeca68630, 0xf31d3332,
  214460. 0x4482f13b, 0x847af9fc, 0xa4681be2, 0x6196e217, 0xe55efcf9,
  214461. 0x9938f932, 0x70acc705, 0x3e7dacb8, 0xcf09fac2, 0xd41be893,
  214462. 0xae3523a1, 0x48dc55c4 },
  214463. { 0xa5092193, 0x8e623826, 0x6898970c, 0xe46ec362, 0x25c9eb41,
  214464. 0x2f1356af, 0x83c7d245, 0x41780640, 0x97d00e38, 0x982def67,
  214465. 0xa512151c, 0x382eb6e7, 0x8af58869, 0x154e1077, 0x8a51cf02,
  214466. 0x18707075, 0x71313c58, 0xcdeba9f7, 0xba155904, 0x5d67b973,
  214467. 0x1d0d7b3a, 0x851c9f4b, 0x8b8af2cd, 0x19f29d71, 0x986b8d62,
  214468. 0xcb94ccff, 0xb93b9c33, 0x8725e24b, 0x66e38c68, 0x405ce4c5,
  214469. 0x0b6dc021, 0x5f6a8edd },
  214470. { 0x8f9a8690, 0x83704ca5, 0x2f76a407, 0x3f369766, 0x69201028,
  214471. 0xfbc12d8c, 0xbce3a4cf, 0x4cd58f16, 0x04aab26d, 0x7804664a,
  214472. 0x4ea457a8, 0x005cfbba, 0xb8a59794, 0x537951b3, 0x4fe1f739,
  214473. 0x4ca2b9e4, 0xdf325797, 0xe4428acd, 0x0ea243db, 0x648da342,
  214474. 0xf43ce01e, 0xcce6562b, 0xf27db490, 0x840f0421, 0x8bfb7cf0,
  214475. 0x156ccb70, 0x5a8797d3, 0x9b33480d, 0x9eb814bb, 0x2e12e07a,
  214476. 0xca7f87ac, 0x1ca65072 },
  214477. { 0x2b9d25a0, 0xfbb321cf, 0x40a746db, 0x66affdca, 0x59e368b5,
  214478. 0xc1c1530e, 0x7d80068f, 0x56ed1ea4, 0x5647dd68, 0x9b74d8fe,
  214479. 0x89b78da8, 0x1d96b507, 0x8bbe3391, 0x39b75243, 0x0d858c5f,
  214480. 0xef8d443e, 0x9646aa34, 0x4dd2db49, 0xe667543c, 0x7fad3bd1,
  214481. 0x68980985, 0xd0d710c0, 0x49facaba, 0x9f7aff32, 0x14f9a192,
  214482. 0x055dec1c, 0x1fb307a1, 0xaca66399, 0x35ffff64, 0xac44fd91,
  214483. 0xcbad3cee, 0x462cafb6 },
  214484. { 0xde3237dd, 0x1660a647, 0x82b87404, 0x95f735cc, 0xddfa55f8,
  214485. 0xf7879f59, 0x726b914a, 0x15ef043e, 0x1c93e298, 0x1875393d,
  214486. 0x6ef18331, 0xa1a2be74, 0x25a9a12b, 0x4e7e8dfc, 0xa9c3917f,
  214487. 0xdfefc97d, 0x0a2ebe41, 0xbc875d03, 0xa732d1cc, 0x0f75d235,
  214488. 0xd9baa6d3, 0x06fee7fe, 0x65f48576, 0xaa784fab, 0x513f83c0,
  214489. 0x23155e22, 0x3e8f9d13, 0xd2fb7718, 0xb546eafd, 0x2a291503,
  214490. 0x6cd93608, 0x1293c98c },
  214491. { 0x49d53b77, 0x72781251, 0x96eafac7, 0xa6ab403d, 0x4a36b711,
  214492. 0xb7d7c7db, 0x87e771c1, 0x8238c708, 0x33b37522, 0x495f6abf,
  214493. 0x8c87530d, 0xb0b0289c, 0xe77b111a, 0xca83cb86, 0xa1bd189e,
  214494. 0xbe1c0fb8, 0x1ae9d7c7, 0x58cfb2fb, 0x4940c3e8, 0xd05c23c5,
  214495. 0x74ad9107, 0x16e79e41, 0x064e7142, 0xa0a47f05, 0xfdfd614f,
  214496. 0xc6929cd4, 0x3946988b, 0xedb2584c, 0xe46f8fb1, 0x73e4b5f3,
  214497. 0x68ea94ba, 0x53b79aa1 },
  214498. { 0x44bbb6a1, 0x216fafce, 0x67821728, 0xd3a5bba0, 0xa9dd939a,
  214499. 0xef1e4b30, 0xf19efafe, 0x022eaf3d, 0x7b4ec014, 0xfed5abce,
  214500. 0x512c6738, 0x64968ee6, 0x29fe89a2, 0x23119869, 0x47397c05,
  214501. 0x0d539d8d, 0x234596c4, 0x6400bc54, 0x5346611d, 0xb9287f58,
  214502. 0xc9d5da0f, 0x04099903, 0xc83af2a8, 0xe5ef4997, 0x328151e1,
  214503. 0xc89dc01b, 0x58401104, 0x150fb4a9, 0xf3872c9d, 0x40a6f7d5,
  214504. 0x56c2e833, 0x8290d6d1 },
  214505. { 0xd8546946, 0xf84637c6, 0x69ec57fa, 0xda134a39, 0xd789007e,
  214506. 0xd42359a4, 0x0dc7b809, 0xb42557fe, 0x2d6784a9, 0xe62ae52d,
  214507. 0x0bcadb5f, 0xa2714ca6, 0x33aafca5, 0xcc208de6, 0xed967811,
  214508. 0x2380ed5c, 0xdb321660, 0x6e6b55e9, 0xa675235a, 0x1bead02c,
  214509. 0xb33fa0e1, 0x51cc6ef9, 0xf06a2a08, 0xfd223e26, 0xec47b3cf,
  214510. 0x00f332e1, 0xa0aa984e, 0x459f297b, 0xee952e14, 0x6fa1d969,
  214511. 0x304fabb0, 0x506ef1ab },
  214512. { 0x35bff163, 0x11b4eb27, 0xea9fa984, 0x7130b96f, 0x9deb27ce,
  214513. 0x66aceb3f, 0x9dd1c3d5, 0xa2daf1a5, 0xa73075aa, 0xf5090a7e,
  214514. 0xe3071b58, 0x36a6af39, 0xdf73ad9c, 0xa28d633d, 0xbdc89a16,
  214515. 0xdd354cac, 0xd4dcbc3c, 0xdfea3423, 0x379d92d1, 0x6eec74d2,
  214516. 0x8eed6765, 0xe14a456f, 0xfa8feb1f, 0xfabe7743, 0xb98fcbc7,
  214517. 0x1404ccf8, 0xf71a706e, 0x6ccd2fbf, 0x4d85c678, 0xdaaf3fdb,
  214518. 0x15200344, 0x415b7dbf },
  214519. { 0x7d8377a7, 0x97010586, 0xcb803272, 0x068a3d68, 0xf03a4c32,
  214520. 0xfd67d289, 0x93c8f290, 0x4bc7095d, 0xe9e5a2b8, 0x712fa13c,
  214521. 0x0feb9f3b, 0xfc6ac6c6, 0x6e0e54c2, 0x0cda36d9, 0x86320a01,
  214522. 0x45499751, 0x97f00f11, 0xf9318c91, 0xe6936508, 0x01dc4c3f,
  214523. 0x85f068aa, 0x769a2ef9, 0xa2b5511c, 0x3522cef0, 0xb4122e05,
  214524. 0x006965ed, 0xc175d43f, 0xfce0fafc, 0xec831d59, 0x525dc9bd,
  214525. 0xaf58879d, 0x1ec314f1 },
  214526. { 0x2c8310c2, 0x0663feef, 0x457e3f74, 0xaa7e14da, 0xe5346887,
  214527. 0x392b10fc, 0x637ec2c5, 0xcde4a38f, 0xb542f8df, 0x50773320,
  214528. 0xf7de1711, 0x341302f9, 0xae4b9bc6, 0x018b1c63, 0xdd2f9e6f,
  214529. 0xf001c46e, 0x26eccfa0, 0xd3bb0a97, 0x7746e0c7, 0xa931b99d,
  214530. 0xf5875aec, 0xe0c8b6f7, 0x96939c82, 0xbb32f17c, 0x3de5a664,
  214531. 0x765135d2, 0x52abfa6b, 0x71936cb4, 0x2dc105de, 0xad5cc08f,
  214532. 0x7fff5788, 0x17e91d12 },
  214533. { 0xb7e051ca, 0xbe92ced3, 0x19c776d4, 0xc644d4fd, 0x0086784b,
  214534. 0xc8ab4b52, 0xce9d6b31, 0x3ea66227, 0xd289e9c7, 0x395249a3,
  214535. 0xd12a19ee, 0x54509e65, 0x8c365aec, 0xa7bd4692, 0x77963e0e,
  214536. 0x354997e4, 0xb599732d, 0x0d765957, 0x91d4a3b6, 0x99584aeb,
  214537. 0x1deb3e28, 0x6e653ea4, 0x572571df, 0xca7c98ed, 0xb18ae1f9,
  214538. 0xf301a38f, 0x63f7b97e, 0x1629f7c2, 0xafc4a0d5, 0xdf242282,
  214539. 0x3ddd0c01, 0x118f3b4b },
  214540. { 0x7ad4762b, 0x74a0a0a8, 0x8c58d175, 0x1aef84da, 0x4cf76d86,
  214541. 0x16ff4960, 0x7e60d98b, 0xc0be8786, 0x3ecc1dba, 0x83637ffb,
  214542. 0x5dd6147a, 0xc244a609, 0x5b0846e5, 0xa3e17834, 0xe77a4c05,
  214543. 0x735eb686, 0xdf758695, 0x5bc18b4f, 0x1bdfe52f, 0x15618d0b,
  214544. 0x00715ba1, 0x878ecc0d, 0xc2dd617f, 0x1dbdbd1a, 0x21b61710,
  214545. 0x21d2b631, 0x44f593c2, 0x22ce8a79, 0x44f17024, 0x3b9b536a,
  214546. 0x8d03e727, 0x01d0a67c },
  214547. { 0x1e46533c, 0x7b964236, 0xfb88c2ae, 0xe9477990, 0xa42c4a18,
  214548. 0x019b5d16, 0xd83c7a45, 0x7135e81d, 0x4cb663e3, 0x74a69bdd,
  214549. 0xe76c0d63, 0x7b67ecdb, 0x11e68da6, 0x03d54521, 0xd2e8650a,
  214550. 0x596cceb5, 0x2af03b37, 0xcd572dfd, 0xfabd5952, 0x52364ba1,
  214551. 0xb4ed8569, 0x7f47d456, 0xc950d5d4, 0x5ad8b572, 0x486e2f84,
  214552. 0xcadd2dfa, 0xc56bb044, 0xdd527b43, 0x997c08e6, 0xc9adba24,
  214553. 0x7da6320f, 0x1b625b06 },
  214554. { 0x4fd8446d, 0x44dfaa7b, 0xaf6febeb, 0xc01b2f01, 0xfe8838b5,
  214555. 0xbf444388, 0xbba9758b, 0xf33c434f, 0x87156bc9, 0x2b971cba,
  214556. 0x1f49098b, 0x6b245e5c, 0x2b41c5dd, 0x87dcb534, 0x34d852d7,
  214557. 0xdb1f80c6, 0x2433da34, 0x6d6e3258, 0x3f7df0c2, 0xf6682065,
  214558. 0x360cb365, 0xc4ca567c, 0x9826656a, 0x321faac2, 0xbf069768,
  214559. 0x13f5ca6f, 0xa7076639, 0x15397921, 0x8400736e, 0xbdf14328,
  214560. 0x19fc948d, 0x333eca96 },
  214561. { 0xac775d81, 0x23337948, 0xd41dbbca, 0x38c2518f, 0xbcfce948,
  214562. 0x623c7a4f, 0x54703fe7, 0xaad36236, 0x13fb3b5b, 0x2b3a13a4,
  214563. 0x7f5c01f0, 0x5db3565a, 0x52359661, 0xd72408dc, 0x1d616e91,
  214564. 0x5a17f8e5, 0xcb25b999, 0x90c16eeb, 0x3393743e, 0xf35e8cf1,
  214565. 0xe54b64a7, 0x987da74a, 0x65cd449d, 0x557b322a, 0x37e7b15d,
  214566. 0x765082a5, 0xf2cd134f, 0x4d25c742, 0x4ccf0746, 0xae9d9c07,
  214567. 0x8728d135, 0x72fc2110 },
  214568. { 0xf96004c8, 0xa906b203, 0x458055ff, 0xd83f95cf, 0x55f35909,
  214569. 0xd77d5867, 0xe550c8ee, 0x4a9ea6fb, 0x55a06081, 0x91c8cca9,
  214570. 0xbce82062, 0x4a1fee78, 0x9a3df85e, 0xeb9ade06, 0x7d3de666,
  214571. 0xfbbdcf0c, 0x5d336d51, 0x228a391b, 0x5c2ffc3c, 0x760f8d28,
  214572. 0x2f7b165b, 0x1ee48de3, 0x56177040, 0x03803d84, 0x9deff9a0,
  214573. 0xe573f648, 0xa17e35a4, 0xe1a2738e, 0x8840a6c6, 0x238ef17c,
  214574. 0xb11ed92d, 0x480946f8 },
  214575. { 0xfd71f119, 0x84c747a8, 0x53eb3695, 0x19e65c5e, 0x6298587a,
  214576. 0x0e2f6786, 0xab18d6f4, 0x48a48899, 0xc630b8c0, 0xa1a99024,
  214577. 0x2caaf892, 0x84975096, 0xe20fd624, 0xc8869aba, 0x6c2b7dd4,
  214578. 0x3b72b04d, 0x0992f7d0, 0xe2775eb6, 0x7d06e684, 0x0089c06e,
  214579. 0xe4bbd007, 0xcb3b4361, 0x4ba846e4, 0xa1ae666b, 0x46464d9e,
  214580. 0xc01c2eb2, 0xc1f8539f, 0xf86f2be6, 0xcf68afc7, 0x16e8e8ae,
  214581. 0xc7386902, 0x8dab61fd },
  214582. { 0xd54d1d45, 0x42a5c903, 0xff4f9ba2, 0xacd4297e, 0x34d478b4,
  214583. 0x2d88b520, 0x08c4621a, 0x35b2ba2b, 0x34865402, 0xd3d239bb,
  214584. 0x911f32e6, 0x1de76aed, 0x3f06fdc2, 0x877f8bcf, 0x9ec51502,
  214585. 0x802714c1, 0xa590700d, 0xa10444eb, 0x31dcc957, 0x8694229f,
  214586. 0xb8169fed, 0x5ece77ab, 0x2caf080e, 0x55be8a15, 0xcbd7cef1,
  214587. 0x3eb21b14, 0x67b97ee1, 0x9def7ad1, 0x118f690c, 0xe03ca879,
  214588. 0xf99b29e7, 0x6f77e62d },
  214589. { 0xe40bbf59, 0xa271bded, 0x6401aad6, 0x177ba453, 0x73541cd1,
  214590. 0x1755e035, 0x4b71b02f, 0x3465b466, 0xa813359f, 0x22eb7113,
  214591. 0x6f38eac7, 0x9792a8fd, 0xff3bf3b5, 0x11aa012f, 0xf85c3fbf,
  214592. 0x99aafabf, 0x06c0cc42, 0x91e0a2ef, 0x773b7b3a, 0x314d5d57,
  214593. 0xd669840a, 0xae5e2e76, 0x2e5a8be6, 0x86136073, 0xc1cf5580,
  214594. 0xee6d7578, 0x68bed102, 0x2344e00f, 0x8184f0eb, 0x799d7886,
  214595. 0xc3d2cf80, 0x63819c91 },
  214596. { 0x7884b073, 0xca5392e1, 0xeb1267ea, 0x9ec3a1fc, 0x907038a7,
  214597. 0x3d07f5f0, 0xe4c47b70, 0xcb2ac07c, 0x1bf96b91, 0xf96664ee,
  214598. 0x2aea4fbf, 0xebf57589, 0xfade6500, 0x5aabf391, 0x171d1204,
  214599. 0xc5b3376f, 0xa0d3d81a, 0x1ff60c51, 0x976a844b, 0x10b2cfe7,
  214600. 0xbda6125a, 0xe131cc9a, 0x4ebd453e, 0xe0fc16d3, 0x504b6bc1,
  214601. 0xc0d0319a, 0x0a2f8cab, 0xe43a0be7, 0x55e49b47, 0xc80afeec,
  214602. 0x8265d7ee, 0x67d48d12 },
  214603. { 0xea2d56d6, 0x068d59a7, 0x27480a63, 0xd71abd0e, 0xae7366cd,
  214604. 0x6bd11db0, 0x07204ebc, 0xfbb639ca, 0xf77e6293, 0x89a242e7,
  214605. 0x75ba8c3d, 0xdee7ca2b, 0x64a2f9a8, 0x472ddc3d, 0x7561a010,
  214606. 0x84229df4, 0xc5b649d4, 0x95f62c85, 0x4dc927cd, 0xfdd56b1b,
  214607. 0x5ee60596, 0xfe8bb120, 0xabf29401, 0x3efcaa50, 0x10d1c184,
  214608. 0xd4900d0f, 0x28b01df5, 0x2cf113a9, 0x1f0e43f5, 0xa3d7ebc3,
  214609. 0xe8384dc7, 0x27950e38 },
  214610. { 0xe1d0fa79, 0xeab21ff0, 0x048b5de9, 0x4b9fd033, 0x2fe374cb,
  214611. 0x4c934689, 0x4eb21f6b, 0xbb4827fa, 0xa925e7e7, 0x46716f79,
  214612. 0x7dd4c531, 0x1442bf36, 0xd2e96ddf, 0x2073954c, 0x8502aa89,
  214613. 0x4e0141ae, 0x8eef6cc9, 0x8ee00e1a, 0x5880cdaf, 0x55ce8491,
  214614. 0x69628046, 0xff3aba5c, 0x5d15dfbf, 0x335cc4f8, 0x9f684f25,
  214615. 0xa7f0440c, 0xbb1e5bd8, 0xae80453f, 0xff2225ab, 0xa1c99813,
  214616. 0x79b25d71, 0x54ff7884 },
  214617. { 0xde40b068, 0x27c6ee30, 0xe6f3a51e, 0x9226465b, 0xfa3b21f6,
  214618. 0xe24a4604, 0xc0418115, 0x50a5a5ad, 0x8df90d2b, 0xe3285441,
  214619. 0xdcb0c00f, 0xbb74e58f, 0x4a2c08e3, 0xc68f1b3b, 0x0ccd9ec9,
  214620. 0x339df081, 0xb786ea9f, 0x915362dc, 0xc955aead, 0x28945e31,
  214621. 0x8b6a6c6b, 0xd6a2c01d, 0x3678a427, 0x069e82dc, 0x28c9302c,
  214622. 0x17875500, 0x9fa101e6, 0x8acda965, 0xee30b286, 0x4e4e4573,
  214623. 0x3f1830fe, 0x8adbad85 },
  214624. { 0x0969d524, 0x060ae11f, 0xf39bcc79, 0xf42fdaf7, 0x7cc1fcc2,
  214625. 0x3cec6766, 0xe2336d4f, 0x456b9cf2, 0x8e1c0f7f, 0x6aa1f5de,
  214626. 0x0984fb0e, 0xcdbc2ad2, 0x1b464b28, 0x4090cfa6, 0x1243f3ef,
  214627. 0x40d86f30, 0xcd5e87e7, 0x95b16ccc, 0x3026cd41, 0x403f168c,
  214628. 0x816c0730, 0xdbe386cb, 0x58407a1d, 0x14eb86f3, 0x1717e1af,
  214629. 0xf588b4f8, 0x66cbc96c, 0xb75c41a6, 0x027e71c1, 0xf342c1aa,
  214630. 0xc0945e5f, 0x73930036 },
  214631. { 0x22cdaf42, 0x954f757d, 0xf4181aab, 0x788b591d, 0xf5514f25,
  214632. 0x8b986819, 0xf18fd5bc, 0x69642e08, 0x022ceb91, 0x92b305d1,
  214633. 0x6a4f6985, 0x1715903e, 0x61179cae, 0x4bd7d69d, 0xd29c01aa,
  214634. 0xdacdfd5d, 0xd91108cc, 0x705ddd5a, 0x64ac8f15, 0x434ac7b1,
  214635. 0xb524632f, 0x61a514e1, 0x731fc447, 0x45b9e61b, 0xe0961b31,
  214636. 0xcf561348, 0x73eaf223, 0x9c28a967, 0xaa7c99d3, 0x5bd10182,
  214637. 0xe42965e2, 0x8bc6ec4a },
  214638. { 0xe7f2a32b, 0xd096e5c0, 0x09388a30, 0xff54800c, 0x401e360c,
  214639. 0x06fe437c, 0xbb6054a6, 0x6655fc9c, 0x8457aa6e, 0x510e1860,
  214640. 0x2b29b2b7, 0xa0acfca2, 0x51b7da61, 0x732483e3, 0x6be6c8ca,
  214641. 0xe31471ee, 0x8b65c9a1, 0xe565431c, 0x48d65cbb, 0xfc9ac3b9,
  214642. 0xae9b2aa8, 0xd308fc21, 0xaa60aa6a, 0xd6a7df0d, 0x982fc0d4,
  214643. 0x2844d96a, 0x5847a4d7, 0xab012c2c, 0xdceb8955, 0x2b3c8f71,
  214644. 0xbe9c7e15, 0x8e85437d },
  214645. };
  214646. /* Perform the modular exponentiation in Fp* for SAKKE.
  214647. *
  214648. * Base is fixed to be the g parameter - a precomputed table is used.
  214649. *
  214650. * Striping: 128 points at a distance of 8 combined.
  214651. * Total of 256 points in table.
  214652. * Square and multiply performed in Fp*.
  214653. *
  214654. * base [in] Base. MP integer.
  214655. * exp [in] Exponent. MP integer.
  214656. * res [out] Result. MP integer.
  214657. * returns 0 on success, MP_READ_E if there are too many bytes in an array
  214658. * and MEMORY_E if memory allocation fails.
  214659. */
  214660. int sp_ModExp_Fp_star_1024(const mp_int* base, mp_int* exp, mp_int* res)
  214661. {
  214662. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  214663. !defined(WOLFSSL_SP_NO_MALLOC)
  214664. sp_digit* td;
  214665. sp_digit* t;
  214666. sp_digit* tx;
  214667. sp_digit* ty;
  214668. #else
  214669. sp_digit t[4 * 2 * 32];
  214670. sp_digit tx[2 * 32];
  214671. sp_digit ty[2 * 32];
  214672. #endif
  214673. sp_digit* r = NULL;
  214674. unsigned char e[128];
  214675. int err = MP_OKAY;
  214676. int i;
  214677. int y;
  214678. (void)base;
  214679. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  214680. !defined(WOLFSSL_SP_NO_MALLOC)
  214681. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 32 * 2, NULL,
  214682. DYNAMIC_TYPE_TMP_BUFFER);
  214683. if (td == NULL) {
  214684. err = MEMORY_E;
  214685. }
  214686. #endif
  214687. if (err == MP_OKAY) {
  214688. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  214689. !defined(WOLFSSL_SP_NO_MALLOC)
  214690. t = td;
  214691. tx = td + 4 * 32 * 2;
  214692. ty = td + 5 * 32 * 2;
  214693. #endif
  214694. r = ty;
  214695. (void)mp_to_unsigned_bin_len(exp, e, 128);
  214696. XMEMCPY(tx, p1024_norm_mod, sizeof(sp_digit) * 32);
  214697. y = e[112] >> 7;
  214698. y |= (e[96] >> 7) << 1;
  214699. y |= (e[80] >> 7) << 2;
  214700. y |= (e[64] >> 7) << 3;
  214701. y |= (e[48] >> 7) << 4;
  214702. y |= (e[32] >> 7) << 5;
  214703. y |= (e[16] >> 7) << 6;
  214704. y |= (e[0] >> 7) << 7;
  214705. XMEMCPY(ty, sp_1024_g_table[y], sizeof(sp_digit) * 32);
  214706. for (i = 126; i >= 0; i--) {
  214707. y = (e[127 - (i / 8)] >> (i & 0x7)) & 1;
  214708. y |= ((e[111 - (i / 8)] >> (i & 0x7)) & 1) << 1;
  214709. y |= ((e[95 - (i / 8)] >> (i & 0x7)) & 1) << 2;
  214710. y |= ((e[79 - (i / 8)] >> (i & 0x7)) & 1) << 3;
  214711. y |= ((e[63 - (i / 8)] >> (i & 0x7)) & 1) << 4;
  214712. y |= ((e[47 - (i / 8)] >> (i & 0x7)) & 1) << 5;
  214713. y |= ((e[31 - (i / 8)] >> (i & 0x7)) & 1) << 6;
  214714. y |= ((e[15 - (i / 8)] >> (i & 0x7)) & 1) << 7;
  214715. sp_1024_proj_sqr_32(tx, ty, t);
  214716. sp_1024_proj_mul_qx1_32(tx, ty, sp_1024_g_table[y], t);
  214717. }
  214718. }
  214719. if (err == MP_OKAY) {
  214720. sp_1024_mont_inv_32(tx, tx, t);
  214721. sp_1024_mont_mul_32(r, tx, ty, p1024_mod, p1024_mp_mod);
  214722. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  214723. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  214724. err = sp_1024_to_mp(r, res);
  214725. }
  214726. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  214727. !defined(WOLFSSL_SP_NO_MALLOC)
  214728. if (td != NULL) {
  214729. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  214730. }
  214731. #endif
  214732. return err;
  214733. }
  214734. #endif /* WOLFSSL_SP_SMALL */
  214735. /* Multiply p* by q* in projective co-ordinates.
  214736. *
  214737. * p.x' = (p.x * q.x) - (p.y * q.y)
  214738. * p.y' = (p.x * q.y) + (p.y * q.x)
  214739. * But applying Karatsuba:
  214740. * v0 = p.x * q.x
  214741. * v1 = p.y * q.y
  214742. * p.x' = v0 - v1
  214743. * p.y' = (px + py) * (qx + qy) - v0 - v1
  214744. *
  214745. * px [in,out] A single precision integer - X ordinate of number to multiply.
  214746. * py [in,out] A single precision integer - Y ordinate of number to multiply.
  214747. * qx [in] A single precision integer - X ordinate of number of
  214748. * multiplier.
  214749. * qy [in] A single precision integer - Y ordinate of number of
  214750. * multiplier.
  214751. * t [in] Two single precision integers - temps.
  214752. */
  214753. static void sp_1024_proj_mul_32(sp_digit* px, sp_digit* py,
  214754. const sp_digit* qx, const sp_digit* qy, sp_digit* t)
  214755. {
  214756. sp_digit* t1 = t;
  214757. sp_digit* t2 = t + 2 * 32;
  214758. /* t1 = px + py */
  214759. sp_1024_mont_add_32(t1, px, py, p1024_mod);
  214760. /* t2 = qx + qy */
  214761. sp_1024_mont_add_32(t2, qx, qy, p1024_mod);
  214762. /* t2 = (px + py) * (qx + qy) */
  214763. sp_1024_mont_mul_32(t2, t1, t2, p1024_mod, p1024_mp_mod);
  214764. /* t1 = py * qy */
  214765. sp_1024_mont_mul_32(t1, py, qy, p1024_mod, p1024_mp_mod);
  214766. /* t2 = (px + py) * (qx + qy) - (py * qy) */
  214767. sp_1024_mont_sub_32(t2, t2, t1, p1024_mod);
  214768. /* px = px * qx */
  214769. sp_1024_mont_mul_32(px, px, qx, p1024_mod, p1024_mp_mod);
  214770. /* py = (px + py) * (qx + qy) - (py * qy) - (px * qx) */
  214771. sp_1024_mont_sub_32(py, t2, px, p1024_mod);
  214772. /* px = (px * qx) - (py * qy)*/
  214773. sp_1024_mont_sub_32(px, px, t1, p1024_mod);
  214774. }
  214775. #ifndef WOLFSSL_SP_SMALL
  214776. /*
  214777. * Convert point from projective to affine but keep in Montgomery form.
  214778. *
  214779. * p [in,out] Point to convert.
  214780. * t [in] Temporary numbers: 2.
  214781. */
  214782. static void sp_1024_mont_map_32(sp_point_1024* p, sp_digit* t)
  214783. {
  214784. sp_digit* t1 = t;
  214785. sp_digit* t2 = t + 2 * 32;
  214786. sp_1024_mont_inv_32(t1, p->z, t2);
  214787. sp_1024_mont_sqr_32(t2, t1, p1024_mod, p1024_mp_mod);
  214788. sp_1024_mont_mul_32(t1, t2, t1, p1024_mod, p1024_mp_mod);
  214789. sp_1024_mont_mul_32(p->x, p->x, t2, p1024_mod, p1024_mp_mod);
  214790. sp_1024_mont_mul_32(p->y, p->y, t1, p1024_mod, p1024_mp_mod);
  214791. XMEMCPY(p->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  214792. }
  214793. #endif /* WOLFSSL_SP_SMALL */
  214794. /*
  214795. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  214796. * double P.
  214797. *
  214798. * Calculations:
  214799. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  214800. * r.x = l * (p.x + q.x * p.z^2) - 2 * p.y^2
  214801. * r.y = 2 * p.y * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  214802. * v* = v*^2 * r*
  214803. * p'.x = l^2 - 8 * p.y^2 * p.x
  214804. * p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4
  214805. * p'.z = 2 * p.y * p.z
  214806. *
  214807. * @param [in,out] vx X-ordinate of projective value in F*.
  214808. * @param [in,out] vy Y-ordinate of projective value in F*.
  214809. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  214810. * @param [in] q ECC point - second point on E(F_P^2).
  214811. * @param [in] t SP temporaries (6 used).
  214812. */
  214813. static void sp_1024_accumulate_line_dbl_32(sp_digit* vx, sp_digit* vy,
  214814. sp_point_1024* p, const sp_point_1024* q, sp_digit* t)
  214815. {
  214816. sp_digit* t1 = t + 0 * 32;
  214817. sp_digit* pz2 = t + 2 * 32;
  214818. sp_digit* rx = t + 4 * 32;
  214819. sp_digit* ry = t + 6 * 32;
  214820. sp_digit* l = t + 8 * 32;
  214821. sp_digit* ty = t + 10 * 32;
  214822. /* v = v^2 */
  214823. sp_1024_proj_sqr_32(vx, vy, t);
  214824. /* pz2 = p.z^2 */
  214825. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  214826. /* t1 = p.x + p.z^2 */
  214827. sp_1024_mont_add_32(ty, p->x, pz2, p1024_mod);
  214828. /* l = p.x - p.z^2 */
  214829. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  214830. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  214831. sp_1024_mont_mul_32(t1, l, ty, p1024_mod, p1024_mp_mod);
  214832. /* l = 3 * (p.x^2 - p.z^4) */
  214833. sp_1024_mont_tpl_32(l, t1, p1024_mod);
  214834. /* t1 = q.x * p.z^2 */
  214835. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  214836. /* t1 = p.x + q.x * p.z^2 */
  214837. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  214838. /* r.x = l * (p.x + q.x * p.z^2) */
  214839. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  214840. /* r.y = 2 * p.y */
  214841. sp_1024_mont_dbl_32(ry, p->y, p1024_mod);
  214842. /* ty = 4 * p.y ^ 2 */
  214843. sp_1024_mont_sqr_32(ty, ry, p1024_mod, p1024_mp_mod);
  214844. /* t1 = 2 * p.y ^ 2 */
  214845. sp_1024_div2_32(t1, ty, p1024_mod);
  214846. /* r.x -= 2 * (p.y ^ 2) */
  214847. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  214848. /* p'.z = p.y * 2 * p.z */
  214849. sp_1024_mont_mul_32(p->z, p->z, ry, p1024_mod, p1024_mp_mod);
  214850. /* r.y = p'.z * p.z^2 */
  214851. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  214852. /* r.y = p'.z * p.z^2 * q.y */
  214853. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  214854. /* v = v^2 * r */
  214855. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  214856. /* Double point using previously calculated values
  214857. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  214858. * ty = 4 * p.y^2
  214859. * p'.z = 2 * p.y * p.z
  214860. */
  214861. /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */
  214862. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  214863. /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */
  214864. sp_1024_div2_32(t1, t1, p1024_mod);
  214865. /* p'.y = 4 * p.y^2 * p.x */
  214866. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  214867. /* p'.x = l^2 */
  214868. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  214869. /* p'.x = l^2 - 4 * p.y^2 * p.x */
  214870. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  214871. /* p'.x = l^2 - 8 * p.y^2 * p.x */
  214872. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  214873. /* p'.y = 4 * p.y^2 * p.x - p.x' */
  214874. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  214875. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l */
  214876. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  214877. /* p'.y = (4 * p.y^2 * p.x - p'.x) * l - 8 * p.y^4 */
  214878. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  214879. }
  214880. #ifdef WOLFSSL_SP_SMALL
  214881. /*
  214882. * Calculate gradient of line through C, P and -C-P, accumulate line and
  214883. * add P to C.
  214884. *
  214885. * Calculations:
  214886. * r.x = (q.x + p.x) * c.y - (q.x * c.z^2 + c.x) * p.y * c.z
  214887. * r.y = (c.x - p.x * c.z^2) * q.y * c.z
  214888. * v* = v* * r*
  214889. * r = p.y * c.z^3 - c.y
  214890. * c'.x = r^2 + h^3 - 2 * c.x * h^2
  214891. * c'.y = r * (c'.x - c.x * h^2) - c.y * h^3
  214892. * c'.z = (c.x - p.x * c.z^2) * c.z
  214893. *
  214894. * @param [in,out] vx X-ordinate of projective value in F*.
  214895. * @param [in,out] vy Y-ordinate of projective value in F*.
  214896. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  214897. * to.
  214898. * @param [in] p ECC point - point on E(F_p^2) to add.
  214899. * @param [in] q ECC point - second point on E(F_P^2).
  214900. * @param [in] qx_px SP that is a constant value across adds.
  214901. * @param [in] t SP temporaries (6 used).
  214902. */
  214903. static void sp_1024_accumulate_line_add_one_32(sp_digit* vx, sp_digit* vy,
  214904. sp_point_1024* c, sp_point_1024* p, sp_point_1024* q, sp_digit* qx_px,
  214905. sp_digit* t)
  214906. {
  214907. sp_digit* t1 = t;
  214908. sp_digit* t2 = t + 2 * 32;
  214909. sp_digit* rx = t + 4 * 32;
  214910. sp_digit* ry = t + 6 * 32;
  214911. sp_digit* h = t + 8 * 32;
  214912. sp_digit* r = t + 10 * 32;
  214913. /* r.x = (q.x + p.x) * c.y */
  214914. sp_1024_mont_mul_32(rx, qx_px, c->y, p1024_mod, p1024_mp_mod);
  214915. /* t2 = c.z^2 */
  214916. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  214917. /* t1 = q.x * c.z^2 */
  214918. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  214919. /* t1 = q.x * c.z^2 + c.x */
  214920. sp_1024_mont_add_32(h, t1, c->x, p1024_mod);
  214921. /* r = p.y * c.z */
  214922. sp_1024_mont_mul_32(ry, p->y, c->z, p1024_mod, p1024_mp_mod);
  214923. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  214924. sp_1024_mont_mul_32(t1, h, ry, p1024_mod, p1024_mp_mod);
  214925. /* r = p.y * c.z * c.z^2 = p.y * c.z^3 */
  214926. sp_1024_mont_mul_32(r, ry, t2, p1024_mod, p1024_mp_mod);
  214927. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  214928. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  214929. /* t1 = p.x * c.z^2 */
  214930. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  214931. /* h = c.x - p.x * c.z^2 */
  214932. sp_1024_mont_sub_32(h, c->x, t1, p1024_mod);
  214933. /* c'.z = (c.x - p.x * c.z^2) * c.z */
  214934. sp_1024_mont_mul_32(c->z, h, c->z, p1024_mod, p1024_mp_mod);
  214935. /* r.y = (c.x - p.x * c.z^2) * c.z * q.y */
  214936. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  214937. /* v = v * r */
  214938. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  214939. /* Add p to c using previously calculated values.
  214940. * h = c.x - p.x * c.z^2
  214941. * r = p.y * c.z^3
  214942. * c'.z = (c.x - p.x * c.z^2) * c.z
  214943. */
  214944. /* r = p.y * c.z^3 - c.y */
  214945. sp_1024_mont_sub_32(r, r, c->y, p1024_mod);
  214946. /* t1 = r^2 */
  214947. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  214948. /* t2 = h^2 */
  214949. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  214950. /* ry = c.x * h^2 */
  214951. sp_1024_mont_mul_32(ry, c->x, rx, p1024_mod, p1024_mp_mod);
  214952. /* t2 = h^3 */
  214953. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  214954. /* c->x = r^2 + h^3 */
  214955. sp_1024_mont_add_32(c->x, t1, t2, p1024_mod);
  214956. /* t1 = 2 * c.x * h^2 */
  214957. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  214958. /* c'.x = r^2 + h^3 - 2 * c.x * h^2 */
  214959. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  214960. /* ry = c'.x - c.x * h^2 */
  214961. sp_1024_mont_sub_32(t1, c->x, ry, p1024_mod);
  214962. /* ry = r * (c'.x - c.x * h^2) */
  214963. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  214964. /* t2 = c.y * h^3 */
  214965. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  214966. /* c'.y = r * (c'.x - c.x * h^2) - c.y * h^3 */
  214967. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  214968. }
  214969. /*
  214970. * Calculate r = pairing <P, Q>.
  214971. *
  214972. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  214973. *
  214974. * @param [in] key SAKKE key.
  214975. * @param [in] p First point on E(F_p)[q].
  214976. * @param [in] q Second point on E(F_p)[q].
  214977. * @param [in] r Result of calculation.
  214978. * @return 0 on success.
  214979. * @return MEMORY_E when dynamic memory allocation fails.
  214980. * @return Other -ve value on internal failure.
  214981. */
  214982. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  214983. {
  214984. int err = MP_OKAY;
  214985. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  214986. !defined(WOLFSSL_SP_NO_MALLOC)
  214987. sp_digit* td = NULL;
  214988. sp_digit* t;
  214989. sp_digit* vx;
  214990. sp_digit* vy;
  214991. sp_digit* qx_px;
  214992. #else
  214993. sp_digit t[6 * 2 * 32];
  214994. sp_digit vx[2 * 32];
  214995. sp_digit vy[2 * 32];
  214996. sp_digit qx_px[2 * 32];
  214997. sp_point_1024 pd;
  214998. sp_point_1024 qd;
  214999. sp_point_1024 cd;
  215000. #endif
  215001. sp_point_1024* p = NULL;
  215002. sp_point_1024* q = NULL;
  215003. sp_point_1024* c = NULL;
  215004. sp_digit* r = NULL;
  215005. int i;
  215006. err = sp_1024_point_new_32(NULL, pd, p);
  215007. if (err == MP_OKAY) {
  215008. err = sp_1024_point_new_32(NULL, qd, q);
  215009. }
  215010. if (err == MP_OKAY) {
  215011. err = sp_1024_point_new_32(NULL, cd, c);
  215012. }
  215013. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215014. !defined(WOLFSSL_SP_NO_MALLOC)
  215015. if (err == MP_OKAY) {
  215016. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 9 * 32 * 2, NULL,
  215017. DYNAMIC_TYPE_TMP_BUFFER);
  215018. if (td == NULL) {
  215019. err = MEMORY_E;
  215020. }
  215021. }
  215022. #endif
  215023. if (err == MP_OKAY) {
  215024. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215025. !defined(WOLFSSL_SP_NO_MALLOC)
  215026. t = td;
  215027. vx = td + 6 * 32 * 2;
  215028. vy = td + 7 * 32 * 2;
  215029. qx_px = td + 8 * 32 * 2;
  215030. #endif
  215031. r = vy;
  215032. sp_1024_point_from_ecc_point_32(p, pm);
  215033. sp_1024_point_from_ecc_point_32(q, qm);
  215034. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  215035. }
  215036. if (err == MP_OKAY) {
  215037. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  215038. }
  215039. if (err == MP_OKAY) {
  215040. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  215041. }
  215042. if (err == MP_OKAY) {
  215043. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  215044. }
  215045. if (err == MP_OKAY) {
  215046. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  215047. }
  215048. if (err == MP_OKAY) {
  215049. XMEMCPY(c, p, sizeof(sp_point_1024));
  215050. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  215051. vx[0] = 1;
  215052. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  215053. sp_1024_mont_add_32(qx_px, q->x, p->x, p1024_mod);
  215054. for (i = 1020; i >= 0; i--) {
  215055. /* Accumulate line into v and double point. */
  215056. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  215057. if ((i > 0) && ((p1024_order[i / 32] >> (i % 32)) & 1)) {
  215058. /* Accumulate line into v and add P into C. */
  215059. sp_1024_accumulate_line_add_one_32(vx, vy, c, p, q, qx_px, t);
  215060. }
  215061. }
  215062. /* Final exponentiation */
  215063. sp_1024_proj_sqr_32(vx, vy, t);
  215064. sp_1024_proj_sqr_32(vx, vy, t);
  215065. /* Convert from PF_p[q] to F_p */
  215066. sp_1024_mont_inv_32(vx, vx, t);
  215067. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  215068. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  215069. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  215070. err = sp_1024_to_mp(r, res);
  215071. }
  215072. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215073. !defined(WOLFSSL_SP_NO_MALLOC)
  215074. if (td != NULL) {
  215075. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  215076. }
  215077. #endif
  215078. sp_1024_point_free_32(c, 1, NULL);
  215079. sp_1024_point_free_32(q, 1, NULL);
  215080. sp_1024_point_free_32(p, 1, NULL);
  215081. return err;
  215082. }
  215083. #else
  215084. /*
  215085. * Calculate gradient of line through C, P and -C-P, accumulate line and
  215086. * add P to C.
  215087. *
  215088. * Both C and P have z ordinates to use in the calculation.
  215089. *
  215090. * Calculations:
  215091. * r.x = (q.x * c.z^2 + c.x) * p.y * c.z - (q.x * p.z^2 + p.x) * c.y * p.z
  215092. * r.y = (p.x * c.z^2 - c.x * p.z^2) * q.y * p.z * c.z
  215093. * v* = v* * r*
  215094. * h = p.x * c.z^2 - c.x * p.z^2
  215095. * r = p.y * c.z^3 - c.y * p.z^3
  215096. * c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2
  215097. * c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3
  215098. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  215099. *
  215100. * @param [in,out] vx X-ordinate of projective value in F*.
  215101. * @param [in,out] vy Y-ordinate of projective value in F*.
  215102. * @param [in,out] c ECC point - current point on E(F_p^2) to be added
  215103. * to.
  215104. * @param [in,out] p ECC point - point on E(F_p^2) to add.
  215105. * @param [in,out] q ECC point - second point on E(F_P^2).
  215106. * @param [in,out] t SP temporaries (6 used).
  215107. * @param [in,out] neg Indicates to use negative P.
  215108. * @return 0 on success.
  215109. * @return MEMORY_E when dynamic memory allocation fails.
  215110. * @return Other -ve value on internal failure.
  215111. */
  215112. static void sp_1024_accumulate_line_add_n_32(sp_digit* vx, sp_digit* vy,
  215113. const sp_point_1024* p, const sp_point_1024* q,
  215114. sp_point_1024* c, sp_digit* t, int neg)
  215115. {
  215116. sp_digit* t1 = t;
  215117. sp_digit* t2 = t + 2 * 32;
  215118. sp_digit* rx = t + 4 * 32;
  215119. sp_digit* ry = t + 6 * 32;
  215120. sp_digit* h = t + 8 * 32;
  215121. sp_digit* r = t + 10 * 32;
  215122. /* h = p.z^2 */
  215123. sp_1024_mont_sqr_32(h, p->z, p1024_mod, p1024_mp_mod);
  215124. /* rx = q.x * p.z^2 */
  215125. sp_1024_mont_mul_32(rx, q->x, h, p1024_mod, p1024_mp_mod);
  215126. /* rx = q.x * p.z^2 + p.x */
  215127. sp_1024_mont_add_32(t2, rx, p->x, p1024_mod);
  215128. /* c.y = c.y * p.z */
  215129. sp_1024_mont_mul_32(t1, c->y, p->z, p1024_mod, p1024_mp_mod);
  215130. /* r.x = (q.x * p.z^2 + p.x) * c.y * p.z */
  215131. sp_1024_mont_mul_32(rx, t2, t1, p1024_mod, p1024_mp_mod);
  215132. /* c.y = c.y * p.z^3 */
  215133. sp_1024_mont_mul_32(c->y, t1, h, p1024_mod, p1024_mp_mod);
  215134. /* t2 = c.z^2 */
  215135. sp_1024_mont_sqr_32(t2, c->z, p1024_mod, p1024_mp_mod);
  215136. /* t1 = q.x * c.z^2 */
  215137. sp_1024_mont_mul_32(t1, q->x, t2, p1024_mod, p1024_mp_mod);
  215138. /* t1 = q.x * c.z^2 + c.x */
  215139. sp_1024_mont_add_32(t1, t1, c->x, p1024_mod);
  215140. /* c.x = c.x * p.z^2 */
  215141. sp_1024_mont_mul_32(c->x, c->x, h, p1024_mod, p1024_mp_mod);
  215142. /* r = p.y * c.z */
  215143. sp_1024_mont_mul_32(r, p->y, c->z, p1024_mod, p1024_mp_mod);
  215144. if (neg) {
  215145. /* r = -p.y * c.z */
  215146. sp_1024_mont_sub_32(r, p1024_mod, r, p1024_mod);
  215147. }
  215148. /* t1 = (q.x * c.z^2 + c.x) * p.y * c.z */
  215149. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  215150. /* r.x -= (q.x * c.z^2 + c.x) * p.y * c.z */
  215151. sp_1024_mont_sub_32(rx, ry, rx, p1024_mod);
  215152. /* t1 = p.x * c.z^2 */
  215153. sp_1024_mont_mul_32(t1, p->x, t2, p1024_mod, p1024_mp_mod);
  215154. /* h = p.x * c.z^2 - c.x * p.z^2 */
  215155. sp_1024_mont_sub_32(h, t1, c->x, p1024_mod);
  215156. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z */
  215157. sp_1024_mont_mul_32(t1, h, c->z, p1024_mod, p1024_mp_mod);
  215158. /* c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z */
  215159. sp_1024_mont_mul_32(c->z, t1, p->z, p1024_mod, p1024_mp_mod);
  215160. /* r.y = (p.x * c.z^2 - c.x * p.z^2) * c.z * p.z * q.y */
  215161. sp_1024_mont_mul_32(ry, c->z, q->y, p1024_mod, p1024_mp_mod);
  215162. /* r = p.y * c.z^3 */
  215163. sp_1024_mont_mul_32(t1, r, t2, p1024_mod, p1024_mp_mod);
  215164. /* r = p.y * c.z^3 - c.y * p.z^3 */
  215165. sp_1024_mont_sub_32(r, t1, c->y, p1024_mod);
  215166. /* v = v * r */
  215167. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  215168. /* Add p to c using previously calculated values.
  215169. * h = p.x * c.z^2 - c.x * p.z^2
  215170. * r = p.y * c.z^3 - c.y * p.z^3
  215171. * c'.z = (p.x * c.z^2 - c.x * p.z^2) * c.z
  215172. */
  215173. /* t1 = r^2 */
  215174. sp_1024_mont_sqr_32(t1, r, p1024_mod, p1024_mp_mod);
  215175. /* t2 = h^2 */
  215176. sp_1024_mont_sqr_32(rx, h, p1024_mod, p1024_mp_mod);
  215177. /* ry = c.x * p.z^2 * h^2 */
  215178. sp_1024_mont_mul_32(ry, rx, c->x, p1024_mod, p1024_mp_mod);
  215179. /* t2 = h^3 */
  215180. sp_1024_mont_mul_32(t2, rx, h, p1024_mod, p1024_mp_mod);
  215181. /* c'.x = r^2 - h^3 */
  215182. sp_1024_mont_sub_32(c->x, t1, t2, p1024_mod);
  215183. /* t1 = 2 * c.x * p.z^2 * h^2 */
  215184. sp_1024_mont_dbl_32(t1, ry, p1024_mod);
  215185. /* c'.x = r^2 - h^3 - 2 * c.x * p.z^2 * h^2 */
  215186. sp_1024_mont_sub_32(c->x, c->x, t1, p1024_mod);
  215187. /* ry = c.x * p.z^2 * h^2 - c'.x */
  215188. sp_1024_mont_sub_32(t1, ry, c->x, p1024_mod);
  215189. /* ry = r * (c.x * p.z^2 * h^2 - c'.x) */
  215190. sp_1024_mont_mul_32(ry, t1, r, p1024_mod, p1024_mp_mod);
  215191. /* t2 = c.y * p.z^3 * h^3 */
  215192. sp_1024_mont_mul_32(t1, t2, c->y, p1024_mod, p1024_mp_mod);
  215193. /* c'.y = r * (c.x * p.z^2 * h^2 - c'.x) - c.y * p.z^3 * h^3 */
  215194. sp_1024_mont_sub_32(c->y, ry, t1, p1024_mod);
  215195. }
  215196. /*
  215197. * Perform n accumulate doubles and doubles of P.
  215198. *
  215199. * py = 2 * p.y
  215200. *
  215201. * For each double:
  215202. * Calculate gradient of line through P, P and [-2]P, accumulate line and
  215203. * double P.
  215204. *
  215205. * Calculations:
  215206. * l = 3 * (p.x^2 - p.z^4) = 3 * (p.x - p.z^2) * (p.x + p.z^2)
  215207. * r.x = l * (p.x + q.x * p.z^2) - py^2 / 2
  215208. * r.y = py * p.z^3 * q.y (= p'.z * p.z^2 * q.y)
  215209. * v* = v*^2 * r*
  215210. * p'.x = l^2 - 2 * py^2 * p.x
  215211. * py' = (py^2 * p.x - p'.x) * l - py^4 (= 2 * p'.y)
  215212. * p'.z = py * p.z
  215213. *
  215214. * Finally:
  215215. * p'.y = py' / 2
  215216. *
  215217. * @param [in,out] vx X-ordinate of projective value in F*.
  215218. * @param [in,out] vy Y-ordinate of projective value in F*.
  215219. * @param [in,out] p ECC point - point on E(F_p^2) to double.
  215220. * @param [in] q ECC point - second point on E(F_P^2).
  215221. * @param [in] n Number of times to double.
  215222. * @param [in] t SP temporaries (6 used).
  215223. */
  215224. static void sp_1024_accumulate_line_dbl_n_32(sp_digit* vx, sp_digit* vy,
  215225. sp_point_1024* p, const sp_point_1024* q, int n, sp_digit* t)
  215226. {
  215227. sp_digit* t1 = t + 0 * 32;
  215228. sp_digit* pz2 = t + 2 * 32;
  215229. sp_digit* rx = t + 4 * 32;
  215230. sp_digit* ry = t + 6 * 32;
  215231. sp_digit* l = t + 8 * 32;
  215232. sp_digit* ty = t + 10 * 32;
  215233. int i;
  215234. /* py = 2 * p.y */
  215235. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  215236. for (i = 0; i < n; i++) {
  215237. /* v = v^2 */
  215238. sp_1024_proj_sqr_32(vx, vy, t);
  215239. /* pz2 = p.z^2 */
  215240. sp_1024_mont_sqr_32(pz2, p->z, p1024_mod, p1024_mp_mod);
  215241. /* t1 = p.x + p.z^2 */
  215242. sp_1024_mont_add_32(t1, p->x, pz2, p1024_mod);
  215243. /* l = p.x - p.z^2 */
  215244. sp_1024_mont_sub_32(l, p->x, pz2, p1024_mod);
  215245. /* t1 = (p.x + p.z^2) * (p.x - p.z^2) = p.x^2 - p.z^4 */
  215246. sp_1024_mont_mul_32(ty, l, t1, p1024_mod, p1024_mp_mod);
  215247. /* l = 3 * (p.x^2 - p.z^4) */
  215248. sp_1024_mont_tpl_32(l, ty, p1024_mod);
  215249. /* t1 = q.x * p.z^2 */
  215250. sp_1024_mont_mul_32(t1, q->x, pz2, p1024_mod, p1024_mp_mod);
  215251. /* t1 = p.x + q.x * p.z^2 */
  215252. sp_1024_mont_add_32(t1, p->x, t1, p1024_mod);
  215253. /* r.x = l * (p.x + q.x * p.z^2) */
  215254. sp_1024_mont_mul_32(rx, l, t1, p1024_mod, p1024_mp_mod);
  215255. /* ty = py ^ 2 */
  215256. sp_1024_mont_sqr_32(ty, p->y, p1024_mod, p1024_mp_mod);
  215257. /* t1 = py ^ 2 / 2 */
  215258. sp_1024_div2_32(t1, ty, p1024_mod);
  215259. /* r.x -= py ^ 2 / 2 */
  215260. sp_1024_mont_sub_32(rx, rx, t1, p1024_mod);
  215261. /* p'.z = py * pz */
  215262. sp_1024_mont_mul_32(p->z, p->z, p->y, p1024_mod, p1024_mp_mod);
  215263. /* r.y = p'.z * p.z^2 */
  215264. sp_1024_mont_mul_32(t1, p->z, pz2, p1024_mod, p1024_mp_mod);
  215265. /* r.y = p'.z * p.z^2 * q.y */
  215266. sp_1024_mont_mul_32(ry, t1, q->y, p1024_mod, p1024_mp_mod);
  215267. /* v = v^2 * r */
  215268. sp_1024_proj_mul_32(vx, vy, rx, ry, t);
  215269. /* Double point using previously calculated values
  215270. * l = 3 * (p.x - p.z^2).(p.x + p.z^2)
  215271. * ty = py^2
  215272. * p'.z = py * p.z
  215273. */
  215274. /* t1 = py^2 ^ 2 = py^4 */
  215275. sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod);
  215276. /* py' = py^2 * p. x */
  215277. sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod);
  215278. /* p'.x = l^2 */
  215279. sp_1024_mont_sqr_32(p->x, l, p1024_mod, p1024_mp_mod);
  215280. /* p'.x = l^2 - py^2 * p.x */
  215281. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  215282. /* p'.x = l^2 - 2 * p.y^2 * p.x */
  215283. sp_1024_mont_sub_32(p->x, p->x, p->y, p1024_mod);
  215284. /* py' = py^2 * p.x - p.x' */
  215285. sp_1024_mont_sub_32(ty, p->y, p->x, p1024_mod);
  215286. /* py' = (p.y^2 * p.x - p'.x) * l */
  215287. sp_1024_mont_mul_32(p->y, ty, l, p1024_mod, p1024_mp_mod);
  215288. /* py' = (p.y^2 * p.x - p'.x) * l * 2 */
  215289. sp_1024_mont_dbl_32(p->y, p->y, p1024_mod);
  215290. /* py' = (p.y^2 * p.x - p'.x) * l * 2 - p.y^4 */
  215291. sp_1024_mont_sub_32(p->y, p->y, t1, p1024_mod);
  215292. }
  215293. /* p'.y = py' / 2 */
  215294. sp_1024_div2_32(p->y, p->y, p1024_mod);
  215295. }
  215296. /* Operations to perform based on order - 1.
  215297. * Sliding window. Start at bottom and stop when bottom bit is one.
  215298. * Subtract if top bit in window is one.
  215299. * Width of 6 bits.
  215300. * Pairs: #dbls, add/subtract window value
  215301. */
  215302. static const signed char sp_1024_order_op[] = {
  215303. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  215304. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  215305. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  215306. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  215307. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  215308. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  215309. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  215310. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  215311. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  215312. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  215313. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  215314. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  215315. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  215316. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  215317. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  215318. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  215319. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  215320. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  215321. -3, 1,
  215322. };
  215323. /*
  215324. * Calculate r = pairing <P, Q>.
  215325. *
  215326. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  215327. *
  215328. * Sliding window. Start at bottom and stop when bottom bit is one.
  215329. * Subtract if top bit in window is one.
  215330. * Width of 6 bits.
  215331. *
  215332. * @param [in] pm First point on E(F_p)[q].
  215333. * @param [in] qm Second point on E(F_p)[q].
  215334. * @param [in] res Result of calculation.
  215335. * @return 0 on success.
  215336. * @return MEMORY_E when dynamic memory allocation fails.
  215337. */
  215338. int sp_Pairing_1024(const ecc_point* pm, const ecc_point* qm, mp_int* res)
  215339. {
  215340. int err;
  215341. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215342. !defined(WOLFSSL_SP_NO_MALLOC)
  215343. sp_digit* td = NULL;
  215344. sp_digit* t;
  215345. sp_digit* vx;
  215346. sp_digit* vy;
  215347. sp_digit (*pre_vx)[64];
  215348. sp_digit (*pre_vy)[64];
  215349. sp_digit (*pre_nvy)[64];
  215350. sp_point_1024* pre_p;
  215351. #else
  215352. sp_digit t[6 * 2 * 32];
  215353. sp_digit vx[2 * 32];
  215354. sp_digit vy[2 * 32];
  215355. sp_digit pre_vx[16][64];
  215356. sp_digit pre_vy[16][64];
  215357. sp_digit pre_nvy[16][64];
  215358. sp_point_1024 pre_p[16];
  215359. sp_point_1024 pd;
  215360. sp_point_1024 qd;
  215361. sp_point_1024 cd;
  215362. #endif
  215363. sp_point_1024* p = NULL;
  215364. sp_point_1024* q = NULL;
  215365. sp_point_1024* c = NULL;
  215366. sp_digit* r = NULL;
  215367. int i;
  215368. int j;
  215369. err = sp_1024_point_new_32(NULL, pd, p);
  215370. if (err == MP_OKAY) {
  215371. err = sp_1024_point_new_32(NULL, qd, q);
  215372. }
  215373. if (err == MP_OKAY) {
  215374. err = sp_1024_point_new_32(NULL, cd, c);
  215375. }
  215376. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215377. !defined(WOLFSSL_SP_NO_MALLOC)
  215378. if (err == MP_OKAY) {
  215379. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 56 * 32 * 2 + 16 * sizeof(sp_point_1024), NULL,
  215380. DYNAMIC_TYPE_TMP_BUFFER);
  215381. if (td == NULL) {
  215382. err = MEMORY_E;
  215383. }
  215384. }
  215385. #endif
  215386. if (err == MP_OKAY) {
  215387. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215388. !defined(WOLFSSL_SP_NO_MALLOC)
  215389. t = td;
  215390. vx = td + 6 * 32 * 2;
  215391. vy = td + 7 * 32 * 2;
  215392. pre_vx = (sp_digit(*)[64])(td + 8 * 32 * 2);
  215393. pre_vy = (sp_digit(*)[64])(td + 24 * 32 * 2);
  215394. pre_nvy = (sp_digit(*)[64])(td + 40 * 32 * 2);
  215395. pre_p = (sp_point_1024*)(td + 56 * 32 * 2);
  215396. #endif
  215397. r = vy;
  215398. sp_1024_point_from_ecc_point_32(p, pm);
  215399. sp_1024_point_from_ecc_point_32(q, qm);
  215400. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  215401. }
  215402. if (err == MP_OKAY) {
  215403. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  215404. }
  215405. if (err == MP_OKAY) {
  215406. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  215407. }
  215408. if (err == MP_OKAY) {
  215409. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  215410. }
  215411. if (err == MP_OKAY) {
  215412. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  215413. }
  215414. if (err == MP_OKAY) {
  215415. /* Generate pre-computation table: 1, 3, ... , 31 */
  215416. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  215417. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  215418. pre_vx[0][0] = 1;
  215419. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  215420. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  215421. /* [2]P for adding */
  215422. XMEMCPY(c, p, sizeof(sp_point_1024));
  215423. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  215424. vx[0] = 1;
  215425. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  215426. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  215427. /* 3, 5, ... */
  215428. for (i = 1; i < 16; i++) {
  215429. XMEMCPY(&pre_p[i], &pre_p[i-1], sizeof(sp_point_1024));
  215430. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  215431. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  215432. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  215433. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  215434. q, &pre_p[i], t, 0);
  215435. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i], p1024_mod);
  215436. }
  215437. j = sp_1024_order_op[0] / 2;
  215438. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  215439. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  215440. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  215441. /* Accumulate line into v and double point n times. */
  215442. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  215443. sp_1024_order_op[1], t);
  215444. for (i = 2; i < 290; i += 2) {
  215445. j = sp_1024_order_op[i];
  215446. if (j > 0) {
  215447. j /= 2;
  215448. /* Accumulate line into v and add P into C. */
  215449. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  215450. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  215451. t, 0);
  215452. }
  215453. else {
  215454. j = -j / 2;
  215455. /* Accumulate line into v and add P into C. */
  215456. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  215457. sp_1024_accumulate_line_add_n_32(vx, vy, &pre_p[j], q, c,
  215458. t, 1);
  215459. }
  215460. /* Accumulate line into v and double point n times. */
  215461. sp_1024_accumulate_line_dbl_n_32(vx, vy, c, q,
  215462. sp_1024_order_op[i + 1], t);
  215463. }
  215464. /* Final exponentiation */
  215465. sp_1024_proj_sqr_32(vx, vy, t);
  215466. sp_1024_proj_sqr_32(vx, vy, t);
  215467. /* Convert from PF_p[q] to F_p */
  215468. sp_1024_mont_inv_32(vx, vx, t);
  215469. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  215470. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  215471. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  215472. err = sp_1024_to_mp(r, res);
  215473. }
  215474. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215475. !defined(WOLFSSL_SP_NO_MALLOC)
  215476. if (td != NULL) {
  215477. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  215478. }
  215479. #endif
  215480. sp_1024_point_free_32(c, 1, NULL);
  215481. sp_1024_point_free_32(q, 1, NULL);
  215482. sp_1024_point_free_32(p, 1, NULL);
  215483. return err;
  215484. }
  215485. #endif /* WOLFSSL_SP_SMALL */
  215486. #ifdef WOLFSSL_SP_SMALL
  215487. /*
  215488. * Generate table for pairing.
  215489. *
  215490. * Small implementation does not use a table - returns 0 length.
  215491. *
  215492. * pm [in] Point to generate table for.
  215493. * table [in] Generated table.
  215494. * len [in,out] On in, the size of the buffer.
  215495. * On out, length of table generated.
  215496. * @return 0 on success.
  215497. * LENGTH_ONLY_E when table is NULL and only length returned.
  215498. * BUFFER_E when len is too small.
  215499. */
  215500. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  215501. word32* len)
  215502. {
  215503. int err = 0;
  215504. if (table == NULL) {
  215505. *len = 0;
  215506. err = LENGTH_ONLY_E;
  215507. }
  215508. else if (*len != 0) {
  215509. err = BUFFER_E;
  215510. }
  215511. (void)*pm;
  215512. return err;
  215513. }
  215514. /*
  215515. * Calculate r = pairing <P, Q>.
  215516. *
  215517. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  215518. *
  215519. * Small implementation does not use a table - use the normal implementation.
  215520. *
  215521. * @param [in] pm First point on E(F_p)[q].
  215522. * @param [in] qm Second point on E(F_p)[q].
  215523. * @param [in] res Result of calculation.
  215524. * @param [in] table Precomputed table of values.
  215525. * @param [in] len Length of precomputed table of values in bytes.
  215526. * @return 0 on success.
  215527. * @return MEMORY_E when dynamic memory allocation fails.
  215528. */
  215529. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  215530. mp_int* res, const byte* table, word32 len)
  215531. {
  215532. (void)table;
  215533. (void)len;
  215534. return sp_Pairing_1024(pm, qm, res);
  215535. }
  215536. #else
  215537. /*
  215538. * Calc l and c for the point when doubling p.
  215539. *
  215540. * l = 3 * (p.x^2 - 1) / (2 * p.y)
  215541. * c = l * p.x - p.y
  215542. *
  215543. * @param [out] lr Gradient result - table entry.
  215544. * @param [out] cr Constant result - table entry.
  215545. * @param [in] px X-ordinate of point to double.
  215546. * @param [in] py Y-ordinate of point to double.
  215547. * @param [in] t SP temporaries (3 used).
  215548. */
  215549. static void sp_1024_accum_dbl_calc_lc_32(sp_digit* lr, sp_digit* cr,
  215550. const sp_digit* px, const sp_digit* py, sp_digit* t)
  215551. {
  215552. sp_digit* t1 = t + 0 * 2 * 32;
  215553. sp_digit* t2 = t + 2 * 2 * 32;
  215554. sp_digit* l = t + 4 * 2 * 32;
  215555. /* l = 1 / 2 * p.y */
  215556. sp_1024_mont_dbl_32(l, py, p1024_mod);
  215557. sp_1024_mont_inv_32(l, l, t);
  215558. /* t1 = p.x^2 */
  215559. sp_1024_mont_sqr_32(t1, px, p1024_mod, p1024_mp_mod);
  215560. /* t1 = p.x - 1 */
  215561. sp_1024_mont_sub_32(t1, t1, p1024_norm_mod, p1024_mod);
  215562. /* t1 = 3 * (p.x^2 - 1) */
  215563. sp_1024_mont_dbl_32(t2, t1, p1024_mod);
  215564. sp_1024_mont_add_32(t1, t1, t2, p1024_mod);
  215565. /* t1 = 3 * (p.x^2 - 1) / (2 * p.y) */
  215566. sp_1024_mont_mul_32(l, l, t1, p1024_mod, p1024_mp_mod);
  215567. /* t2 = l * p.x */
  215568. sp_1024_mont_mul_32(t2, l, px, p1024_mod, p1024_mp_mod);
  215569. /* c = t2 = l * p.x - p.y */
  215570. sp_1024_mont_sub_32(t2, t2, py, p1024_mod);
  215571. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  215572. XMEMCPY(cr, t2, sizeof(sp_digit) * 32);
  215573. }
  215574. /*
  215575. * Calc l and c when adding p and c.
  215576. *
  215577. * l = (c.y - p.y) / (c.x - p.x)
  215578. * c = (p.x * c.y - cx * p.y) / (cx - p.x)
  215579. *
  215580. * @param [out] lr Gradient result - table entry.
  215581. * @param [out] cr Constant result - table entry.
  215582. * @param [in] px X-ordinate of point to add.
  215583. * @param [in] py Y-ordinate of point to add.
  215584. * @param [in] cx X-ordinate of current point.
  215585. * @param [in] cy Y-ordinate of current point.
  215586. * @param [in] t SP temporaries (3 used).
  215587. */
  215588. static void sp_1024_accum_add_calc_lc_32(sp_digit* lr, sp_digit* cr,
  215589. const sp_digit* px, const sp_digit* py, const sp_digit* cx,
  215590. const sp_digit* cy, sp_digit* t)
  215591. {
  215592. sp_digit* t1 = t + 0 * 2 * 32;
  215593. sp_digit* c = t + 2 * 2 * 32;
  215594. sp_digit* l = t + 4 * 2 * 32;
  215595. /* l = 1 / (c.x - p.x) */
  215596. sp_1024_mont_sub_32(l, cx, px, p1024_mod);
  215597. sp_1024_mont_inv_32(l, l, t);
  215598. /* c = p.x * c.y */
  215599. sp_1024_mont_mul_32(c, px, cy, p1024_mod, p1024_mp_mod);
  215600. /* t1 = c.x * p.y */
  215601. sp_1024_mont_mul_32(t1, cx, py, p1024_mod, p1024_mp_mod);
  215602. /* c = (p.x * c.y) - (c.x * p.y) */
  215603. sp_1024_mont_sub_32(c, c, t1, p1024_mod);
  215604. /* c = ((p.x * c.y) - (c.x * p.y)) / (c.x - p.x) */
  215605. sp_1024_mont_mul_32(c, c, l, p1024_mod, p1024_mp_mod);
  215606. /* t1 = c.y - p.y */
  215607. sp_1024_mont_sub_32(t1, cy, py, p1024_mod);
  215608. /* l = (c.y - p.y) / (c.x - p.x) */
  215609. sp_1024_mont_mul_32(l, t1, l, p1024_mod, p1024_mp_mod);
  215610. XMEMCPY(lr, l, sizeof(sp_digit) * 32);
  215611. XMEMCPY(cr, c, sizeof(sp_digit) * 32);
  215612. }
  215613. /*
  215614. * Calculate vx and vy given gradient l and constant c and point q.
  215615. *
  215616. * l is a the gradient and is multiplied by q->x.
  215617. * c is a the constant that is added to the multiplicative result.
  215618. * q->y is the y-ordinate in result to multiply.
  215619. *
  215620. * if dbl
  215621. * v* = v*^2
  215622. * r.x = l * q.x + c
  215623. * r.y = q->y
  215624. * v* = v* * r*
  215625. *
  215626. * @param [in,out] vx X-ordinate of projective value in F*.
  215627. * @param [in,out] vy Y-ordinate of projective value in F*.
  215628. * @param [in] l Gradient to multiply with.
  215629. * @param [in] c Constant to add with.
  215630. * @param [in] q ECC point - second point on E(F_P^2).
  215631. * @param [in] t SP temporaries (3 used).
  215632. * @param [in] dbl Indicates whether this is for doubling. Otherwise
  215633. * adding.
  215634. */
  215635. static void sp_1024_accumulate_line_lc_32(sp_digit* vx, sp_digit* vy,
  215636. const sp_digit* l, const sp_digit* c, const sp_point_1024* q,
  215637. sp_digit* t, int dbl)
  215638. {
  215639. sp_digit* rx = t + 4 * 2 * 32;
  215640. /* v = v^2 */
  215641. if (dbl) {
  215642. sp_1024_proj_sqr_32(vx, vy, t);
  215643. }
  215644. /* rx = l * q.x + c */
  215645. sp_1024_mont_mul_32(rx, l, q->x, p1024_mod, p1024_mp_mod);
  215646. sp_1024_mont_add_32(rx, rx, c, p1024_mod);
  215647. /* v = v^2 * r */
  215648. sp_1024_proj_mul_32(vx, vy, rx, q->y, t);
  215649. }
  215650. /* Operations to perform based on order - 1.
  215651. * Sliding window. Start at bottom and stop when bottom bit is one.
  215652. * Subtract if top bit in window is one.
  215653. * Width of 6 bits.
  215654. * Pairs: #dbls, add/subtract window value
  215655. */
  215656. static const signed char sp_1024_order_op_pre[] = {
  215657. 5, 6, -13, 9, -21, 6, -5, 8, 31, 6, 3, 6, -27, 6, 25, 9,
  215658. -1, 6, -11, 6, -13, 6, -7, 6, -15, 6, -29, 7, 25, 6, -9, 6,
  215659. -19, 7, 3, 6, 11, 9, -23, 6, 1, 6, 27, 6, 1, 7, -25, 8,
  215660. 13, 7, -13, 7, -23, 10, 19, 7, 7, 7, -3, 7, 27, 6, -7, 7,
  215661. -21, 7, 11, 7, 31, 8, 1, 7, -23, 6, -17, 6, -3, 10, 11, 6,
  215662. -21, 7, -27, 11, -29, 6, -1, 10, 15, 8, 27, 7, 17, 6, 17, 7,
  215663. -13, 8, 13, 6, 21, 7, -29, 6, 19, 7, -25, 6, 11, 9, 29, 7,
  215664. -7, 8, 27, 7, 29, 10, -1, 8, -7, 8, 17, 6, 17, 7, -27, 7,
  215665. -21, 6, -9, 6, -27, 12, -23, 6, 19, 6, 13, 6, -11, 7, 27, 6,
  215666. 17, 6, -7, 6, -25, 7, -29, 6, 9, 7, 7, 6, 13, 6, -25, 6,
  215667. -19, 6, 13, 6, -11, 6, 5, 8, 19, 6, -21, 8, 23, 7, 27, 6,
  215668. -13, 6, -19, 11, 29, 7, -15, 6, -9, 7, -21, 10, -3, 7, 21, 10,
  215669. 25, 6, -15, 6, -23, 6, 21, 6, 1, 6, 21, 7, -3, 6, -3, 7,
  215670. -7, 6, -23, 7, 7, 8, 15, 9, 5, 6, -11, 6, 21, 11, -27, 7,
  215671. 27, 6, -11, 6, 31, 6, -21, 6, 19, 6, -7, 8, -7, 13, -3, 6,
  215672. -7, 7, -3, 6, 1, 6, 7, 8, 19, 8, 11, 9, -9, 7, -31, 12,
  215673. 25, 6, -17, 9, -15, 7, 5, 6, 25, 7, -5, 7, -25, 6, 17, 8,
  215674. -19, 6, -13, 6, 27, 8, 1, 7, -5, 7, -1, 6, 21, 6, 3, 10,
  215675. -3, 1,
  215676. };
  215677. /*
  215678. * Generate table for pairing.
  215679. *
  215680. * Calculate the graident (l) and constant (c) at each step of the way.
  215681. * Sliding window. Start at bottom and stop when bottom bit is one.
  215682. * Subtract if top bit in window is one.
  215683. * Width of 6 bits.
  215684. *
  215685. * pm [in] Point to generate table for.
  215686. * table [in] Generated table.
  215687. * len [in,out] On in, the size of the buffer.
  215688. * On out, length of table generated.
  215689. * @return 0 on success.
  215690. * LENGTH_ONLY_E when table is NULL and only length returned.
  215691. * BUFFER_E when len is too small.
  215692. * MEMORY_E when dynamic memory allocation fauls.
  215693. */
  215694. int sp_Pairing_gen_precomp_1024(const ecc_point* pm, byte* table,
  215695. word32* len)
  215696. {
  215697. int err = 0;
  215698. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215699. !defined(WOLFSSL_SP_NO_MALLOC)
  215700. sp_digit* td = NULL;
  215701. sp_digit* t;
  215702. sp_point_1024* pre_p;
  215703. #else
  215704. sp_digit t[6 * 2 * 32];
  215705. sp_point_1024 pre_p[16];
  215706. sp_point_1024 pd;
  215707. sp_point_1024 cd;
  215708. sp_point_1024 negd;
  215709. #endif
  215710. sp_point_1024* p = NULL;
  215711. sp_point_1024* c = NULL;
  215712. sp_point_1024* neg = NULL;
  215713. int i;
  215714. int j;
  215715. int k;
  215716. sp_table_entry_1024* precomp = (sp_table_entry_1024*)table;
  215717. if (table == NULL) {
  215718. *len = sizeof(sp_table_entry_1024) * 1167;
  215719. err = LENGTH_ONLY_E;
  215720. }
  215721. if ((err == MP_OKAY) &&
  215722. (*len < (int)(sizeof(sp_table_entry_1024) * 1167))) {
  215723. err = BUFFER_E;
  215724. }
  215725. if (err == MP_OKAY) {
  215726. err = sp_1024_point_new_32(NULL, pd, p);
  215727. }
  215728. if (err == MP_OKAY) {
  215729. err = sp_1024_point_new_32(NULL, cd, c);
  215730. }
  215731. if (err == MP_OKAY) {
  215732. err = sp_1024_point_new_32(NULL, negd, neg);
  215733. }
  215734. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215735. !defined(WOLFSSL_SP_NO_MALLOC)
  215736. if (err == MP_OKAY) {
  215737. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 6 * 32 * 2 + 16 * sizeof(sp_point_1024), NULL,
  215738. DYNAMIC_TYPE_TMP_BUFFER);
  215739. if (td == NULL) {
  215740. err = MEMORY_E;
  215741. }
  215742. }
  215743. #endif
  215744. if (err == MP_OKAY) {
  215745. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215746. !defined(WOLFSSL_SP_NO_MALLOC)
  215747. t = td;
  215748. pre_p = (sp_point_1024*)(td + 6 * 32 * 2);
  215749. #endif
  215750. sp_1024_point_from_ecc_point_32(p, pm);
  215751. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  215752. }
  215753. if (err == MP_OKAY) {
  215754. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  215755. }
  215756. if (err == MP_OKAY) {
  215757. XMEMCPY(p->z, p1024_norm_mod, sizeof(p1024_norm_mod));
  215758. neg->infinity = 0;
  215759. c->infinity = 0;
  215760. /* Generate pre-computation table: 1, 3, ... , 31 */
  215761. XMEMCPY(&pre_p[0], p, sizeof(sp_point_1024));
  215762. /* [2]P for adding */
  215763. sp_1024_proj_point_dbl_32(c, p, t);
  215764. /* 1, 3, ... */
  215765. for (i = 1; i < 16; i++) {
  215766. sp_1024_proj_point_add_32(&pre_p[i], &pre_p[i-1], c, t);
  215767. sp_1024_mont_map_32(&pre_p[i], t);
  215768. }
  215769. k = 0;
  215770. j = sp_1024_order_op_pre[0] / 2;
  215771. XMEMCPY(c, &pre_p[j], sizeof(sp_point_1024));
  215772. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  215773. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x, c->y, t);
  215774. k++;
  215775. sp_1024_proj_point_dbl_32(c, c, t);
  215776. sp_1024_mont_map_32(c, t);
  215777. }
  215778. for (i = 2; i < 290; i += 2) {
  215779. j = sp_1024_order_op_pre[i];
  215780. if (j > 0) {
  215781. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  215782. pre_p[j/2].x, pre_p[j/2].y, c->x, c->y, t);
  215783. k++;
  215784. sp_1024_proj_point_add_32(c, c, &pre_p[j/2], t);
  215785. sp_1024_mont_map_32(c, t);
  215786. }
  215787. else {
  215788. XMEMCPY(neg->x, pre_p[-j / 2].x, sizeof(pre_p->x));
  215789. sp_1024_mont_sub_32(neg->y, p1024_mod, pre_p[-j / 2].y,
  215790. p1024_mod);
  215791. XMEMCPY(neg->z, pre_p[-j / 2].z, sizeof(pre_p->z));
  215792. sp_1024_accum_add_calc_lc_32(precomp[k].x, precomp[k].y,
  215793. neg->x, neg->y, c->x, c->y, t);
  215794. k++;
  215795. sp_1024_proj_point_add_32(c, c, neg, t);
  215796. sp_1024_mont_map_32(c, t);
  215797. }
  215798. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  215799. sp_1024_accum_dbl_calc_lc_32(precomp[k].x, precomp[k].y, c->x, c->y, t);
  215800. k++;
  215801. sp_1024_proj_point_dbl_32(c, c, t);
  215802. sp_1024_mont_map_32(c, t);
  215803. }
  215804. }
  215805. *len = sizeof(sp_table_entry_1024) * 1167;
  215806. }
  215807. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215808. !defined(WOLFSSL_SP_NO_MALLOC)
  215809. if (td != NULL) {
  215810. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  215811. }
  215812. #endif
  215813. sp_1024_point_free_32(neg, 1, NULL);
  215814. sp_1024_point_free_32(c, 1, NULL);
  215815. sp_1024_point_free_32(p, 1, NULL);
  215816. return err;
  215817. }
  215818. /*
  215819. * Calculate r = pairing <P, Q>.
  215820. *
  215821. * That is, multiply base in PF_p[q] by the scalar s, such that s.P = Q.
  215822. *
  215823. * Sliding window. Start at bottom and stop when bottom bit is one.
  215824. * Subtract if top bit in window is one.
  215825. * Width of 6 bits.
  215826. * Pre-generate values in window (1, 3, ...) - only V.
  215827. * Table contains all gradient l and a constant for each point on the path.
  215828. *
  215829. * @param [in] pm First point on E(F_p)[q].
  215830. * @param [in] qm Second point on E(F_p)[q].
  215831. * @param [in] res Result of calculation.
  215832. * @param [in] table Precomputed table of values.
  215833. * @param [in] len Length of precomputed table of values in bytes.
  215834. * @return 0 on success.
  215835. * @return MEMORY_E when dynamic memory allocation fails.
  215836. */
  215837. int sp_Pairing_precomp_1024(const ecc_point* pm, const ecc_point* qm,
  215838. mp_int* res, const byte* table, word32 len)
  215839. {
  215840. int err = 0;
  215841. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215842. !defined(WOLFSSL_SP_NO_MALLOC)
  215843. sp_digit* td = NULL;
  215844. sp_digit* t;
  215845. sp_digit* vx;
  215846. sp_digit* vy;
  215847. sp_digit (*pre_vx)[64];
  215848. sp_digit (*pre_vy)[64];
  215849. sp_digit (*pre_nvy)[64];
  215850. #else
  215851. sp_digit t[6 * 2 * 32];
  215852. sp_digit vx[2 * 32];
  215853. sp_digit vy[2 * 32];
  215854. sp_digit pre_vx[16][64];
  215855. sp_digit pre_vy[16][64];
  215856. sp_digit pre_nvy[16][64];
  215857. sp_point_1024 pd;
  215858. sp_point_1024 qd;
  215859. sp_point_1024 cd;
  215860. #endif
  215861. sp_point_1024* p = NULL;
  215862. sp_point_1024* q = NULL;
  215863. sp_point_1024* c = NULL;
  215864. sp_digit* r = NULL;
  215865. int i;
  215866. int j;
  215867. int k;
  215868. const sp_table_entry_1024* precomp = (const sp_table_entry_1024*)table;
  215869. if (len < (int)(sizeof(sp_table_entry_1024) * 1167)) {
  215870. err = BUFFER_E;
  215871. }
  215872. if (err == MP_OKAY) {
  215873. err = sp_1024_point_new_32(NULL, pd, p);
  215874. }
  215875. if (err == MP_OKAY) {
  215876. err = sp_1024_point_new_32(NULL, qd, q);
  215877. }
  215878. if (err == MP_OKAY) {
  215879. err = sp_1024_point_new_32(NULL, cd, c);
  215880. }
  215881. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215882. !defined(WOLFSSL_SP_NO_MALLOC)
  215883. if (err == MP_OKAY) {
  215884. td = (sp_digit*)XMALLOC(sizeof(sp_digit) * 56 * 32 * 2, NULL,
  215885. DYNAMIC_TYPE_TMP_BUFFER);
  215886. if (td == NULL) {
  215887. err = MEMORY_E;
  215888. }
  215889. }
  215890. #endif
  215891. if (err == MP_OKAY) {
  215892. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215893. !defined(WOLFSSL_SP_NO_MALLOC)
  215894. t = td;
  215895. vx = td + 6 * 32 * 2;
  215896. vy = td + 7 * 32 * 2;
  215897. pre_vx = (sp_digit(*)[64])(td + 8 * 32 * 2);
  215898. pre_vy = (sp_digit(*)[64])(td + 24 * 32 * 2);
  215899. pre_nvy = (sp_digit(*)[64])(td + 40 * 32 * 2);
  215900. #endif
  215901. r = vy;
  215902. sp_1024_point_from_ecc_point_32(p, pm);
  215903. sp_1024_point_from_ecc_point_32(q, qm);
  215904. err = sp_1024_mod_mul_norm_32(p->x, p->x, p1024_mod);
  215905. }
  215906. if (err == MP_OKAY) {
  215907. err = sp_1024_mod_mul_norm_32(p->y, p->y, p1024_mod);
  215908. }
  215909. if (err == MP_OKAY) {
  215910. err = sp_1024_mod_mul_norm_32(p->z, p->z, p1024_mod);
  215911. }
  215912. if (err == MP_OKAY) {
  215913. err = sp_1024_mod_mul_norm_32(q->x, q->x, p1024_mod);
  215914. }
  215915. if (err == MP_OKAY) {
  215916. err = sp_1024_mod_mul_norm_32(q->y, q->y, p1024_mod);
  215917. }
  215918. if (err == MP_OKAY) {
  215919. /* Generate pre-computation table: 1, 3, ... , 31 */
  215920. XMEMSET(pre_vx[0], 0, sizeof(sp_digit) * 2 * 32);
  215921. pre_vx[0][0] = 1;
  215922. XMEMSET(pre_vy[0], 0, sizeof(sp_digit) * 2 * 32);
  215923. sp_1024_mont_sub_32(pre_nvy[0], p1024_mod, pre_vy[0], p1024_mod);
  215924. /* [2]P for adding */
  215925. XMEMCPY(c, p, sizeof(sp_point_1024));
  215926. XMEMSET(vx, 0, sizeof(sp_digit) * 2 * 32);
  215927. vx[0] = 1;
  215928. XMEMSET(vy, 0, sizeof(sp_digit) * 2 * 32);
  215929. sp_1024_accumulate_line_dbl_32(vx, vy, c, q, t);
  215930. /* 3, 5, ... */
  215931. for (i = 1; i < 16; i++) {
  215932. XMEMCPY(pre_vx[i], pre_vx[i-1], sizeof(sp_digit) * 2 * 32);
  215933. XMEMCPY(pre_vy[i], pre_vy[i-1], sizeof(sp_digit) * 2 * 32);
  215934. sp_1024_proj_mul_32(pre_vx[i], pre_vy[i], vx, vy, t);
  215935. sp_1024_accumulate_line_add_n_32(pre_vx[i], pre_vy[i], c,
  215936. q, p, t, 0);
  215937. sp_1024_mont_sub_32(pre_nvy[i], p1024_mod, pre_vy[i],
  215938. p1024_mod);
  215939. }
  215940. XMEMCPY(c->z, p1024_norm_mod, sizeof(sp_digit) * 32);
  215941. c->infinity = 0;
  215942. j = sp_1024_order_op_pre[0] / 2;
  215943. XMEMCPY(vx, pre_vx[j], sizeof(sp_digit) * 2 * 32);
  215944. XMEMCPY(vy, pre_vy[j], sizeof(sp_digit) * 2 * 32);
  215945. k = 0;
  215946. for (j = 0; j < sp_1024_order_op_pre[1]; j++) {
  215947. /* Accumulate line into v and double point. */
  215948. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  215949. precomp[k].y, q, t, 1);
  215950. k++;
  215951. }
  215952. for (i = 2; i < 290; i += 2) {
  215953. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  215954. precomp[k].y, q, t, 0);
  215955. k++;
  215956. j = sp_1024_order_op_pre[i];
  215957. if (j > 0) {
  215958. j /= 2;
  215959. /* Accumulate line into v. */
  215960. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_vy[j], t);
  215961. }
  215962. else {
  215963. j = -j / 2;
  215964. /* Accumulate line into v. */
  215965. sp_1024_proj_mul_32(vx, vy, pre_vx[j], pre_nvy[j], t);
  215966. }
  215967. for (j = 0; j < sp_1024_order_op_pre[i + 1]; j++) {
  215968. /* Accumulate line into v and double point. */
  215969. sp_1024_accumulate_line_lc_32(vx, vy, precomp[k].x,
  215970. precomp[k].y, q, t, 1);
  215971. k++;
  215972. }
  215973. }
  215974. /* Final exponentiation */
  215975. sp_1024_proj_sqr_32(vx, vy, t);
  215976. sp_1024_proj_sqr_32(vx, vy, t);
  215977. /* Convert from PF_p[q] to F_p */
  215978. sp_1024_mont_inv_32(vx, vx, t);
  215979. sp_1024_mont_mul_32(r, vx, vy, p1024_mod, p1024_mp_mod);
  215980. XMEMSET(r + 32, 0, sizeof(sp_digit) * 32);
  215981. sp_1024_mont_reduce_32(r, p1024_mod, p1024_mp_mod);
  215982. err = sp_1024_to_mp(r, res);
  215983. }
  215984. #if (defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK)) && \
  215985. !defined(WOLFSSL_SP_NO_MALLOC)
  215986. if (td != NULL) {
  215987. XFREE(td, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  215988. }
  215989. #endif
  215990. sp_1024_point_free_32(c, 1, NULL);
  215991. sp_1024_point_free_32(q, 1, NULL);
  215992. sp_1024_point_free_32(p, 1, NULL);
  215993. return err;
  215994. }
  215995. #endif /* WOLFSSL_SP_SMALL */
  215996. #ifdef HAVE_ECC_CHECK_KEY
  215997. /* Read big endian unsigned byte array into r.
  215998. *
  215999. * r A single precision integer.
  216000. * size Maximum number of bytes to convert
  216001. * a Byte array.
  216002. * n Number of bytes in array to read.
  216003. */
  216004. static void sp_1024_from_bin(sp_digit* r, int size, const byte* a, int n)
  216005. {
  216006. int i;
  216007. int j;
  216008. byte* d;
  216009. for (i = n - 1,j = 0; i >= 3; i -= 4) {
  216010. r[j] = ((sp_digit)a[i - 0] << 0) |
  216011. ((sp_digit)a[i - 1] << 8) |
  216012. ((sp_digit)a[i - 2] << 16) |
  216013. ((sp_digit)a[i - 3] << 24);
  216014. j++;
  216015. }
  216016. if (i >= 0) {
  216017. r[j] = 0;
  216018. d = (byte*)r;
  216019. switch (i) {
  216020. case 2: d[n - 1 - 2] = a[2]; //fallthrough
  216021. case 1: d[n - 1 - 1] = a[1]; //fallthrough
  216022. case 0: d[n - 1 - 0] = a[0]; //fallthrough
  216023. }
  216024. j++;
  216025. }
  216026. for (; j < size; j++) {
  216027. r[j] = 0;
  216028. }
  216029. }
  216030. /* Check that the x and y oridinates are a valid point on the curve.
  216031. *
  216032. * point EC point.
  216033. * heap Heap to use if dynamically allocating.
  216034. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  216035. * not on the curve and MP_OKAY otherwise.
  216036. */
  216037. static int sp_1024_ecc_is_point_32(const sp_point_1024* point,
  216038. void* heap)
  216039. {
  216040. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216041. sp_digit* t1 = NULL;
  216042. #else
  216043. sp_digit t1[32 * 4];
  216044. #endif
  216045. sp_digit* t2 = NULL;
  216046. sp_int32 n;
  216047. int err = MP_OKAY;
  216048. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216049. t1 = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32 * 4, heap, DYNAMIC_TYPE_ECC);
  216050. if (t1 == NULL)
  216051. err = MEMORY_E;
  216052. #endif
  216053. (void)heap;
  216054. if (err == MP_OKAY) {
  216055. t2 = t1 + 2 * 32;
  216056. sp_1024_sqr_32(t1, point->y);
  216057. (void)sp_1024_mod_32(t1, t1, p1024_mod);
  216058. sp_1024_sqr_32(t2, point->x);
  216059. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  216060. sp_1024_mul_32(t2, t2, point->x);
  216061. (void)sp_1024_mod_32(t2, t2, p1024_mod);
  216062. (void)sp_1024_sub_32(t2, p1024_mod, t2);
  216063. sp_1024_mont_add_32(t1, t1, t2, p1024_mod);
  216064. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  216065. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  216066. sp_1024_mont_add_32(t1, t1, point->x, p1024_mod);
  216067. n = sp_1024_cmp_32(t1, p1024_mod);
  216068. sp_1024_cond_sub_32(t1, t1, p1024_mod, ~(n >> 31));
  216069. sp_1024_norm_32(t1);
  216070. if (!sp_1024_iszero_32(t1)) {
  216071. err = MP_VAL;
  216072. }
  216073. }
  216074. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216075. if (t1 != NULL)
  216076. XFREE(t1, heap, DYNAMIC_TYPE_ECC);
  216077. #endif
  216078. return err;
  216079. }
  216080. /* Check that the x and y oridinates are a valid point on the curve.
  216081. *
  216082. * pX X ordinate of EC point.
  216083. * pY Y ordinate of EC point.
  216084. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  216085. * not on the curve and MP_OKAY otherwise.
  216086. */
  216087. int sp_ecc_is_point_1024(const mp_int* pX, const mp_int* pY)
  216088. {
  216089. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216090. sp_point_1024* pub = NULL;
  216091. #else
  216092. sp_point_1024 pub[1];
  216093. #endif
  216094. const byte one[1] = { 1 };
  216095. int err = MP_OKAY;
  216096. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216097. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024), NULL,
  216098. DYNAMIC_TYPE_ECC);
  216099. if (pub == NULL)
  216100. err = MEMORY_E;
  216101. #endif
  216102. if (err == MP_OKAY) {
  216103. sp_1024_from_mp(pub->x, 32, pX);
  216104. sp_1024_from_mp(pub->y, 32, pY);
  216105. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  216106. err = sp_1024_ecc_is_point_32(pub, NULL);
  216107. }
  216108. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216109. if (pub != NULL)
  216110. XFREE(pub, NULL, DYNAMIC_TYPE_ECC);
  216111. #endif
  216112. return err;
  216113. }
  216114. /* Check that the private scalar generates the EC point (px, py), the point is
  216115. * on the curve and the point has the correct order.
  216116. *
  216117. * pX X ordinate of EC point.
  216118. * pY Y ordinate of EC point.
  216119. * privm Private scalar that generates EC point.
  216120. * returns MEMORY_E if dynamic memory allocation fails, MP_VAL if the point is
  216121. * not on the curve, ECC_INF_E if the point does not have the correct order,
  216122. * ECC_PRIV_KEY_E when the private scalar doesn't generate the EC point and
  216123. * MP_OKAY otherwise.
  216124. */
  216125. int sp_ecc_check_key_1024(const mp_int* pX, const mp_int* pY,
  216126. const mp_int* privm, void* heap)
  216127. {
  216128. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216129. sp_digit* priv = NULL;
  216130. sp_point_1024* pub = NULL;
  216131. #else
  216132. sp_digit priv[32];
  216133. sp_point_1024 pub[2];
  216134. #endif
  216135. sp_point_1024* p = NULL;
  216136. const byte one[1] = { 1 };
  216137. int err = MP_OKAY;
  216138. /* Quick check the lengs of public key ordinates and private key are in
  216139. * range. Proper check later.
  216140. */
  216141. if (((mp_count_bits(pX) > 1024) ||
  216142. (mp_count_bits(pY) > 1024) ||
  216143. ((privm != NULL) && (mp_count_bits(privm) > 1024)))) {
  216144. err = ECC_OUT_OF_RANGE_E;
  216145. }
  216146. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216147. if (err == MP_OKAY) {
  216148. pub = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap,
  216149. DYNAMIC_TYPE_ECC);
  216150. if (pub == NULL)
  216151. err = MEMORY_E;
  216152. }
  216153. if (err == MP_OKAY && privm) {
  216154. priv = (sp_digit*)XMALLOC(sizeof(sp_digit) * 32, heap,
  216155. DYNAMIC_TYPE_ECC);
  216156. if (priv == NULL)
  216157. err = MEMORY_E;
  216158. }
  216159. #endif
  216160. if (err == MP_OKAY) {
  216161. p = pub + 1;
  216162. sp_1024_from_mp(pub->x, 32, pX);
  216163. sp_1024_from_mp(pub->y, 32, pY);
  216164. sp_1024_from_bin(pub->z, 32, one, (int)sizeof(one));
  216165. if (privm)
  216166. sp_1024_from_mp(priv, 32, privm);
  216167. /* Check point at infinitiy. */
  216168. if ((sp_1024_iszero_32(pub->x) != 0) &&
  216169. (sp_1024_iszero_32(pub->y) != 0)) {
  216170. err = ECC_INF_E;
  216171. }
  216172. }
  216173. /* Check range of X and Y */
  216174. if ((err == MP_OKAY) &&
  216175. ((sp_1024_cmp_32(pub->x, p1024_mod) >= 0) ||
  216176. (sp_1024_cmp_32(pub->y, p1024_mod) >= 0))) {
  216177. err = ECC_OUT_OF_RANGE_E;
  216178. }
  216179. if (err == MP_OKAY) {
  216180. /* Check point is on curve */
  216181. err = sp_1024_ecc_is_point_32(pub, heap);
  216182. }
  216183. if (err == MP_OKAY) {
  216184. /* Point * order = infinity */
  216185. err = sp_1024_ecc_mulmod_32(p, pub, p1024_order, 1, 1, heap);
  216186. }
  216187. /* Check result is infinity */
  216188. if ((err == MP_OKAY) && ((sp_1024_iszero_32(p->x) == 0) ||
  216189. (sp_1024_iszero_32(p->y) == 0))) {
  216190. err = ECC_INF_E;
  216191. }
  216192. if (privm) {
  216193. if (err == MP_OKAY) {
  216194. /* Base * private = point */
  216195. err = sp_1024_ecc_mulmod_base_32(p, priv, 1, 1, heap);
  216196. }
  216197. /* Check result is public key */
  216198. if ((err == MP_OKAY) &&
  216199. ((sp_1024_cmp_32(p->x, pub->x) != 0) ||
  216200. (sp_1024_cmp_32(p->y, pub->y) != 0))) {
  216201. err = ECC_PRIV_KEY_E;
  216202. }
  216203. }
  216204. #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SP_NO_MALLOC)
  216205. if (pub != NULL)
  216206. XFREE(pub, heap, DYNAMIC_TYPE_ECC);
  216207. if (priv != NULL)
  216208. XFREE(priv, heap, DYNAMIC_TYPE_ECC);
  216209. #endif
  216210. return err;
  216211. }
  216212. #endif
  216213. #endif /* WOLFSSL_SP_1024 */
  216214. #endif /* WOLFSSL_HAVE_SP_ECC */
  216215. #endif /* WOLFSSL_SP_ARM_THUMB_ASM */
  216216. #endif /* WOLFSSL_HAVE_SP_RSA | WOLFSSL_HAVE_SP_DH | WOLFSSL_HAVE_SP_ECC */