aesni-x86_64.s 80 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464
  1. .text
  2. .globl _aesni_encrypt
  3. .p2align 4
  4. _aesni_encrypt:
  5. movups (%rdi),%xmm2
  6. movl 240(%rdx),%eax
  7. movups (%rdx),%xmm0
  8. movups 16(%rdx),%xmm1
  9. leaq 32(%rdx),%rdx
  10. xorps %xmm0,%xmm2
  11. L$oop_enc1_1:
  12. .byte 102,15,56,220,209
  13. decl %eax
  14. movups (%rdx),%xmm1
  15. leaq 16(%rdx),%rdx
  16. jnz L$oop_enc1_1
  17. .byte 102,15,56,221,209
  18. pxor %xmm0,%xmm0
  19. pxor %xmm1,%xmm1
  20. movups %xmm2,(%rsi)
  21. pxor %xmm2,%xmm2
  22. .byte 0xf3,0xc3
  23. .globl _aesni_decrypt
  24. .p2align 4
  25. _aesni_decrypt:
  26. movups (%rdi),%xmm2
  27. movl 240(%rdx),%eax
  28. movups (%rdx),%xmm0
  29. movups 16(%rdx),%xmm1
  30. leaq 32(%rdx),%rdx
  31. xorps %xmm0,%xmm2
  32. L$oop_dec1_2:
  33. .byte 102,15,56,222,209
  34. decl %eax
  35. movups (%rdx),%xmm1
  36. leaq 16(%rdx),%rdx
  37. jnz L$oop_dec1_2
  38. .byte 102,15,56,223,209
  39. pxor %xmm0,%xmm0
  40. pxor %xmm1,%xmm1
  41. movups %xmm2,(%rsi)
  42. pxor %xmm2,%xmm2
  43. .byte 0xf3,0xc3
  44. .p2align 4
  45. _aesni_encrypt2:
  46. movups (%rcx),%xmm0
  47. shll $4,%eax
  48. movups 16(%rcx),%xmm1
  49. xorps %xmm0,%xmm2
  50. xorps %xmm0,%xmm3
  51. movups 32(%rcx),%xmm0
  52. leaq 32(%rcx,%rax,1),%rcx
  53. negq %rax
  54. addq $16,%rax
  55. L$enc_loop2:
  56. .byte 102,15,56,220,209
  57. .byte 102,15,56,220,217
  58. movups (%rcx,%rax,1),%xmm1
  59. addq $32,%rax
  60. .byte 102,15,56,220,208
  61. .byte 102,15,56,220,216
  62. movups -16(%rcx,%rax,1),%xmm0
  63. jnz L$enc_loop2
  64. .byte 102,15,56,220,209
  65. .byte 102,15,56,220,217
  66. .byte 102,15,56,221,208
  67. .byte 102,15,56,221,216
  68. .byte 0xf3,0xc3
  69. .p2align 4
  70. _aesni_decrypt2:
  71. movups (%rcx),%xmm0
  72. shll $4,%eax
  73. movups 16(%rcx),%xmm1
  74. xorps %xmm0,%xmm2
  75. xorps %xmm0,%xmm3
  76. movups 32(%rcx),%xmm0
  77. leaq 32(%rcx,%rax,1),%rcx
  78. negq %rax
  79. addq $16,%rax
  80. L$dec_loop2:
  81. .byte 102,15,56,222,209
  82. .byte 102,15,56,222,217
  83. movups (%rcx,%rax,1),%xmm1
  84. addq $32,%rax
  85. .byte 102,15,56,222,208
  86. .byte 102,15,56,222,216
  87. movups -16(%rcx,%rax,1),%xmm0
  88. jnz L$dec_loop2
  89. .byte 102,15,56,222,209
  90. .byte 102,15,56,222,217
  91. .byte 102,15,56,223,208
  92. .byte 102,15,56,223,216
  93. .byte 0xf3,0xc3
  94. .p2align 4
  95. _aesni_encrypt3:
  96. movups (%rcx),%xmm0
  97. shll $4,%eax
  98. movups 16(%rcx),%xmm1
  99. xorps %xmm0,%xmm2
  100. xorps %xmm0,%xmm3
  101. xorps %xmm0,%xmm4
  102. movups 32(%rcx),%xmm0
  103. leaq 32(%rcx,%rax,1),%rcx
  104. negq %rax
  105. addq $16,%rax
  106. L$enc_loop3:
  107. .byte 102,15,56,220,209
  108. .byte 102,15,56,220,217
  109. .byte 102,15,56,220,225
  110. movups (%rcx,%rax,1),%xmm1
  111. addq $32,%rax
  112. .byte 102,15,56,220,208
  113. .byte 102,15,56,220,216
  114. .byte 102,15,56,220,224
  115. movups -16(%rcx,%rax,1),%xmm0
  116. jnz L$enc_loop3
  117. .byte 102,15,56,220,209
  118. .byte 102,15,56,220,217
  119. .byte 102,15,56,220,225
  120. .byte 102,15,56,221,208
  121. .byte 102,15,56,221,216
  122. .byte 102,15,56,221,224
  123. .byte 0xf3,0xc3
  124. .p2align 4
  125. _aesni_decrypt3:
  126. movups (%rcx),%xmm0
  127. shll $4,%eax
  128. movups 16(%rcx),%xmm1
  129. xorps %xmm0,%xmm2
  130. xorps %xmm0,%xmm3
  131. xorps %xmm0,%xmm4
  132. movups 32(%rcx),%xmm0
  133. leaq 32(%rcx,%rax,1),%rcx
  134. negq %rax
  135. addq $16,%rax
  136. L$dec_loop3:
  137. .byte 102,15,56,222,209
  138. .byte 102,15,56,222,217
  139. .byte 102,15,56,222,225
  140. movups (%rcx,%rax,1),%xmm1
  141. addq $32,%rax
  142. .byte 102,15,56,222,208
  143. .byte 102,15,56,222,216
  144. .byte 102,15,56,222,224
  145. movups -16(%rcx,%rax,1),%xmm0
  146. jnz L$dec_loop3
  147. .byte 102,15,56,222,209
  148. .byte 102,15,56,222,217
  149. .byte 102,15,56,222,225
  150. .byte 102,15,56,223,208
  151. .byte 102,15,56,223,216
  152. .byte 102,15,56,223,224
  153. .byte 0xf3,0xc3
  154. .p2align 4
  155. _aesni_encrypt4:
  156. movups (%rcx),%xmm0
  157. shll $4,%eax
  158. movups 16(%rcx),%xmm1
  159. xorps %xmm0,%xmm2
  160. xorps %xmm0,%xmm3
  161. xorps %xmm0,%xmm4
  162. xorps %xmm0,%xmm5
  163. movups 32(%rcx),%xmm0
  164. leaq 32(%rcx,%rax,1),%rcx
  165. negq %rax
  166. .byte 0x0f,0x1f,0x00
  167. addq $16,%rax
  168. L$enc_loop4:
  169. .byte 102,15,56,220,209
  170. .byte 102,15,56,220,217
  171. .byte 102,15,56,220,225
  172. .byte 102,15,56,220,233
  173. movups (%rcx,%rax,1),%xmm1
  174. addq $32,%rax
  175. .byte 102,15,56,220,208
  176. .byte 102,15,56,220,216
  177. .byte 102,15,56,220,224
  178. .byte 102,15,56,220,232
  179. movups -16(%rcx,%rax,1),%xmm0
  180. jnz L$enc_loop4
  181. .byte 102,15,56,220,209
  182. .byte 102,15,56,220,217
  183. .byte 102,15,56,220,225
  184. .byte 102,15,56,220,233
  185. .byte 102,15,56,221,208
  186. .byte 102,15,56,221,216
  187. .byte 102,15,56,221,224
  188. .byte 102,15,56,221,232
  189. .byte 0xf3,0xc3
  190. .p2align 4
  191. _aesni_decrypt4:
  192. movups (%rcx),%xmm0
  193. shll $4,%eax
  194. movups 16(%rcx),%xmm1
  195. xorps %xmm0,%xmm2
  196. xorps %xmm0,%xmm3
  197. xorps %xmm0,%xmm4
  198. xorps %xmm0,%xmm5
  199. movups 32(%rcx),%xmm0
  200. leaq 32(%rcx,%rax,1),%rcx
  201. negq %rax
  202. .byte 0x0f,0x1f,0x00
  203. addq $16,%rax
  204. L$dec_loop4:
  205. .byte 102,15,56,222,209
  206. .byte 102,15,56,222,217
  207. .byte 102,15,56,222,225
  208. .byte 102,15,56,222,233
  209. movups (%rcx,%rax,1),%xmm1
  210. addq $32,%rax
  211. .byte 102,15,56,222,208
  212. .byte 102,15,56,222,216
  213. .byte 102,15,56,222,224
  214. .byte 102,15,56,222,232
  215. movups -16(%rcx,%rax,1),%xmm0
  216. jnz L$dec_loop4
  217. .byte 102,15,56,222,209
  218. .byte 102,15,56,222,217
  219. .byte 102,15,56,222,225
  220. .byte 102,15,56,222,233
  221. .byte 102,15,56,223,208
  222. .byte 102,15,56,223,216
  223. .byte 102,15,56,223,224
  224. .byte 102,15,56,223,232
  225. .byte 0xf3,0xc3
  226. .p2align 4
  227. _aesni_encrypt6:
  228. movups (%rcx),%xmm0
  229. shll $4,%eax
  230. movups 16(%rcx),%xmm1
  231. xorps %xmm0,%xmm2
  232. pxor %xmm0,%xmm3
  233. pxor %xmm0,%xmm4
  234. .byte 102,15,56,220,209
  235. leaq 32(%rcx,%rax,1),%rcx
  236. negq %rax
  237. .byte 102,15,56,220,217
  238. pxor %xmm0,%xmm5
  239. pxor %xmm0,%xmm6
  240. .byte 102,15,56,220,225
  241. pxor %xmm0,%xmm7
  242. movups (%rcx,%rax,1),%xmm0
  243. addq $16,%rax
  244. jmp L$enc_loop6_enter
  245. .p2align 4
  246. L$enc_loop6:
  247. .byte 102,15,56,220,209
  248. .byte 102,15,56,220,217
  249. .byte 102,15,56,220,225
  250. L$enc_loop6_enter:
  251. .byte 102,15,56,220,233
  252. .byte 102,15,56,220,241
  253. .byte 102,15,56,220,249
  254. movups (%rcx,%rax,1),%xmm1
  255. addq $32,%rax
  256. .byte 102,15,56,220,208
  257. .byte 102,15,56,220,216
  258. .byte 102,15,56,220,224
  259. .byte 102,15,56,220,232
  260. .byte 102,15,56,220,240
  261. .byte 102,15,56,220,248
  262. movups -16(%rcx,%rax,1),%xmm0
  263. jnz L$enc_loop6
  264. .byte 102,15,56,220,209
  265. .byte 102,15,56,220,217
  266. .byte 102,15,56,220,225
  267. .byte 102,15,56,220,233
  268. .byte 102,15,56,220,241
  269. .byte 102,15,56,220,249
  270. .byte 102,15,56,221,208
  271. .byte 102,15,56,221,216
  272. .byte 102,15,56,221,224
  273. .byte 102,15,56,221,232
  274. .byte 102,15,56,221,240
  275. .byte 102,15,56,221,248
  276. .byte 0xf3,0xc3
  277. .p2align 4
  278. _aesni_decrypt6:
  279. movups (%rcx),%xmm0
  280. shll $4,%eax
  281. movups 16(%rcx),%xmm1
  282. xorps %xmm0,%xmm2
  283. pxor %xmm0,%xmm3
  284. pxor %xmm0,%xmm4
  285. .byte 102,15,56,222,209
  286. leaq 32(%rcx,%rax,1),%rcx
  287. negq %rax
  288. .byte 102,15,56,222,217
  289. pxor %xmm0,%xmm5
  290. pxor %xmm0,%xmm6
  291. .byte 102,15,56,222,225
  292. pxor %xmm0,%xmm7
  293. movups (%rcx,%rax,1),%xmm0
  294. addq $16,%rax
  295. jmp L$dec_loop6_enter
  296. .p2align 4
  297. L$dec_loop6:
  298. .byte 102,15,56,222,209
  299. .byte 102,15,56,222,217
  300. .byte 102,15,56,222,225
  301. L$dec_loop6_enter:
  302. .byte 102,15,56,222,233
  303. .byte 102,15,56,222,241
  304. .byte 102,15,56,222,249
  305. movups (%rcx,%rax,1),%xmm1
  306. addq $32,%rax
  307. .byte 102,15,56,222,208
  308. .byte 102,15,56,222,216
  309. .byte 102,15,56,222,224
  310. .byte 102,15,56,222,232
  311. .byte 102,15,56,222,240
  312. .byte 102,15,56,222,248
  313. movups -16(%rcx,%rax,1),%xmm0
  314. jnz L$dec_loop6
  315. .byte 102,15,56,222,209
  316. .byte 102,15,56,222,217
  317. .byte 102,15,56,222,225
  318. .byte 102,15,56,222,233
  319. .byte 102,15,56,222,241
  320. .byte 102,15,56,222,249
  321. .byte 102,15,56,223,208
  322. .byte 102,15,56,223,216
  323. .byte 102,15,56,223,224
  324. .byte 102,15,56,223,232
  325. .byte 102,15,56,223,240
  326. .byte 102,15,56,223,248
  327. .byte 0xf3,0xc3
  328. .p2align 4
  329. _aesni_encrypt8:
  330. movups (%rcx),%xmm0
  331. shll $4,%eax
  332. movups 16(%rcx),%xmm1
  333. xorps %xmm0,%xmm2
  334. xorps %xmm0,%xmm3
  335. pxor %xmm0,%xmm4
  336. pxor %xmm0,%xmm5
  337. pxor %xmm0,%xmm6
  338. leaq 32(%rcx,%rax,1),%rcx
  339. negq %rax
  340. .byte 102,15,56,220,209
  341. pxor %xmm0,%xmm7
  342. pxor %xmm0,%xmm8
  343. .byte 102,15,56,220,217
  344. pxor %xmm0,%xmm9
  345. movups (%rcx,%rax,1),%xmm0
  346. addq $16,%rax
  347. jmp L$enc_loop8_inner
  348. .p2align 4
  349. L$enc_loop8:
  350. .byte 102,15,56,220,209
  351. .byte 102,15,56,220,217
  352. L$enc_loop8_inner:
  353. .byte 102,15,56,220,225
  354. .byte 102,15,56,220,233
  355. .byte 102,15,56,220,241
  356. .byte 102,15,56,220,249
  357. .byte 102,68,15,56,220,193
  358. .byte 102,68,15,56,220,201
  359. L$enc_loop8_enter:
  360. movups (%rcx,%rax,1),%xmm1
  361. addq $32,%rax
  362. .byte 102,15,56,220,208
  363. .byte 102,15,56,220,216
  364. .byte 102,15,56,220,224
  365. .byte 102,15,56,220,232
  366. .byte 102,15,56,220,240
  367. .byte 102,15,56,220,248
  368. .byte 102,68,15,56,220,192
  369. .byte 102,68,15,56,220,200
  370. movups -16(%rcx,%rax,1),%xmm0
  371. jnz L$enc_loop8
  372. .byte 102,15,56,220,209
  373. .byte 102,15,56,220,217
  374. .byte 102,15,56,220,225
  375. .byte 102,15,56,220,233
  376. .byte 102,15,56,220,241
  377. .byte 102,15,56,220,249
  378. .byte 102,68,15,56,220,193
  379. .byte 102,68,15,56,220,201
  380. .byte 102,15,56,221,208
  381. .byte 102,15,56,221,216
  382. .byte 102,15,56,221,224
  383. .byte 102,15,56,221,232
  384. .byte 102,15,56,221,240
  385. .byte 102,15,56,221,248
  386. .byte 102,68,15,56,221,192
  387. .byte 102,68,15,56,221,200
  388. .byte 0xf3,0xc3
  389. .p2align 4
  390. _aesni_decrypt8:
  391. movups (%rcx),%xmm0
  392. shll $4,%eax
  393. movups 16(%rcx),%xmm1
  394. xorps %xmm0,%xmm2
  395. xorps %xmm0,%xmm3
  396. pxor %xmm0,%xmm4
  397. pxor %xmm0,%xmm5
  398. pxor %xmm0,%xmm6
  399. leaq 32(%rcx,%rax,1),%rcx
  400. negq %rax
  401. .byte 102,15,56,222,209
  402. pxor %xmm0,%xmm7
  403. pxor %xmm0,%xmm8
  404. .byte 102,15,56,222,217
  405. pxor %xmm0,%xmm9
  406. movups (%rcx,%rax,1),%xmm0
  407. addq $16,%rax
  408. jmp L$dec_loop8_inner
  409. .p2align 4
  410. L$dec_loop8:
  411. .byte 102,15,56,222,209
  412. .byte 102,15,56,222,217
  413. L$dec_loop8_inner:
  414. .byte 102,15,56,222,225
  415. .byte 102,15,56,222,233
  416. .byte 102,15,56,222,241
  417. .byte 102,15,56,222,249
  418. .byte 102,68,15,56,222,193
  419. .byte 102,68,15,56,222,201
  420. L$dec_loop8_enter:
  421. movups (%rcx,%rax,1),%xmm1
  422. addq $32,%rax
  423. .byte 102,15,56,222,208
  424. .byte 102,15,56,222,216
  425. .byte 102,15,56,222,224
  426. .byte 102,15,56,222,232
  427. .byte 102,15,56,222,240
  428. .byte 102,15,56,222,248
  429. .byte 102,68,15,56,222,192
  430. .byte 102,68,15,56,222,200
  431. movups -16(%rcx,%rax,1),%xmm0
  432. jnz L$dec_loop8
  433. .byte 102,15,56,222,209
  434. .byte 102,15,56,222,217
  435. .byte 102,15,56,222,225
  436. .byte 102,15,56,222,233
  437. .byte 102,15,56,222,241
  438. .byte 102,15,56,222,249
  439. .byte 102,68,15,56,222,193
  440. .byte 102,68,15,56,222,201
  441. .byte 102,15,56,223,208
  442. .byte 102,15,56,223,216
  443. .byte 102,15,56,223,224
  444. .byte 102,15,56,223,232
  445. .byte 102,15,56,223,240
  446. .byte 102,15,56,223,248
  447. .byte 102,68,15,56,223,192
  448. .byte 102,68,15,56,223,200
  449. .byte 0xf3,0xc3
  450. .globl _aesni_ecb_encrypt
  451. .p2align 4
  452. _aesni_ecb_encrypt:
  453. andq $-16,%rdx
  454. jz L$ecb_ret
  455. movl 240(%rcx),%eax
  456. movups (%rcx),%xmm0
  457. movq %rcx,%r11
  458. movl %eax,%r10d
  459. testl %r8d,%r8d
  460. jz L$ecb_decrypt
  461. cmpq $0x80,%rdx
  462. jb L$ecb_enc_tail
  463. movdqu (%rdi),%xmm2
  464. movdqu 16(%rdi),%xmm3
  465. movdqu 32(%rdi),%xmm4
  466. movdqu 48(%rdi),%xmm5
  467. movdqu 64(%rdi),%xmm6
  468. movdqu 80(%rdi),%xmm7
  469. movdqu 96(%rdi),%xmm8
  470. movdqu 112(%rdi),%xmm9
  471. leaq 128(%rdi),%rdi
  472. subq $0x80,%rdx
  473. jmp L$ecb_enc_loop8_enter
  474. .p2align 4
  475. L$ecb_enc_loop8:
  476. movups %xmm2,(%rsi)
  477. movq %r11,%rcx
  478. movdqu (%rdi),%xmm2
  479. movl %r10d,%eax
  480. movups %xmm3,16(%rsi)
  481. movdqu 16(%rdi),%xmm3
  482. movups %xmm4,32(%rsi)
  483. movdqu 32(%rdi),%xmm4
  484. movups %xmm5,48(%rsi)
  485. movdqu 48(%rdi),%xmm5
  486. movups %xmm6,64(%rsi)
  487. movdqu 64(%rdi),%xmm6
  488. movups %xmm7,80(%rsi)
  489. movdqu 80(%rdi),%xmm7
  490. movups %xmm8,96(%rsi)
  491. movdqu 96(%rdi),%xmm8
  492. movups %xmm9,112(%rsi)
  493. leaq 128(%rsi),%rsi
  494. movdqu 112(%rdi),%xmm9
  495. leaq 128(%rdi),%rdi
  496. L$ecb_enc_loop8_enter:
  497. call _aesni_encrypt8
  498. subq $0x80,%rdx
  499. jnc L$ecb_enc_loop8
  500. movups %xmm2,(%rsi)
  501. movq %r11,%rcx
  502. movups %xmm3,16(%rsi)
  503. movl %r10d,%eax
  504. movups %xmm4,32(%rsi)
  505. movups %xmm5,48(%rsi)
  506. movups %xmm6,64(%rsi)
  507. movups %xmm7,80(%rsi)
  508. movups %xmm8,96(%rsi)
  509. movups %xmm9,112(%rsi)
  510. leaq 128(%rsi),%rsi
  511. addq $0x80,%rdx
  512. jz L$ecb_ret
  513. L$ecb_enc_tail:
  514. movups (%rdi),%xmm2
  515. cmpq $0x20,%rdx
  516. jb L$ecb_enc_one
  517. movups 16(%rdi),%xmm3
  518. je L$ecb_enc_two
  519. movups 32(%rdi),%xmm4
  520. cmpq $0x40,%rdx
  521. jb L$ecb_enc_three
  522. movups 48(%rdi),%xmm5
  523. je L$ecb_enc_four
  524. movups 64(%rdi),%xmm6
  525. cmpq $0x60,%rdx
  526. jb L$ecb_enc_five
  527. movups 80(%rdi),%xmm7
  528. je L$ecb_enc_six
  529. movdqu 96(%rdi),%xmm8
  530. xorps %xmm9,%xmm9
  531. call _aesni_encrypt8
  532. movups %xmm2,(%rsi)
  533. movups %xmm3,16(%rsi)
  534. movups %xmm4,32(%rsi)
  535. movups %xmm5,48(%rsi)
  536. movups %xmm6,64(%rsi)
  537. movups %xmm7,80(%rsi)
  538. movups %xmm8,96(%rsi)
  539. jmp L$ecb_ret
  540. .p2align 4
  541. L$ecb_enc_one:
  542. movups (%rcx),%xmm0
  543. movups 16(%rcx),%xmm1
  544. leaq 32(%rcx),%rcx
  545. xorps %xmm0,%xmm2
  546. L$oop_enc1_3:
  547. .byte 102,15,56,220,209
  548. decl %eax
  549. movups (%rcx),%xmm1
  550. leaq 16(%rcx),%rcx
  551. jnz L$oop_enc1_3
  552. .byte 102,15,56,221,209
  553. movups %xmm2,(%rsi)
  554. jmp L$ecb_ret
  555. .p2align 4
  556. L$ecb_enc_two:
  557. call _aesni_encrypt2
  558. movups %xmm2,(%rsi)
  559. movups %xmm3,16(%rsi)
  560. jmp L$ecb_ret
  561. .p2align 4
  562. L$ecb_enc_three:
  563. call _aesni_encrypt3
  564. movups %xmm2,(%rsi)
  565. movups %xmm3,16(%rsi)
  566. movups %xmm4,32(%rsi)
  567. jmp L$ecb_ret
  568. .p2align 4
  569. L$ecb_enc_four:
  570. call _aesni_encrypt4
  571. movups %xmm2,(%rsi)
  572. movups %xmm3,16(%rsi)
  573. movups %xmm4,32(%rsi)
  574. movups %xmm5,48(%rsi)
  575. jmp L$ecb_ret
  576. .p2align 4
  577. L$ecb_enc_five:
  578. xorps %xmm7,%xmm7
  579. call _aesni_encrypt6
  580. movups %xmm2,(%rsi)
  581. movups %xmm3,16(%rsi)
  582. movups %xmm4,32(%rsi)
  583. movups %xmm5,48(%rsi)
  584. movups %xmm6,64(%rsi)
  585. jmp L$ecb_ret
  586. .p2align 4
  587. L$ecb_enc_six:
  588. call _aesni_encrypt6
  589. movups %xmm2,(%rsi)
  590. movups %xmm3,16(%rsi)
  591. movups %xmm4,32(%rsi)
  592. movups %xmm5,48(%rsi)
  593. movups %xmm6,64(%rsi)
  594. movups %xmm7,80(%rsi)
  595. jmp L$ecb_ret
  596. .p2align 4
  597. L$ecb_decrypt:
  598. cmpq $0x80,%rdx
  599. jb L$ecb_dec_tail
  600. movdqu (%rdi),%xmm2
  601. movdqu 16(%rdi),%xmm3
  602. movdqu 32(%rdi),%xmm4
  603. movdqu 48(%rdi),%xmm5
  604. movdqu 64(%rdi),%xmm6
  605. movdqu 80(%rdi),%xmm7
  606. movdqu 96(%rdi),%xmm8
  607. movdqu 112(%rdi),%xmm9
  608. leaq 128(%rdi),%rdi
  609. subq $0x80,%rdx
  610. jmp L$ecb_dec_loop8_enter
  611. .p2align 4
  612. L$ecb_dec_loop8:
  613. movups %xmm2,(%rsi)
  614. movq %r11,%rcx
  615. movdqu (%rdi),%xmm2
  616. movl %r10d,%eax
  617. movups %xmm3,16(%rsi)
  618. movdqu 16(%rdi),%xmm3
  619. movups %xmm4,32(%rsi)
  620. movdqu 32(%rdi),%xmm4
  621. movups %xmm5,48(%rsi)
  622. movdqu 48(%rdi),%xmm5
  623. movups %xmm6,64(%rsi)
  624. movdqu 64(%rdi),%xmm6
  625. movups %xmm7,80(%rsi)
  626. movdqu 80(%rdi),%xmm7
  627. movups %xmm8,96(%rsi)
  628. movdqu 96(%rdi),%xmm8
  629. movups %xmm9,112(%rsi)
  630. leaq 128(%rsi),%rsi
  631. movdqu 112(%rdi),%xmm9
  632. leaq 128(%rdi),%rdi
  633. L$ecb_dec_loop8_enter:
  634. call _aesni_decrypt8
  635. movups (%r11),%xmm0
  636. subq $0x80,%rdx
  637. jnc L$ecb_dec_loop8
  638. movups %xmm2,(%rsi)
  639. pxor %xmm2,%xmm2
  640. movq %r11,%rcx
  641. movups %xmm3,16(%rsi)
  642. pxor %xmm3,%xmm3
  643. movl %r10d,%eax
  644. movups %xmm4,32(%rsi)
  645. pxor %xmm4,%xmm4
  646. movups %xmm5,48(%rsi)
  647. pxor %xmm5,%xmm5
  648. movups %xmm6,64(%rsi)
  649. pxor %xmm6,%xmm6
  650. movups %xmm7,80(%rsi)
  651. pxor %xmm7,%xmm7
  652. movups %xmm8,96(%rsi)
  653. pxor %xmm8,%xmm8
  654. movups %xmm9,112(%rsi)
  655. pxor %xmm9,%xmm9
  656. leaq 128(%rsi),%rsi
  657. addq $0x80,%rdx
  658. jz L$ecb_ret
  659. L$ecb_dec_tail:
  660. movups (%rdi),%xmm2
  661. cmpq $0x20,%rdx
  662. jb L$ecb_dec_one
  663. movups 16(%rdi),%xmm3
  664. je L$ecb_dec_two
  665. movups 32(%rdi),%xmm4
  666. cmpq $0x40,%rdx
  667. jb L$ecb_dec_three
  668. movups 48(%rdi),%xmm5
  669. je L$ecb_dec_four
  670. movups 64(%rdi),%xmm6
  671. cmpq $0x60,%rdx
  672. jb L$ecb_dec_five
  673. movups 80(%rdi),%xmm7
  674. je L$ecb_dec_six
  675. movups 96(%rdi),%xmm8
  676. movups (%rcx),%xmm0
  677. xorps %xmm9,%xmm9
  678. call _aesni_decrypt8
  679. movups %xmm2,(%rsi)
  680. pxor %xmm2,%xmm2
  681. movups %xmm3,16(%rsi)
  682. pxor %xmm3,%xmm3
  683. movups %xmm4,32(%rsi)
  684. pxor %xmm4,%xmm4
  685. movups %xmm5,48(%rsi)
  686. pxor %xmm5,%xmm5
  687. movups %xmm6,64(%rsi)
  688. pxor %xmm6,%xmm6
  689. movups %xmm7,80(%rsi)
  690. pxor %xmm7,%xmm7
  691. movups %xmm8,96(%rsi)
  692. pxor %xmm8,%xmm8
  693. pxor %xmm9,%xmm9
  694. jmp L$ecb_ret
  695. .p2align 4
  696. L$ecb_dec_one:
  697. movups (%rcx),%xmm0
  698. movups 16(%rcx),%xmm1
  699. leaq 32(%rcx),%rcx
  700. xorps %xmm0,%xmm2
  701. L$oop_dec1_4:
  702. .byte 102,15,56,222,209
  703. decl %eax
  704. movups (%rcx),%xmm1
  705. leaq 16(%rcx),%rcx
  706. jnz L$oop_dec1_4
  707. .byte 102,15,56,223,209
  708. movups %xmm2,(%rsi)
  709. pxor %xmm2,%xmm2
  710. jmp L$ecb_ret
  711. .p2align 4
  712. L$ecb_dec_two:
  713. call _aesni_decrypt2
  714. movups %xmm2,(%rsi)
  715. pxor %xmm2,%xmm2
  716. movups %xmm3,16(%rsi)
  717. pxor %xmm3,%xmm3
  718. jmp L$ecb_ret
  719. .p2align 4
  720. L$ecb_dec_three:
  721. call _aesni_decrypt3
  722. movups %xmm2,(%rsi)
  723. pxor %xmm2,%xmm2
  724. movups %xmm3,16(%rsi)
  725. pxor %xmm3,%xmm3
  726. movups %xmm4,32(%rsi)
  727. pxor %xmm4,%xmm4
  728. jmp L$ecb_ret
  729. .p2align 4
  730. L$ecb_dec_four:
  731. call _aesni_decrypt4
  732. movups %xmm2,(%rsi)
  733. pxor %xmm2,%xmm2
  734. movups %xmm3,16(%rsi)
  735. pxor %xmm3,%xmm3
  736. movups %xmm4,32(%rsi)
  737. pxor %xmm4,%xmm4
  738. movups %xmm5,48(%rsi)
  739. pxor %xmm5,%xmm5
  740. jmp L$ecb_ret
  741. .p2align 4
  742. L$ecb_dec_five:
  743. xorps %xmm7,%xmm7
  744. call _aesni_decrypt6
  745. movups %xmm2,(%rsi)
  746. pxor %xmm2,%xmm2
  747. movups %xmm3,16(%rsi)
  748. pxor %xmm3,%xmm3
  749. movups %xmm4,32(%rsi)
  750. pxor %xmm4,%xmm4
  751. movups %xmm5,48(%rsi)
  752. pxor %xmm5,%xmm5
  753. movups %xmm6,64(%rsi)
  754. pxor %xmm6,%xmm6
  755. pxor %xmm7,%xmm7
  756. jmp L$ecb_ret
  757. .p2align 4
  758. L$ecb_dec_six:
  759. call _aesni_decrypt6
  760. movups %xmm2,(%rsi)
  761. pxor %xmm2,%xmm2
  762. movups %xmm3,16(%rsi)
  763. pxor %xmm3,%xmm3
  764. movups %xmm4,32(%rsi)
  765. pxor %xmm4,%xmm4
  766. movups %xmm5,48(%rsi)
  767. pxor %xmm5,%xmm5
  768. movups %xmm6,64(%rsi)
  769. pxor %xmm6,%xmm6
  770. movups %xmm7,80(%rsi)
  771. pxor %xmm7,%xmm7
  772. L$ecb_ret:
  773. xorps %xmm0,%xmm0
  774. pxor %xmm1,%xmm1
  775. .byte 0xf3,0xc3
  776. .globl _aesni_ccm64_encrypt_blocks
  777. .p2align 4
  778. _aesni_ccm64_encrypt_blocks:
  779. movl 240(%rcx),%eax
  780. movdqu (%r8),%xmm6
  781. movdqa L$increment64(%rip),%xmm9
  782. movdqa L$bswap_mask(%rip),%xmm7
  783. shll $4,%eax
  784. movl $16,%r10d
  785. leaq 0(%rcx),%r11
  786. movdqu (%r9),%xmm3
  787. movdqa %xmm6,%xmm2
  788. leaq 32(%rcx,%rax,1),%rcx
  789. .byte 102,15,56,0,247
  790. subq %rax,%r10
  791. jmp L$ccm64_enc_outer
  792. .p2align 4
  793. L$ccm64_enc_outer:
  794. movups (%r11),%xmm0
  795. movq %r10,%rax
  796. movups (%rdi),%xmm8
  797. xorps %xmm0,%xmm2
  798. movups 16(%r11),%xmm1
  799. xorps %xmm8,%xmm0
  800. xorps %xmm0,%xmm3
  801. movups 32(%r11),%xmm0
  802. L$ccm64_enc2_loop:
  803. .byte 102,15,56,220,209
  804. .byte 102,15,56,220,217
  805. movups (%rcx,%rax,1),%xmm1
  806. addq $32,%rax
  807. .byte 102,15,56,220,208
  808. .byte 102,15,56,220,216
  809. movups -16(%rcx,%rax,1),%xmm0
  810. jnz L$ccm64_enc2_loop
  811. .byte 102,15,56,220,209
  812. .byte 102,15,56,220,217
  813. paddq %xmm9,%xmm6
  814. decq %rdx
  815. .byte 102,15,56,221,208
  816. .byte 102,15,56,221,216
  817. leaq 16(%rdi),%rdi
  818. xorps %xmm2,%xmm8
  819. movdqa %xmm6,%xmm2
  820. movups %xmm8,(%rsi)
  821. .byte 102,15,56,0,215
  822. leaq 16(%rsi),%rsi
  823. jnz L$ccm64_enc_outer
  824. pxor %xmm0,%xmm0
  825. pxor %xmm1,%xmm1
  826. pxor %xmm2,%xmm2
  827. movups %xmm3,(%r9)
  828. pxor %xmm3,%xmm3
  829. pxor %xmm8,%xmm8
  830. pxor %xmm6,%xmm6
  831. .byte 0xf3,0xc3
  832. .globl _aesni_ccm64_decrypt_blocks
  833. .p2align 4
  834. _aesni_ccm64_decrypt_blocks:
  835. movl 240(%rcx),%eax
  836. movups (%r8),%xmm6
  837. movdqu (%r9),%xmm3
  838. movdqa L$increment64(%rip),%xmm9
  839. movdqa L$bswap_mask(%rip),%xmm7
  840. movaps %xmm6,%xmm2
  841. movl %eax,%r10d
  842. movq %rcx,%r11
  843. .byte 102,15,56,0,247
  844. movups (%rcx),%xmm0
  845. movups 16(%rcx),%xmm1
  846. leaq 32(%rcx),%rcx
  847. xorps %xmm0,%xmm2
  848. L$oop_enc1_5:
  849. .byte 102,15,56,220,209
  850. decl %eax
  851. movups (%rcx),%xmm1
  852. leaq 16(%rcx),%rcx
  853. jnz L$oop_enc1_5
  854. .byte 102,15,56,221,209
  855. shll $4,%r10d
  856. movl $16,%eax
  857. movups (%rdi),%xmm8
  858. paddq %xmm9,%xmm6
  859. leaq 16(%rdi),%rdi
  860. subq %r10,%rax
  861. leaq 32(%r11,%r10,1),%rcx
  862. movq %rax,%r10
  863. jmp L$ccm64_dec_outer
  864. .p2align 4
  865. L$ccm64_dec_outer:
  866. xorps %xmm2,%xmm8
  867. movdqa %xmm6,%xmm2
  868. movups %xmm8,(%rsi)
  869. leaq 16(%rsi),%rsi
  870. .byte 102,15,56,0,215
  871. subq $1,%rdx
  872. jz L$ccm64_dec_break
  873. movups (%r11),%xmm0
  874. movq %r10,%rax
  875. movups 16(%r11),%xmm1
  876. xorps %xmm0,%xmm8
  877. xorps %xmm0,%xmm2
  878. xorps %xmm8,%xmm3
  879. movups 32(%r11),%xmm0
  880. jmp L$ccm64_dec2_loop
  881. .p2align 4
  882. L$ccm64_dec2_loop:
  883. .byte 102,15,56,220,209
  884. .byte 102,15,56,220,217
  885. movups (%rcx,%rax,1),%xmm1
  886. addq $32,%rax
  887. .byte 102,15,56,220,208
  888. .byte 102,15,56,220,216
  889. movups -16(%rcx,%rax,1),%xmm0
  890. jnz L$ccm64_dec2_loop
  891. movups (%rdi),%xmm8
  892. paddq %xmm9,%xmm6
  893. .byte 102,15,56,220,209
  894. .byte 102,15,56,220,217
  895. .byte 102,15,56,221,208
  896. .byte 102,15,56,221,216
  897. leaq 16(%rdi),%rdi
  898. jmp L$ccm64_dec_outer
  899. .p2align 4
  900. L$ccm64_dec_break:
  901. movl 240(%r11),%eax
  902. movups (%r11),%xmm0
  903. movups 16(%r11),%xmm1
  904. xorps %xmm0,%xmm8
  905. leaq 32(%r11),%r11
  906. xorps %xmm8,%xmm3
  907. L$oop_enc1_6:
  908. .byte 102,15,56,220,217
  909. decl %eax
  910. movups (%r11),%xmm1
  911. leaq 16(%r11),%r11
  912. jnz L$oop_enc1_6
  913. .byte 102,15,56,221,217
  914. pxor %xmm0,%xmm0
  915. pxor %xmm1,%xmm1
  916. pxor %xmm2,%xmm2
  917. movups %xmm3,(%r9)
  918. pxor %xmm3,%xmm3
  919. pxor %xmm8,%xmm8
  920. pxor %xmm6,%xmm6
  921. .byte 0xf3,0xc3
  922. .globl _aesni_ctr32_encrypt_blocks
  923. .p2align 4
  924. _aesni_ctr32_encrypt_blocks:
  925. cmpq $1,%rdx
  926. jne L$ctr32_bulk
  927. movups (%r8),%xmm2
  928. movups (%rdi),%xmm3
  929. movl 240(%rcx),%edx
  930. movups (%rcx),%xmm0
  931. movups 16(%rcx),%xmm1
  932. leaq 32(%rcx),%rcx
  933. xorps %xmm0,%xmm2
  934. L$oop_enc1_7:
  935. .byte 102,15,56,220,209
  936. decl %edx
  937. movups (%rcx),%xmm1
  938. leaq 16(%rcx),%rcx
  939. jnz L$oop_enc1_7
  940. .byte 102,15,56,221,209
  941. pxor %xmm0,%xmm0
  942. pxor %xmm1,%xmm1
  943. xorps %xmm3,%xmm2
  944. pxor %xmm3,%xmm3
  945. movups %xmm2,(%rsi)
  946. xorps %xmm2,%xmm2
  947. jmp L$ctr32_epilogue
  948. .p2align 4
  949. L$ctr32_bulk:
  950. leaq (%rsp),%r11
  951. pushq %rbp
  952. subq $128,%rsp
  953. andq $-16,%rsp
  954. movdqu (%r8),%xmm2
  955. movdqu (%rcx),%xmm0
  956. movl 12(%r8),%r8d
  957. pxor %xmm0,%xmm2
  958. movl 12(%rcx),%ebp
  959. movdqa %xmm2,0(%rsp)
  960. bswapl %r8d
  961. movdqa %xmm2,%xmm3
  962. movdqa %xmm2,%xmm4
  963. movdqa %xmm2,%xmm5
  964. movdqa %xmm2,64(%rsp)
  965. movdqa %xmm2,80(%rsp)
  966. movdqa %xmm2,96(%rsp)
  967. movq %rdx,%r10
  968. movdqa %xmm2,112(%rsp)
  969. leaq 1(%r8),%rax
  970. leaq 2(%r8),%rdx
  971. bswapl %eax
  972. bswapl %edx
  973. xorl %ebp,%eax
  974. xorl %ebp,%edx
  975. .byte 102,15,58,34,216,3
  976. leaq 3(%r8),%rax
  977. movdqa %xmm3,16(%rsp)
  978. .byte 102,15,58,34,226,3
  979. bswapl %eax
  980. movq %r10,%rdx
  981. leaq 4(%r8),%r10
  982. movdqa %xmm4,32(%rsp)
  983. xorl %ebp,%eax
  984. bswapl %r10d
  985. .byte 102,15,58,34,232,3
  986. xorl %ebp,%r10d
  987. movdqa %xmm5,48(%rsp)
  988. leaq 5(%r8),%r9
  989. movl %r10d,64+12(%rsp)
  990. bswapl %r9d
  991. leaq 6(%r8),%r10
  992. movl 240(%rcx),%eax
  993. xorl %ebp,%r9d
  994. bswapl %r10d
  995. movl %r9d,80+12(%rsp)
  996. xorl %ebp,%r10d
  997. leaq 7(%r8),%r9
  998. movl %r10d,96+12(%rsp)
  999. bswapl %r9d
  1000. movl _OPENSSL_ia32cap_P+4(%rip),%r10d
  1001. xorl %ebp,%r9d
  1002. andl $71303168,%r10d
  1003. movl %r9d,112+12(%rsp)
  1004. movups 16(%rcx),%xmm1
  1005. movdqa 64(%rsp),%xmm6
  1006. movdqa 80(%rsp),%xmm7
  1007. cmpq $8,%rdx
  1008. jb L$ctr32_tail
  1009. subq $6,%rdx
  1010. cmpl $4194304,%r10d
  1011. je L$ctr32_6x
  1012. leaq 128(%rcx),%rcx
  1013. subq $2,%rdx
  1014. jmp L$ctr32_loop8
  1015. .p2align 4
  1016. L$ctr32_6x:
  1017. shll $4,%eax
  1018. movl $48,%r10d
  1019. bswapl %ebp
  1020. leaq 32(%rcx,%rax,1),%rcx
  1021. subq %rax,%r10
  1022. jmp L$ctr32_loop6
  1023. .p2align 4
  1024. L$ctr32_loop6:
  1025. addl $6,%r8d
  1026. movups -48(%rcx,%r10,1),%xmm0
  1027. .byte 102,15,56,220,209
  1028. movl %r8d,%eax
  1029. xorl %ebp,%eax
  1030. .byte 102,15,56,220,217
  1031. .byte 0x0f,0x38,0xf1,0x44,0x24,12
  1032. leal 1(%r8),%eax
  1033. .byte 102,15,56,220,225
  1034. xorl %ebp,%eax
  1035. .byte 0x0f,0x38,0xf1,0x44,0x24,28
  1036. .byte 102,15,56,220,233
  1037. leal 2(%r8),%eax
  1038. xorl %ebp,%eax
  1039. .byte 102,15,56,220,241
  1040. .byte 0x0f,0x38,0xf1,0x44,0x24,44
  1041. leal 3(%r8),%eax
  1042. .byte 102,15,56,220,249
  1043. movups -32(%rcx,%r10,1),%xmm1
  1044. xorl %ebp,%eax
  1045. .byte 102,15,56,220,208
  1046. .byte 0x0f,0x38,0xf1,0x44,0x24,60
  1047. leal 4(%r8),%eax
  1048. .byte 102,15,56,220,216
  1049. xorl %ebp,%eax
  1050. .byte 0x0f,0x38,0xf1,0x44,0x24,76
  1051. .byte 102,15,56,220,224
  1052. leal 5(%r8),%eax
  1053. xorl %ebp,%eax
  1054. .byte 102,15,56,220,232
  1055. .byte 0x0f,0x38,0xf1,0x44,0x24,92
  1056. movq %r10,%rax
  1057. .byte 102,15,56,220,240
  1058. .byte 102,15,56,220,248
  1059. movups -16(%rcx,%r10,1),%xmm0
  1060. call L$enc_loop6
  1061. movdqu (%rdi),%xmm8
  1062. movdqu 16(%rdi),%xmm9
  1063. movdqu 32(%rdi),%xmm10
  1064. movdqu 48(%rdi),%xmm11
  1065. movdqu 64(%rdi),%xmm12
  1066. movdqu 80(%rdi),%xmm13
  1067. leaq 96(%rdi),%rdi
  1068. movups -64(%rcx,%r10,1),%xmm1
  1069. pxor %xmm2,%xmm8
  1070. movaps 0(%rsp),%xmm2
  1071. pxor %xmm3,%xmm9
  1072. movaps 16(%rsp),%xmm3
  1073. pxor %xmm4,%xmm10
  1074. movaps 32(%rsp),%xmm4
  1075. pxor %xmm5,%xmm11
  1076. movaps 48(%rsp),%xmm5
  1077. pxor %xmm6,%xmm12
  1078. movaps 64(%rsp),%xmm6
  1079. pxor %xmm7,%xmm13
  1080. movaps 80(%rsp),%xmm7
  1081. movdqu %xmm8,(%rsi)
  1082. movdqu %xmm9,16(%rsi)
  1083. movdqu %xmm10,32(%rsi)
  1084. movdqu %xmm11,48(%rsi)
  1085. movdqu %xmm12,64(%rsi)
  1086. movdqu %xmm13,80(%rsi)
  1087. leaq 96(%rsi),%rsi
  1088. subq $6,%rdx
  1089. jnc L$ctr32_loop6
  1090. addq $6,%rdx
  1091. jz L$ctr32_done
  1092. leal -48(%r10),%eax
  1093. leaq -80(%rcx,%r10,1),%rcx
  1094. negl %eax
  1095. shrl $4,%eax
  1096. jmp L$ctr32_tail
  1097. .p2align 5
  1098. L$ctr32_loop8:
  1099. addl $8,%r8d
  1100. movdqa 96(%rsp),%xmm8
  1101. .byte 102,15,56,220,209
  1102. movl %r8d,%r9d
  1103. movdqa 112(%rsp),%xmm9
  1104. .byte 102,15,56,220,217
  1105. bswapl %r9d
  1106. movups 32-128(%rcx),%xmm0
  1107. .byte 102,15,56,220,225
  1108. xorl %ebp,%r9d
  1109. nop
  1110. .byte 102,15,56,220,233
  1111. movl %r9d,0+12(%rsp)
  1112. leaq 1(%r8),%r9
  1113. .byte 102,15,56,220,241
  1114. .byte 102,15,56,220,249
  1115. .byte 102,68,15,56,220,193
  1116. .byte 102,68,15,56,220,201
  1117. movups 48-128(%rcx),%xmm1
  1118. bswapl %r9d
  1119. .byte 102,15,56,220,208
  1120. .byte 102,15,56,220,216
  1121. xorl %ebp,%r9d
  1122. .byte 0x66,0x90
  1123. .byte 102,15,56,220,224
  1124. .byte 102,15,56,220,232
  1125. movl %r9d,16+12(%rsp)
  1126. leaq 2(%r8),%r9
  1127. .byte 102,15,56,220,240
  1128. .byte 102,15,56,220,248
  1129. .byte 102,68,15,56,220,192
  1130. .byte 102,68,15,56,220,200
  1131. movups 64-128(%rcx),%xmm0
  1132. bswapl %r9d
  1133. .byte 102,15,56,220,209
  1134. .byte 102,15,56,220,217
  1135. xorl %ebp,%r9d
  1136. .byte 0x66,0x90
  1137. .byte 102,15,56,220,225
  1138. .byte 102,15,56,220,233
  1139. movl %r9d,32+12(%rsp)
  1140. leaq 3(%r8),%r9
  1141. .byte 102,15,56,220,241
  1142. .byte 102,15,56,220,249
  1143. .byte 102,68,15,56,220,193
  1144. .byte 102,68,15,56,220,201
  1145. movups 80-128(%rcx),%xmm1
  1146. bswapl %r9d
  1147. .byte 102,15,56,220,208
  1148. .byte 102,15,56,220,216
  1149. xorl %ebp,%r9d
  1150. .byte 0x66,0x90
  1151. .byte 102,15,56,220,224
  1152. .byte 102,15,56,220,232
  1153. movl %r9d,48+12(%rsp)
  1154. leaq 4(%r8),%r9
  1155. .byte 102,15,56,220,240
  1156. .byte 102,15,56,220,248
  1157. .byte 102,68,15,56,220,192
  1158. .byte 102,68,15,56,220,200
  1159. movups 96-128(%rcx),%xmm0
  1160. bswapl %r9d
  1161. .byte 102,15,56,220,209
  1162. .byte 102,15,56,220,217
  1163. xorl %ebp,%r9d
  1164. .byte 0x66,0x90
  1165. .byte 102,15,56,220,225
  1166. .byte 102,15,56,220,233
  1167. movl %r9d,64+12(%rsp)
  1168. leaq 5(%r8),%r9
  1169. .byte 102,15,56,220,241
  1170. .byte 102,15,56,220,249
  1171. .byte 102,68,15,56,220,193
  1172. .byte 102,68,15,56,220,201
  1173. movups 112-128(%rcx),%xmm1
  1174. bswapl %r9d
  1175. .byte 102,15,56,220,208
  1176. .byte 102,15,56,220,216
  1177. xorl %ebp,%r9d
  1178. .byte 0x66,0x90
  1179. .byte 102,15,56,220,224
  1180. .byte 102,15,56,220,232
  1181. movl %r9d,80+12(%rsp)
  1182. leaq 6(%r8),%r9
  1183. .byte 102,15,56,220,240
  1184. .byte 102,15,56,220,248
  1185. .byte 102,68,15,56,220,192
  1186. .byte 102,68,15,56,220,200
  1187. movups 128-128(%rcx),%xmm0
  1188. bswapl %r9d
  1189. .byte 102,15,56,220,209
  1190. .byte 102,15,56,220,217
  1191. xorl %ebp,%r9d
  1192. .byte 0x66,0x90
  1193. .byte 102,15,56,220,225
  1194. .byte 102,15,56,220,233
  1195. movl %r9d,96+12(%rsp)
  1196. leaq 7(%r8),%r9
  1197. .byte 102,15,56,220,241
  1198. .byte 102,15,56,220,249
  1199. .byte 102,68,15,56,220,193
  1200. .byte 102,68,15,56,220,201
  1201. movups 144-128(%rcx),%xmm1
  1202. bswapl %r9d
  1203. .byte 102,15,56,220,208
  1204. .byte 102,15,56,220,216
  1205. .byte 102,15,56,220,224
  1206. xorl %ebp,%r9d
  1207. movdqu 0(%rdi),%xmm10
  1208. .byte 102,15,56,220,232
  1209. movl %r9d,112+12(%rsp)
  1210. cmpl $11,%eax
  1211. .byte 102,15,56,220,240
  1212. .byte 102,15,56,220,248
  1213. .byte 102,68,15,56,220,192
  1214. .byte 102,68,15,56,220,200
  1215. movups 160-128(%rcx),%xmm0
  1216. jb L$ctr32_enc_done
  1217. .byte 102,15,56,220,209
  1218. .byte 102,15,56,220,217
  1219. .byte 102,15,56,220,225
  1220. .byte 102,15,56,220,233
  1221. .byte 102,15,56,220,241
  1222. .byte 102,15,56,220,249
  1223. .byte 102,68,15,56,220,193
  1224. .byte 102,68,15,56,220,201
  1225. movups 176-128(%rcx),%xmm1
  1226. .byte 102,15,56,220,208
  1227. .byte 102,15,56,220,216
  1228. .byte 102,15,56,220,224
  1229. .byte 102,15,56,220,232
  1230. .byte 102,15,56,220,240
  1231. .byte 102,15,56,220,248
  1232. .byte 102,68,15,56,220,192
  1233. .byte 102,68,15,56,220,200
  1234. movups 192-128(%rcx),%xmm0
  1235. je L$ctr32_enc_done
  1236. .byte 102,15,56,220,209
  1237. .byte 102,15,56,220,217
  1238. .byte 102,15,56,220,225
  1239. .byte 102,15,56,220,233
  1240. .byte 102,15,56,220,241
  1241. .byte 102,15,56,220,249
  1242. .byte 102,68,15,56,220,193
  1243. .byte 102,68,15,56,220,201
  1244. movups 208-128(%rcx),%xmm1
  1245. .byte 102,15,56,220,208
  1246. .byte 102,15,56,220,216
  1247. .byte 102,15,56,220,224
  1248. .byte 102,15,56,220,232
  1249. .byte 102,15,56,220,240
  1250. .byte 102,15,56,220,248
  1251. .byte 102,68,15,56,220,192
  1252. .byte 102,68,15,56,220,200
  1253. movups 224-128(%rcx),%xmm0
  1254. jmp L$ctr32_enc_done
  1255. .p2align 4
  1256. L$ctr32_enc_done:
  1257. movdqu 16(%rdi),%xmm11
  1258. pxor %xmm0,%xmm10
  1259. movdqu 32(%rdi),%xmm12
  1260. pxor %xmm0,%xmm11
  1261. movdqu 48(%rdi),%xmm13
  1262. pxor %xmm0,%xmm12
  1263. movdqu 64(%rdi),%xmm14
  1264. pxor %xmm0,%xmm13
  1265. movdqu 80(%rdi),%xmm15
  1266. pxor %xmm0,%xmm14
  1267. pxor %xmm0,%xmm15
  1268. .byte 102,15,56,220,209
  1269. .byte 102,15,56,220,217
  1270. .byte 102,15,56,220,225
  1271. .byte 102,15,56,220,233
  1272. .byte 102,15,56,220,241
  1273. .byte 102,15,56,220,249
  1274. .byte 102,68,15,56,220,193
  1275. .byte 102,68,15,56,220,201
  1276. movdqu 96(%rdi),%xmm1
  1277. leaq 128(%rdi),%rdi
  1278. .byte 102,65,15,56,221,210
  1279. pxor %xmm0,%xmm1
  1280. movdqu 112-128(%rdi),%xmm10
  1281. .byte 102,65,15,56,221,219
  1282. pxor %xmm0,%xmm10
  1283. movdqa 0(%rsp),%xmm11
  1284. .byte 102,65,15,56,221,228
  1285. .byte 102,65,15,56,221,237
  1286. movdqa 16(%rsp),%xmm12
  1287. movdqa 32(%rsp),%xmm13
  1288. .byte 102,65,15,56,221,246
  1289. .byte 102,65,15,56,221,255
  1290. movdqa 48(%rsp),%xmm14
  1291. movdqa 64(%rsp),%xmm15
  1292. .byte 102,68,15,56,221,193
  1293. movdqa 80(%rsp),%xmm0
  1294. movups 16-128(%rcx),%xmm1
  1295. .byte 102,69,15,56,221,202
  1296. movups %xmm2,(%rsi)
  1297. movdqa %xmm11,%xmm2
  1298. movups %xmm3,16(%rsi)
  1299. movdqa %xmm12,%xmm3
  1300. movups %xmm4,32(%rsi)
  1301. movdqa %xmm13,%xmm4
  1302. movups %xmm5,48(%rsi)
  1303. movdqa %xmm14,%xmm5
  1304. movups %xmm6,64(%rsi)
  1305. movdqa %xmm15,%xmm6
  1306. movups %xmm7,80(%rsi)
  1307. movdqa %xmm0,%xmm7
  1308. movups %xmm8,96(%rsi)
  1309. movups %xmm9,112(%rsi)
  1310. leaq 128(%rsi),%rsi
  1311. subq $8,%rdx
  1312. jnc L$ctr32_loop8
  1313. addq $8,%rdx
  1314. jz L$ctr32_done
  1315. leaq -128(%rcx),%rcx
  1316. L$ctr32_tail:
  1317. leaq 16(%rcx),%rcx
  1318. cmpq $4,%rdx
  1319. jb L$ctr32_loop3
  1320. je L$ctr32_loop4
  1321. shll $4,%eax
  1322. movdqa 96(%rsp),%xmm8
  1323. pxor %xmm9,%xmm9
  1324. movups 16(%rcx),%xmm0
  1325. .byte 102,15,56,220,209
  1326. .byte 102,15,56,220,217
  1327. leaq 32-16(%rcx,%rax,1),%rcx
  1328. negq %rax
  1329. .byte 102,15,56,220,225
  1330. addq $16,%rax
  1331. movups (%rdi),%xmm10
  1332. .byte 102,15,56,220,233
  1333. .byte 102,15,56,220,241
  1334. movups 16(%rdi),%xmm11
  1335. movups 32(%rdi),%xmm12
  1336. .byte 102,15,56,220,249
  1337. .byte 102,68,15,56,220,193
  1338. call L$enc_loop8_enter
  1339. movdqu 48(%rdi),%xmm13
  1340. pxor %xmm10,%xmm2
  1341. movdqu 64(%rdi),%xmm10
  1342. pxor %xmm11,%xmm3
  1343. movdqu %xmm2,(%rsi)
  1344. pxor %xmm12,%xmm4
  1345. movdqu %xmm3,16(%rsi)
  1346. pxor %xmm13,%xmm5
  1347. movdqu %xmm4,32(%rsi)
  1348. pxor %xmm10,%xmm6
  1349. movdqu %xmm5,48(%rsi)
  1350. movdqu %xmm6,64(%rsi)
  1351. cmpq $6,%rdx
  1352. jb L$ctr32_done
  1353. movups 80(%rdi),%xmm11
  1354. xorps %xmm11,%xmm7
  1355. movups %xmm7,80(%rsi)
  1356. je L$ctr32_done
  1357. movups 96(%rdi),%xmm12
  1358. xorps %xmm12,%xmm8
  1359. movups %xmm8,96(%rsi)
  1360. jmp L$ctr32_done
  1361. .p2align 5
  1362. L$ctr32_loop4:
  1363. .byte 102,15,56,220,209
  1364. leaq 16(%rcx),%rcx
  1365. decl %eax
  1366. .byte 102,15,56,220,217
  1367. .byte 102,15,56,220,225
  1368. .byte 102,15,56,220,233
  1369. movups (%rcx),%xmm1
  1370. jnz L$ctr32_loop4
  1371. .byte 102,15,56,221,209
  1372. .byte 102,15,56,221,217
  1373. movups (%rdi),%xmm10
  1374. movups 16(%rdi),%xmm11
  1375. .byte 102,15,56,221,225
  1376. .byte 102,15,56,221,233
  1377. movups 32(%rdi),%xmm12
  1378. movups 48(%rdi),%xmm13
  1379. xorps %xmm10,%xmm2
  1380. movups %xmm2,(%rsi)
  1381. xorps %xmm11,%xmm3
  1382. movups %xmm3,16(%rsi)
  1383. pxor %xmm12,%xmm4
  1384. movdqu %xmm4,32(%rsi)
  1385. pxor %xmm13,%xmm5
  1386. movdqu %xmm5,48(%rsi)
  1387. jmp L$ctr32_done
  1388. .p2align 5
  1389. L$ctr32_loop3:
  1390. .byte 102,15,56,220,209
  1391. leaq 16(%rcx),%rcx
  1392. decl %eax
  1393. .byte 102,15,56,220,217
  1394. .byte 102,15,56,220,225
  1395. movups (%rcx),%xmm1
  1396. jnz L$ctr32_loop3
  1397. .byte 102,15,56,221,209
  1398. .byte 102,15,56,221,217
  1399. .byte 102,15,56,221,225
  1400. movups (%rdi),%xmm10
  1401. xorps %xmm10,%xmm2
  1402. movups %xmm2,(%rsi)
  1403. cmpq $2,%rdx
  1404. jb L$ctr32_done
  1405. movups 16(%rdi),%xmm11
  1406. xorps %xmm11,%xmm3
  1407. movups %xmm3,16(%rsi)
  1408. je L$ctr32_done
  1409. movups 32(%rdi),%xmm12
  1410. xorps %xmm12,%xmm4
  1411. movups %xmm4,32(%rsi)
  1412. L$ctr32_done:
  1413. xorps %xmm0,%xmm0
  1414. xorl %ebp,%ebp
  1415. pxor %xmm1,%xmm1
  1416. pxor %xmm2,%xmm2
  1417. pxor %xmm3,%xmm3
  1418. pxor %xmm4,%xmm4
  1419. pxor %xmm5,%xmm5
  1420. pxor %xmm6,%xmm6
  1421. pxor %xmm7,%xmm7
  1422. movaps %xmm0,0(%rsp)
  1423. pxor %xmm8,%xmm8
  1424. movaps %xmm0,16(%rsp)
  1425. pxor %xmm9,%xmm9
  1426. movaps %xmm0,32(%rsp)
  1427. pxor %xmm10,%xmm10
  1428. movaps %xmm0,48(%rsp)
  1429. pxor %xmm11,%xmm11
  1430. movaps %xmm0,64(%rsp)
  1431. pxor %xmm12,%xmm12
  1432. movaps %xmm0,80(%rsp)
  1433. pxor %xmm13,%xmm13
  1434. movaps %xmm0,96(%rsp)
  1435. pxor %xmm14,%xmm14
  1436. movaps %xmm0,112(%rsp)
  1437. pxor %xmm15,%xmm15
  1438. movq -8(%r11),%rbp
  1439. leaq (%r11),%rsp
  1440. L$ctr32_epilogue:
  1441. .byte 0xf3,0xc3
  1442. .globl _aesni_xts_encrypt
  1443. .p2align 4
  1444. _aesni_xts_encrypt:
  1445. leaq (%rsp),%r11
  1446. pushq %rbp
  1447. subq $112,%rsp
  1448. andq $-16,%rsp
  1449. movups (%r9),%xmm2
  1450. movl 240(%r8),%eax
  1451. movl 240(%rcx),%r10d
  1452. movups (%r8),%xmm0
  1453. movups 16(%r8),%xmm1
  1454. leaq 32(%r8),%r8
  1455. xorps %xmm0,%xmm2
  1456. L$oop_enc1_8:
  1457. .byte 102,15,56,220,209
  1458. decl %eax
  1459. movups (%r8),%xmm1
  1460. leaq 16(%r8),%r8
  1461. jnz L$oop_enc1_8
  1462. .byte 102,15,56,221,209
  1463. movups (%rcx),%xmm0
  1464. movq %rcx,%rbp
  1465. movl %r10d,%eax
  1466. shll $4,%r10d
  1467. movq %rdx,%r9
  1468. andq $-16,%rdx
  1469. movups 16(%rcx,%r10,1),%xmm1
  1470. movdqa L$xts_magic(%rip),%xmm8
  1471. movdqa %xmm2,%xmm15
  1472. pshufd $0x5f,%xmm2,%xmm9
  1473. pxor %xmm0,%xmm1
  1474. movdqa %xmm9,%xmm14
  1475. paddd %xmm9,%xmm9
  1476. movdqa %xmm15,%xmm10
  1477. psrad $31,%xmm14
  1478. paddq %xmm15,%xmm15
  1479. pand %xmm8,%xmm14
  1480. pxor %xmm0,%xmm10
  1481. pxor %xmm14,%xmm15
  1482. movdqa %xmm9,%xmm14
  1483. paddd %xmm9,%xmm9
  1484. movdqa %xmm15,%xmm11
  1485. psrad $31,%xmm14
  1486. paddq %xmm15,%xmm15
  1487. pand %xmm8,%xmm14
  1488. pxor %xmm0,%xmm11
  1489. pxor %xmm14,%xmm15
  1490. movdqa %xmm9,%xmm14
  1491. paddd %xmm9,%xmm9
  1492. movdqa %xmm15,%xmm12
  1493. psrad $31,%xmm14
  1494. paddq %xmm15,%xmm15
  1495. pand %xmm8,%xmm14
  1496. pxor %xmm0,%xmm12
  1497. pxor %xmm14,%xmm15
  1498. movdqa %xmm9,%xmm14
  1499. paddd %xmm9,%xmm9
  1500. movdqa %xmm15,%xmm13
  1501. psrad $31,%xmm14
  1502. paddq %xmm15,%xmm15
  1503. pand %xmm8,%xmm14
  1504. pxor %xmm0,%xmm13
  1505. pxor %xmm14,%xmm15
  1506. movdqa %xmm15,%xmm14
  1507. psrad $31,%xmm9
  1508. paddq %xmm15,%xmm15
  1509. pand %xmm8,%xmm9
  1510. pxor %xmm0,%xmm14
  1511. pxor %xmm9,%xmm15
  1512. movaps %xmm1,96(%rsp)
  1513. subq $96,%rdx
  1514. jc L$xts_enc_short
  1515. movl $16+96,%eax
  1516. leaq 32(%rbp,%r10,1),%rcx
  1517. subq %r10,%rax
  1518. movups 16(%rbp),%xmm1
  1519. movq %rax,%r10
  1520. leaq L$xts_magic(%rip),%r8
  1521. jmp L$xts_enc_grandloop
  1522. .p2align 5
  1523. L$xts_enc_grandloop:
  1524. movdqu 0(%rdi),%xmm2
  1525. movdqa %xmm0,%xmm8
  1526. movdqu 16(%rdi),%xmm3
  1527. pxor %xmm10,%xmm2
  1528. movdqu 32(%rdi),%xmm4
  1529. pxor %xmm11,%xmm3
  1530. .byte 102,15,56,220,209
  1531. movdqu 48(%rdi),%xmm5
  1532. pxor %xmm12,%xmm4
  1533. .byte 102,15,56,220,217
  1534. movdqu 64(%rdi),%xmm6
  1535. pxor %xmm13,%xmm5
  1536. .byte 102,15,56,220,225
  1537. movdqu 80(%rdi),%xmm7
  1538. pxor %xmm15,%xmm8
  1539. movdqa 96(%rsp),%xmm9
  1540. pxor %xmm14,%xmm6
  1541. .byte 102,15,56,220,233
  1542. movups 32(%rbp),%xmm0
  1543. leaq 96(%rdi),%rdi
  1544. pxor %xmm8,%xmm7
  1545. pxor %xmm9,%xmm10
  1546. .byte 102,15,56,220,241
  1547. pxor %xmm9,%xmm11
  1548. movdqa %xmm10,0(%rsp)
  1549. .byte 102,15,56,220,249
  1550. movups 48(%rbp),%xmm1
  1551. pxor %xmm9,%xmm12
  1552. .byte 102,15,56,220,208
  1553. pxor %xmm9,%xmm13
  1554. movdqa %xmm11,16(%rsp)
  1555. .byte 102,15,56,220,216
  1556. pxor %xmm9,%xmm14
  1557. movdqa %xmm12,32(%rsp)
  1558. .byte 102,15,56,220,224
  1559. .byte 102,15,56,220,232
  1560. pxor %xmm9,%xmm8
  1561. movdqa %xmm14,64(%rsp)
  1562. .byte 102,15,56,220,240
  1563. .byte 102,15,56,220,248
  1564. movups 64(%rbp),%xmm0
  1565. movdqa %xmm8,80(%rsp)
  1566. pshufd $0x5f,%xmm15,%xmm9
  1567. jmp L$xts_enc_loop6
  1568. .p2align 5
  1569. L$xts_enc_loop6:
  1570. .byte 102,15,56,220,209
  1571. .byte 102,15,56,220,217
  1572. .byte 102,15,56,220,225
  1573. .byte 102,15,56,220,233
  1574. .byte 102,15,56,220,241
  1575. .byte 102,15,56,220,249
  1576. movups -64(%rcx,%rax,1),%xmm1
  1577. addq $32,%rax
  1578. .byte 102,15,56,220,208
  1579. .byte 102,15,56,220,216
  1580. .byte 102,15,56,220,224
  1581. .byte 102,15,56,220,232
  1582. .byte 102,15,56,220,240
  1583. .byte 102,15,56,220,248
  1584. movups -80(%rcx,%rax,1),%xmm0
  1585. jnz L$xts_enc_loop6
  1586. movdqa (%r8),%xmm8
  1587. movdqa %xmm9,%xmm14
  1588. paddd %xmm9,%xmm9
  1589. .byte 102,15,56,220,209
  1590. paddq %xmm15,%xmm15
  1591. psrad $31,%xmm14
  1592. .byte 102,15,56,220,217
  1593. pand %xmm8,%xmm14
  1594. movups (%rbp),%xmm10
  1595. .byte 102,15,56,220,225
  1596. .byte 102,15,56,220,233
  1597. .byte 102,15,56,220,241
  1598. pxor %xmm14,%xmm15
  1599. movaps %xmm10,%xmm11
  1600. .byte 102,15,56,220,249
  1601. movups -64(%rcx),%xmm1
  1602. movdqa %xmm9,%xmm14
  1603. .byte 102,15,56,220,208
  1604. paddd %xmm9,%xmm9
  1605. pxor %xmm15,%xmm10
  1606. .byte 102,15,56,220,216
  1607. psrad $31,%xmm14
  1608. paddq %xmm15,%xmm15
  1609. .byte 102,15,56,220,224
  1610. .byte 102,15,56,220,232
  1611. pand %xmm8,%xmm14
  1612. movaps %xmm11,%xmm12
  1613. .byte 102,15,56,220,240
  1614. pxor %xmm14,%xmm15
  1615. movdqa %xmm9,%xmm14
  1616. .byte 102,15,56,220,248
  1617. movups -48(%rcx),%xmm0
  1618. paddd %xmm9,%xmm9
  1619. .byte 102,15,56,220,209
  1620. pxor %xmm15,%xmm11
  1621. psrad $31,%xmm14
  1622. .byte 102,15,56,220,217
  1623. paddq %xmm15,%xmm15
  1624. pand %xmm8,%xmm14
  1625. .byte 102,15,56,220,225
  1626. .byte 102,15,56,220,233
  1627. movdqa %xmm13,48(%rsp)
  1628. pxor %xmm14,%xmm15
  1629. .byte 102,15,56,220,241
  1630. movaps %xmm12,%xmm13
  1631. movdqa %xmm9,%xmm14
  1632. .byte 102,15,56,220,249
  1633. movups -32(%rcx),%xmm1
  1634. paddd %xmm9,%xmm9
  1635. .byte 102,15,56,220,208
  1636. pxor %xmm15,%xmm12
  1637. psrad $31,%xmm14
  1638. .byte 102,15,56,220,216
  1639. paddq %xmm15,%xmm15
  1640. pand %xmm8,%xmm14
  1641. .byte 102,15,56,220,224
  1642. .byte 102,15,56,220,232
  1643. .byte 102,15,56,220,240
  1644. pxor %xmm14,%xmm15
  1645. movaps %xmm13,%xmm14
  1646. .byte 102,15,56,220,248
  1647. movdqa %xmm9,%xmm0
  1648. paddd %xmm9,%xmm9
  1649. .byte 102,15,56,220,209
  1650. pxor %xmm15,%xmm13
  1651. psrad $31,%xmm0
  1652. .byte 102,15,56,220,217
  1653. paddq %xmm15,%xmm15
  1654. pand %xmm8,%xmm0
  1655. .byte 102,15,56,220,225
  1656. .byte 102,15,56,220,233
  1657. pxor %xmm0,%xmm15
  1658. movups (%rbp),%xmm0
  1659. .byte 102,15,56,220,241
  1660. .byte 102,15,56,220,249
  1661. movups 16(%rbp),%xmm1
  1662. pxor %xmm15,%xmm14
  1663. .byte 102,15,56,221,84,36,0
  1664. psrad $31,%xmm9
  1665. paddq %xmm15,%xmm15
  1666. .byte 102,15,56,221,92,36,16
  1667. .byte 102,15,56,221,100,36,32
  1668. pand %xmm8,%xmm9
  1669. movq %r10,%rax
  1670. .byte 102,15,56,221,108,36,48
  1671. .byte 102,15,56,221,116,36,64
  1672. .byte 102,15,56,221,124,36,80
  1673. pxor %xmm9,%xmm15
  1674. leaq 96(%rsi),%rsi
  1675. movups %xmm2,-96(%rsi)
  1676. movups %xmm3,-80(%rsi)
  1677. movups %xmm4,-64(%rsi)
  1678. movups %xmm5,-48(%rsi)
  1679. movups %xmm6,-32(%rsi)
  1680. movups %xmm7,-16(%rsi)
  1681. subq $96,%rdx
  1682. jnc L$xts_enc_grandloop
  1683. movl $16+96,%eax
  1684. subl %r10d,%eax
  1685. movq %rbp,%rcx
  1686. shrl $4,%eax
  1687. L$xts_enc_short:
  1688. movl %eax,%r10d
  1689. pxor %xmm0,%xmm10
  1690. addq $96,%rdx
  1691. jz L$xts_enc_done
  1692. pxor %xmm0,%xmm11
  1693. cmpq $0x20,%rdx
  1694. jb L$xts_enc_one
  1695. pxor %xmm0,%xmm12
  1696. je L$xts_enc_two
  1697. pxor %xmm0,%xmm13
  1698. cmpq $0x40,%rdx
  1699. jb L$xts_enc_three
  1700. pxor %xmm0,%xmm14
  1701. je L$xts_enc_four
  1702. movdqu (%rdi),%xmm2
  1703. movdqu 16(%rdi),%xmm3
  1704. movdqu 32(%rdi),%xmm4
  1705. pxor %xmm10,%xmm2
  1706. movdqu 48(%rdi),%xmm5
  1707. pxor %xmm11,%xmm3
  1708. movdqu 64(%rdi),%xmm6
  1709. leaq 80(%rdi),%rdi
  1710. pxor %xmm12,%xmm4
  1711. pxor %xmm13,%xmm5
  1712. pxor %xmm14,%xmm6
  1713. pxor %xmm7,%xmm7
  1714. call _aesni_encrypt6
  1715. xorps %xmm10,%xmm2
  1716. movdqa %xmm15,%xmm10
  1717. xorps %xmm11,%xmm3
  1718. xorps %xmm12,%xmm4
  1719. movdqu %xmm2,(%rsi)
  1720. xorps %xmm13,%xmm5
  1721. movdqu %xmm3,16(%rsi)
  1722. xorps %xmm14,%xmm6
  1723. movdqu %xmm4,32(%rsi)
  1724. movdqu %xmm5,48(%rsi)
  1725. movdqu %xmm6,64(%rsi)
  1726. leaq 80(%rsi),%rsi
  1727. jmp L$xts_enc_done
  1728. .p2align 4
  1729. L$xts_enc_one:
  1730. movups (%rdi),%xmm2
  1731. leaq 16(%rdi),%rdi
  1732. xorps %xmm10,%xmm2
  1733. movups (%rcx),%xmm0
  1734. movups 16(%rcx),%xmm1
  1735. leaq 32(%rcx),%rcx
  1736. xorps %xmm0,%xmm2
  1737. L$oop_enc1_9:
  1738. .byte 102,15,56,220,209
  1739. decl %eax
  1740. movups (%rcx),%xmm1
  1741. leaq 16(%rcx),%rcx
  1742. jnz L$oop_enc1_9
  1743. .byte 102,15,56,221,209
  1744. xorps %xmm10,%xmm2
  1745. movdqa %xmm11,%xmm10
  1746. movups %xmm2,(%rsi)
  1747. leaq 16(%rsi),%rsi
  1748. jmp L$xts_enc_done
  1749. .p2align 4
  1750. L$xts_enc_two:
  1751. movups (%rdi),%xmm2
  1752. movups 16(%rdi),%xmm3
  1753. leaq 32(%rdi),%rdi
  1754. xorps %xmm10,%xmm2
  1755. xorps %xmm11,%xmm3
  1756. call _aesni_encrypt2
  1757. xorps %xmm10,%xmm2
  1758. movdqa %xmm12,%xmm10
  1759. xorps %xmm11,%xmm3
  1760. movups %xmm2,(%rsi)
  1761. movups %xmm3,16(%rsi)
  1762. leaq 32(%rsi),%rsi
  1763. jmp L$xts_enc_done
  1764. .p2align 4
  1765. L$xts_enc_three:
  1766. movups (%rdi),%xmm2
  1767. movups 16(%rdi),%xmm3
  1768. movups 32(%rdi),%xmm4
  1769. leaq 48(%rdi),%rdi
  1770. xorps %xmm10,%xmm2
  1771. xorps %xmm11,%xmm3
  1772. xorps %xmm12,%xmm4
  1773. call _aesni_encrypt3
  1774. xorps %xmm10,%xmm2
  1775. movdqa %xmm13,%xmm10
  1776. xorps %xmm11,%xmm3
  1777. xorps %xmm12,%xmm4
  1778. movups %xmm2,(%rsi)
  1779. movups %xmm3,16(%rsi)
  1780. movups %xmm4,32(%rsi)
  1781. leaq 48(%rsi),%rsi
  1782. jmp L$xts_enc_done
  1783. .p2align 4
  1784. L$xts_enc_four:
  1785. movups (%rdi),%xmm2
  1786. movups 16(%rdi),%xmm3
  1787. movups 32(%rdi),%xmm4
  1788. xorps %xmm10,%xmm2
  1789. movups 48(%rdi),%xmm5
  1790. leaq 64(%rdi),%rdi
  1791. xorps %xmm11,%xmm3
  1792. xorps %xmm12,%xmm4
  1793. xorps %xmm13,%xmm5
  1794. call _aesni_encrypt4
  1795. pxor %xmm10,%xmm2
  1796. movdqa %xmm14,%xmm10
  1797. pxor %xmm11,%xmm3
  1798. pxor %xmm12,%xmm4
  1799. movdqu %xmm2,(%rsi)
  1800. pxor %xmm13,%xmm5
  1801. movdqu %xmm3,16(%rsi)
  1802. movdqu %xmm4,32(%rsi)
  1803. movdqu %xmm5,48(%rsi)
  1804. leaq 64(%rsi),%rsi
  1805. jmp L$xts_enc_done
  1806. .p2align 4
  1807. L$xts_enc_done:
  1808. andq $15,%r9
  1809. jz L$xts_enc_ret
  1810. movq %r9,%rdx
  1811. L$xts_enc_steal:
  1812. movzbl (%rdi),%eax
  1813. movzbl -16(%rsi),%ecx
  1814. leaq 1(%rdi),%rdi
  1815. movb %al,-16(%rsi)
  1816. movb %cl,0(%rsi)
  1817. leaq 1(%rsi),%rsi
  1818. subq $1,%rdx
  1819. jnz L$xts_enc_steal
  1820. subq %r9,%rsi
  1821. movq %rbp,%rcx
  1822. movl %r10d,%eax
  1823. movups -16(%rsi),%xmm2
  1824. xorps %xmm10,%xmm2
  1825. movups (%rcx),%xmm0
  1826. movups 16(%rcx),%xmm1
  1827. leaq 32(%rcx),%rcx
  1828. xorps %xmm0,%xmm2
  1829. L$oop_enc1_10:
  1830. .byte 102,15,56,220,209
  1831. decl %eax
  1832. movups (%rcx),%xmm1
  1833. leaq 16(%rcx),%rcx
  1834. jnz L$oop_enc1_10
  1835. .byte 102,15,56,221,209
  1836. xorps %xmm10,%xmm2
  1837. movups %xmm2,-16(%rsi)
  1838. L$xts_enc_ret:
  1839. xorps %xmm0,%xmm0
  1840. pxor %xmm1,%xmm1
  1841. pxor %xmm2,%xmm2
  1842. pxor %xmm3,%xmm3
  1843. pxor %xmm4,%xmm4
  1844. pxor %xmm5,%xmm5
  1845. pxor %xmm6,%xmm6
  1846. pxor %xmm7,%xmm7
  1847. movaps %xmm0,0(%rsp)
  1848. pxor %xmm8,%xmm8
  1849. movaps %xmm0,16(%rsp)
  1850. pxor %xmm9,%xmm9
  1851. movaps %xmm0,32(%rsp)
  1852. pxor %xmm10,%xmm10
  1853. movaps %xmm0,48(%rsp)
  1854. pxor %xmm11,%xmm11
  1855. movaps %xmm0,64(%rsp)
  1856. pxor %xmm12,%xmm12
  1857. movaps %xmm0,80(%rsp)
  1858. pxor %xmm13,%xmm13
  1859. movaps %xmm0,96(%rsp)
  1860. pxor %xmm14,%xmm14
  1861. pxor %xmm15,%xmm15
  1862. movq -8(%r11),%rbp
  1863. leaq (%r11),%rsp
  1864. L$xts_enc_epilogue:
  1865. .byte 0xf3,0xc3
  1866. .globl _aesni_xts_decrypt
  1867. .p2align 4
  1868. _aesni_xts_decrypt:
  1869. leaq (%rsp),%r11
  1870. pushq %rbp
  1871. subq $112,%rsp
  1872. andq $-16,%rsp
  1873. movups (%r9),%xmm2
  1874. movl 240(%r8),%eax
  1875. movl 240(%rcx),%r10d
  1876. movups (%r8),%xmm0
  1877. movups 16(%r8),%xmm1
  1878. leaq 32(%r8),%r8
  1879. xorps %xmm0,%xmm2
  1880. L$oop_enc1_11:
  1881. .byte 102,15,56,220,209
  1882. decl %eax
  1883. movups (%r8),%xmm1
  1884. leaq 16(%r8),%r8
  1885. jnz L$oop_enc1_11
  1886. .byte 102,15,56,221,209
  1887. xorl %eax,%eax
  1888. testq $15,%rdx
  1889. setnz %al
  1890. shlq $4,%rax
  1891. subq %rax,%rdx
  1892. movups (%rcx),%xmm0
  1893. movq %rcx,%rbp
  1894. movl %r10d,%eax
  1895. shll $4,%r10d
  1896. movq %rdx,%r9
  1897. andq $-16,%rdx
  1898. movups 16(%rcx,%r10,1),%xmm1
  1899. movdqa L$xts_magic(%rip),%xmm8
  1900. movdqa %xmm2,%xmm15
  1901. pshufd $0x5f,%xmm2,%xmm9
  1902. pxor %xmm0,%xmm1
  1903. movdqa %xmm9,%xmm14
  1904. paddd %xmm9,%xmm9
  1905. movdqa %xmm15,%xmm10
  1906. psrad $31,%xmm14
  1907. paddq %xmm15,%xmm15
  1908. pand %xmm8,%xmm14
  1909. pxor %xmm0,%xmm10
  1910. pxor %xmm14,%xmm15
  1911. movdqa %xmm9,%xmm14
  1912. paddd %xmm9,%xmm9
  1913. movdqa %xmm15,%xmm11
  1914. psrad $31,%xmm14
  1915. paddq %xmm15,%xmm15
  1916. pand %xmm8,%xmm14
  1917. pxor %xmm0,%xmm11
  1918. pxor %xmm14,%xmm15
  1919. movdqa %xmm9,%xmm14
  1920. paddd %xmm9,%xmm9
  1921. movdqa %xmm15,%xmm12
  1922. psrad $31,%xmm14
  1923. paddq %xmm15,%xmm15
  1924. pand %xmm8,%xmm14
  1925. pxor %xmm0,%xmm12
  1926. pxor %xmm14,%xmm15
  1927. movdqa %xmm9,%xmm14
  1928. paddd %xmm9,%xmm9
  1929. movdqa %xmm15,%xmm13
  1930. psrad $31,%xmm14
  1931. paddq %xmm15,%xmm15
  1932. pand %xmm8,%xmm14
  1933. pxor %xmm0,%xmm13
  1934. pxor %xmm14,%xmm15
  1935. movdqa %xmm15,%xmm14
  1936. psrad $31,%xmm9
  1937. paddq %xmm15,%xmm15
  1938. pand %xmm8,%xmm9
  1939. pxor %xmm0,%xmm14
  1940. pxor %xmm9,%xmm15
  1941. movaps %xmm1,96(%rsp)
  1942. subq $96,%rdx
  1943. jc L$xts_dec_short
  1944. movl $16+96,%eax
  1945. leaq 32(%rbp,%r10,1),%rcx
  1946. subq %r10,%rax
  1947. movups 16(%rbp),%xmm1
  1948. movq %rax,%r10
  1949. leaq L$xts_magic(%rip),%r8
  1950. jmp L$xts_dec_grandloop
  1951. .p2align 5
  1952. L$xts_dec_grandloop:
  1953. movdqu 0(%rdi),%xmm2
  1954. movdqa %xmm0,%xmm8
  1955. movdqu 16(%rdi),%xmm3
  1956. pxor %xmm10,%xmm2
  1957. movdqu 32(%rdi),%xmm4
  1958. pxor %xmm11,%xmm3
  1959. .byte 102,15,56,222,209
  1960. movdqu 48(%rdi),%xmm5
  1961. pxor %xmm12,%xmm4
  1962. .byte 102,15,56,222,217
  1963. movdqu 64(%rdi),%xmm6
  1964. pxor %xmm13,%xmm5
  1965. .byte 102,15,56,222,225
  1966. movdqu 80(%rdi),%xmm7
  1967. pxor %xmm15,%xmm8
  1968. movdqa 96(%rsp),%xmm9
  1969. pxor %xmm14,%xmm6
  1970. .byte 102,15,56,222,233
  1971. movups 32(%rbp),%xmm0
  1972. leaq 96(%rdi),%rdi
  1973. pxor %xmm8,%xmm7
  1974. pxor %xmm9,%xmm10
  1975. .byte 102,15,56,222,241
  1976. pxor %xmm9,%xmm11
  1977. movdqa %xmm10,0(%rsp)
  1978. .byte 102,15,56,222,249
  1979. movups 48(%rbp),%xmm1
  1980. pxor %xmm9,%xmm12
  1981. .byte 102,15,56,222,208
  1982. pxor %xmm9,%xmm13
  1983. movdqa %xmm11,16(%rsp)
  1984. .byte 102,15,56,222,216
  1985. pxor %xmm9,%xmm14
  1986. movdqa %xmm12,32(%rsp)
  1987. .byte 102,15,56,222,224
  1988. .byte 102,15,56,222,232
  1989. pxor %xmm9,%xmm8
  1990. movdqa %xmm14,64(%rsp)
  1991. .byte 102,15,56,222,240
  1992. .byte 102,15,56,222,248
  1993. movups 64(%rbp),%xmm0
  1994. movdqa %xmm8,80(%rsp)
  1995. pshufd $0x5f,%xmm15,%xmm9
  1996. jmp L$xts_dec_loop6
  1997. .p2align 5
  1998. L$xts_dec_loop6:
  1999. .byte 102,15,56,222,209
  2000. .byte 102,15,56,222,217
  2001. .byte 102,15,56,222,225
  2002. .byte 102,15,56,222,233
  2003. .byte 102,15,56,222,241
  2004. .byte 102,15,56,222,249
  2005. movups -64(%rcx,%rax,1),%xmm1
  2006. addq $32,%rax
  2007. .byte 102,15,56,222,208
  2008. .byte 102,15,56,222,216
  2009. .byte 102,15,56,222,224
  2010. .byte 102,15,56,222,232
  2011. .byte 102,15,56,222,240
  2012. .byte 102,15,56,222,248
  2013. movups -80(%rcx,%rax,1),%xmm0
  2014. jnz L$xts_dec_loop6
  2015. movdqa (%r8),%xmm8
  2016. movdqa %xmm9,%xmm14
  2017. paddd %xmm9,%xmm9
  2018. .byte 102,15,56,222,209
  2019. paddq %xmm15,%xmm15
  2020. psrad $31,%xmm14
  2021. .byte 102,15,56,222,217
  2022. pand %xmm8,%xmm14
  2023. movups (%rbp),%xmm10
  2024. .byte 102,15,56,222,225
  2025. .byte 102,15,56,222,233
  2026. .byte 102,15,56,222,241
  2027. pxor %xmm14,%xmm15
  2028. movaps %xmm10,%xmm11
  2029. .byte 102,15,56,222,249
  2030. movups -64(%rcx),%xmm1
  2031. movdqa %xmm9,%xmm14
  2032. .byte 102,15,56,222,208
  2033. paddd %xmm9,%xmm9
  2034. pxor %xmm15,%xmm10
  2035. .byte 102,15,56,222,216
  2036. psrad $31,%xmm14
  2037. paddq %xmm15,%xmm15
  2038. .byte 102,15,56,222,224
  2039. .byte 102,15,56,222,232
  2040. pand %xmm8,%xmm14
  2041. movaps %xmm11,%xmm12
  2042. .byte 102,15,56,222,240
  2043. pxor %xmm14,%xmm15
  2044. movdqa %xmm9,%xmm14
  2045. .byte 102,15,56,222,248
  2046. movups -48(%rcx),%xmm0
  2047. paddd %xmm9,%xmm9
  2048. .byte 102,15,56,222,209
  2049. pxor %xmm15,%xmm11
  2050. psrad $31,%xmm14
  2051. .byte 102,15,56,222,217
  2052. paddq %xmm15,%xmm15
  2053. pand %xmm8,%xmm14
  2054. .byte 102,15,56,222,225
  2055. .byte 102,15,56,222,233
  2056. movdqa %xmm13,48(%rsp)
  2057. pxor %xmm14,%xmm15
  2058. .byte 102,15,56,222,241
  2059. movaps %xmm12,%xmm13
  2060. movdqa %xmm9,%xmm14
  2061. .byte 102,15,56,222,249
  2062. movups -32(%rcx),%xmm1
  2063. paddd %xmm9,%xmm9
  2064. .byte 102,15,56,222,208
  2065. pxor %xmm15,%xmm12
  2066. psrad $31,%xmm14
  2067. .byte 102,15,56,222,216
  2068. paddq %xmm15,%xmm15
  2069. pand %xmm8,%xmm14
  2070. .byte 102,15,56,222,224
  2071. .byte 102,15,56,222,232
  2072. .byte 102,15,56,222,240
  2073. pxor %xmm14,%xmm15
  2074. movaps %xmm13,%xmm14
  2075. .byte 102,15,56,222,248
  2076. movdqa %xmm9,%xmm0
  2077. paddd %xmm9,%xmm9
  2078. .byte 102,15,56,222,209
  2079. pxor %xmm15,%xmm13
  2080. psrad $31,%xmm0
  2081. .byte 102,15,56,222,217
  2082. paddq %xmm15,%xmm15
  2083. pand %xmm8,%xmm0
  2084. .byte 102,15,56,222,225
  2085. .byte 102,15,56,222,233
  2086. pxor %xmm0,%xmm15
  2087. movups (%rbp),%xmm0
  2088. .byte 102,15,56,222,241
  2089. .byte 102,15,56,222,249
  2090. movups 16(%rbp),%xmm1
  2091. pxor %xmm15,%xmm14
  2092. .byte 102,15,56,223,84,36,0
  2093. psrad $31,%xmm9
  2094. paddq %xmm15,%xmm15
  2095. .byte 102,15,56,223,92,36,16
  2096. .byte 102,15,56,223,100,36,32
  2097. pand %xmm8,%xmm9
  2098. movq %r10,%rax
  2099. .byte 102,15,56,223,108,36,48
  2100. .byte 102,15,56,223,116,36,64
  2101. .byte 102,15,56,223,124,36,80
  2102. pxor %xmm9,%xmm15
  2103. leaq 96(%rsi),%rsi
  2104. movups %xmm2,-96(%rsi)
  2105. movups %xmm3,-80(%rsi)
  2106. movups %xmm4,-64(%rsi)
  2107. movups %xmm5,-48(%rsi)
  2108. movups %xmm6,-32(%rsi)
  2109. movups %xmm7,-16(%rsi)
  2110. subq $96,%rdx
  2111. jnc L$xts_dec_grandloop
  2112. movl $16+96,%eax
  2113. subl %r10d,%eax
  2114. movq %rbp,%rcx
  2115. shrl $4,%eax
  2116. L$xts_dec_short:
  2117. movl %eax,%r10d
  2118. pxor %xmm0,%xmm10
  2119. pxor %xmm0,%xmm11
  2120. addq $96,%rdx
  2121. jz L$xts_dec_done
  2122. pxor %xmm0,%xmm12
  2123. cmpq $0x20,%rdx
  2124. jb L$xts_dec_one
  2125. pxor %xmm0,%xmm13
  2126. je L$xts_dec_two
  2127. pxor %xmm0,%xmm14
  2128. cmpq $0x40,%rdx
  2129. jb L$xts_dec_three
  2130. je L$xts_dec_four
  2131. movdqu (%rdi),%xmm2
  2132. movdqu 16(%rdi),%xmm3
  2133. movdqu 32(%rdi),%xmm4
  2134. pxor %xmm10,%xmm2
  2135. movdqu 48(%rdi),%xmm5
  2136. pxor %xmm11,%xmm3
  2137. movdqu 64(%rdi),%xmm6
  2138. leaq 80(%rdi),%rdi
  2139. pxor %xmm12,%xmm4
  2140. pxor %xmm13,%xmm5
  2141. pxor %xmm14,%xmm6
  2142. call _aesni_decrypt6
  2143. xorps %xmm10,%xmm2
  2144. xorps %xmm11,%xmm3
  2145. xorps %xmm12,%xmm4
  2146. movdqu %xmm2,(%rsi)
  2147. xorps %xmm13,%xmm5
  2148. movdqu %xmm3,16(%rsi)
  2149. xorps %xmm14,%xmm6
  2150. movdqu %xmm4,32(%rsi)
  2151. pxor %xmm14,%xmm14
  2152. movdqu %xmm5,48(%rsi)
  2153. pcmpgtd %xmm15,%xmm14
  2154. movdqu %xmm6,64(%rsi)
  2155. leaq 80(%rsi),%rsi
  2156. pshufd $0x13,%xmm14,%xmm11
  2157. andq $15,%r9
  2158. jz L$xts_dec_ret
  2159. movdqa %xmm15,%xmm10
  2160. paddq %xmm15,%xmm15
  2161. pand %xmm8,%xmm11
  2162. pxor %xmm15,%xmm11
  2163. jmp L$xts_dec_done2
  2164. .p2align 4
  2165. L$xts_dec_one:
  2166. movups (%rdi),%xmm2
  2167. leaq 16(%rdi),%rdi
  2168. xorps %xmm10,%xmm2
  2169. movups (%rcx),%xmm0
  2170. movups 16(%rcx),%xmm1
  2171. leaq 32(%rcx),%rcx
  2172. xorps %xmm0,%xmm2
  2173. L$oop_dec1_12:
  2174. .byte 102,15,56,222,209
  2175. decl %eax
  2176. movups (%rcx),%xmm1
  2177. leaq 16(%rcx),%rcx
  2178. jnz L$oop_dec1_12
  2179. .byte 102,15,56,223,209
  2180. xorps %xmm10,%xmm2
  2181. movdqa %xmm11,%xmm10
  2182. movups %xmm2,(%rsi)
  2183. movdqa %xmm12,%xmm11
  2184. leaq 16(%rsi),%rsi
  2185. jmp L$xts_dec_done
  2186. .p2align 4
  2187. L$xts_dec_two:
  2188. movups (%rdi),%xmm2
  2189. movups 16(%rdi),%xmm3
  2190. leaq 32(%rdi),%rdi
  2191. xorps %xmm10,%xmm2
  2192. xorps %xmm11,%xmm3
  2193. call _aesni_decrypt2
  2194. xorps %xmm10,%xmm2
  2195. movdqa %xmm12,%xmm10
  2196. xorps %xmm11,%xmm3
  2197. movdqa %xmm13,%xmm11
  2198. movups %xmm2,(%rsi)
  2199. movups %xmm3,16(%rsi)
  2200. leaq 32(%rsi),%rsi
  2201. jmp L$xts_dec_done
  2202. .p2align 4
  2203. L$xts_dec_three:
  2204. movups (%rdi),%xmm2
  2205. movups 16(%rdi),%xmm3
  2206. movups 32(%rdi),%xmm4
  2207. leaq 48(%rdi),%rdi
  2208. xorps %xmm10,%xmm2
  2209. xorps %xmm11,%xmm3
  2210. xorps %xmm12,%xmm4
  2211. call _aesni_decrypt3
  2212. xorps %xmm10,%xmm2
  2213. movdqa %xmm13,%xmm10
  2214. xorps %xmm11,%xmm3
  2215. movdqa %xmm14,%xmm11
  2216. xorps %xmm12,%xmm4
  2217. movups %xmm2,(%rsi)
  2218. movups %xmm3,16(%rsi)
  2219. movups %xmm4,32(%rsi)
  2220. leaq 48(%rsi),%rsi
  2221. jmp L$xts_dec_done
  2222. .p2align 4
  2223. L$xts_dec_four:
  2224. movups (%rdi),%xmm2
  2225. movups 16(%rdi),%xmm3
  2226. movups 32(%rdi),%xmm4
  2227. xorps %xmm10,%xmm2
  2228. movups 48(%rdi),%xmm5
  2229. leaq 64(%rdi),%rdi
  2230. xorps %xmm11,%xmm3
  2231. xorps %xmm12,%xmm4
  2232. xorps %xmm13,%xmm5
  2233. call _aesni_decrypt4
  2234. pxor %xmm10,%xmm2
  2235. movdqa %xmm14,%xmm10
  2236. pxor %xmm11,%xmm3
  2237. movdqa %xmm15,%xmm11
  2238. pxor %xmm12,%xmm4
  2239. movdqu %xmm2,(%rsi)
  2240. pxor %xmm13,%xmm5
  2241. movdqu %xmm3,16(%rsi)
  2242. movdqu %xmm4,32(%rsi)
  2243. movdqu %xmm5,48(%rsi)
  2244. leaq 64(%rsi),%rsi
  2245. jmp L$xts_dec_done
  2246. .p2align 4
  2247. L$xts_dec_done:
  2248. andq $15,%r9
  2249. jz L$xts_dec_ret
  2250. L$xts_dec_done2:
  2251. movq %r9,%rdx
  2252. movq %rbp,%rcx
  2253. movl %r10d,%eax
  2254. movups (%rdi),%xmm2
  2255. xorps %xmm11,%xmm2
  2256. movups (%rcx),%xmm0
  2257. movups 16(%rcx),%xmm1
  2258. leaq 32(%rcx),%rcx
  2259. xorps %xmm0,%xmm2
  2260. L$oop_dec1_13:
  2261. .byte 102,15,56,222,209
  2262. decl %eax
  2263. movups (%rcx),%xmm1
  2264. leaq 16(%rcx),%rcx
  2265. jnz L$oop_dec1_13
  2266. .byte 102,15,56,223,209
  2267. xorps %xmm11,%xmm2
  2268. movups %xmm2,(%rsi)
  2269. L$xts_dec_steal:
  2270. movzbl 16(%rdi),%eax
  2271. movzbl (%rsi),%ecx
  2272. leaq 1(%rdi),%rdi
  2273. movb %al,(%rsi)
  2274. movb %cl,16(%rsi)
  2275. leaq 1(%rsi),%rsi
  2276. subq $1,%rdx
  2277. jnz L$xts_dec_steal
  2278. subq %r9,%rsi
  2279. movq %rbp,%rcx
  2280. movl %r10d,%eax
  2281. movups (%rsi),%xmm2
  2282. xorps %xmm10,%xmm2
  2283. movups (%rcx),%xmm0
  2284. movups 16(%rcx),%xmm1
  2285. leaq 32(%rcx),%rcx
  2286. xorps %xmm0,%xmm2
  2287. L$oop_dec1_14:
  2288. .byte 102,15,56,222,209
  2289. decl %eax
  2290. movups (%rcx),%xmm1
  2291. leaq 16(%rcx),%rcx
  2292. jnz L$oop_dec1_14
  2293. .byte 102,15,56,223,209
  2294. xorps %xmm10,%xmm2
  2295. movups %xmm2,(%rsi)
  2296. L$xts_dec_ret:
  2297. xorps %xmm0,%xmm0
  2298. pxor %xmm1,%xmm1
  2299. pxor %xmm2,%xmm2
  2300. pxor %xmm3,%xmm3
  2301. pxor %xmm4,%xmm4
  2302. pxor %xmm5,%xmm5
  2303. pxor %xmm6,%xmm6
  2304. pxor %xmm7,%xmm7
  2305. movaps %xmm0,0(%rsp)
  2306. pxor %xmm8,%xmm8
  2307. movaps %xmm0,16(%rsp)
  2308. pxor %xmm9,%xmm9
  2309. movaps %xmm0,32(%rsp)
  2310. pxor %xmm10,%xmm10
  2311. movaps %xmm0,48(%rsp)
  2312. pxor %xmm11,%xmm11
  2313. movaps %xmm0,64(%rsp)
  2314. pxor %xmm12,%xmm12
  2315. movaps %xmm0,80(%rsp)
  2316. pxor %xmm13,%xmm13
  2317. movaps %xmm0,96(%rsp)
  2318. pxor %xmm14,%xmm14
  2319. pxor %xmm15,%xmm15
  2320. movq -8(%r11),%rbp
  2321. leaq (%r11),%rsp
  2322. L$xts_dec_epilogue:
  2323. .byte 0xf3,0xc3
  2324. .globl _aesni_ocb_encrypt
  2325. .p2align 5
  2326. _aesni_ocb_encrypt:
  2327. leaq (%rsp),%rax
  2328. pushq %rbx
  2329. pushq %rbp
  2330. pushq %r12
  2331. pushq %r13
  2332. pushq %r14
  2333. movq 8(%rax),%rbx
  2334. movq 8+8(%rax),%rbp
  2335. movl 240(%rcx),%r10d
  2336. movq %rcx,%r11
  2337. shll $4,%r10d
  2338. movups (%rcx),%xmm9
  2339. movups 16(%rcx,%r10,1),%xmm1
  2340. movdqu (%r9),%xmm15
  2341. pxor %xmm1,%xmm9
  2342. pxor %xmm1,%xmm15
  2343. movl $16+32,%eax
  2344. leaq 32(%r11,%r10,1),%rcx
  2345. movups 16(%r11),%xmm1
  2346. subq %r10,%rax
  2347. movq %rax,%r10
  2348. movdqu (%rbx),%xmm10
  2349. movdqu (%rbp),%xmm8
  2350. testq $1,%r8
  2351. jnz L$ocb_enc_odd
  2352. bsfq %r8,%r12
  2353. addq $1,%r8
  2354. shlq $4,%r12
  2355. movdqu (%rbx,%r12,1),%xmm7
  2356. movdqu (%rdi),%xmm2
  2357. leaq 16(%rdi),%rdi
  2358. call __ocb_encrypt1
  2359. movdqa %xmm7,%xmm15
  2360. movups %xmm2,(%rsi)
  2361. leaq 16(%rsi),%rsi
  2362. subq $1,%rdx
  2363. jz L$ocb_enc_done
  2364. L$ocb_enc_odd:
  2365. leaq 1(%r8),%r12
  2366. leaq 3(%r8),%r13
  2367. leaq 5(%r8),%r14
  2368. leaq 6(%r8),%r8
  2369. bsfq %r12,%r12
  2370. bsfq %r13,%r13
  2371. bsfq %r14,%r14
  2372. shlq $4,%r12
  2373. shlq $4,%r13
  2374. shlq $4,%r14
  2375. subq $6,%rdx
  2376. jc L$ocb_enc_short
  2377. jmp L$ocb_enc_grandloop
  2378. .p2align 5
  2379. L$ocb_enc_grandloop:
  2380. movdqu 0(%rdi),%xmm2
  2381. movdqu 16(%rdi),%xmm3
  2382. movdqu 32(%rdi),%xmm4
  2383. movdqu 48(%rdi),%xmm5
  2384. movdqu 64(%rdi),%xmm6
  2385. movdqu 80(%rdi),%xmm7
  2386. leaq 96(%rdi),%rdi
  2387. call __ocb_encrypt6
  2388. movups %xmm2,0(%rsi)
  2389. movups %xmm3,16(%rsi)
  2390. movups %xmm4,32(%rsi)
  2391. movups %xmm5,48(%rsi)
  2392. movups %xmm6,64(%rsi)
  2393. movups %xmm7,80(%rsi)
  2394. leaq 96(%rsi),%rsi
  2395. subq $6,%rdx
  2396. jnc L$ocb_enc_grandloop
  2397. L$ocb_enc_short:
  2398. addq $6,%rdx
  2399. jz L$ocb_enc_done
  2400. movdqu 0(%rdi),%xmm2
  2401. cmpq $2,%rdx
  2402. jb L$ocb_enc_one
  2403. movdqu 16(%rdi),%xmm3
  2404. je L$ocb_enc_two
  2405. movdqu 32(%rdi),%xmm4
  2406. cmpq $4,%rdx
  2407. jb L$ocb_enc_three
  2408. movdqu 48(%rdi),%xmm5
  2409. je L$ocb_enc_four
  2410. movdqu 64(%rdi),%xmm6
  2411. pxor %xmm7,%xmm7
  2412. call __ocb_encrypt6
  2413. movdqa %xmm14,%xmm15
  2414. movups %xmm2,0(%rsi)
  2415. movups %xmm3,16(%rsi)
  2416. movups %xmm4,32(%rsi)
  2417. movups %xmm5,48(%rsi)
  2418. movups %xmm6,64(%rsi)
  2419. jmp L$ocb_enc_done
  2420. .p2align 4
  2421. L$ocb_enc_one:
  2422. movdqa %xmm10,%xmm7
  2423. call __ocb_encrypt1
  2424. movdqa %xmm7,%xmm15
  2425. movups %xmm2,0(%rsi)
  2426. jmp L$ocb_enc_done
  2427. .p2align 4
  2428. L$ocb_enc_two:
  2429. pxor %xmm4,%xmm4
  2430. pxor %xmm5,%xmm5
  2431. call __ocb_encrypt4
  2432. movdqa %xmm11,%xmm15
  2433. movups %xmm2,0(%rsi)
  2434. movups %xmm3,16(%rsi)
  2435. jmp L$ocb_enc_done
  2436. .p2align 4
  2437. L$ocb_enc_three:
  2438. pxor %xmm5,%xmm5
  2439. call __ocb_encrypt4
  2440. movdqa %xmm12,%xmm15
  2441. movups %xmm2,0(%rsi)
  2442. movups %xmm3,16(%rsi)
  2443. movups %xmm4,32(%rsi)
  2444. jmp L$ocb_enc_done
  2445. .p2align 4
  2446. L$ocb_enc_four:
  2447. call __ocb_encrypt4
  2448. movdqa %xmm13,%xmm15
  2449. movups %xmm2,0(%rsi)
  2450. movups %xmm3,16(%rsi)
  2451. movups %xmm4,32(%rsi)
  2452. movups %xmm5,48(%rsi)
  2453. L$ocb_enc_done:
  2454. pxor %xmm0,%xmm15
  2455. movdqu %xmm8,(%rbp)
  2456. movdqu %xmm15,(%r9)
  2457. xorps %xmm0,%xmm0
  2458. pxor %xmm1,%xmm1
  2459. pxor %xmm2,%xmm2
  2460. pxor %xmm3,%xmm3
  2461. pxor %xmm4,%xmm4
  2462. pxor %xmm5,%xmm5
  2463. pxor %xmm6,%xmm6
  2464. pxor %xmm7,%xmm7
  2465. pxor %xmm8,%xmm8
  2466. pxor %xmm9,%xmm9
  2467. pxor %xmm10,%xmm10
  2468. pxor %xmm11,%xmm11
  2469. pxor %xmm12,%xmm12
  2470. pxor %xmm13,%xmm13
  2471. pxor %xmm14,%xmm14
  2472. pxor %xmm15,%xmm15
  2473. leaq 40(%rsp),%rax
  2474. movq -40(%rax),%r14
  2475. movq -32(%rax),%r13
  2476. movq -24(%rax),%r12
  2477. movq -16(%rax),%rbp
  2478. movq -8(%rax),%rbx
  2479. leaq (%rax),%rsp
  2480. L$ocb_enc_epilogue:
  2481. .byte 0xf3,0xc3
  2482. .p2align 5
  2483. __ocb_encrypt6:
  2484. pxor %xmm9,%xmm15
  2485. movdqu (%rbx,%r12,1),%xmm11
  2486. movdqa %xmm10,%xmm12
  2487. movdqu (%rbx,%r13,1),%xmm13
  2488. movdqa %xmm10,%xmm14
  2489. pxor %xmm15,%xmm10
  2490. movdqu (%rbx,%r14,1),%xmm15
  2491. pxor %xmm10,%xmm11
  2492. pxor %xmm2,%xmm8
  2493. pxor %xmm10,%xmm2
  2494. pxor %xmm11,%xmm12
  2495. pxor %xmm3,%xmm8
  2496. pxor %xmm11,%xmm3
  2497. pxor %xmm12,%xmm13
  2498. pxor %xmm4,%xmm8
  2499. pxor %xmm12,%xmm4
  2500. pxor %xmm13,%xmm14
  2501. pxor %xmm5,%xmm8
  2502. pxor %xmm13,%xmm5
  2503. pxor %xmm14,%xmm15
  2504. pxor %xmm6,%xmm8
  2505. pxor %xmm14,%xmm6
  2506. pxor %xmm7,%xmm8
  2507. pxor %xmm15,%xmm7
  2508. movups 32(%r11),%xmm0
  2509. leaq 1(%r8),%r12
  2510. leaq 3(%r8),%r13
  2511. leaq 5(%r8),%r14
  2512. addq $6,%r8
  2513. pxor %xmm9,%xmm10
  2514. bsfq %r12,%r12
  2515. bsfq %r13,%r13
  2516. bsfq %r14,%r14
  2517. .byte 102,15,56,220,209
  2518. .byte 102,15,56,220,217
  2519. .byte 102,15,56,220,225
  2520. .byte 102,15,56,220,233
  2521. pxor %xmm9,%xmm11
  2522. pxor %xmm9,%xmm12
  2523. .byte 102,15,56,220,241
  2524. pxor %xmm9,%xmm13
  2525. pxor %xmm9,%xmm14
  2526. .byte 102,15,56,220,249
  2527. movups 48(%r11),%xmm1
  2528. pxor %xmm9,%xmm15
  2529. .byte 102,15,56,220,208
  2530. .byte 102,15,56,220,216
  2531. .byte 102,15,56,220,224
  2532. .byte 102,15,56,220,232
  2533. .byte 102,15,56,220,240
  2534. .byte 102,15,56,220,248
  2535. movups 64(%r11),%xmm0
  2536. shlq $4,%r12
  2537. shlq $4,%r13
  2538. jmp L$ocb_enc_loop6
  2539. .p2align 5
  2540. L$ocb_enc_loop6:
  2541. .byte 102,15,56,220,209
  2542. .byte 102,15,56,220,217
  2543. .byte 102,15,56,220,225
  2544. .byte 102,15,56,220,233
  2545. .byte 102,15,56,220,241
  2546. .byte 102,15,56,220,249
  2547. movups (%rcx,%rax,1),%xmm1
  2548. addq $32,%rax
  2549. .byte 102,15,56,220,208
  2550. .byte 102,15,56,220,216
  2551. .byte 102,15,56,220,224
  2552. .byte 102,15,56,220,232
  2553. .byte 102,15,56,220,240
  2554. .byte 102,15,56,220,248
  2555. movups -16(%rcx,%rax,1),%xmm0
  2556. jnz L$ocb_enc_loop6
  2557. .byte 102,15,56,220,209
  2558. .byte 102,15,56,220,217
  2559. .byte 102,15,56,220,225
  2560. .byte 102,15,56,220,233
  2561. .byte 102,15,56,220,241
  2562. .byte 102,15,56,220,249
  2563. movups 16(%r11),%xmm1
  2564. shlq $4,%r14
  2565. .byte 102,65,15,56,221,210
  2566. movdqu (%rbx),%xmm10
  2567. movq %r10,%rax
  2568. .byte 102,65,15,56,221,219
  2569. .byte 102,65,15,56,221,228
  2570. .byte 102,65,15,56,221,237
  2571. .byte 102,65,15,56,221,246
  2572. .byte 102,65,15,56,221,255
  2573. .byte 0xf3,0xc3
  2574. .p2align 5
  2575. __ocb_encrypt4:
  2576. pxor %xmm9,%xmm15
  2577. movdqu (%rbx,%r12,1),%xmm11
  2578. movdqa %xmm10,%xmm12
  2579. movdqu (%rbx,%r13,1),%xmm13
  2580. pxor %xmm15,%xmm10
  2581. pxor %xmm10,%xmm11
  2582. pxor %xmm2,%xmm8
  2583. pxor %xmm10,%xmm2
  2584. pxor %xmm11,%xmm12
  2585. pxor %xmm3,%xmm8
  2586. pxor %xmm11,%xmm3
  2587. pxor %xmm12,%xmm13
  2588. pxor %xmm4,%xmm8
  2589. pxor %xmm12,%xmm4
  2590. pxor %xmm5,%xmm8
  2591. pxor %xmm13,%xmm5
  2592. movups 32(%r11),%xmm0
  2593. pxor %xmm9,%xmm10
  2594. pxor %xmm9,%xmm11
  2595. pxor %xmm9,%xmm12
  2596. pxor %xmm9,%xmm13
  2597. .byte 102,15,56,220,209
  2598. .byte 102,15,56,220,217
  2599. .byte 102,15,56,220,225
  2600. .byte 102,15,56,220,233
  2601. movups 48(%r11),%xmm1
  2602. .byte 102,15,56,220,208
  2603. .byte 102,15,56,220,216
  2604. .byte 102,15,56,220,224
  2605. .byte 102,15,56,220,232
  2606. movups 64(%r11),%xmm0
  2607. jmp L$ocb_enc_loop4
  2608. .p2align 5
  2609. L$ocb_enc_loop4:
  2610. .byte 102,15,56,220,209
  2611. .byte 102,15,56,220,217
  2612. .byte 102,15,56,220,225
  2613. .byte 102,15,56,220,233
  2614. movups (%rcx,%rax,1),%xmm1
  2615. addq $32,%rax
  2616. .byte 102,15,56,220,208
  2617. .byte 102,15,56,220,216
  2618. .byte 102,15,56,220,224
  2619. .byte 102,15,56,220,232
  2620. movups -16(%rcx,%rax,1),%xmm0
  2621. jnz L$ocb_enc_loop4
  2622. .byte 102,15,56,220,209
  2623. .byte 102,15,56,220,217
  2624. .byte 102,15,56,220,225
  2625. .byte 102,15,56,220,233
  2626. movups 16(%r11),%xmm1
  2627. movq %r10,%rax
  2628. .byte 102,65,15,56,221,210
  2629. .byte 102,65,15,56,221,219
  2630. .byte 102,65,15,56,221,228
  2631. .byte 102,65,15,56,221,237
  2632. .byte 0xf3,0xc3
  2633. .p2align 5
  2634. __ocb_encrypt1:
  2635. pxor %xmm15,%xmm7
  2636. pxor %xmm9,%xmm7
  2637. pxor %xmm2,%xmm8
  2638. pxor %xmm7,%xmm2
  2639. movups 32(%r11),%xmm0
  2640. .byte 102,15,56,220,209
  2641. movups 48(%r11),%xmm1
  2642. pxor %xmm9,%xmm7
  2643. .byte 102,15,56,220,208
  2644. movups 64(%r11),%xmm0
  2645. jmp L$ocb_enc_loop1
  2646. .p2align 5
  2647. L$ocb_enc_loop1:
  2648. .byte 102,15,56,220,209
  2649. movups (%rcx,%rax,1),%xmm1
  2650. addq $32,%rax
  2651. .byte 102,15,56,220,208
  2652. movups -16(%rcx,%rax,1),%xmm0
  2653. jnz L$ocb_enc_loop1
  2654. .byte 102,15,56,220,209
  2655. movups 16(%r11),%xmm1
  2656. movq %r10,%rax
  2657. .byte 102,15,56,221,215
  2658. .byte 0xf3,0xc3
  2659. .globl _aesni_ocb_decrypt
  2660. .p2align 5
  2661. _aesni_ocb_decrypt:
  2662. leaq (%rsp),%rax
  2663. pushq %rbx
  2664. pushq %rbp
  2665. pushq %r12
  2666. pushq %r13
  2667. pushq %r14
  2668. movq 8(%rax),%rbx
  2669. movq 8+8(%rax),%rbp
  2670. movl 240(%rcx),%r10d
  2671. movq %rcx,%r11
  2672. shll $4,%r10d
  2673. movups (%rcx),%xmm9
  2674. movups 16(%rcx,%r10,1),%xmm1
  2675. movdqu (%r9),%xmm15
  2676. pxor %xmm1,%xmm9
  2677. pxor %xmm1,%xmm15
  2678. movl $16+32,%eax
  2679. leaq 32(%r11,%r10,1),%rcx
  2680. movups 16(%r11),%xmm1
  2681. subq %r10,%rax
  2682. movq %rax,%r10
  2683. movdqu (%rbx),%xmm10
  2684. movdqu (%rbp),%xmm8
  2685. testq $1,%r8
  2686. jnz L$ocb_dec_odd
  2687. bsfq %r8,%r12
  2688. addq $1,%r8
  2689. shlq $4,%r12
  2690. movdqu (%rbx,%r12,1),%xmm7
  2691. movdqu (%rdi),%xmm2
  2692. leaq 16(%rdi),%rdi
  2693. call __ocb_decrypt1
  2694. movdqa %xmm7,%xmm15
  2695. movups %xmm2,(%rsi)
  2696. xorps %xmm2,%xmm8
  2697. leaq 16(%rsi),%rsi
  2698. subq $1,%rdx
  2699. jz L$ocb_dec_done
  2700. L$ocb_dec_odd:
  2701. leaq 1(%r8),%r12
  2702. leaq 3(%r8),%r13
  2703. leaq 5(%r8),%r14
  2704. leaq 6(%r8),%r8
  2705. bsfq %r12,%r12
  2706. bsfq %r13,%r13
  2707. bsfq %r14,%r14
  2708. shlq $4,%r12
  2709. shlq $4,%r13
  2710. shlq $4,%r14
  2711. subq $6,%rdx
  2712. jc L$ocb_dec_short
  2713. jmp L$ocb_dec_grandloop
  2714. .p2align 5
  2715. L$ocb_dec_grandloop:
  2716. movdqu 0(%rdi),%xmm2
  2717. movdqu 16(%rdi),%xmm3
  2718. movdqu 32(%rdi),%xmm4
  2719. movdqu 48(%rdi),%xmm5
  2720. movdqu 64(%rdi),%xmm6
  2721. movdqu 80(%rdi),%xmm7
  2722. leaq 96(%rdi),%rdi
  2723. call __ocb_decrypt6
  2724. movups %xmm2,0(%rsi)
  2725. pxor %xmm2,%xmm8
  2726. movups %xmm3,16(%rsi)
  2727. pxor %xmm3,%xmm8
  2728. movups %xmm4,32(%rsi)
  2729. pxor %xmm4,%xmm8
  2730. movups %xmm5,48(%rsi)
  2731. pxor %xmm5,%xmm8
  2732. movups %xmm6,64(%rsi)
  2733. pxor %xmm6,%xmm8
  2734. movups %xmm7,80(%rsi)
  2735. pxor %xmm7,%xmm8
  2736. leaq 96(%rsi),%rsi
  2737. subq $6,%rdx
  2738. jnc L$ocb_dec_grandloop
  2739. L$ocb_dec_short:
  2740. addq $6,%rdx
  2741. jz L$ocb_dec_done
  2742. movdqu 0(%rdi),%xmm2
  2743. cmpq $2,%rdx
  2744. jb L$ocb_dec_one
  2745. movdqu 16(%rdi),%xmm3
  2746. je L$ocb_dec_two
  2747. movdqu 32(%rdi),%xmm4
  2748. cmpq $4,%rdx
  2749. jb L$ocb_dec_three
  2750. movdqu 48(%rdi),%xmm5
  2751. je L$ocb_dec_four
  2752. movdqu 64(%rdi),%xmm6
  2753. pxor %xmm7,%xmm7
  2754. call __ocb_decrypt6
  2755. movdqa %xmm14,%xmm15
  2756. movups %xmm2,0(%rsi)
  2757. pxor %xmm2,%xmm8
  2758. movups %xmm3,16(%rsi)
  2759. pxor %xmm3,%xmm8
  2760. movups %xmm4,32(%rsi)
  2761. pxor %xmm4,%xmm8
  2762. movups %xmm5,48(%rsi)
  2763. pxor %xmm5,%xmm8
  2764. movups %xmm6,64(%rsi)
  2765. pxor %xmm6,%xmm8
  2766. jmp L$ocb_dec_done
  2767. .p2align 4
  2768. L$ocb_dec_one:
  2769. movdqa %xmm10,%xmm7
  2770. call __ocb_decrypt1
  2771. movdqa %xmm7,%xmm15
  2772. movups %xmm2,0(%rsi)
  2773. xorps %xmm2,%xmm8
  2774. jmp L$ocb_dec_done
  2775. .p2align 4
  2776. L$ocb_dec_two:
  2777. pxor %xmm4,%xmm4
  2778. pxor %xmm5,%xmm5
  2779. call __ocb_decrypt4
  2780. movdqa %xmm11,%xmm15
  2781. movups %xmm2,0(%rsi)
  2782. xorps %xmm2,%xmm8
  2783. movups %xmm3,16(%rsi)
  2784. xorps %xmm3,%xmm8
  2785. jmp L$ocb_dec_done
  2786. .p2align 4
  2787. L$ocb_dec_three:
  2788. pxor %xmm5,%xmm5
  2789. call __ocb_decrypt4
  2790. movdqa %xmm12,%xmm15
  2791. movups %xmm2,0(%rsi)
  2792. xorps %xmm2,%xmm8
  2793. movups %xmm3,16(%rsi)
  2794. xorps %xmm3,%xmm8
  2795. movups %xmm4,32(%rsi)
  2796. xorps %xmm4,%xmm8
  2797. jmp L$ocb_dec_done
  2798. .p2align 4
  2799. L$ocb_dec_four:
  2800. call __ocb_decrypt4
  2801. movdqa %xmm13,%xmm15
  2802. movups %xmm2,0(%rsi)
  2803. pxor %xmm2,%xmm8
  2804. movups %xmm3,16(%rsi)
  2805. pxor %xmm3,%xmm8
  2806. movups %xmm4,32(%rsi)
  2807. pxor %xmm4,%xmm8
  2808. movups %xmm5,48(%rsi)
  2809. pxor %xmm5,%xmm8
  2810. L$ocb_dec_done:
  2811. pxor %xmm0,%xmm15
  2812. movdqu %xmm8,(%rbp)
  2813. movdqu %xmm15,(%r9)
  2814. xorps %xmm0,%xmm0
  2815. pxor %xmm1,%xmm1
  2816. pxor %xmm2,%xmm2
  2817. pxor %xmm3,%xmm3
  2818. pxor %xmm4,%xmm4
  2819. pxor %xmm5,%xmm5
  2820. pxor %xmm6,%xmm6
  2821. pxor %xmm7,%xmm7
  2822. pxor %xmm8,%xmm8
  2823. pxor %xmm9,%xmm9
  2824. pxor %xmm10,%xmm10
  2825. pxor %xmm11,%xmm11
  2826. pxor %xmm12,%xmm12
  2827. pxor %xmm13,%xmm13
  2828. pxor %xmm14,%xmm14
  2829. pxor %xmm15,%xmm15
  2830. leaq 40(%rsp),%rax
  2831. movq -40(%rax),%r14
  2832. movq -32(%rax),%r13
  2833. movq -24(%rax),%r12
  2834. movq -16(%rax),%rbp
  2835. movq -8(%rax),%rbx
  2836. leaq (%rax),%rsp
  2837. L$ocb_dec_epilogue:
  2838. .byte 0xf3,0xc3
  2839. .p2align 5
  2840. __ocb_decrypt6:
  2841. pxor %xmm9,%xmm15
  2842. movdqu (%rbx,%r12,1),%xmm11
  2843. movdqa %xmm10,%xmm12
  2844. movdqu (%rbx,%r13,1),%xmm13
  2845. movdqa %xmm10,%xmm14
  2846. pxor %xmm15,%xmm10
  2847. movdqu (%rbx,%r14,1),%xmm15
  2848. pxor %xmm10,%xmm11
  2849. pxor %xmm10,%xmm2
  2850. pxor %xmm11,%xmm12
  2851. pxor %xmm11,%xmm3
  2852. pxor %xmm12,%xmm13
  2853. pxor %xmm12,%xmm4
  2854. pxor %xmm13,%xmm14
  2855. pxor %xmm13,%xmm5
  2856. pxor %xmm14,%xmm15
  2857. pxor %xmm14,%xmm6
  2858. pxor %xmm15,%xmm7
  2859. movups 32(%r11),%xmm0
  2860. leaq 1(%r8),%r12
  2861. leaq 3(%r8),%r13
  2862. leaq 5(%r8),%r14
  2863. addq $6,%r8
  2864. pxor %xmm9,%xmm10
  2865. bsfq %r12,%r12
  2866. bsfq %r13,%r13
  2867. bsfq %r14,%r14
  2868. .byte 102,15,56,222,209
  2869. .byte 102,15,56,222,217
  2870. .byte 102,15,56,222,225
  2871. .byte 102,15,56,222,233
  2872. pxor %xmm9,%xmm11
  2873. pxor %xmm9,%xmm12
  2874. .byte 102,15,56,222,241
  2875. pxor %xmm9,%xmm13
  2876. pxor %xmm9,%xmm14
  2877. .byte 102,15,56,222,249
  2878. movups 48(%r11),%xmm1
  2879. pxor %xmm9,%xmm15
  2880. .byte 102,15,56,222,208
  2881. .byte 102,15,56,222,216
  2882. .byte 102,15,56,222,224
  2883. .byte 102,15,56,222,232
  2884. .byte 102,15,56,222,240
  2885. .byte 102,15,56,222,248
  2886. movups 64(%r11),%xmm0
  2887. shlq $4,%r12
  2888. shlq $4,%r13
  2889. jmp L$ocb_dec_loop6
  2890. .p2align 5
  2891. L$ocb_dec_loop6:
  2892. .byte 102,15,56,222,209
  2893. .byte 102,15,56,222,217
  2894. .byte 102,15,56,222,225
  2895. .byte 102,15,56,222,233
  2896. .byte 102,15,56,222,241
  2897. .byte 102,15,56,222,249
  2898. movups (%rcx,%rax,1),%xmm1
  2899. addq $32,%rax
  2900. .byte 102,15,56,222,208
  2901. .byte 102,15,56,222,216
  2902. .byte 102,15,56,222,224
  2903. .byte 102,15,56,222,232
  2904. .byte 102,15,56,222,240
  2905. .byte 102,15,56,222,248
  2906. movups -16(%rcx,%rax,1),%xmm0
  2907. jnz L$ocb_dec_loop6
  2908. .byte 102,15,56,222,209
  2909. .byte 102,15,56,222,217
  2910. .byte 102,15,56,222,225
  2911. .byte 102,15,56,222,233
  2912. .byte 102,15,56,222,241
  2913. .byte 102,15,56,222,249
  2914. movups 16(%r11),%xmm1
  2915. shlq $4,%r14
  2916. .byte 102,65,15,56,223,210
  2917. movdqu (%rbx),%xmm10
  2918. movq %r10,%rax
  2919. .byte 102,65,15,56,223,219
  2920. .byte 102,65,15,56,223,228
  2921. .byte 102,65,15,56,223,237
  2922. .byte 102,65,15,56,223,246
  2923. .byte 102,65,15,56,223,255
  2924. .byte 0xf3,0xc3
  2925. .p2align 5
  2926. __ocb_decrypt4:
  2927. pxor %xmm9,%xmm15
  2928. movdqu (%rbx,%r12,1),%xmm11
  2929. movdqa %xmm10,%xmm12
  2930. movdqu (%rbx,%r13,1),%xmm13
  2931. pxor %xmm15,%xmm10
  2932. pxor %xmm10,%xmm11
  2933. pxor %xmm10,%xmm2
  2934. pxor %xmm11,%xmm12
  2935. pxor %xmm11,%xmm3
  2936. pxor %xmm12,%xmm13
  2937. pxor %xmm12,%xmm4
  2938. pxor %xmm13,%xmm5
  2939. movups 32(%r11),%xmm0
  2940. pxor %xmm9,%xmm10
  2941. pxor %xmm9,%xmm11
  2942. pxor %xmm9,%xmm12
  2943. pxor %xmm9,%xmm13
  2944. .byte 102,15,56,222,209
  2945. .byte 102,15,56,222,217
  2946. .byte 102,15,56,222,225
  2947. .byte 102,15,56,222,233
  2948. movups 48(%r11),%xmm1
  2949. .byte 102,15,56,222,208
  2950. .byte 102,15,56,222,216
  2951. .byte 102,15,56,222,224
  2952. .byte 102,15,56,222,232
  2953. movups 64(%r11),%xmm0
  2954. jmp L$ocb_dec_loop4
  2955. .p2align 5
  2956. L$ocb_dec_loop4:
  2957. .byte 102,15,56,222,209
  2958. .byte 102,15,56,222,217
  2959. .byte 102,15,56,222,225
  2960. .byte 102,15,56,222,233
  2961. movups (%rcx,%rax,1),%xmm1
  2962. addq $32,%rax
  2963. .byte 102,15,56,222,208
  2964. .byte 102,15,56,222,216
  2965. .byte 102,15,56,222,224
  2966. .byte 102,15,56,222,232
  2967. movups -16(%rcx,%rax,1),%xmm0
  2968. jnz L$ocb_dec_loop4
  2969. .byte 102,15,56,222,209
  2970. .byte 102,15,56,222,217
  2971. .byte 102,15,56,222,225
  2972. .byte 102,15,56,222,233
  2973. movups 16(%r11),%xmm1
  2974. movq %r10,%rax
  2975. .byte 102,65,15,56,223,210
  2976. .byte 102,65,15,56,223,219
  2977. .byte 102,65,15,56,223,228
  2978. .byte 102,65,15,56,223,237
  2979. .byte 0xf3,0xc3
  2980. .p2align 5
  2981. __ocb_decrypt1:
  2982. pxor %xmm15,%xmm7
  2983. pxor %xmm9,%xmm7
  2984. pxor %xmm7,%xmm2
  2985. movups 32(%r11),%xmm0
  2986. .byte 102,15,56,222,209
  2987. movups 48(%r11),%xmm1
  2988. pxor %xmm9,%xmm7
  2989. .byte 102,15,56,222,208
  2990. movups 64(%r11),%xmm0
  2991. jmp L$ocb_dec_loop1
  2992. .p2align 5
  2993. L$ocb_dec_loop1:
  2994. .byte 102,15,56,222,209
  2995. movups (%rcx,%rax,1),%xmm1
  2996. addq $32,%rax
  2997. .byte 102,15,56,222,208
  2998. movups -16(%rcx,%rax,1),%xmm0
  2999. jnz L$ocb_dec_loop1
  3000. .byte 102,15,56,222,209
  3001. movups 16(%r11),%xmm1
  3002. movq %r10,%rax
  3003. .byte 102,15,56,223,215
  3004. .byte 0xf3,0xc3
  3005. .globl _aesni_cbc_encrypt
  3006. .p2align 4
  3007. _aesni_cbc_encrypt:
  3008. testq %rdx,%rdx
  3009. jz L$cbc_ret
  3010. movl 240(%rcx),%r10d
  3011. movq %rcx,%r11
  3012. testl %r9d,%r9d
  3013. jz L$cbc_decrypt
  3014. movups (%r8),%xmm2
  3015. movl %r10d,%eax
  3016. cmpq $16,%rdx
  3017. jb L$cbc_enc_tail
  3018. subq $16,%rdx
  3019. jmp L$cbc_enc_loop
  3020. .p2align 4
  3021. L$cbc_enc_loop:
  3022. movups (%rdi),%xmm3
  3023. leaq 16(%rdi),%rdi
  3024. movups (%rcx),%xmm0
  3025. movups 16(%rcx),%xmm1
  3026. xorps %xmm0,%xmm3
  3027. leaq 32(%rcx),%rcx
  3028. xorps %xmm3,%xmm2
  3029. L$oop_enc1_15:
  3030. .byte 102,15,56,220,209
  3031. decl %eax
  3032. movups (%rcx),%xmm1
  3033. leaq 16(%rcx),%rcx
  3034. jnz L$oop_enc1_15
  3035. .byte 102,15,56,221,209
  3036. movl %r10d,%eax
  3037. movq %r11,%rcx
  3038. movups %xmm2,0(%rsi)
  3039. leaq 16(%rsi),%rsi
  3040. subq $16,%rdx
  3041. jnc L$cbc_enc_loop
  3042. addq $16,%rdx
  3043. jnz L$cbc_enc_tail
  3044. pxor %xmm0,%xmm0
  3045. pxor %xmm1,%xmm1
  3046. movups %xmm2,(%r8)
  3047. pxor %xmm2,%xmm2
  3048. pxor %xmm3,%xmm3
  3049. jmp L$cbc_ret
  3050. L$cbc_enc_tail:
  3051. movq %rdx,%rcx
  3052. xchgq %rdi,%rsi
  3053. .long 0x9066A4F3
  3054. movl $16,%ecx
  3055. subq %rdx,%rcx
  3056. xorl %eax,%eax
  3057. .long 0x9066AAF3
  3058. leaq -16(%rdi),%rdi
  3059. movl %r10d,%eax
  3060. movq %rdi,%rsi
  3061. movq %r11,%rcx
  3062. xorq %rdx,%rdx
  3063. jmp L$cbc_enc_loop
  3064. .p2align 4
  3065. L$cbc_decrypt:
  3066. cmpq $16,%rdx
  3067. jne L$cbc_decrypt_bulk
  3068. movdqu (%rdi),%xmm2
  3069. movdqu (%r8),%xmm3
  3070. movdqa %xmm2,%xmm4
  3071. movups (%rcx),%xmm0
  3072. movups 16(%rcx),%xmm1
  3073. leaq 32(%rcx),%rcx
  3074. xorps %xmm0,%xmm2
  3075. L$oop_dec1_16:
  3076. .byte 102,15,56,222,209
  3077. decl %r10d
  3078. movups (%rcx),%xmm1
  3079. leaq 16(%rcx),%rcx
  3080. jnz L$oop_dec1_16
  3081. .byte 102,15,56,223,209
  3082. pxor %xmm0,%xmm0
  3083. pxor %xmm1,%xmm1
  3084. movdqu %xmm4,(%r8)
  3085. xorps %xmm3,%xmm2
  3086. pxor %xmm3,%xmm3
  3087. movups %xmm2,(%rsi)
  3088. pxor %xmm2,%xmm2
  3089. jmp L$cbc_ret
  3090. .p2align 4
  3091. L$cbc_decrypt_bulk:
  3092. leaq (%rsp),%r11
  3093. pushq %rbp
  3094. subq $16,%rsp
  3095. andq $-16,%rsp
  3096. movq %rcx,%rbp
  3097. movups (%r8),%xmm10
  3098. movl %r10d,%eax
  3099. cmpq $0x50,%rdx
  3100. jbe L$cbc_dec_tail
  3101. movups (%rcx),%xmm0
  3102. movdqu 0(%rdi),%xmm2
  3103. movdqu 16(%rdi),%xmm3
  3104. movdqa %xmm2,%xmm11
  3105. movdqu 32(%rdi),%xmm4
  3106. movdqa %xmm3,%xmm12
  3107. movdqu 48(%rdi),%xmm5
  3108. movdqa %xmm4,%xmm13
  3109. movdqu 64(%rdi),%xmm6
  3110. movdqa %xmm5,%xmm14
  3111. movdqu 80(%rdi),%xmm7
  3112. movdqa %xmm6,%xmm15
  3113. movl _OPENSSL_ia32cap_P+4(%rip),%r9d
  3114. cmpq $0x70,%rdx
  3115. jbe L$cbc_dec_six_or_seven
  3116. andl $71303168,%r9d
  3117. subq $0x50,%rdx
  3118. cmpl $4194304,%r9d
  3119. je L$cbc_dec_loop6_enter
  3120. subq $0x20,%rdx
  3121. leaq 112(%rcx),%rcx
  3122. jmp L$cbc_dec_loop8_enter
  3123. .p2align 4
  3124. L$cbc_dec_loop8:
  3125. movups %xmm9,(%rsi)
  3126. leaq 16(%rsi),%rsi
  3127. L$cbc_dec_loop8_enter:
  3128. movdqu 96(%rdi),%xmm8
  3129. pxor %xmm0,%xmm2
  3130. movdqu 112(%rdi),%xmm9
  3131. pxor %xmm0,%xmm3
  3132. movups 16-112(%rcx),%xmm1
  3133. pxor %xmm0,%xmm4
  3134. movq $-1,%rbp
  3135. cmpq $0x70,%rdx
  3136. pxor %xmm0,%xmm5
  3137. pxor %xmm0,%xmm6
  3138. pxor %xmm0,%xmm7
  3139. pxor %xmm0,%xmm8
  3140. .byte 102,15,56,222,209
  3141. pxor %xmm0,%xmm9
  3142. movups 32-112(%rcx),%xmm0
  3143. .byte 102,15,56,222,217
  3144. .byte 102,15,56,222,225
  3145. .byte 102,15,56,222,233
  3146. .byte 102,15,56,222,241
  3147. .byte 102,15,56,222,249
  3148. .byte 102,68,15,56,222,193
  3149. adcq $0,%rbp
  3150. andq $128,%rbp
  3151. .byte 102,68,15,56,222,201
  3152. addq %rdi,%rbp
  3153. movups 48-112(%rcx),%xmm1
  3154. .byte 102,15,56,222,208
  3155. .byte 102,15,56,222,216
  3156. .byte 102,15,56,222,224
  3157. .byte 102,15,56,222,232
  3158. .byte 102,15,56,222,240
  3159. .byte 102,15,56,222,248
  3160. .byte 102,68,15,56,222,192
  3161. .byte 102,68,15,56,222,200
  3162. movups 64-112(%rcx),%xmm0
  3163. nop
  3164. .byte 102,15,56,222,209
  3165. .byte 102,15,56,222,217
  3166. .byte 102,15,56,222,225
  3167. .byte 102,15,56,222,233
  3168. .byte 102,15,56,222,241
  3169. .byte 102,15,56,222,249
  3170. .byte 102,68,15,56,222,193
  3171. .byte 102,68,15,56,222,201
  3172. movups 80-112(%rcx),%xmm1
  3173. nop
  3174. .byte 102,15,56,222,208
  3175. .byte 102,15,56,222,216
  3176. .byte 102,15,56,222,224
  3177. .byte 102,15,56,222,232
  3178. .byte 102,15,56,222,240
  3179. .byte 102,15,56,222,248
  3180. .byte 102,68,15,56,222,192
  3181. .byte 102,68,15,56,222,200
  3182. movups 96-112(%rcx),%xmm0
  3183. nop
  3184. .byte 102,15,56,222,209
  3185. .byte 102,15,56,222,217
  3186. .byte 102,15,56,222,225
  3187. .byte 102,15,56,222,233
  3188. .byte 102,15,56,222,241
  3189. .byte 102,15,56,222,249
  3190. .byte 102,68,15,56,222,193
  3191. .byte 102,68,15,56,222,201
  3192. movups 112-112(%rcx),%xmm1
  3193. nop
  3194. .byte 102,15,56,222,208
  3195. .byte 102,15,56,222,216
  3196. .byte 102,15,56,222,224
  3197. .byte 102,15,56,222,232
  3198. .byte 102,15,56,222,240
  3199. .byte 102,15,56,222,248
  3200. .byte 102,68,15,56,222,192
  3201. .byte 102,68,15,56,222,200
  3202. movups 128-112(%rcx),%xmm0
  3203. nop
  3204. .byte 102,15,56,222,209
  3205. .byte 102,15,56,222,217
  3206. .byte 102,15,56,222,225
  3207. .byte 102,15,56,222,233
  3208. .byte 102,15,56,222,241
  3209. .byte 102,15,56,222,249
  3210. .byte 102,68,15,56,222,193
  3211. .byte 102,68,15,56,222,201
  3212. movups 144-112(%rcx),%xmm1
  3213. cmpl $11,%eax
  3214. .byte 102,15,56,222,208
  3215. .byte 102,15,56,222,216
  3216. .byte 102,15,56,222,224
  3217. .byte 102,15,56,222,232
  3218. .byte 102,15,56,222,240
  3219. .byte 102,15,56,222,248
  3220. .byte 102,68,15,56,222,192
  3221. .byte 102,68,15,56,222,200
  3222. movups 160-112(%rcx),%xmm0
  3223. jb L$cbc_dec_done
  3224. .byte 102,15,56,222,209
  3225. .byte 102,15,56,222,217
  3226. .byte 102,15,56,222,225
  3227. .byte 102,15,56,222,233
  3228. .byte 102,15,56,222,241
  3229. .byte 102,15,56,222,249
  3230. .byte 102,68,15,56,222,193
  3231. .byte 102,68,15,56,222,201
  3232. movups 176-112(%rcx),%xmm1
  3233. nop
  3234. .byte 102,15,56,222,208
  3235. .byte 102,15,56,222,216
  3236. .byte 102,15,56,222,224
  3237. .byte 102,15,56,222,232
  3238. .byte 102,15,56,222,240
  3239. .byte 102,15,56,222,248
  3240. .byte 102,68,15,56,222,192
  3241. .byte 102,68,15,56,222,200
  3242. movups 192-112(%rcx),%xmm0
  3243. je L$cbc_dec_done
  3244. .byte 102,15,56,222,209
  3245. .byte 102,15,56,222,217
  3246. .byte 102,15,56,222,225
  3247. .byte 102,15,56,222,233
  3248. .byte 102,15,56,222,241
  3249. .byte 102,15,56,222,249
  3250. .byte 102,68,15,56,222,193
  3251. .byte 102,68,15,56,222,201
  3252. movups 208-112(%rcx),%xmm1
  3253. nop
  3254. .byte 102,15,56,222,208
  3255. .byte 102,15,56,222,216
  3256. .byte 102,15,56,222,224
  3257. .byte 102,15,56,222,232
  3258. .byte 102,15,56,222,240
  3259. .byte 102,15,56,222,248
  3260. .byte 102,68,15,56,222,192
  3261. .byte 102,68,15,56,222,200
  3262. movups 224-112(%rcx),%xmm0
  3263. jmp L$cbc_dec_done
  3264. .p2align 4
  3265. L$cbc_dec_done:
  3266. .byte 102,15,56,222,209
  3267. .byte 102,15,56,222,217
  3268. pxor %xmm0,%xmm10
  3269. pxor %xmm0,%xmm11
  3270. .byte 102,15,56,222,225
  3271. .byte 102,15,56,222,233
  3272. pxor %xmm0,%xmm12
  3273. pxor %xmm0,%xmm13
  3274. .byte 102,15,56,222,241
  3275. .byte 102,15,56,222,249
  3276. pxor %xmm0,%xmm14
  3277. pxor %xmm0,%xmm15
  3278. .byte 102,68,15,56,222,193
  3279. .byte 102,68,15,56,222,201
  3280. movdqu 80(%rdi),%xmm1
  3281. .byte 102,65,15,56,223,210
  3282. movdqu 96(%rdi),%xmm10
  3283. pxor %xmm0,%xmm1
  3284. .byte 102,65,15,56,223,219
  3285. pxor %xmm0,%xmm10
  3286. movdqu 112(%rdi),%xmm0
  3287. .byte 102,65,15,56,223,228
  3288. leaq 128(%rdi),%rdi
  3289. movdqu 0(%rbp),%xmm11
  3290. .byte 102,65,15,56,223,237
  3291. .byte 102,65,15,56,223,246
  3292. movdqu 16(%rbp),%xmm12
  3293. movdqu 32(%rbp),%xmm13
  3294. .byte 102,65,15,56,223,255
  3295. .byte 102,68,15,56,223,193
  3296. movdqu 48(%rbp),%xmm14
  3297. movdqu 64(%rbp),%xmm15
  3298. .byte 102,69,15,56,223,202
  3299. movdqa %xmm0,%xmm10
  3300. movdqu 80(%rbp),%xmm1
  3301. movups -112(%rcx),%xmm0
  3302. movups %xmm2,(%rsi)
  3303. movdqa %xmm11,%xmm2
  3304. movups %xmm3,16(%rsi)
  3305. movdqa %xmm12,%xmm3
  3306. movups %xmm4,32(%rsi)
  3307. movdqa %xmm13,%xmm4
  3308. movups %xmm5,48(%rsi)
  3309. movdqa %xmm14,%xmm5
  3310. movups %xmm6,64(%rsi)
  3311. movdqa %xmm15,%xmm6
  3312. movups %xmm7,80(%rsi)
  3313. movdqa %xmm1,%xmm7
  3314. movups %xmm8,96(%rsi)
  3315. leaq 112(%rsi),%rsi
  3316. subq $0x80,%rdx
  3317. ja L$cbc_dec_loop8
  3318. movaps %xmm9,%xmm2
  3319. leaq -112(%rcx),%rcx
  3320. addq $0x70,%rdx
  3321. jle L$cbc_dec_clear_tail_collected
  3322. movups %xmm9,(%rsi)
  3323. leaq 16(%rsi),%rsi
  3324. cmpq $0x50,%rdx
  3325. jbe L$cbc_dec_tail
  3326. movaps %xmm11,%xmm2
  3327. L$cbc_dec_six_or_seven:
  3328. cmpq $0x60,%rdx
  3329. ja L$cbc_dec_seven
  3330. movaps %xmm7,%xmm8
  3331. call _aesni_decrypt6
  3332. pxor %xmm10,%xmm2
  3333. movaps %xmm8,%xmm10
  3334. pxor %xmm11,%xmm3
  3335. movdqu %xmm2,(%rsi)
  3336. pxor %xmm12,%xmm4
  3337. movdqu %xmm3,16(%rsi)
  3338. pxor %xmm3,%xmm3
  3339. pxor %xmm13,%xmm5
  3340. movdqu %xmm4,32(%rsi)
  3341. pxor %xmm4,%xmm4
  3342. pxor %xmm14,%xmm6
  3343. movdqu %xmm5,48(%rsi)
  3344. pxor %xmm5,%xmm5
  3345. pxor %xmm15,%xmm7
  3346. movdqu %xmm6,64(%rsi)
  3347. pxor %xmm6,%xmm6
  3348. leaq 80(%rsi),%rsi
  3349. movdqa %xmm7,%xmm2
  3350. pxor %xmm7,%xmm7
  3351. jmp L$cbc_dec_tail_collected
  3352. .p2align 4
  3353. L$cbc_dec_seven:
  3354. movups 96(%rdi),%xmm8
  3355. xorps %xmm9,%xmm9
  3356. call _aesni_decrypt8
  3357. movups 80(%rdi),%xmm9
  3358. pxor %xmm10,%xmm2
  3359. movups 96(%rdi),%xmm10
  3360. pxor %xmm11,%xmm3
  3361. movdqu %xmm2,(%rsi)
  3362. pxor %xmm12,%xmm4
  3363. movdqu %xmm3,16(%rsi)
  3364. pxor %xmm3,%xmm3
  3365. pxor %xmm13,%xmm5
  3366. movdqu %xmm4,32(%rsi)
  3367. pxor %xmm4,%xmm4
  3368. pxor %xmm14,%xmm6
  3369. movdqu %xmm5,48(%rsi)
  3370. pxor %xmm5,%xmm5
  3371. pxor %xmm15,%xmm7
  3372. movdqu %xmm6,64(%rsi)
  3373. pxor %xmm6,%xmm6
  3374. pxor %xmm9,%xmm8
  3375. movdqu %xmm7,80(%rsi)
  3376. pxor %xmm7,%xmm7
  3377. leaq 96(%rsi),%rsi
  3378. movdqa %xmm8,%xmm2
  3379. pxor %xmm8,%xmm8
  3380. pxor %xmm9,%xmm9
  3381. jmp L$cbc_dec_tail_collected
  3382. .p2align 4
  3383. L$cbc_dec_loop6:
  3384. movups %xmm7,(%rsi)
  3385. leaq 16(%rsi),%rsi
  3386. movdqu 0(%rdi),%xmm2
  3387. movdqu 16(%rdi),%xmm3
  3388. movdqa %xmm2,%xmm11
  3389. movdqu 32(%rdi),%xmm4
  3390. movdqa %xmm3,%xmm12
  3391. movdqu 48(%rdi),%xmm5
  3392. movdqa %xmm4,%xmm13
  3393. movdqu 64(%rdi),%xmm6
  3394. movdqa %xmm5,%xmm14
  3395. movdqu 80(%rdi),%xmm7
  3396. movdqa %xmm6,%xmm15
  3397. L$cbc_dec_loop6_enter:
  3398. leaq 96(%rdi),%rdi
  3399. movdqa %xmm7,%xmm8
  3400. call _aesni_decrypt6
  3401. pxor %xmm10,%xmm2
  3402. movdqa %xmm8,%xmm10
  3403. pxor %xmm11,%xmm3
  3404. movdqu %xmm2,(%rsi)
  3405. pxor %xmm12,%xmm4
  3406. movdqu %xmm3,16(%rsi)
  3407. pxor %xmm13,%xmm5
  3408. movdqu %xmm4,32(%rsi)
  3409. pxor %xmm14,%xmm6
  3410. movq %rbp,%rcx
  3411. movdqu %xmm5,48(%rsi)
  3412. pxor %xmm15,%xmm7
  3413. movl %r10d,%eax
  3414. movdqu %xmm6,64(%rsi)
  3415. leaq 80(%rsi),%rsi
  3416. subq $0x60,%rdx
  3417. ja L$cbc_dec_loop6
  3418. movdqa %xmm7,%xmm2
  3419. addq $0x50,%rdx
  3420. jle L$cbc_dec_clear_tail_collected
  3421. movups %xmm7,(%rsi)
  3422. leaq 16(%rsi),%rsi
  3423. L$cbc_dec_tail:
  3424. movups (%rdi),%xmm2
  3425. subq $0x10,%rdx
  3426. jbe L$cbc_dec_one
  3427. movups 16(%rdi),%xmm3
  3428. movaps %xmm2,%xmm11
  3429. subq $0x10,%rdx
  3430. jbe L$cbc_dec_two
  3431. movups 32(%rdi),%xmm4
  3432. movaps %xmm3,%xmm12
  3433. subq $0x10,%rdx
  3434. jbe L$cbc_dec_three
  3435. movups 48(%rdi),%xmm5
  3436. movaps %xmm4,%xmm13
  3437. subq $0x10,%rdx
  3438. jbe L$cbc_dec_four
  3439. movups 64(%rdi),%xmm6
  3440. movaps %xmm5,%xmm14
  3441. movaps %xmm6,%xmm15
  3442. xorps %xmm7,%xmm7
  3443. call _aesni_decrypt6
  3444. pxor %xmm10,%xmm2
  3445. movaps %xmm15,%xmm10
  3446. pxor %xmm11,%xmm3
  3447. movdqu %xmm2,(%rsi)
  3448. pxor %xmm12,%xmm4
  3449. movdqu %xmm3,16(%rsi)
  3450. pxor %xmm3,%xmm3
  3451. pxor %xmm13,%xmm5
  3452. movdqu %xmm4,32(%rsi)
  3453. pxor %xmm4,%xmm4
  3454. pxor %xmm14,%xmm6
  3455. movdqu %xmm5,48(%rsi)
  3456. pxor %xmm5,%xmm5
  3457. leaq 64(%rsi),%rsi
  3458. movdqa %xmm6,%xmm2
  3459. pxor %xmm6,%xmm6
  3460. pxor %xmm7,%xmm7
  3461. subq $0x10,%rdx
  3462. jmp L$cbc_dec_tail_collected
  3463. .p2align 4
  3464. L$cbc_dec_one:
  3465. movaps %xmm2,%xmm11
  3466. movups (%rcx),%xmm0
  3467. movups 16(%rcx),%xmm1
  3468. leaq 32(%rcx),%rcx
  3469. xorps %xmm0,%xmm2
  3470. L$oop_dec1_17:
  3471. .byte 102,15,56,222,209
  3472. decl %eax
  3473. movups (%rcx),%xmm1
  3474. leaq 16(%rcx),%rcx
  3475. jnz L$oop_dec1_17
  3476. .byte 102,15,56,223,209
  3477. xorps %xmm10,%xmm2
  3478. movaps %xmm11,%xmm10
  3479. jmp L$cbc_dec_tail_collected
  3480. .p2align 4
  3481. L$cbc_dec_two:
  3482. movaps %xmm3,%xmm12
  3483. call _aesni_decrypt2
  3484. pxor %xmm10,%xmm2
  3485. movaps %xmm12,%xmm10
  3486. pxor %xmm11,%xmm3
  3487. movdqu %xmm2,(%rsi)
  3488. movdqa %xmm3,%xmm2
  3489. pxor %xmm3,%xmm3
  3490. leaq 16(%rsi),%rsi
  3491. jmp L$cbc_dec_tail_collected
  3492. .p2align 4
  3493. L$cbc_dec_three:
  3494. movaps %xmm4,%xmm13
  3495. call _aesni_decrypt3
  3496. pxor %xmm10,%xmm2
  3497. movaps %xmm13,%xmm10
  3498. pxor %xmm11,%xmm3
  3499. movdqu %xmm2,(%rsi)
  3500. pxor %xmm12,%xmm4
  3501. movdqu %xmm3,16(%rsi)
  3502. pxor %xmm3,%xmm3
  3503. movdqa %xmm4,%xmm2
  3504. pxor %xmm4,%xmm4
  3505. leaq 32(%rsi),%rsi
  3506. jmp L$cbc_dec_tail_collected
  3507. .p2align 4
  3508. L$cbc_dec_four:
  3509. movaps %xmm5,%xmm14
  3510. call _aesni_decrypt4
  3511. pxor %xmm10,%xmm2
  3512. movaps %xmm14,%xmm10
  3513. pxor %xmm11,%xmm3
  3514. movdqu %xmm2,(%rsi)
  3515. pxor %xmm12,%xmm4
  3516. movdqu %xmm3,16(%rsi)
  3517. pxor %xmm3,%xmm3
  3518. pxor %xmm13,%xmm5
  3519. movdqu %xmm4,32(%rsi)
  3520. pxor %xmm4,%xmm4
  3521. movdqa %xmm5,%xmm2
  3522. pxor %xmm5,%xmm5
  3523. leaq 48(%rsi),%rsi
  3524. jmp L$cbc_dec_tail_collected
  3525. .p2align 4
  3526. L$cbc_dec_clear_tail_collected:
  3527. pxor %xmm3,%xmm3
  3528. pxor %xmm4,%xmm4
  3529. pxor %xmm5,%xmm5
  3530. pxor %xmm6,%xmm6
  3531. pxor %xmm7,%xmm7
  3532. pxor %xmm8,%xmm8
  3533. pxor %xmm9,%xmm9
  3534. L$cbc_dec_tail_collected:
  3535. movups %xmm10,(%r8)
  3536. andq $15,%rdx
  3537. jnz L$cbc_dec_tail_partial
  3538. movups %xmm2,(%rsi)
  3539. pxor %xmm2,%xmm2
  3540. jmp L$cbc_dec_ret
  3541. .p2align 4
  3542. L$cbc_dec_tail_partial:
  3543. movaps %xmm2,(%rsp)
  3544. pxor %xmm2,%xmm2
  3545. movq $16,%rcx
  3546. movq %rsi,%rdi
  3547. subq %rdx,%rcx
  3548. leaq (%rsp),%rsi
  3549. .long 0x9066A4F3
  3550. movdqa %xmm2,(%rsp)
  3551. L$cbc_dec_ret:
  3552. xorps %xmm0,%xmm0
  3553. pxor %xmm1,%xmm1
  3554. movq -8(%r11),%rbp
  3555. leaq (%r11),%rsp
  3556. L$cbc_ret:
  3557. .byte 0xf3,0xc3
  3558. .globl _aesni_set_decrypt_key
  3559. .p2align 4
  3560. _aesni_set_decrypt_key:
  3561. .byte 0x48,0x83,0xEC,0x08
  3562. call __aesni_set_encrypt_key
  3563. shll $4,%esi
  3564. testl %eax,%eax
  3565. jnz L$dec_key_ret
  3566. leaq 16(%rdx,%rsi,1),%rdi
  3567. movups (%rdx),%xmm0
  3568. movups (%rdi),%xmm1
  3569. movups %xmm0,(%rdi)
  3570. movups %xmm1,(%rdx)
  3571. leaq 16(%rdx),%rdx
  3572. leaq -16(%rdi),%rdi
  3573. L$dec_key_inverse:
  3574. movups (%rdx),%xmm0
  3575. movups (%rdi),%xmm1
  3576. .byte 102,15,56,219,192
  3577. .byte 102,15,56,219,201
  3578. leaq 16(%rdx),%rdx
  3579. leaq -16(%rdi),%rdi
  3580. movups %xmm0,16(%rdi)
  3581. movups %xmm1,-16(%rdx)
  3582. cmpq %rdx,%rdi
  3583. ja L$dec_key_inverse
  3584. movups (%rdx),%xmm0
  3585. .byte 102,15,56,219,192
  3586. pxor %xmm1,%xmm1
  3587. movups %xmm0,(%rdi)
  3588. pxor %xmm0,%xmm0
  3589. L$dec_key_ret:
  3590. addq $8,%rsp
  3591. .byte 0xf3,0xc3
  3592. L$SEH_end_set_decrypt_key:
  3593. .globl _aesni_set_encrypt_key
  3594. .p2align 4
  3595. _aesni_set_encrypt_key:
  3596. __aesni_set_encrypt_key:
  3597. .byte 0x48,0x83,0xEC,0x08
  3598. movq $-1,%rax
  3599. testq %rdi,%rdi
  3600. jz L$enc_key_ret
  3601. testq %rdx,%rdx
  3602. jz L$enc_key_ret
  3603. movl $268437504,%r10d
  3604. movups (%rdi),%xmm0
  3605. xorps %xmm4,%xmm4
  3606. andl _OPENSSL_ia32cap_P+4(%rip),%r10d
  3607. leaq 16(%rdx),%rax
  3608. cmpl $256,%esi
  3609. je L$14rounds
  3610. cmpl $192,%esi
  3611. je L$12rounds
  3612. cmpl $128,%esi
  3613. jne L$bad_keybits
  3614. L$10rounds:
  3615. movl $9,%esi
  3616. cmpl $268435456,%r10d
  3617. je L$10rounds_alt
  3618. movups %xmm0,(%rdx)
  3619. .byte 102,15,58,223,200,1
  3620. call L$key_expansion_128_cold
  3621. .byte 102,15,58,223,200,2
  3622. call L$key_expansion_128
  3623. .byte 102,15,58,223,200,4
  3624. call L$key_expansion_128
  3625. .byte 102,15,58,223,200,8
  3626. call L$key_expansion_128
  3627. .byte 102,15,58,223,200,16
  3628. call L$key_expansion_128
  3629. .byte 102,15,58,223,200,32
  3630. call L$key_expansion_128
  3631. .byte 102,15,58,223,200,64
  3632. call L$key_expansion_128
  3633. .byte 102,15,58,223,200,128
  3634. call L$key_expansion_128
  3635. .byte 102,15,58,223,200,27
  3636. call L$key_expansion_128
  3637. .byte 102,15,58,223,200,54
  3638. call L$key_expansion_128
  3639. movups %xmm0,(%rax)
  3640. movl %esi,80(%rax)
  3641. xorl %eax,%eax
  3642. jmp L$enc_key_ret
  3643. .p2align 4
  3644. L$10rounds_alt:
  3645. movdqa L$key_rotate(%rip),%xmm5
  3646. movl $8,%r10d
  3647. movdqa L$key_rcon1(%rip),%xmm4
  3648. movdqa %xmm0,%xmm2
  3649. movdqu %xmm0,(%rdx)
  3650. jmp L$oop_key128
  3651. .p2align 4
  3652. L$oop_key128:
  3653. .byte 102,15,56,0,197
  3654. .byte 102,15,56,221,196
  3655. pslld $1,%xmm4
  3656. leaq 16(%rax),%rax
  3657. movdqa %xmm2,%xmm3
  3658. pslldq $4,%xmm2
  3659. pxor %xmm2,%xmm3
  3660. pslldq $4,%xmm2
  3661. pxor %xmm2,%xmm3
  3662. pslldq $4,%xmm2
  3663. pxor %xmm3,%xmm2
  3664. pxor %xmm2,%xmm0
  3665. movdqu %xmm0,-16(%rax)
  3666. movdqa %xmm0,%xmm2
  3667. decl %r10d
  3668. jnz L$oop_key128
  3669. movdqa L$key_rcon1b(%rip),%xmm4
  3670. .byte 102,15,56,0,197
  3671. .byte 102,15,56,221,196
  3672. pslld $1,%xmm4
  3673. movdqa %xmm2,%xmm3
  3674. pslldq $4,%xmm2
  3675. pxor %xmm2,%xmm3
  3676. pslldq $4,%xmm2
  3677. pxor %xmm2,%xmm3
  3678. pslldq $4,%xmm2
  3679. pxor %xmm3,%xmm2
  3680. pxor %xmm2,%xmm0
  3681. movdqu %xmm0,(%rax)
  3682. movdqa %xmm0,%xmm2
  3683. .byte 102,15,56,0,197
  3684. .byte 102,15,56,221,196
  3685. movdqa %xmm2,%xmm3
  3686. pslldq $4,%xmm2
  3687. pxor %xmm2,%xmm3
  3688. pslldq $4,%xmm2
  3689. pxor %xmm2,%xmm3
  3690. pslldq $4,%xmm2
  3691. pxor %xmm3,%xmm2
  3692. pxor %xmm2,%xmm0
  3693. movdqu %xmm0,16(%rax)
  3694. movl %esi,96(%rax)
  3695. xorl %eax,%eax
  3696. jmp L$enc_key_ret
  3697. .p2align 4
  3698. L$12rounds:
  3699. movq 16(%rdi),%xmm2
  3700. movl $11,%esi
  3701. cmpl $268435456,%r10d
  3702. je L$12rounds_alt
  3703. movups %xmm0,(%rdx)
  3704. .byte 102,15,58,223,202,1
  3705. call L$key_expansion_192a_cold
  3706. .byte 102,15,58,223,202,2
  3707. call L$key_expansion_192b
  3708. .byte 102,15,58,223,202,4
  3709. call L$key_expansion_192a
  3710. .byte 102,15,58,223,202,8
  3711. call L$key_expansion_192b
  3712. .byte 102,15,58,223,202,16
  3713. call L$key_expansion_192a
  3714. .byte 102,15,58,223,202,32
  3715. call L$key_expansion_192b
  3716. .byte 102,15,58,223,202,64
  3717. call L$key_expansion_192a
  3718. .byte 102,15,58,223,202,128
  3719. call L$key_expansion_192b
  3720. movups %xmm0,(%rax)
  3721. movl %esi,48(%rax)
  3722. xorq %rax,%rax
  3723. jmp L$enc_key_ret
  3724. .p2align 4
  3725. L$12rounds_alt:
  3726. movdqa L$key_rotate192(%rip),%xmm5
  3727. movdqa L$key_rcon1(%rip),%xmm4
  3728. movl $8,%r10d
  3729. movdqu %xmm0,(%rdx)
  3730. jmp L$oop_key192
  3731. .p2align 4
  3732. L$oop_key192:
  3733. movq %xmm2,0(%rax)
  3734. movdqa %xmm2,%xmm1
  3735. .byte 102,15,56,0,213
  3736. .byte 102,15,56,221,212
  3737. pslld $1,%xmm4
  3738. leaq 24(%rax),%rax
  3739. movdqa %xmm0,%xmm3
  3740. pslldq $4,%xmm0
  3741. pxor %xmm0,%xmm3
  3742. pslldq $4,%xmm0
  3743. pxor %xmm0,%xmm3
  3744. pslldq $4,%xmm0
  3745. pxor %xmm3,%xmm0
  3746. pshufd $0xff,%xmm0,%xmm3
  3747. pxor %xmm1,%xmm3
  3748. pslldq $4,%xmm1
  3749. pxor %xmm1,%xmm3
  3750. pxor %xmm2,%xmm0
  3751. pxor %xmm3,%xmm2
  3752. movdqu %xmm0,-16(%rax)
  3753. decl %r10d
  3754. jnz L$oop_key192
  3755. movl %esi,32(%rax)
  3756. xorl %eax,%eax
  3757. jmp L$enc_key_ret
  3758. .p2align 4
  3759. L$14rounds:
  3760. movups 16(%rdi),%xmm2
  3761. movl $13,%esi
  3762. leaq 16(%rax),%rax
  3763. cmpl $268435456,%r10d
  3764. je L$14rounds_alt
  3765. movups %xmm0,(%rdx)
  3766. movups %xmm2,16(%rdx)
  3767. .byte 102,15,58,223,202,1
  3768. call L$key_expansion_256a_cold
  3769. .byte 102,15,58,223,200,1
  3770. call L$key_expansion_256b
  3771. .byte 102,15,58,223,202,2
  3772. call L$key_expansion_256a
  3773. .byte 102,15,58,223,200,2
  3774. call L$key_expansion_256b
  3775. .byte 102,15,58,223,202,4
  3776. call L$key_expansion_256a
  3777. .byte 102,15,58,223,200,4
  3778. call L$key_expansion_256b
  3779. .byte 102,15,58,223,202,8
  3780. call L$key_expansion_256a
  3781. .byte 102,15,58,223,200,8
  3782. call L$key_expansion_256b
  3783. .byte 102,15,58,223,202,16
  3784. call L$key_expansion_256a
  3785. .byte 102,15,58,223,200,16
  3786. call L$key_expansion_256b
  3787. .byte 102,15,58,223,202,32
  3788. call L$key_expansion_256a
  3789. .byte 102,15,58,223,200,32
  3790. call L$key_expansion_256b
  3791. .byte 102,15,58,223,202,64
  3792. call L$key_expansion_256a
  3793. movups %xmm0,(%rax)
  3794. movl %esi,16(%rax)
  3795. xorq %rax,%rax
  3796. jmp L$enc_key_ret
  3797. .p2align 4
  3798. L$14rounds_alt:
  3799. movdqa L$key_rotate(%rip),%xmm5
  3800. movdqa L$key_rcon1(%rip),%xmm4
  3801. movl $7,%r10d
  3802. movdqu %xmm0,0(%rdx)
  3803. movdqa %xmm2,%xmm1
  3804. movdqu %xmm2,16(%rdx)
  3805. jmp L$oop_key256
  3806. .p2align 4
  3807. L$oop_key256:
  3808. .byte 102,15,56,0,213
  3809. .byte 102,15,56,221,212
  3810. movdqa %xmm0,%xmm3
  3811. pslldq $4,%xmm0
  3812. pxor %xmm0,%xmm3
  3813. pslldq $4,%xmm0
  3814. pxor %xmm0,%xmm3
  3815. pslldq $4,%xmm0
  3816. pxor %xmm3,%xmm0
  3817. pslld $1,%xmm4
  3818. pxor %xmm2,%xmm0
  3819. movdqu %xmm0,(%rax)
  3820. decl %r10d
  3821. jz L$done_key256
  3822. pshufd $0xff,%xmm0,%xmm2
  3823. pxor %xmm3,%xmm3
  3824. .byte 102,15,56,221,211
  3825. movdqa %xmm1,%xmm3
  3826. pslldq $4,%xmm1
  3827. pxor %xmm1,%xmm3
  3828. pslldq $4,%xmm1
  3829. pxor %xmm1,%xmm3
  3830. pslldq $4,%xmm1
  3831. pxor %xmm3,%xmm1
  3832. pxor %xmm1,%xmm2
  3833. movdqu %xmm2,16(%rax)
  3834. leaq 32(%rax),%rax
  3835. movdqa %xmm2,%xmm1
  3836. jmp L$oop_key256
  3837. L$done_key256:
  3838. movl %esi,16(%rax)
  3839. xorl %eax,%eax
  3840. jmp L$enc_key_ret
  3841. .p2align 4
  3842. L$bad_keybits:
  3843. movq $-2,%rax
  3844. L$enc_key_ret:
  3845. pxor %xmm0,%xmm0
  3846. pxor %xmm1,%xmm1
  3847. pxor %xmm2,%xmm2
  3848. pxor %xmm3,%xmm3
  3849. pxor %xmm4,%xmm4
  3850. pxor %xmm5,%xmm5
  3851. addq $8,%rsp
  3852. .byte 0xf3,0xc3
  3853. L$SEH_end_set_encrypt_key:
  3854. .p2align 4
  3855. L$key_expansion_128:
  3856. movups %xmm0,(%rax)
  3857. leaq 16(%rax),%rax
  3858. L$key_expansion_128_cold:
  3859. shufps $16,%xmm0,%xmm4
  3860. xorps %xmm4,%xmm0
  3861. shufps $140,%xmm0,%xmm4
  3862. xorps %xmm4,%xmm0
  3863. shufps $255,%xmm1,%xmm1
  3864. xorps %xmm1,%xmm0
  3865. .byte 0xf3,0xc3
  3866. .p2align 4
  3867. L$key_expansion_192a:
  3868. movups %xmm0,(%rax)
  3869. leaq 16(%rax),%rax
  3870. L$key_expansion_192a_cold:
  3871. movaps %xmm2,%xmm5
  3872. L$key_expansion_192b_warm:
  3873. shufps $16,%xmm0,%xmm4
  3874. movdqa %xmm2,%xmm3
  3875. xorps %xmm4,%xmm0
  3876. shufps $140,%xmm0,%xmm4
  3877. pslldq $4,%xmm3
  3878. xorps %xmm4,%xmm0
  3879. pshufd $85,%xmm1,%xmm1
  3880. pxor %xmm3,%xmm2
  3881. pxor %xmm1,%xmm0
  3882. pshufd $255,%xmm0,%xmm3
  3883. pxor %xmm3,%xmm2
  3884. .byte 0xf3,0xc3
  3885. .p2align 4
  3886. L$key_expansion_192b:
  3887. movaps %xmm0,%xmm3
  3888. shufps $68,%xmm0,%xmm5
  3889. movups %xmm5,(%rax)
  3890. shufps $78,%xmm2,%xmm3
  3891. movups %xmm3,16(%rax)
  3892. leaq 32(%rax),%rax
  3893. jmp L$key_expansion_192b_warm
  3894. .p2align 4
  3895. L$key_expansion_256a:
  3896. movups %xmm2,(%rax)
  3897. leaq 16(%rax),%rax
  3898. L$key_expansion_256a_cold:
  3899. shufps $16,%xmm0,%xmm4
  3900. xorps %xmm4,%xmm0
  3901. shufps $140,%xmm0,%xmm4
  3902. xorps %xmm4,%xmm0
  3903. shufps $255,%xmm1,%xmm1
  3904. xorps %xmm1,%xmm0
  3905. .byte 0xf3,0xc3
  3906. .p2align 4
  3907. L$key_expansion_256b:
  3908. movups %xmm0,(%rax)
  3909. leaq 16(%rax),%rax
  3910. shufps $16,%xmm2,%xmm4
  3911. xorps %xmm4,%xmm2
  3912. shufps $140,%xmm2,%xmm4
  3913. xorps %xmm4,%xmm2
  3914. shufps $170,%xmm1,%xmm1
  3915. xorps %xmm1,%xmm2
  3916. .byte 0xf3,0xc3
  3917. .p2align 6
  3918. L$bswap_mask:
  3919. .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
  3920. L$increment32:
  3921. .long 6,6,6,0
  3922. L$increment64:
  3923. .long 1,0,0,0
  3924. L$xts_magic:
  3925. .long 0x87,0,1,0
  3926. L$increment1:
  3927. .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
  3928. L$key_rotate:
  3929. .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d
  3930. L$key_rotate192:
  3931. .long 0x04070605,0x04070605,0x04070605,0x04070605
  3932. L$key_rcon1:
  3933. .long 1,1,1,1
  3934. L$key_rcon1b:
  3935. .long 0x1b,0x1b,0x1b,0x1b
  3936. .byte 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69,83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
  3937. .p2align 6